From bf667cb65ddd45e9cde711b78a9022b493464848 Mon Sep 17 00:00:00 2001 From: BorisMoore Date: Thu, 17 Nov 2016 16:27:17 -0800 Subject: [PATCH] Commit 83 (v0.9.83 - Beta) Feature improvements: - New boundProps feature for custom tag controls. See sample here: http://www.jsviews.com/#samples/tag-controls/range Downloads: - Minified files provided for all 'plugin librairies' - Updated download pages: http://www.jsviews.com/#download/sample-tagcontrols http://www.jsviews.com/#download/jqueryui-tagcontrols http://www.jsviews.com/#download/jsrplugins Documentation: - New sample for {{draggable}} and {{droppable}}: http://www.jsviews.com/#samples/tag-controls/draggable-droppable - New jQuery widget controls documentation topic: http://www.jsviews.com/#jqui Bug fixes: - https://github.com/BorisMoore/jsviews/issues/351: Binding contextual parameters - https://github.com/BorisMoore/jsviews/issues/352: multiselect not showing initial selection - https://github.com/BorisMoore/jsrender/issues/305 "Unknown template" error message with jQuery 3.0+ - validate.js minor bugfix/improvement - Several minor bug fixes Unit tests: - Several additional unit tests --- jquery.observable.js | 22 +- jquery.observable.min.js | 4 +- jquery.observable.min.js.map | 2 +- jquery.views.js | 318 ++++----- jquery.views.min.js | 4 +- jquery.views.min.js.map | 2 +- jsrender.js | 21 +- jsrender.min.js | 4 +- jsrender.min.js.map | 2 +- jsviews.js | 353 +++++----- jsviews.min.js | 6 +- jsviews.min.js.map | 2 +- package.json | 4 +- test/browserify/bundles/1-bundle.js | 23 +- test/browserify/bundles/10-errors-bundle.js | 363 +++++----- test/browserify/bundles/11-errors-bundle.js | 694 +++++++++++--------- test/browserify/bundles/12-nested-bundle.js | 23 +- test/browserify/bundles/2-bundle.js | 23 +- test/browserify/bundles/3-bundle.js | 23 +- test/browserify/bundles/4-bundle.js | 24 +- test/browserify/bundles/5-bundle.js | 24 +- test/browserify/bundles/6-bundle.js | 363 +++++----- test/browserify/bundles/7-bundle.js | 363 +++++----- test/browserify/bundles/8-bundle.js | 355 +++++----- test/browserify/bundles/8B-bundle.js | 376 ++++++----- test/browserify/bundles/9-bundle.js | 355 +++++----- test/unit-tests/tests-jsrender-no-jquery.js | 8 +- test/unit-tests/tests-jsviews.js | 135 +++- 28 files changed, 2181 insertions(+), 1715 deletions(-) diff --git a/jquery.observable.js b/jquery.observable.js index d1dba7f..419e134 100644 --- a/jquery.observable.js +++ b/jquery.observable.js @@ -1,4 +1,4 @@ -/*! JsObservable v0.9.82 (Beta): http://jsviews.com/#jsobservable */ +/*! JsObservable v0.9.83 (Beta): http://jsviews.com/#jsobservable */ /* * Subcomponent of JsViews * Data change events for data-linking @@ -44,7 +44,7 @@ if (!$ || !$.fn) { throw "JsObservable requires jQuery"; // We require jQuery } -var versionNumber = "v0.9.82", +var versionNumber = "v0.9.83", $observe, $observable, $views = $.views = @@ -461,8 +461,8 @@ if (!$.observe) { } } - var i, p, skip, parts, prop, path, dep, unobserve, callback, cbId, inId, el, data, events, contextCb, items, cbBindings, - depth, innerCb, parentObs, allPath, filter, initNsArr, initNsArrLen, + var i, p, skip, parts, prop, path, dep, unobserve, callback, cbId, inId, el, data, events, contextCb, innerContextCb, + items, cbBindings, depth, innerCb, parentObs, allPath, filter, initNsArr, initNsArrLen, ns = observeStr, paths = this != 1 // Using != for IE<10 bug- see jsviews/issues/237 ? concat.apply([], arguments) // Flatten the arguments - this is a 'recursive call' with params using the 'wrapped array' @@ -491,7 +491,7 @@ if (!$.observe) { } callback = lastArg; if (l && $isFunction(paths[l - 1])) { - contextCb = callback; + innerContextCb = contextCb = callback; callback = paths.pop(); l--; } @@ -544,6 +544,11 @@ if (!$.observe) { if (path === "") { continue; } + if (path && path._cp) { // Contextual parameter + contextCb = $sub._gccb(path[0]); // getContextCb: Get context callback for the contextual view (where contextual param evaluated/assigned) + origRoot = root = path[0].data; // Contextual data + path = path[1]; + } object = root; if ("" + path === path) { // Consider support for computed paths: jsviews/issues/292 @@ -562,7 +567,11 @@ if (!$.observe) { depth = path.split(".").length - depth; // if more than one ^ in the path, the first one determines depth } - if (contextCb && (items = contextCb(path, root, depth))) { + if (contextCb) { + items = contextCb(path, root, depth); + contextCb = innerContextCb; + } + if (items) { // If the array of objects and paths returned by contextCb is non empty, insert them // into the sequence, replacing the current item (path). Otherwise simply remove current item (path) l += items.length - 1; @@ -1107,6 +1116,7 @@ if (!$.observe) { }; $sub.advSet = function() { // refresh advanced settings + $sub._gccb = this._gccb; // getContextCallback method global._jsv = $subSettings.advanced._jsv ? { // create global _jsv, for accessing views, etc cbBindings: cbBindingsStore diff --git a/jquery.observable.min.js b/jquery.observable.min.js index d604a56..d4138b8 100644 --- a/jquery.observable.min.js +++ b/jquery.observable.min.js @@ -1,3 +1,3 @@ -/*! JsObservable v0.9.82 (Beta): http://jsviews.com/#jsobservable */ -!function(t,e){var n=e.jQuery;"object"==typeof exports?module.exports=n?t(e,n):function(n){return t(e,n)}:"function"==typeof define&&define.amd?define(["jquery"],function(n){return t(e,n)}):t(e,!1)}(function(t,e){"use strict";var n=e===!1;if(e=e||t.jQuery,!e||!e.fn)throw"JsObservable requires jQuery";var r,i,o="v0.9.82",s=e.views=e.views||n&&t.jsrender&&jsrender.views||{jsviews:o,sub:{settings:{}},settings:{advanced:function(t){return l=c.advanced=c.advanced||{_jsv:!0},t?("_jsv"in t&&(l._jsv=t._jsv),a.advSet(),s.settings):l}}},a=s.sub,c=a.settings,l=c.advanced,f=e.isFunction,u=e.expando,p=e.isArray,d="object";if(!e.observe){var h=e.event.special,v=[].slice,g=[].splice,_=[].concat,b=parseInt,y=/\S+/g,m=a.propChng=a.propChng||"propertyChange",I=a.arrChng=a.arrChng||"arrayChange",j={},A=m+".observe",w=1,x=1,F=1,P=e.hasData,S=e.data,C={},T=function(t){return t._cId=t._cId||".obs"+x++},k=function(t,e){return this._data=e,this._ns=t,this},O=function(t,e){return this._data=e,this._ns=t,this},V=function(t){return p(t)?[t]:t},D=function(t,e,n){t=t?p(t)?t:[t]:[];var r,i,o=e,s=o,a=t&&t.length,c=[];for(r=0;rot-2||et[l+1]+""!==et[l+1])&&o(tt,"")}c(it,q)}}return B&&H(N,B),{cbId:B,bnd:N,s:j}}}var n,r=0!=this,o=v.call(arguments),s=o[0];return s+""===s&&r&&(n=s,o.shift(),s=o[0]),t.apply(1,o)},i=function(t,e){return 1===arguments.length&&(e=t,t=""),p(e)?new O(t,e):new k(t,e)},a.getDeps=function(){var t=arguments;return function(){for(var e,n,r=[],i=t.length;i--;)e=t[i--],n=t[i],n&&(r=r.concat(f(n)?n(e,e):n));return r}},e.observable=i,i._fltr=function(t,e,n,r){if(!r||!f(r)||r(t,e,n))return e=f(e)?e.set&&e.call(n[0]):e,typeof e===d&&e},i.Object=k,i.Array=O,e.observe=i.observe=r,e.unobserve=i.unobserve=E,i._apply=q,k.prototype={_data:null,observeAll:M,unobserveAll:B,data:function(){return this._data},setProperty:function(t,e,n){t=t||"";var r,i,o,s=t+""!==t,a=this,c=a._data;if(c)if(s)if(n=e,p(t))for(r=t.length;r--;)i=t[r],a.setProperty(i.name,i.value,void 0===n||n);else for(r in t)a.setProperty(r,t[r],n);else if(t!==u){for(o=t.split(/[.^]/);c&&o.length>1;)c=c[o.shift()];c&&a._setProperty(c,o[0],e,n)}return a},removeProperty:function(t){return this.setProperty(t,C),this},_setProperty:function(t,e,n,r){var i,o,s,a=e?t[e]:t;f(a)&&a.set&&(t=t._wrp||t,o=a,i=o.set===!0?o:o.set,a=o.call(t)),(a!==n||r&&a!=n)&&(!(a instanceof Date)||a>n||a-1&&(e=p(e)?e:[e],e.length&&this._insert(t,e)),this},_insert:function(t,e){var n=this._data,r=n.length;t>r&&(t=r),g.apply(n,[t,0].concat(e)),this._trigger({change:"insert",index:t,items:e},r)},remove:function(t,e){var n,r=this._data;return void 0===t&&(t=r.length-1),t=b(t),e=e?b(e):0===e?0:1,e>0&&t>-1&&(n=r.slice(t,t+e),(e=n.length)&&this._remove(t,e,n)),this},_remove:function(t,e,n){var r=this._data,i=r.length;r.splice(t,e),this._trigger({change:"remove",index:t,items:n},i)},move:function(t,e,n){return n=n?b(n):0===n?0:1,t=b(t),e=b(e),n>0&&t>-1&&e>-1&&t!==e&&this._move(t,e,n),this},_move:function(t,e,n){var r,i=this._data,o=i.length,s=t+n-o;s>0&&(n-=s),n&&(r=i.splice(t,n),e>i.length&&(e=i.length),g.apply(i,[e,0].concat(r)),this._trigger({change:"move",oldIndex:t,index:e,items:r},o))},refresh:function(t,e){function n(){o&&(c.insert(i-o,l),d+=o,r+=o,o=0,l=[])}var r,i,o,s,a,c=this,l=[],f=c._data,u=f.slice(),p=f.length,d=p,h=t.length;for(c._srt=!0,i=o=0;ii&&c.remove(i,d-i),c._srt=void 0,c._trigger({change:"refresh",oldItems:u},p),c},_trigger:function(t,n){var r=this,i=r._data,o=i.length,s=e([i]);r._srt?t.refresh=!0:o!==n&&s.triggerHandler(m,{change:"set",path:"length",value:o,oldValue:n}),s.triggerHandler(I+(r._ns?"."+/^\S+/.exec(r._ns)[0]:""),t)}},h[m]=h[I]={remove:function(t){var n,r,i,o,s,a=t.data;if(a&&(a.off=!0,a=a.cb)&&(n=j[a._cId])){for(i=e._data(this).events[t.type],o=i.length;o--&&!r;)r=(s=i[o].data)&&s.cb&&s.cb._cId===a._cId;r||(delete n[S(this).obId],H(n,a._cId))}}},s.map=function(t){function n(e,n,r,o){var s,a=this;this.src&&this.unmap(),typeof e===d&&(a.src=e,a.tgt=r||a.tgt||[],a.options=n||a.options,a.update(),o||(t.obsSrc&&i(a.src).observeAll(a.obs=function(e,n){s||(s=!0,t.obsSrc(a,e,n),s=void 0)},a.srcFlt),t.obsTgt&&i(a.tgt).observeAll(a.obt=function(e,n){s||(s=!0,t.obsTgt(a,e,n),s=void 0)},a.tgtFlt)))}return f(t)&&(t={getTgt:t}),t.baseMap&&(t=e.extend({},t.baseMap,t)),t.map=function(t,e,r,i){return new n(t,e,r,i)},(n.prototype={srcFlt:t.srcFlt||z,tgtFlt:t.tgtFlt||z,update:function(e){var n=this;i(n.tgt).refresh(t.getTgt(n.src,n.options=e||n.options))},unmap:function(){var t=this;t.src&&(t.obs&&i(t.src).unobserveAll(t.obs,t.srcFlt),t.obt&&i(t.tgt).unobserveAll(t.obt,t.tgtFlt),t.src=void 0)},map:n,_def:t}).constructor=n,t},a.advSet=function(){t._jsv=c.advanced._jsv?{cbBindings:j}:void 0}}return e},window); +/*! JsObservable v0.9.83 (Beta): http://jsviews.com/#jsobservable */ +!function(t,e){var n=e.jQuery;"object"==typeof exports?module.exports=n?t(e,n):function(n){return t(e,n)}:"function"==typeof define&&define.amd?define(["jquery"],function(n){return t(e,n)}):t(e,!1)}(function(t,e){"use strict";var n=e===!1;if(e=e||t.jQuery,!e||!e.fn)throw"JsObservable requires jQuery";var r,i,o="v0.9.83",s=e.views=e.views||n&&t.jsrender&&jsrender.views||{jsviews:o,sub:{settings:{}},settings:{advanced:function(t){return l=c.advanced=c.advanced||{_jsv:!0},t?("_jsv"in t&&(l._jsv=t._jsv),a.advSet(),s.settings):l}}},a=s.sub,c=a.settings,l=c.advanced,f=e.isFunction,u=e.expando,p=e.isArray,d="object";if(!e.observe){var h=e.event.special,v=[].slice,g=[].splice,_=[].concat,b=parseInt,y=/\S+/g,m=a.propChng=a.propChng||"propertyChange",I=a.arrChng=a.arrChng||"arrayChange",j={},A=m+".observe",w=1,x=1,F=1,P=e.hasData,S=e.data,C={},T=function(t){return t._cId=t._cId||".obs"+x++},k=function(t,e){return this._data=e,this._ns=t,this},O=function(t,e){return this._data=e,this._ns=t,this},V=function(t){return p(t)?[t]:t},D=function(t,e,n){t=t?p(t)?t:[t]:[];var r,i,o=e,s=o,a=t&&t.length,c=[];for(r=0;rat-2||rt[h+1]+""!==rt[h+1])&&o(nt,"")}l(st,M)}}return J&&H(U,J),{cbId:J,bnd:U,s:j}}}var n,r=0!=this,o=v.call(arguments),s=o[0];return s+""===s&&r&&(n=s,o.shift(),s=o[0]),t.apply(1,o)},i=function(t,e){return 1===arguments.length&&(e=t,t=""),p(e)?new O(t,e):new k(t,e)},a.getDeps=function(){var t=arguments;return function(){for(var e,n,r=[],i=t.length;i--;)e=t[i--],n=t[i],n&&(r=r.concat(f(n)?n(e,e):n));return r}},e.observable=i,i._fltr=function(t,e,n,r){if(!r||!f(r)||r(t,e,n))return e=f(e)?e.set&&e.call(n[0]):e,typeof e===d&&e},i.Object=k,i.Array=O,e.observe=i.observe=r,e.unobserve=i.unobserve=E,i._apply=q,k.prototype={_data:null,observeAll:M,unobserveAll:B,data:function(){return this._data},setProperty:function(t,e,n){t=t||"";var r,i,o,s=t+""!==t,a=this,c=a._data;if(c)if(s)if(n=e,p(t))for(r=t.length;r--;)i=t[r],a.setProperty(i.name,i.value,void 0===n||n);else for(r in t)a.setProperty(r,t[r],n);else if(t!==u){for(o=t.split(/[.^]/);c&&o.length>1;)c=c[o.shift()];c&&a._setProperty(c,o[0],e,n)}return a},removeProperty:function(t){return this.setProperty(t,C),this},_setProperty:function(t,e,n,r){var i,o,s,a=e?t[e]:t;f(a)&&a.set&&(t=t._wrp||t,o=a,i=o.set===!0?o:o.set,a=o.call(t)),(a!==n||r&&a!=n)&&(!(a instanceof Date)||a>n||a-1&&(e=p(e)?e:[e],e.length&&this._insert(t,e)),this},_insert:function(t,e){var n=this._data,r=n.length;t>r&&(t=r),g.apply(n,[t,0].concat(e)),this._trigger({change:"insert",index:t,items:e},r)},remove:function(t,e){var n,r=this._data;return void 0===t&&(t=r.length-1),t=b(t),e=e?b(e):0===e?0:1,e>0&&t>-1&&(n=r.slice(t,t+e),(e=n.length)&&this._remove(t,e,n)),this},_remove:function(t,e,n){var r=this._data,i=r.length;r.splice(t,e),this._trigger({change:"remove",index:t,items:n},i)},move:function(t,e,n){return n=n?b(n):0===n?0:1,t=b(t),e=b(e),n>0&&t>-1&&e>-1&&t!==e&&this._move(t,e,n),this},_move:function(t,e,n){var r,i=this._data,o=i.length,s=t+n-o;s>0&&(n-=s),n&&(r=i.splice(t,n),e>i.length&&(e=i.length),g.apply(i,[e,0].concat(r)),this._trigger({change:"move",oldIndex:t,index:e,items:r},o))},refresh:function(t,e){function n(){o&&(c.insert(i-o,l),d+=o,r+=o,o=0,l=[])}var r,i,o,s,a,c=this,l=[],f=c._data,u=f.slice(),p=f.length,d=p,h=t.length;for(c._srt=!0,i=o=0;ii&&c.remove(i,d-i),c._srt=void 0,c._trigger({change:"refresh",oldItems:u},p),c},_trigger:function(t,n){var r=this,i=r._data,o=i.length,s=e([i]);r._srt?t.refresh=!0:o!==n&&s.triggerHandler(m,{change:"set",path:"length",value:o,oldValue:n}),s.triggerHandler(I+(r._ns?"."+/^\S+/.exec(r._ns)[0]:""),t)}},h[m]=h[I]={remove:function(t){var n,r,i,o,s,a=t.data;if(a&&(a.off=!0,a=a.cb)&&(n=j[a._cId])){for(i=e._data(this).events[t.type],o=i.length;o--&&!r;)r=(s=i[o].data)&&s.cb&&s.cb._cId===a._cId;r||(delete n[S(this).obId],H(n,a._cId))}}},s.map=function(t){function n(e,n,r,o){var s,a=this;this.src&&this.unmap(),typeof e===d&&(a.src=e,a.tgt=r||a.tgt||[],a.options=n||a.options,a.update(),o||(t.obsSrc&&i(a.src).observeAll(a.obs=function(e,n){s||(s=!0,t.obsSrc(a,e,n),s=void 0)},a.srcFlt),t.obsTgt&&i(a.tgt).observeAll(a.obt=function(e,n){s||(s=!0,t.obsTgt(a,e,n),s=void 0)},a.tgtFlt)))}return f(t)&&(t={getTgt:t}),t.baseMap&&(t=e.extend({},t.baseMap,t)),t.map=function(t,e,r,i){return new n(t,e,r,i)},(n.prototype={srcFlt:t.srcFlt||z,tgtFlt:t.tgtFlt||z,update:function(e){var n=this;i(n.tgt).refresh(t.getTgt(n.src,n.options=e||n.options))},unmap:function(){var t=this;t.src&&(t.obs&&i(t.src).unobserveAll(t.obs,t.srcFlt),t.obt&&i(t.tgt).unobserveAll(t.obt,t.tgtFlt),t.src=void 0)},map:n,_def:t}).constructor=n,t},a.advSet=function(){a._gccb=this._gccb,t._jsv=c.advanced._jsv?{cbBindings:j}:void 0}}return e},window); //# sourceMappingURL=jquery.observable.min.js.map diff --git a/jquery.observable.min.js.map b/jquery.observable.min.js.map index e9c7e7f..e0f807f 100644 --- a/jquery.observable.min.js.map +++ b/jquery.observable.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["jquery.observable.js"],"names":["factory","global","$","jQuery","exports","module","define","amd","setGlobals","fn","$observe","$observable","versionNumber","$views","views","jsrender","jsviews","sub","settings","advanced","value","$subSettingsAdvanced","$subSettings","_jsv","$sub","advSet","$isFunction","isFunction","$expando","expando","$isArray","isArray","OBJECT","observe","$eventSpecial","event","special","slice","splice","concat","PARSEINT","parseInt","rNotWhite","propertyChangeStr","propChng","arrayChangeStr","arrChng","cbBindingsStore","observeStr","observeObjKey","observeCbKey","observeInnerCbKey","$hasData","hasData","$data","data","remove","getCbKey","cb","_cId","ObjectObservable","ns","this","_data","_ns","ArrayObservable","wrapArray","resolvePathObjects","paths","root","callback","i","path","object","nextObj","l","length","out","call","push","removeCbBindings","cbBindings","cbBindingsId","onObservableChange","ev","eventArgs","isOb","val","allowArray","off","allPath","filter","parentObs","oldValue","ctx","observeAll","noArray","type","array","prop","_path","target","parents","observe_apply","undefined","args","apply","arguments","shift","$observeAll","unobserve","$unobserveAll","namespace","objMap","observeArrayItems","arr","unobs","newAllPath","filterAndObserveAll","obj","nestedArray","newObject","newParentObs","_fltr","nextParentObs","updatedTgt","unshift","wrappedCb","change","items","isObject","obId","notRemoving","un","shallowFilter","indexOf","$unobserve","innerObserve","observeOnOff","pathStr","isArrayBinding","j","evData","obIdExpando","boundObOrArr","prntObs","allPth","initialNs","events","el","fullPath","replace","all","inArray","on","getInnerCb","exprOb","origRt","ob","contextCb","sb","newObj","bindArray","unbind","relPath","prevObj","prevAllPath","p","skip","parts","dep","cbId","inId","depth","innerCb","initNsArr","initNsArrLen","lastArg","pop","_inId","match","split","join","bnd","prm","origRoot","nodeType","observable","depends","s","getDeps","arg","deps","set","Object","Array","_apply","prototype","unobserveAll","setProperty","nonStrict","key","pair","multi","self","name","_setProperty","removeProperty","leaf","setter","getter","removeProp","property","_wrp","Date","_trigger","triggerHandler","exec","insert","index","_insert","oldLength","numToRemove","_remove","move","oldIndex","newIndex","numToMove","_move","excess","refresh","newItems","sort","insertAdded","k","addedItems","dataLength","newItem","num","oldItems","newLength","_srt","$_data","handleObj","found","map","mapDef","Map","source","options","unbound","changing","src","unmap","tgt","update","obsSrc","obs","srcFlt","obsTgt","obt","tgtFlt","getTgt","baseMap","extend","_def","constructor","window"],"mappings":";CAWC,SAASA,EAASC,GAElB,GAAIC,GAAID,EAAOE,MAEQ,iBAAZC,SACVC,OAAOD,QAAUF,EACdF,EAAQC,EAAQC,GAChB,SAASA,GACV,MAAOF,GAAQC,EAAQC,IAEG,kBAAXI,SAAyBA,OAAOC,IACjDD,QAAQ,UAAW,SAASJ,GAC3B,MAAOF,GAAQC,EAAQC,KAGxBF,EAAQC,GAAQ,IAKlB,SAASA,EAAQC,GACjB,YAKA,IAAIM,GAAaN,KAAM,CAIvB,IAFAA,EAAIA,GAAKD,EAAOE,QAEXD,IAAMA,EAAEO,GAEZ,KAAM,8BAGP,IACCC,GAAUC,EADPC,EAAgB,UAGnBC,EAASX,EAAEY,MACVZ,EAAEY,OACFN,GAAcP,EAAOc,UAAYA,SAASD,QAEzCE,QAASJ,EACTK,KAECC,aAEDA,UACCC,SAAU,SAASC,GAElB,MADAC,GAAuBC,EAAaH,SAAWG,EAAaH,WAAaI,MAAM,GACxEH,GAEL,QAAUA,KAAUC,EAAqBE,KAAOH,EAAMG,MACtDC,EAAKC,SACLZ,EAAOK,UAENG,KAIPG,EAAOX,EAAOI,IACdK,EAAeE,EAAKN,SACpBG,EAAuBC,EAAaH,SACpCO,EAAcxB,EAAEyB,WAChBC,EAAW1B,EAAE2B,QACbC,EAAW5B,EAAE6B,QACbC,EAAS,QAEV,KAAK9B,EAAE+B,QAAS,CAEf,GAAIC,GAAgBhC,EAAEiC,MAAMC,QAC3BC,KAAWA,MACXC,KAAYA,OACZC,KAAYA,OACZC,EAAWC,SACXC,EAAY,OACZC,EAAoBnB,EAAKoB,SAAWpB,EAAKoB,UAAY,iBACrDC,EAAiBrB,EAAKsB,QAAUtB,EAAKsB,SAAW,cAChDC,KACAC,EAAaL,EAAoB,WACjCM,EAAgB,EAChBC,EAAe,EACfC,EAAoB,EACpBC,EAAWlD,EAAEmD,QACbC,EAAQpD,EAAEqD,KACVC,KAIDC,EAAW,SAASC,GACnB,MAAOA,GAAGC,KAAOD,EAAGC,MAAS,OAAST,KAGvCU,EAAmB,SAASC,EAAIN,GAG/B,MAFAO,MAAKC,MAAQR,EACbO,KAAKE,IAAMH,EACJC,MAGRG,EAAkB,SAASJ,EAAIN,GAG9B,MAFAO,MAAKC,MAAQR,EACbO,KAAKE,IAAMH,EACJC,MAGRI,EAAY,SAASX,GACpB,MAAOzB,GAASyB,IACZA,GACDA,GAGJY,EAAqB,SAASC,EAAOC,EAAMC,GAC1CF,EAAQA,EACLtC,EAASsC,GACRA,GACCA,KAGL,IAAIG,GAAGC,EACNC,EAASJ,EACTK,EAAUD,EACVE,EAAIP,GAASA,EAAMQ,OACnBC,IAED,KAAKN,EAAI,EAAGA,EAAII,EAAGJ,IAClBC,EAAOJ,EAAMG,GACT7C,EAAY8C,GACfK,EAAMA,EAAItC,OAAO4B,EAAmBK,EAAKM,KAAKT,EAAMA,EAAMC,GAAWD,IAE3D,GAAKG,IAASA,GAOrBE,IAAYD,GACfI,EAAIE,KAAKN,EAASC,GAEnBG,EAAIE,KAAKP,KATRH,EAAOK,EAAUF,EACbE,IAAYD,GACfI,EAAIE,KAAKN,EAASC,GASrB,OAAOG,IAGRG,EAAmB,SAASC,EAAYC,GAEvC,IAAK,GAAIxB,KAAMuB,GACd,aAEMlC,GAAgBmC,IAGxBC,EAAqB,SAASC,EAAIC,GACjC,QAASC,GAAKC,GACb,aAAcA,KAAQvD,IAAWoC,EAAM,IAAMoB,GAAc1D,EAASyD,IAGrE,IAAMH,EAAG7B,OAAQ6B,EAAG7B,KAAKkC,IAAM,CAE9B,GAAIC,GAASC,EAAQC,EACpBC,EAAWR,EAAUQ,SACrBzE,EAAQiE,EAAUjE,MAClB0E,EAAMV,EAAG7B,KACTwC,EAAaD,EAAIC,WACjBrC,EAAKoC,EAAIpC,GACT8B,GAAc9B,EAAGsC,QACjB5B,EAAQ0B,EAAI1B,MACZP,EAAKiC,EAAIjC,EAENuB,GAAGa,OAASpD,GACda,EAAGwC,OAASxC,GAAIoB,KAAKgB,EAAKV,EAAIC,GAErBS,EAAIK,OAASd,EAAUb,MAAqB,MAAbsB,EAAIK,OACzCJ,GACHL,EAAUK,EAAWK,MAAQ,IAAMf,EAAUb,KAC7CmB,EAASI,EAAWJ,OACpBC,GAAaR,EAAGiB,QAAQ9D,OAAOwD,EAAWO,WAEtChB,EAAKO,IACRU,EAAcf,EAAY3B,GAAKgC,GAAWzB,EAAOV,GAAI,EAAMiC,GAASC,GAAYF,GAE7EJ,EAAKlE,IACRmF,EAAcf,EAAY3B,GAAKzC,GAAQgD,EAAOV,EAAI8C,OAAWb,GAASC,GAAYF,KAG/EJ,EAAKO,IACRU,EAAcf,EAAY3B,GAAKgC,GAAWzB,EAAOV,GAAI,GAElD4B,EAAKlE,IACRmF,EAAcf,EAAY3B,GAAKzC,GAAQgD,EAAOV,IAGhDoC,EAAIpC,GAAG0B,EAAIC,MAKdkB,EAAgB,WAEf,GAAIE,GAAOlE,EAAOmE,SAAUC,UAC5B,OAAOjG,GAASgG,MAAMD,EAAKG,QAASH,IAGrCI,EAAc,SAASnD,EAAIiC,EAAQmB,GAClCf,EAAWjC,KAAKE,IAAKF,KAAKC,MAAOL,EAAIiC,KAAY,OAAQmB,IAG1DC,EAAgB,SAASrD,EAAIiC,GAC5BkB,EAAY/B,KAAKhB,KAAMJ,EAAIiC,GAAQ,IAGpCI,EAAa,SAASiB,EAAWvC,EAAQf,EAAIiC,EAAQC,EAAWF,EAASoB,EAAWG,GACnF,QAASC,GAAkBC,EAAKC,GAG/B,IAFAzC,EAAIwC,EAAIvC,OACRyC,EAAa3B,EAAU,KAChBf,KACN2C,EAAoBH,EAAKxC,EAAGyC,EAAO,GAIrC,QAASE,GAAoBC,EAAKpB,EAAMiB,EAAOI,GAC9C,GAAIC,GAAWC,CACXvB,KAASvE,IACR6F,EAAY9G,EAAYgH,MAAMN,EAAYE,EAAIpB,GAAOyB,EAAejC,MACvE+B,EAAeE,EAAcvF,QACzBmF,GAAeK,GAAcH,EAAa,KAAOG,GACpDH,EAAaI,QAAQD,GAEtB9B,EAAWiB,EAAWS,EAAW/D,EAAIiC,IAAW6B,EAAchB,OAAY,GAAIkB,EAAcL,EAAYD,EAAOH,IAMlH,QAASc,GAAU3C,EAAIC,GAItB,OAFAK,EAAUN,EAAG7B,KAAKwC,WAAWK,MAC7ByB,EAAazC,EAAGiB,OACRhB,EAAU2C,QACjB,IAAK,SACJd,EAAkB7B,EAAU4C,MAC5B,MACD,KAAK,SACJf,EAAkB7B,EAAU4C,OAAO,EACnC,MACD,KAAK,MACJZ,EAAa3B,EAAU,IAAML,EAAUb,KACvC8C,EAAoBjC,EAAW,YAAY,GAC3CiC,EAAoBjC,EAAW,SAEjCwC,EAAarB,OACb9C,EAAGgD,MAAM5C,KAAM6C,WAGhB,GAAIhC,GAAGuD,EAAUb,EAAYO,EAAeC,EAAYM,EACvDC,GAAenB,GAAUA,EAAOoB,KAAOvB,CAExC,IAAIrC,SAAiBA,KAAWzC,EAAQ,CAGvC,GAFA4F,GAAiBnD,GAAQlC,OAAOqD,GAChCsC,EAAWpG,EAAS2C,GAAU,GAAK,IAC/BwC,GAAUmB,GAAehF,EAASqB,IAAWwC,EAAOkB,EAAO7E,EAAMmB,GAAQ0D,MAE5E,WADAlB,GAAOkB,IASR,IAJKlB,IACJA,GAAUoB,GAAIvB,IAGXpD,GAEH,GAAIwE,GAAuB,IAAXvC,EAOf,GAFAoC,EAAUpE,KAAOF,EAASC,GAEtB0E,EACH1H,EAASsG,EAAWvC,EAAQyD,EAAUH,EAAWjB,EAAWnB,EAAQiC,EAAelC,GACnFyC,EAAO7E,EAAMmB,GAAQ0D,KACrBlB,EAAOkB,IAASlB,EAAOkB,IAAS,GAAK,MAE/B,CACN,KAAMlB,EAAO3D,EAAMmB,GAAQ0D,MAG1B,MAEDzH,GAASsG,EAAWvC,EAAQyD,EAAUH,EAAWjB,EAAWnB,EAAQiC,EAAelC,QAKjFuB,KACHA,EAAO3D,EAAMmB,GAAQ0D,MAAQ,GAE9BzH,EAASsG,EAAWvC,EAAQyD,EAAU1B,OAAWM,EAAWnB,EAAQiC,EAAelC,EAGpF,IAAIwC,EAGH,IAAKvD,IAAKF,GACT4C,EAAa3B,EAAU,IAAMf,EAC7B2C,EAAoB7C,EAAQE,EAAGmC,OAGhCI,GAAkBzC,EAAQqC,KAK7BwB,EAAgB,SAAS5C,GACxB,MAAOA,GAAQ6C,QAAQ,KAAO,GAAK7C,EAAQ6C,QAAQ,KAAO,GAG3DC,EAAa,WAEZ,SADGzD,KAAKD,KAAK6B,WAAW,GACjBjG,EAASgG,MAAM5C,KAAM6C,WAG7BjG,GAAW,WAGV,QAAS+H,KAER,QAASC,GAAa1B,EAAW2B,EAASC,EAAgBnD,GACzD,GAAIoD,GAAGC,EACNC,EAAc3F,EAASqB,IACvBuE,EAAe9E,EAAUO,IACzBwE,EAAUrD,EACVsD,EAASxD,CAIV,IAFAsB,EAAYmC,EAAYnC,EAAY,IAAMmC,EAAYnC,GAEjDF,IAAcrB,GAAOmD,GAKzB,IAJAQ,EAASL,GAAe7I,EAAE6D,MAAMU,IAChC2E,EAASA,GAAUA,EAAOA,OAC1BA,EAASA,GAAUA,EAAOR,EAAiB/F,EAAiBF,GAC5D0G,EAAKD,GAAUA,EAAOxE,OACfyE,KAEN,GADA9F,EAAO6F,EAAOC,IAAOD,EAAOC,GAAI9F,KAC5BA,IAASkC,GAAOlC,EAAKM,KAAOsF,IAE3B1D,GAAOlC,EAAKM,KAAOsF,GAAa5F,EAAKG,IAAMH,EAAKG,GAAGC,OAASW,EAASX,MAGzE,MAICmD,IAAarB,EAChBvF,EAAE8I,GAAcvD,IAAIuB,EAAW7B,IAE/B2D,EAASF,MAEPU,SAAU9E,EACVJ,MAAOuE,GAAWA,MAClBxC,KAAMA,GAER2C,EAAOjF,GAAKsF,EACZL,EAAOpF,GAAKY,EAERoB,IAEHoD,EAAO/C,YACNK,MAAO8C,EACP1E,KAAM,WAEL,MADAqE,GAAII,EAAQrE,OACLsE,EAAOK,QAAQ,QAAS,SAASC,GAEvC,MADAX,KACe,MAARW,EACJ,IAAMtJ,EAAEuJ,QAAQR,EAAQJ,EAAI,GAAII,EAAQJ,IACxC,OAGLvC,QAAS,WACR,MAAO2C,IAERtD,OAAQA,IAGVzF,EAAE8I,GAAcU,GAAG1C,EAAW,KAAM8B,EAAQ3D,GACxCF,IAEHA,EAAW3B,EAAMmB,IAAQ0D,MAAQ7E,EAAMmB,GAAQ,OAAQxB,MAAoBwB,KAK9E,QAASkF,GAAWC,GAMnB,GAAIC,GAASxF,EAKb,OAFAuF,GAAOE,GAAKC,EAAUH,EAAQC,GAEvBD,EAAOlG,GAAK,SAAS0B,EAAIC,GAC/B,GAAIkC,GAAMqC,EAAOE,GAChB7I,EAAM2I,EAAOI,GACbC,EAASF,EAAUH,EAAQC,EAExBI,KAAW1C,UACHA,KAAQvF,IAClBkI,EAAU3C,GAAK,IACXtG,GAAOuE,GAAc1D,EAASyF,KACjCkB,GAAclB,GAAMtG,EAAKqD,EAAUyF,GAAW,IAGhDH,EAAOE,GAAKG,QAEDA,KAAWjI,IACrBkI,EAAUD,IACNhJ,GAAOuE,GAAc1D,EAASmI,KAEjCxB,GAAcwB,GAAShJ,EAAKqD,EAAUyF,KAKzCzF,EAASc,EAAIC,IAIf,QAAS6E,GAAU/C,EAAKgD,EAAQpI,EAASqI,GACxC,GAAI5E,EAAY,CAEf,GAAI6E,GAAU5F,GACb6F,EAAc5E,CAEfjB,IAAS0C,EACLiD,IACH3F,GAAS0C,EAAIiD,GACb1E,GAAW,IAAM0E,GAEdzE,GAAUlB,KACbA,GAAS9D,EAAYgH,MAAMjC,EAASjB,GAAQ2F,GAAWjD,GAAK5E,OAAOqD,GAAaA,EAAWD,IAExFlB,KAAW1C,GAAWD,EAAS2C,MAClCiE,EAAa7F,EAAiB,YAAcyB,EAAWb,EAASa,GAAY,IAAKkC,QAAW,EAAM2D,GAEnG1F,GAAS4F,EACT3E,EAAU4E,GAIZ,GAAI/F,GAAGgG,EAAGC,EAAMC,EAAOtE,EAAM3B,EAAMkG,EAAK5D,EAAWxC,EAAUqG,EAAMC,EAAMvB,EAAI9F,EAAM6F,EAAQW,EAAW9B,EAAOhD,EAC5G4F,EAAOC,EAASlF,EAAWF,EAASC,EAAQoF,EAAWC,EACvDnH,GAAKb,EACLoB,GAAgB,GAARN,KACLvB,EAAOmE,SAAUC,WAEjBtE,EAAMyC,KAAK6B,WACdsE,GAAU7G,GAAM8G,QAAS,EACzB7G,GAAOD,GAAMwC,QACbnC,GAASJ,GACTM,GAAIP,GAAMQ,MAyBX,IAvBIqG,GAAU,KAAOA,KACpBvF,EAAUuF,GACVrF,EAAYxB,GAAM8G,MAClBvF,EAASvB,GAAM8G,MACfD,KAAY7G,GAAM8G,MAClBvG,IAAK,GAEFsG,OAAcA,KACjBnE,EAAYmE,GACZA,GAAU7G,GAAMO,GAAE,GAClBsG,IAAUtG,IAAKsG,GAAU,KAAOA,IAAaA,KAAWvJ,EAAYuJ,IAAiCzE,QAApB7B,KAAKP,GAAM8G,OACxFpE,IAAcnC,IAAKjD,EAAY2C,MAClC4G,GAAU5G,GACVA,GAAOmC,SAGTlC,EAAW2G,GACPtG,IAAKjD,EAAY0C,GAAMO,GAAI,MAC9BoF,EAAYzF,EACZA,EAAWF,GAAM8G,MACjBvG,OAGGmC,IAAaxC,GAAaA,EAASX,KAAvC,CAkBA,IAbAE,IAAMS,GACDsG,EAAOtG,EAAS6G,OAAS,GAAKrE,EAC/BxC,EAASX,KAAOiH,GACfD,EAAOlH,EAASa,IAAasG,GAC/B,GAECD,IAAS7D,IACZ7B,EAAalC,EAAgB4H,GAAQ5H,EAAgB4H,QAGtDI,EAAY5B,GAAaA,EAAUiC,MAAM1I,KAAe,IACxDsI,EAAeD,EAAUnG,OAElBoG,KAAgB,CAUtB,GATA7B,EAAY4B,EAAUC,GAClB3G,KAASG,EAAOJ,GAAM,IAAKI,GAAQA,EAAO,KAAOA,KAChD1C,EAASuC,IACZ6F,EAAU7F,GAAMyC,GAAW,GACjBA,GAEV4B,EAAa7E,GAAI,KAGfiD,IAAcnC,KAAMN,GACvB,IAAKkG,IAAKxH,GAAiB,CAC1BwH,EAAIxH,EAAgBwH,EACpB,KAAKhH,IAAQgH,GACZ9F,GAAS8F,EAAEhH,GACPzB,EAAS2C,IACZyF,EAAUzF,GAAQqC,EAAWA,GAG7B4B,EAAa7E,GAAI,IAMrB,IADAgH,EAAQ,EACHtG,EAAI,EAAGA,EAAII,GAAGJ,IAElB,GADAC,EAAOJ,GAAMG,GACA,KAATC,EAAJ,CAIA,GADAC,GAASJ,GACL,GAAKG,IAASA,EAAM,CAiBvB,GATAiG,EAAQjG,EAAK6G,MAAM,KACfZ,EAAM,KAGTI,EAAQJ,EAAM,GAAGY,MAAM,KAAKzG,OAC5BJ,EAAOiG,EAAMa,KAAK,KAClBT,EAAQrG,EAAK6G,MAAM,KAAKzG,OAASiG,GAG9Bd,IAAc9B,EAAQ8B,EAAUvF,EAAMH,GAAMwG,IAAS,CAGxDlG,IAAKsD,EAAMrD,OAAS,EACpBtC,EAAOoE,MAAMtC,IAAQG,IAAK,GAAGhC,OAAO0F,GACpC,UAEDwC,EAAQjG,EAAK6G,MAAM,SAEd3J,GAAY8C,KACZA,GAAQA,EAAKjD,MAGhBuJ,EAAUhE,EAAYtC,EAAKd,GAAKiG,EAAWnF,GAC3CsG,EAAQ9E,SAAWR,EAEnBsF,EAAQnH,KAAOW,EAASX,KAExBmH,EAAQK,MAAQL,EAAQK,OAAS,QAAUhI,KACvCqB,EAAK+G,KAAO/G,EAAKgH,KAAOhH,EAAKgH,IAAI5G,SAAWJ,EAAKwF,KAGpDvB,GAAchE,IAASD,EAAKA,MAAOiH,GAAWjH,EAAKgH,IAAKV,EAASf,EAAWjD,GAEzEtC,EAAKwF,IACRvB,GAAcjE,EAAKsF,IAAKtF,EAAKwF,GAAI1F,EAAUyF,EAAWjD,GAEvDtC,EAAOiH,EACPhH,GAAS+B,QAET/B,GAASD,GAGXiG,GAASpG,GAAOG,EAEjB,MAAOC,IAAqC+B,UAA1BL,EAAOsE,EAAM7D,UAC9B,SAAWnC,MAAWzC,EAAQ,CAC7B,GAAI,GAAKmE,IAASA,EAAM,CACvB,GAAa,KAATA,EACH,QAED,IAAKsE,EAAM7F,OAASiG,EAAQ,IAAOpG,GAAOiH,SAAU,CAEnD,IAAK5E,IAAcsC,EAAShG,EAASqB,KAAWvE,EAAE6D,MAAMU,KAAU,CAKjE,IAJA2E,EAASA,EAAOA,OAChBA,EAASA,GAAUA,EAAOzG,GAC1B0G,EAAKD,GAAUA,EAAOxE,OACtB4F,EAAO,EACAnB,KACN9F,EAAO6F,EAAOC,GAAI9F,MACdA,GACAA,EAAKM,KAAOsF,GACZ5F,EAAKG,GAAGC,OAASW,EAASX,MAC1BJ,EAAKG,GAAGyH,QAAU7G,EAAS6G,OAC1B5H,EAAK4C,OAASA,GAAsB,MAAd5C,EAAK4C,MAA8B,OAAd5C,EAAK4C,QAChDoE,EAAIE,EAAMa,KAAK,OAClB/H,EAAKa,MAAMW,KAAKwF,GAGjBC,IAGF,IAAIA,EAAM,CAET/F,GAASA,GAAO0B,EAChB,WAGF,GAAa,MAATA,GAAyB,OAATA,EAAe,CAKlC,IAJKW,GAAasC,GAAUA,EAAOxE,QAElC8D,EAAa7E,GAAI,IAAI,GAAO,GAEhB,MAATsC,EAAc,CACjBuC,EAAa7E,GAAI,GACjB,KAAK0G,IAAK9F,IAEL8F,IAAM3I,GACTsI,EAAUzF,GAAQqC,EAAWN,OAAW+D,OAI1CrK,GAAEyL,WAAWxC,EAAW1E,KAASqC,EAAY,KAAO,IAAM,cAAcxC,EAEzE,OACU6B,GACVuC,EAAa7E,GAAK,MAAQsC,EAAMsE,EAAMa,KAAK,MAGzC5F,IACHA,GAAW,IAAMS,GAElBA,EAAO1B,GAAO0B,GAEf,GAAIzE,EAAYyE,GAAO,EAClBuE,EAAMvE,EAAKyF,UAEdnD,GAAchE,IAASN,EAAmBuG,EAAKjG,GAAQH,GAAWA,EAAUyF,EAAWjD,EAExF,OAEDrC,GAAS0B,EACLW,GAAarC,KAAWJ,KAASE,EAAEI,GAAE,GAAKP,GAAMG,EAAE,GAAK,KAAOH,GAAMG,EAAE,KAGzEmE,EAAa7E,GAAI,IAIpBqG,EAAUzF,GAAQqC,IAQpB,MALI6D,IACH3F,EAAiBC,EAAY0F,IAItBA,KAAMA,EAAMY,IAAKtG,EAAY4G,EAAG9I,IAGzC,GAAIoG,GACH3D,EAAqB,GAAR1B,KAGbM,EAAQ/B,EAAMyC,KAAK6B,WACnB8E,EAAWrH,EAAM,EAQlB,OANIqH,GAAW,KAAOA,GAAYjG,IACjC2D,EAAYsC,EACZrH,EAAMwC,QACN6E,EAAWrH,EAAM,IAGXqE,EAAa/B,MAAM,EAAGtC,IAG9BzD,EAAc,SAASkD,EAAIN,GAK1B,MAJyB,KAArBoD,UAAU/B,SACbrB,EAAOM,EACPA,EAAK,IAEC/B,EAASyB,GACb,GAAIU,GAAgBJ,EAAIN,GACxB,GAAIK,GAAiBC,EAAIN,IAK7B/B,EAAKsK,QAAU,WACd,GAAIrF,GAAOE,SACX,OAAO,YAIN,IAHA,GAAIoF,GAAKrB,EACRsB,KACArH,EAAI8B,EAAK7B,OACHD,KACNoH,EAAMtF,EAAK9B,KACX+F,EAAMjE,EAAK9B,GACP+F,IACHsB,EAAOA,EAAKzJ,OAAOb,EAAYgJ,GAAOA,EAAIqB,EAAKA,GAAOrB,GAGxD,OAAOsB,KAIT9L,EAAEyL,WAAahL,EACfA,EAAYgH,MAAQ,SAASjC,EAASjB,EAAQmB,EAAWD,GACxD,IAAIA,IAAUjE,EAAYiE,IACvBA,EAAOD,EAASjB,EAAQmB,GAM1B,MAHAnB,GAAS/C,EAAY+C,GAClBA,EAAOwH,KAAOxH,EAAOK,KAAKc,EAAU,IACpCnB,QACWA,KAAWzC,GAAUyC,GAIrC9D,EAAYuL,OAAStI,EACrBjD,EAAYwL,MAAQlI,EACpB/D,EAAE+B,QAAUtB,EAAYsB,QAAUvB,EAClCR,EAAE4G,UAAYnG,EAAYmG,UAAY0B,EACtC7H,EAAYyL,OAAS7F,EAErB3C,EAAiByI,WAChBtI,MAAO,KAEPgC,WAAYc,EACZyF,aAAcvF,EAEdxD,KAAM,WACL,MAAOO,MAAKC,OAGbwI,YAAa,SAAS/H,EAAMpD,EAAOoL,GAClChI,EAAOA,GAAQ,EACf,IAAIiI,GAAKC,EAAMjC,EACdkC,EAAQnI,EAAO,KAAOA,EACtBoI,EAAO9I,KACPW,EAASmI,EAAK7I,KAEf,IAAIU,EACH,GAAIkI,EAEH,GADAH,EAAYpL,EACRU,EAAS0C,GAIZ,IADAiI,EAAMjI,EAAKI,OACJ6H,KACNC,EAAOlI,EAAKiI,GACZG,EAAKL,YAAYG,EAAKG,KAAMH,EAAKtL,MAAqBoF,SAAdgG,GAA2BA,OAIpE,KAAKC,IAAOjI,GACXoI,EAAKL,YAAYE,EAAKjI,EAAKiI,GAAMD,OAG7B,IAAIhI,IAAS5C,EAAU,CAG7B,IADA6I,EAAQjG,EAAK6G,MAAM,QACZ5G,GAAUgG,EAAM7F,OAAS,GAC/BH,EAASA,EAAOgG,EAAM7D,QAEnBnC,IACHmI,EAAKE,aAAarI,EAAQgG,EAAM,GAAIrJ,EAAOoL,GAI9C,MAAOI,IAGRG,eAAgB,SAASvI,GAExB,MADAV,MAAKyI,YAAY/H,EAAMhB,GAChBM,MAGRgJ,aAAc,SAASE,EAAMxI,EAAMpD,EAAOoL,GACzC,GAAIS,GAAQC,EAAQC,EACnBC,EAAW5I,EAAOwI,EAAKxI,GAAQwI,CAE5BtL,GAAY0L,IACXA,EAASnB,MAEZe,EAAOA,EAAKK,MAERL,EACJE,EAASE,EACTH,EAASC,EAAOjB,OAAQ,EAAOiB,EAASA,EAAOjB,IAC/CmB,EAAWF,EAAOpI,KAAKkI,KAIrBI,IAAahM,GAASoL,GAAaY,GAAYhM,OAE5CgM,YAAoBE,QAASF,EAAWhM,GAASgM,EAAWhM,KAC7D6L,GACHA,EAAOnI,KAAKkI,EAAM5L,GAClBA,EAAQ8L,EAAOpI,KAAKkI,KACVG,EAAa/L,IAAUoC,GAChBgD,SAAb4G,SACIJ,GAAKxI,GACZpD,EAAQoF,QAERhC,EAAOgC,OAEEhC,IACVwI,EAAKxI,GAAQpD,GAEVoD,GACHV,KAAKyJ,SAASP,GAAOhF,OAAQ,MAAOxD,KAAMA,EAAMpD,MAAOA,EAAOyE,SAAUuH,EAAU5J,OAAQ2J,MAM9FI,SAAU,SAASlH,EAAQhB,GAC1BnF,EAAEmG,GAAQmH,eAAe7K,GAAqBmB,KAAKE,IAAM,IAAM,OAAOyJ,KAAK3J,KAAKE,KAAK,GAAK,IAAKqB,KAIjGpB,EAAgBoI,WACftI,MAAO,KAEPgC,WAAYc,EACZyF,aAAcvF,EAEdxD,KAAM,WACL,MAAOO,MAAKC,OAGb2J,OAAQ,SAASC,EAAOpK,GACvB,GAAIQ,GAAQD,KAAKC,KAejB,OAdyB,KAArB4C,UAAU/B,SACbrB,EAAOoK,EACPA,EAAQ5J,EAAMa,QAEf+I,EAAQnL,EAASmL,GACbA,OACHpK,EAAOzB,EAASyB,GAAQA,GAAQA,GAI5BA,EAAKqB,QACRd,KAAK8J,QAAQD,EAAOpK,IAGfO,MAGR8J,QAAS,SAASD,EAAOpK,GACxB,GAAIQ,GAAQD,KAAKC,MAChB8J,EAAY9J,EAAMa,MACf+I,GAAQE,IACXF,EAAQE,GAETvL,EAAOoE,MAAM3C,GAAQ4J,EAAO,GAAGpL,OAAOgB,IACtCO,KAAKyJ,UAAUvF,OAAQ,SAAU2F,MAAOA,EAAO1F,MAAO1E,GAAOsK,IAG9DrK,OAAQ,SAASmK,EAAOG,GACvB,GAAI7F,GACHlE,EAAQD,KAAKC,KAcd,OAZcyC,UAAVmH,IACHA,EAAQ5J,EAAMa,OAAS,GAGxB+I,EAAQnL,EAASmL,GACjBG,EAAcA,EAActL,EAASsL,GAA+B,IAAhBA,EAAoB,EAAI,EACxEA,EAAc,GAAKH,OACtB1F,EAAQlE,EAAM1B,MAAMsL,EAAOA,EAAQG,IAC/BA,EAAc7F,EAAMrD,SACvBd,KAAKiK,QAAQJ,EAAOG,EAAa7F,IAG5BnE,MAGRiK,QAAS,SAASJ,EAAOG,EAAa7F,GACrC,GAAIlE,GAAQD,KAAKC,MAChB8J,EAAY9J,EAAMa,MAEnBb,GAAMzB,OAAOqL,EAAOG,GACpBhK,KAAKyJ,UAAUvF,OAAQ,SAAU2F,MAAOA,EAAO1F,MAAOA,GAAQ4F,IAG/DG,KAAM,SAASC,EAAUC,EAAUC,GAQlC,MAPAA,GAAYA,EAAY3L,EAAS2L,GAA2B,IAAdA,EAAkB,EAAI,EACpEF,EAAWzL,EAASyL,GACpBC,EAAW1L,EAAS0L,GAEhBC,EAAY,GAAKF,MAAiBC,MAAiBD,IAAaC,GACnEpK,KAAKsK,MAAMH,EAAUC,EAAUC,GAEzBrK,MAGRsK,MAAO,SAASH,EAAUC,EAAUC,GACnC,GAAIlG,GACHlE,EAAQD,KAAKC,MACb8J,EAAY9J,EAAMa,OAClByJ,EAASJ,EAAWE,EAAYN,CAC7BQ,GAAS,IACZF,GAAaE,GAEVF,IACHlG,EAAQlE,EAAMzB,OAAO2L,EAAUE,GAC3BD,EAAWnK,EAAMa,SACpBsJ,EAAWnK,EAAMa,QAElBtC,EAAOoE,MAAM3C,GAAQmK,EAAU,GAAG3L,OAAO0F,IACzCnE,KAAKyJ,UAAUvF,OAAQ,OAAQiG,SAAUA,EAAUN,MAAOO,EAAUjG,MAAOA,GAAQ4F,KAIrFS,QAAS,SAASC,EAAUC,GAC3B,QAASC,KACJC,IACH9B,EAAKc,OAAO7E,EAAE6F,EAAGC,GACjBC,GAAcF,EACdnK,GAAKmK,EACLA,EAAI,EACJC,MAKF,GAAIpK,GAAGsE,EAAG6F,EAAGG,EAASC,EACrBlC,EAAO9I,KACP6K,KACApL,EAAOqJ,EAAK7I,MACZgL,EAAWxL,EAAKlB,QAChBwL,EAAYtK,EAAKqB,OACjBgK,EAAaf,EACbmB,EAAYT,EAAS3J,MAEtB,KADAgI,EAAKqC,MAAO,EACPpG,EAAE6F,EAAE,EAAG7F,EAAEmG,EAAWnG,IACxB,IAAKgG,EAAUN,EAAS1F,MAAQtF,EAAKsF,EAAE6F,GACrCD,QACK,CACN,IAAKlK,EAAEsE,EAAE6F,EAAGnK,EAAEqK,GACTC,IAAYtL,EAAKgB,GADIA,KAK1B,GAAIA,EAAEqK,EAAY,CAGjB,IAFAH,IACAK,EAAM,EACCA,IAAQE,EAAUzK,GAAKgK,EAAS1F,EAAEiG,KAASvL,EAAKgB,EAAEuK,KACzDlC,EAAKoB,KAAKzJ,EAAGsE,EAAGiG,GAChBjG,GAAKiG,EAAM,MAEXJ,KACAC,EAAW5J,KAAK8J,GAUnB,MANAJ,KACIG,EAAa/F,GAChB+D,EAAKpJ,OAAOqF,EAAG+F,EAAa/F,GAE7B+D,EAAKqC,KAAOzI,OACZoG,EAAKW,UAAUvF,OAAQ,UAAW+G,SAAUA,GAAWlB,GAChDjB,GAGRW,SAAU,SAASlI,EAAWwI,GAC7B,GAAIjB,GAAO9I,KACVC,EAAQ6I,EAAK7I,MACba,EAASb,EAAMa,OACfsK,EAAShP,GAAG6D,GACT6I,GAAKqC,KACR5J,EAAUiJ,SAAU,EACV1J,IAAWiJ,GACrBqB,EAAO1B,eAAe7K,GAAoBqF,OAAQ,MAAOxD,KAAM,SAAUpD,MAAOwD,EAAQiB,SAAUgI,IAEnGqB,EAAO1B,eAAe3K,GAAkB+J,EAAK5I,IAAM,IAAM,OAAOyJ,KAAKb,EAAK5I,KAAK,GAAK,IAAKqB,KAI3FnD,EAAcS,GAAqBT,EAAcW,IAIhDW,OAAQ,SAAU2L,GACjB,GAAIlK,GAAYmK,EAAOhG,EAAQzE,EAAGpB,EACjCuF,EAASqG,EAAU5L,IACpB,IAAI,IAAauF,EAAOrD,KAAM,EAAMqD,EAASA,EAAOpF,MAE/CuB,EAAalC,EAAgB+F,EAAOnF,OAAO,CAI9C,IAFAyF,EAASlJ,EAAE6D,MAAMD,MAAMsF,OAAO+F,EAAUlJ,MACxCtB,EAAIyE,EAAOxE,OACJD,MAAQyK,GACdA,GAAS7L,EAAO6F,EAAOzE,GAAGpB,OAASA,EAAKG,IAAMH,EAAKG,GAAGC,OAASmF,EAAOnF,IAGlEyL,WAEGnK,GAAW3B,EAAMQ,MAAMqE,MAC9BnD,EAAiBC,EAAY6D,EAAOnF,UAOzC9C,EAAOwO,IAAM,SAASC,GACrB,QAASC,GAAIC,EAAQC,EAASpJ,EAAQqJ,GACrC,GAAIC,GACHN,EAAMvL,IACHA,MAAK8L,KACR9L,KAAK+L,cAEKL,KAAWxN,IACrBqN,EAAIO,IAAMJ,EACVH,EAAIS,IAAMzJ,GAAUgJ,EAAIS,QACxBT,EAAII,QAAUA,GAAWJ,EAAII,QAC7BJ,EAAIU,SACCL,IACAJ,EAAOU,QACVrP,EAAY0O,EAAIO,KAAK7J,WAAWsJ,EAAIY,IAAM,SAAS7K,EAAIC,GACjDsK,IACJA,GAAW,EACXL,EAAOU,OAAOX,EAAKjK,EAAIC,GACvBsK,EAAWnJ,SAEV6I,EAAIa,QAEJZ,EAAOa,QACVxP,EAAY0O,EAAIS,KAAK/J,WAAWsJ,EAAIe,IAAM,SAAShL,EAAIC,GAClDsK,IACJA,GAAW,EACXL,EAAOa,OAAOd,EAAKjK,EAAIC,GACvBsK,EAAWnJ,SAET6I,EAAIgB,UA4CX,MAtCI3O,GAAY4N,KAEfA,GACCgB,OAAQhB,IAINA,EAAOiB,UACVjB,EAASpP,EAAEsQ,UAAWlB,EAAOiB,QAASjB,IAGvCA,EAAOD,IAAM,SAASG,EAAQC,EAASpJ,EAAQqJ,GAC9C,MAAO,IAAIH,GAAIC,EAAQC,EAASpJ,EAAQqJ,KAGxCH,EAAIlD,WACJ6D,OAAQZ,EAAOY,QAAU5H,EACzB+H,OAAQf,EAAOe,QAAU/H,EACzByH,OAAQ,SAASN,GAChB,GAAIJ,GAAMvL,IACVnD,GAAY0O,EAAIS,KAAKxB,QAAQgB,EAAOgB,OAAOjB,EAAIO,IAAKP,EAAII,QAAUA,GAAWJ,EAAII,WAElFI,MAAO,WACN,GAAIR,GAAMvL,IACNuL,GAAIO,MACHP,EAAIY,KACPtP,EAAY0O,EAAIO,KAAKtD,aAAa+C,EAAIY,IAAKZ,EAAIa,QAE5Cb,EAAIe,KACPzP,EAAY0O,EAAIS,KAAKxD,aAAa+C,EAAIe,IAAKf,EAAIgB,QAEhDhB,EAAIO,IAAMpJ,SAGZ6I,IAAKE,EACLkB,KAAMnB,IACJoB,YAAcnB,EAEVD,GAGR9N,EAAKC,OAAS,WACbxB,EAAOsB,KAAOD,EAAaH,SAASI,MAEjC0D,WAAYlC,GAEZyD,QAIL,MAAOtG,IACJyQ","file":"jquery.observable.min.js","sourcesContent":["/*! JsObservable v0.9.82 (Beta): http://jsviews.com/#jsobservable */\n/*\n * Subcomponent of JsViews\n * Data change events for data-linking\n *\n * Copyright 2016, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041\n\n(function(factory, global) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar $ = global.jQuery;\n\n\tif (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory(global, $)\n\t\t\t: function($) { // If no global jQuery, take jQuery passed as parameter: require(\"jsobservable\")(jQuery)\n\t\t\t\treturn factory(global, $);\n\t\t\t};\n\t} else if (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine([\"jquery\"], function($) {\n\t\t\treturn factory(global, $); // Require jQuery\n\t\t});\n\t} else { // Browser using plain ',Pe='',qe='',\n\topenScript = ' - data-linked tag, close marker\n\t\t\t// We validate with inTag so no script markers are inserted in attribute context e.g. for:\n\t\t\t// \"\" or \"
...{{/if}}...\"\n\t\t\tpreceding = id\n\t\t\t\t? (preceding + endOfElCnt + spaceBefore + (inTag ? \"\" : openScript + id + closeScript)+ spaceAfter + tag)\n\t\t\t\t: endOfElCnt || all;\n\t\t}\n\n\t\tif (validate && boundId) {\n\t\t\tif (inTag) {\n\t\t\t\t// JsViews data-linking tags are not allowed within element markup.\n\t\t\t\t// See jsviews/issues/303\n\t\t\t\tsyntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link=\"...\"');\n\t\t\t}\n\t\t\tif (id.charAt(0) === \"#\") {\n\t\t\t\ttagStack.unshift(id.slice(1));\n\t\t\t} else if (id.slice(1) !== (bndId = tagStack.shift())) {\n\t\t\t\t// See jsviews/issues/213\n\t\t\t\tsyntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>');\n\t\t\t}\n\t\t}\n\t\tif (tag) {\n\t\t\tinTag = tag;\n\t\t\t// If there are ids (markers since the last tag), move them to the defer string\n\t\t\ttagStack.unshift(parentTag);\n\t\t\tparentTag = tag.slice(1);\n\t\t\tif (validate && tagStack[0] && tagStack[0] === badParent[parentTag]) {\n\t\t\t\t// Missing \n\t\t\t\t// TODO: replace this by smart insertion of tags\n\t\t\t\terror('Parent of must be ');\n\t\t\t}\n\t\t\tisVoid = voidElems[parentTag];\n\t\t\tif ((elCnt = elContent[parentTag]) && !prevElCnt) {\n\t\t\t\tdeferStack.unshift(defer);\n\t\t\t\tdefer = \"\";\n\t\t\t}\n\t\t\tprevElCnt = elCnt;\n//TODO Consider providing validation which throws if you place as child of , etc. - since if not caught,\n//this can cause errors subsequently which are difficult to debug.\n//\t\t\t\tif (elContent[tagStack[0]]>2 && !elCnt) {\n//\t\t\t\t\terror(parentTag + \" in \" + tagStack[0]);\n//\t\t\t\t}\n\t\t\tif (defer && elCnt) {\n\t\t\t\tdefer += \"+\"; // Will be used for stepping back through deferred tokens\n\t\t\t}\n\t\t}\n\t\treturn preceding;\n\t}\n\n\tfunction processViewInfos(vwInfos, targetParent) {\n\t\t// If targetParent, we are processing viewInfos (which may include navigation through '+-' paths) and hooking up to the right parentElem etc.\n\t\t// (and elem may also be defined - the next node)\n\t\t// If no targetParent, then we are processing viewInfos on newly inserted content\n\t\tvar deferPath, deferChar, bindChar, parentElem, id, onAftCr, deep,\n\t\t\taddedBindEls = [];\n\n\t\t// In elCnt context (element-only content model), prevNode is the first node after the open, nextNode is the first node after the close.\n\t\t// If both are null/undefined, then open and close are at end of parent content, so the view is empty, and its placeholder is the\n\t\t// 'lastChild' of the parentNode. If there is a prevNode, then it is either the first node in the view, or the view is empty and\n\t\t// its placeholder is the 'previousSibling' of the prevNode, which is also the nextNode.\n\t\tif (vwInfos) {\n\t\t\tif (vwInfos._tkns.charAt(0) === \"@\") {\n\t\t\t\t// We are processing newly inserted content. This is a special script element that was created in convertMarkers() to process deferred bindings,\n\t\t\t\t// and inserted following the target parent element - because no element tags (outside elCnt) were encountered to carry those binding tokens.\n\t\t\t\t// We will step back from the preceding sibling of this element, looking at targetParent elements until we find the one that the current binding\n\t\t\t\t// token belongs to. Set elem to null (the special script element), and remove it from the DOM.\n\t\t\t\ttargetParent = elem.previousSibling;\n\t\t\t\telem.parentNode.removeChild(elem);\n\t\t\t\telem = undefined;\n\t\t\t}\n\t\t\tlen = vwInfos.length;\n\t\t\twhile (len--) {\n\t\t\t\tvwInfo = vwInfos[len];\n//if (prevIds.indexOf(vwInfo.token) < 0) { // This token is a newly created view or tag binding\n\t\t\t\tbindChar = vwInfo.ch;\n\t\t\t\tif (deferPath = vwInfo.path) {\n\t\t\t\t\t// We have a 'deferred path'\n\t\t\t\t\tj = deferPath.length - 1;\n\t\t\t\t\twhile (deferChar = deferPath.charAt(j--)) {\n\t\t\t\t\t\t// Use the \"+\" and\"-\" characters to navigate the path back to the original parent node where the deferred bindings ocurred\n\t\t\t\t\t\tif (deferChar === \"+\") {\n\t\t\t\t\t\t\tif (deferPath.charAt(j) === \"-\") {\n\t\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t\t\ttargetParent = targetParent.previousSibling;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttargetParent = targetParent.parentNode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttargetParent = targetParent.lastChild;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Note: Can use previousSibling and lastChild, not previousElementSibling and lastElementChild,\n\t\t\t\t\t\t// since we have removed white space within elCnt. Hence support IE < 9\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (bindChar === \"^\") {\n\t\t\t\t\tif (tag = bindingStore[id = vwInfo.id]) {\n\t\t\t\t\t\t// The binding may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\t\t// This is a tag binding\n\t\t\t\t\t\tdeep = targetParent && (!elem || elem.parentNode !== targetParent); // We are stepping back looking for the right targetParent,\n\t\t\t\t\t\t// or we are linking existing content and this element is in elCnt, not an immediate child of the targetParent.\n\t\t\t\t\t\tif (!elem || deep) {\n\t\t\t\t\t\t\ttag.parentElem = targetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (vwInfo.elCnt && deep) {\n\t\t\t\t\t\t\t// With element only content, if there is no following element, or if the binding is deeper than the following element\n\t\t\t\t\t\t\t// then we need to set the open or close token as a deferred binding annotation on the parent\n\t\t\t\t\t\t\tsetDefer(targetParent, (vwInfo.open ? \"#\" : \"/\") + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This is an open or close marker for a data-linked tag {^{...}}. Add it to bindEls.\n\t\t\t\t\t\taddedBindEls.push([deep ? null : elem, vwInfo]);\n\t\t\t\t\t}\n\t\t\t\t} else if (view = viewStore[id = vwInfo.id]) {\n\t\t\t\t\t// The view may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\tif (!view.parentElem) {\n\t\t\t\t\t\t// If view is not already extended for JsViews, extend and initialize the view object created in JsRender, as a JsViews view\n\t\t\t\t\t\tview.parentElem = targetParent || elem && elem.parentNode || parentNode;\n\t\t\t\t\t\tview._.onRender = addBindingMarkers;\n\t\t\t\t\t\tview._.onArrayChange = arrayChangeHandler;\n\t\t\t\t\t\tsetArrayChangeLink(view);\n\t\t\t\t\t}\n\t\t\t\t\tparentElem = view.parentElem;\n\t\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t\t// This is an 'open view' node (preceding script marker node,\n\t\t\t\t\t\t// or if elCnt, the first element in the view, with a data-jsv annotation) for binding\n\t\t\t\t\t\tview._elCnt = vwInfo.elCnt;\n\t\t\t\t\t\tif (targetParent && !elem) {\n\t\t\t\t\t\t\tsetDefer(targetParent, \"#\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No targetParent, so there is a ._nxt elem (and this is processing tokens on the elem)\n\t\t\t\t\t\t\tif (!view._prv) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is a 'close view' marker node for binding\n\t\t\t\t\t\tif (targetParent && (!elem || elem.parentNode !== targetParent)) {\n\t\t\t\t\t\t\t// There is no ._nxt so add token to _df. It is deferred.\n\t\t\t\t\t\t\tsetDefer(targetParent, \"/\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t\tview._nxt = undefined;\n\t\t\t\t\t\t} else if (elem) {\n\t\t\t\t\t\t\t// This view did not have a ._nxt, but has one now, so token may be in _df, and must be removed. (No longer deferred)\n\t\t\t\t\t\t\tif (!view._nxt) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._nxt = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (onAftCr = view.ctx && view.ctx[onAfterCreateStr] || onAfterCreate) {\n\t\t\t\t\t\t\tonAftCr.call(view.ctx.tag, view);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n//}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen = addedBindEls.length;\n\t\t\twhile (len--) {\n\t\t\t\t// These were added in reverse order to addedBindEls. We push them in BindEls in the correct order.\n\t\t\t\tbindEls.push(addedBindEls[len]);\n\t\t\t}\n\t\t}\n\t\treturn !vwInfos || vwInfos.elCnt;\n\t}\n\n\tfunction getViewInfos(vwInfos) {\n\t\t// Used by view.childTags() and tag.childTags()\n\t\t// Similar to processViewInfos in how it steps through bindings to find tags. Only finds data-linked tags.\n\t\tvar level, parentTag, named;\n\n\t\tif (vwInfos) {\n\t\t\tlen = vwInfos.length;\n\t\t\tfor (j = 0; j < len; j++) {\n\t\t\t\tvwInfo = vwInfos[j];\n\t\t\t\t// This is an open marker for a data-linked tag {^{...}}, within the content of the tag whose id is get.id. Add it to bindEls.\n\t\t\t\t// Note - if bindingStore[vwInfo.id]._is === \"tag\" then getViewInfos is being called too soon - during first linking pass\n\t\t\t\tparentTag = tag = bindingStore[vwInfo.id].linkCtx.tag;\n\t\t\t\tnamed = tag.tagName === tagName;\n\t\t\t\tif (!tag.flow || named) {\n\t\t\t\t\tif (!deep) {\n\t\t\t\t\t\tlevel = 1;\n\t\t\t\t\t\twhile (parentTag = parentTag.parent) {\n\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagDepth = tagDepth || level; // The level of the first tag encountered.\n\t\t\t\t\t}\n\t\t\t\t\tif ((deep || level === tagDepth) && (!tagName || named)) {\n\t\t\t\t\t\t// Filter on top-level or tagName as appropriate\n\t\t\t\t\t\ttags.push(tag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dataLink() {\n\t\t//================ Data-link and fixup of data-jsv annotations ================\n\t\tvar j, index,\n\t\t\ttokens = \"\",\n\t\t\twrap = {},\n\t\t\tselector = linkViewsSel + (get ? \",[\" + deferAttr + \"]\" : \"\");\n\t\t\t// If a childTags() call, get = \",[\" + deferAttr + \"]\" - since we need to include elements that have a ._df expando for deferred tokens\n\n\t\telems = qsa ? parentNode.querySelectorAll(selector) : $(selector, parentNode).get();\n\t\tl = elems.length;\n\n\t\t// The prevNode will be in the returned query, since we called markPrevOrNextNode() on it.\n\t\t// But it may have contained nodes that satisfy the selector also.\n\t\tif (prevNode && prevNode.innerHTML) {\n\t\t\t// Find the last contained node of prevNode, to use as the prevNode - so we only link subsequent elems in the query\n\t\t\tprevNodes = qsa ? prevNode.querySelectorAll(selector) : $(selector, prevNode).get();\n\t\t\tprevNode = prevNodes.length ? prevNodes[prevNodes.length - 1] : prevNode;\n\t\t}\n\n\t\ttagDepth = 0;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = elems[i];\n\t\t\tif (prevNode && !found) {\n\t\t\t\t// If prevNode is set, not false, skip linking. If this element is the prevNode, set to false so subsequent elements will link.\n\t\t\t\tfound = (elem === prevNode);\n\t\t\t} else if (nextNode && elem === nextNode) {\n\t\t\t\t// If nextNode is set then break when we get to nextNode\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (elem.parentNode) {\n\t\t\t\t// elem has not been removed from DOM\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t\tif (elem._df) {\n\t\t\t\t\t\tj = i + 1;\n\t\t\t\t\t\twhile (j < l && elem.contains(elems[j])) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add defered tokens after any tokens on descendant elements of this one\n\t\t\t\t\t\twrap[j-1] = elem._df;\n\t\t\t\t\t}\n\t\t\t\t\tif (wrap[i]) {\n\t\t\t\t\t\ttokens += wrap[i] || \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isLink && (vwInfo = viewInfos(elem, undefined, rViewMarkers)) && (vwInfo = vwInfo[0])) {\n\t\t\t\t\t\t// If this is a link(trueOrString ...) call we will avoid re-binding to elems that are within template-rendered views\n\t\t\t\t\t\tskip = skip ? (vwInfo.id !== skip && skip) : vwInfo.open && vwInfo.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (!skip && processInfos(viewInfos(elem))\n\t\t\t\t\t\t// If a link() call, processViewInfos() adds bindings to bindEls, and returns true for non-script nodes, for adding data-link bindings\n\t\t\t\t\t\t// If a childTags() call, getViewInfos returns array of tag bindings.\n\t\t\t\t\t\t\t&& elem.getAttribute($viewsLinkAttr)) {\n\t\t\t\t\t\tbindEls.push([elem]); // A data-linked element so add to bindEls too\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (get) {\n\t\t\ttokens += parentNode._df || \"\";\n\t\t\tif (index = tokens.indexOf(\"#\" + get.id) + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so start after the open token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(index + get.id.length);\n\t\t\t}\n\t\t\tindex = tokens.indexOf(\"/\" + get.id);\n\t\t\tif (index + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so don't look beyond the close token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(0, index);\n\t\t\t}\n\t\t\t// Call getViewInfos to add the found childTags to the tags array\n\t\t\tgetViewInfos(viewInfos(tokens, undefined, rOpenTagMarkers));\n\t\t}\n\n\t\tif (html === undefined && parentNode.getAttribute($viewsLinkAttr)) {\n\t\t\tbindEls.push([parentNode]); // Support data-linking top-level element directly (not within a data-linked container)\n\t\t}\n\n\t\t// Remove temporary marker script nodes they were added by markPrevOrNextNode\n\t\tunmarkPrevOrNextNode(prevNode, elCnt);\n\t\tunmarkPrevOrNextNode(nextNode, elCnt);\n\n\t\tif (get) {\n\t\t\tif (lazyLink) {\n\t\t\t\tlazyLink.resolve();\n\t\t\t}\n\t\t\treturn; // We have added childTags to the tags array, so we are done\n\t\t}\n\n\t\tif (elCnt && defer + ids) {\n\t\t\t// There are some views with elCnt, for which the open or close did not precede any HTML tag - so they have not been processed yet\n\t\t\telem = nextNode;\n\t\t\tif (defer) {\n\t\t\t\tif (nextNode) {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer + \"+\", true), nextNode);\n\t\t\t\t} else {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer, true), parentNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocessViewInfos(viewInfos(ids, true), parentNode);\n\t\t\t// If there were any tokens on nextNode which have now been associated with inserted HTML tags, remove them from nextNode\n\t\t\tif (nextNode) {\n\t\t\t\ttokens = nextNode.getAttribute(jsvAttrStr);\n\t\t\t\tif (l = tokens.indexOf(prevIds) + 1) {\n\t\t\t\t\ttokens = tokens.slice(l + prevIds.length - 1);\n\t\t\t\t}\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, ids + tokens);\n\t\t\t}\n\t\t}\n\n\t\t//================ Bind the data-linked elements and tags ================\n\t\tl = bindEls.length;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = bindEls[i];\n\t\t\tlinkInfo = elem[1];\n\t\t\telem = elem[0];\n\t\t\tif (linkInfo) {\n\t\t\t\tif (tag = bindingStore[linkInfo.id]) {\n\t\t\t\t\tif (linkCtx = tag.linkCtx) {\n\t\t\t\t\t\t// The tag may have been stored temporarily on the bindingStore - or may have already been replaced by the actual binding\n\t\t\t\t\t\ttag = linkCtx.tag;\n\t\t\t\t\t\ttag.linkCtx = linkCtx;\n\t\t\t\t\t}\n\t\t\t\t\tif (linkInfo.open) {\n\t\t\t\t\t\t// This is an 'open linked tag' binding annotation for a data-linked tag {^{...}}\n\t\t\t\t\t\tif (elem) {\n\t\t\t\t\t\t\ttag.parentElem = elem.parentNode;\n\t\t\t\t\t\t\ttag._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttag._elCnt = linkInfo.elCnt;\n\t\t\t\t\t\t// We data-link depth-first (\"on the way in\"), which is better for perf - and allows setting parent tags etc.\n\t\t\t\t\t\tview = tag.tagCtx.view;\n\t\t\t\t\t\taddDataBinding(undefined, tag._prv, view, linkInfo.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag._nxt = elem;\n\t\t\t\t\t\tif (tag._.unlinked) {\n\t\t\t\t\t\t\t// This is a 'close linked tag' binding annotation\n\t\t\t\t\t\t\t// Add data binding\n\t\t\t\t\t\t\ttagCtx = tag.tagCtx;\n\t\t\t\t\t\t\tview = tagCtx.view;\n\t\t\t\t\t\t\tcallAfterLink(tag);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Add data binding for a data-linked element (with data-link attribute)\n\t\t\t\taddDataBinding(elem.getAttribute($viewsLinkAttr), elem, $view(elem), undefined, isLink, outerData, context);\n\t\t\t}\n\t\t}\n\t\tif (lazyLink) {\n\t\t\tlazyLink.resolve();\n\t\t}\n\t}\n\t//==== /end of nested functions ====\n\n\tvar inTag, linkCtx, tag, i, l, j, len, elems, elem, view, vwInfo, linkInfo, prevNodes, token, prevView, nextView,\n\t\tnode, tags, deep, tagName, tagCtx, validate, tagDepth, depth, fragment, copiedNode, firstTag, parentTag,\n\t\tisVoid, wrapper, div, tokens, elCnt, prevElCnt, htmlTag, ids, prevIds, found, skip, lazyLink, isLink, get,\n\t\tself = this,\n\t\tthisId = self._.id + \"_\",\n\t\tdefer = \"\",\n\t\t// The marker ids for which no tag was encountered (empty views or final closing markers) which we carry over to container tag\n\t\tbindEls = [],\n\t\ttagStack = [],\n\t\tdeferStack = [],\n\t\tonAfterCreate = self.hlp(onAfterCreateStr),\n\t\tprocessInfos = processViewInfos;\n\n\tif (refresh) {\n\t\tlazyLink = refresh.lazyLink && $.Deferred();\n\t\tif (refresh.tmpl) {\n\t\t\t// refresh is the prevView, passed in from addViews()\n\t\t\tprevView = \"/\" + refresh._.id + \"_\";\n\t\t} else {\n\t\t\tisLink = refresh.lnk; // Top-level linking\n\t\t\tif (refresh.tag) {\n\t\t\t\tthisId = refresh.tag + \"^\";\n\t\t\t\trefresh = true;\n\t\t\t}\n\t\t\tif (get = refresh.get) {\n\t\t\t\tprocessInfos = getViewInfos;\n\t\t\t\ttags = get.tags;\n\t\t\t\tdeep = get.deep;\n\t\t\t\ttagName = get.name;\n\t\t\t}\n\t\t}\n\t\trefresh = refresh === true;\n\t}\n\n\tparentNode = parentNode\n\t\t? (\"\" + parentNode === parentNode\n\t\t\t? $(parentNode)[0] // It is a string, so treat as selector\n\t\t\t: parentNode.jquery\n\t\t\t\t? parentNode[0] // A jQuery object - take first element.\n\t\t\t\t: parentNode)\n\t\t: (self.parentElem // view.link()\n\t\t\t|| document.body); // link(null, data) to link the whole document\n\n\tvalidate = !$subSettingsAdvanced.noValidate && parentNode.contentEditable !== TRUE;\n\tparentTag = parentNode.tagName.toLowerCase();\n\telCnt = !!elContent[parentTag];\n\n\tprevNode = prevNode && markPrevOrNextNode(prevNode, elCnt);\n\tnextNode = nextNode && markPrevOrNextNode(nextNode, elCnt) || null;\n\n\tif (html != undefined) {\n\t\t//================ Insert html into DOM using documentFragments (and wrapping HTML appropriately). ================\n\t\t// Also convert markers to DOM annotations, based on content model.\n\t\t// Corresponds to nextNode ? $(nextNode).before(html) : $(parentNode).html(html);\n\t\t// but allows insertion to wrap correctly even with inserted script nodes. jQuery version will fail e.g. under tbody or select.\n\t\t// This version should also be slightly faster\n\t\tdiv = document.createElement(\"div\");\n\t\twrapper = div;\n\t\tprevIds = ids = \"\";\n\t\thtmlTag = parentNode.namespaceURI === \"http://www.w3.org/2000/svg\" ? \"svg_ns\" : (firstTag = rFirstElem.exec(html)) && firstTag[1] || \"\";\n\t\tif (elCnt) {\n\t\t\t// Now look for following view, and find its tokens, or if not found, get the parentNode._df tokens\n\t\t\tnode = nextNode;\n\t\t\twhile (node && !(nextView = viewInfos(node))) {\n\t\t\t\tnode = node.nextSibling;\n\t\t\t}\n\t\t\tif (tokens = nextView ? nextView._tkns : parentNode._df) {\n\t\t\t\ttoken = prevView || \"\";\n\t\t\t\tif (refresh || !prevView) {\n\t\t\t\t\ttoken += \"#\" + thisId;\n\t\t\t\t}\n\t\t\t\tj = tokens.indexOf(token);\n\t\t\t\tif (j + 1) {\n\t\t\t\t\tj += token.length;\n\t\t\t\t\t// Transfer the initial tokens to inserted nodes, by setting them as the ids variable, picked up in convertMarkers\n\t\t\t\t\tprevIds = ids = tokens.slice(0, j);\n\t\t\t\t\ttokens = tokens.slice(j);\n\t\t\t\t\tif (nextView) {\n\t\t\t\t\t\tnode.setAttribute(jsvAttrStr, tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetDefer(parentNode, tokens);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//================ Convert the markers to DOM annotations, based on content model. ================\n//\t\t\toldElCnt = elCnt;\n\t\tisVoid = undefined;\n\t\thtml = (\"\" + html).replace(rConvertMarkers, convertMarkers);\n//\t\t\tif (!!oldElCnt !== !!elCnt) {\n//\t\t\t\terror(\"Parse: \" + html); // Parse error. Content not well-formed?\n//\t\t\t}\n\t\tif (validate && tagStack.length) {\n\t\t\tsyntaxError(\"Mismatched '<\" + parentTag + \"...>' in:\\n\" + html); // Unmatched tag\n\t\t}\n\t\tif (validateOnly) {\n\t\t\treturn;\n\t\t}\n\t\t// Append wrapper element to doc fragment\n\t\tsafeFragment.appendChild(div);\n\n\t\t// Go to html and back, then peel off extra wrappers\n\t\t// Corresponds to jQuery $(nextNode).before(html) or $(parentNode).html(html);\n\t\t// but supports svg elements, and other features missing from jQuery version (and this version should also be slightly faster)\n\t\thtmlTag = wrapMap[htmlTag] || wrapMap.div;\n\t\tdepth = htmlTag[0];\n\t\twrapper.innerHTML = htmlTag[1] + html + htmlTag[2];\n\t\twhile (depth--) {\n\t\t\twrapper = wrapper.lastChild;\n\t\t}\n\t\tsafeFragment.removeChild(div);\n\t\tfragment = document.createDocumentFragment();\n\t\twhile (copiedNode = wrapper.firstChild) {\n\t\t\tfragment.appendChild(copiedNode);\n\t\t}\n\t\t// Insert into the DOM\n\t\tparentNode.insertBefore(fragment, nextNode);\n\t}\n\n\tif (lazyLink) {\n\t\tsetTimeout(dataLink, 0);\n\t} else {\n\t\tdataLink();\n\t}\n\n\treturn lazyLink && lazyLink.promise();\n}\n\nfunction addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) {\n\t// Add data binding for data-linked elements or {^{...}} data-linked tags\n\tvar tmpl, tokens, attr, convertBack, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, lastIndex,\n\t\tlinkExpressions = [];\n\n\tif (boundTagId) {\n\t\t// boundTagId is a string for {^{...}} data-linked tag. So only one linkTag in linkMarkup\n\t\t// data and context parameters are undefined\n\t\ttag = bindingStore[boundTagId];\n\t\ttag = tag.linkCtx ? tag.linkCtx.tag : tag;\n\n\t\tlinkCtx = tag.linkCtx || {\n\t\t\ttype: \"inline\",\n\t\t\tdata: currentView.data, // source\n\t\t\telem: tag._elCnt ? tag.parentElem : node, // target\n\t\t\tview: currentView,\n\t\t\tctx: currentView.ctx,\n\t\t\tattr: HTML, // Script marker nodes are associated with {^{ and always target HTML.\n\t\t\tfn: tag._.bnd,\n\t\t\ttag: tag,\n\t\t\t// Pass the boundTagId in the linkCtx, so that it can be picked up in observeAndBind\n\t\t\t_bndId: boundTagId\n\t\t};\n\t\tbindDataLinkTarget(linkCtx, linkCtx.fn);\n\t} else if (linkMarkup && node) {\n\t\t// If isLink then this is a top-level linking: .link(expression, target, data, ....) or\n\t\t// .link(true, target, data, ....) scenario - and data and context are passed in separately from the view\n\t\tdata = isLink ? data : currentView.data;\n\n\t\t// Compiled linkFn expressions could be stored in the tmpl.links array of the template\n\t\t// TODO - consider also caching globally so that if {{:foo}} or data-link=\"foo\" occurs in different places,\n\t\t// the compiled template for this is cached and only compiled once...\n\t\t//links = currentView.links || currentView.tmpl.links;\n\n\t\ttmpl = currentView.tmpl;\n\n//\t\t\tif (!(linkTags = links[linkMarkup])) {\n\t\t// This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template.\n\n\t\tlinkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node));\n\t\tlastIndex = rTagDatalink.lastIndex = 0;\n\t\twhile (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \\}(!\\}) option.\n\t\t\tlinkExpressions.push(tokens);\n\t\t\tlastIndex = rTagDatalink.lastIndex;\n\t\t}\n\t\tif (lastIndex < linkMarkup.length) {\n\t\t\tsyntaxError(linkMarkup);\n\t\t}\n\t\twhile (tokens = linkExpressions.shift()) {\n\t\t\t// Iterate over the data-link expressions, for different target attrs,\n\t\t\t// e.g. ~description(firstName, lastName)}\"\n\t\t\t// tokens: [all, attr, bindOnly, tagExpr, tagName, converter, colon, html, comment, code, params]\n\t\t\trTagIndex = rTagDatalink.lastIndex;\n\t\t\tattr = tokens[1];\n\t\t\ttagExpr = tokens[3];\n\t\t\twhile (linkExpressions[0] && linkExpressions[0][4] === \"else\") { // If this is {someTag...} and is followed by an {else...} add to tagExpr\n\t\t\t\ttagExpr += delimCloseChar1 + delimOpenChar0 + linkExpressions.shift()[3];\n\t\t\t\thasElse = true;\n\t\t\t}\n\t\t\tif (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}\n\t\t\t\ttagExpr += delimCloseChar1 + delimOpenChar0 + delimOpenChar1 + \"/\" + tokens[4] + delimCloseChar0;\n\t\t\t}\n\t\t\tlinkCtx = {\n\t\t\t\ttype: isLink ? \"top\" : \"link\",\n\t\t\t\tdata: data, // source\n\t\t\t\telem: node, // target\n\t\t\t\tview: currentView,\n\t\t\t\tctx: context,\n\t\t\t\tattr: attr,\n\t\t\t\tisLk: isLink, // top-level linking?\n\t\t\t\t_toLk : 1, // Flag to data-link on initial data-link call rendering call\n\t\t\t\t_noUpd : tokens[2] // Flag for data-link=\"^{...}\" so on initial data-link call will bind, but not render)\n\t\t\t};\n\n\t\t\tconvertBack = undefined;\n\t\t\tif (tokens[6]) {\n\t\t\t\tconvertBack = tokens[10] || undefined;\n\t\t\t\tlinkCtx.convert = tokens[5] || \"\";\n\t\t\t\tif (!attr && convertBack !== undefined && defaultAttr(node)) {\n\t\t\t\t\t// Default target, so allow 2 way binding\n\t\t\t\t\tlinkCtx.convertBack = convertBack = convertBack.slice(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Compile the linkFn expression which evaluates and binds a data-link expression\n\t\t\t// TODO - optimize for the case of simple data path with no conversion, helpers, etc.:\n\t\t\t// i.e. data-link=\"a.b.c\". Avoid creating new instances of Function every time. Can use a default function for all of these...\n\n\t\t\tlinkCtx.expr = attr + tagExpr;\n\t\t\tlinkFn = tmpl.links[tagExpr];\n\t\t\tif (!linkFn) {\n\t\t\t\ttmpl.links[tagExpr] = linkFn = $sub.tmplFn(tagExpr, tmpl, true, convertBack, hasElse);\n\t\t\t}\n\t\t\tlinkCtx.fn = linkFn;\n\t\t\tbindDataLinkTarget(linkCtx, linkFn);\n\t\t\t// We store rTagIndex in local scope, since this addDataBinding method can sometimes be called recursively,\n\t\t\t// and each is using the same rTagDatalink instance.\n\t\t\trTagDatalink.lastIndex = rTagIndex;\n\t\t}\n//\t\t}\n\t}\n}\n\nfunction bindDataLinkTarget(linkCtx, linkFn) {\n\t// Add data link bindings for a link expression in data-link attribute markup\n\tfunction handler(ev, eventArgs) {\n\t\tpropertyChangeHandler.call(linkCtx, ev, eventArgs, linkFn);\n\t\t// If the link expression uses a custom tag, the propertyChangeHandler call will call renderTag, which will set tagCtx on linkCtx\n\t}\n\thandler.noArray = true;\n\tif (linkCtx.isLk) {\n\t\t// Top-level linking: .link(expressionOrTrue, data, context) - so we need to create a view for the linking, with the data and ctx\n\t\t// which may be different than the current context of the target. Note that this view is not a standard data-linked view, so it will\n\t\t// be disposed only when its parent view is disposed.\n\t\taddLinkMethods(linkCtx.view = new $sub.View(\n\t\t\t$sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx),\n\t\t\t\"link\", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers));\n\t}\n\tlinkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]}\n\tlinkCtx._hdl = handler;\n\t// handler._ctx = linkCtx; Could pass linkCtx for use in a depends = function() {} call, so depends is different for different linkCtx's\n\thandler(true);\n}\n\n//=====================\n// Data-linking helpers\n//=====================\n\nfunction removeSubStr(str, substr) {\n\tvar k;\n\treturn str\n\t\t? (k = str.indexOf(substr),\n\t\t\t(k + 1\n\t\t\t\t? str.slice(0, k) + str.slice(k + substr.length)\n\t\t\t\t: str))\n\t\t: \"\";\n}\n\nfunction markerNodeInfo(node) {\n\treturn node &&\n\t\t(\"\" + node === node\n\t\t\t? node\n\t\t\t: node.tagName === SCRIPT\n\t\t\t\t? node.type.slice(3)\n\t\t\t\t: node.nodeType === 1 && node.getAttribute(jsvAttrStr) || \"\");\n}\n\nfunction viewInfos(node, isVal, rBinding) {\n\t// Test whether node is a script marker node, and if so, return metadata\n\tfunction getInfos(all, open, close, id, ch, elPath) {\n\t\tinfos.push({\n\t\t\telCnt: elCnt,\n\t\t\tid: id,\n\t\t\tch: ch,\n\t\t\topen: open,\n\t\t\tclose: close,\n\t\t\tpath: elPath,\n\t\t\ttoken: all\n\t\t});\n\t}\n\tvar elCnt, tokens,\n\t\tinfos = [];\n\tif (tokens = isVal ? node : markerNodeInfo(node)) {\n\t\telCnt = infos.elCnt = node.tagName !== SCRIPT;\n\t\telCnt = tokens.charAt(0) === \"@\" || elCnt;\n\t\tinfos._tkns = tokens;\n\t\t// rMarkerTokens = /(?:(#)|(\\/))(\\d+)([_^])([-+@\\d]+)?/g;\n\t\ttokens.replace(rBinding || rMarkerTokens, getInfos);\n\t\treturn infos;\n\t}\n}\n\nfunction unmarkPrevOrNextNode(node, elCnt) {\n\tif (node) {\n\t\tif (node.type === \"jsv\") {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t} else if (elCnt && node.getAttribute($viewsLinkAttr) === \"\") {\n\t\t\tnode.removeAttribute($viewsLinkAttr);\n\t\t}\n\t}\n}\n\nfunction markPrevOrNextNode(node, elCnt) {\n\tvar marker = node;\n\twhile (elCnt && marker && marker.nodeType !== 1) {\n\t\tmarker = marker.previousSibling;\n\t}\n\tif (marker) {\n\t\tif (marker.nodeType !== 1) {\n\t\t\t// For text nodes, we will add a script node before\n\t\t\tmarker = document.createElement(SCRIPT);\n\t\t\tmarker.type = \"jsv\";\n\t\t\tnode.parentNode.insertBefore(marker, node);\n\t\t} else if (!markerNodeInfo(marker) && !marker.getAttribute($viewsLinkAttr)) {\n\t\t\t// For element nodes, we will add a data-link attribute (unless there is already one)\n\t\t\t// so that this node gets included in the node linking process.\n\t\t\tmarker.setAttribute($viewsLinkAttr, \"\");\n\t\t}\n\t}\n\treturn marker;\n}\n\nfunction normalizeLinkTag(linkMarkup, twoway) {\n\tlinkMarkup = $.trim(linkMarkup).replace(rEscapeQuotes, \"\\\\$&\");\n\treturn linkMarkup.slice(-1) !== delimCloseChar0\n\t// If simplified syntax is used: data-link=\"expression\", convert to data-link=\"{:expression}\",\n\t// or for inputs, data-link=\"{:expression:}\" for (default) two-way binding\n\t\t? linkMarkup = delimOpenChar1 + \":\" + linkMarkup + (twoway ? \":\" : \"\") + delimCloseChar0\n\t\t: linkMarkup;\n}\n\n//===========================\n// Methods for views and tags\n//===========================\n\nfunction callAfterLink(tag, ev, eventArgs) {\n\tvar linkedElem, displayElem, linkedEl, val, l, linkedTag, oldTrig, newTrig, tagProps, propsExpr, linkedElemView, prop, propDef,\n\t\ttagCtx = tag.tagCtx,\n\t\tview = tagCtx.view,\n\t\tprops = tagCtx.props,\n\t\tlinkCtx = tag.linkCtx;\n\n\tif (tag._.unlinked) { // First call to onAfterLink, or first call after onUpdate: updateContent. Initialize and call onBind and set properties\n\t\tif (tag.linkedElement !== undefined) {\n\t\t\t// linkedElement: - selector for identifying linked element in template/rendered content\n\t\t\ttag.linkedElem = tag._.inline ? tag.contents(true, tag.linkedElement || \"*\").first() : $(linkCtx.elem);\n\t\t}\n\t\tif (tag.onBind) {\n\t\t\ttag.onBind(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t\t}\n\t}\n\n\tif (tag.onAfterLink) {\n\t\ttag.onAfterLink(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t}\n\n\tlinkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem;\n\tdisplayElem = tag.displayElem || linkedElem;\n\nif (linkedElem && linkedElem[0]) {\n\t\tif (!tag._.chging) {\n\t\t\tval = tag.cvtArgs()[0];\n\t\t\tl = linkedElem.length;\n\t\t\twhile (l--) {\n\t\t\t\tlinkedEl = linkedElem[l];\n\t\t\t\tif (tag._.unlinked && linkedEl !== linkCtx.elem) {\n\t\t\t\t\tlinkedTag = linkedEl._jsvLkEl;\n\t\t\t\t\tif (tag._.inline && (!linkedTag || linkedTag !== tag && linkedTag.targetTag !== tag)) {\n\t\t\t\t\t\t// For data-linked tags, identify the linkedEl with the tag, for \"to\" binding\n\t\t\t\t\t\t// (For data-linked elements, if not yet bound, we identify later when the linkCtx.elem is bound)\n\t\t\t\t\t\tlinkedEl._jsvLkEl = tag;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag, linkedEl);\n\t\t\t\t\t\tlinkedEl._jsvBnd = \"&\" + tag._tgId + \"+\"; // Add a \"+\" for cloned binding - so removing\n\t\t\t\t\t\t// elems with cloned bindings will not remove the 'parent' binding from the bindingStore.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (val !== undefined) {\n\t\t\t\t\tif (linkedEl.value !== undefined) {\n\t\t\t\t\t\tif (linkedEl.type === CHECKBOX) {\n\t\t\t\t\t\t\tlinkedEl[CHECKED] = val && val !== \"false\";\n\t\t\t\t\t\t} else if (linkedEl.type === RADIO) {\n\t\t\t\t\t\t\tlinkedEl[CHECKED] = (linkedEl.value === val);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlinkedEl.value = val;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (linkedEl.contentEditable === TRUE) {\n\t\t\t\t\t\tlinkedEl.innerHTML = val;\n\t\t\t\t\t}\n\t\t\t\t\tlinkCtx._val = val;\n\t\t\t\t}\n\t\t\t\tif (props.name) {\n\t\t\t\t\tlinkedEl.name = linkedEl.name || props.name;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tag.setSize) {\n\t\t\tif (props.height) {\n\t\t\t\tdisplayElem.height(props.height);\n\t\t\t}\n\t\t\tif (props.width) {\n\t\t\t\tdisplayElem.width(props.width);\n\t\t\t}\n\t\t}\n\t\tif (props.title !== undefined) {\n\t\t\tdisplayElem.attr(\"title\", props.title);\n\t\t}\n\t\tif (props[\"class\"]) {\n\t\t\t// This code supports dynamic binding to class - where it adds the class if absent, and removes/adds if a previous value is present\n\t\t\tif (eventArgs && displayElem.hasClass(eventArgs.oldValue)) {\n\t\t\t\tdisplayElem.removeClass(eventArgs.oldValue);\n\t\t\t}\n\t\t\tdisplayElem.addClass(props[\"class\"]);\n\t\t}\n\t\tif (props.id) {\n\t\t\tlinkedElem[0].id = props.id;\n\t\t}\n\t}\n\ttag._.unlinked = undefined;\n}\n\nfunction asyncElemChangeHandler(ev) {\n\tsetTimeout(function() {\n\t\telemChangeHandler(ev);\n\t}, 0);\n}\n\nfunction bindElChange($elem, trig, onoff) {\n\tif (trig) {\n\t\ttrig = \"\" + trig === trig ? trig : \"keydown\"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown'): Get 'keydown' with async\n\t\t$elem[onoff](trig, trig === \"keydown\" ? asyncElemChangeHandler : elemChangeHandler);\n\t}\n}\n\nfunction bindTo(binding, tag, linkedElem, cvtBk) {\n\t// Two-way binding.\n\t// We set the binding.to[1] to be the cvtBack, and binding.to[0] to be either the path to the target, or [object, path] where the target is the path on the provided object.\n\t// So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, \"d.e\"], and we bind to the path on the returned object, exprOb.ob, as target\n\t// Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z\n\n\tvar bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, totry,\n\t\tlinkCtx = binding.linkCtx,\n\t\tsource = linkCtx.data,\n\t\tpaths = linkCtx.fn.paths;\n\n\ttag = tag || linkedElem._jsvLkEl;\n\n\t\tif (binding && paths && !binding.to) {\n\t\toldTrig = linkedElem._jsvTr || false;\n\t\tif (tag) {\n\t\t\tcvtBk = tag.convertBack || cvtBk;\n\t\t\tnewTrig = tag.tagCtx.props.trigger;\n\t\t}\n\t\tnewTrig = newTrig === undefined ? $subSettings.trigger : newTrig;\n\t\t// Trigger is noop except for text box, textarea, contenteditable...\n\t\tnewTrig = newTrig && (linkedElem.tagName === \"INPUT\" && linkedElem.type !== CHECKBOX && linkedElem.type !== RADIO || linkedElem.type === \"textarea\" || linkedElem.contentEditable === TRUE) && newTrig || false;\n\n\t\tif (oldTrig !== newTrig) {\n\t\t\t$linkedElem = $(linkedElem);\n\t\t\tbindElChange($linkedElem, oldTrig, \"off\");\n\t\t\tbindElChange(\n\t\t\t\t$linkedElem,\n\t\t\t\tlinkedElem._jsvTr = newTrig,\n\t\t\t\t\"on\"\n\t\t\t);\n\t\t}\n\n\t\tpaths = (bindto = paths._jsvto) || paths[0];\n\t\tpathIndex = paths && paths.length;\n\t\tif (pathIndex && (!tag || tag.tagCtx.args.length)) {\n\t\t\tlastPath = paths[pathIndex - 1];\n\t\t\tif (lastPath._jsv) {\n\t\t\t\tbindtoOb = lastPath;\n\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t}\n\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t}\n\t\t\tif (path) {\n\t\t\t\tto = [\n\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\tlastPath\n\t\t\t\t\t];\n\t\t\t} else {\n\t\t\t\twhile ((totry = linkCtx._ctxCb(path = lastPath.split(\"^\").join(\".\"), source)) && (l = totry.length)) {\n\t\t\t\t\t// Recursively dereference any ~foo or #bar tokens in the path. (Recursive because ~foo may be a contextual param which has\n\t\t\t\t\t// its own dependencies on other ~foo #bar components)\n\t\t\t\t\tto = totry;\n\t\t\t\t\tif (to._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag)\n\t\t\t\t\t\tto = [to[l-3], to[l-2]];\n\t\t\t\t\t\tlastPath = to[1];\n\t\t\t\t\t\tif (lastPath._jsv) {\n\t\t\t\t\t\t\tbindtoOb = lastPath;\n\t\t\t\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t\t\t\t\tto = [\n\t\t\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\t\t\tlastPath\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else { // Two-way binding to a helper - e.g. ~address.street, or computed, e.g. ~fullName(), or view property e.g. #data.foo\n\t\t\t\t\t\tto = l>2\n\t\t\t\t\t\t\t? [to[l-3], to[l-2]] // With path: [object, path]\n\t\t\t\t\t\t\t: [to[l-2]]; // No path, (e.g. [function] for computed with setter)\n\t\t\t\t\t}\n\t\t\t\t\tsource = to[0];\n\t\t\t\t\tlastPath = to[1];\n\t\t\t\t}\n\t\t\t\tto = to || [source, path]; // Two way binding to an object (neither ~foo nor #bar)\n\t\t\t}\n\t\t} else {\n\t\t\tto = [];\n\t\t}\n\t\tbinding.to = [\n\t\t\tto,\n\t\t\tcvtBk\n\t\t];\n\t}\n}\n\nfunction mergeCtxs(tag, newCtxs, replace) { // Merge updated tagCtxs into tag.tagCtxs\n\tvar tagCtx, newTagCtx,\n\t\tview = tag.tagCtx.view,\n\t\ttagCtxs = tag.tagCtxs || [tag.tagCtx],\n\t\tl = tagCtxs.length,\n\t\trefresh = !newCtxs;\n\n\tnewCtxs = newCtxs || tag._.bnd.call(view.tmpl, (tag.linkCtx || view).data, view, $sub);\n\n\tif (replace) {\n\t\t// Replace previous tagCtxs by new ones, rather than merging\n\t\ttagCtxs = tag.tagCtxs = newCtxs;\n\t\ttag.tagCtx = tagCtxs[0];\n\t} else {\n\t\twhile (l--) {\n\t\t\ttagCtx = tagCtxs[l];\n\t\t\tnewTagCtx = newCtxs[l];\n\t\t\t$observable(tagCtx.props).setProperty(newTagCtx.props);\n\t\t\t$extend(tagCtx.ctx, newTagCtx.ctx); // We don't support propagating ctx variables, ~foo, observably, to nested views. So extend, not setProperty...\n\t\t\ttagCtx.args = newTagCtx.args;\n\t\t\tif (refresh) {\n\t\t\t\ttagCtx.tmpl = newTagCtx.tmpl;\n\t\t\t}\n\t\t}\n\t}\n\t$sub._ths(tag, tagCtxs[0]); // tagHandlersFromProps\n\treturn tagCtxs;\n}\n\n//=========\n// Disposal\n//=========\n\nfunction clean(elems) {\n\t// Remove data-link bindings, or contained views\n\tvar l, elem, bindings,\n\t\telemArray = [],\n\t\tlen = elems.length,\n\t\ti = len;\n\twhile (i--) {\n\t\t// Copy into an array, so that deletion of nodes from DOM will not cause our 'i' counter to get shifted\n\t\t// (Note: This seems as fast or faster than elemArray = [].slice.call(elems); ...)\n\t\telemArray.push(elems[i]);\n\t}\n\ti = len;\n\twhile (i--) {\n\t\telem = elemArray[i];\n\t\tif (elem.parentNode) {\n\t\t\t// Has not already been removed from the DOM\n\t\t\tif (bindings = elem._jsvBnd) {\n\t\t\t\t// Get propertyChange bindings for this element\n\t\t\t\t// This may be an element with data-link, or the opening script marker node for a data-linked tag {^{...}}\n\t\t\t\t// bindings is a string with the syntax: \"(&bindingId)*\"\n\t\t\t\tbindings = bindings.slice(1).split(\"&\");\n\t\t\t\telem._jsvBnd = \"\";\n\t\t\t\tl = bindings.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\t// Remove associated bindings\n\t\t\t\t\tremoveViewBinding(bindings[l], elem._jsvLkEl, elem); // unbind bindings with this bindingId on this view\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisposeTokens(markerNodeInfo(elem) + (elem._df || \"\"));\n\t\t}\n\t}\n}\n\nfunction removeViewBinding(bindId, linkedElemTag, elem) {\n\t// Unbind\n\tvar objId, linkCtx, tag, object, obsId, tagCtxs, l, map, $linkedElem, linkedElem, trigger, view, targetTag,\n\t\tbinding = bindingStore[bindId];\n\n\tif (linkedElemTag) {\n\t\tlinkedElemTag = linkedElemTag.targetTag || linkedElemTag;\n\t\telem._jsvLkEl = undefined;\n\t} else if (binding) {\n\t\tdelete bindingStore[bindId]; // Delete already, so call to onDispose handler below cannot trigger recursive deletion (through recursive call to jQuery cleanData)\n\t\tfor (objId in binding.bnd) {\n\t\t\tobject = binding.bnd[objId];\n\t\t\tobsId = binding.cbId;\n\t\t\tif ($isArray(object)) {\n\t\t\t\t$([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange\n\t\t\t} else {\n\t\t\t\t$(object).off(propertyChangeStr + obsId);\n\t\t\t}\n\t\t\tdelete binding.bnd[objId];\n\t\t}\n\n\t\tif (linkCtx = binding.linkCtx) {\n\t\t\tif (tag = linkCtx.tag) {\n\t\t\t\tif (tagCtxs = tag.tagCtxs) {\n\t\t\t\t\tl = tagCtxs.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\tif (map = tagCtxs[l].map) {\n\t\t\t\t\t\t\tmap.unmap(); //unobserve\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$linkedElem = tag.linkedElem;\n\n\t\t\t\tif (tag.onUnbind) {\n\t\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx, true);\n\t\t\t\t}\n\t\t\t\tif (tag.onDispose) {\n\t\t\t\t\ttag.onDispose();\n\t\t\t\t}\n\n\t\t\t\tif (!tag._elCnt) {\n\t\t\t\t\tif (tag._prv) {\n\t\t\t\t\t\ttag._prv.parentNode.removeChild(tag._prv);\n\t\t\t\t\t}\n\t\t\t\t\tif (tag._nxt) {\n\t\t\t\t\t\ttag._nxt.parentNode.removeChild(tag._nxt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlinkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;\n\n\t\t\tif (trigger = linkedElem && linkedElem._jsvTr) {\n\t\t\t\tbindElChange($linkedElem || $(linkedElem), trigger, \"off\");\n\t\t\t\tlinkedElem._jsvTr = undefined;\n\t\t\t}\n\t\t\tview = linkCtx.view;\n\t\t\tif (view.type === \"link\") {\n\t\t\t\tview.parent.removeViews(view._.key, undefined, true); // A \"link\" view is associated with the binding, so should be disposed with binding.\n\t\t\t} else {\n\t\t\t\tdelete view._.bnds[bindId];\n\t\t\t}\n\t\t}\n\t\tdelete binding.s[binding.cbId];\n\t}\n}\n\nfunction $unlink(to) {\n\tif (to) {\n\t\tto = to.jquery ? to : $(to);\n\t\tto.each(function() {\n\t\t\tvar innerView;\n\t\t\t//TODO fix this for better perf. Rather that calling inner view multiple times which does querySelectorAll each time, consider a single querySelectorAll\n\t\t\t// or simply call view.removeViews() on the top-level views under the target 'to' node, then clean(...)\n\t\t\twhile ((innerView = $view(this, true)) && innerView.parent) {\n\t\t\t\tinnerView.parent.removeViews(innerView._.key, undefined, true);\n\t\t\t}\n\t\t\tclean(this.getElementsByTagName(\"*\"));\n\t\t});\n\t\tclean(to);\n\t} else {\n\t\t// Call to $.unlink() is equivalent to $.unlink(true, \"body\")\n\t\tif (activeBody) {\n\t\t\t$(activeBody)\n\t\t\t\t.off(elementChangeStr, elemChangeHandler)\n\t\t\t\t.off('blur', '[contenteditable]', elemChangeHandler);\n\t\t\tactiveBody = undefined;\n\t\t}\n\t\ttopView.removeViews();\n\t\tclean(document.body.getElementsByTagName(\"*\"));\n\t}\n}\n\n//========\n// Helpers\n//========\n\nfunction getContextCb(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc.\n\t// TODO Consider exposing or allowing override, as public API\n\treturn function(path, object, depth) {\n\t\t// TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on\n\t\t// the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times\n\t\tvar tokens, tag, items, helper, last, nextPath, l;\n\t\tif (view && path) {\n\t\t\tif (path._jsv) {\n\t\t\t\treturn path._jsv.call(view.tmpl, object, view, $sub);\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"~\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"~a.b.c\" string:\n\t\t\t\t// [helperObject 'a', \"a.b.c\" currentDataItem] so currentDataItem becomes the object for subsequent paths.\n\t\t\t\tif (path.slice(0, 4) === \"~tag\") {\n\t\t\t\t\ttag = view.ctx;\n\t\t\t\t\tif (path.charAt(4) === \".\") {\n\t\t\t\t\t\t// \"~tag.xxx\"\n\t\t\t\t\t\ttokens = path.slice(5).split(\".\");\n\t\t\t\t\t\ttag = tag.tag;\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens) {\n\t\t\t\t\t\treturn tag ? [tag, tokens.join(\".\"), object] : [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpath = path.slice(1).split(\".\");\n\t\t\t\tif (helper = view.hlp(last = path.shift(), true)) {\n\t\t\t\t\tif (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [data, ctxPrmDependencies ...]\n\t\t\t\t\t\tif (path.length) {\n\t\t\t\t\t\t\tnextPath = \".\" + path.join(\".\");\n\t\t\t\t\t\t\tlast = helper[l = helper.length-1];\n\t\t\t\t\t\t\tif (last._jsv) {\n\t\t\t\t\t\t\t\tlast.sb = nextPath;\n\t\t\t\t\t\t\t\tlast.bnd = !!depth;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thelper[l] = (last + nextPath).replace(\"#data.\", \"\");\n\t\t\t\t\t\t\t\tif (last.slice(0, 5) === \"#view\") {\n\t\t\t\t\t\t\t\t\thelper[l] = helper[l].slice(6);\n\t\t\t\t\t\t\t\t\thelper.splice(l, 0, view);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\thelper.push(object);\n\t\t\t\t\t\titems = helper;\n\t\t\t\t\t} else if (path.length || $isFunction(helper)) {\n\t\t\t\t\t\titems = [helper, path.join(\".\"), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn items || [];\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"#\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"#a.b.c\" string: [view, \"a.b.c\" currentDataItem]\n\t\t\t\t// so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes.\n\t\t\t\treturn path === \"#data\" ? [] : [view, path.replace(rViewPath, \"\"), object];\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction inputAttrib(elem) {\n\treturn elem.type === CHECKBOX ? elem[CHECKED] : elem.value;\n}\n\n//========================== Initialize ==========================\n\n//=====================\n// JsRender integration\n//=====================\n\n$sub.onStore.template = function(name, item) {\n\titem.link = tmplLink;\n\tif (name) {\n\t\t$.link[name] = function() {\n\t\t\treturn tmplLink.apply(item, arguments);\n\t\t};\n\t}\n};\n\n$sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method\n\n// Define JsViews version of delimiters(), and initialize\n($viewsSettings.delimiters = function() {\n\t// Run delimiters initialization in context of jsrender.js\n\tvar ret = oldJsvDelimiters.apply(0, arguments),\n\t\t// Now set also delimOpenChar0 etc. in context of jquery.views.js...\n\t\tdelimChars = $subSettings.delimiters;\n\n\tdelimOpenChar0 = delimChars[0].charAt(0);\n\tdelimOpenChar1 = delimChars[0].charAt(1);\n\tdelimCloseChar0 = delimChars[1].charAt(0);\n\tdelimCloseChar1 = delimChars[1].charAt(1);\n\tlinkChar = delimChars[2];\n\n\t// Data-linking must use new delimiters\n\trTagDatalink = new RegExp(\"(?:^|\\\\s*)([\\\\w-]*)(\\\\\" + linkChar + \")?(\\\\\" + delimOpenChar1 + $sub.rTag + \"(:\\\\w*)?\\\\\" + delimCloseChar0 + \")\", \"g\");\n\treturn ret;\n})(); // jshint ignore:line\n\n$sub.addSetting(\"trigger\");\n\n//====================================\n// Additional members for linked views\n//====================================\n\nfunction transferViewTokens(prevNode, nextNode, parentElem, id, viewOrTagChar, refresh) {\n\t// Transfer tokens on prevNode of viewToRemove/viewToRefresh to nextNode or parentElem._df\n\tvar i, l, vwInfos, vwInfo, viewOrTag, viewId, tokens,\n\t\tprecedingLength = 0,\n\t\temptyView = prevNode === nextNode;\n\n\tif (prevNode) {\n\t\t// prevNode is either the first node in the viewOrTag, or has been replaced by the vwInfos tokens string\n\t\tvwInfos = viewInfos(prevNode) || [];\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\t// Step through views or tags on the prevNode\n\t\t\tvwInfo = vwInfos[i];\n\t\t\tviewId = vwInfo.id;\n\t\t\tif (viewId === id && vwInfo.ch === viewOrTagChar) {\n\t\t\t\tif (refresh) {\n\t\t\t\t\t// This is viewOrTagToRefresh, this is the last viewOrTag to process...\n\t\t\t\t\tl = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// This is viewOrTagToRemove, so we are done...\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!emptyView) {\n\t\t\t\tviewOrTag = vwInfo.ch === \"_\"\n\t\t\t\t\t? viewStore[viewId]\n\t\t\t\t\t: bindingStore[viewId].linkCtx.tag;\n\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t// A \"#m\" token\n\t\t\t\t\tviewOrTag._prv = nextNode;\n\t\t\t\t} else if (vwInfo.close) {\n\t\t\t\t\t// A \"/m\" token\n\t\t\t\t\tviewOrTag._nxt = nextNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprecedingLength += viewId.length + 2;\n\t\t}\n\n\t\tif (precedingLength) {\n\t\t\tprevNode.setAttribute(jsvAttrStr, prevNode.getAttribute(jsvAttrStr).slice(precedingLength));\n\t\t}\n\t\ttokens = nextNode ? nextNode.getAttribute(jsvAttrStr) : parentElem._df;\n\t\tif (l = tokens.indexOf(\"/\" + id + viewOrTagChar) + 1) {\n\t\t\ttokens = vwInfos._tkns.slice(0, precedingLength) + tokens.slice(l + (refresh ? -1 : id.length + 1));\n\t\t}\n\t\tif (tokens) {\n\t\t\tif (nextNode) {\n\t\t\t\t// If viewOrTagToRemove was an empty viewOrTag, we will remove both #n and /n\n\t\t\t\t// (and any intervening tokens) from the nextNode (=== prevNode)\n\t\t\t\t// If viewOrTagToRemove was not empty, we will take tokens preceding #n from prevNode,\n\t\t\t\t// and concatenate with tokens following /n on nextNode\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, tokens);\n\t\t\t} else {\n\t\t\t\tsetDefer(parentElem, tokens);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// !prevNode, so there may be a deferred nodes token on the parentElem. Remove it.\n\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + viewOrTagChar));\n\t\tif (!refresh && !nextNode) {\n\t\t\t// If this viewOrTag is being removed, and there was no .nxt, remove closing token from deferred tokens\n\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + viewOrTagChar));\n\t\t}\n\t}\n}\n\nfunction disposeTokens(tokens) {\n\tvar i, l, vwItem, vwInfos;\n\tif (vwInfos = viewInfos(tokens, true, rOpenMarkers)) {\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\tvwItem = vwInfos[i];\n\t\t\tif (vwItem.ch === \"_\") {\n\t\t\t\tif ((vwItem = viewStore[vwItem.id]) && vwItem.type) {\n\t\t\t\t\t// If this is the _prv (prevNode) for a view, remove the view\n\t\t\t\t\t// - unless view.type is undefined, in which case it is already being removed\n\t\t\t\t\tvwItem.parent.removeViews(vwItem._.key, undefined, true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveViewBinding(vwItem.id); // unbind bindings with this bindingId on this view\n\t\t\t}\n\t\t}\n\t}\n}\n\n//====================================\n// Add link methods to data-linked view or tag\n//====================================\nfunction addLinkMethods(tagOrView, isTag) {\n\n\ttagOrView.contents = function(deep, select) {\n\t\t// For a view or a tag, return jQuery object with the content nodes,\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is contents(selector)\n\t\t\tselect = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\t\tvar filtered,\n\t\t\tnodes = $(this.nodes());\n\t\tif (nodes[0]) {\n\t\t\tfiltered = select ? nodes.filter(select) : nodes;\n\t\t\tnodes = deep && select ? filtered.add(nodes.find(select)) : filtered;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.nodes = function(withMarkers, prevNode, nextNode) {\n\t\t// For a view or a tag, return top-level nodes\n\t\t// Do not return any script marker nodes, unless withMarkers is true\n\t\t// Optionally limit range, by passing in prevNode or nextNode parameters\n\n\t\tvar node,\n\t\t\tself = this,\n\t\t\telCnt = self._elCnt,\n\t\t\tprevIsFirstNode = !prevNode && elCnt,\n\t\t\tnodes = [];\n\n\t\tprevNode = prevNode || self._prv;\n\t\tnextNode = nextNode || self._nxt;\n\n\t\tnode = prevIsFirstNode\n\t\t\t? (prevNode === self._nxt\n\t\t\t\t? self.parentElem.lastSibling\n\t\t\t\t: prevNode)\n\t\t\t: (self._.inline === false\n\t\t\t\t? prevNode || self.linkCtx.elem.firstChild\n\t\t\t\t: prevNode && prevNode.nextSibling);\n\n\t\twhile (node && (!nextNode || node !== nextNode)) {\n\t\t\tif (withMarkers || elCnt || node.tagName !== SCRIPT) {\n\t\t\t\t// All the top-level nodes in the view\n\t\t\t\t// (except script marker nodes, unless withMarkers = true)\n\t\t\t\t// (Note: If a script marker node, viewInfo.elCnt undefined)\n\t\t\t\tnodes.push(node);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.childTags = function(deep, tagName) {\n\t\t// For a view or a tag, return child tags - at any depth, or as immediate children only.\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is childTags(tagName) - which looks for top-level tags of given tagName\n\t\t\ttagName = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\n\t\tvar self = this,\n\t\t\tview = self.link ? self : self.tagCtx.view, // this may be a view or a tag. If a tag, get the view from tag.view.tagCtx\n\t\t\tprevNode = self._prv,\n\t\t\telCnt = self._elCnt,\n\t\t\ttags = [];\n\n\t\tview.link(\n\t\t\tundefined,\n\t\t\tself.parentElem,\n\t\t\telCnt ? prevNode && prevNode.previousSibling : prevNode,\n\t\t\tself._nxt,\n\t\t\tundefined,\n\t\t\t{get:{\n\t\t\t\ttags: tags,\n\t\t\t\tdeep: deep,\n\t\t\t\tname: tagName,\n\t\t\t\tid: self.link ? self._.id + \"_\" : self._tgId + \"^\"\n\t\t\t}}\n\t\t);\n\t\treturn tags;\n\t};\n\n\ttagOrView.refresh = function(sourceValue) {\n\t\tvar promise, attr,\n\t\t\ttag = this,\n\t\t\tlinkCtx = tag.linkCtx,\n\t\t\tview = tag.tagCtx.view;\n\n\t\tif (tag.disposed) { error(\"Removed tag\"); }\n\t\tif (sourceValue === undefined) {\n\t\t\tsourceValue = $sub._tag(tag, view, view.tmpl, mergeCtxs(tag), true); // Get rendered HTML for tag, based on refreshed tagCtxs\n\t\t}\n\t\tif (sourceValue + \"\" === sourceValue) {\n\t\t\t// If no rendered content, sourceValue will not be a string (can be 0 or undefined)\n\t\t\tif (tag.onUnbind) {\n\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx);\n\t\t\t}\n\t\t\tattr = tag._.inline ? HTML : (linkCtx.attr || defaultAttr(tag.parentElem, true));\n\t\t\tpromise = updateContent(sourceValue, linkCtx, attr, tag);\n\t\t}\n\n\t\tcallAfterLink(tag);\n\t\treturn promise || tag;\n\t};\n\n\ttagOrView.update = function(value) {\n\t\tvar linkedElem = this.linkedElem;\n\t\tif (linkedElem) {\n\t\t\telemChangeHandler({\n\t\t\t\ttarget: linkedElem[0]\n\t\t\t}, undefined, value);\n\t\t}\n\t};\n\n\tif (isTag) {\n\t\t// This is a TAG\n\t\ttagOrView.domChange = function() { // domChange notification support\n\t\t\tvar elem = this.parentElem,\n\t\t\t\thasListener = $.hasData(elem) && $._data(elem).events,\n\t\t\t\tdomChangeNotification = \"jsv-domchange\";\n\n\t\t\tif (hasListener && hasListener[domChangeNotification]) {\n\t\t\t\t// Only trigger handler if there is a handler listening for this event. (Note using triggerHandler - so no event bubbling.)\n\t\t\t\t$(elem).triggerHandler(domChangeNotification, arguments);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// This is a VIEW\n\t\t// Note: a linked view will also, after linking have nodes[], _prv (prevNode), _nxt (nextNode) ...\n\t\ttagOrView.addViews = function(index, dataItems) {\n\t\t\t// if view is not an array view, do nothing\n\t\t\tvar i, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\titemsCount = dataItems.length,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (!self._.useKey && itemsCount) {\n\t\t\t\t// view is of type \"array\"\n\t\t\t\tviewsCount = views.length + itemsCount;\n\n\t\t\t\tif (viewsCount === self.data.length // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\t\t&& renderAndLink(self, index, self.tmpl, views, dataItems, self.ctx) !== false) {\n\t\t\t\t\tif (!self._.srt) { // Not part of a 'sort' on refresh\n\t\t\t\t\t\tself.fixIndex(index + itemsCount);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.removeViews = function(index, itemsCount, keepNodes, isMove) {\n\t\t\t// view.removeViews() removes all the child views\n\t\t\t// view.removeViews(index) removes the child view with specified index or key\n\t\t\t// view.removeViews(index, count) removes the specified nummber of child views, starting with the specified index\n\t\t\tfunction removeView(index) {\n\t\t\t\tvar id, bindId, parentElem, prevNode, nextNode, nodesToRemove,\n\t\t\t\t\tviewToRemove = views[index];\n\n\t\t\t\tif (viewToRemove && viewToRemove.link) {\n\t\t\t\t\tid = viewToRemove._.id;\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tnodesToRemove = viewToRemove.nodes();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove child views, without removing nodes\n\t\t\t\t\tviewToRemove.removeViews(undefined, undefined, true);\n\n\t\t\t\t\tviewToRemove.type = undefined; // Set type to undefined: used as a flag that this view is being removed\n\t\t\t\t\tprevNode = viewToRemove._prv;\n\t\t\t\t\tnextNode = viewToRemove._nxt;\n\t\t\t\t\tparentElem = viewToRemove.parentElem;\n\t\t\t\t\t// If prevNode and nextNode are the same, the view is empty\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tif (viewToRemove._elCnt) {\n\t\t\t\t\t\t\t// if keepNodes is false (and transferring of tokens has not already been done at a higher level)\n\t\t\t\t\t\t\t// then transfer tokens from prevNode which is being removed, to nextNode.\n\t\t\t\t\t\t\ttransferViewTokens(prevNode, nextNode, parentElem, id, \"_\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(nodesToRemove).remove();\n\t\t\t\t\t}\n\t\t\t\t\tif (!viewToRemove._elCnt) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tprevNode.parentNode.removeChild(prevNode); // (prevNode.parentNode is parentElem, except if jQuery Mobile or similar has inserted an intermediate wrapper\n\t\t\t\t\t\t\tnextNode.parentNode.removeChild(nextNode);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t\tsetArrayChangeLink(viewToRemove);\n\t\t\t\t\tfor (bindId in viewToRemove._.bnds) {\n\t\t\t\t\t\tremoveViewBinding(bindId);\n\t\t\t\t\t}\n\t\t\t\t\tdelete viewStore[id];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar current, view, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\tisArray = !self._.useKey,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (isArray) {\n\t\t\t\tviewsCount = views.length;\n\t\t\t}\n\t\t\tif (index === undefined) {\n\t\t\t\t// Remove all child views\n\t\t\t\tif (isArray) {\n\t\t\t\t\t// views and data are arrays\n\t\t\t\t\tcurrent = viewsCount;\n\t\t\t\t\twhile (current--) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = [];\n\t\t\t\t} else {\n\t\t\t\t\t// views and data are objects\n\t\t\t\t\tfor (view in views) {\n\t\t\t\t\t\t// Remove by key\n\t\t\t\t\t\tremoveView(view);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = {};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (itemsCount === undefined) {\n\t\t\t\t\tif (isArray) {\n\t\t\t\t\t\t// The parentView is data array view.\n\t\t\t\t\t\t// Set itemsCount to 1, to remove this item\n\t\t\t\t\t\titemsCount = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Remove child view with key 'index'\n\t\t\t\t\t\tremoveView(index);\n\t\t\t\t\t\tdelete views[index];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isArray && itemsCount\n\t\t\t\t\t&& (isMove || viewsCount - itemsCount === self.data.length)) { // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\tcurrent = index + itemsCount;\n\t\t\t\t\t// Remove indexed items (parentView is data array view);\n\t\t\t\t\twhile (current-- > index) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tviews.splice(index, itemsCount);\n\t\t\t\t\tif (!self._.sort) {\n\t\t\t\t\t\tself.fixIndex(index);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.refresh = function() {\n\t\t\tvar self = this,\n\t\t\t\tparent = self.parent;\n\n\t\t\tif (parent) {\n\t\t\t\trenderAndLink(self, self.index, self.tmpl, parent.views, self.data, undefined, true);\n\t\t\t\tsetArrayChangeLink(self);\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.fixIndex = function(fromIndex) {\n\t\t\t// Fixup index on following view items...\n\t\t\tvar views = this.views,\n\t\t\t\tindex = views.length;\n\t\t\twhile (fromIndex < index--) {\n\t\t\t\tif (views[index].index !== index) {\n\t\t\t\t\t$observable(views[index]).setProperty(\"index\", index);\n\t\t\t\t\t// This is fixing up index, but not key, and not index on child views. From child views, use view.getIndex()\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.link = viewLink;\n\t}\n}\n\n//========================\n// JsViews-specific converters\n//========================\n\n$converters.merge = function(val) {\n\t// Special converter used in data-linking to space-separated lists, such as className:\n\t// Currently only supports toggle semantics - and has no effect if toggle string is not specified\n\t// data-link=\"class{merge:boolExpr toggle=className}\"\n\tvar regularExpression,\n\t\tcurrentValue = this.linkCtx._val || \"\",\n\t\ttoggle = this.tagCtx.props.toggle;\n\n\tif (toggle) {\n\t\t// We are toggling the class specified by the toggle property,\n\t\t// and the boolean val binding is driving the insert/remove toggle\n\n\t\tregularExpression = toggle.replace(/[\\\\^$.|?*+()[{]/g, \"\\\\$&\");\n\t\t// Escape any regular expression special characters (metacharacters) within the toggle string\n\t\tregularExpression = \"(\\\\s(?=\" + regularExpression + \"$)|(\\\\s)|^)(\" + regularExpression + \"(\\\\s|$))\";\n\t\t// Example: /(\\s(?=myclass$)|(\\s)|^)?(myclass(\\s|$))/ - so matches (\" myclass\" or \" \" or ^ ) followed by (\"myclass \" or \"myclass$\") where ^/$ are beginning/end of string\n\t\tcurrentValue = currentValue.replace(new RegExp(regularExpression), \"$2\");\n\t\tval = currentValue + (val ? (currentValue && \" \") + toggle : \"\");\n\t}\n\treturn val;\n};\n\n//========================\n// JsViews-specific tags\n//========================\n\nfunction keepParentDataCtx(val) {\n\treturn this.tagCtx.view; // Return the parent view as data context for rendering block content\n}\n\n$tags({\n\ton: {\n\t\tattr: NONE,\n\t\tinit: function(tagCtx) {\n\t\t\tvar content,\n\t\t\t\ttag = this,\n\t\t\t\ti = 0,\n\t\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\t\tl = args.length;\n\n\t\t\tfor (; ii && i+1; // handler index\n\t\t\tif (tag._.inline) {\n\t\t\t\tif (!$sub.rTmpl.exec(content = tagCtx.tmpl.markup)) {\n\t\t\t\t\t// Inline {^{on}} tag with no content (or external template content) or with content containing\n\t\t\t\t\t// no HTML or JsRender tags: We will wrap the (text) content, or the operation name in a \";\n\t\t\t\t}\n\t\t\t\ttag.attr = HTML;\n\t\t\t}\n\t\t},\n\t\tonAfterLink: function(tagCtx, linkCtx) {\n\t\t\tvar handler, params, find, activeElem,\n\t\t\t\ttag = this,\n\t\t\t\ti = tag._hi,\n\t\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\t\tl = args.length,\n\t\t\t\tprops = tagCtx.props,\n\t\t\t\tdata = props.data,\n\t\t\t\tview = tagCtx.view,\n\t\t\t\tcontextOb = props.context; // Context ('this' pointer) for attached handler\n\n\t\t\tif (i) { // There is a handler\n\t\t\t\thandler = args[i-1];\n\t\t\t\tparams = args.slice(i); // Subsequent args are params\n\t\t\t\targs = args.slice(0, i-1); // Preceding args (if any) are events and selector\n\t\t\t\ttag._sel = args[1]; // Selector for descendant elements - for delegated events on those elements, delegating to the activeElem\n\n\t\t\t\tactiveElem = tag.activeElem = tag.activeElem || $(tag._.inline\n\t\t\t\t\t? (tag._sel = args[1] || \"*\", tag.parentElem)\n\t\t\t\t\t// If inline, attach to child elements of tag parent element (filtered by selector argument if provided.\n\t\t\t\t\t// (In handler we'll filter out events from sibling elements preceding or following tag.)\n\t\t\t\t\t// This allows us to use the delegated pattern where the attached event works even for added elements satisfying the selector\n\t\t\t\t\t: linkCtx.elem);\n\n\t\t\t\tif (!contextOb) {\n\t\t\t\t\t// Get the path for the preceding object (context object) of handler (which is the last arg), compile function\n\t\t\t\t\t// to return that context object, and run compiled function against data\n\t\t\t\t\tcontextOb = /^(.*)[\\.^][\\w$]+$/.exec(tagCtx.params.args.slice(-params.length - 1)[0]);\n\t\t\t\t\tcontextOb = contextOb && $sub.tmplFn(delimOpenChar1 + \":\" + contextOb[1] + delimCloseChar0, view.tmpl, true)(linkCtx.data, view);\n\t\t\t\t}\n\n\t\t\t\tif (tag._evs) {\n\t\t\t\t\ttag.onUnbind();\n\t\t\t\t}\n\n\t\t\t\tactiveElem.on(\n\t\t\t\t\ttag._evs = args[0] || \"click\", // events defaults to \"click\"\n\t\t\t\t\ttag._sel,\n\t\t\t\t\tdata == undefined ? null : data,\n\t\t\t\t\ttag._hlr = function hndlr(ev) {\n\t\t\t\t\t\tvar nodes, length,\n\t\t\t\t\t\t\tfound = !tag._.inline;\n\n\t\t\t\t\t\tif (!found) { // If inline, filter out events from sibling elements preceding or following tag.\n\t\t\t\t\t\t\tnodes = tag.contents(\"*\");\n\t\t\t\t\t\t\tl = nodes.length;\n\t\t\t\t\t\t\twhile (!found && l--) {\n\t\t\t\t\t\t\t\tif (nodes[l].contains(ev.target)) {\n\t\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (found) { // target elem is indeed within the tag, so call the {on} handler\n\t\t\t\t\t\t\treturn handler.apply(contextOb || linkCtx.data, [].concat(\n\t\t\t\t\t\t\t\tparams, // e.g. par1, par2\n\t\t\t\t\t\t\t\tev,\n\t\t\t\t\t\t\t\t{change: ev.type, view: view, linkCtx: linkCtx},\n\t\t\t\t\t\t\t\tparams.slice.call(arguments, 1) // If triggering event (e.g. jsv-domchange) has additional arguments after ev, pass them too\n\t\t\t\t\t\t\t));\n\t\t\t\t\t\t\t// for {on 'click' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs)\n\t\t\t\t\t\t\t// for {on 'jsv-domchange' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs, tagCtx, linkCtx, observableEventArgs)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tonUpdate: function() {\n\t\t\treturn false;\n\t\t},\n\t\tonUnbind: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.activeElem) {\n\t\t\t\tself.activeElem.off(self._evs, self._sel, self._hlr);\n\t\t\t}\n\t\t},\n\t\tflow: true,\n\t\tcontentCtx: keepParentDataCtx,\n\t\tdataBoundOnly: true\n\t},\n\tradiogroup: {\n\t\tinit: function(tagCtx) {\n\t\t\tthis.name = tagCtx.props.name || (\"jsv\" + Math.random());\n\t\t},\n\t\tonBind: function(tagCtx, linkCtx) {\n\t\t\tvar domChngCntnr,\n\t\t\t\ttag = this,\n\t\t\t\t$linkedElem = tag.linkedElem = (tag._.inline ? tag.contents(true, \"input[type=radio]\") : $(linkCtx.elem).find(\"input[type=radio]\")),\n\t\t\t\tl = $linkedElem.length;\n\n\t\t\tif (tag._.inline) {\n\t\t\t\t// If the first element is owned by (rendered by) this tag (not by a childTag such as {^{for}})\n\t\t\t\t// use it as container for detecting dom changes\n\t\t\t\tdomChngCntnr = tag.contents(\"*\")[0];\n\t\t\t\tdomChngCntnr = domChngCntnr && $.view(domChngCntnr).ctx.tag === tag.parent ? domChngCntnr : tag.parentElem;\n\t\t\t} else {\n\t\t\t\tdomChngCntnr = linkCtx.elem;\n\t\t\t}\n\t\t\twhile (l--) {\n\t\t\t\t// Configure the name for each radio input element\n\t\t\t\t$linkedElem[l].name = $linkedElem[l].name || tag.name;\n\t\t\t}\n\t\t\t// Establish a domchange listener in case this radiogroup wraps a {^{for}} or {^{if}} or similar which might dynamically insert new radio input elements\n\t\t\t$(domChngCntnr).on(\"jsv-domchange\", function(ev, forOrIfTagCtx) {\n\t\t\t\tvar linkedElem,\n\t\t\t\t\tparentTags = forOrIfTagCtx.ctx.parentTags;\n\t\t\t\tif (!tag._.inline || domChngCntnr !== tag.parentElem // The domChngCntnr is specific to this tag\n\t\t\t\t\t// The domChngCntnr is the parentElem of this tag, so need to make sure dom change event is for\n\t\t\t\t\t// a content change within this tag, not outside it.\n\t\t\t\t\t|| parentTags && parentTags[tag.tagName] === tag) {\n\t\t\t\t\t// Contents have changed so recreate $linkedElem for the radio input elements (including possible new one just inserted)\n\t\t\t\t\t$linkedElem = tag.linkedElem = tag.contents(true, \"input[type=radio]\");\n\t\t\t\t\tl = $linkedElem.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t// Configure binding and name for each radio input element\n\t\t\t\t\t\tlinkedElem = $linkedElem[l];\n\t\t\t\t\t\tlinkedElem._jsvLkEl = tag;\n\t\t\t\t\t\tlinkedElem.name = linkedElem.name || tag.name;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag, linkedElem);\n\t\t\t\t\t\tlinkedElem._jsvBnd = \"&\" + tag._tgId + \"+\";\n\t\t\t\t\t\tlinkedElem.checked = tag.cvtArgs()[0] === linkedElem.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tonUpdate: function(ev, eventArgs, tagCtxs) {\n\t\t\treturn false; // don't rerender\n\t\t},\n\t\tcontentCtx: keepParentDataCtx,\n\t\tdataBoundOnly: true\n\t}\n});\n\n$extend($tags[\"for\"], {\n\t//onUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\t//Consider adding filtering for perf optimization. However the below prevents update on some scenarios which _should_ update - namely when there is another array on which for also depends.\n\t\t//var i, l, tci, prevArg;\n\t\t//for (tci = 0; (prevArg = this.tagCtxs[tci]) && prevArg.args.length; tci++) {\n\t\t//\tif (prevArg.args[0] !== newTagCtxs[tci].args[0]) {\n\t\t//\t\treturn true;\n\t\t//\t}\n\t\t//}\n\t\t//return false;\n\t//},\n\tonArrayChange: function(ev, eventArgs, tagCtx, linkCtx) {\n\t\tvar arrayView,\n\t\t\ttarget = ev.target,\n\t\t\ttargetLength = target.length,\n\t\t\ttag = this,\n\t\t\tchange = eventArgs.change;\n\t\tif (tag._.noVws // Child views not supported because target is not html - e.g. data-link=\"title{for ...}\"\n\t\t\t|| tag.tagCtxs[1] && ( // There is an {{else}}\n\t\t\t\tchange === \"insert\" && targetLength === eventArgs.items.length // inserting, and new length is same as inserted length, so going from 0 to n\n\t\t\t\t|| change === \"remove\" && !targetLength // removing , and new length 0, so going from n to 0\n\t\t\t)) {\n\t\t\ttag.refresh();\n\t\t} else {\n\t\t\tfor (arrayView in tag._.arrVws) {\n\t\t\t\tarrayView = tag._.arrVws[arrayView];\n\t\t\t\tif (arrayView.data === target) {\n\t\t\t\t\tarrayView._.onArrayChange.apply(arrayView, arguments);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttag.domChange(tagCtx, linkCtx, eventArgs);\n\t\tev.done = true;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx) {\n\t\tvar i, arrHandler, arrBinding, data,\n\t\t\ttag = this,\n\t\t\tarrayBindings = tag._ars || {},\n\t\t\ttagCtxs = tag.tagCtxs,\n\t\t\tl = tagCtxs.length,\n\t\t\tselected = tag.selected || 0;\n\n\t\tfor (i = 0; i <= selected; i++) {\n\t\t\ttagCtx = tagCtxs[i]; // loop through tagCtxs up to selected\n\t\t\tdata = tagCtx.map\n\t\t\t\t? tagCtx.map.tgt // 'data' is mapped data\n\t\t\t\t: tagCtx.args.length\n\t\t\t\t\t? tagCtx.args[0] // or args[0]\n\t\t\t\t\t: tagCtx.view.data; // or defaults to current data.\n\n\t\t\tif ((arrBinding = arrayBindings[i]) && data !== arrBinding[0]) { // Is there previous array data on this tagCtx, different from new data\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous array\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t\tif (!arrayBindings[i] && $isArray(data)) {\n\t\t\t\t$observe(data, arrHandler = function(ev, eventArgs) {\n\t\t\t\t\tvar tagCt = tagCtx;\n\t\t\t\t\ttag.onArrayChange(ev, eventArgs, tagCt, linkCtx);\n\t\t\t\t});\n\t\t\t\tarrayBindings[i] = [data, arrHandler]; // Store array data and arrayChangeHandler on tag._ars[i]\n\t\t\t}\n\t\t}\n\t\tfor (i = selected + 1; i < l; i++) { // If there were previous bindings on later tagCtxs, remove them\n\t\t\tif (arrBinding = arrayBindings[i]) {\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous binding\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t}\n\t\ttag._ars = arrayBindings;\n\t},\n\tonDispose: function() {\n\t\tvar l, tag = this;\n\t\tfor (l in tag._ars) {\n\t\t\t$observe(tag._ars[l][0], tag._ars[l][1], true); //unobserve\n\t\t}\n\t}\n});\n\n$extend($tags[\"if\"], {\n\tonUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\tvar tci, prevArg, different;\n\t\tfor (tci = 0; (prevArg = this.tagCtxs[tci]); tci++) {\n\t\t\tdifferent = prevArg.props.tmpl !== newTagCtxs[tci].props.tmpl || prevArg.args.length && !(prevArg = prevArg.args[0]) !== !newTagCtxs[tci].args[0];\n\t\t\tif ((!this.convert && !!prevArg) || different) {\n\t\t\t\treturn different;\n\t\t\t\t// If there is not a change of template, and there is no converter, and newArg and prevArg are both truthy, return false to cancel update.\n\t\t\t\t// (Even if values on later elses are different, we still don't want to update, since rendered output would be unchanged)\n\t\t\t\t// If newArg and prevArg are different, return true, to update\n\t\t\t\t// If newArg and prevArg are both falsey, move to the next {{else ...}}\n\t\t\t}\n\t\t}\n\t\t// Boolean value of all args are unchanged (falsey), so return false to cancel update\n\t\treturn false;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx, ctx, ev, eventArgs) {\n\t\tif (eventArgs) {\n\t\t\tthis.domChange(tagCtx, linkCtx, eventArgs);\n\t\t}\n\t}\n});\n\nfunction observeProps(map, ev, eventArgs) {\n\tif (eventArgs.change === \"set\") {\n\t\tvar target = map.tgt,\n\t\t\tl = target.length;\n\t\twhile (l--) {\n\t\t\tif (target[l].key === eventArgs.path) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (l === -1) {\n\t\t\tif (eventArgs.path && !eventArgs.remove) {\n\t\t\t\t$observable(target).insert({key: eventArgs.path, prop: eventArgs.value});\n\t\t\t}\n\t\t} else if (eventArgs.remove) {\n\t\t\t$observable(target).remove(l);\n\t\t} else {\n\t\t\t$observable(target[l]).setProperty(\"prop\", eventArgs.value);\n\t\t}\n\t}\n}\n\nfunction observeMappedProps(map, ev, eventArgs) {\n\tvar item,\n\t\tsource = map.src,\n\t\tchange = eventArgs.change;\n\n\tif (change === \"set\") {\n\t\tif (eventArgs.path === \"prop\") {\n\t\t\t$observable(source).setProperty(ev.target.key, eventArgs.value);\n\t\t} else { // path === \"key\"\n\t\t\t$observable(source).removeProperty(eventArgs.oldValue); // When key is modified observably, remove old one and set new one\n\t\t\t$observable(source).setProperty(eventArgs.value, ev.target.prop);\n\t\t}\n\t} else if (change === \"remove\") {\n\t\titem = eventArgs.items[0];\n\t\t$observable(source).removeProperty(item.key);\n\t\tdelete source[item.key];\n\t} else if (change === \"insert\") {\n\t\titem = eventArgs.items[0];\n\t\tif (item.key) {\n\t\t\t$observable(source).setProperty(item.key, item.prop);\n\t\t}\n\t}\n}\n\nfunction shallowArrayFilter(allPath /*, object, parentObs*/) { // Filter used by {{props}} for the mappedProps target array\n\treturn allPath.indexOf(\".\") < 0;\n}\n\n$tags(\"props\", {\n\tbaseTag: \"for\",\n\tdataMap: $views.map({\n\t\tgetTgt: $tags.props.dataMap.getTgt,\n\t\tobsSrc: observeProps,\n\t\tobsTgt: observeMappedProps,\n\t\ttgtFlt: shallowArrayFilter\n\t}),\n\tflow: true\n});\n\n//========================\n// Extend jQuery namespace\n//========================\n\n$extend($, {\n\n\t//=======================\n\t// jQuery $.view() plugin\n\t//=======================\n\n\tview: $view = function(node, inner, type) {\n\t\t// $.view() returns top view\n\t\t// $.view(node) returns view that contains node\n\t\t// $.view(selector) returns view that contains first selected element\n\t\t// $.view(nodeOrSelector, type) returns nearest containing view of given type\n\t\t// $.view(nodeOrSelector, \"root\") returns root containing view (child of top view)\n\t\t// $.view(nodeOrSelector, true, type) returns nearest inner (contained) view of given type\n\n\t\tfunction getInnerView(nd, isVl) {\n\t\t\tif (nd) {\n\t\t\t\tvwInfos = viewInfos(nd, isVl, rOpenViewMarkers);\n\t\t\t\tfor (j = 0, k = vwInfos.length; j < k; j++) {\n\t\t\t\t\tif ((view = viewStore[vwInfos[j].id]) && (view = view && type ? view.get(true, type) : view)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (inner !== !!inner) {\n\t\t\t// inner not boolean, so this is view(nodeOrSelector, type)\n\t\t\ttype = inner;\n\t\t\tinner = undefined;\n\t\t}\n\t\tvar view, vwInfos, i, j, k, l, elems,\n\t\t\tlevel = 0,\n\t\t\tbody = document.body;\n\n\t\tif (node && node !== body && topView._.useKey > 1) {\n\t\t\t// Perf optimization for common cases\n\n\t\t\tnode = \"\" + node === node\n\t\t\t\t? $(node)[0]\n\t\t\t\t: node.jquery\n\t\t\t\t\t? node[0]\n\t\t\t\t\t: node;\n\n\t\t\tif (node) {\n\t\t\t\tif (inner) {\n\t\t\t\t\tgetInnerView(node._df, true);\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\t// Treat supplied node as a container element and return the first view encountered.\n\t\t\t\t\t\telems = qsa ? node.querySelectorAll(bindElsSel) : $(bindElsSel, node).get();\n\t\t\t\t\t\tl = elems.length;\n\t\t\t\t\t\tfor (i = 0; !view && i < l; i++) {\n\t\t\t\t\t\t\tgetInnerView(elems[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn view;\n\t\t\t\t}\n\t\t\t\twhile (node) {\n\t\t\t\t\t// Move back through siblings and up through parents to find preceding node which is a _prv (prevNode)\n\t\t\t\t\t// script marker node for a non-element-content view, or a _prv (first node) for an elCnt view\n\t\t\t\t\tif (vwInfos = viewInfos(node, undefined, rViewMarkers)) {\n\t\t\t\t\t\tl = vwInfos.length;\n\t\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t\tview = vwInfos[l];\n\t\t\t\t\t\t\tif (view.open) {\n\t\t\t\t\t\t\t\tif (level < 1) {\n\t\t\t\t\t\t\t\t\tview = viewStore[view.id];\n\t\t\t\t\t\t\t\t\treturn view && type ? view.get(type) : view || topView;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlevel--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// level starts at zero. If we hit a view.close, then we move level to 1, and we don't return a view until\n\t\t\t\t\t\t\t\t// we are back at level zero (or a parent view with level < 0)\n\t\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.previousSibling || node.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn topView;\n\t},\n\n\tlink: $link,\n\tunlink: $unlink,\n\n\t//=====================\n\t// override $.cleanData\n\t//=====================\n\tcleanData: function(elems) {\n\t\tif (elems.length && isCleanCall) {\n\t\t\t// Remove JsViews bindings. Also, remove from the DOM any corresponding script marker nodes\n\t\t\tclean(elems);\n\t\t}\n\t\toldCleanData.apply($, arguments);\n\t}\n});\n\n// Possible future addition - e.g. for ckeditor tag control\n//$views.utility = {\n//\tvalidate: function(html) {\n//\t\ttry {\n//\t\t\ttopView.link(undefined, document.createElement(\"div\"), undefined, undefined, html, undefined, undefined, 1);\n//\t\t}\n//\t\tcatch (e) {\n//\t\t\treturn e.message;\n//\t\t}\n//\t}\n//};\n\n//===============================\n// Extend jQuery instance plugins\n//===============================\n\n$extend($.fn, {\n\tlink: function(expr, from, context, noIteration, parentView, prevNode, nextNode) {\n\t\treturn $link(expr, this, from, context, noIteration, parentView, prevNode, nextNode);\n\t},\n\tunlink: function() {\n\t\treturn $unlink(this);\n\t},\n\tview: function(inner, type) {\n\t\treturn $view(this[0], inner, type);\n\t}\n});\n\n//==============================================================================\n// Override jQuery methods that call our overridden cleanData, for disposal etc.\n//==============================================================================\n\n$.each([HTML, \"replaceWith\", \"empty\", \"remove\"], function(i, name) {\n\tvar oldFn = $.fn[name];\n\t$.fn[name] = function() {\n\t\tvar result;\n\t\tisCleanCall = 1; // Make sure cleanData does disposal only when coming from these calls.\n\t\ttry {\n\t\t\tresult = oldFn.apply(this, arguments);\n\t\t}\n\t\tfinally {\n\t\t\tisCleanCall = 0;\n\t\t}\n\t\treturn result;\n\t};\n});\n\n//===============\n// Extend topView\n//===============\n\naddLinkMethods($extend(topView = $sub.topView, {tmpl: {links: {}}}));\n\nviewStore = {0: topView}; // Top-level view\n//===============\n// Extend $.views\n//===============\n\n$views.getCtx = function(param) { // Return value of ctx.foo, including for compiled contextual parameters, ~foo=expr\n\tif (param && param._cp) { // If this helper resource is a contextual parameter, ~foo=expr\n\t\tparam = param[1](param[0].data, param[0], $sub);\n\t}\n\treturn param;\n};\n\n//===================\n// Extend $.views.sub\n//===================\n\n$sub._cp = function(paramVal, params, view) { // Get compiled contextual parameters (or properties) ~foo=expr.\n\tif (view.linked) { // In JsViews, returns [view, linkFn] where linkFn is compiled function for expression\n\t\tparams = delimOpenChar1 + \":\" + params + delimCloseChar0;\n\t\tvar tmpl = view.tmpl,\n\t\t\tlinks = topView.tmpl.links, // Use topView links, as for compiled top-level linking expressions. To do - should this ever get disposed?\n\t\t\tlinkFn = links[params];\n\t\tif (!linkFn) {\n\t\t\tlinks[params] = linkFn = $sub.tmplFn(params, tmpl, true);\n\t\t}\n\t\tparamVal = [view, linkFn];\n\t\tparamVal._cp = true; // Flag that this is a contextual parameter\n\t}\n\treturn paramVal; // In JsRender returns evaluated expression\n};\n\n$sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each referenced contextual parameter ~foo uses its own exprOb instances\n\tvar ob,\n\t\tclones = obs,\n\t\tl = obs.length;\n\tif (l) {\n\t\tclones = [];\n\t\twhile (l--) {\n\t\t\tob = obs[l];\n\t\t\tif (ob._jsv) {\n\t\t\t\tob = $extend({}, ob); // If an exprOb, clone it. If a string, keep as is\n\t\t\t\tob.prm = cloneExprObjects(ob.prm); // Recursively clone exprObs in parameters, too\n\t\t\t}\n\t\t\tclones.unshift(ob);\n\t\t}\n\t}\n\treturn clones;\n};\n\n//=========================\n// Extend $.views.settings\n//=========================\n\noldAdvSet = $sub.advSet;\n\n$sub.advSet = function() { // refresh advanced settings\n\toldAdvSet();\n\tglobal._jsv = $subSettingsAdvanced._jsv\n\t\t? $extend(global._jsv || {}, { // create global _jsv, for accessing views, etc\n\t\t\t\tviews: viewStore,\n\t\t\t\tbindings: bindingStore\n\t\t\t})\n\t\t: undefined; // In IE8 cannot do delete global._jsv\n\t$viewsLinkAttr = $subSettingsAdvanced.linkAttr;\n\tlinkViewsSel = bindElsSel + \",[\" + $viewsLinkAttr + \"]\";\n\twrapMap = $subSettingsAdvanced._wm;\n\twrapMap.optgroup = wrapMap.option;\n\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\twrapMap.th = wrapMap.td;\n};\n\n$viewsSettings.advanced({\n\tlinkAttr: \"data-link\",\n\tuseViews: false,\n\tnoValidate: false,\n\t// wrapMap provide appropriate wrappers for inserting innerHTML, used in insertBefore\n\t// We have to close these tags to support XHTML (#13200)\n\t// TODO investigate whether more recent jQuery implementation using wrapMap in domManip/$().html() etc. is better optimized now...\n\t_wm: {\n\t\toption: [1, \"\"],\n\t\tlegend: [1, \"
\", \"
\"],\n\t\tarea: [1, \"\", \"\"],\n\t\tparam: [1, \"\", \"\"],\n\t\tthead: [1, \"
\", \"
\"],\n\t\ttr: [2, \"\", \"
\"],\n\t\ttd: [3, \"\", \"
\"],\n\t\tcol: [2, \"\", \"
\"],\n\t\tsvg_ns: [1, \"\", \"\"],\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\tdiv: $.support.htmlSerialize ? [0, \"\", \"\"] : [1, \"X
\", \"
\"]\n\t},\n\t_fe: {\n\t\tinput: {\n\t\t\tfrom: inputAttrib, to: \"value\"\n\t\t},\n\t\ttextarea: valueBinding,\n\t\tselect: valueBinding,\n\t\toptgroup: {\n\t\t\tto: \"label\"\n\t\t}\n\t}\n});\n\n\treturn $;\n}, window));\n"]} \ No newline at end of file +{"version":3,"sources":["jquery.views.js"],"names":["factory","global","$","jQuery","exports","module","define","amd","jsr","jso","elemChangeHandler","ev","params","sourceValue","setter","cancel","fromAttr","linkCtx","cvtBack","cnvtName","target","$source","view","binding","oldLinkCtx","onBeforeChange","onAfterChange","tag","to","eventArgs","exprOb","contextCb","source","bindings","_jsvBnd","rSplitBindings","exec","bindingStore","hlp","onBeforeChangeStr","onAfterChangeStr","defaultAttr","fnSetters","undefined","$isFunction","attr","data","getRsc","elem","nodeName","_jsvSel","multiple","call","change","oldValue","_val","value","_jsv","_ctxCb","_cpCtx","sb","_","chging","$observable","setProperty","propertyChangeHandler","linkFn","noUpdate","forceUpdate","hasError","onError","this","cvt","convert","parentElem","parentNode","onEvent","prop","path","_toLk","_er","e","onRenderError","Function","props","args","$sub","getTargetVal","onUpdate","mergeCtxs","NONE","callAfterLink","observeAndBind","onUnbind","tagCtx","ctx","tagName","_cnvt","_tag","tmpl","TRUE","addLinkMethods","updateContent","_noUpd","currentValue","css","$target","error","expr","test","slice","style","parseInt","type","CHECKBOX","CHECKED","RADIO","setDefer","_df","deferAttr","prevNode","nextNode","promise","nodesToRemove","useProp","tokens","id","openIndex","closeIndex","testElem","cStyle","jsvSel","renders","targetParent","targetVal","unlinked","_elCnt","_prv","_nxt","currentStyle","getComputedStyle","display","_jsvd","displayStyles","document","createElement","body","appendChild","removeChild","$isArray","HTML","inline","nodes","transferViewTokens","_tgId","indexOf","length","disposeTokens","previousSibling","lastChild","remove","link","lazyLink","empty","children","textContent","innerText","selected","inArray","arrayChangeHandler","self","action","index","items","srt","refresh","addViews","removeViews","oldIndex","fixIndex","setArrayChangeLink","handler","arrayBinding","bound","bnd","useKey","bndArr","off","arrayChangeStr","arrVws","apply","arguments","on","linkGetVal","toLowerCase","$subSettingsAdvanced","_fe","contentEditable","from","renderAndLink","views","context","html","linkToNode","prevView","bindId","elCnt","bnds","removeViewBinding","nextSibling","render","addBindingMarkers","end","bindingKey","viewStore","l","k","linkedElem","exprFnDeps","propDeps","cvtBk","convertBack","depends","_bndId","_hdl","_depends","_apply","fn","deps","boundProps","paths","skp","concat","$extend","_jsvLkEl","bindTo","flow","setAttribute","jsvAttrStr","getAttribute","tmplLink","noIteration","parentView","$link","tmplOrLinkExpr","jquery","activeBody","elementChangeStr","i","vwInfos","placeholderParent","targetEl","topLevelCall","onRender","replaceMode","$view","topView","root","addDataBinding","markup","cleanData","lnk","viewInfos","rOpenViewMarkers","parent","key","viewLink","outerData","validateOnly","convertMarkers","all","preceding","selfClose","closeTag","spaceBefore","boundId","spaceAfter","tag1","tag2","closeTag2","spaceAfterClose","selfClose2","endOpenTag","errorMsg","bndId","endOfElCnt","inTag","isVoid","parentTag","tagStack","shift","validate","voidElems","join","syntaxError","prevElCnt","elContent","defer","ids","openScript","closeScript","deferStack","charAt","unshift","badParent","processViewInfos","deferPath","deferChar","bindChar","onAftCr","deep","addedBindEls","_tkns","len","vwInfo","ch","j","open","push","onArrayChange","removeSubStr","onAfterCreateStr","onAfterCreate","bindEls","getViewInfos","level","named","tagDepth","tags","dataLink","wrap","selector","linkViewsSel","get","elems","qsa","querySelectorAll","innerHTML","prevNodes","found","markerNodeInfo","contains","isLink","rViewMarkers","skip","processInfos","$viewsLinkAttr","rOpenTagMarkers","unmarkPrevOrNextNode","resolve","prevIds","linkInfo","token","nextView","node","depth","fragment","copiedNode","firstTag","wrapper","div","htmlTag","thisId","Deferred","name","noValidate","markPrevOrNextNode","namespaceURI","rFirstElem","replace","rConvertMarkers","safeFragment","wrapMap","createDocumentFragment","firstChild","insertBefore","setTimeout","linkMarkup","currentView","boundTagId","tagExpr","rTagIndex","hasElse","lastIndex","linkExpressions","bindDataLinkTarget","normalizeLinkTag","rTagDatalink","delimCloseChar1","delimOpenChar0","delimOpenChar1","delimCloseChar0","isLk","links","tmplFn","noArray","View","extendCtx","_gccb","str","substr","SCRIPT","nodeType","isVal","rBinding","getInfos","close","elPath","infos","rMarkerTokens","removeAttribute","marker","twoway","trim","rEscapeQuotes","displayElem","linkedEl","val","linkedTag","linkedElement","contents","first","onBind","onAfterLink","targetTag","cvtArgs","setSize","height","width","title","hasClass","removeClass","addClass","asyncElemChangeHandler","bindElChange","$elem","trig","onoff","bindto","pathIndex","lastPath","bindtoOb","$linkedElem","newTrig","oldTrig","_jsvTr","trigger","$subSettings","_jsvto","split","_cp","newCtxs","newTagCtx","tagCtxs","_ths","clean","elemArray","linkedElemTag","objId","object","obsId","map","cbId","propertyChangeStr","unmap","onDispose","s","$unlink","each","innerView","getElementsByTagName","inputAttrib","viewOrTagChar","viewOrTag","viewId","precedingLength","emptyView","vwItem","rOpenMarkers","tagOrView","isTag","select","filtered","filter","add","find","withMarkers","prevIsFirstNode","lastSibling","childTags","disposed","update","domChange","hasListener","hasData","_data","events","domChangeNotification","triggerHandler","dataItems","viewsCount","itemsCount","keepNodes","isMove","removeView","viewToRemove","current","isArray","splice","sort","fromIndex","keepParentDataCtx","observeProps","tgt","insert","observeMappedProps","item","src","removeProperty","shallowArrayFilter","allPath","setGlobals","jsrender","requiresStr","sub","_jq","$observe","$views","linkChar","$viewsSettings","settings","extend","isFunction","$converters","expando","converters","$tags","advanced","propChng","arrChng","syntaxErr","_err","oldAdvSet","bindElsSel","input","text","valueBinding","isCleanCall","oldCleanData","oldJsvDelimiters","delimiters","querySelector","ol","ul","table","tbody","thead","tfoot","tr","colgroup","dl","optgroup","svg","svg_ns","br","img","hr","area","base","col","meta","command","embed","keygen","param","track","wbr","rViewPath","observable","observe","onStore","template","ret","delimChars","RegExp","rTag","addSetting","merge","regularExpression","toggle","init","content","_hi","rTmpl","activeElem","contextOb","_sel","_evs","_hlr","contentCtx","dataBoundOnly","radiogroup","Math","random","domChngCntnr","forOrIfTagCtx","parentTags","checked","arrayView","targetLength","noVws","done","arrHandler","arrBinding","arrayBindings","_ars","tagCt","newTagCtxs","tci","prevArg","different","baseTag","dataMap","getTgt","obsSrc","obsTgt","tgtFlt","inner","getInnerView","nd","isVl","unlink","oldFn","result","0","getCtx","paramVal","linked","_ceo","cloneExprObjects","obs","ob","clones","prm","helper","last","nextPath","advSet","linkAttr","_wm","option","caption","th","td","useViews","legend","support","htmlSerialize","textarea","window"],"mappings":";CAeC,SAASA,EAASC,GAElB,GAAIC,GAAID,EAAOE,MAEQ,iBAAZC,SACVC,OAAOD,QAAUF,EACdF,EAAQC,EAAQC,GAChB,SAASA,GACV,MAAOF,GAAQC,EAAQC,IAEG,kBAAXI,SAAyBA,OAAOC,IACjDD,QAAQ,SAAU,aAAc,uBAAwB,SAASJ,EAAGM,EAAKC,GACxE,MAAOT,GAAQC,EAAQC,EAAGM,EAAKC,KAGhCT,EAAQC,GAAQ,IAKlB,SAASA,EAAQC,EAAGM,EAAKC,GACzB,YAsHA,SAASC,GAAkBC,EAAIC,EAAQC,GAOtC,IANA,GAAIC,GAAQC,EAAQC,EAAUC,EAASC,EAASC,EAAUC,EAAQC,EAASC,EAAMC,EAChFC,EAAYC,EAAgBC,EAAeC,EAAKC,EAAIC,EAAWC,EAAQC,EACvEC,EAASrB,EAAGS,OACZa,EAAWD,EAAOE,QAGZX,EAAUY,GAAeC,KAAKH,IACpC,IAAIV,EAAUc,GAAad,EAAQ,OAC9BK,EAAKL,EAAQK,IAAI,CA2CpB,GAzCAX,EAAUM,EAAQN,QAClBK,EAAOL,EAAQK,KACfK,EAAMV,EAAQU,KAAOL,EAAKK,IAC1BN,EAAUnB,EAAE8B,GACZP,EAAiBH,EAAKgB,IAAIC,IAC1Bb,EAAgBJ,EAAKgB,IAAIE,IACzBxB,EAAWyB,EAAYT,GACvBlB,EAAS4B,GAAU1B,GACC2B,SAAhB9B,IACHA,EAAc+B,GAAY5B,GACvBA,EAASgB,GACTlB,EACCO,EAAQP,KACRO,EAAQwB,KAAK7B,IAElBG,EAAWS,EAAG,GACdA,EAAKA,EAAG,GACRA,EAAKA,EAAK,KAAOA,GAAMX,EAAQ6B,KAAMlB,GAAMA,EACvCT,IAEFD,EADG0B,GAAYzB,GACLA,EAEAG,EAAKyB,OAAO,aAAc5B,IAGR,WAA1BF,EAAQ+B,KAAKC,WAChBhC,EAAQ+B,KAAKE,QAAUrC,EAAcA,IAAgBI,EAAQ+B,KAAKG,YAAgBtC,IAG/EK,IACHL,EAAcK,EAAQkC,KAAKzB,EAAKd,IAIjCW,EAAaF,EAAKL,QAClBK,EAAKL,QAAUA,EACfY,GACCwB,OAAQ,SACRC,SAAUrC,EAAQsC,KAClBC,MAAO3C,KAEFY,IAAoBV,EAASU,EAAe2B,KAAKnC,EAASN,EAAIkB,MAAe,IAC/EF,GAAQA,EAAIF,iBAAoBV,EAASY,EAAIF,eAAed,EAAIkB,MAAe,IACjEc,SAAhB9B,KACDO,EAASQ,EAAG,GACQe,SAAhB9B,GAA6BO,GAAQ,CACxC,GAAIA,EAAOqC,KAQV,IAPA1B,EAAYd,EAAQyC,OACpB5B,EAASV,EACTA,EAASH,EAAQ6B,KACbhB,EAAO6B,SACVvC,EAASU,EAAOgB,KAChBf,EAAYD,EAAO6B,QAEb7B,GAAUA,EAAO8B,IACvBxC,EAASW,EAAUD,EAAQV,GAC3BU,EAASA,EAAO8B,EAGdjC,KACHA,EAAIkC,EAAEC,QAAS,GAEhBC,EAAY3C,GAAQ4C,YAAYpC,EAAG,GAAIf,GACnCa,GACHA,EAAc0B,KAAKnC,EAASN,EAAIkB,GAE7BF,IACCA,EAAID,eACPC,EAAID,cAAcf,EAAIkB,GAEvBF,EAAIkC,EAAEC,OAASnB,QAEhB1B,EAAQsC,KAAO1C,EAGjBS,EAAKL,QAAUO,GAMnB,QAASyC,GAAsBtD,EAAIkB,EAAWqC,GAC7C,GAAIrB,GAAMhC,EAAasD,EAAUC,EAAaC,EAAUC,EACvDrD,EAAUsD,KACV5C,EAAMV,EAAQU,IACdK,EAASf,EAAQ6B,KACjB1B,EAASH,EAAQ+B,KACjBwB,EAAMvD,EAAQwD,QACdC,EAAatD,EAAOuD,WACpBrD,EAAOL,EAAQK,KACfE,EAAaF,EAAKL,QAClB2D,EAAUtD,EAAKgB,IAAIC,GAKpB,IAFAjB,EAAKL,QAAUA,EAEXyD,KAAgBE,IAAa/C,GAAa+C,EAAQxB,KAAKnC,EAASN,EAAIkB,MAAe,MAEhFA,GAA8B,MAAjBlB,EAAGmC,KAAK+B,MAAgBlE,EAAGmC,KAAK+B,OAAShD,EAAUiD,MAAO,CAK7E,GAHIjD,IACHZ,EAAQY,UAAYA,GAEjBA,GAAaZ,EAAQ8D,MAAO,CAI/B,GADA9D,EAAQ8D,MAAQ,EACZb,EAAOc,IAEV,IACCnE,EAAcqD,EAAOlC,EAAQV,GAC5B,MAAO2D,GACRZ,EAAWH,EAAOc,IAClBV,EAAUY,GAAcD,EAAE3D,EAAK,GAAK6D,UAAS,YAAa,UAAYd,EAAW,KAAMrC,EAAQV,IAC/FT,IAAgBuE,SAAWC,MAAOf,SAGnCzD,GAAcqD,EAAOlC,EAAQV,EAAMgE,GAQpC,IAJAzC,EAAO0C,EAAa1E,EAAaI,EAASU,EAAMV,EAAQU,IACtDV,EAAQ4B,MAAQJ,EAAYrB,GAAQ,EAAcuB,SAAR6B,IAGxC7C,EAAK,CASR,GAPAyC,EAAcC,GAAY1C,EAAIqD,IAE9BnE,EAAcA,EAAY,GAAKA,GAAeA,GAC9CsD,GAAYC,GAAevC,GAAaF,EAAI6D,UAAY7D,EAAI6D,SAAS7E,EAAIkB,EAAWhB,MAAiB,EAErG4E,EAAU9D,EAAKd,EAAauD,GAExBD,GAAYtB,IAAS6C,GAOxB,MAHAC,GAAchE,EAAKhB,EAAIkB,GACvB+D,EAAe3E,EAASe,EAAQZ,QAChCE,EAAKL,QAAUO,EAGhB,IAAIG,EAAIkC,EAAEC,OACT,MAGGnC,GAAIkE,UACPlE,EAAIkE,SAASlE,EAAImE,OAAQ7E,EAASU,EAAIoE,IAAKpF,EAAIkB,GAGhDhB,EAA8B,MAAhBc,EAAIqE,QACfV,GAAKW,MAAMtE,EAAI6C,IAAKlD,EAAMT,EAAY,IACtCyE,GAAKY,KAAKvE,EAAKL,EAAMA,EAAK6E,KAAMtF,GAAa,EAAMyD,OAC5CJ,GAAOgC,OAIjB1B,EAAc,KAARA,EAAa4B,GAAO5B,EAC1B3D,EAAc2D,EACXc,GAAKW,MAAMzB,EAAKlD,EAAMT,EAAY,IAAMA,GACxCyE,GAAKY,KAAKhC,EAAOgC,KAAM5E,EAAMA,EAAK6E,KAAMtF,GAAa,EAAMyD,GAE9D+B,EAAe1E,EAAMV,EAAQU,KAAK,GAClCkB,EAAO5B,EAAQ4B,MAAQA,EAGpByD,GAAczF,EAAaI,EAAS4B,EAAMlB,IACzCE,IACC+C,EAAUtD,EAAKgB,IAAIE,MACxBoC,EAAQxB,KAAKnC,EAASN,EAAIkB,GAE3BZ,EAAQsF,OAAS,EAEb5E,IACHA,EAAIqD,IAAMX,EACVsB,EAAchE,EAAKhB,EAAIkB,IAIzB+D,EAAe3E,EAASe,EAAQZ,GAGhCE,EAAKL,QAAUO,GAIjB,QAAS+D,GAAa1E,EAAaI,EAASU,EAAKkB,GAChD,GAAI2D,GAAc1F,EAAQ2F,EAAKC,EAC9BtF,EAASO,GAAOA,EAAI+C,YAAczD,EAAQ+B,IAE3C,IAAoBL,SAAhB9B,EAA2B,CAO9B,GANA6F,EAAUxG,EAAEkB,GACZyB,EAAOlB,GAAOA,EAAIkB,MAAQA,EACtBD,GAAY/B,IACf8F,GAAM1F,EAAQ2F,KAAO,oBAGlBH,EAAM,QAAQI,KAAKhE,IAASA,EAAKiE,MAAM,GAC1CN,EAAetG,EAAE6G,MAAM3F,EAAQqF,IAC1B5F,IAAgBA,IAEpB2F,EAAeQ,SAASR,QAEnB,IAAa,SAAT3D,EAAiB,CAC3B,GAAa,UAATA,EACCzB,EAAO6F,OAASC,KACnBV,EAAeE,EAAQ7B,KAAKhC,EAAOsE,SAE9B,IAAItE,IAASuE,GAAO,CAC1B,GAAIhG,EAAOoC,QAAW,GAAK3C,EAG1B,MAAOgC,EAFP2D,GAAeE,EAAQ7B,KAAKsC,IAMTxE,SAAjB6D,IACH1F,EAAS4B,GAAUG,GACnB2D,EAAe1F,EAAS4F,EAAQ5F,KAAY4F,EAAQ7D,KAAKA,IAG3D5B,EAAQsC,KAAOiD,EAEhB,MAAO3D,GAGR,QAASwE,GAASrE,EAAMQ,GACvBR,EAAKsE,IAAM9D,EACXR,GAAMQ,EAAQ,MAAQ,UAAY,aAAa+D,GAAW,IAG3D,QAASjB,GAAczF,EAAaI,EAAS4B,EAAMlB,GAIlD,GAAIb,GAAQ0G,EAAUC,EAAUC,EAASC,EAAeC,EAASC,EAAQC,EAAIC,EAAWC,EAAYC,EAAUhF,EAAUiF,EAAQC,EAC/HC,EAAUvF,IAAS6C,IAAwB/C,SAAhB9B,IAA8BI,EAAQsF,OACjEvE,EAASf,EAAQ6B,KACjB1B,EAASO,GAAOA,EAAI+C,YAAczD,EAAQ+B,KAC1CqF,EAAejH,EAAOuD,WACtB+B,EAAUxG,EAAEkB,GACZE,EAAOL,EAAQK,KACfgH,EAAYrH,EAAQsC,KACpB/B,EAAaF,EAAKL,QAGlBoC,EAAS1B,CASV,IAPIA,IAEHA,EAAIkC,EAAE0E,UAAW,EACjB5G,EAAI+C,WAAa/C,EAAI+C,YAAezD,EAAQ2F,MAAQjF,EAAI6G,OAAUpH,EAASiH,EAC3Eb,EAAW7F,EAAI8G,KACfhB,EAAW9F,EAAI+G,MAEXN,EAmJL,MA/Ia,YAATvF,IACHA,EAAO,eAEJ,QAAQgE,KAAKhE,IACK,YAAjB5B,EAAQ4B,OAEXqF,GAAU9G,EAAOuH,cAAgBC,GAAiBxF,KAAKnD,EAAQmB,EAAQ,KAAKyH,QAExEhI,GAGHA,EAAcO,EAAO0H,OAEjBZ,EACArH,IAAgB6E,KAAU7E,EAAckI,GAAc9F,EAAW7B,EAAO6B,aAG3EgF,EAAWe,GAASC,cAAchG,GAClC+F,GAASE,KAAKC,YAAYlB,GAG1BpH,EAEGkI,GAAc9F,IACbgF,EAASU,cAAgBC,GAAiBxF,KAAKnD,EAAQgI,EAAU,KAAKY,QAC1EG,GAASE,KAAKE,YAAYnB,MAK3B7G,EAAO0H,MAAQZ,EACfrH,EAAc6E,MAGZrC,EAASA,GAAUiF,IAAczH,IACpCX,EAAE6G,MAAM3F,EAAQyB,EAAKiE,MAAM,GAAIjG,IAEb,SAATgC,IACN,SAASgE,KAAKhE,IACjB3C,EAAE4C,KAAK1B,EAAQyB,EAAKiE,MAAM,GAAIjG,GAG3BgC,IAASsE,IACZS,GAAU,EACV/G,EAAcA,GAA+B,UAAhBA,GAInBgC,IAASuE,IAOnBQ,GAAU,EACV/E,EAAOsE,GACPtG,EAAcO,EAAOoC,QAAW,GAAK3C,GAGlB,aAATgC,GAAgC,aAATA,GAAgC,aAATA,GAAgC,aAATA,EAC/EhC,EAAeA,GAA+B,UAAhBA,EAA2BgC,EAAO,KAG7C,UAATA,GAAwC,WAApBzB,EAAO6B,WACrC7B,EAAO8B,QAAUmG,EAASxI,GACvBA,EACA,GAAKA,IAGLC,EAAS4B,GAAUG,IAClBA,IAASyG,IAEZhI,EAAKL,QAAUA,EACXU,GAAOA,EAAIkC,EAAE0F,QAChB5B,EAAgBhG,EAAI6H,OAAM,GACtB7H,EAAI6G,SACHhB,GAAYA,IAAaC,EAE5BgC,EAAmBjC,EAAUC,EAAUrG,EAAQO,EAAI+H,MAAO,KAAK,IACrD7B,EAASzG,EAAOkG,OAE1BQ,EAAKnG,EAAI+H,MAAQ,IACjB3B,EAAYF,EAAO8B,QAAQ,IAAM7B,GAAM,EACvCE,EAAaH,EAAO8B,QAAQ,IAAM7B,GAE9BC,GAAaC,EAAa,IAC7BD,GAAaD,EAAG8B,OACZ5B,EAAaD,IAChBV,EAASjG,EAAQyG,EAAOf,MAAM,EAAGiB,GAAaF,EAAOf,MAAMkB,IAC3D6B,EAAchC,EAAOf,MAAMiB,EAAWC,OAIzCR,EAAWA,EACRA,EAASsC,gBACTrC,EACCA,EAASqC,gBACT1I,EAAO2I,WAGZ7J,EAAEyH,GAAeqC,SAGjBtC,EAAUpG,EAAK2I,KAAK3I,EAAKwB,KAAM1B,EAAQoG,EAAUC,EAAU5G,EAAac,IAAQA,IAAKA,EAAI+H,MAAOQ,SAAUvI,EAAImE,OAAOV,MAAM8E,aAG3H9B,EAAUA,GAAWE,IAAczH,EAC/BuH,GACH1B,EAAQyD,QAEL/B,IACHV,EAAUpG,EAAK2I,KAAKjI,EAAQZ,EAAQoG,EAAUC,EAAU5G,EAAac,IAAQA,IAAKA,EAAI+H,UAIxFpI,EAAKL,QAAUO,KAEX6B,EAASA,GAAUiF,IAAczH,KACvB,SAATgC,GAAmBzB,EAAOgJ,WAAahJ,EAAOgJ,SAAS,GAE/BzH,SAAvBvB,EAAOiJ,YACVjJ,EAAOiJ,YAAcxJ,EAErBO,EAAOkJ,UAA4B,OAAhBzJ,EAAuB,GAAKA,EAGhD6F,EAAQ5F,GAAQD,MAGbsH,EAASE,EAAanF,UAEb,UAATL,GAAqB6D,EAAQ7D,KAAK,WAEtCzB,EAAOmJ,SAAWrK,EAAEsK,QAAQ,GAAK3J,EAAawI,EAASlB,GAAUA,GAAUA,UAGnE9E,EAASA,GAAUiF,IAAczH,IAE3C6F,EAAQkB,EAAU,OAAS,QAAQ/E,EAAsBF,SAAhB9B,GAA8B+G,EAAiB/G,EAAP,MAElFI,EAAQsC,KAAO1C,GAET6G,GAAWrE,EAGnB,QAASoH,GAAmB9J,EAAIkB,GAC/B,GAAI6I,GAAOnG,KACV9C,EAAiBiJ,EAAKpI,IAAIC,IAC1Bb,EAAgBgJ,EAAKpI,IAAIE,GAC1B,KAAKf,GAAkBA,EAAe2B,KAAKmB,KAAM5D,EAAIkB,MAAe,EAAO,CAC1E,GAAIA,EAAW,CAEd,GAAI8I,GAAS9I,EAAUwB,OACtBuH,EAAQ/I,EAAU+I,MAClBC,EAAQhJ,EAAUgJ,KAEnB,QADAH,EAAK7G,EAAEiH,IAAMjJ,EAAUkJ,QACfJ,GACP,IAAK,SACJD,EAAKM,SAASJ,EAAOC,EACrB,MACD,KAAK,SACJH,EAAKO,YAAYL,EAAOC,EAAMjB,OAC9B,MACD,KAAK,OACJc,EAAKO,YAAYpJ,EAAUqJ,SAAUL,EAAMjB,OAAQjH,QAAW,GAC9D+H,EAAKM,SAASJ,EAAOC,EACrB,MACD,KAAK,UACJH,EAAK7G,EAAEiH,IAAMnI,OACb+H,EAAKS,SAAS,IAIbzJ,GACHA,EAAc0B,KAAKmB,KAAM5D,EAAIkB,IAShC,QAASuJ,GAAmB9J,GAE3B,GAAI+J,GAASC,EACZrE,EAAO3F,EAAK2F,KACZnE,EAAOxB,EAAKwB,KACZyI,EAAQjK,EAAKuC,EAAE2H,KAEXlK,EAAKuC,EAAE4H,QAAUF,KAGjBD,EAAehK,EAAKuC,EAAE6H,UAEzBxL,GAAGoL,EAAa,KAAKK,IAAIC,GAAgBN,EAAa,IACtDhK,EAAKuC,EAAE6H,OAAS/I,QAEb4I,MAAYA,EAEXtE,EACHsE,EAAM1H,EAAEgI,OAAOvK,EAAKuC,EAAEiE,IAAMxG,QAErBiK,GAAM1H,EAAEgI,OAAOvK,EAAKuC,EAAEiE,IAEpBb,GAAQnE,IAElBuI,EAAU,SAAS1K,GACZA,EAAGmC,MAAQnC,EAAGmC,KAAK6I,KAKxBlB,EAAmBqB,MAAMxK,EAAMyK,YAGjC7L,GAAG4C,IAAOkJ,GAAGJ,GAAgBP,GAC7B/J,EAAKuC,EAAE6H,QAAUL,EAASvI,KAK7B,QAASL,GAAYO,EAAMpB,EAAIqK,GAG9B,GAAIhJ,GAAWD,EAAKC,SAASiJ,cAC5BrJ,EACCsJ,GAAqBC,IAAInJ,IACtBD,EAAKqJ,kBAAoBjG,KAASxE,GAAI0H,GAAMgD,KAAMhD,GACvD,OAAOzG,GACHjB,EACe,UAAbqB,GAAwBD,EAAKiE,OAASG,GACvCA,GACAvE,EAAKjB,GACNiB,EAAKyJ,KACN1K,EACCqK,EAAa,OAAS3C,GACtB,GAOL,QAASiD,GAAcjL,EAAMsJ,EAAOzE,EAAMqG,EAAO1J,EAAM2J,EAAS1B,GAC/D,GAAI2B,GAAMC,EAAYC,EAAUjF,EAAekF,EAC9ClI,EAAarD,EAAKoD,WAClB8C,EAAWlG,EAAKmH,KAChBhB,EAAWnG,EAAKoH,KAChBoE,EAAQxL,EAAKkH,MAOd,IALIhB,GAAYA,EAAS7C,aAAeA,GACvCgC,GAAM,sBAIHoE,EAAS,CACZpD,EAAgBrG,EAAKkI,QACjBsD,GAAStF,GAAYA,IAAaC,GAErCgC,EAAmBjC,EAAUC,EAAU9C,EAAYrD,EAAKuC,EAAEiE,GAAI,KAAK,GAGpExG,EAAK2J,YAAYtI,OAAWA,QAAW,GACvCgK,EAAalF,EAETqF,IACHtF,EAAWA,EACRA,EAASsC,gBACTrC,EACCA,EAASqC,gBACTnF,EAAWoF,WAIhB7J,EAAEyH,GAAeqC,QAEjB,KAAK6C,IAAUvL,GAAKuC,EAAEkJ,KAGrBC,EAAkBH,OAEb,CAEN,GAAIjC,EAAO,CAGV,GADAgC,EAAWJ,EAAM5B,EAAQ,IACpBgC,EACJ,OAAO,CAERpF,GAAWoF,EAASlE,KAEjBoE,GACHH,EAAanF,EACbA,EAAWmF,EACRA,EAAW7C,gBACXnF,EAAWoF,WAId4C,EAAanF,EAASyF,YAGxBP,EAAOvG,EAAK+G,OAAOpK,EAAM2J,EAASnL,EAAKuC,EAAE4H,QAAUV,EAASzJ,EAAMyJ,GAAWH,GAAO,GAIpFtJ,EAAK2I,KAAKnH,EAAM6B,EAAY6C,EAAUmF,EAAYD,EAAME,GAQzD,QAASO,GAAkB3J,EAAOlC,EAAMK,GAMvC,GAAImG,GAAIsF,CAmBR,OAlBIzL,IAEHyL,EAAM,KACN/G,EAAe1E,GAAK,GACpBmG,EAAKnG,EAAI+H,MACJ5B,IACJzF,GAAayF,EAAKuF,MAAgB1L,EAGlCA,EAAI+H,MAAQ,GAAK5B,KAKlBsF,EAAM,KACN/G,EAAeiH,GAAUxF,EAAKxG,EAAKuC,EAAEiE,IAAMxG,IAGrC,IAAMwG,EAAKsF,GACLzK,QAATa,EAAqBA,EAAQ,IAE9B,IAAMsE,EAAKsF,EAWf,QAASxH,GAAe3E,EAASe,EAAQZ,GACxC,GAAIG,GAASgM,EAAGC,EAAGC,EAAYC,EAAY5L,EAAQ+C,EAAM8I,EACxDhM,EAAMV,EAAQU,IACdiM,EAAQ3M,EAAQ4M,YAChBC,KACAjB,EAAS5L,EAAQ8M,QAAU,GAAKV,KAChChC,EAAUpK,EAAQ+M,IAWnB,IATA/M,EAAQ8M,OAASpL,OAEbhB,IAGHmM,EAAUnM,EAAImM,SAAWA,EACzBA,EAAUlL,GAAYkL,GAAWnM,EAAImM,QAAQnM,GAAOmM,EACpDL,EAAa9L,EAAI8L,aAEbxM,EAAQgN,UAAa,GAAKhN,EAAQgN,UAAa,GAAKH,EAAU,CAUlE,GARI7M,EAAQgN,UAEXlK,EAAYmK,QAAO,GAAQlM,GAASf,EAAQgN,SAAU5C,GAAS,GAGhEqC,EAAazM,EAAQkN,GAAGC,KAAKtH,QAGzBnF,GAAOA,EAAI0M,WAGd,IADAd,EAAI5L,EAAI0M,WAAWzE,OACZ2D,KAGN,IAFA1I,EAAOlD,EAAI0M,WAAWd,GACtBC,EAAI7L,EAAIkC,EAAE2H,IAAI8C,MAAM1E,OACb4D,KACNG,EAAWhM,EAAIkC,EAAE2H,IAAI8C,MAAMd,GAAG3I,GAC1B8I,GAAYA,EAASY,MACxBb,EAAaA,EAAWc,OAAOb,GAOnC,KADAJ,EAAIG,EAAW9D,OACR2D,KACNzL,EAAS4L,EAAWH,GAChBzL,EAAO2B,OAGViK,EAAWH,GAAKkB,MAAY3M,GA2B9B,IAvBAP,EAAUwC,EAAYmK,QACrB,GACClM,GACD0L,EACAI,EACAzC,EACApK,EAAQyC,QAGTnC,EAAQyB,KAAO5B,EACfG,EAAQN,QAAUA,EAClBM,EAAQmI,MAAQmD,EAGhBzL,EAAOc,QAAUd,EAAOc,SAAW,GACnCd,EAAOc,SAAW,IAAM2K,EACxB5L,EAAQgN,SAAWH,EAEnB7M,EAAQK,KAAKuC,EAAEkJ,KAAKF,GAAUA,EAE9BxK,GAAawK,GAAUtL,EAGnBkM,EAEH,IADAF,EAAIE,EAAW7D,OACR2D,KACNE,EAAWF,GAAGmB,SAAW/M,EACzBgN,EAAOpN,EAASI,EAAK8L,EAAWF,IAChCE,EAAWF,GAAGrL,QAAU,IAAMX,EAAQmI,MAAQ,QAG3B/G,UAAViL,GACVe,EAAOpN,EAASI,EAAKP,EAAQwM,EAG1BjM,KACEA,EAAIiN,MAASjN,EAAIkC,EAAE0F,SACvBnI,EAAOyN,aAAaC,IAAa1N,EAAO2N,aAAaD,KAAa,IAAM,IAAMjC,EAAS,KAAOA,EAAS,KACvGlL,EAAI+H,MAAQ,GAAKmD,KAUrB,QAASmC,GAASpN,EAAI0K,EAAMG,EAASwC,EAAaC,EAAY1H,EAAUC,GACvE,MAAO0H,GAAM5K,KAAM3C,EAAI0K,EAAMG,EAASwC,EAAaC,EAAY1H,EAAUC,GAG1E,QAAS0H,GAAMC,EAAgBxN,EAAI0K,EAAMG,EAASwC,EAAaC,EAAY1H,EAAUC,GAUpF,GARIgF,KAAY,GACfwC,EAAcxC,EACdA,EAAU9J,QAEV8J,EAD6B,gBAAZA,GACP9J,OAEA8L,MAAYhC,GAEnB2C,GAAkBxN,EAAI,CACzBA,EAAKA,EAAGyN,OAASzN,EAAK1B,EAAE0B,GAEnB0N,KACJA,GAAatG,GAASE,KACtBhJ,EAAEoP,IACAtD,GAAGuD,GAAkB7O,GACrBsL,GAAG,OAAQ,oBAAqBtL,GAQnC,KALA,GAAI8O,GAAGhC,EAAGd,EAAM+C,EAASnO,EAAMoO,EAAmBC,EAAU5E,EAAS6E,EACpEC,EAAW1C,EACX2C,EAAcrD,GAA8B,YAAnBA,EAAQrL,OACjCmM,EAAI3L,EAAGgI,OAED2D,KAAK,CAQX,GAPAoC,EAAW/N,EAAG2L,GAEd2B,EAAaA,GAAca,GAAMJ,IAE7BC,EAAeV,IAAec,KACjCA,EAAQlN,MAAQkN,EAAQjK,IAAM0G,OAAewD,KAAO3D,GAEjD,GAAK8C,IAAmBA,EAE3Bc,EAAed,EAAgBO,EAAUT,EAAYvM,QAAW,EAAM2J,EAAMG,OACtE,CACN,GAA8B9J,SAA1ByM,EAAee,OAEdL,IACHJ,EAAoBC,EAAShL,YAG9B+H,EAAO0C,EAAelC,OAAOZ,EAAMG,EAASwC,EAAaC,EAAYvM,OAAWkN,GAI5EH,GAEHlI,EAAWmI,EAAS7F,gBACpBrC,EAAWkI,EAAS1C,YACpB/M,EAAEkQ,WAAWT,IAAW,GACxBD,EAAkBtG,YAAYuG,GAE9BA,EAAWD,IAEXlI,EAAWC,EAAW9E,OACtBzC,EAAEyP,GAAUxF,aAEP,CAAA,GAAIiF,KAAmB,GAAQF,IAAec,EAIpD,KAFAjF,IAAWsF,IAAK,GAUjB,GAAIV,EAASrI,MAAQG,EAAU,CAM9B,IAFAgI,EAAUa,EAAUX,EAASrI,KAAK,EAAMiJ,IAEnCf,EAAI,EAAGhC,EAAIiC,EAAQ7F,OAAQ4F,EAAIhC,EAAGgC,IACtClO,EAAOmO,EAAQD,IACVlO,EAAOgM,GAAUhM,EAAKwG,MAAsBnF,SAAdrB,EAAKwB,MAGvCxB,EAAKkP,OAAOvF,YAAY3J,EAAKuC,EAAE4M,IAAK9N,QAAW,EAGjD0E,GAASsI,GAIVT,EAAWjF,KAAKqC,EAAMqD,EAAUnI,EAAUC,EAAUiF,EAAM3B,EAAS0B,GAGhEmD,IACHI,EAAQlN,KAAOkN,EAAQjK,IAAMpD,SAIhC,MAAOf,GAOR,QAAS8O,GAASC,EAAWhM,EAAY6C,EAAUC,EAAUiF,EAAM3B,EAAS0B,EAASmE,GAYpF,QAASC,GAAeC,EAAKC,EAAWC,EAAWC,EAAUC,EAAapJ,EAAIqJ,EAASC,EAAYC,EAAMC,EAAMC,EAAWC,EAAiBC,EAAYC,GAQtJ,GAAIC,GAAUC,EACbC,EAAa,EACd,OAAIH,IACHI,EAAQ,EACDhB,IAERnP,EAAM0P,GAAQC,GAAQ,GACtBL,EAAWA,GAAYM,EACvBP,EAAYA,GAAaS,EACrBM,IAAWf,KAAgBF,GAAOG,GAAYtP,GAAOmG,IAAOgK,KAC/DC,EAASpP,OACTqP,EAAYC,GAASC,SAEtBjB,EAAWA,GAAYD,EACnBC,IACHa,EAAQ,EACRC,EAASpP,OAOLwP,IACCnB,GAAaS,EACXW,GAAUJ,IAAe,eAAenL,KAAK,IAAMoL,GAASI,KAAK,KAAO,OAG5EV,EAAW,KAAOK,EAAY,QAErBI,GAAUnB,GACpBU,EAAW,MAAQV,EACRgB,GAASrI,QAAUqH,IAAae,IAC3CL,EAAW,gBAAkBV,GAE1BU,GACHW,GAAYX,EAAW,WAAajF,IAGtC6F,GAAYzF,GACZkF,EAAYC,GAASC,QACrBpF,GAAQ0F,GAAUR,GAClBT,EAAYA,EAAa,KAAOA,EAAY,IAAO,GAC/CgB,KAEHE,IAASC,GACTA,GAAM,GACD5F,GAIJ2F,IAAS,KAHTZ,EAAaN,EAAYoB,GAAa,IAAMF,GAAQG,IAAepB,GAAmB,IACtFiB,GAAQI,GAAWX,WAMlBpF,IAKChF,EAEH4K,IAAO5K,EAEPiJ,EAAaQ,GAAaE,GAAc,GAErC9P,IAYHoP,GAAapP,EACT+Q,KACH3B,GAAa,IAAMjC,GAAa,KAAO4D,GAAM,IAC7CA,GAAM,MAQR3B,EAAYjJ,EACRiJ,EAAYc,EAAaX,GAAeY,EAAQ,GAAKa,GAAa7K,EAAK8K,IAAcxB,EAAazP,EACnGkQ,GAAcf,EAGdqB,GAAYhB,IACXW,GAGHQ,GAAY,2BAA6BR,EAAQ,2BAE7B,MAAjBhK,EAAGgL,OAAO,GACbb,GAASc,QAAQjL,EAAGhB,MAAM,IAChBgB,EAAGhB,MAAM,MAAQ8K,EAAQK,GAASC,UAE5CI,GAAY,mDAAqDV,EAAQ,MAGvEjQ,IACHmQ,EAAQnQ,EAERsQ,GAASc,QAAQf,GACjBA,EAAYrQ,EAAImF,MAAM,GAClBqL,GAAYF,GAAS,IAAMA,GAAS,KAAOe,GAAUhB,IAGxDrL,GAAM,kCAEPoL,EAASK,GAAUJ,IACdlF,GAAQ0F,GAAUR,MAAgBO,KACtCM,GAAWE,QAAQN,IACnBA,GAAQ,IAETF,GAAYzF,GAMR2F,IAAS3F,KACZ2F,IAAS,MAGJ1B,GAGR,QAASkC,GAAiBxD,EAASpH,GAIlC,GAAI6K,GAAWC,EAAWC,EAAU1O,EAAYoD,EAAIuL,EAASC,EAC5DC,IAMD,IAAI9D,EAAS,CAWZ,IAVgC,MAA5BA,EAAQ+D,MAAMV,OAAO,KAKxBzK,EAAerF,EAAK8G,gBACpB9G,EAAK2B,WAAWyE,YAAYpG,GAC5BA,EAAOL,QAER8Q,EAAMhE,EAAQ7F,OACP6J,KAAO,CAIb,GAHAC,EAASjE,EAAQgE,GAEjBL,EAAWM,EAAOC,GACdT,EAAYQ,EAAO5O,KAGtB,IADA8O,EAAIV,EAAUtJ,OAAS,EAChBuJ,EAAYD,EAAUJ,OAAOc,MAEjB,MAAdT,EACyB,MAAxBD,EAAUJ,OAAOc,IACpBA,IACAvL,EAAeA,EAAayB,iBAE5BzB,EAAeA,EAAa1D,WAG7B0D,EAAeA,EAAa0B,SAMd,OAAbqJ,GACCzR,EAAMU,GAAayF,EAAK4L,EAAO5L,OAGlCwL,EAAOjL,KAAkBrF,GAAQA,EAAK2B,aAAe0D,GAEhDrF,IAAQsQ,IACZ3R,EAAI+C,WAAa2D,GAEdqL,EAAO5G,OAASwG,GAGnBjM,EAASgB,GAAeqL,EAAOG,KAAO,IAAM,KAAO/L,EAAKsL,GAAY/K,EAAaf,KAAO,KAGzFiM,EAAaO,MAAMR,EAAO,KAAOtQ,EAAM0Q,MAE9BpS,EAAOgM,GAAUxF,EAAK4L,EAAO5L,OAElCxG,EAAKoD,aAETpD,EAAKoD,WAAa2D,GAAgBrF,GAAQA,EAAK2B,YAAcA,EAC7DrD,EAAKuC,EAAEgM,SAAW1C,EAClB7L,EAAKuC,EAAEkQ,cAAgBtJ,EACvBW,EAAmB9J,IAEpBoD,EAAapD,EAAKoD,WACdgP,EAAOG,MAGVvS,EAAKkH,OAASkL,EAAO5G,MACjBzE,IAAiBrF,EACpBqE,EAASgB,EAAc,IAAMP,EAAKsL,GAAY/K,EAAaf,KAAO,MAG7DhG,EAAKmH,MACTpB,EAAS3C,EAAYsP,EAAatP,EAAW4C,IAAK,IAAMQ,EAAKsL,IAE9D9R,EAAKmH,KAAOzF,MAITqF,GAAkBrF,GAAQA,EAAK2B,aAAe0D,EAIvCrF,IAEL1B,EAAKoH,MACTrB,EAAS3C,EAAYsP,EAAatP,EAAW4C,IAAK,IAAMQ,EAAKsL,IAE9D9R,EAAKoH,KAAO1F,IAPZqE,EAASgB,EAAc,IAAMP,EAAKsL,GAAY/K,EAAaf,KAAO,KAClEhG,EAAKoH,KAAO/F,SAQT0Q,EAAU/R,EAAKyE,KAAOzE,EAAKyE,IAAIkO,KAAqBC,KACvDb,EAAQjQ,KAAK9B,EAAKyE,IAAIpE,IAAKL,KAO/B,IADAmS,EAAMF,EAAa3J,OACZ6J,KAENU,GAAQL,KAAKP,EAAaE,IAG5B,OAAQhE,GAAWA,EAAQ3C,MAG5B,QAASsH,GAAa3E,GAGrB,GAAI4E,GAAOrC,EAAWsC,CAEtB,IAAI7E,EAEH,IADAgE,EAAMhE,EAAQ7F,OACTgK,EAAI,EAAGA,EAAIH,EAAKG,IAMpB,GALAF,EAASjE,EAAQmE,GAGjB5B,EAAYrQ,EAAMU,GAAaqR,EAAO5L,IAAI7G,QAAQU,IAClD2S,EAAQ3S,EAAIqE,UAAYA,GACnBrE,EAAIiN,MAAQ0F,EAAO,CACvB,IAAKhB,EAAM,CAEV,IADAe,EAAQ,EACDrC,EAAYA,EAAUxB,QAC5B6D,GAEDE,GAAWA,GAAYF,GAEnBf,GAAQe,IAAUE,GAAevO,IAAWsO,GAEhDE,EAAKV,KAAKnS,IAOf,QAAS8S,KAER,GAAIb,GAAGhJ,EACN/C,EAAS,GACT6M,KACAC,EAAWC,IAAgBC,GAAM,KAAOtN,GAAY,IAAM,GAe3D,KAZAuN,EAAQC,GAAMpQ,EAAWqQ,iBAAiBL,GAAYzU,EAAEyU,EAAUhQ,GAAYkQ,MAC9EtH,EAAIuH,EAAMlL,OAINpC,GAAYA,EAASyN,YAExBC,EAAYH,GAAMvN,EAASwN,iBAAiBL,GAAYzU,EAAEyU,EAAUnN,GAAUqN,MAC9ErN,EAAW0N,EAAUtL,OAASsL,EAAUA,EAAUtL,OAAS,GAAKpC,GAGjE+M,EAAW,EACN/E,EAAI,EAAGA,EAAIjC,EAAGiC,IAElB,GADAxM,EAAO8R,EAAMtF,GACThI,IAAa2N,GAEhBA,GAASnS,IAASwE,MACZ,CAAA,GAAIC,GAAYzE,IAASyE,EAAU,CAErCoN,KACHhN,GAAUuN,EAAepS,GAE1B,OACM,GAAIA,EAAK2B,WAEf,GAAIkQ,GAAK,CAER,GADAhN,GAAUuN,EAAepS,GACrBA,EAAKsE,IAAK,CAEb,IADAsM,EAAIpE,EAAI,EACDoE,EAAIrG,GAAKvK,EAAKqS,SAASP,EAAMlB,KACnCA,GAGDc,GAAKd,EAAE,GAAK5Q,EAAKsE,IAEdoN,EAAKlF,KACR3H,GAAU6M,EAAKlF,IAAM,QAGlB8F,MAAW5B,EAASpD,EAAUtN,EAAML,OAAW4S,OAAmB7B,EAASA,EAAO,MAErF8B,GAAOA,GAAQ9B,EAAO5L,KAAO0N,IAAQA,GAAQ9B,EAAOG,MAAQH,EAAO5L,KAE/D0N,IAAQC,GAAanF,EAAUtN,KAG/BA,EAAK+L,aAAa2G,KACtBvB,GAAQL,MAAM9Q,IA6BlB,GAvBI6R,KACHhN,GAAUlD,EAAW2C,KAAO,IACxBsD,EAAQ/C,EAAO8B,QAAQ,IAAMkL,GAAI/M,IAAM,KAE1CD,EAASA,EAAOf,MAAM8D,EAAQiK,GAAI/M,GAAG8B,SAEtCgB,EAAQ/C,EAAO8B,QAAQ,IAAMkL,GAAI/M,IAC7B8C,EAAQ,IAEX/C,EAASA,EAAOf,MAAM,EAAG8D,IAG1BwJ,EAAa9D,EAAUzI,EAAQlF,OAAWgT,MAG9BhT,SAAT+J,GAAsB/H,EAAWoK,aAAa2G,KACjDvB,GAAQL,MAAMnP,IAIfiR,EAAqBpO,EAAUsF,IAC/B8I,EAAqBnO,EAAUqF,IAE3B+H,GAIH,YAHI3K,IACHA,GAAS2L,UA4BX,KAvBI/I,IAAS2F,GAAQC,KAEpB1P,EAAOyE,EACHgL,KACChL,EACHwL,EAAiB3C,EAAUmC,GAAQ,KAAK,GAAOhL,GAE/CwL,EAAiB3C,EAAUmC,IAAO,GAAO9N,IAG3CsO,EAAiB3C,EAAUoC,IAAK,GAAO/N,GAEnC8C,IACHI,EAASJ,EAASsH,aAAaD,KAC3BvB,EAAI1F,EAAO8B,QAAQmM,IAAW,KACjCjO,EAASA,EAAOf,MAAMyG,EAAIuI,GAAQlM,OAAS,IAE5CnC,EAASoH,aAAaC,GAAY4D,GAAM7K,KAK1C0F,EAAI4G,GAAQvK,OACP4F,EAAI,EAAGA,EAAIjC,EAAGiC,IAClBxM,EAAOmR,GAAQ3E,GACfuG,EAAW/S,EAAK,GAChBA,EAAOA,EAAK,GACR+S,GACCpU,EAAMU,GAAa0T,EAASjO,QAC3B7G,EAAUU,EAAIV,WAEjBU,EAAMV,EAAQU,IACdA,EAAIV,QAAUA,GAEX8U,EAASlC,MAER7Q,IACHrB,EAAI+C,WAAa1B,EAAK2B,WACtBhD,EAAI8G,KAAOzF,GAEZrB,EAAI6G,OAASuN,EAASjJ,MAEtBxL,EAAOK,EAAImE,OAAOxE,KAClB4O,EAAevN,OAAWhB,EAAI8G,KAAMnH,EAAMyU,EAASjO,MAEnDnG,EAAI+G,KAAO1F,EACPrB,EAAIkC,EAAE0E,WAGTzC,EAASnE,EAAImE,OACbxE,EAAOwE,EAAOxE,KACdqE,EAAchE,MAMjBuO,EAAelN,EAAK+L,aAAa2G,IAAiB1S,EAAM+M,GAAM/M,GAAOL,OAAW2S,GAAQ3E,EAAWlE,EAGjGvC,KACHA,GAAS2L,UAKX,GAAI/D,GAAO7Q,EAASU,EAAK6N,EAAGjC,EAAGqG,EAAGH,EAAKqB,EAAO9R,EAAM1B,EAAMoS,EAAQqC,EAAUb,EAAWc,EAAOpJ,EAAUqJ,EACvGC,EAAM1B,EAAMlB,EAAMtN,EAASF,EAAQqM,EAAUoC,EAAU4B,EAAOC,EAAUC,EAAYC,EAAUtE,EAC9FD,EAAQwE,EAASC,GAAK3O,GAAQiF,GAAOyF,GAAWkE,GAAS/D,GAAKoD,GAASX,GAAOK,GAAMtL,GAAUoL,GAAQT,GACtGnK,GAAOnG,KACPmS,GAAShM,GAAK7G,EAAEiE,GAAK,IACrB2K,GAAQ,GAER0B,MACAlC,MACAY,MACAqB,GAAgBxJ,GAAKpI,IAAI2R,IACzBwB,GAAexC,CAuChB,IArCIlI,IACHb,GAAWa,EAAQb,UAAYhK,EAAEyW,WAC7B5L,EAAQ5E,KAEXyG,EAAW,IAAM7B,EAAQlH,EAAEiE,GAAK,KAEhCwN,GAASvK,EAAQsF,IACbtF,EAAQpJ,MACX+U,GAAS3L,EAAQpJ,IAAM,IACvBoJ,GAAU,IAEP8J,GAAM9J,EAAQ8J,OACjBY,GAAerB,EACfI,EAAOK,GAAIL,KACXlB,EAAOuB,GAAIvB,KACXtN,EAAU6O,GAAI+B,OAGhB7L,EAAUA,KAAY,GAGvBpG,EAAaA,EACT,GAAKA,IAAeA,EACpBzE,EAAEyE,GAAY,GACdA,EAAW0K,OACV1K,EAAW,GACXA,EACD+F,GAAKhG,YACJsE,GAASE,KAEdiJ,GAAYhG,GAAqB0K,YAAclS,EAAW0H,kBAAoBjG,GAC9E4L,EAAYrN,EAAWqB,QAAQkG,cAC/BY,KAAU0F,GAAUR,GAEpBxK,EAAWA,GAAYsP,EAAmBtP,EAAUsF,IACpDrF,EAAWA,GAAYqP,EAAmBrP,EAAUqF,KAAU,KAElDnK,QAAR+J,EAAmB,CAUtB,GAJA8J,GAAMxN,GAASC,cAAc,OAC7BsN,EAAUC,GACVV,GAAUpD,GAAM,GAChB+D,GAAsC,+BAA5B9R,EAAWoS,aAAgD,UAAYT,EAAWU,GAAW5U,KAAKsK,KAAU4J,EAAS,IAAM,GACjIxJ,GAAO,CAGV,IADAoJ,EAAOzO,EACAyO,KAAUD,EAAW3F,EAAU4F,KACrCA,EAAOA,EAAKjJ,aAETpF,GAASoO,EAAWA,EAASzC,MAAQ7O,EAAW2C,OACnD0O,EAAQpJ,GAAY,IAChB7B,GAAY6B,IACfoJ,GAAS,IAAMU,IAEhB9C,EAAI/L,GAAO8B,QAAQqM,GACfpC,EAAI,IACPA,GAAKoC,EAAMpM,OAEXkM,GAAUpD,GAAM7K,GAAOf,MAAM,EAAG8M,GAChC/L,GAASA,GAAOf,MAAM8M,GAClBqC,EACHC,EAAKrH,aAAaC,GAAYjH,IAE9BR,EAAS1C,EAAYkD,MAgBzB,GARAkK,EAASpP,OACT+J,GAAQ,GAAKA,GAAMuK,QAAQC,GAAiBrG,GAIxCsB,GAAYF,GAASrI,QACxB0I,GAAY,gBAAkBN,EAAY,cAAgBtF,GAEvDkE,EACH,MAWD,KARAuG,GAAahO,YAAYqN,IAKzBC,GAAUW,GAAQX,KAAYW,GAAQZ,IACtCL,EAAQM,GAAQ,GAChBF,EAAQtB,UAAYwB,GAAQ,GAAK/J,EAAO+J,GAAQ,GACzCN,KACNI,EAAUA,EAAQxM,SAInB,KAFAoN,GAAa/N,YAAYoN,IACzBJ,EAAWpN,GAASqO,yBACbhB,EAAaE,EAAQe,YAC3BlB,EAASjN,YAAYkN,EAGtB1R,GAAW4S,aAAanB,EAAU3O,GASnC,MANIyC,IACHsN,WAAW/C,EAAU,GAErBA,IAGMvK,IAAYA,GAASxC,UAG7B,QAASwI,GAAeuH,EAAYvB,EAAMwB,EAAaC,EAAYrC,EAAQxS,EAAM2J,GAEhF,GAAItG,GAAM0B,EAAQhF,EAAMgL,EAAa+J,EAAS1T,EAAQjD,EAASU,EAAKkW,EAAWC,EAASC,EACvFC,IAED,IAAIL,EAGHhW,EAAMU,GAAasV,GACnBhW,EAAMA,EAAIV,QAAUU,EAAIV,QAAQU,IAAMA,EAEtCV,EAAUU,EAAIV,UACbgG,KAAM,SACNnE,KAAM4U,EAAY5U,KAClBE,KAAMrB,EAAI6G,OAAS7G,EAAI+C,WAAawR,EACpC5U,KAAMoW,EACN3R,IAAK2R,EAAY3R,IACjBlD,KAAMyG,GACN6E,GAAIxM,EAAIkC,EAAE2H,IACV7J,IAAKA,EAELoM,OAAQ4J,GAETM,EAAmBhX,EAASA,EAAQkN,QAC9B,IAAIsJ,GAAcvB,EAAM,CAiB9B,IAdApT,EAAOwS,EAASxS,EAAO4U,EAAY5U,KAOnCqD,EAAOuR,EAAYvR,KAKnBsR,EAAaS,EAAiBT,EAAYhV,EAAYyT,IACtD6B,EAAYI,GAAaJ,UAAY,EAC9BlQ,EAASsQ,GAAa/V,KAAKqV,IACjCO,EAAgBlE,KAAKjM,GACrBkQ,EAAYI,GAAaJ,SAK1B,KAHIA,EAAYN,EAAW7N,QAC1B0I,GAAYmF,GAEN5P,EAASmQ,EAAgB9F,SAAS,CAOxC,IAHA2F,EAAYM,GAAaJ,UACzBlV,EAAOgF,EAAO,GACd+P,EAAU/P,EAAO,GACVmQ,EAAgB,IAAgC,SAA1BA,EAAgB,GAAG,IAC/CJ,GAAWQ,EAAkBC,EAAiBL,EAAgB9F,QAAQ,GACtE4F,GAAU,CAEPA,KACHF,GAAWQ,EAAkBC,EAAiBC,EAAiB,IAAMzQ,EAAO,GAAK0Q,GAElFtX,GACCgG,KAAMqO,EAAS,MAAQ,OACvBxS,KAAMA,EACNE,KAAMkT,EACN5U,KAAMoW,EACN3R,IAAK0G,EACL5J,KAAMA,EACN2V,KAAMlD,EACNvQ,MAAQ,EACRwB,OAASsB,EAAO,IAGjBgG,EAAclL,OACVkF,EAAO,KACVgG,EAAchG,EAAO,KAAOlF,OAC5B1B,EAAQwD,QAAUoD,EAAO,IAAM,IAC1BhF,GAAwBF,SAAhBkL,GAA6BpL,EAAYyT,KAErDjV,EAAQ4M,YAAcA,EAAcA,EAAY/G,MAAM,KAOxD7F,EAAQ2F,KAAO/D,EAAO+U,EACtB1T,EAASiC,EAAKsS,MAAMb,GACf1T,IACJiC,EAAKsS,MAAMb,GAAW1T,EAASoB,GAAKoT,OAAOd,EAASzR,GAAM,EAAM0H,EAAaiK,IAE9E7W,EAAQkN,GAAKjK,EACb+T,EAAmBhX,EAASiD,GAG5BiU,GAAaJ,UAAYF,IAM5B,QAASI,GAAmBhX,EAASiD,GAEpC,QAASmH,GAAQ1K,EAAIkB,GACpBoC,EAAsBb,KAAKnC,EAASN,EAAIkB,EAAWqC,GAGpDmH,EAAQsN,SAAU,EACd1X,EAAQuX,MAIXnS,EAAepF,EAAQK,KAAO,GAAIgE,IAAKsT,KACtCtT,GAAKuT,UAAU5X,EAAQ8E,IAAK9E,EAAQK,KAAKyE,KACzC,OAAQ9E,EAAQK,KAAML,EAAQ6B,KAAM7B,EAAQ2F,MAAMjE,QAAWwK,IAE/DlM,EAAQyC,OAAS4B,GAAKwT,MAAM7X,EAAQK,MACpCL,EAAQ+M,KAAO3C,EAEfA,GAAQ,GAOT,QAAS2I,GAAa+E,EAAKC,GAC1B,GAAIxL,EACJ,OAAOuL,IACHvL,EAAIuL,EAAIpP,QAAQqP,GACjBxL,EAAI,EACFuL,EAAIjS,MAAM,EAAG0G,GAAKuL,EAAIjS,MAAM0G,EAAIwL,EAAOpP,QACvCmP,GACF,GAGJ,QAAS3D,GAAec,GACvB,MAAOA,KACL,GAAKA,IAASA,EACZA,EACAA,EAAKlQ,UAAYiT,GAChB/C,EAAKjP,KAAKH,MAAM,GACE,IAAlBoP,EAAKgD,UAAkBhD,EAAKnH,aAAaD,KAAe,IAG9D,QAASwB,GAAU4F,EAAMiD,EAAOC,GAE/B,QAASC,GAASvI,EAAK+C,EAAMyF,EAAOxR,EAAI6L,EAAI4F,GAC3CC,EAAM1F,MACLhH,MAAOA,EACPhF,GAAIA,EACJ6L,GAAIA,EACJE,KAAMA,EACNyF,MAAOA,EACPxU,KAAMyU,EACNvD,MAAOlF,IAGT,GAAIhE,GAAOjF,EACV2R,IACD,IAAI3R,EAASsR,EAAQjD,EAAOd,EAAec,GAM1C,MALApJ,GAAQ0M,EAAM1M,MAAQoJ,EAAKlQ,UAAYiT,GACvCnM,EAA6B,MAArBjF,EAAOiL,OAAO,IAAchG,EACpC0M,EAAMhG,MAAQ3L,EAEdA,EAAOoP,QAAQmC,GAAYK,GAAeJ,GACnCG,EAIT,QAAS5D,GAAqBM,EAAMpJ,GAC/BoJ,IACe,QAAdA,EAAKjP,KACRiP,EAAKvR,WAAWyE,YAAY8M,GAClBpJ,GAA+C,KAAtCoJ,EAAKnH,aAAa2G,KACrCQ,EAAKwD,gBAAgBhE,KAKxB,QAASoB,GAAmBZ,EAAMpJ,GAEjC,IADA,GAAI6M,GAASzD,EACNpJ,GAAS6M,GAA8B,IAApBA,EAAOT,UAChCS,EAASA,EAAO7P,eAcjB,OAZI6P,KACqB,IAApBA,EAAOT,UAEVS,EAAS3Q,GAASC,cAAcgQ,IAChCU,EAAO1S,KAAO,MACdiP,EAAKvR,WAAW4S,aAAaoC,EAAQzD,IAC1Bd,EAAeuE,IAAYA,EAAO5K,aAAa2G,KAG1DiE,EAAO9K,aAAa6G,GAAgB,KAG/BiE,EAGR,QAASzB,GAAiBT,EAAYmC,GAErC,MADAnC,GAAavX,EAAE2Z,KAAKpC,GAAYR,QAAQ6C,GAAe,QAChDrC,EAAW3Q,YAAcyR,EAG7Bd,EAAaa,EAAiB,IAAMb,GAAcmC,EAAS,IAAM,IAAMrB,EACvEd,EAOJ,QAAS9R,GAAchE,EAAKhB,EAAIkB,GAC/B,GAAI4L,GAAYsM,EAAaC,EAAUC,EAAK1M,EAAG2M,EAC9CpU,EAASnE,EAAImE,OAEbV,GADOU,EAAOxE,KACNwE,EAAOV,OACfnE,EAAUU,EAAIV,OAmBf,IAjBIU,EAAIkC,EAAE0E,WACiB5F,SAAtBhB,EAAIwY,gBAEPxY,EAAI8L,WAAa9L,EAAIkC,EAAE0F,OAAS5H,EAAIyY,UAAS,EAAMzY,EAAIwY,eAAiB,KAAKE,QAAUna,EAAEe,EAAQ+B,OAE9FrB,EAAI2Y,QACP3Y,EAAI2Y,OAAOxU,EAAQ7E,EAASU,EAAIoE,IAAKpF,EAAIkB,IAIvCF,EAAI4Y,aACP5Y,EAAI4Y,YAAYzU,EAAQ7E,EAASU,EAAIoE,IAAKpF,EAAIkB,GAG/C4L,EAAa9L,EAAI6Y,UAAY7Y,EAAI6Y,UAAU/M,WAAa9L,EAAI8L,WAC5DsM,EAAcpY,EAAIoY,aAAetM,EAE7BA,GAAcA,EAAW,GAAI,CAEhC,GADAwM,EAAMtY,EAAI8Y,UAAU,GACR9X,SAARsX,IAAsBtY,EAAIkC,EAAEC,OAE/B,IADAyJ,EAAIE,EAAW7D,OACR2D,KACNyM,EAAWvM,EAAWF,GAClB5L,EAAIkC,EAAE0E,UAAYyR,IAAa/Y,EAAQ+B,OAC1CkX,EAAYF,EAAStL,SACjB/M,EAAIkC,EAAE0F,UAAY2Q,GAAaA,IAAcvY,GAAOuY,EAAUM,YAAc7Y,KAG/EqY,EAAStL,SAAW/M,EACpBgN,EAAOtM,GAAaV,EAAI+H,OAAQ/H,EAAKqY,GACrCA,EAAS9X,QAAU,IAAMP,EAAI+H,MAAQ,MAI3B/G,SAARsX,IACoBtX,SAAnBqX,EAASxW,MACRwW,EAAS/S,OAASC,GACrB8S,EAAS7S,IAAW8S,GAAe,UAARA,EACjBD,EAAS/S,OAASG,GAC5B4S,EAAS7S,IAAY6S,EAASxW,QAAUyW,EAExC/Z,EAAE8Z,GAAUC,IAAIA,GAEPD,EAAS3N,kBAAoBjG,KACvC4T,EAAS/E,UAAYgF,GAEtBhZ,EAAQsC,KAAO0W,GAEZ7U,EAAMwR,OACToD,EAASpD,KAAOoD,EAASpD,MAAQxR,EAAMwR,KAItCjV,GAAI+Y,UACHtV,EAAMuV,QACTZ,EAAYY,OAAOvV,EAAMuV,QAEtBvV,EAAMwV,OACTb,EAAYa,MAAMxV,EAAMwV,QAGNjY,SAAhByC,EAAMyV,OACTd,EAAYlX,KAAK,QAASuC,EAAMyV,OAE7BzV,EAAM,WAELvD,GAAakY,EAAYe,SAASjZ,EAAUyB,WAC/CyW,EAAYgB,YAAYlZ,EAAUyB,UAEnCyW,EAAYiB,SAAS5V,EAAM,WAExBA,EAAM0C,KACT2F,EAAW,GAAG3F,GAAK1C,EAAM0C,IAG3BnG,EAAIkC,EAAE0E,SAAW5F,OAGlB,QAASsY,GAAuBta,GAC/B6W,WAAW,WACV9W,EAAkBC,IAChB,GAGJ,QAASua,GAAaC,EAAOC,EAAMC,GAC9BD,IACHA,EAAO,GAAKA,IAASA,EAAOA,EAAO,UACnCD,EAAME,GAAOD,EAAe,YAATA,EAAqBH,EAAyBva,IAInE,QAASiO,GAAOpN,EAASI,EAAK8L,EAAYG,GAMzC,GAAI0N,GAAQC,EAAWzW,EAAM0W,EAAUC,EAAUC,EAAaC,EAASC,EAASha,EAAI2L,EACnFtM,EAAUM,EAAQN,QAClBc,EAAYd,EAAQyC,OACpB1B,EAASf,EAAQ6B,KACjBwL,EAAQrN,EAAQkN,GAAGG,MAAM,EAI1B,IAFA3M,EAAMA,GAAO8L,EAAWiB,SAEpBnN,GAAW+M,IAAU/M,EAAQK,GAAI,CAqBpC,GApBAga,EAAUnO,EAAWoO,SAAU,EAC3Bla,IACHiM,EAAQjM,EAAIkM,aAAeD,EAC3B+N,EAAUha,EAAImE,OAAOV,MAAM0W,SAE5BH,EAAsBhZ,SAAZgZ,EAAwBI,GAAaD,QAAUH,EAEzDA,EAAUA,IAAmC,UAAvBlO,EAAWzH,SAAuByH,EAAWxG,OAASC,IAAYuG,EAAWxG,OAASG,IAA6B,aAApBqG,EAAWxG,MAAuBwG,EAAWpB,kBAAoBjG,KAASuV,IAAW,EAEtMC,IAAYD,IACfD,EAAcxb,EAAEuN,GAChByN,EAAaQ,EAAaE,EAAS,OACnCV,EACCQ,EACAjO,EAAWoO,OAASF,EACpB,OAIFrN,GAASgN,EAAShN,EAAM0N,SAAW1N,EAAM,GACrCiN,EAAYjN,GAASA,EAAM1E,OAAQ,CAEtC,GADA4R,EAAWlN,EAAMiN,EAAY,GACzBC,EAAS/X,KAAM,CAElB,IADAgY,EAAWD,EACJA,EAAS5X,IAAM4X,EAAS5X,GAAGH,MACjCqB,EAAO0W,EAAWA,EAAS5X,EAE5BkB,GAAO0W,EAAS5X,IAAMkB,GAAQA,EAAKA,KACnC0W,EAAW1W,EAAOA,EAAKgC,MAAM,GAAK2U,EAAS3W,KAE5C,GAAIA,EACHlD,GACE6Z,EACAD,OAEI,CACN,MAAQ5Z,EAAKG,EAAU+C,EAAO0W,EAASS,MAAM,KAAK5J,KAAK,KAAMrQ,MAAauL,EAAI3L,EAAGgI,SAAS,CAGzF,GAAIhI,EAAG,GAAGsa,KAKT,GAJAta,EAAKA,EAAG,GACRG,EAAYuD,GAAKwT,MAAMlX,EAAG,IAC1B4Z,EAAW5Z,EAAG,GACdA,GAAMA,EAAG,GAAGkB,KAAMlB,EAAG,IACjB4Z,EAAS/X,KAAM,CAIlB,IAHAgY,EAAWD,EACXC,EAAS3Y,KAAOlB,EAAG,GACnB6Z,EAAS9X,OAAS5B,EACXyZ,EAAS5X,IAAM4X,EAAS5X,GAAGH,MACjCqB,EAAO0W,EAAWA,EAAS5X,EAE5BkB,GAAO0W,EAAS5X,IAAMkB,GAAQA,EAAKA,KACnC0W,EAAW1W,EAAOA,EAAKgC,MAAM,GAAK2U,EAAS3W,KAC3ClD,GACC6Z,EACAD,QAIF5Z,GAAK2L,EAAE,GACH3L,EAAG2L,EAAE,GAAI3L,EAAG2L,EAAE,KACd3L,EAAG2L,EAAE,GAEVvL,GAASJ,EAAG,GACZ4Z,EAAW5Z,EAAG,GAEfA,EAAKA,IAAOI,EAAQ8C,QAGrBlD,KAEDL,GAAQK,IACPA,EACAgM,IAKH,QAASnI,GAAU9D,EAAKwa,EAASlF,GAChC,GAAInR,GAAQsW,EACX9a,EAAOK,EAAImE,OAAOxE,KAClB+a,EAAU1a,EAAI0a,UAAY1a,EAAImE,QAC9ByH,EAAI8O,EAAQzS,OACZmB,GAAWoR,CAIZ,IAFAA,EAAUA,GAAWxa,EAAIkC,EAAE2H,IAAIpI,KAAK9B,EAAK6E,MAAOxE,EAAIV,SAAWK,GAAMwB,KAAMxB,EAAMgE,IAE7E2R,EAEHoF,EAAU1a,EAAI0a,QAAUF,EACxBxa,EAAImE,OAASuW,EAAQ,OAErB,MAAO9O,KACNzH,EAASuW,EAAQ9O,GACjB6O,EAAYD,EAAQ5O,GACpBxJ,EAAY+B,EAAOV,OAAOpB,YAAYoY,EAAUhX,OAChDqJ,GAAQ3I,EAAOC,IAAKqW,EAAUrW,KAC9BD,EAAOT,KAAO+W,EAAU/W,KACpB0F,IACHjF,EAAOK,KAAOiW,EAAUjW,KAK3B,OADAb,IAAKgX,KAAK3a,EAAK0a,EAAQ,IAChBA,EAOR,QAASE,GAAMzH,GAMd,IAJA,GAAIvH,GAAGvK,EAAMf,EACZua,KACA/I,EAAMqB,EAAMlL,OACZ4F,EAAIiE,EACEjE,KAGNgN,EAAU1I,KAAKgB,EAAMtF,GAGtB,KADAA,EAAIiE,EACGjE,KAEN,GADAxM,EAAOwZ,EAAUhN,GACbxM,EAAK2B,WAAY,CAEpB,GAAI1C,EAAWe,EAAKd,QAOnB,IAHAD,EAAWA,EAAS6E,MAAM,GAAGmV,MAAM,KACnCjZ,EAAKd,QAAU,GACfqL,EAAItL,EAAS2H,OACN2D,KAENP,EAAkB/K,EAASsL,GAAIvK,EAAK0L,SAAU1L,EAGhD6G,GAAcuL,EAAepS,IAASA,EAAKsE,KAAO,MAKrD,QAAS0F,GAAkBH,EAAQ4P,EAAezZ,GAEjD,GAAI0Z,GAAOzb,EAASU,EAAKgb,EAAQC,EAAOP,EAAS9O,EAAGsP,EAAKnB,EAAajO,EAAYqO,EAASxa,EAC1FC,EAAUc,GAAawK,EAExB,IAAI4P,EACHA,EAAgBA,EAAcjC,WAAaiC,EAC3CzZ,EAAK0L,SAAW/L,WACV,IAAIpB,EAAS,OACZc,IAAawK,EACpB,KAAK6P,IAASnb,GAAQiK,IACrBmR,EAASpb,EAAQiK,IAAIkR,GACrBE,EAAQrb,EAAQub,KACZzT,EAASsT,GACZzc,GAAGyc,IAAShR,IAAIC,GAAiBgR,GAAOjR,IAAIoR,GAAoBH,GAEhE1c,EAAEyc,GAAQhR,IAAIoR,GAAoBH,SAE5Brb,GAAQiK,IAAIkR,EAGpB,IAAIzb,EAAUM,EAAQN,QAAS,CAC9B,GAAIU,EAAMV,EAAQU,IAAK,CACtB,GAAI0a,EAAU1a,EAAI0a,QAEjB,IADA9O,EAAI8O,EAAQzS,OACL2D,MACFsP,EAAMR,EAAQ9O,GAAGsP,MACpBA,EAAIG,OAIPtB,GAAc/Z,EAAI8L,WAEd9L,EAAIkE,UACPlE,EAAIkE,SAASlE,EAAImE,OAAQ7E,EAASU,EAAIoE,KAAK,GAExCpE,EAAIsb,WACPtb,EAAIsb,YAGAtb,EAAI6G,SACJ7G,EAAI8G,MACP9G,EAAI8G,KAAK9D,WAAWyE,YAAYzH,EAAI8G,MAEjC9G,EAAI+G,MACP/G,EAAI+G,KAAK/D,WAAWyE,YAAYzH,EAAI+G,OAIvC+E,EAAaiO,GAAeA,EAAY,IAAMza,EAAQ+B,MAElD8Y,EAAUrO,GAAcA,EAAWoO,UACtCX,EAAaQ,GAAexb,EAAEuN,GAAaqO,EAAS,OACpDrO,EAAWoO,OAASlZ,QAErBrB,EAAOL,EAAQK,KACG,SAAdA,EAAK2F,KACR3F,EAAKkP,OAAOvF,YAAY3J,EAAKuC,EAAE4M,IAAK9N,QAAW,SAExCrB,GAAKuC,EAAEkJ,KAAKF,SAGdtL,GAAQ2b,EAAE3b,EAAQub,OAI3B,QAASK,GAAQvb,GACZA,GACHA,EAAKA,EAAGyN,OAASzN,EAAK1B,EAAE0B,GACxBA,EAAGwb,KAAK,WAIP,IAHA,GAAIC,IAGIA,EAAYtN,GAAMxL,MAAM,KAAU8Y,EAAU7M,QACnD6M,EAAU7M,OAAOvF,YAAYoS,EAAUxZ,EAAE4M,IAAK9N,QAAW,EAE1D4Z,GAAMhY,KAAK+Y,qBAAqB,QAEjCf,EAAM3a,KAGF0N,KACHpP,EAAEoP,IACA3D,IAAI4D,GAAkB7O,GACtBiL,IAAI,OAAQ,oBAAqBjL,GACnC4O,GAAa3M,QAEdqN,EAAQ/E,cACRsR,EAAMvT,GAASE,KAAKoU,qBAAqB,OAQ3C,QAASC,GAAYva,GACpB,MAAOA,GAAKiE,OAASC,GAAWlE,EAAKmE,IAAWnE,EAAKQ,MA4CtD,QAASiG,GAAmBjC,EAAUC,EAAU/C,EAAYoD,EAAI0V,EAAezS,GAE9E,GAAIyE,GAAGjC,EAAGkC,EAASiE,EAAQ+J,EAAWC,EAAQ7V,EAC7C8V,EAAkB,EAClBC,EAAYpW,IAAaC,CAE1B,IAAID,EAAU,CAGb,IADAiI,EAAUa,EAAU9I,OACfgI,EAAI,EAAGjC,EAAIkC,EAAQ7F,OAAQ4F,EAAIjC,EAAGiC,IAAK,CAI3C,GAFAkE,EAASjE,EAAQD,GACjBkO,EAAShK,EAAO5L,GACZ4V,IAAW5V,GAAM4L,EAAOC,KAAO6J,EAAe,CACjD,IAAIzS,EAKH,KAHAwC,GAAI,EAMDqQ,IACJH,EAA0B,MAAd/J,EAAOC,GAChBrG,GAAUoQ,GACVrb,GAAaqb,GAAQzc,QAAQU,IAC5B+R,EAAOG,KAEV4J,EAAUhV,KAAOhB,EACPiM,EAAO4F,QAEjBmE,EAAU/U,KAAOjB,IAGnBkW,GAAmBD,EAAO9T,OAAS,EAGhC+T,GACHnW,EAASqH,aAAaC,GAAYtH,EAASuH,aAAaD,IAAYhI,MAAM6W,IAE3E9V,EAASJ,EAAWA,EAASsH,aAAaD,IAAcpK,EAAW4C,KAC/DiG,EAAI1F,EAAO8B,QAAQ,IAAM7B,EAAK0V,GAAiB,KAClD3V,EAAS4H,EAAQ+D,MAAM1M,MAAM,EAAG6W,GAAmB9V,EAAOf,MAAMyG,GAAKxC,KAAejD,EAAG8B,OAAS,KAE7F/B,IACCJ,EAKHA,EAASoH,aAAaC,GAAYjH,GAElCR,EAAS3C,EAAYmD,QAKvBR,GAAS3C,EAAYsP,EAAatP,EAAW4C,IAAK,IAAMQ,EAAK0V,IACxDzS,GAAYtD,GAEhBJ,EAAS3C,EAAYsP,EAAatP,EAAW4C,IAAK,IAAMQ,EAAK0V,IAKhE,QAAS3T,GAAchC,GACtB,GAAI2H,GAAGjC,EAAGsQ,EAAQpO,CAClB,IAAIA,EAAUa,EAAUzI,GAAQ,EAAMiW,IACrC,IAAKtO,EAAI,EAAGjC,EAAIkC,EAAQ7F,OAAQ4F,EAAIjC,EAAGiC,IACtCqO,EAASpO,EAAQD,GACC,MAAdqO,EAAOlK,IACLkK,EAASvQ,GAAUuQ,EAAO/V,MAAQ+V,EAAO5W,MAG7C4W,EAAOrN,OAAOvF,YAAY4S,EAAOha,EAAE4M,IAAK9N,QAAW,GAGpDqK,EAAkB6Q,EAAO/V,IAS7B,QAASzB,GAAe0X,EAAWC,GAElCD,EAAU3D,SAAW,SAAS9G,EAAM2K,GAE/B3K,MAAWA,IAEd2K,EAAS3K,EACTA,EAAO3Q,OAER,IAAIub,GACH1U,EAAQtJ,EAAEqE,KAAKiF,QAKhB,OAJIA,GAAM,KACT0U,EAAWD,EAASzU,EAAM2U,OAAOF,GAAUzU,EAC3CA,EAAQ8J,GAAQ2K,EAASC,EAASE,IAAI5U,EAAM6U,KAAKJ,IAAWC,GAEtD1U,GAGRuU,EAAUvU,MAAQ,SAAS8U,EAAa9W,EAAUC,GAKjD,GAAIyO,GACHxL,EAAOnG,KACPuI,EAAQpC,EAAKlC,OACb+V,GAAmB/W,GAAYsF,EAC/BtD,IAaD,KAXAhC,EAAWA,GAAYkD,EAAKjC,KAC5BhB,EAAWA,GAAYiD,EAAKhC,KAE5BwN,EAAOqI,EACH/W,IAAakD,EAAKhC,KAClBgC,EAAKhG,WAAW8Z,YAChBhX,EACAkD,EAAK7G,EAAE0F,UAAW,EAClB/B,GAAYkD,EAAKzJ,QAAQ+B,KAAKsU,WAC9B9P,GAAYA,EAASyF,YAElBiJ,KAAUzO,GAAYyO,IAASzO,KACjC6W,GAAexR,GAASoJ,EAAKlQ,UAAYiT,KAI5CzP,EAAMsK,KAAKoC,GAEZA,EAAOA,EAAKjJ,WAEb,OAAOzD,IAGRuU,EAAUU,UAAY,SAASnL,EAAMtN,GAEhCsN,MAAWA,IAEdtN,EAAUsN,EACVA,EAAO3Q,OAGR,IAAI+H,GAAOnG,KACVjD,EAAOoJ,EAAKT,KAAOS,EAAOA,EAAK5E,OAAOxE,KACtCkG,EAAWkD,EAAKjC,KAChBqE,EAAQpC,EAAKlC,OACbgM,IAeD,OAbAlT,GAAK2I,KACJtH,OACA+H,EAAKhG,WACLoI,EAAQtF,GAAYA,EAASsC,gBAAkBtC,EAC/CkD,EAAKhC,KACL/F,QACCkS,KACAL,KAAMA,EACNlB,KAAMA,EACNsD,KAAM5Q,EACN8B,GAAI4C,EAAKT,KAAOS,EAAK7G,EAAEiE,GAAK,IAAM4C,EAAKhB,MAAQ,OAG1C8K,GAGRuJ,EAAUhT,QAAU,SAASlK,GAC5B,GAAI6G,GAAS7E,EACZlB,EAAM4C,KACNtD,EAAUU,EAAIV,QACdK,EAAOK,EAAImE,OAAOxE,IAgBnB,OAdIK,GAAI+c,UAAY/X,GAAM,eACNhE,SAAhB9B,IACHA,EAAcyE,GAAKY,KAAKvE,EAAKL,EAAMA,EAAK6E,KAAMV,EAAU9D,IAAM,IAE3Dd,EAAc,KAAOA,IAEpBc,EAAIkE,UACPlE,EAAIkE,SAASlE,EAAImE,OAAQ7E,EAASU,EAAIoE,KAEvClD,EAAOlB,EAAIkC,EAAE0F,OAASD,GAAQrI,EAAQ4B,MAAQJ,EAAYd,EAAI+C,YAAY,GAC1EgD,EAAUpB,EAAczF,EAAaI,EAAS4B,EAAMlB,IAGrDgE,EAAchE,GACP+F,GAAW/F,GAGnBoc,EAAUY,OAAS,SAASnb,GAC3B,GAAIiK,GAAalJ,KAAKkJ,UAClBA,IACH/M,GACCU,OAAQqM,EAAW,IACjB9K,OAAWa,IAIZwa,EAEHD,EAAUa,UAAY,WACrB,GAAI5b,GAAOuB,KAAKG,WACfma,EAAc3e,EAAE4e,QAAQ9b,IAAS9C,EAAE6e,MAAM/b,GAAMgc,OAC/CC,EAAwB,eAErBJ,IAAeA,EAAYI,IAE9B/e,EAAE8C,GAAMkc,eAAeD,EAAuBlT,aAMhDgS,EAAU/S,SAAW,SAASJ,EAAOuU,GAEpC,GAAOC,GACN1U,EAAOnG,KACP8a,EAAaF,EAAUvV,OACvB4C,EAAQ9B,EAAK8B,OAET9B,EAAK7G,EAAE4H,QAAU4T,IAErBD,EAAa5S,EAAM5C,OAASyV,EAExBD,IAAe1U,EAAK5H,KAAK8G,QACxB2C,EAAc7B,EAAME,EAAOF,EAAKvE,KAAMqG,EAAO2S,EAAWzU,EAAK3E,QAAS,IACrE2E,EAAK7G,EAAEiH,KACXJ,EAAKS,SAASP,EAAQyU,MAM1BtB,EAAU9S,YAAc,SAASL,EAAOyU,EAAYC,EAAWC,GAI9D,QAASC,GAAW5U,GACnB,GAAI9C,GAAI+E,EAAQnI,EAAY8C,EAAUC,EAAUE,EAC/C8X,EAAejT,EAAM5B,EAEtB,IAAI6U,GAAgBA,EAAaxV,KAAM,CAwBtC,GAvBAnC,EAAK2X,EAAa5b,EAAEiE,GACfwX,IAEJ3X,EAAgB8X,EAAajW,SAI9BiW,EAAaxU,YAAYtI,OAAWA,QAAW,GAE/C8c,EAAaxY,KAAOtE,OACpB6E,EAAWiY,EAAahX,KACxBhB,EAAWgY,EAAa/W,KACxBhE,EAAa+a,EAAa/a,WAErB4a,IAEAG,EAAajX,QAGhBiB,EAAmBjC,EAAUC,EAAU/C,EAAYoD,EAAI,KAExD5H,EAAEyH,GAAeqC,WAEbyV,EAAajX,OACjB,IACChB,EAAS7C,WAAWyE,YAAY5B,GAChCC,EAAS9C,WAAWyE,YAAY3B,GAC/B,MAAOxC,IAEVmG,EAAmBqU,EACnB,KAAK5S,IAAU4S,GAAa5b,EAAEkJ,KAC7BC,EAAkBH,SAEZS,IAAUxF,IAInB,GAAI4X,GAASpe,EAAM8d,EAClB1U,EAAOnG,KACPob,GAAWjV,EAAK7G,EAAE4H,OAClBe,EAAQ9B,EAAK8B,KAKd,IAHImT,IACHP,EAAa5S,EAAM5C,QAENjH,SAAViI,EAEH,GAAI+U,EAAS,CAGZ,IADAD,EAAUN,EACHM,KACNF,EAAWE,EAEZhV,GAAK8B,aACC,CAEN,IAAKlL,IAAQkL,GAEZgT,EAAWle,EAEZoJ,GAAK8B,aAcN,IAXmB7J,SAAf0c,IACCM,EAGHN,EAAa,GAGbG,EAAW5U,SACJ4B,GAAM5B,KAGX+U,GAAWN,IACVE,GAAUH,EAAaC,IAAe3U,EAAK5H,KAAK8G,QAAS,CAG7D,IAFA8V,EAAU9U,EAAQyU,EAEXK,KAAY9U,GAClB4U,EAAWE,EAEZlT,GAAMoT,OAAOhV,EAAOyU,GACf3U,EAAK7G,EAAEgc,MACXnV,EAAKS,SAASP,KAMlBmT,EAAUhT,QAAU,WACnB,GAAIL,GAAOnG,KACViM,EAAS9F,EAAK8F,MAEXA,KACHjE,EAAc7B,EAAMA,EAAKE,MAAOF,EAAKvE,KAAMqK,EAAOhE,MAAO9B,EAAK5H,KAAMH,QAAW,GAC/EyI,EAAmBV,KAIrBqT,EAAU5S,SAAW,SAAS2U,GAI7B,IAFA,GAAItT,GAAQjI,KAAKiI,MAChB5B,EAAQ4B,EAAM5C,OACRkW,EAAYlV,KACd4B,EAAM5B,GAAOA,QAAUA,GAC1B7G,EAAYyI,EAAM5B,IAAQ5G,YAAY,QAAS4G,IAMlDmT,EAAU9T,KAAOyG,GAkCnB,QAASqP,GAAkB9F,GAC1B,MAAO1V,MAAKuB,OAAOxE,KAkQpB,QAAS0e,GAAanD,EAAKlc,EAAIkB,GAC9B,GAAyB,QAArBA,EAAUwB,OAAkB,CAG/B,IAFA,GAAIjC,GAASyb,EAAIoD,IAChB1S,EAAInM,EAAOwI,OACL2D,KACFnM,EAAOmM,GAAGkD,MAAQ5O,EAAUiD,OAI7ByI,OACC1L,EAAUiD,OAASjD,EAAUmI,QAChCjG,EAAY3C,GAAQ8e,QAAQzP,IAAK5O,EAAUiD,KAAMD,KAAMhD,EAAU2B,QAExD3B,EAAUmI,OACpBjG,EAAY3C,GAAQ4I,OAAOuD,GAE3BxJ,EAAY3C,EAAOmM,IAAIvJ,YAAY,OAAQnC,EAAU2B,QAKxD,QAAS2c,GAAmBtD,EAAKlc,EAAIkB,GACpC,GAAIue,GACHpe,EAAS6a,EAAIwD,IACbhd,EAASxB,EAAUwB,MAEL,SAAXA,EACoB,SAAnBxB,EAAUiD,KACbf,EAAY/B,GAAQgC,YAAYrD,EAAGS,OAAOqP,IAAK5O,EAAU2B,QAEzDO,EAAY/B,GAAQse,eAAeze,EAAUyB,UAC7CS,EAAY/B,GAAQgC,YAAYnC,EAAU2B,MAAO7C,EAAGS,OAAOyD,OAEvC,WAAXxB,GACV+c,EAAOve,EAAUgJ,MAAM,GACvB9G,EAAY/B,GAAQse,eAAeF,EAAK3P,WACjCzO,GAAOoe,EAAK3P,MACE,WAAXpN,IACV+c,EAAOve,EAAUgJ,MAAM,GACnBuV,EAAK3P,KACR1M,EAAY/B,GAAQgC,YAAYoc,EAAK3P,IAAK2P,EAAKvb,OAKlD,QAAS0b,GAAmBC,GAC3B,MAAOA,GAAQ7W,QAAQ,KAAO,EAtxF/B,GAAI8W,GAAavgB,KAAM,CAEvBM,GAAMA,GAAOigB,GAAcxgB,EAAOygB,SAClCxgB,EAAIA,GAAKD,EAAOE,MAEhB,IACCwgB,GAAc,mBAEf,KAAKzgB,IAAMA,EAAEiO,GAEZ,KAAMwS,GAAc,QAGjBngB,KAAQA,EAAI2N,IACf3N,EAAIgM,MAAMoU,IAAIC,IAAI3gB,EAGnB,IAAI4gB,GAAU/c,EACbsF,EAAWnJ,EAAEyf,QACboB,EAAS7gB,EAAEsM,KAEZ,KAAKuU,IAAWA,EAAOlE,IAEtB,KAAM8D,GAAc,UAGrB,IAoBCtI,GAAgBC,EAAgBC,EAAiBH,EAAiB4I,EAAUhR,EApBzEhH,GAAW/I,EAAO+I,SACrBiY,GAAiBF,EAAOG,SACxB5b,GAAOyb,EAAOH,IACd7E,GAAezW,GAAK4b,SACpBzS,GAAUnJ,GAAK6b,OACfve,GAAc1C,EAAEkhB,WAEhBC,IADWnhB,EAAEohB,QACCP,EAAOQ,YACrBC,GAAQT,EAAOvM,KACfrI,GAAuB4P,GAAa0F,SAGpC1E,GAAoBzX,GAAKoc,SAAWpc,GAAKoc,UAAY,iBACrD9V,GAAiBtG,GAAKqc,QAAUrc,GAAKqc,SAAW,cAEhDrY,GAAO,OACPgJ,GAAchN,GAAKsc,UACnB5K,GAAa,wBACbrQ,GAAQrB,GAAKN,IACbE,GAAgBI,GAAKuc,KAErB/H,GAAgB,SACjB,IAAI5Z,EAAE+J,KAAQ,MAAO/J,EAErB6b,IAAaD,SAAU,CACvB,IAAIxM,IAAY6I,GAAcpI,GAAO2F,GAAgBd,GAAcwC,GAAS9J,GAAWwU,GACtFhT,GAAa,WACbS,GAAmB,aACnBhN,GAAoB,iBACpBC,GAAmB,gBACnByR,GAAmB,gBACnB9M,GAAU,UACVD,GAAW,WACXE,GAAQ,QACR1B,GAAO,OACPuT,GAAS,SACT7S,GAAO,OACPwM,GAAc,cACdD,GAAa,oBACbpL,GAAYuH,GAAa,MACzBiT,GAAa,WAAajT,GAAa,IACvCpM,IACCc,MAAO,MACPwe,MAAO,MACPtV,KAAMpD,GACN2Y,KAAM,QAEPC,IAAgB5V,KAAM,QAAS1K,GAAI,SACnCugB,GAAc,EACdC,GAAeliB,EAAEkQ,UACjBiS,GAAmBpB,GAAeqB,WAClCnL,GAAenO,GAASqO,yBACxBtC,GAAM/L,GAASuZ,cAGf/P,IAAagQ,GAAI,EAAGC,GAAI,EAAGC,MAAO,EAAGC,MAAO,EAAGC,MAAO,EAAGC,MAAO,EAAGC,GAAI,EAAGC,SAAU,EAAGC,GAAI,EAAG/E,OAAQ,EAAGgF,SAAU,EAAGC,IAAK,EAAGC,OAAQ,GACtInQ,IAAa8P,GAAI,SACjB1Q,IAAagR,GAAI,EAAGC,IAAK,EAAGrB,MAAO,EAAGsB,GAAI,EAAGC,KAAM,EAAGC,KAAM,EAAGC,IAAK,EAAGxZ,KAAM,EAAGyZ,KAAM,EACrFC,QAAS,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,MAAO,EAAG9hB,OAAQ,EAAG+hB,MAAO,EAAGC,IAAK,GACtEjb,MACA1G,MACAgL,GAAa,EACb4W,GAAY,eACZ/M,GAAkB,8HAClB3G,GAAmB,iBACnBuN,GAAe,oBACfvI,GAAe,wBACfI,GAAkB,kBAClB8D,GAAgB,sCAChBtX,GAAiB,aACjByG,GAAmB3I,EAAO2I,gBAI3B,IAFA7E,EAAc7D,EAAEgkB,YAEXngB,EAEJ,KAAM4c,GAAc,cA0/FpB,OAv/FDG,GAAW/c,EAAYogB,QAo9DvB7e,GAAK8e,QAAQC,SAAW,SAASzN,EAAMwJ,GACtCA,EAAKnW,KAAO+E,EACR4H,IACH1W,EAAE+J,KAAK2M,GAAQ,WACd,MAAO5H,GAASlD,MAAMsU,EAAMrU,cAK/BzG,GAAKgL,UAAYA,GAGhB2Q,GAAeqB,WAAa,WAE5B,GAAIgC,GAAMjC,GAAiBvW,MAAM,EAAGC,WAEnCwY,EAAaxI,GAAauG,UAU3B,OARAjK,GAAiBkM,EAAW,GAAGzR,OAAO,GACtCwF,EAAiBiM,EAAW,GAAGzR,OAAO,GACtCyF,EAAkBgM,EAAW,GAAGzR,OAAO,GACvCsF,EAAkBmM,EAAW,GAAGzR,OAAO,GACvCkO,EAAWuD,EAAW,GAGtBpM,GAAe,GAAIqM,QAAO,yBAA2BxD,EAAW,QAAU1I,EAAiBhT,GAAKmf,KAAO,aAAelM,EAAkB,IAAK,KACtI+L,MAGRhf,GAAKof,WAAW,WAiXhBrD,GAAYsD,MAAQ,SAAS1K,GAI5B,GAAI2K,GACHpe,EAAejC,KAAKtD,QAAQsC,MAAQ,GACpCshB,EAAStgB,KAAKuB,OAAOV,MAAMyf,MAa5B,OAXIA,KAIHD,EAAoBC,EAAO5N,QAAQ,mBAAoB,QAEvD2N,EAAoB,UAAYA,EAAoB,eAAiBA,EAAoB,WAEzFpe,EAAeA,EAAayQ,QAAQ,GAAIuN,QAAOI,GAAoB,MACnE3K,EAAMzT,GAAgByT,GAAOzT,GAAgB,KAAOqe,EAAS,KAEvD5K,GAWRuH,IACCxV,IACCnJ,KAAM6C,GACNof,KAAM,SAAShf,GAOd,IANA,GAAIif,GACHpjB,EAAM4C,KACNiL,EAAI,EACJnK,EAAOS,EAAOT,KACdkI,EAAIlI,EAAKuE,OAEH4F,EAAEjC,IAAM3K,GAAYyC,EAAKmK,IAAKA,KACrC7N,EAAIqjB,IAAMzX,EAAEiC,GAAKA,EAAE,EACf7N,EAAIkC,EAAE0F,SACJjE,GAAK2f,MAAM7iB,KAAK2iB,EAAUjf,EAAOK,KAAKgK,UAI1CxO,EAAI0iB,SAAW,YAAcnkB,EAAE2Z,KAAKkL,IAAYjf,EAAOlF,OAAOyE,KAAKmK,IAAM,QAAU,aAEpF7N,EAAIkB,KAAOyG,KAGbiR,YAAa,SAASzU,EAAQ7E,GAC7B,GAAIoK,GAASzK,EAAcskB,EAC1BvjB,EAAM4C,KACNiL,EAAI7N,EAAIqjB,IACR3f,EAAOS,EAAOT,KACdkI,EAAIlI,EAAKuE,OACTxE,EAAQU,EAAOV,MACftC,EAAOsC,EAAMtC,KACbxB,EAAOwE,EAAOxE,KACd6jB,EAAY/f,EAAMqH,OAEf+C,KACHnE,EAAUhG,EAAKmK,EAAE,GACjB5O,EAASyE,EAAKyB,MAAM0I,GACpBnK,EAAOA,EAAKyB,MAAM,EAAG0I,EAAE,GACvB7N,EAAIyjB,KAAO/f,EAAK,GAEhB6f,EAAavjB,EAAIujB,WAAavjB,EAAIujB,YAAchlB,EAAEyB,EAAIkC,EAAE0F,QACpD5H,EAAIyjB,KAAO/f,EAAK,IAAM,IAAK1D,EAAI+C,YAIhCzD,EAAQ+B,MAENmiB,IAGJA,EAAY,oBAAoB/iB,KAAK0D,EAAOlF,OAAOyE,KAAKyB,OAAOlG,EAAOgJ,OAAS,GAAG,IAClFub,EAAYA,GAAa7f,GAAKoT,OAAOJ,EAAiB,IAAM6M,EAAU,GAAK5M,EAAiBjX,EAAK6E,MAAM,GAAMlF,EAAQ6B,KAAMxB,IAGxHK,EAAI0jB,MACP1jB,EAAIkE,WAGLqf,EAAWlZ,GACVrK,EAAI0jB,KAAOhgB,EAAK,IAAM,QACtB1D,EAAIyjB,KACIziB,QAARG,EAAoB,KAAOA,EAC3BnB,EAAI2jB,KAAO,SAAe3kB,GACzB,GAAI6I,GACH2L,GAASxT,EAAIkC,EAAE0F,MAEhB,KAAK4L,EAGJ,IAFA3L,EAAQ7H,EAAIyY,SAAS,KACrB7M,EAAI/D,EAAMI,QACFuL,GAAS5H,KACZ/D,EAAM+D,GAAG8H,SAAS1U,EAAGS,UACxB+T,GAAQ,EAIX,IAAIA,EACH,MAAO9J,GAAQS,MAAMqZ,GAAalkB,EAAQ6B,QAAS0L,OAClD5N,EACAD,GACC0C,OAAQ1C,EAAGsG,KAAM3F,KAAMA,EAAML,QAASA,GACvCL,EAAOkG,MAAM1D,KAAK2I,UAAW,SASnCvG,SAAU,WACT,OAAO,GAERK,SAAU,WACT,GAAI6E,GAAOnG,IACPmG,GAAKwa,YACRxa,EAAKwa,WAAWvZ,IAAIjB,EAAK2a,KAAM3a,EAAK0a,KAAM1a,EAAK4a,OAGjD1W,MAAM,EACN2W,WAAYxF,EACZyF,eAAe,GAEhBC,YACCX,KAAM,SAAShf,GACdvB,KAAKqS,KAAO9Q,EAAOV,MAAMwR,MAAS,MAAQ8O,KAAKC,UAEhDrL,OAAQ,SAASxU,EAAQ7E,GACxB,GAAI2kB,GACHjkB,EAAM4C,KACNmX,EAAc/Z,EAAI8L,WAAc9L,EAAIkC,EAAE0F,OAAS5H,EAAIyY,UAAS,EAAM,qBAAuBla,EAAEe,EAAQ+B,MAAMqb,KAAK,qBAC9G9Q,EAAImO,EAAY9R,MAUjB,KARIjI,EAAIkC,EAAE0F,QAGTqc,EAAejkB,EAAIyY,SAAS,KAAK,GACjCwL,EAAeA,GAAgB1lB,EAAEoB,KAAKskB,GAAc7f,IAAIpE,MAAQA,EAAI6O,OAASoV,EAAejkB,EAAI+C,YAEhGkhB,EAAe3kB,EAAQ+B,KAEjBuK,KAENmO,EAAYnO,GAAGqJ,KAAO8E,EAAYnO,GAAGqJ,MAAQjV,EAAIiV,IAGlD1W,GAAE0lB,GAAc5Z,GAAG,gBAAiB,SAASrL,EAAIklB,GAChD,GAAIpY,GACHqY,EAAaD,EAAc9f,IAAI+f,UAChC,KAAKnkB,EAAIkC,EAAE0F,QAAUqc,IAAiBjkB,EAAI+C,YAGtCohB,GAAcA,EAAWnkB,EAAIqE,WAAarE,EAI7C,IAFA+Z,EAAc/Z,EAAI8L,WAAa9L,EAAIyY,UAAS,EAAM,qBAClD7M,EAAImO,EAAY9R,OACT2D,KAENE,EAAaiO,EAAYnO,GACzBE,EAAWiB,SAAW/M,EACtB8L,EAAWmJ,KAAOnJ,EAAWmJ,MAAQjV,EAAIiV,KACzCjI,EAAOtM,GAAaV,EAAI+H,OAAQ/H,EAAK8L,GACrCA,EAAWvL,QAAU,IAAMP,EAAI+H,MAAQ,IACvC+D,EAAWsY,QAAUpkB,EAAI8Y,UAAU,KAAOhN,EAAWjK,SAKzDgC,SAAU,SAAS7E,EAAIkB,EAAWwa,GACjC,OAAO,GAERkJ,WAAYxF,EACZyF,eAAe,KAIjB/W,GAAQ+S,GAAM,QAWbzN,cAAe,SAASpT,EAAIkB,EAAWiE,EAAQ7E,GAC9C,GAAI+kB,GACH5kB,EAAST,EAAGS,OACZ6kB,EAAe7kB,EAAOwI,OACtBjI,EAAM4C,KACNlB,EAASxB,EAAUwB,MACpB,IAAI1B,EAAIkC,EAAEqiB,OACNvkB,EAAI0a,QAAQ,KACH,WAAXhZ,GAAuB4iB,IAAiBpkB,EAAUgJ,MAAMjB,QAC1C,WAAXvG,IAAwB4iB,GAE5BtkB,EAAIoJ,cAEJ,KAAKib,IAAarkB,GAAIkC,EAAEgI,OACvBma,EAAYrkB,EAAIkC,EAAEgI,OAAOma,GACrBA,EAAUljB,OAAS1B,GACtB4kB,EAAUniB,EAAEkQ,cAAcjI,MAAMka,EAAWja,UAI9CpK,GAAIid,UAAU9Y,EAAQ7E,EAASY,GAC/BlB,EAAGwlB,MAAO,GAEX5L,YAAa,SAASzU,EAAQ7E,GAC7B,GAAIuO,GAAG4W,EAAYC,EAAYvjB,EAC9BnB,EAAM4C,KACN+hB,EAAgB3kB,EAAI4kB,SACpBlK,EAAU1a,EAAI0a,QACd9O,EAAI8O,EAAQzS,OACZW,EAAW5I,EAAI4I,UAAY,CAE5B,KAAKiF,EAAI,EAAGA,GAAKjF,EAAUiF,IAC1B1J,EAASuW,EAAQ7M,GACjB1M,EAAOgD,EAAO+W,IACX/W,EAAO+W,IAAIoD,IACXna,EAAOT,KAAKuE,OACX9D,EAAOT,KAAK,GACZS,EAAOxE,KAAKwB,MAEXujB,EAAaC,EAAc9W,KAAO1M,IAASujB,EAAW,KAC1DvF,EAASuF,EAAW,GAAIA,EAAW,IAAI,SAChCC,GAAc9W,KAEjB8W,EAAc9W,IAAMnG,EAASvG,KACjCge,EAAShe,EAAMsjB,EAAa,SAASzlB,EAAIkB,GACxC,GAAI2kB,GAAQ1gB,CACZnE,GAAIoS,cAAcpT,EAAIkB,EAAW2kB,EAAOvlB,KAEzCqlB,EAAc9W,IAAM1M,EAAMsjB,GAG5B,KAAK5W,EAAIjF,EAAW,EAAGiF,EAAIjC,EAAGiC,KACzB6W,EAAaC,EAAc9W,MAC9BsR,EAASuF,EAAW,GAAIA,EAAW,IAAI,SAChCC,GAAc9W,GAGvB7N,GAAI4kB,KAAOD,GAEZrJ,UAAW,WACV,GAAI1P,GAAG5L,EAAM4C,IACb,KAAKgJ,IAAK5L,GAAI4kB,KACbzF,EAASnf,EAAI4kB,KAAKhZ,GAAG,GAAI5L,EAAI4kB,KAAKhZ,GAAG,IAAI,MAK5CkB,GAAQ+S,GAAM,OACbhc,SAAU,SAAS7E,EAAIkB,EAAW4kB,GACjC,GAAIC,GAAKC,EAASC,CAClB,KAAKF,EAAM,EAAIC,EAAUpiB,KAAK8X,QAAQqK,GAAOA,IAE5C,GADAE,EAAYD,EAAQvhB,MAAMe,OAASsgB,EAAWC,GAAKthB,MAAMe,MAAQwgB,EAAQthB,KAAKuE,UAAY+c,EAAUA,EAAQthB,KAAK,MAASohB,EAAWC,GAAKrhB,KAAK,IACzId,KAAKE,SAAakiB,GAAYC,EACnC,MAAOA,EAQT,QAAO,GAERrM,YAAa,SAASzU,EAAQ7E,EAAS8E,EAAKpF,EAAIkB,GAC3CA,GACH0C,KAAKqa,UAAU9Y,EAAQ7E,EAASY,MAsDnC2f,GAAM,SACLqF,QAAS,MACTC,QAAS/F,EAAOlE,KACfkK,OAAQvF,GAAMpc,MAAM0hB,QAAQC,OAC5BC,OAAQhH,EACRiH,OAAQ9G,EACR+G,OAAQ3G,IAET3R,MAAM,IAOPH,GAAQvO,GAMPoB,KAAMyO,GAAQ,SAASmG,EAAMiR,EAAOlgB,GAQnC,QAASmgB,GAAaC,EAAIC,GACzB,GAAID,EAEH,IADA5X,EAAUa,EAAU+W,EAAIC,EAAM/W,IACzBqD,EAAI,EAAGpG,EAAIiC,EAAQ7F,OAAQgK,EAAIpG,MAC9BlM,EAAOgM,GAAUmC,EAAQmE,GAAG9L,QAASxG,EAAOA,GAAQ2F,EAAO3F,EAAKuT,KAAI,EAAM5N,GAAQ3F,IADjDsS,MAQrCuT,MAAYA,IAEflgB,EAAOkgB,EACPA,EAAQxkB,OAET,IAAIrB,GAAMmO,EAASD,EAAGoE,EAAGpG,EAAGD,EAAGuH,EAC9BT,EAAQ,EACRnL,EAAOF,GAASE,IAEjB,IAAIgN,GAAQA,IAAShN,GAAQ8G,EAAQnM,EAAE4H,OAAS,IAG/CyK,EAAO,GAAKA,IAASA,EAClBhW,EAAEgW,GAAM,GACRA,EAAK7G,OACJ6G,EAAK,GACLA,GAEM,CACT,GAAIiR,EAAO,CAEV,GADAC,EAAalR,EAAK5O,KAAK,IAClBhG,EAIJ,IAFAwT,EAAQC,GAAMmB,EAAKlB,iBAAiB+M,IAAc7hB,EAAE6hB,GAAY7L,GAAMrB,MACtEtH,EAAIuH,EAAMlL,OACL4F,EAAI,GAAIlO,GAAQkO,EAAIjC,EAAGiC,IAC3B4X,EAAatS,EAAMtF,GAGrB,OAAOlO,GAER,KAAO4U,GAAM,CAGZ,GAAIzG,EAAUa,EAAU4F,EAAMvT,OAAW4S,IAExC,IADAhI,EAAIkC,EAAQ7F,OACL2D,KAEN,GADAjM,EAAOmO,EAAQlC,GACXjM,EAAKuS,KAAM,CACd,GAAIQ,EAAQ,EAEX,MADA/S,GAAOgM,GAAUhM,EAAKwG,IACfxG,GAAQ2F,EAAO3F,EAAKuT,IAAI5N,GAAQ3F,GAAQ0O,CAEhDqE,SAIAA,IAIH6B,GAAOA,EAAKpM,iBAAmBoM,EAAKvR,YAIvC,MAAOqL,IAGR/F,KAAMkF,EACNoY,OAAQpK,EAKR/M,UAAW,SAAS0E,GACfA,EAAMlL,QAAUuY,IAEnB5F,EAAMzH,GAEPsN,GAAatW,MAAM5L,EAAG6L,cAoBxB0C,GAAQvO,EAAEiO,IACTlE,KAAM,SAASrD,EAAM0F,EAAMG,EAASwC,EAAaC,EAAY1H,EAAUC,GACtE,MAAO0H,GAAMvI,EAAMrC,KAAM+H,EAAMG,EAASwC,EAAaC,EAAY1H,EAAUC,IAE5E8f,OAAQ,WACP,MAAOpK,GAAQ5Y,OAEhBjD,KAAM,SAAS6lB,EAAOlgB,GACrB,MAAO8I,IAAMxL,KAAK,GAAI4iB,EAAOlgB,MAQ/B/G,EAAEkd,MAAM9T,GAAM,cAAe,QAAS,UAAW,SAASkG,EAAGoH,GAC5D,GAAI4Q,GAAQtnB,EAAEiO,GAAGyI,EACjB1W,GAAEiO,GAAGyI,GAAQ,WACZ,GAAI6Q,EACJtF,IAAc,CACd,KACCsF,EAASD,EAAM1b,MAAMvH,KAAMwH,WAE5B,QACCoW,GAAc,EAEf,MAAOsF,MAQTphB,EAAeoI,GAAQuB,EAAU1K,GAAK0K,SAAU7J,MAAOsS,aAEvDnL,IAAaoa,EAAG1X,GAKhB+Q,EAAO4G,OAAS,SAAS7D,GAIxB,MAHIA,IAASA,EAAM5H,MAClB4H,EAASA,EAAM,GAAGA,EAAM,GAAGhhB,KAAMghB,EAAM,GAAIxe,KAErCwe,GAORxe,GAAK4W,IAAM,SAAS0L,EAAUhnB,EAAQU,GACrC,GAAIA,EAAKumB,OAAQ,CAChBjnB,EAAS0X,EAAiB,IAAM1X,EAAS2X,CACzC,IAAIpS,GAAO7E,EAAK6E,KACfsS,EAAQzI,EAAQ7J,KAAKsS,MACrBvU,EAASuU,EAAM7X,EACXsD,KACJuU,EAAM7X,GAAUsD,EAASoB,GAAKoT,OAAO9X,EAAQuF,GAAM,IAEpDyhB,GAAYtmB,EAAM4C,GAClB0jB,EAAS1L,KAAM,EAEhB,MAAO0L,IAGRtiB,GAAKwiB,KAAO,QAASC,IAAiBC,GACrC,GAAIC,GACHC,EAASF,EACTza,EAAIya,EAAIpe,MACT,IAAI2D,EAEH,IADA2a,KACO3a,KACN0a,EAAKD,EAAIza,GACL0a,EAAGxkB,OACNwkB,EAAKxZ,MAAYwZ,GACjBA,EAAGE,IAAMJ,GAAiBE,EAAGE,MAE9BD,EAAOnV,QAAQkV,EAGjB,OAAOC,IAGR5iB,GAAKwT,MAAQ,SAASxX,GAErB,MAAO,UAASwD,EAAM6X,EAAQxG,GAG7B,GAAItO,GAAQlG,EAAKkJ,EAAOud,EAAQC,EAAMC,EAAU/a,CAChD,IAAIjM,GAAQwD,EAAM,CACjB,GAAIA,EAAKrB,KACR,MAAOqB,GAAKrB,KAAKL,KAAK9B,EAAK6E,KAAMwW,EAAQrb,EAAMgE,GAEhD,IAAuB,MAAnBR,EAAKgO,OAAO,GAGf,MAAyB,SAArBhO,EAAKgC,MAAM,EAAG,KACjBnF,EAAML,EAAKyE,IACY,MAAnBjB,EAAKgO,OAAO,KAEfjL,EAAS/C,EAAKgC,MAAM,GAAGmV,MAAM,KAC7Bta,EAAMA,EAAIA,KAEPkG,GACIlG,GAAOA,EAAKkG,EAAOwK,KAAK,KAAMsK,OAGvC7X,EAAOA,EAAKgC,MAAM,GAAGmV,MAAM,MACvBmM,EAAS9mB,EAAKgB,IAAI+lB,EAAOvjB,EAAKoN,SAAS,MACtCkW,EAAOlM,KACNpX,EAAK8E,SACR0e,EAAW,IAAMxjB,EAAKuN,KAAK,KAC3BgW,EAAOD,EAAO7a,EAAI6a,EAAOxe,OAAO,GAC5Bye,EAAK5kB,MACR4kB,EAAKzkB,GAAK0kB,EACVD,EAAK7c,MAAQ2K,IAEbiS,EAAO7a,IAAM8a,EAAOC,GAAUrR,QAAQ,SAAU,IACvB,UAArBoR,EAAKvhB,MAAM,EAAG,KACjBshB,EAAO7a,GAAK6a,EAAO7a,GAAGzG,MAAM,GAC5BshB,EAAOxI,OAAOrS,EAAG,EAAGjM,MAIvBuJ,GAASud,KACCtjB,EAAK8E,QAAUhH,GAAYwlB,MACrCvd,GAASud,EAAQtjB,EAAKuN,KAAK,KAAMsK,KAG5B9R,MAER,IAAuB,MAAnB/F,EAAKgO,OAAO,GAGf,MAAgB,UAAThO,MAAyBxD,EAAMwD,EAAKmS,QAAQgN,GAAW,IAAKtH,MAUvEmF,GAAYxc,GAAKijB,OAEjBjjB,GAAKijB,OAAS,WACbzG,GAAU1e,KAAKkC,IACfrF,EAAOwD,KAAO0I,GAAqB1I,KAChCgL,GAAQxO,EAAOwD,UACf+I,MAAOc,GACPrL,SAAUI,KAEVM,OACH+S,GAAiBvJ,GAAqBqc,SACtC5T,GAAemN,GAAa,KAAOrM,GAAiB,IACpD0B,GAAUjL,GAAqBsc,IAC/BrR,GAAQ6L,SAAW7L,GAAQsR,OAC3BtR,GAAQuL,MAAQvL,GAAQyL,MAAQzL,GAAQ2L,SAAW3L,GAAQuR,QAAUvR,GAAQwL,MAC7ExL,GAAQwR,GAAKxR,GAAQyR,IAGtB5H,GAAeQ,UACd+G,SAAU,YACVM,UAAU,EACVjS,YAAY,EAIZ4R,KACCC,QAAS,EAAG,+BAAgC,aAC5CK,QAAS,EAAG,aAAc,eAC1BxF,MAAO,EAAG,QAAS,UACnBO,OAAQ,EAAG,WAAY,aACvBlB,OAAQ,EAAG,UAAW,YACtBE,IAAK,EAAG,iBAAkB,oBAC1B+F,IAAK,EAAG,qBAAsB,yBAC9BpF,KAAM,EAAG,mCAAoC,uBAC7CN,QAAS,EAAG,QAAS,UAGrB3M,IAAKtW,EAAE8oB,QAAQC,eAAiB,EAAG,GAAI,KAAO,EAAG,SAAU,WAE5D7c,KACC4V,OACC1V,KAAMiR,EAAa3b,GAAI,SAExBsnB,SAAUhH,GACVjE,OAAQiE,GACRe,UACCrhB,GAAI,YAKC1B,GACLipB","file":"jquery.views.min.js","sourcesContent":["/*! jquery.views.js v0.9.83 (Beta): http://jsviews.com/ */\n/*\n * Interactive data-driven views using JsRender templates.\n * Subcomponent of JsViews\n * Requires jQuery and jsrender.js (Best-of-breed templating in browser or on Node.js)\n * See JsRender at http://jsviews.com/#download and http://github.com/BorisMoore/jsrender\n * Also requires jquery.observable.js\n * See JsObservable at http://jsviews.com/#download and http://github.com/BorisMoore/jsviews\n *\n * Copyright 2016, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041\n\n(function(factory, global) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar $ = global.jQuery;\n\n\tif (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory(global, $)\n\t\t\t: function($) { // If no global jQuery, take jQuery passed as parameter (with JsRender and JsObservable): require(\"jquery.views\")(jQuery)\n\t\t\t\treturn factory(global, $);\n\t\t\t};\n\t} else if (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine([\"jquery\", \"./jsrender\", \"./jquery.observable\"], function($, jsr, jso) {\n\t\t\treturn factory(global, $, jsr, jso);\n\t\t}); // Require jQuery, JsRender, JsObservable\n\t} else { // Browser using plain ',\n\topenScript = ' - data-linked tag, close marker\n\t\t\t// We validate with inTag so no script markers are inserted in attribute context e.g. for:\n\t\t\t// \"\" or \"
...{{/if}}...\"\n\t\t\tpreceding = id\n\t\t\t\t? (preceding + endOfElCnt + spaceBefore + (inTag ? \"\" : openScript + id + closeScript)+ spaceAfter + tag)\n\t\t\t\t: endOfElCnt || all;\n\t\t}\n\n\t\tif (validate && boundId) {\n\t\t\tif (inTag) {\n\t\t\t\t// JsViews data-linking tags are not allowed within element markup.\n\t\t\t\t// See jsviews/issues/303\n\t\t\t\tsyntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link=\"...\"');\n\t\t\t}\n\t\t\tif (id.charAt(0) === \"#\") {\n\t\t\t\ttagStack.unshift(id.slice(1));\n\t\t\t} else if (id.slice(1) !== (bndId = tagStack.shift())) {\n\t\t\t\t// See jsviews/issues/213\n\t\t\t\tsyntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>');\n\t\t\t}\n\t\t}\n\t\tif (tag) {\n\t\t\tinTag = tag;\n\t\t\t// If there are ids (markers since the last tag), move them to the defer string\n\t\t\ttagStack.unshift(parentTag);\n\t\t\tparentTag = tag.slice(1);\n\t\t\tif (validate && tagStack[0] && tagStack[0] === badParent[parentTag]) {\n\t\t\t\t// Missing \n\t\t\t\t// TODO: replace this by smart insertion of tags\n\t\t\t\terror('Parent of must be ');\n\t\t\t}\n\t\t\tisVoid = voidElems[parentTag];\n\t\t\tif ((elCnt = elContent[parentTag]) && !prevElCnt) {\n\t\t\t\tdeferStack.unshift(defer);\n\t\t\t\tdefer = \"\";\n\t\t\t}\n\t\t\tprevElCnt = elCnt;\n//TODO Consider providing validation which throws if you place as child of , etc. - since if not caught,\n//this can cause errors subsequently which are difficult to debug.\n//\t\t\t\tif (elContent[tagStack[0]]>2 && !elCnt) {\n//\t\t\t\t\terror(parentTag + \" in \" + tagStack[0]);\n//\t\t\t\t}\n\t\t\tif (defer && elCnt) {\n\t\t\t\tdefer += \"+\"; // Will be used for stepping back through deferred tokens\n\t\t\t}\n\t\t}\n\t\treturn preceding;\n\t}\n\n\tfunction processViewInfos(vwInfos, targetParent) {\n\t\t// If targetParent, we are processing viewInfos (which may include navigation through '+-' paths) and hooking up to the right parentElem etc.\n\t\t// (and elem may also be defined - the next node)\n\t\t// If no targetParent, then we are processing viewInfos on newly inserted content\n\t\tvar deferPath, deferChar, bindChar, parentElem, id, onAftCr, deep,\n\t\t\taddedBindEls = [];\n\n\t\t// In elCnt context (element-only content model), prevNode is the first node after the open, nextNode is the first node after the close.\n\t\t// If both are null/undefined, then open and close are at end of parent content, so the view is empty, and its placeholder is the\n\t\t// 'lastChild' of the parentNode. If there is a prevNode, then it is either the first node in the view, or the view is empty and\n\t\t// its placeholder is the 'previousSibling' of the prevNode, which is also the nextNode.\n\t\tif (vwInfos) {\n\t\t\tif (vwInfos._tkns.charAt(0) === \"@\") {\n\t\t\t\t// We are processing newly inserted content. This is a special script element that was created in convertMarkers() to process deferred bindings,\n\t\t\t\t// and inserted following the target parent element - because no element tags (outside elCnt) were encountered to carry those binding tokens.\n\t\t\t\t// We will step back from the preceding sibling of this element, looking at targetParent elements until we find the one that the current binding\n\t\t\t\t// token belongs to. Set elem to null (the special script element), and remove it from the DOM.\n\t\t\t\ttargetParent = elem.previousSibling;\n\t\t\t\telem.parentNode.removeChild(elem);\n\t\t\t\telem = undefined;\n\t\t\t}\n\t\t\tlen = vwInfos.length;\n\t\t\twhile (len--) {\n\t\t\t\tvwInfo = vwInfos[len];\n//if (prevIds.indexOf(vwInfo.token) < 0) { // This token is a newly created view or tag binding\n\t\t\t\tbindChar = vwInfo.ch;\n\t\t\t\tif (deferPath = vwInfo.path) {\n\t\t\t\t\t// We have a 'deferred path'\n\t\t\t\t\tj = deferPath.length - 1;\n\t\t\t\t\twhile (deferChar = deferPath.charAt(j--)) {\n\t\t\t\t\t\t// Use the \"+\" and\"-\" characters to navigate the path back to the original parent node where the deferred bindings ocurred\n\t\t\t\t\t\tif (deferChar === \"+\") {\n\t\t\t\t\t\t\tif (deferPath.charAt(j) === \"-\") {\n\t\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t\t\ttargetParent = targetParent.previousSibling;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttargetParent = targetParent.parentNode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttargetParent = targetParent.lastChild;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Note: Can use previousSibling and lastChild, not previousElementSibling and lastElementChild,\n\t\t\t\t\t\t// since we have removed white space within elCnt. Hence support IE < 9\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (bindChar === \"^\") {\n\t\t\t\t\tif (tag = bindingStore[id = vwInfo.id]) {\n\t\t\t\t\t\t// The binding may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\t\t// This is a tag binding\n\t\t\t\t\t\tdeep = targetParent && (!elem || elem.parentNode !== targetParent); // We are stepping back looking for the right targetParent,\n\t\t\t\t\t\t// or we are linking existing content and this element is in elCnt, not an immediate child of the targetParent.\n\t\t\t\t\t\tif (!elem || deep) {\n\t\t\t\t\t\t\ttag.parentElem = targetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (vwInfo.elCnt && deep) {\n\t\t\t\t\t\t\t// With element only content, if there is no following element, or if the binding is deeper than the following element\n\t\t\t\t\t\t\t// then we need to set the open or close token as a deferred binding annotation on the parent\n\t\t\t\t\t\t\tsetDefer(targetParent, (vwInfo.open ? \"#\" : \"/\") + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This is an open or close marker for a data-linked tag {^{...}}. Add it to bindEls.\n\t\t\t\t\t\taddedBindEls.push([deep ? null : elem, vwInfo]);\n\t\t\t\t\t}\n\t\t\t\t} else if (view = viewStore[id = vwInfo.id]) {\n\t\t\t\t\t// The view may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\tif (!view.parentElem) {\n\t\t\t\t\t\t// If view is not already extended for JsViews, extend and initialize the view object created in JsRender, as a JsViews view\n\t\t\t\t\t\tview.parentElem = targetParent || elem && elem.parentNode || parentNode;\n\t\t\t\t\t\tview._.onRender = addBindingMarkers;\n\t\t\t\t\t\tview._.onArrayChange = arrayChangeHandler;\n\t\t\t\t\t\tsetArrayChangeLink(view);\n\t\t\t\t\t}\n\t\t\t\t\tparentElem = view.parentElem;\n\t\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t\t// This is an 'open view' node (preceding script marker node,\n\t\t\t\t\t\t// or if elCnt, the first element in the view, with a data-jsv annotation) for binding\n\t\t\t\t\t\tview._elCnt = vwInfo.elCnt;\n\t\t\t\t\t\tif (targetParent && !elem) {\n\t\t\t\t\t\t\tsetDefer(targetParent, \"#\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No targetParent, so there is a ._nxt elem (and this is processing tokens on the elem)\n\t\t\t\t\t\t\tif (!view._prv) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is a 'close view' marker node for binding\n\t\t\t\t\t\tif (targetParent && (!elem || elem.parentNode !== targetParent)) {\n\t\t\t\t\t\t\t// There is no ._nxt so add token to _df. It is deferred.\n\t\t\t\t\t\t\tsetDefer(targetParent, \"/\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t\tview._nxt = undefined;\n\t\t\t\t\t\t} else if (elem) {\n\t\t\t\t\t\t\t// This view did not have a ._nxt, but has one now, so token may be in _df, and must be removed. (No longer deferred)\n\t\t\t\t\t\t\tif (!view._nxt) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._nxt = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (onAftCr = view.ctx && view.ctx[onAfterCreateStr] || onAfterCreate) {\n\t\t\t\t\t\t\tonAftCr.call(view.ctx.tag, view);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n//}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen = addedBindEls.length;\n\t\t\twhile (len--) {\n\t\t\t\t// These were added in reverse order to addedBindEls. We push them in BindEls in the correct order.\n\t\t\t\tbindEls.push(addedBindEls[len]);\n\t\t\t}\n\t\t}\n\t\treturn !vwInfos || vwInfos.elCnt;\n\t}\n\n\tfunction getViewInfos(vwInfos) {\n\t\t// Used by view.childTags() and tag.childTags()\n\t\t// Similar to processViewInfos in how it steps through bindings to find tags. Only finds data-linked tags.\n\t\tvar level, parentTag, named;\n\n\t\tif (vwInfos) {\n\t\t\tlen = vwInfos.length;\n\t\t\tfor (j = 0; j < len; j++) {\n\t\t\t\tvwInfo = vwInfos[j];\n\t\t\t\t// This is an open marker for a data-linked tag {^{...}}, within the content of the tag whose id is get.id. Add it to bindEls.\n\t\t\t\t// Note - if bindingStore[vwInfo.id]._is === \"tag\" then getViewInfos is being called too soon - during first linking pass\n\t\t\t\tparentTag = tag = bindingStore[vwInfo.id].linkCtx.tag;\n\t\t\t\tnamed = tag.tagName === tagName;\n\t\t\t\tif (!tag.flow || named) {\n\t\t\t\t\tif (!deep) {\n\t\t\t\t\t\tlevel = 1;\n\t\t\t\t\t\twhile (parentTag = parentTag.parent) {\n\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagDepth = tagDepth || level; // The level of the first tag encountered.\n\t\t\t\t\t}\n\t\t\t\t\tif ((deep || level === tagDepth) && (!tagName || named)) {\n\t\t\t\t\t\t// Filter on top-level or tagName as appropriate\n\t\t\t\t\t\ttags.push(tag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dataLink() {\n\t\t//================ Data-link and fixup of data-jsv annotations ================\n\t\tvar j, index,\n\t\t\ttokens = \"\",\n\t\t\twrap = {},\n\t\t\tselector = linkViewsSel + (get ? \",[\" + deferAttr + \"]\" : \"\");\n\t\t\t// If a childTags() call, get = \",[\" + deferAttr + \"]\" - since we need to include elements that have a ._df expando for deferred tokens\n\n\t\telems = qsa ? parentNode.querySelectorAll(selector) : $(selector, parentNode).get();\n\t\tl = elems.length;\n\n\t\t// The prevNode will be in the returned query, since we called markPrevOrNextNode() on it.\n\t\t// But it may have contained nodes that satisfy the selector also.\n\t\tif (prevNode && prevNode.innerHTML) {\n\t\t\t// Find the last contained node of prevNode, to use as the prevNode - so we only link subsequent elems in the query\n\t\t\tprevNodes = qsa ? prevNode.querySelectorAll(selector) : $(selector, prevNode).get();\n\t\t\tprevNode = prevNodes.length ? prevNodes[prevNodes.length - 1] : prevNode;\n\t\t}\n\n\t\ttagDepth = 0;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = elems[i];\n\t\t\tif (prevNode && !found) {\n\t\t\t\t// If prevNode is set, not false, skip linking. If this element is the prevNode, set to false so subsequent elements will link.\n\t\t\t\tfound = (elem === prevNode);\n\t\t\t} else if (nextNode && elem === nextNode) {\n\t\t\t\t// If nextNode is set then break when we get to nextNode\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (elem.parentNode) {\n\t\t\t\t// elem has not been removed from DOM\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t\tif (elem._df) {\n\t\t\t\t\t\tj = i + 1;\n\t\t\t\t\t\twhile (j < l && elem.contains(elems[j])) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add defered tokens after any tokens on descendant elements of this one\n\t\t\t\t\t\twrap[j-1] = elem._df;\n\t\t\t\t\t}\n\t\t\t\t\tif (wrap[i]) {\n\t\t\t\t\t\ttokens += wrap[i] || \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isLink && (vwInfo = viewInfos(elem, undefined, rViewMarkers)) && (vwInfo = vwInfo[0])) {\n\t\t\t\t\t\t// If this is a link(trueOrString ...) call we will avoid re-binding to elems that are within template-rendered views\n\t\t\t\t\t\tskip = skip ? (vwInfo.id !== skip && skip) : vwInfo.open && vwInfo.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (!skip && processInfos(viewInfos(elem))\n\t\t\t\t\t\t// If a link() call, processViewInfos() adds bindings to bindEls, and returns true for non-script nodes, for adding data-link bindings\n\t\t\t\t\t\t// If a childTags() call, getViewInfos returns array of tag bindings.\n\t\t\t\t\t\t\t&& elem.getAttribute($viewsLinkAttr)) {\n\t\t\t\t\t\tbindEls.push([elem]); // A data-linked element so add to bindEls too\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (get) {\n\t\t\ttokens += parentNode._df || \"\";\n\t\t\tif (index = tokens.indexOf(\"#\" + get.id) + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so start after the open token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(index + get.id.length);\n\t\t\t}\n\t\t\tindex = tokens.indexOf(\"/\" + get.id);\n\t\t\tif (index + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so don't look beyond the close token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(0, index);\n\t\t\t}\n\t\t\t// Call getViewInfos to add the found childTags to the tags array\n\t\t\tgetViewInfos(viewInfos(tokens, undefined, rOpenTagMarkers));\n\t\t}\n\n\t\tif (html === undefined && parentNode.getAttribute($viewsLinkAttr)) {\n\t\t\tbindEls.push([parentNode]); // Support data-linking top-level element directly (not within a data-linked container)\n\t\t}\n\n\t\t// Remove temporary marker script nodes they were added by markPrevOrNextNode\n\t\tunmarkPrevOrNextNode(prevNode, elCnt);\n\t\tunmarkPrevOrNextNode(nextNode, elCnt);\n\n\t\tif (get) {\n\t\t\tif (lazyLink) {\n\t\t\t\tlazyLink.resolve();\n\t\t\t}\n\t\t\treturn; // We have added childTags to the tags array, so we are done\n\t\t}\n\n\t\tif (elCnt && defer + ids) {\n\t\t\t// There are some views with elCnt, for which the open or close did not precede any HTML tag - so they have not been processed yet\n\t\t\telem = nextNode;\n\t\t\tif (defer) {\n\t\t\t\tif (nextNode) {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer + \"+\", true), nextNode);\n\t\t\t\t} else {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer, true), parentNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocessViewInfos(viewInfos(ids, true), parentNode);\n\t\t\t// If there were any tokens on nextNode which have now been associated with inserted HTML tags, remove them from nextNode\n\t\t\tif (nextNode) {\n\t\t\t\ttokens = nextNode.getAttribute(jsvAttrStr);\n\t\t\t\tif (l = tokens.indexOf(prevIds) + 1) {\n\t\t\t\t\ttokens = tokens.slice(l + prevIds.length - 1);\n\t\t\t\t}\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, ids + tokens);\n\t\t\t}\n\t\t}\n\n\t\t//================ Bind the data-linked elements and tags ================\n\t\tl = bindEls.length;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = bindEls[i];\n\t\t\tlinkInfo = elem[1];\n\t\t\telem = elem[0];\n\t\t\tif (linkInfo) {\n\t\t\t\tif (tag = bindingStore[linkInfo.id]) {\n\t\t\t\t\tif (linkCtx = tag.linkCtx) {\n\t\t\t\t\t\t// The tag may have been stored temporarily on the bindingStore - or may have already been replaced by the actual binding\n\t\t\t\t\t\ttag = linkCtx.tag;\n\t\t\t\t\t\ttag.linkCtx = linkCtx;\n\t\t\t\t\t}\n\t\t\t\t\tif (linkInfo.open) {\n\t\t\t\t\t\t// This is an 'open linked tag' binding annotation for a data-linked tag {^{...}}\n\t\t\t\t\t\tif (elem) {\n\t\t\t\t\t\t\ttag.parentElem = elem.parentNode;\n\t\t\t\t\t\t\ttag._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttag._elCnt = linkInfo.elCnt;\n\t\t\t\t\t\t// We data-link depth-first (\"on the way in\"), which is better for perf - and allows setting parent tags etc.\n\t\t\t\t\t\tview = tag.tagCtx.view;\n\t\t\t\t\t\taddDataBinding(undefined, tag._prv, view, linkInfo.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag._nxt = elem;\n\t\t\t\t\t\tif (tag._.unlinked) {\n\t\t\t\t\t\t\t// This is a 'close linked tag' binding annotation\n\t\t\t\t\t\t\t// Add data binding\n\t\t\t\t\t\t\ttagCtx = tag.tagCtx;\n\t\t\t\t\t\t\tview = tagCtx.view;\n\t\t\t\t\t\t\tcallAfterLink(tag);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Add data binding for a data-linked element (with data-link attribute)\n\t\t\t\taddDataBinding(elem.getAttribute($viewsLinkAttr), elem, $view(elem), undefined, isLink, outerData, context);\n\t\t\t}\n\t\t}\n\t\tif (lazyLink) {\n\t\t\tlazyLink.resolve();\n\t\t}\n\t}\n\t//==== /end of nested functions ====\n\n\tvar inTag, linkCtx, tag, i, l, j, len, elems, elem, view, vwInfo, linkInfo, prevNodes, token, prevView, nextView,\n\t\tnode, tags, deep, tagName, tagCtx, validate, tagDepth, depth, fragment, copiedNode, firstTag, parentTag,\n\t\tisVoid, wrapper, div, tokens, elCnt, prevElCnt, htmlTag, ids, prevIds, found, skip, lazyLink, isLink, get,\n\t\tself = this,\n\t\tthisId = self._.id + \"_\",\n\t\tdefer = \"\",\n\t\t// The marker ids for which no tag was encountered (empty views or final closing markers) which we carry over to container tag\n\t\tbindEls = [],\n\t\ttagStack = [],\n\t\tdeferStack = [],\n\t\tonAfterCreate = self.hlp(onAfterCreateStr),\n\t\tprocessInfos = processViewInfos;\n\n\tif (refresh) {\n\t\tlazyLink = refresh.lazyLink && $.Deferred();\n\t\tif (refresh.tmpl) {\n\t\t\t// refresh is the prevView, passed in from addViews()\n\t\t\tprevView = \"/\" + refresh._.id + \"_\";\n\t\t} else {\n\t\t\tisLink = refresh.lnk; // Top-level linking\n\t\t\tif (refresh.tag) {\n\t\t\t\tthisId = refresh.tag + \"^\";\n\t\t\t\trefresh = true;\n\t\t\t}\n\t\t\tif (get = refresh.get) {\n\t\t\t\tprocessInfos = getViewInfos;\n\t\t\t\ttags = get.tags;\n\t\t\t\tdeep = get.deep;\n\t\t\t\ttagName = get.name;\n\t\t\t}\n\t\t}\n\t\trefresh = refresh === true;\n\t}\n\n\tparentNode = parentNode\n\t\t? (\"\" + parentNode === parentNode\n\t\t\t? $(parentNode)[0] // It is a string, so treat as selector\n\t\t\t: parentNode.jquery\n\t\t\t\t? parentNode[0] // A jQuery object - take first element.\n\t\t\t\t: parentNode)\n\t\t: (self.parentElem // view.link()\n\t\t\t|| document.body); // link(null, data) to link the whole document\n\n\tvalidate = !$subSettingsAdvanced.noValidate && parentNode.contentEditable !== TRUE;\n\tparentTag = parentNode.tagName.toLowerCase();\n\telCnt = !!elContent[parentTag];\n\n\tprevNode = prevNode && markPrevOrNextNode(prevNode, elCnt);\n\tnextNode = nextNode && markPrevOrNextNode(nextNode, elCnt) || null;\n\n\tif (html != undefined) {\n\t\t//================ Insert html into DOM using documentFragments (and wrapping HTML appropriately). ================\n\t\t// Also convert markers to DOM annotations, based on content model.\n\t\t// Corresponds to nextNode ? $(nextNode).before(html) : $(parentNode).html(html);\n\t\t// but allows insertion to wrap correctly even with inserted script nodes. jQuery version will fail e.g. under tbody or select.\n\t\t// This version should also be slightly faster\n\t\tdiv = document.createElement(\"div\");\n\t\twrapper = div;\n\t\tprevIds = ids = \"\";\n\t\thtmlTag = parentNode.namespaceURI === \"http://www.w3.org/2000/svg\" ? \"svg_ns\" : (firstTag = rFirstElem.exec(html)) && firstTag[1] || \"\";\n\t\tif (elCnt) {\n\t\t\t// Now look for following view, and find its tokens, or if not found, get the parentNode._df tokens\n\t\t\tnode = nextNode;\n\t\t\twhile (node && !(nextView = viewInfos(node))) {\n\t\t\t\tnode = node.nextSibling;\n\t\t\t}\n\t\t\tif (tokens = nextView ? nextView._tkns : parentNode._df) {\n\t\t\t\ttoken = prevView || \"\";\n\t\t\t\tif (refresh || !prevView) {\n\t\t\t\t\ttoken += \"#\" + thisId;\n\t\t\t\t}\n\t\t\t\tj = tokens.indexOf(token);\n\t\t\t\tif (j + 1) {\n\t\t\t\t\tj += token.length;\n\t\t\t\t\t// Transfer the initial tokens to inserted nodes, by setting them as the ids variable, picked up in convertMarkers\n\t\t\t\t\tprevIds = ids = tokens.slice(0, j);\n\t\t\t\t\ttokens = tokens.slice(j);\n\t\t\t\t\tif (nextView) {\n\t\t\t\t\t\tnode.setAttribute(jsvAttrStr, tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetDefer(parentNode, tokens);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//================ Convert the markers to DOM annotations, based on content model. ================\n//\t\t\toldElCnt = elCnt;\n\t\tisVoid = undefined;\n\t\thtml = (\"\" + html).replace(rConvertMarkers, convertMarkers);\n//\t\t\tif (!!oldElCnt !== !!elCnt) {\n//\t\t\t\terror(\"Parse: \" + html); // Parse error. Content not well-formed?\n//\t\t\t}\n\t\tif (validate && tagStack.length) {\n\t\t\tsyntaxError(\"Mismatched '<\" + parentTag + \"...>' in:\\n\" + html); // Unmatched tag\n\t\t}\n\t\tif (validateOnly) {\n\t\t\treturn;\n\t\t}\n\t\t// Append wrapper element to doc fragment\n\t\tsafeFragment.appendChild(div);\n\n\t\t// Go to html and back, then peel off extra wrappers\n\t\t// Corresponds to jQuery $(nextNode).before(html) or $(parentNode).html(html);\n\t\t// but supports svg elements, and other features missing from jQuery version (and this version should also be slightly faster)\n\t\thtmlTag = wrapMap[htmlTag] || wrapMap.div;\n\t\tdepth = htmlTag[0];\n\t\twrapper.innerHTML = htmlTag[1] + html + htmlTag[2];\n\t\twhile (depth--) {\n\t\t\twrapper = wrapper.lastChild;\n\t\t}\n\t\tsafeFragment.removeChild(div);\n\t\tfragment = document.createDocumentFragment();\n\t\twhile (copiedNode = wrapper.firstChild) {\n\t\t\tfragment.appendChild(copiedNode);\n\t\t}\n\t\t// Insert into the DOM\n\t\tparentNode.insertBefore(fragment, nextNode);\n\t}\n\n\tif (lazyLink) {\n\t\tsetTimeout(dataLink, 0);\n\t} else {\n\t\tdataLink();\n\t}\n\n\treturn lazyLink && lazyLink.promise();\n}\n\nfunction addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) {\n\t// Add data binding for data-linked elements or {^{...}} data-linked tags\n\tvar tmpl, tokens, attr, convertBack, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, lastIndex,\n\t\tlinkExpressions = [];\n\n\tif (boundTagId) {\n\t\t// boundTagId is a string for {^{...}} data-linked tag. So only one linkTag in linkMarkup\n\t\t// data and context parameters are undefined\n\t\ttag = bindingStore[boundTagId];\n\t\ttag = tag.linkCtx ? tag.linkCtx.tag : tag;\n\n\t\tlinkCtx = tag.linkCtx || {\n\t\t\ttype: \"inline\",\n\t\t\tdata: currentView.data, // source\n\t\t\telem: tag._elCnt ? tag.parentElem : node, // target\n\t\t\tview: currentView,\n\t\t\tctx: currentView.ctx,\n\t\t\tattr: HTML, // Script marker nodes are associated with {^{ and always target HTML.\n\t\t\tfn: tag._.bnd,\n\t\t\ttag: tag,\n\t\t\t// Pass the boundTagId in the linkCtx, so that it can be picked up in observeAndBind\n\t\t\t_bndId: boundTagId\n\t\t};\n\t\tbindDataLinkTarget(linkCtx, linkCtx.fn);\n\t} else if (linkMarkup && node) {\n\t\t// If isLink then this is a top-level linking: .link(expression, target, data, ....) or\n\t\t// .link(true, target, data, ....) scenario - and data and context are passed in separately from the view\n\t\tdata = isLink ? data : currentView.data;\n\n\t\t// Compiled linkFn expressions could be stored in the tmpl.links array of the template\n\t\t// TODO - consider also caching globally so that if {{:foo}} or data-link=\"foo\" occurs in different places,\n\t\t// the compiled template for this is cached and only compiled once...\n\t\t//links = currentView.links || currentView.tmpl.links;\n\n\t\ttmpl = currentView.tmpl;\n\n//\t\t\tif (!(linkTags = links[linkMarkup])) {\n\t\t// This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template.\n\n\t\tlinkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node));\n\t\tlastIndex = rTagDatalink.lastIndex = 0;\n\t\twhile (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \\}(!\\}) option.\n\t\t\tlinkExpressions.push(tokens);\n\t\t\tlastIndex = rTagDatalink.lastIndex;\n\t\t}\n\t\tif (lastIndex < linkMarkup.length) {\n\t\t\tsyntaxError(linkMarkup);\n\t\t}\n\t\twhile (tokens = linkExpressions.shift()) {\n\t\t\t// Iterate over the data-link expressions, for different target attrs,\n\t\t\t// e.g. ~description(firstName, lastName)}\"\n\t\t\t// tokens: [all, attr, bindOnly, tagExpr, tagName, converter, colon, html, comment, code, params]\n\t\t\trTagIndex = rTagDatalink.lastIndex;\n\t\t\tattr = tokens[1];\n\t\t\ttagExpr = tokens[3];\n\t\t\twhile (linkExpressions[0] && linkExpressions[0][4] === \"else\") { // If this is {someTag...} and is followed by an {else...} add to tagExpr\n\t\t\t\ttagExpr += delimCloseChar1 + delimOpenChar0 + linkExpressions.shift()[3];\n\t\t\t\thasElse = true;\n\t\t\t}\n\t\t\tif (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}\n\t\t\t\ttagExpr += delimCloseChar1 + delimOpenChar0 + delimOpenChar1 + \"/\" + tokens[4] + delimCloseChar0;\n\t\t\t}\n\t\t\tlinkCtx = {\n\t\t\t\ttype: isLink ? \"top\" : \"link\",\n\t\t\t\tdata: data, // source\n\t\t\t\telem: node, // target\n\t\t\t\tview: currentView,\n\t\t\t\tctx: context,\n\t\t\t\tattr: attr,\n\t\t\t\tisLk: isLink, // top-level linking?\n\t\t\t\t_toLk : 1, // Flag to data-link on initial data-link call rendering call\n\t\t\t\t_noUpd : tokens[2] // Flag for data-link=\"^{...}\" so on initial data-link call will bind, but not render)\n\t\t\t};\n\n\t\t\tconvertBack = undefined;\n\t\t\tif (tokens[6]) {\n\t\t\t\tconvertBack = tokens[10] || undefined;\n\t\t\t\tlinkCtx.convert = tokens[5] || \"\";\n\t\t\t\tif (!attr && convertBack !== undefined && defaultAttr(node)) {\n\t\t\t\t\t// Default target, so allow 2 way binding\n\t\t\t\t\tlinkCtx.convertBack = convertBack = convertBack.slice(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Compile the linkFn expression which evaluates and binds a data-link expression\n\t\t\t// TODO - optimize for the case of simple data path with no conversion, helpers, etc.:\n\t\t\t// i.e. data-link=\"a.b.c\". Avoid creating new instances of Function every time. Can use a default function for all of these...\n\n\t\t\tlinkCtx.expr = attr + tagExpr;\n\t\t\tlinkFn = tmpl.links[tagExpr];\n\t\t\tif (!linkFn) {\n\t\t\t\ttmpl.links[tagExpr] = linkFn = $sub.tmplFn(tagExpr, tmpl, true, convertBack, hasElse);\n\t\t\t}\n\t\t\tlinkCtx.fn = linkFn;\n\t\t\tbindDataLinkTarget(linkCtx, linkFn);\n\t\t\t// We store rTagIndex in local scope, since this addDataBinding method can sometimes be called recursively,\n\t\t\t// and each is using the same rTagDatalink instance.\n\t\t\trTagDatalink.lastIndex = rTagIndex;\n\t\t}\n//\t\t}\n\t}\n}\n\nfunction bindDataLinkTarget(linkCtx, linkFn) {\n\t// Add data link bindings for a link expression in data-link attribute markup\n\tfunction handler(ev, eventArgs) {\n\t\tpropertyChangeHandler.call(linkCtx, ev, eventArgs, linkFn);\n\t\t// If the link expression uses a custom tag, the propertyChangeHandler call will call renderTag, which will set tagCtx on linkCtx\n\t}\n\thandler.noArray = true;\n\tif (linkCtx.isLk) {\n\t\t// Top-level linking: .link(expressionOrTrue, data, context) - so we need to create a view for the linking, with the data and ctx\n\t\t// which may be different than the current context of the target. Note that this view is not a standard data-linked view, so it will\n\t\t// be disposed only when its parent view is disposed.\n\t\taddLinkMethods(linkCtx.view = new $sub.View(\n\t\t\t$sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx),\n\t\t\t\"link\", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers));\n\t}\n\tlinkCtx._ctxCb = $sub._gccb(linkCtx.view); // getContextCallback: _ctxCb, for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]}\n\tlinkCtx._hdl = handler;\n\t// handler._ctx = linkCtx; Could pass linkCtx for use in a depends = function() {} call, so depends is different for different linkCtx's\n\thandler(true);\n}\n\n//=====================\n// Data-linking helpers\n//=====================\n\nfunction removeSubStr(str, substr) {\n\tvar k;\n\treturn str\n\t\t? (k = str.indexOf(substr),\n\t\t\t(k + 1\n\t\t\t\t? str.slice(0, k) + str.slice(k + substr.length)\n\t\t\t\t: str))\n\t\t: \"\";\n}\n\nfunction markerNodeInfo(node) {\n\treturn node &&\n\t\t(\"\" + node === node\n\t\t\t? node\n\t\t\t: node.tagName === SCRIPT\n\t\t\t\t? node.type.slice(3)\n\t\t\t\t: node.nodeType === 1 && node.getAttribute(jsvAttrStr) || \"\");\n}\n\nfunction viewInfos(node, isVal, rBinding) {\n\t// Test whether node is a script marker node, and if so, return metadata\n\tfunction getInfos(all, open, close, id, ch, elPath) {\n\t\tinfos.push({\n\t\t\telCnt: elCnt,\n\t\t\tid: id,\n\t\t\tch: ch,\n\t\t\topen: open,\n\t\t\tclose: close,\n\t\t\tpath: elPath,\n\t\t\ttoken: all\n\t\t});\n\t}\n\tvar elCnt, tokens,\n\t\tinfos = [];\n\tif (tokens = isVal ? node : markerNodeInfo(node)) {\n\t\telCnt = infos.elCnt = node.tagName !== SCRIPT;\n\t\telCnt = tokens.charAt(0) === \"@\" || elCnt;\n\t\tinfos._tkns = tokens;\n\t\t// rMarkerTokens = /(?:(#)|(\\/))(\\d+)([_^])([-+@\\d]+)?/g;\n\t\ttokens.replace(rBinding || rMarkerTokens, getInfos);\n\t\treturn infos;\n\t}\n}\n\nfunction unmarkPrevOrNextNode(node, elCnt) {\n\tif (node) {\n\t\tif (node.type === \"jsv\") {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t} else if (elCnt && node.getAttribute($viewsLinkAttr) === \"\") {\n\t\t\tnode.removeAttribute($viewsLinkAttr);\n\t\t}\n\t}\n}\n\nfunction markPrevOrNextNode(node, elCnt) {\n\tvar marker = node;\n\twhile (elCnt && marker && marker.nodeType !== 1) {\n\t\tmarker = marker.previousSibling;\n\t}\n\tif (marker) {\n\t\tif (marker.nodeType !== 1) {\n\t\t\t// For text nodes, we will add a script node before\n\t\t\tmarker = document.createElement(SCRIPT);\n\t\t\tmarker.type = \"jsv\";\n\t\t\tnode.parentNode.insertBefore(marker, node);\n\t\t} else if (!markerNodeInfo(marker) && !marker.getAttribute($viewsLinkAttr)) {\n\t\t\t// For element nodes, we will add a data-link attribute (unless there is already one)\n\t\t\t// so that this node gets included in the node linking process.\n\t\t\tmarker.setAttribute($viewsLinkAttr, \"\");\n\t\t}\n\t}\n\treturn marker;\n}\n\nfunction normalizeLinkTag(linkMarkup, twoway) {\n\tlinkMarkup = $.trim(linkMarkup).replace(rEscapeQuotes, \"\\\\$&\");\n\treturn linkMarkup.slice(-1) !== delimCloseChar0\n\t// If simplified syntax is used: data-link=\"expression\", convert to data-link=\"{:expression}\",\n\t// or for inputs, data-link=\"{:expression:}\" for (default) two-way binding\n\t\t? linkMarkup = delimOpenChar1 + \":\" + linkMarkup + (twoway ? \":\" : \"\") + delimCloseChar0\n\t\t: linkMarkup;\n}\n\n//===========================\n// Methods for views and tags\n//===========================\n\nfunction callAfterLink(tag, ev, eventArgs) {\n\tvar linkedElem, displayElem, linkedEl, val, l, linkedTag, oldTrig, newTrig, tagProps, propsExpr, linkedElemView, prop, propDef,\n\t\ttagCtx = tag.tagCtx,\n\t\tview = tagCtx.view,\n\t\tprops = tagCtx.props,\n\t\tlinkCtx = tag.linkCtx;\n\n\tif (tag._.unlinked) { // First call to onAfterLink, or first call after onUpdate: updateContent. Initialize and call onBind and set properties\n\t\tif (tag.linkedElement !== undefined) {\n\t\t\t// linkedElement: - selector for identifying linked element in template/rendered content\n\t\t\ttag.linkedElem = tag._.inline ? tag.contents(true, tag.linkedElement || \"*\").first() : $(linkCtx.elem);\n\t\t}\n\t\tif (tag.onBind) {\n\t\t\ttag.onBind(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t\t}\n\t}\n\n\tif (tag.onAfterLink) {\n\t\ttag.onAfterLink(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t}\n\n\tlinkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem;\n\tdisplayElem = tag.displayElem || linkedElem;\n\n\tif (linkedElem && linkedElem[0]) {\n\t\tval = tag.cvtArgs()[0];\n\t\tif (val !== undefined && !tag._.chging) {\n\t\t\tl = linkedElem.length;\n\t\t\twhile (l--) {\n\t\t\t\tlinkedEl = linkedElem[l];\n\t\t\t\tif (tag._.unlinked && linkedEl !== linkCtx.elem) {\n\t\t\t\t\tlinkedTag = linkedEl._jsvLkEl;\n\t\t\t\t\tif (tag._.inline && (!linkedTag || linkedTag !== tag && linkedTag.targetTag !== tag)) {\n\t\t\t\t\t\t// For data-linked tags, identify the linkedEl with the tag, for \"to\" binding\n\t\t\t\t\t\t// (For data-linked elements, if not yet bound, we identify later when the linkCtx.elem is bound)\n\t\t\t\t\t\tlinkedEl._jsvLkEl = tag;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag, linkedEl);\n\t\t\t\t\t\tlinkedEl._jsvBnd = \"&\" + tag._tgId + \"+\"; // Add a \"+\" for cloned binding - so removing\n\t\t\t\t\t\t// elems with cloned bindings will not remove the 'parent' binding from the bindingStore.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (val !== undefined) {\n\t\t\t\t\tif (linkedEl.value !== undefined) {\n\t\t\t\t\t\tif (linkedEl.type === CHECKBOX) {\n\t\t\t\t\t\t\tlinkedEl[CHECKED] = val && val !== \"false\";\n\t\t\t\t\t\t} else if (linkedEl.type === RADIO) {\n\t\t\t\t\t\t\tlinkedEl[CHECKED] = (linkedEl.value === val);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(linkedEl).val(val); // Use jQuery for attrHooks - can't just set value (on select, for example)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (linkedEl.contentEditable === TRUE) {\n\t\t\t\t\t\tlinkedEl.innerHTML = val;\n\t\t\t\t\t}\n\t\t\t\t\tlinkCtx._val = val;\n\t\t\t\t}\n\t\t\t\tif (props.name) {\n\t\t\t\t\tlinkedEl.name = linkedEl.name || props.name;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tag.setSize) {\n\t\t\tif (props.height) {\n\t\t\t\tdisplayElem.height(props.height);\n\t\t\t}\n\t\t\tif (props.width) {\n\t\t\t\tdisplayElem.width(props.width);\n\t\t\t}\n\t\t}\n\t\tif (props.title !== undefined) {\n\t\t\tdisplayElem.attr(\"title\", props.title);\n\t\t}\n\t\tif (props[\"class\"]) {\n\t\t\t// This code supports dynamic binding to class - where it adds the class if absent, and removes/adds if a previous value is present\n\t\t\tif (eventArgs && displayElem.hasClass(eventArgs.oldValue)) {\n\t\t\t\tdisplayElem.removeClass(eventArgs.oldValue);\n\t\t\t}\n\t\t\tdisplayElem.addClass(props[\"class\"]);\n\t\t}\n\t\tif (props.id) {\n\t\t\tlinkedElem[0].id = props.id;\n\t\t}\n\t}\n\ttag._.unlinked = undefined;\n}\n\nfunction asyncElemChangeHandler(ev) {\n\tsetTimeout(function() {\n\t\telemChangeHandler(ev);\n\t}, 0);\n}\n\nfunction bindElChange($elem, trig, onoff) {\n\tif (trig) {\n\t\ttrig = \"\" + trig === trig ? trig : \"keydown\"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown'): Get 'keydown' with async\n\t\t$elem[onoff](trig, trig === \"keydown\" ? asyncElemChangeHandler : elemChangeHandler);\n\t}\n}\n\nfunction bindTo(binding, tag, linkedElem, cvtBk) {\n\t// Two-way binding.\n\t// We set the binding.to[1] to be the cvtBack, and binding.to[0] to be either the path to the target, or [object, path] where the target is the path on the provided object.\n\t// So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, \"d.e\"], and we bind to the path on the returned object, exprOb.ob, as target\n\t// Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z\n\n\tvar bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l,\n\t\tlinkCtx = binding.linkCtx,\n\t\tcontextCb = linkCtx._ctxCb,\n\t\tsource = linkCtx.data,\n\t\tpaths = linkCtx.fn.paths[0];\n\n\ttag = tag || linkedElem._jsvLkEl;\n\n\tif (binding && paths && !binding.to) {\n\t\toldTrig = linkedElem._jsvTr || false;\n\t\tif (tag) {\n\t\t\tcvtBk = tag.convertBack || cvtBk;\n\t\t\tnewTrig = tag.tagCtx.props.trigger;\n\t\t}\n\t\tnewTrig = newTrig === undefined ? $subSettings.trigger : newTrig;\n\t\t// Trigger is noop except for text box, textarea, contenteditable...\n\t\tnewTrig = newTrig && (linkedElem.tagName === \"INPUT\" && linkedElem.type !== CHECKBOX && linkedElem.type !== RADIO || linkedElem.type === \"textarea\" || linkedElem.contentEditable === TRUE) && newTrig || false;\n\n\t\tif (oldTrig !== newTrig) {\n\t\t\t$linkedElem = $(linkedElem);\n\t\t\tbindElChange($linkedElem, oldTrig, \"off\");\n\t\t\tbindElChange(\n\t\t\t\t$linkedElem,\n\t\t\t\tlinkedElem._jsvTr = newTrig,\n\t\t\t\t\"on\"\n\t\t\t);\n\t\t}\n\n\t\tpaths = (bindto = paths._jsvto) || paths[0];\n\t\tif (pathIndex = paths && paths.length) {\n\t\t\tlastPath = paths[pathIndex - 1];\n\t\t\tif (lastPath._jsv) {\n\t\t\t\tbindtoOb = lastPath;\n\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t}\n\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t}\n\t\t\tif (path) {\n\t\t\t\tto = [\n\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\tlastPath\n\t\t\t\t\t];\n\t\t\t} else {\n\t\t\t\twhile ((to = contextCb(path = lastPath.split(\"^\").join(\".\"), source)) && (l = to.length)) {\n\t\t\t\t\t// Recursively dereference any ~foo or #bar tokens in the path. (Recursive because ~foo may be a contextual param which has\n\t\t\t\t\t// its own dependencies on other ~foo #bar components)\n\t\t\t\t\tif (to[0]._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag)\n\t\t\t\t\t\tto = to[0]; // so 'to' is the [view, expression/dependencies] for the contextual parameter\n\t\t\t\t\t\tcontextCb = $sub._gccb(to[0]); // getContextCallback: Move contextCb up to view where contextual parameter was assigned\n\t\t\t\t\t\tlastPath = to[1];\n\t\t\t\t\t\tto = [to[0].data, to[1]];\n\t\t\t\t\t\tif (lastPath._jsv) { // computed value\n\t\t\t\t\t\t\tbindtoOb = lastPath;\n\t\t\t\t\t\t\tbindtoOb.data = to[0];\n\t\t\t\t\t\t\tbindtoOb._cpCtx = contextCb;\n\t\t\t\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t\t\t\t\tto = [\n\t\t\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\t\t\tlastPath\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else { // Two-way binding to a helper - e.g. ~address.street, or computed, e.g. ~fullName(), or view property e.g. #data.foo\n\t\t\t\t\t\tto = l>2\n\t\t\t\t\t\t\t? [to[l-3], to[l-2]] // With path: [object, path]\n\t\t\t\t\t\t\t: [to[l-2]]; // No path, (e.g. [function] for computed with setter)\n\t\t\t\t\t}\n\t\t\t\t\tsource = to[0];\n\t\t\t\t\tlastPath = to[1];\n\t\t\t\t}\n\t\t\t\tto = to || [source, path]; // Two way binding to an object (neither ~foo nor #bar)\n\t\t\t}\n\t\t} else {\n\t\t\tto = [];\n\t\t}\n\t\tbinding.to = [\n\t\t\tto,\n\t\t\tcvtBk\n\t\t];\n\t}\n}\n\nfunction mergeCtxs(tag, newCtxs, replace) { // Merge updated tagCtxs into tag.tagCtxs\n\tvar tagCtx, newTagCtx,\n\t\tview = tag.tagCtx.view,\n\t\ttagCtxs = tag.tagCtxs || [tag.tagCtx],\n\t\tl = tagCtxs.length,\n\t\trefresh = !newCtxs;\n\n\tnewCtxs = newCtxs || tag._.bnd.call(view.tmpl, (tag.linkCtx || view).data, view, $sub);\n\n\tif (replace) {\n\t\t// Replace previous tagCtxs by new ones, rather than merging\n\t\ttagCtxs = tag.tagCtxs = newCtxs;\n\t\ttag.tagCtx = tagCtxs[0];\n\t} else {\n\t\twhile (l--) {\n\t\t\ttagCtx = tagCtxs[l];\n\t\t\tnewTagCtx = newCtxs[l];\n\t\t\t$observable(tagCtx.props).setProperty(newTagCtx.props);\n\t\t\t$extend(tagCtx.ctx, newTagCtx.ctx); // We don't support propagating ctx variables, ~foo, observably, to nested views. So extend, not setProperty...\n\t\t\ttagCtx.args = newTagCtx.args;\n\t\t\tif (refresh) {\n\t\t\t\ttagCtx.tmpl = newTagCtx.tmpl;\n\t\t\t}\n\t\t}\n\t}\n\t$sub._ths(tag, tagCtxs[0]); // tagHandlersFromProps\n\treturn tagCtxs;\n}\n\n//=========\n// Disposal\n//=========\n\nfunction clean(elems) {\n\t// Remove data-link bindings, or contained views\n\tvar l, elem, bindings,\n\t\telemArray = [],\n\t\tlen = elems.length,\n\t\ti = len;\n\twhile (i--) {\n\t\t// Copy into an array, so that deletion of nodes from DOM will not cause our 'i' counter to get shifted\n\t\t// (Note: This seems as fast or faster than elemArray = [].slice.call(elems); ...)\n\t\telemArray.push(elems[i]);\n\t}\n\ti = len;\n\twhile (i--) {\n\t\telem = elemArray[i];\n\t\tif (elem.parentNode) {\n\t\t\t// Has not already been removed from the DOM\n\t\t\tif (bindings = elem._jsvBnd) {\n\t\t\t\t// Get propertyChange bindings for this element\n\t\t\t\t// This may be an element with data-link, or the opening script marker node for a data-linked tag {^{...}}\n\t\t\t\t// bindings is a string with the syntax: \"(&bindingId)*\"\n\t\t\t\tbindings = bindings.slice(1).split(\"&\");\n\t\t\t\telem._jsvBnd = \"\";\n\t\t\t\tl = bindings.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\t// Remove associated bindings\n\t\t\t\t\tremoveViewBinding(bindings[l], elem._jsvLkEl, elem); // unbind bindings with this bindingId on this view\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisposeTokens(markerNodeInfo(elem) + (elem._df || \"\"));\n\t\t}\n\t}\n}\n\nfunction removeViewBinding(bindId, linkedElemTag, elem) {\n\t// Unbind\n\tvar objId, linkCtx, tag, object, obsId, tagCtxs, l, map, $linkedElem, linkedElem, trigger, view, targetTag,\n\t\tbinding = bindingStore[bindId];\n\n\tif (linkedElemTag) {\n\t\tlinkedElemTag = linkedElemTag.targetTag || linkedElemTag;\n\t\telem._jsvLkEl = undefined;\n\t} else if (binding) {\n\t\tdelete bindingStore[bindId]; // Delete already, so call to onDispose handler below cannot trigger recursive deletion (through recursive call to jQuery cleanData)\n\t\tfor (objId in binding.bnd) {\n\t\t\tobject = binding.bnd[objId];\n\t\t\tobsId = binding.cbId;\n\t\t\tif ($isArray(object)) {\n\t\t\t\t$([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange\n\t\t\t} else {\n\t\t\t\t$(object).off(propertyChangeStr + obsId);\n\t\t\t}\n\t\t\tdelete binding.bnd[objId];\n\t\t}\n\n\t\tif (linkCtx = binding.linkCtx) {\n\t\t\tif (tag = linkCtx.tag) {\n\t\t\t\tif (tagCtxs = tag.tagCtxs) {\n\t\t\t\t\tl = tagCtxs.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\tif (map = tagCtxs[l].map) {\n\t\t\t\t\t\t\tmap.unmap(); //unobserve\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$linkedElem = tag.linkedElem;\n\n\t\t\t\tif (tag.onUnbind) {\n\t\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx, true);\n\t\t\t\t}\n\t\t\t\tif (tag.onDispose) {\n\t\t\t\t\ttag.onDispose();\n\t\t\t\t}\n\n\t\t\t\tif (!tag._elCnt) {\n\t\t\t\t\tif (tag._prv) {\n\t\t\t\t\t\ttag._prv.parentNode.removeChild(tag._prv);\n\t\t\t\t\t}\n\t\t\t\t\tif (tag._nxt) {\n\t\t\t\t\t\ttag._nxt.parentNode.removeChild(tag._nxt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlinkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;\n\n\t\t\tif (trigger = linkedElem && linkedElem._jsvTr) {\n\t\t\t\tbindElChange($linkedElem || $(linkedElem), trigger, \"off\");\n\t\t\t\tlinkedElem._jsvTr = undefined;\n\t\t\t}\n\t\t\tview = linkCtx.view;\n\t\t\tif (view.type === \"link\") {\n\t\t\t\tview.parent.removeViews(view._.key, undefined, true); // A \"link\" view is associated with the binding, so should be disposed with binding.\n\t\t\t} else {\n\t\t\t\tdelete view._.bnds[bindId];\n\t\t\t}\n\t\t}\n\t\tdelete binding.s[binding.cbId];\n\t}\n}\n\nfunction $unlink(to) {\n\tif (to) {\n\t\tto = to.jquery ? to : $(to);\n\t\tto.each(function() {\n\t\t\tvar innerView;\n\t\t\t//TODO fix this for better perf. Rather that calling inner view multiple times which does querySelectorAll each time, consider a single querySelectorAll\n\t\t\t// or simply call view.removeViews() on the top-level views under the target 'to' node, then clean(...)\n\t\t\twhile ((innerView = $view(this, true)) && innerView.parent) {\n\t\t\t\tinnerView.parent.removeViews(innerView._.key, undefined, true);\n\t\t\t}\n\t\t\tclean(this.getElementsByTagName(\"*\"));\n\t\t});\n\t\tclean(to);\n\t} else {\n\t\t// Call to $.unlink() is equivalent to $.unlink(true, \"body\")\n\t\tif (activeBody) {\n\t\t\t$(activeBody)\n\t\t\t\t.off(elementChangeStr, elemChangeHandler)\n\t\t\t\t.off('blur', '[contenteditable]', elemChangeHandler);\n\t\t\tactiveBody = undefined;\n\t\t}\n\t\ttopView.removeViews();\n\t\tclean(document.body.getElementsByTagName(\"*\"));\n\t}\n}\n\n//========\n// Helpers\n//========\n\nfunction inputAttrib(elem) {\n\treturn elem.type === CHECKBOX ? elem[CHECKED] : elem.value;\n}\n\n//========================== Initialize ==========================\n\n//=====================\n// JsRender integration\n//=====================\n\n$sub.onStore.template = function(name, item) {\n\titem.link = tmplLink;\n\tif (name) {\n\t\t$.link[name] = function() {\n\t\t\treturn tmplLink.apply(item, arguments);\n\t\t};\n\t}\n};\n\n$sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method\n\n// Define JsViews version of delimiters(), and initialize\n($viewsSettings.delimiters = function() {\n\t// Run delimiters initialization in context of jsrender.js\n\tvar ret = oldJsvDelimiters.apply(0, arguments),\n\t\t// Now set also delimOpenChar0 etc. in context of jquery.views.js...\n\t\tdelimChars = $subSettings.delimiters;\n\n\tdelimOpenChar0 = delimChars[0].charAt(0);\n\tdelimOpenChar1 = delimChars[0].charAt(1);\n\tdelimCloseChar0 = delimChars[1].charAt(0);\n\tdelimCloseChar1 = delimChars[1].charAt(1);\n\tlinkChar = delimChars[2];\n\n\t// Data-linking must use new delimiters\n\trTagDatalink = new RegExp(\"(?:^|\\\\s*)([\\\\w-]*)(\\\\\" + linkChar + \")?(\\\\\" + delimOpenChar1 + $sub.rTag + \"(:\\\\w*)?\\\\\" + delimCloseChar0 + \")\", \"g\");\n\treturn ret;\n})(); // jshint ignore:line\n\n$sub.addSetting(\"trigger\");\n\n//====================================\n// Additional members for linked views\n//====================================\n\nfunction transferViewTokens(prevNode, nextNode, parentElem, id, viewOrTagChar, refresh) {\n\t// Transfer tokens on prevNode of viewToRemove/viewToRefresh to nextNode or parentElem._df\n\tvar i, l, vwInfos, vwInfo, viewOrTag, viewId, tokens,\n\t\tprecedingLength = 0,\n\t\temptyView = prevNode === nextNode;\n\n\tif (prevNode) {\n\t\t// prevNode is either the first node in the viewOrTag, or has been replaced by the vwInfos tokens string\n\t\tvwInfos = viewInfos(prevNode) || [];\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\t// Step through views or tags on the prevNode\n\t\t\tvwInfo = vwInfos[i];\n\t\t\tviewId = vwInfo.id;\n\t\t\tif (viewId === id && vwInfo.ch === viewOrTagChar) {\n\t\t\t\tif (refresh) {\n\t\t\t\t\t// This is viewOrTagToRefresh, this is the last viewOrTag to process...\n\t\t\t\t\tl = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// This is viewOrTagToRemove, so we are done...\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!emptyView) {\n\t\t\t\tviewOrTag = vwInfo.ch === \"_\"\n\t\t\t\t\t? viewStore[viewId]\n\t\t\t\t\t: bindingStore[viewId].linkCtx.tag;\n\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t// A \"#m\" token\n\t\t\t\t\tviewOrTag._prv = nextNode;\n\t\t\t\t} else if (vwInfo.close) {\n\t\t\t\t\t// A \"/m\" token\n\t\t\t\t\tviewOrTag._nxt = nextNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprecedingLength += viewId.length + 2;\n\t\t}\n\n\t\tif (precedingLength) {\n\t\t\tprevNode.setAttribute(jsvAttrStr, prevNode.getAttribute(jsvAttrStr).slice(precedingLength));\n\t\t}\n\t\ttokens = nextNode ? nextNode.getAttribute(jsvAttrStr) : parentElem._df;\n\t\tif (l = tokens.indexOf(\"/\" + id + viewOrTagChar) + 1) {\n\t\t\ttokens = vwInfos._tkns.slice(0, precedingLength) + tokens.slice(l + (refresh ? -1 : id.length + 1));\n\t\t}\n\t\tif (tokens) {\n\t\t\tif (nextNode) {\n\t\t\t\t// If viewOrTagToRemove was an empty viewOrTag, we will remove both #n and /n\n\t\t\t\t// (and any intervening tokens) from the nextNode (=== prevNode)\n\t\t\t\t// If viewOrTagToRemove was not empty, we will take tokens preceding #n from prevNode,\n\t\t\t\t// and concatenate with tokens following /n on nextNode\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, tokens);\n\t\t\t} else {\n\t\t\t\tsetDefer(parentElem, tokens);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// !prevNode, so there may be a deferred nodes token on the parentElem. Remove it.\n\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + viewOrTagChar));\n\t\tif (!refresh && !nextNode) {\n\t\t\t// If this viewOrTag is being removed, and there was no .nxt, remove closing token from deferred tokens\n\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + viewOrTagChar));\n\t\t}\n\t}\n}\n\nfunction disposeTokens(tokens) {\n\tvar i, l, vwItem, vwInfos;\n\tif (vwInfos = viewInfos(tokens, true, rOpenMarkers)) {\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\tvwItem = vwInfos[i];\n\t\t\tif (vwItem.ch === \"_\") {\n\t\t\t\tif ((vwItem = viewStore[vwItem.id]) && vwItem.type) {\n\t\t\t\t\t// If this is the _prv (prevNode) for a view, remove the view\n\t\t\t\t\t// - unless view.type is undefined, in which case it is already being removed\n\t\t\t\t\tvwItem.parent.removeViews(vwItem._.key, undefined, true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveViewBinding(vwItem.id); // unbind bindings with this bindingId on this view\n\t\t\t}\n\t\t}\n\t}\n}\n\n//====================================\n// Add link methods to data-linked view or tag\n//====================================\nfunction addLinkMethods(tagOrView, isTag) {\n\n\ttagOrView.contents = function(deep, select) {\n\t\t// For a view or a tag, return jQuery object with the content nodes,\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is contents(selector)\n\t\t\tselect = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\t\tvar filtered,\n\t\t\tnodes = $(this.nodes());\n\t\tif (nodes[0]) {\n\t\t\tfiltered = select ? nodes.filter(select) : nodes;\n\t\t\tnodes = deep && select ? filtered.add(nodes.find(select)) : filtered;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.nodes = function(withMarkers, prevNode, nextNode) {\n\t\t// For a view or a tag, return top-level nodes\n\t\t// Do not return any script marker nodes, unless withMarkers is true\n\t\t// Optionally limit range, by passing in prevNode or nextNode parameters\n\n\t\tvar node,\n\t\t\tself = this,\n\t\t\telCnt = self._elCnt,\n\t\t\tprevIsFirstNode = !prevNode && elCnt,\n\t\t\tnodes = [];\n\n\t\tprevNode = prevNode || self._prv;\n\t\tnextNode = nextNode || self._nxt;\n\n\t\tnode = prevIsFirstNode\n\t\t\t? (prevNode === self._nxt\n\t\t\t\t? self.parentElem.lastSibling\n\t\t\t\t: prevNode)\n\t\t\t: (self._.inline === false\n\t\t\t\t? prevNode || self.linkCtx.elem.firstChild\n\t\t\t\t: prevNode && prevNode.nextSibling);\n\n\t\twhile (node && (!nextNode || node !== nextNode)) {\n\t\t\tif (withMarkers || elCnt || node.tagName !== SCRIPT) {\n\t\t\t\t// All the top-level nodes in the view\n\t\t\t\t// (except script marker nodes, unless withMarkers = true)\n\t\t\t\t// (Note: If a script marker node, viewInfo.elCnt undefined)\n\t\t\t\tnodes.push(node);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.childTags = function(deep, tagName) {\n\t\t// For a view or a tag, return child tags - at any depth, or as immediate children only.\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is childTags(tagName) - which looks for top-level tags of given tagName\n\t\t\ttagName = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\n\t\tvar self = this,\n\t\t\tview = self.link ? self : self.tagCtx.view, // this may be a view or a tag. If a tag, get the view from tag.view.tagCtx\n\t\t\tprevNode = self._prv,\n\t\t\telCnt = self._elCnt,\n\t\t\ttags = [];\n\n\t\tview.link(\n\t\t\tundefined,\n\t\t\tself.parentElem,\n\t\t\telCnt ? prevNode && prevNode.previousSibling : prevNode,\n\t\t\tself._nxt,\n\t\t\tundefined,\n\t\t\t{get:{\n\t\t\t\ttags: tags,\n\t\t\t\tdeep: deep,\n\t\t\t\tname: tagName,\n\t\t\t\tid: self.link ? self._.id + \"_\" : self._tgId + \"^\"\n\t\t\t}}\n\t\t);\n\t\treturn tags;\n\t};\n\n\ttagOrView.refresh = function(sourceValue) {\n\t\tvar promise, attr,\n\t\t\ttag = this,\n\t\t\tlinkCtx = tag.linkCtx,\n\t\t\tview = tag.tagCtx.view;\n\n\t\tif (tag.disposed) { error(\"Removed tag\"); }\n\t\tif (sourceValue === undefined) {\n\t\t\tsourceValue = $sub._tag(tag, view, view.tmpl, mergeCtxs(tag), true); // Get rendered HTML for tag, based on refreshed tagCtxs\n\t\t}\n\t\tif (sourceValue + \"\" === sourceValue) {\n\t\t\t// If no rendered content, sourceValue will not be a string (can be 0 or undefined)\n\t\t\tif (tag.onUnbind) {\n\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx);\n\t\t\t}\n\t\t\tattr = tag._.inline ? HTML : (linkCtx.attr || defaultAttr(tag.parentElem, true));\n\t\t\tpromise = updateContent(sourceValue, linkCtx, attr, tag);\n\t\t}\n\n\t\tcallAfterLink(tag);\n\t\treturn promise || tag;\n\t};\n\n\ttagOrView.update = function(value) {\n\t\tvar linkedElem = this.linkedElem;\n\t\tif (linkedElem) {\n\t\t\telemChangeHandler({\n\t\t\t\ttarget: linkedElem[0]\n\t\t\t}, undefined, value);\n\t\t}\n\t};\n\n\tif (isTag) {\n\t\t// This is a TAG\n\t\ttagOrView.domChange = function() { // domChange notification support\n\t\t\tvar elem = this.parentElem,\n\t\t\t\thasListener = $.hasData(elem) && $._data(elem).events,\n\t\t\t\tdomChangeNotification = \"jsv-domchange\";\n\n\t\t\tif (hasListener && hasListener[domChangeNotification]) {\n\t\t\t\t// Only trigger handler if there is a handler listening for this event. (Note using triggerHandler - so no event bubbling.)\n\t\t\t\t$(elem).triggerHandler(domChangeNotification, arguments);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// This is a VIEW\n\t\t// Note: a linked view will also, after linking have nodes[], _prv (prevNode), _nxt (nextNode) ...\n\t\ttagOrView.addViews = function(index, dataItems) {\n\t\t\t// if view is not an array view, do nothing\n\t\t\tvar i, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\titemsCount = dataItems.length,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (!self._.useKey && itemsCount) {\n\t\t\t\t// view is of type \"array\"\n\t\t\t\tviewsCount = views.length + itemsCount;\n\n\t\t\t\tif (viewsCount === self.data.length // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\t\t&& renderAndLink(self, index, self.tmpl, views, dataItems, self.ctx) !== false) {\n\t\t\t\t\tif (!self._.srt) { // Not part of a 'sort' on refresh\n\t\t\t\t\t\tself.fixIndex(index + itemsCount);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.removeViews = function(index, itemsCount, keepNodes, isMove) {\n\t\t\t// view.removeViews() removes all the child views\n\t\t\t// view.removeViews(index) removes the child view with specified index or key\n\t\t\t// view.removeViews(index, count) removes the specified nummber of child views, starting with the specified index\n\t\t\tfunction removeView(index) {\n\t\t\t\tvar id, bindId, parentElem, prevNode, nextNode, nodesToRemove,\n\t\t\t\t\tviewToRemove = views[index];\n\n\t\t\t\tif (viewToRemove && viewToRemove.link) {\n\t\t\t\t\tid = viewToRemove._.id;\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tnodesToRemove = viewToRemove.nodes();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove child views, without removing nodes\n\t\t\t\t\tviewToRemove.removeViews(undefined, undefined, true);\n\n\t\t\t\t\tviewToRemove.type = undefined; // Set type to undefined: used as a flag that this view is being removed\n\t\t\t\t\tprevNode = viewToRemove._prv;\n\t\t\t\t\tnextNode = viewToRemove._nxt;\n\t\t\t\t\tparentElem = viewToRemove.parentElem;\n\t\t\t\t\t// If prevNode and nextNode are the same, the view is empty\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tif (viewToRemove._elCnt) {\n\t\t\t\t\t\t\t// if keepNodes is false (and transferring of tokens has not already been done at a higher level)\n\t\t\t\t\t\t\t// then transfer tokens from prevNode which is being removed, to nextNode.\n\t\t\t\t\t\t\ttransferViewTokens(prevNode, nextNode, parentElem, id, \"_\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(nodesToRemove).remove();\n\t\t\t\t\t}\n\t\t\t\t\tif (!viewToRemove._elCnt) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tprevNode.parentNode.removeChild(prevNode); // (prevNode.parentNode is parentElem, except if jQuery Mobile or similar has inserted an intermediate wrapper\n\t\t\t\t\t\t\tnextNode.parentNode.removeChild(nextNode);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t\tsetArrayChangeLink(viewToRemove);\n\t\t\t\t\tfor (bindId in viewToRemove._.bnds) {\n\t\t\t\t\t\tremoveViewBinding(bindId);\n\t\t\t\t\t}\n\t\t\t\t\tdelete viewStore[id];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar current, view, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\tisArray = !self._.useKey,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (isArray) {\n\t\t\t\tviewsCount = views.length;\n\t\t\t}\n\t\t\tif (index === undefined) {\n\t\t\t\t// Remove all child views\n\t\t\t\tif (isArray) {\n\t\t\t\t\t// views and data are arrays\n\t\t\t\t\tcurrent = viewsCount;\n\t\t\t\t\twhile (current--) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = [];\n\t\t\t\t} else {\n\t\t\t\t\t// views and data are objects\n\t\t\t\t\tfor (view in views) {\n\t\t\t\t\t\t// Remove by key\n\t\t\t\t\t\tremoveView(view);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = {};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (itemsCount === undefined) {\n\t\t\t\t\tif (isArray) {\n\t\t\t\t\t\t// The parentView is data array view.\n\t\t\t\t\t\t// Set itemsCount to 1, to remove this item\n\t\t\t\t\t\titemsCount = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Remove child view with key 'index'\n\t\t\t\t\t\tremoveView(index);\n\t\t\t\t\t\tdelete views[index];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isArray && itemsCount\n\t\t\t\t\t&& (isMove || viewsCount - itemsCount === self.data.length)) { // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\tcurrent = index + itemsCount;\n\t\t\t\t\t// Remove indexed items (parentView is data array view);\n\t\t\t\t\twhile (current-- > index) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tviews.splice(index, itemsCount);\n\t\t\t\t\tif (!self._.sort) {\n\t\t\t\t\t\tself.fixIndex(index);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.refresh = function() {\n\t\t\tvar self = this,\n\t\t\t\tparent = self.parent;\n\n\t\t\tif (parent) {\n\t\t\t\trenderAndLink(self, self.index, self.tmpl, parent.views, self.data, undefined, true);\n\t\t\t\tsetArrayChangeLink(self);\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.fixIndex = function(fromIndex) {\n\t\t\t// Fixup index on following view items...\n\t\t\tvar views = this.views,\n\t\t\t\tindex = views.length;\n\t\t\twhile (fromIndex < index--) {\n\t\t\t\tif (views[index].index !== index) {\n\t\t\t\t\t$observable(views[index]).setProperty(\"index\", index);\n\t\t\t\t\t// This is fixing up index, but not key, and not index on child views. From child views, use view.getIndex()\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.link = viewLink;\n\t}\n}\n\n//========================\n// JsViews-specific converters\n//========================\n\n$converters.merge = function(val) {\n\t// Special converter used in data-linking to space-separated lists, such as className:\n\t// Currently only supports toggle semantics - and has no effect if toggle string is not specified\n\t// data-link=\"class{merge:boolExpr toggle=className}\"\n\tvar regularExpression,\n\t\tcurrentValue = this.linkCtx._val || \"\",\n\t\ttoggle = this.tagCtx.props.toggle;\n\n\tif (toggle) {\n\t\t// We are toggling the class specified by the toggle property,\n\t\t// and the boolean val binding is driving the insert/remove toggle\n\n\t\tregularExpression = toggle.replace(/[\\\\^$.|?*+()[{]/g, \"\\\\$&\");\n\t\t// Escape any regular expression special characters (metacharacters) within the toggle string\n\t\tregularExpression = \"(\\\\s(?=\" + regularExpression + \"$)|(\\\\s)|^)(\" + regularExpression + \"(\\\\s|$))\";\n\t\t// Example: /(\\s(?=myclass$)|(\\s)|^)?(myclass(\\s|$))/ - so matches (\" myclass\" or \" \" or ^ ) followed by (\"myclass \" or \"myclass$\") where ^/$ are beginning/end of string\n\t\tcurrentValue = currentValue.replace(new RegExp(regularExpression), \"$2\");\n\t\tval = currentValue + (val ? (currentValue && \" \") + toggle : \"\");\n\t}\n\treturn val;\n};\n\n//========================\n// JsViews-specific tags\n//========================\n\nfunction keepParentDataCtx(val) {\n\treturn this.tagCtx.view; // Return the parent view as data context for rendering block content\n}\n\n$tags({\n\ton: {\n\t\tattr: NONE,\n\t\tinit: function(tagCtx) {\n\t\t\tvar content,\n\t\t\t\ttag = this,\n\t\t\t\ti = 0,\n\t\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\t\tl = args.length;\n\n\t\t\tfor (; ii && i+1; // handler index\n\t\t\tif (tag._.inline) {\n\t\t\t\tif (!$sub.rTmpl.exec(content = tagCtx.tmpl.markup)) {\n\t\t\t\t\t// Inline {^{on}} tag with no content (or external template content) or with content containing\n\t\t\t\t\t// no HTML or JsRender tags: We will wrap the (text) content, or the operation name in a \";\n\t\t\t\t}\n\t\t\t\ttag.attr = HTML;\n\t\t\t}\n\t\t},\n\t\tonAfterLink: function(tagCtx, linkCtx) {\n\t\t\tvar handler, params, find, activeElem,\n\t\t\t\ttag = this,\n\t\t\t\ti = tag._hi,\n\t\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\t\tl = args.length,\n\t\t\t\tprops = tagCtx.props,\n\t\t\t\tdata = props.data,\n\t\t\t\tview = tagCtx.view,\n\t\t\t\tcontextOb = props.context; // Context ('this' pointer) for attached handler\n\n\t\t\tif (i) { // There is a handler\n\t\t\t\thandler = args[i-1];\n\t\t\t\tparams = args.slice(i); // Subsequent args are params\n\t\t\t\targs = args.slice(0, i-1); // Preceding args (if any) are events and selector\n\t\t\t\ttag._sel = args[1]; // Selector for descendant elements - for delegated events on those elements, delegating to the activeElem\n\n\t\t\t\tactiveElem = tag.activeElem = tag.activeElem || $(tag._.inline\n\t\t\t\t\t? (tag._sel = args[1] || \"*\", tag.parentElem)\n\t\t\t\t\t// If inline, attach to child elements of tag parent element (filtered by selector argument if provided.\n\t\t\t\t\t// (In handler we'll filter out events from sibling elements preceding or following tag.)\n\t\t\t\t\t// This allows us to use the delegated pattern where the attached event works even for added elements satisfying the selector\n\t\t\t\t\t: linkCtx.elem);\n\n\t\t\t\tif (!contextOb) {\n\t\t\t\t\t// Get the path for the preceding object (context object) of handler (which is the last arg), compile function\n\t\t\t\t\t// to return that context object, and run compiled function against data\n\t\t\t\t\tcontextOb = /^(.*)[\\.^][\\w$]+$/.exec(tagCtx.params.args.slice(-params.length - 1)[0]);\n\t\t\t\t\tcontextOb = contextOb && $sub.tmplFn(delimOpenChar1 + \":\" + contextOb[1] + delimCloseChar0, view.tmpl, true)(linkCtx.data, view);\n\t\t\t\t}\n\n\t\t\t\tif (tag._evs) {\n\t\t\t\t\ttag.onUnbind();\n\t\t\t\t}\n\n\t\t\t\tactiveElem.on(\n\t\t\t\t\ttag._evs = args[0] || \"click\", // events defaults to \"click\"\n\t\t\t\t\ttag._sel,\n\t\t\t\t\tdata == undefined ? null : data,\n\t\t\t\t\ttag._hlr = function hndlr(ev) {\n\t\t\t\t\t\tvar nodes, length,\n\t\t\t\t\t\t\tfound = !tag._.inline;\n\n\t\t\t\t\t\tif (!found) { // If inline, filter out events from sibling elements preceding or following tag.\n\t\t\t\t\t\t\tnodes = tag.contents(\"*\");\n\t\t\t\t\t\t\tl = nodes.length;\n\t\t\t\t\t\t\twhile (!found && l--) {\n\t\t\t\t\t\t\t\tif (nodes[l].contains(ev.target)) {\n\t\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (found) { // target elem is indeed within the tag, so call the {on} handler\n\t\t\t\t\t\t\treturn handler.apply(contextOb || linkCtx.data, [].concat(\n\t\t\t\t\t\t\t\tparams, // e.g. par1, par2\n\t\t\t\t\t\t\t\tev,\n\t\t\t\t\t\t\t\t{change: ev.type, view: view, linkCtx: linkCtx},\n\t\t\t\t\t\t\t\tparams.slice.call(arguments, 1) // If triggering event (e.g. jsv-domchange) has additional arguments after ev, pass them too\n\t\t\t\t\t\t\t));\n\t\t\t\t\t\t\t// for {on 'click' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs)\n\t\t\t\t\t\t\t// for {on 'jsv-domchange' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs, tagCtx, linkCtx, observableEventArgs)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tonUpdate: function() {\n\t\t\treturn false;\n\t\t},\n\t\tonUnbind: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.activeElem) {\n\t\t\t\tself.activeElem.off(self._evs, self._sel, self._hlr);\n\t\t\t}\n\t\t},\n\t\tflow: true,\n\t\tcontentCtx: keepParentDataCtx,\n\t\tdataBoundOnly: true\n\t},\n\tradiogroup: {\n\t\tinit: function(tagCtx) {\n\t\t\tthis.name = tagCtx.props.name || (\"jsv\" + Math.random());\n\t\t},\n\t\tonBind: function(tagCtx, linkCtx) {\n\t\t\tvar domChngCntnr,\n\t\t\t\ttag = this,\n\t\t\t\t$linkedElem = tag.linkedElem = (tag._.inline ? tag.contents(true, \"input[type=radio]\") : $(linkCtx.elem).find(\"input[type=radio]\")),\n\t\t\t\tl = $linkedElem.length;\n\n\t\t\tif (tag._.inline) {\n\t\t\t\t// If the first element is owned by (rendered by) this tag (not by a childTag such as {^{for}})\n\t\t\t\t// use it as container for detecting dom changes\n\t\t\t\tdomChngCntnr = tag.contents(\"*\")[0];\n\t\t\t\tdomChngCntnr = domChngCntnr && $.view(domChngCntnr).ctx.tag === tag.parent ? domChngCntnr : tag.parentElem;\n\t\t\t} else {\n\t\t\t\tdomChngCntnr = linkCtx.elem;\n\t\t\t}\n\t\t\twhile (l--) {\n\t\t\t\t// Configure the name for each radio input element\n\t\t\t\t$linkedElem[l].name = $linkedElem[l].name || tag.name;\n\t\t\t}\n\t\t\t// Establish a domchange listener in case this radiogroup wraps a {^{for}} or {^{if}} or similar which might dynamically insert new radio input elements\n\t\t\t$(domChngCntnr).on(\"jsv-domchange\", function(ev, forOrIfTagCtx) {\n\t\t\t\tvar linkedElem,\n\t\t\t\t\tparentTags = forOrIfTagCtx.ctx.parentTags;\n\t\t\t\tif (!tag._.inline || domChngCntnr !== tag.parentElem // The domChngCntnr is specific to this tag\n\t\t\t\t\t// The domChngCntnr is the parentElem of this tag, so need to make sure dom change event is for\n\t\t\t\t\t// a content change within this tag, not outside it.\n\t\t\t\t\t|| parentTags && parentTags[tag.tagName] === tag) {\n\t\t\t\t\t// Contents have changed so recreate $linkedElem for the radio input elements (including possible new one just inserted)\n\t\t\t\t\t$linkedElem = tag.linkedElem = tag.contents(true, \"input[type=radio]\");\n\t\t\t\t\tl = $linkedElem.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t// Configure binding and name for each radio input element\n\t\t\t\t\t\tlinkedElem = $linkedElem[l];\n\t\t\t\t\t\tlinkedElem._jsvLkEl = tag;\n\t\t\t\t\t\tlinkedElem.name = linkedElem.name || tag.name;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag, linkedElem);\n\t\t\t\t\t\tlinkedElem._jsvBnd = \"&\" + tag._tgId + \"+\";\n\t\t\t\t\t\tlinkedElem.checked = tag.cvtArgs()[0] === linkedElem.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tonUpdate: function(ev, eventArgs, tagCtxs) {\n\t\t\treturn false; // don't rerender\n\t\t},\n\t\tcontentCtx: keepParentDataCtx,\n\t\tdataBoundOnly: true\n\t}\n});\n\n$extend($tags[\"for\"], {\n\t//onUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\t//Consider adding filtering for perf optimization. However the below prevents update on some scenarios which _should_ update - namely when there is another array on which for also depends.\n\t\t//var i, l, tci, prevArg;\n\t\t//for (tci = 0; (prevArg = this.tagCtxs[tci]) && prevArg.args.length; tci++) {\n\t\t//\tif (prevArg.args[0] !== newTagCtxs[tci].args[0]) {\n\t\t//\t\treturn true;\n\t\t//\t}\n\t\t//}\n\t\t//return false;\n\t//},\n\tonArrayChange: function(ev, eventArgs, tagCtx, linkCtx) {\n\t\tvar arrayView,\n\t\t\ttarget = ev.target,\n\t\t\ttargetLength = target.length,\n\t\t\ttag = this,\n\t\t\tchange = eventArgs.change;\n\t\tif (tag._.noVws // Child views not supported because target is not html - e.g. data-link=\"title{for ...}\"\n\t\t\t|| tag.tagCtxs[1] && ( // There is an {{else}}\n\t\t\t\tchange === \"insert\" && targetLength === eventArgs.items.length // inserting, and new length is same as inserted length, so going from 0 to n\n\t\t\t\t|| change === \"remove\" && !targetLength // removing , and new length 0, so going from n to 0\n\t\t\t)) {\n\t\t\ttag.refresh();\n\t\t} else {\n\t\t\tfor (arrayView in tag._.arrVws) {\n\t\t\t\tarrayView = tag._.arrVws[arrayView];\n\t\t\t\tif (arrayView.data === target) {\n\t\t\t\t\tarrayView._.onArrayChange.apply(arrayView, arguments);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttag.domChange(tagCtx, linkCtx, eventArgs);\n\t\tev.done = true;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx) {\n\t\tvar i, arrHandler, arrBinding, data,\n\t\t\ttag = this,\n\t\t\tarrayBindings = tag._ars || {},\n\t\t\ttagCtxs = tag.tagCtxs,\n\t\t\tl = tagCtxs.length,\n\t\t\tselected = tag.selected || 0;\n\n\t\tfor (i = 0; i <= selected; i++) {\n\t\t\ttagCtx = tagCtxs[i]; // loop through tagCtxs up to selected\n\t\t\tdata = tagCtx.map\n\t\t\t\t? tagCtx.map.tgt // 'data' is mapped data\n\t\t\t\t: tagCtx.args.length\n\t\t\t\t\t? tagCtx.args[0] // or args[0]\n\t\t\t\t\t: tagCtx.view.data; // or defaults to current data.\n\n\t\t\tif ((arrBinding = arrayBindings[i]) && data !== arrBinding[0]) { // Is there previous array data on this tagCtx, different from new data\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous array\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t\tif (!arrayBindings[i] && $isArray(data)) {\n\t\t\t\t$observe(data, arrHandler = function(ev, eventArgs) {\n\t\t\t\t\tvar tagCt = tagCtx;\n\t\t\t\t\ttag.onArrayChange(ev, eventArgs, tagCt, linkCtx);\n\t\t\t\t});\n\t\t\t\tarrayBindings[i] = [data, arrHandler]; // Store array data and arrayChangeHandler on tag._ars[i]\n\t\t\t}\n\t\t}\n\t\tfor (i = selected + 1; i < l; i++) { // If there were previous bindings on later tagCtxs, remove them\n\t\t\tif (arrBinding = arrayBindings[i]) {\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous binding\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t}\n\t\ttag._ars = arrayBindings;\n\t},\n\tonDispose: function() {\n\t\tvar l, tag = this;\n\t\tfor (l in tag._ars) {\n\t\t\t$observe(tag._ars[l][0], tag._ars[l][1], true); //unobserve\n\t\t}\n\t}\n});\n\n$extend($tags[\"if\"], {\n\tonUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\tvar tci, prevArg, different;\n\t\tfor (tci = 0; (prevArg = this.tagCtxs[tci]); tci++) {\n\t\t\tdifferent = prevArg.props.tmpl !== newTagCtxs[tci].props.tmpl || prevArg.args.length && !(prevArg = prevArg.args[0]) !== !newTagCtxs[tci].args[0];\n\t\t\tif ((!this.convert && !!prevArg) || different) {\n\t\t\t\treturn different;\n\t\t\t\t// If there is not a change of template, and there is no converter, and newArg and prevArg are both truthy, return false to cancel update.\n\t\t\t\t// (Even if values on later elses are different, we still don't want to update, since rendered output would be unchanged)\n\t\t\t\t// If newArg and prevArg are different, return true, to update\n\t\t\t\t// If newArg and prevArg are both falsey, move to the next {{else ...}}\n\t\t\t}\n\t\t}\n\t\t// Boolean value of all args are unchanged (falsey), so return false to cancel update\n\t\treturn false;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx, ctx, ev, eventArgs) {\n\t\tif (eventArgs) {\n\t\t\tthis.domChange(tagCtx, linkCtx, eventArgs);\n\t\t}\n\t}\n});\n\nfunction observeProps(map, ev, eventArgs) {\n\tif (eventArgs.change === \"set\") {\n\t\tvar target = map.tgt,\n\t\t\tl = target.length;\n\t\twhile (l--) {\n\t\t\tif (target[l].key === eventArgs.path) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (l === -1) {\n\t\t\tif (eventArgs.path && !eventArgs.remove) {\n\t\t\t\t$observable(target).insert({key: eventArgs.path, prop: eventArgs.value});\n\t\t\t}\n\t\t} else if (eventArgs.remove) {\n\t\t\t$observable(target).remove(l);\n\t\t} else {\n\t\t\t$observable(target[l]).setProperty(\"prop\", eventArgs.value);\n\t\t}\n\t}\n}\n\nfunction observeMappedProps(map, ev, eventArgs) {\n\tvar item,\n\t\tsource = map.src,\n\t\tchange = eventArgs.change;\n\n\tif (change === \"set\") {\n\t\tif (eventArgs.path === \"prop\") {\n\t\t\t$observable(source).setProperty(ev.target.key, eventArgs.value);\n\t\t} else { // path === \"key\"\n\t\t\t$observable(source).removeProperty(eventArgs.oldValue); // When key is modified observably, remove old one and set new one\n\t\t\t$observable(source).setProperty(eventArgs.value, ev.target.prop);\n\t\t}\n\t} else if (change === \"remove\") {\n\t\titem = eventArgs.items[0];\n\t\t$observable(source).removeProperty(item.key);\n\t\tdelete source[item.key];\n\t} else if (change === \"insert\") {\n\t\titem = eventArgs.items[0];\n\t\tif (item.key) {\n\t\t\t$observable(source).setProperty(item.key, item.prop);\n\t\t}\n\t}\n}\n\nfunction shallowArrayFilter(allPath /*, object, parentObs*/) { // Filter used by {{props}} for the mappedProps target array\n\treturn allPath.indexOf(\".\") < 0;\n}\n\n$tags(\"props\", {\n\tbaseTag: \"for\",\n\tdataMap: $views.map({\n\t\tgetTgt: $tags.props.dataMap.getTgt,\n\t\tobsSrc: observeProps,\n\t\tobsTgt: observeMappedProps,\n\t\ttgtFlt: shallowArrayFilter\n\t}),\n\tflow: true\n});\n\n//========================\n// Extend jQuery namespace\n//========================\n\n$extend($, {\n\n\t//=======================\n\t// jQuery $.view() plugin\n\t//=======================\n\n\tview: $view = function(node, inner, type) {\n\t\t// $.view() returns top view\n\t\t// $.view(node) returns view that contains node\n\t\t// $.view(selector) returns view that contains first selected element\n\t\t// $.view(nodeOrSelector, type) returns nearest containing view of given type\n\t\t// $.view(nodeOrSelector, \"root\") returns root containing view (child of top view)\n\t\t// $.view(nodeOrSelector, true, type) returns nearest inner (contained) view of given type\n\n\t\tfunction getInnerView(nd, isVl) {\n\t\t\tif (nd) {\n\t\t\t\tvwInfos = viewInfos(nd, isVl, rOpenViewMarkers);\n\t\t\t\tfor (j = 0, k = vwInfos.length; j < k; j++) {\n\t\t\t\t\tif ((view = viewStore[vwInfos[j].id]) && (view = view && type ? view.get(true, type) : view)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (inner !== !!inner) {\n\t\t\t// inner not boolean, so this is view(nodeOrSelector, type)\n\t\t\ttype = inner;\n\t\t\tinner = undefined;\n\t\t}\n\t\tvar view, vwInfos, i, j, k, l, elems,\n\t\t\tlevel = 0,\n\t\t\tbody = document.body;\n\n\t\tif (node && node !== body && topView._.useKey > 1) {\n\t\t\t// Perf optimization for common cases\n\n\t\t\tnode = \"\" + node === node\n\t\t\t\t? $(node)[0]\n\t\t\t\t: node.jquery\n\t\t\t\t\t? node[0]\n\t\t\t\t\t: node;\n\n\t\t\tif (node) {\n\t\t\t\tif (inner) {\n\t\t\t\t\tgetInnerView(node._df, true);\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\t// Treat supplied node as a container element and return the first view encountered.\n\t\t\t\t\t\telems = qsa ? node.querySelectorAll(bindElsSel) : $(bindElsSel, node).get();\n\t\t\t\t\t\tl = elems.length;\n\t\t\t\t\t\tfor (i = 0; !view && i < l; i++) {\n\t\t\t\t\t\t\tgetInnerView(elems[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn view;\n\t\t\t\t}\n\t\t\t\twhile (node) {\n\t\t\t\t\t// Move back through siblings and up through parents to find preceding node which is a _prv (prevNode)\n\t\t\t\t\t// script marker node for a non-element-content view, or a _prv (first node) for an elCnt view\n\t\t\t\t\tif (vwInfos = viewInfos(node, undefined, rViewMarkers)) {\n\t\t\t\t\t\tl = vwInfos.length;\n\t\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t\tview = vwInfos[l];\n\t\t\t\t\t\t\tif (view.open) {\n\t\t\t\t\t\t\t\tif (level < 1) {\n\t\t\t\t\t\t\t\t\tview = viewStore[view.id];\n\t\t\t\t\t\t\t\t\treturn view && type ? view.get(type) : view || topView;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlevel--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// level starts at zero. If we hit a view.close, then we move level to 1, and we don't return a view until\n\t\t\t\t\t\t\t\t// we are back at level zero (or a parent view with level < 0)\n\t\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.previousSibling || node.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn topView;\n\t},\n\n\tlink: $link,\n\tunlink: $unlink,\n\n\t//=====================\n\t// override $.cleanData\n\t//=====================\n\tcleanData: function(elems) {\n\t\tif (elems.length && isCleanCall) {\n\t\t\t// Remove JsViews bindings. Also, remove from the DOM any corresponding script marker nodes\n\t\t\tclean(elems);\n\t\t}\n\t\toldCleanData.apply($, arguments);\n\t}\n});\n\n// Possible future addition - e.g. for ckeditor tag control\n//$views.utility = {\n//\tvalidate: function(html) {\n//\t\ttry {\n//\t\t\ttopView.link(undefined, document.createElement(\"div\"), undefined, undefined, html, undefined, undefined, 1);\n//\t\t}\n//\t\tcatch (e) {\n//\t\t\treturn e.message;\n//\t\t}\n//\t}\n//};\n\n//===============================\n// Extend jQuery instance plugins\n//===============================\n\n$extend($.fn, {\n\tlink: function(expr, from, context, noIteration, parentView, prevNode, nextNode) {\n\t\treturn $link(expr, this, from, context, noIteration, parentView, prevNode, nextNode);\n\t},\n\tunlink: function() {\n\t\treturn $unlink(this);\n\t},\n\tview: function(inner, type) {\n\t\treturn $view(this[0], inner, type);\n\t}\n});\n\n//==============================================================================\n// Override jQuery methods that call our overridden cleanData, for disposal etc.\n//==============================================================================\n\n$.each([HTML, \"replaceWith\", \"empty\", \"remove\"], function(i, name) {\n\tvar oldFn = $.fn[name];\n\t$.fn[name] = function() {\n\t\tvar result;\n\t\tisCleanCall = 1; // Make sure cleanData does disposal only when coming from these calls.\n\t\ttry {\n\t\t\tresult = oldFn.apply(this, arguments);\n\t\t}\n\t\tfinally {\n\t\t\tisCleanCall = 0;\n\t\t}\n\t\treturn result;\n\t};\n});\n\n//===============\n// Extend topView\n//===============\n\naddLinkMethods($extend(topView = $sub.topView, {tmpl: {links: {}}}));\n\nviewStore = {0: topView}; // Top-level view\n//===============\n// Extend $.views\n//===============\n\n$views.getCtx = function(param) { // Return value of ctx.foo, including for compiled contextual parameters, ~foo=expr\n\tif (param && param._cp) { // If this helper resource is a contextual parameter, ~foo=expr\n\t\tparam = param[1](param[0].data, param[0], $sub);\n\t}\n\treturn param;\n};\n\n//===================\n// Extend $.views.sub\n//===================\n\n$sub._cp = function(paramVal, params, view) { // Get compiled contextual parameters (or properties) ~foo=expr.\n\tif (view.linked) { // In JsViews, returns [view, linkFn] where linkFn is compiled function for expression\n\t\tparams = delimOpenChar1 + \":\" + params + delimCloseChar0;\n\t\tvar tmpl = view.tmpl,\n\t\t\tlinks = topView.tmpl.links, // Use topView links, as for compiled top-level linking expressions. To do - should this ever get disposed?\n\t\t\tlinkFn = links[params];\n\t\tif (!linkFn) {\n\t\t\tlinks[params] = linkFn = $sub.tmplFn(params, tmpl, true);\n\t\t}\n\t\tparamVal = [view, linkFn];\n\t\tparamVal._cp = true; // Flag that this is a contextual parameter\n\t}\n\treturn paramVal; // In JsRender returns evaluated expression\n};\n\n$sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each referenced contextual parameter ~foo uses its own exprOb instances\n\tvar ob,\n\t\tclones = obs,\n\t\tl = obs.length;\n\tif (l) {\n\t\tclones = [];\n\t\twhile (l--) {\n\t\t\tob = obs[l];\n\t\t\tif (ob._jsv) {\n\t\t\t\tob = $extend({}, ob); // If an exprOb, clone it. If a string, keep as is\n\t\t\t\tob.prm = cloneExprObjects(ob.prm); // Recursively clone exprObs in parameters, too\n\t\t\t}\n\t\t\tclones.unshift(ob);\n\t\t}\n\t}\n\treturn clones;\n};\n\n$sub._gccb = function(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc.\n\t// TODO Consider exposing or allowing override, as public API\n\treturn function(path, object, depth) {\n\t\t// TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on\n\t\t// the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times\n\t\tvar tokens, tag, items, helper, last, nextPath, l;\n\t\tif (view && path) {\n\t\t\tif (path._jsv) {\n\t\t\t\treturn path._jsv.call(view.tmpl, object, view, $sub);\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"~\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"~a.b.c\" string:\n\t\t\t\t// [helperObject 'a', \"a.b.c\" currentDataItem] so currentDataItem becomes the object for subsequent paths.\n\t\t\t\tif (path.slice(0, 4) === \"~tag\") {\n\t\t\t\t\ttag = view.ctx;\n\t\t\t\t\tif (path.charAt(4) === \".\") {\n\t\t\t\t\t\t// \"~tag.xxx\"\n\t\t\t\t\t\ttokens = path.slice(5).split(\".\");\n\t\t\t\t\t\ttag = tag.tag;\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens) {\n\t\t\t\t\t\treturn tag ? [tag, tokens.join(\".\"), object] : [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpath = path.slice(1).split(\".\");\n\t\t\t\tif (helper = view.hlp(last = path.shift(), true)) {\n\t\t\t\t\tif (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [view, ctxPrmDependencies ...]\n\t\t\t\t\t\tif (path.length) {\n\t\t\t\t\t\t\tnextPath = \".\" + path.join(\".\");\n\t\t\t\t\t\t\tlast = helper[l = helper.length-1];\n\t\t\t\t\t\t\tif (last._jsv) {\n\t\t\t\t\t\t\t\tlast.sb = nextPath;\n\t\t\t\t\t\t\t\tlast.bnd = !!depth;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thelper[l] = (last + nextPath).replace(\"#data.\", \"\");\n\t\t\t\t\t\t\t\tif (last.slice(0, 5) === \"#view\") {\n\t\t\t\t\t\t\t\t\thelper[l] = helper[l].slice(6);\n\t\t\t\t\t\t\t\t\thelper.splice(l, 0, view);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\titems = [helper]; // Contextual parameter\n\t\t\t\t\t} else if (path.length || $isFunction(helper)) {\n\t\t\t\t\t\titems = [helper, path.join(\".\"), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn items || [];\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"#\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"#a.b.c\" string: [view, \"a.b.c\" currentDataItem]\n\t\t\t\t// so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes.\n\t\t\t\treturn path === \"#data\" ? [] : [view, path.replace(rViewPath, \"\"), object];\n\t\t\t}\n\t\t}\n\t};\n};\n\n//=========================\n// Extend $.views.settings\n//=========================\n\noldAdvSet = $sub.advSet;\n\n$sub.advSet = function() { // refresh advanced settings\n\toldAdvSet.call($sub);\n\tglobal._jsv = $subSettingsAdvanced._jsv\n\t\t? $extend(global._jsv || {}, { // create global _jsv, for accessing views, etc\n\t\t\t\tviews: viewStore,\n\t\t\t\tbindings: bindingStore\n\t\t\t})\n\t\t: undefined; // In IE8 cannot do delete global._jsv\n\t$viewsLinkAttr = $subSettingsAdvanced.linkAttr;\n\tlinkViewsSel = bindElsSel + \",[\" + $viewsLinkAttr + \"]\";\n\twrapMap = $subSettingsAdvanced._wm;\n\twrapMap.optgroup = wrapMap.option;\n\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\twrapMap.th = wrapMap.td;\n};\n\n$viewsSettings.advanced({\n\tlinkAttr: \"data-link\",\n\tuseViews: false,\n\tnoValidate: false,\n\t// wrapMap provide appropriate wrappers for inserting innerHTML, used in insertBefore\n\t// We have to close these tags to support XHTML (#13200)\n\t// TODO investigate whether more recent jQuery implementation using wrapMap in domManip/$().html() etc. is better optimized now...\n\t_wm: {\n\t\toption: [1, \"\"],\n\t\tlegend: [1, \"
\", \"
\"],\n\t\tarea: [1, \"\", \"\"],\n\t\tparam: [1, \"\", \"\"],\n\t\tthead: [1, \"
\", \"
\"],\n\t\ttr: [2, \"\", \"
\"],\n\t\ttd: [3, \"\", \"
\"],\n\t\tcol: [2, \"\", \"
\"],\n\t\tsvg_ns: [1, \"\", \"\"],\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\tdiv: $.support.htmlSerialize ? [0, \"\", \"\"] : [1, \"X
\", \"
\"]\n\t},\n\t_fe: {\n\t\tinput: {\n\t\t\tfrom: inputAttrib, to: \"value\"\n\t\t},\n\t\ttextarea: valueBinding,\n\t\tselect: valueBinding,\n\t\toptgroup: {\n\t\t\tto: \"label\"\n\t\t}\n\t}\n});\n\n\treturn $;\n}, window));\n"]} \ No newline at end of file diff --git a/jsrender.js b/jsrender.js index ed06fa2..4b1a5c5 100644 --- a/jsrender.js +++ b/jsrender.js @@ -1,4 +1,4 @@ -/*! JsRender v0.9.82 (Beta): http://jsviews.com/#jsrender */ +/*! JsRender v0.9.83 (Beta): http://jsviews.com/#jsrender */ /*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ /* * Best-of-breed templating in browser or on Node.js. @@ -44,7 +44,7 @@ var setGlobals = $ === false; // Only set globals if script block in browser (no $ = $ && $.fn ? $ : global.jQuery; // $ is jQuery passed in by CommonJS loader (Browserify), or global jQuery. -var versionNumber = "v0.9.82", +var versionNumber = "v0.9.83", jsvStoreName, rTag, rTmplString, topView, $views, $expando, //TODO tmplFnsCache = {}, @@ -352,9 +352,9 @@ function getHelper(helper, isContextCb) { res = $helpers[helper]; } if (res && res._cp) { // If this helper resource is a contextual parameter, ~foo=expr - if (isContextCb) { // In a context callback for a contextual param, return the [currentData, dependencies...] array - needed for observe call + if (isContextCb) { // In a context callback for a contextual param, return the [view, dependencies...] array - needed for observe call deps = $sub._ceo(res[1].deps); // fn deps, with any exprObs cloned - deps.unshift(res[0].data); // view.data + deps.unshift(res[0]); // view deps._cp = true; return deps; } @@ -627,7 +627,7 @@ function renderTag(tagName, parentView, tmpl, tagCtxs, isUpdate, onError) { if (itemRet === undefined) { contentCtx = args[0]; // Default data context for wrapped block content is the first argument. Defined tag.contentCtx function to override this. if (tag.contentCtx) { - contentCtx = tag.contentCtx(contentCtx) || contentCtx; + contentCtx = tag.contentCtx(contentCtx); } itemRet = tagCtx.render(contentCtx, true) || (isUpdate ? undefined : ""); } @@ -1713,15 +1713,15 @@ function setPaths(fn, pathsArr) { i = 0, l = pathsArr.length; fn.deps = []; + fn.paths = []; // The array of path binding (array/dictionary)s for each tag/else block's args and props for (; i < l; i++) { - paths = pathsArr[i]; + fn.paths.push(paths = pathsArr[i]); for (key in paths) { - if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length) { + if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length && !paths[key].skp) { fn.deps = fn.deps.concat(paths[key]); // deps is the concatenation of the paths arrays for the different bindings } } } - fn.paths = paths; // The array of paths arrays for the different bindings } function parsedParam(args, props, ctx) { @@ -1878,7 +1878,8 @@ function parseParams(params, pathBindings, tmpl) { ) : eq // named param. Remove bindings for arg and create instead bindings array for prop - ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, bound && (bindings = bndCtx.bd = pathBindings[named] = []), path + ':') + ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, + bindings && ((bindings = bndCtx.bd = pathBindings[named] = []), bindings.skp = !bound), path + ':') : path // path ? (path.split("^").join(".").replace(rPath, parsePath) @@ -2148,7 +2149,7 @@ function getTargetProps(source) { } function $fnRender(data, context, noIteration) { - var tmplElem = this.jquery && (this[0] || error('Unknown template: "' + this.selector + '"')), + var tmplElem = this.jquery && (this[0] || error('Unknown template')), // Targeted element not found for jQuery template selector such as "#myTmpl" tmpl = tmplElem.getAttribute(tmplAttr); return renderContent.call(tmpl ? $.data(tmplElem)[jsvTmpl] : $templates(tmplElem), data, context, noIteration); diff --git a/jsrender.min.js b/jsrender.min.js index 125dea6..6e6a1d1 100644 --- a/jsrender.min.js +++ b/jsrender.min.js @@ -1,4 +1,4 @@ -/*! JsRender v0.9.82 (Beta): http://jsviews.com/#jsrender */ +/*! JsRender v0.9.83 (Beta): http://jsviews.com/#jsrender */ /*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ -!function(e,t){var n=t.jQuery;"object"==typeof exports?module.exports=n?e(t,n):function(n){if(n&&!n.fn)throw"Provide jQuery or null";return e(t,n)}:"function"==typeof define&&define.amd?define(function(){return e(t)}):e(t,!1)}(function(e,t){"use strict";function n(e,t){return function(){var n,r=this,i=r.base;return r.base=e,n=t.apply(r,arguments),r.base=i,n}}function r(e,t){return ee(t)&&(t=n(e?e._d?e:n(s,e):s,t),t._d=1),t}function i(e,t){for(var n in t.props)Ve.test(n)&&(e[n]=r(e[n],t.props[n]))}function o(e){return e}function s(){return""}function a(e){try{throw console.log("JsRender dbg breakpoint: "+e),"dbg breakpoint"}catch(t){}return this.base?this.baseApply(arguments):e}function d(e){this.name=(t.link?"JsViews":"JsRender")+" Error",this.message=e||this.name}function l(e,t){for(var n in t)e[n]=t[n];return e}function u(e,t,n){return e?te(e)?u.apply(X,e):(ae.delimiters=[e,t,ge=n?n.charAt(0):ge],ue=e.charAt(0),pe=e.charAt(1),ce=t.charAt(0),fe=t.charAt(1),e="\\"+ue+"(\\"+ge+")?\\"+pe,t="\\"+ce+"\\"+fe,G="(?:(\\w+(?=[\\/\\s\\"+ce+"]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\"+ce+"]|\\"+ce+"(?!\\"+fe+"))*?)",se.rTag="(?:"+G+")",G=new RegExp("(?:"+e+G+"(\\/)?|\\"+ue+"(\\"+ge+")?\\"+pe+"(?:(?:\\/(\\w+))\\s*|!--[\\s\\S]*?--))"+t,"g"),se.rTmpl=new RegExp("<.*>|([^\\\\]|^)[{}]|"+e+".*"+t),le):ae.delimiters}function p(e,t){t||e===!0||(t=e,e=void 0);var n,r,i,o,s=this,a=!t||"root"===t;if(e){if(o=t&&s.type===t&&s,!o)if(n=s.views,s._.useKey){for(r in n)if(o=t?n[r].get(e,t):n[r])break}else for(r=0,i=n.length;!o&&r0&&(s=n)){if(!s)if(/^\.\/[^\\:*?"<>]*$/.test(n))(a=ne[e=e||n])?n=a:s=document.getElementById(n);else if(t.fn&&!se.rTmpl.test(n))try{s=t(document).find(n)[0]}catch(d){}s&&(i?n=s.innerHTML:(o=s.getAttribute(Se),o?o!==Ie?(n=ne[o],delete ne[o]):t.fn&&(n=t.data(s)[Ie]):(e=e||(t.fn?Ie:n),n=j(e,s.innerHTML,r,i)),n.tmplName=e=e||o,e!==Ie&&(ne[e]=n),s.setAttribute(Se,e),t.fn&&t.data(s,Ie,n))),s=void 0}else n.fn||(n=void 0);return n}var s,a,d=n=n||"";if(0===i&&(i=void 0,d=o(d)),i=i||(n.markup?n:{}),i.tmplName=e,r&&(i._parentTmpl=r),!d&&n.markup&&(d=o(n.markup))&&d.fn&&(d=d.markup),void 0!==d)return d.fn||n.fn?d.fn&&(a=d):(n=V(d,i),O(d.replace(ye,"\\$&"),n)),a||(a=l(function(){return a.render.apply(a,arguments)},n),b(a)),e&&!r&&e!==Ie&&(Ue[e]=a),a}function C(e,n){return t.isFunction(e)?e.call(n):e}function T(e){var t,n=[],r=e.length;for(t=0;tF-(q||0))){if(q=S.slice(q,F+r.length),J!==!0)if(K=o||p[g-1].bd,P=K[K.length-1],P&&P.prm){for(;P.sb&&P.sb.prm;)P=P.sb;B=P.sb={path:P.sb,bnd:P.bnd}}else K.push(B={path:K.pop()});M=pe+":"+q+" onerror=''"+ce,J=f[M],J||(f[M]=!0,f[M]=J=O(M,n,!0)),J!==!0&&B&&(B._jsv=J,B.prm=u.bd,B.bnd=B.bnd||B.path&&B.path.indexOf("^")>=0)}return d?(d=!V,d?r:A+'"'):a?(a=!R,a?r:A+'"'):(w?(h[g]=F++,u=p[++g]={bd:[]},w):"")+(N?g?"":(c=S.slice(c,F),(i?(i=s=o=!1,"\b"):"\b,")+c+(c=F+r.length,l&&t.push(u.bd=[]),"\b")):k?(g&&I(e),l&&t.pop(),i=_,s=x,c=F+r.length,x&&(l=u.bd=t[i]=[]),_+":"):_?_.split("^").join(".").replace(we,U)+(C?(u=p[++g]={bd:[]},v[g]=L,C):b):b?b:$?($=v[g]||$,v[g]=!1,u=p[--g],$+(C?(u=p[++g],v[g]=L,C):"")):T?(v[g]||I(e),","):m?"":(d=V,a=R,'"'))}I(e)}var i,o,s,a,d,l=t&&t[0],u={bd:l},p={0:u},c=0,f=(n?n.links:l&&(l.links=l.links||{}))||W.tmpl.links,g=0,v={},h={},m=(e+(n?" ":"")).replace(xe,r);return!g&&m||I(e)}function P(e,t,n){var r,i,o,s,a,d,l,u,p,c,f,g,v,h,m,w,x,_,b,y,k,j,C,T,A,R,$,M,E,N,F=0,S=de.useViews||t.useViews||t.tags||t.templates||t.helpers||t.converters,O="",q={},K=e.length;for(""+t===t?(_=n?'data-link="'+t.replace(_e," ").slice(1,-1)+'"':t,t=0):(_=t.tmplName||"unnamed",t.allowCode&&(q.allowCode=!0),t.debug&&(q.debug=!0),f=t.bnds,x=t.tmpls),r=0;r":s+o):(k&&(b=V(j,q),b.tmplName=_+"/"+o,b.useViews=b.useViews||S,P(k,b),S=b.useViews,x.push(b)),A||(y=o,S=S||o&&(!oe[o]||!oe[o].flow),T=O,O=""),C=e[r+1],C=C&&"else"===C[0]),E=M?";\ntry{\nret+=":"\n+",h="",m="",R&&(g||N||s&&s!==Ne)){if($=new Function("data,view,j,u"," // "+_+" "+F+" "+o+"\nreturn {"+a+"};"),$._er=M,$._tag=o,n)return $;U($,g),w='c("'+s+'",view,',c=!0,h=w+F+",",m=")"}if(O+=R?(n?(M?"try{\n":"")+"return ":E)+(c?(c=void 0,S=p=!0,w+(g?(f[F-1]=$,F):"{"+a+"}")+")"):">"===o?(l=!0,"h("+v[0]+")"):(u=!0,"((v="+v[0]+")!=null?v:"+(n?"null)":'"")'))):(d=!0,"\n{view:view,tmpl:"+(k?x.length:"0")+","+a+"},"),y&&!C){if(O="["+O.slice(0,-1)+"]",w='t("'+y+'",view,this,',n||g){if(O=new Function("data,view,j,u"," // "+_+" "+F+" "+y+"\nreturn "+O+";"),O._er=M,O._tag=y,g&&U(f[F-1]=O,g),n)return O;h=w+F+",undefined,",m=")"}O=T+E+w+(F||O)+")",g=0,y=0}M&&(S=!0,O+=";\n}catch(e){ret"+(n?"urn ":"+=")+h+"j._err(e,view,"+M+")"+m+";}"+(n?"":"ret=ret"))}O="// "+_+"\nvar v"+(d?",t=j._tag":"")+(p?",c=j._cnvt":"")+(l?",h=j._html":"")+(n?";\n":',ret=""\n')+(q.debug?"debugger;":"")+O+(n?"\n":";\nreturn ret;"),ae.debugMode!==!1&&(O="try {\n"+O+"\n}catch(e){\nreturn j._err(e, view);\n}");try{O=new Function("data,view,j,u",O)}catch(B){I("Compiled template code:\n\n"+O+'\n: "'+B.message+'"')}return t&&(t.fn=O,t.useViews=!!S),O}function B(e,t){return e&&e!==t?t?l(l({},t),e):e:t&&l({},t)}function L(e){return Ee[e]||(Ee[e]="&#"+e.charCodeAt(0)+";")}function Q(e){var t,n,r=[];if(typeof e===Fe)for(t in e)n=e[t],t!==Y&&e.hasOwnProperty(t)&&!ee(n)&&r.push({key:t,prop:n});return r}function H(e,n,r){var i=this.jquery&&(this[0]||S('Unknown template: "'+this.selector+'"')),o=i.getAttribute(Se);return E.call(o?t.data(i)[Ie]:ne(i),e,n,r)}function D(e){return void 0!=e?Ae.test(e)&&(""+e).replace($e,L)||e:""}var Z=t===!1;t=t&&t.fn?t:e.jQuery;var z,G,W,X,Y,ee,te,ne,re,ie,oe,se,ae,de,le,ue,pe,ce,fe,ge,ve,he,me="v0.9.82",we=/^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g,xe=/(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(!*?[#~]?[\w$.^]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=\s*[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g,_e=/[ \t]*(\r\n|\n|\r)/g,be=/\\(['"])/g,ye=/['"\\]/g,ke=/(?:\x08|^)(onerror:)?(?:(~?)(([\w$_\.]+):)?([^\x08]+))\x08(,)?([^\x08]+)/gi,je=/^if\s/,Ce=/<(\w+)[>\s]/,Te=/[\x00`><"'&=]/g,Ae=/[\x00`><\"'&=]/,Ve=/^on[A-Z]|^convert(Back)?$/,Re=/^\#\d+_`[\s\S]*\/\d+_`$/,$e=Te,Me=0,Ee={"&":"&","<":"<",">":">","\0":"�","'":"'",'"':""","`":"`","=":"="},Ne="html",Fe="object",Se="data-jsv-tmpl",Ie="jsvTmpl",Oe="For #index in nested block use #getIndex().",Ue={},qe=e.jsrender,Je=qe&&t&&!t.render,Ke={template:{compile:j},tag:{compile:y},viewModel:{compile:A},helper:{},converter:{}};if(X={jsviews:me,sub:{View:_,Err:d,tmplFn:O,parse:K,extend:l,extendCtx:B,syntaxErr:I,onStore:{},addSetting:$,settings:{allowCode:!1},advSet:s,_ths:i,_tg:function(){},_cnvt:h,_tag:x,_er:S,_err:F,_html:D,_cp:o,_sq:function(e){return"constructor"===e&&I(""),e}},settings:{delimiters:u,advanced:function(e){return e?(l(de,e),se.advSet(),le):de}},getCtx:o,map:M},(d.prototype=new Error).constructor=d,c.depends=function(){return[this.get("item"),"index"]},f.depends="index",_.prototype={get:p,getIndex:f,getRsc:w,getTmpl:v,hlp:g,_is:"view"},se=X.sub,le=X.settings,!(qe||t&&t.render)){for(z in Ke)R(z,Ke[z]);re=X.converters,ie=X.helpers,oe=X.tags,se._tg.prototype={baseApply:k,cvtArgs:m},W=se.topView=new _,t?(t.fn.render=H,Y=t.expando,t.observable&&(l(se,t.views.sub),X.map=t.views.map)):(t={},Z&&(e.jsrender=t),t.renderFile=t.__express=t.compile=function(){throw"Node.js: use npm jsrender, or jsrender-node.js"},t.isFunction=function(e){return"function"==typeof e},t.isArray=Array.isArray||function(e){return"[object Array]"==={}.toString.call(e)},se._jq=function(e){e!==t&&(l(e,t),t=e,t.fn.render=H,delete t.jsrender,Y=t.expando)},t.jsrender=me),ae=se.settings,ae.allowCode=!1,ee=t.isFunction,t.render=Ue,t.views=X,t.templates=ne=X.templates;for(ve in ae)$(ve);(le.debugMode=function(e){return void 0===e?ae.debugMode:(ae.debugMode=e,ae.onError=e+""===e?new Function("","return '"+e+"';"):ee(e)?e:void 0,le)})(!1),de=ae.advanced={useViews:!1,_jsv:!1},oe({"if":{render:function(e){var t=this,n=t.tagCtx,r=t.rendering.done||!e&&(arguments.length||!n.index)?"":(t.rendering.done=!0,t.selected=n.index,n.render(n.view,!0));return r},flow:!0},"for":{render:function(e){var t,n=!arguments.length,r=this,i=r.tagCtx,o="",s=0;return r.rendering.done||(t=n?i.view.data:e,void 0!==t&&(o+=i.render(t,n),s+=te(t)?t.length:1),(r.rendering.done=s)&&(r.selected=i.index)),o},flow:!0},props:{baseTag:"for",dataMap:M(Q),flow:!0},include:{flow:!0},"*":{render:o,flow:!0},":*":{render:o,flow:!0},dbg:ie.dbg=re.dbg=a}),re({html:D,attr:D,url:function(e){return void 0!=e?encodeURI(""+e):null===e?e:""}})}return ae=se.settings,te=(t||qe).isArray,le.delimiters("{{","}}","^"),Je&&qe.views.sub._jq(t),t||qe},window); +!function(e,t){var n=t.jQuery;"object"==typeof exports?module.exports=n?e(t,n):function(n){if(n&&!n.fn)throw"Provide jQuery or null";return e(t,n)}:"function"==typeof define&&define.amd?define(function(){return e(t)}):e(t,!1)}(function(e,t){"use strict";function n(e,t){return function(){var n,r=this,i=r.base;return r.base=e,n=t.apply(r,arguments),r.base=i,n}}function r(e,t){return ee(t)&&(t=n(e?e._d?e:n(s,e):s,t),t._d=1),t}function i(e,t){for(var n in t.props)Ve.test(n)&&(e[n]=r(e[n],t.props[n]))}function o(e){return e}function s(){return""}function a(e){try{throw console.log("JsRender dbg breakpoint: "+e),"dbg breakpoint"}catch(t){}return this.base?this.baseApply(arguments):e}function d(e){this.name=(t.link?"JsViews":"JsRender")+" Error",this.message=e||this.name}function u(e,t){for(var n in t)e[n]=t[n];return e}function l(e,t,n){return e?te(e)?l.apply(X,e):(ae.delimiters=[e,t,ge=n?n.charAt(0):ge],le=e.charAt(0),pe=e.charAt(1),ce=t.charAt(0),fe=t.charAt(1),e="\\"+le+"(\\"+ge+")?\\"+pe,t="\\"+ce+"\\"+fe,G="(?:(\\w+(?=[\\/\\s\\"+ce+"]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\"+ce+"]|\\"+ce+"(?!\\"+fe+"))*?)",se.rTag="(?:"+G+")",G=new RegExp("(?:"+e+G+"(\\/)?|\\"+le+"(\\"+ge+")?\\"+pe+"(?:(?:\\/(\\w+))\\s*|!--[\\s\\S]*?--))"+t,"g"),se.rTmpl=new RegExp("<.*>|([^\\\\]|^)[{}]|"+e+".*"+t),ue):ae.delimiters}function p(e,t){t||e===!0||(t=e,e=void 0);var n,r,i,o,s=this,a=!t||"root"===t;if(e){if(o=t&&s.type===t&&s,!o)if(n=s.views,s._.useKey){for(r in n)if(o=t?n[r].get(e,t):n[r])break}else for(r=0,i=n.length;!o&&r0&&(s=n)){if(!s)if(/^\.\/[^\\:*?"<>]*$/.test(n))(a=ne[e=e||n])?n=a:s=document.getElementById(n);else if(t.fn&&!se.rTmpl.test(n))try{s=t(document).find(n)[0]}catch(d){}s&&(i?n=s.innerHTML:(o=s.getAttribute(Se),o?o!==Ie?(n=ne[o],delete ne[o]):t.fn&&(n=t.data(s)[Ie]):(e=e||(t.fn?Ie:n),n=j(e,s.innerHTML,r,i)),n.tmplName=e=e||o,e!==Ie&&(ne[e]=n),s.setAttribute(Se,e),t.fn&&t.data(s,Ie,n))),s=void 0}else n.fn||(n=void 0);return n}var s,a,d=n=n||"";if(0===i&&(i=void 0,d=o(d)),i=i||(n.markup?n:{}),i.tmplName=e,r&&(i._parentTmpl=r),!d&&n.markup&&(d=o(n.markup))&&d.fn&&(d=d.markup),void 0!==d)return d.fn||n.fn?d.fn&&(a=d):(n=V(d,i),O(d.replace(ye,"\\$&"),n)),a||(a=u(function(){return a.render.apply(a,arguments)},n),b(a)),e&&!r&&e!==Ie&&(Ue[e]=a),a}function C(e,n){return t.isFunction(e)?e.call(n):e}function T(e){var t,n=[],r=e.length;for(t=0;tF-(q||0))){if(q=S.slice(q,F+r.length),J!==!0)if(K=o||p[g-1].bd,P=K[K.length-1],P&&P.prm){for(;P.sb&&P.sb.prm;)P=P.sb;B=P.sb={path:P.sb,bnd:P.bnd}}else K.push(B={path:K.pop()});M=pe+":"+q+" onerror=''"+ce,J=f[M],J||(f[M]=!0,f[M]=J=O(M,n,!0)),J!==!0&&B&&(B._jsv=J,B.prm=l.bd,B.bnd=B.bnd||B.path&&B.path.indexOf("^")>=0)}return d?(d=!V,d?r:A+'"'):a?(a=!R,a?r:A+'"'):(w?(h[g]=F++,l=p[++g]={bd:[]},w):"")+(N?g?"":(c=S.slice(c,F),(i?(i=s=o=!1,"\b"):"\b,")+c+(c=F+r.length,u&&t.push(l.bd=[]),"\b")):k?(g&&I(e),u&&t.pop(),i=_,s=x,c=F+r.length,u&&(u=l.bd=t[i]=[],u.skp=!x),_+":"):_?_.split("^").join(".").replace(we,U)+(C?(l=p[++g]={bd:[]},v[g]=L,C):b):b?b:$?($=v[g]||$,v[g]=!1,l=p[--g],$+(C?(l=p[++g],v[g]=L,C):"")):T?(v[g]||I(e),","):m?"":(d=V,a=R,'"'))}I(e)}var i,o,s,a,d,u=t&&t[0],l={bd:u},p={0:l},c=0,f=(n?n.links:u&&(u.links=u.links||{}))||W.tmpl.links,g=0,v={},h={},m=(e+(n?" ":"")).replace(xe,r);return!g&&m||I(e)}function P(e,t,n){var r,i,o,s,a,d,u,l,p,c,f,g,v,h,m,w,x,_,b,y,k,j,C,T,A,R,$,M,E,N,F=0,S=de.useViews||t.useViews||t.tags||t.templates||t.helpers||t.converters,O="",q={},K=e.length;for(""+t===t?(_=n?'data-link="'+t.replace(_e," ").slice(1,-1)+'"':t,t=0):(_=t.tmplName||"unnamed",t.allowCode&&(q.allowCode=!0),t.debug&&(q.debug=!0),f=t.bnds,x=t.tmpls),r=0;r":s+o):(k&&(b=V(j,q),b.tmplName=_+"/"+o,b.useViews=b.useViews||S,P(k,b),S=b.useViews,x.push(b)),A||(y=o,S=S||o&&(!oe[o]||!oe[o].flow),T=O,O=""),C=e[r+1],C=C&&"else"===C[0]),E=M?";\ntry{\nret+=":"\n+",h="",m="",R&&(g||N||s&&s!==Ne)){if($=new Function("data,view,j,u"," // "+_+" "+F+" "+o+"\nreturn {"+a+"};"),$._er=M,$._tag=o,n)return $;U($,g),w='c("'+s+'",view,',c=!0,h=w+F+",",m=")"}if(O+=R?(n?(M?"try{\n":"")+"return ":E)+(c?(c=void 0,S=p=!0,w+(g?(f[F-1]=$,F):"{"+a+"}")+")"):">"===o?(u=!0,"h("+v[0]+")"):(l=!0,"((v="+v[0]+")!=null?v:"+(n?"null)":'"")'))):(d=!0,"\n{view:view,tmpl:"+(k?x.length:"0")+","+a+"},"),y&&!C){if(O="["+O.slice(0,-1)+"]",w='t("'+y+'",view,this,',n||g){if(O=new Function("data,view,j,u"," // "+_+" "+F+" "+y+"\nreturn "+O+";"),O._er=M,O._tag=y,g&&U(f[F-1]=O,g),n)return O;h=w+F+",undefined,",m=")"}O=T+E+w+(F||O)+")",g=0,y=0}M&&(S=!0,O+=";\n}catch(e){ret"+(n?"urn ":"+=")+h+"j._err(e,view,"+M+")"+m+";}"+(n?"":"ret=ret"))}O="// "+_+"\nvar v"+(d?",t=j._tag":"")+(p?",c=j._cnvt":"")+(u?",h=j._html":"")+(n?";\n":',ret=""\n')+(q.debug?"debugger;":"")+O+(n?"\n":";\nreturn ret;"),ae.debugMode!==!1&&(O="try {\n"+O+"\n}catch(e){\nreturn j._err(e, view);\n}");try{O=new Function("data,view,j,u",O)}catch(B){I("Compiled template code:\n\n"+O+'\n: "'+B.message+'"')}return t&&(t.fn=O,t.useViews=!!S),O}function B(e,t){return e&&e!==t?t?u(u({},t),e):e:t&&u({},t)}function L(e){return Ee[e]||(Ee[e]="&#"+e.charCodeAt(0)+";")}function Q(e){var t,n,r=[];if(typeof e===Fe)for(t in e)n=e[t],t!==Y&&e.hasOwnProperty(t)&&!ee(n)&&r.push({key:t,prop:n});return r}function H(e,n,r){var i=this.jquery&&(this[0]||S("Unknown template")),o=i.getAttribute(Se);return E.call(o?t.data(i)[Ie]:ne(i),e,n,r)}function D(e){return void 0!=e?Ae.test(e)&&(""+e).replace($e,L)||e:""}var Z=t===!1;t=t&&t.fn?t:e.jQuery;var z,G,W,X,Y,ee,te,ne,re,ie,oe,se,ae,de,ue,le,pe,ce,fe,ge,ve,he,me="v0.9.83",we=/^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g,xe=/(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(!*?[#~]?[\w$.^]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=\s*[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g,_e=/[ \t]*(\r\n|\n|\r)/g,be=/\\(['"])/g,ye=/['"\\]/g,ke=/(?:\x08|^)(onerror:)?(?:(~?)(([\w$_\.]+):)?([^\x08]+))\x08(,)?([^\x08]+)/gi,je=/^if\s/,Ce=/<(\w+)[>\s]/,Te=/[\x00`><"'&=]/g,Ae=/[\x00`><\"'&=]/,Ve=/^on[A-Z]|^convert(Back)?$/,Re=/^\#\d+_`[\s\S]*\/\d+_`$/,$e=Te,Me=0,Ee={"&":"&","<":"<",">":">","\0":"�","'":"'",'"':""","`":"`","=":"="},Ne="html",Fe="object",Se="data-jsv-tmpl",Ie="jsvTmpl",Oe="For #index in nested block use #getIndex().",Ue={},qe=e.jsrender,Je=qe&&t&&!t.render,Ke={template:{compile:j},tag:{compile:y},viewModel:{compile:A},helper:{},converter:{}};if(X={jsviews:me,sub:{View:_,Err:d,tmplFn:O,parse:K,extend:u,extendCtx:B,syntaxErr:I,onStore:{},addSetting:$,settings:{allowCode:!1},advSet:s,_ths:i,_tg:function(){},_cnvt:h,_tag:x,_er:S,_err:F,_html:D,_cp:o,_sq:function(e){return"constructor"===e&&I(""),e}},settings:{delimiters:l,advanced:function(e){return e?(u(de,e),se.advSet(),ue):de}},getCtx:o,map:M},(d.prototype=new Error).constructor=d,c.depends=function(){return[this.get("item"),"index"]},f.depends="index",_.prototype={get:p,getIndex:f,getRsc:w,getTmpl:v,hlp:g,_is:"view"},se=X.sub,ue=X.settings,!(qe||t&&t.render)){for(z in Ke)R(z,Ke[z]);re=X.converters,ie=X.helpers,oe=X.tags,se._tg.prototype={baseApply:k,cvtArgs:m},W=se.topView=new _,t?(t.fn.render=H,Y=t.expando,t.observable&&(u(se,t.views.sub),X.map=t.views.map)):(t={},Z&&(e.jsrender=t),t.renderFile=t.__express=t.compile=function(){throw"Node.js: use npm jsrender, or jsrender-node.js"},t.isFunction=function(e){return"function"==typeof e},t.isArray=Array.isArray||function(e){return"[object Array]"==={}.toString.call(e)},se._jq=function(e){e!==t&&(u(e,t),t=e,t.fn.render=H,delete t.jsrender,Y=t.expando)},t.jsrender=me),ae=se.settings,ae.allowCode=!1,ee=t.isFunction,t.render=Ue,t.views=X,t.templates=ne=X.templates;for(ve in ae)$(ve);(ue.debugMode=function(e){return void 0===e?ae.debugMode:(ae.debugMode=e,ae.onError=e+""===e?new Function("","return '"+e+"';"):ee(e)?e:void 0,ue)})(!1),de=ae.advanced={useViews:!1,_jsv:!1},oe({"if":{render:function(e){var t=this,n=t.tagCtx,r=t.rendering.done||!e&&(arguments.length||!n.index)?"":(t.rendering.done=!0,t.selected=n.index,n.render(n.view,!0));return r},flow:!0},"for":{render:function(e){var t,n=!arguments.length,r=this,i=r.tagCtx,o="",s=0;return r.rendering.done||(t=n?i.view.data:e,void 0!==t&&(o+=i.render(t,n),s+=te(t)?t.length:1),(r.rendering.done=s)&&(r.selected=i.index)),o},flow:!0},props:{baseTag:"for",dataMap:M(Q),flow:!0},include:{flow:!0},"*":{render:o,flow:!0},":*":{render:o,flow:!0},dbg:ie.dbg=re.dbg=a}),re({html:D,attr:D,url:function(e){return void 0!=e?encodeURI(""+e):null===e?e:""}})}return ae=se.settings,te=(t||qe).isArray,ue.delimiters("{{","}}","^"),Je&&qe.views.sub._jq(t),t||qe},window); //# sourceMappingURL=jsrender.min.js.map diff --git a/jsrender.min.js.map b/jsrender.min.js.map index a3b7ebb..f38c1d1 100644 --- a/jsrender.min.js.map +++ b/jsrender.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["jsrender.js"],"names":["factory","global","$","jQuery","exports","module","fn","define","amd","getDerivedMethod","baseMethod","method","ret","tag","this","prevBase","base","apply","arguments","getMethod","$isFunction","_d","noop","tagHandlersFromProps","tagCtx","prop","props","rHasHandlers","test","retVal","val","dbgBreak","console","log","e","baseApply","JsViewsError","message","name","link","$extend","target","source","$viewsDelimiters","openChars","closeChars","$isArray","$views","$subSettings","delimiters","linkChar","charAt","delimOpenChar0","delimOpenChar1","delimCloseChar0","delimCloseChar1","rTag","$sub","RegExp","rTmpl","$viewsSettings","getView","inner","type","undefined","views","i","l","found","view","root","_","useKey","get","length","parent","getNestedIndex","index","getIndex","getHelper","helper","isContextCb","wrapped","deps","res","ctx","$helpers","_cp","_ceo","unshift","data","getCtx","_wrp","getTemplate","tmpl","getRsc","$templates","convertVal","converter","onError","value","boundTag","bnds","linkCtx","args","_tg","inline","bnd","unlinked","tagName","cvt","flow","extendCtx","_er","cvtArgs","onRender","convertArgs","convert","error","slice","depends","getDeps","getResource","resourceType","itemName","store","renderTag","parentView","tagCtxs","isUpdate","topView","tagDef","template","tags","attr","parentTag","itemRet","tagCtxCtx","content","callInit","mapDef","thisMap","initialTmpl","tagDataMap","contentCtx","parentTmpl","_is","tmpls","render","renderContent","getTmpl","_ctr","init","dataMap","arrVws","dataBoundOnly","map","parents","parentTags","rendering","src","unmap","tgt","noVws","HTML","linked","linkedElem","rWrappedInViewMarker","renderWithViews","templates","$converters","html","View","context","key","contentTmpl","parentView_","self_","self","isArray","id","viewId","indexStr","push","splice","compileChildResources","storeName","storeNames","resources","jsvStores","compileTag","Tag","baseTag","compiledDef","$tags","prototype","constructor","_parentTmpl","compileTmpl","options","lookupTemplate","currentName","nodeType","elem","document","getElementById","find","innerHTML","getAttribute","tmplAttr","jsvTmpl","tmplName","setAttribute","compiledTmpl","tmplOrMarkup","markup","tmplObject","tmplFn","replace","rEscapeQuotes","$render","getDefaultVal","defaultVal","isFunction","call","unmapArray","modelArr","arr","compileViewModel","GetNew","vm","iterate","action","j","getterType","ob","m","getters","getter","viewModels","JSON","parse","merge","viewModel","$expando","getterNames","mod","assigned","newModArr","model","$observable","refresh","concat","extend","proto","body","observable","privField","setProperty","set","Function","htmlTag","wrapMap","$subSettingsAdvanced","_wm","links","rFirstElem","exec","toLowerCase","div","trim","registerStore","storeSettings","theStore","item","onStore","compile","thisStore","OBJECT","getTgt","addSetting","st","Map","baseMap","noIteration","isTopRenderCall","prevData","prevIndex","result","isRenderCall","useViews","setItemVar","newCtx","itemVar","newView","childView","itemResult","swapContent","outerOnRender","syntaxError","helpers","it","onRenderError","fallback","Err","isLinkExpr","convertBack","hasElse","pushprecedingContent","shift","loc","substr","rNewLine","blockTagCheck","block","parseTag","all","bind","colon","codeTag","params","slash","bind2","closeBlock","pathBindings","ctxProps","paramsArgs","paramsProps","paramsCtxProps","useTrigger","allowCode","rUnescapeQuotes","rTestElseIf","current","substring","stack","pop","parseParams","rBuildHash","onerror","isCtx","keyToken","keyValue","arg","param","hasHandlers","newNode","parsedParam","bindings","astTop","buildCode","setPaths","pathsArr","paths","hasOwnProperty","paramStructure","parts","parseTokens","lftPrn0","lftPrn","bound","path","operator","err","eq","path2","prn","comma","lftPrn2","apos","quot","rtPrn","rtPrnDot","prn2","space","full","parsePath","allPath","not","object","viewProperty","pathTokens","leafToken","subPath","binds","named","bindto","_jsvto","bndCtx","bd","theOb","_jsv","sb","pathStart","parenDepth","expr","exprFn","newOb","rtSq","aposed","quoted","boundName","bndStack","prm","tmplLinks","indexOf","paramIndex","split","join","rPath","fnCall","0","rParams","ast","node","hasTag","hasEncoder","getsVal","hasCnvt","useCnvt","tmplBindings","boundOnErrStart","boundOnErrEnd","tagRender","nestedTmpls","nestedTmpl","tagAndElses","nextIsElse","oldCode","isElse","isGetVal","tagCtxFn","tagStart","trigger","tmplBindingKey","converters","code","tmplOptions","debug","_tag","debugMode","parentContext","getCharEntity","ch","charEntities","charCodeAt","getTargetProps","$fnRender","tmplElem","jquery","selector","htmlEncode","text","rIsHtml","rHtmlEncode","setGlobals","jsvStoreName","setting","versionNumber","rAttrEncode","&","<",">","\u0000","'","\"","`","=","jsr","jsrender","jsrToJq","jsviews","sub","syntaxErr","settings","advSet","_ths","_cnvt","_err","_html","_sq","token","advanced","Error","hlp","expando","renderFile","__express","Array","obj","_jq","jq","if","done","selected","for","finalElse","include","*",":*","dbg","url","encodeURI","window"],"mappings":";;CAaC,SAASA,EAASC,GAElB,GAAIC,GAAID,EAAOE,MAEQ,iBAAZC,SACVC,OAAOD,QAAUF,EACdF,EAAQC,EAAQC,GAChB,SAASA,GACV,GAAIA,IAAMA,EAAEI,GACX,KAAM,wBAEP,OAAON,GAAQC,EAAQC,IAEG,kBAAXK,SAAyBA,OAAOC,IACjDD,OAAO,WACN,MAAOP,GAAQC,KAGhBD,EAAQC,GAAQ,IAKlB,SAASA,EAAQC,GACjB,YAsHA,SAASO,GAAiBC,EAAYC,GACrC,MAAO,YACN,GAAIC,GACHC,EAAMC,KACNC,EAAWF,EAAIG,IAKhB,OAHAH,GAAIG,KAAON,EACXE,EAAMD,EAAOM,MAAMJ,EAAKK,WACxBL,EAAIG,KAAOD,EACJH,GAIT,QAASO,GAAUT,EAAYC,GAc9B,MAXIS,IAAYT,KACfA,EAASF,EACNC,EAEEA,EAAWW,GACVX,EACAD,EAAiBa,EAAMZ,GAHxBY,EAIHX,GAEFA,EAAOU,GAAK,GAENV,EAGR,QAASY,GAAqBV,EAAKW,GAClC,IAAK,GAAIC,KAAQD,GAAOE,MACnBC,GAAaC,KAAKH,KACrBZ,EAAIY,GAAQN,EAAUN,EAAIY,GAAOD,EAAOE,MAAMD,KAOjD,QAASI,GAAOC,GACf,MAAOA,GAGR,QAASR,KACR,MAAO,GAGR,QAASS,GAASD,GAEjB,IAEC,KADAE,SAAQC,IAAI,4BAA8BH,GACpC,iBAEP,MAAOI,IACP,MAAOpB,MAAKE,KAAOF,KAAKqB,UAAUjB,WAAaY,EAGhD,QAASM,GAAaC,GAGrBvB,KAAKwB,MAAQpC,EAAEqC,KAAO,UAAY,YAAc,SAChDzB,KAAKuB,QAAUA,GAAWvB,KAAKwB,KAGhC,QAASE,GAAQC,EAAQC,GACxB,IAAK,GAAIJ,KAAQI,GAChBD,EAAOH,GAAQI,EAAOJ,EAEvB,OAAOG,GAWR,QAASE,GAAiBC,EAAWC,EAAYN,GAGhD,MAAKK,GAGDE,GAASF,GACLD,EAAiB1B,MAAM8B,EAAQH,IAGvCI,GAAaC,YAAcL,EAAWC,EAAYK,GAAWX,EAAOA,EAAKY,OAAO,GAAKD,IAErFE,GAAiBR,EAAUO,OAAO,GAClCE,GAAiBT,EAAUO,OAAO,GAClCG,GAAkBT,EAAWM,OAAO,GACpCI,GAAkBV,EAAWM,OAAO,GACpCP,EAAY,KAAOQ,GAAiB,MAAQF,GAAW,OAASG,GAChER,EAAa,KAAOS,GAAkB,KAAOC,GAG7CC,EAAO,uBAAyBF,GAAkB,wCAC/CA,GAAkB,OAASA,GAAkB,QAAUC,GAAkB,QAG5EE,GAAKD,KAAO,MAAQA,EAAO,IAE3BA,EAAO,GAAIE,QAAO,MAAQd,EAAYY,EAAO,YAAcJ,GAAiB,MAAQF,GAAW,OAASG,GAAiB,yCAA2CR,EAAY,KAKhLY,GAAKE,MAAQ,GAAID,QAAO,wBAA0Bd,EAAY,KAAOC,GAG9De,IA9BCZ,GAAaC,WAqCtB,QAASY,GAAQC,EAAOC,GAClBA,GAAQD,KAAU,IAEtBC,EAAOD,EACPA,EAAQE,OAGT,IAAIC,GAAOC,EAAGC,EAAGC,EAChBC,EAAOvD,KACPwD,GAAQP,GAAiB,SAATA,CAGjB,IAAID,GAIH,GADAM,EAAQL,GAAQM,EAAKN,OAASA,GAAQM,GACjCD,EAEJ,GADAH,EAAQI,EAAKJ,MACTI,EAAKE,EAAEC,QACV,IAAKN,IAAKD,GACT,GAAIG,EAAQL,EAAOE,EAAMC,GAAGO,IAAIX,EAAOC,GAAQE,EAAMC,GACpD,UAIF,KAAKA,EAAI,EAAGC,EAAIF,EAAMS,QAASN,GAASF,EAAIC,EAAGD,IAC9CE,EAAQL,EAAOE,EAAMC,GAAGO,IAAIX,EAAOC,GAAQE,EAAMC,OAI9C,IAAII,EAEV,KAAOD,EAAKM,QACXP,EAAQC,EACRA,EAAOA,EAAKM,WAGb,MAAON,IAASD,GAEfA,EAAQC,EAAKN,OAASA,EAAOM,EAAOL,OACpCK,EAAOA,EAAKM,MAGd,OAAOP,GAGR,QAASQ,KACR,GAAIP,GAAOvD,KAAK2D,IAAI,OACpB,OAAOJ,GAAOA,EAAKQ,MAAQb,OAO5B,QAASc,KACR,MAAOhE,MAAK+D,MASb,QAASE,GAAUC,EAAQC,GAE1B,GAAIC,GAASC,EACbd,EAAOvD,KACPsE,EAAMf,EAAKgB,GAQX,IANID,IACHA,EAAMA,EAAIJ,IAEChB,SAARoB,IACHA,EAAME,GAASN,IAEZI,GAAOA,EAAIG,IAAK,CACnB,GAAIN,EAIH,MAHAE,GAAO1B,GAAK+B,KAAKJ,EAAI,GAAGD,MACxBA,EAAKM,QAAQL,EAAI,GAAGM,MACpBP,EAAKI,KAAM,EACJJ,CAERC,GAAMrC,EAAO4C,OAAOP,GAgBrB,MAbIA,IACChE,GAAYgE,KAASA,EAAIQ,OAK5BV,EAAU,WACT,MAAOE,GAAInE,MAAQH,MAAQA,OAASb,EAAiBa,KAAPuD,EAAanD,YAE5DgE,EAAQU,KAAOvB,EACf7B,EAAQ0C,EAASE,IAGZF,GAAWE,EAGnB,QAASS,GAAYC,GACpB,MAAOA,KAASA,EAAKxF,GAClBwF,EACAhF,KAAKiF,OAAO,YAAaD,IAASE,GAAWF,IAOjD,QAASG,GAAWC,EAAW7B,EAAM7C,EAAQ2E,GAE5C,GAAItF,GAAKuF,EAERC,EAA6B,gBAAX7E,IAAuB6C,EAAKyB,KAAKQ,KAAK9E,EAAO,GAC/D+E,EAAUlC,EAAKkC,OA4ChB,OA1CgBvC,UAAZmC,EACH3E,EAAS2E,GAAWzE,SAAW8E,MAAOL,IAC5BE,IACV7E,EAAS6E,EAAShC,EAAKqB,KAAMrB,EAAMZ,KAGpC2C,EAAQ5E,EAAOgF,KAAK,IAChBN,GAAaG,KAChBxF,EAAM0F,GAAWA,EAAQ1F,IACpBA,IACJA,EAAM2B,EAAQ,GAAIiB,IAAKgD,KACtBlC,GACCmC,QAASH,EACTI,IAAKN,EACLO,UAAU,GAEXC,QAAS,IACTC,IAAKZ,EACLa,MAAM,EACNvF,OAAQA,IAEL+E,IACHA,EAAQ1F,IAAMA,EACdA,EAAI0F,QAAUA,GAEf/E,EAAO6D,IAAM2B,EAAUxF,EAAO6D,KAAMkB,EAAUA,EAAQlC,KAAOA,GAAMgB,MAEpExE,EAAIoG,IAAMd,GAAWC,EACrB7E,EAAqBV,EAAKW,GAE1BA,EAAO6C,KAAOA,EAEdxD,EAAIwE,IAAM7D,EAAO6D,KAAOxE,EAAIwE,QAC5B7D,EAAO6D,IAAMrB,OAEboC,EAAQvF,EAAIqG,QAAsB,SAAdhB,GAAwBA,GAAW,GAGvDE,EAAQC,GAAYhC,EAAKE,EAAE4C,SACxB9C,EAAKE,EAAE4C,SAASf,EAAO/B,EAAMxD,GAC7BuF,GAEYpC,QAAToC,EAAqBA,EAAQ,GAGrC,QAASgB,GAAYlB,GACpB,GAAIrF,GAAMC,KACTU,EAASX,EAAIW,OACb6C,EAAO7C,EAAO6C,KACdmC,EAAOhF,EAAOgF,IAoBf,OAlBAN,GAAYA,GAAarF,EAAIwG,QAC7BnB,EAAYA,IAAc,GAAKA,IAAcA,EACzC7B,EAAK0B,OAAO,aAAcG,IAAcoB,EAAM,uBAAyBpB,EAAY,KACpFA,GAEHM,EAAQA,EAAK9B,QAAWlD,EAAOqD,MAE5BqB,EACCM,EAAKe,QAELf,GAJAnC,EAAKqB,MAMLQ,IACCA,EAAUsB,UACb3G,EAAI2G,QAAU/D,GAAKgE,QAAQ5G,EAAI2G,QAAS3G,EAAKqF,EAAUsB,QAAStB,IAEjEM,EAAK,GAAKN,EAAUjF,MAAMJ,EAAK2F,IAEzBA,EAOR,QAASkB,GAAYC,EAAcC,GAGlC,IAFA,GAAIxC,GAAKyC,EACRxD,EAAOvD,KACQkD,SAARoB,GAAsBf,GAC7BwD,EAAQxD,EAAKyB,MAAQzB,EAAKyB,KAAK6B,GAC/BvC,EAAMyC,GAASA,EAAMD,GACrBvD,EAAOA,EAAKM,MAEb,OAAOS,IAAOrC,EAAO4E,GAAcC,GAGpC,QAASE,GAAUjB,EAASkB,EAAYjC,EAAMkC,EAASC,EAAU9B,GAChE4B,EAAaA,GAAcG,CAC3B,IAAIrH,GAAWsH,EAAQC,EAAUC,EAAMC,EAAMC,EAAWrE,EAAGC,EAAGqE,EAAShH,EAAQiH,EAC9EC,EAASC,EAAUC,EAAQC,EAASrC,EAAM9E,EAAOoH,EAAaC,EAAYC,EAC1EpI,EAAM,GACN2F,EAAUwB,EAAWxB,SAAW,EAChClB,EAAM0C,EAAW1C,IACjB4D,EAAanD,GAAQiC,EAAWjC,KAEhCO,EAA8B,gBAAZ2B,IAAwBD,EAAWjC,KAAKQ,KAAK0B,EAAQ,EAoBxE,KAlBoB,QAAhBnB,EAAQqC,KACXrI,EAAMgG,EACNA,EAAUhG,EAAIgG,QACdmB,EAAUnH,EAAImH,QACdI,EAAWvH,EAAIuH,WAEfD,EAASJ,EAAWhC,OAAO,OAAQc,IAAYS,EAAM,kBAAoBT,EAAU,OACnFuB,EAAWD,EAAOC,UAGHpE,SAAZmC,GACHvF,GAAOuF,EACP6B,EAAU7B,IAAYzE,SAAW8E,WACvBH,IACV2B,EAAU3B,EAAS0B,EAAWrC,KAAMqC,EAAYtE,KAGjDU,EAAI6D,EAAQtD,OACPR,EAAI,EAAGA,EAAIC,EAAGD,IAClB1C,EAASwG,EAAQ9D,KACZqC,IAAYA,EAAQ1F,KAAOqD,IAAMqC,EAAQ1F,IAAI0D,EAAEmC,QAAU7F,EAAIoG,QAG7DyB,EAAUO,EAAWE,OAAS3H,EAAOsE,QACxC4C,EAAUlH,EAAOkH,QAAUO,EAAWE,MAAMT,EAAU,IAEvDlH,EAAOqD,MAAQX,EACf1C,EAAOsE,KAAO4C,EACdlH,EAAO4H,OAASC,EAChB7H,EAAO6C,KAAO0D,EACdvG,EAAO6D,IAAM2B,EAAUxF,EAAO6D,IAAKA,KAEhCS,EAAOtE,EAAOE,MAAMoE,QAEvBtE,EAAOsE,KAAOiC,EAAWuB,QAAQxD,IAG7BjF,IAMJA,EAAM,GAAIsH,GAAOoB,KACjBZ,IAAa9H,EAAI2I,KAEjB3I,EAAI8D,OAAS4D,EAAYlD,GAAOA,EAAIxE,IACpCA,EAAImH,QAAUA,EACde,EAAalI,EAAI4I,QAEblD,IACH1F,EAAI0D,EAAEmC,QAAS,EACfH,EAAQ1F,IAAMA,EACdA,EAAI0F,QAAUA,IAEX1F,EAAI0D,EAAEoC,IAAMN,GAAYE,EAAQjG,IAEnCO,EAAI0D,EAAEmF,UACI7I,EAAI8I,eACdrC,EAAM,MAAQT,EAAU,8BAK1BmB,EAAUnH,EAAImH,QACde,EAAalI,EAAI4I,QAEjBjI,EAAOX,IAAMA,EACTkI,GAAcf,IACjBxG,EAAOoI,IAAM5B,EAAQ9D,GAAG0F,KAEpB/I,EAAIkG,OACR0B,EAAYjH,EAAO6D,IAAM7D,EAAO6D,QAGhCgD,EAAOxH,EAAIgJ,QAAUpB,EAAUqB,WAAazE,GAAO2B,EAAUyB,EAAUqB,WAAYzE,EAAIyE,gBACnFvB,IACHF,EAAKE,EAAU1B,SAAW0B,GAG3BF,EAAKxH,EAAIgG,SAAW4B,EAAU5H,IAAMA,EAGtC,MAAMA,EAAIoG,IAAMd,GAAU,CAGzB,IAFA5E,EAAqBV,EAAKmH,EAAQ,IAClCnH,EAAIkJ,aACC7F,EAAI,EAAGA,EAAIC,EAAGD,IAClB1C,EAASX,EAAIW,OAASwG,EAAQ9D,GAC9BxC,EAAQF,EAAOE,MACf8E,EAAO3F,EAAIqG,WAEP0B,EAASlH,EAAM+H,SAAWV,KACzBvC,EAAK9B,QAAUhD,EAAM+H,WACxBZ,EAAUrH,EAAOoI,IACZf,GAAWA,EAAQmB,MAAQxD,EAAK,KAAMyB,IACtCY,GAAWA,EAAQmB,KACtBnB,EAAQoB,QAETpB,EAAUrH,EAAOoI,IAAMhB,EAAOgB,IAAIpD,EAAK,GAAI9E,EAAOsC,QAAYnD,EAAI0D,EAAEoC,MAErEH,GAAQqC,EAAQqB,MAGlBrJ,EAAIwE,IAAM7D,EAAO6D,IAEZnB,IACAyE,IACHG,EAAcjI,EAAIuH,SAClBvH,EAAI2I,KAAKhI,EAAQ+E,EAAS1F,EAAIwE,KAC9BsD,EAAW3E,QAERuC,IAGHA,EAAQ+B,KAAOzH,EAAIyH,KAAO/B,EAAQ+B,MAAQzH,EAAIyH,MAE/CA,EAAOzH,EAAIyH,KACXzH,EAAI0D,EAAE4F,MAAQ7B,GAAQA,IAAS8B,IAGhC5B,EAAUxE,OACNnD,EAAIuI,SACPZ,EAAU3H,EAAIuI,OAAOnI,MAAMJ,EAAK2F,GAC5BuB,EAAWsC,QAAU7B,GAAW3H,EAAIyJ,aAAeC,GAAqB3I,KAAK4G,KAGhFA,EAAUgC,EAAgBtK,EAAEuK,UAAUjC,GAAUhC,EAAK,GAAIxC,OAAWA,OAAW+D,EAAY/D,OAAWA,OAAWnD,KAG9G2F,EAAK9B,SACT8B,GAAQuB,IAEO/D,SAAZwE,IACHQ,EAAaxC,EAAK,GACd3F,EAAImI,aACPA,EAAanI,EAAImI,WAAWA,IAAeA,GAE5CR,EAAUhH,EAAO4H,OAAOJ,GAAY,KAAUf,EAAWjE,OAAY,KAGtEpD,EAAMA,EAAMA,GAAO4H,GAAW,IAAMA,CAErC3H,GAAIkJ,UAAY/F,OAajB,MAXAnD,GAAIW,OAASwG,EAAQ,GACrBnH,EAAIwE,IAAMxE,EAAIW,OAAO6D,IAEjBxE,EAAI0D,EAAE4F,OACJtJ,EAAI0D,EAAEmC,SAEV9F,EAAe,SAAT0H,EACHoC,GAAYC,KAAK/J,GACjB,IAGEyF,GAAY0B,EAAWxD,EAAE4C,SAE7BY,EAAWxD,EAAE4C,SAASvG,EAAKmH,EAAYlH,GACvCD,EAOJ,QAASgK,GAAKC,EAAS9G,EAAMgE,EAAYrC,EAAM0C,EAAU0C,EAAK3D,EAAU4D,GAEvE,GAAI9G,GAAO+G,EAAkBC,EAC5BC,EAAOpK,KACPqK,EAAmB,UAATpH,CAEXmH,GAAKxC,QAAUqC,EACfG,EAAKjH,MAAQkH,QACbD,EAAKvG,OAASoD,EACdmD,EAAKnH,KAAOA,GAAQ,MACpBmH,EAAKxF,KAAOA,EACZwF,EAAKpF,KAAOsC,EAIZ6C,EAAQC,EAAK3G,GACZuG,IAAK,EACLtG,OAAQ2G,EAAU,EAAI,EACtBC,GAAI,GAAKC,KACTlE,SAAUA,EACVb,SAED4E,EAAKb,SAAWlD,EACZY,GACH9D,EAAQ8D,EAAW9D,MACnB+G,EAAcjD,EAAWxD,EACrByG,EAAYxG,QAGfP,EAAMgH,EAAMH,IAAM,IAAME,EAAYxG,UAAY0G,EAChDA,EAAKrG,MAAQyG,GACbJ,EAAKpG,SAAWF,GACNX,EAAMS,UAAYuG,EAAMH,IAAMI,EAAKrG,MAAQiG,GACrD7G,EAAMsH,KAAKL,GAEXjH,EAAMuH,OAAOV,EAAK,EAAGI,GAItBA,EAAK7F,IAAMwF,GAAW9C,EAAW1C,KAEjC6F,EAAK7F,IAAMwF,EAiBb,QAASY,GAAsBxC,GAC9B,GAAIyC,GAAWC,EAAYC,CAC3B,KAAKF,IAAaG,IACjBF,EAAaD,EAAY,IACrBzC,EAAW0C,KACdC,EAAY3C,EAAW0C,GACvB1C,EAAW0C,MACX5I,EAAO4I,GAAYC,EAAW3C,IASjC,QAAS6C,GAAWxJ,EAAM6F,EAAQc,GAIjC,QAAS8C,KACR,GAAIlL,GAAMC,IACVD,GAAI0D,GACHmC,QAAQ,EACRE,UAAU,GAGX/F,EAAIgG,QAAUvE,EAVf,GAAIwD,GAAMkG,EAASvK,EAClBwK,EAAc,GAAIxI,IAAKgD,GAqBxB,IATIrF,GAAY+G,GAEfA,GACCX,QAASW,EAAOX,QAChB4B,OAAQjB,GAEC,GAAKA,IAAWA,IAC1BA,GAAUC,SAAUD,IAEjB6D,EAAU7D,EAAO6D,QAAS,CAC7B7D,EAAOpB,OAASoB,EAAOpB,KACvBoB,EAAO6D,QAAUA,EAAU,GAAKA,IAAYA,EACxC/C,GAAcA,EAAWZ,KAAK2D,IAAYE,GAAMF,GACjDA,EAEHC,EAAczJ,EAAQyJ,EAAaD,EAEnC,KAAKvK,IAAQ0G,GACZ8D,EAAYxK,GAAQN,EAAU6K,EAAQvK,GAAO0G,EAAO1G,QAGrDwK,GAAczJ,EAAQyJ,EAAa9D,EAgBpC,OAZsCnE,WAAjC8B,EAAOmG,EAAY7D,YACvB6D,EAAY7D,SAAW,GAAKtC,IAASA,EAAQE,GAAWF,IAASE,GAAWF,GAASA,GAElFmG,EAAYzC,QAAS,KAGvBuC,EAAII,UAAYF,GAAaG,YAAcH,EAAY1C,KAAOwC,GAG5D9C,IACHgD,EAAYI,YAAcpD,GAEpBgD,EAGR,QAAS9J,GAAUqE,GAGlB,MAAO1F,MAAKE,KAAKC,MAAMH,KAAM0F,GAO9B,QAAS8F,GAAYhK,EAAMwD,EAAMmD,EAAYsD,GAI5C,QAASC,GAAepG,GAGvB,GAAIqG,GAAa3G,CACjB,IAAK,GAAKM,IAAUA,GAAUA,EAAMsG,SAAW,IAAMC,EAAOvG,GAAQ,CACnE,IAAKuG,EACJ,GAAI,qBAAqB/K,KAAKwE,IAGzBN,EAAOE,GAAW1D,EAAOA,GAAQ8D,IACpCA,EAAQN,EAIR6G,EAAOC,SAASC,eAAezG,OAE1B,IAAIlG,EAAEI,KAAOmD,GAAKE,MAAM/B,KAAKwE,GACnC,IACCuG,EAAOzM,EAAE0M,UAAUE,KAAK1G,GAAO,GAC9B,MAAOlE,IAGPyK,IAMCJ,EAEHnG,EAAQuG,EAAKI,WAIbN,EAAcE,EAAKK,aAAaC,IAC5BR,EACCA,IAAgBS,IACnB9G,EAAQJ,GAAWyG,SACZzG,IAAWyG,IACRvM,EAAEI,KACZ8F,EAAQlG,EAAEwF,KAAKiH,GAAMO,MAGtB5K,EAAOA,IAASpC,EAAEI,GAAK4M,GAAU9G,GACjCA,EAAQkG,EAAYhK,EAAMqK,EAAKI,UAAW9D,EAAYsD,IAEvDnG,EAAM+G,SAAW7K,EAAOA,GAAQmK,EAC5BnK,IAAS4K,KACZlH,GAAW1D,GAAQ8D,GAEpBuG,EAAKS,aAAaH,GAAU3K,GACxBpC,EAAEI,IACLJ,EAAEwF,KAAKiH,EAAMO,GAAS9G,KAIzBuG,EAAO3I,WACIoC,GAAM9F,KACjB8F,EAAQpC,OAGT,OAAOoC,GAGR,GAAIuG,GAAMU,EACTC,EAAexH,EAAOA,GAAQ,EAuB/B,IApBgB,IAAZyG,IACHA,EAAUvI,OACVsJ,EAAed,EAAec,IAK/Bf,EAAUA,IAAYzG,EAAKyH,OAASzH,MACpCyG,EAAQY,SAAW7K,EACf2G,IACHsD,EAAQF,YAAcpD,IAIlBqE,GAAgBxH,EAAKyH,SAAWD,EAAed,EAAe1G,EAAKyH,UACnED,EAAahN,KAEhBgN,EAAeA,EAAaC,QAGTvJ,SAAjBsJ,EAuBH,MAtBIA,GAAahN,IAAMwF,EAAKxF,GAEvBgN,EAAahN,KAChB+M,EAAeC,IAKhBxH,EAAO0H,EAAWF,EAAcf,GAEhCkB,EAAOH,EAAaI,QAAQC,GAAe,QAAS7H,IAEhDuH,IACJA,EAAe7K,EAAQ,WACtB,MAAO6K,GAAajE,OAAOnI,MAAMoM,EAAcnM,YAC7C4E,GAEH2F,EAAsB4B,IAEnB/K,IAAS2G,GAAc3G,IAAS4K,KACnCU,GAAQtL,GAAQ+K,GAEVA,EAUT,QAASQ,GAAcC,EAAYpI,GAClC,MAAOxF,GAAE6N,WAAWD,GACjBA,EAAWE,KAAKtI,GAChBoI,EAGJ,QAASG,GAAWC,GAClB,GAAIhK,GAAGiK,KACNhK,EAAI+J,EAASxJ,MACd,KAAKR,EAAE,EAAGA,EAAEC,EAAGD,IACdiK,EAAI5C,KAAK2C,EAAShK,GAAG+F,QAEtB,OAAOkE,GAGT,QAASC,GAAiB9L,EAAMyB,GAiB/B,QAASsK,GAAO7H,GACf4F,EAAYnL,MAAMH,KAAM0F,GAGzB,QAAS8H,KACR,MAAO,IAAID,GAAOnN,WAGnB,QAASqN,GAAQ7I,EAAM8I,GACtB,GAAIC,GAAGC,EAAYZ,EAAYrM,EAAMkN,EACpCC,EAAIC,EAAQnK,MACb,KAAK+J,EAAE,EAAGA,EAAEG,EAAGH,IACdhN,EAAOoN,EAAQJ,GACfC,EAAa1K,OACTvC,EAAO,KAAOA,IACjBiN,EAAajN,EACbA,EAAOiN,EAAWI,QAEO9K,UAArB2K,EAAKjJ,EAAKjE,KAAwBiN,GAAuD1K,UAAxC8J,EAAaY,EAAWZ,cAC7Ea,EAAKd,EAAcC,EAAYpI,IAEhC8I,EAAOG,EAAID,GAAcK,EAAWL,EAAW3K,MAAOtC,GAIxD,QAASmI,GAAIlE,GACZA,EAAOA,EAAO,KAAOA,EAClBsJ,KAAKC,MAAMvJ,GACXA,CACH,IAAIxB,GAAOC,EAAM1C,EAChBkN,EAAKjJ,EACLyI,IAED,IAAIrL,GAAS4C,GAAO,CAGnB,IAFAA,EAAOA,MACPvB,EAAIuB,EAAKhB,OACJR,EAAE,EAAGA,EAAEC,EAAGD,IACdiK,EAAI5C,KAAKzK,KAAK8I,IAAIlE,EAAKxB,IAKxB,OAHAiK,GAAIjF,IAAM5G,EACV6L,EAAIlE,MAAQA,EACZkE,EAAIe,MAAQA,EACLf,EAGR,GAAIzI,EAAM,CACT6I,EAAQ7I,EAAM,SAASiJ,EAAIQ,GACtBA,IACHR,EAAKQ,EAAUvF,IAAI+E,IAEpBR,EAAI5C,KAAKoD,KAGVA,EAAK7N,KAAKG,MAAMH,KAAMqN,EACtB,KAAK1M,IAAQiE,GACRjE,IAAS2N,GAAcC,EAAY5N,KACtCkN,EAAGlN,GAAQiE,EAAKjE,IAInB,MAAOkN,GAGR,QAASO,GAAMxJ,GACdA,EAAOA,EAAO,KAAOA,EAClBsJ,KAAKC,MAAMvJ,GACXA,CACH,IAAIxB,GAAGuK,EAAGtK,EAAGyK,EAAGnN,EAAM6N,EAAKlL,EAAOmL,EAAUZ,EAAIa,EAC/CC,EAAQ3O,IAET,IAAIgC,GAAS2M,GAAQ,CAKpB,IAJAF,KACAC,KACArL,EAAIuB,EAAKhB,OACTkK,EAAIa,EAAM/K,OACLR,EAAE,EAAGA,EAAEC,EAAGD,IAAK,CAGnB,IAFAyK,EAAKjJ,EAAKxB,GACVE,GAAQ,EACHqK,EAAE,EAAGA,EAAEG,IAAMxK,EAAOqK,IACpBc,EAASd,KAGba,EAAMG,EAAMhB,GAERrD,IACHmE,EAASd,GAAKrK,EAAQgH,EAAK,KAAOA,EAC/BuD,EAAGvD,KAAQiE,EAAYjE,GAAMkE,EAAIlE,KAAQkE,EAAIlE,MAASuD,EAAGvD,GAC1DA,EAAGkE,EAAKX,IAGRvK,IACHkL,EAAIJ,MAAMP,GACVa,EAAUjE,KAAK+D,IAEfE,EAAUjE,KAAK+C,EAAG1E,IAAI+E,IAQxB,YALIe,EACHA,EAAYD,GAAOE,QAAQH,GAAW,GAEtCC,EAAMjE,OAAOvK,MAAMwO,GAAQ,EAAGA,EAAM/K,QAAQkL,OAAOJ,KAIrDjB,EAAQ7I,EAAM,SAASiJ,EAAIQ,EAAWL,GACjCK,EACHM,EAAMX,KAAUI,MAAMP,GAEtBc,EAAMX,GAAQH,IAGhB,KAAKlN,IAAQiE,GACRjE,IAAS2N,GAAaC,EAAY5N,KACrCgO,EAAMhO,GAAQiE,EAAKjE,IAKtB,QAASwI,KACR,GAAI0E,GAAIlN,EAAMyC,EAAGC,EAAGuK,EAAiBtI,EACpCqJ,EAAQ3O,IAET,IAAIgC,GAAS2M,GACZ,MAAOxB,GAAWwB,EAInB,KAFAd,KACAxK,EAAI0K,EAAQnK,OACPR,EAAE,EAAGA,EAAEC,EAAGD,IACdzC,EAAOoN,EAAQ3K,GACfwK,EAAa1K,OACTvC,EAAO,KAAOA,IACjBiN,EAAajN,EACbA,EAAOiN,EAAWI,QAEnB1I,EAAQqJ,EAAMhO,KACdkN,EAAGlN,GAAQiN,GAActI,GAAS2I,EAAWL,EAAW3K,MACrDjB,GAASsD,GACR6H,EAAW7H,GACXA,EAAM6D,QACP7D,CAEJ,KAAK3E,IAAQgO,GACC,QAAThO,GAAmB4N,EAAY5N,IAASA,IAAS2N,GAAiC,MAAnB3N,EAAK0B,OAAO,IAAekM,EAAY5N,EAAK8F,MAAM,KAASrH,EAAE6N,WAAW0B,EAAMhO,MAChJkN,EAAGlN,GAAQgO,EAAMhO,GAGnB,OAAOkN,GAlKR,GAAIzK,GAAGkI,EACN2C,EAAajO,KACb+N,EAAU9K,EAAK8K,QACfgB,EAAS9L,EAAK8L,OACdzE,EAAKrH,EAAKqH,GACV0E,EAAQ5P,EAAE2P,QACT3G,IAAK5G,GAAQ,UACb2H,MAAOA,EACPiF,MAAOA,GACLW,GACHrJ,EAAO,GACPuJ,EAAO,GACP5L,EAAI0K,EAAUA,EAAQnK,OAAS,EAC/BgL,EAAcxP,EAAE8P,WAChBX,IAyJD,KAFAhB,EAAOlC,UAAY2D,EAEd5L,EAAE,EAAGA,EAAEC,EAAGD,KACd,SAAU4K,GACTA,EAASA,EAAOA,QAAUA,EAC1BO,EAAYP,GAAU5K,EAAE,CACxB,IAAI+L,GAAY,IAAMnB,CAEtBtI,KAASA,EAAO,IAAM,IAAMsI,EAC5BiB,GAAQ,QAAUE,EAAY,MAAQnB,EAAS,MAC/CgB,EAAMhB,GAAUgB,EAAMhB,IAAW,SAAShN,GACzC,MAAKZ,WAAUwD,YAGXgL,EACHA,EAAY5O,MAAMoP,YAAYpB,EAAQhN,GAEtChB,KAAKmP,GAAanO,GALXhB,KAAKmP,IASVP,IACHI,EAAMhB,GAAQqB,IAAML,EAAMhB,GAAQqB,KAAO,SAASrO,GACjDhB,KAAKmP,GAAanO,KAGlB+M,EAAQ3K,GAWZ,OARAkI,GAAc,GAAIgE,UAAS5J,EAAMuJ,EAAKxI,MAAM,OAC5C6E,EAAYD,UAAY2D,EACxBA,EAAM1D,YAAcA,EAEpBkC,EAAG1E,IAAMA,EACT0E,EAAGO,QAAUA,EACbP,EAAGuB,OAASA,EACZvB,EAAGlD,GAAKA,EACDkD,EAGR,QAASd,GAAWD,EAAQhB,GAE3B,GAAI8D,GACHC,EAAUC,GAAqBC,QAC/B1K,EAAOtD,GAEL2G,SACAsH,SACAnK,QACA4C,IAAK,WACLE,OAAQC,GAETkD,EAgBF,OAbAzG,GAAKyH,OAASA,EACThB,EAAQ8D,UAEZA,EAAUK,GAAWC,KAAKpD,GAC1BzH,EAAKuK,QAAUA,EAAUA,EAAQ,GAAGO,cAAgB,IAErDP,EAAUC,EAAQxK,EAAKuK,SACnBA,GAAWA,IAAYC,EAAQO,MAGlC/K,EAAKyH,OAASrN,EAAE4Q,KAAKhL,EAAKyH,SAGpBzH,EAOR,QAASiL,GAAcrF,EAAWsF,GAEjC,QAASC,GAAS3O,EAAM4O,EAAMjI,GAO7B,GAAIkI,GAASC,EAASxJ,EAAUyJ,CAChC,IAAI/O,SAAeA,KAASgP,KAAWhP,EAAKoK,WAAapK,EAAKiL,SAAWjL,EAAKiP,UAA0B,cAAd7F,GAA6BpJ,EAAKuM,SAAWvM,EAAKuN,QAAS,CAKpJ,IAAKjI,IAAYtF,GAChB2O,EAASrJ,EAAUtF,EAAKsF,GAAWsJ,EAEpC,OAAOA,IAAQnO,EAoChB,MAjCaiB,UAATkN,IACHA,EAAO5O,EACPA,EAAO0B,QAEJ1B,GAAQ,GAAKA,IAASA,IACzB2G,EAAaiI,EACbA,EAAO5O,EACPA,EAAO0B,QAERqN,EAAYpI,EACK,cAAdyC,EACCzC,EACCA,EAAW0C,GAAc1C,EAAW0C,OACtCsF,EACHG,EAAUJ,EAAcI,QACX,OAATF,EAEC5O,SACI+O,GAAU/O,IAGlB4O,EAAOE,EAAUA,EAAQpD,KAAKqD,EAAW/O,EAAM4O,EAAMjI,EAAY,GAAKiI,EAClE5O,IACH+O,EAAU/O,GAAQ4O,IAGhBE,GAAWF,IACdA,EAAKhI,IAAMwC,GAERwF,IAASC,EAAU1N,GAAK0N,QAAQzF,KAEnCyF,EAAQ7O,EAAM4O,EAAME,GAEdF,EAGR,GAAIvF,GAAaD,EAAY,GAE7B3I,GAAO4I,GAAcsF,EAGtB,QAASO,GAAWC,GACnB7N,GAAe6N,GAAM,SAASrL,GAC7B,MAAOlF,WAAUwD,QACb1B,GAAayO,GAAMrL,EAAOxC,IAC3BZ,GAAayO,IAQlB,QAAShI,GAAQb,GAChB,QAAS8I,GAAIhP,EAAQ6J,GACpBzL,KAAKoJ,IAAMtB,EAAO2I,OAAO7O,EAAQ6J,GAiBlC,MAdInL,IAAYwH,KAEfA,GACC2I,OAAQ3I,IAINA,EAAO+I,UACV/I,EAASpG,EAAQA,KAAYoG,EAAO+I,SAAU/I,IAG/CA,EAAOgB,IAAM,SAASlH,EAAQ6J,GAC7B,MAAO,IAAImF,GAAIhP,EAAQ6J,IAEjB3D,EAOR,QAASS,GAAc3D,EAAMmF,EAAS+G,EAAa7J,EAAY+C,EAAK3D,GACnE,GAAIjD,GAAGC,EAAGtD,EAAKiF,EAAMtE,EAAQqQ,EAAiBC,EAAUC,EACvD1N,EAAO0D,EACPiK,EAAS,EAsBV,IApBInH,KAAY,GACf+G,EAAc/G,EACdA,EAAU7G,cACO6G,KAAYyG,KAC7BzG,EAAU7G,SAGPnD,EAAMC,KAAKD,MAEdW,EAASV,KACTuD,EAAOA,GAAQ7C,EAAO6C,KACtByB,EAAOzB,EAAKiF,QAAQzI,EAAIuH,UAAY5G,EAAOsE,MACtC5E,UAAUwD,SACdgB,EAAOrB,IAIRyB,EAAOhF,KAGJgF,EAAM,CAkBT,IAjBKiC,GAAcrC,GAAqB,SAAbA,EAAKwD,MAC/B7E,EAAOqB,GAGJrB,GACCqB,IAASrB,IAGZqB,EAAOrB,EAAKqB,MAIdmM,GAAmBxN,EACnB4N,GAAeA,IAAgBJ,EAC1BxN,KACHwG,EAAUA,OAAevG,KAAOoB,IAE7BuM,IAAgB1B,GAAqB2B,UAAYpM,EAAKoM,UAAY7N,GAAQA,IAAS6D,EACvF8J,EAASxH,EAAgB1E,EAAMJ,EAAMmF,EAAS+G,EAAavN,EAAMyG,EAAK3D,EAAUtG,OAC1E,CAUN,GATIwD,GACHyN,EAAWzN,EAAKqB,KAChBqM,EAAY1N,EAAKQ,MACjBR,EAAKQ,MAAQyG,KAEbjH,EAAO6D,EACP7D,EAAKqB,KAAOA,EACZrB,EAAKgB,IAAMwF,GAER/H,GAAS4C,KAAUkM,EAGtB,IAAK1N,EAAI,EAAGC,EAAIuB,EAAKhB,OAAQR,EAAIC,EAAGD,IACnCG,EAAKQ,MAAQX,EACbG,EAAKqB,KAAOA,EAAKxB,GACjB8N,GAAUlM,EAAKxF,GAAGoF,EAAKxB,GAAIG,EAAMZ,QAGlCY,GAAKqB,KAAOA,EACZsM,GAAUlM,EAAKxF,GAAGoF,EAAMrB,EAAMZ,GAE/BY,GAAKqB,KAAOoM,EACZzN,EAAKQ,MAAQkN,EAEVF,IACHI,GAAejO,QAGjB,MAAOgO,GAGR,QAASxH,GAAgB1E,EAAMJ,EAAMmF,EAAS+G,EAAavN,EAAMyG,EAAK3D,EAAUtG,GAC/E,QAASsR,GAAWjB,GAEnBkB,EAAS5P,KAAYqI,GACrBuH,EAAOC,GAAWnB,EAKnB,GAAIhN,GAAGC,EAAGmO,EAASC,EAAWC,EAAYC,EAAa1H,EAAa2H,EAAevF,EAAUkF,EAASD,EAAQ5Q,EAC7GwQ,EAAS,EAiEV,IA/DInR,IAEHsM,EAAWtM,EAAIgG,QACfrF,EAASX,EAAIW,OACbqJ,EAAUA,EAAU7D,EAAU6D,EAAShK,EAAIwE,KAAOxE,EAAIwE,IAElDS,IAASzB,EAAKqE,QACjBqC,EAAcjF,IAASzB,EAAKgB,IAAIO,KAC7BvB,EAAKgB,IAAIO,KACT5B,OACO8B,IAAStE,EAAOkH,QACtB5C,IAASjF,EAAIuH,UAChB2C,EAAcvJ,EAAOsE,KACrB+E,EAAQjF,KAAOpE,EAAOkH,SAEtBqC,EAAcvJ,EAAOkH,SAAWrE,EAAKqE,QAGtCqC,EAAc1G,EAAKqE,QAGhBlH,EAAOE,MAAMa,QAAS,IAIzBsI,EAAUA,MACVA,EAAQtI,MAAO,IAGZ8P,EAAU7Q,EAAOE,MAAM2Q,WACA,MAAtBA,EAAQlP,OAAO,IAClBwP,EAAY,yBAEbN,EAAUA,EAAQ9K,MAAM,KAItBlD,IACH8C,EAAWA,GAAY9C,EAAKE,EAAE4C,SAC9B0D,EAAU7D,EAAU6D,EAASxG,EAAKgB,MAG/ByF,KAAQ,IACX2H,GAAc,EACd3H,EAAM,GAIH3D,IAAa0D,GAAWA,EAAQtI,QAAS,GAAS1B,GAAOA,EAAI0D,EAAE4F,SAClEhD,EAAWnD,QAEZ0O,EAAgBvL,EACZA,KAAa,IAEhBuL,EAAgB1O,OAChBmD,EAAW9C,EAAKE,EAAE4C,UAGnB0D,EAAU/E,EAAK8M,QACZ5L,EAAUlB,EAAK8M,QAAS/H,GACxBA,EAEHuH,EAASvH,EACL/H,GAAS4C,KAAUkM,EAgBtB,IAbAU,EAAUG,EACPpO,EACSL,SAAR8G,GAAqBzG,GACpB,GAAIuG,GAAKC,EAAS,QAASxG,EAAMqB,EAAMI,EAAMgF,EAAK3D,EAAU4D,GAC7D1G,GAAQA,EAAKE,EAAEC,SAElB8N,EAAQ/N,EAAEoC,KAAO9F,GAAOA,EAAI0D,EAAEoC,KAAO9F,GAGlCwR,IACHC,EAAQO,GAAKR,GAEdA,EAAUC,EAAQO,GACb3O,EAAI,EAAGC,EAAIuB,EAAKhB,OAAQR,EAAIC,EAAGD,IAE/BmO,GACHF,EAAWzM,EAAKxB,IAEjBqO,EAAY,GAAI3H,GAAKwH,EAAQ,OAAQE,EAAS5M,EAAKxB,GAAI4B,GAAOgF,GAAO,GAAK5G,EAAGiD,EAAUmL,EAAQ5J,SAE/F8J,EAAa1M,EAAKxF,GAAGoF,EAAKxB,GAAIqO,EAAW9O,IACzCuO,GAAUM,EAAQ/N,EAAE4C,SAAWmL,EAAQ/N,EAAE4C,SAASqL,EAAYD,GAAaC,MAKxEH,IACHF,EAAWzM,GAEZ4M,EAAUG,EAAcpO,EAAO,GAAIuG,GAAKwH,EAAQjF,GAAY,OAAQ9I,EAAMqB,EAAMI,EAAMgF,EAAK3D,EAAU4D,GACjGlK,IAAQA,EAAIkG,OACfuL,EAAQzR,IAAMA,EACdA,EAAIwD,KAAOiO,GAEZN,GAAUlM,EAAKxF,GAAGoF,EAAM4M,EAAS7O,GAElC,OAAOiP,GAAgBA,EAAcV,EAAQM,GAAWN,EAUzD,QAASc,GAAc5Q,EAAGmC,EAAM0O,GAC/B,GAAI1Q,GAAuB2B,SAAb+O,EACX3R,GAAY2R,GACXA,EAAS/E,KAAK3J,EAAKqB,KAAMxD,EAAGmC,GAC5B0O,GAAY,GACb,WAAa7Q,EAAEG,QAAU,GAM5B,OAJIW,IAAamD,SAA+FnC,UAAnF+O,EAAW/P,GAAamD,QAAQ6H,KAAK3J,EAAKqB,KAAMxD,EAAG6Q,GAAY1Q,EAASgC,MACpGhC,EAAU0Q,GAGJ1O,IAASA,EAAKkC,QAAUmE,GAAYC,KAAKtI,GAAWA,EAG5D,QAASiF,GAAMjF,GACd,KAAM,IAAIoB,IAAKuP,IAAI3Q,GAGpB,QAASsQ,GAAYtQ,GACpBiF,EAAM,iBAAmBjF,GAG1B,QAASoL,GAAOF,EAAQzH,EAAMmN,EAAYC,EAAaC,GAKtD,QAASC,GAAqBC,GAC7BA,GAASC,EACLD,GACH3K,EAAQ6C,KAAKgC,EAAOgG,OAAOD,EAAKD,GAAO3F,QAAQ8F,GAAU,QAI3D,QAASC,GAAc5M,EAAS6M,GAC3B7M,IACHA,GAAW,KAEX8L,GACCe,EACG,KAAOA,EAAQ,mBAAqB7M,EAAU,cAAgBA,EAC9D,2BAA6BA,GAAW,mBAAqB0G,IAInE,QAASoG,GAASC,EAAKC,EAAMhN,EAASX,EAAW4N,EAAOnJ,EAAMoJ,EAASC,EAAQC,EAAOC,EAAOC,EAAYtP,IAmCpGkP,GAAWF,GAAQI,IAAUpN,GAAWmN,GAA+B,MAArBA,EAAOzM,WAAqB2M,IACjFvB,EAAYiB,GAITjJ,IACHmJ,EAAQ,IACR5N,EAAYkE,IAEb6J,EAAQA,GAAShB,IAAeE,CAEhC,IAAIiB,IAAgBP,GAAQZ,SAC3BvR,EAAQ,GACR8E,EAAO,GACP6N,EAAW,GACXC,EAAa,GACbC,EAAc,GACdC,EAAiB,GACjBrO,EAAU,GACVsO,EAAa,GAEbf,GAASO,IAAUH,CAGpBjN,GAAUA,IAAYmN,EAASA,GAAU,QAASF,GAClDV,EAAqBvO,GACrByO,EAAMzO,EAAQ+O,EAAIlP,OACdqP,EACCW,GACHhM,EAAQ6C,MAAM,IAAK,KAAOyI,EAAOtG,QAAQ,KAAM,UAAUA,QAAQiH,GAAiB,MAAQ,QAEjF9N,GACM,SAAZA,IACC+N,GAAYhT,KAAKoS,IACpBrB,EAAY,8CAEbyB,EAAeS,EAAQ,SACvBA,EAAQ,GAAKtH,EAAOuH,UAAUD,EAAQ,GAAIhQ,GAC1CgQ,EAAUE,EAAMC,MAChBtM,EAAUmM,EAAQ,GAClBnB,GAAQ,GAELM,GAEHiB,EAAYjB,EAAOtG,QAAQ8F,GAAU,KAAMY,EAActO,GACvD4H,QAAQwH,GAAY,SAAStB,EAAKuB,EAASC,EAAOtK,EAAKuK,EAAUC,EAAUC,EAAKC,GAmBhF,MAlBA1K,GAAM,IAAMuK,EAAW,KACnBE,GACH/O,GAAQ8O,EAAW,IACnBhB,GAAc,IAAMkB,EAAQ,MAClBJ,GACVf,GAAYvJ,EAAM,SAAWwK,EAAW,KAAOE,EAAQ,WAEvDhB,GAAkB1J,EAAM,IAAM0K,EAAQ,MAC5BL,EACVhP,GAAWmP,GAEM,YAAbD,IACHZ,GAAca,GAEf5T,GAASoJ,EAAMwK,EAAW,IAC1Bf,GAAezJ,EAAM,IAAM0K,EAAQ,KACnCC,EAAcA,GAAe9T,GAAaC,KAAKyT,IAEzC,KACL9N,MAAM,MAGP6M,GAAgBA,EAAa,IAChCA,EAAaY,MAGdU,GACE7O,EACAX,KAAegN,GAAeuC,GAAe,GAC7C/B,MACAiC,EAAYrB,IAA2B,MAAZzN,EAAkB,WAAa,IAAK0N,EAAaC,GAC5EmB,EAAYnP,IAAqB,MAAZK,EAAkB,QAAU,IAAKnF,EAAO2S,GAC7DlO,EACAsO,EACAL,GAAgB,GAElB1L,EAAQ6C,KAAKmK,GACThC,IACHqB,EAAMxJ,KAAKsJ,GACXA,EAAUa,EACVb,EAAQ,GAAKvB,IAEJa,IACVV,EAAcU,IAAeU,EAAQ,IAAqB,SAAfA,EAAQ,IAAiBV,EAAYU,EAAQ,IACxFA,EAAQ,GAAKtH,EAAOuH,UAAUD,EAAQ,GAAIhQ,GAC1CgQ,EAAUE,EAAMC,OAEjBvB,GAAeoB,GAAWV,GAC1BzL,EAAUmM,EAAQ,GAInB,GAAI3Q,GAAG8N,EAAQ0D,EAASD,EAAaG,EACpClB,EAAY1R,GAAa0R,WAAa5O,GAAQA,EAAK4O,WAC/C9Q,GAAe8Q,aAAc,EACjCmB,KACAvC,EAAM,EACNyB,KACArM,EAAUmN,EACVhB,GAAW,CAAC,CAACgB,EAgCd,IA9BInB,GAAa5O,EAAKoD,MACrBpD,EAAK4O,UAAYA,GAUdzB,IACiBjP,SAAhBkP,IACH3F,EAASA,EAAOhG,MAAM,GAAI2L,EAAYxO,OAAS,GAAKpB,IAErDiK,EAASnK,GAAiBmK,EAAShK,IAGpCkQ,EAAcsB,EAAM,IAAMA,EAAM,GAAG,GAAGC,MAAM,IAE5CzH,EAAOG,QAAQlK,EAAMmQ,GAErBP,EAAqB7F,EAAO7I,SAExB4O,EAAMuC,EAAOA,EAAOnR,OAAS,KAChC+O,EAAc,GAAKH,IAAQA,IAASA,EAAI,KAAOA,EAAI,IAAOA,EAAI,IAK3DL,EAAY,CAIf,IAHAjB,EAAS8D,EAAUD,EAAQtI,EAAQ0F,GACnC2C,KACA1R,EAAI2R,EAAOnR,OACJR,KACN0R,EAASnQ,QAAQoQ,EAAO3R,GAAG,GAE5B6R,GAAS/D,EAAQ4D,OAEjB5D,GAAS8D,EAAUD,EAAQ/P,EAE5B,OAAOkM,GAGR,QAAS+D,GAASzV,EAAI0V,GACrB,GAAIlL,GAAKmL,EACR/R,EAAI,EACJC,EAAI6R,EAAStR,MAEd,KADApE,EAAG6E,QACIjB,EAAIC,EAAGD,IAAK,CAClB+R,EAAQD,EAAS9R,EACjB,KAAK4G,IAAOmL,GACC,WAARnL,GAAoBmL,EAAMC,eAAepL,IAAQmL,EAAMnL,GAAKpG,SAC/DpE,EAAG6E,KAAO7E,EAAG6E,KAAKyK,OAAOqG,EAAMnL,KAIlCxK,EAAG2V,MAAQA,EAGZ,QAASN,GAAYnP,EAAM9E,EAAO2D,GACjC,OAAQmB,EAAKe,MAAM,MAAQ7F,EAAM6F,MAAM,MAAQlC,EAAIkC,MAAM,OAG1D,QAAS4O,GAAeC,EAAOrS,GAC9B,MAAO,QACHA,EACAA,EAAO,KACP,IACD,SAAWqS,EAAM,GAAK,KACrBA,EAAM,KAAOrS,EACb,eAAiBqS,EAAM,GAAK,IAC5B,KACAA,EAAM,GAAK,aAAeA,EAAM,GAAK,IAAM,IAGhD,QAASnB,GAAYjB,EAAQI,EAActO,GAE1C,QAASuQ,GAAYzC,EAAK0C,EAASC,EAAQC,EAAOC,EAAMC,EAAUC,EAAKC,EAAIC,EAAOC,EAAKC,EAAOC,EAASC,EAAMC,EAAMC,EAAOC,EAAUC,EAAMC,EAAOzS,EAAO0S,GAIvJ,QAASC,GAAUC,EAASC,EAAKC,EAAQ3S,EAAQX,EAAMuT,EAAcC,EAAYC,GAGhF,GAAIC,GAAqB,MAAXJ,CACd,IAAIA,IACHlB,EAAOA,EAAKlP,MAAMmQ,EAAIhT,QAClB,mBAAmB9C,KAAKkW,GAAWrB,IACtC9D,EAAY8E,GAERM,IACJN,GAAWzS,EACP,aAAeA,EAAS,KACxBX,EACC,OACA,SACDyT,GACCF,EACA,IAAMA,EACN5S,EACC,GACCX,EAAO,GAAK,IAAMsT,IACjBE,GAAc,KACjBC,EAAY9S,EAAS,GAAKX,EAAOuT,GAAgB,GAAKD,EAAQ,KAEnEF,GAAqBK,EAAY,IAAMA,EAAY,GAEnDL,EAAUC,GAA+B,cAAxBD,EAAQlQ,MAAM,EAAG,GAC/BkQ,EAAQlQ,MAAM,GACdkQ,IAEA7B,GAAU,CAEb,GADAoC,EAAkB,WAAVC,EAAsBC,EAAS9D,EAAa+D,OAAS/D,EAAa+D,WAAgBC,EAAOC,GAC7FC,EAAQP,GAAWC,EAAMA,EAAMtT,OAAO,IACzC,GAAI4T,EAAMC,KAAM,CACf,KAAOD,EAAME,IACZF,EAAQA,EAAME,EAEXF,GAAM3R,MACT8P,EAAO,IAAMA,EAAKlP,MAAM,IAEzB+Q,EAAME,GAAK/B,EACX6B,EAAM3R,IAAM2R,EAAM3R,KAA0B,MAAnB8P,EAAKtT,OAAO,QAGtC6U,GAAMzM,KAAKkL,EAEZgC,GAAUC,GAAc7T,GAASkT,EAAU,EAAI,GAGjD,MAAON,GAIJjB,IAAUI,IACbH,EAAOD,EAAQC,GAEhBC,EAAWA,GAAY,GACvBH,EAASA,GAAUD,GAAWU,EAC9BP,EAAOA,GAAQI,EAGfC,EAAMA,GAAOO,GAAQ,EAErB,IAAIsB,GAAMC,EAAQZ,EAAOM,EAAOO,EAC/BC,EAAO,GAOR,IALY,MAARhC,IACHA,EAAM,UACNgC,EAAO,OAGJnC,GAAQoC,GAAWC,EAEhB,CACN,GAAIpD,GAAYwB,IAAa2B,IAAWC,KAGlCf,GAASgB,GAAaf,KAC1BS,EAAOF,EAAUC,EAAa,GAC1BnB,EAAK7S,OAAS,EAAIG,GAAS8T,GAAQ,IAAI,CAE1C,GADAA,EAAOpB,EAAKhQ,MAAMoR,EAAM9T,EAAQ+O,EAAIlP,QAChCkU,KAAW,EAId,GAHAZ,EAAQE,GAAUgB,EAASR,EAAW,GAAGL,GAEzCC,EAAQN,EAAMA,EAAMtT,OAAO,GACvB4T,GAASA,EAAMa,IAAK,CACvB,KAAOb,EAAME,IAAMF,EAAME,GAAGW,KAC3Bb,EAAQA,EAAME,EAEfK,GAAQP,EAAME,IAAM/B,KAAM6B,EAAME,GAAI7R,IAAK2R,EAAM3R,SAE/CqR,GAAMzM,KAAKsN,GAASpC,KAAMuB,EAAMhD,OAGlCoC,GAAW/T,GAAiB,IAAMsV,EAC/B,cACArV,GACHsV,EAASQ,EAAUhC,GACdwB,IACJQ,EAAUhC,IAAY,EACtBgC,EAAUhC,GAAYwB,EAASnL,EAAO2J,EAAUtR,GAAM,IAEnD8S,KAAW,GAAQC,IAEtBA,EAAMN,KAAOK,EACbC,EAAMM,IAAMf,EAAOC,GACnBQ,EAAMlS,IAAMkS,EAAMlS,KAAOkS,EAAMpC,MAAQoC,EAAMpC,KAAK4C,QAAQ,MAAQ,GAKtE,MAAQN,IAEJA,GAAU9B,EAAO8B,EAASnF,EAAMoD,EAAU,KAC3CgC,GAEEA,GAAU9B,EAAO8B,EAASpF,EAAMoD,EAAU,MAG5CT,GACGkC,EAAUC,GAAc7T,IAASuT,EAASc,IAAWR,IAAeL,OAAS9B,GAC9E,KACAe,EACCoB,EACA,IAECY,EAAa/B,EAAKhQ,MAAM+R,EAAYzU,IAAQoT,GAC3CA,EAAQgB,EAAYf,GAAS,EAAO,MACrC,OAASoB,GAAcA,EAAazU,EAAQ+O,EAAIlP,OAAQkR,GAAYxB,EAAa7I,KAAK6M,EAAOC,OAAU,OAEzGzB,GAEE8B,GAAc/F,EAAYqB,GAAS4B,GAAYxB,EAAaY,MAAOiD,EAAQxB,EAAMwC,EAAYzC,EAAO8C,EAAazU,EAAQ+O,EAAIlP,OAAQ8R,IAAUZ,EAAWwC,EAAOC,GAAKjE,EAAa6D,OAAcxB,EAAO,KACzMA,EAEEA,EAAK8C,MAAM,KAAKC,KAAK,KAAK9L,QAAQ+L,GAAOjC,IACxCV,GAECsB,EAASc,IAAWR,IAAeL,OAASqB,EAAOhB,GAAcI,EAAMhC,GACxEJ,GAEFA,EAECA,EACAS,GAEGA,EAAQuC,EAAOhB,IAAevB,EAAOuC,EAAOhB,IAAc,EAAON,EAASc,IAAWR,GAAavB,GAClGL,GACCsB,EAASc,IAAWR,GAAagB,EAAOhB,GAAcI,EAAMhC,GAC7D,KAEFC,GACE2C,EAAOhB,IAAe/F,EAAYqB,GAAS,KAC5CsC,EACC,IACCyC,EAAS9B,EAAM+B,EAAS9B,EAAM,MAnF1CvE,EAAYqB,GAyFd,GAAIiE,GAAOC,EAAQe,EAClBD,EACAD,EACAnD,EAAWxB,GAAgBA,EAAa,GACxCgE,GAAUC,GAAIzC,GACdsD,GAAYS,EAAGvB,GACfkB,EAAa,EACbF,GAAatT,EAAOA,EAAK2K,MAAQmF,IAAaA,EAASnF,MAAQmF,EAASnF,aAAiBvI,EAAQpC,KAAK2K,MAGtGiI,EAAa,EACbgB,KACAjB,KACAzG,GAAUgC,GAAUlO,EAAO,IAAM,KAAK4H,QAAQkM,GAASvD,EAExD,QAAQqC,GAAc1G,GAAUW,EAAYqB,GAG7C,QAAS8B,GAAU+D,EAAK/T,EAAMmN,GAG7B,GAAI/O,GAAG4V,EAAMjT,EAASX,EAAW1E,EAAQuY,EAAQC,EAAYC,EAASC,EAASC,EAASC,EAAchG,EAAcJ,EAAQqG,EAAiBC,EAC5IC,EAAWC,EAAarN,EAAUsN,EAAYC,EAAahS,EAAS6E,EAAQoN,EAAYC,EAASC,EAAQC,EAAUC,EAAU5U,EAAS6U,EAAUC,EAChJC,EAAiB,EACjBhJ,EAAW3B,GAAqB2B,UAAYpM,EAAKoM,UAAYpM,EAAKuC,MAAQvC,EAAK2E,WAAa3E,EAAK8M,SAAW9M,EAAKqV,WACjHC,EAAO,GACPC,KACAlX,EAAI0V,EAAInV,MAgBT,KAdI,GAAKoB,IAASA,GACjBqH,EAAW8F,EAAa,cAAgBnN,EAAK4H,QAAQ8F,GAAU,KAAKjM,MAAM,MAAS,IAAMzB,EACzFA,EAAO,IAEPqH,EAAWrH,EAAKqH,UAAY,UACxBrH,EAAK4O,YACR2G,EAAY3G,WAAY,GAErB5O,EAAKwV,QACRD,EAAYC,OAAQ,GAErBlB,EAAetU,EAAKQ,KACpBkU,EAAc1U,EAAKqD,OAEfjF,EAAI,EAAGA,EAAIC,EAAGD,IAKlB,GAHA4V,EAAOD,EAAI3V,GAGP,GAAK4V,IAASA,EAEjBsB,GAAQ,OAAStB,EAAO,QAIxB,IADAjT,EAAUiT,EAAK,GACC,MAAZjT,EAEHuU,GAAQ,MAAQtB,EAAK,GAAK,gBACpB,CAqDN,GApDA5T,EAAY4T,EAAK,GACjBpR,GAAWuK,GAAc6G,EAAK,GAC9BtY,EAAS2U,EAAe2D,EAAK,GAAI,UAAY,KAAO3D,EAAenC,EAAS8F,EAAK,IACjF3T,EAAU2T,EAAK,GACfmB,EAAUnB,EAAK,GACfvM,EAASuM,EAAK,IAAMA,EAAK,GAAGpM,QAAQiH,GAAiB,OACjDkG,EAAqB,SAAZhU,GACRuN,GACHA,EAAa7I,KAAKuO,EAAK,KAGxBoB,EAAiB,EACbd,IAAiBhG,EAAe0F,EAAK,MACxC1F,GAAgBA,GAChB8G,EAAiBd,EAAa7O,KAAK,KAGrC2G,EAAWA,GAAY8B,EAAO,IAAMA,EAAO,IAAMI,GAAgB,iBAAiBxS,KAAKoS,EAAO,KAI1F8G,EAAuB,MAAZjU,GACVX,IACHW,EAAUX,IAAckE,GAAO,IAAMlE,EAAYW,IAG9C6B,IAEH+R,EAAajN,EAAWD,EAAQ8N,GAChCZ,EAAWtN,SAAWA,EAAW,IAAMtG,EAEvC4T,EAAWvI,SAAWuI,EAAWvI,UAAYA,EAC7C4D,EAAUpN,EAAS+R,GACnBvI,EAAWuI,EAAWvI,SACtBsI,EAAYjP,KAAKkP,IAGbI,IAEJH,EAAc7T,EACdqL,EAAWA,GAAYrL,KAAaqF,GAAMrF,KAAaqF,GAAMrF,GAASE,MAEtE6T,EAAUQ,EACVA,EAAO,IAERT,EAAad,EAAI3V,EAAI,GACrByW,EAAaA,GAAgC,SAAlBA,EAAW,IAEvCK,EAAW7U,EAAU,iBAAmB,MACxCkU,EAAkB,GAClBC,EAAgB,GAEZQ,IAAa1G,GAAgB6G,GAAW/U,GAAaA,IAAckE,IAAO,CAO7E,GALA2Q,EAAW,GAAI3K,UAAS,gBAAiB,OAASjD,EAAW,IAAM+N,EAAiB,IAAMrU,EACnF,aAAerF,EAAS,MAC/BuZ,EAAS9T,IAAMd,EACf4U,EAASQ,KAAO1U,EAEZoM,EACH,MAAO8H,EAGRhF,GAASgF,EAAU3G,GACnBmG,EAAY,MAAQrU,EAAY,UAChCiU,GAAU,EACVE,EAAkBE,EAAYW,EAAiB,IAC/CZ,EAAgB,IAgBjB,GAdAc,GAASN,GACL7H,GAAc9M,EAAU,SAAW,IAAM,UAAY6U,IAAab,GACjEA,EAAUnW,OAAWkO,EAAWgI,GAAU,EAAMK,GAAanG,GAC3DgG,EAAac,EAAiB,GAAKH,EAAWG,GAChD,IAAM1Z,EAAS,KAAO,KACX,MAAZqF,GACEmT,GAAa,EAAM,KAAOhG,EAAO,GAAK,MACtCiG,GAAU,EAAM,OAASjG,EAAO,GAAK,cAAgBf,EAAa,QAAU,UAG9E8G,GAAS,EAAM,sBACdrR,EAAU8R,EAAY9V,OAAS,KAAO,IACvClD,EAAS,MAETkZ,IAAgBC,EAAY,CAK/B,GAFAS,EAAO,IAAMA,EAAK7T,MAAM,MAAS,IACjCgT,EAAY,MAAQG,EAAc,eAC9BzH,GAAcmB,EAAc,CAQ/B,GANAgH,EAAO,GAAIhL,UAAS,gBAAiB,OAASjD,EAAW,IAAM+N,EAAiB,IAAMR,EAAc,YAAcU,EAAO,KACzHA,EAAKnU,IAAMd,EACXiV,EAAKG,KAAOb,EACRtG,GACH2B,EAASqE,EAAac,EAAiB,GAAKE,EAAMhH,GAE/CnB,EACH,MAAOmI,EAERf,GAAkBE,EAAYW,EAAiB,cAC/CZ,EAAgB,IAMjBc,EAAOR,EAAUI,EAAWT,GAAaW,GAAkBE,GAAQ,IACnEhH,EAAe,EACfsG,EAAc,EAEXvU,IACH+L,GAAW,EACXkJ,GAAQ,oBAAsBnI,EAAa,OAAS,MAAQoH,EAAkB,iBAAmBlU,EAAU,IAAMmU,EAAgB,MAAQrH,EAAa,GAAK,YAM/JmI,EAAO,MAAQjO,EAEZ,WACC4M,EAAS,YAAc,KACvBG,EAAU,aAAe,KACzBF,EAAa,aAAe,KAC5B/G,EAAa,MAAQ,cACrBoI,EAAYC,MAAQ,YAAc,IACnCF,GACCnI,EAAa,KAAO,kBAEpBjQ,GAAawY,aAAc,IAC9BJ,EAAO,UAAYA,EAAO,2CAG3B,KACCA,EAAO,GAAIhL,UAAS,gBAAiBgL,GACpC,MAAOlZ,GACRyQ,EAAY,8BAAgCyI,EAAO,QAAUlZ,EAAEG,QAAU,KAM1E,MAJIyD,KACHA,EAAKxF,GAAK8a,EACVtV,EAAKoM,WAAaA,GAEZkJ,EAQR,QAASpU,GAAU6D,EAAS4Q,GAG3B,MAAO5Q,IAAWA,IAAY4Q,EAC1BA,EACAjZ,EAAQA,KAAYiZ,GAAgB5Q,GACpCA,EACD4Q,GAAiBjZ,KAAYiZ,GAIjC,QAASC,GAAcC,GACtB,MAAOC,IAAaD,KAAQC,GAAaD,GAAM,KAAOA,EAAGE,WAAW,GAAK,KAG1E,QAASC,GAAepZ,GAGvB,GAAIoI,GAAKrJ,EACRC,IAED,UAAWgB,KAAW4O,GACrB,IAAKxG,IAAOpI,GACXjB,EAAOiB,EAAOoI,GACVA,IAAQsE,GAAY1M,EAAOwT,eAAepL,KAAS1J,GAAYK,IAClEC,EAAM6J,MAAMT,IAAKA,EAAKrJ,KAAMA,GAI/B,OAAOC,GAGR,QAASqa,GAAUrW,EAAMmF,EAAS+G,GACjC,GAAIoK,GAAWlb,KAAKmb,SAAWnb,KAAK,IAAMwG,EAAM,sBAAwBxG,KAAKob,SAAW,MACvFpW,EAAOkW,EAAShP,aAAaC,GAE9B,OAAO5D,GAAc2E,KAAKlI,EAAO5F,EAAEwF,KAAKsW,GAAU9O,IAAWlH,GAAWgW,GAAWtW,EAAMmF,EAAS+G,GAKnG,QAASuK,GAAWC,GAEnB,MAAepY,SAARoY,EAAoBC,GAAQza,KAAKwa,KAAU,GAAKA,GAAM1O,QAAQ4O,GAAaZ,IAAkBU,EAAO,GAtkE5G,GAAIG,GAAarc,KAAM,CAEvBA,GAAIA,GAAKA,EAAEI,GAAKJ,EAAID,EAAOE,MAE3B,IACCqc,GAAchZ,EAAmB0E,EAASnF,EAAQqM,EAGlDhO,GAAa0B,GAAUkD,GAAY0E,GAAapF,GAAU4G,GAAOzI,GAAMT,GAAcuN,GAAsB3M,GAAgBR,GAAgBC,GAAgBC,GAAiBC,GAAiBL,GAAUuZ,GASvMxK,GAbGyK,GAAgB,UAMnBjD,GAAQ,+GAGRG,GAAU,4OAKVpG,GAAW,sBACXmB,GAAkB,YAClBhH,GAAgB,UAChBuH,GAAa,6EACbN,GAAc,QACdlE,GAAa,cACbiM,GAAc,iBACdN,GAAU,iBACV1a,GAAe,4BACf4I,GAAuB,0BACvB+R,GAAcK,GACdtR,GAAS,EACTuQ,IACCgB,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,KAAQ,OACRC,IAAK,QACLC,IAAK,QACLC,IAAK,QACLC,IAAK,SAEN/S,GAAO,OACPkH,GAAS,SACTrE,GAAW,gBACXC,GAAU,UACV5B,GAAW,8CACXsC,MAEAwP,GAAMnd,EAAOod,SACbC,GAAUF,IAAOld,IAAMA,EAAEkJ,OAEzByC,IACCzD,UACCgJ,QAAS9E,GAEVzL,KACCuQ,QAAStF,GAEVqD,WACCiC,QAAShD,GAEVpJ,UACAkB,aAihEF,IA7gECnD,GACCwa,QAASb,GACTc,KAEC5S,KAAMA,EACNoI,IAAK5Q,EACLqL,OAAQA,EACRwB,MAAOgG,EACPpF,OAAQrN,EACRwE,UAAWA,EACXyW,UAAW9K,EACXxB,WACAK,WAAYA,EACZkM,UACChJ,WAAW,GAEZiJ,OAAQrc,EACRsc,KAAMrc,EACNkF,IAAK,aACLoX,MAAO5X,EACPsV,KAAMzT,EACNb,IAAKK,EACLwW,KAAMhL,EACNiL,MAAO5B,EACP5W,IAAK1D,EACLmc,IAAK,SAASC,GAIb,MAHc,gBAAVA,GACHtL,EAAY,IAENsL,IAGTP,UACCza,WAAYN,EACZub,SAAU,SAAS9X,GAClB,MAAOA,IAEJ5D,EAAQ+N,GAAsBnK,GAC9B3C,GAAKka,SACL/Z,IAEC2M,KAGN5K,OAAQ9D,EACR+H,IAAKH,IA2ENrH,EAAa+J,UAAY,GAAIgS,QAAS/R,YAAchK,EAoGrDwC,EAAe4C,QAAU,WACxB,OAAQ1G,KAAK2D,IAAI,QAAS,UAO3BK,EAAS0C,QAAU,QAiXnBoD,EAAKuB,WACJ1H,IAAKZ,EACLiB,SAAUA,EACViB,OAAQ2B,EACR4B,QAASzD,EACTuY,IAAKrZ,EACLmE,IAAK,QA+6CNzF,GAAOV,EAAOya,IACd5Z,GAAiBb,EAAO2a,WAElBN,IAAOld,GAAKA,EAAEkJ,QAAS,CAE5B,IAAKoT,IAAgB3Q,IACpBkF,EAAcyL,EAAc3Q,GAAU2Q,GAGvC9R,IAAc3H,EAAOoY,WACrB7V,GAAWvC,EAAO6P,QAClB1G,GAAQnJ,EAAOsF,KAEf5E,GAAKgD,IAAI0F,WACRhK,UAAWA,EACX+E,QAASE,GAGVc,EAAUzE,GAAKyE,QAAU,GAAI0C,GAGzB1K,GAKHA,EAAEI,GAAG8I,OAAS2S,EACd3M,EAAWlP,EAAEme,QACTne,EAAE8P,aACLxN,EAAQiB,GAAMvD,EAAE+D,MAAMuZ,KACtBza,EAAO6G,IAAM1J,EAAE+D,MAAM2F,OAOtB1J,KAEIqc,IACHtc,EAAOod,SAAWnd,GAKnBA,EAAEoe,WAAape,EAAEqe,UAAYre,EAAEkR,QAAU,WAAa,KAAM,kDAG5DlR,EAAE6N,WAAa,SAASY,GACvB,MAAqB,kBAAPA,IAGfzO,EAAEiL,QAAUqT,MAAMrT,SAAW,SAASsT,GACrC,MAAmC,sBAAhB,SAAEzQ,KAAKyQ,IAG3Bhb,GAAKib,IAAM,SAASC,GACfA,IAAOze,IACVsC,EAAQmc,EAAIze,GACZA,EAAIye,EACJze,EAAEI,GAAG8I,OAAS2S,QACP7b,GAAEmd,SACTjO,EAAWlP,EAAEme,UAIfne,EAAEmd,SAAWX,IAEd1Z,GAAeS,GAAKia,SACpB1a,GAAa0R,WAAY,EACzBtT,GAAclB,EAAE6N,WAChB7N,EAAEkJ,OAASwE,GACX1N,EAAE+D,MAAQlB,EACV7C,EAAEuK,UAAYzE,GAAajD,EAAO0H,SAElC,KAAKgS,KAAWzZ,IACfwO,EAAWiL,KAGX7Y,GAAe4X,UAAY,SAASA,GACpC,MAAqBxX,UAAdwX,EACJxY,GAAawY,WAEdxY,GAAawY,UAAYA,EACzBxY,GAAamD,QAAUqV,EAAY,KAAOA,EACvC,GAAIpL,UAAS,GAAI,WAAaoL,EAAY,MAC1Cpa,GAAYoa,GACXA,EACAxX,OACJJ,OACA,GAEH2M,GAAuBvN,GAAakb,UACnChM,UAAU,EACVqG,MAAM,GAKPrM,IACC0S,MACCxV,OAAQ,SAAStH,GAKhB,GAAIoJ,GAAOpK,KACVU,EAAS0J,EAAK1J,OACdZ,EAAOsK,EAAKnB,UAAU8U,OAAS/c,IAAQZ,UAAUwD,SAAWlD,EAAOqD,OAChE,IACCqG,EAAKnB,UAAU8U,MAAO,EAAM3T,EAAK4T,SAAWtd,EAAOqD,MAGrDrD,EAAO4H,OAAO5H,EAAO6C,MAAM,GAC9B,OAAOzD,IAERmG,MAAM,GAEPgY,OACC3V,OAAQ,SAAStH,GAGhB,GACCsE,GADG4Y,GAAa9d,UAAUwD,OAE1BwG,EAAOpK,KACPU,EAAS0J,EAAK1J,OACdwQ,EAAS,GACT6M,EAAO,CAaR,OAXK3T,GAAKnB,UAAU8U,OACnBzY,EAAQ4Y,EAAYxd,EAAO6C,KAAKqB,KAAO5D,EACzBkC,SAAVoC,IACH4L,GAAUxQ,EAAO4H,OAAOhD,EAAO4Y,GAC/BH,GAAQ/b,GAASsD,GAASA,EAAM1B,OAAS,IAEtCwG,EAAKnB,UAAU8U,KAAOA,KACzB3T,EAAK4T,SAAWtd,EAAOqD,QAIlBmN,GAERjL,MAAM,GAEPrF,OACCsK,QAAS,MACTvC,QAASA,EAAQqS,GACjB/U,MAAM,GAEPkY,SACClY,MAAM,GAEPmY,KAEC9V,OAAQvH,EACRkF,MAAM,GAEPoY,MAEC/V,OAAQvH,EACRkF,MAAM,GAEPqY,IAAK9Z,GAAS8Z,IAAM1U,GAAY0U,IAAMrd,IAGvC2I,IACCC,KAAMwR,EACN7T,KAAM6T,EACNkD,IAAK,SAASjD,GAEb,MAAepY,SAARoY,EAAoBkD,UAAU,GAAKlD,GAAiB,OAATA,EAAgBA,EAAO,MAY5E,MAPApZ,IAAeS,GAAKia,SACpB5a,IAAY5C,GAAGkd,IAAKjS,QACpBvH,GAAeX,WAAW,KAAM,KAAM,KAElCqa,IACHF,GAAInZ,MAAMuZ,IAAIkB,IAAIxe,GAEZA,GAAKkd,IACTmC","file":"jsrender.min.js","sourcesContent":["/*! JsRender v0.9.82 (Beta): http://jsviews.com/#jsrender */\n/*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */\n/*\n * Best-of-breed templating in browser or on Node.js.\n * Does not require jQuery, or HTML DOM\n * Integrates with JsViews (http://jsviews.com/#jsviews)\n *\n * Copyright 2016, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041\n\n(function(factory, global) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar $ = global.jQuery;\n\n\tif (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory(global, $)\n\t\t\t: function($) { // If no global jQuery, take optional jQuery passed as parameter: require('jsrender')(jQuery)\n\t\t\t\tif ($ && !$.fn) {\n\t\t\t\t\tthrow \"Provide jQuery or null\";\n\t\t\t\t}\n\t\t\t\treturn factory(global, $);\n\t\t\t};\n\t} else if (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine(function() {\n\t\t\treturn factory(global);\n\t\t});\n\t} else { // Browser using plain ',jn='',Cn='',\n\topenScript = ' - data-linked tag, close marker\n\t\t\t// We validate with inTag so no script markers are inserted in attribute context e.g. for:\n\t\t\t// \"\" or \"
...{{/if}}...\"\n\t\t\tpreceding = id\n\t\t\t\t? (preceding + endOfElCnt + spaceBefore + (inTag ? \"\" : openScript + id + closeScript)+ spaceAfter + tag)\n\t\t\t\t: endOfElCnt || all;\n\t\t}\n\n\t\tif (validate && boundId) {\n\t\t\tif (inTag) {\n\t\t\t\t// JsViews data-linking tags are not allowed within element markup.\n\t\t\t\t// See jsviews/issues/303\n\t\t\t\tsyntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link=\"...\"');\n\t\t\t}\n\t\t\tif (id.charAt(0) === \"#\") {\n\t\t\t\ttagStack.unshift(id.slice(1));\n\t\t\t} else if (id.slice(1) !== (bndId = tagStack.shift())) {\n\t\t\t\t// See jsviews/issues/213\n\t\t\t\tsyntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>');\n\t\t\t}\n\t\t}\n\t\tif (tag) {\n\t\t\tinTag = tag;\n\t\t\t// If there are ids (markers since the last tag), move them to the defer string\n\t\t\ttagStack.unshift(parentTag);\n\t\t\tparentTag = tag.slice(1);\n\t\t\tif (validate && tagStack[0] && tagStack[0] === badParent[parentTag]) {\n\t\t\t\t// Missing \n\t\t\t\t// TODO: replace this by smart insertion of tags\n\t\t\t\terror('Parent of must be ');\n\t\t\t}\n\t\t\tisVoid = voidElems[parentTag];\n\t\t\tif ((elCnt = elContent[parentTag]) && !prevElCnt) {\n\t\t\t\tdeferStack.unshift(defer);\n\t\t\t\tdefer = \"\";\n\t\t\t}\n\t\t\tprevElCnt = elCnt;\n//TODO Consider providing validation which throws if you place as child of , etc. - since if not caught,\n//this can cause errors subsequently which are difficult to debug.\n//\t\t\t\tif (elContent[tagStack[0]]>2 && !elCnt) {\n//\t\t\t\t\terror(parentTag + \" in \" + tagStack[0]);\n//\t\t\t\t}\n\t\t\tif (defer && elCnt) {\n\t\t\t\tdefer += \"+\"; // Will be used for stepping back through deferred tokens\n\t\t\t}\n\t\t}\n\t\treturn preceding;\n\t}\n\n\tfunction processViewInfos(vwInfos, targetParent) {\n\t\t// If targetParent, we are processing viewInfos (which may include navigation through '+-' paths) and hooking up to the right parentElem etc.\n\t\t// (and elem may also be defined - the next node)\n\t\t// If no targetParent, then we are processing viewInfos on newly inserted content\n\t\tvar deferPath, deferChar, bindChar, parentElem, id, onAftCr, deep,\n\t\t\taddedBindEls = [];\n\n\t\t// In elCnt context (element-only content model), prevNode is the first node after the open, nextNode is the first node after the close.\n\t\t// If both are null/undefined, then open and close are at end of parent content, so the view is empty, and its placeholder is the\n\t\t// 'lastChild' of the parentNode. If there is a prevNode, then it is either the first node in the view, or the view is empty and\n\t\t// its placeholder is the 'previousSibling' of the prevNode, which is also the nextNode.\n\t\tif (vwInfos) {\n\t\t\tif (vwInfos._tkns.charAt(0) === \"@\") {\n\t\t\t\t// We are processing newly inserted content. This is a special script element that was created in convertMarkers() to process deferred bindings,\n\t\t\t\t// and inserted following the target parent element - because no element tags (outside elCnt) were encountered to carry those binding tokens.\n\t\t\t\t// We will step back from the preceding sibling of this element, looking at targetParent elements until we find the one that the current binding\n\t\t\t\t// token belongs to. Set elem to null (the special script element), and remove it from the DOM.\n\t\t\t\ttargetParent = elem.previousSibling;\n\t\t\t\telem.parentNode.removeChild(elem);\n\t\t\t\telem = undefined;\n\t\t\t}\n\t\t\tlen = vwInfos.length;\n\t\t\twhile (len--) {\n\t\t\t\tvwInfo = vwInfos[len];\n//if (prevIds.indexOf(vwInfo.token) < 0) { // This token is a newly created view or tag binding\n\t\t\t\tbindChar = vwInfo.ch;\n\t\t\t\tif (deferPath = vwInfo.path) {\n\t\t\t\t\t// We have a 'deferred path'\n\t\t\t\t\tj = deferPath.length - 1;\n\t\t\t\t\twhile (deferChar = deferPath.charAt(j--)) {\n\t\t\t\t\t\t// Use the \"+\" and\"-\" characters to navigate the path back to the original parent node where the deferred bindings ocurred\n\t\t\t\t\t\tif (deferChar === \"+\") {\n\t\t\t\t\t\t\tif (deferPath.charAt(j) === \"-\") {\n\t\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t\t\ttargetParent = targetParent.previousSibling;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttargetParent = targetParent.parentNode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttargetParent = targetParent.lastChild;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Note: Can use previousSibling and lastChild, not previousElementSibling and lastElementChild,\n\t\t\t\t\t\t// since we have removed white space within elCnt. Hence support IE < 9\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (bindChar === \"^\") {\n\t\t\t\t\tif (tag = bindingStore[id = vwInfo.id]) {\n\t\t\t\t\t\t// The binding may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\t\t// This is a tag binding\n\t\t\t\t\t\tdeep = targetParent && (!elem || elem.parentNode !== targetParent); // We are stepping back looking for the right targetParent,\n\t\t\t\t\t\t// or we are linking existing content and this element is in elCnt, not an immediate child of the targetParent.\n\t\t\t\t\t\tif (!elem || deep) {\n\t\t\t\t\t\t\ttag.parentElem = targetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (vwInfo.elCnt && deep) {\n\t\t\t\t\t\t\t// With element only content, if there is no following element, or if the binding is deeper than the following element\n\t\t\t\t\t\t\t// then we need to set the open or close token as a deferred binding annotation on the parent\n\t\t\t\t\t\t\tsetDefer(targetParent, (vwInfo.open ? \"#\" : \"/\") + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This is an open or close marker for a data-linked tag {^{...}}. Add it to bindEls.\n\t\t\t\t\t\taddedBindEls.push([deep ? null : elem, vwInfo]);\n\t\t\t\t\t}\n\t\t\t\t} else if (view = viewStore[id = vwInfo.id]) {\n\t\t\t\t\t// The view may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\tif (!view.parentElem) {\n\t\t\t\t\t\t// If view is not already extended for JsViews, extend and initialize the view object created in JsRender, as a JsViews view\n\t\t\t\t\t\tview.parentElem = targetParent || elem && elem.parentNode || parentNode;\n\t\t\t\t\t\tview._.onRender = addBindingMarkers;\n\t\t\t\t\t\tview._.onArrayChange = arrayChangeHandler;\n\t\t\t\t\t\tsetArrayChangeLink(view);\n\t\t\t\t\t}\n\t\t\t\t\tparentElem = view.parentElem;\n\t\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t\t// This is an 'open view' node (preceding script marker node,\n\t\t\t\t\t\t// or if elCnt, the first element in the view, with a data-jsv annotation) for binding\n\t\t\t\t\t\tview._elCnt = vwInfo.elCnt;\n\t\t\t\t\t\tif (targetParent && !elem) {\n\t\t\t\t\t\t\tsetDefer(targetParent, \"#\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No targetParent, so there is a ._nxt elem (and this is processing tokens on the elem)\n\t\t\t\t\t\t\tif (!view._prv) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is a 'close view' marker node for binding\n\t\t\t\t\t\tif (targetParent && (!elem || elem.parentNode !== targetParent)) {\n\t\t\t\t\t\t\t// There is no ._nxt so add token to _df. It is deferred.\n\t\t\t\t\t\t\tsetDefer(targetParent, \"/\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t\tview._nxt = undefined;\n\t\t\t\t\t\t} else if (elem) {\n\t\t\t\t\t\t\t// This view did not have a ._nxt, but has one now, so token may be in _df, and must be removed. (No longer deferred)\n\t\t\t\t\t\t\tif (!view._nxt) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._nxt = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (onAftCr = view.ctx && view.ctx[onAfterCreateStr] || onAfterCreate) {\n\t\t\t\t\t\t\tonAftCr.call(view.ctx.tag, view);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n//}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen = addedBindEls.length;\n\t\t\twhile (len--) {\n\t\t\t\t// These were added in reverse order to addedBindEls. We push them in BindEls in the correct order.\n\t\t\t\tbindEls.push(addedBindEls[len]);\n\t\t\t}\n\t\t}\n\t\treturn !vwInfos || vwInfos.elCnt;\n\t}\n\n\tfunction getViewInfos(vwInfos) {\n\t\t// Used by view.childTags() and tag.childTags()\n\t\t// Similar to processViewInfos in how it steps through bindings to find tags. Only finds data-linked tags.\n\t\tvar level, parentTag, named;\n\n\t\tif (vwInfos) {\n\t\t\tlen = vwInfos.length;\n\t\t\tfor (j = 0; j < len; j++) {\n\t\t\t\tvwInfo = vwInfos[j];\n\t\t\t\t// This is an open marker for a data-linked tag {^{...}}, within the content of the tag whose id is get.id. Add it to bindEls.\n\t\t\t\t// Note - if bindingStore[vwInfo.id]._is === \"tag\" then getViewInfos is being called too soon - during first linking pass\n\t\t\t\tparentTag = tag = bindingStore[vwInfo.id].linkCtx.tag;\n\t\t\t\tnamed = tag.tagName === tagName;\n\t\t\t\tif (!tag.flow || named) {\n\t\t\t\t\tif (!deep) {\n\t\t\t\t\t\tlevel = 1;\n\t\t\t\t\t\twhile (parentTag = parentTag.parent) {\n\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagDepth = tagDepth || level; // The level of the first tag encountered.\n\t\t\t\t\t}\n\t\t\t\t\tif ((deep || level === tagDepth) && (!tagName || named)) {\n\t\t\t\t\t\t// Filter on top-level or tagName as appropriate\n\t\t\t\t\t\ttags.push(tag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dataLink() {\n\t\t//================ Data-link and fixup of data-jsv annotations ================\n\t\tvar j, index,\n\t\t\ttokens = \"\",\n\t\t\twrap = {},\n\t\t\tselector = linkViewsSel + (get ? \",[\" + deferAttr + \"]\" : \"\");\n\t\t\t// If a childTags() call, get = \",[\" + deferAttr + \"]\" - since we need to include elements that have a ._df expando for deferred tokens\n\n\t\telems = qsa ? parentNode.querySelectorAll(selector) : $(selector, parentNode).get();\n\t\tl = elems.length;\n\n\t\t// The prevNode will be in the returned query, since we called markPrevOrNextNode() on it.\n\t\t// But it may have contained nodes that satisfy the selector also.\n\t\tif (prevNode && prevNode.innerHTML) {\n\t\t\t// Find the last contained node of prevNode, to use as the prevNode - so we only link subsequent elems in the query\n\t\t\tprevNodes = qsa ? prevNode.querySelectorAll(selector) : $(selector, prevNode).get();\n\t\t\tprevNode = prevNodes.length ? prevNodes[prevNodes.length - 1] : prevNode;\n\t\t}\n\n\t\ttagDepth = 0;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = elems[i];\n\t\t\tif (prevNode && !found) {\n\t\t\t\t// If prevNode is set, not false, skip linking. If this element is the prevNode, set to false so subsequent elements will link.\n\t\t\t\tfound = (elem === prevNode);\n\t\t\t} else if (nextNode && elem === nextNode) {\n\t\t\t\t// If nextNode is set then break when we get to nextNode\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (elem.parentNode) {\n\t\t\t\t// elem has not been removed from DOM\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t\tif (elem._df) {\n\t\t\t\t\t\tj = i + 1;\n\t\t\t\t\t\twhile (j < l && elem.contains(elems[j])) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add defered tokens after any tokens on descendant elements of this one\n\t\t\t\t\t\twrap[j-1] = elem._df;\n\t\t\t\t\t}\n\t\t\t\t\tif (wrap[i]) {\n\t\t\t\t\t\ttokens += wrap[i] || \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isLink && (vwInfo = viewInfos(elem, undefined, rViewMarkers)) && (vwInfo = vwInfo[0])) {\n\t\t\t\t\t\t// If this is a link(trueOrString ...) call we will avoid re-binding to elems that are within template-rendered views\n\t\t\t\t\t\tskip = skip ? (vwInfo.id !== skip && skip) : vwInfo.open && vwInfo.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (!skip && processInfos(viewInfos(elem))\n\t\t\t\t\t\t// If a link() call, processViewInfos() adds bindings to bindEls, and returns true for non-script nodes, for adding data-link bindings\n\t\t\t\t\t\t// If a childTags() call, getViewInfos returns array of tag bindings.\n\t\t\t\t\t\t\t&& elem.getAttribute($viewsLinkAttr)) {\n\t\t\t\t\t\tbindEls.push([elem]); // A data-linked element so add to bindEls too\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (get) {\n\t\t\ttokens += parentNode._df || \"\";\n\t\t\tif (index = tokens.indexOf(\"#\" + get.id) + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so start after the open token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(index + get.id.length);\n\t\t\t}\n\t\t\tindex = tokens.indexOf(\"/\" + get.id);\n\t\t\tif (index + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so don't look beyond the close token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(0, index);\n\t\t\t}\n\t\t\t// Call getViewInfos to add the found childTags to the tags array\n\t\t\tgetViewInfos(viewInfos(tokens, undefined, rOpenTagMarkers));\n\t\t}\n\n\t\tif (html === undefined && parentNode.getAttribute($viewsLinkAttr)) {\n\t\t\tbindEls.push([parentNode]); // Support data-linking top-level element directly (not within a data-linked container)\n\t\t}\n\n\t\t// Remove temporary marker script nodes they were added by markPrevOrNextNode\n\t\tunmarkPrevOrNextNode(prevNode, elCnt);\n\t\tunmarkPrevOrNextNode(nextNode, elCnt);\n\n\t\tif (get) {\n\t\t\tif (lazyLink) {\n\t\t\t\tlazyLink.resolve();\n\t\t\t}\n\t\t\treturn; // We have added childTags to the tags array, so we are done\n\t\t}\n\n\t\tif (elCnt && defer + ids) {\n\t\t\t// There are some views with elCnt, for which the open or close did not precede any HTML tag - so they have not been processed yet\n\t\t\telem = nextNode;\n\t\t\tif (defer) {\n\t\t\t\tif (nextNode) {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer + \"+\", true), nextNode);\n\t\t\t\t} else {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer, true), parentNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocessViewInfos(viewInfos(ids, true), parentNode);\n\t\t\t// If there were any tokens on nextNode which have now been associated with inserted HTML tags, remove them from nextNode\n\t\t\tif (nextNode) {\n\t\t\t\ttokens = nextNode.getAttribute(jsvAttrStr);\n\t\t\t\tif (l = tokens.indexOf(prevIds) + 1) {\n\t\t\t\t\ttokens = tokens.slice(l + prevIds.length - 1);\n\t\t\t\t}\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, ids + tokens);\n\t\t\t}\n\t\t}\n\n\t\t//================ Bind the data-linked elements and tags ================\n\t\tl = bindEls.length;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = bindEls[i];\n\t\t\tlinkInfo = elem[1];\n\t\t\telem = elem[0];\n\t\t\tif (linkInfo) {\n\t\t\t\tif (tag = bindingStore[linkInfo.id]) {\n\t\t\t\t\tif (linkCtx = tag.linkCtx) {\n\t\t\t\t\t\t// The tag may have been stored temporarily on the bindingStore - or may have already been replaced by the actual binding\n\t\t\t\t\t\ttag = linkCtx.tag;\n\t\t\t\t\t\ttag.linkCtx = linkCtx;\n\t\t\t\t\t}\n\t\t\t\t\tif (linkInfo.open) {\n\t\t\t\t\t\t// This is an 'open linked tag' binding annotation for a data-linked tag {^{...}}\n\t\t\t\t\t\tif (elem) {\n\t\t\t\t\t\t\ttag.parentElem = elem.parentNode;\n\t\t\t\t\t\t\ttag._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttag._elCnt = linkInfo.elCnt;\n\t\t\t\t\t\t// We data-link depth-first (\"on the way in\"), which is better for perf - and allows setting parent tags etc.\n\t\t\t\t\t\tview = tag.tagCtx.view;\n\t\t\t\t\t\taddDataBinding(undefined, tag._prv, view, linkInfo.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag._nxt = elem;\n\t\t\t\t\t\tif (tag._.unlinked) {\n\t\t\t\t\t\t\t// This is a 'close linked tag' binding annotation\n\t\t\t\t\t\t\t// Add data binding\n\t\t\t\t\t\t\ttagCtx = tag.tagCtx;\n\t\t\t\t\t\t\tview = tagCtx.view;\n\t\t\t\t\t\t\tcallAfterLink(tag);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Add data binding for a data-linked element (with data-link attribute)\n\t\t\t\taddDataBinding(elem.getAttribute($viewsLinkAttr), elem, $view(elem), undefined, isLink, outerData, context);\n\t\t\t}\n\t\t}\n\t\tif (lazyLink) {\n\t\t\tlazyLink.resolve();\n\t\t}\n\t}\n\t//==== /end of nested functions ====\n\n\tvar inTag, linkCtx, tag, i, l, j, len, elems, elem, view, vwInfo, linkInfo, prevNodes, token, prevView, nextView,\n\t\tnode, tags, deep, tagName, tagCtx, validate, tagDepth, depth, fragment, copiedNode, firstTag, parentTag,\n\t\tisVoid, wrapper, div, tokens, elCnt, prevElCnt, htmlTag, ids, prevIds, found, skip, lazyLink, isLink, get,\n\t\tself = this,\n\t\tthisId = self._.id + \"_\",\n\t\tdefer = \"\",\n\t\t// The marker ids for which no tag was encountered (empty views or final closing markers) which we carry over to container tag\n\t\tbindEls = [],\n\t\ttagStack = [],\n\t\tdeferStack = [],\n\t\tonAfterCreate = self.hlp(onAfterCreateStr),\n\t\tprocessInfos = processViewInfos;\n\n\tif (refresh) {\n\t\tlazyLink = refresh.lazyLink && $.Deferred();\n\t\tif (refresh.tmpl) {\n\t\t\t// refresh is the prevView, passed in from addViews()\n\t\t\tprevView = \"/\" + refresh._.id + \"_\";\n\t\t} else {\n\t\t\tisLink = refresh.lnk; // Top-level linking\n\t\t\tif (refresh.tag) {\n\t\t\t\tthisId = refresh.tag + \"^\";\n\t\t\t\trefresh = true;\n\t\t\t}\n\t\t\tif (get = refresh.get) {\n\t\t\t\tprocessInfos = getViewInfos;\n\t\t\t\ttags = get.tags;\n\t\t\t\tdeep = get.deep;\n\t\t\t\ttagName = get.name;\n\t\t\t}\n\t\t}\n\t\trefresh = refresh === true;\n\t}\n\n\tparentNode = parentNode\n\t\t? (\"\" + parentNode === parentNode\n\t\t\t? $(parentNode)[0] // It is a string, so treat as selector\n\t\t\t: parentNode.jquery\n\t\t\t\t? parentNode[0] // A jQuery object - take first element.\n\t\t\t\t: parentNode)\n\t\t: (self.parentElem // view.link()\n\t\t\t|| document.body); // link(null, data) to link the whole document\n\n\tvalidate = !$subSettingsAdvanced.noValidate && parentNode.contentEditable !== TRUE;\n\tparentTag = parentNode.tagName.toLowerCase();\n\telCnt = !!elContent[parentTag];\n\n\tprevNode = prevNode && markPrevOrNextNode(prevNode, elCnt);\n\tnextNode = nextNode && markPrevOrNextNode(nextNode, elCnt) || null;\n\n\tif (html != undefined) {\n\t\t//================ Insert html into DOM using documentFragments (and wrapping HTML appropriately). ================\n\t\t// Also convert markers to DOM annotations, based on content model.\n\t\t// Corresponds to nextNode ? $(nextNode).before(html) : $(parentNode).html(html);\n\t\t// but allows insertion to wrap correctly even with inserted script nodes. jQuery version will fail e.g. under tbody or select.\n\t\t// This version should also be slightly faster\n\t\tdiv = document.createElement(\"div\");\n\t\twrapper = div;\n\t\tprevIds = ids = \"\";\n\t\thtmlTag = parentNode.namespaceURI === \"http://www.w3.org/2000/svg\" ? \"svg_ns\" : (firstTag = rFirstElem.exec(html)) && firstTag[1] || \"\";\n\t\tif (elCnt) {\n\t\t\t// Now look for following view, and find its tokens, or if not found, get the parentNode._df tokens\n\t\t\tnode = nextNode;\n\t\t\twhile (node && !(nextView = viewInfos(node))) {\n\t\t\t\tnode = node.nextSibling;\n\t\t\t}\n\t\t\tif (tokens = nextView ? nextView._tkns : parentNode._df) {\n\t\t\t\ttoken = prevView || \"\";\n\t\t\t\tif (refresh || !prevView) {\n\t\t\t\t\ttoken += \"#\" + thisId;\n\t\t\t\t}\n\t\t\t\tj = tokens.indexOf(token);\n\t\t\t\tif (j + 1) {\n\t\t\t\t\tj += token.length;\n\t\t\t\t\t// Transfer the initial tokens to inserted nodes, by setting them as the ids variable, picked up in convertMarkers\n\t\t\t\t\tprevIds = ids = tokens.slice(0, j);\n\t\t\t\t\ttokens = tokens.slice(j);\n\t\t\t\t\tif (nextView) {\n\t\t\t\t\t\tnode.setAttribute(jsvAttrStr, tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetDefer(parentNode, tokens);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//================ Convert the markers to DOM annotations, based on content model. ================\n//\t\t\toldElCnt = elCnt;\n\t\tisVoid = undefined;\n\t\thtml = (\"\" + html).replace(rConvertMarkers, convertMarkers);\n//\t\t\tif (!!oldElCnt !== !!elCnt) {\n//\t\t\t\terror(\"Parse: \" + html); // Parse error. Content not well-formed?\n//\t\t\t}\n\t\tif (validate && tagStack.length) {\n\t\t\tsyntaxError(\"Mismatched '<\" + parentTag + \"...>' in:\\n\" + html); // Unmatched tag\n\t\t}\n\t\tif (validateOnly) {\n\t\t\treturn;\n\t\t}\n\t\t// Append wrapper element to doc fragment\n\t\tsafeFragment.appendChild(div);\n\n\t\t// Go to html and back, then peel off extra wrappers\n\t\t// Corresponds to jQuery $(nextNode).before(html) or $(parentNode).html(html);\n\t\t// but supports svg elements, and other features missing from jQuery version (and this version should also be slightly faster)\n\t\thtmlTag = wrapMap[htmlTag] || wrapMap.div;\n\t\tdepth = htmlTag[0];\n\t\twrapper.innerHTML = htmlTag[1] + html + htmlTag[2];\n\t\twhile (depth--) {\n\t\t\twrapper = wrapper.lastChild;\n\t\t}\n\t\tsafeFragment.removeChild(div);\n\t\tfragment = document.createDocumentFragment();\n\t\twhile (copiedNode = wrapper.firstChild) {\n\t\t\tfragment.appendChild(copiedNode);\n\t\t}\n\t\t// Insert into the DOM\n\t\tparentNode.insertBefore(fragment, nextNode);\n\t}\n\n\tif (lazyLink) {\n\t\tsetTimeout(dataLink, 0);\n\t} else {\n\t\tdataLink();\n\t}\n\n\treturn lazyLink && lazyLink.promise();\n}\n\nfunction addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) {\n\t// Add data binding for data-linked elements or {^{...}} data-linked tags\n\tvar tmpl, tokens, attr, convertBack, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, lastIndex,\n\t\tlinkExpressions = [];\n\n\tif (boundTagId) {\n\t\t// boundTagId is a string for {^{...}} data-linked tag. So only one linkTag in linkMarkup\n\t\t// data and context parameters are undefined\n\t\ttag = bindingStore[boundTagId];\n\t\ttag = tag.linkCtx ? tag.linkCtx.tag : tag;\n\n\t\tlinkCtx = tag.linkCtx || {\n\t\t\ttype: \"inline\",\n\t\t\tdata: currentView.data, // source\n\t\t\telem: tag._elCnt ? tag.parentElem : node, // target\n\t\t\tview: currentView,\n\t\t\tctx: currentView.ctx,\n\t\t\tattr: HTML, // Script marker nodes are associated with {^{ and always target HTML.\n\t\t\tfn: tag._.bnd,\n\t\t\ttag: tag,\n\t\t\t// Pass the boundTagId in the linkCtx, so that it can be picked up in observeAndBind\n\t\t\t_bndId: boundTagId\n\t\t};\n\t\tbindDataLinkTarget(linkCtx, linkCtx.fn);\n\t} else if (linkMarkup && node) {\n\t\t// If isLink then this is a top-level linking: .link(expression, target, data, ....) or\n\t\t// .link(true, target, data, ....) scenario - and data and context are passed in separately from the view\n\t\tdata = isLink ? data : currentView.data;\n\n\t\t// Compiled linkFn expressions could be stored in the tmpl.links array of the template\n\t\t// TODO - consider also caching globally so that if {{:foo}} or data-link=\"foo\" occurs in different places,\n\t\t// the compiled template for this is cached and only compiled once...\n\t\t//links = currentView.links || currentView.tmpl.links;\n\n\t\ttmpl = currentView.tmpl;\n\n//\t\t\tif (!(linkTags = links[linkMarkup])) {\n\t\t// This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template.\n\n\t\tlinkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node));\n\t\tlastIndex = rTagDatalink.lastIndex = 0;\n\t\twhile (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \\}(!\\}) option.\n\t\t\tlinkExpressions.push(tokens);\n\t\t\tlastIndex = rTagDatalink.lastIndex;\n\t\t}\n\t\tif (lastIndex < linkMarkup.length) {\n\t\t\tsyntaxError(linkMarkup);\n\t\t}\n\t\twhile (tokens = linkExpressions.shift()) {\n\t\t\t// Iterate over the data-link expressions, for different target attrs,\n\t\t\t// e.g. ~description(firstName, lastName)}\"\n\t\t\t// tokens: [all, attr, bindOnly, tagExpr, tagName, converter, colon, html, comment, code, params]\n\t\t\trTagIndex = rTagDatalink.lastIndex;\n\t\t\tattr = tokens[1];\n\t\t\ttagExpr = tokens[3];\n\t\t\twhile (linkExpressions[0] && linkExpressions[0][4] === \"else\") { // If this is {someTag...} and is followed by an {else...} add to tagExpr\n\t\t\t\ttagExpr += delimCloseChar1 + delimOpenChar0 + linkExpressions.shift()[3];\n\t\t\t\thasElse = true;\n\t\t\t}\n\t\t\tif (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}\n\t\t\t\ttagExpr += delimCloseChar1 + delimOpenChar0 + delimOpenChar1 + \"/\" + tokens[4] + delimCloseChar0;\n\t\t\t}\n\t\t\tlinkCtx = {\n\t\t\t\ttype: isLink ? \"top\" : \"link\",\n\t\t\t\tdata: data, // source\n\t\t\t\telem: node, // target\n\t\t\t\tview: currentView,\n\t\t\t\tctx: context,\n\t\t\t\tattr: attr,\n\t\t\t\tisLk: isLink, // top-level linking?\n\t\t\t\t_toLk : 1, // Flag to data-link on initial data-link call rendering call\n\t\t\t\t_noUpd : tokens[2] // Flag for data-link=\"^{...}\" so on initial data-link call will bind, but not render)\n\t\t\t};\n\n\t\t\tconvertBack = undefined;\n\t\t\tif (tokens[6]) {\n\t\t\t\tconvertBack = tokens[10] || undefined;\n\t\t\t\tlinkCtx.convert = tokens[5] || \"\";\n\t\t\t\tif (!attr && convertBack !== undefined && defaultAttr(node)) {\n\t\t\t\t\t// Default target, so allow 2 way binding\n\t\t\t\t\tlinkCtx.convertBack = convertBack = convertBack.slice(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Compile the linkFn expression which evaluates and binds a data-link expression\n\t\t\t// TODO - optimize for the case of simple data path with no conversion, helpers, etc.:\n\t\t\t// i.e. data-link=\"a.b.c\". Avoid creating new instances of Function every time. Can use a default function for all of these...\n\n\t\t\tlinkCtx.expr = attr + tagExpr;\n\t\t\tlinkFn = tmpl.links[tagExpr];\n\t\t\tif (!linkFn) {\n\t\t\t\ttmpl.links[tagExpr] = linkFn = $sub.tmplFn(tagExpr, tmpl, true, convertBack, hasElse);\n\t\t\t}\n\t\t\tlinkCtx.fn = linkFn;\n\t\t\tbindDataLinkTarget(linkCtx, linkFn);\n\t\t\t// We store rTagIndex in local scope, since this addDataBinding method can sometimes be called recursively,\n\t\t\t// and each is using the same rTagDatalink instance.\n\t\t\trTagDatalink.lastIndex = rTagIndex;\n\t\t}\n//\t\t}\n\t}\n}\n\nfunction bindDataLinkTarget(linkCtx, linkFn) {\n\t// Add data link bindings for a link expression in data-link attribute markup\n\tfunction handler(ev, eventArgs) {\n\t\tpropertyChangeHandler.call(linkCtx, ev, eventArgs, linkFn);\n\t\t// If the link expression uses a custom tag, the propertyChangeHandler call will call renderTag, which will set tagCtx on linkCtx\n\t}\n\thandler.noArray = true;\n\tif (linkCtx.isLk) {\n\t\t// Top-level linking: .link(expressionOrTrue, data, context) - so we need to create a view for the linking, with the data and ctx\n\t\t// which may be different than the current context of the target. Note that this view is not a standard data-linked view, so it will\n\t\t// be disposed only when its parent view is disposed.\n\t\taddLinkMethods(linkCtx.view = new $sub.View(\n\t\t\t$sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx),\n\t\t\t\"link\", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers));\n\t}\n\tlinkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]}\n\tlinkCtx._hdl = handler;\n\t// handler._ctx = linkCtx; Could pass linkCtx for use in a depends = function() {} call, so depends is different for different linkCtx's\n\thandler(true);\n}\n\n//=====================\n// Data-linking helpers\n//=====================\n\nfunction removeSubStr(str, substr) {\n\tvar k;\n\treturn str\n\t\t? (k = str.indexOf(substr),\n\t\t\t(k + 1\n\t\t\t\t? str.slice(0, k) + str.slice(k + substr.length)\n\t\t\t\t: str))\n\t\t: \"\";\n}\n\nfunction markerNodeInfo(node) {\n\treturn node &&\n\t\t(\"\" + node === node\n\t\t\t? node\n\t\t\t: node.tagName === SCRIPT\n\t\t\t\t? node.type.slice(3)\n\t\t\t\t: node.nodeType === 1 && node.getAttribute(jsvAttrStr) || \"\");\n}\n\nfunction viewInfos(node, isVal, rBinding) {\n\t// Test whether node is a script marker node, and if so, return metadata\n\tfunction getInfos(all, open, close, id, ch, elPath) {\n\t\tinfos.push({\n\t\t\telCnt: elCnt,\n\t\t\tid: id,\n\t\t\tch: ch,\n\t\t\topen: open,\n\t\t\tclose: close,\n\t\t\tpath: elPath,\n\t\t\ttoken: all\n\t\t});\n\t}\n\tvar elCnt, tokens,\n\t\tinfos = [];\n\tif (tokens = isVal ? node : markerNodeInfo(node)) {\n\t\telCnt = infos.elCnt = node.tagName !== SCRIPT;\n\t\telCnt = tokens.charAt(0) === \"@\" || elCnt;\n\t\tinfos._tkns = tokens;\n\t\t// rMarkerTokens = /(?:(#)|(\\/))(\\d+)([_^])([-+@\\d]+)?/g;\n\t\ttokens.replace(rBinding || rMarkerTokens, getInfos);\n\t\treturn infos;\n\t}\n}\n\nfunction unmarkPrevOrNextNode(node, elCnt) {\n\tif (node) {\n\t\tif (node.type === \"jsv\") {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t} else if (elCnt && node.getAttribute($viewsLinkAttr) === \"\") {\n\t\t\tnode.removeAttribute($viewsLinkAttr);\n\t\t}\n\t}\n}\n\nfunction markPrevOrNextNode(node, elCnt) {\n\tvar marker = node;\n\twhile (elCnt && marker && marker.nodeType !== 1) {\n\t\tmarker = marker.previousSibling;\n\t}\n\tif (marker) {\n\t\tif (marker.nodeType !== 1) {\n\t\t\t// For text nodes, we will add a script node before\n\t\t\tmarker = document.createElement(SCRIPT);\n\t\t\tmarker.type = \"jsv\";\n\t\t\tnode.parentNode.insertBefore(marker, node);\n\t\t} else if (!markerNodeInfo(marker) && !marker.getAttribute($viewsLinkAttr)) {\n\t\t\t// For element nodes, we will add a data-link attribute (unless there is already one)\n\t\t\t// so that this node gets included in the node linking process.\n\t\t\tmarker.setAttribute($viewsLinkAttr, \"\");\n\t\t}\n\t}\n\treturn marker;\n}\n\nfunction normalizeLinkTag(linkMarkup, twoway) {\n\tlinkMarkup = $.trim(linkMarkup).replace(rEscapeQuotes, \"\\\\$&\");\n\treturn linkMarkup.slice(-1) !== delimCloseChar0\n\t// If simplified syntax is used: data-link=\"expression\", convert to data-link=\"{:expression}\",\n\t// or for inputs, data-link=\"{:expression:}\" for (default) two-way binding\n\t\t? linkMarkup = delimOpenChar1 + \":\" + linkMarkup + (twoway ? \":\" : \"\") + delimCloseChar0\n\t\t: linkMarkup;\n}\n\n//===========================\n// Methods for views and tags\n//===========================\n\nfunction callAfterLink(tag, ev, eventArgs) {\n\tvar linkedElem, displayElem, linkedEl, val, l, linkedTag, oldTrig, newTrig, tagProps, propsExpr, linkedElemView, prop, propDef,\n\t\ttagCtx = tag.tagCtx,\n\t\tview = tagCtx.view,\n\t\tprops = tagCtx.props,\n\t\tlinkCtx = tag.linkCtx;\n\n\tif (tag._.unlinked) { // First call to onAfterLink, or first call after onUpdate: updateContent. Initialize and call onBind and set properties\n\t\tif (tag.linkedElement !== undefined) {\n\t\t\t// linkedElement: - selector for identifying linked element in template/rendered content\n\t\t\ttag.linkedElem = tag._.inline ? tag.contents(true, tag.linkedElement || \"*\").first() : $(linkCtx.elem);\n\t\t}\n\t\tif (tag.onBind) {\n\t\t\ttag.onBind(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t\t}\n\t}\n\n\tif (tag.onAfterLink) {\n\t\ttag.onAfterLink(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t}\n\n\tlinkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem;\n\tdisplayElem = tag.displayElem || linkedElem;\n\nif (linkedElem && linkedElem[0]) {\n\t\tif (!tag._.chging) {\n\t\t\tval = tag.cvtArgs()[0];\n\t\t\tl = linkedElem.length;\n\t\t\twhile (l--) {\n\t\t\t\tlinkedEl = linkedElem[l];\n\t\t\t\tif (tag._.unlinked && linkedEl !== linkCtx.elem) {\n\t\t\t\t\tlinkedTag = linkedEl._jsvLkEl;\n\t\t\t\t\tif (tag._.inline && (!linkedTag || linkedTag !== tag && linkedTag.targetTag !== tag)) {\n\t\t\t\t\t\t// For data-linked tags, identify the linkedEl with the tag, for \"to\" binding\n\t\t\t\t\t\t// (For data-linked elements, if not yet bound, we identify later when the linkCtx.elem is bound)\n\t\t\t\t\t\tlinkedEl._jsvLkEl = tag;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag, linkedEl);\n\t\t\t\t\t\tlinkedEl._jsvBnd = \"&\" + tag._tgId + \"+\"; // Add a \"+\" for cloned binding - so removing\n\t\t\t\t\t\t// elems with cloned bindings will not remove the 'parent' binding from the bindingStore.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (val !== undefined) {\n\t\t\t\t\tif (linkedEl.value !== undefined) {\n\t\t\t\t\t\tif (linkedEl.type === CHECKBOX) {\n\t\t\t\t\t\t\tlinkedEl[CHECKED] = val && val !== \"false\";\n\t\t\t\t\t\t} else if (linkedEl.type === RADIO) {\n\t\t\t\t\t\t\tlinkedEl[CHECKED] = (linkedEl.value === val);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlinkedEl.value = val;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (linkedEl.contentEditable === TRUE) {\n\t\t\t\t\t\tlinkedEl.innerHTML = val;\n\t\t\t\t\t}\n\t\t\t\t\tlinkCtx._val = val;\n\t\t\t\t}\n\t\t\t\tif (props.name) {\n\t\t\t\t\tlinkedEl.name = linkedEl.name || props.name;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tag.setSize) {\n\t\t\tif (props.height) {\n\t\t\t\tdisplayElem.height(props.height);\n\t\t\t}\n\t\t\tif (props.width) {\n\t\t\t\tdisplayElem.width(props.width);\n\t\t\t}\n\t\t}\n\t\tif (props.title !== undefined) {\n\t\t\tdisplayElem.attr(\"title\", props.title);\n\t\t}\n\t\tif (props[\"class\"]) {\n\t\t\t// This code supports dynamic binding to class - where it adds the class if absent, and removes/adds if a previous value is present\n\t\t\tif (eventArgs && displayElem.hasClass(eventArgs.oldValue)) {\n\t\t\t\tdisplayElem.removeClass(eventArgs.oldValue);\n\t\t\t}\n\t\t\tdisplayElem.addClass(props[\"class\"]);\n\t\t}\n\t\tif (props.id) {\n\t\t\tlinkedElem[0].id = props.id;\n\t\t}\n\t}\n\ttag._.unlinked = undefined;\n}\n\nfunction asyncElemChangeHandler(ev) {\n\tsetTimeout(function() {\n\t\telemChangeHandler(ev);\n\t}, 0);\n}\n\nfunction bindElChange($elem, trig, onoff) {\n\tif (trig) {\n\t\ttrig = \"\" + trig === trig ? trig : \"keydown\"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown'): Get 'keydown' with async\n\t\t$elem[onoff](trig, trig === \"keydown\" ? asyncElemChangeHandler : elemChangeHandler);\n\t}\n}\n\nfunction bindTo(binding, tag, linkedElem, cvtBk) {\n\t// Two-way binding.\n\t// We set the binding.to[1] to be the cvtBack, and binding.to[0] to be either the path to the target, or [object, path] where the target is the path on the provided object.\n\t// So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, \"d.e\"], and we bind to the path on the returned object, exprOb.ob, as target\n\t// Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z\n\n\tvar bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, totry,\n\t\tlinkCtx = binding.linkCtx,\n\t\tsource = linkCtx.data,\n\t\tpaths = linkCtx.fn.paths;\n\n\ttag = tag || linkedElem._jsvLkEl;\n\n\t\tif (binding && paths && !binding.to) {\n\t\toldTrig = linkedElem._jsvTr || false;\n\t\tif (tag) {\n\t\t\tcvtBk = tag.convertBack || cvtBk;\n\t\t\tnewTrig = tag.tagCtx.props.trigger;\n\t\t}\n\t\tnewTrig = newTrig === undefined ? $subSettings.trigger : newTrig;\n\t\t// Trigger is noop except for text box, textarea, contenteditable...\n\t\tnewTrig = newTrig && (linkedElem.tagName === \"INPUT\" && linkedElem.type !== CHECKBOX && linkedElem.type !== RADIO || linkedElem.type === \"textarea\" || linkedElem.contentEditable === TRUE) && newTrig || false;\n\n\t\tif (oldTrig !== newTrig) {\n\t\t\t$linkedElem = $(linkedElem);\n\t\t\tbindElChange($linkedElem, oldTrig, \"off\");\n\t\t\tbindElChange(\n\t\t\t\t$linkedElem,\n\t\t\t\tlinkedElem._jsvTr = newTrig,\n\t\t\t\t\"on\"\n\t\t\t);\n\t\t}\n\n\t\tpaths = (bindto = paths._jsvto) || paths[0];\n\t\tpathIndex = paths && paths.length;\n\t\tif (pathIndex && (!tag || tag.tagCtx.args.length)) {\n\t\t\tlastPath = paths[pathIndex - 1];\n\t\t\tif (lastPath._jsv) {\n\t\t\t\tbindtoOb = lastPath;\n\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t}\n\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t}\n\t\t\tif (path) {\n\t\t\t\tto = [\n\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\tlastPath\n\t\t\t\t\t];\n\t\t\t} else {\n\t\t\t\twhile ((totry = linkCtx._ctxCb(path = lastPath.split(\"^\").join(\".\"), source)) && (l = totry.length)) {\n\t\t\t\t\t// Recursively dereference any ~foo or #bar tokens in the path. (Recursive because ~foo may be a contextual param which has\n\t\t\t\t\t// its own dependencies on other ~foo #bar components)\n\t\t\t\t\tto = totry;\n\t\t\t\t\tif (to._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag)\n\t\t\t\t\t\tto = [to[l-3], to[l-2]];\n\t\t\t\t\t\tlastPath = to[1];\n\t\t\t\t\t\tif (lastPath._jsv) {\n\t\t\t\t\t\t\tbindtoOb = lastPath;\n\t\t\t\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t\t\t\t\tto = [\n\t\t\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\t\t\tlastPath\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else { // Two-way binding to a helper - e.g. ~address.street, or computed, e.g. ~fullName(), or view property e.g. #data.foo\n\t\t\t\t\t\tto = l>2\n\t\t\t\t\t\t\t? [to[l-3], to[l-2]] // With path: [object, path]\n\t\t\t\t\t\t\t: [to[l-2]]; // No path, (e.g. [function] for computed with setter)\n\t\t\t\t\t}\n\t\t\t\t\tsource = to[0];\n\t\t\t\t\tlastPath = to[1];\n\t\t\t\t}\n\t\t\t\tto = to || [source, path]; // Two way binding to an object (neither ~foo nor #bar)\n\t\t\t}\n\t\t} else {\n\t\t\tto = [];\n\t\t}\n\t\tbinding.to = [\n\t\t\tto,\n\t\t\tcvtBk\n\t\t];\n\t}\n}\n\nfunction mergeCtxs(tag, newCtxs, replace) { // Merge updated tagCtxs into tag.tagCtxs\n\tvar tagCtx, newTagCtx,\n\t\tview = tag.tagCtx.view,\n\t\ttagCtxs = tag.tagCtxs || [tag.tagCtx],\n\t\tl = tagCtxs.length,\n\t\trefresh = !newCtxs;\n\n\tnewCtxs = newCtxs || tag._.bnd.call(view.tmpl, (tag.linkCtx || view).data, view, $sub);\n\n\tif (replace) {\n\t\t// Replace previous tagCtxs by new ones, rather than merging\n\t\ttagCtxs = tag.tagCtxs = newCtxs;\n\t\ttag.tagCtx = tagCtxs[0];\n\t} else {\n\t\twhile (l--) {\n\t\t\ttagCtx = tagCtxs[l];\n\t\t\tnewTagCtx = newCtxs[l];\n\t\t\t$observable(tagCtx.props).setProperty(newTagCtx.props);\n\t\t\t$extend(tagCtx.ctx, newTagCtx.ctx); // We don't support propagating ctx variables, ~foo, observably, to nested views. So extend, not setProperty...\n\t\t\ttagCtx.args = newTagCtx.args;\n\t\t\tif (refresh) {\n\t\t\t\ttagCtx.tmpl = newTagCtx.tmpl;\n\t\t\t}\n\t\t}\n\t}\n\t$sub._ths(tag, tagCtxs[0]); // tagHandlersFromProps\n\treturn tagCtxs;\n}\n\n//=========\n// Disposal\n//=========\n\nfunction clean(elems) {\n\t// Remove data-link bindings, or contained views\n\tvar l, elem, bindings,\n\t\telemArray = [],\n\t\tlen = elems.length,\n\t\ti = len;\n\twhile (i--) {\n\t\t// Copy into an array, so that deletion of nodes from DOM will not cause our 'i' counter to get shifted\n\t\t// (Note: This seems as fast or faster than elemArray = [].slice.call(elems); ...)\n\t\telemArray.push(elems[i]);\n\t}\n\ti = len;\n\twhile (i--) {\n\t\telem = elemArray[i];\n\t\tif (elem.parentNode) {\n\t\t\t// Has not already been removed from the DOM\n\t\t\tif (bindings = elem._jsvBnd) {\n\t\t\t\t// Get propertyChange bindings for this element\n\t\t\t\t// This may be an element with data-link, or the opening script marker node for a data-linked tag {^{...}}\n\t\t\t\t// bindings is a string with the syntax: \"(&bindingId)*\"\n\t\t\t\tbindings = bindings.slice(1).split(\"&\");\n\t\t\t\telem._jsvBnd = \"\";\n\t\t\t\tl = bindings.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\t// Remove associated bindings\n\t\t\t\t\tremoveViewBinding(bindings[l], elem._jsvLkEl, elem); // unbind bindings with this bindingId on this view\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisposeTokens(markerNodeInfo(elem) + (elem._df || \"\"));\n\t\t}\n\t}\n}\n\nfunction removeViewBinding(bindId, linkedElemTag, elem) {\n\t// Unbind\n\tvar objId, linkCtx, tag, object, obsId, tagCtxs, l, map, $linkedElem, linkedElem, trigger, view, targetTag,\n\t\tbinding = bindingStore[bindId];\n\n\tif (linkedElemTag) {\n\t\tlinkedElemTag = linkedElemTag.targetTag || linkedElemTag;\n\t\telem._jsvLkEl = undefined;\n\t} else if (binding) {\n\t\tdelete bindingStore[bindId]; // Delete already, so call to onDispose handler below cannot trigger recursive deletion (through recursive call to jQuery cleanData)\n\t\tfor (objId in binding.bnd) {\n\t\t\tobject = binding.bnd[objId];\n\t\t\tobsId = binding.cbId;\n\t\t\tif ($isArray(object)) {\n\t\t\t\t$([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange\n\t\t\t} else {\n\t\t\t\t$(object).off(propertyChangeStr + obsId);\n\t\t\t}\n\t\t\tdelete binding.bnd[objId];\n\t\t}\n\n\t\tif (linkCtx = binding.linkCtx) {\n\t\t\tif (tag = linkCtx.tag) {\n\t\t\t\tif (tagCtxs = tag.tagCtxs) {\n\t\t\t\t\tl = tagCtxs.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\tif (map = tagCtxs[l].map) {\n\t\t\t\t\t\t\tmap.unmap(); //unobserve\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$linkedElem = tag.linkedElem;\n\n\t\t\t\tif (tag.onUnbind) {\n\t\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx, true);\n\t\t\t\t}\n\t\t\t\tif (tag.onDispose) {\n\t\t\t\t\ttag.onDispose();\n\t\t\t\t}\n\n\t\t\t\tif (!tag._elCnt) {\n\t\t\t\t\tif (tag._prv) {\n\t\t\t\t\t\ttag._prv.parentNode.removeChild(tag._prv);\n\t\t\t\t\t}\n\t\t\t\t\tif (tag._nxt) {\n\t\t\t\t\t\ttag._nxt.parentNode.removeChild(tag._nxt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlinkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;\n\n\t\t\tif (trigger = linkedElem && linkedElem._jsvTr) {\n\t\t\t\tbindElChange($linkedElem || $(linkedElem), trigger, \"off\");\n\t\t\t\tlinkedElem._jsvTr = undefined;\n\t\t\t}\n\t\t\tview = linkCtx.view;\n\t\t\tif (view.type === \"link\") {\n\t\t\t\tview.parent.removeViews(view._.key, undefined, true); // A \"link\" view is associated with the binding, so should be disposed with binding.\n\t\t\t} else {\n\t\t\t\tdelete view._.bnds[bindId];\n\t\t\t}\n\t\t}\n\t\tdelete cbBindingsStore[binding.cbId];\n\t}\n}\n\nfunction $unlink(to) {\n\tif (to) {\n\t\tto = to.jquery ? to : $(to);\n\t\tto.each(function() {\n\t\t\tvar innerView;\n\t\t\t//TODO fix this for better perf. Rather that calling inner view multiple times which does querySelectorAll each time, consider a single querySelectorAll\n\t\t\t// or simply call view.removeViews() on the top-level views under the target 'to' node, then clean(...)\n\t\t\twhile ((innerView = $view(this, true)) && innerView.parent) {\n\t\t\t\tinnerView.parent.removeViews(innerView._.key, undefined, true);\n\t\t\t}\n\t\t\tclean(this.getElementsByTagName(\"*\"));\n\t\t});\n\t\tclean(to);\n\t} else {\n\t\t// Call to $.unlink() is equivalent to $.unlink(true, \"body\")\n\t\tif (activeBody) {\n\t\t\t$(activeBody)\n\t\t\t\t.off(elementChangeStr, elemChangeHandler)\n\t\t\t\t.off('blur', '[contenteditable]', elemChangeHandler);\n\t\t\tactiveBody = undefined;\n\t\t}\n\t\ttopView.removeViews();\n\t\tclean(document.body.getElementsByTagName(\"*\"));\n\t}\n}\n\n//========\n// Helpers\n//========\n\nfunction getContextCb(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc.\n\t// TODO Consider exposing or allowing override, as public API\n\treturn function(path, object, depth) {\n\t\t// TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on\n\t\t// the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times\n\t\tvar tokens, tag, items, helper, last, nextPath, l;\n\t\tif (view && path) {\n\t\t\tif (path._jsv) {\n\t\t\t\treturn path._jsv.call(view.tmpl, object, view, $sub);\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"~\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"~a.b.c\" string:\n\t\t\t\t// [helperObject 'a', \"a.b.c\" currentDataItem] so currentDataItem becomes the object for subsequent paths.\n\t\t\t\tif (path.slice(0, 4) === \"~tag\") {\n\t\t\t\t\ttag = view.ctx;\n\t\t\t\t\tif (path.charAt(4) === \".\") {\n\t\t\t\t\t\t// \"~tag.xxx\"\n\t\t\t\t\t\ttokens = path.slice(5).split(\".\");\n\t\t\t\t\t\ttag = tag.tag;\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens) {\n\t\t\t\t\t\treturn tag ? [tag, tokens.join(\".\"), object] : [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpath = path.slice(1).split(\".\");\n\t\t\t\tif (helper = view.hlp(last = path.shift(), true)) {\n\t\t\t\t\tif (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [data, ctxPrmDependencies ...]\n\t\t\t\t\t\tif (path.length) {\n\t\t\t\t\t\t\tnextPath = \".\" + path.join(\".\");\n\t\t\t\t\t\t\tlast = helper[l = helper.length-1];\n\t\t\t\t\t\t\tif (last._jsv) {\n\t\t\t\t\t\t\t\tlast.sb = nextPath;\n\t\t\t\t\t\t\t\tlast.bnd = !!depth;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thelper[l] = (last + nextPath).replace(\"#data.\", \"\");\n\t\t\t\t\t\t\t\tif (last.slice(0, 5) === \"#view\") {\n\t\t\t\t\t\t\t\t\thelper[l] = helper[l].slice(6);\n\t\t\t\t\t\t\t\t\thelper.splice(l, 0, view);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\thelper.push(object);\n\t\t\t\t\t\titems = helper;\n\t\t\t\t\t} else if (path.length || $isFunction(helper)) {\n\t\t\t\t\t\titems = [helper, path.join(\".\"), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn items || [];\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"#\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"#a.b.c\" string: [view, \"a.b.c\" currentDataItem]\n\t\t\t\t// so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes.\n\t\t\t\treturn path === \"#data\" ? [] : [view, path.replace(rViewPath, \"\"), object];\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction inputAttrib(elem) {\n\treturn elem.type === CHECKBOX ? elem[CHECKED] : elem.value;\n}\n\n//========================== Initialize ==========================\n\n//=====================\n// JsRender integration\n//=====================\n\n$sub.onStore.template = function(name, item) {\n\titem.link = tmplLink;\n\tif (name) {\n\t\t$.link[name] = function() {\n\t\t\treturn tmplLink.apply(item, arguments);\n\t\t};\n\t}\n};\n\n$sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method\n\n// Define JsViews version of delimiters(), and initialize\n($viewsSettings.delimiters = function() {\n\t// Run delimiters initialization in context of jsrender.js\n\tvar ret = oldJsvDelimiters.apply(0, arguments);\n\n\tif (oldJsvDelimiters !== $viewsDelimiters) {\n\t\t// If JsRender was loaded before JsViews, then need also to initialize and set globals in that JsRender instance\n\t\tret = $viewsDelimiters.apply(0, arguments);\n\t}\n\n\t// Data-linking must use new delimiters\n\trTagDatalink = new RegExp(\"(?:^|\\\\s*)([\\\\w-]*)(\\\\\" + linkChar + \")?(\\\\\" + delimOpenChar1 + $sub.rTag + \"(:\\\\w*)?\\\\\" + delimCloseChar0 + \")\", \"g\");\n\treturn ret;\n})(); // jshint ignore:line\n\n$sub.addSetting(\"trigger\");\n\n//====================================\n// Additional members for linked views\n//====================================\n\nfunction transferViewTokens(prevNode, nextNode, parentElem, id, viewOrTagChar, refresh) {\n\t// Transfer tokens on prevNode of viewToRemove/viewToRefresh to nextNode or parentElem._df\n\tvar i, l, vwInfos, vwInfo, viewOrTag, viewId, tokens,\n\t\tprecedingLength = 0,\n\t\temptyView = prevNode === nextNode;\n\n\tif (prevNode) {\n\t\t// prevNode is either the first node in the viewOrTag, or has been replaced by the vwInfos tokens string\n\t\tvwInfos = viewInfos(prevNode) || [];\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\t// Step through views or tags on the prevNode\n\t\t\tvwInfo = vwInfos[i];\n\t\t\tviewId = vwInfo.id;\n\t\t\tif (viewId === id && vwInfo.ch === viewOrTagChar) {\n\t\t\t\tif (refresh) {\n\t\t\t\t\t// This is viewOrTagToRefresh, this is the last viewOrTag to process...\n\t\t\t\t\tl = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// This is viewOrTagToRemove, so we are done...\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!emptyView) {\n\t\t\t\tviewOrTag = vwInfo.ch === \"_\"\n\t\t\t\t\t? viewStore[viewId]\n\t\t\t\t\t: bindingStore[viewId].linkCtx.tag;\n\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t// A \"#m\" token\n\t\t\t\t\tviewOrTag._prv = nextNode;\n\t\t\t\t} else if (vwInfo.close) {\n\t\t\t\t\t// A \"/m\" token\n\t\t\t\t\tviewOrTag._nxt = nextNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprecedingLength += viewId.length + 2;\n\t\t}\n\n\t\tif (precedingLength) {\n\t\t\tprevNode.setAttribute(jsvAttrStr, prevNode.getAttribute(jsvAttrStr).slice(precedingLength));\n\t\t}\n\t\ttokens = nextNode ? nextNode.getAttribute(jsvAttrStr) : parentElem._df;\n\t\tif (l = tokens.indexOf(\"/\" + id + viewOrTagChar) + 1) {\n\t\t\ttokens = vwInfos._tkns.slice(0, precedingLength) + tokens.slice(l + (refresh ? -1 : id.length + 1));\n\t\t}\n\t\tif (tokens) {\n\t\t\tif (nextNode) {\n\t\t\t\t// If viewOrTagToRemove was an empty viewOrTag, we will remove both #n and /n\n\t\t\t\t// (and any intervening tokens) from the nextNode (=== prevNode)\n\t\t\t\t// If viewOrTagToRemove was not empty, we will take tokens preceding #n from prevNode,\n\t\t\t\t// and concatenate with tokens following /n on nextNode\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, tokens);\n\t\t\t} else {\n\t\t\t\tsetDefer(parentElem, tokens);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// !prevNode, so there may be a deferred nodes token on the parentElem. Remove it.\n\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + viewOrTagChar));\n\t\tif (!refresh && !nextNode) {\n\t\t\t// If this viewOrTag is being removed, and there was no .nxt, remove closing token from deferred tokens\n\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + viewOrTagChar));\n\t\t}\n\t}\n}\n\nfunction disposeTokens(tokens) {\n\tvar i, l, vwItem, vwInfos;\n\tif (vwInfos = viewInfos(tokens, true, rOpenMarkers)) {\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\tvwItem = vwInfos[i];\n\t\t\tif (vwItem.ch === \"_\") {\n\t\t\t\tif ((vwItem = viewStore[vwItem.id]) && vwItem.type) {\n\t\t\t\t\t// If this is the _prv (prevNode) for a view, remove the view\n\t\t\t\t\t// - unless view.type is undefined, in which case it is already being removed\n\t\t\t\t\tvwItem.parent.removeViews(vwItem._.key, undefined, true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveViewBinding(vwItem.id); // unbind bindings with this bindingId on this view\n\t\t\t}\n\t\t}\n\t}\n}\n\n//====================================\n// Add link methods to data-linked view or tag\n//====================================\nfunction addLinkMethods(tagOrView, isTag) {\n\n\ttagOrView.contents = function(deep, select) {\n\t\t// For a view or a tag, return jQuery object with the content nodes,\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is contents(selector)\n\t\t\tselect = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\t\tvar filtered,\n\t\t\tnodes = $(this.nodes());\n\t\tif (nodes[0]) {\n\t\t\tfiltered = select ? nodes.filter(select) : nodes;\n\t\t\tnodes = deep && select ? filtered.add(nodes.find(select)) : filtered;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.nodes = function(withMarkers, prevNode, nextNode) {\n\t\t// For a view or a tag, return top-level nodes\n\t\t// Do not return any script marker nodes, unless withMarkers is true\n\t\t// Optionally limit range, by passing in prevNode or nextNode parameters\n\n\t\tvar node,\n\t\t\tself = this,\n\t\t\telCnt = self._elCnt,\n\t\t\tprevIsFirstNode = !prevNode && elCnt,\n\t\t\tnodes = [];\n\n\t\tprevNode = prevNode || self._prv;\n\t\tnextNode = nextNode || self._nxt;\n\n\t\tnode = prevIsFirstNode\n\t\t\t? (prevNode === self._nxt\n\t\t\t\t? self.parentElem.lastSibling\n\t\t\t\t: prevNode)\n\t\t\t: (self._.inline === false\n\t\t\t\t? prevNode || self.linkCtx.elem.firstChild\n\t\t\t\t: prevNode && prevNode.nextSibling);\n\n\t\twhile (node && (!nextNode || node !== nextNode)) {\n\t\t\tif (withMarkers || elCnt || node.tagName !== SCRIPT) {\n\t\t\t\t// All the top-level nodes in the view\n\t\t\t\t// (except script marker nodes, unless withMarkers = true)\n\t\t\t\t// (Note: If a script marker node, viewInfo.elCnt undefined)\n\t\t\t\tnodes.push(node);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.childTags = function(deep, tagName) {\n\t\t// For a view or a tag, return child tags - at any depth, or as immediate children only.\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is childTags(tagName) - which looks for top-level tags of given tagName\n\t\t\ttagName = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\n\t\tvar self = this,\n\t\t\tview = self.link ? self : self.tagCtx.view, // this may be a view or a tag. If a tag, get the view from tag.view.tagCtx\n\t\t\tprevNode = self._prv,\n\t\t\telCnt = self._elCnt,\n\t\t\ttags = [];\n\n\t\tview.link(\n\t\t\tundefined,\n\t\t\tself.parentElem,\n\t\t\telCnt ? prevNode && prevNode.previousSibling : prevNode,\n\t\t\tself._nxt,\n\t\t\tundefined,\n\t\t\t{get:{\n\t\t\t\ttags: tags,\n\t\t\t\tdeep: deep,\n\t\t\t\tname: tagName,\n\t\t\t\tid: self.link ? self._.id + \"_\" : self._tgId + \"^\"\n\t\t\t}}\n\t\t);\n\t\treturn tags;\n\t};\n\n\ttagOrView.refresh = function(sourceValue) {\n\t\tvar promise, attr,\n\t\t\ttag = this,\n\t\t\tlinkCtx = tag.linkCtx,\n\t\t\tview = tag.tagCtx.view;\n\n\t\tif (tag.disposed) { error(\"Removed tag\"); }\n\t\tif (sourceValue === undefined) {\n\t\t\tsourceValue = $sub._tag(tag, view, view.tmpl, mergeCtxs(tag), true); // Get rendered HTML for tag, based on refreshed tagCtxs\n\t\t}\n\t\tif (sourceValue + \"\" === sourceValue) {\n\t\t\t// If no rendered content, sourceValue will not be a string (can be 0 or undefined)\n\t\t\tif (tag.onUnbind) {\n\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx);\n\t\t\t}\n\t\t\tattr = tag._.inline ? HTML : (linkCtx.attr || defaultAttr(tag.parentElem, true));\n\t\t\tpromise = updateContent(sourceValue, linkCtx, attr, tag);\n\t\t}\n\n\t\tcallAfterLink(tag);\n\t\treturn promise || tag;\n\t};\n\n\ttagOrView.update = function(value) {\n\t\tvar linkedElem = this.linkedElem;\n\t\tif (linkedElem) {\n\t\t\telemChangeHandler({\n\t\t\t\ttarget: linkedElem[0]\n\t\t\t}, undefined, value);\n\t\t}\n\t};\n\n\tif (isTag) {\n\t\t// This is a TAG\n\t\ttagOrView.domChange = function() { // domChange notification support\n\t\t\tvar elem = this.parentElem,\n\t\t\t\thasListener = $.hasData(elem) && $._data(elem).events,\n\t\t\t\tdomChangeNotification = \"jsv-domchange\";\n\n\t\t\tif (hasListener && hasListener[domChangeNotification]) {\n\t\t\t\t// Only trigger handler if there is a handler listening for this event. (Note using triggerHandler - so no event bubbling.)\n\t\t\t\t$(elem).triggerHandler(domChangeNotification, arguments);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// This is a VIEW\n\t\t// Note: a linked view will also, after linking have nodes[], _prv (prevNode), _nxt (nextNode) ...\n\t\ttagOrView.addViews = function(index, dataItems) {\n\t\t\t// if view is not an array view, do nothing\n\t\t\tvar i, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\titemsCount = dataItems.length,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (!self._.useKey && itemsCount) {\n\t\t\t\t// view is of type \"array\"\n\t\t\t\tviewsCount = views.length + itemsCount;\n\n\t\t\t\tif (viewsCount === self.data.length // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\t\t&& renderAndLink(self, index, self.tmpl, views, dataItems, self.ctx) !== false) {\n\t\t\t\t\tif (!self._.srt) { // Not part of a 'sort' on refresh\n\t\t\t\t\t\tself.fixIndex(index + itemsCount);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.removeViews = function(index, itemsCount, keepNodes, isMove) {\n\t\t\t// view.removeViews() removes all the child views\n\t\t\t// view.removeViews(index) removes the child view with specified index or key\n\t\t\t// view.removeViews(index, count) removes the specified nummber of child views, starting with the specified index\n\t\t\tfunction removeView(index) {\n\t\t\t\tvar id, bindId, parentElem, prevNode, nextNode, nodesToRemove,\n\t\t\t\t\tviewToRemove = views[index];\n\n\t\t\t\tif (viewToRemove && viewToRemove.link) {\n\t\t\t\t\tid = viewToRemove._.id;\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tnodesToRemove = viewToRemove.nodes();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove child views, without removing nodes\n\t\t\t\t\tviewToRemove.removeViews(undefined, undefined, true);\n\n\t\t\t\t\tviewToRemove.type = undefined; // Set type to undefined: used as a flag that this view is being removed\n\t\t\t\t\tprevNode = viewToRemove._prv;\n\t\t\t\t\tnextNode = viewToRemove._nxt;\n\t\t\t\t\tparentElem = viewToRemove.parentElem;\n\t\t\t\t\t// If prevNode and nextNode are the same, the view is empty\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tif (viewToRemove._elCnt) {\n\t\t\t\t\t\t\t// if keepNodes is false (and transferring of tokens has not already been done at a higher level)\n\t\t\t\t\t\t\t// then transfer tokens from prevNode which is being removed, to nextNode.\n\t\t\t\t\t\t\ttransferViewTokens(prevNode, nextNode, parentElem, id, \"_\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(nodesToRemove).remove();\n\t\t\t\t\t}\n\t\t\t\t\tif (!viewToRemove._elCnt) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tprevNode.parentNode.removeChild(prevNode); // (prevNode.parentNode is parentElem, except if jQuery Mobile or similar has inserted an intermediate wrapper\n\t\t\t\t\t\t\tnextNode.parentNode.removeChild(nextNode);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t\tsetArrayChangeLink(viewToRemove);\n\t\t\t\t\tfor (bindId in viewToRemove._.bnds) {\n\t\t\t\t\t\tremoveViewBinding(bindId);\n\t\t\t\t\t}\n\t\t\t\t\tdelete viewStore[id];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar current, view, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\tisArray = !self._.useKey,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (isArray) {\n\t\t\t\tviewsCount = views.length;\n\t\t\t}\n\t\t\tif (index === undefined) {\n\t\t\t\t// Remove all child views\n\t\t\t\tif (isArray) {\n\t\t\t\t\t// views and data are arrays\n\t\t\t\t\tcurrent = viewsCount;\n\t\t\t\t\twhile (current--) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = [];\n\t\t\t\t} else {\n\t\t\t\t\t// views and data are objects\n\t\t\t\t\tfor (view in views) {\n\t\t\t\t\t\t// Remove by key\n\t\t\t\t\t\tremoveView(view);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = {};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (itemsCount === undefined) {\n\t\t\t\t\tif (isArray) {\n\t\t\t\t\t\t// The parentView is data array view.\n\t\t\t\t\t\t// Set itemsCount to 1, to remove this item\n\t\t\t\t\t\titemsCount = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Remove child view with key 'index'\n\t\t\t\t\t\tremoveView(index);\n\t\t\t\t\t\tdelete views[index];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isArray && itemsCount\n\t\t\t\t\t&& (isMove || viewsCount - itemsCount === self.data.length)) { // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\tcurrent = index + itemsCount;\n\t\t\t\t\t// Remove indexed items (parentView is data array view);\n\t\t\t\t\twhile (current-- > index) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tviews.splice(index, itemsCount);\n\t\t\t\t\tif (!self._.sort) {\n\t\t\t\t\t\tself.fixIndex(index);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.refresh = function() {\n\t\t\tvar self = this,\n\t\t\t\tparent = self.parent;\n\n\t\t\tif (parent) {\n\t\t\t\trenderAndLink(self, self.index, self.tmpl, parent.views, self.data, undefined, true);\n\t\t\t\tsetArrayChangeLink(self);\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.fixIndex = function(fromIndex) {\n\t\t\t// Fixup index on following view items...\n\t\t\tvar views = this.views,\n\t\t\t\tindex = views.length;\n\t\t\twhile (fromIndex < index--) {\n\t\t\t\tif (views[index].index !== index) {\n\t\t\t\t\t$observable(views[index]).setProperty(\"index\", index);\n\t\t\t\t\t// This is fixing up index, but not key, and not index on child views. From child views, use view.getIndex()\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.link = viewLink;\n\t}\n}\n\n//========================\n// JsViews-specific converters\n//========================\n\n$converters.merge = function(val) {\n\t// Special converter used in data-linking to space-separated lists, such as className:\n\t// Currently only supports toggle semantics - and has no effect if toggle string is not specified\n\t// data-link=\"class{merge:boolExpr toggle=className}\"\n\tvar regularExpression,\n\t\tcurrentValue = this.linkCtx._val || \"\",\n\t\ttoggle = this.tagCtx.props.toggle;\n\n\tif (toggle) {\n\t\t// We are toggling the class specified by the toggle property,\n\t\t// and the boolean val binding is driving the insert/remove toggle\n\n\t\tregularExpression = toggle.replace(/[\\\\^$.|?*+()[{]/g, \"\\\\$&\");\n\t\t// Escape any regular expression special characters (metacharacters) within the toggle string\n\t\tregularExpression = \"(\\\\s(?=\" + regularExpression + \"$)|(\\\\s)|^)(\" + regularExpression + \"(\\\\s|$))\";\n\t\t// Example: /(\\s(?=myclass$)|(\\s)|^)?(myclass(\\s|$))/ - so matches (\" myclass\" or \" \" or ^ ) followed by (\"myclass \" or \"myclass$\") where ^/$ are beginning/end of string\n\t\tcurrentValue = currentValue.replace(new RegExp(regularExpression), \"$2\");\n\t\tval = currentValue + (val ? (currentValue && \" \") + toggle : \"\");\n\t}\n\treturn val;\n};\n\n//========================\n// JsViews-specific tags\n//========================\n\nfunction keepParentDataCtx(val) {\n\treturn this.tagCtx.view; // Return the parent view as data context for rendering block content\n}\n\n$tags({\n\ton: {\n\t\tattr: NONE,\n\t\tinit: function(tagCtx) {\n\t\t\tvar content,\n\t\t\t\ttag = this,\n\t\t\t\ti = 0,\n\t\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\t\tl = args.length;\n\n\t\t\tfor (; ii && i+1; // handler index\n\t\t\tif (tag._.inline) {\n\t\t\t\tif (!$sub.rTmpl.exec(content = tagCtx.tmpl.markup)) {\n\t\t\t\t\t// Inline {^{on}} tag with no content (or external template content) or with content containing\n\t\t\t\t\t// no HTML or JsRender tags: We will wrap the (text) content, or the operation name in a \";\n\t\t\t\t}\n\t\t\t\ttag.attr = HTML;\n\t\t\t}\n\t\t},\n\t\tonAfterLink: function(tagCtx, linkCtx) {\n\t\t\tvar handler, params, find, activeElem,\n\t\t\t\ttag = this,\n\t\t\t\ti = tag._hi,\n\t\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\t\tl = args.length,\n\t\t\t\tprops = tagCtx.props,\n\t\t\t\tdata = props.data,\n\t\t\t\tview = tagCtx.view,\n\t\t\t\tcontextOb = props.context; // Context ('this' pointer) for attached handler\n\n\t\t\tif (i) { // There is a handler\n\t\t\t\thandler = args[i-1];\n\t\t\t\tparams = args.slice(i); // Subsequent args are params\n\t\t\t\targs = args.slice(0, i-1); // Preceding args (if any) are events and selector\n\t\t\t\ttag._sel = args[1]; // Selector for descendant elements - for delegated events on those elements, delegating to the activeElem\n\n\t\t\t\tactiveElem = tag.activeElem = tag.activeElem || $(tag._.inline\n\t\t\t\t\t? (tag._sel = args[1] || \"*\", tag.parentElem)\n\t\t\t\t\t// If inline, attach to child elements of tag parent element (filtered by selector argument if provided.\n\t\t\t\t\t// (In handler we'll filter out events from sibling elements preceding or following tag.)\n\t\t\t\t\t// This allows us to use the delegated pattern where the attached event works even for added elements satisfying the selector\n\t\t\t\t\t: linkCtx.elem);\n\n\t\t\t\tif (!contextOb) {\n\t\t\t\t\t// Get the path for the preceding object (context object) of handler (which is the last arg), compile function\n\t\t\t\t\t// to return that context object, and run compiled function against data\n\t\t\t\t\tcontextOb = /^(.*)[\\.^][\\w$]+$/.exec(tagCtx.params.args.slice(-params.length - 1)[0]);\n\t\t\t\t\tcontextOb = contextOb && $sub.tmplFn(delimOpenChar1 + \":\" + contextOb[1] + delimCloseChar0, view.tmpl, true)(linkCtx.data, view);\n\t\t\t\t}\n\n\t\t\t\tif (tag._evs) {\n\t\t\t\t\ttag.onUnbind();\n\t\t\t\t}\n\n\t\t\t\tactiveElem.on(\n\t\t\t\t\ttag._evs = args[0] || \"click\", // events defaults to \"click\"\n\t\t\t\t\ttag._sel,\n\t\t\t\t\tdata == undefined ? null : data,\n\t\t\t\t\ttag._hlr = function hndlr(ev) {\n\t\t\t\t\t\tvar nodes, length,\n\t\t\t\t\t\t\tfound = !tag._.inline;\n\n\t\t\t\t\t\tif (!found) { // If inline, filter out events from sibling elements preceding or following tag.\n\t\t\t\t\t\t\tnodes = tag.contents(\"*\");\n\t\t\t\t\t\t\tl = nodes.length;\n\t\t\t\t\t\t\twhile (!found && l--) {\n\t\t\t\t\t\t\t\tif (nodes[l].contains(ev.target)) {\n\t\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (found) { // target elem is indeed within the tag, so call the {on} handler\n\t\t\t\t\t\t\treturn handler.apply(contextOb || linkCtx.data, [].concat(\n\t\t\t\t\t\t\t\tparams, // e.g. par1, par2\n\t\t\t\t\t\t\t\tev,\n\t\t\t\t\t\t\t\t{change: ev.type, view: view, linkCtx: linkCtx},\n\t\t\t\t\t\t\t\tparams.slice.call(arguments, 1) // If triggering event (e.g. jsv-domchange) has additional arguments after ev, pass them too\n\t\t\t\t\t\t\t));\n\t\t\t\t\t\t\t// for {on 'click' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs)\n\t\t\t\t\t\t\t// for {on 'jsv-domchange' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs, tagCtx, linkCtx, observableEventArgs)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tonUpdate: function() {\n\t\t\treturn false;\n\t\t},\n\t\tonUnbind: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.activeElem) {\n\t\t\t\tself.activeElem.off(self._evs, self._sel, self._hlr);\n\t\t\t}\n\t\t},\n\t\tflow: true,\n\t\tcontentCtx: keepParentDataCtx,\n\t\tdataBoundOnly: true\n\t},\n\tradiogroup: {\n\t\tinit: function(tagCtx) {\n\t\t\tthis.name = tagCtx.props.name || (\"jsv\" + Math.random());\n\t\t},\n\t\tonBind: function(tagCtx, linkCtx) {\n\t\t\tvar domChngCntnr,\n\t\t\t\ttag = this,\n\t\t\t\t$linkedElem = tag.linkedElem = (tag._.inline ? tag.contents(true, \"input[type=radio]\") : $(linkCtx.elem).find(\"input[type=radio]\")),\n\t\t\t\tl = $linkedElem.length;\n\n\t\t\tif (tag._.inline) {\n\t\t\t\t// If the first element is owned by (rendered by) this tag (not by a childTag such as {^{for}})\n\t\t\t\t// use it as container for detecting dom changes\n\t\t\t\tdomChngCntnr = tag.contents(\"*\")[0];\n\t\t\t\tdomChngCntnr = domChngCntnr && $.view(domChngCntnr).ctx.tag === tag.parent ? domChngCntnr : tag.parentElem;\n\t\t\t} else {\n\t\t\t\tdomChngCntnr = linkCtx.elem;\n\t\t\t}\n\t\t\twhile (l--) {\n\t\t\t\t// Configure the name for each radio input element\n\t\t\t\t$linkedElem[l].name = $linkedElem[l].name || tag.name;\n\t\t\t}\n\t\t\t// Establish a domchange listener in case this radiogroup wraps a {^{for}} or {^{if}} or similar which might dynamically insert new radio input elements\n\t\t\t$(domChngCntnr).on(\"jsv-domchange\", function(ev, forOrIfTagCtx) {\n\t\t\t\tvar linkedElem,\n\t\t\t\t\tparentTags = forOrIfTagCtx.ctx.parentTags;\n\t\t\t\tif (!tag._.inline || domChngCntnr !== tag.parentElem // The domChngCntnr is specific to this tag\n\t\t\t\t\t// The domChngCntnr is the parentElem of this tag, so need to make sure dom change event is for\n\t\t\t\t\t// a content change within this tag, not outside it.\n\t\t\t\t\t|| parentTags && parentTags[tag.tagName] === tag) {\n\t\t\t\t\t// Contents have changed so recreate $linkedElem for the radio input elements (including possible new one just inserted)\n\t\t\t\t\t$linkedElem = tag.linkedElem = tag.contents(true, \"input[type=radio]\");\n\t\t\t\t\tl = $linkedElem.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t// Configure binding and name for each radio input element\n\t\t\t\t\t\tlinkedElem = $linkedElem[l];\n\t\t\t\t\t\tlinkedElem._jsvLkEl = tag;\n\t\t\t\t\t\tlinkedElem.name = linkedElem.name || tag.name;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag, linkedElem);\n\t\t\t\t\t\tlinkedElem._jsvBnd = \"&\" + tag._tgId + \"+\";\n\t\t\t\t\t\tlinkedElem.checked = tag.cvtArgs()[0] === linkedElem.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tonUpdate: function(ev, eventArgs, tagCtxs) {\n\t\t\treturn false; // don't rerender\n\t\t},\n\t\tcontentCtx: keepParentDataCtx,\n\t\tdataBoundOnly: true\n\t}\n});\n\n$extend($tags[\"for\"], {\n\t//onUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\t//Consider adding filtering for perf optimization. However the below prevents update on some scenarios which _should_ update - namely when there is another array on which for also depends.\n\t\t//var i, l, tci, prevArg;\n\t\t//for (tci = 0; (prevArg = this.tagCtxs[tci]) && prevArg.args.length; tci++) {\n\t\t//\tif (prevArg.args[0] !== newTagCtxs[tci].args[0]) {\n\t\t//\t\treturn true;\n\t\t//\t}\n\t\t//}\n\t\t//return false;\n\t//},\n\tonArrayChange: function(ev, eventArgs, tagCtx, linkCtx) {\n\t\tvar arrayView,\n\t\t\ttarget = ev.target,\n\t\t\ttargetLength = target.length,\n\t\t\ttag = this,\n\t\t\tchange = eventArgs.change;\n\t\tif (tag._.noVws // Child views not supported because target is not html - e.g. data-link=\"title{for ...}\"\n\t\t\t|| tag.tagCtxs[1] && ( // There is an {{else}}\n\t\t\t\tchange === \"insert\" && targetLength === eventArgs.items.length // inserting, and new length is same as inserted length, so going from 0 to n\n\t\t\t\t|| change === \"remove\" && !targetLength // removing , and new length 0, so going from n to 0\n\t\t\t)) {\n\t\t\ttag.refresh();\n\t\t} else {\n\t\t\tfor (arrayView in tag._.arrVws) {\n\t\t\t\tarrayView = tag._.arrVws[arrayView];\n\t\t\t\tif (arrayView.data === target) {\n\t\t\t\t\tarrayView._.onArrayChange.apply(arrayView, arguments);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttag.domChange(tagCtx, linkCtx, eventArgs);\n\t\tev.done = true;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx) {\n\t\tvar i, arrHandler, arrBinding, data,\n\t\t\ttag = this,\n\t\t\tarrayBindings = tag._ars || {},\n\t\t\ttagCtxs = tag.tagCtxs,\n\t\t\tl = tagCtxs.length,\n\t\t\tselected = tag.selected || 0;\n\n\t\tfor (i = 0; i <= selected; i++) {\n\t\t\ttagCtx = tagCtxs[i]; // loop through tagCtxs up to selected\n\t\t\tdata = tagCtx.map\n\t\t\t\t? tagCtx.map.tgt // 'data' is mapped data\n\t\t\t\t: tagCtx.args.length\n\t\t\t\t\t? tagCtx.args[0] // or args[0]\n\t\t\t\t\t: tagCtx.view.data; // or defaults to current data.\n\n\t\t\tif ((arrBinding = arrayBindings[i]) && data !== arrBinding[0]) { // Is there previous array data on this tagCtx, different from new data\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous array\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t\tif (!arrayBindings[i] && $isArray(data)) {\n\t\t\t\t$observe(data, arrHandler = function(ev, eventArgs) {\n\t\t\t\t\tvar tagCt = tagCtx;\n\t\t\t\t\ttag.onArrayChange(ev, eventArgs, tagCt, linkCtx);\n\t\t\t\t});\n\t\t\t\tarrayBindings[i] = [data, arrHandler]; // Store array data and arrayChangeHandler on tag._ars[i]\n\t\t\t}\n\t\t}\n\t\tfor (i = selected + 1; i < l; i++) { // If there were previous bindings on later tagCtxs, remove them\n\t\t\tif (arrBinding = arrayBindings[i]) {\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous binding\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t}\n\t\ttag._ars = arrayBindings;\n\t},\n\tonDispose: function() {\n\t\tvar l, tag = this;\n\t\tfor (l in tag._ars) {\n\t\t\t$observe(tag._ars[l][0], tag._ars[l][1], true); //unobserve\n\t\t}\n\t}\n});\n\n$extend($tags[\"if\"], {\n\tonUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\tvar tci, prevArg, different;\n\t\tfor (tci = 0; (prevArg = this.tagCtxs[tci]); tci++) {\n\t\t\tdifferent = prevArg.props.tmpl !== newTagCtxs[tci].props.tmpl || prevArg.args.length && !(prevArg = prevArg.args[0]) !== !newTagCtxs[tci].args[0];\n\t\t\tif ((!this.convert && !!prevArg) || different) {\n\t\t\t\treturn different;\n\t\t\t\t// If there is not a change of template, and there is no converter, and newArg and prevArg are both truthy, return false to cancel update.\n\t\t\t\t// (Even if values on later elses are different, we still don't want to update, since rendered output would be unchanged)\n\t\t\t\t// If newArg and prevArg are different, return true, to update\n\t\t\t\t// If newArg and prevArg are both falsey, move to the next {{else ...}}\n\t\t\t}\n\t\t}\n\t\t// Boolean value of all args are unchanged (falsey), so return false to cancel update\n\t\treturn false;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx, ctx, ev, eventArgs) {\n\t\tif (eventArgs) {\n\t\t\tthis.domChange(tagCtx, linkCtx, eventArgs);\n\t\t}\n\t}\n});\n\nfunction observeProps(map, ev, eventArgs) {\n\tif (eventArgs.change === \"set\") {\n\t\tvar target = map.tgt,\n\t\t\tl = target.length;\n\t\twhile (l--) {\n\t\t\tif (target[l].key === eventArgs.path) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (l === -1) {\n\t\t\tif (eventArgs.path && !eventArgs.remove) {\n\t\t\t\t$observable(target).insert({key: eventArgs.path, prop: eventArgs.value});\n\t\t\t}\n\t\t} else if (eventArgs.remove) {\n\t\t\t$observable(target).remove(l);\n\t\t} else {\n\t\t\t$observable(target[l]).setProperty(\"prop\", eventArgs.value);\n\t\t}\n\t}\n}\n\nfunction observeMappedProps(map, ev, eventArgs) {\n\tvar item,\n\t\tsource = map.src,\n\t\tchange = eventArgs.change;\n\n\tif (change === \"set\") {\n\t\tif (eventArgs.path === \"prop\") {\n\t\t\t$observable(source).setProperty(ev.target.key, eventArgs.value);\n\t\t} else { // path === \"key\"\n\t\t\t$observable(source).removeProperty(eventArgs.oldValue); // When key is modified observably, remove old one and set new one\n\t\t\t$observable(source).setProperty(eventArgs.value, ev.target.prop);\n\t\t}\n\t} else if (change === \"remove\") {\n\t\titem = eventArgs.items[0];\n\t\t$observable(source).removeProperty(item.key);\n\t\tdelete source[item.key];\n\t} else if (change === \"insert\") {\n\t\titem = eventArgs.items[0];\n\t\tif (item.key) {\n\t\t\t$observable(source).setProperty(item.key, item.prop);\n\t\t}\n\t}\n}\n\nfunction shallowArrayFilter(allPath /*, object, parentObs*/) { // Filter used by {{props}} for the mappedProps target array\n\treturn allPath.indexOf(\".\") < 0;\n}\n\n$tags(\"props\", {\n\tbaseTag: \"for\",\n\tdataMap: $views.map({\n\t\tgetTgt: $tags.props.dataMap.getTgt,\n\t\tobsSrc: observeProps,\n\t\tobsTgt: observeMappedProps,\n\t\ttgtFlt: shallowArrayFilter\n\t}),\n\tflow: true\n});\n\n//========================\n// Extend jQuery namespace\n//========================\n\n$extend($, {\n\n\t//=======================\n\t// jQuery $.view() plugin\n\t//=======================\n\n\tview: $view = function(node, inner, type) {\n\t\t// $.view() returns top view\n\t\t// $.view(node) returns view that contains node\n\t\t// $.view(selector) returns view that contains first selected element\n\t\t// $.view(nodeOrSelector, type) returns nearest containing view of given type\n\t\t// $.view(nodeOrSelector, \"root\") returns root containing view (child of top view)\n\t\t// $.view(nodeOrSelector, true, type) returns nearest inner (contained) view of given type\n\n\t\tfunction getInnerView(nd, isVl) {\n\t\t\tif (nd) {\n\t\t\t\tvwInfos = viewInfos(nd, isVl, rOpenViewMarkers);\n\t\t\t\tfor (j = 0, k = vwInfos.length; j < k; j++) {\n\t\t\t\t\tif ((view = viewStore[vwInfos[j].id]) && (view = view && type ? view.get(true, type) : view)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (inner !== !!inner) {\n\t\t\t// inner not boolean, so this is view(nodeOrSelector, type)\n\t\t\ttype = inner;\n\t\t\tinner = undefined;\n\t\t}\n\t\tvar view, vwInfos, i, j, k, l, elems,\n\t\t\tlevel = 0,\n\t\t\tbody = document.body;\n\n\t\tif (node && node !== body && topView._.useKey > 1) {\n\t\t\t// Perf optimization for common cases\n\n\t\t\tnode = \"\" + node === node\n\t\t\t\t? $(node)[0]\n\t\t\t\t: node.jquery\n\t\t\t\t\t? node[0]\n\t\t\t\t\t: node;\n\n\t\t\tif (node) {\n\t\t\t\tif (inner) {\n\t\t\t\t\tgetInnerView(node._df, true);\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\t// Treat supplied node as a container element and return the first view encountered.\n\t\t\t\t\t\telems = qsa ? node.querySelectorAll(bindElsSel) : $(bindElsSel, node).get();\n\t\t\t\t\t\tl = elems.length;\n\t\t\t\t\t\tfor (i = 0; !view && i < l; i++) {\n\t\t\t\t\t\t\tgetInnerView(elems[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn view;\n\t\t\t\t}\n\t\t\t\twhile (node) {\n\t\t\t\t\t// Move back through siblings and up through parents to find preceding node which is a _prv (prevNode)\n\t\t\t\t\t// script marker node for a non-element-content view, or a _prv (first node) for an elCnt view\n\t\t\t\t\tif (vwInfos = viewInfos(node, undefined, rViewMarkers)) {\n\t\t\t\t\t\tl = vwInfos.length;\n\t\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t\tview = vwInfos[l];\n\t\t\t\t\t\t\tif (view.open) {\n\t\t\t\t\t\t\t\tif (level < 1) {\n\t\t\t\t\t\t\t\t\tview = viewStore[view.id];\n\t\t\t\t\t\t\t\t\treturn view && type ? view.get(type) : view || topView;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlevel--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// level starts at zero. If we hit a view.close, then we move level to 1, and we don't return a view until\n\t\t\t\t\t\t\t\t// we are back at level zero (or a parent view with level < 0)\n\t\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.previousSibling || node.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn topView;\n\t},\n\n\tlink: $link,\n\tunlink: $unlink,\n\n\t//=====================\n\t// override $.cleanData\n\t//=====================\n\tcleanData: function(elems) {\n\t\tif (elems.length && isCleanCall) {\n\t\t\t// Remove JsViews bindings. Also, remove from the DOM any corresponding script marker nodes\n\t\t\tclean(elems);\n\t\t}\n\t\toldCleanData.apply($, arguments);\n\t}\n});\n\n// Possible future addition - e.g. for ckeditor tag control\n//$views.utility = {\n//\tvalidate: function(html) {\n//\t\ttry {\n//\t\t\ttopView.link(undefined, document.createElement(\"div\"), undefined, undefined, html, undefined, undefined, 1);\n//\t\t}\n//\t\tcatch (e) {\n//\t\t\treturn e.message;\n//\t\t}\n//\t}\n//};\n\n//===============================\n// Extend jQuery instance plugins\n//===============================\n\n$extend($.fn, {\n\tlink: function(expr, from, context, noIteration, parentView, prevNode, nextNode) {\n\t\treturn $link(expr, this, from, context, noIteration, parentView, prevNode, nextNode);\n\t},\n\tunlink: function() {\n\t\treturn $unlink(this);\n\t},\n\tview: function(inner, type) {\n\t\treturn $view(this[0], inner, type);\n\t}\n});\n\n//==============================================================================\n// Override jQuery methods that call our overridden cleanData, for disposal etc.\n//==============================================================================\n\n$.each([HTML, \"replaceWith\", \"empty\", \"remove\"], function(i, name) {\n\tvar oldFn = $.fn[name];\n\t$.fn[name] = function() {\n\t\tvar result;\n\t\tisCleanCall = 1; // Make sure cleanData does disposal only when coming from these calls.\n\t\ttry {\n\t\t\tresult = oldFn.apply(this, arguments);\n\t\t}\n\t\tfinally {\n\t\t\tisCleanCall = 0;\n\t\t}\n\t\treturn result;\n\t};\n});\n\n//===============\n// Extend topView\n//===============\n\naddLinkMethods($extend(topView = $sub.topView, {tmpl: {links: {}}}));\n\nviewStore = {0: topView}; // Top-level view\n//===============\n// Extend $.views\n//===============\n\n$views.getCtx = function(param) { // Return value of ctx.foo, including for compiled contextual parameters, ~foo=expr\n\tif (param && param._cp) { // If this helper resource is a contextual parameter, ~foo=expr\n\t\tparam = param[1](param[0].data, param[0], $sub);\n\t}\n\treturn param;\n};\n\n//===================\n// Extend $.views.sub\n//===================\n\n$sub._cp = function(paramVal, params, view) { // Get compiled contextual parameters (or properties) ~foo=expr.\n\tif (view.linked) { // In JsViews, returns [view, linkFn] where linkFn is compiled function for expression\n\t\tparams = delimOpenChar1 + \":\" + params + delimCloseChar0;\n\t\tvar tmpl = view.tmpl,\n\t\t\tlinks = topView.tmpl.links, // Use topView links, as for compiled top-level linking expressions. To do - should this ever get disposed?\n\t\t\tlinkFn = links[params];\n\t\tif (!linkFn) {\n\t\t\tlinks[params] = linkFn = $sub.tmplFn(params, tmpl, true);\n\t\t}\n\t\tparamVal = [view, linkFn];\n\t\tparamVal._cp = true; // Flag that this is a contextual parameter\n\t}\n\treturn paramVal; // In JsRender returns evaluated expression\n};\n\n$sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each referenced contextual parameter ~foo uses its own exprOb instances\n\tvar ob,\n\t\tclones = obs,\n\t\tl = obs.length;\n\tif (l) {\n\t\tclones = [];\n\t\twhile (l--) {\n\t\t\tob = obs[l];\n\t\t\tif (ob._jsv) {\n\t\t\t\tob = $extend({}, ob); // If an exprOb, clone it. If a string, keep as is\n\t\t\t\tob.prm = cloneExprObjects(ob.prm); // Recursively clone exprObs in parameters, too\n\t\t\t}\n\t\t\tclones.unshift(ob);\n\t\t}\n\t}\n\treturn clones;\n};\n\n//=========================\n// Extend $.views.settings\n//=========================\n\noldAdvSet = $sub.advSet;\n\n$sub.advSet = function() { // refresh advanced settings\n\toldAdvSet();\n\tglobal._jsv = $subSettingsAdvanced._jsv\n\t\t? $extend(global._jsv || {}, { // create global _jsv, for accessing views, etc\n\t\t\t\tviews: viewStore,\n\t\t\t\tbindings: bindingStore\n\t\t\t})\n\t\t: undefined; // In IE8 cannot do delete global._jsv\n\t$viewsLinkAttr = $subSettingsAdvanced.linkAttr;\n\tlinkViewsSel = bindElsSel + \",[\" + $viewsLinkAttr + \"]\";\n\twrapMap = $subSettingsAdvanced._wm;\n\twrapMap.optgroup = wrapMap.option;\n\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\twrapMap.th = wrapMap.td;\n};\n\n$viewsSettings.advanced({\n\tlinkAttr: \"data-link\",\n\tuseViews: false,\n\tnoValidate: false,\n\t// wrapMap provide appropriate wrappers for inserting innerHTML, used in insertBefore\n\t// We have to close these tags to support XHTML (#13200)\n\t// TODO investigate whether more recent jQuery implementation using wrapMap in domManip/$().html() etc. is better optimized now...\n\t_wm: {\n\t\toption: [1, \"\"],\n\t\tlegend: [1, \"
\", \"
\"],\n\t\tarea: [1, \"\", \"\"],\n\t\tparam: [1, \"\", \"\"],\n\t\tthead: [1, \"
\", \"
\"],\n\t\ttr: [2, \"\", \"
\"],\n\t\ttd: [3, \"\", \"
\"],\n\t\tcol: [2, \"\", \"
\"],\n\t\tsvg_ns: [1, \"\", \"\"],\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\tdiv: $.support.htmlSerialize ? [0, \"\", \"\"] : [1, \"X
\", \"
\"]\n\t},\n\t_fe: {\n\t\tinput: {\n\t\t\tfrom: inputAttrib, to: \"value\"\n\t\t},\n\t\ttextarea: valueBinding,\n\t\tselect: valueBinding,\n\t\toptgroup: {\n\t\t\tto: \"label\"\n\t\t}\n\t}\n});\n\nreturn $;\n}, window));\n"]} \ No newline at end of file +{"version":3,"sources":["jsviews.js"],"names":["factory","global","$","jQuery","exports","module","define","amd","getDerivedMethod","baseMethod","method","ret","tag","this","prevBase","base","apply","arguments","getMethod","$isFunction","_d","noop","tagHandlersFromProps","tagCtx","prop","props","rHasHandlers","test","retVal","val","dbgBreak","console","log","e","baseApply","JsViewsError","message","name","link","$extend","target","source","$viewsDelimiters","openChars","closeChars","$isArray","$views","$subSettings","delimiters","linkChar","charAt","delimOpenChar0","delimOpenChar1","delimCloseChar0","delimCloseChar1","rTag","$sub","RegExp","rTmpl","$viewsSettings","getView","inner","type","undefined","views","i","l","found","view","root","_","useKey","get","length","parent","getNestedIndex","index","getIndex","getHelper","helper","isContextCb","wrapped","deps","res","ctx","$helpers","_cp","_ceo","unshift","getCtx","_wrp","getTemplate","tmpl","fn","getRsc","$templates","convertVal","converter","onError","value","boundTag","bnds","linkCtx","args","data","_tg","inline","bnd","unlinked","tagName","cvt","flow","extendCtx","_er","cvtArgs","onRender","convertArgs","convert","error","slice","depends","getDeps","getResource","resourceType","itemName","store","renderTag","parentView","tagCtxs","isUpdate","topView","tagDef","template","tags","attr","parentTag","itemRet","tagCtxCtx","content","callInit","mapDef","thisMap","initialTmpl","tagDataMap","contentCtx","parentTmpl","_is","tmpls","render","renderContent","getTmpl","_ctr","init","dataMap","arrVws","dataBoundOnly","map","parents","parentTags","rendering","src","unmap","tgt","noVws","HTML","linked","linkedElem","rWrappedInViewMarker","renderWithViews","templates","$converters","html","View","context","key","contentTmpl","parentView_","self_","self","isArray","id","viewId","indexStr","push","splice","compileChildResources","storeName","storeNames","resources","jsvStores","compileTag","Tag","baseTag","compiledDef","$tags","prototype","constructor","_parentTmpl","compileTmpl","options","lookupTemplate","currentName","nodeType","elem","document","getElementById","find","innerHTML","getAttribute","tmplAttr","jsvTmpl","tmplName","setAttribute","compiledTmpl","tmplOrMarkup","markup","tmplObject","tmplFn","replace","rEscapeQuotes","$render","getDefaultVal","defaultVal","isFunction","call","unmapArray","modelArr","arr","compileViewModel","GetNew","vm","iterate","action","j","getterType","ob","m","getters","getter","viewModels","JSON","parse","merge","viewModel","$expando","getterNames","mod","assigned","newModArr","model","$observable","refresh","concat","extend","proto","body","observable","privField","setProperty","set","Function","htmlTag","wrapMap","$subSettingsAdvanced","_wm","links","rFirstElem","exec","toLowerCase","div","trim","registerStore","storeSettings","theStore","item","onStore","compile","thisStore","OBJECT","getTgt","addSetting","st","Map","baseMap","noIteration","isTopRenderCall","prevData","prevIndex","result","isRenderCall","useViews","setItemVar","newCtx","itemVar","newView","childView","itemResult","swapContent","outerOnRender","syntaxError","helpers","it","onRenderError","fallback","Err","isLinkExpr","convertBack","hasElse","pushprecedingContent","shift","loc","substr","rNewLine","blockTagCheck","block","parseTag","all","bind","colon","codeTag","params","slash","bind2","closeBlock","pathBindings","ctxProps","paramsArgs","paramsProps","paramsCtxProps","useTrigger","allowCode","rUnescapeQuotes","rTestElseIf","current","substring","stack","pop","parseParams","rBuildHash","onerror","isCtx","keyToken","keyValue","arg","param","hasHandlers","newNode","parsedParam","bindings","astTop","buildCode","setPaths","pathsArr","paths","hasOwnProperty","skp","paramStructure","parts","parseTokens","lftPrn0","lftPrn","bound","path","operator","err","eq","path2","prn","comma","lftPrn2","apos","quot","rtPrn","rtPrnDot","prn2","space","full","parsePath","allPath","not","object","viewProperty","pathTokens","leafToken","subPath","binds","named","bindto","_jsvto","bndCtx","bd","theOb","_jsv","sb","pathStart","parenDepth","expr","exprFn","newOb","rtSq","aposed","quoted","boundName","bndStack","prm","tmplLinks","indexOf","paramIndex","split","join","rPath","fnCall","0","rParams","ast","node","hasTag","hasEncoder","getsVal","hasCnvt","useCnvt","tmplBindings","boundOnErrStart","boundOnErrEnd","tagRender","nestedTmpls","nestedTmpl","tagAndElses","nextIsElse","oldCode","isElse","isGetVal","tagCtxFn","tagStart","trigger","tmplBindingKey","converters","code","tmplOptions","debug","_tag","debugMode","parentContext","getCharEntity","ch","charEntities","charCodeAt","getTargetProps","$fnRender","tmplElem","jquery","htmlEncode","text","rIsHtml","rHtmlEncode","elemChangeHandler","ev","sourceValue","setter","cancel","fromAttr","cvtBack","cnvtName","$source","binding","oldLinkCtx","onBeforeChange","onAfterChange","to","eventArgs","exprOb","contextCb","_jsvBnd","rSplitBindings","bindingStore","hlp","onBeforeChangeStr","onAfterChangeStr","defaultAttr","fnSetters","nodeName","_jsvSel","multiple","change","oldValue","_val","_ctxCb","_cpCtx","chging","propertyChangeHandler","linkFn","noUpdate","forceUpdate","hasError","parentElem","parentNode","onEvent","_toLk","getTargetVal","onUpdate","mergeCtxs","NONE","callAfterLink","observeAndBind","onUnbind","_cnvt","TRUE","addLinkMethods","updateContent","_noUpd","currentValue","css","$target","style","parseInt","CHECKBOX","CHECKED","RADIO","setDefer","_df","deferAttr","prevNode","nextNode","promise","nodesToRemove","useProp","tokens","openIndex","closeIndex","testElem","cStyle","jsvSel","renders","targetParent","targetVal","_elCnt","_prv","_nxt","currentStyle","getComputedStyle","display","_jsvd","displayStyles","createElement","appendChild","removeChild","nodes","transferViewTokens","_tgId","disposeTokens","previousSibling","lastChild","remove","lazyLink","empty","children","textContent","innerText","selected","inArray","arrayChangeHandler","items","srt","addViews","removeViews","oldIndex","fixIndex","setArrayChangeLink","handler","arrayBinding","bndArr","off","arrayChangeStr","on","linkGetVal","_fe","contentEditable","from","renderAndLink","linkToNode","prevView","bindId","elCnt","removeViewBinding","nextSibling","addBindingMarkers","end","bindingKey","viewStore","k","exprFnDeps","propDeps","cvtBk","_bndId","_hdl","_depends","_apply","boundProps","_jsvLkEl","bindTo","jsvAttrStr","tmplLink","$link","tmplOrLinkExpr","activeBody","elementChangeStr","vwInfos","placeholderParent","targetEl","topLevelCall","replaceMode","$view","addDataBinding","cleanData","lnk","viewInfos","rOpenViewMarkers","viewLink","outerData","validateOnly","convertMarkers","preceding","selfClose","closeTag","spaceBefore","boundId","spaceAfter","tag1","tag2","closeTag2","spaceAfterClose","selfClose2","endOpenTag","errorMsg","bndId","endOfElCnt","inTag","isVoid","tagStack","validate","voidElems","prevElCnt","elContent","defer","ids","openScript","closeScript","deferStack","badParent","processViewInfos","deferPath","deferChar","bindChar","onAftCr","deep","addedBindEls","_tkns","len","vwInfo","open","onArrayChange","removeSubStr","onAfterCreateStr","onAfterCreate","bindEls","getViewInfos","level","tagDepth","dataLink","wrap","selector","linkViewsSel","elems","qsa","querySelectorAll","prevNodes","markerNodeInfo","contains","isLink","rViewMarkers","skip","processInfos","$viewsLinkAttr","rOpenTagMarkers","unmarkPrevOrNextNode","resolve","prevIds","linkInfo","token","nextView","depth","fragment","copiedNode","firstTag","wrapper","thisId","Deferred","noValidate","markPrevOrNextNode","namespaceURI","rConvertMarkers","safeFragment","createDocumentFragment","firstChild","insertBefore","setTimeout","linkMarkup","currentView","boundTagId","tagExpr","rTagIndex","lastIndex","linkExpressions","bindDataLinkTarget","normalizeLinkTag","rTagDatalink","isLk","noArray","_gccb","str","SCRIPT","isVal","rBinding","getInfos","close","elPath","infos","rMarkerTokens","removeAttribute","marker","twoway","displayElem","linkedEl","linkedTag","linkedElement","contents","first","onBind","onAfterLink","targetTag","setSize","height","width","title","hasClass","removeClass","addClass","asyncElemChangeHandler","bindElChange","$elem","trig","onoff","pathIndex","lastPath","bindtoOb","$linkedElem","newTrig","oldTrig","_jsvTr","newCtxs","newTagCtx","_ths","clean","elemArray","linkedElemTag","objId","obsId","cbId","propertyChangeStr","onDispose","cbBindingsStore","$unlink","each","innerView","getElementsByTagName","inputAttrib","viewOrTagChar","viewOrTag","precedingLength","emptyView","vwItem","rOpenMarkers","tagOrView","isTag","select","filtered","filter","add","withMarkers","prevIsFirstNode","lastSibling","childTags","disposed","update","domChange","hasListener","hasData","_data","events","domChangeNotification","triggerHandler","dataItems","viewsCount","itemsCount","keepNodes","isMove","removeView","viewToRemove","sort","fromIndex","keepParentDataCtx","observeProps","insert","observeMappedProps","removeProperty","shallowArrayFilter","setGlobals","jsvStoreName","$observe","setting","versionNumber","rAttrEncode","&","<",">","\u0000","'","\"","`","=","jsr","jsrender","jsrToJq","jsviews","sub","syntaxErr","settings","advSet","_err","_html","_sq","advanced","Error","expando","renderFile","__express","Array","obj","_jq","jq","if","done","for","finalElse","include","*",":*","dbg","url","encodeURI","observe","$eventSpecial","event","special","PARSEINT","rNotWhite","propChng","arrChng","observeStr","observeObjKey","observeCbKey","observeInnerCbKey","$hasData","$data","getCbKey","cb","_cId","ObjectObservable","ns","_ns","ArrayObservable","wrapArray","resolvePathObjects","callback","nextObj","out","removeCbBindings","cbBindings","cbBindingsId","onObservableChange","isOb","allowArray","parentObs","observeAll","array","_path","observe_apply","$observeAll","unobserve","$unobserveAll","namespace","objMap","observeArrayItems","unobs","newAllPath","filterAndObserveAll","nestedArray","newObject","newParentObs","_fltr","nextParentObs","updatedTgt","wrappedCb","isObject","obId","notRemoving","un","shallowFilter","$unobserve","innerObserve","observeOnOff","pathStr","isArrayBinding","evData","obIdExpando","boundObOrArr","prntObs","allPth","initialNs","el","fullPath","getInnerCb","origRt","newObj","bindArray","unbind","relPath","prevObj","prevAllPath","p","dep","inId","innerContextCb","innerCb","initNsArr","initNsArrLen","lastArg","_inId","match","origRoot","Object","unobserveAll","nonStrict","pair","multi","_setProperty","leaf","removeProp","property","Date","_trigger","_insert","oldLength","numToRemove","_remove","move","newIndex","numToMove","_move","excess","newItems","insertAdded","addedItems","dataLength","newItem","num","oldItems","newLength","_srt","$_data","handleObj","unbound","changing","obsSrc","obs","srcFlt","obsTgt","obt","tgtFlt","_def","oldAdvSet","bindElsSel","input","valueBinding","isCleanCall","oldCleanData","oldJsvDelimiters","querySelector","ol","ul","table","tbody","thead","tfoot","tr","colgroup","dl","optgroup","svg","svg_ns","br","img","hr","area","col","meta","command","embed","keygen","track","wbr","rViewPath","requiresStr","regularExpression","toggle","_hi","activeElem","contextOb","_sel","_evs","_hlr","radiogroup","Math","random","domChngCntnr","forOrIfTagCtx","checked","arrayView","targetLength","arrHandler","arrBinding","arrayBindings","_ars","tagCt","newTagCtxs","tci","prevArg","different","getInnerView","nd","isVl","unlink","oldFn","paramVal","cloneExprObjects","clones","last","nextPath","linkAttr","option","caption","th","td","legend","support","htmlSerialize","textarea","window"],"mappings":";;CAcC,SAASA,EAASC,GAElB,GAAIC,GAAID,EAAOE,MAEQ,iBAAZC,SACVC,OAAOD,QAAUF,EACdF,EAAQC,EAAQC,GAChB,SAASA,GACV,MAAOF,GAAQC,EAAQC,IAEG,kBAAXI,SAAyBA,OAAOC,IACjDD,QAAQ,UAAW,SAASJ,GAC3B,MAAOF,GAAQC,EAAQC,KAGxBF,EAAQC,GAAQ,IAKlB,SAASA,EAAQC,GACjB,YA4HA,SAASM,GAAiBC,EAAYC,GACrC,MAAO,YACN,GAAIC,GACHC,EAAMC,KACNC,EAAWF,EAAIG,IAKhB,OAHAH,GAAIG,KAAON,EACXE,EAAMD,EAAOM,MAAMJ,EAAKK,WACxBL,EAAIG,KAAOD,EACJH,GAIT,QAASO,GAAUT,EAAYC,GAc9B,MAXIS,IAAYT,KACfA,EAASF,EACNC,EAEEA,EAAWW,GACVX,EACAD,EAAiBa,EAAMZ,GAHxBY,EAIHX,GAEFA,EAAOU,GAAK,GAENV,EAGR,QAASY,GAAqBV,EAAKW,GAClC,IAAK,GAAIC,KAAQD,GAAOE,MACnBC,GAAaC,KAAKH,KACrBZ,EAAIY,GAAQN,EAAUN,EAAIY,GAAOD,EAAOE,MAAMD,KAOjD,QAASI,GAAOC,GACf,MAAOA,GAGR,QAASR,KACR,MAAO,GAGR,QAASS,GAASD,GAEjB,IAEC,KADAE,SAAQC,IAAI,4BAA8BH,GACpC,iBAEP,MAAOI,IACP,MAAOpB,MAAKE,KAAOF,KAAKqB,UAAUjB,WAAaY,EAGhD,QAASM,GAAaC,GAGrBvB,KAAKwB,MAAQnC,EAAEoC,KAAO,UAAY,YAAc,SAChDzB,KAAKuB,QAAUA,GAAWvB,KAAKwB,KAGhC,QAASE,GAAQC,EAAQC,GACxB,IAAK,GAAIJ,KAAQI,GAChBD,EAAOH,GAAQI,EAAOJ,EAEvB,OAAOG,GAWR,QAASE,GAAiBC,EAAWC,EAAYN,GAGhD,MAAKK,GAGDE,GAASF,GACLD,EAAiB1B,MAAM8B,GAAQH,IAGvCI,GAAaC,YAAcL,EAAWC,EAAYK,GAAWX,EAAOA,EAAKY,OAAO,GAAKD,IAErFE,GAAiBR,EAAUO,OAAO,GAClCE,GAAiBT,EAAUO,OAAO,GAClCG,GAAkBT,EAAWM,OAAO,GACpCI,GAAkBV,EAAWM,OAAO,GACpCP,EAAY,KAAOQ,GAAiB,MAAQF,GAAW,OAASG,GAChER,EAAa,KAAOS,GAAkB,KAAOC,GAG7CC,GAAO,uBAAyBF,GAAkB,wCAC/CA,GAAkB,OAASA,GAAkB,QAAUC,GAAkB,QAG5EE,GAAKD,KAAO,MAAQA,GAAO,IAE3BA,GAAO,GAAIE,QAAO,MAAQd,EAAYY,GAAO,YAAcJ,GAAiB,MAAQF,GAAW,OAASG,GAAiB,yCAA2CR,EAAY,KAKhLY,GAAKE,MAAQ,GAAID,QAAO,wBAA0Bd,EAAY,KAAOC,GAG9De,IA9BCZ,GAAaC,WAqCtB,QAASY,GAAQC,EAAOC,GAClBA,GAAQD,KAAU,IAEtBC,EAAOD,EACPA,EAAQE,OAGT,IAAIC,GAAOC,EAAGC,EAAGC,EAChBC,EAAOvD,KACPwD,GAAQP,GAAiB,SAATA,CAGjB,IAAID,GAIH,GADAM,EAAQL,GAAQM,EAAKN,OAASA,GAAQM,GACjCD,EAEJ,GADAH,EAAQI,EAAKJ,MACTI,EAAKE,EAAEC,QACV,IAAKN,IAAKD,GACT,GAAIG,EAAQL,EAAOE,EAAMC,GAAGO,IAAIX,EAAOC,GAAQE,EAAMC,GACpD,UAIF,KAAKA,EAAI,EAAGC,EAAIF,EAAMS,QAASN,GAASF,EAAIC,EAAGD,IAC9CE,EAAQL,EAAOE,EAAMC,GAAGO,IAAIX,EAAOC,GAAQE,EAAMC,OAI9C,IAAII,EAEV,KAAOD,EAAKM,QACXP,EAAQC,EACRA,EAAOA,EAAKM,WAGb,MAAON,IAASD,GAEfA,EAAQC,EAAKN,OAASA,EAAOM,EAAOL,OACpCK,EAAOA,EAAKM,MAGd,OAAOP,GAGR,QAASQ,KACR,GAAIP,GAAOvD,KAAK2D,IAAI,OACpB,OAAOJ,GAAOA,EAAKQ,MAAQb,OAO5B,QAASc,KACR,MAAOhE,MAAK+D,MASb,QAASE,GAAUC,EAAQC,GAE1B,GAAIC,GAASC,EACbd,EAAOvD,KACPsE,EAAMf,EAAKgB,GAQX,IANID,IACHA,EAAMA,EAAIJ,IAEChB,SAARoB,IACHA,EAAME,GAASN,IAEZI,GAAOA,EAAIG,IAAK,CACnB,GAAIN,EAIH,MAHAE,GAAO1B,GAAK+B,KAAKJ,EAAI,GAAGD,MACxBA,EAAKM,QAAQL,EAAI,IACjBD,EAAKI,KAAM,EACJJ,CAERC,GAAMrC,GAAO2C,OAAON,GAgBrB,MAbIA,IACChE,GAAYgE,KAASA,EAAIO,OAK5BT,EAAU,WACT,MAAOE,GAAInE,MAAQH,MAAQA,OAASZ,EAAiBY,KAAPuD,EAAanD,YAE5DgE,EAAQS,KAAOtB,EACf7B,EAAQ0C,EAASE,IAGZF,GAAWE,EAGnB,QAASQ,GAAYC,GACpB,MAAOA,KAASA,EAAKC,GAClBD,EACA/E,KAAKiF,OAAO,YAAaF,IAASG,GAAWH,IAOjD,QAASI,GAAWC,EAAW7B,EAAM7C,EAAQ2E,GAE5C,GAAItF,GAAKuF,EAERC,EAA6B,gBAAX7E,IAAuB6C,EAAKwB,KAAKS,KAAK9E,EAAO,GAC/D+E,EAAUlC,EAAKkC,OA4ChB,OA1CgBvC,UAAZmC,EACH3E,EAAS2E,GAAWzE,SAAW8E,MAAOL,IAC5BE,IACV7E,EAAS6E,EAAShC,EAAKoC,KAAMpC,EAAMZ,KAGpC2C,EAAQ5E,EAAOgF,KAAK,IAChBN,GAAaG,KAChBxF,EAAM0F,GAAWA,EAAQ1F,IACpBA,IACJA,EAAM2B,EAAQ,GAAIiB,IAAKiD,KACtBnC,GACCoC,QAASJ,EACTK,IAAKP,EACLQ,UAAU,GAEXC,QAAS,IACTC,IAAKb,EACLc,MAAM,EACNxF,OAAQA,IAEL+E,IACHA,EAAQ1F,IAAMA,EACdA,EAAI0F,QAAUA,GAEf/E,EAAO6D,IAAM4B,EAAUzF,EAAO6D,KAAMkB,EAAUA,EAAQlC,KAAOA,GAAMgB,MAEpExE,EAAIqG,IAAMf,GAAWC,EACrB7E,EAAqBV,EAAKW,GAE1BA,EAAO6C,KAAOA,EAEdxD,EAAIwE,IAAM7D,EAAO6D,KAAOxE,EAAIwE,QAC5B7D,EAAO6D,IAAMrB,OAEboC,EAAQvF,EAAIsG,QAAsB,SAAdjB,GAAwBA,GAAW,GAGvDE,EAAQC,GAAYhC,EAAKE,EAAE6C,SACxB/C,EAAKE,EAAE6C,SAAShB,EAAO/B,EAAMxD,GAC7BuF,GAEYpC,QAAToC,EAAqBA,EAAQ,GAGrC,QAASiB,GAAYnB,GACpB,GAAIrF,GAAMC,KACTU,EAASX,EAAIW,OACb6C,EAAO7C,EAAO6C,KACdmC,EAAOhF,EAAOgF,IAoBf,OAlBAN,GAAYA,GAAarF,EAAIyG,QAC7BpB,EAAYA,IAAc,GAAKA,IAAcA,EACzC7B,EAAK0B,OAAO,aAAcG,IAAcqB,EAAM,uBAAyBrB,EAAY,KACpFA,GAEHM,EAAQA,EAAK9B,QAAWlD,EAAOqD,MAE5BqB,EACCM,EAAKgB,QAELhB,GAJAnC,EAAKoC,MAMLP,IACCA,EAAUuB,UACb5G,EAAI4G,QAAUhE,GAAKiE,QAAQ7G,EAAI4G,QAAS5G,EAAKqF,EAAUuB,QAASvB,IAEjEM,EAAK,GAAKN,EAAUjF,MAAMJ,EAAK2F,IAEzBA,EAOR,QAASmB,GAAYC,EAAcC,GAGlC,IAFA,GAAIzC,GAAK0C,EACRzD,EAAOvD,KACQkD,SAARoB,GAAsBf,GAC7ByD,EAAQzD,EAAKwB,MAAQxB,EAAKwB,KAAK+B,GAC/BxC,EAAM0C,GAASA,EAAMD,GACrBxD,EAAOA,EAAKM,MAEb,OAAOS,IAAOrC,GAAO6E,GAAcC,GAGpC,QAASE,GAAUjB,EAASkB,EAAYnC,EAAMoC,EAASC,EAAU/B,GAChE6B,EAAaA,GAAcG,EAC3B,IAAItH,GAAWuH,EAAQC,EAAUC,EAAMC,EAAMC,EAAWtE,EAAGC,EAAGsE,EAASjH,EAAQkH,EAC9EC,EAASC,EAAUC,EAAQC,EAAStC,EAAM9E,EAAOqH,EAAaC,EAAYC,EAC1ErI,EAAM,GACN2F,EAAUyB,EAAWzB,SAAW,EAChClB,EAAM2C,EAAW3C,IACjB6D,EAAarD,GAAQmC,EAAWnC,KAEhCQ,EAA8B,gBAAZ4B,IAAwBD,EAAWnC,KAAKS,KAAK2B,EAAQ,EAoBxE,KAlBoB,QAAhBnB,EAAQqC,KACXtI,EAAMiG,EACNA,EAAUjG,EAAIiG,QACdmB,EAAUpH,EAAIoH,QACdI,EAAWxH,EAAIwH,WAEfD,EAASJ,EAAWjC,OAAO,OAAQe,IAAYS,EAAM,kBAAoBT,EAAU,OACnFuB,EAAWD,EAAOC,UAGHrE,SAAZmC,GACHvF,GAAOuF,EACP8B,EAAU9B,IAAYzE,SAAW8E,WACvBH,IACV4B,EAAU5B,EAAS2B,EAAWvB,KAAMuB,EAAYvE,KAGjDU,EAAI8D,EAAQvD,OACPR,EAAI,EAAGA,EAAIC,EAAGD,IAClB1C,EAASyG,EAAQ/D,KACZqC,IAAYA,EAAQ1F,KAAOqD,IAAMqC,EAAQ1F,IAAI0D,EAAEoC,QAAU9F,EAAIqG,QAG7DyB,EAAUO,EAAWE,OAAS5H,EAAOqE,QACxC8C,EAAUnH,EAAOmH,QAAUO,EAAWE,MAAMT,EAAU,IAEvDnH,EAAOqD,MAAQX,EACf1C,EAAOqE,KAAO8C,EACdnH,EAAO6H,OAASC,EAChB9H,EAAO6C,KAAO2D,EACdxG,EAAO6D,IAAM4B,EAAUzF,EAAO6D,IAAKA,KAEhCQ,EAAOrE,EAAOE,MAAMmE,QAEvBrE,EAAOqE,KAAOmC,EAAWuB,QAAQ1D,IAG7BhF,IAMJA,EAAM,GAAIuH,GAAOoB,KACjBZ,IAAa/H,EAAI4I,KAEjB5I,EAAI8D,OAAS6D,EAAYnD,GAAOA,EAAIxE,IACpCA,EAAIoH,QAAUA,EACde,EAAanI,EAAI6I,QAEbnD,IACH1F,EAAI0D,EAAEoC,QAAS,EACfJ,EAAQ1F,IAAMA,EACdA,EAAI0F,QAAUA,IAEX1F,EAAI0D,EAAEqC,IAAMP,GAAYE,EAAQT,IAEnCjF,EAAI0D,EAAEoF,UACI9I,EAAI+I,eACdrC,EAAM,MAAQT,EAAU,8BAK1BmB,EAAUpH,EAAIoH,QACde,EAAanI,EAAI6I,QAEjBlI,EAAOX,IAAMA,EACTmI,GAAcf,IACjBzG,EAAOqI,IAAM5B,EAAQ/D,GAAG2F,KAEpBhJ,EAAImG,OACR0B,EAAYlH,EAAO6D,IAAM7D,EAAO6D,QAGhCiD,EAAOzH,EAAIiJ,QAAUpB,EAAUqB,WAAa1E,GAAO4B,EAAUyB,EAAUqB,WAAY1E,EAAI0E,gBACnFvB,IACHF,EAAKE,EAAU1B,SAAW0B,GAG3BF,EAAKzH,EAAIiG,SAAW4B,EAAU7H,IAAMA,EAGtC,MAAMA,EAAIqG,IAAMf,GAAU,CAGzB,IAFA5E,EAAqBV,EAAKoH,EAAQ,IAClCpH,EAAImJ,aACC9F,EAAI,EAAGA,EAAIC,EAAGD,IAClB1C,EAASX,EAAIW,OAASyG,EAAQ/D,GAC9BxC,EAAQF,EAAOE,MACf8E,EAAO3F,EAAIsG,WAEP0B,EAASnH,EAAMgI,SAAWV,KACzBxC,EAAK9B,QAAUhD,EAAMgI,WACxBZ,EAAUtH,EAAOqI,IACZf,GAAWA,EAAQmB,MAAQzD,EAAK,KAAM0B,IACtCY,GAAWA,EAAQmB,KACtBnB,EAAQoB,QAETpB,EAAUtH,EAAOqI,IAAMhB,EAAOgB,IAAIrD,EAAK,GAAI9E,EAAOsC,QAAYnD,EAAI0D,EAAEqC,MAErEJ,GAAQsC,EAAQqB,MAGlBtJ,EAAIwE,IAAM7D,EAAO6D,IAEZnB,IACA0E,IACHG,EAAclI,EAAIwH,SAClBxH,EAAI4I,KAAKjI,EAAQ+E,EAAS1F,EAAIwE,KAC9BuD,EAAW5E,QAERuC,IAGHA,EAAQgC,KAAO1H,EAAI0H,KAAOhC,EAAQgC,MAAQ1H,EAAI0H,MAE/CA,EAAO1H,EAAI0H,KACX1H,EAAI0D,EAAE6F,MAAQ7B,GAAQA,IAAS8B,IAGhC5B,EAAUzE,OACNnD,EAAIwI,SACPZ,EAAU5H,EAAIwI,OAAOpI,MAAMJ,EAAK2F,GAC5BwB,EAAWsC,QAAU7B,GAAW5H,EAAI0J,aAAeC,GAAqB5I,KAAK6G,KAGhFA,EAAUgC,EAAgBtK,EAAEuK,UAAUjC,GAAUjC,EAAK,GAAIxC,OAAWA,OAAWgE,EAAYhE,OAAWA,OAAWnD,KAG9G2F,EAAK9B,SACT8B,GAAQwB,IAEOhE,SAAZyE,IACHQ,EAAazC,EAAK,GACd3F,EAAIoI,aACPA,EAAapI,EAAIoI,WAAWA,IAE7BR,EAAUjH,EAAO6H,OAAOJ,GAAY,KAAUf,EAAWlE,OAAY,KAGtEpD,EAAMA,EAAMA,GAAO6H,GAAW,IAAMA,CAErC5H,GAAImJ,UAAYhG,OAajB,MAXAnD,GAAIW,OAASyG,EAAQ,GACrBpH,EAAIwE,IAAMxE,EAAIW,OAAO6D,IAEjBxE,EAAI0D,EAAE6F,OACJvJ,EAAI0D,EAAEoC,SAEV/F,EAAe,SAAT2H,EACHoC,GAAYC,KAAKhK,GACjB,IAGEyF,GAAY2B,EAAWzD,EAAE6C,SAE7BY,EAAWzD,EAAE6C,SAASxG,EAAKoH,EAAYnH,GACvCD,EAOJ,QAASiK,GAAKC,EAAS/G,EAAMiE,EAAYvB,EAAM4B,EAAU0C,EAAK3D,EAAU4D,GAEvE,GAAI/G,GAAOgH,EAAkBC,EAC5BC,EAAOrK,KACPsK,EAAmB,UAATrH,CAEXoH,GAAKxC,QAAUqC,EACfG,EAAKlH,MAAQmH,QACbD,EAAKxG,OAASqD,EACdmD,EAAKpH,KAAOA,GAAQ,MACpBoH,EAAK1E,KAAOA,EACZ0E,EAAKtF,KAAOwC,EAIZ6C,EAAQC,EAAK5G,GACZwG,IAAK,EACLvG,OAAQ4G,EAAU,EAAI,EACtBC,GAAI,GAAKC,KACTlE,SAAUA,EACVd,SAED6E,EAAKb,SAAWlD,EACZY,GACH/D,EAAQ+D,EAAW/D,MACnBgH,EAAcjD,EAAWzD,EACrB0G,EAAYzG,QAGfP,EAAMiH,EAAMH,IAAM,IAAME,EAAYzG,UAAY2G,EAChDA,EAAKtG,MAAQ0G,GACbJ,EAAKrG,SAAWF,GACNX,EAAMS,UAAYwG,EAAMH,IAAMI,EAAKtG,MAAQkG,GACrD9G,EAAMuH,KAAKL,GAEXlH,EAAMwH,OAAOV,EAAK,EAAGI,GAItBA,EAAK9F,IAAMyF,GAAW9C,EAAW3C,KAEjC8F,EAAK9F,IAAMyF,EAiBb,QAASY,GAAsBxC,GAC9B,GAAIyC,GAAWC,EAAYC,CAC3B,KAAKF,IAAaG,IACjBF,EAAaD,EAAY,IACrBzC,EAAW0C,KACdC,EAAY3C,EAAW0C,GACvB1C,EAAW0C,MACX7I,GAAO6I,GAAYC,EAAW3C,IASjC,QAAS6C,GAAWzJ,EAAM8F,EAAQc,GAIjC,QAAS8C,KACR,GAAInL,GAAMC,IACVD,GAAI0D,GACHoC,QAAQ,EACRE,UAAU,GAGXhG,EAAIiG,QAAUxE,EAVf,GAAIuD,GAAMoG,EAASxK,EAClByK,EAAc,GAAIzI,IAAKiD,GAqBxB,IATItF,GAAYgH,GAEfA,GACCX,QAASW,EAAOX,QAChB4B,OAAQjB,GAEC,GAAKA,IAAWA,IAC1BA,GAAUC,SAAUD,IAEjB6D,EAAU7D,EAAO6D,QAAS,CAC7B7D,EAAOpB,OAASoB,EAAOpB,KACvBoB,EAAO6D,QAAUA,EAAU,GAAKA,IAAYA,EACxC/C,GAAcA,EAAWZ,KAAK2D,IAAYE,GAAMF,GACjDA,EAEHC,EAAc1J,EAAQ0J,EAAaD,EAEnC,KAAKxK,IAAQ2G,GACZ8D,EAAYzK,GAAQN,EAAU8K,EAAQxK,GAAO2G,EAAO3G,QAGrDyK,GAAc1J,EAAQ0J,EAAa9D,EAgBpC,OAZsCpE,WAAjC6B,EAAOqG,EAAY7D,YACvB6D,EAAY7D,SAAW,GAAKxC,IAASA,EAAQG,GAAWH,IAASG,GAAWH,GAASA,GAElFqG,EAAYzC,QAAS,KAGvBuC,EAAII,UAAYF,GAAaG,YAAcH,EAAY1C,KAAOwC,GAG5D9C,IACHgD,EAAYI,YAAcpD,GAEpBgD,EAGR,QAAS/J,GAAUqE,GAGlB,MAAO1F,MAAKE,KAAKC,MAAMH,KAAM0F,GAO9B,QAAS+F,GAAYjK,EAAMuD,EAAMqD,EAAYsD,GAI5C,QAASC,GAAerG,GAGvB,GAAIsG,GAAa7G,CACjB,IAAK,GAAKO,IAAUA,GAAUA,EAAMuG,SAAW,IAAMC,EAAOxG,GAAQ,CACnE,IAAKwG,EACJ,GAAI,qBAAqBhL,KAAKwE,IAGzBP,EAAOG,GAAW1D,EAAOA,GAAQ8D,IACpCA,EAAQP,EAIR+G,EAAOC,SAASC,eAAe1G,OAE1B,IAAIjG,EAAE2F,KAAOrC,GAAKE,MAAM/B,KAAKwE,GACnC,IACCwG,EAAOzM,EAAE0M,UAAUE,KAAK3G,GAAO,GAC9B,MAAOlE,IAGP0K,IAMCJ,EAEHpG,EAAQwG,EAAKI,WAIbN,EAAcE,EAAKK,aAAaC,IAC5BR,EACCA,IAAgBS,IACnB/G,EAAQJ,GAAW0G,SACZ1G,IAAW0G,IACRvM,EAAE2F,KACZM,EAAQjG,EAAEsG,KAAKmG,GAAMO,MAGtB7K,EAAOA,IAASnC,EAAE2F,GAAKqH,GAAU/G,GACjCA,EAAQmG,EAAYjK,EAAMsK,EAAKI,UAAW9D,EAAYsD,IAEvDpG,EAAMgH,SAAW9K,EAAOA,GAAQoK,EAC5BpK,IAAS6K,KACZnH,GAAW1D,GAAQ8D,GAEpBwG,EAAKS,aAAaH,GAAU5K,GACxBnC,EAAE2F,IACL3F,EAAEsG,KAAKmG,EAAMO,GAAS/G,KAIzBwG,EAAO5I,WACIoC,GAAMN,KACjBM,EAAQpC,OAGT,OAAOoC,GAGR,GAAIwG,GAAMU,EACTC,EAAe1H,EAAOA,GAAQ,EAuB/B,IApBgB,IAAZ2G,IACHA,EAAUxI,OACVuJ,EAAed,EAAec,IAK/Bf,EAAUA,IAAY3G,EAAK2H,OAAS3H,MACpC2G,EAAQY,SAAW9K,EACf4G,IACHsD,EAAQF,YAAcpD,IAIlBqE,GAAgB1H,EAAK2H,SAAWD,EAAed,EAAe5G,EAAK2H,UACnED,EAAazH,KAEhByH,EAAeA,EAAaC,QAGTxJ,SAAjBuJ,EAuBH,MAtBIA,GAAazH,IAAMD,EAAKC,GAEvByH,EAAazH,KAChBwH,EAAeC,IAKhB1H,EAAO4H,EAAWF,EAAcf,GAEhCkB,EAAOH,EAAaI,QAAQC,GAAe,QAAS/H,IAEhDyH,IACJA,EAAe9K,EAAQ,WACtB,MAAO8K,GAAajE,OAAOpI,MAAMqM,EAAcpM,YAC7C2E,GAEH6F,EAAsB4B,IAEnBhL,IAAS4G,GAAc5G,IAAS6K,KACnCU,GAAQvL,GAAQgL,GAEVA,EAUT,QAASQ,GAAcC,EAAYtH,GAClC,MAAOtG,GAAE6N,WAAWD,GACjBA,EAAWE,KAAKxH,GAChBsH,EAGJ,QAASG,GAAWC,GAClB,GAAIjK,GAAGkK,KACNjK,EAAIgK,EAASzJ,MACd,KAAKR,EAAE,EAAGA,EAAEC,EAAGD,IACdkK,EAAI5C,KAAK2C,EAASjK,GAAGgG,QAEtB,OAAOkE,GAGT,QAASC,GAAiB/L,EAAMyB,GAiB/B,QAASuK,GAAO9H,GACf6F,EAAYpL,MAAMH,KAAM0F,GAGzB,QAAS+H,KACR,MAAO,IAAID,GAAOpN,WAGnB,QAASsN,GAAQ/H,EAAMgI,GACtB,GAAIC,GAAGC,EAAYZ,EAAYtM,EAAMmN,EACpCC,EAAIC,EAAQpK,MACb,KAAKgK,EAAE,EAAGA,EAAEG,EAAGH,IACdjN,EAAOqN,EAAQJ,GACfC,EAAa3K,OACTvC,EAAO,KAAOA,IACjBkN,EAAalN,EACbA,EAAOkN,EAAWI,QAEO/K,UAArB4K,EAAKnI,EAAKhF,KAAwBkN,GAAuD3K,UAAxC+J,EAAaY,EAAWZ,cAC7Ea,EAAKd,EAAcC,EAAYtH,IAEhCgI,EAAOG,EAAID,GAAcK,EAAWL,EAAW5K,MAAOtC,GAIxD,QAASoI,GAAIpD,GACZA,EAAOA,EAAO,KAAOA,EAClBwI,KAAKC,MAAMzI,GACXA,CACH,IAAIvC,GAAOC,EAAM1C,EAChBmN,EAAKnI,EACL2H,IAED,IAAItL,GAAS2D,GAAO,CAGnB,IAFAA,EAAOA,MACPtC,EAAIsC,EAAK/B,OACJR,EAAE,EAAGA,EAAEC,EAAGD,IACdkK,EAAI5C,KAAK1K,KAAK+I,IAAIpD,EAAKvC,IAKxB,OAHAkK,GAAIjF,IAAM7G,EACV8L,EAAIlE,MAAQA,EACZkE,EAAIe,MAAQA,EACLf,EAGR,GAAI3H,EAAM,CACT+H,EAAQ/H,EAAM,SAASmI,EAAIQ,GACtBA,IACHR,EAAKQ,EAAUvF,IAAI+E,IAEpBR,EAAI5C,KAAKoD,KAGVA,EAAK9N,KAAKG,MAAMH,KAAMsN,EACtB,KAAK3M,IAAQgF,GACRhF,IAAS4N,IAAcC,EAAY7N,KACtCmN,EAAGnN,GAAQgF,EAAKhF,IAInB,MAAOmN,GAGR,QAASO,GAAM1I,GACdA,EAAOA,EAAO,KAAOA,EAClBwI,KAAKC,MAAMzI,GACXA,CACH,IAAIvC,GAAGwK,EAAGvK,EAAG0K,EAAGpN,EAAM8N,EAAKnL,EAAOoL,EAAUZ,EAAIa,EAC/CC,EAAQ5O,IAET,IAAIgC,GAAS4M,GAAQ,CAKpB,IAJAF,KACAC,KACAtL,EAAIsC,EAAK/B,OACTmK,EAAIa,EAAMhL,OACLR,EAAE,EAAGA,EAAEC,EAAGD,IAAK,CAGnB,IAFA0K,EAAKnI,EAAKvC,GACVE,GAAQ,EACHsK,EAAE,EAAGA,EAAEG,IAAMzK,EAAOsK,IACpBc,EAASd,KAGba,EAAMG,EAAMhB,GAERrD,IACHmE,EAASd,GAAKtK,EAAQiH,EAAK,KAAOA,EAC/BuD,EAAGvD,KAAQiE,EAAYjE,GAAMkE,EAAIlE,KAAQkE,EAAIlE,MAASuD,EAAGvD,GAC1DA,EAAGkE,EAAKX,IAGRxK,IACHmL,EAAIJ,MAAMP,GACVa,EAAUjE,KAAK+D,IAEfE,EAAUjE,KAAK+C,EAAG1E,IAAI+E,IAQxB,YALIe,EACHA,EAAYD,GAAOE,QAAQH,GAAW,GAEtCC,EAAMjE,OAAOxK,MAAMyO,GAAQ,EAAGA,EAAMhL,QAAQmL,OAAOJ,KAIrDjB,EAAQ/H,EAAM,SAASmI,EAAIQ,EAAWL,GACjCK,EACHM,EAAMX,KAAUI,MAAMP,GAEtBc,EAAMX,GAAQH,IAGhB,KAAKnN,IAAQgF,GACRhF,IAAS4N,IAAaC,EAAY7N,KACrCiO,EAAMjO,GAAQgF,EAAKhF,IAKtB,QAASyI,KACR,GAAI0E,GAAInN,EAAMyC,EAAGC,EAAGwK,EAAiBvI,EACpCsJ,EAAQ5O,IAET,IAAIgC,GAAS4M,GACZ,MAAOxB,GAAWwB,EAInB,KAFAd,KACAzK,EAAI2K,EAAQpK,OACPR,EAAE,EAAGA,EAAEC,EAAGD,IACdzC,EAAOqN,EAAQ5K,GACfyK,EAAa3K,OACTvC,EAAO,KAAOA,IACjBkN,EAAalN,EACbA,EAAOkN,EAAWI,QAEnB3I,EAAQsJ,EAAMjO,KACdmN,EAAGnN,GAAQkN,GAAcvI,GAAS4I,EAAWL,EAAW5K,MACrDjB,GAASsD,GACR8H,EAAW9H,GACXA,EAAM8D,QACP9D,CAEJ,KAAK3E,IAAQiO,GACC,QAATjO,GAAmB6N,EAAY7N,IAASA,IAAS4N,IAAiC,MAAnB5N,EAAK0B,OAAO,IAAemM,EAAY7N,EAAK+F,MAAM,KAASrH,EAAE6N,WAAW0B,EAAMjO,MAChJmN,EAAGnN,GAAQiO,EAAMjO,GAGnB,OAAOmN,GAlKR,GAAI1K,GAAGmI,EACN2C,EAAalO,KACbgO,EAAU/K,EAAK+K,QACfgB,EAAS/L,EAAK+L,OACdzE,EAAKtH,EAAKsH,GACV0E,EAAQ5P,EAAE2P,QACT3G,IAAK7G,GAAQ,UACb4H,MAAOA,EACPiF,MAAOA,GACLW,GACHtJ,EAAO,GACPwJ,EAAO,GACP7L,EAAI2K,EAAUA,EAAQpK,OAAS,EAC/BiL,EAAcxP,EAAE8P,WAChBX,IAyJD,KAFAhB,EAAOlC,UAAY2D,EAEd7L,EAAE,EAAGA,EAAEC,EAAGD,KACd,SAAU6K,GACTA,EAASA,EAAOA,QAAUA,EAC1BO,EAAYP,GAAU7K,EAAE,CACxB,IAAIgM,GAAY,IAAMnB,CAEtBvI,KAASA,EAAO,IAAM,IAAMuI,EAC5BiB,GAAQ,QAAUE,EAAY,MAAQnB,EAAS,MAC/CgB,EAAMhB,GAAUgB,EAAMhB,IAAW,SAASjN,GACzC,MAAKZ,WAAUwD,YAGXiL,EACHA,EAAY7O,MAAMqP,YAAYpB,EAAQjN,GAEtChB,KAAKoP,GAAapO,GALXhB,KAAKoP,IASVP,IACHI,EAAMhB,GAAQqB,IAAML,EAAMhB,GAAQqB,KAAO,SAAStO,GACjDhB,KAAKoP,GAAapO,KAGlBgN,EAAQ5K,GAWZ,OARAmI,GAAc,GAAIgE,UAAS7J,EAAMwJ,EAAKxI,MAAM,OAC5C6E,EAAYD,UAAY2D,EACxBA,EAAM1D,YAAcA,EAEpBkC,EAAG1E,IAAMA,EACT0E,EAAGO,QAAUA,EACbP,EAAGuB,OAASA,EACZvB,EAAGlD,GAAKA,EACDkD,EAGR,QAASd,GAAWD,EAAQhB,GAE3B,GAAI8D,GACHC,EAAUC,GAAqBC,QAC/B5K,EAAOrD,GAEL4G,SACAsH,SACApK,QACA6C,IAAK,WACLE,OAAQC,GAETkD,EAgBF,OAbA3G,GAAK2H,OAASA,EACThB,EAAQ8D,UAEZA,EAAUK,GAAWC,KAAKpD,GAC1B3H,EAAKyK,QAAUA,EAAUA,EAAQ,GAAGO,cAAgB,IAErDP,EAAUC,EAAQ1K,EAAKyK,SACnBA,GAAWA,IAAYC,EAAQO,MAGlCjL,EAAK2H,OAASrN,EAAE4Q,KAAKlL,EAAK2H,SAGpB3H,EAOR,QAASmL,GAAcrF,EAAWsF,GAEjC,QAASC,GAAS5O,EAAM6O,EAAMjI,GAO7B,GAAIkI,GAASC,EAASxJ,EAAUyJ,CAChC,IAAIhP,SAAeA,KAASiP,KAAWjP,EAAKqK,WAAarK,EAAKkL,SAAWlL,EAAKkP,UAA0B,cAAd7F,GAA6BrJ,EAAKwM,SAAWxM,EAAKwN,QAAS,CAKpJ,IAAKjI,IAAYvF,GAChB4O,EAASrJ,EAAUvF,EAAKuF,GAAWsJ,EAEpC,OAAOA,IAAQpO,GAoChB,MAjCaiB,UAATmN,IACHA,EAAO7O,EACPA,EAAO0B,QAEJ1B,GAAQ,GAAKA,IAASA,IACzB4G,EAAaiI,EACbA,EAAO7O,EACPA,EAAO0B,QAERsN,EAAYpI,EACK,cAAdyC,EACCzC,EACCA,EAAW0C,GAAc1C,EAAW0C,OACtCsF,EACHG,EAAUJ,EAAcI,QACX,OAATF,EAEC7O,SACIgP,GAAUhP,IAGlB6O,EAAOE,EAAUA,EAAQpD,KAAKqD,EAAWhP,EAAM6O,EAAMjI,EAAY,GAAKiI,EAClE7O,IACHgP,EAAUhP,GAAQ6O,IAGhBE,GAAWF,IACdA,EAAKhI,IAAMwC,GAERwF,IAASC,EAAU3N,GAAK2N,QAAQzF,KAEnCyF,EAAQ9O,EAAM6O,EAAME,GAEdF,EAGR,GAAIvF,GAAaD,EAAY,GAE7B5I,IAAO6I,GAAcsF,EAGtB,QAASO,GAAWC,GACnB9N,GAAe8N,GAAM,SAAStL,GAC7B,MAAOlF,WAAUwD,QACb1B,GAAa0O,GAAMtL,EAAOxC,IAC3BZ,GAAa0O,IAQlB,QAAShI,GAAQb,GAChB,QAAS8I,GAAIjP,EAAQ8J,GACpB1L,KAAKqJ,IAAMtB,EAAO2I,OAAO9O,EAAQ8J,GAiBlC,MAdIpL,IAAYyH,KAEfA,GACC2I,OAAQ3I,IAINA,EAAO+I,UACV/I,EAASrG,EAAQA,KAAYqG,EAAO+I,SAAU/I,IAG/CA,EAAOgB,IAAM,SAASnH,EAAQ8J,GAC7B,MAAO,IAAImF,GAAIjP,EAAQ8J,IAEjB3D,EAOR,QAASS,GAAc7C,EAAMqE,EAAS+G,EAAa7J,EAAY+C,EAAK3D,GACnE,GAAIlD,GAAGC,EAAGtD,EAAKgF,EAAMrE,EAAQsQ,EAAiBC,EAAUC,EACvD3N,EAAO2D,EACPiK,EAAS,EAsBV,IApBInH,KAAY,GACf+G,EAAc/G,EACdA,EAAU9G,cACO8G,KAAYyG,KAC7BzG,EAAU9G,SAGPnD,EAAMC,KAAKD,MAEdW,EAASV,KACTuD,EAAOA,GAAQ7C,EAAO6C,KACtBwB,EAAOxB,EAAKkF,QAAQ1I,EAAIwH,UAAY7G,EAAOqE,MACtC3E,UAAUwD,SACd+B,EAAOpC,IAIRwB,EAAO/E,KAGJ+E,EAAM,CAkBT,IAjBKmC,GAAcvB,GAAqB,SAAbA,EAAK0C,MAC/B9E,EAAOoC,GAGJpC,GACCoC,IAASpC,IAGZoC,EAAOpC,EAAKoC,MAIdqL,GAAmBzN,EACnB6N,GAAeA,IAAgBJ,EAC1BzN,KACHyG,EAAUA,OAAexG,KAAOmC,IAE7ByL,IAAgB1B,GAAqB2B,UAAYtM,EAAKsM,UAAY9N,GAAQA,IAAS8D,GACvF8J,EAASxH,EAAgB5E,EAAMY,EAAMqE,EAAS+G,EAAaxN,EAAM0G,EAAK3D,EAAUvG,OAC1E,CAUN,GATIwD,GACH0N,EAAW1N,EAAKoC,KAChBuL,EAAY3N,EAAKQ,MACjBR,EAAKQ,MAAQ0G,KAEblH,EAAO8D,GACP9D,EAAKoC,KAAOA,EACZpC,EAAKgB,IAAMyF,GAERhI,GAAS2D,KAAUoL,EAGtB,IAAK3N,EAAI,EAAGC,EAAIsC,EAAK/B,OAAQR,EAAIC,EAAGD,IACnCG,EAAKQ,MAAQX,EACbG,EAAKoC,KAAOA,EAAKvC,GACjB+N,GAAUpM,EAAKC,GAAGW,EAAKvC,GAAIG,EAAMZ,QAGlCY,GAAKoC,KAAOA,EACZwL,GAAUpM,EAAKC,GAAGW,EAAMpC,EAAMZ,GAE/BY,GAAKoC,KAAOsL,EACZ1N,EAAKQ,MAAQmN,EAEVF,IACHI,GAAelO,QAGjB,MAAOiO,GAGR,QAASxH,GAAgB5E,EAAMY,EAAMqE,EAAS+G,EAAaxN,EAAM0G,EAAK3D,EAAUvG,GAC/E,QAASuR,GAAWjB,GAEnBkB,EAAS7P,KAAYsI,GACrBuH,EAAOC,GAAWnB,EAKnB,GAAIjN,GAAGC,EAAGoO,EAASC,EAAWC,EAAYC,EAAa1H,EAAa2H,EAAevF,EAAUkF,EAASD,EAAQ7Q,EAC7GyQ,EAAS,EAiEV,IA/DIpR,IAEHuM,EAAWvM,EAAIiG,QACftF,EAASX,EAAIW,OACbsJ,EAAUA,EAAU7D,EAAU6D,EAASjK,EAAIwE,KAAOxE,EAAIwE,IAElDQ,IAASxB,EAAKsE,QACjBqC,EAAcnF,IAASxB,EAAKgB,IAAIM,KAC7BtB,EAAKgB,IAAIM,KACT3B,OACO6B,IAASrE,EAAOmH,QACtB9C,IAAShF,EAAIwH,UAChB2C,EAAcxJ,EAAOqE,KACrBiF,EAAQnF,KAAOnE,EAAOmH,SAEtBqC,EAAcxJ,EAAOmH,SAAWtE,EAAKsE,QAGtCqC,EAAc3G,EAAKsE,QAGhBnH,EAAOE,MAAMa,QAAS,IAIzBuI,EAAUA,MACVA,EAAQvI,MAAO,IAGZ+P,EAAU9Q,EAAOE,MAAM4Q,WACA,MAAtBA,EAAQnP,OAAO,IAClByP,EAAY,yBAEbN,EAAUA,EAAQ9K,MAAM,KAItBnD,IACH+C,EAAWA,GAAY/C,EAAKE,EAAE6C,SAC9B0D,EAAU7D,EAAU6D,EAASzG,EAAKgB,MAG/B0F,KAAQ,IACX2H,GAAc,EACd3H,EAAM,GAIH3D,IAAa0D,GAAWA,EAAQvI,QAAS,GAAS1B,GAAOA,EAAI0D,EAAE6F,SAClEhD,EAAWpD,QAEZ2O,EAAgBvL,EACZA,KAAa,IAEhBuL,EAAgB3O,OAChBoD,EAAW/C,EAAKE,EAAE6C,UAGnB0D,EAAUjF,EAAKgN,QACZ5L,EAAUpB,EAAKgN,QAAS/H,GACxBA,EAEHuH,EAASvH,EACLhI,GAAS2D,KAAUoL,EAgBtB,IAbAU,EAAUG,EACPrO,EACSL,SAAR+G,GAAqB1G,GACpB,GAAIwG,GAAKC,EAAS,QAASzG,EAAMoC,EAAMZ,EAAMkF,EAAK3D,EAAU4D,GAC7D3G,GAAQA,EAAKE,EAAEC,SAElB+N,EAAQhO,EAAEqC,KAAO/F,GAAOA,EAAI0D,EAAEqC,KAAO/F,GAGlCyR,IACHC,EAAQO,GAAKR,GAEdA,EAAUC,EAAQO,GACb5O,EAAI,EAAGC,EAAIsC,EAAK/B,OAAQR,EAAIC,EAAGD,IAE/BoO,GACHF,EAAW3L,EAAKvC,IAEjBsO,EAAY,GAAI3H,GAAKwH,EAAQ,OAAQE,EAAS9L,EAAKvC,GAAI2B,GAAOkF,GAAO,GAAK7G,EAAGkD,EAAUmL,EAAQ5J,SAE/F8J,EAAa5M,EAAKC,GAAGW,EAAKvC,GAAIsO,EAAW/O,IACzCwO,GAAUM,EAAQhO,EAAE6C,SAAWmL,EAAQhO,EAAE6C,SAASqL,EAAYD,GAAaC,MAKxEH,IACHF,EAAW3L,GAEZ8L,EAAUG,EAAcrO,EAAO,GAAIwG,GAAKwH,EAAQjF,GAAY,OAAQ/I,EAAMoC,EAAMZ,EAAMkF,EAAK3D,EAAU4D,GACjGnK,IAAQA,EAAImG,OACfuL,EAAQ1R,IAAMA,EACdA,EAAIwD,KAAOkO,GAEZN,GAAUpM,EAAKC,GAAGW,EAAM8L,EAAS9O,GAElC,OAAOkP,GAAgBA,EAAcV,EAAQM,GAAWN,EAUzD,QAASc,GAAc7Q,EAAGmC,EAAM2O,GAC/B,GAAI3Q,GAAuB2B,SAAbgP,EACX5R,GAAY4R,GACXA,EAAS/E,KAAK5J,EAAKoC,KAAMvE,EAAGmC,GAC5B2O,GAAY,GACb,WAAa9Q,EAAEG,QAAU,GAM5B,OAJIW,IAAamD,SAA+FnC,UAAnFgP,EAAWhQ,GAAamD,QAAQ8H,KAAK5J,EAAKoC,KAAMvE,EAAG8Q,GAAY3Q,EAASgC,MACpGhC,EAAU2Q,GAGJ3O,IAASA,EAAKkC,QAAUoE,GAAYC,KAAKvI,GAAWA,EAG5D,QAASkF,GAAMlF,GACd,KAAM,IAAIoB,IAAKwP,IAAI5Q,GAGpB,QAASuQ,GAAYvQ,GACpBkF,EAAM,iBAAmBlF,GAG1B,QAASqL,GAAOF,EAAQ3H,EAAMqN,EAAYC,EAAaC,GAKtD,QAASC,GAAqBC,GAC7BA,GAASC,EACLD,GACH3K,EAAQ6C,KAAKgC,EAAOgG,OAAOD,EAAKD,GAAO3F,QAAQ8F,GAAU,QAI3D,QAASC,GAAc5M,EAAS6M,GAC3B7M,IACHA,GAAW,KAEX8L,GACCe,EACG,KAAOA,EAAQ,mBAAqB7M,EAAU,cAAgBA,EAC9D,2BAA6BA,GAAW,mBAAqB0G,IAInE,QAASoG,GAASC,EAAKC,EAAMhN,EAASZ,EAAW6N,EAAOnJ,EAAMoJ,EAASC,EAAQC,EAAOC,EAAOC,EAAYvP,IAmCpGmP,GAAWF,GAAQI,IAAUpN,GAAWmN,GAA+B,MAArBA,EAAOzM,WAAqB2M,IACjFvB,EAAYiB,GAITjJ,IACHmJ,EAAQ,IACR7N,EAAYmE,IAEb6J,EAAQA,GAAShB,IAAeE,CAEhC,IAAIiB,IAAgBP,GAAQZ,SAC3BxR,EAAQ,GACR8E,EAAO,GACP8N,EAAW,GACXC,EAAa,GACbC,EAAc,GACdC,EAAiB,GACjBtO,EAAU,GACVuO,EAAa,GAEbf,GAASO,IAAUH,CAGpBjN,GAAUA,IAAYmN,EAASA,GAAU,QAASF,GAClDV,EAAqBxO,GACrB0O,EAAM1O,EAAQgP,EAAInP,OACdsP,EACCW,GACHhM,EAAQ6C,MAAM,IAAK,KAAOyI,EAAOtG,QAAQ,KAAM,UAAUA,QAAQiH,GAAiB,MAAQ,QAEjF9N,GACM,SAAZA,IACC+N,GAAYjT,KAAKqS,IACpBrB,EAAY,8CAEbyB,EAAeS,EAAQ,SACvBA,EAAQ,GAAKtH,EAAOuH,UAAUD,EAAQ,GAAIjQ,GAC1CiQ,EAAUE,EAAMC,MAChBtM,EAAUmM,EAAQ,GAClBnB,GAAQ,GAELM,GAEHiB,EAAYjB,EAAOtG,QAAQ8F,GAAU,KAAMY,EAAcxO,GACvD8H,QAAQwH,GAAY,SAAStB,EAAKuB,EAASC,EAAOtK,EAAKuK,EAAUC,EAAUC,EAAKC,GAmBhF,MAlBA1K,GAAM,IAAMuK,EAAW,KACnBE,GACHhP,GAAQ+O,EAAW,IACnBhB,GAAc,IAAMkB,EAAQ,MAClBJ,GACVf,GAAYvJ,EAAM,SAAWwK,EAAW,KAAOE,EAAQ,WAEvDhB,GAAkB1J,EAAM,IAAM0K,EAAQ,MAC5BL,EACVjP,GAAWoP,GAEM,YAAbD,IACHZ,GAAca,GAEf7T,GAASqJ,EAAMwK,EAAW,IAC1Bf,GAAezJ,EAAM,IAAM0K,EAAQ,KACnCC,EAAcA,GAAe/T,GAAaC,KAAK0T,IAEzC,KACL9N,MAAM,MAGP6M,GAAgBA,EAAa,IAChCA,EAAaY,MAGdU,GACE7O,EACAZ,KAAeiN,GAAeuC,GAAe,GAC7C/B,MACAiC,EAAYrB,IAA2B,MAAZzN,EAAkB,WAAa,IAAK0N,EAAaC,GAC5EmB,EAAYpP,IAAqB,MAAZM,EAAkB,QAAU,IAAKpF,EAAO4S,GAC7DnO,EACAuO,EACAL,GAAgB,GAElB1L,EAAQ6C,KAAKmK,GACThC,IACHqB,EAAMxJ,KAAKsJ,GACXA,EAAUa,EACVb,EAAQ,GAAKvB,IAEJa,IACVV,EAAcU,IAAeU,EAAQ,IAAqB,SAAfA,EAAQ,IAAiBV,EAAYU,EAAQ,IACxFA,EAAQ,GAAKtH,EAAOuH,UAAUD,EAAQ,GAAIjQ,GAC1CiQ,EAAUE,EAAMC,OAEjBvB,GAAeoB,GAAWV,GAC1BzL,EAAUmM,EAAQ,GAInB,GAAI5Q,GAAG+N,EAAQ0D,EAASD,EAAaG,EACpClB,EAAY3R,GAAa2R,WAAa9O,GAAQA,EAAK8O,WAC/C/Q,GAAe+Q,aAAc,EACjCmB,KACAvC,EAAM,EACNyB,KACArM,EAAUmN,EACVhB,GAAW,CAAC,CAACgB,EAgCd,IA9BInB,GAAa9O,EAAKsD,MACrBtD,EAAK8O,UAAYA,GAUdzB,IACiBlP,SAAhBmP,IACH3F,EAASA,EAAOhG,MAAM,GAAI2L,EAAYzO,OAAS,GAAKpB,IAErDkK,EAASpK,GAAiBoK,EAASjK,IAGpCmQ,EAAcsB,EAAM,IAAMA,EAAM,GAAG,GAAGC,MAAM,IAE5CzH,EAAOG,QAAQnK,GAAMoQ,GAErBP,EAAqB7F,EAAO9I,SAExB6O,EAAMuC,EAAOA,EAAOpR,OAAS,KAChCgP,EAAc,GAAKH,IAAQA,IAASA,EAAI,KAAOA,EAAI,IAAOA,EAAI,IAK3DL,EAAY,CAIf,IAHAjB,EAAS8D,EAAUD,EAAQtI,EAAQ0F,GACnC2C,KACA3R,EAAI4R,EAAOpR,OACJR,KACN2R,EAASpQ,QAAQqQ,EAAO5R,GAAG,GAE5B8R,GAAS/D,EAAQ4D,OAEjB5D,GAAS8D,EAAUD,EAAQjQ,EAE5B,OAAOoM,GAGR,QAAS+D,GAASlQ,EAAImQ,GACrB,GAAIlL,GAAKmL,EACRhS,EAAI,EACJC,EAAI8R,EAASvR,MAGd,KAFAoB,EAAGX,QACHW,EAAGoQ,SACIhS,EAAIC,EAAGD,IAAK,CAClB4B,EAAGoQ,MAAM1K,KAAK0K,EAAQD,EAAS/R,GAC/B,KAAK6G,IAAOmL,GACC,WAARnL,GAAoBmL,EAAMC,eAAepL,IAAQmL,EAAMnL,GAAKrG,SAAWwR,EAAMnL,GAAKqL,MACrFtQ,EAAGX,KAAOW,EAAGX,KAAK0K,OAAOqG,EAAMnL,MAMnC,QAAS6K,GAAYpP,EAAM9E,EAAO2D,GACjC,OAAQmB,EAAKgB,MAAM,MAAQ9F,EAAM8F,MAAM,MAAQnC,EAAImC,MAAM,OAG1D,QAAS6O,GAAeC,EAAOvS,GAC9B,MAAO,QACHA,EACAA,EAAO,KACP,IACD,SAAWuS,EAAM,GAAK,KACrBA,EAAM,KAAOvS,EACb,eAAiBuS,EAAM,GAAK,IAC5B,KACAA,EAAM,GAAK,aAAeA,EAAM,GAAK,IAAM,IAGhD,QAASpB,GAAYjB,EAAQI,EAAcxO,GAE1C,QAAS0Q,GAAY1C,EAAK2C,EAASC,EAAQC,EAAOC,EAAMC,EAAUC,EAAKC,EAAIC,EAAOC,EAAKC,EAAOC,EAASC,EAAMC,EAAMC,EAAOC,EAAUC,EAAMC,EAAO3S,EAAO4S,GAIvJ,QAASC,GAAUC,EAASC,EAAKC,EAAQ7S,EAAQX,EAAMyT,EAAcC,EAAYC,GAGhF,GAAIC,GAAqB,MAAXJ,CACd,IAAIA,IACHlB,EAAOA,EAAKnP,MAAMoQ,EAAIlT,QAClB,mBAAmB9C,KAAKoW,GAAWrB,IACtC/D,EAAY+E,GAERM,IACJN,GAAW3S,EACP,aAAeA,EAAS,KACxBX,EACC,OACA,SACD2T,GACCF,EACA,IAAMA,EACN9S,EACC,GACCX,EAAO,GAAK,IAAMwT,IACjBE,GAAc,KACjBC,EAAYhT,EAAS,GAAKX,EAAOyT,GAAgB,GAAKD,EAAQ,KAEnEF,GAAqBK,EAAY,IAAMA,EAAY,GAEnDL,EAAUC,GAA+B,cAAxBD,EAAQnQ,MAAM,EAAG,GAC/BmQ,EAAQnQ,MAAM,GACdmQ,IAEA9B,GAAU,CAEb,GADAqC,EAAkB,WAAVC,EAAsBC,EAAS/D,EAAagE,OAAShE,EAAagE,WAAgBC,EAAOC,GAC7FC,EAAQP,GAAWC,EAAMA,EAAMxT,OAAO,IACzC,GAAI8T,EAAMC,KAAM,CACf,KAAOD,EAAME,IACZF,EAAQA,EAAME,EAEXF,GAAM5R,MACT+P,EAAO,IAAMA,EAAKnP,MAAM,IAEzBgR,EAAME,GAAK/B,EACX6B,EAAM5R,IAAM4R,EAAM5R,KAA0B,MAAnB+P,EAAKxT,OAAO,QAGtC+U,GAAM1M,KAAKmL,EAEZgC,GAAUC,GAAc/T,GAASoT,EAAU,EAAI,GAGjD,MAAON,GAIJjB,IAAUI,IACbH,EAAOD,EAAQC,GAEhBC,EAAWA,GAAY,GACvBH,EAASA,GAAUD,GAAWU,EAC9BP,EAAOA,GAAQI,EAGfC,EAAMA,GAAOO,GAAQ,EAErB,IAAIsB,GAAMC,EAAQZ,EAAOM,EAAOO,EAC/BC,EAAO,GAOR,IALY,MAARhC,IACHA,EAAM,UACNgC,EAAO,OAGJnC,GAAQoC,GAAWC,EAEhB,CACN,GAAIrD,GAAYyB,IAAa2B,IAAWC,KAGlCf,GAASgB,GAAaf,KAC1BS,EAAOF,EAAUC,EAAa,GAC1BnB,EAAK/S,OAAS,EAAIG,GAASgU,GAAQ,IAAI,CAE1C,GADAA,EAAOpB,EAAKjQ,MAAMqR,EAAMhU,EAAQgP,EAAInP,QAChCoU,KAAW,EAId,GAHAZ,EAAQE,GAAUgB,EAASR,EAAW,GAAGL,GAEzCC,EAAQN,EAAMA,EAAMxT,OAAO,GACvB8T,GAASA,EAAMa,IAAK,CACvB,KAAOb,EAAME,IAAMF,EAAME,GAAGW,KAC3Bb,EAAQA,EAAME,EAEfK,GAAQP,EAAME,IAAM/B,KAAM6B,EAAME,GAAI9R,IAAK4R,EAAM5R,SAE/CsR,GAAM1M,KAAKuN,GAASpC,KAAMuB,EAAMjD,OAGlCqC,GAAWjU,GAAiB,IAAMwV,EAC/B,cACAvV,GACHwV,EAASQ,EAAUhC,GACdwB,IACJQ,EAAUhC,IAAY,EACtBgC,EAAUhC,GAAYwB,EAASpL,EAAO4J,EAAUzR,GAAM,IAEnDiT,KAAW,GAAQC,IAEtBA,EAAMN,KAAOK,EACbC,EAAMM,IAAMf,EAAOC,GACnBQ,EAAMnS,IAAMmS,EAAMnS,KAAOmS,EAAMpC,MAAQoC,EAAMpC,KAAK4C,QAAQ,MAAQ,GAKtE,MAAQN,IAEJA,GAAU9B,EAAO8B,EAASpF,EAAMqD,EAAU,KAC3CgC,GAEEA,GAAU9B,EAAO8B,EAASrF,EAAMqD,EAAU,MAG5CT,GACGkC,EAAUC,GAAc/T,IAASyT,EAASc,IAAWR,IAAeL,OAAS9B,GAC9E,KACAe,EACCoB,EACA,IAECY,EAAa/B,EAAKjQ,MAAMgS,EAAY3U,IAAQsT,GAC3CA,EAAQgB,EAAYf,GAAS,EAAO,MACrC,OAASoB,GAAcA,EAAa3U,EAAQgP,EAAInP,OAAQmR,GAAYxB,EAAa7I,KAAK8M,EAAOC,OAAU,OAEzGzB,GAEE8B,GAAchG,EAAYqB,GAAS4B,GAAYxB,EAAaY,MAAOkD,EAAQxB,EAAMwC,EAAYzC,EAAO8C,EAAa3U,EAAQgP,EAAInP,OAC9HmR,IAAcA,EAAWyC,EAAOC,GAAKlE,EAAa8D,MAActC,EAASO,KAAOM,GAAQC,EAAO,KAC/FA,EAEEA,EAAK8C,MAAM,KAAKC,KAAK,KAAK/L,QAAQgM,GAAOjC,IACxCV,GAECsB,EAASc,IAAWR,IAAeL,OAASqB,EAAOhB,GAAcI,EAAMhC,GACxEJ,GAEFA,EAECA,EACAS,GAEGA,EAAQuC,EAAOhB,IAAevB,EAAOuC,EAAOhB,IAAc,EAAON,EAASc,IAAWR,GAAavB,GAClGL,GACCsB,EAASc,IAAWR,GAAagB,EAAOhB,GAAcI,EAAMhC,GAC7D,KAEFC,GACE2C,EAAOhB,IAAehG,EAAYqB,GAAS,KAC5CuC,EACC,IACCyC,EAAS9B,EAAM+B,EAAS9B,EAAM,MApF1CxE,EAAYqB,GA0Fd,GAAIkE,GAAOC,EAAQe,EAClBD,EACAD,EACApD,EAAWxB,GAAgBA,EAAa,GACxCiE,GAAUC,GAAI1C,GACduD,GAAYS,EAAGvB,GACfkB,EAAa,EACbF,GAAazT,EAAOA,EAAK6K,MAAQmF,IAAaA,EAASnF,MAAQmF,EAASnF,aAAiBvI,GAAQtC,KAAK6K,MAGtGkI,EAAa,EACbgB,KACAjB,KACA1G,GAAUgC,GAAUpO,EAAO,IAAM,KAAK8H,QAAQmM,GAASvD,EAExD,QAAQqC,GAAc3G,GAAUW,EAAYqB,GAG7C,QAAS8B,GAAUgE,EAAKlU,EAAMqN,GAG7B,GAAIhP,GAAG8V,EAAMlT,EAASZ,EAAW1E,EAAQyY,EAAQC,EAAYC,EAASC,EAASC,EAASC,EAAcjG,EAAcJ,EAAQsG,EAAiBC,EAC5IC,EAAWC,EAAatN,EAAUuN,EAAYC,EAAajS,EAAS6E,EAAQqN,EAAYC,EAASC,EAAQC,EAAUC,EAAU9U,EAAS+U,EAAUC,EAChJC,EAAiB,EACjBjJ,EAAW3B,GAAqB2B,UAAYtM,EAAKsM,UAAYtM,EAAKyC,MAAQzC,EAAK6E,WAAa7E,EAAKgN,SAAWhN,EAAKwV,WACjHC,EAAO,GACPC,KACApX,EAAI4V,EAAIrV,MAgBT,KAdI,GAAKmB,IAASA,GACjBuH,EAAW8F,EAAa,cAAgBrN,EAAK8H,QAAQ8F,GAAU,KAAKjM,MAAM,MAAS,IAAM3B,EACzFA,EAAO,IAEPuH,EAAWvH,EAAKuH,UAAY,UACxBvH,EAAK8O,YACR4G,EAAY5G,WAAY,GAErB9O,EAAK2V,QACRD,EAAYC,OAAQ,GAErBlB,EAAezU,EAAKS,KACpBoU,EAAc7U,EAAKuD,OAEflF,EAAI,EAAGA,EAAIC,EAAGD,IAKlB,GAHA8V,EAAOD,EAAI7V,GAGP,GAAK8V,IAASA,EAEjBsB,GAAQ,OAAStB,EAAO,QAIxB,IADAlT,EAAUkT,EAAK,GACC,MAAZlT,EAEHwU,GAAQ,MAAQtB,EAAK,GAAK,gBACpB,CAqDN,GApDA9T,EAAY8T,EAAK,GACjBrR,GAAWuK,GAAc8G,EAAK,GAC9BxY,EAAS6U,EAAe2D,EAAK,GAAI,UAAY,KAAO3D,EAAepC,EAAS+F,EAAK,IACjF7T,EAAU6T,EAAK,GACfmB,EAAUnB,EAAK,GACfxM,EAASwM,EAAK,IAAMA,EAAK,GAAGrM,QAAQiH,GAAiB,OACjDmG,EAAqB,SAAZjU,GACRuN,GACHA,EAAa7I,KAAKwO,EAAK,KAGxBoB,EAAiB,EACbd,IAAiBjG,EAAe2F,EAAK,MACxC3F,GAAgBA,GAChB+G,EAAiBd,EAAa9O,KAAK,KAGrC2G,EAAWA,GAAY8B,EAAO,IAAMA,EAAO,IAAMI,GAAgB,iBAAiBzS,KAAKqS,EAAO,KAI1F+G,EAAuB,MAAZlU,GACVZ,IACHY,EAAUZ,IAAcmE,GAAO,IAAMnE,EAAYY,IAG9C6B,IAEHgS,EAAalN,EAAWD,EAAQ+N,GAChCZ,EAAWvN,SAAWA,EAAW,IAAMtG,EAEvC6T,EAAWxI,SAAWwI,EAAWxI,UAAYA,EAC7C4D,EAAUpN,EAASgS,GACnBxI,EAAWwI,EAAWxI,SACtBuI,EAAYlP,KAAKmP,IAGbI,IAEJH,EAAc9T,EACdqL,EAAWA,GAAYrL,KAAaqF,GAAMrF,KAAaqF,GAAMrF,GAASE,MAEtE8T,EAAUQ,EACVA,EAAO,IAERT,EAAad,EAAI7V,EAAI,GACrB2W,EAAaA,GAAgC,SAAlBA,EAAW,IAEvCK,EAAW/U,EAAU,iBAAmB,MACxCoU,EAAkB,GAClBC,EAAgB,GAEZQ,IAAa3G,GAAgB8G,GAAWjV,GAAaA,IAAcmE,IAAO,CAO7E,GALA4Q,EAAW,GAAI5K,UAAS,gBAAiB,OAASjD,EAAW,IAAMgO,EAAiB,IAAMtU,EACnF,aAAetF,EAAS,MAC/ByZ,EAAS/T,IAAMf,EACf8U,EAASQ,KAAO3U,EAEZoM,EACH,MAAO+H,EAGRjF,GAASiF,EAAU5G,GACnBoG,EAAY,MAAQvU,EAAY,UAChCmU,GAAU,EACVE,EAAkBE,EAAYW,EAAiB,IAC/CZ,EAAgB,IAgBjB,GAdAc,GAASN,GACL9H,GAAc/M,EAAU,SAAW,IAAM,UAAY+U,IAAab,GACjEA,EAAUrW,OAAWmO,EAAWiI,GAAU,EAAMK,GAAapG,GAC3DiG,EAAac,EAAiB,GAAKH,EAAWG,GAChD,IAAM5Z,EAAS,KAAO,KACX,MAAZsF,GACEoT,GAAa,EAAM,KAAOjG,EAAO,GAAK,MACtCkG,GAAU,EAAM,OAASlG,EAAO,GAAK,cAAgBf,EAAa,QAAU,UAG9E+G,GAAS,EAAM,sBACdtR,EAAU+R,EAAYhW,OAAS,KAAO,IACvClD,EAAS,MAEToZ,IAAgBC,EAAY,CAK/B,GAFAS,EAAO,IAAMA,EAAK9T,MAAM,MAAS,IACjCiT,EAAY,MAAQG,EAAc,eAC9B1H,GAAcmB,EAAc,CAQ/B,GANAiH,EAAO,GAAIjL,UAAS,gBAAiB,OAASjD,EAAW,IAAMgO,EAAiB,IAAMR,EAAc,YAAcU,EAAO,KACzHA,EAAKpU,IAAMf,EACXmV,EAAKG,KAAOb,EACRvG,GACH2B,EAASsE,EAAac,EAAiB,GAAKE,EAAMjH,GAE/CnB,EACH,MAAOoI,EAERf,GAAkBE,EAAYW,EAAiB,cAC/CZ,EAAgB,IAMjBc,EAAOR,EAAUI,EAAWT,GAAaW,GAAkBE,GAAQ,IACnEjH,EAAe,EACfuG,EAAc,EAEXzU,IACHgM,GAAW,EACXmJ,GAAQ,oBAAsBpI,EAAa,OAAS,MAAQqH,EAAkB,iBAAmBpU,EAAU,IAAMqU,EAAgB,MAAQtH,EAAa,GAAK,YAM/JoI,EAAO,MAAQlO,EAEZ,WACC6M,EAAS,YAAc,KACvBG,EAAU,aAAe,KACzBF,EAAa,aAAe,KAC5BhH,EAAa,MAAQ,cACrBqI,EAAYC,MAAQ,YAAc,IACnCF,GACCpI,EAAa,KAAO,kBAEpBlQ,GAAa0Y,aAAc,IAC9BJ,EAAO,UAAYA,EAAO,2CAG3B,KACCA,EAAO,GAAIjL,UAAS,gBAAiBiL,GACpC,MAAOpZ,GACR0Q,EAAY,8BAAgC0I,EAAO,QAAUpZ,EAAEG,QAAU,KAM1E,MAJIwD,KACHA,EAAKC,GAAKwV,EACVzV,EAAKsM,WAAaA,GAEZmJ,EAQR,QAASrU,GAAU6D,EAAS6Q,GAG3B,MAAO7Q,IAAWA,IAAY6Q,EAC1BA,EACAnZ,EAAQA,KAAYmZ,GAAgB7Q,GACpCA,EACD6Q,GAAiBnZ,KAAYmZ,GAIjC,QAASC,GAAcC,GACtB,MAAOC,IAAaD,KAAQC,GAAaD,GAAM,KAAOA,EAAGE,WAAW,GAAK,KAG1E,QAASC,GAAetZ,GAGvB,GAAIqI,GAAKtJ,EACRC,IAED,UAAWgB,KAAW6O,GACrB,IAAKxG,IAAOrI,GACXjB,EAAOiB,EAAOqI,GACVA,IAAQsE,IAAY3M,EAAOyT,eAAepL,KAAS3J,GAAYK,IAClEC,EAAM8J,MAAMT,IAAKA,EAAKtJ,KAAMA,GAI/B,OAAOC,GAGR,QAASua,GAAUxV,EAAMqE,EAAS+G,GACjC,GAAIqK,GAAWpb,KAAKqb,SAAWrb,KAAK,IAAMyG,EAAM,qBAC/C1B,EAAOqW,EAASjP,aAAaC,GAE9B,OAAO5D,GAAc2E,KAAKpI,EAAO1F,EAAEsG,KAAKyV,GAAU/O,IAAWnH,GAAWkW,GAAWzV,EAAMqE,EAAS+G,GAKnG,QAASuK,GAAWC,GAEnB,MAAerY,SAARqY,EAAoBC,GAAQ1a,KAAKya,KAAU,GAAKA,GAAM1O,QAAQ4O,GAAaX,IAAkBS,EAAO,GAqzC5G,QAASG,GAAkBC,EAAIxI,EAAQyI,GAOtC,IANA,GAAIC,GAAQC,EAAQC,EAAUtW,EAASuW,EAASC,EAAUta,EAAQua,EAAS3Y,EAAM4Y,EAChFC,EAAYC,EAAgBC,EAAevc,EAAKwc,EAAIC,EAAWC,EAAQC,EACvE9a,EAAS+Z,EAAGha,OACZoT,EAAWnT,EAAO+a,QAGZR,EAAUS,GAAe9M,KAAKiF,IACpC,IAAIoH,EAAUU,GAAaV,EAAQ,OAC9BI,EAAKJ,EAAQI,IAAI,CA2CpB,GAzCA9W,EAAU0W,EAAQ1W,QAClBlC,EAAOkC,EAAQlC,KACfxD,EAAM0F,EAAQ1F,KAAOwD,EAAKxD,IAC1Bmc,EAAU7c,EAAEuC,GACZya,EAAiB9Y,EAAKuZ,IAAIC,IAC1BT,EAAgB/Y,EAAKuZ,IAAIE,IACzBjB,EAAWkB,GAAYrb,GACvBia,EAASqB,GAAUnB,GACC7Y,SAAhB0Y,IACHA,EAActb,GAAYyb,GACvBA,EAASna,GACTia,EACCK,EAAQL,KACRK,EAAQzU,KAAKsU,IAElBE,EAAWM,EAAG,GACdA,EAAKA,EAAG,GACRA,EAAKA,EAAK,KAAOA,GAAM9W,EAAQE,KAAM4W,GAAMA,EACvCN,IAEFD,EADG1b,GAAY2b,GACLA,EAEA1Y,EAAK0B,OAAO,aAAcgX,IAGR,WAA1BxW,EAAQqG,KAAKqR,WAChB1X,EAAQqG,KAAKsR,QAAUxB,EAAcA,IAAgBnW,EAAQqG,KAAKuR,YAAgBzB,IAG/EI,IACHJ,EAAcI,EAAQ7O,KAAKpN,EAAK6b,IAIjCQ,EAAa7Y,EAAKkC,QAClBlC,EAAKkC,QAAUA,EACf+W,GACCc,OAAQ,SACRC,SAAU9X,EAAQ+X,KAClBlY,MAAOsW,KAEFS,IAAoBP,EAASO,EAAelP,KAAK1H,EAASkW,EAAIa,MAAe,IAC/Ezc,GAAQA,EAAIsc,iBAAoBP,EAAS/b,EAAIsc,eAAeV,EAAIa,MAAe,IACjEtZ,SAAhB0Y,KACDja,EAAS4a,EAAG,GACQrZ,SAAhB0Y,GAA6Bja,GAAQ,CACxC,GAAIA,EAAOgW,KAQV,IAPA+E,EAAYjX,EAAQgY,OACpBhB,EAAS9a,EACTA,EAAS8D,EAAQE,KACb8W,EAAOiB,SACV/b,EAAS8a,EAAO9W,KAChB+W,EAAYD,EAAOiB,QAEbjB,GAAUA,EAAO7E,IACvBjW,EAAS+a,EAAUD,EAAQ9a,GAC3B8a,EAASA,EAAO7E,EAGd7X,KACHA,EAAI0D,EAAEka,QAAS,GAEhB9O,GAAYlN,GAAQ0N,YAAYkN,EAAG,GAAIX,GACnCU,GACHA,EAAcnP,KAAK1H,EAASkW,EAAIa,GAE7Bzc,IACCA,EAAIuc,eACPvc,EAAIuc,cAAcX,EAAIa,GAEvBzc,EAAI0D,EAAEka,OAASza,QAEhBuC,EAAQ+X,KAAO5B,EAGjBrY,EAAKkC,QAAU2W,GAMnB,QAASwB,GAAsBjC,EAAIa,EAAWqB,GAC7C,GAAIpW,GAAMmU,EAAakC,EAAUC,EAAaC,EAAU3Y,EACvDI,EAAUzF,KACVD,EAAM0F,EAAQ1F,IACd6B,EAAS6D,EAAQE,KACjBhE,EAAS8D,EAAQqG,KACjB7F,EAAMR,EAAQe,QACdyX,EAAatc,EAAOuc,WACpB3a,EAAOkC,EAAQlC,KACf6Y,EAAa7Y,EAAKkC,QAClB0Y,EAAU5a,EAAKuZ,IAAIC,GAKpB,IAFAxZ,EAAKkC,QAAUA,EAEXwY,KAAgBE,IAAa3B,GAAa2B,EAAQhR,KAAK1H,EAASkW,EAAIa,MAAe,MAEhFA,GAA8B,MAAjBb,EAAGhW,KAAKhF,MAAgBgb,EAAGhW,KAAKhF,OAAS6b,EAAU3G,MAAO,CAK7E,GAHI2G,IACH/W,EAAQ+W,UAAYA,GAEjBA,GAAa/W,EAAQ2Y,MAAO,CAI/B,GADA3Y,EAAQ2Y,MAAQ,EACZP,EAAOzX,IAEV,IACCwV,EAAciC,EAAOjc,EAAQ2B,GAC5B,MAAOnC,GACR4c,EAAWH,EAAOzX,IAClBf,EAAU4M,EAAc7Q,EAAEmC,EAAK,GAAKgM,UAAS,YAAa,UAAYyO,EAAW,KAAMpc,EAAQ2B,IAC/FqY,IAAgBhb,SAAW8E,MAAOL,SAGnCuW,GAAciC,EAAOjc,EAAQ2B,EAAMZ,GAQpC,IAJA8E,EAAO4W,EAAazC,EAAanW,EAAS1F,EAAM0F,EAAQ1F,IACtD0F,EAAQgC,MAAQwV,GAAYtb,GAAQ,EAAcuB,SAAR+C,IAGxClG,EAAK,CASR,GAPAge,EAAcC,GAAYje,EAAIqG,IAE9BwV,EAAcA,EAAY,GAAKA,GAAeA,GAC9CkC,GAAYC,GAAevB,GAAazc,EAAIue,UAAYve,EAAIue,SAAS3C,EAAIa,EAAWZ,MAAiB,EAErG2C,GAAUxe,EAAK6b,EAAamC,GAExBD,GAAYrW,IAAS+W,GAOxB,MAHAC,IAAc1e,EAAK4b,EAAIa,GACvBkC,GAAejZ,EAAS7D,EAAQD,QAChC4B,EAAKkC,QAAU2W,EAGhB,IAAIrc,EAAI0D,EAAEka,OACT,MAGG5d,GAAI4e,UACP5e,EAAI4e,SAAS5e,EAAIW,OAAQ+E,EAAS1F,EAAIwE,IAAKoX,EAAIa,GAGhDZ,EAA8B,MAAhB7b,EAAIiG,QACfrD,GAAKic,MAAM7e,EAAIkG,IAAK1C,EAAMqY,EAAY,IACtCjZ,GAAKgY,KAAK5a,EAAKwD,EAAMA,EAAKwB,KAAM6W,GAAa,EAAMvW,OAC5CwY,GAAOlD,OAIjB1U,EAAc,KAARA,EAAa4Y,GAAO5Y,EAC1B2V,EAAc3V,EACXtD,GAAKic,MAAM3Y,EAAK1C,EAAMqY,EAAY,IAAMA,GACxCjZ,GAAKgY,KAAKkD,EAAOlD,KAAMpX,EAAMA,EAAKwB,KAAM6W,GAAa,EAAMvW,GAE9DyZ,GAAe/e,EAAM0F,EAAQ1F,KAAK,GAClC0H,EAAOhC,EAAQgC,MAAQA,EAGpBsX,GAAcnD,EAAanW,EAASgC,EAAM1H,IACzCyc,IACC2B,EAAU5a,EAAKuZ,IAAIE,MACxBmB,EAAQhR,KAAK1H,EAASkW,EAAIa,GAE3B/W,EAAQuZ,OAAS,EAEbjf,IACHA,EAAIqG,IAAM4X,EACVS,GAAc1e,EAAK4b,EAAIa,IAIzBkC,GAAejZ,EAAS7D,EAAQD,GAGhC4B,EAAKkC,QAAU2W,GAIjB,QAASiC,GAAazC,EAAanW,EAAS1F,EAAK0H,GAChD,GAAIwX,GAAcpD,EAAQqD,EAAKC,EAC9Bxd,EAAS5B,GAAOA,EAAIke,YAAcxY,EAAQqG,IAE3C,IAAoB5I,SAAhB0Y,EAA2B,CAO9B,GANAuD,EAAU9f,EAAEsC,GACZ8F,EAAO1H,GAAOA,EAAI0H,MAAQA,EACtBnH,GAAYsb,IACfnV,EAAMhB,EAAQsS,KAAO,oBAGlBmH,EAAM,QAAQpe,KAAK2G,IAASA,EAAKf,MAAM,GAC1CuY,EAAe5f,EAAE+f,MAAMzd,EAAQud,IAC1BtD,IAAgBA,IAEpBqD,EAAeI,SAASJ,QAEnB,IAAa,SAATxX,EAAiB,CAC3B,GAAa,UAATA,EACC9F,EAAOsB,OAASqc,KACnBL,EAAeE,EAAQxe,KAAK8G,EAAO8X,SAE9B,IAAI9X,IAAS+X,GAAO,CAC1B,GAAI7d,EAAO2D,QAAW,GAAKsW,EAG1B,MAAOnU,EAFPwX,GAAeE,EAAQxe,KAAK4e,IAMTrc,SAAjB+b,IACHpD,EAASqB,GAAUzV,GACnBwX,EAAepD,EAASsD,EAAQtD,KAAYsD,EAAQ1X,KAAKA,IAG3DhC,EAAQ+X,KAAOyB,EAEhB,MAAOxX,GAGR,QAASgY,GAAS3T,EAAMxG,GACvBwG,EAAK4T,IAAMpa,EACXwG,GAAMxG,EAAQ,MAAQ,UAAY,aAAaqa,GAAW,IAG3D,QAASZ,GAAcnD,EAAanW,EAASgC,EAAM1H,GAIlD,GAAI8b,GAAQ+D,EAAUC,EAAUC,EAASC,EAAeC,EAASC,EAAQ1V,EAAI2V,EAAWC,EAAYC,EAAUjD,EAAUkD,EAAQC,EAC/HC,EAAU9Y,IAAS+W,IAAwBtb,SAAhB0Y,IAA8BnW,EAAQuZ,OACjEpd,EAAS6D,EAAQE,KACjBhE,EAAS5B,GAAOA,EAAIke,YAAcxY,EAAQqG,KAC1C0U,EAAe7e,EAAOuc,WACtBiB,EAAU9f,EAAEsC,GACZ4B,EAAOkC,EAAQlC,KACfkd,EAAYhb,EAAQ+X,KACpBpB,EAAa7Y,EAAKkC,QAGlB6X,EAASvd,CASV,IAPIA,IAEHA,EAAI0D,EAAEsC,UAAW,EACjBhG,EAAIke,WAAale,EAAIke,YAAexY,EAAQsS,MAAQhY,EAAI2gB,OAAU/e,EAAS6e,EAC3EZ,EAAW7f,EAAI4gB,KACfd,EAAW9f,EAAI6gB,MAEXL,EAmJL,MA/Ia,YAAT9Y,IACHA,EAAO,eAEJ,QAAQ3G,KAAK2G,IACK,YAAjBhC,EAAQgC,OAEX4Y,GAAU1e,EAAOkf,cAAgBC,GAAiB3T,KAAK/N,EAAQuC,EAAQ,KAAKof,QAExEnF,GAGHA,EAAcja,EAAOqf,OAEjBX,EACAzE,IAAgB4C,KAAU5C,EAAcqF,GAAc9D,EAAWxb,EAAOwb,aAG3EiD,EAAWrU,SAASmV,cAAc/D,GAClCpR,SAASmD,KAAKiS,YAAYf,GAG1BxE,EAEGqF,GAAc9D,IACbiD,EAASS,cAAgBC,GAAiB3T,KAAK/N,EAAQghB,EAAU,KAAKW,QAC1EhV,SAASmD,KAAKkS,YAAYhB,MAK3Bze,EAAOqf,MAAQX,EACfzE,EAAc4C,MAGZlB,EAASA,GAAUmD,IAAc7E,IACpCvc,EAAE+f,MAAMzd,EAAQ8F,EAAKf,MAAM,GAAIkV,IAEb,SAATnU,IACN,SAAS3G,KAAK2G,IACjBpI,EAAEsG,KAAKhE,EAAQ8F,EAAKf,MAAM,GAAIkV,GAG3BnU,IAAS8X,IACZS,GAAU,EACVpE,EAAcA,GAA+B,UAAhBA,GAInBnU,IAAS+X,IAOnBQ,GAAU,EACVvY,EAAO8X,GACP3D,EAAcja,EAAO2D,QAAW,GAAKsW,GAGlB,aAATnU,GAAgC,aAATA,GAAgC,aAATA,GAAgC,aAATA,EAC/EmU,EAAeA,GAA+B,UAAhBA,EAA2BnU,EAAO,KAG7C,UAATA,GAAwC,WAApB9F,EAAOwb,WACrCxb,EAAOyb,QAAUpb,GAAS4Z,GACvBA,EACA,GAAKA,IAGLC,EAASqB,GAAUzV,IAClBA,IAAS8B,IAEZhG,EAAKkC,QAAUA,EACX1F,GAAOA,EAAI0D,EAAEoC,QAChBka,EAAgBhgB,EAAIshB,OAAM,GACtBthB,EAAI2gB,SACHd,GAAYA,IAAaC,EAE5ByB,GAAmB1B,EAAUC,EAAUle,EAAQ5B,EAAIwhB,MAAO,KAAK,IACrDtB,EAASte,EAAO+d,OAE1BnV,EAAKxK,EAAIwhB,MAAQ,IACjBrB,EAAYD,EAAOxH,QAAQ,IAAMlO,GAAM,EACvC4V,EAAaF,EAAOxH,QAAQ,IAAMlO,GAE9B2V,GAAaC,EAAa,IAC7BD,GAAa3V,EAAG3G,OACZuc,EAAaD,IAChBT,EAAS9d,EAAQse,EAAOvZ,MAAM,EAAGwZ,GAAaD,EAAOvZ,MAAMyZ,IAC3DqB,GAAcvB,EAAOvZ,MAAMwZ,EAAWC,OAIzCP,EAAWA,EACRA,EAAS6B,gBACT5B,EACCA,EAAS4B,gBACT9f,EAAO+f,WAGZriB,EAAE0gB,GAAe4B,SAGjB7B,EAAUvc,EAAK9B,KAAK8B,EAAKoC,KAAMhE,EAAQie,EAAUC,EAAUjE,EAAa7b,IAAQA,IAAKA,EAAIwhB,MAAOK,SAAU7hB,EAAIW,OAAOE,MAAMghB,aAG3HrB,EAAUA,GAAWE,IAAc7E,EAC/B2E,GACHpB,EAAQ0C,QAELtB,IACHT,EAAUvc,EAAK9B,KAAKG,EAAQD,EAAQie,EAAUC,EAAUjE,EAAa7b,IAAQA,IAAKA,EAAIwhB,UAIxFhe,EAAKkC,QAAU2W,KAEXkB,EAASA,GAAUmD,IAAc7E,KACvB,SAATnU,GAAmB9F,EAAOmgB,WAAangB,EAAOmgB,SAAS,GAE/B5e,SAAvBvB,EAAOogB,YACVpgB,EAAOogB,YAAcnG,EAErBja,EAAOqgB,UAA4B,OAAhBpG,EAAuB,GAAKA,EAGhDuD,EAAQtD,GAAQD,MAGb0E,EAASE,EAAapD,UAEb,UAAT3V,GAAqB0X,EAAQ1X,KAAK,WAEtC9F,EAAOsgB,SAAW5iB,EAAE6iB,QAAQ,GAAKtG,EAAa5Z,GAASse,GAAUA,GAAUA,UAGnEhD,EAASA,GAAUmD,IAAc7E,IAE3CuD,EAAQa,EAAU,OAAS,QAAQvY,EAAsBvE,SAAhB0Y,GAA8BoE,EAAiBpE,EAAP,MAElFnW,EAAQ+X,KAAO5B,GAETkE,GAAWxC,EAGnB,QAAS6E,GAAmBxG,EAAIa,GAC/B,GAAInS,GAAOrK,KACVqc,EAAiBhS,EAAKyS,IAAIC,IAC1BT,EAAgBjS,EAAKyS,IAAIE,GAC1B,KAAKX,GAAkBA,EAAelP,KAAKnN,KAAM2b,EAAIa,MAAe,EAAO,CAC1E,GAAIA,EAAW,CAEd,GAAI7O,GAAS6O,EAAUc,OACtBvZ,EAAQyY,EAAUzY,MAClBqe,EAAQ5F,EAAU4F,KAEnB,QADA/X,EAAK5G,EAAE4e,IAAM7F,EAAU1N,QACfnB,GACP,IAAK,SACJtD,EAAKiY,SAASve,EAAOqe,EACrB,MACD,KAAK,SACJ/X,EAAKkY,YAAYxe,EAAOqe,EAAMxe,OAC9B,MACD,KAAK,OACJyG,EAAKkY,YAAY/F,EAAUgG,SAAUJ,EAAMxe,OAAQV,QAAW,GAC9DmH,EAAKiY,SAASve,EAAOqe,EACrB,MACD,KAAK,UACJ/X,EAAK5G,EAAE4e,IAAMnf,OACbmH,EAAKoY,SAAS,IAIbnG,GACHA,EAAcnP,KAAKnN,KAAM2b,EAAIa,IAShC,QAASkG,IAAmBnf,GAE3B,GAAIof,GAASC,EACZ3f,EAAOM,EAAKN,KACZ0C,EAAOpC,EAAKoC,KACZiQ,EAAQrS,EAAKE,EAAEqC,KAEXvC,EAAKE,EAAEC,QAAUkS,KAGjBgN,EAAerf,EAAKE,EAAEof,UAEzBxjB,GAAGujB,EAAa,KAAKE,IAAIC,GAAgBH,EAAa,IACtDrf,EAAKE,EAAEof,OAAS3f,QAEb0S,MAAYA,EAEX3S,EACH2S,EAAMnS,EAAEoF,OAAOtF,EAAKE,EAAE8G,IAAMhH,QAErBqS,GAAMnS,EAAEoF,OAAOtF,EAAKE,EAAE8G,IAEpBtH,GAAQ0C,IAElBgd,EAAU,SAAShH,GACZA,EAAGhW,MAAQgW,EAAGhW,KAAKmd,KAKxBX,EAAmBhiB,MAAMoD,EAAMnD,YAGjCf,GAAGsG,IAAOqd,GAAGD,GAAgBJ,GAC7Bpf,EAAKE,EAAEof,QAAUF,EAAShd,KAK7B,QAASsX,IAAYnR,EAAMyQ,EAAI0G,GAG9B,GAAI9F,GAAWrR,EAAKqR,SAASpN,cAC5BtI,EACCiI,GAAqBwT,IAAI/F,IACtBrR,EAAKqX,kBAAoBtE,KAAStC,GAAIhT,GAAM6Z,KAAM7Z,GACvD,OAAO9B,GACH8U,EACe,UAAbY,GAAwBrR,EAAK7I,OAASuc,GACvCA,GACA/X,EAAK8U,GACN9U,EAAK2b,KACN7G,EACC0G,EAAa,OAAS1Z,GACtB,GAOL,QAAS8Z,IAAc9f,EAAMQ,EAAOgB,EAAM5B,EAAOwC,EAAMqE,EAAS8E,GAC/D,GAAIhF,GAAMwZ,EAAYC,EAAUxD,EAAeyD,EAC9CtF,EAAa3a,EAAK0a,WAClB2B,EAAWrc,EAAKod,KAChBd,EAAWtc,EAAKqd,KAChB6C,EAAQlgB,EAAKmd,MAOd,IALId,GAAYA,EAAS1B,aAAeA,GACvCzX,EAAM,sBAIHqI,EAAS,CACZiR,EAAgBxc,EAAK8d,QACjBoC,GAAS7D,GAAYA,IAAaC,GAErCyB,GAAmB1B,EAAUC,EAAU3B,EAAY3a,EAAKE,EAAE8G,GAAI,KAAK,GAGpEhH,EAAKgf,YAAYrf,OAAWA,QAAW,GACvCogB,EAAazD,EAET4D,IACH7D,EAAWA,EACRA,EAAS6B,gBACT5B,EACCA,EAAS4B,gBACTvD,EAAWwD,WAIhBriB,EAAE0gB,GAAe4B,QAEjB,KAAK6B,IAAUjgB,GAAKE,EAAE+B,KAGrBke,GAAkBF,OAEb,CAEN,GAAIzf,EAAO,CAGV,GADAwf,EAAWpgB,EAAMY,EAAQ,IACpBwf,EACJ,OAAO,CAER3D,GAAW2D,EAAS3C,KAEjB6C,GACHH,EAAa1D,EACbA,EAAW0D,EACRA,EAAW7B,gBACXvD,EAAWwD,WAId4B,EAAa1D,EAAS+D,YAGxB7Z,EAAO/E,EAAKwD,OAAO5C,EAAMqE,EAASzG,EAAKE,EAAEC,QAAUoL,EAASvL,EAAMuL,GAAW/K,GAAO,GAIpFR,EAAK9B,KAAKkE,EAAMuY,EAAY0B,EAAU0D,EAAYxZ,EAAMyZ,GAQzD,QAASK,IAAkBte,EAAO/B,EAAMxD,GAMvC,GAAIwK,GAAIsZ,CAmBR,OAlBI9jB,IAEH8jB,EAAM,KACN/E,GAAe/e,GAAK,GACpBwK,EAAKxK,EAAIwhB,MACJhX,IACJsS,GAAatS,EAAKuZ,MAAgB/jB,EAGlCA,EAAIwhB,MAAQ,GAAKhX,KAKlBsZ,EAAM,KACN/E,GAAeiF,GAAUxZ,EAAKhH,EAAKE,EAAE8G,IAAMhH,IAGrC,IAAMgH,EAAKsZ,GACL3gB,QAAToC,EAAqBA,EAAQ,IAE9B,IAAMiF,EAAKsZ,EAWf,QAASnF,IAAejZ,EAAS7D,EAAQD,GACxC,GAAIwa,GAAS9Y,EAAG2gB,EAAGva,EAAYwa,EAAYxH,EAAQ9b,EAAMujB,EACxDnkB,EAAM0F,EAAQ1F,IACdokB,EAAQ1e,EAAQ4M,YAChB1L,KACA6c,EAAS/d,EAAQ2e,QAAU,GAAKN,KAChCnB,EAAUld,EAAQ4e,IAWnB,IATA5e,EAAQ2e,OAASlhB,OAEbnD,IAGH4G,EAAU5G,EAAI4G,SAAWA,EACzBA,EAAUrG,GAAYqG,GAAW5G,EAAI4G,QAAQ5G,GAAO4G,EACpD8C,EAAa1J,EAAI0J,aAEbhE,EAAQ6e,UAAa,GAAK7e,EAAQ6e,UAAa,GAAK3d,EAAU,CAUlE,GARIlB,EAAQ6e,UAEXzV,GAAY0V,QAAO,GAAQ3iB,GAAS6D,EAAQ6e,SAAU3B,GAAS,GAGhEsB,EAAaxe,EAAQT,GAAGX,KAAKqC,QAGzB3G,GAAOA,EAAIykB,WAGd,IADAnhB,EAAItD,EAAIykB,WAAW5gB,OACZP,KAGN,IAFA1C,EAAOZ,EAAIykB,WAAWnhB,GACtB2gB,EAAIjkB,EAAI0D,EAAEqC,IAAIsP,MAAMxR,OACbogB,KACNE,EAAWnkB,EAAI0D,EAAEqC,IAAIsP,MAAM4O,GAAGrjB,GAC1BujB,GAAYA,EAAS5O,MACxB2O,EAAaA,EAAWlV,OAAOmV,GAOnC,KADA7gB,EAAI4gB,EAAWrgB,OACRP,KACNoZ,EAASwH,EAAW5gB,GAChBoZ,EAAO9E,OAGVsM,EAAW5gB,GAAK3B,KAAY+a,GA2B9B,IAvBAN,EAAUtN,GAAY0V,QACrB,GACC3iB,GACDqiB,EACAtd,EACAgc,EACAld,EAAQgY,QAGTtB,EAAQrQ,KAAOnK,EACfwa,EAAQ1W,QAAUA,EAClB0W,EAAQoF,MAAQiC,EAGhB7hB,EAAOgb,QAAUhb,EAAOgb,SAAW,GACnChb,EAAOgb,SAAW,IAAM6G,EACxB/d,EAAQ6e,SAAW3d,EAEnBlB,EAAQlC,KAAKE,EAAE+B,KAAKge,GAAUA,EAE9B3G,GAAa2G,GAAUrH,EAGnB1S,EAEH,IADApG,EAAIoG,EAAW7F,OACRP,KACNoG,EAAWpG,GAAGohB,SAAW1kB,EACzB2kB,GAAOvI,EAASpc,EAAK0J,EAAWpG,IAChCoG,EAAWpG,GAAGsZ,QAAU,IAAMR,EAAQoF,MAAQ,QAG3Bre,UAAVihB,GACVO,GAAOvI,EAASpc,EAAK4B,EAAQwiB,EAG1BpkB,KACEA,EAAImG,MAASnG,EAAI0D,EAAEoC,SACvBlE,EAAO4K,aAAaoY,IAAahjB,EAAOwK,aAAawY,KAAa,IAAM,IAAMnB,EAAS,KAAOA,EAAS,KACvGzjB,EAAIwhB,MAAQ,GAAKiC,KAUrB,QAASoB,IAASrI,EAAI6G,EAAMpZ,EAAS+G,EAAa7J,EAAY0Y,EAAUC,GACvE,MAAOgF,IAAM7kB,KAAMuc,EAAI6G,EAAMpZ,EAAS+G,EAAa7J,EAAY0Y,EAAUC,GAG1E,QAASgF,IAAMC,EAAgBvI,EAAI6G,EAAMpZ,EAAS+G,EAAa7J,EAAY0Y,EAAUC,GAUpF,GARI7V,KAAY,GACf+G,EAAc/G,EACdA,EAAU9G,QAEV8G,EAD6B,gBAAZA,GACP9G,OAEAxB,KAAYsI,GAEnB8a,GAAkBvI,EAAI,CACzBA,EAAKA,EAAGlB,OAASkB,EAAKld,EAAEkd,GAEnBwI,KACJA,GAAahZ,SAASmD,KACtB7P,EAAE0lB,IACA/B,GAAGgC,GAAkBtJ,GACrBsH,GAAG,OAAQ,oBAAqBtH,GAQnC,KALA,GAAItY,GAAG4gB,EAAGla,EAAMmb,EAAS1hB,EAAM2hB,EAAmBC,EAAUrW,EAASsW,EACpE9e,EAAWsd,GACXyB,EAAcrb,GAA8B,YAAnBA,EAAQrI,OACjC0B,EAAIkZ,EAAG3Y,OAEDP,KAAK,CAQX,GAPA8hB,EAAW5I,EAAGlZ,GAEd6D,EAAaA,GAAcoe,GAAMH,IAE7BC,EAAele,IAAeG,MACjCA,GAAQ1B,MAAQ0B,GAAQ9C,IAAMyF,OAAexG,KAAO4f,GAEjD,GAAK0B,IAAmBA,EAE3BS,GAAeT,EAAgBK,EAAUje,EAAYhE,QAAW,EAAMkgB,EAAMpZ,OACtE,CACN,GAA8B9G,SAA1B4hB,EAAepY,OAEd2Y,IACHH,EAAoBC,EAASjH,YAG9BpU,EAAOgb,EAAevc,OAAO6a,EAAMpZ,EAAS+G,EAAa7J,EAAYhE,OAAWoD,GAI5E4e,GAEHtF,EAAWuF,EAAS1D,gBACpB5B,EAAWsF,EAASxB,YACpBtkB,EAAEmmB,WAAWL,IAAW,GACxBD,EAAkB9D,YAAY+D,GAE9BA,EAAWD,IAEXtF,EAAWC,EAAW3c,OACtB7D,EAAE8lB,GAAUtD,aAEP,CAAA,GAAIiD,KAAmB,GAAQ5d,IAAeG,GAIpD,KAFAyH,IAAW2W,IAAK,GAUjB,GAAIN,EAASzF,MAAQG,EAAU,CAM9B,IAFAoF,EAAUS,GAAUP,EAASzF,KAAK,EAAMiG,IAEnCviB,EAAI,EAAG4gB,EAAIiB,EAAQrhB,OAAQR,EAAI4gB,EAAG5gB,IACtCG,EAAO0hB,EAAQ7hB,IACVG,EAAOwgB,GAAUxgB,EAAKgH,MAAsBrH,SAAdK,EAAKoC,MAGvCpC,EAAKM,OAAO0e,YAAYhf,EAAKE,EAAEwG,IAAK/G,QAAW,EAGjDuc,GAAS0F,GAIVje,EAAWzF,KAAK2hB,EAAM+B,EAAUvF,EAAUC,EAAU/V,EAAMgF,EAAS9E,GAGhEob,IACH/d,GAAQ1B,KAAO0B,GAAQ9C,IAAMrB,SAIhC,MAAOqZ,GAOR,QAASqJ,IAASC,EAAW3H,EAAY0B,EAAUC,EAAU/V,EAAMgF,EAAS9E,EAAS8b,GAYpF,QAASC,GAAehT,EAAKiT,EAAWC,EAAWC,EAAUC,EAAa5b,EAAI6b,EAASC,EAAYC,EAAMC,EAAMC,EAAWC,EAAiBC,EAAYC,GAQtJ,GAAIC,GAAUC,EACbC,EAAa,EACd,OAAIH,IACHI,EAAQ,EACDhU,IAERhT,EAAMumB,GAAQC,GAAQ,GACtBL,EAAWA,GAAYM,EACvBP,EAAYA,GAAaS,EACrBM,IAAWf,KAAgBlT,GAAOmT,GAAYnmB,GAAOwK,IAAOwc,KAC/DC,EAAS9jB,OACTwE,EAAYuf,GAASzU,SAEtB0T,EAAWA,GAAYD,EACnBC,IACHa,EAAQ,EACRC,EAAS9jB,OAOLgkB,IACCjB,GAAaS,EACXS,GAAUzf,IAAe,eAAe5G,KAAK,IAAMmmB,GAASrO,KAAK,KAAO,OAG5EgO,EAAW,KAAOlf,EAAY,QAErByf,GAAUjB,GACpBU,EAAW,MAAQV,EACRe,GAASrjB,QAAUsiB,IAAaxe,IAC3Ckf,EAAW,gBAAkBV,GAE1BU,GACH9U,EAAY8U,EAAW,WAAa9c,IAGtCsd,EAAY3D,EACZ/b,EAAYuf,GAASzU,QACrBiR,EAAQ4D,GAAU3f,GAClB8e,EAAYA,EAAa,KAAOA,EAAY,IAAO,GAC/CY,IAEHE,IAASC,EACTA,EAAM,GACD9D,EAIJ6D,IAAS,KAHTR,EAAaN,EAAYgB,GAAa,IAAMF,GAAQG,IAAehB,GAAmB,IACtFa,GAAQI,GAAWlV,WAMlBiR,GAKClZ,EAEHgd,GAAOhd,EAEPyb,EAAaQ,GAAaE,GAAc,GAErC3mB,IAYHimB,GAAajmB,EACTwnB,IACHvB,GAAa,IAAMrB,GAAa,KAAO4C,EAAM,IAC7CA,EAAM,MAQRvB,EAAYzb,EACRyb,EAAYc,EAAaX,GAAeY,EAAQ,GAAKS,GAAajd,EAAKkd,IAAcpB,EAAatmB,EACnG+mB,GAAc/T,EAGdmU,GAAYd,IACXW,GAGHjV,EAAY,2BAA6BiV,EAAQ,2BAE7B,MAAjBxc,EAAGlI,OAAO,GACb4kB,GAAStiB,QAAQ4F,EAAG7D,MAAM,IAChB6D,EAAG7D,MAAM,MAAQmgB,EAAQI,GAASzU,UAE5CV,EAAY,mDAAqD+U,EAAQ,MAGvE9mB,IACHgnB,EAAQhnB,EAERknB,GAAStiB,QAAQ+C,GACjBA,EAAY3H,EAAI2G,MAAM,GAClBwgB,GAAYD,GAAS,IAAMA,GAAS,KAAOU,GAAUjgB,IAGxDjB,EAAM,kCAEPugB,EAASG,GAAUzf,IACd+b,EAAQ4D,GAAU3f,MAAgB0f,IACtCM,GAAW/iB,QAAQ2iB,IACnBA,GAAQ,IAETF,EAAY3D,EAMR6D,IAAS7D,IACZ6D,IAAS,MAGJtB,GAGR,QAAS4B,GAAiB3C,EAASzE,GAIlC,GAAIqH,GAAWC,EAAWC,EAAU9J,EAAY1T,EAAIyd,EAASC,EAC5DC,IAMD,IAAIjD,EAAS,CAWZ,IAVgC,MAA5BA,EAAQkD,MAAM9lB,OAAO,KAKxBme,EAAe1U,EAAK2V,gBACpB3V,EAAKoS,WAAWkD,YAAYtV,GAC5BA,EAAO5I,QAERklB,EAAMnD,EAAQrhB,OACPwkB,KAAO,CAIb,GAHAC,EAASpD,EAAQmD,GAEjBL,EAAWM,EAAOtN,GACd8M,EAAYQ,EAAOxS,KAGtB,IADAjI,EAAIia,EAAUjkB,OAAS,EAChBkkB,EAAYD,EAAUxlB,OAAOuL,MAEjB,MAAdka,EACyB,MAAxBD,EAAUxlB,OAAOuL,IACpBA,IACA4S,EAAeA,EAAaiB,iBAE5BjB,EAAeA,EAAatC,WAG7BsC,EAAeA,EAAakB,SAMd,OAAbqG,GACChoB,EAAM8c,GAAatS,EAAK8d,EAAO9d,OAGlC0d,EAAOzH,KAAkB1U,GAAQA,EAAKoS,aAAesC,GAEhD1U,IAAQmc,IACZloB,EAAIke,WAAauC,GAEd6H,EAAO5E,OAASwE,GAGnBxI,EAASe,GAAe6H,EAAOC,KAAO,IAAM,KAAO/d,EAAKwd,GAAYvH,EAAad,KAAO,KAGzFwI,EAAaxd,MAAMud,EAAO,KAAOnc,EAAMuc,MAE9B9kB,EAAOwgB,GAAUxZ,EAAK8d,EAAO9d,OAElChH,EAAK0a,aAET1a,EAAK0a,WAAauC,GAAgB1U,GAAQA,EAAKoS,YAAcA,EAC7D3a,EAAKE,EAAE6C,SAAWsd,GAClBrgB,EAAKE,EAAE8kB,cAAgBpG,EACvBO,GAAmBnf,IAEpB0a,EAAa1a,EAAK0a,WACdoK,EAAOC,MAGV/kB,EAAKmd,OAAS2H,EAAO5E,MACjBjD,IAAiB1U,EACpB2T,EAASe,EAAc,IAAMjW,EAAKwd,GAAYvH,EAAad,KAAO,MAG7Dnc,EAAKod,MACTlB,EAASxB,EAAYuK,GAAavK,EAAWyB,IAAK,IAAMnV,EAAKwd,IAE9DxkB,EAAKod,KAAO7U,MAIT0U,GAAkB1U,GAAQA,EAAKoS,aAAesC,EAIvC1U,IAELvI,EAAKqd,MACTnB,EAASxB,EAAYuK,GAAavK,EAAWyB,IAAK,IAAMnV,EAAKwd,IAE9DxkB,EAAKqd,KAAO9U,IAPZ2T,EAASe,EAAc,IAAMjW,EAAKwd,GAAYvH,EAAad,KAAO,KAClEnc,EAAKqd,KAAO1d,SAQT8kB,EAAUzkB,EAAKgB,KAAOhB,EAAKgB,IAAIkkB,KAAqBC,KACvDV,EAAQ7a,KAAK5J,EAAKgB,IAAIxE,IAAKwD,KAO/B,IADA6kB,EAAMF,EAAatkB,OACZwkB,KAENO,GAAQje,KAAKwd,EAAaE,IAG5B,OAAQnD,GAAWA,EAAQxB,MAG5B,QAASmF,GAAa3D,GAGrB,GAAI4D,GAAOnhB,EAAW2P,CAEtB,IAAI4N,EAEH,IADAmD,EAAMnD,EAAQrhB,OACTgK,EAAI,EAAGA,EAAIwa,EAAKxa,IAMpB,GALAya,EAASpD,EAAQrX,GAGjBlG,EAAY3H,EAAM8c,GAAawL,EAAO9d,IAAI9E,QAAQ1F,IAClDsX,EAAQtX,EAAIiG,UAAYA,GACnBjG,EAAImG,MAAQmR,EAAO,CACvB,IAAK4Q,EAAM,CAEV,IADAY,EAAQ,EACDnhB,EAAYA,EAAU7D,QAC5BglB,GAEDC,GAAWA,GAAYD,GAEnBZ,GAAQY,IAAUC,GAAe9iB,IAAWqR,GAEhD7P,EAAKkD,KAAK3K,IAOf,QAASgpB,KAER,GAAInb,GAAG7J,EACNkc,EAAS,GACT+I,KACAC,EAAWC,IAAgBvlB,GAAM,KAAOgc,GAAY,IAAM,GAe3D,KAZAwJ,EAAQC,GAAMlL,EAAWmL,iBAAiBJ,GAAY5pB,EAAE4pB,EAAU/K,GAAYva,MAC9EN,EAAI8lB,EAAMvlB,OAINgc,GAAYA,EAAS1T,YAExBod,EAAYF,GAAMxJ,EAASyJ,iBAAiBJ,GAAY5pB,EAAE4pB,EAAUrJ,GAAUjc,MAC9Eic,EAAW0J,EAAU1lB,OAAS0lB,EAAUA,EAAU1lB,OAAS,GAAKgc,GAGjEkJ,EAAW,EACN1lB,EAAI,EAAGA,EAAIC,EAAGD,IAElB,GADA0I,EAAOqd,EAAM/lB,GACTwc,IAAatc,GAEhBA,GAASwI,IAAS8T,MACZ,CAAA,GAAIC,GAAY/T,IAAS+T,EAAU,CAErClc,KACHsc,GAAUsJ,GAAezd,GAE1B,OACM,GAAIA,EAAKoS,WAEf,GAAIva,GAAK,CAER,GADAsc,GAAUsJ,GAAezd,GACrBA,EAAK4T,IAAK,CAEb,IADA9R,EAAIxK,EAAI,EACDwK,EAAIvK,GAAKyI,EAAK0d,SAASL,EAAMvb,KACnCA,GAGDob,GAAKpb,EAAE,GAAK9B,EAAK4T,IAEdsJ,EAAK5lB,KACR6c,GAAU+I,EAAK5lB,IAAM,QAGlBqmB,MAAWpB,EAAS3C,GAAU5Z,EAAM5I,OAAWwmB,OAAmBrB,EAASA,EAAO,MAErFsB,GAAOA,GAAQtB,EAAO9d,KAAOof,IAAQA,GAAQtB,EAAOC,MAAQD,EAAO9d,KAE/Dof,IAAQC,GAAalE,GAAU5Z,KAG/BA,EAAKK,aAAa0d,KACtBlB,GAAQje,MAAMoB,IA6BlB,GAvBInI,KACHsc,GAAU/B,EAAWwB,KAAO,IACxB3b,EAAQkc,EAAOxH,QAAQ,IAAM9U,GAAI4G,IAAM,KAE1C0V,EAASA,EAAOvZ,MAAM3C,EAAQJ,GAAI4G,GAAG3G,SAEtCG,EAAQkc,EAAOxH,QAAQ,IAAM9U,GAAI4G,IAC7BxG,EAAQ,IAEXkc,EAASA,EAAOvZ,MAAM,EAAG3C,IAG1B6kB,EAAalD,GAAUzF,EAAQ/c,OAAW4mB,MAG9B5mB,SAAT4G,GAAsBoU,EAAW/R,aAAa0d,KACjDlB,GAAQje,MAAMwT,IAIf6L,GAAqBnK,EAAU6D,GAC/BsG,GAAqBlK,EAAU4D,GAE3B9f,GAIH,YAHIie,IACHA,GAASoI,UA4BX,KAvBIvG,GAAS6D,GAAQC,IAEpBzb,EAAO+T,EACHyH,KACCzH,EACH+H,EAAiBlC,GAAU4B,GAAQ,KAAK,GAAOzH,GAE/C+H,EAAiBlC,GAAU4B,IAAO,GAAOpJ,IAG3C0J,EAAiBlC,GAAU6B,GAAK,GAAOrJ,GAEnC2B,IACHI,EAASJ,EAAS1T,aAAawY,KAC3BthB,EAAI4c,EAAOxH,QAAQwR,GAAW,KACjChK,EAASA,EAAOvZ,MAAMrD,EAAI4mB,EAAQrmB,OAAS,IAE5Cic,EAAStT,aAAaoY,GAAY4C,EAAMtH,KAK1C5c,EAAIslB,GAAQ/kB,OACPR,EAAI,EAAGA,EAAIC,EAAGD,IAClB0I,EAAO6c,GAAQvlB,GACf8mB,EAAWpe,EAAK,GAChBA,EAAOA,EAAK,GACRoe,GACCnqB,EAAM8c,GAAaqN,EAAS3f,QAC3B9E,EAAU1F,EAAI0F,WAEjB1F,EAAM0F,EAAQ1F,IACdA,EAAI0F,QAAUA,GAEXykB,EAAS5B,MAERxc,IACH/L,EAAIke,WAAanS,EAAKoS,WACtBne,EAAI4gB,KAAO7U,GAEZ/L,EAAI2gB,OAASwJ,EAASzG,MAEtBlgB,EAAOxD,EAAIW,OAAO6C,KAClBgiB,GAAeriB,OAAWnD,EAAI4gB,KAAMpd,EAAM2mB,EAAS3f,MAEnDxK,EAAI6gB,KAAO9U,EACP/L,EAAI0D,EAAEsC,WAGTrF,EAASX,EAAIW,OACb6C,EAAO7C,EAAO6C,KACdkb,GAAc1e,MAMjBwlB,GAAezZ,EAAKK,aAAa0d,IAAiB/d,EAAMwZ,GAAMxZ,GAAO5I,OAAWumB,GAAQ5D,EAAW7b,EAGjG4X,KACHA,GAASoI,UAKX,GAAIjD,GAAOthB,EAAS1F,EAAKqD,EAAGC,EAAGuK,EAAGwa,EAAKe,EAAOrd,EAAMvI,EAAM8kB,EAAQ6B,EAAUZ,EAAWa,EAAO5G,EAAU6G,EACvGlR,EAAM1R,EAAMygB,EAAMjiB,EAAStF,EAAQwmB,EAAU4B,EAAUuB,EAAOC,EAAUC,EAAYC,EAAU9iB,EAC9Fsf,EAAQyD,EAASza,EAAKiQ,EAAQwD,EAAO2D,EAAW5X,EAAS+X,EAAK0C,EAAS3mB,GAAOqmB,GAAM/H,GAAU6H,GAAQ9lB,GACtG0G,GAAOrK,KACP0qB,GAASrgB,GAAK5G,EAAE8G,GAAK,IACrB+c,GAAQ,GAERqB,MACA1B,MACAS,MACAgB,GAAgBre,GAAKyS,IAAI2L,IACzBmB,GAAehC,CAuChB,IArCI9Y,IACH8S,GAAW9S,EAAQ8S,UAAYviB,EAAEsrB,WAC7B7b,EAAQ/J,KAEXwe,EAAW,IAAMzU,EAAQrL,EAAE8G,GAAK,KAEhCkf,GAAS3a,EAAQ2W,IACb3W,EAAQ/O,MACX2qB,GAAS5b,EAAQ/O,IAAM,IACvB+O,GAAU,IAEPnL,GAAMmL,EAAQnL,OACjBimB,GAAehB,EACfphB,EAAO7D,GAAI6D,KACXygB,EAAOtkB,GAAIskB,KACXjiB,EAAUrC,GAAInC,OAGhBsN,EAAUA,KAAY,GAGvBoP,EAAaA,EACT,GAAKA,IAAeA,EACpB7e,EAAE6e,GAAY,GACdA,EAAW7C,OACV6C,EAAW,GACXA,EACD7T,GAAK4T,YACJlS,SAASmD,KAEdgY,GAAYxX,GAAqBkb,YAAc1M,EAAWiF,kBAAoBtE,GAC9EnX,EAAYwW,EAAWlY,QAAQ+J,cAC/B0T,IAAU4D,GAAU3f,GAEpBkY,EAAWA,GAAYiL,GAAmBjL,EAAU6D,GACpD5D,EAAWA,GAAYgL,GAAmBhL,EAAU4D,IAAU,KAElDvgB,QAAR4G,EAAmB,CAUtB,GAJAkG,EAAMjE,SAASmV,cAAc,OAC7BuJ,EAAUza,EACVia,EAAU1C,EAAM,GAChB/X,EAAsC,+BAA5B0O,EAAW4M,aAAgD,UAAYN,EAAW3a,GAAWC,KAAKhG,KAAU0gB,EAAS,IAAM,GACjI/G,EAAO,CAGV,IADAvK,EAAO2G,EACA3G,KAAUkR,EAAW1E,GAAUxM,KACrCA,EAAOA,EAAKyK,aAET1D,EAASmK,EAAWA,EAASjC,MAAQjK,EAAWwB,OACnDyK,EAAQ5G,GAAY,IAChBzU,GAAYyU,IACf4G,GAAS,IAAMO,IAEhB9c,EAAIqS,EAAOxH,QAAQ0R,GACfvc,EAAI,IACPA,GAAKuc,EAAMvmB,OAEXqmB,EAAU1C,EAAMtH,EAAOvZ,MAAM,EAAGkH,GAChCqS,EAASA,EAAOvZ,MAAMkH,GAClBwc,EACHlR,EAAK3M,aAAaoY,GAAY1E,GAE9BR,EAASvB,EAAY+B,KAgBzB,GARA+G,EAAS9jB,OACT4G,GAAQ,GAAKA,GAAM+C,QAAQke,GAAiBhF,GAIxCmB,GAAYD,GAASrjB,QACxBkO,EAAY,gBAAkBpK,EAAY,cAAgBoC,GAEvDgc,EACH,MAWD,KARAkF,GAAa7J,YAAYnR,GAKzBR,EAAUC,GAAQD,IAAYC,GAAQO,IACtCqa,EAAQ7a,EAAQ,GAChBib,EAAQve,UAAYsD,EAAQ,GAAK1F,EAAO0F,EAAQ,GACzC6a,KACNI,EAAUA,EAAQ/I,SAInB,KAFAsJ,GAAa5J,YAAYpR,GACzBsa,EAAWve,SAASkf,yBACbV,EAAaE,EAAQS,YAC3BZ,EAASnJ,YAAYoJ,EAGtBrM,GAAWiN,aAAab,EAAUzK,GASnC,MANI+B,IACHwJ,WAAWrC,EAAU,GAErBA,IAGMnH,IAAYA,GAAS9B,UAG7B,QAASyF,IAAe8F,EAAYnS,EAAMoS,EAAaC,EAAY9B,EAAQ9jB,EAAMqE,GAEhF,GAAIjF,GAAMkb,EAAQxY,EAAM4K,EAAamZ,EAAS3N,EAAQpY,EAAS1F,EAAK0rB,EAAWnZ,EAASoZ,EACvFC,IAED,IAAIJ,EAGHxrB,EAAM8c,GAAa0O,GACnBxrB,EAAMA,EAAI0F,QAAU1F,EAAI0F,QAAQ1F,IAAMA,EAEtC0F,EAAU1F,EAAI0F,UACbxC,KAAM,SACN0C,KAAM2lB,EAAY3lB,KAClBmG,KAAM/L,EAAI2gB,OAAS3gB,EAAIke,WAAa/E,EACpC3V,KAAM+nB,EACN/mB,IAAK+mB,EAAY/mB,IACjBkD,KAAM8B,GACNvE,GAAIjF,EAAI0D,EAAEqC,IACV/F,IAAKA,EAELqkB,OAAQmH,GAETK,GAAmBnmB,EAASA,EAAQT,QAC9B,IAAIqmB,GAAcnS,EAAM,CAiB9B,IAdAvT,EAAO8jB,EAAS9jB,EAAO2lB,EAAY3lB,KAOnCZ,EAAOumB,EAAYvmB,KAKnBsmB,EAAaQ,GAAiBR,EAAYpO,GAAY/D,IACtDwS,EAAYI,GAAaJ,UAAY,EAC9BzL,EAAS6L,GAAahc,KAAKub,IACjCM,EAAgBjhB,KAAKuV,GACrByL,EAAYI,GAAaJ,SAK1B,KAHIA,EAAYL,EAAWznB,QAC1BkO,EAAYuZ,GAENpL,EAAS0L,EAAgBnZ,SAAS,CAOxC,IAHAiZ,EAAYK,GAAaJ,UACzBjkB,EAAOwY,EAAO,GACduL,EAAUvL,EAAO,GACV0L,EAAgB,IAAgC,SAA1BA,EAAgB,GAAG,IAC/CH,GAAW/oB,GAAkBH,GAAiBqpB,EAAgBnZ,QAAQ,GACtEF,GAAU,CAEPA,KACHkZ,GAAW/oB,GAAkBH,GAAiBC,GAAiB,IAAM0d,EAAO,GAAKzd,IAElFiD,GACCxC,KAAMwmB,EAAS,MAAQ,OACvB9jB,KAAMA,EACNmG,KAAMoN,EACN3V,KAAM+nB,EACN/mB,IAAKyF,EACLvC,KAAMA,EACNskB,KAAMtC,EACNrL,MAAQ,EACRY,OAASiB,EAAO,IAGjB5N,EAAcnP,OACV+c,EAAO,KACV5N,EAAc4N,EAAO,KAAO/c,OAC5BuC,EAAQe,QAAUyZ,EAAO,IAAM,IAC1BxY,GAAwBvE,SAAhBmP,GAA6B4K,GAAY/D,KAErDzT,EAAQ4M,YAAcA,EAAcA,EAAY3L,MAAM,KAOxDjB,EAAQsS,KAAOtQ,EAAO+jB,EACtB3N,EAAS9Y,EAAK6K,MAAM4b,GACf3N,IACJ9Y,EAAK6K,MAAM4b,GAAW3N,EAASlb,GAAKiK,OAAO4e,EAASzmB,GAAM,EAAMsN,EAAaC,IAE9E7M,EAAQT,GAAK6Y,EACb+N,GAAmBnmB,EAASoY,GAG5BiO,GAAaJ,UAAYD,IAM5B,QAASG,IAAmBnmB,EAASoY,GAEpC,QAAS8E,GAAQhH,EAAIa,GACpBoB,EAAsBzQ,KAAK1H,EAASkW,EAAIa,EAAWqB,GAGpD8E,EAAQqJ,SAAU,EACdvmB,EAAQsmB,MAIXjN,GAAerZ,EAAQlC,KAAO,GAAIZ,IAAKoH,KACtCpH,GAAKwD,UAAUV,EAAQlB,IAAKkB,EAAQlC,KAAKgB,KACzC,OAAQkB,EAAQlC,KAAMkC,EAAQE,KAAMF,EAAQsS,MAAM7U,QAAW0gB,KAE/Dne,EAAQgY,OAAS9a,GAAKspB,MAAMxmB,EAAQlC,MACpCkC,EAAQ4e,KAAO1B,EAEfA,GAAQ,GAOT,QAAS6F,IAAa0D,EAAKxZ,GAC1B,GAAIsR,EACJ,OAAOkI,IACHlI,EAAIkI,EAAIzT,QAAQ/F,GACjBsR,EAAI,EACFkI,EAAIxlB,MAAM,EAAGsd,GAAKkI,EAAIxlB,MAAMsd,EAAItR,EAAO9O,QACvCsoB,GACF,GAGJ,QAAS3C,IAAerQ,GACvB,MAAOA,KACL,GAAKA,IAASA,EACZA,EACAA,EAAKlT,UAAYmmB,GAChBjT,EAAKjW,KAAKyD,MAAM,GACE,IAAlBwS,EAAKrN,UAAkBqN,EAAK/M,aAAawY,KAAe,IAG9D,QAASe,IAAUxM,EAAMkT,EAAOC,GAE/B,QAASC,GAASvZ,EAAKuV,EAAMiE,EAAOhiB,EAAIwQ,EAAIyR,GAC3CC,EAAM/hB,MACL+Y,MAAOA,EACPlZ,GAAIA,EACJwQ,GAAIA,EACJuN,KAAMA,EACNiE,MAAOA,EACP1W,KAAM2W,EACNrC,MAAOpX,IAGT,GAAI0Q,GAAOxD,EACVwM,IACD,IAAIxM,EAASmM,EAAQlT,EAAOqQ,GAAerQ,GAM1C,MALAuK,GAAQgJ,EAAMhJ,MAAQvK,EAAKlT,UAAYmmB,GACvC1I,EAA6B,MAArBxD,EAAO5d,OAAO,IAAcohB,EACpCgJ,EAAMtE,MAAQlI,EAEdA,EAAOpT,QAAQwf,GAAYK,GAAeJ,GACnCG,EAIT,QAAS1C,IAAqB7Q,EAAMuK,GAC/BvK,IACe,QAAdA,EAAKjW,KACRiW,EAAKgF,WAAWkD,YAAYlI,GAClBuK,GAA+C,KAAtCvK,EAAK/M,aAAa0d,KACrC3Q,EAAKyT,gBAAgB9C,KAKxB,QAASgB,IAAmB3R,EAAMuK,GAEjC,IADA,GAAImJ,GAAS1T,EACNuK,GAASmJ,GAA8B,IAApBA,EAAO/gB,UAChC+gB,EAASA,EAAOnL,eAcjB,OAZImL,KACqB,IAApBA,EAAO/gB,UAEV+gB,EAAS7gB,SAASmV,cAAciL,IAChCS,EAAO3pB,KAAO,MACdiW,EAAKgF,WAAWiN,aAAayB,EAAQ1T,IAC1BqQ,GAAeqD,IAAYA,EAAOzgB,aAAa0d,KAG1D+C,EAAOrgB,aAAasd,GAAgB,KAG/B+C,EAGR,QAASf,IAAiBR,EAAYwB,GAErC,MADAxB,GAAahsB,EAAE4Q,KAAKob,GAAYxe,QAAQC,GAAe,QAChDue,EAAW3kB,YAAclE,GAG7B6oB,EAAa9oB,GAAiB,IAAM8oB,GAAcwB,EAAS,IAAM,IAAMrqB,GACvE6oB,EAOJ,QAAS5M,IAAc1e,EAAK4b,EAAIa,GAC/B,GAAI/S,GAAYqjB,EAAaC,EAAU/rB,EAAKqC,EAAG2pB,EAC9CtsB,EAASX,EAAIW,OAEbE,GADOF,EAAO6C,KACN7C,EAAOE,OACf6E,EAAU1F,EAAI0F,OAmBf,IAjBI1F,EAAI0D,EAAEsC,WACiB7C,SAAtBnD,EAAIktB,gBAEPltB,EAAI0J,WAAa1J,EAAI0D,EAAEoC,OAAS9F,EAAImtB,UAAS,EAAMntB,EAAIktB,eAAiB,KAAKE,QAAU9tB,EAAEoG,EAAQqG,OAE9F/L,EAAIqtB,QACPrtB,EAAIqtB,OAAO1sB,EAAQ+E,EAAS1F,EAAIwE,IAAKoX,EAAIa,IAIvCzc,EAAIstB,aACPttB,EAAIstB,YAAY3sB,EAAQ+E,EAAS1F,EAAIwE,IAAKoX,EAAIa,GAG/C/S,EAAa1J,EAAIutB,UAAYvtB,EAAIutB,UAAU7jB,WAAa1J,EAAI0J,WAC5DqjB,EAAc/sB,EAAI+sB,aAAerjB,EAE7BA,GAAcA,EAAW,GAAI,CAEhC,GADAzI,EAAMjB,EAAIsG,UAAU,GACRnD,SAARlC,IAAsBjB,EAAI0D,EAAEka,OAE/B,IADAta,EAAIoG,EAAW7F,OACRP,KACN0pB,EAAWtjB,EAAWpG,GAClBtD,EAAI0D,EAAEsC,UAAYgnB,IAAatnB,EAAQqG,OAC1CkhB,EAAYD,EAAStI,SACjB1kB,EAAI0D,EAAEoC,UAAYmnB,GAAaA,IAAcjtB,GAAOitB,EAAUM,YAAcvtB,KAG/EgtB,EAAStI,SAAW1kB,EACpB2kB,GAAO7H,GAAa9c,EAAIwhB,OAAQxhB,EAAKgtB,GACrCA,EAASpQ,QAAU,IAAM5c,EAAIwhB,MAAQ,MAI3Bre,SAARlC,IACoBkC,SAAnB6pB,EAASznB,MACRynB,EAAS9pB,OAASqc,GACrByN,EAASxN,IAAWve,GAAe,UAARA,EACjB+rB,EAAS9pB,OAASuc,GAC5BuN,EAASxN,IAAYwN,EAASznB,QAAUtE,EAExC3B,EAAE0tB,GAAU/rB,IAAIA,GAEP+rB,EAAS5J,kBAAoBtE,KACvCkO,EAAS7gB,UAAYlL,GAEtByE,EAAQ+X,KAAOxc,GAEZJ,EAAMY,OACTurB,EAASvrB,KAAOurB,EAASvrB,MAAQZ,EAAMY,KAItCzB,GAAIwtB,UACH3sB,EAAM4sB,QACTV,EAAYU,OAAO5sB,EAAM4sB,QAEtB5sB,EAAM6sB,OACTX,EAAYW,MAAM7sB,EAAM6sB,QAGNvqB,SAAhBtC,EAAM8sB,OACTZ,EAAYrlB,KAAK,QAAS7G,EAAM8sB,OAE7B9sB,EAAM,WAEL4b,GAAasQ,EAAYa,SAASnR,EAAUe,WAC/CuP,EAAYc,YAAYpR,EAAUe,UAEnCuP,EAAYe,SAASjtB,EAAM,WAExBA,EAAM2J,KACTd,EAAW,GAAGc,GAAK3J,EAAM2J,IAG3BxK,EAAI0D,EAAEsC,SAAW7C,OAGlB,QAAS4qB,IAAuBnS,GAC/ByP,WAAW,WACV1P,EAAkBC,IAChB,GAGJ,QAASoS,IAAaC,EAAOC,EAAMC,GAC9BD,IACHA,EAAO,GAAKA,IAASA,EAAOA,EAAO,UACnCD,EAAME,GAAOD,EAAe,YAATA,EAAqBH,GAAyBpS,IAInE,QAASgJ,IAAOvI,EAASpc,EAAK0J,EAAY0a,GAMzC,GAAI7M,GAAQ6W,EAAWtY,EAAMuY,EAAUC,EAAUC,EAAaC,EAASC,EAASjS,EAAIlZ,EACnFoC,EAAU0W,EAAQ1W,QAClBiX,EAAYjX,EAAQgY,OACpB7b,EAAS6D,EAAQE,KACjByP,EAAQ3P,EAAQT,GAAGoQ,MAAM,EAI1B,IAFArV,EAAMA,GAAO0J,EAAWgb,SAEpBtI,GAAW/G,IAAU+G,EAAQI,GAAI,CAqBpC,GApBAiS,EAAU/kB,EAAWglB,SAAU,EAC3B1uB,IACHokB,EAAQpkB,EAAIsS,aAAe8R,EAC3BoK,EAAUxuB,EAAIW,OAAOE,MAAMyZ,SAE5BkU,EAAsBrrB,SAAZqrB,EAAwBrsB,GAAamY,QAAUkU,EAEzDA,EAAUA,IAAmC,UAAvB9kB,EAAWzD,SAAuByD,EAAWxG,OAASqc,IAAY7V,EAAWxG,OAASuc,IAA6B,aAApB/V,EAAWxG,MAAuBwG,EAAW0Z,kBAAoBtE,KAAS0P,IAAW,EAEtMC,IAAYD,IACfD,EAAcjvB,EAAEoK,GAChBskB,GAAaO,EAAaE,EAAS,OACnCT,GACCO,EACA7kB,EAAWglB,OAASF,EACpB,OAIFnZ,GAASkC,EAASlC,EAAMmC,SAAWnC,EAAM,GACrC+Y,EAAY/Y,GAASA,EAAMxR,OAAQ,CAEtC,GADAwqB,EAAWhZ,EAAM+Y,EAAY,GACzBC,EAASzW,KAAM,CAElB,IADA0W,EAAWD,EACJA,EAASxW,IAAMwW,EAASxW,GAAGD,MACjC9B,EAAOuY,EAAWA,EAASxW,EAE5B/B,GAAOuY,EAASxW,IAAM/B,GAAQA,EAAKA,KACnCuY,EAAWvY,EAAOA,EAAKnP,MAAM,GAAK2nB,EAASxY,KAE5C,GAAIA,EACH0G,GACE8R,EACAD,OAEI,CACN,MAAQ7R,EAAKG,EAAU7G,EAAOuY,EAASzV,MAAM,KAAKC,KAAK,KAAMhX,MAAayB,EAAIkZ,EAAG3Y,SAAS,CAGzF,GAAI2Y,EAAG,GAAG9X,KAKT,GAJA8X,EAAKA,EAAG,GACRG,EAAY/Z,GAAKspB,MAAM1P,EAAG,IAC1B6R,EAAW7R,EAAG,GACdA,GAAMA,EAAG,GAAG5W,KAAM4W,EAAG;AACjB6R,EAASzW,KAAM,CAIlB,IAHA0W,EAAWD,EACXC,EAAS1oB,KAAO4W,EAAG,GACnB8R,EAAS3Q,OAAShB,EACX0R,EAASxW,IAAMwW,EAASxW,GAAGD,MACjC9B,EAAOuY,EAAWA,EAASxW,EAE5B/B,GAAOuY,EAASxW,IAAM/B,GAAQA,EAAKA,KACnCuY,EAAWvY,EAAOA,EAAKnP,MAAM,GAAK2nB,EAASxY,KAC3C0G,GACC8R,EACAD,QAIF7R,GAAKlZ,EAAE,GACHkZ,EAAGlZ,EAAE,GAAIkZ,EAAGlZ,EAAE,KACdkZ,EAAGlZ,EAAE,GAEVzB,GAAS2a,EAAG,GACZ6R,EAAW7R,EAAG,GAEfA,EAAKA,IAAO3a,EAAQiU,QAGrB0G,KAEDJ,GAAQI,IACPA,EACA4H,IAKH,QAAS5F,IAAUxe,EAAK2uB,EAAS7hB,GAChC,GAAInM,GAAQiuB,EACXprB,EAAOxD,EAAIW,OAAO6C,KAClB4D,EAAUpH,EAAIoH,UAAYpH,EAAIW,QAC9B2C,EAAI8D,EAAQvD,OACZkL,GAAW4f,CAIZ,IAFAA,EAAUA,GAAW3uB,EAAI0D,EAAEqC,IAAIqH,KAAK5J,EAAKwB,MAAOhF,EAAI0F,SAAWlC,GAAMoC,KAAMpC,EAAMZ,IAE7EkK,EAEH1F,EAAUpH,EAAIoH,QAAUunB,EACxB3uB,EAAIW,OAASyG,EAAQ,OAErB,MAAO9D,KACN3C,EAASyG,EAAQ9D,GACjBsrB,EAAYD,EAAQrrB,GACpBwL,GAAYnO,EAAOE,OAAOyO,YAAYsf,EAAU/tB,OAChDc,EAAQhB,EAAO6D,IAAKoqB,EAAUpqB,KAC9B7D,EAAOgF,KAAOipB,EAAUjpB,KACpBoJ,IACHpO,EAAOqE,KAAO4pB,EAAU5pB,KAK3B,OADApC,IAAKisB,KAAK7uB,EAAKoH,EAAQ,IAChBA,EAOR,QAAS0nB,IAAM1F,GAMd,IAJA,GAAI9lB,GAAGyI,EAAMiJ,EACZ+Z,KACA1G,EAAMe,EAAMvlB,OACZR,EAAIglB,EACEhlB,KAGN0rB,EAAUpkB,KAAKye,EAAM/lB,GAGtB,KADAA,EAAIglB,EACGhlB,KAEN,GADA0I,EAAOgjB,EAAU1rB,GACb0I,EAAKoS,WAAY,CAEpB,GAAInJ,EAAWjJ,EAAK6Q,QAOnB,IAHA5H,EAAWA,EAASrO,MAAM,GAAGiS,MAAM,KACnC7M,EAAK6Q,QAAU,GACftZ,EAAI0R,EAASnR,OACNP,KAENqgB,GAAkB3O,EAAS1R,GAAIyI,EAAK2Y,SAAU3Y,EAGhD0V,IAAc+H,GAAezd,IAASA,EAAK4T,KAAO,MAKrD,QAASgE,IAAkBF,EAAQuL,EAAejjB,GAEjD,GAAIkjB,GAAOvpB,EAAS1F,EAAKgX,EAAQkY,EAAO9nB,EAAS9D,EAAG0F,EAAKulB,EAAa7kB,EAAY4Q,EAAS9W,EAC1F4Y,EAAUU,GAAa2G,EAExB,IAAIuL,EACHA,EAAgBA,EAAczB,WAAayB,EAC3CjjB,EAAK2Y,SAAWvhB,WACV,IAAIiZ,EAAS,OACZU,IAAa2G,EACpB,KAAKwL,IAAS7S,GAAQrW,IACrBiR,EAASoF,EAAQrW,IAAIkpB,GACrBC,EAAQ9S,EAAQ+S,KACZltB,GAAS+U,GACZ1X,GAAG0X,IAAS+L,IAAIC,GAAiBkM,GAAOnM,IAAIqM,GAAoBF,GAEhE5vB,EAAE0X,GAAQ+L,IAAIqM,GAAoBF,SAE5B9S,GAAQrW,IAAIkpB,EAGpB,IAAIvpB,EAAU0W,EAAQ1W,QAAS,CAC9B,GAAI1F,EAAM0F,EAAQ1F,IAAK,CACtB,GAAIoH,EAAUpH,EAAIoH,QAEjB,IADA9D,EAAI8D,EAAQvD,OACLP,MACF0F,EAAM5B,EAAQ9D,GAAG0F,MACpBA,EAAIK,OAIPklB,GAAcvuB,EAAI0J,WAEd1J,EAAI4e,UACP5e,EAAI4e,SAAS5e,EAAIW,OAAQ+E,EAAS1F,EAAIwE,KAAK,GAExCxE,EAAIqvB,WACPrvB,EAAIqvB,YAGArvB,EAAI2gB,SACJ3gB,EAAI4gB,MACP5gB,EAAI4gB,KAAKzC,WAAWkD,YAAYrhB,EAAI4gB,MAEjC5gB,EAAI6gB,MACP7gB,EAAI6gB,KAAK1C,WAAWkD,YAAYrhB,EAAI6gB,OAIvCnX,EAAa6kB,GAAeA,EAAY,IAAM7oB,EAAQqG,MAElDuO,EAAU5Q,GAAcA,EAAWglB,UACtCV,GAAaO,GAAejvB,EAAEoK,GAAa4Q,EAAS,OACpD5Q,EAAWglB,OAASvrB,QAErBK,EAAOkC,EAAQlC,KACG,SAAdA,EAAKN,KACRM,EAAKM,OAAO0e,YAAYhf,EAAKE,EAAEwG,IAAK/G,QAAW,SAExCK,GAAKE,EAAE+B,KAAKge,SAGd6L,IAAgBlT,EAAQ+S,OAIjC,QAASI,IAAQ/S,GACZA,GACHA,EAAKA,EAAGlB,OAASkB,EAAKld,EAAEkd,GACxBA,EAAGgT,KAAK,WAIP,IAHA,GAAIC,IAGIA,EAAYlK,GAAMtlB,MAAM,KAAUwvB,EAAU3rB,QACnD2rB,EAAU3rB,OAAO0e,YAAYiN,EAAU/rB,EAAEwG,IAAK/G,QAAW,EAE1D2rB,IAAM7uB,KAAKyvB,qBAAqB,QAEjCZ,GAAMtS,KAGFwI,KACH1lB,EAAE0lB,IACAjC,IAAIkC,GAAkBtJ,GACtBoH,IAAI,OAAQ,oBAAqBpH,GACnCqJ,GAAa7hB,QAEdmE,GAAQkb,cACRsM,GAAM9iB,SAASmD,KAAKugB,qBAAqB,OAQ3C,QAASC,IAAY5jB,GACpB,MAAOA,GAAK7I,OAASqc,GAAWxT,EAAKyT,IAAWzT,EAAKxG,MAyCtD,QAASgc,IAAmB1B,EAAUC,EAAU5B,EAAY1T,EAAIolB,EAAe7gB,GAE9E,GAAI1L,GAAGC,EAAG4hB,EAASoD,EAAQuH,EAAWplB,EAAQyV,EAC7C4P,EAAkB,EAClBC,EAAYlQ,IAAaC,CAE1B,IAAID,EAAU,CAGb,IADAqF,EAAUS,GAAU9F,OACfxc,EAAI,EAAGC,EAAI4hB,EAAQrhB,OAAQR,EAAIC,EAAGD,IAAK,CAI3C,GAFAilB,EAASpD,EAAQ7hB,GACjBoH,EAAS6d,EAAO9d,GACZC,IAAWD,GAAM8d,EAAOtN,KAAO4U,EAAe,CACjD,IAAI7gB,EAKH,KAHAzL,GAAI,EAMDysB,IACJF,EAA0B,MAAdvH,EAAOtN,GAChBgJ,GAAUvZ,GACVqS,GAAarS,GAAQ/E,QAAQ1F,IAC5BsoB,EAAOC,KAEVsH,EAAUjP,KAAOd,EACPwI,EAAOkE,QAEjBqD,EAAUhP,KAAOf,IAGnBgQ,GAAmBrlB,EAAO5G,OAAS,EAGhCisB,GACHjQ,EAASrT,aAAaoY,GAAY/E,EAASzT,aAAawY,IAAYje,MAAMmpB,IAE3E5P,EAASJ,EAAWA,EAAS1T,aAAawY,IAAc1G,EAAWyB,KAC/Drc,EAAI4c,EAAOxH,QAAQ,IAAMlO,EAAKolB,GAAiB,KAClD1P,EAASgF,EAAQkD,MAAMzhB,MAAM,EAAGmpB,GAAmB5P,EAAOvZ,MAAMrD,GAAKyL,KAAevE,EAAG3G,OAAS,KAE7Fqc,IACCJ,EAKHA,EAAStT,aAAaoY,GAAY1E,GAElCR,EAASxB,EAAYgC,QAKvBR,GAASxB,EAAYuK,GAAavK,EAAWyB,IAAK,IAAMnV,EAAKolB,IACxD7gB,GAAY+Q,GAEhBJ,EAASxB,EAAYuK,GAAavK,EAAWyB,IAAK,IAAMnV,EAAKolB,IAKhE,QAASnO,IAAcvB,GACtB,GAAI7c,GAAGC,EAAG0sB,EAAQ9K,CAClB,IAAIA,EAAUS,GAAUzF,GAAQ,EAAM+P,IACrC,IAAK5sB,EAAI,EAAGC,EAAI4hB,EAAQrhB,OAAQR,EAAIC,EAAGD,IACtC2sB,EAAS9K,EAAQ7hB,GACC,MAAd2sB,EAAOhV,IACLgV,EAAShM,GAAUgM,EAAOxlB,MAAQwlB,EAAO9sB,MAG7C8sB,EAAOlsB,OAAO0e,YAAYwN,EAAOtsB,EAAEwG,IAAK/G,QAAW,GAGpDwgB,GAAkBqM,EAAOxlB,IAS7B,QAASuU,IAAemR,EAAWC,GAElCD,EAAU/C,SAAW,SAASjF,EAAMkI,GAE/BlI,MAAWA,IAEdkI,EAASlI,EACTA,EAAO/kB,OAER,IAAIktB,GACH/O,EAAQhiB,EAAEW,KAAKqhB,QAKhB,OAJIA,GAAM,KACT+O,EAAWD,EAAS9O,EAAMgP,OAAOF,GAAU9O,EAC3CA,EAAQ4G,GAAQkI,EAASC,EAASE,IAAIjP,EAAMpV,KAAKkkB,IAAWC,GAEtD/O,GAGR4O,EAAU5O,MAAQ,SAASkP,EAAa3Q,EAAUC,GAKjD,GAAI3G,GACH7O,EAAOrK,KACPyjB,EAAQpZ,EAAKqW,OACb8P,GAAmB5Q,GAAY6D,EAC/BpC,IAaD,KAXAzB,EAAWA,GAAYvV,EAAKsW,KAC5Bd,EAAWA,GAAYxV,EAAKuW,KAE5B1H,EAAOsX,EACH5Q,IAAavV,EAAKuW,KAClBvW,EAAK4T,WAAWwS,YAChB7Q,EACAvV,EAAK5G,EAAEoC,UAAW,EAClB+Z,GAAYvV,EAAK5E,QAAQqG,KAAKof,WAC9BtL,GAAYA,EAAS+D,YAElBzK,KAAU2G,GAAY3G,IAAS2G,KACjC0Q,GAAe9M,GAASvK,EAAKlT,UAAYmmB,KAI5C9K,EAAM3W,KAAKwO,GAEZA,EAAOA,EAAKyK,WAEb,OAAOtC,IAGR4O,EAAUS,UAAY,SAASzI,EAAMjiB,GAEhCiiB,MAAWA,IAEdjiB,EAAUiiB,EACVA,EAAO/kB,OAGR,IAAImH,GAAOrK,KACVuD,EAAO8G,EAAK5I,KAAO4I,EAAOA,EAAK3J,OAAO6C,KACtCqc,EAAWvV,EAAKsW,KAChB8C,EAAQpZ,EAAKqW,OACblZ,IAeD,OAbAjE,GAAK9B,KACJyB,OACAmH,EAAK4T,WACLwF,EAAQ7D,GAAYA,EAAS6B,gBAAkB7B,EAC/CvV,EAAKuW,KACL1d,QACCS,KACA6D,KAAMA,EACNygB,KAAMA,EACNzmB,KAAMwE,EACNuE,GAAIF,EAAK5I,KAAO4I,EAAK5G,EAAE8G,GAAK,IAAMF,EAAKkX,MAAQ,OAG1C/Z,GAGRyoB,EAAUnhB,QAAU,SAAS8M,GAC5B,GAAIkE,GAASrY,EACZ1H,EAAMC,KACNyF,EAAU1F,EAAI0F,QACdlC,EAAOxD,EAAIW,OAAO6C,IAgBnB,OAdIxD,GAAI4wB,UAAYlqB,EAAM,eACNvD,SAAhB0Y,IACHA,EAAcjZ,GAAKgY,KAAK5a,EAAKwD,EAAMA,EAAKwB,KAAMwZ,GAAUxe,IAAM,IAE3D6b,EAAc,KAAOA,IAEpB7b,EAAI4e,UACP5e,EAAI4e,SAAS5e,EAAIW,OAAQ+E,EAAS1F,EAAIwE,KAEvCkD,EAAO1H,EAAI0D,EAAEoC,OAAS0D,GAAQ9D,EAAQgC,MAAQwV,GAAYld,EAAIke,YAAY,GAC1E6B,EAAUf,EAAcnD,EAAanW,EAASgC,EAAM1H,IAGrD0e,GAAc1e,GACP+f,GAAW/f,GAGnBkwB,EAAUW,OAAS,SAAStrB,GAC3B,GAAImE,GAAazJ,KAAKyJ,UAClBA,IACHiS,GACC/Z,OAAQ8H,EAAW,IACjBvG,OAAWoC,IAIZ4qB,EAEHD,EAAUY,UAAY,WACrB,GAAI/kB,GAAO9L,KAAKie,WACf6S,EAAczxB,EAAE0xB,QAAQjlB,IAASzM,EAAE2xB,MAAMllB,GAAMmlB,OAC/CC,EAAwB,eAErBJ,IAAeA,EAAYI,IAE9B7xB,EAAEyM,GAAMqlB,eAAeD,EAAuB9wB,aAMhD6vB,EAAU3N,SAAW,SAASve,EAAOqtB,GAEpC,GAAOC,GACNhnB,EAAOrK,KACPsxB,EAAaF,EAAUxtB,OACvBT,EAAQkH,EAAKlH,OAETkH,EAAK5G,EAAEC,QAAU4tB,IAErBD,EAAaluB,EAAMS,OAAS0tB,EAExBD,IAAehnB,EAAK1E,KAAK/B,QACxByf,GAAchZ,EAAMtG,EAAOsG,EAAKtF,KAAM5B,EAAOiuB,EAAW/mB,EAAK9F,QAAS,IACrE8F,EAAK5G,EAAE4e,KACXhY,EAAKoY,SAAS1e,EAAQutB,MAM1BrB,EAAU1N,YAAc,SAASxe,EAAOutB,EAAYC,EAAWC,GAI9D,QAASC,GAAW1tB,GACnB,GAAIwG,GAAIiZ,EAAQvF,EAAY2B,EAAUC,EAAUE,EAC/C2R,EAAevuB,EAAMY,EAEtB,IAAI2tB,GAAgBA,EAAajwB,KAAM,CAwBtC,GAvBA8I,EAAKmnB,EAAajuB,EAAE8G,GACfgnB,IAEJxR,EAAgB2R,EAAarQ,SAI9BqQ,EAAanP,YAAYrf,OAAWA,QAAW,GAE/CwuB,EAAazuB,KAAOC,OACpB0c,EAAW8R,EAAa/Q,KACxBd,EAAW6R,EAAa9Q,KACxB3C,EAAayT,EAAazT,WAErBsT,IAEAG,EAAahR,QAGhBY,GAAmB1B,EAAUC,EAAU5B,EAAY1T,EAAI,KAExDlL,EAAE0gB,GAAe4B,WAEb+P,EAAahR,OACjB,IACCd,EAAS1B,WAAWkD,YAAYxB,GAChCC,EAAS3B,WAAWkD,YAAYvB,GAC/B,MAAOze,IAEVshB,GAAmBgP,EACnB,KAAKlO,IAAUkO,GAAajuB,EAAE+B,KAC7Bke,GAAkBF,SAEZO,IAAUxZ,IAInB,GAAIyJ,GAASzQ,EAAM8tB,EAClBhnB,EAAOrK,KACPsK,GAAWD,EAAK5G,EAAEC,OAClBP,EAAQkH,EAAKlH,KAKd,IAHImH,IACH+mB,EAAaluB,EAAMS,QAENV,SAAVa,EAEH,GAAIuG,EAAS,CAGZ,IADA0J,EAAUqd,EACHrd,KACNyd,EAAWzd,EAEZ3J,GAAKlH,aACC,CAEN,IAAKI,IAAQJ,GAEZsuB,EAAWluB,EAEZ8G,GAAKlH,aAcN,IAXmBD,SAAfouB,IACChnB,EAGHgnB,EAAa,GAGbG,EAAW1tB,SACJZ,GAAMY,KAGXuG,GAAWgnB,IACVE,GAAUH,EAAaC,IAAejnB,EAAK1E,KAAK/B,QAAS,CAG7D,IAFAoQ,EAAUjQ,EAAQutB,EAEXtd,KAAYjQ,GAClB0tB,EAAWzd,EAEZ7Q,GAAMwH,OAAO5G,EAAOutB,GACfjnB,EAAK5G,EAAEkuB,MACXtnB,EAAKoY,SAAS1e,KAMlBksB,EAAUnhB,QAAU,WACnB,GAAIzE,GAAOrK,KACV6D,EAASwG,EAAKxG,MAEXA,KACHwf,GAAchZ,EAAMA,EAAKtG,MAAOsG,EAAKtF,KAAMlB,EAAOV,MAAOkH,EAAK1E,KAAMzC,QAAW,GAC/Ewf,GAAmBrY,KAIrB4lB,EAAUxN,SAAW,SAASmP,GAI7B,IAFA,GAAIzuB,GAAQnD,KAAKmD,MAChBY,EAAQZ,EAAMS,OACRguB,EAAY7tB,KACdZ,EAAMY,GAAOA,QAAUA,GAC1B8K,GAAY1L,EAAMY,IAAQsL,YAAY,QAAStL,IAMlDksB,EAAUxuB,KAAOmkB,IAkCnB,QAASiM,IAAkB7wB,GAC1B,MAAOhB,MAAKU,OAAO6C,KAkQpB,QAASuuB,IAAa/oB,EAAK4S,EAAIa,GAC9B,GAAyB,QAArBA,EAAUc,OAAkB,CAG/B,IAFA,GAAI3b,GAASoH,EAAIM,IAChBhG,EAAI1B,EAAOiC,OACLP,KACF1B,EAAO0B,GAAG4G,MAAQuS,EAAU3G,OAI7BxS,OACCmZ,EAAU3G,OAAS2G,EAAUmF,QAChC9S,GAAYlN,GAAQowB,QAAQ9nB,IAAKuS,EAAU3G,KAAMlV,KAAM6b,EAAUlX,QAExDkX,EAAUmF,OACpB9S,GAAYlN,GAAQggB,OAAOte,GAE3BwL,GAAYlN,EAAO0B,IAAIgM,YAAY,OAAQmN,EAAUlX,QAKxD,QAAS0sB,IAAmBjpB,EAAK4S,EAAIa,GACpC,GAAInM,GACHzO,EAASmH,EAAII,IACbmU,EAASd,EAAUc,MAEL,SAAXA,EACoB,SAAnBd,EAAU3G,KACbhH,GAAYjN,GAAQyN,YAAYsM,EAAGha,OAAOsI,IAAKuS,EAAUlX,QAEzDuJ,GAAYjN,GAAQqwB,eAAezV,EAAUe,UAC7C1O,GAAYjN,GAAQyN,YAAYmN,EAAUlX,MAAOqW,EAAGha,OAAOhB,OAEvC,WAAX2c,GACVjN,EAAOmM,EAAU4F,MAAM,GACvBvT,GAAYjN,GAAQqwB,eAAe5hB,EAAKpG,WACjCrI,GAAOyO,EAAKpG,MACE,WAAXqT,IACVjN,EAAOmM,EAAU4F,MAAM,GACnB/R,EAAKpG,KACR4E,GAAYjN,GAAQyN,YAAYgB,EAAKpG,IAAKoG,EAAK1P,OAKlD,QAASuxB,IAAmBrb,GAC3B,MAAOA,GAAQ4B,QAAQ,KAAO,EApiM/B,GAAI0Z,IAAa9yB,KAAM,CAIvB,IAFAA,EAAIA,GAAKD,EAAOE,QAEXD,IAAMA,EAAE2F,GAEZ,KAAM,yBAGP,IAECotB,IAAc1vB,GAAmB2E,GAASpF,GAAQowB,GAAUxjB,GAAaN,GAGzEjO,GAAa0B,GAAUkD,GAAY2E,GAAarF,GAAU6G,GAAO1I,GAAMT,GAAcwN,GAAsB5M,GAAgBR,GAAgBC,GAAgBC,GAAiBC,GAAiBL,GAAUkwB,GASvMlhB,GAdGmhB,GAAgB,UAOnB1Z,GAAQ,+GAGRG,GAAU,4OAKVrG,GAAW,sBACXmB,GAAkB,YAClBhH,GAAgB,UAChBuH,GAAa,6EACbN,GAAc,QACdlE,GAAa,cACb2iB,GAAc,iBACdhX,GAAU,iBACV3a,GAAe,4BACf6I,GAAuB,0BACvB+R,GAAc+W,GACdhoB,GAAS,EACTwQ,IACCyX,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,KAAQ,OACRC,IAAK,QACLC,IAAK,QACLC,IAAK,QACLC,IAAK,SAENzpB,GAAO,OACPkH,GAAS,SACTrE,GAAW,gBACXC,GAAU,UACV5B,GAAW,8CACXsC,MAEAkmB,GAAM7zB,EAAO8zB,SACbC,GAAUF,IAAO5zB,IAAMA,EAAEkJ,OAEzByC,IACCzD,UACCgJ,QAAS9E,GAEV1L,KACCwQ,QAAStF,GAEVqD,WACCiC,QAAShD,GAEVrJ,UACAkB,aAkhEF,IA9gECnD,IACCmxB,QAASb,GACTc,KAECtpB,KAAMA,EACNoI,IAAK7Q,EACLsL,OAAQA,EACRwB,MAAOgG,EACPpF,OAAQtN,EACRyE,UAAWA,EACXmtB,UAAWxhB,EACXxB,WACAK,WAAYA,EACZ4iB,UACC1f,WAAW,GAEZ2f,OAAQhzB,EACRouB,KAAMnuB,EACNmF,IAAK,aACLgZ,MAAOzZ,EACPwV,KAAM1T,EACNb,IAAKK,EACLgtB,KAAMxhB,EACNyhB,MAAOpY,EACP7W,IAAK1D,EACL4yB,IAAK,SAASxJ,GAIb,MAHc,gBAAVA,GACHrY,EAAY,IAENqY,IAGToJ,UACCpxB,WAAYN,EACZ+xB,SAAU,SAAStuB,GAClB,MAAOA,IAEJ5D,EAAQgO,GAAsBpK,GAC9B3C,GAAK6wB,SACL1wB,IAEC4M,KAGN9K,OAAQ7D,EACRgI,IAAKH,IA2ENtH,EAAagK,UAAY,GAAIuoB,QAAStoB,YAAcjK,EAoGrDwC,EAAe6C,QAAU,WACxB,OAAQ3G,KAAK2D,IAAI,QAAS,UAO3BK,EAAS2C,QAAU,QAiXnBoD,EAAKuB,WACJ3H,IAAKZ,EACLiB,SAAUA,EACViB,OAAQ4B,EACR4B,QAAS3D,EACTgY,IAAK7Y,EACLoE,IAAK,QAg7CN1F,GAAOV,GAAOoxB,IACdvwB,GAAiBb,GAAOsxB,WAElBN,IAAO5zB,GAAKA,EAAEkJ,QAAS,CAE5B,IAAK6pB,KAAgBpnB,IACpBkF,EAAckiB,GAAcpnB,GAAUonB,IAGvCvoB,IAAc5H,GAAOsY,WACrB/V,GAAWvC,GAAO8P,QAClB1G,GAAQpJ,GAAOuF,KAEf7E,GAAKiD,IAAI0F,WACRjK,UAAWA,EACXgF,QAASE,GAGVc,GAAU1E,GAAK0E,QAAU,GAAI0C,GAGzB1K,GAKHA,EAAE2F,GAAGuD,OAAS4S,EACd5M,GAAWlP,EAAEy0B,QACTz0B,EAAE8P,aACLzN,EAAQiB,GAAMtD,EAAE8D,MAAMkwB,KACtBpxB,GAAO8G,IAAM1J,EAAE8D,MAAM4F,OAOtB1J,KAEI8yB,KACH/yB,EAAO8zB,SAAW7zB,GAKnBA,EAAE00B,WAAa10B,EAAE20B,UAAY30B,EAAEkR,QAAU,WAAa,KAAM,kDAG5DlR,EAAE6N,WAAa,SAASY,GACvB,MAAqB,kBAAPA,IAGfzO,EAAEiL,QAAU2pB,MAAM3pB,SAAW,SAAS4pB,GACrC,MAAmC,sBAAhB,SAAE/mB,KAAK+mB,IAG3BvxB,GAAKwxB,IAAM,SAASC,GACfA,IAAO/0B,IACVqC,EAAQ0yB,EAAI/0B,GACZA,EAAI+0B,EACJ/0B,EAAE2F,GAAGuD,OAAS4S,QACP9b,GAAE6zB,SACT3kB,GAAWlP,EAAEy0B,UAIfz0B,EAAE6zB,SAAWX,IAEdrwB,GAAeS,GAAK4wB,SACpBrxB,GAAa2R,WAAY,EACzBvT,GAAcjB,EAAE6N,WAChB7N,EAAEkJ,OAASwE,GACX1N,EAAE8D,MAAQlB,GACV5C,EAAEuK,UAAY1E,GAAajD,GAAO2H,SAElC,KAAK0oB,KAAWpwB,IACfyO,EAAW2hB,KAGXxvB,GAAe8X,UAAY,SAASA,GACpC,MAAqB1X,UAAd0X,EACJ1Y,GAAa0Y,WAEd1Y,GAAa0Y,UAAYA,EACzB1Y,GAAamD,QAAUuV,EAAY,KAAOA,EACvC,GAAIrL,UAAS,GAAI,WAAaqL,EAAY,MAC1Cta,GAAYsa,GACXA,EACA1X,OACJJ,OACA,GAEH4M,GAAuBxN,GAAa0xB,UACnCviB,UAAU,EACVsG,MAAM,GAKPtM,IACCgpB,MACC9rB,OAAQ,SAASvH,GAKhB,GAAIqJ,GAAOrK,KACVU,EAAS2J,EAAK3J,OACdZ,EAAOuK,EAAKnB,UAAUorB,OAAStzB,IAAQZ,UAAUwD,SAAWlD,EAAOqD,OAChE,IACCsG,EAAKnB,UAAUorB,MAAO,EAAMjqB,EAAK4X,SAAWvhB,EAAOqD,MAGrDrD,EAAO6H,OAAO7H,EAAO6C,MAAM,GAC9B,OAAOzD,IAERoG,MAAM,GAEPquB,OACChsB,OAAQ,SAASvH,GAGhB,GACCsE,GADGkvB,GAAap0B,UAAUwD,OAE1ByG,EAAOrK,KACPU,EAAS2J,EAAK3J,OACdyQ,EAAS,GACTmjB,EAAO,CAaR,OAXKjqB,GAAKnB,UAAUorB,OACnBhvB,EAAQkvB,EAAY9zB,EAAO6C,KAAKoC,KAAO3E,EACzBkC,SAAVoC,IACH6L,GAAUzQ,EAAO6H,OAAOjD,EAAOkvB,GAC/BF,GAAQtyB,GAASsD,GAASA,EAAM1B,OAAS,IAEtCyG,EAAKnB,UAAUorB,KAAOA,KACzBjqB,EAAK4X,SAAWvhB,EAAOqD,QAIlBoN,GAERjL,MAAM,GAEPtF,OACCuK,QAAS,MACTvC,QAASA,EAAQsS,GACjBhV,MAAM,GAEPuuB,SACCvuB,MAAM,GAEPwuB,KAECnsB,OAAQxH,EACRmF,MAAM,GAEPyuB,MAECpsB,OAAQxH,EACRmF,MAAM,GAEP0uB,IAAKpwB,GAASowB,IAAM/qB,GAAY+qB,IAAM3zB,IAGvC4I,IACCC,KAAMwR,EACN7T,KAAM6T,EACNuZ,IAAK,SAAStZ,GAEb,MAAerY,SAARqY,EAAoBuZ,UAAU,GAAKvZ,GAAiB,OAATA,EAAgBA,EAAO,MA2B5E,GAtBArZ,GAAeS,GAAK4wB,SACpBvxB,IAAY3C,GAAG4zB,IAAK3oB,QACpBxH,GAAeX,WAAW,KAAM,KAAM,KAElCgxB,IACHF,GAAI9vB,MAAMkwB,IAAIc,IAAI90B,GAYnB4C,GAAS5C,EAAE8D,MACXR,GAAOV,GAAOoxB,IACd/yB,GAAcjB,EAAE6N,WAChBlL,GAAW3C,EAAEiL,QACbiE,GAAWlP,EAAEy0B,SACRz0B,EAAE01B,QAAS,CAEf,GAAIC,IAAgB31B,EAAE41B,MAAMC,QAC3BxuB,MAAWA,MACXiE,MAAYA,OACZoE,MAAYA,OACZomB,GAAW9V,SACX+V,GAAY,OACZjG,GAAoBxsB,GAAK0yB,SAAW1yB,GAAK0yB,UAAY,iBACrDtS,GAAiBpgB,GAAK2yB,QAAU3yB,GAAK2yB,SAAW,cAChDjG,MACAkG,GAAapG,GAAoB,WACjCqG,GAAgB,EAChBC,GAAe,EACfC,GAAoB,EACpBC,GAAWt2B,EAAE0xB,QACb6E,GAAQv2B,EAAEsG,KACVgc,MAIDkU,GAAW,SAASC,GACnB,MAAOA,GAAGC,KAAOD,EAAGC,MAAS,OAASN,MAGvCO,GAAmB,SAASC,EAAItwB,GAG/B,MAFA3F,MAAKgxB,MAAQrrB,EACb3F,KAAKk2B,IAAMD,EACJj2B,MAGRm2B,GAAkB,SAASF,EAAItwB,GAG9B,MAFA3F,MAAKgxB,MAAQrrB,EACb3F,KAAKk2B,IAAMD,EACJj2B,MAGRo2B,GAAY,SAASzwB,GACpB,MAAO3D,IAAS2D,IACZA,GACDA,GAGJ0wB,GAAqB,SAASjhB,EAAO5R,EAAM8yB,GAC1ClhB,EAAQA,EACLpT,GAASoT,GACRA,GACCA,KAGL,IAAIhS,GAAGyS,EACNkB,EAASvT,EACT+yB,EAAUxf,EACV1T,EAAI+R,GAASA,EAAMxR,OACnB4yB,IAED,KAAKpzB,EAAI,EAAGA,EAAIC,EAAGD,IAClByS,EAAOT,EAAMhS,GACT9C,GAAYuV,GACf2gB,EAAMA,EAAIznB,OAAOsnB,GAAmBxgB,EAAK1I,KAAK3J,EAAMA,EAAM8yB,GAAW9yB,IAE3D,GAAKqS,IAASA,GAOrB0gB,IAAYxf,GACfyf,EAAI9rB,KAAKqM,EAASwf,GAEnBC,EAAI9rB,KAAKmL,KATRrS,EAAO+yB,EAAU1gB,EACb0gB,IAAYxf,GACfyf,EAAI9rB,KAAKqM,EAASwf,GASrB,OAAOC,IAGRC,GAAmB,SAASC,EAAYC,GAEvC,IAAK,GAAIb,KAAMY,GACd,aAEMrH,IAAgBsH,IAGxBC,GAAqB,SAASjb,EAAIa,GACjC,QAASqa,GAAK71B,GACb,aAAcA,KAAQyP,KAAW2E,EAAM,IAAM0hB,GAAc90B,GAAShB,IAGrE,IAAM2a,EAAGhW,OAAQgW,EAAGhW,KAAKmd,IAAM,CAE9B,GAAIjM,GAASwZ,EAAQ0G,EACpBxZ,EAAWf,EAAUe,SACrBjY,EAAQkX,EAAUlX,MAClBf,EAAMoX,EAAGhW,KACTqxB,EAAazyB,EAAIyyB,WACjBlB,EAAKvxB,EAAIuxB,GACTgB,GAAchB,EAAG9J,QACjB5W,EAAQ7Q,EAAI6Q,MACZ6gB,EAAK1xB,EAAI0xB,EAENta,GAAG1Y,OAAS8f,IACd+S,EAAGmB,OAASnB,GAAI3oB,KAAK5I,EAAKoX,EAAIa,GAErBjY,EAAI5D,OAAS6b,EAAU3G,MAAqB,MAAbtR,EAAI5D,OACzCq2B,GACHngB,EAAUmgB,EAAWE,MAAQ,IAAM1a,EAAU3G,KAC7Cwa,EAAS2G,EAAW3G,OACpB0G,GAAapb,EAAGha,QAAQoN,OAAOioB,EAAWhuB,WAEtC6tB,EAAKtZ,IACR4Z,GAAcL,EAAYb,GAAK1Y,GAAWnI,EAAO0gB,GAAI,EAAMzF,GAAS0G,GAAYlgB,GAE7EggB,EAAKvxB,IACR6xB,GAAcL,EAAYb,GAAK3wB,GAAQ8P,EAAO0gB,EAAI5yB,OAAWmtB,GAAS0G,GAAYlgB,KAG/EggB,EAAKtZ,IACR4Z,GAAcL,EAAYb,GAAK1Y,GAAWnI,EAAO0gB,GAAI,GAElDe,EAAKvxB,IACR6xB,GAAcL,EAAYb,GAAK3wB,GAAQ8P,EAAO0gB,IAGhDvxB,EAAIuxB,GAAGna,EAAIa,MAKd2a,GAAgB,WAEf,GAAIzxB,GAAOqJ,GAAO5O,SAAUC,UAC5B,OAAOiyB,IAASlyB,MAAMuF,EAAK8M,QAAS9M,IAGrC0xB,GAAc,SAAStB,EAAIzF,EAAQgH,GAClCL,GAAWh3B,KAAKk2B,IAAKl2B,KAAKgxB,MAAO8E,EAAIzF,KAAY,OAAQgH,IAG1DC,GAAgB,SAASxB,EAAIzF,GAC5B+G,GAAYjqB,KAAKnN,KAAM81B,EAAIzF,GAAQ,IAGpC2G,GAAa,SAASO,EAAWxgB,EAAQ+e,EAAIzF,EAAQ0G,EAAWlgB,EAASwgB,EAAWG,GACnF,QAASC,GAAkBnqB,EAAKoqB,GAG/B,IAFAr0B,EAAIiK,EAAI1J,OACR+zB,EAAa9gB,EAAU,KAChBxT,KACNu0B,EAAoBtqB,EAAKjK,EAAGq0B,EAAO,GAIrC,QAASE,GAAoB1D,EAAKvzB,EAAM+2B,EAAOG,GAC9C,GAAIC,GAAWC,CACXp3B,KAAS4N,KACRupB,EAAYjpB,GAAYmpB,MAAML,EAAYzD,EAAIvzB,GAAOs3B,EAAe5H,MACvE0H,EAAeE,EAAcvxB,QACzBmxB,GAAeK,GAAcH,EAAa,KAAOG,GACpDH,EAAapzB,QAAQuzB,GAEtBlB,GAAWO,EAAWO,EAAWhC,EAAIzF,IAAWwH,EAAc30B,OAAY,GAAI60B,EAAcJ,EAAYD,EAAOF,IAMlH,QAASW,GAAUxc,EAAIa,GAItB,OAFA3F,EAAU8E,EAAGhW,KAAKqxB,WAAWE,MAC7BgB,EAAavc,EAAGha,OACR6a,EAAUc,QACjB,IAAK,SACJma,EAAkBjb,EAAU4F,MAC5B,MACD,KAAK,SACJqV,EAAkBjb,EAAU4F,OAAO,EACnC,MACD,KAAK,MACJuV,EAAa9gB,EAAU,IAAM2F,EAAU3G,KACvC+hB,EAAoBpb,EAAW,YAAY,GAC3Cob,EAAoBpb,EAAW,SAEjC0b,EAAah1B,OACb4yB,EAAG31B,MAAMH,KAAMI,WAGhB,GAAIiD,GAAG+0B,EAAUT,EAAYM,EAAeC,EAAYG,EACvDC,GAAed,GAAUA,EAAOe,KAAOlB,CAExC,IAAItgB,SAAiBA,KAAWtG,GAAQ,CAGvC,GAFAwnB,GAAiBlhB,GAAQhI,OAAOgoB,GAChCqB,EAAWp2B,GAAS+U,GAAU,GAAK,IAC/BygB,GAAUc,GAAe3C,GAAS5e,IAAWygB,EAAOa,EAAOzC,GAAM7e,GAAQshB,MAE5E,WADAb,GAAOa,IASR,IAJKb,IACJA,GAAUe,GAAIlB,IAGXvB,GAEH,GAAIsC,GAAuB,IAAX/H,EAOf,GAFA8H,EAAUpC,KAAOF,GAASC,GAEtBwC,EACHjG,GAASkF,EAAWxgB,EAAQqhB,EAAUD,EAAWd,EAAWhH,EAAQ4H,EAAephB,GACnFwhB,EAAOzC,GAAM7e,GAAQshB,KACrBb,EAAOa,IAASb,EAAOa,IAAS,GAAK,MAE/B,CACN,KAAMb,EAAO5B,GAAM7e,GAAQshB,MAG1B,MAEDhG,IAASkF,EAAWxgB,EAAQqhB,EAAUD,EAAWd,EAAWhH,EAAQ4H,EAAephB,QAKjF2gB,KACHA,EAAO5B,GAAM7e,GAAQshB,MAAQ,GAE9BhG,GAASkF,EAAWxgB,EAAQqhB,EAAUl1B,OAAWm0B,EAAWhH,EAAQ4H,EAAephB,EAGpF,IAAIuhB,EAGH,IAAK/0B,IAAK0T,GACT4gB,EAAa9gB,EAAU,IAAMxT,EAC7Bu0B,EAAoB7gB,EAAQ1T,EAAGg0B,OAGhCI,GAAkB1gB,EAAQsgB,KAK7BmB,GAAgB,SAAS3hB,GACxB,MAAOA,GAAQ4B,QAAQ,KAAO,GAAK5B,EAAQ4B,QAAQ,KAAO,GAG3DggB,GAAa,WAEZ,SADG/tB,KAAKyC,KAAK/M,WAAW,GACjBiyB,GAASlyB,MAAMH,KAAMI,WAG7BiyB,IAAW,WAGV,QAASqG,KAER,QAASC,GAAapB,EAAWqB,EAASC,EAAgB/V,GACzD,GAAIlV,GAAGkrB,EACNC,EAAcpD,GAAS5e,GACvBiiB,EAAe5C,GAAUrf,GACzBkiB,EAAUlC,EACVmC,EAASriB,CAIV,IAFA0gB,EAAY4B,EAAY5B,EAAY,IAAM4B,EAAY5B,GAEjDF,IAAcvU,GAAO+V,GAKzB,IAJA5H,EAAS8H,GAAe15B,EAAE2xB,MAAMja,GAChCka,EAASA,GAAUA,EAAOA,OAC1BA,EAASA,GAAUA,EAAO4H,EAAiB9V,GAAiBoM,IAC5DiK,EAAKnI,GAAUA,EAAOrtB,OACfw1B,KAEN,GADAzzB,EAAOsrB,EAAOmI,IAAOnI,EAAOmI,GAAIzzB,KAC5BA,IAASmd,GAAOnd,EAAKswB,KAAOkD,IAE3BrW,GAAOnd,EAAKswB,KAAOkD,GAAaxzB,EAAKmwB,IAAMnwB,EAAKmwB,GAAGC,OAASO,EAASP,MAGzE,MAICsB,IAAavU,EAChBzjB,EAAE25B,GAAclW,IAAIyU,EAAWX,KAE/BkC,EAASD,MAEPQ,SAAUxjB,EACVT,MAAOwjB,GAAWA,MAClBj4B,KAAMA,GAERm4B,EAAO7C,GAAKkD,EACZL,EAAOhD,GAAKQ,EAERzf,IAEHiiB,EAAO9B,YACNE,MAAOgC,EACPrjB,KAAM,WAEL,MADAjI,GAAIqrB,EAAQr1B,OACLs1B,EAAOrsB,QAAQ,QAAS,SAASkG,GAEvC,MADAnF,KACe,MAARmF,EACJ,IAAM1T,EAAE6iB,QAAQ+W,EAAQrrB,EAAI,GAAIqrB,EAAQrrB,IACxC,OAGL5E,QAAS,WACR,MAAOiwB,IAER5I,OAAQA,IAGVhxB,EAAE25B,GAAchW,GAAGuU,EAAW,KAAMuB,EAAQlC,IACxCF,IAEHA,EAAWd,GAAM7e,GAAQshB,MAAQzC,GAAM7e,EAAQ,OAAQye,OAAoBze,IAK9E,QAASuiB,GAAW7c,GAMnB,GAAI8c,GAAS/1B,CAKb,OAFAiZ,GAAO3O,GAAK4O,EAAUD,EAAQ8c,GAEvB9c,EAAOqZ,GAAK,SAASna,EAAIa,GAC/B,GAAI0X,GAAMzX,EAAO3O,GAChBulB,EAAM5W,EAAO7E,GACb4hB,EAAS9c,EAAUD,EAAQ8c,EAExBC,KAAWtF,UACHA,KAAQzjB,KAClBgpB,EAAUvF,GAAK,IACXb,GAAOyD,GAAc90B,GAASkyB,KACjCwE,GAAcxE,GAAMb,EAAKiD,EAAU5Z,GAAW,IAGhDD,EAAO3O,GAAK0rB,QAEDA,KAAW/oB,KACrBgpB,EAAUD,IACNnG,GAAOyD,GAAc90B,GAASw3B,KAEjCd,GAAcc,GAASnG,EAAKiD,EAAU5Z,KAKzC4Z,EAAS3a,EAAIa,IAIf,QAASid,GAAUnsB,EAAKosB,EAAQpvB,EAASqvB,GACxC,GAAI7C,EAAY,CAEf,GAAI8C,GAAU7iB,EACb8iB,EAAchjB,CAEfE,GAASzJ,EACLqsB,IACH5iB,EAASzJ,EAAIqsB,GACb9iB,GAAW,IAAM8iB,GAEdtJ,GAAUtZ,IACbA,EAASlI,GAAYmpB,MAAMnhB,EAASE,EAAQ4iB,GAAWrsB,GAAKyB,OAAOgoB,GAAaA,EAAW1G,IAExFtZ,IAAWzM,GAAWtI,GAAS+U,KAClC4hB,EAAa5V,GAAiB,YAAcuT,EAAWT,GAASS,GAAY,IAAKpzB,QAAW,EAAMw2B,GAEnG3iB,EAAS6iB,EACT/iB,EAAUgjB,GAIZ,GAAIz2B,GAAG02B,EAAGnQ,EAAMnU,EAAO7U,EAAMkV,EAAMkkB,EAAK1C,EAAWf,EAAUpH,EAAM8K,EAAMZ,EAAIzzB,EAAMsrB,EAAQvU,EAAWud,EACrG7X,EAAOsU,EAAYrM,EAAO6P,EAASnD,EAAWlgB,EAASwZ,EAAQ8J,EAAWC,EAC1EnE,EAAKV,GACLngB,EAAgB,GAARpV,KACL+O,GAAO5O,SAAUC,WAEjBsG,GAAMyG,KAAK/M,WACdi6B,EAAUjlB,EAAMjB,QAAS,EACzB3Q,EAAO4R,EAAM5C,QACbuE,EAASvT,EACTH,EAAI+R,EAAMxR,MAyBX,IAvBIy2B,EAAU,KAAOA,IACpBxjB,EAAUwjB,EACVtD,EAAY3hB,EAAMjB,MAClBkc,EAASjb,EAAMjB,MACfkmB,IAAYjlB,EAAMjB,MAClB9Q,GAAK,GAEFg3B,MAAcA,IACjBhD,EAAYgD,EACZA,EAAUjlB,EAAM/R,EAAE,GAClBg3B,GAAUh3B,GAAKg3B,EAAU,KAAOA,GAAaA,IAAW/5B,GAAY+5B,GAAiCn3B,QAApBG,IAAK+R,EAAMjB,OACxFkjB,IAAch0B,GAAK/C,GAAYkD,KAClC62B,EAAU72B,EACVA,EAAON,SAGTozB,EAAW+D,EACPh3B,GAAK/C,GAAY8U,EAAM/R,EAAI,MAC9B42B,EAAiBvd,EAAY4Z,EAC7BA,EAAWlhB,EAAMjB,MACjB9Q,MAGGg0B,IAAaf,GAAaA,EAASP,KAAvC,CAkBA,IAbAE,GAAMK,GACD0D,EAAO1D,EAASgE,OAAS,GAAKjD,EAC/Bf,EAASP,KAAOiE,GACf9K,EAAO2G,GAASS,IAAa0D,GAC/B,GAEC9K,IAASmI,IACZX,EAAarH,GAAgBH,GAAQG,GAAgBH,QAGtDiL,EAAYhB,GAAaA,EAAUoB,MAAMnF,MAAe,IACxDgF,EAAeD,EAAUv2B,OAElBw2B,KAAgB,CAUtB,GATAjB,EAAYgB,EAAUC,GAClB52B,IAASqS,EAAOT,EAAM,IAAKS,GAAQA,EAAO,KAAOA,KAChD7T,GAASwB,GACZi2B,EAAUj2B,EAAM6zB,GAAW,GACjBA,GAEVsB,EAAa1C,EAAI,KAGfoB,IAAch0B,IAAMG,EACvB,IAAKs2B,IAAKzK,IAAiB,CAC1ByK,EAAIzK,GAAgByK,EACpB,KAAKn0B,IAAQm0B,GACZ/iB,EAAS+iB,EAAEn0B,GACP3D,GAAS+U,GACZ0iB,EAAU1iB,EAAQsgB,EAAWA,GAG7BsB,EAAa1C,EAAI,IAMrB,IADA5L,EAAQ,EACHjnB,EAAI,EAAGA,EAAIC,EAAGD,IAElB,GADAyS,EAAOT,EAAMhS,GACA,KAATyS,EAAJ,CASA,GANIA,GAAQA,EAAKpR,MAChBiY,EAAY/Z,GAAKspB,MAAMpW,EAAK,IAC5B2kB,EAAWh3B,EAAOqS,EAAK,GAAGlQ,KAC1BkQ,EAAOA,EAAK,IAEbkB,EAASvT,EACL,GAAKqS,IAASA,EAAM,CAqBvB,GAbAL,EAAQK,EAAK8C,MAAM,KACfnD,EAAM,KAGT6U,EAAQ7U,EAAM,GAAGmD,MAAM,KAAK/U,OAC5BiS,EAAOL,EAAMoD,KAAK,KAClByR,EAAQxU,EAAK8C,MAAM,KAAK/U,OAASymB,GAG9B3N,IACH0F,EAAQ1F,EAAU7G,EAAMrS,EAAM6mB,GAC9B3N,EAAYud,GAET7X,EAAO,CAGV/e,GAAK+e,EAAMxe,OAAS,EACpB+G,GAAOxK,MAAMiV,GAAQhS,IAAK,GAAG2L,OAAOqT,GACpC,UAED5M,EAAQK,EAAK8C,MAAM,SAEdrY,IAAYuV,KACZA,GAAQA,EAAK8B,MAGhBuiB,EAAU7C,EAAYxhB,EAAKigB,GAAKwD,EAAWzjB,GAC3CqkB,EAAQlO,SAAW8K,EAEnBoD,EAAQnE,KAAOO,EAASP,KAExBmE,EAAQI,MAAQJ,EAAQI,OAAS,QAAU5E,MACvC7f,EAAK/P,KAAO+P,EAAK0C,KAAO1C,EAAK0C,IAAI3U,SAAWiS,EAAK+B,KAGpD8gB,GAAc3hB,GAASlB,EAAKA,MAAO2kB,GAAW3kB,EAAK0C,IAAK2hB,EAASxd,EAAW2a,GAEzExhB,EAAK+B,IACR8gB,GAAc7iB,EAAK/H,IAAK+H,EAAK+B,GAAI0e,EAAU5Z,EAAW2a,GAEvDxhB,EAAO2kB,EACPzjB,EAAS7T,QAET6T,EAASlB,GAGXL,GAAShS,EAAOqS,EAEjB,MAAOkB,GAAqC7T,UAA1BvC,EAAO6U,EAAMhD,UAC9B,SAAWuE,KAAWtG,GAAQ,CAC7B,GAAI,GAAK9P,IAASA,EAAM,CACvB,GAAa,KAATA,EACH,QAED,IAAK6U,EAAM5R,OAASymB,EAAQ,IAAOtT,EAAOlL,SAAU,CAEnD,IAAKwrB,IAAcpG,EAAS0E,GAAS5e,IAAW1X,EAAE2xB,MAAMja,IAAU,CAKjE,IAJAka,EAASA,EAAOA,OAChBA,EAASA,GAAUA,EAAO9B,IAC1BiK,EAAKnI,GAAUA,EAAOrtB,OACtB+lB,EAAO,EACAyP,KACNzzB,EAAOsrB,EAAOmI,GAAIzzB,MACdA,GACAA,EAAKswB,KAAOkD,GACZxzB,EAAKmwB,GAAGC,OAASO,EAASP,MAC1BpwB,EAAKmwB,GAAGwE,QAAUhE,EAASgE,OAC1B30B,EAAKhF,OAASA,GAAsB,MAAdgF,EAAKhF,MAA8B,OAAdgF,EAAKhF,QAChDm5B,EAAItkB,EAAMoD,KAAK,OAClBjT,EAAKyP,MAAM1K,KAAKovB,GAGjBnQ,IAGF,IAAIA,EAAM,CAET5S,EAASA,EAAOpW,EAChB,WAGF,GAAa,MAATA,GAAyB,OAATA,EAAe,CAKlC,IAJK02B,GAAapG,GAAUA,EAAOrtB,QAElC+0B,EAAa1C,EAAI,IAAI,GAAO,GAEhB,MAATt1B,EAAc,CACjBg4B,EAAa1C,EAAI,GACjB,KAAK6D,IAAK/iB,GAEL+iB,IAAMvrB,IACTkrB,EAAU1iB,EAAQsgB,EAAWn0B,OAAW42B,OAI1Cz6B,GAAE8P,WAAWgqB,EAAWpiB,IAASsgB,EAAY,KAAO,IAAM,cAAcf,EAEzE,OACU31B,GACVg4B,EAAa1C,EAAK,MAAQt1B,EAAM6U,EAAMoD,KAAK,MAGzC/B,IACHA,GAAW,IAAMlW,GAElBA,EAAOoW,EAAOpW,GAEf,GAAIL,GAAYK,GAAO,EAClBo5B,EAAMp5B,EAAKgG,UAEd+xB,GAAc3hB,GAASsf,GAAmB0D,EAAKhjB,EAAQuf,GAAWA,EAAU5Z,EAAW2a,EAExF,OAEDtgB,EAASpW,EACL02B,GAAatgB,IAAWvT,IAASJ,EAAEC,EAAE,GAAK+R,EAAMhS,EAAE,GAAK,KAAOgS,EAAMhS,EAAE,KAGzEu1B,EAAa1C,EAAI,IAIpBwD,EAAU1iB,EAAQsgB,IAQpB,MALInI,IACHuH,GAAiBC,EAAYxH,IAItBA,KAAMA,EAAMppB,IAAK4wB,IAG1B,GAAIyC,GACHrC,EAAqB,GAAR92B,KAGboV,EAAQ1O,GAAMyG,KAAK/M,WACnBo6B,EAAWplB,EAAM,EAQlB,OANIolB,GAAW,KAAOA,GAAY1D,IACjCqC,EAAYqB,EACZplB,EAAM5C,QACNgoB,EAAWplB,EAAM,IAGXsjB,EAAav4B,MAAM,EAAGiV,IAG9BvG,GAAc,SAASonB,EAAItwB,GAK1B,MAJyB,KAArBvF,UAAUwD,SACb+B,EAAOswB,EACPA,EAAK,IAECj0B,GAAS2D,GACb,GAAIwwB,IAAgBF,EAAItwB,GACxB,GAAIqwB,IAAiBC,EAAItwB,IAK7BhD,GAAKiE,QAAU,WACd,GAAIlB,GAAOtF,SACX,OAAO,YAIN,IAHA,GAAIsU,GAAKqlB,EACR11B,KACAhB,EAAIqC,EAAK9B,OACHP,KACNqR,EAAMhP,EAAKrC,KACX02B,EAAMr0B,EAAKrC,GACP02B,IACH11B,EAAOA,EAAK0K,OAAOzO,GAAYy5B,GAAOA,EAAIrlB,EAAKA,GAAOqlB,GAGxD,OAAO11B,KAIThF,EAAE8P,WAAaN,GACfA,GAAYmpB,MAAQ,SAASnhB,EAASE,EAAQggB,EAAW1G,GACxD,IAAIA,IAAU/vB,GAAY+vB,IACvBA,EAAOxZ,EAASE,EAAQggB,GAM1B,MAHAhgB,GAASzW,GAAYyW,GAClBA,EAAOzH,KAAOyH,EAAO5J,KAAK4pB,EAAU,IACpChgB,QACWA,KAAWtG,IAAUsG,GAIrClI,GAAY4rB,OAASzE,GACrBnnB,GAAYolB,MAAQkC,GACpB92B,EAAE01B,QAAUlmB,GAAYkmB,QAAU1C,GAClChzB,EAAEg4B,UAAYxoB,GAAYwoB,UAAYoB,GACtC5pB,GAAY0V,OAAS4S,GAErBnB,GAAiB1qB,WAChB0lB,MAAO,KAEPgG,WAAYI,GACZsD,aAAcpD,GAEd3xB,KAAM,WACL,MAAO3F,MAAKgxB,OAGb3hB,YAAa,SAASwG,EAAMvQ,EAAOq1B,GAClC9kB,EAAOA,GAAQ,EACf,IAAI5L,GAAK2wB,EAAMplB,EACdqlB,EAAQhlB,EAAO,KAAOA,EACtBxL,EAAOrK,KACP+W,EAAS1M,EAAK2mB,KAEf,IAAIja,EACH,GAAI8jB,EAEH,GADAF,EAAYr1B,EACRtD,GAAS6T,GAIZ,IADA5L,EAAM4L,EAAKjS,OACJqG,KACN2wB,EAAO/kB,EAAK5L,GACZI,EAAKgF,YAAYurB,EAAKp5B,KAAMo5B,EAAKt1B,MAAqBpC,SAAdy3B,GAA2BA,OAIpE,KAAK1wB,IAAO4L,GACXxL,EAAKgF,YAAYpF,EAAK4L,EAAK5L,GAAM0wB,OAG7B,IAAI9kB,IAAStH,GAAU,CAG7B,IADAiH,EAAQK,EAAK8C,MAAM,QACZ5B,GAAUvB,EAAM5R,OAAS,GAC/BmT,EAASA,EAAOvB,EAAMhD,QAEnBuE,IACH1M,EAAKywB,aAAa/jB,EAAQvB,EAAM,GAAIlQ,EAAOq1B,GAI9C,MAAOtwB,IAGR4nB,eAAgB,SAASpc,GAExB,MADA7V,MAAKqP,YAAYwG,EAAM8L,IAChB3hB,MAGR86B,aAAc,SAASC,EAAMllB,EAAMvQ,EAAOq1B,GACzC,GAAI9e,GAAQ5N,EAAQ+sB,EACnBC,EAAWplB,EAAOklB,EAAKllB,GAAQklB,CAE5Bz6B,IAAY26B,IACXA,EAAS3rB,MAEZyrB,EAAOA,EAAKl2B,MAERk2B,EACJ9sB,EAASgtB,EACTpf,EAAS5N,EAAOqB,OAAQ,EAAOrB,EAASA,EAAOqB,IAC/C2rB,EAAWhtB,EAAOd,KAAK4tB,KAIrBE,IAAa31B,GAASq1B,GAAaM,GAAY31B,OAE5C21B,YAAoBC,QAASD,EAAW31B,GAAS21B,EAAW31B,KAC7DuW,GACHA,EAAO1O,KAAK4tB,EAAMz1B,GAClBA,EAAQ2I,EAAOd,KAAK4tB,KACVC,EAAa11B,IAAUqc,IAChBze,SAAb+3B,SACIF,GAAKllB,GACZvQ,EAAQpC,QAER2S,EAAO3S,OAEE2S,IACVklB,EAAKllB,GAAQvQ,GAEVuQ,GACH7V,KAAKm7B,SAASJ,GAAOzd,OAAQ,MAAOzH,KAAMA,EAAMvQ,MAAOA,EAAOiY,SAAU0d,EAAUtZ,OAAQqZ,MAM9FG,SAAU,SAASx5B,EAAQ6a,GAC1Bnd,EAAEsC,GAAQwvB,eAAehC,IAAqBnvB,KAAKk2B,IAAM,IAAM,OAAOpmB,KAAK9P,KAAKk2B,KAAK,GAAK,IAAK1Z,KAIjG2Z,GAAgB7qB,WACf0lB,MAAO,KAEPgG,WAAYI,GACZsD,aAAcpD,GAEd3xB,KAAM,WACL,MAAO3F,MAAKgxB,OAGbe,OAAQ,SAAShuB,EAAO4B,GACvB,GAAIqrB,GAAQhxB,KAAKgxB,KAejB,OAdyB,KAArB5wB,UAAUwD,SACb+B,EAAO5B,EACPA,EAAQitB,EAAMptB,QAEfG,EAAQoxB,GAASpxB,GACbA,OACH4B,EAAO3D,GAAS2D,GAAQA,GAAQA,GAI5BA,EAAK/B,QACR5D,KAAKo7B,QAAQr3B,EAAO4B,IAGf3F,MAGRo7B,QAAS,SAASr3B,EAAO4B,GACxB,GAAIqrB,GAAQhxB,KAAKgxB,MAChBqK,EAAYrK,EAAMptB,MACfG,GAAQs3B,IACXt3B,EAAQs3B,GAET1wB,GAAOxK,MAAM6wB,GAAQjtB,EAAO,GAAGgL,OAAOpJ,IACtC3F,KAAKm7B,UAAU7d,OAAQ,SAAUvZ,MAAOA,EAAOqe,MAAOzc,GAAO01B,IAG9D1Z,OAAQ,SAAS5d,EAAOu3B,GACvB,GAAIlZ,GACH4O,EAAQhxB,KAAKgxB,KAcd,OAZc9tB,UAAVa,IACHA,EAAQitB,EAAMptB,OAAS,GAGxBG,EAAQoxB,GAASpxB,GACjBu3B,EAAcA,EAAcnG,GAASmG,GAA+B,IAAhBA,EAAoB,EAAI,EACxEA,EAAc,GAAKv3B,OACtBqe,EAAQ4O,EAAMtqB,MAAM3C,EAAOA,EAAQu3B,IAC/BA,EAAclZ,EAAMxe,SACvB5D,KAAKu7B,QAAQx3B,EAAOu3B,EAAalZ,IAG5BpiB,MAGRu7B,QAAS,SAASx3B,EAAOu3B,EAAalZ,GACrC,GAAI4O,GAAQhxB,KAAKgxB,MAChBqK,EAAYrK,EAAMptB,MAEnBotB,GAAMrmB,OAAO5G,EAAOu3B,GACpBt7B,KAAKm7B,UAAU7d,OAAQ,SAAUvZ,MAAOA,EAAOqe,MAAOA,GAAQiZ,IAG/DG,KAAM,SAAShZ,EAAUiZ,EAAUC,GAQlC,MAPAA,GAAYA,EAAYvG,GAASuG,GAA2B,IAAdA,EAAkB,EAAI,EACpElZ,EAAW2S,GAAS3S,GACpBiZ,EAAWtG,GAASsG,GAEhBC,EAAY,GAAKlZ,MAAiBiZ,MAAiBjZ,IAAaiZ,GACnEz7B,KAAK27B,MAAMnZ,EAAUiZ,EAAUC,GAEzB17B,MAGR27B,MAAO,SAASnZ,EAAUiZ,EAAUC,GACnC,GAAItZ,GACH4O,EAAQhxB,KAAKgxB,MACbqK,EAAYrK,EAAMptB,OAClBg4B,EAASpZ,EAAWkZ,EAAYL,CAC7BO,GAAS,IACZF,GAAaE,GAEVF,IACHtZ,EAAQ4O,EAAMrmB,OAAO6X,EAAUkZ,GAC3BD,EAAWzK,EAAMptB,SACpB63B,EAAWzK,EAAMptB,QAElB+G,GAAOxK,MAAM6wB,GAAQyK,EAAU,GAAG1sB,OAAOqT,IACzCpiB,KAAKm7B,UAAU7d,OAAQ,OAAQkF,SAAUA,EAAUze,MAAO03B,EAAUrZ,MAAOA,GAAQiZ,KAIrFvsB,QAAS,SAAS+sB,EAAUlK,GAC3B,QAASmK,KACJ9X,IACH3Z,EAAK0nB,OAAOnkB,EAAEoW,EAAG+X,GACjBC,GAAchY,EACd5gB,GAAK4gB,EACLA,EAAI,EACJ+X,MAKF,GAAI34B,GAAGwK,EAAGoW,EAAGiY,EAASC,EACrB7xB,EAAOrK,KACP+7B,KACAp2B,EAAO0E,EAAK2mB,MACZmL,EAAWx2B,EAAKe,QAChB20B,EAAY11B,EAAK/B,OACjBo4B,EAAaX,EACbe,EAAYP,EAASj4B,MAEtB,KADAyG,EAAKgyB,MAAO,EACPzuB,EAAEoW,EAAE,EAAGpW,EAAEwuB,EAAWxuB,IACxB,IAAKquB,EAAUJ,EAASjuB,MAAQjI,EAAKiI,EAAEoW,GACrC8X,QACK,CACN,IAAK14B,EAAEwK,EAAEoW,EAAG5gB,EAAE44B,GACTC,IAAYt2B,EAAKvC,GADIA,KAK1B,GAAIA,EAAE44B,EAAY,CAGjB,IAFAF,IACAI,EAAM,EACCA,IAAQE,EAAUh5B,GAAKy4B,EAASjuB,EAAEsuB,KAASv2B,EAAKvC,EAAE84B,KACzD7xB,EAAKmxB,KAAKp4B,EAAGwK,EAAGsuB,GAChBtuB,GAAKsuB,EAAM,MAEXlY,KACA+X,EAAWrxB,KAAKuxB,GAUnB,MANAH,KACIE,EAAapuB,GAChBvD,EAAKsX,OAAO/T,EAAGouB,EAAapuB,GAE7BvD,EAAKgyB,KAAOn5B,OACZmH,EAAK8wB,UAAU7d,OAAQ,UAAW6e,SAAUA,GAAWd,GAChDhxB,GAGR8wB,SAAU,SAAS3e,EAAW6e,GAC7B,GAAIhxB,GAAOrK,KACVgxB,EAAQ3mB,EAAK2mB,MACbptB,EAASotB,EAAMptB,OACf04B,EAASj9B,GAAG2xB,GACT3mB,GAAKgyB,KACR7f,EAAU1N,SAAU,EACVlL,IAAWy3B,GACrBiB,EAAOnL,eAAehC,IAAoB7R,OAAQ,MAAOzH,KAAM,SAAUvQ,MAAO1B,EAAQ2Z,SAAU8d,IAEnGiB,EAAOnL,eAAepO,IAAkB1Y,EAAK6rB,IAAM,IAAM,OAAOpmB,KAAKzF,EAAK6rB,KAAK,GAAK,IAAK1Z,KAI3FwY,GAAc7F,IAAqB6F,GAAcjS,KAIhDpB,OAAQ,SAAU4a,GACjB,GAAI7F,GAAYpzB,EAAO2tB,EAAQ5tB,EAAGsC,EACjCmzB,EAASyD,EAAU52B,IACpB,IAAI,IAAamzB,EAAOhW,KAAM,EAAMgW,EAASA,EAAOhD,MAE/CY,EAAarH,GAAgByJ,EAAO/C,OAAO,CAI9C,IAFA9E,EAAS5xB,EAAE2xB,MAAMhxB,MAAMixB,OAAOsL,EAAUt5B,MACxCI,EAAI4tB,EAAOrtB,OACJP,MAAQC,GACdA,GAASqC,EAAOsrB,EAAO5tB,GAAGsC,OAASA,EAAKmwB,IAAMnwB,EAAKmwB,GAAGC,OAAS+C,EAAO/C,IAGlEzyB,WAEGozB,GAAWd,GAAM51B,MAAMq4B,MAC9B5B,GAAiBC,EAAYoC,EAAO/C,UAOzC9zB,GAAO8G,IAAM,SAAShB,GACrB,QAAS8I,GAAIjP,EAAQ8J,EAAS/J,EAAQ66B,GACrC,GAAIC,GACH1zB,EAAM/I,IACHA,MAAKmJ,KACRnJ,KAAKoJ,cAEKxH,KAAW6O,KACrB1H,EAAII,IAAMvH,EACVmH,EAAIM,IAAM1H,GAAUoH,EAAIM,QACxBN,EAAI2C,QAAUA,GAAW3C,EAAI2C,QAC7B3C,EAAI6nB,SACC4L,IACAz0B,EAAO20B,QACV7tB,GAAY9F,EAAII,KAAK6tB,WAAWjuB,EAAI4zB,IAAM,SAAShhB,EAAIa,GACjDigB,IACJA,GAAW,EACX10B,EAAO20B,OAAO3zB,EAAK4S,EAAIa,GACvBigB,EAAWv5B,SAEV6F,EAAI6zB,QAEJ70B,EAAO80B,QACVhuB,GAAY9F,EAAIM,KAAK2tB,WAAWjuB,EAAI+zB,IAAM,SAASnhB,EAAIa,GAClDigB,IACJA,GAAW,EACX10B,EAAO80B,OAAO9zB,EAAK4S,EAAIa,GACvBigB,EAAWv5B,SAET6F,EAAIg0B,UA4CX,MAtCIz8B,IAAYyH,KAEfA,GACC2I,OAAQ3I,IAINA,EAAO+I,UACV/I,EAAS1I,EAAE2P,UAAWjH,EAAO+I,QAAS/I,IAGvCA,EAAOgB,IAAM,SAASnH,EAAQ8J,EAAS/J,EAAQ66B,GAC9C,MAAO,IAAI3rB,GAAIjP,EAAQ8J,EAAS/J,EAAQ66B,KAGxC3rB,EAAIvF,WACJsxB,OAAQ70B,EAAO60B,QAAUpE,GACzBuE,OAAQh1B,EAAOg1B,QAAUvE,GACzB5H,OAAQ,SAASllB,GAChB,GAAI3C,GAAM/I,IACV6O,IAAY9F,EAAIM,KAAKyF,QAAQ/G,EAAO2I,OAAO3H,EAAII,IAAKJ,EAAI2C,QAAUA,GAAW3C,EAAI2C,WAElFtC,MAAO,WACN,GAAIL,GAAM/I,IACN+I,GAAII,MACHJ,EAAI4zB,KACP9tB,GAAY9F,EAAII,KAAKuxB,aAAa3xB,EAAI4zB,IAAK5zB,EAAI6zB,QAE5C7zB,EAAI+zB,KACPjuB,GAAY9F,EAAIM,KAAKqxB,aAAa3xB,EAAI+zB,IAAK/zB,EAAIg0B,QAEhDh0B,EAAII,IAAMjG,SAGZ6F,IAAK8H,EACLmsB,KAAMj1B,IACJwD,YAAcsF,EAEV9I,GAGRpF,GAAK6wB,OAAS,WACb7wB,GAAKspB,MAAQjsB,KAAKisB,MAClB7sB,EAAOuY,KAAOzV,GAAa0xB,SAASjc,MAEjC+e,WAAYrH,IAEZnsB,QAsBL,GARAJ,GAAiBb,GAAOsxB,SACxBrxB,GAAeS,GAAK4wB,SACpB7jB,GAAuBxN,GAAa0xB,SACpC/pB,GAAc5H,GAAOsY,WACrBlb,EAAEuK,UAAY1E,GAAajD,GAAO2H,UAClCyB,GAAQpJ,GAAOuF,KACfqI,GAAa,wBAETxQ,EAAEoC,KAAQ,MAAOpC,EAErB6C,IAAamY,SAAU,CACvB,IAAI0K,IAAY+G,GAAcxG,GAAOuE,GAAgBX,GAAczZ,GAASsU,GAAWkZ,GACtFtY,GAAa,WACbK,GAAmB,aACnBjI,GAAoB,iBACpBC,GAAmB,gBACnByL,GAAmB,gBACnBlJ,GAAU,UACVD,GAAW,WACXE,GAAQ,QACRhB,GAAO,OACP2N,GAAS,SACTtN,GAAO,OACP4I,GAAc,cACdD,GAAa,oBACb7H,GAAYgF,GAAa,MACzBuY,GAAa,WAAavY,GAAa,IACvCzH,IACC5X,MAAO,MACP63B,MAAO,MACPrzB,KAAMP,GACNgS,KAAM,QAEP6hB,IAAgBha,KAAM,QAAS7G,GAAI,SACnC8gB,GAAc,EACdC,GAAej+B,EAAEmmB,UACjB+X,GAAmBz6B,GAAeX,WAClC6oB,GAAejf,SAASkf,yBACxB7B,GAAMrd,SAASyxB,cAGfnW,IAAaoW,GAAI,EAAGC,GAAI,EAAGC,MAAO,EAAGC,MAAO,EAAGC,MAAO,EAAGC,MAAO,EAAGC,GAAI,EAAGC,SAAU,EAAGC,GAAI,EAAG9N,OAAQ,EAAG+N,SAAU,EAAGC,IAAK,EAAGC,OAAQ,GACtIzW,IAAaoW,GAAI,SACjB5W,IAAakX,GAAI,EAAGC,IAAK,EAAGnB,MAAO,EAAGoB,GAAI,EAAGC,KAAM,EAAGt+B,KAAM,EAAGu+B,IAAK,EAAGh9B,KAAM,EAAGi9B,KAAM,EACrFC,QAAS,EAAGC,MAAO,EAAGC,OAAQ,EAAGlqB,MAAO,EAAG/S,OAAQ,EAAGk9B,MAAO,EAAGC,IAAK,GACtE9d,MACApE,MACAiH,GAAa,EACbkb,GAAY,eACZjU,GAAkB,8HAClBpF,GAAmB,iBACnBqK,GAAe,oBACftG,GAAe,wBACfI,GAAkB,kBAClB4C,GAAgB,sCAChB9P,GAAiB,aACjBkE,GAAmB1hB,EAAO0hB,gBAI3B,IAFAjS,GAAcxP,EAAE8P,YAEXN,GAEJ,KAAMowB,aAAc,cAu/FrB,OAp/FA5M,IAAWxjB,GAAYkmB,QAo9DvBpyB,GAAK2N,QAAQ/I,SAAW,SAAS/F,EAAM6O,GACtCA,EAAK5O,KAAOmjB,GACRpjB,IACHnC,EAAEoC,KAAKD,GAAQ,WACd,MAAOojB,IAASzkB,MAAMkQ,EAAMjQ,cAK/BuC,GAAK+iB,UAAYA,IAGhB5iB,GAAeX,WAAa,WAE5B,GAAIrC,GAAMy9B,GAAiBp9B,MAAM,EAAGC,UASpC,OAPIm9B,MAAqB17B,IAExB/B,EAAM+B,EAAiB1B,MAAM,EAAGC,YAIjC0rB,GAAe,GAAIlpB,QAAO,yBAA2BR,GAAW,QAAUG,GAAiBI,GAAKD,KAAO,aAAeF,GAAkB,IAAK,KACtI1C,MAGR6C,GAAKgO,WAAW,WAiXhB9G,GAAYwE,MAAQ,SAASrN,GAI5B,GAAIk+B,GACHjgB,EAAejf,KAAKyF,QAAQ+X,MAAQ,GACpC2hB,EAASn/B,KAAKU,OAAOE,MAAMu+B,MAa5B,OAXIA,KAIHD,EAAoBC,EAAOtyB,QAAQ,mBAAoB,QAEvDqyB,EAAoB,UAAYA,EAAoB,eAAiBA,EAAoB,WAEzFjgB,EAAeA,EAAapS,QAAQ,GAAIjK,QAAOs8B,GAAoB,MACnEl+B,EAAMie,GAAgBje,GAAOie,GAAgB,KAAOkgB,EAAS,KAEvDn+B,GAWRqK,IACC2X,IACCvb,KAAM+W,GACN7V,KAAM,SAASjI,GAOd,IANA,GAAImH,GACH9H,EAAMC,KACNoD,EAAI,EACJsC,EAAOhF,EAAOgF,KACdrC,EAAIqC,EAAK9B,OAEHR,EAAEC,IAAM/C,GAAYoF,EAAKtC,IAAKA,KACrCrD,EAAIq/B,IAAM/7B,EAAED,GAAKA,EAAE,EACfrD,EAAI0D,EAAEoC,SACJlD,GAAKE,MAAMiN,KAAKjI,EAAUnH,EAAOqE,KAAK2H,UAI1C3M,EAAIwH,SAAW,YAAclI,EAAE4Q,KAAKpI,IAAYnH,EAAOyS,OAAOzN,KAAKtC,IAAM,QAAU,aAEpFrD,EAAI0H,KAAO8B,KAGb8jB,YAAa,SAAS3sB,EAAQ+E,GAC7B,GAAIkd,GAASxP,EAAcksB,EAC1Bt/B,EAAMC,KACNoD,EAAIrD,EAAIq/B,IACR15B,EAAOhF,EAAOgF,KACdrC,EAAIqC,EAAK9B,OACThD,EAAQF,EAAOE,MACf+E,EAAO/E,EAAM+E,KACbpC,EAAO7C,EAAO6C,KACd+7B,EAAY1+B,EAAMoJ,OAEf5G,KACHuf,EAAUjd,EAAKtC,EAAE,GACjB+P,EAASzN,EAAKgB,MAAMtD,GACpBsC,EAAOA,EAAKgB,MAAM,EAAGtD,EAAE,GACvBrD,EAAIw/B,KAAO75B,EAAK,GAEhB25B,EAAat/B,EAAIs/B,WAAat/B,EAAIs/B,YAAchgC,EAAEU,EAAI0D,EAAEoC,QACpD9F,EAAIw/B,KAAO75B,EAAK,IAAM,IAAK3F,EAAIke,YAIhCxY,EAAQqG,MAENwzB,IAGJA,EAAY,oBAAoBxvB,KAAKpP,EAAOyS,OAAOzN,KAAKgB,OAAOyM,EAAOvP,OAAS,GAAG,IAClF07B,EAAYA,GAAa38B,GAAKiK,OAAOrK,GAAiB,IAAM+8B,EAAU,GAAK98B,GAAiBe,EAAKwB,MAAM,GAAMU,EAAQE,KAAMpC,IAGxHxD,EAAIy/B,MACPz/B,EAAI4e,WAGL0gB,EAAWrc,GACVjjB,EAAIy/B,KAAO95B,EAAK,IAAM,QACtB3F,EAAIw/B,KACIr8B,QAARyC,EAAoB,KAAOA,EAC3B5F,EAAI0/B,KAAO,SAAe9jB,GACzB,GAAI0F,GACH/d,GAASvD,EAAI0D,EAAEoC,MAEhB,KAAKvC,EAGJ,IAFA+d,EAAQthB,EAAImtB,SAAS,KACrB7pB,EAAIge,EAAMzd,QACFN,GAASD,KACZge,EAAMhe,GAAGmmB,SAAS7N,EAAGha,UACxB2B,GAAQ,EAIX,IAAIA,EACH,MAAOqf,GAAQxiB,MAAMm/B,GAAa75B,EAAQE,QAASoJ,OAClDoE,EACAwI,GACC2B,OAAQ3B,EAAG1Y,KAAMM,KAAMA,EAAMkC,QAASA,GACvC0N,EAAOzM,MAAMyG,KAAK/M,UAAW,SASnCke,SAAU,WACT,OAAO,GAERK,SAAU,WACT,GAAItU,GAAOrK,IACPqK,GAAKg1B,YACRh1B,EAAKg1B,WAAWvc,IAAIzY,EAAKm1B,KAAMn1B,EAAKk1B,KAAMl1B,EAAKo1B,OAGjDv5B,MAAM,EACNiC,WAAY0pB,GACZ/oB,eAAe,GAEhB42B,YACC/2B,KAAM,SAASjI,GACdV,KAAKwB,KAAOd,EAAOE,MAAMY,MAAS,MAAQm+B,KAAKC,UAEhDxS,OAAQ,SAAS1sB,EAAQ+E,GACxB,GAAIo6B,GACH9/B,EAAMC,KACNsuB,EAAcvuB,EAAI0J,WAAc1J,EAAI0D,EAAEoC,OAAS9F,EAAImtB,UAAS,EAAM,qBAAuB7tB,EAAEoG,EAAQqG,MAAMG,KAAK,qBAC9G5I,EAAIirB,EAAY1qB,MAUjB,KARI7D,EAAI0D,EAAEoC,QAGTg6B,EAAe9/B,EAAImtB,SAAS,KAAK,GACjC2S,EAAeA,GAAgBxgC,EAAEkE,KAAKs8B,GAAct7B,IAAIxE,MAAQA,EAAI8D,OAASg8B,EAAe9/B,EAAIke,YAEhG4hB,EAAep6B,EAAQqG,KAEjBzI,KAENirB,EAAYjrB,GAAG7B,KAAO8sB,EAAYjrB,GAAG7B,MAAQzB,EAAIyB,IAGlDnC,GAAEwgC,GAAc7c,GAAG,gBAAiB,SAASrH,EAAImkB,GAChD,GAAIr2B,GACHR,EAAa62B,EAAcv7B,IAAI0E,UAChC,KAAKlJ,EAAI0D,EAAEoC,QAAUg6B,IAAiB9/B,EAAIke,YAGtChV,GAAcA,EAAWlJ,EAAIiG,WAAajG,EAI7C,IAFAuuB,EAAcvuB,EAAI0J,WAAa1J,EAAImtB,UAAS,EAAM,qBAClD7pB,EAAIirB,EAAY1qB,OACTP,KAENoG,EAAa6kB,EAAYjrB,GACzBoG,EAAWgb,SAAW1kB,EACtB0J,EAAWjI,KAAOiI,EAAWjI,MAAQzB,EAAIyB,KACzCkjB,GAAO7H,GAAa9c,EAAIwhB,OAAQxhB,EAAK0J,GACrCA,EAAWkT,QAAU,IAAM5c,EAAIwhB,MAAQ,IACvC9X,EAAWs2B,QAAUhgC,EAAIsG,UAAU,KAAOoD,EAAWnE,SAKzDgZ,SAAU,SAAS3C,EAAIa,EAAWrV,GACjC,OAAO,GAERgB,WAAY0pB,GACZ/oB,eAAe,KAIjBpH,EAAQ2J,GAAM,QAWbkd,cAAe,SAAS5M,EAAIa,EAAW9b,EAAQ+E,GAC9C,GAAIu6B,GACHr+B,EAASga,EAAGha,OACZs+B,EAAet+B,EAAOiC,OACtB7D,EAAMC,KACNsd,EAASd,EAAUc,MACpB,IAAIvd,EAAI0D,EAAE6F,OACNvJ,EAAIoH,QAAQ,KACH,WAAXmW,GAAuB2iB,IAAiBzjB,EAAU4F,MAAMxe,QAC1C,WAAX0Z,IAAwB2iB,GAE5BlgC,EAAI+O,cAEJ,KAAKkxB,IAAajgC,GAAI0D,EAAEoF,OACvBm3B,EAAYjgC,EAAI0D,EAAEoF,OAAOm3B,GACrBA,EAAUr6B,OAAShE,GACtBq+B,EAAUv8B,EAAE8kB,cAAcpoB,MAAM6/B,EAAW5/B,UAI9CL,GAAI8wB,UAAUnwB,EAAQ+E,EAAS+W,GAC/Bb,EAAG2Y,MAAO,GAEXjH,YAAa,SAAS3sB,EAAQ+E,GAC7B,GAAIrC,GAAG88B,EAAYC,EAAYx6B,EAC9B5F,EAAMC,KACNogC,EAAgBrgC,EAAIsgC,SACpBl5B,EAAUpH,EAAIoH,QACd9D,EAAI8D,EAAQvD,OACZqe,EAAWliB,EAAIkiB,UAAY,CAE5B,KAAK7e,EAAI,EAAGA,GAAK6e,EAAU7e,IAC1B1C,EAASyG,EAAQ/D,GACjBuC,EAAOjF,EAAOqI,IACXrI,EAAOqI,IAAIM,IACX3I,EAAOgF,KAAK9B,OACXlD,EAAOgF,KAAK,GACZhF,EAAO6C,KAAKoC,MAEXw6B,EAAaC,EAAch9B,KAAOuC,IAASw6B,EAAW,KAC1D9N,GAAS8N,EAAW,GAAIA,EAAW,IAAI,SAChCC,GAAch9B,KAEjBg9B,EAAch9B,IAAMpB,GAAS2D,KACjC0sB,GAAS1sB,EAAMu6B,EAAa,SAASvkB,EAAIa,GACxC,GAAI8jB,GAAQ5/B,CACZX,GAAIwoB,cAAc5M,EAAIa,EAAW8jB,EAAO76B,KAEzC26B,EAAch9B,IAAMuC,EAAMu6B,GAG5B,KAAK98B,EAAI6e,EAAW,EAAG7e,EAAIC,EAAGD,KACzB+8B,EAAaC,EAAch9B,MAC9BivB,GAAS8N,EAAW,GAAIA,EAAW,IAAI,SAChCC,GAAch9B,GAGvBrD,GAAIsgC,KAAOD,GAEZhR,UAAW,WACV,GAAI/rB,GAAGtD,EAAMC,IACb,KAAKqD,IAAKtD,GAAIsgC,KACbhO,GAAStyB,EAAIsgC,KAAKh9B,GAAG,GAAItD,EAAIsgC,KAAKh9B,GAAG,IAAI,MAK5C3B,EAAQ2J,GAAM,OACbiT,SAAU,SAAS3C,EAAIa,EAAW+jB,GACjC,GAAIC,GAAKC,EAASC,CAClB,KAAKF,EAAM,EAAIC,EAAUzgC,KAAKmH,QAAQq5B,GAAOA,IAE5C,GADAE,EAAYD,EAAQ7/B,MAAMmE,OAASw7B,EAAWC,GAAK5/B,MAAMmE,MAAQ07B,EAAQ/6B,KAAK9B,UAAY68B,EAAUA,EAAQ/6B,KAAK,MAAS66B,EAAWC,GAAK96B,KAAK,IACzI1F,KAAKwG,SAAai6B,GAAYC,EACnC,MAAOA,EAQT,QAAO,GAERrT,YAAa,SAAS3sB,EAAQ+E,EAASlB,EAAKoX,EAAIa,GAC3CA,GACHxc,KAAK6wB,UAAUnwB,EAAQ+E,EAAS+W,MAsDnCnR,GAAM,SACLF,QAAS,MACTvC,QAAS3G,GAAO8G,KACf2H,OAAQrF,GAAMzK,MAAMgI,QAAQ8H,OAC5BgsB,OAAQ5K,GACR+K,OAAQ7K,GACR+K,OAAQ7K,KAEThsB,MAAM,IAOPxE,EAAQrC,GAMPkE,KAAM+hB,GAAQ,SAASpM,EAAMlW,EAAOC,GAQnC,QAAS09B,GAAaC,EAAIC,GACzB,GAAID,EAEH,IADA3b,EAAUS,GAAUkb,EAAIC,EAAMlb,IACzB/X,EAAI,EAAGoW,EAAIiB,EAAQrhB,OAAQgK,EAAIoW,MAC9BzgB,EAAOwgB,GAAUkB,EAAQrX,GAAGrD,QAAShH,EAAOA,GAAQN,EAAOM,EAAKI,KAAI,EAAMV,GAAQM,IADjDqK,MAQrC5K,MAAYA,IAEfC,EAAOD,EACPA,EAAQE,OAET,IAAIK,GAAM0hB,EAAS7hB,EAAGwK,EAAGoW,EAAG3gB,EAAG8lB,EAC9BN,EAAQ,EACR3Z,EAAOnD,SAASmD,IAEjB,IAAIgK,GAAQA,IAAShK,GAAQ7H,GAAQ5D,EAAEC,OAAS,IAG/CwV,EAAO,GAAKA,IAASA,EAClB7Z,EAAE6Z,GAAM,GACRA,EAAKmC,OACJnC,EAAK,GACLA,GAEM,CACT,GAAIlW,EAAO,CAEV,GADA29B,EAAaznB,EAAKwG,KAAK,IAClBnc,EAIJ,IAFA4lB,EAAQC,GAAMlQ,EAAKmQ,iBAAiB6T,IAAc79B,EAAE69B,GAAYhkB,GAAMvV,MACtEN,EAAI8lB,EAAMvlB,OACLR,EAAI,GAAIG,GAAQH,EAAIC,EAAGD,IAC3Bu9B,EAAaxX,EAAM/lB,GAGrB,OAAOG,GAER,KAAO2V,GAAM,CAGZ,GAAI+L,EAAUS,GAAUxM,EAAMhW,OAAWwmB,IAExC,IADArmB,EAAI4hB,EAAQrhB,OACLP,KAEN,GADAE,EAAO0hB,EAAQ5hB,GACXE,EAAK+kB,KAAM,CACd,GAAIO,EAAQ,EAEX,MADAtlB,GAAOwgB,GAAUxgB,EAAKgH,IACfhH,GAAQN,EAAOM,EAAKI,IAAIV,GAAQM,GAAQ8D,EAEhDwhB,SAIAA,IAIH3P,GAAOA,EAAKuI,iBAAmBvI,EAAKgF,YAIvC,MAAO7W,KAGR5F,KAAMojB,GACNic,OAAQxR,GAKR9J,UAAW,SAAS2D,GACfA,EAAMvlB,QAAUy5B,IAEnBxO,GAAM1F,GAEPmU,GAAan9B,MAAMd,EAAGe,cAoBxBsB,EAAQrC,EAAE2F,IACTvD,KAAM,SAASsW,EAAMqL,EAAMpZ,EAAS+G,EAAa7J,EAAY0Y,EAAUC,GACtE,MAAOgF,IAAM9M,EAAM/X,KAAMojB,EAAMpZ,EAAS+G,EAAa7J,EAAY0Y,EAAUC,IAE5EihB,OAAQ,WACP,MAAOxR,IAAQtvB,OAEhBuD,KAAM,SAASP,EAAOC,GACrB,MAAOqiB,IAAMtlB,KAAK,GAAIgD,EAAOC,MAQ/B5D,EAAEkwB,MAAMhmB,GAAM,cAAe,QAAS,UAAW,SAASnG,EAAG5B,GAC5D,GAAIu/B,GAAQ1hC,EAAE2F,GAAGxD,EACjBnC,GAAE2F,GAAGxD,GAAQ,WACZ,GAAI2P,EACJksB,IAAc,CACd,KACClsB,EAAS4vB,EAAM5gC,MAAMH,KAAMI,WAE5B,QACCi9B,GAAc,EAEf,MAAOlsB,MAQT2N,GAAepd,EAAQ2F,GAAU1E,GAAK0E,SAAUtC,MAAO6K,aAEvDmU,IAAahL,EAAG1R,IAKhBpF,GAAO2C,OAAS,SAAS+P,GAIxB,MAHIA,IAASA,EAAMlQ,MAClBkQ,EAASA,EAAM,GAAGA,EAAM,GAAGhP,KAAMgP,EAAM,GAAIhS,KAErCgS,GAORhS,GAAK8B,IAAM,SAASu8B,EAAU7tB,EAAQ5P,GACrC,GAAIA,EAAKiG,OAAQ,CAChB2J,EAAS5Q,GAAiB,IAAM4Q,EAAS3Q,EACzC,IAAIuC,GAAOxB,EAAKwB,KACf6K,EAAQvI,GAAQtC,KAAK6K,MACrBiO,EAASjO,EAAMuD,EACX0K,KACJjO,EAAMuD,GAAU0K,EAASlb,GAAKiK,OAAOuG,EAAQpO,GAAM,IAEpDi8B,GAAYz9B,EAAMsa,GAClBmjB,EAASv8B,KAAM,EAEhB,MAAOu8B,IAGRr+B,GAAK+B,KAAO,QAASu8B,IAAiBtE,GACrC,GAAI7uB,GACHozB,EAASvE,EACTt5B,EAAIs5B,EAAI/4B,MACT,IAAIP,EAEH,IADA69B,KACO79B,KACNyK,EAAK6uB,EAAIt5B,GACLyK,EAAG6J,OACN7J,EAAKpM,KAAYoM,GACjBA,EAAGyK,IAAM0oB,GAAiBnzB,EAAGyK,MAE9B2oB,EAAOv8B,QAAQmJ,EAGjB,OAAOozB,IAGRv+B,GAAKspB,MAAQ,SAAS1oB,GAErB,MAAO,UAASsS,EAAMkB,EAAQsT,GAG7B,GAAIpK,GAAQlgB,EAAKqiB,EAAOle,EAAQi9B,EAAMC,EAAU/9B,CAChD,IAAIE,GAAQsS,EAAM,CACjB,GAAIA,EAAK8B,KACR,MAAO9B,GAAK8B,KAAKxK,KAAK5J,EAAKwB,KAAMgS,EAAQxT,EAAMZ,GAEhD,IAAuB,MAAnBkT,EAAKxT,OAAO,GAGf,MAAyB,SAArBwT,EAAKnP,MAAM,EAAG,KACjB3G,EAAMwD,EAAKgB,IACY,MAAnBsR,EAAKxT,OAAO,KAEf4d,EAASpK,EAAKnP,MAAM,GAAGiS,MAAM,KAC7B5Y,EAAMA,EAAIA,KAEPkgB,GACIlgB,GAAOA,EAAKkgB,EAAOrH,KAAK,KAAM7B,OAGvClB,EAAOA,EAAKnP,MAAM,GAAGiS,MAAM,MACvBzU,EAASX,EAAKuZ,IAAIqkB,EAAOtrB,EAAKrD,SAAS,MACtCtO,EAAOO,KACNoR,EAAKjS,SACRw9B,EAAW,IAAMvrB,EAAK+C,KAAK,KAC3BuoB,EAAOj9B,EAAOb,EAAIa,EAAON,OAAO,GAC5Bu9B,EAAKxpB,MACRwpB,EAAKvpB,GAAKwpB,EACVD,EAAKr7B,MAAQukB,IAEbnmB,EAAOb,IAAM89B,EAAOC,GAAUv0B,QAAQ,SAAU,IACvB,UAArBs0B,EAAKz6B,MAAM,EAAG,KACjBxC,EAAOb,GAAKa,EAAOb,GAAGqD,MAAM,GAC5BxC,EAAOyG,OAAOtH,EAAG,EAAGE,MAIvB6e,GAASle,KACC2R,EAAKjS,QAAUtD,GAAY4D,MACrCke,GAASle,EAAQ2R,EAAK+C,KAAK,KAAM7B,KAG5BqL,MAER,IAAuB,MAAnBvM,EAAKxT,OAAO,GAGf,MAAgB,UAATwT,MAAyBtS,EAAMsS,EAAKhJ,QAAQmyB,GAAW,IAAKjoB,MAUvEkmB,GAAYt6B,GAAK6wB,OAEjB7wB,GAAK6wB,OAAS,WACbyJ,GAAU9vB,KAAKxK,IACfvD,EAAOuY,KAAOjI,GAAqBiI,KAChCjW,EAAQtC,EAAOuY,UACfxU,MAAO4gB,GACPhP,SAAU8H,KAEV3Z,OACH2mB,GAAiBna,GAAqB2xB,SACtCnY,GAAegU,GAAa,KAAOrT,GAAiB,IACpDpa,GAAUC,GAAqBC,IAC/BF,GAAQyuB,SAAWzuB,GAAQ6xB,OAC3B7xB,GAAQmuB,MAAQnuB,GAAQquB,MAAQruB,GAAQuuB,SAAWvuB,GAAQ8xB,QAAU9xB,GAAQouB,MAC7EpuB,GAAQ+xB,GAAK/xB,GAAQgyB,IAGtB3+B,GAAe8wB,UACdyN,SAAU,YACVhwB,UAAU,EACVuZ,YAAY,EAIZjb,KACC2xB,QAAS,EAAG,+BAAgC,aAC5CI,QAAS,EAAG,aAAc,eAC1BlD,MAAO,EAAG,QAAS,UACnB7pB,OAAQ,EAAG,WAAY,aACvBkpB,OAAQ,EAAG,UAAW,YACtBE,IAAK,EAAG,iBAAkB,oBAC1B0D,IAAK,EAAG,qBAAsB,yBAC9BhD,KAAM,EAAG,mCAAoC,uBAC7CL,QAAS,EAAG,QAAS,UAGrBpuB,IAAK3Q,EAAEsiC,QAAQC,eAAiB,EAAG,GAAI,KAAO,EAAG,SAAU,WAE5D1e,KACCia,OACC/Z,KAAMsM,GAAanT,GAAI,SAExBslB,SAAUzE,GACVjN,OAAQiN,GACRc,UACC3hB,GAAI,YAKAld,GACJyiC","file":"jsviews.min.js","sourcesContent":["/*! jsviews.js v0.9.83 (Beta) single-file version: http://jsviews.com/ */\n/*! includes JsRender, JsObservable and JsViews - see: http://jsviews.com/#download */\n\n/* Interactive data-driven views using JsRender templates */\n\n//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< JsRender >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n/* JsRender:\n * See http://jsviews.com/#jsrender and http://github.com/BorisMoore/jsrender\n * Copyright 2016, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041\n\n(function(factory, global) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar $ = global.jQuery;\n\n\tif (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory(global, $)\n\t\t\t: function($) { // If no global jQuery, take jQuery passed as parameter: require(\"jsviews\")(jQuery)\n\t\t\t\treturn factory(global, $);\n\t\t\t};\n\t} else if (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine([\"jquery\"], function($) {\n\t\t\treturn factory(global, $);\n\t\t}); // Require jQuery\n\t} else { // Browser using plain ',\n\topenScript = ' - data-linked tag, close marker\n\t\t\t// We validate with inTag so no script markers are inserted in attribute context e.g. for:\n\t\t\t// \"\" or \"
...{{/if}}...\"\n\t\t\tpreceding = id\n\t\t\t\t? (preceding + endOfElCnt + spaceBefore + (inTag ? \"\" : openScript + id + closeScript)+ spaceAfter + tag)\n\t\t\t\t: endOfElCnt || all;\n\t\t}\n\n\t\tif (validate && boundId) {\n\t\t\tif (inTag) {\n\t\t\t\t// JsViews data-linking tags are not allowed within element markup.\n\t\t\t\t// See jsviews/issues/303\n\t\t\t\tsyntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link=\"...\"');\n\t\t\t}\n\t\t\tif (id.charAt(0) === \"#\") {\n\t\t\t\ttagStack.unshift(id.slice(1));\n\t\t\t} else if (id.slice(1) !== (bndId = tagStack.shift())) {\n\t\t\t\t// See jsviews/issues/213\n\t\t\t\tsyntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>');\n\t\t\t}\n\t\t}\n\t\tif (tag) {\n\t\t\tinTag = tag;\n\t\t\t// If there are ids (markers since the last tag), move them to the defer string\n\t\t\ttagStack.unshift(parentTag);\n\t\t\tparentTag = tag.slice(1);\n\t\t\tif (validate && tagStack[0] && tagStack[0] === badParent[parentTag]) {\n\t\t\t\t// Missing \n\t\t\t\t// TODO: replace this by smart insertion of tags\n\t\t\t\terror('Parent of must be ');\n\t\t\t}\n\t\t\tisVoid = voidElems[parentTag];\n\t\t\tif ((elCnt = elContent[parentTag]) && !prevElCnt) {\n\t\t\t\tdeferStack.unshift(defer);\n\t\t\t\tdefer = \"\";\n\t\t\t}\n\t\t\tprevElCnt = elCnt;\n//TODO Consider providing validation which throws if you place as child of , etc. - since if not caught,\n//this can cause errors subsequently which are difficult to debug.\n//\t\t\t\tif (elContent[tagStack[0]]>2 && !elCnt) {\n//\t\t\t\t\terror(parentTag + \" in \" + tagStack[0]);\n//\t\t\t\t}\n\t\t\tif (defer && elCnt) {\n\t\t\t\tdefer += \"+\"; // Will be used for stepping back through deferred tokens\n\t\t\t}\n\t\t}\n\t\treturn preceding;\n\t}\n\n\tfunction processViewInfos(vwInfos, targetParent) {\n\t\t// If targetParent, we are processing viewInfos (which may include navigation through '+-' paths) and hooking up to the right parentElem etc.\n\t\t// (and elem may also be defined - the next node)\n\t\t// If no targetParent, then we are processing viewInfos on newly inserted content\n\t\tvar deferPath, deferChar, bindChar, parentElem, id, onAftCr, deep,\n\t\t\taddedBindEls = [];\n\n\t\t// In elCnt context (element-only content model), prevNode is the first node after the open, nextNode is the first node after the close.\n\t\t// If both are null/undefined, then open and close are at end of parent content, so the view is empty, and its placeholder is the\n\t\t// 'lastChild' of the parentNode. If there is a prevNode, then it is either the first node in the view, or the view is empty and\n\t\t// its placeholder is the 'previousSibling' of the prevNode, which is also the nextNode.\n\t\tif (vwInfos) {\n\t\t\tif (vwInfos._tkns.charAt(0) === \"@\") {\n\t\t\t\t// We are processing newly inserted content. This is a special script element that was created in convertMarkers() to process deferred bindings,\n\t\t\t\t// and inserted following the target parent element - because no element tags (outside elCnt) were encountered to carry those binding tokens.\n\t\t\t\t// We will step back from the preceding sibling of this element, looking at targetParent elements until we find the one that the current binding\n\t\t\t\t// token belongs to. Set elem to null (the special script element), and remove it from the DOM.\n\t\t\t\ttargetParent = elem.previousSibling;\n\t\t\t\telem.parentNode.removeChild(elem);\n\t\t\t\telem = undefined;\n\t\t\t}\n\t\t\tlen = vwInfos.length;\n\t\t\twhile (len--) {\n\t\t\t\tvwInfo = vwInfos[len];\n//if (prevIds.indexOf(vwInfo.token) < 0) { // This token is a newly created view or tag binding\n\t\t\t\tbindChar = vwInfo.ch;\n\t\t\t\tif (deferPath = vwInfo.path) {\n\t\t\t\t\t// We have a 'deferred path'\n\t\t\t\t\tj = deferPath.length - 1;\n\t\t\t\t\twhile (deferChar = deferPath.charAt(j--)) {\n\t\t\t\t\t\t// Use the \"+\" and\"-\" characters to navigate the path back to the original parent node where the deferred bindings ocurred\n\t\t\t\t\t\tif (deferChar === \"+\") {\n\t\t\t\t\t\t\tif (deferPath.charAt(j) === \"-\") {\n\t\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t\t\ttargetParent = targetParent.previousSibling;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttargetParent = targetParent.parentNode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttargetParent = targetParent.lastChild;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Note: Can use previousSibling and lastChild, not previousElementSibling and lastElementChild,\n\t\t\t\t\t\t// since we have removed white space within elCnt. Hence support IE < 9\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (bindChar === \"^\") {\n\t\t\t\t\tif (tag = bindingStore[id = vwInfo.id]) {\n\t\t\t\t\t\t// The binding may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\t\t// This is a tag binding\n\t\t\t\t\t\tdeep = targetParent && (!elem || elem.parentNode !== targetParent); // We are stepping back looking for the right targetParent,\n\t\t\t\t\t\t// or we are linking existing content and this element is in elCnt, not an immediate child of the targetParent.\n\t\t\t\t\t\tif (!elem || deep) {\n\t\t\t\t\t\t\ttag.parentElem = targetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (vwInfo.elCnt && deep) {\n\t\t\t\t\t\t\t// With element only content, if there is no following element, or if the binding is deeper than the following element\n\t\t\t\t\t\t\t// then we need to set the open or close token as a deferred binding annotation on the parent\n\t\t\t\t\t\t\tsetDefer(targetParent, (vwInfo.open ? \"#\" : \"/\") + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This is an open or close marker for a data-linked tag {^{...}}. Add it to bindEls.\n\t\t\t\t\t\taddedBindEls.push([deep ? null : elem, vwInfo]);\n\t\t\t\t\t}\n\t\t\t\t} else if (view = viewStore[id = vwInfo.id]) {\n\t\t\t\t\t// The view may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\tif (!view.parentElem) {\n\t\t\t\t\t\t// If view is not already extended for JsViews, extend and initialize the view object created in JsRender, as a JsViews view\n\t\t\t\t\t\tview.parentElem = targetParent || elem && elem.parentNode || parentNode;\n\t\t\t\t\t\tview._.onRender = addBindingMarkers;\n\t\t\t\t\t\tview._.onArrayChange = arrayChangeHandler;\n\t\t\t\t\t\tsetArrayChangeLink(view);\n\t\t\t\t\t}\n\t\t\t\t\tparentElem = view.parentElem;\n\t\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t\t// This is an 'open view' node (preceding script marker node,\n\t\t\t\t\t\t// or if elCnt, the first element in the view, with a data-jsv annotation) for binding\n\t\t\t\t\t\tview._elCnt = vwInfo.elCnt;\n\t\t\t\t\t\tif (targetParent && !elem) {\n\t\t\t\t\t\t\tsetDefer(targetParent, \"#\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No targetParent, so there is a ._nxt elem (and this is processing tokens on the elem)\n\t\t\t\t\t\t\tif (!view._prv) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is a 'close view' marker node for binding\n\t\t\t\t\t\tif (targetParent && (!elem || elem.parentNode !== targetParent)) {\n\t\t\t\t\t\t\t// There is no ._nxt so add token to _df. It is deferred.\n\t\t\t\t\t\t\tsetDefer(targetParent, \"/\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t\tview._nxt = undefined;\n\t\t\t\t\t\t} else if (elem) {\n\t\t\t\t\t\t\t// This view did not have a ._nxt, but has one now, so token may be in _df, and must be removed. (No longer deferred)\n\t\t\t\t\t\t\tif (!view._nxt) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._nxt = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (onAftCr = view.ctx && view.ctx[onAfterCreateStr] || onAfterCreate) {\n\t\t\t\t\t\t\tonAftCr.call(view.ctx.tag, view);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n//}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen = addedBindEls.length;\n\t\t\twhile (len--) {\n\t\t\t\t// These were added in reverse order to addedBindEls. We push them in BindEls in the correct order.\n\t\t\t\tbindEls.push(addedBindEls[len]);\n\t\t\t}\n\t\t}\n\t\treturn !vwInfos || vwInfos.elCnt;\n\t}\n\n\tfunction getViewInfos(vwInfos) {\n\t\t// Used by view.childTags() and tag.childTags()\n\t\t// Similar to processViewInfos in how it steps through bindings to find tags. Only finds data-linked tags.\n\t\tvar level, parentTag, named;\n\n\t\tif (vwInfos) {\n\t\t\tlen = vwInfos.length;\n\t\t\tfor (j = 0; j < len; j++) {\n\t\t\t\tvwInfo = vwInfos[j];\n\t\t\t\t// This is an open marker for a data-linked tag {^{...}}, within the content of the tag whose id is get.id. Add it to bindEls.\n\t\t\t\t// Note - if bindingStore[vwInfo.id]._is === \"tag\" then getViewInfos is being called too soon - during first linking pass\n\t\t\t\tparentTag = tag = bindingStore[vwInfo.id].linkCtx.tag;\n\t\t\t\tnamed = tag.tagName === tagName;\n\t\t\t\tif (!tag.flow || named) {\n\t\t\t\t\tif (!deep) {\n\t\t\t\t\t\tlevel = 1;\n\t\t\t\t\t\twhile (parentTag = parentTag.parent) {\n\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagDepth = tagDepth || level; // The level of the first tag encountered.\n\t\t\t\t\t}\n\t\t\t\t\tif ((deep || level === tagDepth) && (!tagName || named)) {\n\t\t\t\t\t\t// Filter on top-level or tagName as appropriate\n\t\t\t\t\t\ttags.push(tag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dataLink() {\n\t\t//================ Data-link and fixup of data-jsv annotations ================\n\t\tvar j, index,\n\t\t\ttokens = \"\",\n\t\t\twrap = {},\n\t\t\tselector = linkViewsSel + (get ? \",[\" + deferAttr + \"]\" : \"\");\n\t\t\t// If a childTags() call, get = \",[\" + deferAttr + \"]\" - since we need to include elements that have a ._df expando for deferred tokens\n\n\t\telems = qsa ? parentNode.querySelectorAll(selector) : $(selector, parentNode).get();\n\t\tl = elems.length;\n\n\t\t// The prevNode will be in the returned query, since we called markPrevOrNextNode() on it.\n\t\t// But it may have contained nodes that satisfy the selector also.\n\t\tif (prevNode && prevNode.innerHTML) {\n\t\t\t// Find the last contained node of prevNode, to use as the prevNode - so we only link subsequent elems in the query\n\t\t\tprevNodes = qsa ? prevNode.querySelectorAll(selector) : $(selector, prevNode).get();\n\t\t\tprevNode = prevNodes.length ? prevNodes[prevNodes.length - 1] : prevNode;\n\t\t}\n\n\t\ttagDepth = 0;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = elems[i];\n\t\t\tif (prevNode && !found) {\n\t\t\t\t// If prevNode is set, not false, skip linking. If this element is the prevNode, set to false so subsequent elements will link.\n\t\t\t\tfound = (elem === prevNode);\n\t\t\t} else if (nextNode && elem === nextNode) {\n\t\t\t\t// If nextNode is set then break when we get to nextNode\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (elem.parentNode) {\n\t\t\t\t// elem has not been removed from DOM\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t\tif (elem._df) {\n\t\t\t\t\t\tj = i + 1;\n\t\t\t\t\t\twhile (j < l && elem.contains(elems[j])) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add defered tokens after any tokens on descendant elements of this one\n\t\t\t\t\t\twrap[j-1] = elem._df;\n\t\t\t\t\t}\n\t\t\t\t\tif (wrap[i]) {\n\t\t\t\t\t\ttokens += wrap[i] || \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isLink && (vwInfo = viewInfos(elem, undefined, rViewMarkers)) && (vwInfo = vwInfo[0])) {\n\t\t\t\t\t\t// If this is a link(trueOrString ...) call we will avoid re-binding to elems that are within template-rendered views\n\t\t\t\t\t\tskip = skip ? (vwInfo.id !== skip && skip) : vwInfo.open && vwInfo.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (!skip && processInfos(viewInfos(elem))\n\t\t\t\t\t\t// If a link() call, processViewInfos() adds bindings to bindEls, and returns true for non-script nodes, for adding data-link bindings\n\t\t\t\t\t\t// If a childTags() call, getViewInfos returns array of tag bindings.\n\t\t\t\t\t\t\t&& elem.getAttribute($viewsLinkAttr)) {\n\t\t\t\t\t\tbindEls.push([elem]); // A data-linked element so add to bindEls too\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (get) {\n\t\t\ttokens += parentNode._df || \"\";\n\t\t\tif (index = tokens.indexOf(\"#\" + get.id) + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so start after the open token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(index + get.id.length);\n\t\t\t}\n\t\t\tindex = tokens.indexOf(\"/\" + get.id);\n\t\t\tif (index + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so don't look beyond the close token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(0, index);\n\t\t\t}\n\t\t\t// Call getViewInfos to add the found childTags to the tags array\n\t\t\tgetViewInfos(viewInfos(tokens, undefined, rOpenTagMarkers));\n\t\t}\n\n\t\tif (html === undefined && parentNode.getAttribute($viewsLinkAttr)) {\n\t\t\tbindEls.push([parentNode]); // Support data-linking top-level element directly (not within a data-linked container)\n\t\t}\n\n\t\t// Remove temporary marker script nodes they were added by markPrevOrNextNode\n\t\tunmarkPrevOrNextNode(prevNode, elCnt);\n\t\tunmarkPrevOrNextNode(nextNode, elCnt);\n\n\t\tif (get) {\n\t\t\tif (lazyLink) {\n\t\t\t\tlazyLink.resolve();\n\t\t\t}\n\t\t\treturn; // We have added childTags to the tags array, so we are done\n\t\t}\n\n\t\tif (elCnt && defer + ids) {\n\t\t\t// There are some views with elCnt, for which the open or close did not precede any HTML tag - so they have not been processed yet\n\t\t\telem = nextNode;\n\t\t\tif (defer) {\n\t\t\t\tif (nextNode) {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer + \"+\", true), nextNode);\n\t\t\t\t} else {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer, true), parentNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocessViewInfos(viewInfos(ids, true), parentNode);\n\t\t\t// If there were any tokens on nextNode which have now been associated with inserted HTML tags, remove them from nextNode\n\t\t\tif (nextNode) {\n\t\t\t\ttokens = nextNode.getAttribute(jsvAttrStr);\n\t\t\t\tif (l = tokens.indexOf(prevIds) + 1) {\n\t\t\t\t\ttokens = tokens.slice(l + prevIds.length - 1);\n\t\t\t\t}\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, ids + tokens);\n\t\t\t}\n\t\t}\n\n\t\t//================ Bind the data-linked elements and tags ================\n\t\tl = bindEls.length;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = bindEls[i];\n\t\t\tlinkInfo = elem[1];\n\t\t\telem = elem[0];\n\t\t\tif (linkInfo) {\n\t\t\t\tif (tag = bindingStore[linkInfo.id]) {\n\t\t\t\t\tif (linkCtx = tag.linkCtx) {\n\t\t\t\t\t\t// The tag may have been stored temporarily on the bindingStore - or may have already been replaced by the actual binding\n\t\t\t\t\t\ttag = linkCtx.tag;\n\t\t\t\t\t\ttag.linkCtx = linkCtx;\n\t\t\t\t\t}\n\t\t\t\t\tif (linkInfo.open) {\n\t\t\t\t\t\t// This is an 'open linked tag' binding annotation for a data-linked tag {^{...}}\n\t\t\t\t\t\tif (elem) {\n\t\t\t\t\t\t\ttag.parentElem = elem.parentNode;\n\t\t\t\t\t\t\ttag._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttag._elCnt = linkInfo.elCnt;\n\t\t\t\t\t\t// We data-link depth-first (\"on the way in\"), which is better for perf - and allows setting parent tags etc.\n\t\t\t\t\t\tview = tag.tagCtx.view;\n\t\t\t\t\t\taddDataBinding(undefined, tag._prv, view, linkInfo.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag._nxt = elem;\n\t\t\t\t\t\tif (tag._.unlinked) {\n\t\t\t\t\t\t\t// This is a 'close linked tag' binding annotation\n\t\t\t\t\t\t\t// Add data binding\n\t\t\t\t\t\t\ttagCtx = tag.tagCtx;\n\t\t\t\t\t\t\tview = tagCtx.view;\n\t\t\t\t\t\t\tcallAfterLink(tag);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Add data binding for a data-linked element (with data-link attribute)\n\t\t\t\taddDataBinding(elem.getAttribute($viewsLinkAttr), elem, $view(elem), undefined, isLink, outerData, context);\n\t\t\t}\n\t\t}\n\t\tif (lazyLink) {\n\t\t\tlazyLink.resolve();\n\t\t}\n\t}\n\t//==== /end of nested functions ====\n\n\tvar inTag, linkCtx, tag, i, l, j, len, elems, elem, view, vwInfo, linkInfo, prevNodes, token, prevView, nextView,\n\t\tnode, tags, deep, tagName, tagCtx, validate, tagDepth, depth, fragment, copiedNode, firstTag, parentTag,\n\t\tisVoid, wrapper, div, tokens, elCnt, prevElCnt, htmlTag, ids, prevIds, found, skip, lazyLink, isLink, get,\n\t\tself = this,\n\t\tthisId = self._.id + \"_\",\n\t\tdefer = \"\",\n\t\t// The marker ids for which no tag was encountered (empty views or final closing markers) which we carry over to container tag\n\t\tbindEls = [],\n\t\ttagStack = [],\n\t\tdeferStack = [],\n\t\tonAfterCreate = self.hlp(onAfterCreateStr),\n\t\tprocessInfos = processViewInfos;\n\n\tif (refresh) {\n\t\tlazyLink = refresh.lazyLink && $.Deferred();\n\t\tif (refresh.tmpl) {\n\t\t\t// refresh is the prevView, passed in from addViews()\n\t\t\tprevView = \"/\" + refresh._.id + \"_\";\n\t\t} else {\n\t\t\tisLink = refresh.lnk; // Top-level linking\n\t\t\tif (refresh.tag) {\n\t\t\t\tthisId = refresh.tag + \"^\";\n\t\t\t\trefresh = true;\n\t\t\t}\n\t\t\tif (get = refresh.get) {\n\t\t\t\tprocessInfos = getViewInfos;\n\t\t\t\ttags = get.tags;\n\t\t\t\tdeep = get.deep;\n\t\t\t\ttagName = get.name;\n\t\t\t}\n\t\t}\n\t\trefresh = refresh === true;\n\t}\n\n\tparentNode = parentNode\n\t\t? (\"\" + parentNode === parentNode\n\t\t\t? $(parentNode)[0] // It is a string, so treat as selector\n\t\t\t: parentNode.jquery\n\t\t\t\t? parentNode[0] // A jQuery object - take first element.\n\t\t\t\t: parentNode)\n\t\t: (self.parentElem // view.link()\n\t\t\t|| document.body); // link(null, data) to link the whole document\n\n\tvalidate = !$subSettingsAdvanced.noValidate && parentNode.contentEditable !== TRUE;\n\tparentTag = parentNode.tagName.toLowerCase();\n\telCnt = !!elContent[parentTag];\n\n\tprevNode = prevNode && markPrevOrNextNode(prevNode, elCnt);\n\tnextNode = nextNode && markPrevOrNextNode(nextNode, elCnt) || null;\n\n\tif (html != undefined) {\n\t\t//================ Insert html into DOM using documentFragments (and wrapping HTML appropriately). ================\n\t\t// Also convert markers to DOM annotations, based on content model.\n\t\t// Corresponds to nextNode ? $(nextNode).before(html) : $(parentNode).html(html);\n\t\t// but allows insertion to wrap correctly even with inserted script nodes. jQuery version will fail e.g. under tbody or select.\n\t\t// This version should also be slightly faster\n\t\tdiv = document.createElement(\"div\");\n\t\twrapper = div;\n\t\tprevIds = ids = \"\";\n\t\thtmlTag = parentNode.namespaceURI === \"http://www.w3.org/2000/svg\" ? \"svg_ns\" : (firstTag = rFirstElem.exec(html)) && firstTag[1] || \"\";\n\t\tif (elCnt) {\n\t\t\t// Now look for following view, and find its tokens, or if not found, get the parentNode._df tokens\n\t\t\tnode = nextNode;\n\t\t\twhile (node && !(nextView = viewInfos(node))) {\n\t\t\t\tnode = node.nextSibling;\n\t\t\t}\n\t\t\tif (tokens = nextView ? nextView._tkns : parentNode._df) {\n\t\t\t\ttoken = prevView || \"\";\n\t\t\t\tif (refresh || !prevView) {\n\t\t\t\t\ttoken += \"#\" + thisId;\n\t\t\t\t}\n\t\t\t\tj = tokens.indexOf(token);\n\t\t\t\tif (j + 1) {\n\t\t\t\t\tj += token.length;\n\t\t\t\t\t// Transfer the initial tokens to inserted nodes, by setting them as the ids variable, picked up in convertMarkers\n\t\t\t\t\tprevIds = ids = tokens.slice(0, j);\n\t\t\t\t\ttokens = tokens.slice(j);\n\t\t\t\t\tif (nextView) {\n\t\t\t\t\t\tnode.setAttribute(jsvAttrStr, tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetDefer(parentNode, tokens);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//================ Convert the markers to DOM annotations, based on content model. ================\n//\t\t\toldElCnt = elCnt;\n\t\tisVoid = undefined;\n\t\thtml = (\"\" + html).replace(rConvertMarkers, convertMarkers);\n//\t\t\tif (!!oldElCnt !== !!elCnt) {\n//\t\t\t\terror(\"Parse: \" + html); // Parse error. Content not well-formed?\n//\t\t\t}\n\t\tif (validate && tagStack.length) {\n\t\t\tsyntaxError(\"Mismatched '<\" + parentTag + \"...>' in:\\n\" + html); // Unmatched tag\n\t\t}\n\t\tif (validateOnly) {\n\t\t\treturn;\n\t\t}\n\t\t// Append wrapper element to doc fragment\n\t\tsafeFragment.appendChild(div);\n\n\t\t// Go to html and back, then peel off extra wrappers\n\t\t// Corresponds to jQuery $(nextNode).before(html) or $(parentNode).html(html);\n\t\t// but supports svg elements, and other features missing from jQuery version (and this version should also be slightly faster)\n\t\thtmlTag = wrapMap[htmlTag] || wrapMap.div;\n\t\tdepth = htmlTag[0];\n\t\twrapper.innerHTML = htmlTag[1] + html + htmlTag[2];\n\t\twhile (depth--) {\n\t\t\twrapper = wrapper.lastChild;\n\t\t}\n\t\tsafeFragment.removeChild(div);\n\t\tfragment = document.createDocumentFragment();\n\t\twhile (copiedNode = wrapper.firstChild) {\n\t\t\tfragment.appendChild(copiedNode);\n\t\t}\n\t\t// Insert into the DOM\n\t\tparentNode.insertBefore(fragment, nextNode);\n\t}\n\n\tif (lazyLink) {\n\t\tsetTimeout(dataLink, 0);\n\t} else {\n\t\tdataLink();\n\t}\n\n\treturn lazyLink && lazyLink.promise();\n}\n\nfunction addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) {\n\t// Add data binding for data-linked elements or {^{...}} data-linked tags\n\tvar tmpl, tokens, attr, convertBack, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, lastIndex,\n\t\tlinkExpressions = [];\n\n\tif (boundTagId) {\n\t\t// boundTagId is a string for {^{...}} data-linked tag. So only one linkTag in linkMarkup\n\t\t// data and context parameters are undefined\n\t\ttag = bindingStore[boundTagId];\n\t\ttag = tag.linkCtx ? tag.linkCtx.tag : tag;\n\n\t\tlinkCtx = tag.linkCtx || {\n\t\t\ttype: \"inline\",\n\t\t\tdata: currentView.data, // source\n\t\t\telem: tag._elCnt ? tag.parentElem : node, // target\n\t\t\tview: currentView,\n\t\t\tctx: currentView.ctx,\n\t\t\tattr: HTML, // Script marker nodes are associated with {^{ and always target HTML.\n\t\t\tfn: tag._.bnd,\n\t\t\ttag: tag,\n\t\t\t// Pass the boundTagId in the linkCtx, so that it can be picked up in observeAndBind\n\t\t\t_bndId: boundTagId\n\t\t};\n\t\tbindDataLinkTarget(linkCtx, linkCtx.fn);\n\t} else if (linkMarkup && node) {\n\t\t// If isLink then this is a top-level linking: .link(expression, target, data, ....) or\n\t\t// .link(true, target, data, ....) scenario - and data and context are passed in separately from the view\n\t\tdata = isLink ? data : currentView.data;\n\n\t\t// Compiled linkFn expressions could be stored in the tmpl.links array of the template\n\t\t// TODO - consider also caching globally so that if {{:foo}} or data-link=\"foo\" occurs in different places,\n\t\t// the compiled template for this is cached and only compiled once...\n\t\t//links = currentView.links || currentView.tmpl.links;\n\n\t\ttmpl = currentView.tmpl;\n\n//\t\t\tif (!(linkTags = links[linkMarkup])) {\n\t\t// This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template.\n\n\t\tlinkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node));\n\t\tlastIndex = rTagDatalink.lastIndex = 0;\n\t\twhile (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \\}(!\\}) option.\n\t\t\tlinkExpressions.push(tokens);\n\t\t\tlastIndex = rTagDatalink.lastIndex;\n\t\t}\n\t\tif (lastIndex < linkMarkup.length) {\n\t\t\tsyntaxError(linkMarkup);\n\t\t}\n\t\twhile (tokens = linkExpressions.shift()) {\n\t\t\t// Iterate over the data-link expressions, for different target attrs,\n\t\t\t// e.g. ~description(firstName, lastName)}\"\n\t\t\t// tokens: [all, attr, bindOnly, tagExpr, tagName, converter, colon, html, comment, code, params]\n\t\t\trTagIndex = rTagDatalink.lastIndex;\n\t\t\tattr = tokens[1];\n\t\t\ttagExpr = tokens[3];\n\t\t\twhile (linkExpressions[0] && linkExpressions[0][4] === \"else\") { // If this is {someTag...} and is followed by an {else...} add to tagExpr\n\t\t\t\ttagExpr += delimCloseChar1 + delimOpenChar0 + linkExpressions.shift()[3];\n\t\t\t\thasElse = true;\n\t\t\t}\n\t\t\tif (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}\n\t\t\t\ttagExpr += delimCloseChar1 + delimOpenChar0 + delimOpenChar1 + \"/\" + tokens[4] + delimCloseChar0;\n\t\t\t}\n\t\t\tlinkCtx = {\n\t\t\t\ttype: isLink ? \"top\" : \"link\",\n\t\t\t\tdata: data, // source\n\t\t\t\telem: node, // target\n\t\t\t\tview: currentView,\n\t\t\t\tctx: context,\n\t\t\t\tattr: attr,\n\t\t\t\tisLk: isLink, // top-level linking?\n\t\t\t\t_toLk : 1, // Flag to data-link on initial data-link call rendering call\n\t\t\t\t_noUpd : tokens[2] // Flag for data-link=\"^{...}\" so on initial data-link call will bind, but not render)\n\t\t\t};\n\n\t\t\tconvertBack = undefined;\n\t\t\tif (tokens[6]) {\n\t\t\t\tconvertBack = tokens[10] || undefined;\n\t\t\t\tlinkCtx.convert = tokens[5] || \"\";\n\t\t\t\tif (!attr && convertBack !== undefined && defaultAttr(node)) {\n\t\t\t\t\t// Default target, so allow 2 way binding\n\t\t\t\t\tlinkCtx.convertBack = convertBack = convertBack.slice(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Compile the linkFn expression which evaluates and binds a data-link expression\n\t\t\t// TODO - optimize for the case of simple data path with no conversion, helpers, etc.:\n\t\t\t// i.e. data-link=\"a.b.c\". Avoid creating new instances of Function every time. Can use a default function for all of these...\n\n\t\t\tlinkCtx.expr = attr + tagExpr;\n\t\t\tlinkFn = tmpl.links[tagExpr];\n\t\t\tif (!linkFn) {\n\t\t\t\ttmpl.links[tagExpr] = linkFn = $sub.tmplFn(tagExpr, tmpl, true, convertBack, hasElse);\n\t\t\t}\n\t\t\tlinkCtx.fn = linkFn;\n\t\t\tbindDataLinkTarget(linkCtx, linkFn);\n\t\t\t// We store rTagIndex in local scope, since this addDataBinding method can sometimes be called recursively,\n\t\t\t// and each is using the same rTagDatalink instance.\n\t\t\trTagDatalink.lastIndex = rTagIndex;\n\t\t}\n//\t\t}\n\t}\n}\n\nfunction bindDataLinkTarget(linkCtx, linkFn) {\n\t// Add data link bindings for a link expression in data-link attribute markup\n\tfunction handler(ev, eventArgs) {\n\t\tpropertyChangeHandler.call(linkCtx, ev, eventArgs, linkFn);\n\t\t// If the link expression uses a custom tag, the propertyChangeHandler call will call renderTag, which will set tagCtx on linkCtx\n\t}\n\thandler.noArray = true;\n\tif (linkCtx.isLk) {\n\t\t// Top-level linking: .link(expressionOrTrue, data, context) - so we need to create a view for the linking, with the data and ctx\n\t\t// which may be different than the current context of the target. Note that this view is not a standard data-linked view, so it will\n\t\t// be disposed only when its parent view is disposed.\n\t\taddLinkMethods(linkCtx.view = new $sub.View(\n\t\t\t$sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx),\n\t\t\t\"link\", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers));\n\t}\n\tlinkCtx._ctxCb = $sub._gccb(linkCtx.view); // getContextCallback: _ctxCb, for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]}\n\tlinkCtx._hdl = handler;\n\t// handler._ctx = linkCtx; Could pass linkCtx for use in a depends = function() {} call, so depends is different for different linkCtx's\n\thandler(true);\n}\n\n//=====================\n// Data-linking helpers\n//=====================\n\nfunction removeSubStr(str, substr) {\n\tvar k;\n\treturn str\n\t\t? (k = str.indexOf(substr),\n\t\t\t(k + 1\n\t\t\t\t? str.slice(0, k) + str.slice(k + substr.length)\n\t\t\t\t: str))\n\t\t: \"\";\n}\n\nfunction markerNodeInfo(node) {\n\treturn node &&\n\t\t(\"\" + node === node\n\t\t\t? node\n\t\t\t: node.tagName === SCRIPT\n\t\t\t\t? node.type.slice(3)\n\t\t\t\t: node.nodeType === 1 && node.getAttribute(jsvAttrStr) || \"\");\n}\n\nfunction viewInfos(node, isVal, rBinding) {\n\t// Test whether node is a script marker node, and if so, return metadata\n\tfunction getInfos(all, open, close, id, ch, elPath) {\n\t\tinfos.push({\n\t\t\telCnt: elCnt,\n\t\t\tid: id,\n\t\t\tch: ch,\n\t\t\topen: open,\n\t\t\tclose: close,\n\t\t\tpath: elPath,\n\t\t\ttoken: all\n\t\t});\n\t}\n\tvar elCnt, tokens,\n\t\tinfos = [];\n\tif (tokens = isVal ? node : markerNodeInfo(node)) {\n\t\telCnt = infos.elCnt = node.tagName !== SCRIPT;\n\t\telCnt = tokens.charAt(0) === \"@\" || elCnt;\n\t\tinfos._tkns = tokens;\n\t\t// rMarkerTokens = /(?:(#)|(\\/))(\\d+)([_^])([-+@\\d]+)?/g;\n\t\ttokens.replace(rBinding || rMarkerTokens, getInfos);\n\t\treturn infos;\n\t}\n}\n\nfunction unmarkPrevOrNextNode(node, elCnt) {\n\tif (node) {\n\t\tif (node.type === \"jsv\") {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t} else if (elCnt && node.getAttribute($viewsLinkAttr) === \"\") {\n\t\t\tnode.removeAttribute($viewsLinkAttr);\n\t\t}\n\t}\n}\n\nfunction markPrevOrNextNode(node, elCnt) {\n\tvar marker = node;\n\twhile (elCnt && marker && marker.nodeType !== 1) {\n\t\tmarker = marker.previousSibling;\n\t}\n\tif (marker) {\n\t\tif (marker.nodeType !== 1) {\n\t\t\t// For text nodes, we will add a script node before\n\t\t\tmarker = document.createElement(SCRIPT);\n\t\t\tmarker.type = \"jsv\";\n\t\t\tnode.parentNode.insertBefore(marker, node);\n\t\t} else if (!markerNodeInfo(marker) && !marker.getAttribute($viewsLinkAttr)) {\n\t\t\t// For element nodes, we will add a data-link attribute (unless there is already one)\n\t\t\t// so that this node gets included in the node linking process.\n\t\t\tmarker.setAttribute($viewsLinkAttr, \"\");\n\t\t}\n\t}\n\treturn marker;\n}\n\nfunction normalizeLinkTag(linkMarkup, twoway) {\n\tlinkMarkup = $.trim(linkMarkup).replace(rEscapeQuotes, \"\\\\$&\");\n\treturn linkMarkup.slice(-1) !== delimCloseChar0\n\t// If simplified syntax is used: data-link=\"expression\", convert to data-link=\"{:expression}\",\n\t// or for inputs, data-link=\"{:expression:}\" for (default) two-way binding\n\t\t? linkMarkup = delimOpenChar1 + \":\" + linkMarkup + (twoway ? \":\" : \"\") + delimCloseChar0\n\t\t: linkMarkup;\n}\n\n//===========================\n// Methods for views and tags\n//===========================\n\nfunction callAfterLink(tag, ev, eventArgs) {\n\tvar linkedElem, displayElem, linkedEl, val, l, linkedTag, oldTrig, newTrig, tagProps, propsExpr, linkedElemView, prop, propDef,\n\t\ttagCtx = tag.tagCtx,\n\t\tview = tagCtx.view,\n\t\tprops = tagCtx.props,\n\t\tlinkCtx = tag.linkCtx;\n\n\tif (tag._.unlinked) { // First call to onAfterLink, or first call after onUpdate: updateContent. Initialize and call onBind and set properties\n\t\tif (tag.linkedElement !== undefined) {\n\t\t\t// linkedElement: - selector for identifying linked element in template/rendered content\n\t\t\ttag.linkedElem = tag._.inline ? tag.contents(true, tag.linkedElement || \"*\").first() : $(linkCtx.elem);\n\t\t}\n\t\tif (tag.onBind) {\n\t\t\ttag.onBind(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t\t}\n\t}\n\n\tif (tag.onAfterLink) {\n\t\ttag.onAfterLink(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t}\n\n\tlinkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem;\n\tdisplayElem = tag.displayElem || linkedElem;\n\n\tif (linkedElem && linkedElem[0]) {\n\t\tval = tag.cvtArgs()[0];\n\t\tif (val !== undefined && !tag._.chging) {\n\t\t\tl = linkedElem.length;\n\t\t\twhile (l--) {\n\t\t\t\tlinkedEl = linkedElem[l];\n\t\t\t\tif (tag._.unlinked && linkedEl !== linkCtx.elem) {\n\t\t\t\t\tlinkedTag = linkedEl._jsvLkEl;\n\t\t\t\t\tif (tag._.inline && (!linkedTag || linkedTag !== tag && linkedTag.targetTag !== tag)) {\n\t\t\t\t\t\t// For data-linked tags, identify the linkedEl with the tag, for \"to\" binding\n\t\t\t\t\t\t// (For data-linked elements, if not yet bound, we identify later when the linkCtx.elem is bound)\n\t\t\t\t\t\tlinkedEl._jsvLkEl = tag;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag, linkedEl);\n\t\t\t\t\t\tlinkedEl._jsvBnd = \"&\" + tag._tgId + \"+\"; // Add a \"+\" for cloned binding - so removing\n\t\t\t\t\t\t// elems with cloned bindings will not remove the 'parent' binding from the bindingStore.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (val !== undefined) {\n\t\t\t\t\tif (linkedEl.value !== undefined) {\n\t\t\t\t\t\tif (linkedEl.type === CHECKBOX) {\n\t\t\t\t\t\t\tlinkedEl[CHECKED] = val && val !== \"false\";\n\t\t\t\t\t\t} else if (linkedEl.type === RADIO) {\n\t\t\t\t\t\t\tlinkedEl[CHECKED] = (linkedEl.value === val);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(linkedEl).val(val); // Use jQuery for attrHooks - can't just set value (on select, for example)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (linkedEl.contentEditable === TRUE) {\n\t\t\t\t\t\tlinkedEl.innerHTML = val;\n\t\t\t\t\t}\n\t\t\t\t\tlinkCtx._val = val;\n\t\t\t\t}\n\t\t\t\tif (props.name) {\n\t\t\t\t\tlinkedEl.name = linkedEl.name || props.name;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tag.setSize) {\n\t\t\tif (props.height) {\n\t\t\t\tdisplayElem.height(props.height);\n\t\t\t}\n\t\t\tif (props.width) {\n\t\t\t\tdisplayElem.width(props.width);\n\t\t\t}\n\t\t}\n\t\tif (props.title !== undefined) {\n\t\t\tdisplayElem.attr(\"title\", props.title);\n\t\t}\n\t\tif (props[\"class\"]) {\n\t\t\t// This code supports dynamic binding to class - where it adds the class if absent, and removes/adds if a previous value is present\n\t\t\tif (eventArgs && displayElem.hasClass(eventArgs.oldValue)) {\n\t\t\t\tdisplayElem.removeClass(eventArgs.oldValue);\n\t\t\t}\n\t\t\tdisplayElem.addClass(props[\"class\"]);\n\t\t}\n\t\tif (props.id) {\n\t\t\tlinkedElem[0].id = props.id;\n\t\t}\n\t}\n\ttag._.unlinked = undefined;\n}\n\nfunction asyncElemChangeHandler(ev) {\n\tsetTimeout(function() {\n\t\telemChangeHandler(ev);\n\t}, 0);\n}\n\nfunction bindElChange($elem, trig, onoff) {\n\tif (trig) {\n\t\ttrig = \"\" + trig === trig ? trig : \"keydown\"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown'): Get 'keydown' with async\n\t\t$elem[onoff](trig, trig === \"keydown\" ? asyncElemChangeHandler : elemChangeHandler);\n\t}\n}\n\nfunction bindTo(binding, tag, linkedElem, cvtBk) {\n\t// Two-way binding.\n\t// We set the binding.to[1] to be the cvtBack, and binding.to[0] to be either the path to the target, or [object, path] where the target is the path on the provided object.\n\t// So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, \"d.e\"], and we bind to the path on the returned object, exprOb.ob, as target\n\t// Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z\n\n\tvar bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l,\n\t\tlinkCtx = binding.linkCtx,\n\t\tcontextCb = linkCtx._ctxCb,\n\t\tsource = linkCtx.data,\n\t\tpaths = linkCtx.fn.paths[0];\n\n\ttag = tag || linkedElem._jsvLkEl;\n\n\tif (binding && paths && !binding.to) {\n\t\toldTrig = linkedElem._jsvTr || false;\n\t\tif (tag) {\n\t\t\tcvtBk = tag.convertBack || cvtBk;\n\t\t\tnewTrig = tag.tagCtx.props.trigger;\n\t\t}\n\t\tnewTrig = newTrig === undefined ? $subSettings.trigger : newTrig;\n\t\t// Trigger is noop except for text box, textarea, contenteditable...\n\t\tnewTrig = newTrig && (linkedElem.tagName === \"INPUT\" && linkedElem.type !== CHECKBOX && linkedElem.type !== RADIO || linkedElem.type === \"textarea\" || linkedElem.contentEditable === TRUE) && newTrig || false;\n\n\t\tif (oldTrig !== newTrig) {\n\t\t\t$linkedElem = $(linkedElem);\n\t\t\tbindElChange($linkedElem, oldTrig, \"off\");\n\t\t\tbindElChange(\n\t\t\t\t$linkedElem,\n\t\t\t\tlinkedElem._jsvTr = newTrig,\n\t\t\t\t\"on\"\n\t\t\t);\n\t\t}\n\n\t\tpaths = (bindto = paths._jsvto) || paths[0];\n\t\tif (pathIndex = paths && paths.length) {\n\t\t\tlastPath = paths[pathIndex - 1];\n\t\t\tif (lastPath._jsv) {\n\t\t\t\tbindtoOb = lastPath;\n\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t}\n\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t}\n\t\t\tif (path) {\n\t\t\t\tto = [\n\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\tlastPath\n\t\t\t\t\t];\n\t\t\t} else {\n\t\t\t\twhile ((to = contextCb(path = lastPath.split(\"^\").join(\".\"), source)) && (l = to.length)) {\n\t\t\t\t\t// Recursively dereference any ~foo or #bar tokens in the path. (Recursive because ~foo may be a contextual param which has\n\t\t\t\t\t// its own dependencies on other ~foo #bar components)\n\t\t\t\t\tif (to[0]._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag)\n\t\t\t\t\t\tto = to[0]; // so 'to' is the [view, expression/dependencies] for the contextual parameter\n\t\t\t\t\t\tcontextCb = $sub._gccb(to[0]); // getContextCallback: Move contextCb up to view where contextual parameter was assigned\n\t\t\t\t\t\tlastPath = to[1];\n\t\t\t\t\t\tto = [to[0].data, to[1]];\n\t\t\t\t\t\tif (lastPath._jsv) { // computed value\n\t\t\t\t\t\t\tbindtoOb = lastPath;\n\t\t\t\t\t\t\tbindtoOb.data = to[0];\n\t\t\t\t\t\t\tbindtoOb._cpCtx = contextCb;\n\t\t\t\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t\t\t\t\tto = [\n\t\t\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\t\t\tlastPath\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else { // Two-way binding to a helper - e.g. ~address.street, or computed, e.g. ~fullName(), or view property e.g. #data.foo\n\t\t\t\t\t\tto = l>2\n\t\t\t\t\t\t\t? [to[l-3], to[l-2]] // With path: [object, path]\n\t\t\t\t\t\t\t: [to[l-2]]; // No path, (e.g. [function] for computed with setter)\n\t\t\t\t\t}\n\t\t\t\t\tsource = to[0];\n\t\t\t\t\tlastPath = to[1];\n\t\t\t\t}\n\t\t\t\tto = to || [source, path]; // Two way binding to an object (neither ~foo nor #bar)\n\t\t\t}\n\t\t} else {\n\t\t\tto = [];\n\t\t}\n\t\tbinding.to = [\n\t\t\tto,\n\t\t\tcvtBk\n\t\t];\n\t}\n}\n\nfunction mergeCtxs(tag, newCtxs, replace) { // Merge updated tagCtxs into tag.tagCtxs\n\tvar tagCtx, newTagCtx,\n\t\tview = tag.tagCtx.view,\n\t\ttagCtxs = tag.tagCtxs || [tag.tagCtx],\n\t\tl = tagCtxs.length,\n\t\trefresh = !newCtxs;\n\n\tnewCtxs = newCtxs || tag._.bnd.call(view.tmpl, (tag.linkCtx || view).data, view, $sub);\n\n\tif (replace) {\n\t\t// Replace previous tagCtxs by new ones, rather than merging\n\t\ttagCtxs = tag.tagCtxs = newCtxs;\n\t\ttag.tagCtx = tagCtxs[0];\n\t} else {\n\t\twhile (l--) {\n\t\t\ttagCtx = tagCtxs[l];\n\t\t\tnewTagCtx = newCtxs[l];\n\t\t\t$observable(tagCtx.props).setProperty(newTagCtx.props);\n\t\t\t$extend(tagCtx.ctx, newTagCtx.ctx); // We don't support propagating ctx variables, ~foo, observably, to nested views. So extend, not setProperty...\n\t\t\ttagCtx.args = newTagCtx.args;\n\t\t\tif (refresh) {\n\t\t\t\ttagCtx.tmpl = newTagCtx.tmpl;\n\t\t\t}\n\t\t}\n\t}\n\t$sub._ths(tag, tagCtxs[0]); // tagHandlersFromProps\n\treturn tagCtxs;\n}\n\n//=========\n// Disposal\n//=========\n\nfunction clean(elems) {\n\t// Remove data-link bindings, or contained views\n\tvar l, elem, bindings,\n\t\telemArray = [],\n\t\tlen = elems.length,\n\t\ti = len;\n\twhile (i--) {\n\t\t// Copy into an array, so that deletion of nodes from DOM will not cause our 'i' counter to get shifted\n\t\t// (Note: This seems as fast or faster than elemArray = [].slice.call(elems); ...)\n\t\telemArray.push(elems[i]);\n\t}\n\ti = len;\n\twhile (i--) {\n\t\telem = elemArray[i];\n\t\tif (elem.parentNode) {\n\t\t\t// Has not already been removed from the DOM\n\t\t\tif (bindings = elem._jsvBnd) {\n\t\t\t\t// Get propertyChange bindings for this element\n\t\t\t\t// This may be an element with data-link, or the opening script marker node for a data-linked tag {^{...}}\n\t\t\t\t// bindings is a string with the syntax: \"(&bindingId)*\"\n\t\t\t\tbindings = bindings.slice(1).split(\"&\");\n\t\t\t\telem._jsvBnd = \"\";\n\t\t\t\tl = bindings.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\t// Remove associated bindings\n\t\t\t\t\tremoveViewBinding(bindings[l], elem._jsvLkEl, elem); // unbind bindings with this bindingId on this view\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisposeTokens(markerNodeInfo(elem) + (elem._df || \"\"));\n\t\t}\n\t}\n}\n\nfunction removeViewBinding(bindId, linkedElemTag, elem) {\n\t// Unbind\n\tvar objId, linkCtx, tag, object, obsId, tagCtxs, l, map, $linkedElem, linkedElem, trigger, view, targetTag,\n\t\tbinding = bindingStore[bindId];\n\n\tif (linkedElemTag) {\n\t\tlinkedElemTag = linkedElemTag.targetTag || linkedElemTag;\n\t\telem._jsvLkEl = undefined;\n\t} else if (binding) {\n\t\tdelete bindingStore[bindId]; // Delete already, so call to onDispose handler below cannot trigger recursive deletion (through recursive call to jQuery cleanData)\n\t\tfor (objId in binding.bnd) {\n\t\t\tobject = binding.bnd[objId];\n\t\t\tobsId = binding.cbId;\n\t\t\tif ($isArray(object)) {\n\t\t\t\t$([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange\n\t\t\t} else {\n\t\t\t\t$(object).off(propertyChangeStr + obsId);\n\t\t\t}\n\t\t\tdelete binding.bnd[objId];\n\t\t}\n\n\t\tif (linkCtx = binding.linkCtx) {\n\t\t\tif (tag = linkCtx.tag) {\n\t\t\t\tif (tagCtxs = tag.tagCtxs) {\n\t\t\t\t\tl = tagCtxs.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\tif (map = tagCtxs[l].map) {\n\t\t\t\t\t\t\tmap.unmap(); //unobserve\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$linkedElem = tag.linkedElem;\n\n\t\t\t\tif (tag.onUnbind) {\n\t\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx, true);\n\t\t\t\t}\n\t\t\t\tif (tag.onDispose) {\n\t\t\t\t\ttag.onDispose();\n\t\t\t\t}\n\n\t\t\t\tif (!tag._elCnt) {\n\t\t\t\t\tif (tag._prv) {\n\t\t\t\t\t\ttag._prv.parentNode.removeChild(tag._prv);\n\t\t\t\t\t}\n\t\t\t\t\tif (tag._nxt) {\n\t\t\t\t\t\ttag._nxt.parentNode.removeChild(tag._nxt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlinkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;\n\n\t\t\tif (trigger = linkedElem && linkedElem._jsvTr) {\n\t\t\t\tbindElChange($linkedElem || $(linkedElem), trigger, \"off\");\n\t\t\t\tlinkedElem._jsvTr = undefined;\n\t\t\t}\n\t\t\tview = linkCtx.view;\n\t\t\tif (view.type === \"link\") {\n\t\t\t\tview.parent.removeViews(view._.key, undefined, true); // A \"link\" view is associated with the binding, so should be disposed with binding.\n\t\t\t} else {\n\t\t\t\tdelete view._.bnds[bindId];\n\t\t\t}\n\t\t}\n\t\tdelete cbBindingsStore[binding.cbId];\n\t}\n}\n\nfunction $unlink(to) {\n\tif (to) {\n\t\tto = to.jquery ? to : $(to);\n\t\tto.each(function() {\n\t\t\tvar innerView;\n\t\t\t//TODO fix this for better perf. Rather that calling inner view multiple times which does querySelectorAll each time, consider a single querySelectorAll\n\t\t\t// or simply call view.removeViews() on the top-level views under the target 'to' node, then clean(...)\n\t\t\twhile ((innerView = $view(this, true)) && innerView.parent) {\n\t\t\t\tinnerView.parent.removeViews(innerView._.key, undefined, true);\n\t\t\t}\n\t\t\tclean(this.getElementsByTagName(\"*\"));\n\t\t});\n\t\tclean(to);\n\t} else {\n\t\t// Call to $.unlink() is equivalent to $.unlink(true, \"body\")\n\t\tif (activeBody) {\n\t\t\t$(activeBody)\n\t\t\t\t.off(elementChangeStr, elemChangeHandler)\n\t\t\t\t.off('blur', '[contenteditable]', elemChangeHandler);\n\t\t\tactiveBody = undefined;\n\t\t}\n\t\ttopView.removeViews();\n\t\tclean(document.body.getElementsByTagName(\"*\"));\n\t}\n}\n\n//========\n// Helpers\n//========\n\nfunction inputAttrib(elem) {\n\treturn elem.type === CHECKBOX ? elem[CHECKED] : elem.value;\n}\n\n//========================== Initialize ==========================\n\n//=====================\n// JsRender integration\n//=====================\n\n$sub.onStore.template = function(name, item) {\n\titem.link = tmplLink;\n\tif (name) {\n\t\t$.link[name] = function() {\n\t\t\treturn tmplLink.apply(item, arguments);\n\t\t};\n\t}\n};\n\n$sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method\n\n// Define JsViews version of delimiters(), and initialize\n($viewsSettings.delimiters = function() {\n\t// Run delimiters initialization in context of jsrender.js\n\tvar ret = oldJsvDelimiters.apply(0, arguments);\n\n\tif (oldJsvDelimiters !== $viewsDelimiters) {\n\t\t// If JsRender was loaded before JsViews, then need also to initialize and set globals in that JsRender instance\n\t\tret = $viewsDelimiters.apply(0, arguments);\n\t}\n\n\t// Data-linking must use new delimiters\n\trTagDatalink = new RegExp(\"(?:^|\\\\s*)([\\\\w-]*)(\\\\\" + linkChar + \")?(\\\\\" + delimOpenChar1 + $sub.rTag + \"(:\\\\w*)?\\\\\" + delimCloseChar0 + \")\", \"g\");\n\treturn ret;\n})(); // jshint ignore:line\n\n$sub.addSetting(\"trigger\");\n\n//====================================\n// Additional members for linked views\n//====================================\n\nfunction transferViewTokens(prevNode, nextNode, parentElem, id, viewOrTagChar, refresh) {\n\t// Transfer tokens on prevNode of viewToRemove/viewToRefresh to nextNode or parentElem._df\n\tvar i, l, vwInfos, vwInfo, viewOrTag, viewId, tokens,\n\t\tprecedingLength = 0,\n\t\temptyView = prevNode === nextNode;\n\n\tif (prevNode) {\n\t\t// prevNode is either the first node in the viewOrTag, or has been replaced by the vwInfos tokens string\n\t\tvwInfos = viewInfos(prevNode) || [];\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\t// Step through views or tags on the prevNode\n\t\t\tvwInfo = vwInfos[i];\n\t\t\tviewId = vwInfo.id;\n\t\t\tif (viewId === id && vwInfo.ch === viewOrTagChar) {\n\t\t\t\tif (refresh) {\n\t\t\t\t\t// This is viewOrTagToRefresh, this is the last viewOrTag to process...\n\t\t\t\t\tl = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// This is viewOrTagToRemove, so we are done...\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!emptyView) {\n\t\t\t\tviewOrTag = vwInfo.ch === \"_\"\n\t\t\t\t\t? viewStore[viewId]\n\t\t\t\t\t: bindingStore[viewId].linkCtx.tag;\n\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t// A \"#m\" token\n\t\t\t\t\tviewOrTag._prv = nextNode;\n\t\t\t\t} else if (vwInfo.close) {\n\t\t\t\t\t// A \"/m\" token\n\t\t\t\t\tviewOrTag._nxt = nextNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprecedingLength += viewId.length + 2;\n\t\t}\n\n\t\tif (precedingLength) {\n\t\t\tprevNode.setAttribute(jsvAttrStr, prevNode.getAttribute(jsvAttrStr).slice(precedingLength));\n\t\t}\n\t\ttokens = nextNode ? nextNode.getAttribute(jsvAttrStr) : parentElem._df;\n\t\tif (l = tokens.indexOf(\"/\" + id + viewOrTagChar) + 1) {\n\t\t\ttokens = vwInfos._tkns.slice(0, precedingLength) + tokens.slice(l + (refresh ? -1 : id.length + 1));\n\t\t}\n\t\tif (tokens) {\n\t\t\tif (nextNode) {\n\t\t\t\t// If viewOrTagToRemove was an empty viewOrTag, we will remove both #n and /n\n\t\t\t\t// (and any intervening tokens) from the nextNode (=== prevNode)\n\t\t\t\t// If viewOrTagToRemove was not empty, we will take tokens preceding #n from prevNode,\n\t\t\t\t// and concatenate with tokens following /n on nextNode\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, tokens);\n\t\t\t} else {\n\t\t\t\tsetDefer(parentElem, tokens);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// !prevNode, so there may be a deferred nodes token on the parentElem. Remove it.\n\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + viewOrTagChar));\n\t\tif (!refresh && !nextNode) {\n\t\t\t// If this viewOrTag is being removed, and there was no .nxt, remove closing token from deferred tokens\n\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + viewOrTagChar));\n\t\t}\n\t}\n}\n\nfunction disposeTokens(tokens) {\n\tvar i, l, vwItem, vwInfos;\n\tif (vwInfos = viewInfos(tokens, true, rOpenMarkers)) {\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\tvwItem = vwInfos[i];\n\t\t\tif (vwItem.ch === \"_\") {\n\t\t\t\tif ((vwItem = viewStore[vwItem.id]) && vwItem.type) {\n\t\t\t\t\t// If this is the _prv (prevNode) for a view, remove the view\n\t\t\t\t\t// - unless view.type is undefined, in which case it is already being removed\n\t\t\t\t\tvwItem.parent.removeViews(vwItem._.key, undefined, true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveViewBinding(vwItem.id); // unbind bindings with this bindingId on this view\n\t\t\t}\n\t\t}\n\t}\n}\n\n//====================================\n// Add link methods to data-linked view or tag\n//====================================\nfunction addLinkMethods(tagOrView, isTag) {\n\n\ttagOrView.contents = function(deep, select) {\n\t\t// For a view or a tag, return jQuery object with the content nodes,\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is contents(selector)\n\t\t\tselect = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\t\tvar filtered,\n\t\t\tnodes = $(this.nodes());\n\t\tif (nodes[0]) {\n\t\t\tfiltered = select ? nodes.filter(select) : nodes;\n\t\t\tnodes = deep && select ? filtered.add(nodes.find(select)) : filtered;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.nodes = function(withMarkers, prevNode, nextNode) {\n\t\t// For a view or a tag, return top-level nodes\n\t\t// Do not return any script marker nodes, unless withMarkers is true\n\t\t// Optionally limit range, by passing in prevNode or nextNode parameters\n\n\t\tvar node,\n\t\t\tself = this,\n\t\t\telCnt = self._elCnt,\n\t\t\tprevIsFirstNode = !prevNode && elCnt,\n\t\t\tnodes = [];\n\n\t\tprevNode = prevNode || self._prv;\n\t\tnextNode = nextNode || self._nxt;\n\n\t\tnode = prevIsFirstNode\n\t\t\t? (prevNode === self._nxt\n\t\t\t\t? self.parentElem.lastSibling\n\t\t\t\t: prevNode)\n\t\t\t: (self._.inline === false\n\t\t\t\t? prevNode || self.linkCtx.elem.firstChild\n\t\t\t\t: prevNode && prevNode.nextSibling);\n\n\t\twhile (node && (!nextNode || node !== nextNode)) {\n\t\t\tif (withMarkers || elCnt || node.tagName !== SCRIPT) {\n\t\t\t\t// All the top-level nodes in the view\n\t\t\t\t// (except script marker nodes, unless withMarkers = true)\n\t\t\t\t// (Note: If a script marker node, viewInfo.elCnt undefined)\n\t\t\t\tnodes.push(node);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.childTags = function(deep, tagName) {\n\t\t// For a view or a tag, return child tags - at any depth, or as immediate children only.\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is childTags(tagName) - which looks for top-level tags of given tagName\n\t\t\ttagName = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\n\t\tvar self = this,\n\t\t\tview = self.link ? self : self.tagCtx.view, // this may be a view or a tag. If a tag, get the view from tag.view.tagCtx\n\t\t\tprevNode = self._prv,\n\t\t\telCnt = self._elCnt,\n\t\t\ttags = [];\n\n\t\tview.link(\n\t\t\tundefined,\n\t\t\tself.parentElem,\n\t\t\telCnt ? prevNode && prevNode.previousSibling : prevNode,\n\t\t\tself._nxt,\n\t\t\tundefined,\n\t\t\t{get:{\n\t\t\t\ttags: tags,\n\t\t\t\tdeep: deep,\n\t\t\t\tname: tagName,\n\t\t\t\tid: self.link ? self._.id + \"_\" : self._tgId + \"^\"\n\t\t\t}}\n\t\t);\n\t\treturn tags;\n\t};\n\n\ttagOrView.refresh = function(sourceValue) {\n\t\tvar promise, attr,\n\t\t\ttag = this,\n\t\t\tlinkCtx = tag.linkCtx,\n\t\t\tview = tag.tagCtx.view;\n\n\t\tif (tag.disposed) { error(\"Removed tag\"); }\n\t\tif (sourceValue === undefined) {\n\t\t\tsourceValue = $sub._tag(tag, view, view.tmpl, mergeCtxs(tag), true); // Get rendered HTML for tag, based on refreshed tagCtxs\n\t\t}\n\t\tif (sourceValue + \"\" === sourceValue) {\n\t\t\t// If no rendered content, sourceValue will not be a string (can be 0 or undefined)\n\t\t\tif (tag.onUnbind) {\n\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx);\n\t\t\t}\n\t\t\tattr = tag._.inline ? HTML : (linkCtx.attr || defaultAttr(tag.parentElem, true));\n\t\t\tpromise = updateContent(sourceValue, linkCtx, attr, tag);\n\t\t}\n\n\t\tcallAfterLink(tag);\n\t\treturn promise || tag;\n\t};\n\n\ttagOrView.update = function(value) {\n\t\tvar linkedElem = this.linkedElem;\n\t\tif (linkedElem) {\n\t\t\telemChangeHandler({\n\t\t\t\ttarget: linkedElem[0]\n\t\t\t}, undefined, value);\n\t\t}\n\t};\n\n\tif (isTag) {\n\t\t// This is a TAG\n\t\ttagOrView.domChange = function() { // domChange notification support\n\t\t\tvar elem = this.parentElem,\n\t\t\t\thasListener = $.hasData(elem) && $._data(elem).events,\n\t\t\t\tdomChangeNotification = \"jsv-domchange\";\n\n\t\t\tif (hasListener && hasListener[domChangeNotification]) {\n\t\t\t\t// Only trigger handler if there is a handler listening for this event. (Note using triggerHandler - so no event bubbling.)\n\t\t\t\t$(elem).triggerHandler(domChangeNotification, arguments);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// This is a VIEW\n\t\t// Note: a linked view will also, after linking have nodes[], _prv (prevNode), _nxt (nextNode) ...\n\t\ttagOrView.addViews = function(index, dataItems) {\n\t\t\t// if view is not an array view, do nothing\n\t\t\tvar i, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\titemsCount = dataItems.length,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (!self._.useKey && itemsCount) {\n\t\t\t\t// view is of type \"array\"\n\t\t\t\tviewsCount = views.length + itemsCount;\n\n\t\t\t\tif (viewsCount === self.data.length // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\t\t&& renderAndLink(self, index, self.tmpl, views, dataItems, self.ctx) !== false) {\n\t\t\t\t\tif (!self._.srt) { // Not part of a 'sort' on refresh\n\t\t\t\t\t\tself.fixIndex(index + itemsCount);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.removeViews = function(index, itemsCount, keepNodes, isMove) {\n\t\t\t// view.removeViews() removes all the child views\n\t\t\t// view.removeViews(index) removes the child view with specified index or key\n\t\t\t// view.removeViews(index, count) removes the specified nummber of child views, starting with the specified index\n\t\t\tfunction removeView(index) {\n\t\t\t\tvar id, bindId, parentElem, prevNode, nextNode, nodesToRemove,\n\t\t\t\t\tviewToRemove = views[index];\n\n\t\t\t\tif (viewToRemove && viewToRemove.link) {\n\t\t\t\t\tid = viewToRemove._.id;\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tnodesToRemove = viewToRemove.nodes();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove child views, without removing nodes\n\t\t\t\t\tviewToRemove.removeViews(undefined, undefined, true);\n\n\t\t\t\t\tviewToRemove.type = undefined; // Set type to undefined: used as a flag that this view is being removed\n\t\t\t\t\tprevNode = viewToRemove._prv;\n\t\t\t\t\tnextNode = viewToRemove._nxt;\n\t\t\t\t\tparentElem = viewToRemove.parentElem;\n\t\t\t\t\t// If prevNode and nextNode are the same, the view is empty\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tif (viewToRemove._elCnt) {\n\t\t\t\t\t\t\t// if keepNodes is false (and transferring of tokens has not already been done at a higher level)\n\t\t\t\t\t\t\t// then transfer tokens from prevNode which is being removed, to nextNode.\n\t\t\t\t\t\t\ttransferViewTokens(prevNode, nextNode, parentElem, id, \"_\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(nodesToRemove).remove();\n\t\t\t\t\t}\n\t\t\t\t\tif (!viewToRemove._elCnt) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tprevNode.parentNode.removeChild(prevNode); // (prevNode.parentNode is parentElem, except if jQuery Mobile or similar has inserted an intermediate wrapper\n\t\t\t\t\t\t\tnextNode.parentNode.removeChild(nextNode);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t\tsetArrayChangeLink(viewToRemove);\n\t\t\t\t\tfor (bindId in viewToRemove._.bnds) {\n\t\t\t\t\t\tremoveViewBinding(bindId);\n\t\t\t\t\t}\n\t\t\t\t\tdelete viewStore[id];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar current, view, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\tisArray = !self._.useKey,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (isArray) {\n\t\t\t\tviewsCount = views.length;\n\t\t\t}\n\t\t\tif (index === undefined) {\n\t\t\t\t// Remove all child views\n\t\t\t\tif (isArray) {\n\t\t\t\t\t// views and data are arrays\n\t\t\t\t\tcurrent = viewsCount;\n\t\t\t\t\twhile (current--) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = [];\n\t\t\t\t} else {\n\t\t\t\t\t// views and data are objects\n\t\t\t\t\tfor (view in views) {\n\t\t\t\t\t\t// Remove by key\n\t\t\t\t\t\tremoveView(view);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = {};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (itemsCount === undefined) {\n\t\t\t\t\tif (isArray) {\n\t\t\t\t\t\t// The parentView is data array view.\n\t\t\t\t\t\t// Set itemsCount to 1, to remove this item\n\t\t\t\t\t\titemsCount = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Remove child view with key 'index'\n\t\t\t\t\t\tremoveView(index);\n\t\t\t\t\t\tdelete views[index];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isArray && itemsCount\n\t\t\t\t\t&& (isMove || viewsCount - itemsCount === self.data.length)) { // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\tcurrent = index + itemsCount;\n\t\t\t\t\t// Remove indexed items (parentView is data array view);\n\t\t\t\t\twhile (current-- > index) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tviews.splice(index, itemsCount);\n\t\t\t\t\tif (!self._.sort) {\n\t\t\t\t\t\tself.fixIndex(index);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.refresh = function() {\n\t\t\tvar self = this,\n\t\t\t\tparent = self.parent;\n\n\t\t\tif (parent) {\n\t\t\t\trenderAndLink(self, self.index, self.tmpl, parent.views, self.data, undefined, true);\n\t\t\t\tsetArrayChangeLink(self);\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.fixIndex = function(fromIndex) {\n\t\t\t// Fixup index on following view items...\n\t\t\tvar views = this.views,\n\t\t\t\tindex = views.length;\n\t\t\twhile (fromIndex < index--) {\n\t\t\t\tif (views[index].index !== index) {\n\t\t\t\t\t$observable(views[index]).setProperty(\"index\", index);\n\t\t\t\t\t// This is fixing up index, but not key, and not index on child views. From child views, use view.getIndex()\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.link = viewLink;\n\t}\n}\n\n//========================\n// JsViews-specific converters\n//========================\n\n$converters.merge = function(val) {\n\t// Special converter used in data-linking to space-separated lists, such as className:\n\t// Currently only supports toggle semantics - and has no effect if toggle string is not specified\n\t// data-link=\"class{merge:boolExpr toggle=className}\"\n\tvar regularExpression,\n\t\tcurrentValue = this.linkCtx._val || \"\",\n\t\ttoggle = this.tagCtx.props.toggle;\n\n\tif (toggle) {\n\t\t// We are toggling the class specified by the toggle property,\n\t\t// and the boolean val binding is driving the insert/remove toggle\n\n\t\tregularExpression = toggle.replace(/[\\\\^$.|?*+()[{]/g, \"\\\\$&\");\n\t\t// Escape any regular expression special characters (metacharacters) within the toggle string\n\t\tregularExpression = \"(\\\\s(?=\" + regularExpression + \"$)|(\\\\s)|^)(\" + regularExpression + \"(\\\\s|$))\";\n\t\t// Example: /(\\s(?=myclass$)|(\\s)|^)?(myclass(\\s|$))/ - so matches (\" myclass\" or \" \" or ^ ) followed by (\"myclass \" or \"myclass$\") where ^/$ are beginning/end of string\n\t\tcurrentValue = currentValue.replace(new RegExp(regularExpression), \"$2\");\n\t\tval = currentValue + (val ? (currentValue && \" \") + toggle : \"\");\n\t}\n\treturn val;\n};\n\n//========================\n// JsViews-specific tags\n//========================\n\nfunction keepParentDataCtx(val) {\n\treturn this.tagCtx.view; // Return the parent view as data context for rendering block content\n}\n\n$tags({\n\ton: {\n\t\tattr: NONE,\n\t\tinit: function(tagCtx) {\n\t\t\tvar content,\n\t\t\t\ttag = this,\n\t\t\t\ti = 0,\n\t\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\t\tl = args.length;\n\n\t\t\tfor (; ii && i+1; // handler index\n\t\t\tif (tag._.inline) {\n\t\t\t\tif (!$sub.rTmpl.exec(content = tagCtx.tmpl.markup)) {\n\t\t\t\t\t// Inline {^{on}} tag with no content (or external template content) or with content containing\n\t\t\t\t\t// no HTML or JsRender tags: We will wrap the (text) content, or the operation name in a \";\n\t\t\t\t}\n\t\t\t\ttag.attr = HTML;\n\t\t\t}\n\t\t},\n\t\tonAfterLink: function(tagCtx, linkCtx) {\n\t\t\tvar handler, params, find, activeElem,\n\t\t\t\ttag = this,\n\t\t\t\ti = tag._hi,\n\t\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\t\tl = args.length,\n\t\t\t\tprops = tagCtx.props,\n\t\t\t\tdata = props.data,\n\t\t\t\tview = tagCtx.view,\n\t\t\t\tcontextOb = props.context; // Context ('this' pointer) for attached handler\n\n\t\t\tif (i) { // There is a handler\n\t\t\t\thandler = args[i-1];\n\t\t\t\tparams = args.slice(i); // Subsequent args are params\n\t\t\t\targs = args.slice(0, i-1); // Preceding args (if any) are events and selector\n\t\t\t\ttag._sel = args[1]; // Selector for descendant elements - for delegated events on those elements, delegating to the activeElem\n\n\t\t\t\tactiveElem = tag.activeElem = tag.activeElem || $(tag._.inline\n\t\t\t\t\t? (tag._sel = args[1] || \"*\", tag.parentElem)\n\t\t\t\t\t// If inline, attach to child elements of tag parent element (filtered by selector argument if provided.\n\t\t\t\t\t// (In handler we'll filter out events from sibling elements preceding or following tag.)\n\t\t\t\t\t// This allows us to use the delegated pattern where the attached event works even for added elements satisfying the selector\n\t\t\t\t\t: linkCtx.elem);\n\n\t\t\t\tif (!contextOb) {\n\t\t\t\t\t// Get the path for the preceding object (context object) of handler (which is the last arg), compile function\n\t\t\t\t\t// to return that context object, and run compiled function against data\n\t\t\t\t\tcontextOb = /^(.*)[\\.^][\\w$]+$/.exec(tagCtx.params.args.slice(-params.length - 1)[0]);\n\t\t\t\t\tcontextOb = contextOb && $sub.tmplFn(delimOpenChar1 + \":\" + contextOb[1] + delimCloseChar0, view.tmpl, true)(linkCtx.data, view);\n\t\t\t\t}\n\n\t\t\t\tif (tag._evs) {\n\t\t\t\t\ttag.onUnbind();\n\t\t\t\t}\n\n\t\t\t\tactiveElem.on(\n\t\t\t\t\ttag._evs = args[0] || \"click\", // events defaults to \"click\"\n\t\t\t\t\ttag._sel,\n\t\t\t\t\tdata == undefined ? null : data,\n\t\t\t\t\ttag._hlr = function hndlr(ev) {\n\t\t\t\t\t\tvar nodes, length,\n\t\t\t\t\t\t\tfound = !tag._.inline;\n\n\t\t\t\t\t\tif (!found) { // If inline, filter out events from sibling elements preceding or following tag.\n\t\t\t\t\t\t\tnodes = tag.contents(\"*\");\n\t\t\t\t\t\t\tl = nodes.length;\n\t\t\t\t\t\t\twhile (!found && l--) {\n\t\t\t\t\t\t\t\tif (nodes[l].contains(ev.target)) {\n\t\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (found) { // target elem is indeed within the tag, so call the {on} handler\n\t\t\t\t\t\t\treturn handler.apply(contextOb || linkCtx.data, [].concat(\n\t\t\t\t\t\t\t\tparams, // e.g. par1, par2\n\t\t\t\t\t\t\t\tev,\n\t\t\t\t\t\t\t\t{change: ev.type, view: view, linkCtx: linkCtx},\n\t\t\t\t\t\t\t\tparams.slice.call(arguments, 1) // If triggering event (e.g. jsv-domchange) has additional arguments after ev, pass them too\n\t\t\t\t\t\t\t));\n\t\t\t\t\t\t\t// for {on 'click' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs)\n\t\t\t\t\t\t\t// for {on 'jsv-domchange' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs, tagCtx, linkCtx, observableEventArgs)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tonUpdate: function() {\n\t\t\treturn false;\n\t\t},\n\t\tonUnbind: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.activeElem) {\n\t\t\t\tself.activeElem.off(self._evs, self._sel, self._hlr);\n\t\t\t}\n\t\t},\n\t\tflow: true,\n\t\tcontentCtx: keepParentDataCtx,\n\t\tdataBoundOnly: true\n\t},\n\tradiogroup: {\n\t\tinit: function(tagCtx) {\n\t\t\tthis.name = tagCtx.props.name || (\"jsv\" + Math.random());\n\t\t},\n\t\tonBind: function(tagCtx, linkCtx) {\n\t\t\tvar domChngCntnr,\n\t\t\t\ttag = this,\n\t\t\t\t$linkedElem = tag.linkedElem = (tag._.inline ? tag.contents(true, \"input[type=radio]\") : $(linkCtx.elem).find(\"input[type=radio]\")),\n\t\t\t\tl = $linkedElem.length;\n\n\t\t\tif (tag._.inline) {\n\t\t\t\t// If the first element is owned by (rendered by) this tag (not by a childTag such as {^{for}})\n\t\t\t\t// use it as container for detecting dom changes\n\t\t\t\tdomChngCntnr = tag.contents(\"*\")[0];\n\t\t\t\tdomChngCntnr = domChngCntnr && $.view(domChngCntnr).ctx.tag === tag.parent ? domChngCntnr : tag.parentElem;\n\t\t\t} else {\n\t\t\t\tdomChngCntnr = linkCtx.elem;\n\t\t\t}\n\t\t\twhile (l--) {\n\t\t\t\t// Configure the name for each radio input element\n\t\t\t\t$linkedElem[l].name = $linkedElem[l].name || tag.name;\n\t\t\t}\n\t\t\t// Establish a domchange listener in case this radiogroup wraps a {^{for}} or {^{if}} or similar which might dynamically insert new radio input elements\n\t\t\t$(domChngCntnr).on(\"jsv-domchange\", function(ev, forOrIfTagCtx) {\n\t\t\t\tvar linkedElem,\n\t\t\t\t\tparentTags = forOrIfTagCtx.ctx.parentTags;\n\t\t\t\tif (!tag._.inline || domChngCntnr !== tag.parentElem // The domChngCntnr is specific to this tag\n\t\t\t\t\t// The domChngCntnr is the parentElem of this tag, so need to make sure dom change event is for\n\t\t\t\t\t// a content change within this tag, not outside it.\n\t\t\t\t\t|| parentTags && parentTags[tag.tagName] === tag) {\n\t\t\t\t\t// Contents have changed so recreate $linkedElem for the radio input elements (including possible new one just inserted)\n\t\t\t\t\t$linkedElem = tag.linkedElem = tag.contents(true, \"input[type=radio]\");\n\t\t\t\t\tl = $linkedElem.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t// Configure binding and name for each radio input element\n\t\t\t\t\t\tlinkedElem = $linkedElem[l];\n\t\t\t\t\t\tlinkedElem._jsvLkEl = tag;\n\t\t\t\t\t\tlinkedElem.name = linkedElem.name || tag.name;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag, linkedElem);\n\t\t\t\t\t\tlinkedElem._jsvBnd = \"&\" + tag._tgId + \"+\";\n\t\t\t\t\t\tlinkedElem.checked = tag.cvtArgs()[0] === linkedElem.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tonUpdate: function(ev, eventArgs, tagCtxs) {\n\t\t\treturn false; // don't rerender\n\t\t},\n\t\tcontentCtx: keepParentDataCtx,\n\t\tdataBoundOnly: true\n\t}\n});\n\n$extend($tags[\"for\"], {\n\t//onUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\t//Consider adding filtering for perf optimization. However the below prevents update on some scenarios which _should_ update - namely when there is another array on which for also depends.\n\t\t//var i, l, tci, prevArg;\n\t\t//for (tci = 0; (prevArg = this.tagCtxs[tci]) && prevArg.args.length; tci++) {\n\t\t//\tif (prevArg.args[0] !== newTagCtxs[tci].args[0]) {\n\t\t//\t\treturn true;\n\t\t//\t}\n\t\t//}\n\t\t//return false;\n\t//},\n\tonArrayChange: function(ev, eventArgs, tagCtx, linkCtx) {\n\t\tvar arrayView,\n\t\t\ttarget = ev.target,\n\t\t\ttargetLength = target.length,\n\t\t\ttag = this,\n\t\t\tchange = eventArgs.change;\n\t\tif (tag._.noVws // Child views not supported because target is not html - e.g. data-link=\"title{for ...}\"\n\t\t\t|| tag.tagCtxs[1] && ( // There is an {{else}}\n\t\t\t\tchange === \"insert\" && targetLength === eventArgs.items.length // inserting, and new length is same as inserted length, so going from 0 to n\n\t\t\t\t|| change === \"remove\" && !targetLength // removing , and new length 0, so going from n to 0\n\t\t\t)) {\n\t\t\ttag.refresh();\n\t\t} else {\n\t\t\tfor (arrayView in tag._.arrVws) {\n\t\t\t\tarrayView = tag._.arrVws[arrayView];\n\t\t\t\tif (arrayView.data === target) {\n\t\t\t\t\tarrayView._.onArrayChange.apply(arrayView, arguments);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttag.domChange(tagCtx, linkCtx, eventArgs);\n\t\tev.done = true;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx) {\n\t\tvar i, arrHandler, arrBinding, data,\n\t\t\ttag = this,\n\t\t\tarrayBindings = tag._ars || {},\n\t\t\ttagCtxs = tag.tagCtxs,\n\t\t\tl = tagCtxs.length,\n\t\t\tselected = tag.selected || 0;\n\n\t\tfor (i = 0; i <= selected; i++) {\n\t\t\ttagCtx = tagCtxs[i]; // loop through tagCtxs up to selected\n\t\t\tdata = tagCtx.map\n\t\t\t\t? tagCtx.map.tgt // 'data' is mapped data\n\t\t\t\t: tagCtx.args.length\n\t\t\t\t\t? tagCtx.args[0] // or args[0]\n\t\t\t\t\t: tagCtx.view.data; // or defaults to current data.\n\n\t\t\tif ((arrBinding = arrayBindings[i]) && data !== arrBinding[0]) { // Is there previous array data on this tagCtx, different from new data\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous array\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t\tif (!arrayBindings[i] && $isArray(data)) {\n\t\t\t\t$observe(data, arrHandler = function(ev, eventArgs) {\n\t\t\t\t\tvar tagCt = tagCtx;\n\t\t\t\t\ttag.onArrayChange(ev, eventArgs, tagCt, linkCtx);\n\t\t\t\t});\n\t\t\t\tarrayBindings[i] = [data, arrHandler]; // Store array data and arrayChangeHandler on tag._ars[i]\n\t\t\t}\n\t\t}\n\t\tfor (i = selected + 1; i < l; i++) { // If there were previous bindings on later tagCtxs, remove them\n\t\t\tif (arrBinding = arrayBindings[i]) {\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous binding\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t}\n\t\ttag._ars = arrayBindings;\n\t},\n\tonDispose: function() {\n\t\tvar l, tag = this;\n\t\tfor (l in tag._ars) {\n\t\t\t$observe(tag._ars[l][0], tag._ars[l][1], true); //unobserve\n\t\t}\n\t}\n});\n\n$extend($tags[\"if\"], {\n\tonUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\tvar tci, prevArg, different;\n\t\tfor (tci = 0; (prevArg = this.tagCtxs[tci]); tci++) {\n\t\t\tdifferent = prevArg.props.tmpl !== newTagCtxs[tci].props.tmpl || prevArg.args.length && !(prevArg = prevArg.args[0]) !== !newTagCtxs[tci].args[0];\n\t\t\tif ((!this.convert && !!prevArg) || different) {\n\t\t\t\treturn different;\n\t\t\t\t// If there is not a change of template, and there is no converter, and newArg and prevArg are both truthy, return false to cancel update.\n\t\t\t\t// (Even if values on later elses are different, we still don't want to update, since rendered output would be unchanged)\n\t\t\t\t// If newArg and prevArg are different, return true, to update\n\t\t\t\t// If newArg and prevArg are both falsey, move to the next {{else ...}}\n\t\t\t}\n\t\t}\n\t\t// Boolean value of all args are unchanged (falsey), so return false to cancel update\n\t\treturn false;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx, ctx, ev, eventArgs) {\n\t\tif (eventArgs) {\n\t\t\tthis.domChange(tagCtx, linkCtx, eventArgs);\n\t\t}\n\t}\n});\n\nfunction observeProps(map, ev, eventArgs) {\n\tif (eventArgs.change === \"set\") {\n\t\tvar target = map.tgt,\n\t\t\tl = target.length;\n\t\twhile (l--) {\n\t\t\tif (target[l].key === eventArgs.path) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (l === -1) {\n\t\t\tif (eventArgs.path && !eventArgs.remove) {\n\t\t\t\t$observable(target).insert({key: eventArgs.path, prop: eventArgs.value});\n\t\t\t}\n\t\t} else if (eventArgs.remove) {\n\t\t\t$observable(target).remove(l);\n\t\t} else {\n\t\t\t$observable(target[l]).setProperty(\"prop\", eventArgs.value);\n\t\t}\n\t}\n}\n\nfunction observeMappedProps(map, ev, eventArgs) {\n\tvar item,\n\t\tsource = map.src,\n\t\tchange = eventArgs.change;\n\n\tif (change === \"set\") {\n\t\tif (eventArgs.path === \"prop\") {\n\t\t\t$observable(source).setProperty(ev.target.key, eventArgs.value);\n\t\t} else { // path === \"key\"\n\t\t\t$observable(source).removeProperty(eventArgs.oldValue); // When key is modified observably, remove old one and set new one\n\t\t\t$observable(source).setProperty(eventArgs.value, ev.target.prop);\n\t\t}\n\t} else if (change === \"remove\") {\n\t\titem = eventArgs.items[0];\n\t\t$observable(source).removeProperty(item.key);\n\t\tdelete source[item.key];\n\t} else if (change === \"insert\") {\n\t\titem = eventArgs.items[0];\n\t\tif (item.key) {\n\t\t\t$observable(source).setProperty(item.key, item.prop);\n\t\t}\n\t}\n}\n\nfunction shallowArrayFilter(allPath /*, object, parentObs*/) { // Filter used by {{props}} for the mappedProps target array\n\treturn allPath.indexOf(\".\") < 0;\n}\n\n$tags(\"props\", {\n\tbaseTag: \"for\",\n\tdataMap: $views.map({\n\t\tgetTgt: $tags.props.dataMap.getTgt,\n\t\tobsSrc: observeProps,\n\t\tobsTgt: observeMappedProps,\n\t\ttgtFlt: shallowArrayFilter\n\t}),\n\tflow: true\n});\n\n//========================\n// Extend jQuery namespace\n//========================\n\n$extend($, {\n\n\t//=======================\n\t// jQuery $.view() plugin\n\t//=======================\n\n\tview: $view = function(node, inner, type) {\n\t\t// $.view() returns top view\n\t\t// $.view(node) returns view that contains node\n\t\t// $.view(selector) returns view that contains first selected element\n\t\t// $.view(nodeOrSelector, type) returns nearest containing view of given type\n\t\t// $.view(nodeOrSelector, \"root\") returns root containing view (child of top view)\n\t\t// $.view(nodeOrSelector, true, type) returns nearest inner (contained) view of given type\n\n\t\tfunction getInnerView(nd, isVl) {\n\t\t\tif (nd) {\n\t\t\t\tvwInfos = viewInfos(nd, isVl, rOpenViewMarkers);\n\t\t\t\tfor (j = 0, k = vwInfos.length; j < k; j++) {\n\t\t\t\t\tif ((view = viewStore[vwInfos[j].id]) && (view = view && type ? view.get(true, type) : view)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (inner !== !!inner) {\n\t\t\t// inner not boolean, so this is view(nodeOrSelector, type)\n\t\t\ttype = inner;\n\t\t\tinner = undefined;\n\t\t}\n\t\tvar view, vwInfos, i, j, k, l, elems,\n\t\t\tlevel = 0,\n\t\t\tbody = document.body;\n\n\t\tif (node && node !== body && topView._.useKey > 1) {\n\t\t\t// Perf optimization for common cases\n\n\t\t\tnode = \"\" + node === node\n\t\t\t\t? $(node)[0]\n\t\t\t\t: node.jquery\n\t\t\t\t\t? node[0]\n\t\t\t\t\t: node;\n\n\t\t\tif (node) {\n\t\t\t\tif (inner) {\n\t\t\t\t\tgetInnerView(node._df, true);\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\t// Treat supplied node as a container element and return the first view encountered.\n\t\t\t\t\t\telems = qsa ? node.querySelectorAll(bindElsSel) : $(bindElsSel, node).get();\n\t\t\t\t\t\tl = elems.length;\n\t\t\t\t\t\tfor (i = 0; !view && i < l; i++) {\n\t\t\t\t\t\t\tgetInnerView(elems[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn view;\n\t\t\t\t}\n\t\t\t\twhile (node) {\n\t\t\t\t\t// Move back through siblings and up through parents to find preceding node which is a _prv (prevNode)\n\t\t\t\t\t// script marker node for a non-element-content view, or a _prv (first node) for an elCnt view\n\t\t\t\t\tif (vwInfos = viewInfos(node, undefined, rViewMarkers)) {\n\t\t\t\t\t\tl = vwInfos.length;\n\t\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t\tview = vwInfos[l];\n\t\t\t\t\t\t\tif (view.open) {\n\t\t\t\t\t\t\t\tif (level < 1) {\n\t\t\t\t\t\t\t\t\tview = viewStore[view.id];\n\t\t\t\t\t\t\t\t\treturn view && type ? view.get(type) : view || topView;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlevel--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// level starts at zero. If we hit a view.close, then we move level to 1, and we don't return a view until\n\t\t\t\t\t\t\t\t// we are back at level zero (or a parent view with level < 0)\n\t\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.previousSibling || node.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn topView;\n\t},\n\n\tlink: $link,\n\tunlink: $unlink,\n\n\t//=====================\n\t// override $.cleanData\n\t//=====================\n\tcleanData: function(elems) {\n\t\tif (elems.length && isCleanCall) {\n\t\t\t// Remove JsViews bindings. Also, remove from the DOM any corresponding script marker nodes\n\t\t\tclean(elems);\n\t\t}\n\t\toldCleanData.apply($, arguments);\n\t}\n});\n\n// Possible future addition - e.g. for ckeditor tag control\n//$views.utility = {\n//\tvalidate: function(html) {\n//\t\ttry {\n//\t\t\ttopView.link(undefined, document.createElement(\"div\"), undefined, undefined, html, undefined, undefined, 1);\n//\t\t}\n//\t\tcatch (e) {\n//\t\t\treturn e.message;\n//\t\t}\n//\t}\n//};\n\n//===============================\n// Extend jQuery instance plugins\n//===============================\n\n$extend($.fn, {\n\tlink: function(expr, from, context, noIteration, parentView, prevNode, nextNode) {\n\t\treturn $link(expr, this, from, context, noIteration, parentView, prevNode, nextNode);\n\t},\n\tunlink: function() {\n\t\treturn $unlink(this);\n\t},\n\tview: function(inner, type) {\n\t\treturn $view(this[0], inner, type);\n\t}\n});\n\n//==============================================================================\n// Override jQuery methods that call our overridden cleanData, for disposal etc.\n//==============================================================================\n\n$.each([HTML, \"replaceWith\", \"empty\", \"remove\"], function(i, name) {\n\tvar oldFn = $.fn[name];\n\t$.fn[name] = function() {\n\t\tvar result;\n\t\tisCleanCall = 1; // Make sure cleanData does disposal only when coming from these calls.\n\t\ttry {\n\t\t\tresult = oldFn.apply(this, arguments);\n\t\t}\n\t\tfinally {\n\t\t\tisCleanCall = 0;\n\t\t}\n\t\treturn result;\n\t};\n});\n\n//===============\n// Extend topView\n//===============\n\naddLinkMethods($extend(topView = $sub.topView, {tmpl: {links: {}}}));\n\nviewStore = {0: topView}; // Top-level view\n//===============\n// Extend $.views\n//===============\n\n$views.getCtx = function(param) { // Return value of ctx.foo, including for compiled contextual parameters, ~foo=expr\n\tif (param && param._cp) { // If this helper resource is a contextual parameter, ~foo=expr\n\t\tparam = param[1](param[0].data, param[0], $sub);\n\t}\n\treturn param;\n};\n\n//===================\n// Extend $.views.sub\n//===================\n\n$sub._cp = function(paramVal, params, view) { // Get compiled contextual parameters (or properties) ~foo=expr.\n\tif (view.linked) { // In JsViews, returns [view, linkFn] where linkFn is compiled function for expression\n\t\tparams = delimOpenChar1 + \":\" + params + delimCloseChar0;\n\t\tvar tmpl = view.tmpl,\n\t\t\tlinks = topView.tmpl.links, // Use topView links, as for compiled top-level linking expressions. To do - should this ever get disposed?\n\t\t\tlinkFn = links[params];\n\t\tif (!linkFn) {\n\t\t\tlinks[params] = linkFn = $sub.tmplFn(params, tmpl, true);\n\t\t}\n\t\tparamVal = [view, linkFn];\n\t\tparamVal._cp = true; // Flag that this is a contextual parameter\n\t}\n\treturn paramVal; // In JsRender returns evaluated expression\n};\n\n$sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each referenced contextual parameter ~foo uses its own exprOb instances\n\tvar ob,\n\t\tclones = obs,\n\t\tl = obs.length;\n\tif (l) {\n\t\tclones = [];\n\t\twhile (l--) {\n\t\t\tob = obs[l];\n\t\t\tif (ob._jsv) {\n\t\t\t\tob = $extend({}, ob); // If an exprOb, clone it. If a string, keep as is\n\t\t\t\tob.prm = cloneExprObjects(ob.prm); // Recursively clone exprObs in parameters, too\n\t\t\t}\n\t\t\tclones.unshift(ob);\n\t\t}\n\t}\n\treturn clones;\n};\n\n$sub._gccb = function(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc.\n\t// TODO Consider exposing or allowing override, as public API\n\treturn function(path, object, depth) {\n\t\t// TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on\n\t\t// the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times\n\t\tvar tokens, tag, items, helper, last, nextPath, l;\n\t\tif (view && path) {\n\t\t\tif (path._jsv) {\n\t\t\t\treturn path._jsv.call(view.tmpl, object, view, $sub);\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"~\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"~a.b.c\" string:\n\t\t\t\t// [helperObject 'a', \"a.b.c\" currentDataItem] so currentDataItem becomes the object for subsequent paths.\n\t\t\t\tif (path.slice(0, 4) === \"~tag\") {\n\t\t\t\t\ttag = view.ctx;\n\t\t\t\t\tif (path.charAt(4) === \".\") {\n\t\t\t\t\t\t// \"~tag.xxx\"\n\t\t\t\t\t\ttokens = path.slice(5).split(\".\");\n\t\t\t\t\t\ttag = tag.tag;\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens) {\n\t\t\t\t\t\treturn tag ? [tag, tokens.join(\".\"), object] : [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpath = path.slice(1).split(\".\");\n\t\t\t\tif (helper = view.hlp(last = path.shift(), true)) {\n\t\t\t\t\tif (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [view, ctxPrmDependencies ...]\n\t\t\t\t\t\tif (path.length) {\n\t\t\t\t\t\t\tnextPath = \".\" + path.join(\".\");\n\t\t\t\t\t\t\tlast = helper[l = helper.length-1];\n\t\t\t\t\t\t\tif (last._jsv) {\n\t\t\t\t\t\t\t\tlast.sb = nextPath;\n\t\t\t\t\t\t\t\tlast.bnd = !!depth;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thelper[l] = (last + nextPath).replace(\"#data.\", \"\");\n\t\t\t\t\t\t\t\tif (last.slice(0, 5) === \"#view\") {\n\t\t\t\t\t\t\t\t\thelper[l] = helper[l].slice(6);\n\t\t\t\t\t\t\t\t\thelper.splice(l, 0, view);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\titems = [helper]; // Contextual parameter\n\t\t\t\t\t} else if (path.length || $isFunction(helper)) {\n\t\t\t\t\t\titems = [helper, path.join(\".\"), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn items || [];\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"#\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"#a.b.c\" string: [view, \"a.b.c\" currentDataItem]\n\t\t\t\t// so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes.\n\t\t\t\treturn path === \"#data\" ? [] : [view, path.replace(rViewPath, \"\"), object];\n\t\t\t}\n\t\t}\n\t};\n};\n\n//=========================\n// Extend $.views.settings\n//=========================\n\noldAdvSet = $sub.advSet;\n\n$sub.advSet = function() { // refresh advanced settings\n\toldAdvSet.call($sub);\n\tglobal._jsv = $subSettingsAdvanced._jsv\n\t\t? $extend(global._jsv || {}, { // create global _jsv, for accessing views, etc\n\t\t\t\tviews: viewStore,\n\t\t\t\tbindings: bindingStore\n\t\t\t})\n\t\t: undefined; // In IE8 cannot do delete global._jsv\n\t$viewsLinkAttr = $subSettingsAdvanced.linkAttr;\n\tlinkViewsSel = bindElsSel + \",[\" + $viewsLinkAttr + \"]\";\n\twrapMap = $subSettingsAdvanced._wm;\n\twrapMap.optgroup = wrapMap.option;\n\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\twrapMap.th = wrapMap.td;\n};\n\n$viewsSettings.advanced({\n\tlinkAttr: \"data-link\",\n\tuseViews: false,\n\tnoValidate: false,\n\t// wrapMap provide appropriate wrappers for inserting innerHTML, used in insertBefore\n\t// We have to close these tags to support XHTML (#13200)\n\t// TODO investigate whether more recent jQuery implementation using wrapMap in domManip/$().html() etc. is better optimized now...\n\t_wm: {\n\t\toption: [1, \"\"],\n\t\tlegend: [1, \"
\", \"
\"],\n\t\tarea: [1, \"\", \"\"],\n\t\tparam: [1, \"\", \"\"],\n\t\tthead: [1, \"
\", \"
\"],\n\t\ttr: [2, \"\", \"
\"],\n\t\ttd: [3, \"\", \"
\"],\n\t\tcol: [2, \"\", \"
\"],\n\t\tsvg_ns: [1, \"\", \"\"],\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\tdiv: $.support.htmlSerialize ? [0, \"\", \"\"] : [1, \"X
\", \"
\"]\n\t},\n\t_fe: {\n\t\tinput: {\n\t\t\tfrom: inputAttrib, to: \"value\"\n\t\t},\n\t\ttextarea: valueBinding,\n\t\tselect: valueBinding,\n\t\toptgroup: {\n\t\t\tto: \"label\"\n\t\t}\n\t}\n});\n\nreturn $;\n}, window));\n"]} \ No newline at end of file diff --git a/package.json b/package.json index b24ebd5..52b75aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsviews", - "version": "v0.9.82", + "version": "v0.9.83", "description": "Next-generation MVVM and MVP framework - built on top of JsRender templates. Bringing templates to life...", "main": "./jsviews.js", "author": { @@ -35,7 +35,7 @@ "glob-stream": "^5.0.0", "gulp": "^3.9.0", "jquery": "^2.1.4", - "jsrender": "^0.9.82", + "jsrender": "^0.9.83", "qunit": "^0.7.6" }, "dependencies": {} diff --git a/test/browserify/bundles/1-bundle.js b/test/browserify/bundles/1-bundle.js index 7694ce1..1e16321 100644 --- a/test/browserify/bundles/1-bundle.js +++ b/test/browserify/bundles/1-bundle.js @@ -1,5 +1,5 @@ (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 to string or (multiselect) array of strings - } - if (cvtBack) { - sourceValue = cvtBack.call(tag, sourceValue); + while (binding = rSplitBindings.exec(bindings)) { + if (binding = bindingStore[binding[1]]) { + if (to = binding.to) { + // The binding has a 'to' field, which is of the form [[targetObject, toPath], cvtBack] + linkCtx = binding.linkCtx; + view = linkCtx.view; + tag = linkCtx.tag || view.tag; + $source = $(source); + onBeforeChange = view.hlp(onBeforeChangeStr); // TODO Can we optimize this and other instances of same? + onAfterChange = view.hlp(onAfterChangeStr); // TODO Can we optimize this and other instances of same + fromAttr = defaultAttr(source); + setter = fnSetters[fromAttr]; + if (sourceValue === undefined) { + sourceValue = $isFunction(fromAttr) + ? fromAttr(source) + : setter + ? $source[setter]() + : $source.attr(fromAttr); + } + cnvtName = to[1]; + to = to[0]; // [object, path] + to = to + "" === to ? [linkCtx.data, to] : to; + if (cnvtName) { + if ($isFunction(cnvtName)) { + cvtBack = cnvtName; + } else { + cvtBack = view.getRsc("converters", cnvtName); } + } + if (linkCtx.elem.nodeName === "SELECT") { + linkCtx.elem._jsvSel = sourceValue = sourceValue || (linkCtx.elem.multiple ? [] : sourceValue); + // data-link to string or (multiselect) array of strings + } + if (cvtBack) { + sourceValue = cvtBack.call(tag, sourceValue); + } - // Set linkCtx on view, dynamically, just during this handler call - oldLinkCtx = view.linkCtx; - view.linkCtx = linkCtx; - eventArgs = { - change: "change", - oldValue: linkCtx._val, - value: sourceValue - }; - if ((!onBeforeChange || !(cancel = onBeforeChange.call(linkCtx, ev, eventArgs) === false)) && - (!tag || !tag.onBeforeChange || !(cancel = tag.onBeforeChange(ev, eventArgs) === false)) && - sourceValue !== undefined) { - target = to[0]; // [object, path] - if (sourceValue !== undefined && target) { - if (target._jsv) { - exprOb = target; - target = linkCtx.data; - while (exprOb && exprOb.sb) { - target = linkCtx._ctxCb(exprOb, target); - exprOb = exprOb.sb; - } - } - if (tag) { - tag._.chging = true; // marker to prevent tag change event triggering its own refresh + // Set linkCtx on view, dynamically, just during this handler call + oldLinkCtx = view.linkCtx; + view.linkCtx = linkCtx; + eventArgs = { + change: "change", + oldValue: linkCtx._val, + value: sourceValue + }; + if ((!onBeforeChange || !(cancel = onBeforeChange.call(linkCtx, ev, eventArgs) === false)) && + (!tag || !tag.onBeforeChange || !(cancel = tag.onBeforeChange(ev, eventArgs) === false)) && + sourceValue !== undefined) { + target = to[0]; // [object, path] + if (sourceValue !== undefined && target) { + if (target._jsv) { + contextCb = linkCtx._ctxCb; // This is a computed value + exprOb = target; + target = linkCtx.data; + if (exprOb._cpCtx) { // Computed value for a contextual parameter + target = exprOb.data; // The data for the contextual view (where contextual param expression evaluated/assigned) + contextCb = exprOb._cpCtx; // Context callback for contextual view } - $observable(target).setProperty(to[1], sourceValue); // 2way binding change event - observably updating bound object - if (onAfterChange) { - onAfterChange.call(linkCtx, ev, eventArgs); + while (exprOb && exprOb.sb) { // Step through chained computed values to leaf one... + target = contextCb(exprOb, target); + exprOb = exprOb.sb; } - if (tag) { - if (tag.onAfterChange) { - tag.onAfterChange(ev, eventArgs); - } - tag._.chging = undefined; // clear the marker + } + if (tag) { + tag._.chging = true; // marker to prevent tag change event triggering its own refresh + } + $observable(target).setProperty(to[1], sourceValue); // 2way binding change event - observably updating bound object + if (onAfterChange) { + onAfterChange.call(linkCtx, ev, eventArgs); + } + if (tag) { + if (tag.onAfterChange) { + tag.onAfterChange(ev, eventArgs); } - linkCtx._val = sourceValue; + tag._.chging = undefined; // clear the marker } + linkCtx._val = sourceValue; } - view.linkCtx = oldLinkCtx; } + view.linkCtx = oldLinkCtx; } } } @@ -775,8 +779,8 @@ function addBindingMarkers(value, view, tag) { // observeAndBind //--------------- -function observeAndBind(linkCtx, source, target) { //TODO? linkFnArgs) {; - var binding, l, linkedElem, exprFnDeps, exprOb, +function observeAndBind(linkCtx, source, target) { + var binding, l, k, linkedElem, exprFnDeps, exprOb, prop, propDeps, tag = linkCtx.tag, cvtBk = linkCtx.convertBack, depends = [], @@ -801,6 +805,22 @@ function observeAndBind(linkCtx, source, target) { //TODO? linkFnArgs) {; exprFnDeps = linkCtx.fn.deps.slice(); // Make a copy of the dependency paths for the compiled linkCtx expression - to pass to observe(). In getInnerCb(), // (and whenever the object is updated, in innerCb), we will set exprOb.ob to the current object returned by that computed expression, for this view. + + if (tag && tag.boundProps) { + // Add dependency paths for declared boundProps (so no need to writh ^myprop=... to get binding) and for linkedProp too if there is one + l = tag.boundProps.length; + while (l--) { + prop = tag.boundProps[l]; + k = tag._.bnd.paths.length; + while (k--) { + propDeps = tag._.bnd.paths[k][prop]; + if (propDeps && propDeps.skp) { // Not already a bound prop ^prop=expression; + exprFnDeps = exprFnDeps.concat(propDeps); // Add dependencies for this prop expression + } + } + } + } + l = exprFnDeps.length; while (l--) { exprOb = exprFnDeps[l]; @@ -1669,7 +1689,7 @@ function bindDataLinkTarget(linkCtx, linkFn) { $sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx), "link", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers)); } - linkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]} + linkCtx._ctxCb = $sub._gccb(linkCtx.view); // getContextCallback: _ctxCb, for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]} linkCtx._hdl = handler; // handler._ctx = linkCtx; Could pass linkCtx for use in a depends = function() {} call, so depends is different for different linkCtx's handler(true); @@ -1790,9 +1810,9 @@ function callAfterLink(tag, ev, eventArgs) { linkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem; displayElem = tag.displayElem || linkedElem; -if (linkedElem && linkedElem[0]) { - if (!tag._.chging) { - val = tag.cvtArgs()[0]; + if (linkedElem && linkedElem[0]) { + val = tag.cvtArgs()[0]; + if (val !== undefined && !tag._.chging) { l = linkedElem.length; while (l--) { linkedEl = linkedElem[l]; @@ -1814,7 +1834,7 @@ if (linkedElem && linkedElem[0]) { } else if (linkedEl.type === RADIO) { linkedEl[CHECKED] = (linkedEl.value === val); } else { - linkedEl.value = val; + $(linkedEl).val(val); // Use jQuery for attrHooks - can't just set value (on select, for example) } } else if (linkedEl.contentEditable === TRUE) { linkedEl.innerHTML = val; @@ -1870,14 +1890,15 @@ function bindTo(binding, tag, linkedElem, cvtBk) { // So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, "d.e"], and we bind to the path on the returned object, exprOb.ob, as target // Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z - var bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, totry, + var bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, linkCtx = binding.linkCtx, + contextCb = linkCtx._ctxCb, source = linkCtx.data, - paths = linkCtx.fn.paths; + paths = linkCtx.fn.paths[0]; tag = tag || linkedElem._jsvLkEl; - if (binding && paths && !binding.to) { + if (binding && paths && !binding.to) { oldTrig = linkedElem._jsvTr || false; if (tag) { cvtBk = tag.convertBack || cvtBk; @@ -1898,8 +1919,7 @@ function bindTo(binding, tag, linkedElem, cvtBk) { } paths = (bindto = paths._jsvto) || paths[0]; - pathIndex = paths && paths.length; - if (pathIndex && (!tag || tag.tagCtx.args.length)) { + if (pathIndex = paths && paths.length) { lastPath = paths[pathIndex - 1]; if (lastPath._jsv) { bindtoOb = lastPath; @@ -1915,15 +1935,18 @@ function bindTo(binding, tag, linkedElem, cvtBk) { lastPath ]; } else { - while ((totry = linkCtx._ctxCb(path = lastPath.split("^").join("."), source)) && (l = totry.length)) { + while ((to = contextCb(path = lastPath.split("^").join("."), source)) && (l = to.length)) { // Recursively dereference any ~foo or #bar tokens in the path. (Recursive because ~foo may be a contextual param which has // its own dependencies on other ~foo #bar components) - to = totry; - if (to._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag) - to = [to[l-3], to[l-2]]; + if (to[0]._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag) + to = to[0]; // so 'to' is the [view, expression/dependencies] for the contextual parameter + contextCb = $sub._gccb(to[0]); // getContextCallback: Move contextCb up to view where contextual parameter was assigned lastPath = to[1]; - if (lastPath._jsv) { + to = [to[0].data, to[1]]; + if (lastPath._jsv) { // computed value bindtoOb = lastPath; + bindtoOb.data = to[0]; + bindtoOb._cpCtx = contextCb; while (lastPath.sb && lastPath.sb._jsv) { path = lastPath = lastPath.sb; } @@ -2116,64 +2139,6 @@ function $unlink(to) { // Helpers //======== -function getContextCb(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc. - // TODO Consider exposing or allowing override, as public API - return function(path, object, depth) { - // TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on - // the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times - var tokens, tag, items, helper, last, nextPath, l; - if (view && path) { - if (path._jsv) { - return path._jsv.call(view.tmpl, object, view, $sub); - } - if (path.charAt(0) === "~") { - // We return new items to insert into the sequence, replacing the "~a.b.c" string: - // [helperObject 'a', "a.b.c" currentDataItem] so currentDataItem becomes the object for subsequent paths. - if (path.slice(0, 4) === "~tag") { - tag = view.ctx; - if (path.charAt(4) === ".") { - // "~tag.xxx" - tokens = path.slice(5).split("."); - tag = tag.tag; - } - if (tokens) { - return tag ? [tag, tokens.join("."), object] : []; - } - } - path = path.slice(1).split("."); - if (helper = view.hlp(last = path.shift(), true)) { - if (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [data, ctxPrmDependencies ...] - if (path.length) { - nextPath = "." + path.join("."); - last = helper[l = helper.length-1]; - if (last._jsv) { - last.sb = nextPath; - last.bnd = !!depth; - } else { - helper[l] = (last + nextPath).replace("#data.", ""); - if (last.slice(0, 5) === "#view") { - helper[l] = helper[l].slice(6); - helper.splice(l, 0, view); - } - } - } - helper.push(object); - items = helper; - } else if (path.length || $isFunction(helper)) { - items = [helper, path.join("."), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam - } - } - return items || []; - } - if (path.charAt(0) === "#") { - // We return new items to insert into the sequence, replacing the "#a.b.c" string: [view, "a.b.c" currentDataItem] - // so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes. - return path === "#data" ? [] : [view, path.replace(rViewPath, ""), object]; - } - } - }; -} - function inputAttrib(elem) { return elem.type === CHECKBOX ? elem[CHECKED] : elem.value; } @@ -3131,6 +3096,63 @@ $sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each refe return clones; }; +$sub._gccb = function(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc. + // TODO Consider exposing or allowing override, as public API + return function(path, object, depth) { + // TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on + // the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times + var tokens, tag, items, helper, last, nextPath, l; + if (view && path) { + if (path._jsv) { + return path._jsv.call(view.tmpl, object, view, $sub); + } + if (path.charAt(0) === "~") { + // We return new items to insert into the sequence, replacing the "~a.b.c" string: + // [helperObject 'a', "a.b.c" currentDataItem] so currentDataItem becomes the object for subsequent paths. + if (path.slice(0, 4) === "~tag") { + tag = view.ctx; + if (path.charAt(4) === ".") { + // "~tag.xxx" + tokens = path.slice(5).split("."); + tag = tag.tag; + } + if (tokens) { + return tag ? [tag, tokens.join("."), object] : []; + } + } + path = path.slice(1).split("."); + if (helper = view.hlp(last = path.shift(), true)) { + if (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [view, ctxPrmDependencies ...] + if (path.length) { + nextPath = "." + path.join("."); + last = helper[l = helper.length-1]; + if (last._jsv) { + last.sb = nextPath; + last.bnd = !!depth; + } else { + helper[l] = (last + nextPath).replace("#data.", ""); + if (last.slice(0, 5) === "#view") { + helper[l] = helper[l].slice(6); + helper.splice(l, 0, view); + } + } + } + items = [helper]; // Contextual parameter + } else if (path.length || $isFunction(helper)) { + items = [helper, path.join("."), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam + } + } + return items || []; + } + if (path.charAt(0) === "#") { + // We return new items to insert into the sequence, replacing the "#a.b.c" string: [view, "a.b.c" currentDataItem] + // so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes. + return path === "#data" ? [] : [view, path.replace(rViewPath, ""), object]; + } + } + }; +}; + //========================= // Extend $.views.settings //========================= @@ -3138,7 +3160,7 @@ $sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each refe oldAdvSet = $sub.advSet; $sub.advSet = function() { // refresh advanced settings - oldAdvSet(); + oldAdvSet.call($sub); global._jsv = $subSettingsAdvanced._jsv ? $extend(global._jsv || {}, { // create global _jsv, for accessing views, etc views: viewStore, @@ -3190,7 +3212,7 @@ $viewsSettings.advanced({ }, window)); },{}],2:[function(require,module,exports){ -/*! jsviews.js v0.9.82 (Beta) single-file version: http://jsviews.com/ */ +/*! jsviews.js v0.9.83 (Beta) single-file version: http://jsviews.com/ */ /*! includes JsRender, JsObservable and JsViews - see: http://jsviews.com/#download */ /* Interactive data-driven views using JsRender templates */ @@ -3239,7 +3261,7 @@ if (!$ || !$.fn) { throw "JsViews requires jQuery"; // We require jQuery } -var versionNumber = "v0.9.82", +var versionNumber = "v0.9.83", jsvStoreName, rTag, rTmplString, topView, $views, $observe, $observable, $expando, @@ -3548,9 +3570,9 @@ function getHelper(helper, isContextCb) { res = $helpers[helper]; } if (res && res._cp) { // If this helper resource is a contextual parameter, ~foo=expr - if (isContextCb) { // In a context callback for a contextual param, return the [currentData, dependencies...] array - needed for observe call + if (isContextCb) { // In a context callback for a contextual param, return the [view, dependencies...] array - needed for observe call deps = $sub._ceo(res[1].deps); // fn deps, with any exprObs cloned - deps.unshift(res[0].data); // view.data + deps.unshift(res[0]); // view deps._cp = true; return deps; } @@ -3823,7 +3845,7 @@ function renderTag(tagName, parentView, tmpl, tagCtxs, isUpdate, onError) { if (itemRet === undefined) { contentCtx = args[0]; // Default data context for wrapped block content is the first argument. Defined tag.contentCtx function to override this. if (tag.contentCtx) { - contentCtx = tag.contentCtx(contentCtx) || contentCtx; + contentCtx = tag.contentCtx(contentCtx); } itemRet = tagCtx.render(contentCtx, true) || (isUpdate ? undefined : ""); } @@ -4909,15 +4931,15 @@ function setPaths(fn, pathsArr) { i = 0, l = pathsArr.length; fn.deps = []; + fn.paths = []; // The array of path binding (array/dictionary)s for each tag/else block's args and props for (; i < l; i++) { - paths = pathsArr[i]; + fn.paths.push(paths = pathsArr[i]); for (key in paths) { - if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length) { + if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length && !paths[key].skp) { fn.deps = fn.deps.concat(paths[key]); // deps is the concatenation of the paths arrays for the different bindings } } } - fn.paths = paths; // The array of paths arrays for the different bindings } function parsedParam(args, props, ctx) { @@ -5074,7 +5096,8 @@ function parseParams(params, pathBindings, tmpl) { ) : eq // named param. Remove bindings for arg and create instead bindings array for prop - ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, bound && (bindings = bndCtx.bd = pathBindings[named] = []), path + ':') + ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, + bindings && ((bindings = bndCtx.bd = pathBindings[named] = []), bindings.skp = !bound), path + ':') : path // path ? (path.split("^").join(".").replace(rPath, parsePath) @@ -5344,7 +5367,7 @@ function getTargetProps(source) { } function $fnRender(data, context, noIteration) { - var tmplElem = this.jquery && (this[0] || error('Unknown template: "' + this.selector + '"')), + var tmplElem = this.jquery && (this[0] || error('Unknown template')), // Targeted element not found for jQuery template selector such as "#myTmpl" tmpl = tmplElem.getAttribute(tmplAttr); return renderContent.call(tmpl ? $.data(tmplElem)[jsvTmpl] : $templates(tmplElem), data, context, noIteration); @@ -5940,8 +5963,8 @@ if (!$.observe) { } } - var i, p, skip, parts, prop, path, dep, unobserve, callback, cbId, inId, el, data, events, contextCb, items, cbBindings, - depth, innerCb, parentObs, allPath, filter, initNsArr, initNsArrLen, + var i, p, skip, parts, prop, path, dep, unobserve, callback, cbId, inId, el, data, events, contextCb, innerContextCb, + items, cbBindings, depth, innerCb, parentObs, allPath, filter, initNsArr, initNsArrLen, ns = observeStr, paths = this != 1 // Using != for IE<10 bug- see jsviews/issues/237 ? concat.apply([], arguments) // Flatten the arguments - this is a 'recursive call' with params using the 'wrapped array' @@ -5970,7 +5993,7 @@ if (!$.observe) { } callback = lastArg; if (l && $isFunction(paths[l - 1])) { - contextCb = callback; + innerContextCb = contextCb = callback; callback = paths.pop(); l--; } @@ -6023,6 +6046,11 @@ if (!$.observe) { if (path === "") { continue; } + if (path && path._cp) { // Contextual parameter + contextCb = $sub._gccb(path[0]); // getContextCb: Get context callback for the contextual view (where contextual param evaluated/assigned) + origRoot = root = path[0].data; // Contextual data + path = path[1]; + } object = root; if ("" + path === path) { // Consider support for computed paths: jsviews/issues/292 @@ -6041,7 +6069,11 @@ if (!$.observe) { depth = path.split(".").length - depth; // if more than one ^ in the path, the first one determines depth } - if (contextCb && (items = contextCb(path, root, depth))) { + if (contextCb) { + items = contextCb(path, root, depth); + contextCb = innerContextCb; + } + if (items) { // If the array of objects and paths returned by contextCb is non empty, insert them // into the sequence, replacing the current item (path). Otherwise simply remove current item (path) l += items.length - 1; @@ -6586,6 +6618,7 @@ if (!$.observe) { }; $sub.advSet = function() { // refresh advanced settings + $sub._gccb = this._gccb; // getContextCallback method global._jsv = $subSettings.advanced._jsv ? { // create global _jsv, for accessing views, etc cbBindings: cbBindingsStore @@ -6678,88 +6711,92 @@ $observe = $observable.observe; //=============== function elemChangeHandler(ev, params, sourceValue) { - var setter, cancel, fromAttr, linkCtx, cvtBack, cnvtName, target, $source, view, binding, oldLinkCtx, onBeforeChange, onAfterChange, tag, to, eventArgs, exprOb, + var setter, cancel, fromAttr, linkCtx, cvtBack, cnvtName, target, $source, view, binding, + oldLinkCtx, onBeforeChange, onAfterChange, tag, to, eventArgs, exprOb, contextCb, source = ev.target, bindings = source._jsvBnd; // _jsvBnd is a string with the syntax: "&bindingId1&bindingId2" - if (bindings && ev.char!=="") { - while (binding = rSplitBindings.exec(bindings)) { - if (binding = bindingStore[binding[1]]) { - if (to = binding.to) { - // The binding has a 'to' field, which is of the form [[targetObject, toPath], cvtBack] - linkCtx = binding.linkCtx; - view = linkCtx.view; - tag = linkCtx.tag || view.tag; - $source = $(source); - onBeforeChange = view.hlp(onBeforeChangeStr); // TODO Can we optimize this and other instances of same? - onAfterChange = view.hlp(onAfterChangeStr); // TODO Can we optimize this and other instances of same - fromAttr = defaultAttr(source); - setter = fnSetters[fromAttr]; - if (sourceValue === undefined) { - sourceValue = $isFunction(fromAttr) - ? fromAttr(source) - : setter - ? $source[setter]() - : $source.attr(fromAttr); - } - cnvtName = to[1]; - to = to[0]; // [object, path] - to = to + "" === to ? [linkCtx.data, to] : to; - if (cnvtName) { - if ($isFunction(cnvtName)) { - cvtBack = cnvtName; - } else { - cvtBack = view.getRsc("converters", cnvtName); - } - } - if (linkCtx.elem.nodeName === "SELECT") { - linkCtx.elem._jsvSel = sourceValue = sourceValue || (linkCtx.elem.multiple ? [] : sourceValue); - // data-link to string or (multiselect) array of strings + } + if (cvtBack) { + sourceValue = cvtBack.call(tag, sourceValue); + } - // Set linkCtx on view, dynamically, just during this handler call - oldLinkCtx = view.linkCtx; - view.linkCtx = linkCtx; - eventArgs = { - change: "change", - oldValue: linkCtx._val, - value: sourceValue - }; - if ((!onBeforeChange || !(cancel = onBeforeChange.call(linkCtx, ev, eventArgs) === false)) && - (!tag || !tag.onBeforeChange || !(cancel = tag.onBeforeChange(ev, eventArgs) === false)) && - sourceValue !== undefined) { - target = to[0]; // [object, path] - if (sourceValue !== undefined && target) { - if (target._jsv) { - exprOb = target; - target = linkCtx.data; - while (exprOb && exprOb.sb) { - target = linkCtx._ctxCb(exprOb, target); - exprOb = exprOb.sb; - } - } - if (tag) { - tag._.chging = true; // marker to prevent tag change event triggering its own refresh + // Set linkCtx on view, dynamically, just during this handler call + oldLinkCtx = view.linkCtx; + view.linkCtx = linkCtx; + eventArgs = { + change: "change", + oldValue: linkCtx._val, + value: sourceValue + }; + if ((!onBeforeChange || !(cancel = onBeforeChange.call(linkCtx, ev, eventArgs) === false)) && + (!tag || !tag.onBeforeChange || !(cancel = tag.onBeforeChange(ev, eventArgs) === false)) && + sourceValue !== undefined) { + target = to[0]; // [object, path] + if (sourceValue !== undefined && target) { + if (target._jsv) { + contextCb = linkCtx._ctxCb; // This is a computed value + exprOb = target; + target = linkCtx.data; + if (exprOb._cpCtx) { // Computed value for a contextual parameter + target = exprOb.data; // The data for the contextual view (where contextual param expression evaluated/assigned) + contextCb = exprOb._cpCtx; // Context callback for contextual view } - $observable(target).setProperty(to[1], sourceValue); // 2way binding change event - observably updating bound object - if (onAfterChange) { - onAfterChange.call(linkCtx, ev, eventArgs); + while (exprOb && exprOb.sb) { // Step through chained computed values to leaf one... + target = contextCb(exprOb, target); + exprOb = exprOb.sb; } - if (tag) { - if (tag.onAfterChange) { - tag.onAfterChange(ev, eventArgs); - } - tag._.chging = undefined; // clear the marker + } + if (tag) { + tag._.chging = true; // marker to prevent tag change event triggering its own refresh + } + $observable(target).setProperty(to[1], sourceValue); // 2way binding change event - observably updating bound object + if (onAfterChange) { + onAfterChange.call(linkCtx, ev, eventArgs); + } + if (tag) { + if (tag.onAfterChange) { + tag.onAfterChange(ev, eventArgs); } - linkCtx._val = sourceValue; + tag._.chging = undefined; // clear the marker } + linkCtx._val = sourceValue; } - view.linkCtx = oldLinkCtx; } + view.linkCtx = oldLinkCtx; } } } @@ -7299,8 +7336,8 @@ function addBindingMarkers(value, view, tag) { // observeAndBind //--------------- -function observeAndBind(linkCtx, source, target) { //TODO? linkFnArgs) {; - var binding, l, linkedElem, exprFnDeps, exprOb, +function observeAndBind(linkCtx, source, target) { + var binding, l, k, linkedElem, exprFnDeps, exprOb, prop, propDeps, tag = linkCtx.tag, cvtBk = linkCtx.convertBack, depends = [], @@ -7325,6 +7362,22 @@ function observeAndBind(linkCtx, source, target) { //TODO? linkFnArgs) {; exprFnDeps = linkCtx.fn.deps.slice(); // Make a copy of the dependency paths for the compiled linkCtx expression - to pass to observe(). In getInnerCb(), // (and whenever the object is updated, in innerCb), we will set exprOb.ob to the current object returned by that computed expression, for this view. + + if (tag && tag.boundProps) { + // Add dependency paths for declared boundProps (so no need to writh ^myprop=... to get binding) and for linkedProp too if there is one + l = tag.boundProps.length; + while (l--) { + prop = tag.boundProps[l]; + k = tag._.bnd.paths.length; + while (k--) { + propDeps = tag._.bnd.paths[k][prop]; + if (propDeps && propDeps.skp) { // Not already a bound prop ^prop=expression; + exprFnDeps = exprFnDeps.concat(propDeps); // Add dependencies for this prop expression + } + } + } + } + l = exprFnDeps.length; while (l--) { exprOb = exprFnDeps[l]; @@ -8193,7 +8246,7 @@ function bindDataLinkTarget(linkCtx, linkFn) { $sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx), "link", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers)); } - linkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]} + linkCtx._ctxCb = $sub._gccb(linkCtx.view); // getContextCallback: _ctxCb, for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]} linkCtx._hdl = handler; // handler._ctx = linkCtx; Could pass linkCtx for use in a depends = function() {} call, so depends is different for different linkCtx's handler(true); @@ -8314,9 +8367,9 @@ function callAfterLink(tag, ev, eventArgs) { linkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem; displayElem = tag.displayElem || linkedElem; -if (linkedElem && linkedElem[0]) { - if (!tag._.chging) { - val = tag.cvtArgs()[0]; + if (linkedElem && linkedElem[0]) { + val = tag.cvtArgs()[0]; + if (val !== undefined && !tag._.chging) { l = linkedElem.length; while (l--) { linkedEl = linkedElem[l]; @@ -8338,7 +8391,7 @@ if (linkedElem && linkedElem[0]) { } else if (linkedEl.type === RADIO) { linkedEl[CHECKED] = (linkedEl.value === val); } else { - linkedEl.value = val; + $(linkedEl).val(val); // Use jQuery for attrHooks - can't just set value (on select, for example) } } else if (linkedEl.contentEditable === TRUE) { linkedEl.innerHTML = val; @@ -8394,14 +8447,15 @@ function bindTo(binding, tag, linkedElem, cvtBk) { // So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, "d.e"], and we bind to the path on the returned object, exprOb.ob, as target // Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z - var bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, totry, + var bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, linkCtx = binding.linkCtx, + contextCb = linkCtx._ctxCb, source = linkCtx.data, - paths = linkCtx.fn.paths; + paths = linkCtx.fn.paths[0]; tag = tag || linkedElem._jsvLkEl; - if (binding && paths && !binding.to) { + if (binding && paths && !binding.to) { oldTrig = linkedElem._jsvTr || false; if (tag) { cvtBk = tag.convertBack || cvtBk; @@ -8422,8 +8476,7 @@ function bindTo(binding, tag, linkedElem, cvtBk) { } paths = (bindto = paths._jsvto) || paths[0]; - pathIndex = paths && paths.length; - if (pathIndex && (!tag || tag.tagCtx.args.length)) { + if (pathIndex = paths && paths.length) { lastPath = paths[pathIndex - 1]; if (lastPath._jsv) { bindtoOb = lastPath; @@ -8439,15 +8492,18 @@ function bindTo(binding, tag, linkedElem, cvtBk) { lastPath ]; } else { - while ((totry = linkCtx._ctxCb(path = lastPath.split("^").join("."), source)) && (l = totry.length)) { + while ((to = contextCb(path = lastPath.split("^").join("."), source)) && (l = to.length)) { // Recursively dereference any ~foo or #bar tokens in the path. (Recursive because ~foo may be a contextual param which has // its own dependencies on other ~foo #bar components) - to = totry; - if (to._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag) - to = [to[l-3], to[l-2]]; + if (to[0]._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag) + to = to[0]; // so 'to' is the [view, expression/dependencies] for the contextual parameter + contextCb = $sub._gccb(to[0]); // getContextCallback: Move contextCb up to view where contextual parameter was assigned lastPath = to[1]; - if (lastPath._jsv) { + to = [to[0].data, to[1]]; + if (lastPath._jsv) { // computed value bindtoOb = lastPath; + bindtoOb.data = to[0]; + bindtoOb._cpCtx = contextCb; while (lastPath.sb && lastPath.sb._jsv) { path = lastPath = lastPath.sb; } @@ -8640,64 +8696,6 @@ function $unlink(to) { // Helpers //======== -function getContextCb(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc. - // TODO Consider exposing or allowing override, as public API - return function(path, object, depth) { - // TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on - // the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times - var tokens, tag, items, helper, last, nextPath, l; - if (view && path) { - if (path._jsv) { - return path._jsv.call(view.tmpl, object, view, $sub); - } - if (path.charAt(0) === "~") { - // We return new items to insert into the sequence, replacing the "~a.b.c" string: - // [helperObject 'a', "a.b.c" currentDataItem] so currentDataItem becomes the object for subsequent paths. - if (path.slice(0, 4) === "~tag") { - tag = view.ctx; - if (path.charAt(4) === ".") { - // "~tag.xxx" - tokens = path.slice(5).split("."); - tag = tag.tag; - } - if (tokens) { - return tag ? [tag, tokens.join("."), object] : []; - } - } - path = path.slice(1).split("."); - if (helper = view.hlp(last = path.shift(), true)) { - if (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [data, ctxPrmDependencies ...] - if (path.length) { - nextPath = "." + path.join("."); - last = helper[l = helper.length-1]; - if (last._jsv) { - last.sb = nextPath; - last.bnd = !!depth; - } else { - helper[l] = (last + nextPath).replace("#data.", ""); - if (last.slice(0, 5) === "#view") { - helper[l] = helper[l].slice(6); - helper.splice(l, 0, view); - } - } - } - helper.push(object); - items = helper; - } else if (path.length || $isFunction(helper)) { - items = [helper, path.join("."), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam - } - } - return items || []; - } - if (path.charAt(0) === "#") { - // We return new items to insert into the sequence, replacing the "#a.b.c" string: [view, "a.b.c" currentDataItem] - // so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes. - return path === "#data" ? [] : [view, path.replace(rViewPath, ""), object]; - } - } - }; -} - function inputAttrib(elem) { return elem.type === CHECKBOX ? elem[CHECKED] : elem.value; } @@ -9652,6 +9650,63 @@ $sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each refe return clones; }; +$sub._gccb = function(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc. + // TODO Consider exposing or allowing override, as public API + return function(path, object, depth) { + // TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on + // the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times + var tokens, tag, items, helper, last, nextPath, l; + if (view && path) { + if (path._jsv) { + return path._jsv.call(view.tmpl, object, view, $sub); + } + if (path.charAt(0) === "~") { + // We return new items to insert into the sequence, replacing the "~a.b.c" string: + // [helperObject 'a', "a.b.c" currentDataItem] so currentDataItem becomes the object for subsequent paths. + if (path.slice(0, 4) === "~tag") { + tag = view.ctx; + if (path.charAt(4) === ".") { + // "~tag.xxx" + tokens = path.slice(5).split("."); + tag = tag.tag; + } + if (tokens) { + return tag ? [tag, tokens.join("."), object] : []; + } + } + path = path.slice(1).split("."); + if (helper = view.hlp(last = path.shift(), true)) { + if (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [view, ctxPrmDependencies ...] + if (path.length) { + nextPath = "." + path.join("."); + last = helper[l = helper.length-1]; + if (last._jsv) { + last.sb = nextPath; + last.bnd = !!depth; + } else { + helper[l] = (last + nextPath).replace("#data.", ""); + if (last.slice(0, 5) === "#view") { + helper[l] = helper[l].slice(6); + helper.splice(l, 0, view); + } + } + } + items = [helper]; // Contextual parameter + } else if (path.length || $isFunction(helper)) { + items = [helper, path.join("."), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam + } + } + return items || []; + } + if (path.charAt(0) === "#") { + // We return new items to insert into the sequence, replacing the "#a.b.c" string: [view, "a.b.c" currentDataItem] + // so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes. + return path === "#data" ? [] : [view, path.replace(rViewPath, ""), object]; + } + } + }; +}; + //========================= // Extend $.views.settings //========================= @@ -9659,7 +9714,7 @@ $sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each refe oldAdvSet = $sub.advSet; $sub.advSet = function() { // refresh advanced settings - oldAdvSet(); + oldAdvSet.call($sub); global._jsv = $subSettingsAdvanced._jsv ? $extend(global._jsv || {}, { // create global _jsv, for accessing views, etc views: viewStore, @@ -18923,7 +18978,7 @@ return jQuery; })); },{}],4:[function(require,module,exports){ -/*! JsRender v0.9.82 (Beta): http://jsviews.com/#jsrender */ +/*! JsRender v0.9.83 (Beta): http://jsviews.com/#jsrender */ /*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ /* * Best-of-breed templating in browser or on Node.js. @@ -18969,7 +19024,7 @@ var setGlobals = $ === false; // Only set globals if script block in browser (no $ = $ && $.fn ? $ : global.jQuery; // $ is jQuery passed in by CommonJS loader (Browserify), or global jQuery. -var versionNumber = "v0.9.82", +var versionNumber = "v0.9.83", jsvStoreName, rTag, rTmplString, topView, $views, $expando, //TODO tmplFnsCache = {}, @@ -19277,9 +19332,9 @@ function getHelper(helper, isContextCb) { res = $helpers[helper]; } if (res && res._cp) { // If this helper resource is a contextual parameter, ~foo=expr - if (isContextCb) { // In a context callback for a contextual param, return the [currentData, dependencies...] array - needed for observe call + if (isContextCb) { // In a context callback for a contextual param, return the [view, dependencies...] array - needed for observe call deps = $sub._ceo(res[1].deps); // fn deps, with any exprObs cloned - deps.unshift(res[0].data); // view.data + deps.unshift(res[0]); // view deps._cp = true; return deps; } @@ -19552,7 +19607,7 @@ function renderTag(tagName, parentView, tmpl, tagCtxs, isUpdate, onError) { if (itemRet === undefined) { contentCtx = args[0]; // Default data context for wrapped block content is the first argument. Defined tag.contentCtx function to override this. if (tag.contentCtx) { - contentCtx = tag.contentCtx(contentCtx) || contentCtx; + contentCtx = tag.contentCtx(contentCtx); } itemRet = tagCtx.render(contentCtx, true) || (isUpdate ? undefined : ""); } @@ -20638,15 +20693,15 @@ function setPaths(fn, pathsArr) { i = 0, l = pathsArr.length; fn.deps = []; + fn.paths = []; // The array of path binding (array/dictionary)s for each tag/else block's args and props for (; i < l; i++) { - paths = pathsArr[i]; + fn.paths.push(paths = pathsArr[i]); for (key in paths) { - if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length) { + if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length && !paths[key].skp) { fn.deps = fn.deps.concat(paths[key]); // deps is the concatenation of the paths arrays for the different bindings } } } - fn.paths = paths; // The array of paths arrays for the different bindings } function parsedParam(args, props, ctx) { @@ -20803,7 +20858,8 @@ function parseParams(params, pathBindings, tmpl) { ) : eq // named param. Remove bindings for arg and create instead bindings array for prop - ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, bound && (bindings = bndCtx.bd = pathBindings[named] = []), path + ':') + ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, + bindings && ((bindings = bndCtx.bd = pathBindings[named] = []), bindings.skp = !bound), path + ':') : path // path ? (path.split("^").join(".").replace(rPath, parsePath) @@ -21073,7 +21129,7 @@ function getTargetProps(source) { } function $fnRender(data, context, noIteration) { - var tmplElem = this.jquery && (this[0] || error('Unknown template: "' + this.selector + '"')), + var tmplElem = this.jquery && (this[0] || error('Unknown template')), // Targeted element not found for jQuery template selector such as "#myTmpl" tmpl = tmplElem.getAttribute(tmplAttr); return renderContent.call(tmpl ? $.data(tmplElem)[jsvTmpl] : $templates(tmplElem), data, context, noIteration); @@ -21358,4 +21414,4 @@ test('More Errors for require() for JsRender, JsViews, JsObservable, JsRender te }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"../../":2,"../../jquery.views":1,"jQuery":3,"jsrender":4}]},{},[5]) -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqcXVlcnkudmlld3MuanMiLCJqc3ZpZXdzLmpzIiwibm9kZV9tb2R1bGVzL2pRdWVyeS9kaXN0L2pxdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9qc3JlbmRlci9qc3JlbmRlci5qcyIsInRlc3QvYnJvd3NlcmlmeS8xMS1lcnJvcnMtdW5pdC10ZXN0cy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdjNNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxL1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3eUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyohIGpxdWVyeS52aWV3cy5qcyB2MC45LjgyIChCZXRhKTogaHR0cDovL2pzdmlld3MuY29tLyAqL1xuLypcbiAqIEludGVyYWN0aXZlIGRhdGEtZHJpdmVuIHZpZXdzIHVzaW5nIEpzUmVuZGVyIHRlbXBsYXRlcy5cbiAqIFN1YmNvbXBvbmVudCBvZiBKc1ZpZXdzXG4gKiBSZXF1aXJlcyBqUXVlcnkgYW5kIGpzcmVuZGVyLmpzIChCZXN0LW9mLWJyZWVkIHRlbXBsYXRpbmcgaW4gYnJvd3NlciBvciBvbiBOb2RlLmpzKVxuICogICBTZWUgSnNSZW5kZXIgYXQgaHR0cDovL2pzdmlld3MuY29tLyNkb3dubG9hZCBhbmQgaHR0cDovL2dpdGh1Yi5jb20vQm9yaXNNb29yZS9qc3JlbmRlclxuICogQWxzbyByZXF1aXJlcyBqcXVlcnkub2JzZXJ2YWJsZS5qc1xuICogICBTZWUgSnNPYnNlcnZhYmxlIGF0IGh0dHA6Ly9qc3ZpZXdzLmNvbS8jZG93bmxvYWQgYW5kIGh0dHA6Ly9naXRodWIuY29tL0JvcmlzTW9vcmUvanN2aWV3c1xuICpcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vanNoaW50IC1XMDE4LCAtVzA0MVxuXG4oZnVuY3Rpb24oZmFjdG9yeSwgZ2xvYmFsKSB7XG5cdC8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG5cdHZhciAkID0gZ2xvYmFsLmpRdWVyeTtcblxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHsgLy8gQ29tbW9uSlMgZS5nLiBCcm93c2VyaWZ5XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSAkXG5cdFx0XHQ/IGZhY3RvcnkoZ2xvYmFsLCAkKVxuXHRcdFx0OiBmdW5jdGlvbigkKSB7IC8vIElmIG5vIGdsb2JhbCBqUXVlcnksIHRha2UgalF1ZXJ5IHBhc3NlZCBhcyBwYXJhbWV0ZXIgKHdpdGggSnNSZW5kZXIgYW5kIEpzT2JzZXJ2YWJsZSk6IHJlcXVpcmUoXCJqcXVlcnkudmlld3NcIikoalF1ZXJ5KVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdFx0fTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgeyAvLyBBTUQgc2NyaXB0IGxvYWRlciwgZS5nLiBSZXF1aXJlSlNcblx0XHRkZWZpbmUoW1wianF1ZXJ5XCIsIFwiLi9qc3JlbmRlclwiLCBcIi4vanF1ZXJ5Lm9ic2VydmFibGVcIl0sIGZ1bmN0aW9uKCQsIGpzciwganNvKSB7XG5cdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQsIGpzciwganNvKTtcblx0XHR9KTsgLy8gUmVxdWlyZSBqUXVlcnksIEpzUmVuZGVyLCBKc09ic2VydmFibGVcblx0fSBlbHNlIHsgLy8gQnJvd3NlciB1c2luZyBwbGFpbiA8c2NyaXB0PiB0YWdcblx0XHRmYWN0b3J5KGdsb2JhbCwgZmFsc2UpO1xuXHR9XG59IChcblxuLy8gZmFjdG9yeSAoZm9yIGpxdWVyeS52aWV3cy5qcylcbmZ1bmN0aW9uKGdsb2JhbCwgJCwganNyLCBqc28pIHtcblwidXNlIHN0cmljdFwiO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCB2YXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG52YXIgc2V0R2xvYmFscyA9ICQgPT09IGZhbHNlOyAvLyBPbmx5IHNldCBnbG9iYWxzIGlmIHNjcmlwdCBibG9jayBpbiBicm93c2VyIChub3QgQU1EIGFuZCBub3QgQ29tbW9uSlMpXG5cbmpzciA9IGpzciB8fCBzZXRHbG9iYWxzICYmIGdsb2JhbC5qc3JlbmRlcjtcbiQgPSAkIHx8IGdsb2JhbC5qUXVlcnk7XG5cbnZhciB2ZXJzaW9uTnVtYmVyID0gXCJ2MC45LjgyXCIsXG5cdHJlcXVpcmVzU3RyID0gXCJKc1ZpZXdzIHJlcXVpcmVzIFwiO1xuXG5pZiAoISQgfHwgISQuZm4pIHtcblx0Ly8galF1ZXJ5IGlzIG5vdCBsb2FkZWQuXG5cdHRocm93IHJlcXVpcmVzU3RyICsgXCJqUXVlcnlcIjsgLy8gV2UgcmVxdWlyZSBqUXVlcnlcbn1cblxuaWYgKGpzciAmJiAhanNyLmZuKSB7XG5cdGpzci52aWV3cy5zdWIuX2pxKCQpOyAvLyBtYXAgb3ZlciBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXNwYWNlXG59XG5cbnZhciAkb2JzZXJ2ZSwgJG9ic2VydmFibGUsXG5cdCRpc0FycmF5ID0gJC5pc0FycmF5LFxuXHQkdmlld3MgPSAkLnZpZXdzO1xuXG5pZiAoISR2aWV3cyB8fCAhJHZpZXdzLm1hcCkge1xuXHRcdC8vIEpzUmVuZGVyIGlzIG5vdCBsb2FkZWQuXG5cdHRocm93IHJlcXVpcmVzU3RyICsgXCJKc1JlbmRlclwiOyAvLyBqc3JlbmRlci5qcyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgSnNWaWV3cyBhbmQgYWZ0ZXIgalF1ZXJ5XG59XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudCxcblx0JHZpZXdzU2V0dGluZ3MgPSAkdmlld3Muc2V0dGluZ3MsXG5cdCRzdWIgPSAkdmlld3Muc3ViLFxuXHQkc3ViU2V0dGluZ3MgPSAkc3ViLnNldHRpbmdzLFxuXHQkZXh0ZW5kID0gJHN1Yi5leHRlbmQsXG5cdCRpc0Z1bmN0aW9uID0gJC5pc0Z1bmN0aW9uLFxuXHQkZXhwYW5kbyA9ICQuZXhwYW5kbyxcblx0JGNvbnZlcnRlcnMgPSAkdmlld3MuY29udmVydGVycyxcblx0JHRhZ3MgPSAkdmlld3MudGFncyxcblx0JHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQsXG5cblx0Ly8gVGhlc2UgdHdvIHNldHRpbmdzIGNhbiBiZSBvdmVycmlkZGVuIG9uIHNldHRpbmdzIGFmdGVyIGxvYWRpbmcganNSZW5kZXIsIGFuZCBwcmlvciB0byBsb2FkaW5nIGpxdWVyeS5vYnNlcnZhYmxlLmpzIGFuZC9vciBKc1ZpZXdzXG5cdHByb3BlcnR5Q2hhbmdlU3RyID0gJHN1Yi5wcm9wQ2huZyA9ICRzdWIucHJvcENobmcgfHwgXCJwcm9wZXJ0eUNoYW5nZVwiLFxuXHRhcnJheUNoYW5nZVN0ciA9ICRzdWIuYXJyQ2huZyA9ICRzdWIuYXJyQ2huZyB8fCBcImFycmF5Q2hhbmdlXCIsXG5cblx0SFRNTCA9IFwiaHRtbFwiLFxuXHRzeW50YXhFcnJvciA9ICRzdWIuc3ludGF4RXJyLFxuXHRyRmlyc3RFbGVtID0gLzwoPyFzY3JpcHQpKFxcdyspWz5cXHNdLyxcblx0ZXJyb3IgPSAkc3ViLl9lcixcblx0b25SZW5kZXJFcnJvciA9ICRzdWIuX2Vycixcblx0ZGVsaW1PcGVuQ2hhcjAsIGRlbGltT3BlbkNoYXIxLCBkZWxpbUNsb3NlQ2hhcjAsIGRlbGltQ2xvc2VDaGFyMSwgbGlua0NoYXIsIHRvcFZpZXcsXG5cdHJFc2NhcGVRdW90ZXMgPSAvWydcIlxcXFxdL2c7IC8vIEVzY2FwZSBxdW90ZXMgYW5kIFxcIGNoYXJhY3RlclxuaWYgKCQubGluaykgeyByZXR1cm4gJDsgfSAvLyBKc1ZpZXdzIGlzIGFscmVhZHkgbG9hZGVkXG5cbiRzdWJTZXR0aW5ncy50cmlnZ2VyID0gdHJ1ZTtcbnZhciBhY3RpdmVCb2R5LCByVGFnRGF0YWxpbmssICR2aWV3LCAkdmlld3NMaW5rQXR0ciwgbGlua1ZpZXdzU2VsLCB3cmFwTWFwLCB2aWV3U3RvcmUsIG9sZEFkdlNldCxcblx0anN2QXR0clN0ciA9IFwiZGF0YS1qc3ZcIixcblx0ZWxlbWVudENoYW5nZVN0ciA9IFwiY2hhbmdlLmpzdlwiLFxuXHRvbkJlZm9yZUNoYW5nZVN0ciA9IFwib25CZWZvcmVDaGFuZ2VcIixcblx0b25BZnRlckNoYW5nZVN0ciA9IFwib25BZnRlckNoYW5nZVwiLFxuXHRvbkFmdGVyQ3JlYXRlU3RyID0gXCJvbkFmdGVyQ3JlYXRlXCIsXG5cdENIRUNLRUQgPSBcImNoZWNrZWRcIixcblx0Q0hFQ0tCT1ggPSBcImNoZWNrYm94XCIsXG5cdFJBRElPID0gXCJyYWRpb1wiLFxuXHROT05FID0gXCJub25lXCIsXG5cdFNDUklQVCA9IFwiU0NSSVBUXCIsXG5cdFRSVUUgPSBcInRydWVcIixcblx0Y2xvc2VTY3JpcHQgPSAnXCI+PC9zY3JpcHQ+Jyxcblx0b3BlblNjcmlwdCA9ICc8c2NyaXB0IHR5cGU9XCJqc3YnLFxuXHRkZWZlckF0dHIgPSBqc3ZBdHRyU3RyICsgXCItZGZcIixcblx0YmluZEVsc1NlbCA9IFwic2NyaXB0LFtcIiArIGpzdkF0dHJTdHIgKyBcIl1cIixcblx0Zm5TZXR0ZXJzID0ge1xuXHRcdHZhbHVlOiBcInZhbFwiLFxuXHRcdGlucHV0OiBcInZhbFwiLFxuXHRcdGh0bWw6IEhUTUwsXG5cdFx0dGV4dDogXCJ0ZXh0XCJcblx0fSxcblx0dmFsdWVCaW5kaW5nID0ge2Zyb206IFwidmFsdWVcIiwgdG86IFwidmFsdWVcIn0sXG5cdGlzQ2xlYW5DYWxsID0gMCxcblx0b2xkQ2xlYW5EYXRhID0gJC5jbGVhbkRhdGEsXG5cdG9sZEpzdkRlbGltaXRlcnMgPSAkdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzLFxuXHRzYWZlRnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdHFzYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IsXG5cblx0Ly8gZWxDb250ZW50IG1hcHMgdGFnTmFtZXMgd2hpY2ggaGF2ZSBvbmx5IGVsZW1lbnQgY29udGVudCwgc28gbWF5IG5vdCBzdXBwb3J0IHNjcmlwdCBub2Rlcy5cblx0ZWxDb250ZW50ID0ge29sOiAxLCB1bDogMSwgdGFibGU6IDEsIHRib2R5OiAxLCB0aGVhZDogMSwgdGZvb3Q6IDEsIHRyOiAxLCBjb2xncm91cDogMSwgZGw6IDEsIHNlbGVjdDogMSwgb3B0Z3JvdXA6IDEsIHN2ZzogMSwgc3ZnX25zOiAxfSxcblx0YmFkUGFyZW50ID0ge3RyOiBcInRhYmxlXCJ9LFxuXHR2b2lkRWxlbXMgPSB7YnI6IDEsIGltZzogMSwgaW5wdXQ6IDEsIGhyOiAxLCBhcmVhOiAxLCBiYXNlOiAxLCBjb2w6IDEsIGxpbms6IDEsIG1ldGE6IDEsXG5cdFx0Y29tbWFuZDogMSwgZW1iZWQ6IDEsIGtleWdlbjogMSwgcGFyYW06IDEsIHNvdXJjZTogMSwgdHJhY2s6IDEsIHdicjogMX0sXG5cdGRpc3BsYXlTdHlsZXMgPSB7fSxcblx0YmluZGluZ1N0b3JlID0ge30sXG5cdGJpbmRpbmdLZXkgPSAxLFxuXHRyVmlld1BhdGggPSAvXiModmlld1xcLj8pPy8sXG5cdHJDb252ZXJ0TWFya2VycyA9IC8oKFxcLz4pfDxcXC8oXFx3Kyk+fCkoXFxzKikoWyNcXC9dXFxkKyg/Ol98KFxcXikpKWAoXFxzKikoPFxcdysoPz1bXFxzXFwvPl0pKT98XFxzKig/Oig8XFx3Kyg/PVtcXHNcXC8+XSkpfDxcXC8oXFx3Kyk+KFxccyopfChcXC8+KVxccyp8KD4pfCQpL2csXG5cdHJPcGVuVmlld01hcmtlcnMgPSAvKCMpKCkoXFxkKykoXykvZyxcblx0ck9wZW5NYXJrZXJzID0gLygjKSgpKFxcZCspKFtfXl0pL2csXG5cdHJWaWV3TWFya2VycyA9IC8oPzooIyl8KFxcLykpKFxcZCspKF8pL2csXG5cdHJPcGVuVGFnTWFya2VycyA9IC8oIykoKShcXGQrKShcXF4pL2csXG5cdHJNYXJrZXJUb2tlbnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShbX15dKShbLStAXFxkXSspPy9nLFxuXHRyU3BsaXRCaW5kaW5ncyA9IC8mKFxcZCspXFwrPy9nLFxuXHRnZXRDb21wdXRlZFN0eWxlID0gZ2xvYmFsLmdldENvbXB1dGVkU3R5bGU7XG5cbiRvYnNlcnZhYmxlID0gJC5vYnNlcnZhYmxlO1xuXG5pZiAoISRvYnNlcnZhYmxlKSB7XG5cdC8vIEpzT2JzZXJ2YWJsZSBpcyBub3QgbG9hZGVkLlxuXHR0aHJvdyByZXF1aXJlc1N0ciArIFwiSnNPYnNlcnZhYmxlXCI7IC8vIGpxdWVyeS5vYnNlcnZhYmxlLmpzIG11c3QgYmUgbG9hZGVkIGJlZm9yZSBKc1ZpZXdzXG59XG5cbiRvYnNlcnZlID0gJG9ic2VydmFibGUub2JzZXJ2ZTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBFdmVudCBoYW5kbGVyc1xuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZWxlbUNoYW5nZUhhbmRsZXIoZXYsIHBhcmFtcywgc291cmNlVmFsdWUpIHtcblx0dmFyIHNldHRlciwgY2FuY2VsLCBmcm9tQXR0ciwgbGlua0N0eCwgY3Z0QmFjaywgY252dE5hbWUsIHRhcmdldCwgJHNvdXJjZSwgdmlldywgYmluZGluZywgb2xkTGlua0N0eCwgb25CZWZvcmVDaGFuZ2UsIG9uQWZ0ZXJDaGFuZ2UsIHRhZywgdG8sIGV2ZW50QXJncywgZXhwck9iLFxuXHRcdHNvdXJjZSA9IGV2LnRhcmdldCxcblx0XHRiaW5kaW5ncyA9IHNvdXJjZS5fanN2Qm5kO1xuXG5cdC8vIF9qc3ZCbmQgaXMgYSBzdHJpbmcgd2l0aCB0aGUgc3ludGF4OiBcIiZiaW5kaW5nSWQxJmJpbmRpbmdJZDJcIlxuXHRpZiAoYmluZGluZ3MgJiYgZXYuY2hhciE9PVwiXCIpIHtcblx0XHR3aGlsZSAoYmluZGluZyA9IHJTcGxpdEJpbmRpbmdzLmV4ZWMoYmluZGluZ3MpKSB7XG5cdFx0XHRpZiAoYmluZGluZyA9IGJpbmRpbmdTdG9yZVtiaW5kaW5nWzFdXSkge1xuXHRcdFx0XHRpZiAodG8gPSBiaW5kaW5nLnRvKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIGJpbmRpbmcgaGFzIGEgJ3RvJyBmaWVsZCwgd2hpY2ggaXMgb2YgdGhlIGZvcm0gW1t0YXJnZXRPYmplY3QsIHRvUGF0aF0sIGN2dEJhY2tdXG5cdFx0XHRcdFx0bGlua0N0eCA9IGJpbmRpbmcubGlua0N0eDtcblx0XHRcdFx0XHR2aWV3ID0gbGlua0N0eC52aWV3O1xuXHRcdFx0XHRcdHRhZyA9IGxpbmtDdHgudGFnIHx8IHZpZXcudGFnO1xuXHRcdFx0XHRcdCRzb3VyY2UgPSAkKHNvdXJjZSk7XG5cdFx0XHRcdFx0b25CZWZvcmVDaGFuZ2UgPSB2aWV3LmhscChvbkJlZm9yZUNoYW5nZVN0cik7IC8vIFRPRE8gQ2FuIHdlIG9wdGltaXplIHRoaXMgYW5kIG90aGVyIGluc3RhbmNlcyBvZiBzYW1lP1xuXHRcdFx0XHRcdG9uQWZ0ZXJDaGFuZ2UgPSB2aWV3LmhscChvbkFmdGVyQ2hhbmdlU3RyKTsgLy8gVE9ETyBDYW4gd2Ugb3B0aW1pemUgdGhpcyBhbmQgb3RoZXIgaW5zdGFuY2VzIG9mIHNhbWVcblx0XHRcdFx0XHRmcm9tQXR0ciA9IGRlZmF1bHRBdHRyKHNvdXJjZSk7XG5cdFx0XHRcdFx0c2V0dGVyID0gZm5TZXR0ZXJzW2Zyb21BdHRyXTtcblx0XHRcdFx0XHRpZiAoc291cmNlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0c291cmNlVmFsdWUgPSAkaXNGdW5jdGlvbihmcm9tQXR0cilcblx0XHRcdFx0XHRcdFx0PyBmcm9tQXR0cihzb3VyY2UpXG5cdFx0XHRcdFx0XHRcdDogc2V0dGVyXG5cdFx0XHRcdFx0XHRcdFx0PyAkc291cmNlW3NldHRlcl0oKVxuXHRcdFx0XHRcdFx0XHRcdDogJHNvdXJjZS5hdHRyKGZyb21BdHRyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y252dE5hbWUgPSB0b1sxXTtcblx0XHRcdFx0XHR0byA9IHRvWzBdOyAvLyBbb2JqZWN0LCBwYXRoXVxuXHRcdFx0XHRcdHRvID0gdG8gKyBcIlwiID09PSB0byA/IFtsaW5rQ3R4LmRhdGEsIHRvXSA6IHRvO1xuXHRcdFx0XHRcdGlmIChjbnZ0TmFtZSkge1xuXHRcdFx0XHRcdFx0aWYgKCRpc0Z1bmN0aW9uKGNudnROYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRjdnRCYWNrID0gY252dE5hbWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjdnRCYWNrID0gdmlldy5nZXRSc2MoXCJjb252ZXJ0ZXJzXCIsIGNudnROYW1lKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGxpbmtDdHguZWxlbS5ub2RlTmFtZSA9PT0gXCJTRUxFQ1RcIikge1xuXHRcdFx0XHRcdFx0bGlua0N0eC5lbGVtLl9qc3ZTZWwgPSBzb3VyY2VWYWx1ZSA9IHNvdXJjZVZhbHVlIHx8IChsaW5rQ3R4LmVsZW0ubXVsdGlwbGUgPyBbXSA6IHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0XHRcdC8vIGRhdGEtbGluayA8c2VsZWN0PiB0byBzdHJpbmcgb3IgKG11bHRpc2VsZWN0KSBhcnJheSBvZiBzdHJpbmdzXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChjdnRCYWNrKSB7XG5cdFx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGN2dEJhY2suY2FsbCh0YWcsIHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTZXQgbGlua0N0eCBvbiB2aWV3LCBkeW5hbWljYWxseSwganVzdCBkdXJpbmcgdGhpcyBoYW5kbGVyIGNhbGxcblx0XHRcdFx0XHRvbGRMaW5rQ3R4ID0gdmlldy5saW5rQ3R4O1xuXHRcdFx0XHRcdHZpZXcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdFx0ZXZlbnRBcmdzID0ge1xuXHRcdFx0XHRcdFx0Y2hhbmdlOiBcImNoYW5nZVwiLFxuXHRcdFx0XHRcdFx0b2xkVmFsdWU6IGxpbmtDdHguX3ZhbCxcblx0XHRcdFx0XHRcdHZhbHVlOiBzb3VyY2VWYWx1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0aWYgKCghb25CZWZvcmVDaGFuZ2UgfHwgIShjYW5jZWwgPSBvbkJlZm9yZUNoYW5nZS5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpID09PSBmYWxzZSkpICYmXG5cdFx0XHRcdFx0XHRcdCghdGFnIHx8ICF0YWcub25CZWZvcmVDaGFuZ2UgfHwgIShjYW5jZWwgPSB0YWcub25CZWZvcmVDaGFuZ2UoZXYsIGV2ZW50QXJncykgPT09IGZhbHNlKSkgJiZcblx0XHRcdFx0XHRcdFx0c291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGFyZ2V0ID0gdG9bMF07IC8vIFtvYmplY3QsIHBhdGhdXG5cdFx0XHRcdFx0XHRpZiAoc291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRhcmdldC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwck9iID0gdGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHRcdHRhcmdldCA9IGxpbmtDdHguZGF0YTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoZXhwck9iICYmIGV4cHJPYi5zYikge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gbGlua0N0eC5fY3R4Q2IoZXhwck9iLCB0YXJnZXQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwck9iID0gZXhwck9iLnNiO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFnLl8uY2hnaW5nID0gdHJ1ZTsgLy8gbWFya2VyIHRvIHByZXZlbnQgdGFnIGNoYW5nZSBldmVudCB0cmlnZ2VyaW5nIGl0cyBvd24gcmVmcmVzaFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldCkuc2V0UHJvcGVydHkodG9bMV0sIHNvdXJjZVZhbHVlKTsgLy8gMndheSBiaW5kaW5nIGNoYW5nZSBldmVudCAtIG9ic2VydmFibHkgdXBkYXRpbmcgYm91bmQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdGlmIChvbkFmdGVyQ2hhbmdlKSB7XG5cdFx0XHRcdFx0XHRcdFx0b25BZnRlckNoYW5nZS5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGFnLm9uQWZ0ZXJDaGFuZ2UpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRhZy5vbkFmdGVyQ2hhbmdlKGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR0YWcuXy5jaGdpbmcgPSB1bmRlZmluZWQ7IC8vIGNsZWFyIHRoZSBtYXJrZXJcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRsaW5rQ3R4Ll92YWwgPSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmlldy5saW5rQ3R4ID0gb2xkTGlua0N0eDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIoZXYsIGV2ZW50QXJncywgbGlua0ZuKSB7XG5cdHZhciBhdHRyLCBzb3VyY2VWYWx1ZSwgbm9VcGRhdGUsIGZvcmNlVXBkYXRlLCBoYXNFcnJvciwgb25FcnJvcixcblx0XHRsaW5rQ3R4ID0gdGhpcyxcblx0XHR0YWcgPSBsaW5rQ3R4LnRhZyxcblx0XHRzb3VyY2UgPSBsaW5rQ3R4LmRhdGEsXG5cdFx0dGFyZ2V0ID0gbGlua0N0eC5lbGVtLFxuXHRcdGN2dCA9IGxpbmtDdHguY29udmVydCxcblx0XHRwYXJlbnRFbGVtID0gdGFyZ2V0LnBhcmVudE5vZGUsXG5cdFx0dmlldyA9IGxpbmtDdHgudmlldyxcblx0XHRvbGRMaW5rQ3R4ID0gdmlldy5saW5rQ3R4LFxuXHRcdG9uRXZlbnQgPSB2aWV3LmhscChvbkJlZm9yZUNoYW5nZVN0cik7XG5cblx0Ly8gU2V0IGxpbmtDdHggb24gdmlldywgZHluYW1pY2FsbHksIGp1c3QgZHVyaW5nIHRoaXMgaGFuZGxlciBjYWxsXG5cdHZpZXcubGlua0N0eCA9IGxpbmtDdHg7XG5cblx0aWYgKHBhcmVudEVsZW0gJiYgKCFvbkV2ZW50IHx8ICEoZXZlbnRBcmdzICYmIG9uRXZlbnQuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKVxuXHRcdFx0Ly8gSWYgZGF0YSBjaGFuZ2VkLCB0aGUgZXYuZGF0YSBpcyBzZXQgdG8gYmUgdGhlIHBhdGguIFVzZSB0aGF0IHRvIGZpbHRlciB0aGUgaGFuZGxlciBhY3Rpb24uLi5cblx0XHRcdCYmICEoZXZlbnRBcmdzICYmIGV2LmRhdGEucHJvcCAhPT0gXCIqXCIgJiYgZXYuZGF0YS5wcm9wICE9PSBldmVudEFyZ3MucGF0aCkpIHtcblxuXHRcdGlmIChldmVudEFyZ3MpIHtcblx0XHRcdGxpbmtDdHguZXZlbnRBcmdzID0gZXZlbnRBcmdzO1xuXHRcdH1cblx0XHRpZiAoZXZlbnRBcmdzIHx8IGxpbmtDdHguX3RvTGspIHtcblx0XHRcdC8vIElmIGV2ZW50QXJncyBhcmUgZGVmaW5lZCwgdGhpcyBpcyBhIGRhdGEgdXBkYXRlXG5cdFx0XHQvLyBPdGhlcndpc2UgdGhpcyBpcyB0aGUgaW5pdGlhbCBkYXRhLWxpbmsgcmVuZGVyaW5nIGNhbGwuIEJpbmQgb24gdGhpcyB0aGUgZmlyc3QgdGltZSBpdCBnZXQgY2FsbGVkXG5cdFx0XHRsaW5rQ3R4Ll90b0xrID0gMDsgLy8gUmVtb3ZlIGZsYWcgdG8gc2tpcCB1bm5lY2Nlc3NhcnkgcmViaW5kaW5nIG5leHQgdGltZVxuXHRcdFx0aWYgKGxpbmtGbi5fZXIpIHtcblx0XHRcdFx0Ly8gZGF0YS1saW5rPVwiZXhwclVzaW5nVGFnT3JDdnQgd2l0aCBvbmVycm9yPS4uLlwiIC0gZS5nLiB7dGFnIC4uLiB7Y3Z0Oi4uLiB7Oi4uLiBjb252ZXJ0PSdjdnQnXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0c291cmNlVmFsdWUgPSBsaW5rRm4oc291cmNlLCB2aWV3KTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdGhhc0Vycm9yID0gbGlua0ZuLl9lcjtcblx0XHRcdFx0XHRvbkVycm9yID0gb25SZW5kZXJFcnJvcihlLHZpZXcsKG5ldyBGdW5jdGlvbihcImRhdGEsdmlld1wiLCBcInJldHVybiBcIiArIGhhc0Vycm9yICsgXCI7XCIpKShzb3VyY2UsIHZpZXcpKTtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IFt7cHJvcHM6IHt9LCBhcmdzOiBbb25FcnJvcl19XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c291cmNlVmFsdWUgPSBsaW5rRm4oc291cmNlLCB2aWV3LCAkc3ViKTtcblx0XHRcdH1cblx0XHRcdC8vIENvbXBpbGVkIGxpbmsgZXhwcmVzc2lvbiBmb3IgbGlua1RhZzogcmV0dXJuIHZhbHVlIGZvciBkYXRhLWxpbms9XCJ7Onh4eH1cIiB3aXRoIG5vIGN2dCBvciBjdnRCaywgb3RoZXJ3aXNlIHRhZ0N0eCBvciB0YWdDdHhzXG5cblx0XHRcdGF0dHIgPSBnZXRUYXJnZXRWYWwoc291cmNlVmFsdWUsIGxpbmtDdHgsIHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdFx0XHRcdGxpbmtDdHguYXR0ciB8fCBkZWZhdWx0QXR0cih0YXJnZXQsIHRydWUsIGN2dCAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdC8vIEV4aXN0aW5nIHRhZyBpbnN0YW5jZVxuXHRcdFx0XHRmb3JjZVVwZGF0ZSA9IGhhc0Vycm9yIHx8IHRhZy5fZXI7XG5cdFx0XHRcdC8vIElmIHRoZSBuZXcgdGFnQ3R4cyBoYXNFcnJvciBvciB0aGUgcHJldmlvdXMgdGFnQ3R4cyBoYWQgZXJyb3IsIHRoZW4gZm9yY2UgdXBkYXRlXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWVbMF0gPyBzb3VyY2VWYWx1ZSA6IFtzb3VyY2VWYWx1ZV07XG5cdFx0XHRcdG5vVXBkYXRlID0gIWZvcmNlVXBkYXRlICYmIGV2ZW50QXJncyAmJiB0YWcub25VcGRhdGUgJiYgdGFnLm9uVXBkYXRlKGV2LCBldmVudEFyZ3MsIHNvdXJjZVZhbHVlKSA9PT0gZmFsc2U7XG5cblx0XHRcdFx0bWVyZ2VDdHhzKHRhZywgc291cmNlVmFsdWUsIGZvcmNlVXBkYXRlKTtcblxuXHRcdFx0XHRpZiAobm9VcGRhdGUgfHwgYXR0ciA9PT0gTk9ORSkge1xuXHRcdFx0XHRcdC8vIG9uVXBkYXRlIHJldHVybmVkIGZhbHNlLCBvciBhdHRyID09PSBcIm5vbmVcIiwgb3IgdGhpcyBpcyBhbiB1cGRhdGUgY29taW5nIGZyb20gdGhlIHRhZydzIG93biBjaGFuZ2UgZXZlbnRcblx0XHRcdFx0XHQvLyAtIHNvIGRvbid0IHJlZnJlc2ggdGhlIHRhZzogd2UganVzdCB1c2UgdGhlIG5ldyB0YWdDdHhzIG1lcmdlZCBmcm9tIHRoZSBzb3VyY2VWYWx1ZSxcblx0XHRcdFx0XHQvLyAod2hpY2ggbWF5IG9wdGlvbmFsbHkgaGF2ZSBiZWVuIG1vZGlmZWQgaW4gb25VcGRhdGUoKS4uLikgYW5kIHRoZW4gYmluZCwgYW5kIHdlIGFyZSBkb25lXG5cdFx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KTtcblx0XHRcdFx0XHR2aWV3LmxpbmtDdHggPSBvbGRMaW5rQ3R4O1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGFnLl8uY2hnaW5nKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRhZy5vblVuYmluZCkge1xuXHRcdFx0XHRcdHRhZy5vblVuYmluZCh0YWcudGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4LCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gdGFnLnRhZ05hbWUgPT09IFwiOlwiIC8vIENhbGwgY29udmVydFZhbCBpZiBpdCBpcyBhIHt7Y3Z0Oi4uLn19IC0gb3RoZXJ3aXNlIGNhbGwgcmVuZGVyVGFnXG5cdFx0XHRcdFx0PyAkc3ViLl9jbnZ0KHRhZy5jdnQsIHZpZXcsIHNvdXJjZVZhbHVlWzBdKVxuXHRcdFx0XHRcdDogJHN1Yi5fdGFnKHRhZywgdmlldywgdmlldy50bXBsLCBzb3VyY2VWYWx1ZSwgdHJ1ZSwgb25FcnJvcik7XG5cdFx0XHR9IGVsc2UgaWYgKGxpbmtGbi5fdGFnKSB7XG5cdFx0XHRcdC8vIEZvciB7ezogLi4ufX0gd2l0aG91dCBhIGNvbnZlcnQgb3IgY29udmVydEJhY2ssIHdlIGFscmVhZHkgaGF2ZSB0aGUgc291cmNlVmFsdWUsIGFuZCB3ZSBhcmUgZG9uZVxuXHRcdFx0XHQvLyBGb3Ige3s6IC4uLn19IHdpdGggZWl0aGVyIGN2dCBvciBjdnRCYWNrIHdlIGNhbGwgY29udmVydFZhbCB0byBnZXQgdGhlIHNvdXJjZVZhbHVlIGFuZCBpbnN0YW50aWF0ZSB0aGUgdGFnXG5cdFx0XHRcdC8vIElmIGN2dCBpcyB1bmRlZmluZWQgdGhlbiB0aGlzIGlzIGEgdGFnLCBhbmQgd2UgY2FsbCByZW5kZXJUYWcgdG8gZ2V0IHRoZSByZW5kZXJlZCBjb250ZW50IGFuZCBpbnN0YW50aWF0ZSB0aGUgdGFnXG5cdFx0XHRcdGN2dCA9IGN2dCA9PT0gXCJcIiA/IFRSVUUgOiBjdnQ7IC8vIElmIHRoZXJlIGlzIGEgY3Z0QmFjayBidXQgbm8gY3Z0LCBzZXQgY3Z0IHRvIFwidHJ1ZVwiXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gY3Z0IC8vIENhbGwgY29udmVydFZhbCBpZiBpdCBpcyBhIHt7Y3Z0Oi4uLn19IC0gb3RoZXJ3aXNlIGNhbGwgcmVuZGVyVGFnXG5cdFx0XHRcdFx0PyAkc3ViLl9jbnZ0KGN2dCwgdmlldywgc291cmNlVmFsdWVbMF0gfHwgc291cmNlVmFsdWUpIC8vIGNvbnZlcnRWYWxcblx0XHRcdFx0XHQ6ICRzdWIuX3RhZyhsaW5rRm4uX3RhZywgdmlldywgdmlldy50bXBsLCBzb3VyY2VWYWx1ZSwgdHJ1ZSwgb25FcnJvcik7IC8vIHJlbmRlclRhZ1xuXG5cdFx0XHRcdGFkZExpbmtNZXRob2RzKHRhZyA9IGxpbmtDdHgudGFnLCB0cnVlKTsgLy8gSW4gYm90aCBjb252ZXJ0VmFsIGFuZCByZW5kZXJUYWcgd2UgaGF2ZSBpbnN0YW50aWF0ZWQgYSB0YWdcblx0XHRcdFx0YXR0ciA9IGxpbmtDdHguYXR0ciB8fCBhdHRyOyAvLyBsaW5rQ3R4LmF0dHIgbWF5IGhhdmUgYmVlbiBzZXQgdG8gdGFnLmF0dHIgZHVyaW5nIHRhZyBpbnN0YW50aWF0aW9uIGluIHJlbmRlclRhZ1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodXBkYXRlQ29udGVudChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgYXR0ciwgdGFnKVxuXHRcdFx0XHRcdCYmIGV2ZW50QXJnc1xuXHRcdFx0XHRcdCYmIChvbkV2ZW50ID0gdmlldy5obHAob25BZnRlckNoYW5nZVN0cikpKSB7XG5cdFx0XHRcdG9uRXZlbnQuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdH1cblx0XHRcdGxpbmtDdHguX25vVXBkID0gMDsgLy8gRm9yIGRhdGEtbGluaz1cIl57Li4ufVwiIHJlbW92ZSBfbm9VcGQgZmxhZyBzbyB1cGRhdGVzIG9uIHN1YnNlcXVlbnQgY2FsbHNcblxuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHR0YWcuX2VyID0gaGFzRXJyb3I7XG5cdFx0XHRcdGNhbGxBZnRlckxpbmsodGFnLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvYnNlcnZlQW5kQmluZChsaW5rQ3R4LCBzb3VyY2UsIHRhcmdldCk7XG5cblx0XHQvLyBSZW1vdmUgZHluYW1pY2FsbHkgYWRkZWQgbGlua0N0eCBmcm9tIHZpZXdcblx0XHR2aWV3LmxpbmtDdHggPSBvbGRMaW5rQ3R4O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldFZhbChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgdGFnLCBhdHRyKSB7XG5cdHZhciBjdXJyZW50VmFsdWUsIHNldHRlciwgY3NzLCAkdGFyZ2V0LFxuXHRcdHRhcmdldCA9IHRhZyAmJiB0YWcucGFyZW50RWxlbSB8fCBsaW5rQ3R4LmVsZW07XG5cblx0aWYgKHNvdXJjZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHQkdGFyZ2V0ID0gJCh0YXJnZXQpO1xuXHRcdGF0dHIgPSB0YWcgJiYgdGFnLmF0dHIgfHwgYXR0cjtcblx0XHRpZiAoJGlzRnVuY3Rpb24oc291cmNlVmFsdWUpKSB7XG5cdFx0XHRlcnJvcihsaW5rQ3R4LmV4cHIgKyBcIjogbWlzc2luZyBwYXJlbnNcIik7XG5cdFx0fVxuXG5cdFx0aWYgKGNzcyA9IC9eY3NzLS8udGVzdChhdHRyKSAmJiBhdHRyLnNsaWNlKDQpKSB7XG5cdFx0XHRjdXJyZW50VmFsdWUgPSAkLnN0eWxlKHRhcmdldCwgY3NzKTtcblx0XHRcdGlmICgrc291cmNlVmFsdWUgPT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdC8vIE9wdGltaXphdGlvbiBmb3IgcGVyZiBvbiBpbnRlZ2VyIHZhbHVlcyAtIGUuZy4gY3NzLXdpZHRoezp3aWR0aCsncHgnfVxuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBwYXJzZUludChjdXJyZW50VmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoYXR0ciAhPT0gXCJsaW5rXCIpIHsgLy8gYXR0ciA9PT0gXCJsaW5rXCIgaXMgZm9yIHRhZyBjb250cm9scyB3aGljaCBkbyBkYXRhIGJpbmRpbmcgYnV0IGhhdmUgbm8gcmVuZGVyZWQgb3V0cHV0IG9yIHRhcmdldFxuXHRcdFx0aWYgKGF0dHIgPT09IFwidmFsdWVcIikge1xuXHRcdFx0XHRpZiAodGFyZ2V0LnR5cGUgPT09IENIRUNLQk9YKSB7XG5cdFx0XHRcdFx0Y3VycmVudFZhbHVlID0gJHRhcmdldC5wcm9wKGF0dHIgPSBDSEVDS0VEKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhdHRyID09PSBSQURJTykge1xuXHRcdFx0XHRpZiAodGFyZ2V0LnZhbHVlID09PSAoXCJcIiArIHNvdXJjZVZhbHVlKSkge1xuXHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSA9ICR0YXJnZXQucHJvcChDSEVDS0VEKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gYXR0cjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0c2V0dGVyID0gZm5TZXR0ZXJzW2F0dHJdO1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBzZXR0ZXIgPyAkdGFyZ2V0W3NldHRlcl0oKSA6ICR0YXJnZXQuYXR0cihhdHRyKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGlua0N0eC5fdmFsID0gY3VycmVudFZhbHVlO1xuXHR9XG5cdHJldHVybiBhdHRyO1xufVxuXG5mdW5jdGlvbiBzZXREZWZlcihlbGVtLCB2YWx1ZSkge1xuXHRlbGVtLl9kZiA9IHZhbHVlOyAvLyBVc2UgYm90aCBhbiBleHBhbmRvIGFuZCBhbiBhdHRyaWJ1dGUgdG8gdHJhY2sgZGVmZXJlZCB0b2tlbnMuIEF0dHJpYnV0ZSBpcyBuZWVkZWQgZm9yIHF1ZXJ5U2VsZWN0b3JBbGwgZm9yIGdldFZpZXdJbmZvcyAoY2hpbGRUYWdzKVxuXHRlbGVtWyh2YWx1ZSA/IFwic2V0XCIgOiBcInJlbW92ZVwiKSArIFwiQXR0cmlidXRlXCJdKGRlZmVyQXR0ciwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQoc291cmNlVmFsdWUsIGxpbmtDdHgsIGF0dHIsIHRhZykge1xuXHQvLyBXaGVuIGNhbGxlZCBmb3IgYSB0YWcsIGVpdGhlciBpbiB0YWcucmVmcmVzaCgpIG9yIHByb3BlcnR5Q2hhbmdlSGFuZGxlcigpLCByZXR1cm5zIGEgcHJvbWlzZSAoYW5kIHN1cHBvcnRzIGFzeW5jKVxuXHQvLyBXaGVuIGNhbGxlZCAoaW4gcHJvcGVydHlDaGFuZ2VIYW5kbGVyKSBmb3IgdGFyZ2V0IEhUTUwgcmV0dXJucyB0cnVlXG5cdC8vIFdoZW4gY2FsbGVkIChpbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIpIGZvciBvdGhlciB0YXJnZXRzIHJldHVybnMgYm9vbGVhbiBmb3IgXCJjaGFuZ2VkXCJcblx0dmFyIHNldHRlciwgcHJldk5vZGUsIG5leHROb2RlLCBwcm9taXNlLCBub2Rlc1RvUmVtb3ZlLCB1c2VQcm9wLCB0b2tlbnMsIGlkLCBvcGVuSW5kZXgsIGNsb3NlSW5kZXgsIHRlc3RFbGVtLCBub2RlTmFtZSwgY1N0eWxlLCBqc3ZTZWwsXG5cdFx0cmVuZGVycyA9IGF0dHIgIT09IE5PTkUgJiYgc291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhbGlua0N0eC5fbm9VcGQsIC8vIEZvciBkYXRhLWxpbms9XCJeey4uLn1cIiwgZG9uJ3QgdXBkYXRlIHRoZSBmaXJzdCB0aW1lIChubyBpbml0aWFsIHJlbmRlcikgLSBlLmcuIHRvIGxlYXZlIHNlcnZlciByZW5kZXJlZCB2YWx1ZXMuXG5cdFx0c291cmNlID0gbGlua0N0eC5kYXRhLFxuXHRcdHRhcmdldCA9IHRhZyAmJiB0YWcucGFyZW50RWxlbSB8fCBsaW5rQ3R4LmVsZW0sXG5cdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0LnBhcmVudE5vZGUsXG5cdFx0JHRhcmdldCA9ICQodGFyZ2V0KSxcblx0XHR2aWV3ID0gbGlua0N0eC52aWV3LFxuXHRcdHRhcmdldFZhbCA9IGxpbmtDdHguX3ZhbCxcblx0XHRvbGRMaW5rQ3R4ID0gdmlldy5saW5rQ3R4LFxuXHRcdC8vIElmIG5vdCBhIHRhZyB3ZSBjYW4gdXNlIHRoZSAuX3ZhbCBvYnRhaW5lZCBmcm9tIGdldFRhcmdldFZhbCgpXG5cdFx0Ly8gYW5kIG9ubHkgdXBkYXRlIHdoZW4gdGhlIG5ldyB2YWx1ZSAoc291cmNlVmFsdWUpIGhhcyBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIG9uZVxuXHRcdGNoYW5nZSA9IHRhZztcblxuXHRpZiAodGFnKSB7XG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgdGFnIHdpdGggZWxlbWVudCByZWZlcmVuY2VzXG5cdFx0dGFnLl8udW5saW5rZWQgPSB0cnVlOyAvLyBTZXQgdG8gdW5saW5rZWQsIHNvIGluaXRpYWxpemF0aW9uIGlzIHRyaWdnZXJlZCBhZnRlciByZS1yZW5kZXJpbmcsIGUuZy4gZm9yIHNldHRpbmcgbGlua2VkRWxlbSwgYW5kIGNhbGxpbmcgb25CaW5kXG5cdFx0dGFnLnBhcmVudEVsZW0gPSB0YWcucGFyZW50RWxlbSB8fCAobGlua0N0eC5leHByIHx8IHRhZy5fZWxDbnQpID8gdGFyZ2V0IDogdGFyZ2V0UGFyZW50O1xuXHRcdHByZXZOb2RlID0gdGFnLl9wcnY7XG5cdFx0bmV4dE5vZGUgPSB0YWcuX254dDtcblx0fVxuXHRpZiAoIXJlbmRlcnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoYXR0ciA9PT0gXCJ2aXNpYmxlXCIpIHtcblx0XHRhdHRyID0gXCJjc3MtZGlzcGxheVwiO1xuXHR9XG5cdGlmICgvXmNzcy0vLnRlc3QoYXR0cikpIHtcblx0XHRpZiAobGlua0N0eC5hdHRyID09PSBcInZpc2libGVcIikge1xuXHRcdFx0Ly8gR2V0IHRoZSBjdXJyZW50IGRpc3BsYXkgc3R5bGVcblx0XHRcdGNTdHlsZSA9ICh0YXJnZXQuY3VycmVudFN0eWxlIHx8IGdldENvbXB1dGVkU3R5bGUuY2FsbChnbG9iYWwsIHRhcmdldCwgXCJcIikpLmRpc3BsYXk7XG5cblx0XHRcdGlmIChzb3VyY2VWYWx1ZSkge1xuXHRcdFx0XHQvLyBXZSBhcmUgc2hvd2luZyB0aGUgZWxlbWVudC5cblx0XHRcdFx0Ly8gR2V0IHRoZSBjYWNoZWQgJ3Zpc2libGUnIGRpc3BsYXkgdmFsdWUgZnJvbSB0aGUgLWpzdmQgZXhwYW5kb1xuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IHRhcmdldC5fanN2ZFxuXHRcdFx0XHRcdC8vIE9yLCBpZiBub3QgeWV0IGNhY2hlZCwgZ2V0IHRoZSBjdXJyZW50IGRpc3BsYXkgdmFsdWVcblx0XHRcdFx0XHR8fCBjU3R5bGU7XG5cdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSA9PT0gTk9ORSAmJiAhKHNvdXJjZVZhbHVlID0gZGlzcGxheVN0eWxlc1tub2RlTmFtZSA9IHRhcmdldC5ub2RlTmFtZV0pKSB7XG5cdFx0XHRcdFx0Ly8gQ3VycmVudGx5IGRpc3BsYXkgdmFsdWUgaXMgJ25vbmUnLCBhbmQgdGhlICd2aXNpYmxlJyBzdHlsZSBoYXMgbm90IGJlZW4gY2FjaGVkLlxuXHRcdFx0XHRcdC8vIFdlIGNyZWF0ZSBhbiBlbGVtZW50IHRvIGZpbmQgdGhlIGNvcnJlY3QgJ3Zpc2libGUnIGRpc3BsYXkgc3R5bGUgZm9yIHRoaXMgbm9kZU5hbWVcblx0XHRcdFx0XHR0ZXN0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpO1xuXHRcdFx0XHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVzdEVsZW0pO1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBkZWZhdWx0IHN0eWxlIGZvciB0aGlzIEhUTUwgdGFnIHRvIHVzZSBhcyAndmlzaWJsZScgc3R5bGVcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZVxuXHRcdFx0XHRcdFx0Ly8gYW5kIGNhY2hlIGl0IGFzIGEgaGFzaCBhZ2FpbnN0IG5vZGVOYW1lXG5cdFx0XHRcdFx0XHQ9IGRpc3BsYXlTdHlsZXNbbm9kZU5hbWVdXG5cdFx0XHRcdFx0XHQ9ICh0ZXN0RWxlbS5jdXJyZW50U3R5bGUgfHwgZ2V0Q29tcHV0ZWRTdHlsZS5jYWxsKGdsb2JhbCwgdGVzdEVsZW0sIFwiXCIpKS5kaXNwbGF5O1xuXHRcdFx0XHRcdGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVzdEVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXZSBhcmUgaGlkaW5nIHRoZSBlbGVtZW50LlxuXHRcdFx0XHQvLyBDYWNoZSB0aGUgY3VycmVudCBkaXNwbGF5IHZhbHVlIGFzICd2aXNpYmxlJyBzdHlsZSwgb24gX2pzdmQgZXhwYW5kbywgZm9yIHdoZW4gd2Ugc2hvdyB0aGUgZWxlbWVudCBhZ2FpblxuXHRcdFx0XHR0YXJnZXQuX2pzdmQgPSBjU3R5bGU7XG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gTk9ORTsgLy8gSGlkZSB0aGUgZWxlbWVudFxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoY2hhbmdlID0gY2hhbmdlIHx8IHRhcmdldFZhbCAhPT0gc291cmNlVmFsdWUpIHtcblx0XHRcdCQuc3R5bGUodGFyZ2V0LCBhdHRyLnNsaWNlKDQpLCBzb3VyY2VWYWx1ZSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGF0dHIgIT09IFwibGlua1wiKSB7IC8vIGF0dHIgPT09IFwibGlua1wiIGlzIGZvciB0YWcgY29udHJvbHMgd2hpY2ggZG8gZGF0YSBiaW5kaW5nIGJ1dCBoYXZlIG5vIHJlbmRlcmVkIG91dHB1dCBvciB0YXJnZXRcblx0XHRpZiAoL15kYXRhLS8udGVzdChhdHRyKSkge1xuXHRcdFx0JC5kYXRhKHRhcmdldCwgYXR0ci5zbGljZSg1KSwgc291cmNlVmFsdWUpOyAvLyBTdXBwb3J0IGZvciBiaW5kaW5nIHRvIGRhdGEgYXR0cmlidXRlczogZGF0YS1mb297OmV4cHJ9OiBkYXRhLWZvbyBhdHRyaWJ1dGUgd2lsbCBiZVxuXHRcdFx0Ly8gZXhwci50b1N0cmluZygpLCBidXQgJC5kYXRhKGVsZW1lbnQsIFwiZm9vXCIpIGFuZCAkKGVsZW1lbnQpLmRhdGEoXCJmb29cIikgd2lsbCBhY3R1YWxseSByZXR1cm4gdmFsdWUgb2YgZXhwciwgZXZlbiBpZiBvZiB0eXBlIG9iamVjdFxuXHRcdH1cblx0XHRpZiAoYXR0ciA9PT0gQ0hFQ0tFRCkge1xuXHRcdFx0dXNlUHJvcCA9IHRydWU7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IHNvdXJjZVZhbHVlICYmIHNvdXJjZVZhbHVlICE9PSBcImZhbHNlXCI7XG5cdFx0XHQvLyBUaGUgc3RyaW5nIHZhbHVlIFwiZmFsc2VcIiBjYW4gb2NjdXIgd2l0aCBkYXRhLWxpbms9XCJjaGVja2Vke2F0dHI6ZXhwcn1cIiAtIGFzIGEgcmVzdWx0IG9mIGF0dHIsIGFuZCBoZW5jZSB1c2luZyBjb252ZXJ0VmFsKClcblx0XHRcdC8vIFdlIHdpbGwgc2V0IHRoZSBcImNoZWNrZWRcIiBwcm9wZXJ0eVxuXHRcdFx0Ly8gV2Ugd2lsbCBjb21wYXJlIHRoaXMgd2l0aCB0aGUgY3VycmVudCB2YWx1ZVxuXHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gUkFESU8pIHtcblx0XHRcdC8vIFRoaXMgaXMgYSBzcGVjaWFsIGJpbmRpbmcgYXR0cmlidXRlIGZvciByYWRpbyBidXR0b25zLCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZGVmYXVsdCAndG8nIGJpbmRpbmcuXG5cdFx0XHQvLyBUaGlzIGFsbG93cyBiaW5kaW5nIGJvdGggdG8gdmFsdWUgKGZvciBlYWNoIGlucHV0KSBhbmQgdG8gdGhlIGRlZmF1bHQgY2hlY2tlZCByYWRpbyBidXR0b24gKGZvciBlYWNoIGlucHV0IGluIG5hbWVkIGdyb3VwLFxuXHRcdFx0Ly8gZS5nLiBiaW5kaW5nIHRvIHBhcmVudCBkYXRhKS5cblx0XHRcdC8vIFBsYWNlIHZhbHVlIGJpbmRpbmcgZmlyc3Q6IDxpbnB1dCB0eXBlPVwicmFkaW9cIiBkYXRhLWxpbms9XCJ2YWx1ZXs6bmFtZX0gezojZ2V0KCdkYXRhJykuZGF0YS5jdXJyZW5jeTp9IFwiIC4uLi8+XG5cdFx0XHQvLyBvciAoYWxsb3dpbmcgYW55IG9yZGVyIGZvciB0aGUgYmluZGluZyBleHByZXNzaW9ucyk6XG5cdFx0XHQvLyA8aW5wdXQgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJ7ezpuYW1lfX1cIiBkYXRhLWxpbms9XCJ7OiNnZXQoJ2RhdGEnKS5kYXRhLmN1cnJlbmN5On0gdmFsdWVeezpuYW1lfVwiIC4uLi8+XG5cdFx0XHR1c2VQcm9wID0gdHJ1ZTtcblx0XHRcdGF0dHIgPSBDSEVDS0VEO1xuXHRcdFx0c291cmNlVmFsdWUgPSB0YXJnZXQudmFsdWUgPT09IChcIlwiICsgc291cmNlVmFsdWUpO1xuXHRcdFx0Ly8gSWYgdGhlIGRhdGEgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiB0aGlzIHJhZGlvIGJ1dHRvbiBpbnB1dCwgc2V0IHRoZSBjaGVja2VkIHByb3BlcnR5IHRvIHRydWVcblx0XHRcdC8vIE90aGVyd2lzZSBzZXQgdGhlIGNoZWNrZWQgcHJvcGVydHkgdG8gZmFsc2Vcblx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFwic2VsZWN0ZWRcIiB8fCBhdHRyID09PSBcImRpc2FibGVkXCIgfHwgYXR0ciA9PT0gXCJtdWx0aXBsZVwiIHx8IGF0dHIgPT09IFwicmVhZG9ubHlcIikge1xuXHRcdFx0c291cmNlVmFsdWUgPSAoc291cmNlVmFsdWUgJiYgc291cmNlVmFsdWUgIT09IFwiZmFsc2VcIikgPyBhdHRyIDogbnVsbDtcblx0XHRcdC8vIFVzZSBhdHRyLCBub3QgcHJvcCwgc28gd2hlbiB0aGUgb3B0aW9ucyAoZm9yIGV4YW1wbGUpIGFyZSBjaGFuZ2VkIGR5bmFtaWNhbGx5LCBidXQgaW5jbHVkZSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCB2YWx1ZSxcblx0XHRcdC8vIHRoZXkgd2lsbCBzdGlsbCBiZSBzZWxlY3RlZCBhZnRlciB0aGUgY2hhbmdlXG5cdFx0fSBlbHNlIGlmIChhdHRyID09PSBcInZhbHVlXCIgJiYgdGFyZ2V0Lm5vZGVOYW1lID09PSBcIlNFTEVDVFwiKSB7XG5cdFx0XHR0YXJnZXQuX2pzdlNlbCA9ICRpc0FycmF5KHNvdXJjZVZhbHVlKVxuXHRcdFx0XHQ/IHNvdXJjZVZhbHVlXG5cdFx0XHRcdDogXCJcIiArIHNvdXJjZVZhbHVlOyAvLyBJZiBub3QgYXJyYXksIGNvZXJjZSB0byBzdHJpbmdcblx0XHR9XG5cblx0XHRpZiAoc2V0dGVyID0gZm5TZXR0ZXJzW2F0dHJdKSB7XG5cdFx0XHRpZiAoYXR0ciA9PT0gSFRNTCkge1xuXHRcdFx0XHQvLyBTZXQgbGlua0N0eCBvbiB2aWV3LCBkeW5hbWljYWxseSwganVzdCBkdXJpbmcgdGhpcyBoYW5kbGVyIGNhbGxcblx0XHRcdFx0dmlldy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdFx0aWYgKHRhZyAmJiB0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0XHRub2Rlc1RvUmVtb3ZlID0gdGFnLm5vZGVzKHRydWUpO1xuXHRcdFx0XHRcdGlmICh0YWcuX2VsQ250KSB7XG5cdFx0XHRcdFx0XHRpZiAocHJldk5vZGUgJiYgcHJldk5vZGUgIT09IG5leHROb2RlKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgcHJldk5vZGUgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIERPTSwgc28gdHJhbnNmZXIgdGhlIHZpZXcgdG9rZW5zIG9uIHByZXZOb2RlIHRvIG5leHROb2RlIG9mIHRoaXMgJ3ZpZXdUb1JlZnJlc2gnXG5cdFx0XHRcdFx0XHRcdHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHRhcmdldCwgdGFnLl90Z0lkLCBcIl5cIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRva2VucyA9IHRhcmdldC5fZGYpIHsgLy8gVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSBpcyBubyBuZXh0Tm9kZSwgYW5kIHNvIHRoZSB0YXJnZXQuX2RmIG1heSBpbmNsdWRlIHRva2VucyByZWZlcmVuY2luZ1xuXHRcdFx0XHRcdFx0XHQvLyB2aWV3IGFuZCB0YWcgYmluZGluZ3MgY29udGFpbmVkIHdpdGhpbiB0aGUgb3BlbiBhbmQgY2xvc2UgdG9rZW5zIG9mIHRoZSB1cGRhdGVkIHRhZyBjb250cm9sLiBUaGV5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIChkaXNwb3NlZClcblx0XHRcdFx0XHRcdFx0aWQgPSB0YWcuX3RnSWQgKyBcIl5cIjtcblx0XHRcdFx0XHRcdFx0b3BlbkluZGV4ID0gdG9rZW5zLmluZGV4T2YoXCIjXCIgKyBpZCkgKyAxO1xuXHRcdFx0XHRcdFx0XHRjbG9zZUluZGV4ID0gdG9rZW5zLmluZGV4T2YoXCIvXCIgKyBpZCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9wZW5JbmRleCAmJiBjbG9zZUluZGV4ID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdG9wZW5JbmRleCArPSBpZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNsb3NlSW5kZXggPiBvcGVuSW5kZXgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldCwgdG9rZW5zLnNsaWNlKDAsIG9wZW5JbmRleCkgKyB0b2tlbnMuc2xpY2UoY2xvc2VJbmRleCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGlzcG9zZVRva2Vucyh0b2tlbnMuc2xpY2Uob3BlbkluZGV4LCBjbG9zZUluZGV4KSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwcmV2Tm9kZSA9IHByZXZOb2RlXG5cdFx0XHRcdFx0XHRcdD8gcHJldk5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdFx0XHRcdDogbmV4dE5vZGVcblx0XHRcdFx0XHRcdFx0XHQ/IG5leHROb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHRcdFx0XHRcdDogdGFyZ2V0Lmxhc3RDaGlsZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIEhUTUwgbm9kZXNcblx0XHRcdFx0XHQkKG5vZGVzVG9SZW1vdmUpLnJlbW92ZSgpOyAvLyBOb3RlIGlmICF0YWcuX2VsQ250IHJlbW92aW5nIHRoZSBub2Rlc1RvUmVtb3ZlIHdpbGwgcHJvY2VzcyBhbmQgZGlzcG9zZSB2aWV3IGFuZCB0YWcgYmluZGluZ3MgY29udGFpbmVkIHdpdGhpbiB0aGUgdXBkYXRlZCB0YWcgY29udHJvbFxuXG5cdFx0XHRcdFx0Ly8gSW5zZXJ0IGFuZCBsaW5rIG5ldyBjb250ZW50XG5cdFx0XHRcdFx0cHJvbWlzZSA9IHZpZXcubGluayh2aWV3LmRhdGEsIHRhcmdldCwgcHJldk5vZGUsIG5leHROb2RlLCBzb3VyY2VWYWx1ZSwgdGFnICYmIHt0YWc6IHRhZy5fdGdJZCwgbGF6eUxpbms6IHRhZy50YWdDdHgucHJvcHMubGF6eUxpbmt9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBkYXRhLWxpbmtlZCB2YWx1ZSB0YXJnZXRpbmcgaW5uZXJIVE1MOiBkYXRhLWxpbms9XCJodG1sezpleHByfVwiIG9yIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIlxuXHRcdFx0XHRcdHJlbmRlcnMgPSByZW5kZXJzICYmIHRhcmdldFZhbCAhPT0gc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0aWYgKHJlbmRlcnMpIHtcblx0XHRcdFx0XHRcdCR0YXJnZXQuZW1wdHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHJlbmRlcnMpIHtcblx0XHRcdFx0XHRcdHByb21pc2UgPSB2aWV3Lmxpbmsoc291cmNlLCB0YXJnZXQsIHByZXZOb2RlLCBuZXh0Tm9kZSwgc291cmNlVmFsdWUsIHRhZyAmJiB7dGFnOiB0YWcuX3RnSWR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gUmVtb3ZlIGR5bmFtaWNhbGx5IGFkZGVkIGxpbmtDdHggYW5kIGN0eCBmcm9tIHZpZXdcblx0XHRcdFx0dmlldy5saW5rQ3R4ID0gb2xkTGlua0N0eDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChjaGFuZ2UgPSBjaGFuZ2UgfHwgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0XHRcdGlmIChhdHRyID09PSBcInRleHRcIiAmJiB0YXJnZXQuY2hpbGRyZW4gJiYgIXRhcmdldC5jaGlsZHJlblswXSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBjb2RlIGlzIGZhc3RlciB0aGVuICR0YXJnZXQudGV4dCgpXG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0LnRleHRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0LnRleHRDb250ZW50ID0gc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQuaW5uZXJUZXh0ID0gc291cmNlVmFsdWUgPT09IG51bGwgPyBcIlwiIDogc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdCR0YXJnZXRbc2V0dGVyXShzb3VyY2VWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgoanN2U2VsID0gdGFyZ2V0UGFyZW50Ll9qc3ZTZWwpXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB2YWx1ZSBvZiA8b3B0aW9uPiBlbGVtZW50XG5cdFx0XHRcdFx0JiYgKGF0dHIgPT09IFwidmFsdWVcIiB8fCAhJHRhcmdldC5hdHRyKFwidmFsdWVcIikpKSB7IC8vIFNldHRpbmcgdmFsdWUgYXR0cmlidXRlLCBvciBzZXR0aW5nIHRleHRDb250ZW50IGlmIGF0dHJpYnV0ZSBpcyBudWxsXG5cdFx0XHRcdFx0Ly8gU2V0L3Vuc2VsZWN0IHNlbGVjdGlvbiBiYXNlZCBvbiB2YWx1ZSBzZXQgb24gcGFyZW50IDxzZWxlY3Q+LiBXb3JrcyBmb3IgbXVsdGlzZWxlY3QgdG9vXG5cdFx0XHRcdFx0dGFyZ2V0LnNlbGVjdGVkID0gJC5pbkFycmF5KFwiXCIgKyBzb3VyY2VWYWx1ZSwgJGlzQXJyYXkoanN2U2VsKSA/IGpzdlNlbCA6IFtqc3ZTZWxdKSA+IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjaGFuZ2UgPSBjaGFuZ2UgfHwgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0Ly8gU2V0dGluZyBhbiBhdHRyaWJ1dGUgdG8gdW5kZWZpbmVkIHNob3VsZCByZW1vdmUgdGhlIGF0dHJpYnV0ZVxuXHRcdFx0JHRhcmdldFt1c2VQcm9wID8gXCJwcm9wXCIgOiBcImF0dHJcIl0oYXR0ciwgc291cmNlVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhdXNlUHJvcCA/IG51bGwgOiBzb3VyY2VWYWx1ZSk7XG5cdFx0fVxuXHRcdGxpbmtDdHguX3ZhbCA9IHNvdXJjZVZhbHVlO1xuXHR9XG5cdHJldHVybiBwcm9taXNlIHx8IGNoYW5nZTtcbn1cblxuZnVuY3Rpb24gYXJyYXlDaGFuZ2VIYW5kbGVyKGV2LCBldmVudEFyZ3MpIHtcblx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdG9uQmVmb3JlQ2hhbmdlID0gc2VsZi5obHAob25CZWZvcmVDaGFuZ2VTdHIpLFxuXHRcdG9uQWZ0ZXJDaGFuZ2UgPSBzZWxmLmhscChvbkFmdGVyQ2hhbmdlU3RyKTtcblx0aWYgKCFvbkJlZm9yZUNoYW5nZSB8fCBvbkJlZm9yZUNoYW5nZS5jYWxsKHRoaXMsIGV2LCBldmVudEFyZ3MpICE9PSBmYWxzZSkge1xuXHRcdGlmIChldmVudEFyZ3MpIHtcblx0XHRcdC8vIFRoaXMgaXMgYW4gb2JzZXJ2YWJsZSBhY3Rpb24gKG5vdCBhIHRyaWdnZXIvaGFuZGxlciBjYWxsIGZyb20gcHVzaFZhbHVlcywgb3Igc2ltaWxhciwgZm9yIHdoaWNoIGV2ZW50QXJncyB3aWxsIGJlIG51bGwpXG5cdFx0XHR2YXIgYWN0aW9uID0gZXZlbnRBcmdzLmNoYW5nZSxcblx0XHRcdFx0aW5kZXggPSBldmVudEFyZ3MuaW5kZXgsXG5cdFx0XHRcdGl0ZW1zID0gZXZlbnRBcmdzLml0ZW1zO1xuXHRcdFx0c2VsZi5fLnNydCA9IGV2ZW50QXJncy5yZWZyZXNoOyAvLyB0cnVlIGlmIHBhcnQgb2YgYSAnc29ydCcgb24gcmVmcmVzaFxuXHRcdFx0c3dpdGNoIChhY3Rpb24pIHtcblx0XHRcdFx0Y2FzZSBcImluc2VydFwiOlxuXHRcdFx0XHRcdHNlbGYuYWRkVmlld3MoaW5kZXgsIGl0ZW1zKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInJlbW92ZVwiOlxuXHRcdFx0XHRcdHNlbGYucmVtb3ZlVmlld3MoaW5kZXgsIGl0ZW1zLmxlbmd0aCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJtb3ZlXCI6XG5cdFx0XHRcdFx0c2VsZi5yZW1vdmVWaWV3cyhldmVudEFyZ3Mub2xkSW5kZXgsIGl0ZW1zLmxlbmd0aCwgdW5kZWZpbmVkLCB0cnVlKTsgLy8gcmVtb3ZlXG5cdFx0XHRcdFx0c2VsZi5hZGRWaWV3cyhpbmRleCwgaXRlbXMpOyAvLyByZS1pbnNlcnRcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInJlZnJlc2hcIjpcblx0XHRcdFx0XHRzZWxmLl8uc3J0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdHNlbGYuZml4SW5kZXgoMCk7XG5cdFx0XHRcdFx0Ly8gT3RoZXIgY2FzZXM6IChlLmcudW5kZWZpbmVkLCBmb3Igc2V0UHJvcGVydHkgb24gb2JzZXJ2YWJsZSBvYmplY3QpIGV0Yy4gZG8gbm90aGluZ1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob25BZnRlckNoYW5nZSkge1xuXHRcdFx0b25BZnRlckNoYW5nZS5jYWxsKHRoaXMsIGV2LCBldmVudEFyZ3MpO1xuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVdGlsaXRpZXMgZm9yIGV2ZW50IGhhbmRsZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHNldEFycmF5Q2hhbmdlTGluayh2aWV3KSB7XG5cdC8vIEFkZC9yZW1vdmUgYXJyYXlDaGFuZ2UgaGFuZGxlciBvbiB2aWV3XG5cdHZhciBoYW5kbGVyLCBhcnJheUJpbmRpbmcsXG5cdFx0dHlwZSA9IHZpZXcudHlwZSwgLy8gdW5kZWZpbmVkIGlmIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdGRhdGEgPSB2aWV3LmRhdGEsXG5cdFx0Ym91bmQgPSB2aWV3Ll8uYm5kOyAvLyB0cnVlIGZvciB0b3AtbGV2ZWwgbGluaygpIG9yIGRhdGEtbGluaz1cIntmb3J9XCIsIG9yIHRoZSBmb3IgdGFnIGluc3RhbmNlIGZvciB7Xntmb3J9fSAob3IgZm9yIGFueSBjdXN0b20gdGFnIHRoYXQgaGFzIGFuIG9uQXJyYXlDaGFuZ2UgaGFuZGxlcilcblxuXHRpZiAoIXZpZXcuXy51c2VLZXkgJiYgYm91bmQpIHtcblx0XHQvLyBUaGlzIGlzIGFuIGFycmF5IHZpZXcuICh2aWV3Ll8udXNlS2V5IG5vdCBkZWZpbmVkID0+IGRhdGEgaXMgYXJyYXkpLCBhbmQgaXMgZGF0YS1ib3VuZCB0byBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHNcblxuXHRcdGlmIChhcnJheUJpbmRpbmcgPSB2aWV3Ll8uYm5kQXJyKSB7XG5cdFx0XHQvLyBGaXJzdCByZW1vdmUgdGhlIGN1cnJlbnQgaGFuZGxlciBpZiB0aGVyZSBpcyBvbmVcblx0XHRcdCQoW2FycmF5QmluZGluZ1sxXV0pLm9mZihhcnJheUNoYW5nZVN0ciwgYXJyYXlCaW5kaW5nWzBdKTtcblx0XHRcdHZpZXcuXy5ibmRBcnIgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmIChib3VuZCAhPT0gISFib3VuZCkge1xuXHRcdFx0Ly8gYm91bmQgaXMgbm90IGEgYm9vbGVhbiwgc28gaXQgaXMgdGhlIGRhdGEtbGlua2VkIHRhZyB0aGF0ICdvd25zJyB0aGlzIGFycmF5IGJpbmRpbmcgLSBlLmcuIHtee2Zvci4uLn19XG5cdFx0XHRpZiAodHlwZSkge1xuXHRcdFx0XHRib3VuZC5fLmFyclZ3c1t2aWV3Ll8uaWRdID0gdmlldztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBib3VuZC5fLmFyclZ3c1t2aWV3Ll8uaWRdOyAvLyBpZiB2aWV3LnR5cGUgaXMgdW5kZWZpbmVkLCB2aWV3IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHR5cGUgJiYgZGF0YSkge1xuXHRcdFx0Ly8gSWYgdGhpcyB2aWV3IGlzIG5vdCBiZWluZyByZW1vdmVkLCBidXQgdGhlIGRhdGEgYXJyYXkgaGFzIGJlZW4gcmVwbGFjZWQsIHRoZW4gYmluZCB0byB0aGUgbmV3IGRhdGEgYXJyYXlcblx0XHRcdGhhbmRsZXIgPSBmdW5jdGlvbihldikge1xuXHRcdFx0XHRpZiAoIShldi5kYXRhICYmIGV2LmRhdGEub2ZmKSkge1xuXHRcdFx0XHRcdC8vIFNraXAgaWYgISFldi5kYXRhLm9mZjogLSBhIGhhbmRsZXIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgKG1heWJlIHdhcyBvbiBoYW5kbGVyIGNvbGxlY3Rpb24gYXQgY2FsbCB0aW1lIC0gdGhlbiByZW1vdmVkIGJ5IGFub3RoZXIgaGFuZGxlcilcblx0XHRcdFx0XHQvLyBJZiB2aWV3LnR5cGUgaXMgdW5kZWZpbmVkLCBkbyBub3RoaW5nLiAoQ29ycmVzcG9uZHMgdG8gY2FzZSB3aGVyZSB0aGVyZSBpcyBhbm90aGVyIGhhbmRsZXIgb24gdGhlIHNhbWUgZGF0YSB3aG9zZVxuXHRcdFx0XHRcdC8vIGVmZmVjdCB3YXMgdG8gcmVtb3ZlIHRoaXMgdmlldywgYW5kIHdoaWNoIGhhcHBlbmVkIHRvIHByZWNlZGUgdGhpcyBldmVudCBpbiB0aGUgdHJpZ2dlciBzZXF1ZW5jZS4gU28gYWx0aG91Z2ggdGhpc1xuXHRcdFx0XHRcdC8vIGV2ZW50IGhhcyBiZWVuIHJlbW92ZWQgbm93LCBpdCBpcyBzdGlsbCBjYWxsZWQgc2luY2UgYWxyZWFkeSBvbiB0aGUgdHJpZ2dlciBzZXF1ZW5jZSlcblx0XHRcdFx0XHRhcnJheUNoYW5nZUhhbmRsZXIuYXBwbHkodmlldywgYXJndW1lbnRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdCQoW2RhdGFdKS5vbihhcnJheUNoYW5nZVN0ciwgaGFuZGxlcik7XG5cdFx0XHR2aWV3Ll8uYm5kQXJyID0gW2hhbmRsZXIsIGRhdGFdO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXR0cihlbGVtLCB0bywgbGlua0dldFZhbCkge1xuXHQvLyB0bzogdHJ1ZSAtIGRlZmF1bHQgYXR0cmlidXRlIGZvciBzZXR0aW5nIGRhdGEgdmFsdWUgb24gSFRNTCBlbGVtZW50OyBmYWxzZTogZGVmYXVsdCBhdHRyaWJ1dGUgZm9yIGdldHRpbmcgdmFsdWUgZnJvbSBIVE1MIGVsZW1lbnRcblx0Ly8gTWVyZ2UgaW4gdGhlIGRlZmF1bHQgYXR0cmlidXRlIGJpbmRpbmdzIGZvciB0aGlzIHRhcmdldCBlbGVtZW50XG5cdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxcblx0XHRhdHRyID1cblx0XHRcdCRzdWJTZXR0aW5nc0FkdmFuY2VkLl9mZVtub2RlTmFtZV0gLy8gZ2V0IGZvcm0gZWxlbWVudCBiaW5kaW5nIHNldHRpbmdzIGZvciBpbnB1dCB0ZXh0YXJlYSBzZWxlY3Qgb3Igb3B0Z3JvdXBcblx0XHRcdHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSBUUlVFICYmIHt0bzogSFRNTCwgZnJvbTogSFRNTH07IC8vIE9yIGlmIGNvbnRlbnRFZGl0YWJsZSBzZXQgdG8gXCJ0cnVlXCIgc2V0IGF0dHIgdG8gXCJodG1sXCJcblx0cmV0dXJuIGF0dHJcblx0XHQ/ICh0b1xuXHRcdFx0PyAoKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBSQURJTykgLy8gRm9yIHJhZGlvIGJ1dHRvbnMsIGJpbmQgZnJvbSB2YWx1ZSwgYnV0IGJpbmQgdG8gJ3JhZGlvJyAtIHNwZWNpYWwgdmFsdWUuXG5cdFx0XHRcdD8gUkFESU9cblx0XHRcdFx0OiBhdHRyLnRvKVxuXHRcdFx0OiBhdHRyLmZyb20pXG5cdFx0OiB0b1xuXHRcdFx0PyBsaW5rR2V0VmFsID8gXCJ0ZXh0XCIgOiBIVE1MIC8vIERlZmF1bHQgaW5uZXJUZXh0IGZvciBkYXRhLWxpbms9XCJhLmIuY1wiIG9yIGRhdGEtbGluaz1cIns6YS5iLmN9XCIgKHdpdGggb3Igd2l0aG91dCBjb252ZXJ0ZXJzKS0gb3RoZXJ3aXNlIGlubmVySFRNTFxuXHRcdFx0OiBcIlwiOyAvLyBEZWZhdWx0IGlzIG5vdCB0byBiaW5kIGZyb21cbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlbmRlcmluZyBhbmQgRE9NIGluc2VydGlvblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVuZGVyQW5kTGluayh2aWV3LCBpbmRleCwgdG1wbCwgdmlld3MsIGRhdGEsIGNvbnRleHQsIHJlZnJlc2gpIHtcblx0dmFyIGh0bWwsIGxpbmtUb05vZGUsIHByZXZWaWV3LCBub2Rlc1RvUmVtb3ZlLCBiaW5kSWQsXG5cdFx0cGFyZW50Tm9kZSA9IHZpZXcucGFyZW50RWxlbSxcblx0XHRwcmV2Tm9kZSA9IHZpZXcuX3Bydixcblx0XHRuZXh0Tm9kZSA9IHZpZXcuX254dCxcblx0XHRlbENudCA9IHZpZXcuX2VsQ250O1xuXG5cdGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5wYXJlbnROb2RlICE9PSBwYXJlbnROb2RlKSB7XG5cdFx0ZXJyb3IoXCJNaXNzaW5nIHBhcmVudE5vZGVcIik7XG5cdFx0Ly8gQWJhbmRvbiwgc2luY2Ugbm9kZSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIG9yIHdyYXBwZXIgZWxlbWVudCBoYXMgYmVlbiBpbnNlcnRlZCBiZXR3ZWVuIHByZXZOb2RlIGFuZCBwYXJlbnROb2RlXG5cdH1cblxuXHRpZiAocmVmcmVzaCkge1xuXHRcdG5vZGVzVG9SZW1vdmUgPSB2aWV3Lm5vZGVzKCk7XG5cdFx0aWYgKGVsQ250ICYmIHByZXZOb2RlICYmIHByZXZOb2RlICE9PSBuZXh0Tm9kZSkge1xuXHRcdFx0Ly8gVGhpcyBwcmV2Tm9kZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB0cmFuc2ZlciB0aGUgdmlldyB0b2tlbnMgb24gcHJldk5vZGUgdG8gbmV4dE5vZGUgb2YgdGhpcyAndmlld1RvUmVmcmVzaCdcblx0XHRcdHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHBhcmVudE5vZGUsIHZpZXcuXy5pZCwgXCJfXCIsIHRydWUpO1xuXHRcdH1cblx0XHQvLyBSZW1vdmUgY2hpbGQgdmlld3Ncblx0XHR2aWV3LnJlbW92ZVZpZXdzKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRsaW5rVG9Ob2RlID0gbmV4dE5vZGU7XG5cblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVcblx0XHRcdFx0PyBwcmV2Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0OiBuZXh0Tm9kZVxuXHRcdFx0XHRcdD8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdFx0OiBwYXJlbnROb2RlLmxhc3RDaGlsZDtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgSFRNTCBub2Rlc1xuXHRcdCQobm9kZXNUb1JlbW92ZSkucmVtb3ZlKCk7XG5cblx0XHRmb3IgKGJpbmRJZCBpbiB2aWV3Ll8uYm5kcykge1xuXHRcdFx0Ly8gVGhlIHZpZXcgYmluZGluZ3MgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgYWJvdmUgaW46ICQobm9kZXNUb1JlbW92ZSkucmVtb3ZlKCk7XG5cdFx0XHQvLyBJZiBub3QsIHJlbW92ZSB0aGVtIGhlcmU6XG5cdFx0XHRyZW1vdmVWaWV3QmluZGluZyhiaW5kSWQpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBhZGRWaWV3cy4gT25seSBjYWxsZWQgaWYgdmlldyBpcyBvZiB0eXBlIFwiYXJyYXlcIlxuXHRcdGlmIChpbmRleCkge1xuXHRcdFx0Ly8gaW5kZXggaXMgYSBudW1iZXIsIHNvIGluZGV4ZWQgdmlldyBpbiB2aWV3IGFycmF5XG5cdFx0XHRwcmV2VmlldyA9IHZpZXdzW2luZGV4IC0gMV07XG5cdFx0XHRpZiAoIXByZXZWaWV3KSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTsgLy8gSWYgc3VidmlldyBmb3IgcHJvdmlkZWQgaW5kZXggZG9lcyBub3QgZXhpc3QsIGRvIG5vdGhpbmdcblx0XHRcdH1cblx0XHRcdHByZXZOb2RlID0gcHJldlZpZXcuX254dDtcblx0XHR9XG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHRsaW5rVG9Ob2RlID0gcHJldk5vZGU7XG5cdFx0XHRwcmV2Tm9kZSA9IGxpbmtUb05vZGVcblx0XHRcdFx0PyBsaW5rVG9Ob2RlLnByZXZpb3VzU2libGluZyAgICAgICAgIC8vIFRoZXJlIGlzIGEgbGlua1RvTm9kZSwgc28gaW5zZXJ0IGFmdGVyIHByZXZpb3VzU2libGluZywgb3IgYXQgdGhlIGJlZ2lubmluZ1xuXHRcdFx0XHQ6IHBhcmVudE5vZGUubGFzdENoaWxkOyAgICAgICAgICAgICAgLy8gSWYgbm8gcHJldlZpZXcgYW5kIG5vIHByZXZOb2RlLCBpbmRleCBpcyAwIGFuZCB0aGUgY29udGFpbmVyIGlzIGVtcHR5LFxuXHRcdFx0XHQvLyBzbyBwcmV2Tm9kZSA9IGxpbmtUb05vZGUgPSBudWxsLiBCdXQgaWYgcHJldlZpZXcuX254dCBpcyBudWxsIHRoZW4gd2Ugc2V0IHByZXZOb2RlIHRvIHBhcmVudE5vZGUubGFzdENoaWxkXG5cdFx0XHRcdC8vICh3aGljaCBtdXN0IGJlIGJlZm9yZSB0aGUgcHJldlZpZXcpIHNvIHdlIGluc2VydCBhZnRlciB0aGF0IG5vZGUgLSBhbmQgb25seSBsaW5rIHRoZSBpbnNlcnRlZCBub2Rlc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsaW5rVG9Ob2RlID0gcHJldk5vZGUubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdGh0bWwgPSB0bXBsLnJlbmRlcihkYXRhLCBjb250ZXh0LCB2aWV3Ll8udXNlS2V5ICYmIHJlZnJlc2gsIHZpZXcsIHJlZnJlc2ggfHwgaW5kZXgsIHRydWUpO1xuXHQvLyBQYXNzIGluIHZpZXcuXy51c2VLZXkgYXMgdGVzdCBmb3Igbm9JdGVyYXRpb24gKHdoaWNoIGNvcnJlc3BvbmRzIHRvIHdoZW4gc2VsZi5fLnVzZUtleSA+IDAgYW5kIHNlbGYuZGF0YSBpcyBhbiBhcnJheSlcblxuXHQvLyBMaW5rIHRoZSBuZXcgSFRNTCBub2RlcyB0byB0aGUgZGF0YVxuXHR2aWV3LmxpbmsoZGF0YSwgcGFyZW50Tm9kZSwgcHJldk5vZGUsIGxpbmtUb05vZGUsIGh0bWwsIHByZXZWaWV3KTtcbi8vfSwgMCk7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09XG4vLyBhZGRCaW5kaW5nTWFya2Vyc1xuLy89PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gYWRkQmluZGluZ01hcmtlcnModmFsdWUsIHZpZXcsIHRhZykge1xuXHQvLyBJbnNlcnQgYmluZGluZyBtYXJrZXJzIGludG8gdGhlIHJlbmRlcmVkIHRlbXBsYXRlIG91dHB1dCwgd2hpY2ggd2lsbCBnZXQgY29udmVydGVkIHRvIGFwcHJvcHJpYXRlXG5cdC8vIGRhdGEtanN2IGF0dHJpYnV0ZXMgKGVsZW1lbnQtb25seSBjb250ZW50KSBvciBzY3JpcHQgbWFya2VyIG5vZGVzIChwaHJhc2luZyBvciBmbG93IGNvbnRlbnQpLCBpbiBjb252ZXJ0TWFya2Vycyxcblx0Ly8gd2l0aGluIHZpZXcubGluaywgcHJpb3IgdG8gaW5zZXJ0aW5nIGludG8gdGhlIERPTS4gTGlua2luZyB3aWxsIHRoZW4gYmluZCBiYXNlZCBvbiB0aGVzZSBtYXJrZXJzIGluIHRoZSBET00uXG5cdC8vIEFkZGVkIHZpZXcgbWFya2VyczogI21fLi4uVklFVy4uLi9tX1xuXHQvLyBBZGRlZCB0YWcgbWFya2VyczogI21eLi4uVEFHLi4uLi9tXlxuXHR2YXIgaWQsIGVuZDtcblx0aWYgKHRhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBiaW5kaW5nIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRlbmQgPSBcIl5gXCI7XG5cdFx0YWRkTGlua01ldGhvZHModGFnLCB0cnVlKTsgLy8gVGhpcyBpcyB7Xns+Li4ufX0gb3Ige157dGFnIC4uLn19LCB7e2N2dDouLi59IG9yIHteezouLi59fSwgYW5kIHRhZyB3YXMgZGVmaW5lZCBpbiBjb252ZXJ0VmFsIG9yIHJlbmRlclRhZ1xuXHRcdGlkID0gdGFnLl90Z0lkO1xuXHRcdGlmICghaWQpIHtcblx0XHRcdGJpbmRpbmdTdG9yZVtpZCA9IGJpbmRpbmdLZXkrK10gPSB0YWc7IC8vIFN0b3JlIHRoZSB0YWcgdGVtcG9yYXJpbHksIHJlYWR5IGZvciBkYXRhYmluZGluZy5cblx0XHRcdC8vIER1cmluZyBsaW5raW5nLCBpbiBhZGREYXRhQmluZGluZywgdGhlIHRhZyB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBsaW5rQ3R4LFxuXHRcdFx0Ly8gYW5kIHRoZW4gaW4gb2JzZXJ2ZUFuZEJpbmQsIGJpbmRpbmdTdG9yZVtiaW5kSWRdIHdpbGwgYmUgcmVwbGFjZWQgYnkgYmluZGluZyBpbmZvLlxuXHRcdFx0dGFnLl90Z0lkID0gXCJcIiArIGlkO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBUaGlzIGlzIGEgYmluZGluZyBtYXJrZXIgZm9yIGEgdmlld1xuXHRcdC8vIEFkZCB0aGUgdmlldyB0byB0aGUgc3RvcmUgb2YgY3VycmVudCBsaW5rZWQgdmlld3Ncblx0XHRlbmQgPSBcIl9gXCI7XG5cdFx0YWRkTGlua01ldGhvZHModmlld1N0b3JlW2lkID0gdmlldy5fLmlkXSA9IHZpZXcpO1xuXHR9XG5cdC8vIEV4YW1wbGU6IFwiIzIzXlRoZVZhbHVlLzIzXlwiXG5cdHJldHVybiBcIiNcIiArIGlkICsgZW5kXG5cdFx0KyAodmFsdWUgIT0gdW5kZWZpbmVkID8gdmFsdWUgOiBcIlwiKSAvLyBGb3Ige157Om5hbWV9fSB0aGlzIGdpdmVzIHRoZSBlcXVpdmFsZW50IHNlbWFudGljcyB0byBjb21waWxlZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vICh2PWRhdGEubmFtZSkhPW51bGw/djpcIlwiOyB1c2VkIGluIHt7Om5hbWV9fSBvciBkYXRhLWxpbms9XCJuYW1lXCJcblx0XHQrIFwiL1wiICsgaWQgKyBlbmQ7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEYXRhLWxpbmtpbmcgYW5kIGRhdGEgYmluZGluZ1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8tLS0tLS0tLS0tLS0tLS1cbi8vIG9ic2VydmVBbmRCaW5kXG4vLy0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBvYnNlcnZlQW5kQmluZChsaW5rQ3R4LCBzb3VyY2UsIHRhcmdldCkgeyAvL1RPRE8/IGxpbmtGbkFyZ3MpIHs7XG5cdHZhciBiaW5kaW5nLCBsLCBsaW5rZWRFbGVtLCBleHByRm5EZXBzLCBleHByT2IsXG5cdFx0dGFnID0gbGlua0N0eC50YWcsXG5cdFx0Y3Z0QmsgPSBsaW5rQ3R4LmNvbnZlcnRCYWNrLFxuXHRcdGRlcGVuZHMgPSBbXSxcblx0XHRiaW5kSWQgPSBsaW5rQ3R4Ll9ibmRJZCB8fCBcIlwiICsgYmluZGluZ0tleSsrLFxuXHRcdGhhbmRsZXIgPSBsaW5rQ3R4Ll9oZGw7XG5cblx0bGlua0N0eC5fYm5kSWQgPSB1bmRlZmluZWQ7XG5cblx0aWYgKHRhZykge1xuXHRcdC8vIFVzZSB0aGUgJ2RlcGVuZHMnIHBhdGhzIHNldCBvbiBsaW5rQ3R4LnRhZyAtIHdoaWNoIG1heSBoYXZlIGJlZW4gc2V0IG9uIGRlY2xhcmF0aW9uXG5cdFx0Ly8gb3IgaW4gZXZlbnRzOiBpbml0LCByZW5kZXIsIG9uQWZ0ZXJMaW5rIGV0Yy5cblx0XHRkZXBlbmRzID0gdGFnLmRlcGVuZHMgfHwgZGVwZW5kcztcblx0XHRkZXBlbmRzID0gJGlzRnVuY3Rpb24oZGVwZW5kcykgPyB0YWcuZGVwZW5kcyh0YWcpIDogZGVwZW5kcztcblx0XHRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW07XG5cdH1cblx0aWYgKCFsaW5rQ3R4Ll9kZXBlbmRzIHx8IChcIlwiICsgbGlua0N0eC5fZGVwZW5kcyAhPT0gXCJcIiArIGRlcGVuZHMpKSB7XG5cdFx0Ly8gT25seSBiaW5kIHRoZSBmaXJzdCB0aW1lLCBvciBpZiB0aGUgbmV3IGRlcGVuZHMgKHRvU3RyaW5nKSBoYXMgY2hhbmdlZCBmcm9tIHdoZW4gbGFzdCBib3VuZFxuXHRcdGlmIChsaW5rQ3R4Ll9kZXBlbmRzKSB7XG5cdFx0XHQvLyBVbm9ic2VydmUgcHJldmlvdXMgYmluZGluZ1xuXHRcdFx0JG9ic2VydmFibGUuX2FwcGx5KGZhbHNlLCBbc291cmNlXSwgbGlua0N0eC5fZGVwZW5kcywgaGFuZGxlciwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0ZXhwckZuRGVwcyA9IGxpbmtDdHguZm4uZGVwcy5zbGljZSgpOyAvLyBNYWtlIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBwYXRocyBmb3IgdGhlIGNvbXBpbGVkIGxpbmtDdHggZXhwcmVzc2lvbiAtIHRvIHBhc3MgdG8gb2JzZXJ2ZSgpLiBJbiBnZXRJbm5lckNiKCksXG5cdFx0Ly8gKGFuZCB3aGVuZXZlciB0aGUgb2JqZWN0IGlzIHVwZGF0ZWQsIGluIGlubmVyQ2IpLCB3ZSB3aWxsIHNldCBleHByT2Iub2IgdG8gdGhlIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IHRoYXQgY29tcHV0ZWQgZXhwcmVzc2lvbiwgZm9yIHRoaXMgdmlldy5cblx0XHRsID0gZXhwckZuRGVwcy5sZW5ndGg7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0ZXhwck9iID0gZXhwckZuRGVwc1tsXTtcblx0XHRcdGlmIChleHByT2IuX2pzdikge1xuXHRcdFx0XHQvLyBUaGlzIHBhdGggaXMgYW4gJ2V4cHJPYicsIGNvcnJlc3BvbmRpbmcgdG8gYSBjb21wdXRlZCwgcmV0dXJuaW5nIGFuIG9iamVjdC4gV2UgcmVwbGFjZSB0aGUgZXhwck9iIGJ5XG5cdFx0XHRcdC8vIGEgdmlldy1iaW5kaW5nLXNwZWNpZmljIGV4cHJPYiBpbnN0YW5jZS4gVGhlIGN1cnJlbnQgb2JqZWN0IHdpbGwgYmUgc3RvcmVkIGFzIGV4cHJPYi5vYi5cblx0XHRcdFx0ZXhwckZuRGVwc1tsXSA9ICRleHRlbmQoe30sIGV4cHJPYik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YmluZGluZyA9ICRvYnNlcnZhYmxlLl9hcHBseShcblx0XHRcdGZhbHNlLFxuXHRcdFx0W3NvdXJjZV0sXG5cdFx0XHRleHByRm5EZXBzLCAvLyBmbGF0dGVuIHRoZSBwYXRocyAtIHRvIGdhdGhlciBhbGwgdGhlIGRlcGVuZGVuY2llcyBhY3Jvc3MgYXJncyBhbmQgYm91bmQgcGFyYW1zXG5cdFx0XHRkZXBlbmRzLFxuXHRcdFx0aGFuZGxlcixcblx0XHRcdGxpbmtDdHguX2N0eENiKTtcblx0XHQvLyBUaGUgYmluZGluZyByZXR1cm5lZCBieSAkb2JzZXJ2ZSBoYXMgYSBibmQgYXJyYXkgd2l0aCB0aGUgc291cmNlIG9iamVjdHMgb2YgdGhlIGluZGl2aWR1YWwgYmluZGluZ3MuXG5cblx0XHRiaW5kaW5nLmVsZW0gPSB0YXJnZXQ7IC8vIFRoZSB0YXJnZXQgb2YgYWxsIHRoZSBpbmRpdmlkdWFsIGJpbmRpbmdzXG5cdFx0YmluZGluZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRiaW5kaW5nLl90Z0lkID0gYmluZElkO1xuXG5cdFx0Ly8gQWRkIHRvIHRoZSBfanN2Qm5kIG9uIHRoZSB0YXJnZXQgdGhlIHZpZXcgaWQgYW5kIGJpbmRpbmcgaWQgLSBmb3IgdW5iaW5kaW5nIHdoZW4gdGhlIHRhcmdldCBlbGVtZW50IGlzIHJlbW92ZWRcblx0XHR0YXJnZXQuX2pzdkJuZCA9IHRhcmdldC5fanN2Qm5kIHx8IFwiXCI7XG5cdFx0dGFyZ2V0Ll9qc3ZCbmQgKz0gXCImXCIgKyBiaW5kSWQ7XG5cdFx0bGlua0N0eC5fZGVwZW5kcyA9IGRlcGVuZHM7XG5cdFx0Ly8gU3RvcmUgdGhlIGJpbmRpbmcga2V5IG9uIHRoZSB2aWV3LCBmb3IgZGlzcG9zYWwgd2hlbiB0aGUgdmlldyBpcyByZW1vdmVkXG5cdFx0bGlua0N0eC52aWV3Ll8uYm5kc1tiaW5kSWRdID0gYmluZElkO1xuXHRcdC8vIFN0b3JlIHRoZSBiaW5kaW5nLlxuXHRcdGJpbmRpbmdTdG9yZVtiaW5kSWRdID0gYmluZGluZzsgLy8gTm90ZTogSWYgdGhpcyBjb3JyZXNwb25kcyB0byBhIGRhdGEtbGlua2VkIHRhZywgd2UgYXJlIHJlcGxhY2luZyB0aGVcblx0XHQvLyB0ZW1wb3JhcmlseSBzdG9yZWQgdGFnIGJ5IHRoZSBzdG9yZWQgYmluZGluZy4gVGhlIHRhZyB3aWxsIG5vdyBiZSBhdCBiaW5kaW5nLmxpbmtDdHgudGFnXG5cblx0XHRpZiAobGlua2VkRWxlbSkge1xuXHRcdFx0bCA9IGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRsaW5rZWRFbGVtW2xdLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCBsaW5rZWRFbGVtW2xdKTtcblx0XHRcdFx0bGlua2VkRWxlbVtsXS5fanN2Qm5kID0gXCImXCIgKyBiaW5kaW5nLl90Z0lkICsgXCIrXCI7IC8vIEFkZCBhIFwiK1wiIGZvciBjbG9uZWQgYmluZGluZyAtIHNvIHJlbW92aW5nXG5cdFx0XHRcdC8vIGVsZW1zIHdpdGggY2xvbmVkIGJpbmRpbmdzIHdpbGwgbm90IHJlbW92ZSB0aGUgJ3BhcmVudCcgYmluZGluZyBmcm9tIHRoZSBiaW5kaW5nU3RvcmUuXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjdnRCayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCB0YXJnZXQsIGN2dEJrKTtcblx0XHR9XG5cblx0XHRpZiAodGFnKSB7XG5cdFx0XHRpZiAoIXRhZy5mbG93ICYmICF0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0dGFyZ2V0LnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCAodGFyZ2V0LmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKXx8XCJcIikgKyBcIiNcIiArIGJpbmRJZCArIFwiXi9cIiArIGJpbmRJZCArIFwiXlwiKTtcblx0XHRcdFx0dGFnLl90Z0lkID0gXCJcIiArIGJpbmRJZDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLy8tLS0tLS0tXG4vLyAkLmxpbmtcbi8vLS0tLS0tLVxuXG5mdW5jdGlvbiB0bXBsTGluayh0bywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRyZXR1cm4gJGxpbmsodGhpcywgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpO1xufVxuXG5mdW5jdGlvbiAkbGluayh0bXBsT3JMaW5rRXhwciwgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0Ly8gV2hlbiBsaW5raW5nIGZyb20gYSB0ZW1wbGF0ZSwgcHJldk5vZGUgYW5kIG5leHROb2RlIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWRcblx0aWYgKGNvbnRleHQgPT09IHRydWUpIHtcblx0XHRub0l0ZXJhdGlvbiA9IGNvbnRleHQ7IC8vIHBhc3NpbmcgYm9vbGVhbiBhcyB0aGlyZCBwYXJhbSAtIG5vSXRlcmF0aW9uXG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICh0eXBlb2YgY29udGV4dCAhPT0gXCJvYmplY3RcIikge1xuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7IC8vIGNvbnRleHQgbXVzdCBiZSBhIGJvb2xlYW4gKG5vSXRlcmF0aW9uKSBvciBhIHBsYWluIG9iamVjdFxuXHR9IGVsc2Uge1xuXHRcdGNvbnRleHQgPSAkZXh0ZW5kKHt9LCBjb250ZXh0KTtcblx0fVxuXHRpZiAodG1wbE9yTGlua0V4cHIgJiYgdG8pIHtcblx0XHR0byA9IHRvLmpxdWVyeSA/IHRvIDogJCh0byk7IC8vIHRvIGlzIGEganF1ZXJ5IG9iamVjdCBvciBhbiBlbGVtZW50IG9yIHNlbGVjdG9yXG5cblx0XHRpZiAoIWFjdGl2ZUJvZHkpIHtcblx0XHRcdGFjdGl2ZUJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHRcdFx0JChhY3RpdmVCb2R5KVxuXHRcdFx0XHQub24oZWxlbWVudENoYW5nZVN0ciwgZWxlbUNoYW5nZUhhbmRsZXIpXG5cdFx0XHRcdC5vbignYmx1cicsICdbY29udGVudGVkaXRhYmxlXScsIGVsZW1DaGFuZ2VIYW5kbGVyKTtcblx0XHR9XG5cblx0XHR2YXIgaSwgaywgaHRtbCwgdndJbmZvcywgdmlldywgcGxhY2Vob2xkZXJQYXJlbnQsIHRhcmdldEVsLCByZWZyZXNoLCB0b3BMZXZlbENhbGwsXG5cdFx0XHRvblJlbmRlciA9IGFkZEJpbmRpbmdNYXJrZXJzLFxuXHRcdFx0cmVwbGFjZU1vZGUgPSBjb250ZXh0ICYmIGNvbnRleHQudGFyZ2V0ID09PSBcInJlcGxhY2VcIixcblx0XHRcdGwgPSB0by5sZW5ndGg7XG5cblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHR0YXJnZXRFbCA9IHRvW2xdO1xuXG5cdFx0XHRwYXJlbnRWaWV3ID0gcGFyZW50VmlldyB8fCAkdmlldyh0YXJnZXRFbCk7XG5cblx0XHRcdGlmICh0b3BMZXZlbENhbGwgPSBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdHRvcFZpZXcuZGF0YSA9ICh0b3BWaWV3LmN0eCA9IGNvbnRleHQgfHwge30pLnJvb3QgPSBmcm9tO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFwiXCIgKyB0bXBsT3JMaW5rRXhwciA9PT0gdG1wbE9yTGlua0V4cHIpIHtcblx0XHRcdFx0Ly8gdG1wbE9yTGlua0V4cHIgaXMgYSBzdHJpbmc6IHRyZWF0IGFzIGRhdGEtbGluayBleHByZXNzaW9uLlxuXHRcdFx0XHRhZGREYXRhQmluZGluZyh0bXBsT3JMaW5rRXhwciwgdGFyZ2V0RWwsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdHJ1ZSwgZnJvbSwgY29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodG1wbE9yTGlua0V4cHIubWFya3VwICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKClcblx0XHRcdFx0XHRpZiAocmVwbGFjZU1vZGUpIHtcblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyUGFyZW50ID0gdGFyZ2V0RWwucGFyZW50Tm9kZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRodG1sID0gdG1wbE9yTGlua0V4cHIucmVuZGVyKGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCB1bmRlZmluZWQsIG9uUmVuZGVyKTtcblx0XHRcdFx0XHQvLyBUT0RPIENvbnNpZGVyIGZpbmRpbmcgYSB3YXkgdG8gYmluZCBkYXRhIChsaW5rKSB3aXRoaW4gdGVtcGxhdGUgd2l0aG91dCBodG1sIGJlaW5nIGRpZmZlcmVudCBmb3IgZWFjaCB2aWV3LCB0aGUgSFRNTCBjYW5cblx0XHRcdFx0XHQvLyBiZSBldmFsdWF0ZWQgb25jZSBvdXRzaWRlIHRoZSB3aGlsZSAobC0tKSwgYW5kIHB1c2hlZCBpbnRvIGEgZG9jdW1lbnQgZnJhZ21lbnQsIHRoZW4gY2xvbmVkIGFuZCBpbnNlcnRlZCBhdCBlYWNoIHRhcmdldC5cblxuXHRcdFx0XHRcdGlmIChwbGFjZWhvbGRlclBhcmVudCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyB0YXJnZXQ9XCJyZXBsYWNlXCIgbW9kZVxuXHRcdFx0XHRcdFx0cHJldk5vZGUgPSB0YXJnZXRFbC5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHRcdFx0XHRuZXh0Tm9kZSA9IHRhcmdldEVsLm5leHRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0JC5jbGVhbkRhdGEoW3RhcmdldEVsXSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRwbGFjZWhvbGRlclBhcmVudC5yZW1vdmVDaGlsZCh0YXJnZXRFbCk7XG5cblx0XHRcdFx0XHRcdHRhcmdldEVsID0gcGxhY2Vob2xkZXJQYXJlbnQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHByZXZOb2RlID0gbmV4dE5vZGUgPSB1bmRlZmluZWQ7IC8vIFdoZW4gbGlua2luZyBmcm9tIGEgdGVtcGxhdGUsIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkXG5cdFx0XHRcdFx0XHQkKHRhcmdldEVsKS5lbXB0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0bXBsT3JMaW5rRXhwciA9PT0gdHJ1ZSAmJiBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdFx0Ly8gJC5saW5rKHRydWUsIHNlbGVjdG9yLCBkYXRhLCBjdHgpIC0gd2hlcmUgc2VsZWN0b3IgcG9pbnRzIHRvIGVsZW0gaW4gdG9wLWxldmVsIGNvbnRlbnQuIChJZiBub3QgdG9wLWxldmVsIGNvbnRlbnQsIG5vLW9wKVxuXHRcdFx0XHRcdHJlZnJlc2ggPSB7bG5rOiAxfTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG4vLyBUT0RPIENvbnNpZGVyIGRlZmVycmVkIGxpbmtpbmcgQVBJIGZlYXR1cmUgb24gcGVyLXRlbXBsYXRlIGJhc2lzIC0ge0B7IGluc3RlYWQgb2Yge157IHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIHJlbmRlcmVkIGNvbnRlbnRcbi8vIGJlZm9yZSB0aGF0IGNvbnRlbnQgaXMgbGlua2VkLCB3aXRoIGJldHRlciBwZXJjZWl2ZWQgcGVyZi4gSGF2ZSB2aWV3LmxpbmsgcmV0dXJuIGEgZGVmZXJyZWQsIGFuZCBwYXNzIHRoYXQgdG8gb25BZnRlckxpbmsuLi5cbi8vIG9yIHNvbWV0aGluZyBhbG9uZyB0aG9zZSBsaW5lcy5cbi8vIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0aWYgKHRhcmdldEVsLl9kZiAmJiAhbmV4dE5vZGUpIHtcblx0XHRcdFx0XHQvLyBXZSBhcmUgaW5zZXJ0aW5nIG5ldyBjb250ZW50IGFuZCB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzIHNvbWUgZGVmZXJyZWQgYmluZGluZyBhbm5vdGF0aW9ucyxhbmQgdGhlcmUgaXMgbm8gbmV4dE5vZGUuXG5cdFx0XHRcdFx0Ly8gVGhvc2Ugdmlld3MgbWF5IGJlIHN0YWxlIHZpZXdzICh0aGF0IHdpbGwgYmUgcmVjcmVhdGVkIGluIHRoaXMgbmV3IGxpbmtpbmcgYWN0aW9uKSBzbyB3ZSB3aWxsIGZpcnN0IHJlbW92ZSB0aGVtXG5cdFx0XHRcdFx0Ly8gKGlmIG5vdCBhbHJlYWR5IHJlbW92ZWQpLlxuXHRcdFx0XHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3ModGFyZ2V0RWwuX2RmLCB0cnVlLCByT3BlblZpZXdNYXJrZXJzKTtcblxuXHRcdFx0XHRcdGZvciAoaSA9IDAsIGsgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGs7IGkrKykge1xuXHRcdFx0XHRcdFx0dmlldyA9IHZ3SW5mb3NbaV07XG5cdFx0XHRcdFx0XHRpZiAoKHZpZXcgPSB2aWV3U3RvcmVbdmlldy5pZF0pICYmIHZpZXcuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoaXMgaXMgdGhlIF9wcnYgKHByZXZOb2RlKSBmb3IgYSB2aWV3LCByZW1vdmUgdGhlIHZpZXdcblx0XHRcdFx0XHRcdFx0Ly8gLSB1bmxlc3Mgdmlldy5kYXRhIGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHRcdFx0dmlldy5wYXJlbnQucmVtb3ZlVmlld3Modmlldy5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0RWwpOyAvLyByZW1vdmUgZGVmZXIgdG9rZW5zXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMaW5rIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50LCBzaW5jZSB0aGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKCksIG9yIHRvICQoZWwpLmxpbmsodHJ1ZSwgLi4uKSxcblx0XHRcdFx0cGFyZW50Vmlldy5saW5rKGZyb20sIHRhcmdldEVsLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIGh0bWwsIHJlZnJlc2gsIGNvbnRleHQpO1xuLy99LCAwKTtcblx0XHRcdH1cblx0XHRcdGlmICh0b3BMZXZlbENhbGwpIHtcblx0XHRcdFx0dG9wVmlldy5kYXRhID0gdG9wVmlldy5jdHggPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0bzsgLy8gQWxsb3cgY2hhaW5pbmcsIHRvIGF0dGFjaCBldmVudCBoYW5kbGVycywgZXRjLlxufVxuXG4vLy0tLS0tLS0tLS1cbi8vIHZpZXcubGlua1xuLy8tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHZpZXdMaW5rKG91dGVyRGF0YSwgcGFyZW50Tm9kZSwgcHJldk5vZGUsIG5leHROb2RlLCBodG1sLCByZWZyZXNoLCBjb250ZXh0LCB2YWxpZGF0ZU9ubHkpIHtcblx0Ly8gT3B0aW9uYWxseSBpbnNlcnQgSFRNTCBpbnRvIERPTSB1c2luZyBkb2N1bWVudEZyYWdtZW50cyAoYW5kIHdyYXBwaW5nIEhUTUwgYXBwcm9wcmlhdGVseSkuXG5cdC8vIERhdGEtbGluayBleGlzdGluZyBjb250ZW50cyBvZiBwYXJlbnROb2RlLCBvciB0aGUgaW5zZXJ0ZWQgSFRNTCwgaWYgcHJvdmlkZWRcblxuXHQvLyBEZXBlbmRpbmcgb24gdGhlIGNvbnRlbnQgbW9kZWwgZm9yIHRoZSBIVE1MIGVsZW1lbnRzLCB0aGUgc3RhbmRhcmQgZGF0YS1saW5raW5nIG1hcmtlcnMgaW5zZXJ0ZWQgaW4gdGhlIEhUTUwgYnkgYWRkQmluZGluZ01hcmtlcnMgZHVyaW5nXG5cdC8vIHRlbXBsYXRlIHJlbmRlcmluZyB3aWxsIGJlIGNvbnZlcnRlZCBlaXRoZXIgdG8gc2NyaXB0IG1hcmtlciBub2RlcyBvciwgZm9yIGVsZW1lbnQtb25seSBjb250ZW50IHNlY3Rpb25zLCB0byBkYXRhLWpzdiBlbGVtZW50IGFubm90YXRpb25zLlxuXG5cdC8vIERhdGEtbGlua2luZyB3aWxsIHRoZW4gYWRkIF9wcnYgYW5kIF9ueHQgdG8gdmlld3MsIHdoZXJlOlxuXHQvLyAgICAgX3BydjogUmVmZXJlbmNlcyB0aGUgcHJldmlvdXMgbm9kZSAoc2NyaXB0IGVsZW1lbnQgb2YgdHlwZSBcImpzdjEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIGZpcnN0IGVsZW1lbnQgbm9kZSBpbiB0aGUgdmlldyAob3IgaWYgbm9uZSwgc2V0IF9wcnYgPSBfbnh0KVxuXHQvLyAgICAgX254dDogUmVmZXJlbmNlcyB0aGUgbGFzdCBub2RlIChzY3JpcHQgZWxlbWVudCBvZiB0eXBlIFwianN2LzEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIG5leHQgZWxlbWVudCBub2RlIGFmdGVyIHRoZSB2aWV3LlxuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gY29udmVydE1hcmtlcnMoYWxsLCBwcmVjZWRpbmcsIHNlbGZDbG9zZSwgY2xvc2VUYWcsIHNwYWNlQmVmb3JlLCBpZCwgYm91bmRJZCwgc3BhY2VBZnRlciwgdGFnMSwgdGFnMiwgY2xvc2VUYWcyLCBzcGFjZUFmdGVyQ2xvc2UsIHNlbGZDbG9zZTIsIGVuZE9wZW5UYWcpIHtcblx0XHQvLyByQ29udmVydE1hcmtlcnMgPSAvKF58KFxcLz4pfDxcXC8oXFx3Kyk+fCkoXFxzKikoWyNcXC9dXFxkKyg/Ol98KFxcXikpKWAoXFxzKikoPFxcdysoPz1bXFxzXFwvPl0pKT98XFxzKig/Oig8XFx3Kyg/PVtcXHNcXC8+XSkpfDxcXC8oXFx3Kyk+KFxccyopfChcXC8+KVxccyp8KD4pKS9nLFxuXHRcdC8vICAgICAgICAgICAgICAgICBwcmVjLCBzbGZDbCwgY2xzVGFnLCAgc3BCZWZvcmUsIGlkLCAgICAgIGJuZElkICBzcEFmdGVyLHRhZzEsICAgICAgICAgICAgICAgICAgIHRhZzIsICAgICAgICAgICAgICAgY2xUYWcyLHNhYyAgc2xmQ2wyLCBlbmRPcGVuVGFnXG5cdFx0Ly8gQ29udmVydCB0aGUgbWFya2VycyB0aGF0IHdlcmUgaW5jbHVkZWQgYnkgYWRkQmluZGluZ01hcmtlcnMgaW4gdGVtcGxhdGUgb3V0cHV0LCB0byBhcHByb3ByaWF0ZSBET00gYW5ub3RhdGlvbnM6XG5cdFx0Ly8gZGF0YS1qc3YgYXR0cmlidXRlcyAoZm9yIGVsZW1lbnQtb25seSBjb250ZW50KSBvciBzY3JpcHQgbWFya2VyIG5vZGVzICh3aXRoaW4gcGhyYXNpbmcgb3IgZmxvdyBjb250ZW50KS5cblxuLy8gVE9ETyBjb25zaWRlciBkZXRlY3RpbmcgJ3F1b3RlZCcgY29udGV4dHMgKGF0dHJpYnV0ZSBzdHJpbmdzKSBzbyB0aGF0IGF0dHJpYnV0ZSBlbmNvZGluZyBkb2VzIG5vdCBuZWVkIHRvIGVuY29kZSA+XG4vLyBDdXJyZW50bHkgckF0dHJFbmNvZGUgPSAvWz48XCInJl0vZyBpbmNsdWRlcyAnPicgZW5jb2RpbmcgaW4gb3JkZXIgdG8gYXZvaWQgZXJyb25lb3VzIHBhcnNpbmcgb2YgPHNwYW4gdGl0bGU9XCImbHQ7YS8+XCI+PC9zcGFuPlwiPlxuXHRcdHZhciBlcnJvck1zZywgYm5kSWQsXG5cdFx0XHRlbmRPZkVsQ250ID0gXCJcIjtcblx0XHRpZiAoZW5kT3BlblRhZykge1xuXHRcdFx0aW5UYWcgPSAwO1xuXHRcdFx0cmV0dXJuIGFsbDtcblx0XHR9XG5cdFx0dGFnID0gdGFnMSB8fCB0YWcyIHx8IFwiXCI7XG5cdFx0Y2xvc2VUYWcgPSBjbG9zZVRhZyB8fCBjbG9zZVRhZzI7XG5cdFx0c2VsZkNsb3NlID0gc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTI7XG5cdFx0aWYgKGlzVm9pZCAmJiAhc2VsZkNsb3NlICYmICggIWFsbCB8fCBjbG9zZVRhZyB8fCB0YWcgfHwgaWQgJiYgIWluVGFnKSkgeyAvLyAhYWxsID0gZW5kIG9mIHN0cmluZ1xuXHRcdFx0aXNWb2lkID0gdW5kZWZpbmVkO1xuXHRcdFx0cGFyZW50VGFnID0gdGFnU3RhY2suc2hpZnQoKTsgLy8gcHJlY2VkaW5nIHRhZyB3YXMgYSB2b2lkIGVsZW1lbnQsIHdpdGggbm8gY2xvc2luZyBzbGFzaCwgc3VjaCBhcyA8YnI+LlxuXHRcdH1cblx0XHRjbG9zZVRhZyA9IGNsb3NlVGFnIHx8IHNlbGZDbG9zZTtcblx0XHRpZiAoY2xvc2VUYWcpIHtcblx0XHRcdGluVGFnID0gMDtcblx0XHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRcdC8vIFRPRE86IHNtYXJ0IGluc2VydGlvbiBvZiA8dGJvZHk+IC0gdG8gYmUgY29tcGxldGVkIGZvciByb2J1c3QgaW5zZXJ0aW9uIG9mIGRlZmVycmVkIGJpbmRpbmdzIGV0Yy5cblx0XHRcdC8vaWYgKGNsb3NlVGFnID09PSBcInRhYmxlXCIgJiYgcGFyZW50VGFnID09PSBcInRib2R5XCIpIHtcblx0XHRcdC8vXHRwcmVjZWRpbmcgPSBcIjwvdGJvZHk+XCIgKyBwcmVjZWRpbmc7XG5cdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0YWJsZVwiO1xuXHRcdFx0Ly9cdHRhZ1N0YWNrLnNoaWZ0KCk7XG5cdFx0XHQvL31cblx0XHRcdGlmICh2YWxpZGF0ZSkge1xuXHRcdFx0XHRpZiAoc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTIpIHtcblx0XHRcdFx0XHRpZiAoIXZvaWRFbGVtc1twYXJlbnRUYWddICYmICEvO3N2Zzt8O21hdGg7Ly50ZXN0KFwiO1wiICsgdGFnU3RhY2suam9pbihcIjtcIikgKyBcIjtcIikpIHtcblx0XHRcdFx0XHRcdC8vIE9ubHkgc2VsZi1jbG9zaW5nIGVsZW1lbnRzIG11c3QgYmUgbGVnaXRpbWF0ZSB2b2lkIGVsZW1lbnRzLCBzdWNoIGFzIDxici8+LCBwZXIgSFRNTCBzY2hlbWEsXG5cdFx0XHRcdFx0XHQvLyBvciB1bmRlciBzdmcgb3IgbWF0aCBmb3JlaWduIG5hbWVzcGFjZSBlbGVtZW50cy5cblx0XHRcdFx0XHRcdGVycm9yTXNnID0gXCInPFwiICsgcGFyZW50VGFnICsgXCIuLi4vXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZvaWRFbGVtc1tjbG9zZVRhZ10pIHtcblx0XHRcdFx0XHRlcnJvck1zZyA9IFwiJzwvXCIgKyBjbG9zZVRhZzsgLy8gY2xvc2luZyB0YWcgc3VjaCBhcyA8L2lucHV0PlxuXHRcdFx0XHR9IGVsc2UgaWYgKCF0YWdTdGFjay5sZW5ndGggfHwgY2xvc2VUYWcgIT09IHBhcmVudFRhZykge1xuXHRcdFx0XHRcdGVycm9yTXNnID0gXCJNaXNtYXRjaDogJzwvXCIgKyBjbG9zZVRhZztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyb3JNc2cpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihlcnJvck1zZyArIFwiPicgaW46XFxuXCIgKyBodG1sKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJldkVsQ250ID0gZWxDbnQ7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWdTdGFjay5zaGlmdCgpO1xuXHRcdFx0ZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXTtcblx0XHRcdGNsb3NlVGFnMiA9IGNsb3NlVGFnMiA/IChcIjwvXCIgKyBjbG9zZVRhZzIgKyBcIj5cIikgOiBcIlwiO1xuXHRcdFx0aWYgKHByZXZFbENudCkge1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHRcdGRlZmVyICs9IGlkcztcblx0XHRcdFx0aWRzID0gXCJcIjtcblx0XHRcdFx0aWYgKCFlbENudCkge1xuXHRcdFx0XHRcdGVuZE9mRWxDbnQgPSBjbG9zZVRhZzIgKyBvcGVuU2NyaXB0ICsgXCJAXCIgKyBkZWZlciArIGNsb3NlU2NyaXB0ICsgKHNwYWNlQWZ0ZXJDbG9zZSB8fCBcIlwiKTtcblx0XHRcdFx0XHRkZWZlciA9IGRlZmVyU3RhY2suc2hpZnQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlciArPSBcIi1cIjsgLy8gV2lsbCBiZSB1c2VkIGZvciBzdGVwcGluZyBiYWNrIHRocm91Z2ggZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHQvLyBlbENvbnRlbnQgbWFwcyB0YWdOYW1lcyB3aGljaCBoYXZlIG9ubHkgZWxlbWVudCBjb250ZW50LCBzbyBtYXkgbm90IHN1cHBvcnQgc2NyaXB0IG5vZGVzLlxuXHRcdFx0Ly8gV2UgYXJlIGluIGVsZW1lbnQtb25seSBjb250ZW50LCBjYW4gcmVtb3ZlIHdoaXRlIHNwYWNlLCBhbmQgdXNlIGRhdGEtanN2IGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgYXMgbWFya2Vyc1xuXHRcdFx0Ly8gRXhhbXBsZTogPHRyIGRhdGEtanN2PVwiLzJfIzZfXCI+IC0gY2xvc2UgbWFya2VyIGZvciB2aWV3IDIgYW5kIG9wZW4gbWFya2VyIGZvciB2aWV3IDZcblxuXHRcdFx0aWYgKGlkKSB7XG5cdFx0XHRcdC8vIGFwcGVuZCBtYXJrZXIgZm9yIHRoaXMgaWQsIHRvIGlkcyBzdHJpbmdcblx0XHRcdFx0aWRzICs9IGlkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJlY2VkaW5nID0gKGNsb3NlVGFnMiB8fCBzZWxmQ2xvc2UyIHx8IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHQvLyBUT0RPOiBzbWFydCBpbnNlcnRpb24gb2YgPHRib2R5PiAtIHRvIGJlIGNvbXBsZXRlZCBmb3Igcm9idXN0IGluc2VydGlvbiBvZiBkZWZlcnJlZCBiaW5kaW5ncyBldGMuXG5cdFx0XHRcdC8vaWYgKHRhZyA9PT0gXCI8dHJcIiAmJiBwYXJlbnRUYWcgPT09IFwidGFibGVcIikge1xuXHRcdFx0XHQvL1x0dGFnU3RhY2sudW5zaGlmdChwYXJlbnRUYWcpO1xuXHRcdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0Ym9keVwiO1xuXHRcdFx0XHQvL1x0cHJlY2VkaW5nICs9IFwiPFwiICsgcGFyZW50VGFnICsgXCI+XCI7XG5cdFx0XHRcdC8vXHRpZiAoZGVmZXIpIHtcblx0XHRcdFx0Ly9cdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0XHQvL1x0fVxuXHRcdFx0XHQvL1x0Ly8gVE9ETzogbW92ZSB0aGlzIHRvIGRlc2lnbi10aW1lIHZhbGlkYXRpb24gY2hlY2tcblx0XHRcdFx0Ly9cdC8vXHRlcnJvcignXCInICsgcGFyZW50VGFnICsgJ1wiIGhhcyBpbmNvcnJlY3QgcGFyZW50IHRhZycpO1xuXHRcdFx0XHQvL31cblx0XHRcdFx0cHJlY2VkaW5nICs9IHRhZztcblx0XHRcdFx0aWYgKGlkcykge1xuXHRcdFx0XHRcdHByZWNlZGluZyArPSAnICcgKyBqc3ZBdHRyU3RyICsgJz1cIicgKyBpZHMgKyAnXCInO1xuXHRcdFx0XHRcdGlkcyA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgYXJlIGluIHBocmFzaW5nIG9yIGZsb3cgY29udGVudCwgc28gdXNlIHNjcmlwdCBtYXJrZXIgbm9kZXNcblx0XHRcdC8vIEV4YW1wbGU6IDxzY3JpcHQgdHlwZT1cImpzdjMvXCI+PC9zY3JpcHQ+IC0gZGF0YS1saW5rZWQgdGFnLCBjbG9zZSBtYXJrZXJcblx0XHRcdC8vIFdlIHZhbGlkYXRlIHdpdGggaW5UYWcgc28gbm8gc2NyaXB0IG1hcmtlcnMgYXJlIGluc2VydGVkIGluIGF0dHJpYnV0ZSBjb250ZXh0IGUuZy4gZm9yOlxuXHRcdFx0Ly8gXCI8dGFibGUge3tpZiAuLi59fS4uLnt7L2lmfX0uLi4gPlwiIG9yIFwiPHRhYmxlIHt7aWYgLi4ufX0uLi4+IC4uLnt7L2lmfX0uLi5cIlxuXHRcdFx0cHJlY2VkaW5nID0gaWRcblx0XHRcdFx0PyAocHJlY2VkaW5nICsgZW5kT2ZFbENudCArIHNwYWNlQmVmb3JlICsgKGluVGFnID8gXCJcIiA6IG9wZW5TY3JpcHQgKyBpZCArIGNsb3NlU2NyaXB0KSsgc3BhY2VBZnRlciArIHRhZylcblx0XHRcdFx0OiBlbmRPZkVsQ250IHx8IGFsbDtcblx0XHR9XG5cblx0XHRpZiAodmFsaWRhdGUgJiYgYm91bmRJZCkge1xuXHRcdFx0aWYgKGluVGFnKSB7XG5cdFx0XHRcdC8vIEpzVmlld3MgZGF0YS1saW5raW5nIHRhZ3MgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbiBlbGVtZW50IG1hcmt1cC5cblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzMwM1xuXHRcdFx0XHRzeW50YXhFcnJvcigne157IHdpdGhpbiBlbGVtIG1hcmt1cCAoJyArIGluVGFnICsgJyApLiBVc2UgZGF0YS1saW5rPVwiLi4uXCInKTtcblx0XHRcdH1cblx0XHRcdGlmIChpZC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdHRhZ1N0YWNrLnVuc2hpZnQoaWQuc2xpY2UoMSkpO1xuXHRcdFx0fSBlbHNlIGlmIChpZC5zbGljZSgxKSAhPT0gKGJuZElkID0gdGFnU3RhY2suc2hpZnQoKSkpIHtcblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzIxM1xuXHRcdFx0XHRzeW50YXhFcnJvcignQ2xvc2luZyB0YWcgZm9yIHteey4uLn19IHVuZGVyIGRpZmZlcmVudCBlbGVtOiA8JyArIGJuZElkICsgJz4nKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRhZykge1xuXHRcdFx0aW5UYWcgPSB0YWc7XG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHR0YWdTdGFjay51bnNoaWZ0KHBhcmVudFRhZyk7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWcuc2xpY2UoMSk7XG5cdFx0XHRpZiAodmFsaWRhdGUgJiYgdGFnU3RhY2tbMF0gJiYgdGFnU3RhY2tbMF0gPT09IGJhZFBhcmVudFtwYXJlbnRUYWddKSB7XG5cdFx0XHRcdC8vIE1pc3NpbmcgPHRib2R5PlxuXHRcdFx0XHQvLyBUT0RPOiByZXBsYWNlIHRoaXMgYnkgc21hcnQgaW5zZXJ0aW9uIG9mIDx0Ym9keT4gdGFnc1xuXHRcdFx0XHRlcnJvcignUGFyZW50IG9mIDx0cj4gbXVzdCBiZSA8dGJvZHk+Jyk7XG5cdFx0XHR9XG5cdFx0XHRpc1ZvaWQgPSB2b2lkRWxlbXNbcGFyZW50VGFnXTtcblx0XHRcdGlmICgoZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXSkgJiYgIXByZXZFbENudCkge1xuXHRcdFx0XHRkZWZlclN0YWNrLnVuc2hpZnQoZGVmZXIpO1xuXHRcdFx0XHRkZWZlciA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRwcmV2RWxDbnQgPSBlbENudDtcbi8vVE9ETyBDb25zaWRlciBwcm92aWRpbmcgdmFsaWRhdGlvbiB3aGljaCB0aHJvd3MgaWYgeW91IHBsYWNlIDxzcGFuPiBhcyBjaGlsZCBvZiA8dHI+LCBldGMuIC0gc2luY2UgaWYgbm90IGNhdWdodCxcbi8vdGhpcyBjYW4gY2F1c2UgZXJyb3JzIHN1YnNlcXVlbnRseSB3aGljaCBhcmUgZGlmZmljdWx0IHRvIGRlYnVnLlxuLy9cdFx0XHRcdGlmIChlbENvbnRlbnRbdGFnU3RhY2tbMF1dPjIgJiYgIWVsQ250KSB7XG4vL1x0XHRcdFx0XHRlcnJvcihwYXJlbnRUYWcgKyBcIiBpbiBcIiArIHRhZ1N0YWNrWzBdKTtcbi8vXHRcdFx0XHR9XG5cdFx0XHRpZiAoZGVmZXIgJiYgZWxDbnQpIHtcblx0XHRcdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcHJlY2VkaW5nO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJvY2Vzc1ZpZXdJbmZvcyh2d0luZm9zLCB0YXJnZXRQYXJlbnQpIHtcblx0XHQvLyBJZiB0YXJnZXRQYXJlbnQsIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyAod2hpY2ggbWF5IGluY2x1ZGUgbmF2aWdhdGlvbiB0aHJvdWdoICcrLScgcGF0aHMpIGFuZCBob29raW5nIHVwIHRvIHRoZSByaWdodCBwYXJlbnRFbGVtIGV0Yy5cblx0XHQvLyAoYW5kIGVsZW0gbWF5IGFsc28gYmUgZGVmaW5lZCAtIHRoZSBuZXh0IG5vZGUpXG5cdFx0Ly8gSWYgbm8gdGFyZ2V0UGFyZW50LCB0aGVuIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyBvbiBuZXdseSBpbnNlcnRlZCBjb250ZW50XG5cdFx0dmFyIGRlZmVyUGF0aCwgZGVmZXJDaGFyLCBiaW5kQ2hhciwgcGFyZW50RWxlbSwgaWQsIG9uQWZ0Q3IsIGRlZXAsXG5cdFx0XHRhZGRlZEJpbmRFbHMgPSBbXTtcblxuXHRcdC8vIEluIGVsQ250IGNvbnRleHQgKGVsZW1lbnQtb25seSBjb250ZW50IG1vZGVsKSwgcHJldk5vZGUgaXMgdGhlIGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIG9wZW4sIG5leHROb2RlIGlzIHRoZSBmaXJzdCBub2RlIGFmdGVyIHRoZSBjbG9zZS5cblx0XHQvLyBJZiBib3RoIGFyZSBudWxsL3VuZGVmaW5lZCwgdGhlbiBvcGVuIGFuZCBjbG9zZSBhcmUgYXQgZW5kIG9mIHBhcmVudCBjb250ZW50LCBzbyB0aGUgdmlldyBpcyBlbXB0eSwgYW5kIGl0cyBwbGFjZWhvbGRlciBpcyB0aGVcblx0XHQvLyAnbGFzdENoaWxkJyBvZiB0aGUgcGFyZW50Tm9kZS4gSWYgdGhlcmUgaXMgYSBwcmV2Tm9kZSwgdGhlbiBpdCBpcyBlaXRoZXIgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXcsIG9yIHRoZSB2aWV3IGlzIGVtcHR5IGFuZFxuXHRcdC8vIGl0cyBwbGFjZWhvbGRlciBpcyB0aGUgJ3ByZXZpb3VzU2libGluZycgb2YgdGhlIHByZXZOb2RlLCB3aGljaCBpcyBhbHNvIHRoZSBuZXh0Tm9kZS5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0aWYgKHZ3SW5mb3MuX3RrbnMuY2hhckF0KDApID09PSBcIkBcIikge1xuXHRcdFx0XHQvLyBXZSBhcmUgcHJvY2Vzc2luZyBuZXdseSBpbnNlcnRlZCBjb250ZW50LiBUaGlzIGlzIGEgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkIGluIGNvbnZlcnRNYXJrZXJzKCkgdG8gcHJvY2VzcyBkZWZlcnJlZCBiaW5kaW5ncyxcblx0XHRcdFx0Ly8gYW5kIGluc2VydGVkIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHBhcmVudCBlbGVtZW50IC0gYmVjYXVzZSBubyBlbGVtZW50IHRhZ3MgKG91dHNpZGUgZWxDbnQpIHdlcmUgZW5jb3VudGVyZWQgdG8gY2FycnkgdGhvc2UgYmluZGluZyB0b2tlbnMuXG5cdFx0XHRcdC8vIFdlIHdpbGwgc3RlcCBiYWNrIGZyb20gdGhlIHByZWNlZGluZyBzaWJsaW5nIG9mIHRoaXMgZWxlbWVudCwgbG9va2luZyBhdCB0YXJnZXRQYXJlbnQgZWxlbWVudHMgdW50aWwgd2UgZmluZCB0aGUgb25lIHRoYXQgdGhlIGN1cnJlbnQgYmluZGluZ1xuXHRcdFx0XHQvLyB0b2tlbiBiZWxvbmdzIHRvLiBTZXQgZWxlbSB0byBudWxsICh0aGUgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCksIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgRE9NLlxuXHRcdFx0XHR0YXJnZXRQYXJlbnQgPSBlbGVtLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW0pO1xuXHRcdFx0XHRlbGVtID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tsZW5dO1xuLy9pZiAocHJldklkcy5pbmRleE9mKHZ3SW5mby50b2tlbikgPCAwKSB7IC8vIFRoaXMgdG9rZW4gaXMgYSBuZXdseSBjcmVhdGVkIHZpZXcgb3IgdGFnIGJpbmRpbmdcblx0XHRcdFx0YmluZENoYXIgPSB2d0luZm8uY2g7XG5cdFx0XHRcdGlmIChkZWZlclBhdGggPSB2d0luZm8ucGF0aCkge1xuXHRcdFx0XHRcdC8vIFdlIGhhdmUgYSAnZGVmZXJyZWQgcGF0aCdcblx0XHRcdFx0XHRqID0gZGVmZXJQYXRoLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0d2hpbGUgKGRlZmVyQ2hhciA9IGRlZmVyUGF0aC5jaGFyQXQoai0tKSkge1xuXHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBcIitcIiBhbmRcIi1cIiBjaGFyYWN0ZXJzIHRvIG5hdmlnYXRlIHRoZSBwYXRoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBhcmVudCBub2RlIHdoZXJlIHRoZSBkZWZlcnJlZCBiaW5kaW5ncyBvY3VycmVkXG5cdFx0XHRcdFx0XHRpZiAoZGVmZXJDaGFyID09PSBcIitcIikge1xuXHRcdFx0XHRcdFx0XHRpZiAoZGVmZXJQYXRoLmNoYXJBdChqKSA9PT0gXCItXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRqLS07XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50LnByZXZpb3VzU2libGluZztcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50Lmxhc3RDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIE5vdGU6IENhbiB1c2UgcHJldmlvdXNTaWJsaW5nIGFuZCBsYXN0Q2hpbGQsIG5vdCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFuZCBsYXN0RWxlbWVudENoaWxkLFxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgaGF2ZSByZW1vdmVkIHdoaXRlIHNwYWNlIHdpdGhpbiBlbENudC4gSGVuY2Ugc3VwcG9ydCBJRSA8IDlcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJpbmRDaGFyID09PSBcIl5cIikge1xuXHRcdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgYmluZGluZyBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQsIGZvciBleGFtcGxlIGluIGEgZGlmZmVyZW50IGhhbmRsZXIgdG8gYW4gYXJyYXkgY29sbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHRhZyBiaW5kaW5nXG5cdFx0XHRcdFx0XHRkZWVwID0gdGFyZ2V0UGFyZW50ICYmICghZWxlbSB8fCBlbGVtLnBhcmVudE5vZGUgIT09IHRhcmdldFBhcmVudCk7IC8vIFdlIGFyZSBzdGVwcGluZyBiYWNrIGxvb2tpbmcgZm9yIHRoZSByaWdodCB0YXJnZXRQYXJlbnQsXG5cdFx0XHRcdFx0XHQvLyBvciB3ZSBhcmUgbGlua2luZyBleGlzdGluZyBjb250ZW50IGFuZCB0aGlzIGVsZW1lbnQgaXMgaW4gZWxDbnQsIG5vdCBhbiBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIHRhcmdldFBhcmVudC5cblx0XHRcdFx0XHRcdGlmICghZWxlbSB8fCBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHZ3SW5mby5lbENudCAmJiBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdpdGggZWxlbWVudCBvbmx5IGNvbnRlbnQsIGlmIHRoZXJlIGlzIG5vIGZvbGxvd2luZyBlbGVtZW50LCBvciBpZiB0aGUgYmluZGluZyBpcyBkZWVwZXIgdGhhbiB0aGUgZm9sbG93aW5nIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0Ly8gdGhlbiB3ZSBuZWVkIHRvIHNldCB0aGUgb3BlbiBvciBjbG9zZSB0b2tlbiBhcyBhIGRlZmVycmVkIGJpbmRpbmcgYW5ub3RhdGlvbiBvbiB0aGUgcGFyZW50XG5cdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldFBhcmVudCwgKHZ3SW5mby5vcGVuID8gXCIjXCIgOiBcIi9cIikgKyBpZCArIGJpbmRDaGFyICsgKHRhcmdldFBhcmVudC5fZGYgfHwgXCJcIikpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG9yIGNsb3NlIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0uIEFkZCBpdCB0byBiaW5kRWxzLlxuXHRcdFx0XHRcdFx0YWRkZWRCaW5kRWxzLnB1c2goW2RlZXAgPyBudWxsIDogZWxlbSwgdndJbmZvXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZpZXcgPSB2aWV3U3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHZpZXcgbWF5IGhhdmUgYmVlbiBkZWxldGVkLCBmb3IgZXhhbXBsZSBpbiBhIGRpZmZlcmVudCBoYW5kbGVyIHRvIGFuIGFycmF5IGNvbGxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdFx0XHRpZiAoIXZpZXcucGFyZW50RWxlbSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdmlldyBpcyBub3QgYWxyZWFkeSBleHRlbmRlZCBmb3IgSnNWaWV3cywgZXh0ZW5kIGFuZCBpbml0aWFsaXplIHRoZSB2aWV3IG9iamVjdCBjcmVhdGVkIGluIEpzUmVuZGVyLCBhcyBhIEpzVmlld3Mgdmlld1xuXHRcdFx0XHRcdFx0dmlldy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50IHx8IGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlIHx8IHBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHR2aWV3Ll8ub25SZW5kZXIgPSBhZGRCaW5kaW5nTWFya2Vycztcblx0XHRcdFx0XHRcdHZpZXcuXy5vbkFycmF5Q2hhbmdlID0gYXJyYXlDaGFuZ2VIYW5kbGVyO1xuXHRcdFx0XHRcdFx0c2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXJlbnRFbGVtID0gdmlldy5wYXJlbnRFbGVtO1xuXHRcdFx0XHRcdGlmICh2d0luZm8ub3Blbikge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiAnb3BlbiB2aWV3JyBub2RlIChwcmVjZWRpbmcgc2NyaXB0IG1hcmtlciBub2RlLFxuXHRcdFx0XHRcdFx0Ly8gb3IgaWYgZWxDbnQsIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSB2aWV3LCB3aXRoIGEgZGF0YS1qc3YgYW5ub3RhdGlvbikgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdHZpZXcuX2VsQ250ID0gdndJbmZvLmVsQ250O1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFBhcmVudCAmJiAhZWxlbSkge1xuXHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRQYXJlbnQsIFwiI1wiICsgaWQgKyBiaW5kQ2hhciArICh0YXJnZXRQYXJlbnQuX2RmIHx8IFwiXCIpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIE5vIHRhcmdldFBhcmVudCwgc28gdGhlcmUgaXMgYSAuX254dCBlbGVtIChhbmQgdGhpcyBpcyBwcm9jZXNzaW5nIHRva2VucyBvbiB0aGUgZWxlbSlcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9wcnYpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiI1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSAnY2xvc2UgdmlldycgbWFya2VyIG5vZGUgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdGlmICh0YXJnZXRQYXJlbnQgJiYgKCFlbGVtIHx8IGVsZW0ucGFyZW50Tm9kZSAhPT0gdGFyZ2V0UGFyZW50KSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGVyZSBpcyBubyAuX254dCBzbyBhZGQgdG9rZW4gdG8gX2RmLiBJdCBpcyBkZWZlcnJlZC5cblx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0UGFyZW50LCBcIi9cIiArIGlkICsgYmluZENoYXIgKyAodGFyZ2V0UGFyZW50Ll9kZiB8fCBcIlwiKSk7XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZWxlbSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIHZpZXcgZGlkIG5vdCBoYXZlIGEgLl9ueHQsIGJ1dCBoYXMgb25lIG5vdywgc28gdG9rZW4gbWF5IGJlIGluIF9kZiwgYW5kIG11c3QgYmUgcmVtb3ZlZC4gKE5vIGxvbmdlciBkZWZlcnJlZClcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9ueHQpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiL1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob25BZnRDciA9IHZpZXcuY3R4ICYmIHZpZXcuY3R4W29uQWZ0ZXJDcmVhdGVTdHJdIHx8IG9uQWZ0ZXJDcmVhdGUpIHtcblx0XHRcdFx0XHRcdFx0b25BZnRDci5jYWxsKHZpZXcuY3R4LnRhZywgdmlldyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuLy99XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxlbiA9IGFkZGVkQmluZEVscy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0Ly8gVGhlc2Ugd2VyZSBhZGRlZCBpbiByZXZlcnNlIG9yZGVyIHRvIGFkZGVkQmluZEVscy4gV2UgcHVzaCB0aGVtIGluIEJpbmRFbHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG5cdFx0XHRcdGJpbmRFbHMucHVzaChhZGRlZEJpbmRFbHNbbGVuXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAhdndJbmZvcyB8fCB2d0luZm9zLmVsQ250O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Vmlld0luZm9zKHZ3SW5mb3MpIHtcblx0XHQvLyBVc2VkIGJ5IHZpZXcuY2hpbGRUYWdzKCkgYW5kIHRhZy5jaGlsZFRhZ3MoKVxuXHRcdC8vIFNpbWlsYXIgdG8gcHJvY2Vzc1ZpZXdJbmZvcyBpbiBob3cgaXQgc3RlcHMgdGhyb3VnaCBiaW5kaW5ncyB0byBmaW5kIHRhZ3MuIE9ubHkgZmluZHMgZGF0YS1saW5rZWQgdGFncy5cblx0XHR2YXIgbGV2ZWwsIHBhcmVudFRhZywgbmFtZWQ7XG5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tqXTtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0sIHdpdGhpbiB0aGUgY29udGVudCBvZiB0aGUgdGFnIHdob3NlIGlkIGlzIGdldC5pZC4gQWRkIGl0IHRvIGJpbmRFbHMuXG5cdFx0XHRcdC8vIE5vdGUgLSBpZiBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5faXMgPT09IFwidGFnXCIgdGhlbiBnZXRWaWV3SW5mb3MgaXMgYmVpbmcgY2FsbGVkIHRvbyBzb29uIC0gZHVyaW5nIGZpcnN0IGxpbmtpbmcgcGFzc1xuXHRcdFx0XHRwYXJlbnRUYWcgPSB0YWcgPSBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5saW5rQ3R4LnRhZztcblx0XHRcdFx0bmFtZWQgPSB0YWcudGFnTmFtZSA9PT0gdGFnTmFtZTtcblx0XHRcdFx0aWYgKCF0YWcuZmxvdyB8fCBuYW1lZCkge1xuXHRcdFx0XHRcdGlmICghZGVlcCkge1xuXHRcdFx0XHRcdFx0bGV2ZWwgPSAxO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHBhcmVudFRhZyA9IHBhcmVudFRhZy5wYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0bGV2ZWwrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRhZ0RlcHRoID0gdGFnRGVwdGggfHwgbGV2ZWw7IC8vIFRoZSBsZXZlbCBvZiB0aGUgZmlyc3QgdGFnIGVuY291bnRlcmVkLlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoKGRlZXAgfHwgbGV2ZWwgPT09IHRhZ0RlcHRoKSAmJiAoIXRhZ05hbWUgfHwgbmFtZWQpKSB7XG5cdFx0XHRcdFx0XHQvLyBGaWx0ZXIgb24gdG9wLWxldmVsIG9yIHRhZ05hbWUgYXMgYXBwcm9wcmlhdGVcblx0XHRcdFx0XHRcdHRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGRhdGFMaW5rKCkge1xuXHRcdC8vPT09PT09PT09PT09PT09PSBEYXRhLWxpbmsgYW5kIGZpeHVwIG9mIGRhdGEtanN2IGFubm90YXRpb25zID09PT09PT09PT09PT09PT1cblx0XHR2YXIgaiwgaW5kZXgsXG5cdFx0XHR0b2tlbnMgPSBcIlwiLFxuXHRcdFx0d3JhcCA9IHt9LFxuXHRcdFx0c2VsZWN0b3IgPSBsaW5rVmlld3NTZWwgKyAoZ2V0ID8gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgOiBcIlwiKTtcblx0XHRcdC8vIElmIGEgY2hpbGRUYWdzKCkgY2FsbCwgZ2V0ID0gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgLSBzaW5jZSB3ZSBuZWVkIHRvIGluY2x1ZGUgZWxlbWVudHMgdGhhdCBoYXZlIGEgLl9kZiBleHBhbmRvIGZvciBkZWZlcnJlZCB0b2tlbnNcblxuXHRcdGVsZW1zID0gcXNhID8gcGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHBhcmVudE5vZGUpLmdldCgpO1xuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0XHQvLyBUaGUgcHJldk5vZGUgd2lsbCBiZSBpbiB0aGUgcmV0dXJuZWQgcXVlcnksIHNpbmNlIHdlIGNhbGxlZCBtYXJrUHJldk9yTmV4dE5vZGUoKSBvbiBpdC5cblx0XHQvLyBCdXQgaXQgbWF5IGhhdmUgY29udGFpbmVkIG5vZGVzIHRoYXQgc2F0aXNmeSB0aGUgc2VsZWN0b3IgYWxzby5cblx0XHRpZiAocHJldk5vZGUgJiYgcHJldk5vZGUuaW5uZXJIVE1MKSB7XG5cdFx0XHQvLyBGaW5kIHRoZSBsYXN0IGNvbnRhaW5lZCBub2RlIG9mIHByZXZOb2RlLCB0byB1c2UgYXMgdGhlIHByZXZOb2RlIC0gc28gd2Ugb25seSBsaW5rIHN1YnNlcXVlbnQgZWxlbXMgaW4gdGhlIHF1ZXJ5XG5cdFx0XHRwcmV2Tm9kZXMgPSBxc2EgPyBwcmV2Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHByZXZOb2RlKS5nZXQoKTtcblx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVzLmxlbmd0aCA/IHByZXZOb2Rlc1twcmV2Tm9kZXMubGVuZ3RoIC0gMV0gOiBwcmV2Tm9kZTtcblx0XHR9XG5cblx0XHR0YWdEZXB0aCA9IDA7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0ZWxlbSA9IGVsZW1zW2ldO1xuXHRcdFx0aWYgKHByZXZOb2RlICYmICFmb3VuZCkge1xuXHRcdFx0XHQvLyBJZiBwcmV2Tm9kZSBpcyBzZXQsIG5vdCBmYWxzZSwgc2tpcCBsaW5raW5nLiBJZiB0aGlzIGVsZW1lbnQgaXMgdGhlIHByZXZOb2RlLCBzZXQgdG8gZmFsc2Ugc28gc3Vic2VxdWVudCBlbGVtZW50cyB3aWxsIGxpbmsuXG5cdFx0XHRcdGZvdW5kID0gKGVsZW0gPT09IHByZXZOb2RlKTtcblx0XHRcdH0gZWxzZSBpZiAobmV4dE5vZGUgJiYgZWxlbSA9PT0gbmV4dE5vZGUpIHtcblx0XHRcdFx0Ly8gSWYgbmV4dE5vZGUgaXMgc2V0IHRoZW4gYnJlYWsgd2hlbiB3ZSBnZXQgdG8gbmV4dE5vZGVcblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSBpZiAoZWxlbS5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdC8vIGVsZW0gaGFzIG5vdCBiZWVuIHJlbW92ZWQgZnJvbSBET01cblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0XHRpZiAoZWxlbS5fZGYpIHtcblx0XHRcdFx0XHRcdGogPSBpICsgMTtcblx0XHRcdFx0XHRcdHdoaWxlIChqIDwgbCAmJiBlbGVtLmNvbnRhaW5zKGVsZW1zW2pdKSkge1xuXHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBBZGQgZGVmZXJlZCB0b2tlbnMgYWZ0ZXIgYW55IHRva2VucyBvbiBkZXNjZW5kYW50IGVsZW1lbnRzIG9mIHRoaXMgb25lXG5cdFx0XHRcdFx0XHR3cmFwW2otMV0gPSBlbGVtLl9kZjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHdyYXBbaV0pIHtcblx0XHRcdFx0XHRcdHRva2VucyArPSB3cmFwW2ldIHx8IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChpc0xpbmsgJiYgKHZ3SW5mbyA9IHZpZXdJbmZvcyhlbGVtLCB1bmRlZmluZWQsIHJWaWV3TWFya2VycykpICYmICh2d0luZm8gPSB2d0luZm9bMF0pKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIGEgbGluayh0cnVlT3JTdHJpbmcgLi4uKSBjYWxsIHdlIHdpbGwgYXZvaWQgcmUtYmluZGluZyB0byBlbGVtcyB0aGF0IGFyZSB3aXRoaW4gdGVtcGxhdGUtcmVuZGVyZWQgdmlld3Ncblx0XHRcdFx0XHRcdHNraXAgPSBza2lwID8gKHZ3SW5mby5pZCAhPT0gc2tpcCAmJiBza2lwKSA6IHZ3SW5mby5vcGVuICYmIHZ3SW5mby5pZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFza2lwICYmIHByb2Nlc3NJbmZvcyh2aWV3SW5mb3MoZWxlbSkpXG5cdFx0XHRcdFx0XHQvLyBJZiBhIGxpbmsoKSBjYWxsLCBwcm9jZXNzVmlld0luZm9zKCkgYWRkcyBiaW5kaW5ncyB0byBiaW5kRWxzLCBhbmQgcmV0dXJucyB0cnVlIGZvciBub24tc2NyaXB0IG5vZGVzLCBmb3IgYWRkaW5nIGRhdGEtbGluayBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBjaGlsZFRhZ3MoKSBjYWxsLCBnZXRWaWV3SW5mb3MgcmV0dXJucyBhcnJheSBvZiB0YWcgYmluZGluZ3MuXG5cdFx0XHRcdFx0XHRcdCYmIGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0XHRcdFx0YmluZEVscy5wdXNoKFtlbGVtXSk7IC8vIEEgZGF0YS1saW5rZWQgZWxlbWVudCBzbyBhZGQgdG8gYmluZEVscyB0b29cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0KSB7XG5cdFx0XHR0b2tlbnMgKz0gcGFyZW50Tm9kZS5fZGYgfHwgXCJcIjtcblx0XHRcdGlmIChpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiI1wiICsgZ2V0LmlkKSArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gc3RhcnQgYWZ0ZXIgdGhlIG9wZW4gdG9rZW4gb2YgdGhlIHBhcmVudCB2aWV3IG9yIHRhZy5cblx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKGluZGV4ICsgZ2V0LmlkLmxlbmd0aCk7XG5cdFx0XHR9XG5cdFx0XHRpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiL1wiICsgZ2V0LmlkKTtcblx0XHRcdGlmIChpbmRleCArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gZG9uJ3QgbG9vayBiZXlvbmQgdGhlIGNsb3NlIHRva2VuIG9mIHRoZSBwYXJlbnQgdmlldyBvciB0YWcuXG5cdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZSgwLCBpbmRleCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBDYWxsIGdldFZpZXdJbmZvcyB0byBhZGQgdGhlIGZvdW5kIGNoaWxkVGFncyB0byB0aGUgdGFncyBhcnJheVxuXHRcdFx0Z2V0Vmlld0luZm9zKHZpZXdJbmZvcyh0b2tlbnMsIHVuZGVmaW5lZCwgck9wZW5UYWdNYXJrZXJzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKGh0bWwgPT09IHVuZGVmaW5lZCAmJiBwYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikpIHtcblx0XHRcdGJpbmRFbHMucHVzaChbcGFyZW50Tm9kZV0pOyAvLyBTdXBwb3J0IGRhdGEtbGlua2luZyB0b3AtbGV2ZWwgZWxlbWVudCBkaXJlY3RseSAobm90IHdpdGhpbiBhIGRhdGEtbGlua2VkIGNvbnRhaW5lcilcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGVtcG9yYXJ5IG1hcmtlciBzY3JpcHQgbm9kZXMgdGhleSB3ZXJlIGFkZGVkIGJ5IG1hcmtQcmV2T3JOZXh0Tm9kZVxuXHRcdHVubWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdFx0dW5tYXJrUHJldk9yTmV4dE5vZGUobmV4dE5vZGUsIGVsQ250KTtcblxuXHRcdGlmIChnZXQpIHtcblx0XHRcdGlmIChsYXp5TGluaykge1xuXHRcdFx0XHRsYXp5TGluay5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47IC8vIFdlIGhhdmUgYWRkZWQgY2hpbGRUYWdzIHRvIHRoZSB0YWdzIGFycmF5LCBzbyB3ZSBhcmUgZG9uZVxuXHRcdH1cblxuXHRcdGlmIChlbENudCAmJiBkZWZlciArIGlkcykge1xuXHRcdFx0Ly8gVGhlcmUgYXJlIHNvbWUgdmlld3Mgd2l0aCBlbENudCwgZm9yIHdoaWNoIHRoZSBvcGVuIG9yIGNsb3NlIGRpZCBub3QgcHJlY2VkZSBhbnkgSFRNTCB0YWcgLSBzbyB0aGV5IGhhdmUgbm90IGJlZW4gcHJvY2Vzc2VkIHlldFxuXHRcdFx0ZWxlbSA9IG5leHROb2RlO1xuXHRcdFx0aWYgKGRlZmVyKSB7XG5cdFx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHRcdHByb2Nlc3NWaWV3SW5mb3Modmlld0luZm9zKGRlZmVyICsgXCIrXCIsIHRydWUpLCBuZXh0Tm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoZGVmZXIsIHRydWUpLCBwYXJlbnROb2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoaWRzLCB0cnVlKSwgcGFyZW50Tm9kZSk7XG5cdFx0XHQvLyBJZiB0aGVyZSB3ZXJlIGFueSB0b2tlbnMgb24gbmV4dE5vZGUgd2hpY2ggaGF2ZSBub3cgYmVlbiBhc3NvY2lhdGVkIHdpdGggaW5zZXJ0ZWQgSFRNTCB0YWdzLCByZW1vdmUgdGhlbSBmcm9tIG5leHROb2RlXG5cdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0dG9rZW5zID0gbmV4dE5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpO1xuXHRcdFx0XHRpZiAobCA9IHRva2Vucy5pbmRleE9mKHByZXZJZHMpICsgMSkge1xuXHRcdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZShsICsgcHJldklkcy5sZW5ndGggLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRuZXh0Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgaWRzICsgdG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLz09PT09PT09PT09PT09PT0gQmluZCB0aGUgZGF0YS1saW5rZWQgZWxlbWVudHMgYW5kIHRhZ3MgPT09PT09PT09PT09PT09PVxuXHRcdGwgPSBiaW5kRWxzLmxlbmd0aDtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRlbGVtID0gYmluZEVsc1tpXTtcblx0XHRcdGxpbmtJbmZvID0gZWxlbVsxXTtcblx0XHRcdGVsZW0gPSBlbGVtWzBdO1xuXHRcdFx0aWYgKGxpbmtJbmZvKSB7XG5cdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbbGlua0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtDdHggPSB0YWcubGlua0N0eCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHRhZyBtYXkgaGF2ZSBiZWVuIHN0b3JlZCB0ZW1wb3JhcmlseSBvbiB0aGUgYmluZGluZ1N0b3JlIC0gb3IgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBhY3R1YWwgYmluZGluZ1xuXHRcdFx0XHRcdFx0dGFnID0gbGlua0N0eC50YWc7XG5cdFx0XHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsaW5rSW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuICdvcGVuIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRcdFx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHR0YWcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0YWcuX2VsQ250ID0gbGlua0luZm8uZWxDbnQ7XG5cdFx0XHRcdFx0XHQvLyBXZSBkYXRhLWxpbmsgZGVwdGgtZmlyc3QgKFwib24gdGhlIHdheSBpblwiKSwgd2hpY2ggaXMgYmV0dGVyIGZvciBwZXJmIC0gYW5kIGFsbG93cyBzZXR0aW5nIHBhcmVudCB0YWdzIGV0Yy5cblx0XHRcdFx0XHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXc7XG5cdFx0XHRcdFx0XHRhZGREYXRhQmluZGluZyh1bmRlZmluZWQsIHRhZy5fcHJ2LCB2aWV3LCBsaW5rSW5mby5pZCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRhZy5fbnh0ID0gZWxlbTtcblx0XHRcdFx0XHRcdGlmICh0YWcuXy51bmxpbmtlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgJ2Nsb3NlIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHQvLyBBZGQgZGF0YSBiaW5kaW5nXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eCA9IHRhZy50YWdDdHg7XG5cdFx0XHRcdFx0XHRcdHZpZXcgPSB0YWdDdHgudmlldztcblx0XHRcdFx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQWRkIGRhdGEgYmluZGluZyBmb3IgYSBkYXRhLWxpbmtlZCBlbGVtZW50ICh3aXRoIGRhdGEtbGluayBhdHRyaWJ1dGUpXG5cdFx0XHRcdGFkZERhdGFCaW5kaW5nKGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSwgZWxlbSwgJHZpZXcoZWxlbSksIHVuZGVmaW5lZCwgaXNMaW5rLCBvdXRlckRhdGEsIGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobGF6eUxpbmspIHtcblx0XHRcdGxhenlMaW5rLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblx0Ly89PT09IC9lbmQgb2YgbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cblx0dmFyIGluVGFnLCBsaW5rQ3R4LCB0YWcsIGksIGwsIGosIGxlbiwgZWxlbXMsIGVsZW0sIHZpZXcsIHZ3SW5mbywgbGlua0luZm8sIHByZXZOb2RlcywgdG9rZW4sIHByZXZWaWV3LCBuZXh0Vmlldyxcblx0XHRub2RlLCB0YWdzLCBkZWVwLCB0YWdOYW1lLCB0YWdDdHgsIHZhbGlkYXRlLCB0YWdEZXB0aCwgZGVwdGgsIGZyYWdtZW50LCBjb3BpZWROb2RlLCBmaXJzdFRhZywgcGFyZW50VGFnLFxuXHRcdGlzVm9pZCwgd3JhcHBlciwgZGl2LCB0b2tlbnMsIGVsQ250LCBwcmV2RWxDbnQsIGh0bWxUYWcsIGlkcywgcHJldklkcywgZm91bmQsIHNraXAsIGxhenlMaW5rLCBpc0xpbmssIGdldCxcblx0XHRzZWxmID0gdGhpcyxcblx0XHR0aGlzSWQgPSBzZWxmLl8uaWQgKyBcIl9cIixcblx0XHRkZWZlciA9IFwiXCIsXG5cdFx0Ly8gVGhlIG1hcmtlciBpZHMgZm9yIHdoaWNoIG5vIHRhZyB3YXMgZW5jb3VudGVyZWQgKGVtcHR5IHZpZXdzIG9yIGZpbmFsIGNsb3NpbmcgbWFya2Vycykgd2hpY2ggd2UgY2Fycnkgb3ZlciB0byBjb250YWluZXIgdGFnXG5cdFx0YmluZEVscyA9IFtdLFxuXHRcdHRhZ1N0YWNrID0gW10sXG5cdFx0ZGVmZXJTdGFjayA9IFtdLFxuXHRcdG9uQWZ0ZXJDcmVhdGUgPSBzZWxmLmhscChvbkFmdGVyQ3JlYXRlU3RyKSxcblx0XHRwcm9jZXNzSW5mb3MgPSBwcm9jZXNzVmlld0luZm9zO1xuXG5cdGlmIChyZWZyZXNoKSB7XG5cdFx0bGF6eUxpbmsgPSByZWZyZXNoLmxhenlMaW5rICYmICQuRGVmZXJyZWQoKTtcblx0XHRpZiAocmVmcmVzaC50bXBsKSB7XG5cdFx0XHQvLyByZWZyZXNoIGlzIHRoZSBwcmV2VmlldywgcGFzc2VkIGluIGZyb20gYWRkVmlld3MoKVxuXHRcdFx0cHJldlZpZXcgPSBcIi9cIiArIHJlZnJlc2guXy5pZCArIFwiX1wiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpc0xpbmsgPSByZWZyZXNoLmxuazsgLy8gVG9wLWxldmVsIGxpbmtpbmdcblx0XHRcdGlmIChyZWZyZXNoLnRhZykge1xuXHRcdFx0XHR0aGlzSWQgPSByZWZyZXNoLnRhZyArIFwiXlwiO1xuXHRcdFx0XHRyZWZyZXNoID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChnZXQgPSByZWZyZXNoLmdldCkge1xuXHRcdFx0XHRwcm9jZXNzSW5mb3MgPSBnZXRWaWV3SW5mb3M7XG5cdFx0XHRcdHRhZ3MgPSBnZXQudGFncztcblx0XHRcdFx0ZGVlcCA9IGdldC5kZWVwO1xuXHRcdFx0XHR0YWdOYW1lID0gZ2V0Lm5hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlZnJlc2ggPSByZWZyZXNoID09PSB0cnVlO1xuXHR9XG5cblx0cGFyZW50Tm9kZSA9IHBhcmVudE5vZGVcblx0XHQ/IChcIlwiICsgcGFyZW50Tm9kZSA9PT0gcGFyZW50Tm9kZVxuXHRcdFx0PyAkKHBhcmVudE5vZGUpWzBdICAvLyBJdCBpcyBhIHN0cmluZywgc28gdHJlYXQgYXMgc2VsZWN0b3Jcblx0XHRcdDogcGFyZW50Tm9kZS5qcXVlcnlcblx0XHRcdFx0PyBwYXJlbnROb2RlWzBdIC8vIEEgalF1ZXJ5IG9iamVjdCAtIHRha2UgZmlyc3QgZWxlbWVudC5cblx0XHRcdFx0OiBwYXJlbnROb2RlKVxuXHRcdDogKHNlbGYucGFyZW50RWxlbSAgICAgIC8vIHZpZXcubGluaygpXG5cdFx0XHR8fCBkb2N1bWVudC5ib2R5KTsgIC8vIGxpbmsobnVsbCwgZGF0YSkgdG8gbGluayB0aGUgd2hvbGUgZG9jdW1lbnRcblxuXHR2YWxpZGF0ZSA9ICEkc3ViU2V0dGluZ3NBZHZhbmNlZC5ub1ZhbGlkYXRlICYmIHBhcmVudE5vZGUuY29udGVudEVkaXRhYmxlICE9PSBUUlVFO1xuXHRwYXJlbnRUYWcgPSBwYXJlbnROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblx0ZWxDbnQgPSAhIWVsQ29udGVudFtwYXJlbnRUYWddO1xuXG5cdHByZXZOb2RlID0gcHJldk5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdG5leHROb2RlID0gbmV4dE5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKG5leHROb2RlLCBlbENudCkgfHwgbnVsbDtcblxuXHRpZiAoaHRtbCAhPSB1bmRlZmluZWQpIHtcblx0XHQvLz09PT09PT09PT09PT09PT0gSW5zZXJ0IGh0bWwgaW50byBET00gdXNpbmcgZG9jdW1lbnRGcmFnbWVudHMgKGFuZCB3cmFwcGluZyBIVE1MIGFwcHJvcHJpYXRlbHkpLiA9PT09PT09PT09PT09PT09XG5cdFx0Ly8gQWxzbyBjb252ZXJ0IG1hcmtlcnMgdG8gRE9NIGFubm90YXRpb25zLCBiYXNlZCBvbiBjb250ZW50IG1vZGVsLlxuXHRcdC8vIENvcnJlc3BvbmRzIHRvIG5leHROb2RlID8gJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIDogJChwYXJlbnROb2RlKS5odG1sKGh0bWwpO1xuXHRcdC8vIGJ1dCBhbGxvd3MgaW5zZXJ0aW9uIHRvIHdyYXAgY29ycmVjdGx5IGV2ZW4gd2l0aCBpbnNlcnRlZCBzY3JpcHQgbm9kZXMuIGpRdWVyeSB2ZXJzaW9uIHdpbGwgZmFpbCBlLmcuIHVuZGVyIHRib2R5IG9yIHNlbGVjdC5cblx0XHQvLyBUaGlzIHZlcnNpb24gc2hvdWxkIGFsc28gYmUgc2xpZ2h0bHkgZmFzdGVyXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR3cmFwcGVyID0gZGl2O1xuXHRcdHByZXZJZHMgPSBpZHMgPSBcIlwiO1xuXHRcdGh0bWxUYWcgPSBwYXJlbnROb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiID8gXCJzdmdfbnNcIiA6IChmaXJzdFRhZyA9IHJGaXJzdEVsZW0uZXhlYyhodG1sKSkgJiYgZmlyc3RUYWdbMV0gfHwgXCJcIjtcblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdC8vIE5vdyBsb29rIGZvciBmb2xsb3dpbmcgdmlldywgYW5kIGZpbmQgaXRzIHRva2Vucywgb3IgaWYgbm90IGZvdW5kLCBnZXQgdGhlIHBhcmVudE5vZGUuX2RmIHRva2Vuc1xuXHRcdFx0bm9kZSA9IG5leHROb2RlO1xuXHRcdFx0d2hpbGUgKG5vZGUgJiYgIShuZXh0VmlldyA9IHZpZXdJbmZvcyhub2RlKSkpIHtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAodG9rZW5zID0gbmV4dFZpZXcgPyBuZXh0Vmlldy5fdGtucyA6IHBhcmVudE5vZGUuX2RmKSB7XG5cdFx0XHRcdHRva2VuID0gcHJldlZpZXcgfHwgXCJcIjtcblx0XHRcdFx0aWYgKHJlZnJlc2ggfHwgIXByZXZWaWV3KSB7XG5cdFx0XHRcdFx0dG9rZW4gKz0gXCIjXCIgKyB0aGlzSWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aiA9IHRva2Vucy5pbmRleE9mKHRva2VuKTtcblx0XHRcdFx0aWYgKGogKyAxKSB7XG5cdFx0XHRcdFx0aiArPSB0b2tlbi5sZW5ndGg7XG5cdFx0XHRcdFx0Ly8gVHJhbnNmZXIgdGhlIGluaXRpYWwgdG9rZW5zIHRvIGluc2VydGVkIG5vZGVzLCBieSBzZXR0aW5nIHRoZW0gYXMgdGhlIGlkcyB2YXJpYWJsZSwgcGlja2VkIHVwIGluIGNvbnZlcnRNYXJrZXJzXG5cdFx0XHRcdFx0cHJldklkcyA9IGlkcyA9IHRva2Vucy5zbGljZSgwLCBqKTtcblx0XHRcdFx0XHR0b2tlbnMgPSB0b2tlbnMuc2xpY2Uoaik7XG5cdFx0XHRcdFx0aWYgKG5leHRWaWV3KSB7XG5cdFx0XHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnROb2RlLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vPT09PT09PT09PT09PT09PSBDb252ZXJ0IHRoZSBtYXJrZXJzIHRvIERPTSBhbm5vdGF0aW9ucywgYmFzZWQgb24gY29udGVudCBtb2RlbC4gPT09PT09PT09PT09PT09PVxuLy9cdFx0XHRvbGRFbENudCA9IGVsQ250O1xuXHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRodG1sID0gKFwiXCIgKyBodG1sKS5yZXBsYWNlKHJDb252ZXJ0TWFya2VycywgY29udmVydE1hcmtlcnMpO1xuLy9cdFx0XHRpZiAoISFvbGRFbENudCAhPT0gISFlbENudCkge1xuLy9cdFx0XHRcdGVycm9yKFwiUGFyc2U6IFwiICsgaHRtbCk7IC8vIFBhcnNlIGVycm9yLiBDb250ZW50IG5vdCB3ZWxsLWZvcm1lZD9cbi8vXHRcdFx0fVxuXHRcdGlmICh2YWxpZGF0ZSAmJiB0YWdTdGFjay5sZW5ndGgpIHtcblx0XHRcdHN5bnRheEVycm9yKFwiTWlzbWF0Y2hlZCAnPFwiICsgcGFyZW50VGFnICsgXCIuLi4+JyBpbjpcXG5cIiArIGh0bWwpOyAvLyBVbm1hdGNoZWQgdGFnXG5cdFx0fVxuXHRcdGlmICh2YWxpZGF0ZU9ubHkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gQXBwZW5kIHdyYXBwZXIgZWxlbWVudCB0byBkb2MgZnJhZ21lbnRcblx0XHRzYWZlRnJhZ21lbnQuYXBwZW5kQ2hpbGQoZGl2KTtcblxuXHRcdC8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnNcblx0XHQvLyBDb3JyZXNwb25kcyB0byBqUXVlcnkgJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIG9yICQocGFyZW50Tm9kZSkuaHRtbChodG1sKTtcblx0XHQvLyBidXQgc3VwcG9ydHMgc3ZnIGVsZW1lbnRzLCBhbmQgb3RoZXIgZmVhdHVyZXMgbWlzc2luZyBmcm9tIGpRdWVyeSB2ZXJzaW9uIChhbmQgdGhpcyB2ZXJzaW9uIHNob3VsZCBhbHNvIGJlIHNsaWdodGx5IGZhc3Rlcilcblx0XHRodG1sVGFnID0gd3JhcE1hcFtodG1sVGFnXSB8fCB3cmFwTWFwLmRpdjtcblx0XHRkZXB0aCA9IGh0bWxUYWdbMF07XG5cdFx0d3JhcHBlci5pbm5lckhUTUwgPSBodG1sVGFnWzFdICsgaHRtbCArIGh0bWxUYWdbMl07XG5cdFx0d2hpbGUgKGRlcHRoLS0pIHtcblx0XHRcdHdyYXBwZXIgPSB3cmFwcGVyLmxhc3RDaGlsZDtcblx0XHR9XG5cdFx0c2FmZUZyYWdtZW50LnJlbW92ZUNoaWxkKGRpdik7XG5cdFx0ZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0d2hpbGUgKGNvcGllZE5vZGUgPSB3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcblx0XHRcdGZyYWdtZW50LmFwcGVuZENoaWxkKGNvcGllZE5vZGUpO1xuXHRcdH1cblx0XHQvLyBJbnNlcnQgaW50byB0aGUgRE9NXG5cdFx0cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIG5leHROb2RlKTtcblx0fVxuXG5cdGlmIChsYXp5TGluaykge1xuXHRcdHNldFRpbWVvdXQoZGF0YUxpbmssIDApO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGFMaW5rKCk7XG5cdH1cblxuXHRyZXR1cm4gbGF6eUxpbmsgJiYgbGF6eUxpbmsucHJvbWlzZSgpO1xufVxuXG5mdW5jdGlvbiBhZGREYXRhQmluZGluZyhsaW5rTWFya3VwLCBub2RlLCBjdXJyZW50VmlldywgYm91bmRUYWdJZCwgaXNMaW5rLCBkYXRhLCBjb250ZXh0KSB7XG5cdC8vIEFkZCBkYXRhIGJpbmRpbmcgZm9yIGRhdGEtbGlua2VkIGVsZW1lbnRzIG9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZ3Ncblx0dmFyIHRtcGwsIHRva2VucywgYXR0ciwgY29udmVydEJhY2ssIHRhZ0V4cHIsIGxpbmtGbiwgbGlua0N0eCwgdGFnLCByVGFnSW5kZXgsIGhhc0Vsc2UsIGxhc3RJbmRleCxcblx0XHRsaW5rRXhwcmVzc2lvbnMgPSBbXTtcblxuXHRpZiAoYm91bmRUYWdJZCkge1xuXHRcdC8vIGJvdW5kVGFnSWQgaXMgYSBzdHJpbmcgZm9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZy4gU28gb25seSBvbmUgbGlua1RhZyBpbiBsaW5rTWFya3VwXG5cdFx0Ly8gZGF0YSBhbmQgY29udGV4dCBwYXJhbWV0ZXJzIGFyZSB1bmRlZmluZWRcblx0XHR0YWcgPSBiaW5kaW5nU3RvcmVbYm91bmRUYWdJZF07XG5cdFx0dGFnID0gdGFnLmxpbmtDdHggPyB0YWcubGlua0N0eC50YWcgOiB0YWc7XG5cblx0XHRsaW5rQ3R4ID0gdGFnLmxpbmtDdHggfHwge1xuXHRcdFx0dHlwZTogXCJpbmxpbmVcIixcblx0XHRcdGRhdGE6IGN1cnJlbnRWaWV3LmRhdGEsICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZVxuXHRcdFx0ZWxlbTogdGFnLl9lbENudCA/IHRhZy5wYXJlbnRFbGVtIDogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHR2aWV3OiBjdXJyZW50Vmlldyxcblx0XHRcdGN0eDogY3VycmVudFZpZXcuY3R4LFxuXHRcdFx0YXR0cjogSFRNTCwgLy8gU2NyaXB0IG1hcmtlciBub2RlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHteeyBhbmQgYWx3YXlzIHRhcmdldCBIVE1MLlxuXHRcdFx0Zm46IHRhZy5fLmJuZCxcblx0XHRcdHRhZzogdGFnLFxuXHRcdFx0Ly8gUGFzcyB0aGUgYm91bmRUYWdJZCBpbiB0aGUgbGlua0N0eCwgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGluIG9ic2VydmVBbmRCaW5kXG5cdFx0XHRfYm5kSWQ6IGJvdW5kVGFnSWRcblx0XHR9O1xuXHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rQ3R4LmZuKTtcblx0fSBlbHNlIGlmIChsaW5rTWFya3VwICYmIG5vZGUpIHtcblx0XHQvLyBJZiBpc0xpbmsgdGhlbiB0aGlzIGlzIGEgdG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb24sIHRhcmdldCwgZGF0YSwgLi4uLikgb3Jcblx0XHQvLyAubGluayh0cnVlLCB0YXJnZXQsIGRhdGEsIC4uLi4pIHNjZW5hcmlvIC0gYW5kIGRhdGEgYW5kIGNvbnRleHQgYXJlIHBhc3NlZCBpbiBzZXBhcmF0ZWx5IGZyb20gdGhlIHZpZXdcblx0XHRkYXRhID0gaXNMaW5rID8gZGF0YSA6IGN1cnJlbnRWaWV3LmRhdGE7XG5cblx0XHQvLyBDb21waWxlZCBsaW5rRm4gZXhwcmVzc2lvbnMgY291bGQgYmUgc3RvcmVkIGluIHRoZSB0bXBsLmxpbmtzIGFycmF5IG9mIHRoZSB0ZW1wbGF0ZVxuXHRcdC8vIFRPRE8gLSBjb25zaWRlciBhbHNvIGNhY2hpbmcgZ2xvYmFsbHkgc28gdGhhdCBpZiB7ezpmb299fSBvciBkYXRhLWxpbms9XCJmb29cIiBvY2N1cnMgaW4gZGlmZmVyZW50IHBsYWNlcyxcblx0XHQvLyB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZm9yIHRoaXMgaXMgY2FjaGVkIGFuZCBvbmx5IGNvbXBpbGVkIG9uY2UuLi5cblx0XHQvL2xpbmtzID0gY3VycmVudFZpZXcubGlua3MgfHwgY3VycmVudFZpZXcudG1wbC5saW5rcztcblxuXHRcdHRtcGwgPSBjdXJyZW50Vmlldy50bXBsO1xuXG4vL1x0XHRcdGlmICghKGxpbmtUYWdzID0gbGlua3NbbGlua01hcmt1cF0pKSB7XG5cdFx0Ly8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGlzIHZpZXcgdGVtcGxhdGUgaGFzIGJlZW4gbGlua2VkLCBzbyB3ZSBjb21waWxlIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSB0ZW1wbGF0ZS5cblxuXHRcdGxpbmtNYXJrdXAgPSBub3JtYWxpemVMaW5rVGFnKGxpbmtNYXJrdXAsIGRlZmF1bHRBdHRyKG5vZGUpKTtcblx0XHRsYXN0SW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4ID0gMDtcblx0XHR3aGlsZSAodG9rZW5zID0gclRhZ0RhdGFsaW5rLmV4ZWMobGlua01hcmt1cCkpIHsgLy8gVE9ETyByZXF1aXJlIH0gdG8gYmUgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAkLCBhbmQgcmVtb3ZlIHRoZSBcXH0oIVxcfSkgb3B0aW9uLlxuXHRcdFx0bGlua0V4cHJlc3Npb25zLnB1c2godG9rZW5zKTtcblx0XHRcdGxhc3RJbmRleCA9IHJUYWdEYXRhbGluay5sYXN0SW5kZXg7XG5cdFx0fVxuXHRcdGlmIChsYXN0SW5kZXggPCBsaW5rTWFya3VwLmxlbmd0aCkge1xuXHRcdFx0c3ludGF4RXJyb3IobGlua01hcmt1cCk7XG5cdFx0fVxuXHRcdHdoaWxlICh0b2tlbnMgPSBsaW5rRXhwcmVzc2lvbnMuc2hpZnQoKSkge1xuXHRcdFx0Ly8gSXRlcmF0ZSBvdmVyIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGZvciBkaWZmZXJlbnQgdGFyZ2V0IGF0dHJzLFxuXHRcdFx0Ly8gZS5nLiA8aW5wdXQgZGF0YS1saW5rPVwiezpmaXJzdE5hbWU6fSB0aXRsZXs+fmRlc2NyaXB0aW9uKGZpcnN0TmFtZSwgbGFzdE5hbWUpfVwiXG5cdFx0XHQvLyB0b2tlbnM6IFthbGwsIGF0dHIsIGJpbmRPbmx5LCB0YWdFeHByLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIGNvbG9uLCBodG1sLCBjb21tZW50LCBjb2RlLCBwYXJhbXNdXG5cdFx0XHRyVGFnSW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4O1xuXHRcdFx0YXR0ciA9IHRva2Vuc1sxXTtcblx0XHRcdHRhZ0V4cHIgPSB0b2tlbnNbM107XG5cdFx0XHR3aGlsZSAobGlua0V4cHJlc3Npb25zWzBdICYmIGxpbmtFeHByZXNzaW9uc1swXVs0XSA9PT0gXCJlbHNlXCIpIHsgLy8gSWYgdGhpcyBpcyB7c29tZVRhZy4uLn0gYW5kIGlzIGZvbGxvd2VkIGJ5IGFuIHtlbHNlLi4ufSBhZGQgdG8gdGFnRXhwclxuXHRcdFx0XHR0YWdFeHByICs9IGRlbGltQ2xvc2VDaGFyMSArIGRlbGltT3BlbkNoYXIwICsgbGlua0V4cHJlc3Npb25zLnNoaWZ0KClbM107XG5cdFx0XHRcdGhhc0Vsc2UgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGhhc0Vsc2UpIHsgLy8gSWYgYW4ge2Vsc2V9IGhhcyBiZWVuIGFkZGVkLCBuZWVkIGFsc28gdG8gYWRkIGNsb3Npbmcge3svc29tZVRhZ319XG5cdFx0XHRcdHRhZ0V4cHIgKz0gZGVsaW1DbG9zZUNoYXIxICsgZGVsaW1PcGVuQ2hhcjAgKyBkZWxpbU9wZW5DaGFyMSArIFwiL1wiICsgdG9rZW5zWzRdICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eCA9IHtcblx0XHRcdFx0dHlwZTogaXNMaW5rID8gXCJ0b3BcIiA6IFwibGlua1wiLFxuXHRcdFx0XHRkYXRhOiBkYXRhLCAvLyBzb3VyY2Vcblx0XHRcdFx0ZWxlbTogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHRcdHZpZXc6IGN1cnJlbnRWaWV3LFxuXHRcdFx0XHRjdHg6IGNvbnRleHQsXG5cdFx0XHRcdGF0dHI6IGF0dHIsXG5cdFx0XHRcdGlzTGs6IGlzTGluaywgLy8gdG9wLWxldmVsIGxpbmtpbmc/XG5cdFx0XHRcdF90b0xrIDogMSwgLy8gRmxhZyB0byBkYXRhLWxpbmsgb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCByZW5kZXJpbmcgY2FsbFxuXHRcdFx0XHRfbm9VcGQgOiB0b2tlbnNbMl0gLy8gRmxhZyBmb3IgZGF0YS1saW5rPVwiXnsuLi59XCIgc28gb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCB3aWxsIGJpbmQsIGJ1dCBub3QgcmVuZGVyKVxuXHRcdFx0fTtcblxuXHRcdFx0Y29udmVydEJhY2sgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodG9rZW5zWzZdKSB7XG5cdFx0XHRcdGNvbnZlcnRCYWNrID0gdG9rZW5zWzEwXSB8fCB1bmRlZmluZWQ7XG5cdFx0XHRcdGxpbmtDdHguY29udmVydCA9IHRva2Vuc1s1XSB8fCBcIlwiO1xuXHRcdFx0XHRpZiAoIWF0dHIgJiYgY29udmVydEJhY2sgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0QXR0cihub2RlKSkge1xuXHRcdFx0XHRcdC8vIERlZmF1bHQgdGFyZ2V0LCBzbyBhbGxvdyAyIHdheSBiaW5kaW5nXG5cdFx0XHRcdFx0bGlua0N0eC5jb252ZXJ0QmFjayA9IGNvbnZlcnRCYWNrID0gY29udmVydEJhY2suc2xpY2UoMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIENvbXBpbGUgdGhlIGxpbmtGbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyBhbmQgYmluZHMgYSBkYXRhLWxpbmsgZXhwcmVzc2lvblxuXHRcdFx0Ly8gVE9ETyAtIG9wdGltaXplIGZvciB0aGUgY2FzZSBvZiBzaW1wbGUgZGF0YSBwYXRoIHdpdGggbm8gY29udmVyc2lvbiwgaGVscGVycywgZXRjLjpcblx0XHRcdC8vICAgICBpLmUuIGRhdGEtbGluaz1cImEuYi5jXCIuIEF2b2lkIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgb2YgRnVuY3Rpb24gZXZlcnkgdGltZS4gQ2FuIHVzZSBhIGRlZmF1bHQgZnVuY3Rpb24gZm9yIGFsbCBvZiB0aGVzZS4uLlxuXG5cdFx0XHRsaW5rQ3R4LmV4cHIgPSBhdHRyICsgdGFnRXhwcjtcblx0XHRcdGxpbmtGbiA9IHRtcGwubGlua3NbdGFnRXhwcl07XG5cdFx0XHRpZiAoIWxpbmtGbikge1xuXHRcdFx0XHR0bXBsLmxpbmtzW3RhZ0V4cHJdID0gbGlua0ZuID0gJHN1Yi50bXBsRm4odGFnRXhwciwgdG1wbCwgdHJ1ZSwgY29udmVydEJhY2ssIGhhc0Vsc2UpO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eC5mbiA9IGxpbmtGbjtcblx0XHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pO1xuXHRcdFx0Ly8gV2Ugc3RvcmUgclRhZ0luZGV4IGluIGxvY2FsIHNjb3BlLCBzaW5jZSB0aGlzIGFkZERhdGFCaW5kaW5nIG1ldGhvZCBjYW4gc29tZXRpbWVzIGJlIGNhbGxlZCByZWN1cnNpdmVseSxcblx0XHRcdC8vIGFuZCBlYWNoIGlzIHVzaW5nIHRoZSBzYW1lIHJUYWdEYXRhbGluayBpbnN0YW5jZS5cblx0XHRcdHJUYWdEYXRhbGluay5sYXN0SW5kZXggPSByVGFnSW5kZXg7XG5cdFx0fVxuLy9cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pIHtcblx0Ly8gQWRkIGRhdGEgbGluayBiaW5kaW5ncyBmb3IgYSBsaW5rIGV4cHJlc3Npb24gaW4gZGF0YS1saW5rIGF0dHJpYnV0ZSBtYXJrdXBcblx0ZnVuY3Rpb24gaGFuZGxlcihldiwgZXZlbnRBcmdzKSB7XG5cdFx0cHJvcGVydHlDaGFuZ2VIYW5kbGVyLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncywgbGlua0ZuKTtcblx0XHQvLyBJZiB0aGUgbGluayBleHByZXNzaW9uIHVzZXMgYSBjdXN0b20gdGFnLCB0aGUgcHJvcGVydHlDaGFuZ2VIYW5kbGVyIGNhbGwgd2lsbCBjYWxsIHJlbmRlclRhZywgd2hpY2ggd2lsbCBzZXQgdGFnQ3R4IG9uIGxpbmtDdHhcblx0fVxuXHRoYW5kbGVyLm5vQXJyYXkgPSB0cnVlO1xuXHRpZiAobGlua0N0eC5pc0xrKSB7XG5cdFx0Ly8gVG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb25PclRydWUsIGRhdGEsIGNvbnRleHQpIC0gc28gd2UgbmVlZCB0byBjcmVhdGUgYSB2aWV3IGZvciB0aGUgbGlua2luZywgd2l0aCB0aGUgZGF0YSBhbmQgY3R4XG5cdFx0Ly8gd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIHRhcmdldC4gTm90ZSB0aGF0IHRoaXMgdmlldyBpcyBub3QgYSBzdGFuZGFyZCBkYXRhLWxpbmtlZCB2aWV3LCBzbyBpdCB3aWxsXG5cdFx0Ly8gYmUgZGlzcG9zZWQgb25seSB3aGVuIGl0cyBwYXJlbnQgdmlldyBpcyBkaXNwb3NlZC5cblx0XHRhZGRMaW5rTWV0aG9kcyhsaW5rQ3R4LnZpZXcgPSBuZXcgJHN1Yi5WaWV3KFxuXHRcdFx0JHN1Yi5leHRlbmRDdHgobGlua0N0eC5jdHgsIGxpbmtDdHgudmlldy5jdHgpLFxuXHRcdFx0XCJsaW5rXCIsIGxpbmtDdHgudmlldywgbGlua0N0eC5kYXRhLCBsaW5rQ3R4LmV4cHIsIHVuZGVmaW5lZCwgYWRkQmluZGluZ01hcmtlcnMpKTtcblx0fVxuXHRsaW5rQ3R4Ll9jdHhDYiA9IGdldENvbnRleHRDYihsaW5rQ3R4LnZpZXcpOyAvLyBfY3R4Q2IgaXMgZm9yIGZpbHRlcmluZy9hcHBlbmRpbmcgdG8gZGVwZW5kZW5jeSBwYXRoczogZnVuY3Rpb24ocGF0aCwgb2JqZWN0KSB7IHJldHVybiBbKG9iamVjdHxwYXRoKSpdfVxuXHRsaW5rQ3R4Ll9oZGwgPSBoYW5kbGVyO1xuXHQvLyBoYW5kbGVyLl9jdHggPSBsaW5rQ3R4OyBDb3VsZCBwYXNzIGxpbmtDdHggZm9yIHVzZSBpbiBhIGRlcGVuZHMgPSBmdW5jdGlvbigpIHt9IGNhbGwsIHNvIGRlcGVuZHMgaXMgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgbGlua0N0eCdzXG5cdGhhbmRsZXIodHJ1ZSk7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09XG4vLyBEYXRhLWxpbmtpbmcgaGVscGVyc1xuLy89PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVtb3ZlU3ViU3RyKHN0ciwgc3Vic3RyKSB7XG5cdHZhciBrO1xuXHRyZXR1cm4gc3RyXG5cdFx0PyAoayA9IHN0ci5pbmRleE9mKHN1YnN0ciksXG5cdFx0XHQoayArIDFcblx0XHRcdFx0PyBzdHIuc2xpY2UoMCwgaykgKyBzdHIuc2xpY2UoayArIHN1YnN0ci5sZW5ndGgpXG5cdFx0XHRcdDogc3RyKSlcblx0XHQ6IFwiXCI7XG59XG5cbmZ1bmN0aW9uIG1hcmtlck5vZGVJbmZvKG5vZGUpIHtcblx0cmV0dXJuIG5vZGUgJiZcblx0XHQoXCJcIiArIG5vZGUgPT09IG5vZGVcblx0XHRcdD8gbm9kZVxuXHRcdFx0OiBub2RlLnRhZ05hbWUgPT09IFNDUklQVFxuXHRcdFx0XHQ/IG5vZGUudHlwZS5zbGljZSgzKVxuXHRcdFx0XHQ6IG5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cikgfHwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHZpZXdJbmZvcyhub2RlLCBpc1ZhbCwgckJpbmRpbmcpIHtcblx0Ly8gVGVzdCB3aGV0aGVyIG5vZGUgaXMgYSBzY3JpcHQgbWFya2VyIG5vZGUsIGFuZCBpZiBzbywgcmV0dXJuIG1ldGFkYXRhXG5cdGZ1bmN0aW9uIGdldEluZm9zKGFsbCwgb3BlbiwgY2xvc2UsIGlkLCBjaCwgZWxQYXRoKSB7XG5cdFx0aW5mb3MucHVzaCh7XG5cdFx0XHRlbENudDogZWxDbnQsXG5cdFx0XHRpZDogaWQsXG5cdFx0XHRjaDogY2gsXG5cdFx0XHRvcGVuOiBvcGVuLFxuXHRcdFx0Y2xvc2U6IGNsb3NlLFxuXHRcdFx0cGF0aDogZWxQYXRoLFxuXHRcdFx0dG9rZW46IGFsbFxuXHRcdH0pO1xuXHR9XG5cdHZhciBlbENudCwgdG9rZW5zLFxuXHRcdGluZm9zID0gW107XG5cdGlmICh0b2tlbnMgPSBpc1ZhbCA/IG5vZGUgOiBtYXJrZXJOb2RlSW5mbyhub2RlKSkge1xuXHRcdGVsQ250ID0gaW5mb3MuZWxDbnQgPSBub2RlLnRhZ05hbWUgIT09IFNDUklQVDtcblx0XHRlbENudCA9IHRva2Vucy5jaGFyQXQoMCkgPT09IFwiQFwiIHx8IGVsQ250O1xuXHRcdGluZm9zLl90a25zID0gdG9rZW5zO1xuXHRcdC8vIHJNYXJrZXJUb2tlbnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShbX15dKShbLStAXFxkXSspPy9nO1xuXHRcdHRva2Vucy5yZXBsYWNlKHJCaW5kaW5nIHx8IHJNYXJrZXJUb2tlbnMsIGdldEluZm9zKTtcblx0XHRyZXR1cm4gaW5mb3M7XG5cdH1cbn1cblxuZnVuY3Rpb24gdW5tYXJrUHJldk9yTmV4dE5vZGUobm9kZSwgZWxDbnQpIHtcblx0aWYgKG5vZGUpIHtcblx0XHRpZiAobm9kZS50eXBlID09PSBcImpzdlwiKSB7XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG5cdFx0fSBlbHNlIGlmIChlbENudCAmJiBub2RlLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikgPT09IFwiXCIpIHtcblx0XHRcdG5vZGUucmVtb3ZlQXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbWFya1ByZXZPck5leHROb2RlKG5vZGUsIGVsQ250KSB7XG5cdHZhciBtYXJrZXIgPSBub2RlO1xuXHR3aGlsZSAoZWxDbnQgJiYgbWFya2VyICYmIG1hcmtlci5ub2RlVHlwZSAhPT0gMSkge1xuXHRcdG1hcmtlciA9IG1hcmtlci5wcmV2aW91c1NpYmxpbmc7XG5cdH1cblx0aWYgKG1hcmtlcikge1xuXHRcdGlmIChtYXJrZXIubm9kZVR5cGUgIT09IDEpIHtcblx0XHRcdC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSB3aWxsIGFkZCBhIHNjcmlwdCBub2RlIGJlZm9yZVxuXHRcdFx0bWFya2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChTQ1JJUFQpO1xuXHRcdFx0bWFya2VyLnR5cGUgPSBcImpzdlwiO1xuXHRcdFx0bm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShtYXJrZXIsIG5vZGUpO1xuXHRcdH0gZWxzZSBpZiAoIW1hcmtlck5vZGVJbmZvKG1hcmtlcikgJiYgIW1hcmtlci5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpKSB7XG5cdFx0XHQvLyBGb3IgZWxlbWVudCBub2Rlcywgd2Ugd2lsbCBhZGQgYSBkYXRhLWxpbmsgYXR0cmlidXRlICh1bmxlc3MgdGhlcmUgaXMgYWxyZWFkeSBvbmUpXG5cdFx0XHQvLyBzbyB0aGF0IHRoaXMgbm9kZSBnZXRzIGluY2x1ZGVkIGluIHRoZSBub2RlIGxpbmtpbmcgcHJvY2Vzcy5cblx0XHRcdG1hcmtlci5zZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIsIFwiXCIpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWFya2VyO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMaW5rVGFnKGxpbmtNYXJrdXAsIHR3b3dheSkge1xuXHRsaW5rTWFya3VwID0gJC50cmltKGxpbmtNYXJrdXApLnJlcGxhY2UockVzY2FwZVF1b3RlcywgXCJcXFxcJCZcIik7XG5cdHJldHVybiBsaW5rTWFya3VwLnNsaWNlKC0xKSAhPT0gZGVsaW1DbG9zZUNoYXIwXG5cdC8vIElmIHNpbXBsaWZpZWQgc3ludGF4IGlzIHVzZWQ6IGRhdGEtbGluaz1cImV4cHJlc3Npb25cIiwgY29udmVydCB0byBkYXRhLWxpbms9XCJ7OmV4cHJlc3Npb259XCIsXG5cdC8vIG9yIGZvciBpbnB1dHMsIGRhdGEtbGluaz1cIns6ZXhwcmVzc2lvbjp9XCIgZm9yIChkZWZhdWx0KSB0d28td2F5IGJpbmRpbmdcblx0XHQ/IGxpbmtNYXJrdXAgPSBkZWxpbU9wZW5DaGFyMSArIFwiOlwiICsgbGlua01hcmt1cCArICh0d293YXkgPyBcIjpcIiA6IFwiXCIpICsgZGVsaW1DbG9zZUNoYXIwXG5cdFx0OiBsaW5rTWFya3VwO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTWV0aG9kcyBmb3Igdmlld3MgYW5kIHRhZ3Ncbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNhbGxBZnRlckxpbmsodGFnLCBldiwgZXZlbnRBcmdzKSB7XG5cdHZhciBsaW5rZWRFbGVtLCBkaXNwbGF5RWxlbSwgbGlua2VkRWwsIHZhbCwgbCwgbGlua2VkVGFnLCBvbGRUcmlnLCBuZXdUcmlnLCB0YWdQcm9wcywgcHJvcHNFeHByLCBsaW5rZWRFbGVtVmlldywgcHJvcCwgcHJvcERlZixcblx0XHR0YWdDdHggPSB0YWcudGFnQ3R4LFxuXHRcdHZpZXcgPSB0YWdDdHgudmlldyxcblx0XHRwcm9wcyA9IHRhZ0N0eC5wcm9wcyxcblx0XHRsaW5rQ3R4ID0gdGFnLmxpbmtDdHg7XG5cblx0aWYgKHRhZy5fLnVubGlua2VkKSB7IC8vIEZpcnN0IGNhbGwgdG8gb25BZnRlckxpbmssIG9yIGZpcnN0IGNhbGwgYWZ0ZXIgb25VcGRhdGU6IHVwZGF0ZUNvbnRlbnQuIEluaXRpYWxpemUgYW5kIGNhbGwgb25CaW5kIGFuZCBzZXQgcHJvcGVydGllc1xuXHRcdGlmICh0YWcubGlua2VkRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBsaW5rZWRFbGVtZW50OiAtIHNlbGVjdG9yIGZvciBpZGVudGlmeWluZyBsaW5rZWQgZWxlbWVudCBpbiB0ZW1wbGF0ZS9yZW5kZXJlZCBjb250ZW50XG5cdFx0XHR0YWcubGlua2VkRWxlbSA9IHRhZy5fLmlubGluZSA/IHRhZy5jb250ZW50cyh0cnVlLCB0YWcubGlua2VkRWxlbWVudCB8fCBcIipcIikuZmlyc3QoKSA6ICQobGlua0N0eC5lbGVtKTtcblx0XHR9XG5cdFx0aWYgKHRhZy5vbkJpbmQpIHtcblx0XHRcdHRhZy5vbkJpbmQodGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4LCBldiwgZXZlbnRBcmdzKTtcblx0XHR9XG5cdH1cblxuXHRpZiAodGFnLm9uQWZ0ZXJMaW5rKSB7XG5cdFx0dGFnLm9uQWZ0ZXJMaW5rKHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgZXYsIGV2ZW50QXJncyk7XG5cdH1cblxuXHRsaW5rZWRFbGVtID0gdGFnLnRhcmdldFRhZyA/IHRhZy50YXJnZXRUYWcubGlua2VkRWxlbSA6IHRhZy5saW5rZWRFbGVtO1xuXHRkaXNwbGF5RWxlbSA9IHRhZy5kaXNwbGF5RWxlbSB8fCBsaW5rZWRFbGVtO1xuXG5pZiAobGlua2VkRWxlbSAmJiBsaW5rZWRFbGVtWzBdKSB7XG5cdFx0aWYgKCF0YWcuXy5jaGdpbmcpIHtcblx0XHRcdHZhbCA9IHRhZy5jdnRBcmdzKClbMF07XG5cdFx0XHRsID0gbGlua2VkRWxlbS5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdGxpbmtlZEVsID0gbGlua2VkRWxlbVtsXTtcblx0XHRcdFx0aWYgKHRhZy5fLnVubGlua2VkICYmIGxpbmtlZEVsICE9PSBsaW5rQ3R4LmVsZW0pIHtcblx0XHRcdFx0XHRsaW5rZWRUYWcgPSBsaW5rZWRFbC5fanN2TGtFbDtcblx0XHRcdFx0XHRpZiAodGFnLl8uaW5saW5lICYmICghbGlua2VkVGFnIHx8IGxpbmtlZFRhZyAhPT0gdGFnICYmIGxpbmtlZFRhZy50YXJnZXRUYWcgIT09IHRhZykpIHtcblx0XHRcdFx0XHRcdC8vIEZvciBkYXRhLWxpbmtlZCB0YWdzLCBpZGVudGlmeSB0aGUgbGlua2VkRWwgd2l0aCB0aGUgdGFnLCBmb3IgXCJ0b1wiIGJpbmRpbmdcblx0XHRcdFx0XHRcdC8vIChGb3IgZGF0YS1saW5rZWQgZWxlbWVudHMsIGlmIG5vdCB5ZXQgYm91bmQsIHdlIGlkZW50aWZ5IGxhdGVyIHdoZW4gdGhlIGxpbmtDdHguZWxlbSBpcyBib3VuZClcblx0XHRcdFx0XHRcdGxpbmtlZEVsLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRcdFx0YmluZFRvKGJpbmRpbmdTdG9yZVt0YWcuX3RnSWRdLCB0YWcsIGxpbmtlZEVsKTtcblx0XHRcdFx0XHRcdGxpbmtlZEVsLl9qc3ZCbmQgPSBcIiZcIiArIHRhZy5fdGdJZCArIFwiK1wiOyAvLyBBZGQgYSBcIitcIiBmb3IgY2xvbmVkIGJpbmRpbmcgLSBzbyByZW1vdmluZ1xuXHRcdFx0XHRcdFx0Ly8gZWxlbXMgd2l0aCBjbG9uZWQgYmluZGluZ3Mgd2lsbCBub3QgcmVtb3ZlIHRoZSAncGFyZW50JyBiaW5kaW5nIGZyb20gdGhlIGJpbmRpbmdTdG9yZS5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtlZEVsLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGlmIChsaW5rZWRFbC50eXBlID09PSBDSEVDS0JPWCkge1xuXHRcdFx0XHRcdFx0XHRsaW5rZWRFbFtDSEVDS0VEXSA9IHZhbCAmJiB2YWwgIT09IFwiZmFsc2VcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobGlua2VkRWwudHlwZSA9PT0gUkFESU8pIHtcblx0XHRcdFx0XHRcdFx0bGlua2VkRWxbQ0hFQ0tFRF0gPSAobGlua2VkRWwudmFsdWUgPT09IHZhbCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRsaW5rZWRFbC52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpbmtlZEVsLmNvbnRlbnRFZGl0YWJsZSA9PT0gVFJVRSkge1xuXHRcdFx0XHRcdFx0bGlua2VkRWwuaW5uZXJIVE1MID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsaW5rQ3R4Ll92YWwgPSB2YWw7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BzLm5hbWUpIHtcblx0XHRcdFx0XHRsaW5rZWRFbC5uYW1lID0gbGlua2VkRWwubmFtZSB8fCBwcm9wcy5uYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0YWcuc2V0U2l6ZSkge1xuXHRcdFx0aWYgKHByb3BzLmhlaWdodCkge1xuXHRcdFx0XHRkaXNwbGF5RWxlbS5oZWlnaHQocHJvcHMuaGVpZ2h0KTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wcy53aWR0aCkge1xuXHRcdFx0XHRkaXNwbGF5RWxlbS53aWR0aChwcm9wcy53aWR0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChwcm9wcy50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRkaXNwbGF5RWxlbS5hdHRyKFwidGl0bGVcIiwgcHJvcHMudGl0bGUpO1xuXHRcdH1cblx0XHRpZiAocHJvcHNbXCJjbGFzc1wiXSkge1xuXHRcdFx0Ly8gVGhpcyBjb2RlIHN1cHBvcnRzIGR5bmFtaWMgYmluZGluZyB0byBjbGFzcyAtIHdoZXJlIGl0IGFkZHMgdGhlIGNsYXNzIGlmIGFic2VudCwgYW5kIHJlbW92ZXMvYWRkcyBpZiBhIHByZXZpb3VzIHZhbHVlIGlzIHByZXNlbnRcblx0XHRcdGlmIChldmVudEFyZ3MgJiYgZGlzcGxheUVsZW0uaGFzQ2xhc3MoZXZlbnRBcmdzLm9sZFZhbHVlKSkge1xuXHRcdFx0XHRkaXNwbGF5RWxlbS5yZW1vdmVDbGFzcyhldmVudEFyZ3Mub2xkVmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0ZGlzcGxheUVsZW0uYWRkQ2xhc3MocHJvcHNbXCJjbGFzc1wiXSk7XG5cdFx0fVxuXHRcdGlmIChwcm9wcy5pZCkge1xuXHRcdFx0bGlua2VkRWxlbVswXS5pZCA9IHByb3BzLmlkO1xuXHRcdH1cblx0fVxuXHR0YWcuXy51bmxpbmtlZCA9IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXN5bmNFbGVtQ2hhbmdlSGFuZGxlcihldikge1xuXHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdGVsZW1DaGFuZ2VIYW5kbGVyKGV2KTtcblx0fSwgMCk7XG59XG5cbmZ1bmN0aW9uIGJpbmRFbENoYW5nZSgkZWxlbSwgdHJpZywgb25vZmYpIHtcblx0aWYgKHRyaWcpIHtcblx0XHR0cmlnID0gXCJcIiArIHRyaWcgPT09IHRyaWcgPyB0cmlnIDogXCJrZXlkb3duXCI7IC8vIFNldCB0cmlnZ2VyIHRvICh0cnVlIHx8IHRydWV5IG5vbi1zdHJpbmcgKGUuZy4gMSkgfHwgJ2tleWRvd24nKTogR2V0ICdrZXlkb3duJyB3aXRoIGFzeW5jXG5cdFx0JGVsZW1bb25vZmZdKHRyaWcsIHRyaWcgPT09IFwia2V5ZG93blwiID8gYXN5bmNFbGVtQ2hhbmdlSGFuZGxlciA6IGVsZW1DaGFuZ2VIYW5kbGVyKTtcblx0fVxufVxuXG5mdW5jdGlvbiBiaW5kVG8oYmluZGluZywgdGFnLCBsaW5rZWRFbGVtLCBjdnRCaykge1xuXHQvLyBUd28td2F5IGJpbmRpbmcuXG5cdC8vIFdlIHNldCB0aGUgYmluZGluZy50b1sxXSB0byBiZSB0aGUgY3Z0QmFjaywgYW5kIGJpbmRpbmcudG9bMF0gdG8gYmUgZWl0aGVyIHRoZSBwYXRoIHRvIHRoZSB0YXJnZXQsIG9yIFtvYmplY3QsIHBhdGhdIHdoZXJlIHRoZSB0YXJnZXQgaXMgdGhlIHBhdGggb24gdGhlIHByb3ZpZGVkIG9iamVjdC5cblx0Ly8gU28gZm9yIGEgY29tcHV0ZWQgcGF0aCB3aXRoIGFuIG9iamVjdCBjYWxsOiBhLmIuZ2V0T2JqZWN0KCkuZC5lLCB0aGVuIHdlIHNldCB0b1swXSB0byBiZSBbZXhwck9iLCBcImQuZVwiXSwgYW5kIHdlIGJpbmQgdG8gdGhlIHBhdGggb24gdGhlIHJldHVybmVkIG9iamVjdCwgZXhwck9iLm9iLCBhcyB0YXJnZXRcblx0Ly8gT3RoZXJ3aXNlIG91ciB0YXJnZXQgaXMgdGhlIGZpcnN0IHBhdGgsIHBhdGhzWzBdLCB3aGljaCB3ZSB3aWxsIGNvbnZlcnQgd2l0aCBjb250ZXh0Q2IoKSBmb3IgcGF0aHMgbGlrZSB+YS5iLmMgb3IgI3gueS56XG5cblx0dmFyIGJpbmR0bywgcGF0aEluZGV4LCBwYXRoLCBsYXN0UGF0aCwgYmluZHRvT2IsICRsaW5rZWRFbGVtLCBuZXdUcmlnLCBvbGRUcmlnLCB0bywgbCwgdG90cnksXG5cdFx0bGlua0N0eCA9IGJpbmRpbmcubGlua0N0eCxcblx0XHRzb3VyY2UgPSBsaW5rQ3R4LmRhdGEsXG5cdFx0cGF0aHMgPSBsaW5rQ3R4LmZuLnBhdGhzO1xuXG5cdHRhZyA9IHRhZyB8fCBsaW5rZWRFbGVtLl9qc3ZMa0VsO1xuXG5cdFx0aWYgKGJpbmRpbmcgJiYgcGF0aHMgJiYgIWJpbmRpbmcudG8pIHtcblx0XHRvbGRUcmlnID0gbGlua2VkRWxlbS5fanN2VHIgfHwgZmFsc2U7XG5cdFx0aWYgKHRhZykge1xuXHRcdFx0Y3Z0QmsgPSB0YWcuY29udmVydEJhY2sgfHwgY3Z0Qms7XG5cdFx0XHRuZXdUcmlnID0gdGFnLnRhZ0N0eC5wcm9wcy50cmlnZ2VyO1xuXHRcdH1cblx0XHRuZXdUcmlnID0gbmV3VHJpZyA9PT0gdW5kZWZpbmVkID8gJHN1YlNldHRpbmdzLnRyaWdnZXIgOiBuZXdUcmlnO1xuXHRcdC8vIFRyaWdnZXIgaXMgbm9vcCBleGNlcHQgZm9yIHRleHQgYm94LCB0ZXh0YXJlYSwgY29udGVudGVkaXRhYmxlLi4uXG5cdFx0bmV3VHJpZyA9IG5ld1RyaWcgJiYgKGxpbmtlZEVsZW0udGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmIGxpbmtlZEVsZW0udHlwZSAhPT0gQ0hFQ0tCT1ggJiYgbGlua2VkRWxlbS50eXBlICE9PSBSQURJTyB8fCBsaW5rZWRFbGVtLnR5cGUgPT09IFwidGV4dGFyZWFcIiB8fCBsaW5rZWRFbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gVFJVRSkgJiYgbmV3VHJpZyB8fCBmYWxzZTtcblxuXHRcdGlmIChvbGRUcmlnICE9PSBuZXdUcmlnKSB7XG5cdFx0XHQkbGlua2VkRWxlbSA9ICQobGlua2VkRWxlbSk7XG5cdFx0XHRiaW5kRWxDaGFuZ2UoJGxpbmtlZEVsZW0sIG9sZFRyaWcsIFwib2ZmXCIpO1xuXHRcdFx0YmluZEVsQ2hhbmdlKFxuXHRcdFx0XHQkbGlua2VkRWxlbSxcblx0XHRcdFx0bGlua2VkRWxlbS5fanN2VHIgPSBuZXdUcmlnLFxuXHRcdFx0XHRcIm9uXCJcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cGF0aHMgPSAoYmluZHRvID0gcGF0aHMuX2pzdnRvKSB8fCBwYXRoc1swXTtcblx0XHRwYXRoSW5kZXggPSBwYXRocyAmJiBwYXRocy5sZW5ndGg7XG5cdFx0aWYgKHBhdGhJbmRleCAmJiAoIXRhZyB8fCB0YWcudGFnQ3R4LmFyZ3MubGVuZ3RoKSkge1xuXHRcdFx0bGFzdFBhdGggPSBwYXRoc1twYXRoSW5kZXggLSAxXTtcblx0XHRcdGlmIChsYXN0UGF0aC5fanN2KSB7XG5cdFx0XHRcdGJpbmR0b09iID0gbGFzdFBhdGg7XG5cdFx0XHRcdHdoaWxlIChsYXN0UGF0aC5zYiAmJiBsYXN0UGF0aC5zYi5fanN2KSB7XG5cdFx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoID0gbGFzdFBhdGguc2I7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoLnNiIHx8IHBhdGggJiYgcGF0aC5wYXRoO1xuXHRcdFx0XHRsYXN0UGF0aCA9IHBhdGggPyBwYXRoLnNsaWNlKDEpIDogYmluZHRvT2IucGF0aDtcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoKSB7XG5cdFx0XHRcdHRvID0gW1xuXHRcdFx0XHRcdFx0YmluZHRvT2IsIC8vICdleHByT2InIGZvciB0aGlzIGV4cHJlc3Npb24gYW5kIHZpZXctYmluZGluZy4gU28gYmluZHRvT2Iub2IgaXMgY3VycmVudCBvYmplY3QgcmV0dXJuZWQgYnkgZXhwcmVzc2lvbi5cblx0XHRcdFx0XHRcdGxhc3RQYXRoXG5cdFx0XHRcdFx0XTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlICgodG90cnkgPSBsaW5rQ3R4Ll9jdHhDYihwYXRoID0gbGFzdFBhdGguc3BsaXQoXCJeXCIpLmpvaW4oXCIuXCIpLCBzb3VyY2UpKSAmJiAobCA9IHRvdHJ5Lmxlbmd0aCkpIHtcblx0XHRcdFx0XHQvLyBSZWN1cnNpdmVseSBkZXJlZmVyZW5jZSBhbnkgfmZvbyBvciAjYmFyIHRva2VucyBpbiB0aGUgcGF0aC4gKFJlY3Vyc2l2ZSBiZWNhdXNlIH5mb28gbWF5IGJlIGEgY29udGV4dHVhbCBwYXJhbSB3aGljaCBoYXNcblx0XHRcdFx0XHQvLyBpdHMgb3duIGRlcGVuZGVuY2llcyBvbiBvdGhlciB+Zm9vICNiYXIgY29tcG9uZW50cylcblx0XHRcdFx0XHR0byA9IHRvdHJ5O1xuXHRcdFx0XHRcdGlmICh0by5fY3ApIHsgLy8gVHdvLXdheSBiaW5kaW5nIHRvIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIgcmVmZXJlbmNlLCB+Zm9vIChkZWNsYXJlZCBhcyB+Zm9vPWV4cHIgb24gYSBwYXJlbnQgdGFnKVxuXHRcdFx0XHRcdFx0dG8gPSBbdG9bbC0zXSwgdG9bbC0yXV07XG5cdFx0XHRcdFx0XHRsYXN0UGF0aCA9IHRvWzFdO1xuXHRcdFx0XHRcdFx0aWYgKGxhc3RQYXRoLl9qc3YpIHtcblx0XHRcdFx0XHRcdFx0YmluZHRvT2IgPSBsYXN0UGF0aDtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKGxhc3RQYXRoLnNiICYmIGxhc3RQYXRoLnNiLl9qc3YpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoID0gbGFzdFBhdGggPSBsYXN0UGF0aC5zYjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRwYXRoID0gbGFzdFBhdGguc2IgfHwgcGF0aCAmJiBwYXRoLnBhdGg7XG5cdFx0XHRcdFx0XHRcdGxhc3RQYXRoID0gcGF0aCA/IHBhdGguc2xpY2UoMSkgOiBiaW5kdG9PYi5wYXRoO1xuXHRcdFx0XHRcdFx0XHR0byA9IFtcblx0XHRcdFx0XHRcdFx0XHRiaW5kdG9PYiwgLy8gJ2V4cHJPYicgZm9yIHRoaXMgZXhwcmVzc2lvbiBhbmQgdmlldy1iaW5kaW5nLiBTbyBiaW5kdG9PYi5vYiBpcyBjdXJyZW50IG9iamVjdCByZXR1cm5lZCBieSBleHByZXNzaW9uLlxuXHRcdFx0XHRcdFx0XHRcdGxhc3RQYXRoXG5cdFx0XHRcdFx0XHRcdF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHsgLy8gVHdvLXdheSBiaW5kaW5nIHRvIGEgaGVscGVyIC0gZS5nLiB+YWRkcmVzcy5zdHJlZXQsIG9yIGNvbXB1dGVkLCBlLmcuIH5mdWxsTmFtZSgpLCBvciB2aWV3IHByb3BlcnR5IGUuZy4gI2RhdGEuZm9vXG5cdFx0XHRcdFx0XHR0byA9IGw+MlxuXHRcdFx0XHRcdFx0XHQ/IFt0b1tsLTNdLCB0b1tsLTJdXSAvLyBXaXRoIHBhdGg6IFtvYmplY3QsIHBhdGhdXG5cdFx0XHRcdFx0XHRcdDogW3RvW2wtMl1dOyAgICAgICAgIC8vIE5vIHBhdGgsIChlLmcuIFtmdW5jdGlvbl0gZm9yIGNvbXB1dGVkIHdpdGggc2V0dGVyKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzb3VyY2UgPSB0b1swXTtcblx0XHRcdFx0XHRsYXN0UGF0aCA9IHRvWzFdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRvID0gdG8gfHwgW3NvdXJjZSwgcGF0aF07IC8vIFR3byB3YXkgYmluZGluZyB0byBhbiBvYmplY3QgKG5laXRoZXIgfmZvbyBub3IgI2Jhcilcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dG8gPSBbXTtcblx0XHR9XG5cdFx0YmluZGluZy50byA9IFtcblx0XHRcdHRvLFxuXHRcdFx0Y3Z0Qmtcblx0XHRdO1xuXHR9XG59XG5cbmZ1bmN0aW9uIG1lcmdlQ3R4cyh0YWcsIG5ld0N0eHMsIHJlcGxhY2UpIHsgLy8gTWVyZ2UgdXBkYXRlZCB0YWdDdHhzIGludG8gdGFnLnRhZ0N0eHNcblx0dmFyIHRhZ0N0eCwgbmV3VGFnQ3R4LFxuXHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXcsXG5cdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzIHx8IFt0YWcudGFnQ3R4XSxcblx0XHRsID0gdGFnQ3R4cy5sZW5ndGgsXG5cdFx0cmVmcmVzaCA9ICFuZXdDdHhzO1xuXG5cdG5ld0N0eHMgPSBuZXdDdHhzIHx8IHRhZy5fLmJuZC5jYWxsKHZpZXcudG1wbCwgKHRhZy5saW5rQ3R4IHx8IHZpZXcpLmRhdGEsIHZpZXcsICRzdWIpO1xuXG5cdGlmIChyZXBsYWNlKSB7XG5cdFx0Ly8gUmVwbGFjZSBwcmV2aW91cyB0YWdDdHhzIGJ5IG5ldyBvbmVzLCByYXRoZXIgdGhhbiBtZXJnaW5nXG5cdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzID0gbmV3Q3R4cztcblx0XHR0YWcudGFnQ3R4ID0gdGFnQ3R4c1swXTtcblx0fSBlbHNlIHtcblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHR0YWdDdHggPSB0YWdDdHhzW2xdO1xuXHRcdFx0bmV3VGFnQ3R4ID0gbmV3Q3R4c1tsXTtcblx0XHRcdCRvYnNlcnZhYmxlKHRhZ0N0eC5wcm9wcykuc2V0UHJvcGVydHkobmV3VGFnQ3R4LnByb3BzKTtcblx0XHRcdCRleHRlbmQodGFnQ3R4LmN0eCwgbmV3VGFnQ3R4LmN0eCk7IC8vIFdlIGRvbid0IHN1cHBvcnQgcHJvcGFnYXRpbmcgY3R4IHZhcmlhYmxlcywgfmZvbywgb2JzZXJ2YWJseSwgdG8gbmVzdGVkIHZpZXdzLiBTbyBleHRlbmQsIG5vdCBzZXRQcm9wZXJ0eS4uLlxuXHRcdFx0dGFnQ3R4LmFyZ3MgPSBuZXdUYWdDdHguYXJncztcblx0XHRcdGlmIChyZWZyZXNoKSB7XG5cdFx0XHRcdHRhZ0N0eC50bXBsID0gbmV3VGFnQ3R4LnRtcGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdCRzdWIuX3Rocyh0YWcsIHRhZ0N0eHNbMF0pOyAvLyB0YWdIYW5kbGVyc0Zyb21Qcm9wc1xuXHRyZXR1cm4gdGFnQ3R4cztcbn1cblxuLy89PT09PT09PT1cbi8vIERpc3Bvc2FsXG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBjbGVhbihlbGVtcykge1xuXHQvLyBSZW1vdmUgZGF0YS1saW5rIGJpbmRpbmdzLCBvciBjb250YWluZWQgdmlld3Ncblx0dmFyIGwsIGVsZW0sIGJpbmRpbmdzLFxuXHRcdGVsZW1BcnJheSA9IFtdLFxuXHRcdGxlbiA9IGVsZW1zLmxlbmd0aCxcblx0XHRpID0gbGVuO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0Ly8gQ29weSBpbnRvIGFuIGFycmF5LCBzbyB0aGF0IGRlbGV0aW9uIG9mIG5vZGVzIGZyb20gRE9NIHdpbGwgbm90IGNhdXNlIG91ciAnaScgY291bnRlciB0byBnZXQgc2hpZnRlZFxuXHRcdC8vIChOb3RlOiBUaGlzIHNlZW1zIGFzIGZhc3Qgb3IgZmFzdGVyIHRoYW4gZWxlbUFycmF5ID0gW10uc2xpY2UuY2FsbChlbGVtcyk7IC4uLilcblx0XHRlbGVtQXJyYXkucHVzaChlbGVtc1tpXSk7XG5cdH1cblx0aSA9IGxlbjtcblx0d2hpbGUgKGktLSkge1xuXHRcdGVsZW0gPSBlbGVtQXJyYXlbaV07XG5cdFx0aWYgKGVsZW0ucGFyZW50Tm9kZSkge1xuXHRcdFx0Ly8gSGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBET01cblx0XHRcdGlmIChiaW5kaW5ncyA9IGVsZW0uX2pzdkJuZCkge1xuXHRcdFx0XHQvLyBHZXQgcHJvcGVydHlDaGFuZ2UgYmluZGluZ3MgZm9yIHRoaXMgZWxlbWVudFxuXHRcdFx0XHQvLyBUaGlzIG1heSBiZSBhbiBlbGVtZW50IHdpdGggZGF0YS1saW5rLCBvciB0aGUgb3BlbmluZyBzY3JpcHQgbWFya2VyIG5vZGUgZm9yIGEgZGF0YS1saW5rZWQgdGFnIHteey4uLn19XG5cdFx0XHRcdC8vIGJpbmRpbmdzIGlzIGEgc3RyaW5nIHdpdGggdGhlIHN5bnRheDogXCIoJmJpbmRpbmdJZCkqXCJcblx0XHRcdFx0YmluZGluZ3MgPSBiaW5kaW5ncy5zbGljZSgxKS5zcGxpdChcIiZcIik7XG5cdFx0XHRcdGVsZW0uX2pzdkJuZCA9IFwiXCI7XG5cdFx0XHRcdGwgPSBiaW5kaW5ncy5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHQvLyBSZW1vdmUgYXNzb2NpYXRlZCBiaW5kaW5nc1xuXHRcdFx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRpbmdzW2xdLCBlbGVtLl9qc3ZMa0VsLCBlbGVtKTsgLy8gdW5iaW5kIGJpbmRpbmdzIHdpdGggdGhpcyBiaW5kaW5nSWQgb24gdGhpcyB2aWV3XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGRpc3Bvc2VUb2tlbnMobWFya2VyTm9kZUluZm8oZWxlbSkgKyAoZWxlbS5fZGYgfHwgXCJcIikpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiByZW1vdmVWaWV3QmluZGluZyhiaW5kSWQsIGxpbmtlZEVsZW1UYWcsIGVsZW0pIHtcblx0Ly8gVW5iaW5kXG5cdHZhciBvYmpJZCwgbGlua0N0eCwgdGFnLCBvYmplY3QsIG9ic0lkLCB0YWdDdHhzLCBsLCBtYXAsICRsaW5rZWRFbGVtLCBsaW5rZWRFbGVtLCB0cmlnZ2VyLCB2aWV3LCB0YXJnZXRUYWcsXG5cdFx0YmluZGluZyA9IGJpbmRpbmdTdG9yZVtiaW5kSWRdO1xuXG5cdGlmIChsaW5rZWRFbGVtVGFnKSB7XG5cdFx0bGlua2VkRWxlbVRhZyA9IGxpbmtlZEVsZW1UYWcudGFyZ2V0VGFnIHx8IGxpbmtlZEVsZW1UYWc7XG5cdFx0ZWxlbS5fanN2TGtFbCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChiaW5kaW5nKSB7XG5cdFx0ZGVsZXRlIGJpbmRpbmdTdG9yZVtiaW5kSWRdOyAvLyBEZWxldGUgYWxyZWFkeSwgc28gY2FsbCB0byBvbkRpc3Bvc2UgaGFuZGxlciBiZWxvdyBjYW5ub3QgdHJpZ2dlciByZWN1cnNpdmUgZGVsZXRpb24gKHRocm91Z2ggcmVjdXJzaXZlIGNhbGwgdG8galF1ZXJ5IGNsZWFuRGF0YSlcblx0XHRmb3IgKG9iaklkIGluIGJpbmRpbmcuYm5kKSB7XG5cdFx0XHRvYmplY3QgPSBiaW5kaW5nLmJuZFtvYmpJZF07XG5cdFx0XHRvYnNJZCA9IGJpbmRpbmcuY2JJZDtcblx0XHRcdGlmICgkaXNBcnJheShvYmplY3QpKSB7XG5cdFx0XHRcdCQoW29iamVjdF0pLm9mZihhcnJheUNoYW5nZVN0ciArIG9ic0lkKS5vZmYocHJvcGVydHlDaGFuZ2VTdHIgKyBvYnNJZCk7IC8vIFRoZXJlIG1heSBiZSBlaXRoZXIgb3IgYm90aCBvZiBhcnJheUNoYW5nZSBhbmQgcHJvcGVydHlDaGFuZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCQob2JqZWN0KS5vZmYocHJvcGVydHlDaGFuZ2VTdHIgKyBvYnNJZCk7XG5cdFx0XHR9XG5cdFx0XHRkZWxldGUgYmluZGluZy5ibmRbb2JqSWRdO1xuXHRcdH1cblxuXHRcdGlmIChsaW5rQ3R4ID0gYmluZGluZy5saW5rQ3R4KSB7XG5cdFx0XHRpZiAodGFnID0gbGlua0N0eC50YWcpIHtcblx0XHRcdFx0aWYgKHRhZ0N0eHMgPSB0YWcudGFnQ3R4cykge1xuXHRcdFx0XHRcdGwgPSB0YWdDdHhzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdFx0XHRpZiAobWFwID0gdGFnQ3R4c1tsXS5tYXApIHtcblx0XHRcdFx0XHRcdFx0bWFwLnVubWFwKCk7IC8vdW5vYnNlcnZlXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdCRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW07XG5cblx0XHRcdFx0aWYgKHRhZy5vblVuYmluZCkge1xuXHRcdFx0XHRcdHRhZy5vblVuYmluZCh0YWcudGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4LCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGFnLm9uRGlzcG9zZSkge1xuXHRcdFx0XHRcdHRhZy5vbkRpc3Bvc2UoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghdGFnLl9lbENudCkge1xuXHRcdFx0XHRcdGlmICh0YWcuX3Bydikge1xuXHRcdFx0XHRcdFx0dGFnLl9wcnYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YWcuX3Bydik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0YWcuX254dCkge1xuXHRcdFx0XHRcdFx0dGFnLl9ueHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YWcuX254dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsaW5rZWRFbGVtID0gJGxpbmtlZEVsZW0gJiYgJGxpbmtlZEVsZW1bMF0gfHwgbGlua0N0eC5lbGVtO1xuXG5cdFx0XHRpZiAodHJpZ2dlciA9IGxpbmtlZEVsZW0gJiYgbGlua2VkRWxlbS5fanN2VHIpIHtcblx0XHRcdFx0YmluZEVsQ2hhbmdlKCRsaW5rZWRFbGVtIHx8ICQobGlua2VkRWxlbSksIHRyaWdnZXIsIFwib2ZmXCIpO1xuXHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZUciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHZpZXcgPSBsaW5rQ3R4LnZpZXc7XG5cdFx0XHRpZiAodmlldy50eXBlID09PSBcImxpbmtcIikge1xuXHRcdFx0XHR2aWV3LnBhcmVudC5yZW1vdmVWaWV3cyh2aWV3Ll8ua2V5LCB1bmRlZmluZWQsIHRydWUpOyAvLyBBIFwibGlua1wiIHZpZXcgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBiaW5kaW5nLCBzbyBzaG91bGQgYmUgZGlzcG9zZWQgd2l0aCBiaW5kaW5nLlxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIHZpZXcuXy5ibmRzW2JpbmRJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGRlbGV0ZSBiaW5kaW5nLnNbYmluZGluZy5jYklkXTtcblx0fVxufVxuXG5mdW5jdGlvbiAkdW5saW5rKHRvKSB7XG5cdGlmICh0bykge1xuXHRcdHRvID0gdG8uanF1ZXJ5ID8gdG8gOiAkKHRvKTtcblx0XHR0by5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGlubmVyVmlldztcblx0XHRcdC8vVE9ETyBmaXggdGhpcyBmb3IgYmV0dGVyIHBlcmYuIFJhdGhlciB0aGF0IGNhbGxpbmcgaW5uZXIgdmlldyBtdWx0aXBsZSB0aW1lcyB3aGljaCBkb2VzIHF1ZXJ5U2VsZWN0b3JBbGwgZWFjaCB0aW1lLCBjb25zaWRlciBhIHNpbmdsZSBxdWVyeVNlbGVjdG9yQWxsXG5cdFx0XHQvLyBvciBzaW1wbHkgY2FsbCB2aWV3LnJlbW92ZVZpZXdzKCkgb24gdGhlIHRvcC1sZXZlbCB2aWV3cyB1bmRlciB0aGUgdGFyZ2V0ICd0bycgbm9kZSwgdGhlbiBjbGVhbiguLi4pXG5cdFx0XHR3aGlsZSAoKGlubmVyVmlldyA9ICR2aWV3KHRoaXMsIHRydWUpKSAmJiBpbm5lclZpZXcucGFyZW50KSB7XG5cdFx0XHRcdGlubmVyVmlldy5wYXJlbnQucmVtb3ZlVmlld3MoaW5uZXJWaWV3Ll8ua2V5LCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0Y2xlYW4odGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikpO1xuXHRcdH0pO1xuXHRcdGNsZWFuKHRvKTtcblx0fSBlbHNlIHtcblx0XHQvLyBDYWxsIHRvICQudW5saW5rKCkgaXMgZXF1aXZhbGVudCB0byAkLnVubGluayh0cnVlLCBcImJvZHlcIilcblx0XHRpZiAoYWN0aXZlQm9keSkge1xuXHRcdFx0JChhY3RpdmVCb2R5KVxuXHRcdFx0XHQub2ZmKGVsZW1lbnRDaGFuZ2VTdHIsIGVsZW1DaGFuZ2VIYW5kbGVyKVxuXHRcdFx0XHQub2ZmKCdibHVyJywgJ1tjb250ZW50ZWRpdGFibGVdJywgZWxlbUNoYW5nZUhhbmRsZXIpO1xuXHRcdFx0YWN0aXZlQm9keSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dG9wVmlldy5yZW1vdmVWaWV3cygpO1xuXHRcdGNsZWFuKGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpKTtcblx0fVxufVxuXG4vLz09PT09PT09XG4vLyBIZWxwZXJzXG4vLz09PT09PT09XG5cbmZ1bmN0aW9uIGdldENvbnRleHRDYih2aWV3KSB7IC8vIFJldHVybiBhIGNhbGxiYWNrIGZvciBhY2Nlc3NpbmcgdGhlIGNvbnRleHQgb2YgYSB0ZW1wbGF0ZS9kYXRhLWxpbmsgZXhwcmVzc2lvbiAtIGFuZCBjb252ZXJ0aW5nIH5mb28sICNmb28gZXRjLlxuXHQvLyBUT0RPIENvbnNpZGVyIGV4cG9zaW5nIG9yIGFsbG93aW5nIG92ZXJyaWRlLCBhcyBwdWJsaWMgQVBJXG5cdHJldHVybiBmdW5jdGlvbihwYXRoLCBvYmplY3QsIGRlcHRoKSB7XG5cdFx0Ly8gVE9ETyBjb25zaWRlciBvbmx5IGNhbGxpbmcgdGhlIGNvbnRleHRDYiBvbiB0aGUgaW5pdGlhbCB0b2tlbiBpbiBwYXRoICd+YS5iLmMnIGFuZCBub3QgY2FsbGluZyBhZ2FpbiBvblxuXHRcdC8vIHRoZSBpbmRpdmlkdWFsIHRva2VucywgJ2EnLCAnYicsICdjJy4uLiBDdXJyZW50bHkgaXQgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzXG5cdFx0dmFyIHRva2VucywgdGFnLCBpdGVtcywgaGVscGVyLCBsYXN0LCBuZXh0UGF0aCwgbDtcblx0XHRpZiAodmlldyAmJiBwYXRoKSB7XG5cdFx0XHRpZiAocGF0aC5fanN2KSB7XG5cdFx0XHRcdHJldHVybiBwYXRoLl9qc3YuY2FsbCh2aWV3LnRtcGwsIG9iamVjdCwgdmlldywgJHN1Yik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5jaGFyQXQoMCkgPT09IFwiflwiKSB7XG5cdFx0XHRcdC8vIFdlIHJldHVybiBuZXcgaXRlbXMgdG8gaW5zZXJ0IGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIFwifmEuYi5jXCIgc3RyaW5nOlxuXHRcdFx0XHQvLyBbaGVscGVyT2JqZWN0ICdhJywgXCJhLmIuY1wiIGN1cnJlbnREYXRhSXRlbV0gc28gY3VycmVudERhdGFJdGVtIGJlY29tZXMgdGhlIG9iamVjdCBmb3Igc3Vic2VxdWVudCBwYXRocy5cblx0XHRcdFx0aWYgKHBhdGguc2xpY2UoMCwgNCkgPT09IFwifnRhZ1wiKSB7XG5cdFx0XHRcdFx0dGFnID0gdmlldy5jdHg7XG5cdFx0XHRcdFx0aWYgKHBhdGguY2hhckF0KDQpID09PSBcIi5cIikge1xuXHRcdFx0XHRcdFx0Ly8gXCJ+dGFnLnh4eFwiXG5cdFx0XHRcdFx0XHR0b2tlbnMgPSBwYXRoLnNsaWNlKDUpLnNwbGl0KFwiLlwiKTtcblx0XHRcdFx0XHRcdHRhZyA9IHRhZy50YWc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0b2tlbnMpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0YWcgPyBbdGFnLCB0b2tlbnMuam9pbihcIi5cIiksIG9iamVjdF0gOiBbXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aCA9IHBhdGguc2xpY2UoMSkuc3BsaXQoXCIuXCIpO1xuXHRcdFx0XHRpZiAoaGVscGVyID0gdmlldy5obHAobGFzdCA9IHBhdGguc2hpZnQoKSwgdHJ1ZSkpIHtcblx0XHRcdFx0XHRpZiAoaGVscGVyLl9jcCkgeyAgLy8gaGVscGVyIGZvciAoY29udGV4dHVhbCBwYXJhbWV0ZXIgfmZvbz0uLi4pIGlzIGFuIGFycmF5IC0gW2RhdGEsIGN0eFBybURlcGVuZGVuY2llcyAuLi5dXG5cdFx0XHRcdFx0XHRpZiAocGF0aC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0bmV4dFBhdGggPSBcIi5cIiArIHBhdGguam9pbihcIi5cIik7XG5cdFx0XHRcdFx0XHRcdGxhc3QgPSBoZWxwZXJbbCA9IGhlbHBlci5sZW5ndGgtMV07XG5cdFx0XHRcdFx0XHRcdGlmIChsYXN0Ll9qc3YpIHtcblx0XHRcdFx0XHRcdFx0XHRsYXN0LnNiID0gbmV4dFBhdGg7XG5cdFx0XHRcdFx0XHRcdFx0bGFzdC5ibmQgPSAhIWRlcHRoO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGhlbHBlcltsXSA9IChsYXN0ICsgbmV4dFBhdGgpLnJlcGxhY2UoXCIjZGF0YS5cIiwgXCJcIik7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGxhc3Quc2xpY2UoMCwgNSkgPT09IFwiI3ZpZXdcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0aGVscGVyW2xdID0gaGVscGVyW2xdLnNsaWNlKDYpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aGVscGVyLnNwbGljZShsLCAwLCB2aWV3KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGhlbHBlci5wdXNoKG9iamVjdCk7XG5cdFx0XHRcdFx0XHRpdGVtcyA9IGhlbHBlcjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhdGgubGVuZ3RoIHx8ICRpc0Z1bmN0aW9uKGhlbHBlcikpIHtcblx0XHRcdFx0XHRcdGl0ZW1zID0gW2hlbHBlciwgcGF0aC5qb2luKFwiLlwiKSwgb2JqZWN0XTsgLy8gMndheSBiaW5kbmcgb24gfmZvby5oZWxwZXJMZWFmUHJvcGVydHkgb3IgfmNvbXB1dGVkKCkgb3IgfmNvbnRleHR1YWxQYXJhbVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaXRlbXMgfHwgW107XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdC8vIFdlIHJldHVybiBuZXcgaXRlbXMgdG8gaW5zZXJ0IGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIFwiI2EuYi5jXCIgc3RyaW5nOiBbdmlldywgXCJhLmIuY1wiIGN1cnJlbnREYXRhSXRlbV1cblx0XHRcdFx0Ly8gc28gY3VycmVudERhdGFJdGVtIGJlY29tZXMgdGhlIG9iamVjdCBmb3Igc3Vic2VxdWVudCBwYXRocy4gVGhlICd0cnVlJyBmbGFnIG1ha2VzIHRoZSBwYXRocyBiaW5kIG9ubHkgdG8gbGVhZiBjaGFuZ2VzLlxuXHRcdFx0XHRyZXR1cm4gcGF0aCA9PT0gXCIjZGF0YVwiID8gW10gOiBbdmlldywgcGF0aC5yZXBsYWNlKHJWaWV3UGF0aCwgXCJcIiksIG9iamVjdF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBpbnB1dEF0dHJpYihlbGVtKSB7XG5cdHJldHVybiBlbGVtLnR5cGUgPT09IENIRUNLQk9YID8gZWxlbVtDSEVDS0VEXSA6IGVsZW0udmFsdWU7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PT09PT09PVxuLy8gSnNSZW5kZXIgaW50ZWdyYXRpb25cbi8vPT09PT09PT09PT09PT09PT09PT09XG5cbiRzdWIub25TdG9yZS50ZW1wbGF0ZSA9IGZ1bmN0aW9uKG5hbWUsIGl0ZW0pIHtcblx0aXRlbS5saW5rID0gdG1wbExpbms7XG5cdGlmIChuYW1lKSB7XG5cdFx0JC5saW5rW25hbWVdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdG1wbExpbmsuYXBwbHkoaXRlbSwgYXJndW1lbnRzKTtcblx0XHR9O1xuXHR9XG59O1xuXG4kc3ViLnZpZXdJbmZvcyA9IHZpZXdJbmZvczsgLy8gRXhwb3NlIHZpZXdJbmZvcygpIGFzIHB1YmxpYyBoZWxwZXIgbWV0aG9kXG5cbi8vIERlZmluZSBKc1ZpZXdzIHZlcnNpb24gb2YgZGVsaW1pdGVycygpLCBhbmQgaW5pdGlhbGl6ZVxuKCR2aWV3c1NldHRpbmdzLmRlbGltaXRlcnMgPSBmdW5jdGlvbigpIHtcblx0Ly8gUnVuIGRlbGltaXRlcnMgaW5pdGlhbGl6YXRpb24gaW4gY29udGV4dCBvZiBqc3JlbmRlci5qc1xuXHR2YXIgcmV0ID0gb2xkSnN2RGVsaW1pdGVycy5hcHBseSgwLCBhcmd1bWVudHMpLFxuXHRcdC8vIE5vdyBzZXQgYWxzbyBkZWxpbU9wZW5DaGFyMCBldGMuIGluIGNvbnRleHQgb2YganF1ZXJ5LnZpZXdzLmpzLi4uXG5cdFx0ZGVsaW1DaGFycyA9ICRzdWJTZXR0aW5ncy5kZWxpbWl0ZXJzO1xuXG5cdGRlbGltT3BlbkNoYXIwID0gZGVsaW1DaGFyc1swXS5jaGFyQXQoMCk7XG5cdGRlbGltT3BlbkNoYXIxID0gZGVsaW1DaGFyc1swXS5jaGFyQXQoMSk7XG5cdGRlbGltQ2xvc2VDaGFyMCA9IGRlbGltQ2hhcnNbMV0uY2hhckF0KDApO1xuXHRkZWxpbUNsb3NlQ2hhcjEgPSBkZWxpbUNoYXJzWzFdLmNoYXJBdCgxKTtcblx0bGlua0NoYXIgPSBkZWxpbUNoYXJzWzJdO1xuXG5cdC8vIERhdGEtbGlua2luZyBtdXN0IHVzZSBuZXcgZGVsaW1pdGVyc1xuXHRyVGFnRGF0YWxpbmsgPSBuZXcgUmVnRXhwKFwiKD86XnxcXFxccyopKFtcXFxcdy1dKikoXFxcXFwiICsgbGlua0NoYXIgKyBcIik/KFxcXFxcIiArIGRlbGltT3BlbkNoYXIxICsgJHN1Yi5yVGFnICsgXCIoOlxcXFx3Kik/XFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCIpXCIsIFwiZ1wiKTtcblx0cmV0dXJuIHJldDtcbn0pKCk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG4kc3ViLmFkZFNldHRpbmcoXCJ0cmlnZ2VyXCIpO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQWRkaXRpb25hbCBtZW1iZXJzIGZvciBsaW5rZWQgdmlld3Ncbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHBhcmVudEVsZW0sIGlkLCB2aWV3T3JUYWdDaGFyLCByZWZyZXNoKSB7XG5cdC8vIFRyYW5zZmVyIHRva2VucyBvbiBwcmV2Tm9kZSBvZiB2aWV3VG9SZW1vdmUvdmlld1RvUmVmcmVzaCB0byBuZXh0Tm9kZSBvciBwYXJlbnRFbGVtLl9kZlxuXHR2YXIgaSwgbCwgdndJbmZvcywgdndJbmZvLCB2aWV3T3JUYWcsIHZpZXdJZCwgdG9rZW5zLFxuXHRcdHByZWNlZGluZ0xlbmd0aCA9IDAsXG5cdFx0ZW1wdHlWaWV3ID0gcHJldk5vZGUgPT09IG5leHROb2RlO1xuXG5cdGlmIChwcmV2Tm9kZSkge1xuXHRcdC8vIHByZXZOb2RlIGlzIGVpdGhlciB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgdmlld09yVGFnLCBvciBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgdndJbmZvcyB0b2tlbnMgc3RyaW5nXG5cdFx0dndJbmZvcyA9IHZpZXdJbmZvcyhwcmV2Tm9kZSkgfHwgW107XG5cdFx0Zm9yIChpID0gMCwgbCA9IHZ3SW5mb3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHQvLyBTdGVwIHRocm91Z2ggdmlld3Mgb3IgdGFncyBvbiB0aGUgcHJldk5vZGVcblx0XHRcdHZ3SW5mbyA9IHZ3SW5mb3NbaV07XG5cdFx0XHR2aWV3SWQgPSB2d0luZm8uaWQ7XG5cdFx0XHRpZiAodmlld0lkID09PSBpZCAmJiB2d0luZm8uY2ggPT09IHZpZXdPclRhZ0NoYXIpIHtcblx0XHRcdFx0aWYgKHJlZnJlc2gpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIHZpZXdPclRhZ1RvUmVmcmVzaCwgdGhpcyBpcyB0aGUgbGFzdCB2aWV3T3JUYWcgdG8gcHJvY2Vzcy4uLlxuXHRcdFx0XHRcdGwgPSAwO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgdmlld09yVGFnVG9SZW1vdmUsIHNvIHdlIGFyZSBkb25lLi4uXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghZW1wdHlWaWV3KSB7XG5cdFx0XHRcdHZpZXdPclRhZyA9IHZ3SW5mby5jaCA9PT0gXCJfXCJcblx0XHRcdFx0XHQ/IHZpZXdTdG9yZVt2aWV3SWRdXG5cdFx0XHRcdFx0OiBiaW5kaW5nU3RvcmVbdmlld0lkXS5saW5rQ3R4LnRhZztcblx0XHRcdFx0aWYgKHZ3SW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0Ly8gQSBcIiNtXCIgdG9rZW5cblx0XHRcdFx0XHR2aWV3T3JUYWcuX3BydiA9IG5leHROb2RlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHZ3SW5mby5jbG9zZSkge1xuXHRcdFx0XHRcdC8vIEEgXCIvbVwiIHRva2VuXG5cdFx0XHRcdFx0dmlld09yVGFnLl9ueHQgPSBuZXh0Tm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJlY2VkaW5nTGVuZ3RoICs9IHZpZXdJZC5sZW5ndGggKyAyO1xuXHRcdH1cblxuXHRcdGlmIChwcmVjZWRpbmdMZW5ndGgpIHtcblx0XHRcdHByZXZOb2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCBwcmV2Tm9kZS5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cikuc2xpY2UocHJlY2VkaW5nTGVuZ3RoKSk7XG5cdFx0fVxuXHRcdHRva2VucyA9IG5leHROb2RlID8gbmV4dE5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpIDogcGFyZW50RWxlbS5fZGY7XG5cdFx0aWYgKGwgPSB0b2tlbnMuaW5kZXhPZihcIi9cIiArIGlkICsgdmlld09yVGFnQ2hhcikgKyAxKSB7XG5cdFx0XHR0b2tlbnMgPSB2d0luZm9zLl90a25zLnNsaWNlKDAsIHByZWNlZGluZ0xlbmd0aCkgKyB0b2tlbnMuc2xpY2UobCArIChyZWZyZXNoID8gLTEgOiBpZC5sZW5ndGggKyAxKSk7XG5cdFx0fVxuXHRcdGlmICh0b2tlbnMpIHtcblx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHQvLyBJZiB2aWV3T3JUYWdUb1JlbW92ZSB3YXMgYW4gZW1wdHkgdmlld09yVGFnLCB3ZSB3aWxsIHJlbW92ZSBib3RoICNuIGFuZCAvblxuXHRcdFx0XHQvLyAoYW5kIGFueSBpbnRlcnZlbmluZyB0b2tlbnMpIGZyb20gdGhlIG5leHROb2RlICg9PT0gcHJldk5vZGUpXG5cdFx0XHRcdC8vIElmIHZpZXdPclRhZ1RvUmVtb3ZlIHdhcyBub3QgZW1wdHksIHdlIHdpbGwgdGFrZSB0b2tlbnMgcHJlY2VkaW5nICNuIGZyb20gcHJldk5vZGUsXG5cdFx0XHRcdC8vIGFuZCBjb25jYXRlbmF0ZSB3aXRoIHRva2VucyBmb2xsb3dpbmcgL24gb24gbmV4dE5vZGVcblx0XHRcdFx0bmV4dE5vZGUuc2V0QXR0cmlidXRlKGpzdkF0dHJTdHIsIHRva2Vucyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCB0b2tlbnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyAhcHJldk5vZGUsIHNvIHRoZXJlIG1heSBiZSBhIGRlZmVycmVkIG5vZGVzIHRva2VuIG9uIHRoZSBwYXJlbnRFbGVtLiBSZW1vdmUgaXQuXG5cdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgcmVtb3ZlU3ViU3RyKHBhcmVudEVsZW0uX2RmLCBcIiNcIiArIGlkICsgdmlld09yVGFnQ2hhcikpO1xuXHRcdGlmICghcmVmcmVzaCAmJiAhbmV4dE5vZGUpIHtcblx0XHRcdC8vIElmIHRoaXMgdmlld09yVGFnIGlzIGJlaW5nIHJlbW92ZWQsIGFuZCB0aGVyZSB3YXMgbm8gLm54dCwgcmVtb3ZlIGNsb3NpbmcgdG9rZW4gZnJvbSBkZWZlcnJlZCB0b2tlbnNcblx0XHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIvXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGlzcG9zZVRva2Vucyh0b2tlbnMpIHtcblx0dmFyIGksIGwsIHZ3SXRlbSwgdndJbmZvcztcblx0aWYgKHZ3SW5mb3MgPSB2aWV3SW5mb3ModG9rZW5zLCB0cnVlLCByT3Blbk1hcmtlcnMpKSB7XG5cdFx0Zm9yIChpID0gMCwgbCA9IHZ3SW5mb3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR2d0l0ZW0gPSB2d0luZm9zW2ldO1xuXHRcdFx0aWYgKHZ3SXRlbS5jaCA9PT0gXCJfXCIpIHtcblx0XHRcdFx0aWYgKCh2d0l0ZW0gPSB2aWV3U3RvcmVbdndJdGVtLmlkXSkgJiYgdndJdGVtLnR5cGUpIHtcblx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIHRoZSBfcHJ2IChwcmV2Tm9kZSkgZm9yIGEgdmlldywgcmVtb3ZlIHRoZSB2aWV3XG5cdFx0XHRcdFx0Ly8gLSB1bmxlc3Mgdmlldy50eXBlIGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHR2d0l0ZW0ucGFyZW50LnJlbW92ZVZpZXdzKHZ3SXRlbS5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcodndJdGVtLmlkKTsgLy8gdW5iaW5kIGJpbmRpbmdzIHdpdGggdGhpcyBiaW5kaW5nSWQgb24gdGhpcyB2aWV3XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBZGQgbGluayBtZXRob2RzIHRvIGRhdGEtbGlua2VkIHZpZXcgb3IgdGFnXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gYWRkTGlua01ldGhvZHModGFnT3JWaWV3LCBpc1RhZykge1xuXG5cdHRhZ09yVmlldy5jb250ZW50cyA9IGZ1bmN0aW9uKGRlZXAsIHNlbGVjdCkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiBqUXVlcnkgb2JqZWN0IHdpdGggdGhlIGNvbnRlbnQgbm9kZXMsXG5cdFx0aWYgKGRlZXAgIT09ICEhZGVlcCkge1xuXHRcdFx0Ly8gZGVlcCBub3QgYm9vbGVhbiwgc28gdGhpcyBpcyBjb250ZW50cyhzZWxlY3Rvcilcblx0XHRcdHNlbGVjdCA9IGRlZXA7XG5cdFx0XHRkZWVwID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR2YXIgZmlsdGVyZWQsXG5cdFx0XHRub2RlcyA9ICQodGhpcy5ub2RlcygpKTtcblx0XHRpZiAobm9kZXNbMF0pIHtcblx0XHRcdGZpbHRlcmVkID0gc2VsZWN0ID8gbm9kZXMuZmlsdGVyKHNlbGVjdCkgOiBub2Rlcztcblx0XHRcdG5vZGVzID0gZGVlcCAmJiBzZWxlY3QgPyBmaWx0ZXJlZC5hZGQobm9kZXMuZmluZChzZWxlY3QpKSA6IGZpbHRlcmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gbm9kZXM7XG5cdH07XG5cblx0dGFnT3JWaWV3Lm5vZGVzID0gZnVuY3Rpb24od2l0aE1hcmtlcnMsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiB0b3AtbGV2ZWwgbm9kZXNcblx0XHQvLyBEbyBub3QgcmV0dXJuIGFueSBzY3JpcHQgbWFya2VyIG5vZGVzLCB1bmxlc3Mgd2l0aE1hcmtlcnMgaXMgdHJ1ZVxuXHRcdC8vIE9wdGlvbmFsbHkgbGltaXQgcmFuZ2UsIGJ5IHBhc3NpbmcgaW4gcHJldk5vZGUgb3IgbmV4dE5vZGUgcGFyYW1ldGVyc1xuXG5cdFx0dmFyIG5vZGUsXG5cdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdGVsQ250ID0gc2VsZi5fZWxDbnQsXG5cdFx0XHRwcmV2SXNGaXJzdE5vZGUgPSAhcHJldk5vZGUgJiYgZWxDbnQsXG5cdFx0XHRub2RlcyA9IFtdO1xuXG5cdFx0cHJldk5vZGUgPSBwcmV2Tm9kZSB8fCBzZWxmLl9wcnY7XG5cdFx0bmV4dE5vZGUgPSBuZXh0Tm9kZSB8fCBzZWxmLl9ueHQ7XG5cblx0XHRub2RlID0gcHJldklzRmlyc3ROb2RlXG5cdFx0XHQ/IChwcmV2Tm9kZSA9PT0gc2VsZi5fbnh0XG5cdFx0XHRcdD8gc2VsZi5wYXJlbnRFbGVtLmxhc3RTaWJsaW5nXG5cdFx0XHRcdDogcHJldk5vZGUpXG5cdFx0XHQ6IChzZWxmLl8uaW5saW5lID09PSBmYWxzZVxuXHRcdFx0XHQ/IHByZXZOb2RlIHx8IHNlbGYubGlua0N0eC5lbGVtLmZpcnN0Q2hpbGRcblx0XHRcdFx0OiBwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5uZXh0U2libGluZyk7XG5cblx0XHR3aGlsZSAobm9kZSAmJiAoIW5leHROb2RlIHx8IG5vZGUgIT09IG5leHROb2RlKSkge1xuXHRcdFx0aWYgKHdpdGhNYXJrZXJzIHx8IGVsQ250IHx8IG5vZGUudGFnTmFtZSAhPT0gU0NSSVBUKSB7XG5cdFx0XHRcdC8vIEFsbCB0aGUgdG9wLWxldmVsIG5vZGVzIGluIHRoZSB2aWV3XG5cdFx0XHRcdC8vIChleGNlcHQgc2NyaXB0IG1hcmtlciBub2RlcywgdW5sZXNzIHdpdGhNYXJrZXJzID0gdHJ1ZSlcblx0XHRcdFx0Ly8gKE5vdGU6IElmIGEgc2NyaXB0IG1hcmtlciBub2RlLCB2aWV3SW5mby5lbENudCB1bmRlZmluZWQpXG5cdFx0XHRcdG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0XHR9XG5cdFx0XHRub2RlID0gbm9kZS5uZXh0U2libGluZztcblx0XHR9XG5cdFx0cmV0dXJuIG5vZGVzO1xuXHR9O1xuXG5cdHRhZ09yVmlldy5jaGlsZFRhZ3MgPSBmdW5jdGlvbihkZWVwLCB0YWdOYW1lKSB7XG5cdFx0Ly8gRm9yIGEgdmlldyBvciBhIHRhZywgcmV0dXJuIGNoaWxkIHRhZ3MgLSBhdCBhbnkgZGVwdGgsIG9yIGFzIGltbWVkaWF0ZSBjaGlsZHJlbiBvbmx5LlxuXHRcdGlmIChkZWVwICE9PSAhIWRlZXApIHtcblx0XHRcdC8vIGRlZXAgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgY2hpbGRUYWdzKHRhZ05hbWUpIC0gd2hpY2ggbG9va3MgZm9yIHRvcC1sZXZlbCB0YWdzIG9mIGdpdmVuIHRhZ05hbWVcblx0XHRcdHRhZ05hbWUgPSBkZWVwO1xuXHRcdFx0ZGVlcCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHR2aWV3ID0gc2VsZi5saW5rID8gc2VsZiA6IHNlbGYudGFnQ3R4LnZpZXcsIC8vIHRoaXMgbWF5IGJlIGEgdmlldyBvciBhIHRhZy4gSWYgYSB0YWcsIGdldCB0aGUgdmlldyBmcm9tIHRhZy52aWV3LnRhZ0N0eFxuXHRcdFx0cHJldk5vZGUgPSBzZWxmLl9wcnYsXG5cdFx0XHRlbENudCA9IHNlbGYuX2VsQ250LFxuXHRcdFx0dGFncyA9IFtdO1xuXG5cdFx0dmlldy5saW5rKFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0c2VsZi5wYXJlbnRFbGVtLFxuXHRcdFx0ZWxDbnQgPyBwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5wcmV2aW91c1NpYmxpbmcgOiBwcmV2Tm9kZSxcblx0XHRcdHNlbGYuX254dCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHtnZXQ6e1xuXHRcdFx0XHR0YWdzOiB0YWdzLFxuXHRcdFx0XHRkZWVwOiBkZWVwLFxuXHRcdFx0XHRuYW1lOiB0YWdOYW1lLFxuXHRcdFx0XHRpZDogc2VsZi5saW5rID8gc2VsZi5fLmlkICsgXCJfXCIgOiBzZWxmLl90Z0lkICsgXCJeXCJcblx0XHRcdH19XG5cdFx0KTtcblx0XHRyZXR1cm4gdGFncztcblx0fTtcblxuXHR0YWdPclZpZXcucmVmcmVzaCA9IGZ1bmN0aW9uKHNvdXJjZVZhbHVlKSB7XG5cdFx0dmFyIHByb21pc2UsIGF0dHIsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0bGlua0N0eCA9IHRhZy5saW5rQ3R4LFxuXHRcdFx0dmlldyA9IHRhZy50YWdDdHgudmlldztcblxuXHRcdGlmICh0YWcuZGlzcG9zZWQpIHsgZXJyb3IoXCJSZW1vdmVkIHRhZ1wiKTsgfVxuXHRcdGlmIChzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9ICRzdWIuX3RhZyh0YWcsIHZpZXcsIHZpZXcudG1wbCwgbWVyZ2VDdHhzKHRhZyksIHRydWUpOyAvLyBHZXQgcmVuZGVyZWQgSFRNTCBmb3IgdGFnLCBiYXNlZCBvbiByZWZyZXNoZWQgdGFnQ3R4c1xuXHRcdH1cblx0XHRpZiAoc291cmNlVmFsdWUgKyBcIlwiID09PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0Ly8gSWYgbm8gcmVuZGVyZWQgY29udGVudCwgc291cmNlVmFsdWUgd2lsbCBub3QgYmUgYSBzdHJpbmcgKGNhbiBiZSAwIG9yIHVuZGVmaW5lZClcblx0XHRcdGlmICh0YWcub25VbmJpbmQpIHtcblx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgpO1xuXHRcdFx0fVxuXHRcdFx0YXR0ciA9IHRhZy5fLmlubGluZSA/IEhUTUwgOiAobGlua0N0eC5hdHRyIHx8IGRlZmF1bHRBdHRyKHRhZy5wYXJlbnRFbGVtLCB0cnVlKSk7XG5cdFx0XHRwcm9taXNlID0gdXBkYXRlQ29udGVudChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgYXR0ciwgdGFnKTtcblx0XHR9XG5cblx0XHRjYWxsQWZ0ZXJMaW5rKHRhZyk7XG5cdFx0cmV0dXJuIHByb21pc2UgfHwgdGFnO1xuXHR9O1xuXG5cdHRhZ09yVmlldy51cGRhdGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHZhciBsaW5rZWRFbGVtID0gdGhpcy5saW5rZWRFbGVtO1xuXHRcdGlmIChsaW5rZWRFbGVtKSB7XG5cdFx0XHRlbGVtQ2hhbmdlSGFuZGxlcih7XG5cdFx0XHRcdHRhcmdldDogbGlua2VkRWxlbVswXVxuXHRcdFx0fSwgdW5kZWZpbmVkLCB2YWx1ZSk7XG5cdFx0fVxuXHR9O1xuXG5cdGlmIChpc1RhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBUQUdcblx0XHR0YWdPclZpZXcuZG9tQ2hhbmdlID0gZnVuY3Rpb24oKSB7IC8vIGRvbUNoYW5nZSBub3RpZmljYXRpb24gc3VwcG9ydFxuXHRcdFx0dmFyIGVsZW0gPSB0aGlzLnBhcmVudEVsZW0sXG5cdFx0XHRcdGhhc0xpc3RlbmVyID0gJC5oYXNEYXRhKGVsZW0pICYmICQuX2RhdGEoZWxlbSkuZXZlbnRzLFxuXHRcdFx0XHRkb21DaGFuZ2VOb3RpZmljYXRpb24gPSBcImpzdi1kb21jaGFuZ2VcIjtcblxuXHRcdFx0aWYgKGhhc0xpc3RlbmVyICYmIGhhc0xpc3RlbmVyW2RvbUNoYW5nZU5vdGlmaWNhdGlvbl0pIHtcblx0XHRcdFx0Ly8gT25seSB0cmlnZ2VyIGhhbmRsZXIgaWYgdGhlcmUgaXMgYSBoYW5kbGVyIGxpc3RlbmluZyBmb3IgdGhpcyBldmVudC4gKE5vdGUgdXNpbmcgdHJpZ2dlckhhbmRsZXIgLSBzbyBubyBldmVudCBidWJibGluZy4pXG5cdFx0XHRcdCQoZWxlbSkudHJpZ2dlckhhbmRsZXIoZG9tQ2hhbmdlTm90aWZpY2F0aW9uLCBhcmd1bWVudHMpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyBhIFZJRVdcblx0XHQvLyBOb3RlOiBhIGxpbmtlZCB2aWV3IHdpbGwgYWxzbywgYWZ0ZXIgbGlua2luZyBoYXZlIG5vZGVzW10sIF9wcnYgKHByZXZOb2RlKSwgX254dCAobmV4dE5vZGUpIC4uLlxuXHRcdHRhZ09yVmlldy5hZGRWaWV3cyA9IGZ1bmN0aW9uKGluZGV4LCBkYXRhSXRlbXMpIHtcblx0XHRcdC8vIGlmIHZpZXcgaXMgbm90IGFuIGFycmF5IHZpZXcsIGRvIG5vdGhpbmdcblx0XHRcdHZhciBpLCB2aWV3c0NvdW50LFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0aXRlbXNDb3VudCA9IGRhdGFJdGVtcy5sZW5ndGgsXG5cdFx0XHRcdHZpZXdzID0gc2VsZi52aWV3cztcblxuXHRcdFx0aWYgKCFzZWxmLl8udXNlS2V5ICYmIGl0ZW1zQ291bnQpIHtcblx0XHRcdFx0Ly8gdmlldyBpcyBvZiB0eXBlIFwiYXJyYXlcIlxuXHRcdFx0XHR2aWV3c0NvdW50ID0gdmlld3MubGVuZ3RoICsgaXRlbXNDb3VudDtcblxuXHRcdFx0XHRpZiAodmlld3NDb3VudCA9PT0gc2VsZi5kYXRhLmxlbmd0aCAvLyBJZiB2aWV3cyBub3QgYWxyZWFkeSBzeW5jZWQgdG8gYXJyYXkgKGUuZy4gdHJpZ2dlcmVkIGJ5IGFycmF5Lmxlbmd0aCBwcm9wZXJ0eUNoYW5nZSAtIGpzdmlld3MvaXNzdWVzLzMwMSlcblx0XHRcdFx0XHRcdCYmIHJlbmRlckFuZExpbmsoc2VsZiwgaW5kZXgsIHNlbGYudG1wbCwgdmlld3MsIGRhdGFJdGVtcywgc2VsZi5jdHgpICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdGlmICghc2VsZi5fLnNydCkgeyAvLyBOb3QgcGFydCBvZiBhICdzb3J0JyBvbiByZWZyZXNoXG5cdFx0XHRcdFx0XHRzZWxmLmZpeEluZGV4KGluZGV4ICsgaXRlbXNDb3VudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5yZW1vdmVWaWV3cyA9IGZ1bmN0aW9uKGluZGV4LCBpdGVtc0NvdW50LCBrZWVwTm9kZXMsIGlzTW92ZSkge1xuXHRcdFx0Ly8gdmlldy5yZW1vdmVWaWV3cygpIHJlbW92ZXMgYWxsIHRoZSBjaGlsZCB2aWV3c1xuXHRcdFx0Ly8gdmlldy5yZW1vdmVWaWV3cyhpbmRleCkgcmVtb3ZlcyB0aGUgY2hpbGQgdmlldyB3aXRoIHNwZWNpZmllZCBpbmRleCBvciBrZXlcblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoaW5kZXgsIGNvdW50KSByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbnVtbWJlciBvZiBjaGlsZCB2aWV3cywgc3RhcnRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4XG5cdFx0XHRmdW5jdGlvbiByZW1vdmVWaWV3KGluZGV4KSB7XG5cdFx0XHRcdHZhciBpZCwgYmluZElkLCBwYXJlbnRFbGVtLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIG5vZGVzVG9SZW1vdmUsXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlID0gdmlld3NbaW5kZXhdO1xuXG5cdFx0XHRcdGlmICh2aWV3VG9SZW1vdmUgJiYgdmlld1RvUmVtb3ZlLmxpbmspIHtcblx0XHRcdFx0XHRpZCA9IHZpZXdUb1JlbW92ZS5fLmlkO1xuXHRcdFx0XHRcdGlmICgha2VlcE5vZGVzKSB7XG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgdGhlIEhUTUwgbm9kZXMgZnJvbSB0aGUgRE9NLCB1bmxlc3MgdGhleSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkLCBpbmNsdWRpbmcgbm9kZXMgb2YgY2hpbGQgdmlld3Ncblx0XHRcdFx0XHRcdG5vZGVzVG9SZW1vdmUgPSB2aWV3VG9SZW1vdmUubm9kZXMoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBSZW1vdmUgY2hpbGQgdmlld3MsIHdpdGhvdXQgcmVtb3Zpbmcgbm9kZXNcblx0XHRcdFx0XHR2aWV3VG9SZW1vdmUucmVtb3ZlVmlld3ModW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlLnR5cGUgPSB1bmRlZmluZWQ7IC8vIFNldCB0eXBlIHRvIHVuZGVmaW5lZDogdXNlZCBhcyBhIGZsYWcgdGhhdCB0aGlzIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0XHRcdHByZXZOb2RlID0gdmlld1RvUmVtb3ZlLl9wcnY7XG5cdFx0XHRcdFx0bmV4dE5vZGUgPSB2aWV3VG9SZW1vdmUuX254dDtcblx0XHRcdFx0XHRwYXJlbnRFbGVtID0gdmlld1RvUmVtb3ZlLnBhcmVudEVsZW07XG5cdFx0XHRcdFx0Ly8gSWYgcHJldk5vZGUgYW5kIG5leHROb2RlIGFyZSB0aGUgc2FtZSwgdGhlIHZpZXcgaXMgZW1wdHlcblx0XHRcdFx0XHRpZiAoIWtlZXBOb2Rlcykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBIVE1MIG5vZGVzIGZyb20gdGhlIERPTSwgdW5sZXNzIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgaW5jbHVkaW5nIG5vZGVzIG9mIGNoaWxkIHZpZXdzXG5cdFx0XHRcdFx0XHRpZiAodmlld1RvUmVtb3ZlLl9lbENudCkge1xuXHRcdFx0XHRcdFx0XHQvLyBpZiBrZWVwTm9kZXMgaXMgZmFsc2UgKGFuZCB0cmFuc2ZlcnJpbmcgb2YgdG9rZW5zIGhhcyBub3QgYWxyZWFkeSBiZWVuIGRvbmUgYXQgYSBoaWdoZXIgbGV2ZWwpXG5cdFx0XHRcdFx0XHRcdC8vIHRoZW4gdHJhbnNmZXIgdG9rZW5zIGZyb20gcHJldk5vZGUgd2hpY2ggaXMgYmVpbmcgcmVtb3ZlZCwgdG8gbmV4dE5vZGUuXG5cdFx0XHRcdFx0XHRcdHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHBhcmVudEVsZW0sIGlkLCBcIl9cIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQkKG5vZGVzVG9SZW1vdmUpLnJlbW92ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXZpZXdUb1JlbW92ZS5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHByZXZOb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocHJldk5vZGUpOyAvLyAocHJldk5vZGUucGFyZW50Tm9kZSBpcyBwYXJlbnRFbGVtLCBleGNlcHQgaWYgalF1ZXJ5IE1vYmlsZSBvciBzaW1pbGFyIGhhcyBpbnNlcnRlZCBhbiBpbnRlcm1lZGlhdGUgd3JhcHBlclxuXHRcdFx0XHRcdFx0XHRuZXh0Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5leHROb2RlKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNldEFycmF5Q2hhbmdlTGluayh2aWV3VG9SZW1vdmUpO1xuXHRcdFx0XHRcdGZvciAoYmluZElkIGluIHZpZXdUb1JlbW92ZS5fLmJuZHMpIHtcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRlbGV0ZSB2aWV3U3RvcmVbaWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjdXJyZW50LCB2aWV3LCB2aWV3c0NvdW50LFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0aXNBcnJheSA9ICFzZWxmLl8udXNlS2V5LFxuXHRcdFx0XHR2aWV3cyA9IHNlbGYudmlld3M7XG5cblx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdHZpZXdzQ291bnQgPSB2aWV3cy5sZW5ndGg7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBSZW1vdmUgYWxsIGNoaWxkIHZpZXdzXG5cdFx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdFx0Ly8gdmlld3MgYW5kIGRhdGEgYXJlIGFycmF5c1xuXHRcdFx0XHRcdGN1cnJlbnQgPSB2aWV3c0NvdW50O1xuXHRcdFx0XHRcdHdoaWxlIChjdXJyZW50LS0pIHtcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXcoY3VycmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGYudmlld3MgPSBbXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB2aWV3cyBhbmQgZGF0YSBhcmUgb2JqZWN0c1xuXHRcdFx0XHRcdGZvciAodmlldyBpbiB2aWV3cykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGJ5IGtleVxuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyh2aWV3KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VsZi52aWV3cyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoaXRlbXNDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGlzQXJyYXkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBwYXJlbnRWaWV3IGlzIGRhdGEgYXJyYXkgdmlldy5cblx0XHRcdFx0XHRcdC8vIFNldCBpdGVtc0NvdW50IHRvIDEsIHRvIHJlbW92ZSB0aGlzIGl0ZW1cblx0XHRcdFx0XHRcdGl0ZW1zQ291bnQgPSAxO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgY2hpbGQgdmlldyB3aXRoIGtleSAnaW5kZXgnXG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGluZGV4KTtcblx0XHRcdFx0XHRcdGRlbGV0ZSB2aWV3c1tpbmRleF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChpc0FycmF5ICYmIGl0ZW1zQ291bnRcblx0XHRcdFx0XHQmJiAoaXNNb3ZlIHx8IHZpZXdzQ291bnQgLSBpdGVtc0NvdW50ID09PSBzZWxmLmRhdGEubGVuZ3RoKSkgeyAvLyBJZiB2aWV3cyBub3QgYWxyZWFkeSBzeW5jZWQgdG8gYXJyYXkgKGUuZy4gdHJpZ2dlcmVkIGJ5IGFycmF5Lmxlbmd0aCBwcm9wZXJ0eUNoYW5nZSAtIGpzdmlld3MvaXNzdWVzLzMwMSlcblx0XHRcdFx0XHRjdXJyZW50ID0gaW5kZXggKyBpdGVtc0NvdW50O1xuXHRcdFx0XHRcdC8vIFJlbW92ZSBpbmRleGVkIGl0ZW1zIChwYXJlbnRWaWV3IGlzIGRhdGEgYXJyYXkgdmlldyk7XG5cdFx0XHRcdFx0d2hpbGUgKGN1cnJlbnQtLSA+IGluZGV4KSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGN1cnJlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2aWV3cy5zcGxpY2UoaW5kZXgsIGl0ZW1zQ291bnQpO1xuXHRcdFx0XHRcdGlmICghc2VsZi5fLnNvcnQpIHtcblx0XHRcdFx0XHRcdHNlbGYuZml4SW5kZXgoaW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0YWdPclZpZXcucmVmcmVzaCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRwYXJlbnQgPSBzZWxmLnBhcmVudDtcblxuXHRcdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0XHRyZW5kZXJBbmRMaW5rKHNlbGYsIHNlbGYuaW5kZXgsIHNlbGYudG1wbCwgcGFyZW50LnZpZXdzLCBzZWxmLmRhdGEsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdHNldEFycmF5Q2hhbmdlTGluayhzZWxmKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LmZpeEluZGV4ID0gZnVuY3Rpb24oZnJvbUluZGV4KSB7XG5cdFx0XHQvLyBGaXh1cCBpbmRleCBvbiBmb2xsb3dpbmcgdmlldyBpdGVtcy4uLlxuXHRcdFx0dmFyIHZpZXdzID0gdGhpcy52aWV3cyxcblx0XHRcdFx0aW5kZXggPSB2aWV3cy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoZnJvbUluZGV4IDwgaW5kZXgtLSkge1xuXHRcdFx0XHRpZiAodmlld3NbaW5kZXhdLmluZGV4ICE9PSBpbmRleCkge1xuXHRcdFx0XHRcdCRvYnNlcnZhYmxlKHZpZXdzW2luZGV4XSkuc2V0UHJvcGVydHkoXCJpbmRleFwiLCBpbmRleCk7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBmaXhpbmcgdXAgaW5kZXgsIGJ1dCBub3Qga2V5LCBhbmQgbm90IGluZGV4IG9uIGNoaWxkIHZpZXdzLiBGcm9tIGNoaWxkIHZpZXdzLCB1c2Ugdmlldy5nZXRJbmRleCgpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LmxpbmsgPSB2aWV3TGluaztcblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSnNWaWV3cy1zcGVjaWZpYyBjb252ZXJ0ZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kY29udmVydGVycy5tZXJnZSA9IGZ1bmN0aW9uKHZhbCkge1xuXHQvLyBTcGVjaWFsIGNvbnZlcnRlciB1c2VkIGluIGRhdGEtbGlua2luZyB0byBzcGFjZS1zZXBhcmF0ZWQgbGlzdHMsIHN1Y2ggYXMgY2xhc3NOYW1lOlxuXHQvLyBDdXJyZW50bHkgb25seSBzdXBwb3J0cyB0b2dnbGUgc2VtYW50aWNzIC0gYW5kIGhhcyBubyBlZmZlY3QgaWYgdG9nZ2xlIHN0cmluZyBpcyBub3Qgc3BlY2lmaWVkXG5cdC8vIGRhdGEtbGluaz1cImNsYXNze21lcmdlOmJvb2xFeHByIHRvZ2dsZT1jbGFzc05hbWV9XCJcblx0dmFyIHJlZ3VsYXJFeHByZXNzaW9uLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHRoaXMubGlua0N0eC5fdmFsIHx8IFwiXCIsXG5cdFx0dG9nZ2xlID0gdGhpcy50YWdDdHgucHJvcHMudG9nZ2xlO1xuXG5cdGlmICh0b2dnbGUpIHtcblx0XHQvLyBXZSBhcmUgdG9nZ2xpbmcgdGhlIGNsYXNzIHNwZWNpZmllZCBieSB0aGUgdG9nZ2xlIHByb3BlcnR5LFxuXHRcdC8vIGFuZCB0aGUgYm9vbGVhbiB2YWwgYmluZGluZyBpcyBkcml2aW5nIHRoZSBpbnNlcnQvcmVtb3ZlIHRvZ2dsZVxuXG5cdFx0cmVndWxhckV4cHJlc3Npb24gPSB0b2dnbGUucmVwbGFjZSgvW1xcXFxeJC58PyorKClbe10vZywgXCJcXFxcJCZcIik7XG5cdFx0Ly8gRXNjYXBlIGFueSByZWd1bGFyIGV4cHJlc3Npb24gc3BlY2lhbCBjaGFyYWN0ZXJzIChtZXRhY2hhcmFjdGVycykgd2l0aGluIHRoZSB0b2dnbGUgc3RyaW5nXG5cdFx0cmVndWxhckV4cHJlc3Npb24gPSBcIihcXFxccyg/PVwiICsgcmVndWxhckV4cHJlc3Npb24gKyBcIiQpfChcXFxccyl8XikoXCIgKyByZWd1bGFyRXhwcmVzc2lvbiArIFwiKFxcXFxzfCQpKVwiO1xuXHRcdC8vIEV4YW1wbGU6IC8oXFxzKD89bXljbGFzcyQpfChcXHMpfF4pPyhteWNsYXNzKFxcc3wkKSkvIC0gc28gbWF0Y2hlcyAoXCIgbXljbGFzc1wiIG9yIFwiIFwiIG9yIF4gKSBmb2xsb3dlZCBieSAoXCJteWNsYXNzIFwiIG9yIFwibXljbGFzcyRcIikgd2hlcmUgXi8kIGFyZSBiZWdpbm5pbmcvZW5kIG9mIHN0cmluZ1xuXHRcdGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAocmVndWxhckV4cHJlc3Npb24pLCBcIiQyXCIpO1xuXHRcdHZhbCA9IGN1cnJlbnRWYWx1ZSArICh2YWwgPyAoY3VycmVudFZhbHVlICYmIFwiIFwiKSArIHRvZ2dsZSA6IFwiXCIpO1xuXHR9XG5cdHJldHVybiB2YWw7XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSnNWaWV3cy1zcGVjaWZpYyB0YWdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBrZWVwUGFyZW50RGF0YUN0eCh2YWwpIHtcblx0cmV0dXJuIHRoaXMudGFnQ3R4LnZpZXc7IC8vIFJldHVybiB0aGUgcGFyZW50IHZpZXcgYXMgZGF0YSBjb250ZXh0IGZvciByZW5kZXJpbmcgYmxvY2sgY29udGVudFxufVxuXG4kdGFncyh7XG5cdG9uOiB7XG5cdFx0YXR0cjogTk9ORSxcblx0XHRpbml0OiBmdW5jdGlvbih0YWdDdHgpIHtcblx0XHRcdHZhciBjb250ZW50LFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0YXJncyA9IHRhZ0N0eC5hcmdzLCAvLyBbZXZlbnRzLF0gW3NlbGVjdG9yLF0gaGFuZGxlclxuXHRcdFx0XHRsID0gYXJncy5sZW5ndGg7XG5cblx0XHRcdGZvciAoOyBpPGwgJiYgISRpc0Z1bmN0aW9uKGFyZ3NbaV0pOyBpKyspOyAvLyBIYW5kbGVyIGlzIGZpcnN0IGFyZyBvZiB0eXBlIGZ1bmN0aW9uXG5cdFx0XHR0YWcuX2hpID0gbD5pICYmIGkrMTsgLy8gaGFuZGxlciBpbmRleFxuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHRpZiAoISRzdWIuclRtcGwuZXhlYyhjb250ZW50ID0gdGFnQ3R4LnRtcGwubWFya3VwKSkge1xuXHRcdFx0XHRcdC8vIElubGluZSB7Xntvbn19IHRhZyB3aXRoIG5vIGNvbnRlbnQgKG9yIGV4dGVybmFsIHRlbXBsYXRlIGNvbnRlbnQpIG9yIHdpdGggY29udGVudCBjb250YWluaW5nXG5cdFx0XHRcdFx0Ly8gbm8gSFRNTCBvciBKc1JlbmRlciB0YWdzOiBXZSB3aWxsIHdyYXAgdGhlICh0ZXh0KSBjb250ZW50LCBvciB0aGUgb3BlcmF0aW9uIG5hbWUgaW4gYSA8YnV0dG9uPiBlbGVtZW50XG5cdFx0XHRcdFx0Ly8gKE90aGVyd2lzZSB3ZSB3aWxsIGF0dGFjaCB0aGUgaGFuZGxlciB0byB0aGUgZWxlbWVudCBjb250ZW50IGFmdGVyIGRhdGEtbGlua2luZylcblx0XHRcdFx0XHR0YWcudGVtcGxhdGUgPSBcIjxidXR0b24+XCIgKyAoJC50cmltKGNvbnRlbnQpIHx8IHRhZ0N0eC5wYXJhbXMuYXJnc1tpXSB8fCBcIm5vb3BcIikgKyBcIjwvYnV0dG9uPlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZy5hdHRyID0gSFRNTDtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uQWZ0ZXJMaW5rOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHRcdHZhciBoYW5kbGVyLCBwYXJhbXMsIGZpbmQsIGFjdGl2ZUVsZW0sXG5cdFx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRcdGkgPSB0YWcuX2hpLFxuXHRcdFx0XHRhcmdzID0gdGFnQ3R4LmFyZ3MsIC8vIFtldmVudHMsXSBbc2VsZWN0b3IsXSBoYW5kbGVyXG5cdFx0XHRcdGwgPSBhcmdzLmxlbmd0aCxcblx0XHRcdFx0cHJvcHMgPSB0YWdDdHgucHJvcHMsXG5cdFx0XHRcdGRhdGEgPSBwcm9wcy5kYXRhLFxuXHRcdFx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0XHRcdGNvbnRleHRPYiA9IHByb3BzLmNvbnRleHQ7IC8vIENvbnRleHQgKCd0aGlzJyBwb2ludGVyKSBmb3IgYXR0YWNoZWQgaGFuZGxlclxuXG5cdFx0XHRpZiAoaSkgeyAvLyBUaGVyZSBpcyBhIGhhbmRsZXJcblx0XHRcdFx0aGFuZGxlciA9IGFyZ3NbaS0xXTtcblx0XHRcdFx0cGFyYW1zID0gYXJncy5zbGljZShpKTsgLy8gU3Vic2VxdWVudCBhcmdzIGFyZSBwYXJhbXNcblx0XHRcdFx0YXJncyA9IGFyZ3Muc2xpY2UoMCwgaS0xKTsgLy8gUHJlY2VkaW5nIGFyZ3MgKGlmIGFueSkgYXJlIGV2ZW50cyBhbmQgc2VsZWN0b3Jcblx0XHRcdFx0dGFnLl9zZWwgPSBhcmdzWzFdOyAvLyBTZWxlY3RvciBmb3IgZGVzY2VuZGFudCBlbGVtZW50cyAtIGZvciBkZWxlZ2F0ZWQgZXZlbnRzIG9uIHRob3NlIGVsZW1lbnRzLCBkZWxlZ2F0aW5nIHRvIHRoZSBhY3RpdmVFbGVtXG5cblx0XHRcdFx0YWN0aXZlRWxlbSA9IHRhZy5hY3RpdmVFbGVtID0gdGFnLmFjdGl2ZUVsZW0gfHwgJCh0YWcuXy5pbmxpbmVcblx0XHRcdFx0XHQ/ICh0YWcuX3NlbCA9IGFyZ3NbMV0gfHwgXCIqXCIsIHRhZy5wYXJlbnRFbGVtKVxuXHRcdFx0XHRcdC8vIElmIGlubGluZSwgYXR0YWNoIHRvIGNoaWxkIGVsZW1lbnRzIG9mIHRhZyBwYXJlbnQgZWxlbWVudCAoZmlsdGVyZWQgYnkgc2VsZWN0b3IgYXJndW1lbnQgaWYgcHJvdmlkZWQuXG5cdFx0XHRcdFx0Ly8gKEluIGhhbmRsZXIgd2UnbGwgZmlsdGVyIG91dCBldmVudHMgZnJvbSBzaWJsaW5nIGVsZW1lbnRzIHByZWNlZGluZyBvciBmb2xsb3dpbmcgdGFnLilcblx0XHRcdFx0XHQvLyBUaGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIGRlbGVnYXRlZCBwYXR0ZXJuIHdoZXJlIHRoZSBhdHRhY2hlZCBldmVudCB3b3JrcyBldmVuIGZvciBhZGRlZCBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZSBzZWxlY3RvclxuXHRcdFx0XHRcdDogbGlua0N0eC5lbGVtKTtcblxuXHRcdFx0XHRpZiAoIWNvbnRleHRPYikge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgcGF0aCBmb3IgdGhlIHByZWNlZGluZyBvYmplY3QgKGNvbnRleHQgb2JqZWN0KSBvZiBoYW5kbGVyICh3aGljaCBpcyB0aGUgbGFzdCBhcmcpLCBjb21waWxlIGZ1bmN0aW9uXG5cdFx0XHRcdFx0Ly8gdG8gcmV0dXJuIHRoYXQgY29udGV4dCBvYmplY3QsIGFuZCBydW4gY29tcGlsZWQgZnVuY3Rpb24gYWdhaW5zdCBkYXRhXG5cdFx0XHRcdFx0Y29udGV4dE9iID0gL14oLiopW1xcLl5dW1xcdyRdKyQvLmV4ZWModGFnQ3R4LnBhcmFtcy5hcmdzLnNsaWNlKC1wYXJhbXMubGVuZ3RoIC0gMSlbMF0pO1xuXHRcdFx0XHRcdGNvbnRleHRPYiA9IGNvbnRleHRPYiAmJiAkc3ViLnRtcGxGbihkZWxpbU9wZW5DaGFyMSArIFwiOlwiICsgY29udGV4dE9iWzFdICsgZGVsaW1DbG9zZUNoYXIwLCB2aWV3LnRtcGwsIHRydWUpKGxpbmtDdHguZGF0YSwgdmlldyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGFnLl9ldnMpIHtcblx0XHRcdFx0XHR0YWcub25VbmJpbmQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjdGl2ZUVsZW0ub24oXG5cdFx0XHRcdFx0dGFnLl9ldnMgPSBhcmdzWzBdIHx8IFwiY2xpY2tcIiwgLy8gZXZlbnRzIGRlZmF1bHRzIHRvIFwiY2xpY2tcIlxuXHRcdFx0XHRcdHRhZy5fc2VsLFxuXHRcdFx0XHRcdGRhdGEgPT0gdW5kZWZpbmVkID8gbnVsbCA6IGRhdGEsXG5cdFx0XHRcdFx0dGFnLl9obHIgPSBmdW5jdGlvbiBobmRscihldikge1xuXHRcdFx0XHRcdFx0dmFyIG5vZGVzLCBsZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGZvdW5kID0gIXRhZy5fLmlubGluZTtcblxuXHRcdFx0XHRcdFx0aWYgKCFmb3VuZCkgeyAvLyBJZiBpbmxpbmUsIGZpbHRlciBvdXQgZXZlbnRzIGZyb20gc2libGluZyBlbGVtZW50cyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRhZy5cblx0XHRcdFx0XHRcdFx0bm9kZXMgPSB0YWcuY29udGVudHMoXCIqXCIpO1xuXHRcdFx0XHRcdFx0XHRsID0gbm9kZXMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIWZvdW5kICYmIGwtLSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChub2Rlc1tsXS5jb250YWlucyhldi50YXJnZXQpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoZm91bmQpIHsgLy8gdGFyZ2V0IGVsZW0gaXMgaW5kZWVkIHdpdGhpbiB0aGUgdGFnLCBzbyBjYWxsIHRoZSB7b259IGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGhhbmRsZXIuYXBwbHkoY29udGV4dE9iIHx8IGxpbmtDdHguZGF0YSwgW10uY29uY2F0KFxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcywgLy8gZS5nLiBwYXIxLCBwYXIyXG5cdFx0XHRcdFx0XHRcdFx0ZXYsXG5cdFx0XHRcdFx0XHRcdFx0e2NoYW5nZTogZXYudHlwZSwgdmlldzogdmlldywgbGlua0N0eDogbGlua0N0eH0sXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW1zLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSAvLyBJZiB0cmlnZ2VyaW5nIGV2ZW50IChlLmcuIGpzdi1kb21jaGFuZ2UpIGhhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlciBldiwgcGFzcyB0aGVtIHRvb1xuXHRcdFx0XHRcdFx0XHQpKTtcblx0XHRcdFx0XHRcdFx0Ly8gZm9yIHtvbiAnY2xpY2snIGhhbmRsZXIgcGFyMSBwYXIyfSB1c2UgaGFuZGxlcihwYXIxLCBwYXIyLCBldiwgZG9tY2hhbmdlRXZlbnRBcmdzKVxuXHRcdFx0XHRcdFx0XHQvLyBmb3Ige29uICdqc3YtZG9tY2hhbmdlJyBoYW5kbGVyIHBhcjEgcGFyMn0gdXNlIGhhbmRsZXIocGFyMSwgcGFyMiwgZXYsIGRvbWNoYW5nZUV2ZW50QXJncywgdGFnQ3R4LCBsaW5rQ3R4LCBvYnNlcnZhYmxlRXZlbnRBcmdzKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdG9uVW5iaW5kOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRcdGlmIChzZWxmLmFjdGl2ZUVsZW0pIHtcblx0XHRcdFx0c2VsZi5hY3RpdmVFbGVtLm9mZihzZWxmLl9ldnMsIHNlbGYuX3NlbCwgc2VsZi5faGxyKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGZsb3c6IHRydWUsXG5cdFx0Y29udGVudEN0eDoga2VlcFBhcmVudERhdGFDdHgsXG5cdFx0ZGF0YUJvdW5kT25seTogdHJ1ZVxuXHR9LFxuXHRyYWRpb2dyb3VwOiB7XG5cdFx0aW5pdDogZnVuY3Rpb24odGFnQ3R4KSB7XG5cdFx0XHR0aGlzLm5hbWUgPSB0YWdDdHgucHJvcHMubmFtZSB8fCAoXCJqc3ZcIiArIE1hdGgucmFuZG9tKCkpO1xuXHRcdH0sXG5cdFx0b25CaW5kOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHRcdHZhciBkb21DaG5nQ250bnIsXG5cdFx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRcdCRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW0gPSAodGFnLl8uaW5saW5lID8gdGFnLmNvbnRlbnRzKHRydWUsIFwiaW5wdXRbdHlwZT1yYWRpb11cIikgOiAkKGxpbmtDdHguZWxlbSkuZmluZChcImlucHV0W3R5cGU9cmFkaW9dXCIpKSxcblx0XHRcdFx0bCA9ICRsaW5rZWRFbGVtLmxlbmd0aDtcblxuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHQvLyBJZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBvd25lZCBieSAocmVuZGVyZWQgYnkpIHRoaXMgdGFnIChub3QgYnkgYSBjaGlsZFRhZyBzdWNoIGFzIHtee2Zvcn19KVxuXHRcdFx0XHQvLyB1c2UgaXQgYXMgY29udGFpbmVyIGZvciBkZXRlY3RpbmcgZG9tIGNoYW5nZXNcblx0XHRcdFx0ZG9tQ2huZ0NudG5yID0gdGFnLmNvbnRlbnRzKFwiKlwiKVswXTtcblx0XHRcdFx0ZG9tQ2huZ0NudG5yID0gZG9tQ2huZ0NudG5yICYmICQudmlldyhkb21DaG5nQ250bnIpLmN0eC50YWcgPT09IHRhZy5wYXJlbnQgPyBkb21DaG5nQ250bnIgOiB0YWcucGFyZW50RWxlbTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IGxpbmtDdHguZWxlbTtcblx0XHRcdH1cblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0Ly8gQ29uZmlndXJlIHRoZSBuYW1lIGZvciBlYWNoIHJhZGlvIGlucHV0IGVsZW1lbnRcblx0XHRcdFx0JGxpbmtlZEVsZW1bbF0ubmFtZSA9ICRsaW5rZWRFbGVtW2xdLm5hbWUgfHwgdGFnLm5hbWU7XG5cdFx0XHR9XG5cdFx0XHQvLyBFc3RhYmxpc2ggYSBkb21jaGFuZ2UgbGlzdGVuZXIgaW4gY2FzZSB0aGlzIHJhZGlvZ3JvdXAgd3JhcHMgYSB7Xntmb3J9fSBvciB7XntpZn19IG9yIHNpbWlsYXIgd2hpY2ggbWlnaHQgZHluYW1pY2FsbHkgaW5zZXJ0IG5ldyByYWRpbyBpbnB1dCBlbGVtZW50c1xuXHRcdFx0JChkb21DaG5nQ250bnIpLm9uKFwianN2LWRvbWNoYW5nZVwiLCBmdW5jdGlvbihldiwgZm9yT3JJZlRhZ0N0eCkge1xuXHRcdFx0XHR2YXIgbGlua2VkRWxlbSxcblx0XHRcdFx0XHRwYXJlbnRUYWdzID0gZm9yT3JJZlRhZ0N0eC5jdHgucGFyZW50VGFncztcblx0XHRcdFx0aWYgKCF0YWcuXy5pbmxpbmUgfHwgZG9tQ2huZ0NudG5yICE9PSB0YWcucGFyZW50RWxlbSAvLyBUaGUgZG9tQ2huZ0NudG5yIGlzIHNwZWNpZmljIHRvIHRoaXMgdGFnXG5cdFx0XHRcdFx0Ly8gVGhlIGRvbUNobmdDbnRuciBpcyB0aGUgcGFyZW50RWxlbSBvZiB0aGlzIHRhZywgc28gbmVlZCB0byBtYWtlIHN1cmUgZG9tIGNoYW5nZSBldmVudCBpcyBmb3Jcblx0XHRcdFx0XHQvLyBhIGNvbnRlbnQgY2hhbmdlIHdpdGhpbiB0aGlzIHRhZywgbm90IG91dHNpZGUgaXQuXG5cdFx0XHRcdFx0fHwgcGFyZW50VGFncyAmJiBwYXJlbnRUYWdzW3RhZy50YWdOYW1lXSA9PT0gdGFnKSB7XG5cdFx0XHRcdFx0Ly8gQ29udGVudHMgaGF2ZSBjaGFuZ2VkIHNvIHJlY3JlYXRlICRsaW5rZWRFbGVtIGZvciB0aGUgcmFkaW8gaW5wdXQgZWxlbWVudHMgKGluY2x1ZGluZyBwb3NzaWJsZSBuZXcgb25lIGp1c3QgaW5zZXJ0ZWQpXG5cdFx0XHRcdFx0JGxpbmtlZEVsZW0gPSB0YWcubGlua2VkRWxlbSA9IHRhZy5jb250ZW50cyh0cnVlLCBcImlucHV0W3R5cGU9cmFkaW9dXCIpO1xuXHRcdFx0XHRcdGwgPSAkbGlua2VkRWxlbS5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdFx0Ly8gQ29uZmlndXJlIGJpbmRpbmcgIGFuZCBuYW1lIGZvciBlYWNoIHJhZGlvIGlucHV0IGVsZW1lbnRcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0gPSAkbGlua2VkRWxlbVtsXTtcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0uX2pzdkxrRWwgPSB0YWc7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLm5hbWUgPSBsaW5rZWRFbGVtLm5hbWUgfHwgdGFnLm5hbWU7XG5cdFx0XHRcdFx0XHRiaW5kVG8oYmluZGluZ1N0b3JlW3RhZy5fdGdJZF0sIHRhZywgbGlua2VkRWxlbSk7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZCbmQgPSBcIiZcIiArIHRhZy5fdGdJZCArIFwiK1wiO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5jaGVja2VkID0gdGFnLmN2dEFyZ3MoKVswXSA9PT0gbGlua2VkRWxlbS52YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0b25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIHRhZ0N0eHMpIHtcblx0XHRcdHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgcmVyZW5kZXJcblx0XHR9LFxuXHRcdGNvbnRlbnRDdHg6IGtlZXBQYXJlbnREYXRhQ3R4LFxuXHRcdGRhdGFCb3VuZE9ubHk6IHRydWVcblx0fVxufSk7XG5cbiRleHRlbmQoJHRhZ3NbXCJmb3JcIl0sIHtcblx0Ly9vblVwZGF0ZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgbmV3VGFnQ3R4cykge1xuXHRcdC8vQ29uc2lkZXIgYWRkaW5nIGZpbHRlcmluZyBmb3IgcGVyZiBvcHRpbWl6YXRpb24uIEhvd2V2ZXIgdGhlIGJlbG93IHByZXZlbnRzIHVwZGF0ZSBvbiBzb21lIHNjZW5hcmlvcyB3aGljaCBfc2hvdWxkXyB1cGRhdGUgLSBuYW1lbHkgd2hlbiB0aGVyZSBpcyBhbm90aGVyIGFycmF5IG9uIHdoaWNoIGZvciBhbHNvIGRlcGVuZHMuXG5cdFx0Ly92YXIgaSwgbCwgdGNpLCBwcmV2QXJnO1xuXHRcdC8vZm9yICh0Y2kgPSAwOyAocHJldkFyZyA9IHRoaXMudGFnQ3R4c1t0Y2ldKSAmJiBwcmV2QXJnLmFyZ3MubGVuZ3RoOyB0Y2krKykge1xuXHRcdC8vXHRpZiAocHJldkFyZy5hcmdzWzBdICE9PSBuZXdUYWdDdHhzW3RjaV0uYXJnc1swXSkge1xuXHRcdC8vXHRcdHJldHVybiB0cnVlO1xuXHRcdC8vXHR9XG5cdFx0Ly99XG5cdFx0Ly9yZXR1cm4gZmFsc2U7XG5cdC8vfSxcblx0b25BcnJheUNoYW5nZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgdGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0dmFyIGFycmF5Vmlldyxcblx0XHRcdHRhcmdldCA9IGV2LnRhcmdldCxcblx0XHRcdHRhcmdldExlbmd0aCA9IHRhcmdldC5sZW5ndGgsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0Y2hhbmdlID0gZXZlbnRBcmdzLmNoYW5nZTtcblx0XHRpZiAodGFnLl8ubm9Wd3MgLy8gQ2hpbGQgdmlld3Mgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHRhcmdldCBpcyBub3QgaHRtbCAtIGUuZy4gZGF0YS1saW5rPVwidGl0bGV7Zm9yIC4uLn1cIlxuXHRcdFx0fHwgdGFnLnRhZ0N0eHNbMV0gJiYgKCAvLyBUaGVyZSBpcyBhbiB7e2Vsc2V9fVxuXHRcdFx0XHRjaGFuZ2UgPT09IFwiaW5zZXJ0XCIgJiYgdGFyZ2V0TGVuZ3RoID09PSBldmVudEFyZ3MuaXRlbXMubGVuZ3RoIC8vIGluc2VydGluZywgYW5kIG5ldyBsZW5ndGggaXMgc2FtZSBhcyBpbnNlcnRlZCBsZW5ndGgsIHNvIGdvaW5nIGZyb20gMCB0byBuXG5cdFx0XHRcdHx8IGNoYW5nZSA9PT0gXCJyZW1vdmVcIiAmJiAhdGFyZ2V0TGVuZ3RoIC8vIHJlbW92aW5nICwgYW5kIG5ldyBsZW5ndGggMCwgc28gZ29pbmcgZnJvbSBuIHRvIDBcblx0XHRcdCkpIHtcblx0XHRcdHRhZy5yZWZyZXNoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoYXJyYXlWaWV3IGluIHRhZy5fLmFyclZ3cykge1xuXHRcdFx0XHRhcnJheVZpZXcgPSB0YWcuXy5hcnJWd3NbYXJyYXlWaWV3XTtcblx0XHRcdFx0aWYgKGFycmF5Vmlldy5kYXRhID09PSB0YXJnZXQpIHtcblx0XHRcdFx0XHRhcnJheVZpZXcuXy5vbkFycmF5Q2hhbmdlLmFwcGx5KGFycmF5VmlldywgYXJndW1lbnRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0YWcuZG9tQ2hhbmdlKHRhZ0N0eCwgbGlua0N0eCwgZXZlbnRBcmdzKTtcblx0XHRldi5kb25lID0gdHJ1ZTtcblx0fSxcblx0b25BZnRlckxpbms6IGZ1bmN0aW9uKHRhZ0N0eCwgbGlua0N0eCkge1xuXHRcdHZhciBpLCBhcnJIYW5kbGVyLCBhcnJCaW5kaW5nLCBkYXRhLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGFycmF5QmluZGluZ3MgPSB0YWcuX2FycyB8fCB7fSxcblx0XHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cyxcblx0XHRcdGwgPSB0YWdDdHhzLmxlbmd0aCxcblx0XHRcdHNlbGVjdGVkID0gdGFnLnNlbGVjdGVkIHx8IDA7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDw9IHNlbGVjdGVkOyBpKyspIHtcblx0XHRcdHRhZ0N0eCA9IHRhZ0N0eHNbaV07ICAgICAgICAvLyBsb29wIHRocm91Z2ggdGFnQ3R4cyB1cCB0byBzZWxlY3RlZFxuXHRcdFx0ZGF0YSA9IHRhZ0N0eC5tYXBcblx0XHRcdFx0PyB0YWdDdHgubWFwLnRndCAgICAgICAgLy8gJ2RhdGEnIGlzIG1hcHBlZCBkYXRhXG5cdFx0XHRcdDogdGFnQ3R4LmFyZ3MubGVuZ3RoXG5cdFx0XHRcdFx0PyB0YWdDdHguYXJnc1swXSAgICAvLyBvciBhcmdzWzBdXG5cdFx0XHRcdFx0OiB0YWdDdHgudmlldy5kYXRhOyAvLyBvciBkZWZhdWx0cyB0byBjdXJyZW50IGRhdGEuXG5cblx0XHRcdGlmICgoYXJyQmluZGluZyA9IGFycmF5QmluZGluZ3NbaV0pICYmIGRhdGEgIT09IGFyckJpbmRpbmdbMF0pIHsgLy8gSXMgdGhlcmUgcHJldmlvdXMgYXJyYXkgZGF0YSBvbiB0aGlzIHRhZ0N0eCwgZGlmZmVyZW50IGZyb20gbmV3IGRhdGFcblx0XHRcdFx0JG9ic2VydmUoYXJyQmluZGluZ1swXSwgYXJyQmluZGluZ1sxXSwgdHJ1ZSk7IC8vdW5vYnNlcnZlIHByZXZpb3VzIGFycmF5XG5cdFx0XHRcdGRlbGV0ZSBhcnJheUJpbmRpbmdzW2ldO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFhcnJheUJpbmRpbmdzW2ldICYmICRpc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRcdCRvYnNlcnZlKGRhdGEsIGFyckhhbmRsZXIgPSBmdW5jdGlvbihldiwgZXZlbnRBcmdzKSB7XG5cdFx0XHRcdFx0dmFyIHRhZ0N0ID0gdGFnQ3R4O1xuXHRcdFx0XHRcdHRhZy5vbkFycmF5Q2hhbmdlKGV2LCBldmVudEFyZ3MsIHRhZ0N0LCBsaW5rQ3R4KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFycmF5QmluZGluZ3NbaV0gPSBbZGF0YSwgYXJySGFuZGxlcl07IC8vIFN0b3JlIGFycmF5IGRhdGEgYW5kIGFycmF5Q2hhbmdlSGFuZGxlciBvbiB0YWcuX2Fyc1tpXVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGkgPSBzZWxlY3RlZCArIDE7IGkgPCBsOyBpKyspIHsgLy8gSWYgdGhlcmUgd2VyZSBwcmV2aW91cyBiaW5kaW5ncyBvbiBsYXRlciB0YWdDdHhzLCByZW1vdmUgdGhlbVxuXHRcdFx0aWYgKGFyckJpbmRpbmcgPSBhcnJheUJpbmRpbmdzW2ldKSB7XG5cdFx0XHRcdCRvYnNlcnZlKGFyckJpbmRpbmdbMF0sIGFyckJpbmRpbmdbMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZSBwcmV2aW91cyBiaW5kaW5nXG5cdFx0XHRcdGRlbGV0ZSBhcnJheUJpbmRpbmdzW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0YWcuX2FycyA9IGFycmF5QmluZGluZ3M7XG5cdH0sXG5cdG9uRGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGwsIHRhZyA9IHRoaXM7XG5cdFx0Zm9yIChsIGluIHRhZy5fYXJzKSB7XG5cdFx0XHQkb2JzZXJ2ZSh0YWcuX2Fyc1tsXVswXSwgdGFnLl9hcnNbbF1bMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZVxuXHRcdH1cblx0fVxufSk7XG5cbiRleHRlbmQoJHRhZ3NbXCJpZlwiXSwge1xuXHRvblVwZGF0ZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgbmV3VGFnQ3R4cykge1xuXHRcdHZhciB0Y2ksIHByZXZBcmcsIGRpZmZlcmVudDtcblx0XHRmb3IgKHRjaSA9IDA7IChwcmV2QXJnID0gdGhpcy50YWdDdHhzW3RjaV0pOyB0Y2krKykge1xuXHRcdFx0ZGlmZmVyZW50ID0gcHJldkFyZy5wcm9wcy50bXBsICE9PSBuZXdUYWdDdHhzW3RjaV0ucHJvcHMudG1wbCB8fCBwcmV2QXJnLmFyZ3MubGVuZ3RoICYmICEocHJldkFyZyA9IHByZXZBcmcuYXJnc1swXSkgIT09ICFuZXdUYWdDdHhzW3RjaV0uYXJnc1swXTtcblx0XHRcdGlmICgoIXRoaXMuY29udmVydCAmJiAhIXByZXZBcmcpIHx8IGRpZmZlcmVudCkge1xuXHRcdFx0XHRyZXR1cm4gZGlmZmVyZW50O1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBub3QgYSBjaGFuZ2Ugb2YgdGVtcGxhdGUsIGFuZCB0aGVyZSBpcyBubyBjb252ZXJ0ZXIsIGFuZCBuZXdBcmcgYW5kIHByZXZBcmcgYXJlIGJvdGggdHJ1dGh5LCByZXR1cm4gZmFsc2UgdG8gY2FuY2VsIHVwZGF0ZS5cblx0XHRcdFx0Ly8gKEV2ZW4gaWYgdmFsdWVzIG9uIGxhdGVyIGVsc2VzIGFyZSBkaWZmZXJlbnQsIHdlIHN0aWxsIGRvbid0IHdhbnQgdG8gdXBkYXRlLCBzaW5jZSByZW5kZXJlZCBvdXRwdXQgd291bGQgYmUgdW5jaGFuZ2VkKVxuXHRcdFx0XHQvLyBJZiBuZXdBcmcgYW5kIHByZXZBcmcgYXJlIGRpZmZlcmVudCwgcmV0dXJuIHRydWUsIHRvIHVwZGF0ZVxuXHRcdFx0XHQvLyBJZiBuZXdBcmcgYW5kIHByZXZBcmcgYXJlIGJvdGggZmFsc2V5LCBtb3ZlIHRvIHRoZSBuZXh0IHt7ZWxzZSAuLi59fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBCb29sZWFuIHZhbHVlIG9mIGFsbCBhcmdzIGFyZSB1bmNoYW5nZWQgKGZhbHNleSksIHNvIHJldHVybiBmYWxzZSB0byBjYW5jZWwgdXBkYXRlXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHRvbkFmdGVyTGluazogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4LCBjdHgsIGV2LCBldmVudEFyZ3MpIHtcblx0XHRpZiAoZXZlbnRBcmdzKSB7XG5cdFx0XHR0aGlzLmRvbUNoYW5nZSh0YWdDdHgsIGxpbmtDdHgsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG59KTtcblxuZnVuY3Rpb24gb2JzZXJ2ZVByb3BzKG1hcCwgZXYsIGV2ZW50QXJncykge1xuXHRpZiAoZXZlbnRBcmdzLmNoYW5nZSA9PT0gXCJzZXRcIikge1xuXHRcdHZhciB0YXJnZXQgPSBtYXAudGd0LFxuXHRcdFx0bCA9IHRhcmdldC5sZW5ndGg7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0aWYgKHRhcmdldFtsXS5rZXkgPT09IGV2ZW50QXJncy5wYXRoKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobCA9PT0gLTEpIHtcblx0XHRcdGlmIChldmVudEFyZ3MucGF0aCAmJiAhZXZlbnRBcmdzLnJlbW92ZSkge1xuXHRcdFx0XHQkb2JzZXJ2YWJsZSh0YXJnZXQpLmluc2VydCh7a2V5OiBldmVudEFyZ3MucGF0aCwgcHJvcDogZXZlbnRBcmdzLnZhbHVlfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChldmVudEFyZ3MucmVtb3ZlKSB7XG5cdFx0XHQkb2JzZXJ2YWJsZSh0YXJnZXQpLnJlbW92ZShsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JG9ic2VydmFibGUodGFyZ2V0W2xdKS5zZXRQcm9wZXJ0eShcInByb3BcIiwgZXZlbnRBcmdzLnZhbHVlKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gb2JzZXJ2ZU1hcHBlZFByb3BzKG1hcCwgZXYsIGV2ZW50QXJncykge1xuXHR2YXIgaXRlbSxcblx0XHRzb3VyY2UgPSBtYXAuc3JjLFxuXHRcdGNoYW5nZSA9IGV2ZW50QXJncy5jaGFuZ2U7XG5cblx0aWYgKGNoYW5nZSA9PT0gXCJzZXRcIikge1xuXHRcdGlmIChldmVudEFyZ3MucGF0aCA9PT0gXCJwcm9wXCIpIHtcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoZXYudGFyZ2V0LmtleSwgZXZlbnRBcmdzLnZhbHVlKTtcblx0XHR9IGVsc2UgeyAvLyBwYXRoID09PSBcImtleVwiXG5cdFx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnJlbW92ZVByb3BlcnR5KGV2ZW50QXJncy5vbGRWYWx1ZSk7IC8vIFdoZW4ga2V5IGlzIG1vZGlmaWVkIG9ic2VydmFibHksIHJlbW92ZSBvbGQgb25lIGFuZCBzZXQgbmV3IG9uZVxuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5zZXRQcm9wZXJ0eShldmVudEFyZ3MudmFsdWUsIGV2LnRhcmdldC5wcm9wKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoY2hhbmdlID09PSBcInJlbW92ZVwiKSB7XG5cdFx0aXRlbSA9IGV2ZW50QXJncy5pdGVtc1swXTtcblx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnJlbW92ZVByb3BlcnR5KGl0ZW0ua2V5KTtcblx0XHRkZWxldGUgc291cmNlW2l0ZW0ua2V5XTtcblx0fSBlbHNlIGlmIChjaGFuZ2UgPT09IFwiaW5zZXJ0XCIpIHtcblx0XHRpdGVtID0gZXZlbnRBcmdzLml0ZW1zWzBdO1xuXHRcdGlmIChpdGVtLmtleSkge1xuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5zZXRQcm9wZXJ0eShpdGVtLmtleSwgaXRlbS5wcm9wKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gc2hhbGxvd0FycmF5RmlsdGVyKGFsbFBhdGggLyosIG9iamVjdCwgcGFyZW50T2JzKi8pIHsgLy8gRmlsdGVyIHVzZWQgYnkge3twcm9wc319IGZvciB0aGUgbWFwcGVkUHJvcHMgdGFyZ2V0IGFycmF5XG5cdHJldHVybiBhbGxQYXRoLmluZGV4T2YoXCIuXCIpIDwgMDtcbn1cblxuJHRhZ3MoXCJwcm9wc1wiLCB7XG5cdGJhc2VUYWc6IFwiZm9yXCIsXG5cdGRhdGFNYXA6ICR2aWV3cy5tYXAoe1xuXHRcdGdldFRndDogJHRhZ3MucHJvcHMuZGF0YU1hcC5nZXRUZ3QsXG5cdFx0b2JzU3JjOiBvYnNlcnZlUHJvcHMsXG5cdFx0b2JzVGd0OiBvYnNlcnZlTWFwcGVkUHJvcHMsXG5cdFx0dGd0Rmx0OiBzaGFsbG93QXJyYXlGaWx0ZXJcblx0fSksXG5cdGZsb3c6IHRydWVcbn0pO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIGpRdWVyeSBuYW1lc3BhY2Vcbi8vPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRleHRlbmQoJCwge1xuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8galF1ZXJ5ICQudmlldygpIHBsdWdpblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09XG5cblx0dmlldzogJHZpZXcgPSBmdW5jdGlvbihub2RlLCBpbm5lciwgdHlwZSkge1xuXHRcdC8vICQudmlldygpIHJldHVybnMgdG9wIHZpZXdcblx0XHQvLyAkLnZpZXcobm9kZSkgcmV0dXJucyB2aWV3IHRoYXQgY29udGFpbnMgbm9kZVxuXHRcdC8vICQudmlldyhzZWxlY3RvcikgcmV0dXJucyB2aWV3IHRoYXQgY29udGFpbnMgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudFxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgdHlwZSkgcmV0dXJucyBuZWFyZXN0IGNvbnRhaW5pbmcgdmlldyBvZiBnaXZlbiB0eXBlXG5cdFx0Ly8gJC52aWV3KG5vZGVPclNlbGVjdG9yLCBcInJvb3RcIikgcmV0dXJucyByb290IGNvbnRhaW5pbmcgdmlldyAoY2hpbGQgb2YgdG9wIHZpZXcpXG5cdFx0Ly8gJC52aWV3KG5vZGVPclNlbGVjdG9yLCB0cnVlLCB0eXBlKSByZXR1cm5zIG5lYXJlc3QgaW5uZXIgKGNvbnRhaW5lZCkgdmlldyBvZiBnaXZlbiB0eXBlXG5cblx0XHRmdW5jdGlvbiBnZXRJbm5lclZpZXcobmQsIGlzVmwpIHtcblx0XHRcdGlmIChuZCkge1xuXHRcdFx0XHR2d0luZm9zID0gdmlld0luZm9zKG5kLCBpc1ZsLCByT3BlblZpZXdNYXJrZXJzKTtcblx0XHRcdFx0Zm9yIChqID0gMCwgayA9IHZ3SW5mb3MubGVuZ3RoOyBqIDwgazsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKCh2aWV3ID0gdmlld1N0b3JlW3Z3SW5mb3Nbal0uaWRdKSAmJiAodmlldyA9IHZpZXcgJiYgdHlwZSA/IHZpZXcuZ2V0KHRydWUsIHR5cGUpIDogdmlldykpIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpbm5lciAhPT0gISFpbm5lcikge1xuXHRcdFx0Ly8gaW5uZXIgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgdmlldyhub2RlT3JTZWxlY3RvciwgdHlwZSlcblx0XHRcdHR5cGUgPSBpbm5lcjtcblx0XHRcdGlubmVyID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR2YXIgdmlldywgdndJbmZvcywgaSwgaiwgaywgbCwgZWxlbXMsXG5cdFx0XHRsZXZlbCA9IDAsXG5cdFx0XHRib2R5ID0gZG9jdW1lbnQuYm9keTtcblxuXHRcdGlmIChub2RlICYmIG5vZGUgIT09IGJvZHkgJiYgdG9wVmlldy5fLnVzZUtleSA+IDEpIHtcblx0XHRcdC8vIFBlcmYgb3B0aW1pemF0aW9uIGZvciBjb21tb24gY2FzZXNcblxuXHRcdFx0bm9kZSA9IFwiXCIgKyBub2RlID09PSBub2RlXG5cdFx0XHRcdD8gJChub2RlKVswXVxuXHRcdFx0XHQ6IG5vZGUuanF1ZXJ5XG5cdFx0XHRcdFx0PyBub2RlWzBdXG5cdFx0XHRcdFx0OiBub2RlO1xuXG5cdFx0XHRpZiAobm9kZSkge1xuXHRcdFx0XHRpZiAoaW5uZXIpIHtcblx0XHRcdFx0XHRnZXRJbm5lclZpZXcobm9kZS5fZGYsIHRydWUpO1xuXHRcdFx0XHRcdGlmICghdmlldykge1xuXHRcdFx0XHRcdFx0Ly8gVHJlYXQgc3VwcGxpZWQgbm9kZSBhcyBhIGNvbnRhaW5lciBlbGVtZW50IGFuZCByZXR1cm4gdGhlIGZpcnN0IHZpZXcgZW5jb3VudGVyZWQuXG5cdFx0XHRcdFx0XHRlbGVtcyA9IHFzYSA/IG5vZGUucXVlcnlTZWxlY3RvckFsbChiaW5kRWxzU2VsKSA6ICQoYmluZEVsc1NlbCwgbm9kZSkuZ2V0KCk7XG5cdFx0XHRcdFx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgIXZpZXcgJiYgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRnZXRJbm5lclZpZXcoZWxlbXNbaV0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmlldztcblx0XHRcdFx0fVxuXHRcdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRcdC8vIE1vdmUgYmFjayB0aHJvdWdoIHNpYmxpbmdzIGFuZCB1cCB0aHJvdWdoIHBhcmVudHMgdG8gZmluZCBwcmVjZWRpbmcgbm9kZSB3aGljaCBpcyBhIF9wcnYgKHByZXZOb2RlKVxuXHRcdFx0XHRcdC8vIHNjcmlwdCBtYXJrZXIgbm9kZSBmb3IgYSBub24tZWxlbWVudC1jb250ZW50IHZpZXcsIG9yIGEgX3BydiAoZmlyc3Qgbm9kZSkgZm9yIGFuIGVsQ250IHZpZXdcblx0XHRcdFx0XHRpZiAodndJbmZvcyA9IHZpZXdJbmZvcyhub2RlLCB1bmRlZmluZWQsIHJWaWV3TWFya2VycykpIHtcblx0XHRcdFx0XHRcdGwgPSB2d0luZm9zLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdFx0dmlldyA9IHZ3SW5mb3NbbF07XG5cdFx0XHRcdFx0XHRcdGlmICh2aWV3Lm9wZW4pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobGV2ZWwgPCAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2aWV3ID0gdmlld1N0b3JlW3ZpZXcuaWRdO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHZpZXcgJiYgdHlwZSA/IHZpZXcuZ2V0KHR5cGUpIDogdmlldyB8fCB0b3BWaWV3O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRsZXZlbC0tO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGxldmVsIHN0YXJ0cyBhdCB6ZXJvLiBJZiB3ZSBoaXQgYSB2aWV3LmNsb3NlLCB0aGVuIHdlIG1vdmUgbGV2ZWwgdG8gMSwgYW5kIHdlIGRvbid0IHJldHVybiBhIHZpZXcgdW50aWxcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBhcmUgYmFjayBhdCBsZXZlbCB6ZXJvIChvciBhIHBhcmVudCB2aWV3IHdpdGggbGV2ZWwgPCAwKVxuXHRcdFx0XHRcdFx0XHRcdGxldmVsKys7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nIHx8IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdG9wVmlldztcblx0fSxcblxuXHRsaW5rOiAkbGluayxcblx0dW5saW5rOiAkdW5saW5rLFxuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09XG5cdC8vIG92ZXJyaWRlICQuY2xlYW5EYXRhXG5cdC8vPT09PT09PT09PT09PT09PT09PT09XG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oZWxlbXMpIHtcblx0XHRpZiAoZWxlbXMubGVuZ3RoICYmIGlzQ2xlYW5DYWxsKSB7XG5cdFx0XHQvLyBSZW1vdmUgSnNWaWV3cyBiaW5kaW5ncy4gQWxzbywgcmVtb3ZlIGZyb20gdGhlIERPTSBhbnkgY29ycmVzcG9uZGluZyBzY3JpcHQgbWFya2VyIG5vZGVzXG5cdFx0XHRjbGVhbihlbGVtcyk7XG5cdFx0fVxuXHRcdG9sZENsZWFuRGF0YS5hcHBseSgkLCBhcmd1bWVudHMpO1xuXHR9XG59KTtcblxuLy8gUG9zc2libGUgZnV0dXJlIGFkZGl0aW9uIC0gZS5nLiBmb3IgY2tlZGl0b3IgdGFnIGNvbnRyb2xcbi8vJHZpZXdzLnV0aWxpdHkgPSB7XG4vL1x0dmFsaWRhdGU6IGZ1bmN0aW9uKGh0bWwpIHtcbi8vXHRcdHRyeSB7XG4vL1x0XHRcdHRvcFZpZXcubGluayh1bmRlZmluZWQsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBodG1sLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgMSk7XG4vL1x0XHR9XG4vL1x0XHRjYXRjaCAoZSkge1xuLy9cdFx0XHRyZXR1cm4gZS5tZXNzYWdlO1xuLy9cdFx0fVxuLy9cdH1cbi8vfTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgalF1ZXJ5IGluc3RhbmNlIHBsdWdpbnNcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kZXh0ZW5kKCQuZm4sIHtcblx0bGluazogZnVuY3Rpb24oZXhwciwgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRcdHJldHVybiAkbGluayhleHByLCB0aGlzLCBmcm9tLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50VmlldywgcHJldk5vZGUsIG5leHROb2RlKTtcblx0fSxcblx0dW5saW5rOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJHVubGluayh0aGlzKTtcblx0fSxcblx0dmlldzogZnVuY3Rpb24oaW5uZXIsIHR5cGUpIHtcblx0XHRyZXR1cm4gJHZpZXcodGhpc1swXSwgaW5uZXIsIHR5cGUpO1xuXHR9XG59KTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE92ZXJyaWRlIGpRdWVyeSBtZXRob2RzIHRoYXQgY2FsbCBvdXIgb3ZlcnJpZGRlbiBjbGVhbkRhdGEsIGZvciBkaXNwb3NhbCBldGMuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kLmVhY2goW0hUTUwsIFwicmVwbGFjZVdpdGhcIiwgXCJlbXB0eVwiLCBcInJlbW92ZVwiXSwgZnVuY3Rpb24oaSwgbmFtZSkge1xuXHR2YXIgb2xkRm4gPSAkLmZuW25hbWVdO1xuXHQkLmZuW25hbWVdID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJlc3VsdDtcblx0XHRpc0NsZWFuQ2FsbCA9IDE7IC8vIE1ha2Ugc3VyZSBjbGVhbkRhdGEgZG9lcyBkaXNwb3NhbCBvbmx5IHdoZW4gY29taW5nIGZyb20gdGhlc2UgY2FsbHMuXG5cdFx0dHJ5IHtcblx0XHRcdHJlc3VsdCA9IG9sZEZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0fVxuXHRcdGZpbmFsbHkge1xuXHRcdFx0aXNDbGVhbkNhbGwgPSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xufSk7XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgdG9wVmlld1xuLy89PT09PT09PT09PT09PT1cblxuYWRkTGlua01ldGhvZHMoJGV4dGVuZCh0b3BWaWV3ID0gJHN1Yi50b3BWaWV3LCB7dG1wbDoge2xpbmtzOiB7fX19KSk7XG5cbnZpZXdTdG9yZSA9IHswOiB0b3BWaWV3fTsgLy8gVG9wLWxldmVsIHZpZXdcbi8vPT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgJC52aWV3c1xuLy89PT09PT09PT09PT09PT1cblxuJHZpZXdzLmdldEN0eCA9IGZ1bmN0aW9uKHBhcmFtKSB7IC8vIFJldHVybiB2YWx1ZSBvZiBjdHguZm9vLCBpbmNsdWRpbmcgZm9yIGNvbXBpbGVkIGNvbnRleHR1YWwgcGFyYW1ldGVycywgfmZvbz1leHByXG5cdGlmIChwYXJhbSAmJiBwYXJhbS5fY3ApIHsgLy8gSWYgdGhpcyBoZWxwZXIgcmVzb3VyY2UgaXMgYSBjb250ZXh0dWFsIHBhcmFtZXRlciwgfmZvbz1leHByXG5cdFx0cGFyYW0gPSAgcGFyYW1bMV0ocGFyYW1bMF0uZGF0YSwgcGFyYW1bMF0sICRzdWIpO1xuXHR9XG5cdHJldHVybiBwYXJhbTtcbn07XG5cbi8vPT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kICQudmlld3Muc3ViXG4vLz09PT09PT09PT09PT09PT09PT1cblxuJHN1Yi5fY3AgPSBmdW5jdGlvbihwYXJhbVZhbCwgcGFyYW1zLCB2aWV3KSB7IC8vIEdldCBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMgKG9yIHByb3BlcnRpZXMpIH5mb289ZXhwci5cblx0aWYgKHZpZXcubGlua2VkKSB7IC8vIEluIEpzVmlld3MsIHJldHVybnMgW3ZpZXcsIGxpbmtGbl0gd2hlcmUgbGlua0ZuIGlzIGNvbXBpbGVkIGZ1bmN0aW9uIGZvciBleHByZXNzaW9uXG5cdFx0cGFyYW1zID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIHBhcmFtcyArIGRlbGltQ2xvc2VDaGFyMDtcblx0XHR2YXIgdG1wbCA9IHZpZXcudG1wbCxcblx0XHRcdGxpbmtzID0gdG9wVmlldy50bXBsLmxpbmtzLCAvLyBVc2UgdG9wVmlldyBsaW5rcywgYXMgZm9yIGNvbXBpbGVkIHRvcC1sZXZlbCBsaW5raW5nIGV4cHJlc3Npb25zLiBUbyBkbyAtIHNob3VsZCB0aGlzIGV2ZXIgZ2V0IGRpc3Bvc2VkP1xuXHRcdFx0bGlua0ZuID0gbGlua3NbcGFyYW1zXTtcblx0XHRpZiAoIWxpbmtGbikge1xuXHRcdFx0bGlua3NbcGFyYW1zXSA9IGxpbmtGbiA9ICRzdWIudG1wbEZuKHBhcmFtcywgdG1wbCwgdHJ1ZSk7XG5cdFx0fVxuXHRcdHBhcmFtVmFsID0gW3ZpZXcsIGxpbmtGbl07XG5cdFx0cGFyYW1WYWwuX2NwID0gdHJ1ZTsgLy8gRmxhZyB0aGF0IHRoaXMgaXMgYSBjb250ZXh0dWFsIHBhcmFtZXRlclxuXHR9XG5cdHJldHVybiBwYXJhbVZhbDsgLy8gSW4gSnNSZW5kZXIgcmV0dXJucyBldmFsdWF0ZWQgZXhwcmVzc2lvblxufTtcblxuJHN1Yi5fY2VvID0gZnVuY3Rpb24gY2xvbmVFeHByT2JqZWN0cyhvYnMpIHsgIC8vIENsb25lIGV4cHJPYnMgc28gdGhhdCBlYWNoIHJlZmVyZW5jZWQgY29udGV4dHVhbCBwYXJhbWV0ZXIgfmZvbyB1c2VzIGl0cyBvd24gZXhwck9iIGluc3RhbmNlc1xuXHR2YXIgb2IsXG5cdFx0Y2xvbmVzID0gb2JzLFxuXHRcdGwgPSBvYnMubGVuZ3RoO1xuXHRpZiAobCkge1xuXHRcdGNsb25lcyA9IFtdO1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdG9iID0gb2JzW2xdO1xuXHRcdFx0aWYgKG9iLl9qc3YpIHtcblx0XHRcdFx0b2IgPSAkZXh0ZW5kKHt9LCBvYik7ICAgICAgICAgICAgICAvLyBJZiBhbiBleHByT2IsIGNsb25lIGl0LiBJZiBhIHN0cmluZywga2VlcCBhcyBpc1xuXHRcdFx0XHRvYi5wcm0gPSBjbG9uZUV4cHJPYmplY3RzKG9iLnBybSk7IC8vIFJlY3Vyc2l2ZWx5IGNsb25lIGV4cHJPYnMgaW4gcGFyYW1ldGVycywgdG9vXG5cdFx0XHR9XG5cdFx0XHRjbG9uZXMudW5zaGlmdChvYik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBjbG9uZXM7XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCAkLnZpZXdzLnNldHRpbmdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT1cblxub2xkQWR2U2V0ID0gJHN1Yi5hZHZTZXQ7XG5cbiRzdWIuYWR2U2V0ID0gZnVuY3Rpb24oKSB7IC8vIHJlZnJlc2ggYWR2YW5jZWQgc2V0dGluZ3Ncblx0b2xkQWR2U2V0KCk7XG5cdGdsb2JhbC5fanN2ID0gJHN1YlNldHRpbmdzQWR2YW5jZWQuX2pzdlxuXHRcdD8gJGV4dGVuZChnbG9iYWwuX2pzdiB8fCB7fSwgeyAvLyBjcmVhdGUgZ2xvYmFsIF9qc3YsIGZvciBhY2Nlc3Npbmcgdmlld3MsIGV0Y1xuXHRcdFx0XHR2aWV3czogdmlld1N0b3JlLFxuXHRcdFx0XHRiaW5kaW5nczogYmluZGluZ1N0b3JlXG5cdFx0XHR9KVxuXHRcdDogdW5kZWZpbmVkOyAvLyBJbiBJRTggY2Fubm90IGRvIGRlbGV0ZSBnbG9iYWwuX2pzdlxuXHQkdmlld3NMaW5rQXR0ciA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLmxpbmtBdHRyO1xuXHRsaW5rVmlld3NTZWwgPSBiaW5kRWxzU2VsICsgXCIsW1wiICsgJHZpZXdzTGlua0F0dHIgKyBcIl1cIjtcblx0d3JhcE1hcCA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl93bTtcblx0d3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXHR3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xuXHR3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcbn07XG5cbiR2aWV3c1NldHRpbmdzLmFkdmFuY2VkKHtcblx0bGlua0F0dHI6IFwiZGF0YS1saW5rXCIsXG5cdHVzZVZpZXdzOiBmYWxzZSxcblx0bm9WYWxpZGF0ZTogZmFsc2UsXG5cdC8vIHdyYXBNYXAgcHJvdmlkZSBhcHByb3ByaWF0ZSB3cmFwcGVycyBmb3IgaW5zZXJ0aW5nIGlubmVySFRNTCwgdXNlZCBpbiBpbnNlcnRCZWZvcmVcblx0Ly8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMClcblx0Ly8gVE9ETyBpbnZlc3RpZ2F0ZSB3aGV0aGVyIG1vcmUgcmVjZW50IGpRdWVyeSBpbXBsZW1lbnRhdGlvbiB1c2luZyB3cmFwTWFwIGluIGRvbU1hbmlwLyQoKS5odG1sKCkgZXRjLiBpcyBiZXR0ZXIgb3B0aW1pemVkIG5vdy4uLlxuXHRfd206IHtcblx0XHRvcHRpb246IFsxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIl0sXG5cdFx0bGVnZW5kOiBbMSwgXCI8ZmllbGRzZXQ+XCIsIFwiPC9maWVsZHNldD5cIl0sXG5cdFx0YXJlYTogWzEsIFwiPG1hcD5cIiwgXCI8L21hcD5cIl0sXG5cdFx0cGFyYW06IFsxLCBcIjxvYmplY3Q+XCIsIFwiPC9vYmplY3Q+XCJdLFxuXHRcdHRoZWFkOiBbMSwgXCI8dGFibGU+XCIsIFwiPC90YWJsZT5cIl0sXG5cdFx0dHI6IFsyLCBcIjx0YWJsZT48dGJvZHk+XCIsIFwiPC90Ym9keT48L3RhYmxlPlwiXSxcblx0XHR0ZDogWzMsIFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsIFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCJdLFxuXHRcdGNvbDogWzIsIFwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCJdLFxuXHRcdHN2Z19uczogWzEsIFwiPHN2Zz5cIiwgXCI8L3N2Zz5cIl0sXG5cdFx0Ly8gSUU2LTggY2FuJ3Qgc2VyaWFsaXplIGxpbmssIHNjcmlwdCwgc3R5bGUsIG9yIGFueSBodG1sNSAoTm9TY29wZSkgdGFncyxcblx0XHQvLyB1bmxlc3Mgd3JhcHBlZCBpbiBhIGRpdiB3aXRoIG5vbi1icmVha2luZyBjaGFyYWN0ZXJzIGluIGZyb250IG9mIGl0LlxuXHRcdGRpdjogJC5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgPyBbMCwgXCJcIiwgXCJcIl0gOiBbMSwgXCJYPGRpdj5cIiwgXCI8L2Rpdj5cIl1cblx0fSxcblx0X2ZlOiB7XG5cdFx0aW5wdXQ6IHtcblx0XHRcdGZyb206IGlucHV0QXR0cmliLCB0bzogXCJ2YWx1ZVwiXG5cdFx0fSxcblx0XHR0ZXh0YXJlYTogdmFsdWVCaW5kaW5nLFxuXHRcdHNlbGVjdDogdmFsdWVCaW5kaW5nLFxuXHRcdG9wdGdyb3VwOiB7XG5cdFx0XHR0bzogXCJsYWJlbFwiXG5cdFx0fVxuXHR9XG59KTtcblxuXHRyZXR1cm4gJDtcbn0sIHdpbmRvdykpO1xuIiwiLyohIGpzdmlld3MuanMgdjAuOS44MiAoQmV0YSkgc2luZ2xlLWZpbGUgdmVyc2lvbjogaHR0cDovL2pzdmlld3MuY29tLyAqL1xuLyohIGluY2x1ZGVzIEpzUmVuZGVyLCBKc09ic2VydmFibGUgYW5kIEpzVmlld3MgLSBzZWU6IGh0dHA6Ly9qc3ZpZXdzLmNvbS8jZG93bmxvYWQgKi9cblxuLyogSW50ZXJhY3RpdmUgZGF0YS1kcml2ZW4gdmlld3MgdXNpbmcgSnNSZW5kZXIgdGVtcGxhdGVzICovXG5cbi8vPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IEpzUmVuZGVyID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuLyogSnNSZW5kZXI6XG4gKiBTZWUgaHR0cDovL2pzdmlld3MuY29tLyNqc3JlbmRlciBhbmQgaHR0cDovL2dpdGh1Yi5jb20vQm9yaXNNb29yZS9qc3JlbmRlclxuICogQ29weXJpZ2h0IDIwMTYsIEJvcmlzIE1vb3JlXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuLy9qc2hpbnQgLVcwMTgsIC1XMDQxXG5cbihmdW5jdGlvbihmYWN0b3J5LCBnbG9iYWwpIHtcblx0Ly8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcblx0dmFyICQgPSBnbG9iYWwualF1ZXJ5O1xuXG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikgeyAvLyBDb21tb25KUyBlLmcuIEJyb3dzZXJpZnlcblx0XHRtb2R1bGUuZXhwb3J0cyA9ICRcblx0XHRcdD8gZmFjdG9yeShnbG9iYWwsICQpXG5cdFx0XHQ6IGZ1bmN0aW9uKCQpIHsgLy8gSWYgbm8gZ2xvYmFsIGpRdWVyeSwgdGFrZSBqUXVlcnkgcGFzc2VkIGFzIHBhcmFtZXRlcjogcmVxdWlyZShcImpzdmlld3NcIikoalF1ZXJ5KVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdFx0fTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgeyAvLyBBTUQgc2NyaXB0IGxvYWRlciwgZS5nLiBSZXF1aXJlSlNcblx0XHRkZWZpbmUoW1wianF1ZXJ5XCJdLCBmdW5jdGlvbigkKSB7XG5cdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdH0pOyAvLyBSZXF1aXJlIGpRdWVyeVxuXHR9IGVsc2UgeyAvLyBCcm93c2VyIHVzaW5nIHBsYWluIDxzY3JpcHQ+IHRhZ1xuXHRcdGZhY3RvcnkoZ2xvYmFsLCBmYWxzZSk7XG5cdH1cbn0gKFxuXG4vLyBmYWN0b3J5IChmb3IganN2aWV3cy5qcylcbmZ1bmN0aW9uKGdsb2JhbCwgJCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcbnZhciBzZXRHbG9iYWxzID0gJCA9PT0gZmFsc2U7IC8vIE9ubHkgc2V0IGdsb2JhbHMgaWYgc2NyaXB0IGJsb2NrIGluIGJyb3dzZXIgKG5vdCBBTUQgYW5kIG5vdCBDb21tb25KUylcblxuJCA9ICQgfHwgZ2xvYmFsLmpRdWVyeTsgLy8gJCBpcyBqUXVlcnkgcGFzc2VkIGluIGJ5IENvbW1vbkpTIGxvYWRlciAoQnJvd3NlcmlmeSksIG9yIGdsb2JhbCBqUXVlcnkuXG5cbmlmICghJCB8fCAhJC5mbikge1xuXHQvLyBqUXVlcnkgaXMgbm90IGxvYWRlZC5cblx0dGhyb3cgXCJKc1ZpZXdzIHJlcXVpcmVzIGpRdWVyeVwiOyAvLyBXZSByZXF1aXJlIGpRdWVyeVxufVxuXG52YXIgdmVyc2lvbk51bWJlciA9IFwidjAuOS44MlwiLFxuXG5cdGpzdlN0b3JlTmFtZSwgclRhZywgclRtcGxTdHJpbmcsIHRvcFZpZXcsICR2aWV3cywgJG9ic2VydmUsICRvYnNlcnZhYmxlLCAkZXhwYW5kbyxcblxuLy9UT0RPXHR0bXBsRm5zQ2FjaGUgPSB7fSxcblx0JGlzRnVuY3Rpb24sICRpc0FycmF5LCAkdGVtcGxhdGVzLCAkY29udmVydGVycywgJGhlbHBlcnMsICR0YWdzLCAkc3ViLCAkc3ViU2V0dGluZ3MsICRzdWJTZXR0aW5nc0FkdmFuY2VkLCAkdmlld3NTZXR0aW5ncywgZGVsaW1PcGVuQ2hhcjAsIGRlbGltT3BlbkNoYXIxLCBkZWxpbUNsb3NlQ2hhcjAsIGRlbGltQ2xvc2VDaGFyMSwgbGlua0NoYXIsIHNldHRpbmcsIGJhc2VPbkVycm9yLFxuXG5cdHJQYXRoID0gL14oISo/KSg/Om51bGx8dHJ1ZXxmYWxzZXxcXGRbXFxkLl0qfChbXFx3JF0rfFxcLnx+KFtcXHckXSspfCModmlld3woW1xcdyRdKykpPykoW1xcdyQuXl0qPykoPzpbLlteXShbXFx3JF0rKVxcXT8pPykkL2csXG5cdC8vICAgICAgICBub3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ICAgICBoZWxwZXIgICAgdmlldyAgdmlld1Byb3BlcnR5IHBhdGhUb2tlbnMgICAgICBsZWFmVG9rZW5cblxuXHRyUGFyYW1zID0gLyhcXCgpKD89XFxzKlxcKCl8KD86KFsoW10pXFxzKik/KD86KFxcXj8pKCEqP1sjfl0/W1xcdyQuXl0rKT9cXHMqKChcXCtcXCt8LS0pfFxcK3wtfCYmfFxcfFxcfHw9PT18IT09fD09fCE9fDw9fD49fFs8PiUqOj9cXC9dfCg9KSlcXHMqfCghKj9bI35dP1tcXHckLl5dKykoWyhbXSk/KXwoLFxccyopfChcXCg/KVxcXFw/KD86KCcpfChcIikpfCg/OlxccyooKFspXFxdXSkoPz1cXHMqWy5eXXxcXHMqJHxbXihbXSl8WylcXF1dKShbKFtdPykpfChcXHMrKS9nLFxuXHQvLyAgICAgICAgICBsZnRQcm4wICAgICAgICBsZnRQcm4gICAgICAgIGJvdW5kICAgICAgICAgICAgcGF0aCAgICBvcGVyYXRvciBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcSAgICAgICAgICAgICBwYXRoMiAgICAgICBwcm4gICAgY29tbWEgICBsZnRQcm4yICAgYXBvcyBxdW90ICAgICAgcnRQcm4gcnRQcm5Eb3QgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm4yICBzcGFjZVxuXHQvLyAobGVmdCBwYXJlbj8gZm9sbG93ZWQgYnkgKHBhdGg/IGZvbGxvd2VkIGJ5IG9wZXJhdG9yKSBvciAocGF0aCBmb2xsb3dlZCBieSBsZWZ0IHBhcmVuPykpIG9yIGNvbW1hIG9yIGFwb3Mgb3IgcXVvdCBvciByaWdodCBwYXJlbiBvciBzcGFjZVxuXG5cdGlzUmVuZGVyQ2FsbCxcblx0ck5ld0xpbmUgPSAvWyBcXHRdKihcXHJcXG58XFxufFxccikvZyxcblx0clVuZXNjYXBlUXVvdGVzID0gL1xcXFwoWydcIl0pL2csXG5cdHJFc2NhcGVRdW90ZXMgPSAvWydcIlxcXFxdL2csIC8vIEVzY2FwZSBxdW90ZXMgYW5kIFxcIGNoYXJhY3RlclxuXHRyQnVpbGRIYXNoID0gLyg/OlxceDA4fF4pKG9uZXJyb3I6KT8oPzoofj8pKChbXFx3JF9cXC5dKyk6KT8oW15cXHgwOF0rKSlcXHgwOCgsKT8oW15cXHgwOF0rKS9naSxcblx0clRlc3RFbHNlSWYgPSAvXmlmXFxzLyxcblx0ckZpcnN0RWxlbSA9IC88KFxcdyspWz5cXHNdLyxcblx0ckF0dHJFbmNvZGUgPSAvW1xceDAwYD48XCInJj1dL2csIC8vIEluY2x1ZGVzID4gZW5jb2Rpbmcgc2luY2UgckNvbnZlcnRNYXJrZXJzIGluIEpzVmlld3MgZG9lcyBub3Qgc2tpcCA+IGNoYXJhY3RlcnMgaW4gYXR0cmlidXRlIHN0cmluZ3Ncblx0cklzSHRtbCA9IC9bXFx4MDBgPjxcXFwiJyY9XS8sXG5cdHJIYXNIYW5kbGVycyA9IC9eb25bQS1aXXxeY29udmVydChCYWNrKT8kLyxcblx0cldyYXBwZWRJblZpZXdNYXJrZXIgPSAvXlxcI1xcZCtfYFtcXHNcXFNdKlxcL1xcZCtfYCQvLFxuXHRySHRtbEVuY29kZSA9IHJBdHRyRW5jb2RlLFxuXHR2aWV3SWQgPSAwLFxuXHRjaGFyRW50aXRpZXMgPSB7XG5cdFx0XCImXCI6IFwiJmFtcDtcIixcblx0XHRcIjxcIjogXCImbHQ7XCIsXG5cdFx0XCI+XCI6IFwiJmd0O1wiLFxuXHRcdFwiXFx4MDBcIjogXCImIzA7XCIsXG5cdFx0XCInXCI6IFwiJiMzOTtcIixcblx0XHQnXCInOiBcIiYjMzQ7XCIsXG5cdFx0XCJgXCI6IFwiJiM5NjtcIixcblx0XHRcIj1cIjogXCImIzYxO1wiXG5cdH0sXG5cdEhUTUwgPSBcImh0bWxcIixcblx0T0JKRUNUID0gXCJvYmplY3RcIixcblx0dG1wbEF0dHIgPSBcImRhdGEtanN2LXRtcGxcIixcblx0anN2VG1wbCA9IFwianN2VG1wbFwiLFxuXHRpbmRleFN0ciA9IFwiRm9yICNpbmRleCBpbiBuZXN0ZWQgYmxvY2sgdXNlICNnZXRJbmRleCgpLlwiLFxuXHQkcmVuZGVyID0ge30sXG5cblx0anNyID0gZ2xvYmFsLmpzcmVuZGVyLFxuXHRqc3JUb0pxID0ganNyICYmICQgJiYgISQucmVuZGVyLCAvLyBKc1JlbmRlciBhbHJlYWR5IGxvYWRlZCwgd2l0aG91dCBqUXVlcnkuIGJ1dCB3ZSB3aWxsIHJlLWxvYWQgaXQgbm93IHRvIGF0dGFjaCB0byBqUXVlcnlcblxuXHRqc3ZTdG9yZXMgPSB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdGNvbXBpbGU6IGNvbXBpbGVUbXBsXG5cdFx0fSxcblx0XHR0YWc6IHtcblx0XHRcdGNvbXBpbGU6IGNvbXBpbGVUYWdcblx0XHR9LFxuXHRcdHZpZXdNb2RlbDoge1xuXHRcdFx0Y29tcGlsZTogY29tcGlsZVZpZXdNb2RlbFxuXHRcdH0sXG5cdFx0aGVscGVyOiB7fSxcblx0XHRjb252ZXJ0ZXI6IHt9XG5cdH07XG5cblx0Ly8gdmlld3Mgb2JqZWN0ICgkLnZpZXdzIGlmIGpRdWVyeSBpcyBsb2FkZWQsIGpzcmVuZGVyLnZpZXdzIGlmIG5vIGpRdWVyeSwgZS5nLiBpbiBOb2RlLmpzKVxuXHQkdmlld3MgPSB7XG5cdFx0anN2aWV3czogdmVyc2lvbk51bWJlcixcblx0XHRzdWI6IHtcblx0XHRcdC8vIHN1YnNjcmlwdGlvbiwgZS5nLiBKc1ZpZXdzIGludGVncmF0aW9uXG5cdFx0XHRWaWV3OiBWaWV3LFxuXHRcdFx0RXJyOiBKc1ZpZXdzRXJyb3IsXG5cdFx0XHR0bXBsRm46IHRtcGxGbixcblx0XHRcdHBhcnNlOiBwYXJzZVBhcmFtcyxcblx0XHRcdGV4dGVuZDogJGV4dGVuZCxcblx0XHRcdGV4dGVuZEN0eDogZXh0ZW5kQ3R4LFxuXHRcdFx0c3ludGF4RXJyOiBzeW50YXhFcnJvcixcblx0XHRcdG9uU3RvcmU6IHt9LFxuXHRcdFx0YWRkU2V0dGluZzogYWRkU2V0dGluZyxcblx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdGFsbG93Q29kZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRhZHZTZXQ6IG5vb3AsIC8vIFVwZGF0ZSBhZHZhbmNlZCBzZXR0aW5nc1xuXHRcdFx0X3RoczogdGFnSGFuZGxlcnNGcm9tUHJvcHMsXG5cdFx0XHRfdGc6IGZ1bmN0aW9uKCkge30sIC8vIENvbnN0cnVjdG9yIGZvciB0YWdEZWZcblx0XHRcdF9jbnZ0OiBjb252ZXJ0VmFsLFxuXHRcdFx0X3RhZzogcmVuZGVyVGFnLFxuXHRcdFx0X2VyOiBlcnJvcixcblx0XHRcdF9lcnI6IG9uUmVuZGVyRXJyb3IsXG5cdFx0XHRfaHRtbDogaHRtbEVuY29kZSxcblx0XHRcdF9jcDogcmV0VmFsLCAvLyBHZXQgY29tcGlsZWQgY29udGV4dHVhbCBwYXJhbWV0ZXJzIChvciBwcm9wZXJ0aWVzKSB+Zm9vPWV4cHIuIEluIEpzUmVuZGVyLCBzaW1wbHkgcmV0dXJucyB2YWwuXG5cdFx0XHRfc3E6IGZ1bmN0aW9uKHRva2VuKSB7XG5cdFx0XHRcdGlmICh0b2tlbiA9PT0gXCJjb25zdHJ1Y3RvclwiKSB7XG5cdFx0XHRcdFx0c3ludGF4RXJyb3IoXCJcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRva2VuO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2V0dGluZ3M6IHtcblx0XHRcdGRlbGltaXRlcnM6ICR2aWV3c0RlbGltaXRlcnMsXG5cdFx0XHRhZHZhbmNlZDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdFx0PyAoXG5cdFx0XHRcdFx0XHRcdCRleHRlbmQoJHN1YlNldHRpbmdzQWR2YW5jZWQsIHZhbHVlKSxcblx0XHRcdFx0XHRcdFx0JHN1Yi5hZHZTZXQoKSxcblx0XHRcdFx0XHRcdFx0JHZpZXdzU2V0dGluZ3Ncblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogJHN1YlNldHRpbmdzQWR2YW5jZWQ7XG5cdFx0XHRcdH1cblx0XHR9LFxuXHRcdGdldEN0eDogcmV0VmFsLCAvLyBHZXQgY3R4LmZvbyB2YWx1ZS4gSW4gSnNSZW5kZXIsIHNpbXBseSByZXR1cm5zIHZhbC5cblx0XHRtYXA6IGRhdGFNYXAgICAgLy8gSWYganNPYnNlcnZhYmxlIGxvYWRlZCBmaXJzdCwgdXNlIHRoYXQgZGVmaW5pdGlvbiBvZiBkYXRhTWFwXG5cdH07XG5cbmZ1bmN0aW9uIGdldERlcml2ZWRNZXRob2QoYmFzZU1ldGhvZCwgbWV0aG9kKSB7XG5cdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHR2YXIgcmV0LFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdHByZXZCYXNlID0gdGFnLmJhc2U7XG5cblx0XHR0YWcuYmFzZSA9IGJhc2VNZXRob2Q7IC8vIFdpdGhpbiBtZXRob2QgY2FsbCwgY2FsbGluZyB0aGlzLmJhc2Ugd2lsbCBjYWxsIHRoZSBiYXNlIG1ldGhvZFxuXHRcdHJldCA9IG1ldGhvZC5hcHBseSh0YWcsIGFyZ3VtZW50cyk7IC8vIENhbGwgdGhlIG1ldGhvZFxuXHRcdHRhZy5iYXNlID0gcHJldkJhc2U7IC8vIFJlcGxhY2UgdGhpcy5iYXNlIHRvIGJlIHRoZSBiYXNlIG1ldGhvZCBvZiB0aGUgcHJldmlvdXMgY2FsbCwgZm9yIGNoYWluZWQgY2FsbHNcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRNZXRob2QoYmFzZU1ldGhvZCwgbWV0aG9kKSB7XG5cdC8vIEZvciBkZXJpdmVkIG1ldGhvZHMgKG9yIGhhbmRsZXJzIGRlY2xhcmVkIGRlY2xhcmF0aXZlbHkgYXMgaW4ge3s6Zm9vIG9uQ2hhbmdlPX5mb29DaGFuZ2VkfX0gcmVwbGFjZSBieSBhIGRlcml2ZWQgbWV0aG9kLCB0byBhbGxvdyB1c2luZyB0aGlzLmJhc2UoLi4uKVxuXHQvLyBvciB0aGlzLmJhc2VBcHBseShhcmd1bWVudHMpIHRvIGNhbGwgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24uIChFcXVpdmFsZW50IHRvIHRoaXMuX3N1cGVyKC4uLikgYW5kIHRoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSBpbiBqUXVlcnkgVUkpXG5cdGlmICgkaXNGdW5jdGlvbihtZXRob2QpKSB7XG5cdFx0bWV0aG9kID0gZ2V0RGVyaXZlZE1ldGhvZChcblx0XHRcdFx0IWJhc2VNZXRob2Rcblx0XHRcdFx0XHQ/IG5vb3AgLy8gbm8gYmFzZSBtZXRob2QgaW1wbGVtZW50YXRpb24sIHNvIHVzZSBub29wIGFzIGJhc2UgbWV0aG9kXG5cdFx0XHRcdFx0OiBiYXNlTWV0aG9kLl9kXG5cdFx0XHRcdFx0XHQ/IGJhc2VNZXRob2QgLy8gYmFzZU1ldGhvZCBpcyBhIGRlcml2ZWQgbWV0aG9kLCBzbyB1cyBpdFxuXHRcdFx0XHRcdFx0OiBnZXREZXJpdmVkTWV0aG9kKG5vb3AsIGJhc2VNZXRob2QpLCAvLyBiYXNlTWV0aG9kIGlzIG5vdCBkZXJpdmVkIHNvIG1ha2UgaXRzIGJhc2UgbWV0aG9kIGJlIHRoZSBub29wIG1ldGhvZFxuXHRcdFx0XHRtZXRob2Rcblx0XHRcdCk7XG5cdFx0bWV0aG9kLl9kID0gMTsgLy8gQWRkIGZsYWcgdGhhdCB0aGlzIGlzIGEgZGVyaXZlZCBtZXRob2Rcblx0fVxuXHRyZXR1cm4gbWV0aG9kO1xufVxuXG5mdW5jdGlvbiB0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eCkge1xuXHRmb3IgKHZhciBwcm9wIGluIHRhZ0N0eC5wcm9wcykge1xuXHRcdGlmIChySGFzSGFuZGxlcnMudGVzdChwcm9wKSkge1xuXHRcdFx0dGFnW3Byb3BdID0gZ2V0TWV0aG9kKHRhZ1twcm9wXSwgdGFnQ3R4LnByb3BzW3Byb3BdKTtcblx0XHRcdC8vIENvcHkgb3ZlciB0aGUgb25Gb28gcHJvcHMsIGNvbnZlcnQgYW5kIGNvbnZlcnRCYWNrIGZyb20gdGFnQ3R4LnByb3BzIHRvIHRhZyAob3ZlcnJpZGVzIHZhbHVlcyBpbiB0YWdEZWYpLlxuXHRcdFx0Ly8gTm90ZTogdW5zdXBwb3J0ZWQgc2NlbmFyaW86IGlmIGhhbmRsZXJzIGFyZSBkeW5hbWljYWxseSBhZGRlZCBeb25Gb289ZXhwcmVzc2lvbiB0aGlzIHdpbGwgd29yaywgYnV0IGR5bmFtaWNhbGx5IHJlbW92aW5nIHdpbGwgbm90IHdvcmsuXG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJldFZhbCh2YWwpIHtcblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHtcblx0cmV0dXJuIFwiXCI7XG59XG5cbmZ1bmN0aW9uIGRiZ0JyZWFrKHZhbCkge1xuXHQvLyBVc2FnZSBleGFtcGxlczoge3tkYmc6Li4ufX0sIHt7On5kYmcoLi4uKX19LCB7e2RiZyAuLi4vfX0sIHtee2ZvciAuLi4gb25BZnRlckxpbms9fmRiZ319IGV0Yy5cblx0dHJ5IHtcblx0XHRjb25zb2xlLmxvZyhcIkpzUmVuZGVyIGRiZyBicmVha3BvaW50OiBcIiArIHZhbCk7XG5cdFx0dGhyb3cgXCJkYmcgYnJlYWtwb2ludFwiOyAvLyBUbyBicmVhayBoZXJlLCBzdG9wIG9uIGNhdWdodCBleGNlcHRpb25zLlxuXHR9XG5cdGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gdGhpcy5iYXNlID8gdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSA6IHZhbDtcbn1cblxuZnVuY3Rpb24gSnNWaWV3c0Vycm9yKG1lc3NhZ2UpIHtcblx0Ly8gRXJyb3IgZXhjZXB0aW9uIHR5cGUgZm9yIEpzVmlld3MvSnNSZW5kZXJcblx0Ly8gT3ZlcnJpZGUgb2YgJC52aWV3cy5zdWIuRXJyb3IgaXMgcG9zc2libGVcblx0dGhpcy5uYW1lID0gKCQubGluayA/IFwiSnNWaWV3c1wiIDogXCJKc1JlbmRlclwiKSArIFwiIEVycm9yXCI7XG5cdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgdGhpcy5uYW1lO1xufVxuXG5mdW5jdGlvbiAkZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG5cdGZvciAodmFyIG5hbWUgaW4gc291cmNlKSB7XG5cdFx0dGFyZ2V0W25hbWVdID0gc291cmNlW25hbWVdO1xuXHR9XG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbihKc1ZpZXdzRXJyb3IucHJvdG90eXBlID0gbmV3IEVycm9yKCkpLmNvbnN0cnVjdG9yID0gSnNWaWV3c0Vycm9yO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy89PT09PT09PT09PT09PT09PT09XG4vLyB2aWV3cy5kZWxpbWl0ZXJzXG4vLz09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gJHZpZXdzRGVsaW1pdGVycyhvcGVuQ2hhcnMsIGNsb3NlQ2hhcnMsIGxpbmspIHtcblx0Ly8gU2V0IHRoZSB0YWcgb3BlbmluZyBhbmQgY2xvc2luZyBkZWxpbWl0ZXJzIGFuZCAnbGluaycgY2hhcmFjdGVyLiBEZWZhdWx0IGlzIFwie3tcIiwgXCJ9fVwiIGFuZCBcIl5cIlxuXHQvLyBvcGVuQ2hhcnMsIGNsb3NlQ2hhcnM6IG9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyaW5ncywgZWFjaCB3aXRoIHR3byBjaGFyYWN0ZXJzXG5cdGlmICghb3BlbkNoYXJzKSB7XG5cdFx0cmV0dXJuICRzdWJTZXR0aW5ncy5kZWxpbWl0ZXJzO1xuXHR9XG5cdGlmICgkaXNBcnJheShvcGVuQ2hhcnMpKSB7XG5cdFx0cmV0dXJuICR2aWV3c0RlbGltaXRlcnMuYXBwbHkoJHZpZXdzLCBvcGVuQ2hhcnMpO1xuXHR9XG5cblx0JHN1YlNldHRpbmdzLmRlbGltaXRlcnMgPSBbb3BlbkNoYXJzLCBjbG9zZUNoYXJzLCBsaW5rQ2hhciA9IGxpbmsgPyBsaW5rLmNoYXJBdCgwKSA6IGxpbmtDaGFyXTtcblxuXHRkZWxpbU9wZW5DaGFyMCA9IG9wZW5DaGFycy5jaGFyQXQoMCk7IC8vIEVzY2FwZSB0aGUgY2hhcmFjdGVycyAtIHNpbmNlIHRoZXkgY291bGQgYmUgcmVnZXggc3BlY2lhbCBjaGFyYWN0ZXJzXG5cdGRlbGltT3BlbkNoYXIxID0gb3BlbkNoYXJzLmNoYXJBdCgxKTtcblx0ZGVsaW1DbG9zZUNoYXIwID0gY2xvc2VDaGFycy5jaGFyQXQoMCk7XG5cdGRlbGltQ2xvc2VDaGFyMSA9IGNsb3NlQ2hhcnMuY2hhckF0KDEpO1xuXHRvcGVuQ2hhcnMgPSBcIlxcXFxcIiArIGRlbGltT3BlbkNoYXIwICsgXCIoXFxcXFwiICsgbGlua0NoYXIgKyBcIik/XFxcXFwiICsgZGVsaW1PcGVuQ2hhcjE7IC8vIERlZmF1bHQgaXMgXCJ7XntcIlxuXHRjbG9zZUNoYXJzID0gXCJcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIlxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMTsgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBcIn19XCJcblx0Ly8gQnVpbGQgcmVnZXggd2l0aCBuZXcgZGVsaW1pdGVyc1xuXHQvLyAgICAgICAgICBbdGFnICAgIChmb2xsb3dlZCBieSAvIHNwYWNlIG9yIH0pICBvciBjdnRyK2NvbG9uIG9yIGh0bWwgb3IgY29kZV0gZm9sbG93ZWQgYnkgc3BhY2UrcGFyYW1zIHRoZW4gY29udmVydEJhY2s/XG5cdHJUYWcgPSBcIig/OihcXFxcdysoPz1bXFxcXC9cXFxcc1xcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiXSkpfChcXFxcdyspPyg6KXwoPil8KFxcXFwqKSlcXFxccyooKD86W15cXFxcXCJcblx0XHQrIGRlbGltQ2xvc2VDaGFyMCArIFwiXXxcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIig/IVxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMSArIFwiKSkqPylcIjtcblxuXHQvLyBNYWtlIHJUYWcgYXZhaWxhYmxlIHRvIEpzVmlld3MgKG9yIG90aGVyIGNvbXBvbmVudHMpIGZvciBwYXJzaW5nIGJpbmRpbmcgZXhwcmVzc2lvbnNcblx0JHN1Yi5yVGFnID0gXCIoPzpcIiArIHJUYWcgKyBcIilcIjtcblx0Ly8gICAgICAgICAgICAgICAgICAgICAgICB7IF4/IHsgICB0YWcrcGFyYW1zIHNsYXNoPyAgb3IgY2xvc2luZ1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNvbW1lbnRcblx0clRhZyA9IG5ldyBSZWdFeHAoXCIoPzpcIiArIG9wZW5DaGFycyArIHJUYWcgKyBcIihcXFxcLyk/fFxcXFxcIiArIGRlbGltT3BlbkNoYXIwICsgXCIoXFxcXFwiICsgbGlua0NoYXIgKyBcIik/XFxcXFwiICsgZGVsaW1PcGVuQ2hhcjEgKyBcIig/Oig/OlxcXFwvKFxcXFx3KykpXFxcXHMqfCEtLVtcXFxcc1xcXFxTXSo/LS0pKVwiICsgY2xvc2VDaGFycywgXCJnXCIpO1xuXG5cdC8vIERlZmF1bHQ6ICBiaW5kICAgICB0YWdOYW1lICAgICAgICAgY3Z0ICAgY2xuIGh0bWwgY29kZSAgICBwYXJhbXMgICAgICAgICAgICBzbGFzaCAgIGJpbmQyICAgICAgICAgY2xvc2VCbGsgIGNvbW1lbnRcblx0Ly8gICAgICAvKD86eyhcXF4pP3soPzooXFx3Kyg/PVtcXC9cXHN9XSkpfChcXHcrKT8oOil8KD4pfChcXCopKVxccyooKD86W159XXx9KD8hfSkpKj8pKFxcLyk/fHsoXFxeKT97KD86KD86XFwvKFxcdyspKVxccyp8IS0tW1xcc1xcU10qPy0tKSl9fVxuXG5cdCRzdWIuclRtcGwgPSBuZXcgUmVnRXhwKFwiPC4qPnwoW15cXFxcXFxcXF18Xilbe31dfFwiICsgb3BlbkNoYXJzICsgXCIuKlwiICsgY2xvc2VDaGFycyk7XG5cdC8vICRzdWIuclRtcGwgbG9va3MgZm9yIGh0bWwgdGFncyBvciB7IG9yIH0gY2hhciBub3QgcHJlY2VkZWQgYnkgXFxcXCwgb3IgSnNSZW5kZXIgdGFncyB7e3h4eH19LiBFYWNoIG9mIHRoZXNlIHN0cmluZ3MgYXJlIGNvbnNpZGVyZWRcblx0Ly8gTk9UIHRvIGJlIGpRdWVyeSBzZWxlY3RvcnNcblx0cmV0dXJuICR2aWV3c1NldHRpbmdzO1xufVxuXG4vLz09PT09PT09PVxuLy8gVmlldy5nZXRcbi8vPT09PT09PT09XG5cbmZ1bmN0aW9uIGdldFZpZXcoaW5uZXIsIHR5cGUpIHsgLy92aWV3LmdldChpbm5lciwgdHlwZSlcblx0aWYgKCF0eXBlICYmIGlubmVyICE9PSB0cnVlKSB7XG5cdFx0Ly8gdmlldy5nZXQodHlwZSlcblx0XHR0eXBlID0gaW5uZXI7XG5cdFx0aW5uZXIgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHR2YXIgdmlld3MsIGksIGwsIGZvdW5kLFxuXHRcdHZpZXcgPSB0aGlzLFxuXHRcdHJvb3QgPSAhdHlwZSB8fCB0eXBlID09PSBcInJvb3RcIjtcblx0XHQvLyBJZiB0eXBlIGlzIHVuZGVmaW5lZCwgcmV0dXJucyByb290IHZpZXcgKHZpZXcgdW5kZXIgdG9wIHZpZXcpLlxuXG5cdGlmIChpbm5lcikge1xuXHRcdC8vIEdvIHRocm91Z2ggdmlld3MgLSB0aGlzIG9uZSwgYW5kIGFsbCBuZXN0ZWQgb25lcywgZGVwdGgtZmlyc3QgLSBhbmQgcmV0dXJuIGZpcnN0IG9uZSB3aXRoIGdpdmVuIHR5cGUuXG5cdFx0Ly8gSWYgdHlwZSBpcyB1bmRlZmluZWQsIGkuZS4gdmlldy5nZXQodHJ1ZSksIHJldHVybiBmaXJzdCBjaGlsZCB2aWV3LlxuXHRcdGZvdW5kID0gdHlwZSAmJiB2aWV3LnR5cGUgPT09IHR5cGUgJiYgdmlldztcblx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHR2aWV3cyA9IHZpZXcudmlld3M7XG5cdFx0XHRpZiAodmlldy5fLnVzZUtleSkge1xuXHRcdFx0XHRmb3IgKGkgaW4gdmlld3MpIHtcblx0XHRcdFx0XHRpZiAoZm91bmQgPSB0eXBlID8gdmlld3NbaV0uZ2V0KGlubmVyLCB0eXBlKSA6IHZpZXdzW2ldKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoaSA9IDAsIGwgPSB2aWV3cy5sZW5ndGg7ICFmb3VuZCAmJiBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0Zm91bmQgPSB0eXBlID8gdmlld3NbaV0uZ2V0KGlubmVyLCB0eXBlKSA6IHZpZXdzW2ldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHJvb3QpIHtcblx0XHQvLyBGaW5kIHJvb3Qgdmlldy4gKHZpZXcgd2hvc2UgcGFyZW50IGlzIHRvcCB2aWV3KVxuXHRcdHdoaWxlICh2aWV3LnBhcmVudCkge1xuXHRcdFx0Zm91bmQgPSB2aWV3O1xuXHRcdFx0dmlldyA9IHZpZXcucGFyZW50O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR3aGlsZSAodmlldyAmJiAhZm91bmQpIHtcblx0XHRcdC8vIEdvIHRocm91Z2ggdmlld3MgLSB0aGlzIG9uZSwgYW5kIGFsbCBwYXJlbnQgb25lcyAtIGFuZCByZXR1cm4gZmlyc3Qgb25lIHdpdGggZ2l2ZW4gdHlwZS5cblx0XHRcdGZvdW5kID0gdmlldy50eXBlID09PSB0eXBlID8gdmlldyA6IHVuZGVmaW5lZDtcblx0XHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBnZXROZXN0ZWRJbmRleCgpIHtcblx0dmFyIHZpZXcgPSB0aGlzLmdldChcIml0ZW1cIik7XG5cdHJldHVybiB2aWV3ID8gdmlldy5pbmRleCA6IHVuZGVmaW5lZDtcbn1cblxuZ2V0TmVzdGVkSW5kZXguZGVwZW5kcyA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gW3RoaXMuZ2V0KFwiaXRlbVwiKSwgXCJpbmRleFwiXTtcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4KCkge1xuXHRyZXR1cm4gdGhpcy5pbmRleDtcbn1cblxuZ2V0SW5kZXguZGVwZW5kcyA9IFwiaW5kZXhcIjtcblxuLy89PT09PT09PT09XG4vLyBWaWV3LmhscFxuLy89PT09PT09PT09XG5cbmZ1bmN0aW9uIGdldEhlbHBlcihoZWxwZXIsIGlzQ29udGV4dENiKSB7XG5cdC8vIEhlbHBlciBtZXRob2QgY2FsbGVkIGFzIHZpZXcuaGxwKGtleSkgZnJvbSBjb21waWxlZCB0ZW1wbGF0ZSwgZm9yIGhlbHBlcnMgb3IgdGVtcGxhdGUgcGFyYW1ldGVycyB+Zm9vXG5cdHZhciB3cmFwcGVkLCBkZXBzLFxuXHR2aWV3ID0gdGhpcyxcblx0cmVzID0gdmlldy5jdHg7XG5cblx0aWYgKHJlcykge1xuXHRcdHJlcyA9IHJlc1toZWxwZXJdO1xuXHR9XG5cdGlmIChyZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJlcyA9ICRoZWxwZXJzW2hlbHBlcl07XG5cdH1cblx0aWYgKHJlcyAmJiByZXMuX2NwKSB7IC8vIElmIHRoaXMgaGVscGVyIHJlc291cmNlIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIsIH5mb289ZXhwclxuXHRcdGlmIChpc0NvbnRleHRDYikgeyAvLyBJbiBhIGNvbnRleHQgY2FsbGJhY2sgZm9yIGEgY29udGV4dHVhbCBwYXJhbSwgcmV0dXJuIHRoZSBbY3VycmVudERhdGEsIGRlcGVuZGVuY2llcy4uLl0gYXJyYXkgLSBuZWVkZWQgZm9yIG9ic2VydmUgY2FsbFxuXHRcdFx0ZGVwcyA9ICRzdWIuX2NlbyhyZXNbMV0uZGVwcyk7ICAvLyBmbiBkZXBzLCB3aXRoIGFueSBleHByT2JzIGNsb25lZFxuXHRcdFx0ZGVwcy51bnNoaWZ0KHJlc1swXS5kYXRhKTsgICAgICAvLyB2aWV3LmRhdGFcblx0XHRcdGRlcHMuX2NwID0gdHJ1ZTtcblx0XHRcdHJldHVybiBkZXBzO1xuXHRcdH1cblx0XHRyZXMgPSAkdmlld3MuZ2V0Q3R4KHJlcyk7IC8vIElmIGEgY29udGV4dHVhbCBwYXJhbSwgYnV0IG5vdCBhIGNvbnRleHQgY2FsbGJhY2ssIHJldHVybiBldmFsdWF0ZWQgcGFyYW0gLSBmbihkYXRhLCB2aWV3LCBqKVxuXHR9XG5cblx0aWYgKHJlcykge1xuXHRcdGlmICgkaXNGdW5jdGlvbihyZXMpICYmICFyZXMuX3dycCkge1xuXHRcdFx0Ly8gSWYgaXQgaXMgb2YgdHlwZSBmdW5jdGlvbiwgYW5kIG5vdCBhbHJlYWR5IHdyYXBwZWQsIHdlIHdpbGwgd3JhcCBpdCwgc28gaWYgY2FsbGVkIHdpdGggbm8gdGhpcyBwb2ludGVyIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlXG5cdFx0XHQvLyB2aWV3IGFzICd0aGlzJyBjb250ZXh0LiBJZiB0aGUgaGVscGVyIH5mb28oKSB3YXMgaW4gYSBkYXRhLWxpbmsgZXhwcmVzc2lvbiwgdGhlIHZpZXcgd2lsbCBoYXZlIGEgJ3RlbXBvcmFyeScgbGlua0N0eCBwcm9wZXJ0eSB0b28uXG5cdFx0XHQvLyBOb3RlIHRoYXQgaGVscGVyIGZ1bmN0aW9ucyBvbiBkZWVwZXIgcGF0aHMgd2lsbCBoYXZlIHNwZWNpZmljIHRoaXMgcG9pbnRlcnMsIGZyb20gdGhlIHByZWNlZGluZyBwYXRoLlxuXHRcdFx0Ly8gRm9yIGV4YW1wbGUsIH51dGlsLmZvbygpIHdpbGwgaGF2ZSB0aGUgfnV0aWwgb2JqZWN0IGFzICd0aGlzJyBwb2ludGVyXG5cdFx0XHR3cmFwcGVkID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiByZXMuYXBwbHkoKCF0aGlzIHx8IHRoaXMgPT09IGdsb2JhbCkgPyB2aWV3IDogdGhpcywgYXJndW1lbnRzKTtcblx0XHRcdH07XG5cdFx0XHR3cmFwcGVkLl93cnAgPSB2aWV3O1xuXHRcdFx0JGV4dGVuZCh3cmFwcGVkLCByZXMpOyAvLyBBdHRhY2ggc2FtZSBleHBhbmRvcyAoaWYgYW55KSB0byB0aGUgd3JhcHBlZCBmdW5jdGlvblxuXHRcdH1cblx0fVxuXHRyZXR1cm4gd3JhcHBlZCB8fCByZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRlbXBsYXRlKHRtcGwpIHtcblx0cmV0dXJuIHRtcGwgJiYgKHRtcGwuZm5cblx0XHQ/IHRtcGxcblx0XHQ6IHRoaXMuZ2V0UnNjKFwidGVtcGxhdGVzXCIsIHRtcGwpIHx8ICR0ZW1wbGF0ZXModG1wbCkpOyAvLyBub3QgeWV0IGNvbXBpbGVkXG59XG5cbi8vPT09PT09PT09PT09PT1cbi8vIHZpZXdzLl9jbnZ0XG4vLz09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbnZlcnRWYWwoY29udmVydGVyLCB2aWV3LCB0YWdDdHgsIG9uRXJyb3IpIHtcblx0Ly8gc2VsZiBpcyB0ZW1wbGF0ZSBvYmplY3Qgb3IgbGlua0N0eCBvYmplY3Rcblx0dmFyIHRhZywgdmFsdWUsXG5cdFx0Ly8gaWYgdGFnQ3R4IGlzIGFuIGludGVnZXIsIHRoZW4gaXQgaXMgdGhlIGtleSBmb3IgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgYm91bmRUYWcgdGFnQ3R4XG5cdFx0Ym91bmRUYWcgPSB0eXBlb2YgdGFnQ3R4ID09PSBcIm51bWJlclwiICYmIHZpZXcudG1wbC5ibmRzW3RhZ0N0eC0xXSxcblx0XHRsaW5rQ3R4ID0gdmlldy5saW5rQ3R4OyAvLyBGb3IgZGF0YS1saW5rPVwie2N2dDouLi59XCIuLi5cblxuXHRpZiAob25FcnJvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dGFnQ3R4ID0gb25FcnJvciA9IHtwcm9wczoge30sIGFyZ3M6IFtvbkVycm9yXX07XG5cdH0gZWxzZSBpZiAoYm91bmRUYWcpIHtcblx0XHR0YWdDdHggPSBib3VuZFRhZyh2aWV3LmRhdGEsIHZpZXcsICRzdWIpO1xuXHR9XG5cblx0dmFsdWUgPSB0YWdDdHguYXJnc1swXTtcblx0aWYgKGNvbnZlcnRlciB8fCBib3VuZFRhZykge1xuXHRcdHRhZyA9IGxpbmtDdHggJiYgbGlua0N0eC50YWc7XG5cdFx0aWYgKCF0YWcpIHtcblx0XHRcdHRhZyA9ICRleHRlbmQobmV3ICRzdWIuX3RnKCksIHtcblx0XHRcdFx0Xzoge1xuXHRcdFx0XHRcdGlubGluZTogIWxpbmtDdHgsXG5cdFx0XHRcdFx0Ym5kOiBib3VuZFRhZyxcblx0XHRcdFx0XHR1bmxpbmtlZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0YWdOYW1lOiBcIjpcIixcblx0XHRcdFx0Y3Z0OiBjb252ZXJ0ZXIsXG5cdFx0XHRcdGZsb3c6IHRydWUsXG5cdFx0XHRcdHRhZ0N0eDogdGFnQ3R4XG5cdFx0XHR9KTtcblx0XHRcdGlmIChsaW5rQ3R4KSB7XG5cdFx0XHRcdGxpbmtDdHgudGFnID0gdGFnO1xuXHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHR9XG5cdFx0XHR0YWdDdHguY3R4ID0gZXh0ZW5kQ3R4KHRhZ0N0eC5jdHgsIChsaW5rQ3R4ID8gbGlua0N0eC52aWV3IDogdmlldykuY3R4KTtcblx0XHR9XG5cdFx0dGFnLl9lciA9IG9uRXJyb3IgJiYgdmFsdWU7XG5cdFx0dGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHgpO1xuXG5cdFx0dGFnQ3R4LnZpZXcgPSB2aWV3O1xuXG5cdFx0dGFnLmN0eCA9IHRhZ0N0eC5jdHggfHwgdGFnLmN0eCB8fCB7fTtcblx0XHR0YWdDdHguY3R4ID0gdW5kZWZpbmVkO1xuXG5cdFx0dmFsdWUgPSB0YWcuY3Z0QXJncyhjb252ZXJ0ZXIgIT09IFwidHJ1ZVwiICYmIGNvbnZlcnRlcilbMF07IC8vIElmIHRoZXJlIGlzIGEgY29udmVydEJhY2sgYnV0IG5vIGNvbnZlcnQsIGNvbnZlcnRlciB3aWxsIGJlIFwidHJ1ZVwiXG5cblx0XHQvLyBDYWxsIG9uUmVuZGVyICh1c2VkIGJ5IEpzVmlld3MgaWYgcHJlc2VudCwgdG8gYWRkIGJpbmRpbmcgYW5ub3RhdGlvbnMgYXJvdW5kIHJlbmRlcmVkIGNvbnRlbnQpXG5cdFx0dmFsdWUgPSBib3VuZFRhZyAmJiB2aWV3Ll8ub25SZW5kZXJcblx0XHRcdD8gdmlldy5fLm9uUmVuZGVyKHZhbHVlLCB2aWV3LCB0YWcpXG5cdFx0XHQ6IHZhbHVlO1xuXHR9XG5cdHJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRBcmdzKGNvbnZlcnRlcikge1xuXHR2YXIgdGFnID0gdGhpcyxcblx0XHR0YWdDdHggPSB0YWcudGFnQ3R4LFxuXHRcdHZpZXcgPSB0YWdDdHgudmlldyxcblx0XHRhcmdzID0gdGFnQ3R4LmFyZ3M7XG5cblx0Y29udmVydGVyID0gY29udmVydGVyIHx8IHRhZy5jb252ZXJ0O1xuXHRjb252ZXJ0ZXIgPSBjb252ZXJ0ZXIgJiYgKFwiXCIgKyBjb252ZXJ0ZXIgPT09IGNvbnZlcnRlclxuXHRcdD8gKHZpZXcuZ2V0UnNjKFwiY29udmVydGVyc1wiLCBjb252ZXJ0ZXIpIHx8IGVycm9yKFwiVW5rbm93biBjb252ZXJ0ZXI6ICdcIiArIGNvbnZlcnRlciArIFwiJ1wiKSlcblx0XHQ6IGNvbnZlcnRlcik7XG5cblx0YXJncyA9ICFhcmdzLmxlbmd0aCAmJiAhdGFnQ3R4LmluZGV4IC8vIE9uIHRoZSBvcGVuaW5nIHRhZyB3aXRoIG5vIGFyZ3MsIGJpbmQgdG8gdGhlIGN1cnJlbnQgZGF0YSBjb250ZXh0XG5cdFx0PyBbdmlldy5kYXRhXVxuXHRcdDogY29udmVydGVyXG5cdFx0XHQ/IGFyZ3Muc2xpY2UoKSAvLyBJZiB0aGVyZSBpcyBhIGNvbnZlcnRlciwgdXNlIGEgY29weSBvZiB0aGUgdGFnQ3R4LmFyZ3MgYXJyYXkgZm9yIHJlbmRlcmluZywgYW5kIHJlcGxhY2UgdGhlIGFyZ3NbMF0gaW5cblx0XHRcdC8vIHRoZSBjb3BpZWQgYXJyYXkgd2l0aCB0aGUgY29udmVydGVkIHZhbHVlLiBCdXQgd2UgZG8gbm90IG1vZGlmeSB0aGUgdmFsdWUgb2YgdGFnLnRhZ0N0eC5hcmdzWzBdICh0aGUgb3JpZ2luYWwgYXJncyBhcnJheSlcblx0XHRcdDogYXJnczsgLy8gSWYgbm8gY29udmVydGVyLCBnZXQgdGhlIG9yaWdpbmFsIHRhZ0N0eC5hcmdzXG5cblx0aWYgKGNvbnZlcnRlcikge1xuXHRcdGlmIChjb252ZXJ0ZXIuZGVwZW5kcykge1xuXHRcdFx0dGFnLmRlcGVuZHMgPSAkc3ViLmdldERlcHModGFnLmRlcGVuZHMsIHRhZywgY29udmVydGVyLmRlcGVuZHMsIGNvbnZlcnRlcik7XG5cdFx0fVxuXHRcdGFyZ3NbMF0gPSBjb252ZXJ0ZXIuYXBwbHkodGFnLCBhcmdzKTtcblx0fVxuXHRyZXR1cm4gYXJncztcbn1cblxuLy89PT09PT09PT09PT09XG4vLyB2aWV3cy5fdGFnXG4vLz09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0UmVzb3VyY2UocmVzb3VyY2VUeXBlLCBpdGVtTmFtZSkge1xuXHR2YXIgcmVzLCBzdG9yZSxcblx0XHR2aWV3ID0gdGhpcztcblx0d2hpbGUgKChyZXMgPT09IHVuZGVmaW5lZCkgJiYgdmlldykge1xuXHRcdHN0b3JlID0gdmlldy50bXBsICYmIHZpZXcudG1wbFtyZXNvdXJjZVR5cGVdO1xuXHRcdHJlcyA9IHN0b3JlICYmIHN0b3JlW2l0ZW1OYW1lXTtcblx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdH1cblx0cmV0dXJuIHJlcyB8fCAkdmlld3NbcmVzb3VyY2VUeXBlXVtpdGVtTmFtZV07XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRhZyh0YWdOYW1lLCBwYXJlbnRWaWV3LCB0bXBsLCB0YWdDdHhzLCBpc1VwZGF0ZSwgb25FcnJvcikge1xuXHRwYXJlbnRWaWV3ID0gcGFyZW50VmlldyB8fCB0b3BWaWV3O1xuXHR2YXIgdGFnLCB0YWdfLCB0YWdEZWYsIHRlbXBsYXRlLCB0YWdzLCBhdHRyLCBwYXJlbnRUYWcsIGksIGwsIGl0ZW1SZXQsIHRhZ0N0eCwgdGFnQ3R4Q3R4LFxuXHRcdGNvbnRlbnQsIGNhbGxJbml0LCBtYXBEZWYsIHRoaXNNYXAsIGFyZ3MsIHByb3BzLCBpbml0aWFsVG1wbCwgdGFnRGF0YU1hcCwgY29udGVudEN0eCxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGxpbmtDdHggPSBwYXJlbnRWaWV3LmxpbmtDdHggfHwgMCxcblx0XHRjdHggPSBwYXJlbnRWaWV3LmN0eCxcblx0XHRwYXJlbnRUbXBsID0gdG1wbCB8fCBwYXJlbnRWaWV3LnRtcGwsXG5cdFx0Ly8gaWYgdGFnQ3R4IGlzIGFuIGludGVnZXIsIHRoZW4gaXQgaXMgdGhlIGtleSBmb3IgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgYm91bmRUYWcgdGFnQ3R4c1xuXHRcdGJvdW5kVGFnID0gdHlwZW9mIHRhZ0N0eHMgPT09IFwibnVtYmVyXCIgJiYgcGFyZW50Vmlldy50bXBsLmJuZHNbdGFnQ3R4cy0xXTtcblxuXHRpZiAodGFnTmFtZS5faXMgPT09IFwidGFnXCIpIHtcblx0XHR0YWcgPSB0YWdOYW1lO1xuXHRcdHRhZ05hbWUgPSB0YWcudGFnTmFtZTtcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHM7XG5cdFx0dGVtcGxhdGUgPSB0YWcudGVtcGxhdGU7XG5cdH0gZWxzZSB7XG5cdFx0dGFnRGVmID0gcGFyZW50Vmlldy5nZXRSc2MoXCJ0YWdzXCIsIHRhZ05hbWUpIHx8IGVycm9yKFwiVW5rbm93biB0YWc6IHt7XCIgKyB0YWdOYW1lICsgXCJ9fSBcIik7XG5cdFx0dGVtcGxhdGUgPSB0YWdEZWYudGVtcGxhdGU7XG5cdH1cblxuXHRpZiAob25FcnJvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0ICs9IG9uRXJyb3I7XG5cdFx0dGFnQ3R4cyA9IG9uRXJyb3IgPSBbe3Byb3BzOiB7fSwgYXJnczogW119XTtcblx0fSBlbHNlIGlmIChib3VuZFRhZykge1xuXHRcdHRhZ0N0eHMgPSBib3VuZFRhZyhwYXJlbnRWaWV3LmRhdGEsIHBhcmVudFZpZXcsICRzdWIpO1xuXHR9XG5cblx0bCA9IHRhZ0N0eHMubGVuZ3RoO1xuXHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0dGFnQ3R4ID0gdGFnQ3R4c1tpXTtcblx0XHRpZiAoIWxpbmtDdHggfHwgIWxpbmtDdHgudGFnIHx8IGkgJiYgIWxpbmtDdHgudGFnLl8uaW5saW5lIHx8IHRhZy5fZXIpIHtcblx0XHRcdC8vIEluaXRpYWxpemUgdGFnQ3R4XG5cdFx0XHQvLyBGb3IgYmxvY2sgdGFncywgdGFnQ3R4LnRtcGwgaXMgYW4gaW50ZWdlciA+IDBcblx0XHRcdGlmIChjb250ZW50ID0gcGFyZW50VG1wbC50bXBscyAmJiB0YWdDdHgudG1wbCkge1xuXHRcdFx0XHRjb250ZW50ID0gdGFnQ3R4LmNvbnRlbnQgPSBwYXJlbnRUbXBsLnRtcGxzW2NvbnRlbnQgLSAxXTtcblx0XHRcdH1cblx0XHRcdHRhZ0N0eC5pbmRleCA9IGk7XG5cdFx0XHR0YWdDdHgudG1wbCA9IGNvbnRlbnQ7IC8vIFNldCB0aGUgdG1wbCBwcm9wZXJ0eSB0byB0aGUgY29udGVudCBvZiB0aGUgYmxvY2sgdGFnXG5cdFx0XHR0YWdDdHgucmVuZGVyID0gcmVuZGVyQ29udGVudDtcblx0XHRcdHRhZ0N0eC52aWV3ID0gcGFyZW50Vmlldztcblx0XHRcdHRhZ0N0eC5jdHggPSBleHRlbmRDdHgodGFnQ3R4LmN0eCwgY3R4KTsgLy8gQ2xvbmUgYW5kIGV4dGVuZCBwYXJlbnRWaWV3LmN0eFxuXHRcdH1cblx0XHRpZiAodG1wbCA9IHRhZ0N0eC5wcm9wcy50bXBsKSB7XG5cdFx0XHQvLyBJZiB0aGUgdG1wbCBwcm9wZXJ0eSBpcyBvdmVycmlkZGVuLCBzZXQgdGhlIHZhbHVlICh3aGVuIGluaXRpYWxpemluZywgb3IsIGluIGNhc2Ugb2YgYmluZGluZzogXnRtcGw9Li4uLCB3aGVuIHVwZGF0aW5nKVxuXHRcdFx0dGFnQ3R4LnRtcGwgPSBwYXJlbnRWaWV3LmdldFRtcGwodG1wbCk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0YWcpIHtcblx0XHRcdC8vIFRoaXMgd2lsbCBvbmx5IGJlIGhpdCBmb3IgaW5pdGlhbCB0YWdDdHggKG5vdCBmb3Ige3tlbHNlfX0pIC0gaWYgdGhlIHRhZyBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXRcblx0XHRcdC8vIEluc3RhbnRpYXRlIHRhZyBpZiBpdCBkb2VzIG5vdCB5ZXQgZXhpc3Rcblx0XHRcdC8vIElmIHRoZSB0YWcgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5zdGFudGlhdGVkLCB3ZSB3aWxsIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZS5cblx0XHRcdC8vIH50YWcgd2lsbCBhY2Nlc3MgdGhlIHRhZywgZXZlbiB3aXRoaW4gdGhlIHJlbmRlcmluZyBvZiB0aGUgdGVtcGxhdGUgY29udGVudCBvZiB0aGlzIHRhZy5cblx0XHRcdC8vIEZyb20gY2hpbGQvZGVzY2VuZGFudCB0YWdzLCBjYW4gYWNjZXNzIHVzaW5nIH50YWcucGFyZW50LCBvciB+cGFyZW50VGFncy50YWdOYW1lXG5cdFx0XHR0YWcgPSBuZXcgdGFnRGVmLl9jdHIoKTtcblx0XHRcdGNhbGxJbml0ID0gISF0YWcuaW5pdDtcblxuXHRcdFx0dGFnLnBhcmVudCA9IHBhcmVudFRhZyA9IGN0eCAmJiBjdHgudGFnO1xuXHRcdFx0dGFnLnRhZ0N0eHMgPSB0YWdDdHhzO1xuXHRcdFx0dGFnRGF0YU1hcCA9IHRhZy5kYXRhTWFwO1xuXG5cdFx0XHRpZiAobGlua0N0eCkge1xuXHRcdFx0XHR0YWcuXy5pbmxpbmUgPSBmYWxzZTtcblx0XHRcdFx0bGlua0N0eC50YWcgPSB0YWc7XG5cdFx0XHRcdHRhZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdH1cblx0XHRcdGlmICh0YWcuXy5ibmQgPSBib3VuZFRhZyB8fCBsaW5rQ3R4LmZuKSB7XG5cdFx0XHRcdC8vIEJvdW5kIGlmIHtee3RhZy4uLn19IG9yIGRhdGEtbGluaz1cInt0YWcuLi59XCJcblx0XHRcdFx0dGFnLl8uYXJyVndzID0ge307XG5cdFx0XHR9IGVsc2UgaWYgKHRhZy5kYXRhQm91bmRPbmx5KSB7XG5cdFx0XHRcdGVycm9yKFwie157XCIgKyB0YWdOYW1lICsgXCJ9fSB0YWcgbXVzdCBiZSBkYXRhLWJvdW5kXCIpO1xuXHRcdFx0fVxuXHRcdFx0Ly9UT0RPIGJldHRlciBwZXJmIGZvciBjaGlsZFRhZ3MoKSAtIGtlZXAgY2hpbGQgdGFnLnRhZ3MgYXJyYXksIChhbmQgcmVtb3ZlIGNoaWxkLCB3aGVuIGRpc3Bvc2VkKVxuXHRcdFx0Ly8gdGFnLnRhZ3MgPSBbXTtcblx0XHR9XG5cdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzO1xuXHRcdHRhZ0RhdGFNYXAgPSB0YWcuZGF0YU1hcDtcblxuXHRcdHRhZ0N0eC50YWcgPSB0YWc7XG5cdFx0aWYgKHRhZ0RhdGFNYXAgJiYgdGFnQ3R4cykge1xuXHRcdFx0dGFnQ3R4Lm1hcCA9IHRhZ0N0eHNbaV0ubWFwOyAvLyBDb3B5IG92ZXIgdGhlIGNvbXBpbGVkIG1hcCBpbnN0YW5jZSBmcm9tIHRoZSBwcmV2aW91cyB0YWdDdHhzIHRvIHRoZSByZWZyZXNoZWQgb25lc1xuXHRcdH1cblx0XHRpZiAoIXRhZy5mbG93KSB7XG5cdFx0XHR0YWdDdHhDdHggPSB0YWdDdHguY3R4ID0gdGFnQ3R4LmN0eCB8fCB7fTtcblxuXHRcdFx0Ly8gdGFncyBoYXNoOiB0YWcuY3R4LnRhZ3MsIG1lcmdlZCB3aXRoIHBhcmVudFZpZXcuY3R4LnRhZ3MsXG5cdFx0XHR0YWdzID0gdGFnLnBhcmVudHMgPSB0YWdDdHhDdHgucGFyZW50VGFncyA9IGN0eCAmJiBleHRlbmRDdHgodGFnQ3R4Q3R4LnBhcmVudFRhZ3MsIGN0eC5wYXJlbnRUYWdzKSB8fCB7fTtcblx0XHRcdGlmIChwYXJlbnRUYWcpIHtcblx0XHRcdFx0dGFnc1twYXJlbnRUYWcudGFnTmFtZV0gPSBwYXJlbnRUYWc7XG5cdFx0XHRcdC8vVE9ETyBiZXR0ZXIgcGVyZiBmb3IgY2hpbGRUYWdzOiBwYXJlbnRUYWcudGFncy5wdXNoKHRhZyk7XG5cdFx0XHR9XG5cdFx0XHR0YWdzW3RhZy50YWdOYW1lXSA9IHRhZ0N0eEN0eC50YWcgPSB0YWc7XG5cdFx0fVxuXHR9XG5cdGlmICghKHRhZy5fZXIgPSBvbkVycm9yKSkge1xuXHRcdHRhZ0hhbmRsZXJzRnJvbVByb3BzKHRhZywgdGFnQ3R4c1swXSk7XG5cdFx0dGFnLnJlbmRlcmluZyA9IHt9OyAvLyBQcm92aWRlIG9iamVjdCBmb3Igc3RhdGUgZHVyaW5nIHJlbmRlciBjYWxscyB0byB0YWcgYW5kIGVsc2VzLiAoVXNlZCBieSB7e2lmfX0gYW5kIHt7Zm9yfX0uLi4pXG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eCA9IHRhZ0N0eHNbaV07XG5cdFx0XHRwcm9wcyA9IHRhZ0N0eC5wcm9wcztcblx0XHRcdGFyZ3MgPSB0YWcuY3Z0QXJncygpO1xuXG5cdFx0XHRpZiAobWFwRGVmID0gcHJvcHMuZGF0YU1hcCB8fCB0YWdEYXRhTWFwKSB7XG5cdFx0XHRcdGlmIChhcmdzLmxlbmd0aCB8fCBwcm9wcy5kYXRhTWFwKSB7XG5cdFx0XHRcdFx0dGhpc01hcCA9IHRhZ0N0eC5tYXA7XG5cdFx0XHRcdFx0aWYgKCF0aGlzTWFwIHx8IHRoaXNNYXAuc3JjICE9PSBhcmdzWzBdIHx8IGlzVXBkYXRlKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpc01hcCAmJiB0aGlzTWFwLnNyYykge1xuXHRcdFx0XHRcdFx0XHR0aGlzTWFwLnVubWFwKCk7IC8vIG9ubHkgY2FsbGVkIGlmIG9ic2VydmFibGUgbWFwIC0gbm90IHdoZW4gb25seSB1c2VkIGluIEpzUmVuZGVyLCBlLmcuIGJ5IHt7cHJvcHN9fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpc01hcCA9IHRhZ0N0eC5tYXAgPSBtYXBEZWYubWFwKGFyZ3NbMF0sIHByb3BzLCB1bmRlZmluZWQsICF0YWcuXy5ibmQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhcmdzID0gW3RoaXNNYXAudGd0XTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGFnLmN0eCA9IHRhZ0N0eC5jdHg7XG5cblx0XHRcdGlmICghaSkge1xuXHRcdFx0XHRpZiAoY2FsbEluaXQpIHtcblx0XHRcdFx0XHRpbml0aWFsVG1wbCA9IHRhZy50ZW1wbGF0ZTtcblx0XHRcdFx0XHR0YWcuaW5pdCh0YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgpO1xuXHRcdFx0XHRcdGNhbGxJbml0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChsaW5rQ3R4KSB7XG5cdFx0XHRcdFx0Ly8gU2V0IGF0dHIgb24gbGlua0N0eCB0byBlbnN1cmUgb3V0cHV0dGluZyB0byB0aGUgY29ycmVjdCB0YXJnZXQgYXR0cmlidXRlLlxuXHRcdFx0XHRcdC8vIFNldHRpbmcgZWl0aGVyIGxpbmtDdHguYXR0ciBvciB0aGlzLmF0dHIgaW4gdGhlIGluaXQoKSBhbGxvd3MgcGVyLWluc3RhbmNlIGNob2ljZSBvZiB0YXJnZXQgYXR0cmliLlxuXHRcdFx0XHRcdGxpbmtDdHguYXR0ciA9IHRhZy5hdHRyID0gbGlua0N0eC5hdHRyIHx8IHRhZy5hdHRyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF0dHIgPSB0YWcuYXR0cjtcblx0XHRcdFx0dGFnLl8ubm9Wd3MgPSBhdHRyICYmIGF0dHIgIT09IEhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdGl0ZW1SZXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodGFnLnJlbmRlcikge1xuXHRcdFx0XHRpdGVtUmV0ID0gdGFnLnJlbmRlci5hcHBseSh0YWcsIGFyZ3MpO1xuXHRcdFx0XHRpZiAocGFyZW50Vmlldy5saW5rZWQgJiYgaXRlbVJldCAmJiB0YWcubGlua2VkRWxlbSAmJiAhcldyYXBwZWRJblZpZXdNYXJrZXIudGVzdChpdGVtUmV0KSkge1xuXHRcdFx0XHRcdC8vIFdoZW4gYSB0YWcgcmVuZGVycyBjb250ZW50IGZyb20gdGhlIHJlbmRlciBtZXRob2QsIHdpdGggZGF0YSBsaW5raW5nLCBhbmQgaGFzIGEgbGlua2VkRWxlbSBiaW5kaW5nLCB0aGVuIHdlIG5lZWQgdG8gd3JhcCB3aXRoXG5cdFx0XHRcdFx0Ly8gdmlldyBtYXJrZXJzLCBpZiBhYnNlbnQsIHNvIHRoZSBjb250ZW50IGlzIGEgdmlldyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhZywgd2hpY2ggd2lsbCBjb3JyZWN0bHkgZGlzcG9zZSBiaW5kaW5ncyBpZiBkZWxldGVkLlxuXHRcdFx0XHRcdGl0ZW1SZXQgPSByZW5kZXJXaXRoVmlld3MoJC50ZW1wbGF0ZXMoaXRlbVJldCksIGFyZ3NbMF0sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBwYXJlbnRWaWV3LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGFnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFhcmdzLmxlbmd0aCkge1xuXHRcdFx0XHRhcmdzID0gW3BhcmVudFZpZXddOyAvLyBubyBhcmd1bWVudHMgLSAoZS5nLiB7e2Vsc2V9fSkgZ2V0IGRhdGEgY29udGV4dCBmcm9tIHZpZXcuXG5cdFx0XHR9XG5cdFx0XHRpZiAoaXRlbVJldCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRlbnRDdHggPSBhcmdzWzBdOyAvLyBEZWZhdWx0IGRhdGEgY29udGV4dCBmb3Igd3JhcHBlZCBibG9jayBjb250ZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudC4gRGVmaW5lZCB0YWcuY29udGVudEN0eCBmdW5jdGlvbiB0byBvdmVycmlkZSB0aGlzLlxuXHRcdFx0XHRpZiAodGFnLmNvbnRlbnRDdHgpIHtcblx0XHRcdFx0XHRjb250ZW50Q3R4ID0gdGFnLmNvbnRlbnRDdHgoY29udGVudEN0eCkgfHwgY29udGVudEN0eDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpdGVtUmV0ID0gdGFnQ3R4LnJlbmRlcihjb250ZW50Q3R4LCB0cnVlKSB8fCAoaXNVcGRhdGUgPyB1bmRlZmluZWQgOiBcIlwiKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vIHJldHVybiB2YWx1ZSBmcm9tIHJlbmRlciwgYW5kIG5vIHRlbXBsYXRlL2NvbnRlbnQgdGFnQ3R4LnJlbmRlciguLi4pLCBzbyByZXR1cm4gdW5kZWZpbmVkXG5cdFx0XHRyZXQgPSByZXQgPyByZXQgKyAoaXRlbVJldCB8fCBcIlwiKSA6IGl0ZW1SZXQ7IC8vIElmIG5vIHJlbmRlcmVkIGNvbnRlbnQsIHRoaXMgd2lsbCBiZSB1bmRlZmluZWRcblx0XHR9XG5cdFx0dGFnLnJlbmRlcmluZyA9IHVuZGVmaW5lZDtcblx0fVxuXHR0YWcudGFnQ3R4ID0gdGFnQ3R4c1swXTtcblx0dGFnLmN0eCA9IHRhZy50YWdDdHguY3R4O1xuXG5cdGlmICh0YWcuXy5ub1Z3cykge1xuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0Ly8gaW5saW5lIHRhZyB3aXRoIGF0dHIgc2V0IHRvIFwidGV4dFwiIHdpbGwgaW5zZXJ0IEhUTUwtZW5jb2RlZCBjb250ZW50IC0gYXMgaWYgaXQgd2FzIGVsZW1lbnQtYmFzZWQgaW5uZXJUZXh0XG5cdFx0XHRyZXQgPSBhdHRyID09PSBcInRleHRcIlxuXHRcdFx0XHQ/ICRjb252ZXJ0ZXJzLmh0bWwocmV0KVxuXHRcdFx0XHQ6IFwiXCI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBib3VuZFRhZyAmJiBwYXJlbnRWaWV3Ll8ub25SZW5kZXJcblx0XHQvLyBDYWxsIG9uUmVuZGVyICh1c2VkIGJ5IEpzVmlld3MgaWYgcHJlc2VudCwgdG8gYWRkIGJpbmRpbmcgYW5ub3RhdGlvbnMgYXJvdW5kIHJlbmRlcmVkIGNvbnRlbnQpXG5cdFx0PyBwYXJlbnRWaWV3Ll8ub25SZW5kZXIocmV0LCBwYXJlbnRWaWV3LCB0YWcpXG5cdFx0OiByZXQ7XG59XG5cbi8vPT09PT09PT09PT09PT09PT1cbi8vIFZpZXcgY29uc3RydWN0b3Jcbi8vPT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gVmlldyhjb250ZXh0LCB0eXBlLCBwYXJlbnRWaWV3LCBkYXRhLCB0ZW1wbGF0ZSwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpIHtcblx0Ly8gQ29uc3RydWN0b3IgZm9yIHZpZXcgb2JqZWN0IGluIHZpZXcgaGllcmFyY2h5LiAoQXVnbWVudGVkIGJ5IEpzVmlld3MgaWYgSnNWaWV3cyBpcyBsb2FkZWQpXG5cdHZhciB2aWV3cywgcGFyZW50Vmlld18sIHRhZywgc2VsZl8sXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0aXNBcnJheSA9IHR5cGUgPT09IFwiYXJyYXlcIjtcblxuXHRzZWxmLmNvbnRlbnQgPSBjb250ZW50VG1wbDtcblx0c2VsZi52aWV3cyA9IGlzQXJyYXkgPyBbXSA6IHt9O1xuXHRzZWxmLnBhcmVudCA9IHBhcmVudFZpZXc7XG5cdHNlbGYudHlwZSA9IHR5cGUgfHwgXCJ0b3BcIjtcblx0c2VsZi5kYXRhID0gZGF0YTtcblx0c2VsZi50bXBsID0gdGVtcGxhdGU7XG5cdC8vIElmIHRoZSBkYXRhIGlzIGFuIGFycmF5LCB0aGlzIGlzIGFuICdhcnJheSB2aWV3JyB3aXRoIGEgdmlld3MgYXJyYXkgZm9yIGVhY2ggY2hpbGQgJ2l0ZW0gdmlldydcblx0Ly8gSWYgdGhlIGRhdGEgaXMgbm90IGFuIGFycmF5LCB0aGlzIGlzIGFuICdpdGVtIHZpZXcnIHdpdGggYSB2aWV3cyAnaGFzaCcgb2JqZWN0IGZvciBhbnkgY2hpbGQgbmVzdGVkIHZpZXdzXG5cdC8vIC5fLnVzZUtleSBpcyBub24gemVybyBpZiBpcyBub3QgYW4gJ2FycmF5IHZpZXcnIChvd25pbmcgYSBkYXRhIGFycmF5KS4gVXNlIHRoaXMgYXMgbmV4dCBrZXkgZm9yIGFkZGluZyB0byBjaGlsZCB2aWV3cyBoYXNoXG5cdHNlbGZfID0gc2VsZi5fID0ge1xuXHRcdGtleTogMCxcblx0XHR1c2VLZXk6IGlzQXJyYXkgPyAwIDogMSxcblx0XHRpZDogXCJcIiArIHZpZXdJZCsrLFxuXHRcdG9uUmVuZGVyOiBvblJlbmRlcixcblx0XHRibmRzOiB7fVxuXHR9O1xuXHRzZWxmLmxpbmtlZCA9ICEhb25SZW5kZXI7XG5cdGlmIChwYXJlbnRWaWV3KSB7XG5cdFx0dmlld3MgPSBwYXJlbnRWaWV3LnZpZXdzO1xuXHRcdHBhcmVudFZpZXdfID0gcGFyZW50Vmlldy5fO1xuXHRcdGlmIChwYXJlbnRWaWV3Xy51c2VLZXkpIHtcblx0XHRcdC8vIFBhcmVudCBpcyBub3QgYW4gJ2FycmF5IHZpZXcnLiBBZGQgdGhpcyB2aWV3IHRvIGl0cyB2aWV3cyBvYmplY3Rcblx0XHRcdC8vIHNlbGYuX2tleSA9IGlzIHRoZSBrZXkgaW4gdGhlIHBhcmVudCB2aWV3IGhhc2hcblx0XHRcdHZpZXdzW3NlbGZfLmtleSA9IFwiX1wiICsgcGFyZW50Vmlld18udXNlS2V5KytdID0gc2VsZjtcblx0XHRcdHNlbGYuaW5kZXggPSBpbmRleFN0cjtcblx0XHRcdHNlbGYuZ2V0SW5kZXggPSBnZXROZXN0ZWRJbmRleDtcblx0XHR9IGVsc2UgaWYgKHZpZXdzLmxlbmd0aCA9PT0gKHNlbGZfLmtleSA9IHNlbGYuaW5kZXggPSBrZXkpKSB7IC8vIFBhcmVudCBpcyBhbiAnYXJyYXkgdmlldycuIEFkZCB0aGlzIHZpZXcgdG8gaXRzIHZpZXdzIGFycmF5XG5cdFx0XHR2aWV3cy5wdXNoKHNlbGYpOyAvLyBBZGRpbmcgdG8gZW5kIG9mIHZpZXdzIGFycmF5LiAoVXNpbmcgcHVzaCB3aGVuIHBvc3NpYmxlIC0gYmV0dGVyIHBlcmYgdGhhbiBzcGxpY2UpXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZpZXdzLnNwbGljZShrZXksIDAsIHNlbGYpOyAvLyBJbnNlcnRpbmcgaW4gdmlld3MgYXJyYXlcblx0XHR9XG5cdFx0Ly8gSWYgbm8gY29udGV4dCB3YXMgcGFzc2VkIGluLCB1c2UgcGFyZW50IGNvbnRleHRcblx0XHQvLyBJZiBjb250ZXh0IHdhcyBwYXNzZWQgaW4sIGl0IHNob3VsZCBoYXZlIGJlZW4gbWVyZ2VkIGFscmVhZHkgd2l0aCBwYXJlbnQgY29udGV4dFxuXHRcdHNlbGYuY3R4ID0gY29udGV4dCB8fCBwYXJlbnRWaWV3LmN0eDtcblx0fSBlbHNlIHtcblx0XHRzZWxmLmN0eCA9IGNvbnRleHQ7XG5cdH1cbn1cblxuVmlldy5wcm90b3R5cGUgPSB7XG5cdGdldDogZ2V0Vmlldyxcblx0Z2V0SW5kZXg6IGdldEluZGV4LFxuXHRnZXRSc2M6IGdldFJlc291cmNlLFxuXHRnZXRUbXBsOiBnZXRUZW1wbGF0ZSxcblx0aGxwOiBnZXRIZWxwZXIsXG5cdF9pczogXCJ2aWV3XCJcbn07XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVnaXN0cmF0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZUNoaWxkUmVzb3VyY2VzKHBhcmVudFRtcGwpIHtcblx0dmFyIHN0b3JlTmFtZSwgc3RvcmVOYW1lcywgcmVzb3VyY2VzO1xuXHRmb3IgKHN0b3JlTmFtZSBpbiBqc3ZTdG9yZXMpIHtcblx0XHRzdG9yZU5hbWVzID0gc3RvcmVOYW1lICsgXCJzXCI7XG5cdFx0aWYgKHBhcmVudFRtcGxbc3RvcmVOYW1lc10pIHtcblx0XHRcdHJlc291cmNlcyA9IHBhcmVudFRtcGxbc3RvcmVOYW1lc107ICAgIC8vIFJlc291cmNlcyBub3QgeWV0IGNvbXBpbGVkXG5cdFx0XHRwYXJlbnRUbXBsW3N0b3JlTmFtZXNdID0ge307ICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHVuY29tcGlsZWQgcmVzb3VyY2VzXG5cdFx0XHQkdmlld3Nbc3RvcmVOYW1lc10ocmVzb3VyY2VzLCBwYXJlbnRUbXBsKTsgLy8gQWRkIGJhY2sgaW4gdGhlIGNvbXBpbGVkIHJlc291cmNlc1xuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVRhZ1xuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZVRhZyhuYW1lLCB0YWdEZWYsIHBhcmVudFRtcGwpIHtcblx0dmFyIHRtcGwsIGJhc2VUYWcsIHByb3AsXG5cdFx0Y29tcGlsZWREZWYgPSBuZXcgJHN1Yi5fdGcoKTtcblxuXHRmdW5jdGlvbiBUYWcoKSB7XG5cdFx0dmFyIHRhZyA9IHRoaXM7XG5cdFx0dGFnLl8gPSB7XG5cdFx0XHRpbmxpbmU6IHRydWUsXG5cdFx0XHR1bmxpbmtlZDogdHJ1ZVxuXHRcdH07XG5cblx0XHR0YWcudGFnTmFtZSA9IG5hbWU7XG5cdH1cblxuXHRpZiAoJGlzRnVuY3Rpb24odGFnRGVmKSkge1xuXHRcdC8vIFNpbXBsZSB0YWcgZGVjbGFyZWQgYXMgZnVuY3Rpb24uIE5vIHByZXNlbnRlciBpbnN0YW50YXRpb24uXG5cdFx0dGFnRGVmID0ge1xuXHRcdFx0ZGVwZW5kczogdGFnRGVmLmRlcGVuZHMsXG5cdFx0XHRyZW5kZXI6IHRhZ0RlZlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoXCJcIiArIHRhZ0RlZiA9PT0gdGFnRGVmKSB7XG5cdFx0dGFnRGVmID0ge3RlbXBsYXRlOiB0YWdEZWZ9O1xuXHR9XG5cdGlmIChiYXNlVGFnID0gdGFnRGVmLmJhc2VUYWcpIHtcblx0XHR0YWdEZWYuZmxvdyA9ICEhdGFnRGVmLmZsb3c7IC8vIFNldCBmbG93IHByb3BlcnR5LCBzbyBkZWZhdWx0cyB0byBmYWxzZSBldmVuIGlmIGJhc2VUYWcgaGFzIGZsb3c9dHJ1ZVxuXHRcdHRhZ0RlZi5iYXNlVGFnID0gYmFzZVRhZyA9IFwiXCIgKyBiYXNlVGFnID09PSBiYXNlVGFnXG5cdFx0XHQ/IChwYXJlbnRUbXBsICYmIHBhcmVudFRtcGwudGFnc1tiYXNlVGFnXSB8fCAkdGFnc1tiYXNlVGFnXSlcblx0XHRcdDogYmFzZVRhZztcblxuXHRcdGNvbXBpbGVkRGVmID0gJGV4dGVuZChjb21waWxlZERlZiwgYmFzZVRhZyk7XG5cblx0XHRmb3IgKHByb3AgaW4gdGFnRGVmKSB7XG5cdFx0XHRjb21waWxlZERlZltwcm9wXSA9IGdldE1ldGhvZChiYXNlVGFnW3Byb3BdLCB0YWdEZWZbcHJvcF0pO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb21waWxlZERlZiA9ICRleHRlbmQoY29tcGlsZWREZWYsIHRhZ0RlZik7XG5cdH1cblxuXHQvLyBUYWcgZGVjbGFyZWQgYXMgb2JqZWN0LCB1c2VkIGFzIHRoZSBwcm90b3R5cGUgZm9yIHRhZyBpbnN0YW50aWF0aW9uIChjb250cm9sL3ByZXNlbnRlcilcblx0aWYgKCh0bXBsID0gY29tcGlsZWREZWYudGVtcGxhdGUpICE9PSB1bmRlZmluZWQpIHtcblx0XHRjb21waWxlZERlZi50ZW1wbGF0ZSA9IFwiXCIgKyB0bXBsID09PSB0bXBsID8gKCR0ZW1wbGF0ZXNbdG1wbF0gfHwgJHRlbXBsYXRlcyh0bXBsKSkgOiB0bXBsO1xuXHR9XG5cdGlmIChjb21waWxlZERlZi5pbml0ICE9PSBmYWxzZSkge1xuXHRcdC8vIFNldCBpbml0OiBmYWxzZSBvbiB0YWdEZWYgaWYgeW91IHdhbnQgdG8gcHJvdmlkZSBqdXN0IGEgcmVuZGVyIG1ldGhvZCwgb3IgcmVuZGVyIGFuZCB0ZW1wbGF0ZSwgYnV0IG5vIGNvbnN0cnVjdG9yIG9yIHByb3RvdHlwZS5cblx0XHQvLyBzbyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGFnIHRvIHJlbmRlciBmdW5jdGlvbiwgZXhjZXB0IHlvdSBjYW4gYWxzbyBwcm92aWRlIGEgdGVtcGxhdGUuXG5cdFx0KFRhZy5wcm90b3R5cGUgPSBjb21waWxlZERlZikuY29uc3RydWN0b3IgPSBjb21waWxlZERlZi5fY3RyID0gVGFnO1xuXHR9XG5cblx0aWYgKHBhcmVudFRtcGwpIHtcblx0XHRjb21waWxlZERlZi5fcGFyZW50VG1wbCA9IHBhcmVudFRtcGw7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVkRGVmO1xufVxuXG5mdW5jdGlvbiBiYXNlQXBwbHkoYXJncykge1xuXHQvLyBJbiBkZXJpdmVkIG1ldGhvZCAob3IgaGFuZGxlciBkZWNsYXJlZCBkZWNsYXJhdGl2ZWx5IGFzIGluIHt7OmZvbyBvbkNoYW5nZT1+Zm9vQ2hhbmdlZH19IGNhbiBjYWxsIGJhc2UgbWV0aG9kLFxuXHQvLyB1c2luZyB0aGlzLmJhc2VBcHBseShhcmd1bWVudHMpIChFcXVpdmFsZW50IHRvIHRoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSBpbiBqUXVlcnkgVUkpXG5cdHJldHVybiB0aGlzLmJhc2UuYXBwbHkodGhpcywgYXJncyk7XG59XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBjb21waWxlVG1wbFxuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZVRtcGwobmFtZSwgdG1wbCwgcGFyZW50VG1wbCwgb3B0aW9ucykge1xuXHQvLyB0bXBsIGlzIGVpdGhlciBhIHRlbXBsYXRlIG9iamVjdCwgYSBzZWxlY3RvciBmb3IgYSB0ZW1wbGF0ZSBzY3JpcHQgYmxvY2ssIHRoZSBuYW1lIG9mIGEgY29tcGlsZWQgdGVtcGxhdGUsIG9yIGEgdGVtcGxhdGUgb2JqZWN0XG5cblx0Ly89PT09IG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXHRmdW5jdGlvbiBsb29rdXBUZW1wbGF0ZSh2YWx1ZSkge1xuXHRcdC8vIElmIHZhbHVlIGlzIG9mIHR5cGUgc3RyaW5nIC0gdHJlYXQgYXMgc2VsZWN0b3IsIG9yIG5hbWUgb2YgY29tcGlsZWQgdGVtcGxhdGVcblx0XHQvLyBSZXR1cm4gdGhlIHRlbXBsYXRlIG9iamVjdCwgaWYgYWxyZWFkeSBjb21waWxlZCwgb3IgdGhlIG1hcmt1cCBzdHJpbmdcblx0XHR2YXIgY3VycmVudE5hbWUsIHRtcGw7XG5cdFx0aWYgKChcIlwiICsgdmFsdWUgPT09IHZhbHVlKSB8fCB2YWx1ZS5ub2RlVHlwZSA+IDAgJiYgKGVsZW0gPSB2YWx1ZSkpIHtcblx0XHRcdGlmICghZWxlbSkge1xuXHRcdFx0XHRpZiAoL15cXC5cXC9bXlxcXFw6Kj9cIjw+XSokLy50ZXN0KHZhbHVlKSkge1xuXHRcdFx0XHRcdC8vIHRtcGw9XCIuL3NvbWUvZmlsZS5odG1sXCJcblx0XHRcdFx0XHQvLyBJZiB0aGUgdGVtcGxhdGUgaXMgbm90IG5hbWVkLCB1c2UgXCIuL3NvbWUvZmlsZS5odG1sXCIgYXMgbmFtZS5cblx0XHRcdFx0XHRpZiAodG1wbCA9ICR0ZW1wbGF0ZXNbbmFtZSA9IG5hbWUgfHwgdmFsdWVdKSB7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHRtcGw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIEJST1dTRVItU1BFQ0lGSUMgQ09ERSAobm90IG9uIE5vZGUuanMpOlxuXHRcdFx0XHRcdFx0Ly8gTG9vayBmb3Igc2VydmVyLWdlbmVyYXRlZCBzY3JpcHQgYmxvY2sgd2l0aCBpZCBcIi4vc29tZS9maWxlLmh0bWxcIlxuXHRcdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoJC5mbiAmJiAhJHN1Yi5yVG1wbC50ZXN0KHZhbHVlKSkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gJChkb2N1bWVudCkuZmluZCh2YWx1ZSlbMF07IC8vIGlmIGpRdWVyeSBpcyBsb2FkZWQsIHRlc3QgZm9yIHNlbGVjdG9yIHJldHVybmluZyBlbGVtZW50cywgYW5kIGdldCBmaXJzdCBlbGVtZW50XG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHRcdFx0fS8vIEVORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdH0gLy9CUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdC8vIEdlbmVyYWxseSB0aGlzIGlzIGEgc2NyaXB0IGVsZW1lbnQuXG5cdFx0XHRcdC8vIEhvd2V2ZXIgd2UgYWxsb3cgaXQgdG8gYmUgYW55IGVsZW1lbnQsIHNvIHlvdSBjYW4gZm9yIGV4YW1wbGUgdGFrZSB0aGUgY29udGVudCBvZiBhIGRpdixcblx0XHRcdFx0Ly8gdXNlIGl0IGFzIGEgdGVtcGxhdGUsIGFuZCByZXBsYWNlIGl0IGJ5IHRoZSBzYW1lIGNvbnRlbnQgcmVuZGVyZWQgYWdhaW5zdCBkYXRhLlxuXHRcdFx0XHQvLyBlLmcuIGZvciBsaW5raW5nIHRoZSBjb250ZW50IG9mIGEgZGl2IHRvIGEgY29udGFpbmVyLCBhbmQgdXNpbmcgdGhlIGluaXRpYWwgY29udGVudCBhcyB0ZW1wbGF0ZTpcblx0XHRcdFx0Ly8gJC5saW5rKFwiI2NvbnRlbnRcIiwgbW9kZWwsIHt0bXBsOiBcIiNjb250ZW50XCJ9KTtcblx0XHRcdFx0aWYgKG9wdGlvbnMpIHtcblx0XHRcdFx0XHQvLyBXZSB3aWxsIGNvbXBpbGUgYSBuZXcgdGVtcGxhdGUgdXNpbmcgdGhlIG1hcmt1cCBpbiB0aGUgc2NyaXB0IGVsZW1lbnRcblx0XHRcdFx0XHR2YWx1ZSA9IGVsZW0uaW5uZXJIVE1MO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFdlIHdpbGwgY2FjaGUgYSBzaW5nbGUgY29weSBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUsIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbmFtZVxuXHRcdFx0XHRcdC8vIChyZW5hbWluZyBmcm9tIGEgcHJldmlvdXMgbmFtZSBpZiB0aGVyZSB3YXMgb25lKS5cblx0XHRcdFx0XHRjdXJyZW50TmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKHRtcGxBdHRyKTtcblx0XHRcdFx0XHRpZiAoY3VycmVudE5hbWUpIHtcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50TmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9ICR0ZW1wbGF0ZXNbY3VycmVudE5hbWVdO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgJHRlbXBsYXRlc1tjdXJyZW50TmFtZV07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCQuZm4pIHtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSAkLmRhdGEoZWxlbSlbanN2VG1wbF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG5hbWUgPSBuYW1lIHx8ICgkLmZuID8ganN2VG1wbCA6IHZhbHVlKTtcblx0XHRcdFx0XHRcdHZhbHVlID0gY29tcGlsZVRtcGwobmFtZSwgZWxlbS5pbm5lckhUTUwsIHBhcmVudFRtcGwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YWx1ZS50bXBsTmFtZSA9IG5hbWUgPSBuYW1lIHx8IGN1cnJlbnROYW1lO1xuXHRcdFx0XHRcdGlmIChuYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHRcdFx0XHQkdGVtcGxhdGVzW25hbWVdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKHRtcGxBdHRyLCBuYW1lKTtcblx0XHRcdFx0XHRpZiAoJC5mbikge1xuXHRcdFx0XHRcdFx0JC5kYXRhKGVsZW0sIGpzdlRtcGwsIHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gLy8gRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0ZWxlbSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKCF2YWx1ZS5mbikge1xuXHRcdFx0dmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuIEhUTUwgZWxlbWVudCwgb3IgY29tcGlsZWQgdGVtcGxhdGUsIHJldHVybiB1bmRlZmluZWRcblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0dmFyIGVsZW0sIGNvbXBpbGVkVG1wbCxcblx0XHR0bXBsT3JNYXJrdXAgPSB0bXBsID0gdG1wbCB8fCBcIlwiO1xuXG5cdC8vPT09PSBDb21waWxlIHRoZSB0ZW1wbGF0ZSA9PT09XG5cdGlmIChvcHRpb25zID09PSAwKSB7XG5cdFx0b3B0aW9ucyA9IHVuZGVmaW5lZDtcblx0XHR0bXBsT3JNYXJrdXAgPSBsb29rdXBUZW1wbGF0ZSh0bXBsT3JNYXJrdXApOyAvLyBUb3AtbGV2ZWwgY29tcGlsZSBzbyBkbyBhIHRlbXBsYXRlIGxvb2t1cFxuXHR9XG5cblx0Ly8gSWYgb3B0aW9ucywgdGhlbiB0aGlzIHdhcyBhbHJlYWR5IGNvbXBpbGVkIGZyb20gYSAoc2NyaXB0KSBlbGVtZW50IHRlbXBsYXRlIGRlY2xhcmF0aW9uLlxuXHQvLyBJZiBub3QsIHRoZW4gaWYgdG1wbCBpcyBhIHRlbXBsYXRlIG9iamVjdCwgdXNlIGl0IGZvciBvcHRpb25zXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8ICh0bXBsLm1hcmt1cCA/IHRtcGwgOiB7fSk7XG5cdG9wdGlvbnMudG1wbE5hbWUgPSBuYW1lO1xuXHRpZiAocGFyZW50VG1wbCkge1xuXHRcdG9wdGlvbnMuX3BhcmVudFRtcGwgPSBwYXJlbnRUbXBsO1xuXHR9XG5cdC8vIElmIHRtcGwgaXMgbm90IGEgbWFya3VwIHN0cmluZyBvciBhIHNlbGVjdG9yIHN0cmluZywgdGhlbiBpdCBtdXN0IGJlIGEgdGVtcGxhdGUgb2JqZWN0XG5cdC8vIEluIHRoYXQgY2FzZSwgZ2V0IGl0IGZyb20gdGhlIG1hcmt1cCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG5cdGlmICghdG1wbE9yTWFya3VwICYmIHRtcGwubWFya3VwICYmICh0bXBsT3JNYXJrdXAgPSBsb29rdXBUZW1wbGF0ZSh0bXBsLm1hcmt1cCkpKSB7XG5cdFx0aWYgKHRtcGxPck1hcmt1cC5mbikge1xuXHRcdFx0Ly8gSWYgdGhlIHN0cmluZyByZWZlcmVuY2VzIGEgY29tcGlsZWQgdGVtcGxhdGUgb2JqZWN0LCBuZWVkIHRvIHJlY29tcGlsZSB0byBtZXJnZSBhbnkgbW9kaWZpZWQgb3B0aW9uc1xuXHRcdFx0dG1wbE9yTWFya3VwID0gdG1wbE9yTWFya3VwLm1hcmt1cDtcblx0XHR9XG5cdH1cblx0aWYgKHRtcGxPck1hcmt1cCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYgKHRtcGxPck1hcmt1cC5mbiB8fCB0bXBsLmZuKSB7XG5cdFx0XHQvLyB0bXBsIGlzIGFscmVhZHkgY29tcGlsZWQsIHNvIHVzZSBpdFxuXHRcdFx0aWYgKHRtcGxPck1hcmt1cC5mbikge1xuXHRcdFx0XHRjb21waWxlZFRtcGwgPSB0bXBsT3JNYXJrdXA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRtcGxPck1hcmt1cCBpcyBhIG1hcmt1cCBzdHJpbmcsIG5vdCBhIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHQvLyBDcmVhdGUgdGVtcGxhdGUgb2JqZWN0XG5cdFx0XHR0bXBsID0gdG1wbE9iamVjdCh0bXBsT3JNYXJrdXAsIG9wdGlvbnMpO1xuXHRcdFx0Ly8gQ29tcGlsZSB0byBBU1QgYW5kIHRoZW4gdG8gY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdHRtcGxGbih0bXBsT3JNYXJrdXAucmVwbGFjZShyRXNjYXBlUXVvdGVzLCBcIlxcXFwkJlwiKSwgdG1wbCk7XG5cdFx0fVxuXHRcdGlmICghY29tcGlsZWRUbXBsKSB7XG5cdFx0XHRjb21waWxlZFRtcGwgPSAkZXh0ZW5kKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gY29tcGlsZWRUbXBsLnJlbmRlci5hcHBseShjb21waWxlZFRtcGwsIGFyZ3VtZW50cyk7XG5cdFx0XHR9LCB0bXBsKTtcblxuXHRcdFx0Y29tcGlsZUNoaWxkUmVzb3VyY2VzKGNvbXBpbGVkVG1wbCk7XG5cdFx0fVxuXHRcdGlmIChuYW1lICYmICFwYXJlbnRUbXBsICYmIG5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdCRyZW5kZXJbbmFtZV0gPSBjb21waWxlZFRtcGw7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlZFRtcGw7XG5cdH1cbn1cblxuLy89PT09IC9lbmQgb2YgZnVuY3Rpb24gY29tcGlsZVRtcGwgPT09PVxuXG4vLz09PT09PT09PT09PT09PT09XG4vLyBjb21waWxlVmlld01vZGVsXG4vLz09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRWYWwoZGVmYXVsdFZhbCwgZGF0YSkge1xuXHRyZXR1cm4gJC5pc0Z1bmN0aW9uKGRlZmF1bHRWYWwpXG5cdFx0PyBkZWZhdWx0VmFsLmNhbGwoZGF0YSlcblx0XHQ6IGRlZmF1bHRWYWw7XG59XG5cbmZ1bmN0aW9uIHVubWFwQXJyYXkobW9kZWxBcnIpIHtcblx0XHR2YXIgaSwgYXJyID0gW10sXG5cdFx0XHRsID0gbW9kZWxBcnIubGVuZ3RoO1xuXHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0YXJyLnB1c2gobW9kZWxBcnJbaV0udW5tYXAoKSk7XG5cdFx0fVxuXHRcdHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVWaWV3TW9kZWwobmFtZSwgdHlwZSkge1xuXHR2YXIgaSwgY29uc3RydWN0b3IsXG5cdFx0dmlld01vZGVscyA9IHRoaXMsXG5cdFx0Z2V0dGVycyA9IHR5cGUuZ2V0dGVycyxcblx0XHRleHRlbmQgPSB0eXBlLmV4dGVuZCxcblx0XHRpZCA9IHR5cGUuaWQsXG5cdFx0cHJvdG8gPSAkLmV4dGVuZCh7XG5cdFx0XHRfaXM6IG5hbWUgfHwgXCJ1bm5hbWVkXCIsXG5cdFx0XHR1bm1hcDogdW5tYXAsXG5cdFx0XHRtZXJnZTogbWVyZ2Vcblx0XHR9LCBleHRlbmQpLFxuXHRcdGFyZ3MgPSBcIlwiLFxuXHRcdGJvZHkgPSBcIlwiLFxuXHRcdGwgPSBnZXR0ZXJzID8gZ2V0dGVycy5sZW5ndGggOiAwLFxuXHRcdCRvYnNlcnZhYmxlID0gJC5vYnNlcnZhYmxlLFxuXHRcdGdldHRlck5hbWVzID0ge307XG5cblx0ZnVuY3Rpb24gR2V0TmV3KGFyZ3MpIHtcblx0XHRjb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmdzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHZtKCkge1xuXHRcdHJldHVybiBuZXcgR2V0TmV3KGFyZ3VtZW50cyk7XG5cdH1cblxuXHRmdW5jdGlvbiBpdGVyYXRlKGRhdGEsIGFjdGlvbikge1xuXHRcdHZhciBqLCBnZXR0ZXJUeXBlLCBkZWZhdWx0VmFsLCBwcm9wLCBvYixcblx0XHRcdG0gPSBnZXR0ZXJzLmxlbmd0aDtcblx0XHRmb3IgKGo9MDsgajxtOyBqKyspIHtcblx0XHRcdHByb3AgPSBnZXR0ZXJzW2pdO1xuXHRcdFx0Z2V0dGVyVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGlmIChwcm9wICsgXCJcIiAhPT0gcHJvcCkge1xuXHRcdFx0XHRnZXR0ZXJUeXBlID0gcHJvcDtcblx0XHRcdFx0cHJvcCA9IGdldHRlclR5cGUuZ2V0dGVyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKChvYiA9IGRhdGFbcHJvcF0pID09PSB1bmRlZmluZWQgJiYgZ2V0dGVyVHlwZSAmJiAoZGVmYXVsdFZhbCA9IGdldHRlclR5cGUuZGVmYXVsdFZhbCkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvYiA9IGdldERlZmF1bHRWYWwoZGVmYXVsdFZhbCwgZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRhY3Rpb24ob2IsIGdldHRlclR5cGUgJiYgdmlld01vZGVsc1tnZXR0ZXJUeXBlLnR5cGVdLCBwcm9wKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBtYXAoZGF0YSkge1xuXHRcdGRhdGEgPSBkYXRhICsgXCJcIiA9PT0gZGF0YVxuXHRcdFx0PyBKU09OLnBhcnNlKGRhdGEpIC8vIEFjY2VwdCBKU09OIHN0cmluZ1xuXHRcdFx0OiBkYXRhOyAgICAgICAgICAgIC8vIG9yIG9iamVjdC9hcnJheVxuXHRcdHZhciBpLCBqLCAgbCwgbSwgcHJvcCxcblx0XHRcdG9iID0gZGF0YSxcblx0XHRcdGFyciA9IFtdO1xuXG5cdFx0aWYgKCRpc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRkYXRhID0gZGF0YSB8fCBbXTtcblx0XHRcdGwgPSBkYXRhLmxlbmd0aDtcblx0XHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0XHRhcnIucHVzaCh0aGlzLm1hcChkYXRhW2ldKSk7XG5cdFx0XHR9XG5cdFx0XHRhcnIuX2lzID0gbmFtZTtcblx0XHRcdGFyci51bm1hcCA9IHVubWFwO1xuXHRcdFx0YXJyLm1lcmdlID0gbWVyZ2U7XG5cdFx0XHRyZXR1cm4gYXJyO1xuXHRcdH1cblxuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRpdGVyYXRlKGRhdGEsIGZ1bmN0aW9uKG9iLCB2aWV3TW9kZWwpIHtcblx0XHRcdFx0aWYgKHZpZXdNb2RlbCkgeyAvLyBJdGVyYXRlIHRvIGJ1aWxkIGdldHRlcnMgYXJnIGFycmF5ICh2YWx1ZSwgb3IgbWFwcGVkIHZhbHVlKVxuXHRcdFx0XHRcdG9iID0gdmlld01vZGVsLm1hcChvYik7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXJyLnB1c2gob2IpO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9iID0gdGhpcy5hcHBseSh0aGlzLCBhcnIpOyAvLyBJbnNhbnRpYXRlIHRoaXMgVmlldyBNb2RlbCwgcGFzc2luZyBnZXR0ZXJzIGFyZ3MgYXJyYXkgdG8gY29uc3RydWN0b3Jcblx0XHRcdGZvciAocHJvcCBpbiBkYXRhKSB7IC8vIENvcHkgb3ZlciBhbnkgb3RoZXIgcHJvcGVydGllcy4gdGhhdCBhcmUgbm90IGdldC9zZXQgcHJvcGVydGllc1xuXHRcdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8gICYmICFnZXR0ZXJOYW1lc1twcm9wXSkge1xuXHRcdFx0XHRcdG9iW3Byb3BdID0gZGF0YVtwcm9wXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb2I7XG5cdH1cblxuXHRmdW5jdGlvbiBtZXJnZShkYXRhKSB7XG5cdFx0ZGF0YSA9IGRhdGEgKyBcIlwiID09PSBkYXRhXG5cdFx0XHQ/IEpTT04ucGFyc2UoZGF0YSkgLy8gQWNjZXB0IEpTT04gc3RyaW5nXG5cdFx0XHQ6IGRhdGE7ICAgICAgICAgICAgLy8gb3Igb2JqZWN0L2FycmF5XG5cdFx0dmFyIGksIGosIGwsIG0sIHByb3AsIG1vZCwgZm91bmQsIGFzc2lnbmVkLCBvYiwgbmV3TW9kQXJyLFxuXHRcdFx0bW9kZWwgPSB0aGlzO1xuXG5cdFx0aWYgKCRpc0FycmF5KG1vZGVsKSkge1xuXHRcdFx0YXNzaWduZWQgPSB7fTtcblx0XHRcdG5ld01vZEFyciA9IFtdO1xuXHRcdFx0bCA9IGRhdGEubGVuZ3RoO1xuXHRcdFx0bSA9IG1vZGVsLmxlbmd0aDtcblx0XHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0XHRvYiA9IGRhdGFbaV07XG5cdFx0XHRcdGZvdW5kID0gZmFsc2U7XG5cdFx0XHRcdGZvciAoaj0wOyBqPG0gJiYgIWZvdW5kOyBqKyspIHtcblx0XHRcdFx0XHRpZiAoYXNzaWduZWRbal0pIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2QgPSBtb2RlbFtqXTtcblxuXHRcdFx0XHRcdGlmIChpZCkge1xuXHRcdFx0XHRcdFx0YXNzaWduZWRbal0gPSBmb3VuZCA9IGlkICsgXCJcIiA9PT0gaWRcblx0XHRcdFx0XHRcdD8gKG9iW2lkXSAmJiAoZ2V0dGVyTmFtZXNbaWRdID8gbW9kW2lkXSgpIDogbW9kW2lkXSkgPT09IG9iW2lkXSlcblx0XHRcdFx0XHRcdDogaWQobW9kLCBvYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChmb3VuZCkge1xuXHRcdFx0XHRcdG1vZC5tZXJnZShvYik7XG5cdFx0XHRcdFx0bmV3TW9kQXJyLnB1c2gobW9kKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuZXdNb2RBcnIucHVzaCh2bS5tYXAob2IpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdCRvYnNlcnZhYmxlKG1vZGVsKS5yZWZyZXNoKG5ld01vZEFyciwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb2RlbC5zcGxpY2UuYXBwbHkobW9kZWwsIFswLCBtb2RlbC5sZW5ndGhdLmNvbmNhdChuZXdNb2RBcnIpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aXRlcmF0ZShkYXRhLCBmdW5jdGlvbihvYiwgdmlld01vZGVsLCBnZXR0ZXIpIHtcblx0XHRcdGlmICh2aWV3TW9kZWwpIHtcblx0XHRcdFx0bW9kZWxbZ2V0dGVyXSgpLm1lcmdlKG9iKTsgLy8gVXBkYXRlIHR5cGVkIHByb3BlcnR5XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb2RlbFtnZXR0ZXJdKG9iKTsgLy8gVXBkYXRlIG5vbi10eXBlZCBwcm9wZXJ0eVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGZvciAocHJvcCBpbiBkYXRhKSB7XG5cdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8gJiYgIWdldHRlck5hbWVzW3Byb3BdKSB7XG5cdFx0XHRcdG1vZGVsW3Byb3BdID0gZGF0YVtwcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiB1bm1hcCgpIHtcblx0XHR2YXIgb2IsIHByb3AsIGksIGwsIGdldHRlclR5cGUsIGFyciwgdmFsdWUsXG5cdFx0XHRtb2RlbCA9IHRoaXM7XG5cblx0XHRpZiAoJGlzQXJyYXkobW9kZWwpKSB7XG5cdFx0XHRyZXR1cm4gdW5tYXBBcnJheShtb2RlbCk7XG5cdFx0fVxuXHRcdG9iID0ge307XG5cdFx0bCA9IGdldHRlcnMubGVuZ3RoO1xuXHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0cHJvcCA9IGdldHRlcnNbaV07XG5cdFx0XHRnZXR0ZXJUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHByb3AgKyBcIlwiICE9PSBwcm9wKSB7XG5cdFx0XHRcdGdldHRlclR5cGUgPSBwcm9wO1xuXHRcdFx0XHRwcm9wID0gZ2V0dGVyVHlwZS5nZXR0ZXI7XG5cdFx0XHR9XG5cdFx0XHR2YWx1ZSA9IG1vZGVsW3Byb3BdKCk7XG5cdFx0XHRvYltwcm9wXSA9IGdldHRlclR5cGUgJiYgdmFsdWUgJiYgdmlld01vZGVsc1tnZXR0ZXJUeXBlLnR5cGVdXG5cdFx0XHRcdD8gJGlzQXJyYXkodmFsdWUpXG5cdFx0XHRcdFx0PyB1bm1hcEFycmF5KHZhbHVlKVxuXHRcdFx0XHRcdDogdmFsdWUudW5tYXAoKVxuXHRcdFx0XHQ6IHZhbHVlO1xuXHRcdH1cblx0XHRmb3IgKHByb3AgaW4gbW9kZWwpIHtcblx0XHRcdGlmIChwcm9wICE9PSBcIl9pc1wiICYmICFnZXR0ZXJOYW1lc1twcm9wXSAmJiBwcm9wICE9PSAkZXhwYW5kbyAgJiYgKHByb3AuY2hhckF0KDApICE9PSBcIl9cIiB8fCAhZ2V0dGVyTmFtZXNbcHJvcC5zbGljZSgxKV0pICYmICEkLmlzRnVuY3Rpb24obW9kZWxbcHJvcF0pKSB7XG5cdFx0XHRcdG9iW3Byb3BdID0gbW9kZWxbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvYjtcblx0fVxuXG5cdEdldE5ldy5wcm90b3R5cGUgPSBwcm90bztcblxuXHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHQoZnVuY3Rpb24oZ2V0dGVyKSB7XG5cdFx0XHRnZXR0ZXIgPSBnZXR0ZXIuZ2V0dGVyIHx8IGdldHRlcjtcblx0XHRcdGdldHRlck5hbWVzW2dldHRlcl0gPSBpKzE7XG5cdFx0XHR2YXIgcHJpdkZpZWxkID0gXCJfXCIgKyBnZXR0ZXI7XG5cblx0XHRcdGFyZ3MgKz0gKGFyZ3MgPyBcIixcIiA6IFwiXCIpICsgZ2V0dGVyO1xuXHRcdFx0Ym9keSArPSBcInRoaXMuXCIgKyBwcml2RmllbGQgKyBcIiA9IFwiICsgZ2V0dGVyICsgXCI7XFxuXCI7XG5cdFx0XHRwcm90b1tnZXR0ZXJdID0gcHJvdG9bZ2V0dGVyXSB8fCBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXNbcHJpdkZpZWxkXTsgLy8gSWYgdGhlcmUgaXMgbm8gYXJndW1lbnQsIHVzZSBhcyBhIGdldHRlclxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHRcdCRvYnNlcnZhYmxlKHRoaXMpLnNldFByb3BlcnR5KGdldHRlciwgdmFsKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzW3ByaXZGaWVsZF0gPSB2YWw7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHRwcm90b1tnZXR0ZXJdLnNldCA9IHByb3RvW2dldHRlcl0uc2V0IHx8IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHRcdHRoaXNbcHJpdkZpZWxkXSA9IHZhbDsgLy8gU2V0dGVyIGNhbGxlZCBieSBvYnNlcnZhYmxlIHByb3BlcnR5IGNoYW5nZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pKGdldHRlcnNbaV0pO1xuXHR9XG5cblx0Y29uc3RydWN0b3IgPSBuZXcgRnVuY3Rpb24oYXJncywgYm9keS5zbGljZSgwLCAtMSkpO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBwcm90bztcblx0cHJvdG8uY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjtcblxuXHR2bS5tYXAgPSBtYXA7XG5cdHZtLmdldHRlcnMgPSBnZXR0ZXJzO1xuXHR2bS5leHRlbmQgPSBleHRlbmQ7XG5cdHZtLmlkID0gaWQ7XG5cdHJldHVybiB2bTtcbn1cblxuZnVuY3Rpb24gdG1wbE9iamVjdChtYXJrdXAsIG9wdGlvbnMpIHtcblx0Ly8gVGVtcGxhdGUgb2JqZWN0IGNvbnN0cnVjdG9yXG5cdHZhciBodG1sVGFnLFxuXHRcdHdyYXBNYXAgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5fd20gfHwge30sIC8vIE9ubHkgdXNlZCBpbiBKc1ZpZXdzLiBPdGhlcndpc2UgZW1wdHk6IHt9XG5cdFx0dG1wbCA9ICRleHRlbmQoXG5cdFx0XHR7XG5cdFx0XHRcdHRtcGxzOiBbXSxcblx0XHRcdFx0bGlua3M6IHt9LCAvLyBDb21waWxlZCBmdW5jdGlvbnMgZm9yIGxpbmsgZXhwcmVzc2lvbnNcblx0XHRcdFx0Ym5kczogW10sXG5cdFx0XHRcdF9pczogXCJ0ZW1wbGF0ZVwiLFxuXHRcdFx0XHRyZW5kZXI6IHJlbmRlckNvbnRlbnRcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zXG5cdFx0KTtcblxuXHR0bXBsLm1hcmt1cCA9IG1hcmt1cDtcblx0aWYgKCFvcHRpb25zLmh0bWxUYWcpIHtcblx0XHQvLyBTZXQgdG1wbC50YWcgdG8gdGhlIHRvcC1sZXZlbCBIVE1MIHRhZyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSwgaWYgYW55Li4uXG5cdFx0aHRtbFRhZyA9IHJGaXJzdEVsZW0uZXhlYyhtYXJrdXApO1xuXHRcdHRtcGwuaHRtbFRhZyA9IGh0bWxUYWcgPyBodG1sVGFnWzFdLnRvTG93ZXJDYXNlKCkgOiBcIlwiO1xuXHR9XG5cdGh0bWxUYWcgPSB3cmFwTWFwW3RtcGwuaHRtbFRhZ107XG5cdGlmIChodG1sVGFnICYmIGh0bWxUYWcgIT09IHdyYXBNYXAuZGl2KSB7XG5cdFx0Ly8gV2hlbiB1c2luZyBKc1ZpZXdzLCB3ZSB0cmltIHRlbXBsYXRlcyB3aGljaCBhcmUgaW5zZXJ0ZWQgaW50byBIVE1MIGNvbnRleHRzIHdoZXJlIHRleHQgbm9kZXMgYXJlIG5vdCByZW5kZXJlZCAoaS5lLiBub3QgJ1BocmFzaW5nIENvbnRlbnQnKS5cblx0XHQvLyBDdXJyZW50bHkgbm90IHRyaW1tZWQgZm9yIDxsaT4gdGFnLiAoTm90IHdvcnRoIGFkZGluZyBwZXJmIGNvc3QpXG5cdFx0dG1wbC5tYXJrdXAgPSAkLnRyaW0odG1wbC5tYXJrdXApO1xuXHR9XG5cblx0cmV0dXJuIHRtcGw7XG59XG5cbi8vPT09PT09PT09PT09PT1cbi8vIHJlZ2lzdGVyU3RvcmVcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVnaXN0ZXJTdG9yZShzdG9yZU5hbWUsIHN0b3JlU2V0dGluZ3MpIHtcblxuXHRmdW5jdGlvbiB0aGVTdG9yZShuYW1lLCBpdGVtLCBwYXJlbnRUbXBsKSB7XG5cdFx0Ly8gVGhlIHN0b3JlIGlzIGFsc28gdGhlIGZ1bmN0aW9uIHVzZWQgdG8gYWRkIGl0ZW1zIHRvIHRoZSBzdG9yZS4gZS5nLiAkLnRlbXBsYXRlcywgb3IgJC52aWV3cy50YWdzXG5cblx0XHQvLyBGb3Igc3RvcmUgb2YgbmFtZSAndGhpbmcnLCBDYWxsIGFzOlxuXHRcdC8vICAgICQudmlld3MudGhpbmdzKGl0ZW1zWywgcGFyZW50VG1wbF0pLFxuXHRcdC8vIG9yICQudmlld3MudGhpbmdzKG5hbWUsIGl0ZW1bLCBwYXJlbnRUbXBsXSlcblxuXHRcdHZhciBvblN0b3JlLCBjb21waWxlLCBpdGVtTmFtZSwgdGhpc1N0b3JlO1xuXHRcdGlmIChuYW1lICYmIHR5cGVvZiBuYW1lID09PSBPQkpFQ1QgJiYgIW5hbWUubm9kZVR5cGUgJiYgIW5hbWUubWFya3VwICYmICFuYW1lLmdldFRndCAmJiAhKHN0b3JlTmFtZSA9PT0gXCJ2aWV3TW9kZWxcIiAmJiBuYW1lLmdldHRlcnMgfHwgbmFtZS5leHRlbmQpKSB7XG5cdFx0XHQvLyBDYWxsIHRvICQudmlld3MudGhpbmdzKGl0ZW1zWywgcGFyZW50VG1wbF0pLFxuXG5cdFx0XHQvLyBBZGRpbmcgaXRlbXMgdG8gdGhlIHN0b3JlXG5cdFx0XHQvLyBJZiBuYW1lIGlzIGEgaGFzaCwgdGhlbiBpdGVtIGlzIHBhcmVudFRtcGwuIEl0ZXJhdGUgb3ZlciBoYXNoIGFuZCBjYWxsIHN0b3JlIGZvciBrZXkuXG5cdFx0XHRmb3IgKGl0ZW1OYW1lIGluIG5hbWUpIHtcblx0XHRcdFx0dGhlU3RvcmUoaXRlbU5hbWUsIG5hbWVbaXRlbU5hbWVdLCBpdGVtKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpdGVtIHx8ICR2aWV3cztcblx0XHR9XG5cdFx0Ly8gQWRkaW5nIGEgc2luZ2xlIHVubmFtZWQgaXRlbSB0byB0aGUgc3RvcmVcblx0XHRpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpdGVtID0gbmFtZTtcblx0XHRcdG5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmIChuYW1lICYmIFwiXCIgKyBuYW1lICE9PSBuYW1lKSB7IC8vIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xuXHRcdFx0cGFyZW50VG1wbCA9IGl0ZW07XG5cdFx0XHRpdGVtID0gbmFtZTtcblx0XHRcdG5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHRoaXNTdG9yZSA9IHBhcmVudFRtcGxcblx0XHRcdD8gc3RvcmVOYW1lID09PSBcInZpZXdNb2RlbFwiXG5cdFx0XHRcdD8gcGFyZW50VG1wbFxuXHRcdFx0XHQ6IChwYXJlbnRUbXBsW3N0b3JlTmFtZXNdID0gcGFyZW50VG1wbFtzdG9yZU5hbWVzXSB8fCB7fSlcblx0XHRcdDogdGhlU3RvcmU7XG5cdFx0Y29tcGlsZSA9IHN0b3JlU2V0dGluZ3MuY29tcGlsZTtcblx0XHRpZiAoaXRlbSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gSWYgaXRlbSBpcyBudWxsLCBkZWxldGUgdGhpcyBlbnRyeVxuXHRcdFx0aWYgKG5hbWUpIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXNTdG9yZVtuYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aXRlbSA9IGNvbXBpbGUgPyBjb21waWxlLmNhbGwodGhpc1N0b3JlLCBuYW1lLCBpdGVtLCBwYXJlbnRUbXBsLCAwKSA6IGl0ZW07XG5cdFx0XHRpZiAobmFtZSkge1xuXHRcdFx0XHR0aGlzU3RvcmVbbmFtZV0gPSBpdGVtO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoY29tcGlsZSAmJiBpdGVtKSB7XG5cdFx0XHRpdGVtLl9pcyA9IHN0b3JlTmFtZTsgLy8gT25seSBkbyB0aGlzIGZvciBjb21waWxlZCBvYmplY3RzICh0YWdzLCB0ZW1wbGF0ZXMuLi4pXG5cdFx0fVxuXHRcdGlmIChpdGVtICYmIChvblN0b3JlID0gJHN1Yi5vblN0b3JlW3N0b3JlTmFtZV0pKSB7XG5cdFx0XHQvLyBlLmcuIEpzVmlld3MgaW50ZWdyYXRpb25cblx0XHRcdG9uU3RvcmUobmFtZSwgaXRlbSwgY29tcGlsZSk7XG5cdFx0fVxuXHRcdHJldHVybiBpdGVtO1xuXHR9XG5cblx0dmFyIHN0b3JlTmFtZXMgPSBzdG9yZU5hbWUgKyBcInNcIjtcblxuXHQkdmlld3Nbc3RvcmVOYW1lc10gPSB0aGVTdG9yZTtcbn1cblxuZnVuY3Rpb24gYWRkU2V0dGluZyhzdCkge1xuXHQkdmlld3NTZXR0aW5nc1tzdF0gPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG5cdFx0XHQ/ICgkc3ViU2V0dGluZ3Nbc3RdID0gdmFsdWUsICR2aWV3c1NldHRpbmdzKVxuXHRcdFx0OiAkc3ViU2V0dGluZ3Nbc3RdO1xuXHR9O1xufVxuXG4vLz09PT09PT09PVxuLy8gZGF0YU1hcFxuLy89PT09PT09PT1cblxuZnVuY3Rpb24gZGF0YU1hcChtYXBEZWYpIHtcblx0ZnVuY3Rpb24gTWFwKHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdHRoaXMudGd0ID0gbWFwRGVmLmdldFRndChzb3VyY2UsIG9wdGlvbnMpO1xuXHR9XG5cblx0aWYgKCRpc0Z1bmN0aW9uKG1hcERlZikpIHtcblx0XHQvLyBTaW1wbGUgbWFwIGRlY2xhcmVkIGFzIGZ1bmN0aW9uXG5cdFx0bWFwRGVmID0ge1xuXHRcdFx0Z2V0VGd0OiBtYXBEZWZcblx0XHR9O1xuXHR9XG5cblx0aWYgKG1hcERlZi5iYXNlTWFwKSB7XG5cdFx0bWFwRGVmID0gJGV4dGVuZCgkZXh0ZW5kKHt9LCBtYXBEZWYuYmFzZU1hcCksIG1hcERlZik7XG5cdH1cblxuXHRtYXBEZWYubWFwID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zKSB7XG5cdFx0cmV0dXJuIG5ldyBNYXAoc291cmNlLCBvcHRpb25zKTtcblx0fTtcblx0cmV0dXJuIG1hcERlZjtcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gcmVuZGVyQ29udGVudFxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZW5kZXJDb250ZW50KGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBrZXksIG9uUmVuZGVyKSB7XG5cdHZhciBpLCBsLCB0YWcsIHRtcGwsIHRhZ0N0eCwgaXNUb3BSZW5kZXJDYWxsLCBwcmV2RGF0YSwgcHJldkluZGV4LFxuXHRcdHZpZXcgPSBwYXJlbnRWaWV3LFxuXHRcdHJlc3VsdCA9IFwiXCI7XG5cblx0aWYgKGNvbnRleHQgPT09IHRydWUpIHtcblx0XHRub0l0ZXJhdGlvbiA9IGNvbnRleHQ7IC8vIHBhc3NpbmcgYm9vbGVhbiBhcyBzZWNvbmQgcGFyYW0gLSBub0l0ZXJhdGlvblxuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHQgIT09IE9CSkVDVCkge1xuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7IC8vIGNvbnRleHQgbXVzdCBiZSBhIGJvb2xlYW4gKG5vSXRlcmF0aW9uKSBvciBhIHBsYWluIG9iamVjdFxuXHR9XG5cblx0aWYgKHRhZyA9IHRoaXMudGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGNhbGwgZnJvbSByZW5kZXJUYWcgb3IgdGFnQ3R4LnJlbmRlciguLi4pXG5cdFx0dGFnQ3R4ID0gdGhpcztcblx0XHR2aWV3ID0gdmlldyB8fCB0YWdDdHgudmlldztcblx0XHR0bXBsID0gdmlldy5nZXRUbXBsKHRhZy50ZW1wbGF0ZSB8fCB0YWdDdHgudG1wbCk7XG5cdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRkYXRhID0gdmlldztcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyBhIHRlbXBsYXRlLnJlbmRlciguLi4pIGNhbGxcblx0XHR0bXBsID0gdGhpcztcblx0fVxuXG5cdGlmICh0bXBsKSB7XG5cdFx0aWYgKCFwYXJlbnRWaWV3ICYmIGRhdGEgJiYgZGF0YS5faXMgPT09IFwidmlld1wiKSB7XG5cdFx0XHR2aWV3ID0gZGF0YTsgLy8gV2hlbiBwYXNzaW5nIGluIGEgdmlldyB0byByZW5kZXIgb3IgbGluayAoYW5kIG5vdCBwYXNzaW5nIGluIGEgcGFyZW50IHZpZXcpIHVzZSB0aGUgcGFzc2VkLWluIHZpZXcgYXMgcGFyZW50Vmlld1xuXHRcdH1cblxuXHRcdGlmICh2aWV3KSB7XG5cdFx0XHRpZiAoZGF0YSA9PT0gdmlldykge1xuXHRcdFx0XHQvLyBJbmhlcml0IHRoZSBkYXRhIGZyb20gdGhlIHBhcmVudCB2aWV3LlxuXHRcdFx0XHQvLyBUaGlzIG1heSBiZSB0aGUgY29udGVudHMgb2YgYW4ge3tpZn19IGJsb2NrXG5cdFx0XHRcdGRhdGEgPSB2aWV3LmRhdGE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aXNUb3BSZW5kZXJDYWxsID0gIXZpZXc7XG5cdFx0aXNSZW5kZXJDYWxsID0gaXNSZW5kZXJDYWxsIHx8IGlzVG9wUmVuZGVyQ2FsbDtcblx0XHRpZiAoIXZpZXcpIHtcblx0XHRcdChjb250ZXh0ID0gY29udGV4dCB8fCB7fSkucm9vdCA9IGRhdGE7IC8vIFByb3ZpZGUgfnJvb3QgYXMgc2hvcnRjdXQgdG8gdG9wLWxldmVsIGRhdGEuXG5cdFx0fVxuXHRcdGlmICghaXNSZW5kZXJDYWxsIHx8ICRzdWJTZXR0aW5nc0FkdmFuY2VkLnVzZVZpZXdzIHx8IHRtcGwudXNlVmlld3MgfHwgdmlldyAmJiB2aWV3ICE9PSB0b3BWaWV3KSB7XG5cdFx0XHRyZXN1bHQgPSByZW5kZXJXaXRoVmlld3ModG1wbCwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHZpZXcsIGtleSwgb25SZW5kZXIsIHRhZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh2aWV3KSB7IC8vIEluIGEgYmxvY2tcblx0XHRcdFx0cHJldkRhdGEgPSB2aWV3LmRhdGE7XG5cdFx0XHRcdHByZXZJbmRleCA9IHZpZXcuaW5kZXg7XG5cdFx0XHRcdHZpZXcuaW5kZXggPSBpbmRleFN0cjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZpZXcgPSB0b3BWaWV3O1xuXHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhO1xuXHRcdFx0XHR2aWV3LmN0eCA9IGNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGlzQXJyYXkoZGF0YSkgJiYgIW5vSXRlcmF0aW9uKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHRoZSBhcnJheSwgd2hvc2UgY2hpbGQgdmlld3MgY29ycmVzcG9uZCB0byBlYWNoIGRhdGEgaXRlbS4gKE5vdGU6IGlmIGtleSBhbmQgcGFyZW50VmlldyBhcmUgcGFzc2VkIGluXG5cdFx0XHRcdC8vIGFsb25nIHdpdGggcGFyZW50IHZpZXcsIHRyZWF0IGFzIGluc2VydCAtZS5nLiBmcm9tIHZpZXcuYWRkVmlld3MgLSBzbyBwYXJlbnRWaWV3IGlzIGFscmVhZHkgdGhlIHZpZXcgaXRlbSBmb3IgYXJyYXkpXG5cdFx0XHRcdGZvciAoaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHZpZXcuaW5kZXggPSBpO1xuXHRcdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGFbaV07XG5cdFx0XHRcdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YVtpXSwgdmlldywgJHN1Yik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGE7XG5cdFx0XHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGEsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0dmlldy5kYXRhID0gcHJldkRhdGE7XG5cdFx0XHR2aWV3LmluZGV4ID0gcHJldkluZGV4O1xuXHRcdH1cblx0XHRpZiAoaXNUb3BSZW5kZXJDYWxsKSB7XG5cdFx0XHRpc1JlbmRlckNhbGwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcldpdGhWaWV3cyh0bXBsLCBkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgdmlldywga2V5LCBvblJlbmRlciwgdGFnKSB7XG5cdGZ1bmN0aW9uIHNldEl0ZW1WYXIoaXRlbSkge1xuXHRcdC8vIFdoZW4gaXRlbVZhciBpcyBzcGVjaWZpZWQsIHNldCBtb2RpZmllZCBjdHggd2l0aCB1c2VyLW5hbWVkIH5pdGVtXG5cdFx0bmV3Q3R4ID0gJGV4dGVuZCh7fSwgY29udGV4dCk7XG5cdFx0bmV3Q3R4W2l0ZW1WYXJdID0gaXRlbTtcblx0fVxuXG5cdC8vIFJlbmRlciB0ZW1wbGF0ZSBhZ2FpbnN0IGRhdGEgYXMgYSB0cmVlIG9mIHN1YnZpZXdzIChuZXN0ZWQgcmVuZGVyZWQgdGVtcGxhdGUgaW5zdGFuY2VzKSwgb3IgYXMgYSBzdHJpbmcgKHRvcC1sZXZlbCB0ZW1wbGF0ZSkuXG5cdC8vIElmIHRoZSBkYXRhIGlzIHRoZSBwYXJlbnQgdmlldywgdHJlYXQgYXMgbm9JdGVyYXRpb24sIHJlLXJlbmRlciB3aXRoIHRoZSBzYW1lIGRhdGEgY29udGV4dC5cblx0dmFyIGksIGwsIG5ld1ZpZXcsIGNoaWxkVmlldywgaXRlbVJlc3VsdCwgc3dhcENvbnRlbnQsIGNvbnRlbnRUbXBsLCBvdXRlck9uUmVuZGVyLCB0bXBsTmFtZSwgaXRlbVZhciwgbmV3Q3R4LCB0YWdDdHgsXG5cdFx0cmVzdWx0ID0gXCJcIjtcblxuXHRpZiAodGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGNhbGwgZnJvbSByZW5kZXJUYWcgb3IgdGFnQ3R4LnJlbmRlciguLi4pXG5cdFx0dG1wbE5hbWUgPSB0YWcudGFnTmFtZTtcblx0XHR0YWdDdHggPSB0YWcudGFnQ3R4O1xuXHRcdGNvbnRleHQgPSBjb250ZXh0ID8gZXh0ZW5kQ3R4KGNvbnRleHQsIHRhZy5jdHgpIDogdGFnLmN0eDtcblxuXHRcdGlmICh0bXBsID09PSB2aWV3LmNvbnRlbnQpIHsgLy8ge3t4eHggdG1wbD0jY29udGVudH19XG5cdFx0XHRjb250ZW50VG1wbCA9IHRtcGwgIT09IHZpZXcuY3R4Ll93cnAgLy8gV2UgYXJlIHJlbmRlcmluZyB0aGUgI2NvbnRlbnRcblx0XHRcdFx0PyB2aWV3LmN0eC5fd3JwIC8vICNjb250ZW50IHdhcyB0aGUgdGFnQ3R4LnByb3BzLnRtcGwgd3JhcHBlciBvZiB0aGUgYmxvY2sgY29udGVudCAtIHNvIHdpdGhpbiB0aGlzIHZpZXcsICNjb250ZW50IHdpbGwgbm93IGJlIHRoZSB2aWV3LmN0eC5fd3JwIGJsb2NrIGNvbnRlbnRcblx0XHRcdFx0OiB1bmRlZmluZWQ7IC8vICNjb250ZW50IHdhcyB0aGUgdmlldy5jdHguX3dycCBibG9jayBjb250ZW50IC0gc28gd2l0aGluIHRoaXMgdmlldywgdGhlcmUgaXMgbm8gbG9uZ2VyIGFueSAjY29udGVudCB0byB3cmFwLlxuXHRcdH0gZWxzZSBpZiAodG1wbCAhPT0gdGFnQ3R4LmNvbnRlbnQpIHtcblx0XHRcdGlmICh0bXBsID09PSB0YWcudGVtcGxhdGUpIHsgLy8gUmVuZGVyaW5nIHt7dGFnfX0gdGFnLnRlbXBsYXRlLCByZXBsYWNpbmcgYmxvY2sgY29udGVudC5cblx0XHRcdFx0Y29udGVudFRtcGwgPSB0YWdDdHgudG1wbDsgLy8gU2V0ICNjb250ZW50IHRvIGJsb2NrIGNvbnRlbnQgKG9yIHdyYXBwZWQgYmxvY2sgY29udGVudCBpZiB0YWdDdHgucHJvcHMudG1wbCBpcyBzZXQpXG5cdFx0XHRcdGNvbnRleHQuX3dycCA9IHRhZ0N0eC5jb250ZW50OyAvLyBQYXNzIHdyYXBwZWQgYmxvY2sgY29udGVudCB0byBuZXN0ZWQgdmlld3Ncblx0XHRcdH0gZWxzZSB7IC8vIFJlbmRlcmluZyB0YWdDdHgucHJvcHMudG1wbCB3cmFwcGVyXG5cdFx0XHRcdGNvbnRlbnRUbXBsID0gdGFnQ3R4LmNvbnRlbnQgfHwgdmlldy5jb250ZW50OyAvLyBTZXQgI2NvbnRlbnQgdG8gd3JhcHBlZCBibG9jayBjb250ZW50XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRlbnRUbXBsID0gdmlldy5jb250ZW50OyAvLyBOZXN0ZWQgdmlld3MgaW5oZXJpdCBzYW1lIHdyYXBwZWQgI2NvbnRlbnQgcHJvcGVydHlcblx0XHR9XG5cblx0XHRpZiAodGFnQ3R4LnByb3BzLmxpbmsgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBsaW5rPWZhbHNlIHNldHRpbmcgb24gYmxvY2sgdGFnXG5cdFx0XHQvLyBXZSB3aWxsIG92ZXJyaWRlIGluaGVyaXRlZCB2YWx1ZSBvZiBsaW5rIGJ5IHRoZSBleHBsaWNpdCBzZXR0aW5nIGxpbms9ZmFsc2UgdGFrZW4gZnJvbSBwcm9wc1xuXHRcdFx0Ly8gVGhlIGNoaWxkIHZpZXdzIG9mIGFuIHVubGlua2VkIHZpZXcgYXJlIGFsc28gdW5saW5rZWQuIFNvIHNldHRpbmcgY2hpbGQgYmFjayB0byB0cnVlIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdC5cblx0XHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xuXHRcdFx0Y29udGV4dC5saW5rID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1WYXIgPSB0YWdDdHgucHJvcHMuaXRlbVZhcikge1xuXHRcdFx0aWYgKGl0ZW1WYXIuY2hhckF0KDApICE9PSBcIn5cIikge1xuXHRcdFx0XHRzeW50YXhFcnJvcihcIlVzZSBpdGVtVmFyPSd+bXlJdGVtJ1wiKTtcblx0XHRcdH1cblx0XHRcdGl0ZW1WYXIgPSBpdGVtVmFyLnNsaWNlKDEpO1xuXHRcdH1cblx0fVxuXG5cdGlmICh2aWV3KSB7XG5cdFx0b25SZW5kZXIgPSBvblJlbmRlciB8fCB2aWV3Ll8ub25SZW5kZXI7XG5cdFx0Y29udGV4dCA9IGV4dGVuZEN0eChjb250ZXh0LCB2aWV3LmN0eCk7XG5cdH1cblxuXHRpZiAoa2V5ID09PSB0cnVlKSB7XG5cdFx0c3dhcENvbnRlbnQgPSB0cnVlO1xuXHRcdGtleSA9IDA7XG5cdH1cblxuXHQvLyBJZiBsaW5rPT09ZmFsc2UsIGRvIG5vdCBjYWxsIG9uUmVuZGVyLCBzbyBubyBkYXRhLWxpbmtpbmcgbWFya2VyIG5vZGVzXG5cdGlmIChvblJlbmRlciAmJiAoY29udGV4dCAmJiBjb250ZXh0LmxpbmsgPT09IGZhbHNlIHx8IHRhZyAmJiB0YWcuXy5ub1Z3cykpIHtcblx0XHRvblJlbmRlciA9IHVuZGVmaW5lZDtcblx0fVxuXHRvdXRlck9uUmVuZGVyID0gb25SZW5kZXI7XG5cdGlmIChvblJlbmRlciA9PT0gdHJ1ZSkge1xuXHRcdC8vIFVzZWQgYnkgdmlldy5yZWZyZXNoKCkuIERvbid0IGNyZWF0ZSBhIG5ldyB3cmFwcGVyIHZpZXcuXG5cdFx0b3V0ZXJPblJlbmRlciA9IHVuZGVmaW5lZDtcblx0XHRvblJlbmRlciA9IHZpZXcuXy5vblJlbmRlcjtcblx0fVxuXHQvLyBTZXQgYWRkaXRpb25hbCBjb250ZXh0IG9uIHZpZXdzIGNyZWF0ZWQgaGVyZSwgKGFzIG1vZGlmaWVkIGNvbnRleHQgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCwgYW5kIHRvIGJlIGluaGVyaXRlZCBieSBjaGlsZCB2aWV3cylcblx0Y29udGV4dCA9IHRtcGwuaGVscGVyc1xuXHRcdD8gZXh0ZW5kQ3R4KHRtcGwuaGVscGVycywgY29udGV4dClcblx0XHQ6IGNvbnRleHQ7XG5cblx0bmV3Q3R4ID0gY29udGV4dDtcblx0aWYgKCRpc0FycmF5KGRhdGEpICYmICFub0l0ZXJhdGlvbikge1xuXHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHRoZSBhcnJheSwgd2hvc2UgY2hpbGQgdmlld3MgY29ycmVzcG9uZCB0byBlYWNoIGRhdGEgaXRlbS4gKE5vdGU6IGlmIGtleSBhbmQgdmlldyBhcmUgcGFzc2VkIGluXG5cdFx0Ly8gYWxvbmcgd2l0aCBwYXJlbnQgdmlldywgdHJlYXQgYXMgaW5zZXJ0IC1lLmcuIGZyb20gdmlldy5hZGRWaWV3cyAtIHNvIHZpZXcgaXMgYWxyZWFkeSB0aGUgdmlldyBpdGVtIGZvciBhcnJheSlcblx0XHRuZXdWaWV3ID0gc3dhcENvbnRlbnRcblx0XHRcdD8gdmlld1xuXHRcdFx0OiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdmlldylcblx0XHRcdFx0fHwgbmV3IFZpZXcoY29udGV4dCwgXCJhcnJheVwiLCB2aWV3LCBkYXRhLCB0bXBsLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCk7XG5cdFx0aWYgKHZpZXcgJiYgdmlldy5fLnVzZUtleSkge1xuXHRcdFx0Ly8gUGFyZW50IGlzIG5vdCBhbiAnYXJyYXkgdmlldydcblx0XHRcdG5ld1ZpZXcuXy5ibmQgPSAhdGFnIHx8IHRhZy5fLmJuZCAmJiB0YWc7IC8vIEZvciBhcnJheSB2aWV3cyB0aGF0IGFyZSBkYXRhIGJvdW5kIGZvciBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHMsIHNldCB0aGVcblx0XHRcdC8vIHZpZXcuXy5ibmQgcHJvcGVydHkgdG8gdHJ1ZSBmb3IgdG9wLWxldmVsIGxpbmsoKSBvciBkYXRhLWxpbms9XCJ7Zm9yfVwiLCBvciB0byB0aGUgdGFnIGluc3RhbmNlIGZvciBhIGRhdGEtYm91bmQgdGFnLCBlLmcuIHtee2ZvciAuLi59fVxuXHRcdH1cblx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0bmV3Vmlldy5pdCA9IGl0ZW1WYXI7XG5cdFx0fVxuXHRcdGl0ZW1WYXIgPSBuZXdWaWV3Lml0O1xuXHRcdGZvciAoaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgZWFjaCBkYXRhIGl0ZW0uXG5cdFx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0XHRzZXRJdGVtVmFyKGRhdGFbaV0pOyAvLyB1c2UgbW9kaWZpZWQgY3R4IHdpdGggdXNlci1uYW1lZCB+aXRlbVxuXHRcdFx0fVxuXHRcdFx0Y2hpbGRWaWV3ID0gbmV3IFZpZXcobmV3Q3R4LCBcIml0ZW1cIiwgbmV3VmlldywgZGF0YVtpXSwgdG1wbCwgKGtleSB8fCAwKSArIGksIG9uUmVuZGVyLCBuZXdWaWV3LmNvbnRlbnQpO1xuXG5cdFx0XHRpdGVtUmVzdWx0ID0gdG1wbC5mbihkYXRhW2ldLCBjaGlsZFZpZXcsICRzdWIpO1xuXHRcdFx0cmVzdWx0ICs9IG5ld1ZpZXcuXy5vblJlbmRlciA/IG5ld1ZpZXcuXy5vblJlbmRlcihpdGVtUmVzdWx0LCBjaGlsZFZpZXcpIDogaXRlbVJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3Igc2luZ2xldG9uIGRhdGEgb2JqZWN0LiBUaGUgdHlwZSBvZiB0aGUgdmlldyB3aWxsIGJlIHRoZSB0YWcgbmFtZSwgZS5nLiBcImlmXCIgb3IgXCJteVRhZ1wiIGV4Y2VwdCBmb3Jcblx0XHQvLyBcIml0ZW1cIiwgXCJhcnJheVwiIGFuZCBcImRhdGFcIiB2aWV3cy4gQSBcImRhdGFcIiB2aWV3IGlzIGZyb20gcHJvZ3JhbW1hdGljIHJlbmRlcihvYmplY3QpIGFnYWluc3QgYSAnc2luZ2xldG9uJy5cblx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0c2V0SXRlbVZhcihkYXRhKTtcblx0XHR9XG5cdFx0bmV3VmlldyA9IHN3YXBDb250ZW50ID8gdmlldyA6IG5ldyBWaWV3KG5ld0N0eCwgdG1wbE5hbWUgfHwgXCJkYXRhXCIsIHZpZXcsIGRhdGEsIHRtcGwsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKTtcblx0XHRpZiAodGFnICYmICF0YWcuZmxvdykge1xuXHRcdFx0bmV3Vmlldy50YWcgPSB0YWc7XG5cdFx0XHR0YWcudmlldyA9IG5ld1ZpZXc7XG5cdFx0fVxuXHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGEsIG5ld1ZpZXcsICRzdWIpO1xuXHR9XG5cdHJldHVybiBvdXRlck9uUmVuZGVyID8gb3V0ZXJPblJlbmRlcihyZXN1bHQsIG5ld1ZpZXcpIDogcmVzdWx0O1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbGQgYW5kIGNvbXBpbGUgdGVtcGxhdGVcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIEdlbmVyYXRlIGEgcmV1c2FibGUgZnVuY3Rpb24gdGhhdCB3aWxsIHNlcnZlIHRvIHJlbmRlciBhIHRlbXBsYXRlIGFnYWluc3QgZGF0YVxuLy8gKENvbXBpbGUgQVNUIHRoZW4gYnVpbGQgdGVtcGxhdGUgZnVuY3Rpb24pXG5cbmZ1bmN0aW9uIG9uUmVuZGVyRXJyb3IoZSwgdmlldywgZmFsbGJhY2spIHtcblx0dmFyIG1lc3NhZ2UgPSBmYWxsYmFjayAhPT0gdW5kZWZpbmVkXG5cdFx0PyAkaXNGdW5jdGlvbihmYWxsYmFjaylcblx0XHRcdD8gZmFsbGJhY2suY2FsbCh2aWV3LmRhdGEsIGUsIHZpZXcpXG5cdFx0XHQ6IGZhbGxiYWNrIHx8IFwiXCJcblx0XHQ6IFwie0Vycm9yOiBcIiArIGUubWVzc2FnZSArIFwifVwiO1xuXG5cdGlmICgkc3ViU2V0dGluZ3Mub25FcnJvciAmJiAoZmFsbGJhY2sgPSAkc3ViU2V0dGluZ3Mub25FcnJvci5jYWxsKHZpZXcuZGF0YSwgZSwgZmFsbGJhY2sgJiYgbWVzc2FnZSwgdmlldykpICE9PSB1bmRlZmluZWQpIHtcblx0XHRtZXNzYWdlID0gZmFsbGJhY2s7IC8vIFRoZXJlIGlzIGEgc2V0dGluZ3MuZGVidWdNb2RlKGhhbmRsZXIpIG9uRXJyb3Igb3ZlcnJpZGUuIENhbGwgaXQsIGFuZCB1c2UgcmV0dXJuIHZhbHVlIChpZiBhbnkpIHRvIHJlcGxhY2UgbWVzc2FnZVxuXHR9XG5cblx0cmV0dXJuIHZpZXcgJiYgIXZpZXcubGlua0N0eCA/ICRjb252ZXJ0ZXJzLmh0bWwobWVzc2FnZSkgOiBtZXNzYWdlO1xufVxuXG5mdW5jdGlvbiBlcnJvcihtZXNzYWdlKSB7XG5cdHRocm93IG5ldyAkc3ViLkVycihtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gc3ludGF4RXJyb3IobWVzc2FnZSkge1xuXHRlcnJvcihcIlN5bnRheCBlcnJvclxcblwiICsgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHRtcGxGbihtYXJrdXAsIHRtcGwsIGlzTGlua0V4cHIsIGNvbnZlcnRCYWNrLCBoYXNFbHNlKSB7XG5cdC8vIENvbXBpbGUgbWFya3VwIHRvIEFTVCAoYWJ0cmFjdCBzeW50YXggdHJlZSkgdGhlbiBidWlsZCB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBBU1Qgbm9kZXNcblx0Ly8gVXNlZCBmb3IgY29tcGlsaW5nIHRlbXBsYXRlcywgYW5kIGFsc28gYnkgSnNWaWV3cyB0byBidWlsZCBmdW5jdGlvbnMgZm9yIGRhdGEgbGluayBleHByZXNzaW9uc1xuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gcHVzaHByZWNlZGluZ0NvbnRlbnQoc2hpZnQpIHtcblx0XHRzaGlmdCAtPSBsb2M7XG5cdFx0aWYgKHNoaWZ0KSB7XG5cdFx0XHRjb250ZW50LnB1c2gobWFya3VwLnN1YnN0cihsb2MsIHNoaWZ0KS5yZXBsYWNlKHJOZXdMaW5lLCBcIlxcXFxuXCIpKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBibG9ja1RhZ0NoZWNrKHRhZ05hbWUsIGJsb2NrKSB7XG5cdFx0aWYgKHRhZ05hbWUpIHtcblx0XHRcdHRhZ05hbWUgKz0gJ319Jztcblx0XHRcdC8vXHRcdFx0J3t7aW5jbHVkZX19IGJsb2NrIGhhcyB7ey9mb3J9fSB3aXRoIG5vIG9wZW4ge3tmb3J9fSdcblx0XHRcdHN5bnRheEVycm9yKChcblx0XHRcdFx0YmxvY2tcblx0XHRcdFx0XHQ/ICd7eycgKyBibG9jayArICd9fSBibG9jayBoYXMge3svJyArIHRhZ05hbWUgKyAnIHdpdGhvdXQge3snICsgdGFnTmFtZVxuXHRcdFx0XHRcdDogJ1VubWF0Y2hlZCBvciBtaXNzaW5nIHt7LycgKyB0YWdOYW1lKSArICcsIGluIHRlbXBsYXRlOlxcbicgKyBtYXJrdXApO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlVGFnKGFsbCwgYmluZCwgdGFnTmFtZSwgY29udmVydGVyLCBjb2xvbiwgaHRtbCwgY29kZVRhZywgcGFyYW1zLCBzbGFzaCwgYmluZDIsIGNsb3NlQmxvY2ssIGluZGV4KSB7XG4vKlxuXG4gICAgIGJpbmQgICAgIHRhZ05hbWUgICAgICAgICBjdnQgICBjbG4gaHRtbCBjb2RlICAgIHBhcmFtcyAgICAgICAgICAgIHNsYXNoICAgYmluZDIgICAgICAgICBjbG9zZUJsayAgY29tbWVudFxuLyg/OnsoXFxeKT97KD86KFxcdysoPz1bXFwvXFxzfV0pKXwoXFx3Kyk/KDopfCg+KXwoXFwqKSlcXHMqKCg/OltefV18fSg/IX0pKSo/KShcXC8pP3x7KFxcXik/eyg/Oig/OlxcLyhcXHcrKSlcXHMqfCEtLVtcXHNcXFNdKj8tLSkpfX0vZ1xuXG4oPzpcbiAgeyhcXF4pP3sgICAgICAgICAgICBiaW5kXG4gICg/OlxuICAgIChcXHcrICAgICAgICAgICAgIHRhZ05hbWVcbiAgICAgICg/PVtcXC9cXHN9XSlcbiAgICApXG4gICAgfFxuICAgIChcXHcrKT8oOikgICAgICAgIGNvbnZlcnRlciBjb2xvblxuICAgIHxcbiAgICAoPikgICAgICAgICAgICAgIGh0bWxcbiAgICB8XG4gICAgKFxcKikgICAgICAgICAgICAgY29kZVRhZ1xuICApXG4gIFxccypcbiAgKCAgICAgICAgICAgICAgICAgIHBhcmFtc1xuICAgICg/OltefV18fSg/IX0pKSo/XG4gIClcbiAgKFxcLyk/ICAgICAgICAgICAgICBzbGFzaFxuICB8XG4gIHsoXFxeKT97ICAgICAgICAgICAgYmluZDJcbiAgKD86XG4gICAgKD86XFwvKFxcdyspKVxccyogICBjbG9zZUJsb2NrXG4gICAgfFxuICAgICEtLVtcXHNcXFNdKj8tLSAgICBjb21tZW50XG4gIClcbilcbn19L2dcblxuKi9cblx0XHRpZiAoY29kZVRhZyAmJiBiaW5kIHx8IHNsYXNoICYmICF0YWdOYW1lIHx8IHBhcmFtcyAmJiBwYXJhbXMuc2xpY2UoLTEpID09PSBcIjpcIiB8fCBiaW5kMikge1xuXHRcdFx0c3ludGF4RXJyb3IoYWxsKTtcblx0XHR9XG5cblx0XHQvLyBCdWlsZCBhYnN0cmFjdCBzeW50YXggdHJlZSAoQVNUKTogW3RhZ05hbWUsIGNvbnZlcnRlciwgcGFyYW1zLCBjb250ZW50LCBoYXNoLCBiaW5kaW5ncywgY29udGVudE1hcmt1cF1cblx0XHRpZiAoaHRtbCkge1xuXHRcdFx0Y29sb24gPSBcIjpcIjtcblx0XHRcdGNvbnZlcnRlciA9IEhUTUw7XG5cdFx0fVxuXHRcdHNsYXNoID0gc2xhc2ggfHwgaXNMaW5rRXhwciAmJiAhaGFzRWxzZTtcblxuXHRcdHZhciBwYXRoQmluZGluZ3MgPSAoYmluZCB8fCBpc0xpbmtFeHByKSAmJiBbW11dLFxuXHRcdFx0cHJvcHMgPSBcIlwiLFxuXHRcdFx0YXJncyA9IFwiXCIsXG5cdFx0XHRjdHhQcm9wcyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNBcmdzID0gXCJcIixcblx0XHRcdHBhcmFtc1Byb3BzID0gXCJcIixcblx0XHRcdHBhcmFtc0N0eFByb3BzID0gXCJcIixcblx0XHRcdG9uRXJyb3IgPSBcIlwiLFxuXHRcdFx0dXNlVHJpZ2dlciA9IFwiXCIsXG5cdFx0XHQvLyBCbG9jayB0YWcgaWYgbm90IHNlbGYtY2xvc2luZyBhbmQgbm90IHt7On19IG9yIHt7Pn19IChzcGVjaWFsIGNhc2UpIGFuZCBub3QgYSBkYXRhLWxpbmsgZXhwcmVzc2lvblxuXHRcdFx0YmxvY2sgPSAhc2xhc2ggJiYgIWNvbG9uO1xuXG5cdFx0Ly89PT09IG5lc3RlZCBoZWxwZXIgZnVuY3Rpb24gPT09PVxuXHRcdHRhZ05hbWUgPSB0YWdOYW1lIHx8IChwYXJhbXMgPSBwYXJhbXMgfHwgXCIjZGF0YVwiLCBjb2xvbik7IC8vIHt7On19IGlzIGVxdWl2YWxlbnQgdG8ge3s6I2RhdGF9fVxuXHRcdHB1c2hwcmVjZWRpbmdDb250ZW50KGluZGV4KTtcblx0XHRsb2MgPSBpbmRleCArIGFsbC5sZW5ndGg7IC8vIGxvY2F0aW9uIG1hcmtlciAtIHBhcnNlZCB1cCB0byBoZXJlXG5cdFx0aWYgKGNvZGVUYWcpIHtcblx0XHRcdGlmIChhbGxvd0NvZGUpIHtcblx0XHRcdFx0Y29udGVudC5wdXNoKFtcIipcIiwgXCJcXG5cIiArIHBhcmFtcy5yZXBsYWNlKC9eOi8sIFwicmV0Kz0gXCIpLnJlcGxhY2UoclVuZXNjYXBlUXVvdGVzLCBcIiQxXCIpICsgXCI7XFxuXCJdKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRhZ05hbWUpIHtcblx0XHRcdGlmICh0YWdOYW1lID09PSBcImVsc2VcIikge1xuXHRcdFx0XHRpZiAoclRlc3RFbHNlSWYudGVzdChwYXJhbXMpKSB7XG5cdFx0XHRcdFx0c3ludGF4RXJyb3IoJ2ZvciBcInt7ZWxzZSBpZiBleHByfX1cIiB1c2UgXCJ7e2Vsc2UgZXhwcn19XCInKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYXRoQmluZGluZ3MgPSBjdXJyZW50WzddICYmIFtbXV07XG5cdFx0XHRcdGN1cnJlbnRbOF0gPSBtYXJrdXAuc3Vic3RyaW5nKGN1cnJlbnRbOF0sIGluZGV4KTsgLy8gY29udGVudE1hcmt1cCBmb3IgYmxvY2sgdGFnXG5cdFx0XHRcdGN1cnJlbnQgPSBzdGFjay5wb3AoKTtcblx0XHRcdFx0Y29udGVudCA9IGN1cnJlbnRbMl07XG5cdFx0XHRcdGJsb2NrID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIG5ld2xpbmVzIGZyb20gdGhlIHBhcmFtcyBzdHJpbmcsIHRvIGF2b2lkIGNvbXBpbGVkIGNvZGUgZXJyb3JzIGZvciB1bnRlcm1pbmF0ZWQgc3RyaW5nc1xuXHRcdFx0XHRwYXJzZVBhcmFtcyhwYXJhbXMucmVwbGFjZShyTmV3TGluZSwgXCIgXCIpLCBwYXRoQmluZGluZ3MsIHRtcGwpXG5cdFx0XHRcdFx0LnJlcGxhY2UockJ1aWxkSGFzaCwgZnVuY3Rpb24oYWxsLCBvbmVycm9yLCBpc0N0eCwga2V5LCBrZXlUb2tlbiwga2V5VmFsdWUsIGFyZywgcGFyYW0pIHtcblx0XHRcdFx0XHRcdGtleSA9IFwiJ1wiICsga2V5VG9rZW4gKyBcIic6XCI7XG5cdFx0XHRcdFx0XHRpZiAoYXJnKSB7XG5cdFx0XHRcdFx0XHRcdGFyZ3MgKz0ga2V5VmFsdWUgKyBcIixcIjtcblx0XHRcdFx0XHRcdFx0cGFyYW1zQXJncyArPSBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpc0N0eCkge1xuXHRcdFx0XHRcdFx0XHRjdHhQcm9wcyArPSBrZXkgKyAnai5fY3AoJyArIGtleVZhbHVlICsgJyxcIicgKyBwYXJhbSArICdcIix2aWV3KSwnO1xuXHRcdFx0XHRcdFx0XHQvLyBDb21waWxlZCBjb2RlIGZvciBldmFsdWF0aW5nIHRhZ0N0eCBvbiBhIHRhZyB3aWxsIGhhdmU6IGN0eDp7J2Zvbyc6ai5fY3AoY29tcGlsZWRFeHByLCBcImV4cHJcIiwgdmlldyl9XG5cdFx0XHRcdFx0XHRcdHBhcmFtc0N0eFByb3BzICs9IGtleSArIFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9uZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0b25FcnJvciArPSBrZXlWYWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmIChrZXlUb2tlbiA9PT0gXCJ0cmlnZ2VyXCIpIHtcblx0XHRcdFx0XHRcdFx0XHR1c2VUcmlnZ2VyICs9IGtleVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHByb3BzICs9IGtleSArIGtleVZhbHVlICsgXCIsXCI7XG5cdFx0XHRcdFx0XHRcdHBhcmFtc1Byb3BzICs9IGtleSArIFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHRcdGhhc0hhbmRsZXJzID0gaGFzSGFuZGxlcnMgfHwgckhhc0hhbmRsZXJzLnRlc3Qoa2V5VG9rZW4pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0XHRcdFx0fSkuc2xpY2UoMCwgLTEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGF0aEJpbmRpbmdzICYmIHBhdGhCaW5kaW5nc1swXSkge1xuXHRcdFx0XHRwYXRoQmluZGluZ3MucG9wKCk7IC8vIFJlbW92ZSB0aGUgYmluZGluZ3MgdGhhdCB3YXMgcHJlcGFyZWQgZm9yIG5leHQgYXJnLiAoVGhlcmUgaXMgYWx3YXlzIGFuIGV4dHJhIG9uZSByZWFkeSkuXG5cdFx0XHR9XG5cblx0XHRcdG5ld05vZGUgPSBbXG5cdFx0XHRcdFx0dGFnTmFtZSxcblx0XHRcdFx0XHRjb252ZXJ0ZXIgfHwgISFjb252ZXJ0QmFjayB8fCBoYXNIYW5kbGVycyB8fCBcIlwiLFxuXHRcdFx0XHRcdGJsb2NrICYmIFtdLFxuXHRcdFx0XHRcdHBhcnNlZFBhcmFtKHBhcmFtc0FyZ3MgfHwgKHRhZ05hbWUgPT09IFwiOlwiID8gXCInI2RhdGEnLFwiIDogXCJcIiksIHBhcmFtc1Byb3BzLCBwYXJhbXNDdHhQcm9wcyksIC8vIHt7On19IGVxdWl2YWxlbnQgdG8ge3s6I2RhdGF9fVxuXHRcdFx0XHRcdHBhcnNlZFBhcmFtKGFyZ3MgfHwgKHRhZ05hbWUgPT09IFwiOlwiID8gXCJkYXRhLFwiIDogXCJcIiksIHByb3BzLCBjdHhQcm9wcyksXG5cdFx0XHRcdFx0b25FcnJvcixcblx0XHRcdFx0XHR1c2VUcmlnZ2VyLFxuXHRcdFx0XHRcdHBhdGhCaW5kaW5ncyB8fCAwXG5cdFx0XHRcdF07XG5cdFx0XHRjb250ZW50LnB1c2gobmV3Tm9kZSk7XG5cdFx0XHRpZiAoYmxvY2spIHtcblx0XHRcdFx0c3RhY2sucHVzaChjdXJyZW50KTtcblx0XHRcdFx0Y3VycmVudCA9IG5ld05vZGU7XG5cdFx0XHRcdGN1cnJlbnRbOF0gPSBsb2M7IC8vIFN0b3JlIGN1cnJlbnQgbG9jYXRpb24gb2Ygb3BlbiB0YWcsIHRvIGJlIGFibGUgdG8gYWRkIGNvbnRlbnRNYXJrdXAgd2hlbiB3ZSByZWFjaCBjbG9zaW5nIHRhZ1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2xvc2VCbG9jaykge1xuXHRcdFx0YmxvY2tUYWdDaGVjayhjbG9zZUJsb2NrICE9PSBjdXJyZW50WzBdICYmIGN1cnJlbnRbMF0gIT09IFwiZWxzZVwiICYmIGNsb3NlQmxvY2ssIGN1cnJlbnRbMF0pO1xuXHRcdFx0Y3VycmVudFs4XSA9IG1hcmt1cC5zdWJzdHJpbmcoY3VycmVudFs4XSwgaW5kZXgpOyAvLyBjb250ZW50TWFya3VwIGZvciBibG9jayB0YWdcblx0XHRcdGN1cnJlbnQgPSBzdGFjay5wb3AoKTtcblx0XHR9XG5cdFx0YmxvY2tUYWdDaGVjayghY3VycmVudCAmJiBjbG9zZUJsb2NrKTtcblx0XHRjb250ZW50ID0gY3VycmVudFsyXTtcblx0fVxuXHQvLz09PT0gL2VuZCBvZiBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblxuXHR2YXIgaSwgcmVzdWx0LCBuZXdOb2RlLCBoYXNIYW5kbGVycywgYmluZGluZ3MsXG5cdFx0YWxsb3dDb2RlID0gJHN1YlNldHRpbmdzLmFsbG93Q29kZSB8fCB0bXBsICYmIHRtcGwuYWxsb3dDb2RlXG5cdFx0XHR8fCAkdmlld3NTZXR0aW5ncy5hbGxvd0NvZGUgPT09IHRydWUsIC8vIGluY2x1ZGUgZGlyZWN0IHNldHRpbmcgb2Ygc2V0dGluZ3MuYWxsb3dDb2RlIHRydWUgZm9yIGJhY2t3YXJkIGNvbXBhdCBvbmx5XG5cdFx0YXN0VG9wID0gW10sXG5cdFx0bG9jID0gMCxcblx0XHRzdGFjayA9IFtdLFxuXHRcdGNvbnRlbnQgPSBhc3RUb3AsXG5cdFx0Y3VycmVudCA9IFssLGFzdFRvcF07XG5cblx0aWYgKGFsbG93Q29kZSAmJiB0bXBsLl9pcykge1xuXHRcdHRtcGwuYWxsb3dDb2RlID0gYWxsb3dDb2RlO1xuXHR9XG5cbi8vVE9ET1x0cmVzdWx0ID0gdG1wbEZuc0NhY2hlW21hcmt1cF07IC8vIE9ubHkgY2FjaGUgaWYgdGVtcGxhdGUgaXMgbm90IG5hbWVkIGFuZCBtYXJrdXAgbGVuZ3RoIDwgLi4uLFxuLy9hbmQgdGhlcmUgYXJlIG5vIGJpbmRpbmdzIG9yIHN1YnRlbXBsYXRlcz8/IENvbnNpZGVyIHN0YW5kYXJkIG9wdGltaXphdGlvbiBmb3IgZGF0YS1saW5rPVwiYS5iLmNcIlxuLy9cdFx0aWYgKHJlc3VsdCkge1xuLy9cdFx0XHR0bXBsLmZuID0gcmVzdWx0O1xuLy9cdFx0fSBlbHNlIHtcblxuLy9cdFx0cmVzdWx0ID0gbWFya3VwO1xuXHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdGlmIChjb252ZXJ0QmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtYXJrdXAgPSBtYXJrdXAuc2xpY2UoMCwgLWNvbnZlcnRCYWNrLmxlbmd0aCAtIDIpICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdH1cblx0XHRtYXJrdXAgPSBkZWxpbU9wZW5DaGFyMCArIG1hcmt1cCArIGRlbGltQ2xvc2VDaGFyMTtcblx0fVxuXG5cdGJsb2NrVGFnQ2hlY2soc3RhY2tbMF0gJiYgc3RhY2tbMF1bMl0ucG9wKClbMF0pO1xuXHQvLyBCdWlsZCB0aGUgQVNUIChhYnN0cmFjdCBzeW50YXggdHJlZSkgdW5kZXIgYXN0VG9wXG5cdG1hcmt1cC5yZXBsYWNlKHJUYWcsIHBhcnNlVGFnKTtcblxuXHRwdXNocHJlY2VkaW5nQ29udGVudChtYXJrdXAubGVuZ3RoKTtcblxuXHRpZiAobG9jID0gYXN0VG9wW2FzdFRvcC5sZW5ndGggLSAxXSkge1xuXHRcdGJsb2NrVGFnQ2hlY2soXCJcIiArIGxvYyAhPT0gbG9jICYmICgrbG9jWzhdID09PSBsb2NbOF0pICYmIGxvY1swXSk7XG5cdH1cbi8vXHRcdFx0cmVzdWx0ID0gdG1wbEZuc0NhY2hlW21hcmt1cF0gPSBidWlsZENvZGUoYXN0VG9wLCB0bXBsKTtcbi8vXHRcdH1cblxuXHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdHJlc3VsdCA9IGJ1aWxkQ29kZShhc3RUb3AsIG1hcmt1cCwgaXNMaW5rRXhwcik7XG5cdFx0YmluZGluZ3MgPSBbXTtcblx0XHRpID0gYXN0VG9wLmxlbmd0aDtcblx0XHR3aGlsZSAoaS0tKSB7XG5cdFx0XHRiaW5kaW5ncy51bnNoaWZ0KGFzdFRvcFtpXVs3XSk7ICAvLyBXaXRoIGRhdGEtbGluayBleHByZXNzaW9ucywgcGF0aEJpbmRpbmdzIGFycmF5IGZvciB0YWdDdHhbaV0gaXMgYXN0VG9wW2ldWzddXG5cdFx0fVxuXHRcdHNldFBhdGhzKHJlc3VsdCwgYmluZGluZ3MpO1xuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9IGJ1aWxkQ29kZShhc3RUb3AsIHRtcGwpO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNldFBhdGhzKGZuLCBwYXRoc0Fycikge1xuXHR2YXIga2V5LCBwYXRocyxcblx0XHRpID0gMCxcblx0XHRsID0gcGF0aHNBcnIubGVuZ3RoO1xuXHRmbi5kZXBzID0gW107XG5cdGZvciAoOyBpIDwgbDsgaSsrKSB7XG5cdFx0cGF0aHMgPSBwYXRoc0FycltpXTtcblx0XHRmb3IgKGtleSBpbiBwYXRocykge1xuXHRcdFx0aWYgKGtleSAhPT0gXCJfanN2dG9cIiAmJiBwYXRocy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHBhdGhzW2tleV0ubGVuZ3RoKSB7XG5cdFx0XHRcdGZuLmRlcHMgPSBmbi5kZXBzLmNvbmNhdChwYXRoc1trZXldKTsgLy8gZGVwcyBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgcGF0aHMgYXJyYXlzIGZvciB0aGUgZGlmZmVyZW50IGJpbmRpbmdzXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGZuLnBhdGhzID0gcGF0aHM7IC8vIFRoZSBhcnJheSBvZiBwYXRocyBhcnJheXMgZm9yIHRoZSBkaWZmZXJlbnQgYmluZGluZ3Ncbn1cblxuZnVuY3Rpb24gcGFyc2VkUGFyYW0oYXJncywgcHJvcHMsIGN0eCkge1xuXHRyZXR1cm4gW2FyZ3Muc2xpY2UoMCwgLTEpLCBwcm9wcy5zbGljZSgwLCAtMSksIGN0eC5zbGljZSgwLCAtMSldO1xufVxuXG5mdW5jdGlvbiBwYXJhbVN0cnVjdHVyZShwYXJ0cywgdHlwZSkge1xuXHRyZXR1cm4gJ1xcblxcdCdcblx0XHQrICh0eXBlXG5cdFx0XHQ/IHR5cGUgKyAnOnsnXG5cdFx0XHQ6ICcnKVxuXHRcdCsgJ2FyZ3M6WycgKyBwYXJ0c1swXSArICddJ1xuXHRcdCsgKHBhcnRzWzFdIHx8ICF0eXBlXG5cdFx0XHQ/ICcsXFxuXFx0cHJvcHM6eycgKyBwYXJ0c1sxXSArICd9J1xuXHRcdFx0OiBcIlwiKVxuXHRcdCsgKHBhcnRzWzJdID8gJyxcXG5cXHRjdHg6eycgKyBwYXJ0c1syXSArICd9JyA6IFwiXCIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhcmFtcyhwYXJhbXMsIHBhdGhCaW5kaW5ncywgdG1wbCkge1xuXG5cdGZ1bmN0aW9uIHBhcnNlVG9rZW5zKGFsbCwgbGZ0UHJuMCwgbGZ0UHJuLCBib3VuZCwgcGF0aCwgb3BlcmF0b3IsIGVyciwgZXEsIHBhdGgyLCBwcm4sIGNvbW1hLCBsZnRQcm4yLCBhcG9zLCBxdW90LCBydFBybiwgcnRQcm5Eb3QsIHBybjIsIHNwYWNlLCBpbmRleCwgZnVsbCkge1xuXHQvLyAvKFxcKCkoPz1cXHMqXFwoKXwoPzooWyhbXSlcXHMqKT8oPzooXFxePykoISo/WyN+XT9bXFx3JC5eXSspP1xccyooKFxcK1xcK3wtLSl8XFwrfC18JiZ8XFx8XFx8fD09PXwhPT18PT18IT18PD18Pj18Wzw+JSo6P1xcL118KD0pKVxccyp8KCEqP1sjfl0/W1xcdyQuXl0rKShbKFtdKT8pfCgsXFxzKil8KFxcKD8pXFxcXD8oPzooJyl8KFwiKSl8KD86XFxzKigoWylcXF1dKSg/PVxccypbLl5dfFxccyokfFteKFtdKXxbKVxcXV0pKFsoW10/KSl8KFxccyspL2csXG5cdC8vICAgbGZ0UHJuMCAgICAgICAgbGZ0UHJuICAgICAgICBib3VuZCAgICAgICAgICAgIHBhdGggICAgb3BlcmF0b3IgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgICAgICAgICAgICAgcGF0aDIgICAgICAgcHJuICAgIGNvbW1hICAgbGZ0UHJuMiAgIGFwb3MgcXVvdCAgICAgIHJ0UHJuIHJ0UHJuRG90ICAgICAgICAgICAgICAgICAgICAgICAgcHJuMiAgc3BhY2Vcblx0XHQvLyAobGVmdCBwYXJlbj8gZm9sbG93ZWQgYnkgKHBhdGg/IGZvbGxvd2VkIGJ5IG9wZXJhdG9yKSBvciAocGF0aCBmb2xsb3dlZCBieSBwYXJlbj8pKSBvciBjb21tYSBvciBhcG9zIG9yIHF1b3Qgb3IgcmlnaHQgcGFyZW4gb3Igc3BhY2Vcblx0XHRmdW5jdGlvbiBwYXJzZVBhdGgoYWxsUGF0aCwgbm90LCBvYmplY3QsIGhlbHBlciwgdmlldywgdmlld1Byb3BlcnR5LCBwYXRoVG9rZW5zLCBsZWFmVG9rZW4pIHtcblx0XHRcdC8vclBhdGggPSAvXighKj8pKD86bnVsbHx0cnVlfGZhbHNlfFxcZFtcXGQuXSp8KFtcXHckXSt8XFwufH4oW1xcdyRdKyl8Iyh2aWV3fChbXFx3JF0rKSk/KShbXFx3JC5eXSo/KSg/OlsuW15dKFtcXHckXSspXFxdPyk/KSQvZyxcblx0XHRcdC8vICAgICAgICAgIG5vdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgICAgIGhlbHBlciAgICB2aWV3ICB2aWV3UHJvcGVydHkgcGF0aFRva2VucyAgICAgIGxlYWZUb2tlblxuXHRcdFx0dmFyIHN1YlBhdGggPSBvYmplY3QgPT09IFwiLlwiO1xuXHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRwYXRoID0gcGF0aC5zbGljZShub3QubGVuZ3RoKTtcblx0XHRcdFx0aWYgKC9eXFwuP2NvbnN0cnVjdG9yJC8udGVzdChsZWFmVG9rZW58fHBhdGgpKSB7XG5cdFx0XHRcdFx0c3ludGF4RXJyb3IoYWxsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFzdWJQYXRoKSB7XG5cdFx0XHRcdFx0YWxsUGF0aCA9IChoZWxwZXJcblx0XHRcdFx0XHRcdFx0PyAndmlldy5obHAoXCInICsgaGVscGVyICsgJ1wiKSdcblx0XHRcdFx0XHRcdFx0OiB2aWV3XG5cdFx0XHRcdFx0XHRcdFx0PyBcInZpZXdcIlxuXHRcdFx0XHRcdFx0XHRcdDogXCJkYXRhXCIpXG5cdFx0XHRcdFx0XHQrIChsZWFmVG9rZW5cblx0XHRcdFx0XHRcdFx0PyAodmlld1Byb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0PyBcIi5cIiArIHZpZXdQcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdDogaGVscGVyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0XHRcdFx0XHRcdDogKHZpZXcgPyBcIlwiIDogXCIuXCIgKyBvYmplY3QpXG5cdFx0XHRcdFx0XHRcdFx0KSArIChwYXRoVG9rZW5zIHx8IFwiXCIpXG5cdFx0XHRcdFx0XHRcdDogKGxlYWZUb2tlbiA9IGhlbHBlciA/IFwiXCIgOiB2aWV3ID8gdmlld1Byb3BlcnR5IHx8IFwiXCIgOiBvYmplY3QsIFwiXCIpKTtcblxuXHRcdFx0XHRcdGFsbFBhdGggPSBhbGxQYXRoICsgKGxlYWZUb2tlbiA/IFwiLlwiICsgbGVhZlRva2VuIDogXCJcIik7XG5cblx0XHRcdFx0XHRhbGxQYXRoID0gbm90ICsgKGFsbFBhdGguc2xpY2UoMCwgOSkgPT09IFwidmlldy5kYXRhXCJcblx0XHRcdFx0XHRcdD8gYWxsUGF0aC5zbGljZSg1KSAvLyBjb252ZXJ0ICN2aWV3LmRhdGEuLi4gdG8gZGF0YS4uLlxuXHRcdFx0XHRcdFx0OiBhbGxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYmluZGluZ3MpIHtcblx0XHRcdFx0XHRiaW5kcyA9IG5hbWVkID09PSBcImxpbmtUb1wiID8gKGJpbmR0byA9IHBhdGhCaW5kaW5ncy5fanN2dG8gPSBwYXRoQmluZGluZ3MuX2pzdnRvIHx8IFtdKSA6IGJuZEN0eC5iZDtcblx0XHRcdFx0XHRpZiAodGhlT2IgPSBzdWJQYXRoICYmIGJpbmRzW2JpbmRzLmxlbmd0aC0xXSkge1xuXHRcdFx0XHRcdFx0aWYgKHRoZU9iLl9qc3YpIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKHRoZU9iLnNiKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhlT2IgPSB0aGVPYi5zYjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAodGhlT2IuYm5kKSB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0aCA9IFwiXlwiICsgcGF0aC5zbGljZSgxKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGVPYi5zYiA9IHBhdGg7XG5cdFx0XHRcdFx0XHRcdHRoZU9iLmJuZCA9IHRoZU9iLmJuZCB8fCBwYXRoLmNoYXJBdCgwKSA9PT0gXCJeXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGJpbmRzLnB1c2gocGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBhdGhTdGFydFtwYXJlbkRlcHRoXSA9IGluZGV4ICsgKHN1YlBhdGggPyAxIDogMCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBhbGxQYXRoO1xuXHRcdH1cblxuXHRcdC8vYm91bmQgPSBiaW5kaW5ncyAmJiBib3VuZDtcblx0XHRpZiAoYm91bmQgJiYgIWVxKSB7XG5cdFx0XHRwYXRoID0gYm91bmQgKyBwYXRoOyAvLyBlLmcuIHNvbWUuZm4oLi4uKV5zb21lLnBhdGggLSBzbyBoZXJlIHBhdGggaXMgXCJec29tZS5wYXRoXCJcblx0XHR9XG5cdFx0b3BlcmF0b3IgPSBvcGVyYXRvciB8fCBcIlwiO1xuXHRcdGxmdFBybiA9IGxmdFBybiB8fCBsZnRQcm4wIHx8IGxmdFBybjI7XG5cdFx0cGF0aCA9IHBhdGggfHwgcGF0aDI7XG5cdFx0Ly8gQ291bGQgZG8gdGhpcyAtIGJ1dCBub3Qgd29ydGggcGVyZiBjb3N0Pz8gOi1cblx0XHQvLyBpZiAoIXBhdGgubGFzdEluZGV4T2YoXCIjZGF0YS5cIiwgMCkpIHsgcGF0aCA9IHBhdGguc2xpY2UoNik7IH0gLy8gSWYgcGF0aCBzdGFydHMgd2l0aCBcIiNkYXRhLlwiLCByZW1vdmUgdGhhdC5cblx0XHRwcm4gPSBwcm4gfHwgcHJuMiB8fCBcIlwiO1xuXG5cdFx0dmFyIGV4cHIsIGV4cHJGbiwgYmluZHMsIHRoZU9iLCBuZXdPYixcblx0XHRcdHJ0U3EgPSBcIilcIjtcblxuXHRcdGlmIChwcm4gPT09IFwiW1wiKSB7XG5cdFx0XHRwcm4gID1cIltqLl9zcShcIjtcblx0XHRcdHJ0U3EgPSBcIildXCI7XG5cdFx0fVxuXG5cdFx0aWYgKGVyciAmJiAhYXBvc2VkICYmICFxdW90ZWQpIHtcblx0XHRcdHN5bnRheEVycm9yKHBhcmFtcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChiaW5kaW5ncyAmJiBydFBybkRvdCAmJiAhYXBvc2VkICYmICFxdW90ZWQpIHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIGJpbmRpbmcgdG8gYSBwYXRoIGluIHdoaWNoIGFuIG9iamVjdCBpcyByZXR1cm5lZCBieSBhIGhlbHBlci9kYXRhIGZ1bmN0aW9uL2V4cHJlc3Npb24sIGUuZy4gZm9vKCleeC55IG9yIChhP2I6YyleeC55XG5cdFx0XHRcdC8vIFdlIGNyZWF0ZSBhIGNvbXBpbGVkIGZ1bmN0aW9uIHRvIGdldCB0aGUgb2JqZWN0IGluc3RhbmNlICh3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBkZXBlbmRlbnQgZGF0YSBvZiB0aGUgc3ViZXhwcmVzc2lvbiBjaGFuZ2VzLCB0byByZXR1cm4gdGhlIG5ldyBvYmplY3QsIGFuZCB0cmlnZ2VyIHJlLWJpbmRpbmcgb2YgdGhlIHN1YnNlcXVlbnQgcGF0aClcblx0XHRcdFx0aWYgKCFuYW1lZCB8fCBib3VuZE5hbWUgfHwgYmluZHRvKSB7XG5cdFx0XHRcdFx0ZXhwciA9IHBhdGhTdGFydFtwYXJlbkRlcHRoIC0gMV07XG5cdFx0XHRcdFx0aWYgKGZ1bGwubGVuZ3RoIC0gMSA+IGluZGV4IC0gKGV4cHIgfHwgMCkpIHsgLy8gV2UgbmVlZCB0byBjb21waWxlIGEgc3ViZXhwcmVzc2lvblxuXHRcdFx0XHRcdFx0ZXhwciA9IGZ1bGwuc2xpY2UoZXhwciwgaW5kZXggKyBhbGwubGVuZ3RoKTtcblx0XHRcdFx0XHRcdGlmIChleHByRm4gIT09IHRydWUpIHsgLy8gSWYgbm90IHJlZW50cmFudCBjYWxsIGR1cmluZyBjb21waWxhdGlvblxuXHRcdFx0XHRcdFx0XHRiaW5kcyA9IGJpbmR0byB8fCBibmRTdGFja1twYXJlbkRlcHRoLTFdLmJkO1xuXHRcdFx0XHRcdFx0XHQvLyBJbnNlcnQgZXhwck9iIG9iamVjdCwgdG8gYmUgdXNlZCBkdXJpbmcgYmluZGluZyB0byByZXR1cm4gdGhlIGNvbXB1dGVkIG9iamVjdFxuXHRcdFx0XHRcdFx0XHR0aGVPYiA9IGJpbmRzW2JpbmRzLmxlbmd0aC0xXTtcblx0XHRcdFx0XHRcdFx0aWYgKHRoZU9iICYmIHRoZU9iLnBybSkge1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICh0aGVPYi5zYiAmJiB0aGVPYi5zYi5wcm0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoZU9iID0gdGhlT2Iuc2I7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG5ld09iID0gdGhlT2Iuc2IgPSB7cGF0aDogdGhlT2Iuc2IsIGJuZDogdGhlT2IuYm5kfTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRiaW5kcy5wdXNoKG5ld09iID0ge3BhdGg6IGJpbmRzLnBvcCgpfSk7IC8vIEluc2VydCBleHByT2Igb2JqZWN0LCB0byBiZSB1c2VkIGR1cmluZyBiaW5kaW5nIHRvIHJldHVybiB0aGUgY29tcHV0ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IC8vIChlLmcuIFwic29tZS5vYmplY3QoKVwiIGluIFwic29tZS5vYmplY3QoKS5hLmJcIiAtIHRvIGJlIHVzZWQgYXMgY29udGV4dCBmb3IgYmluZGluZyB0aGUgZm9sbG93aW5nIHRva2VucyBcImEuYlwiKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cnRQcm5Eb3QgPSBkZWxpbU9wZW5DaGFyMSArIFwiOlwiICsgZXhwciAvLyBUaGUgcGFyYW1ldGVyIG9yIGZ1bmN0aW9uIHN1YmV4cHJlc3Npb25cblx0XHRcdFx0XHRcdFx0KyBcIiBvbmVycm9yPScnXCIgLy8gc2V0IG9uZXJyb3I9JycgaW4gb3JkZXIgdG8gd3JhcCBnZW5lcmF0ZWQgY29kZSB3aXRoIGEgdHJ5IGNhdGNoIC0gcmV0dXJuaW5nICcnIGFzIG9iamVjdCBpbnN0YW5jZSBpZiB0aGVyZSBpcyBhbiBlcnJvci9taXNzaW5nIHBhcmVudFxuXHRcdFx0XHRcdFx0XHQrIGRlbGltQ2xvc2VDaGFyMDtcblx0XHRcdFx0XHRcdGV4cHJGbiA9IHRtcGxMaW5rc1tydFBybkRvdF07XG5cdFx0XHRcdFx0XHRpZiAoIWV4cHJGbikge1xuXHRcdFx0XHRcdFx0XHR0bXBsTGlua3NbcnRQcm5Eb3RdID0gdHJ1ZTsgLy8gRmxhZyB0aGF0IHRoaXMgZXhwckZuIChmb3IgcnRQcm5Eb3QpIGlzIGJlaW5nIGNvbXBpbGVkXG5cdFx0XHRcdFx0XHRcdHRtcGxMaW5rc1tydFBybkRvdF0gPSBleHByRm4gPSB0bXBsRm4ocnRQcm5Eb3QsIHRtcGwsIHRydWUpOyAvLyBDb21waWxlIHRoZSBleHByZXNzaW9uIChvciB1c2UgY2FjaGVkIGNvcHkgYWxyZWFkeSBpbiB0bXBsLmxpbmtzKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGV4cHJGbiAhPT0gdHJ1ZSAmJiBuZXdPYikge1xuXHRcdFx0XHRcdFx0XHQvLyBJZiBub3QgcmVlbnRyYW50IGNhbGwgZHVyaW5nIGNvbXBpbGF0aW9uXG5cdFx0XHRcdFx0XHRcdG5ld09iLl9qc3YgPSBleHByRm47XG5cdFx0XHRcdFx0XHRcdG5ld09iLnBybSA9IGJuZEN0eC5iZDtcblx0XHRcdFx0XHRcdFx0bmV3T2IuYm5kID0gbmV3T2IuYm5kIHx8IG5ld09iLnBhdGggJiYgbmV3T2IucGF0aC5pbmRleE9mKFwiXlwiKSA+PSAwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIChhcG9zZWRcblx0XHRcdFx0Ly8gd2l0aGluIHNpbmdsZS1xdW90ZWQgc3RyaW5nXG5cdFx0XHRcdD8gKGFwb3NlZCA9ICFhcG9zLCAoYXBvc2VkID8gYWxsIDogbGZ0UHJuMiArICdcIicpKVxuXHRcdFx0XHQ6IHF1b3RlZFxuXHRcdFx0XHQvLyB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdcblx0XHRcdFx0XHQ/IChxdW90ZWQgPSAhcXVvdCwgKHF1b3RlZCA/IGFsbCA6IGxmdFBybjIgKyAnXCInKSlcblx0XHRcdFx0XHQ6XG5cdFx0XHRcdChcblx0XHRcdFx0XHQobGZ0UHJuXG5cdFx0XHRcdFx0XHQ/IChwYXRoU3RhcnRbcGFyZW5EZXB0aF0gPSBpbmRleCsrLCBibmRDdHggPSBibmRTdGFja1srK3BhcmVuRGVwdGhdID0ge2JkOiBbXX0sIGxmdFBybilcblx0XHRcdFx0XHRcdDogXCJcIilcblx0XHRcdFx0XHQrIChzcGFjZVxuXHRcdFx0XHRcdFx0PyAocGFyZW5EZXB0aFxuXHRcdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0Ly8gTmV3IGFyZyBvciBwcm9wIC0gc28gaW5zZXJ0IGJhY2tzcGFjZSBcXGIgKFxceDA4KSBhcyBzZXBhcmF0b3IgZm9yIG5hbWVkIHBhcmFtcywgdXNlZCBzdWJzZXF1ZW50bHkgYnkgckJ1aWxkSGFzaCwgYW5kIHByZXBhcmUgbmV3IGJpbmRpbmdzIGFycmF5XG5cdFx0XHRcdFx0XHRcdDogKHBhcmFtSW5kZXggPSBmdWxsLnNsaWNlKHBhcmFtSW5kZXgsIGluZGV4KSwgbmFtZWRcblx0XHRcdFx0XHRcdFx0XHQ/IChuYW1lZCA9IGJvdW5kTmFtZSA9IGJpbmR0byA9IGZhbHNlLCBcIlxcYlwiKVxuXHRcdFx0XHRcdFx0XHRcdDogXCJcXGIsXCIpICsgcGFyYW1JbmRleCArIChwYXJhbUluZGV4ID0gaW5kZXggKyBhbGwubGVuZ3RoLCBiaW5kaW5ncyAmJiBwYXRoQmluZGluZ3MucHVzaChibmRDdHguYmQgPSBbXSksIFwiXFxiXCIpXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6IGVxXG5cdFx0XHRcdC8vIG5hbWVkIHBhcmFtLiBSZW1vdmUgYmluZGluZ3MgZm9yIGFyZyBhbmQgY3JlYXRlIGluc3RlYWQgYmluZGluZ3MgYXJyYXkgZm9yIHByb3Bcblx0XHRcdFx0XHRcdFx0PyAocGFyZW5EZXB0aCAmJiBzeW50YXhFcnJvcihwYXJhbXMpLCBiaW5kaW5ncyAmJiBwYXRoQmluZGluZ3MucG9wKCksIG5hbWVkID0gcGF0aCwgYm91bmROYW1lID0gYm91bmQsIHBhcmFtSW5kZXggPSBpbmRleCArIGFsbC5sZW5ndGgsIGJvdW5kICYmIChiaW5kaW5ncyA9IGJuZEN0eC5iZCA9IHBhdGhCaW5kaW5nc1tuYW1lZF0gPSBbXSksIHBhdGggKyAnOicpXG5cdFx0XHRcdFx0XHRcdDogcGF0aFxuXHRcdFx0XHQvLyBwYXRoXG5cdFx0XHRcdFx0XHRcdFx0PyAocGF0aC5zcGxpdChcIl5cIikuam9pbihcIi5cIikucmVwbGFjZShyUGF0aCwgcGFyc2VQYXRoKVxuXHRcdFx0XHRcdFx0XHRcdFx0KyAocHJuXG5cdFx0XHRcdC8vIHNvbWUuZm5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChibmRDdHggPSBibmRTdGFja1srK3BhcmVuRGVwdGhdID0ge2JkOiBbXX0sIGZuQ2FsbFtwYXJlbkRlcHRoXSA9IHJ0U3EsIHBybilcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBvcGVyYXRvcilcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0OiBvcGVyYXRvclxuXHRcdFx0XHQvLyBvcGVyYXRvclxuXHRcdFx0XHRcdFx0XHRcdFx0PyBvcGVyYXRvclxuXHRcdFx0XHRcdFx0XHRcdFx0OiBydFByblxuXHRcdFx0XHQvLyBmdW5jdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/ICgocnRQcm4gPSBmbkNhbGxbcGFyZW5EZXB0aF0gfHwgcnRQcm4sIGZuQ2FsbFtwYXJlbkRlcHRoXSA9IGZhbHNlLCBibmRDdHggPSBibmRTdGFja1stLXBhcmVuRGVwdGhdLCBydFBybilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIChwcm4gLy8gcnRQcm4gYW5kIHBybiwgZS5nICkoIGluIChhKSgpIG9yIGEoKSgpLCBvciApWyBpbiBhKClbXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSwgZm5DYWxsW3BhcmVuRGVwdGhdID0gcnRTcSwgcHJuKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBcIlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogY29tbWFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChmbkNhbGxbcGFyZW5EZXB0aF0gfHwgc3ludGF4RXJyb3IocGFyYW1zKSwgXCIsXCIpIC8vIFdlIGRvbid0IGFsbG93IHRvcC1sZXZlbCBsaXRlcmFsIGFycmF5cyBvciBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBsZnRQcm4wXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogKGFwb3NlZCA9IGFwb3MsIHF1b3RlZCA9IHF1b3QsICdcIicpXG5cdFx0XHRcdCkpXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHZhciBuYW1lZCwgYmluZHRvLCBib3VuZE5hbWUsXG5cdFx0cXVvdGVkLCAvLyBib29sZWFuIGZvciBzdHJpbmcgY29udGVudCBpbiBkb3VibGUgcXVvdGVzXG5cdFx0YXBvc2VkLCAvLyBvciBpbiBzaW5nbGUgcXVvdGVzXG5cdFx0YmluZGluZ3MgPSBwYXRoQmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzWzBdLCAvLyBiaW5kaW5ncyBhcnJheSBmb3IgdGhlIGZpcnN0IGFyZ1xuXHRcdGJuZEN0eCA9IHtiZDogYmluZGluZ3N9LFxuXHRcdGJuZFN0YWNrID0gezA6IGJuZEN0eH0sXG5cdFx0cGFyYW1JbmRleCA9IDAsIC8vIGxpc3QsXG5cdFx0dG1wbExpbmtzID0gKHRtcGwgPyB0bXBsLmxpbmtzIDogYmluZGluZ3MgJiYgKGJpbmRpbmdzLmxpbmtzID0gYmluZGluZ3MubGlua3MgfHwge30pKSB8fCB0b3BWaWV3LnRtcGwubGlua3MsXG5cdFx0Ly8gVGhlIGZvbGxvd2luZyBhcmUgdXNlZCBmb3IgdHJhY2tpbmcgcGF0aCBwYXJzaW5nIGluY2x1ZGluZyBuZXN0ZWQgcGF0aHMsIHN1Y2ggYXMgXCJhLmIoY15kICsgKGUpKV5mXCIsIGFuZCBjaGFpbmVkIGNvbXB1dGVkIHBhdGhzIHN1Y2ggYXNcblx0XHQvLyBcImEuYigpLmNeZCgpLmUuZigpLmdcIiAtIHdoaWNoIGhhcyBmb3VyIGNoYWluZWQgcGF0aHMsIFwiYS5iKClcIiwgXCJeYy5kKClcIiwgXCIuZS5mKClcIiBhbmQgXCIuZ1wiXG5cdFx0cGFyZW5EZXB0aCA9IDAsXG5cdFx0Zm5DYWxsID0ge30sIC8vIFdlIGFyZSBpbiBhIGZ1bmN0aW9uIGNhbGxcblx0XHRwYXRoU3RhcnQgPSB7fSwgLy8gdHJhY2tzIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBwYXRoIHN1Y2ggYXMgY15kKCkgaW4gdGhlIGFib3ZlIGV4YW1wbGVcblx0XHRyZXN1bHQgPSAocGFyYW1zICsgKHRtcGwgPyBcIiBcIiA6IFwiXCIpKS5yZXBsYWNlKHJQYXJhbXMsIHBhcnNlVG9rZW5zKTtcblxuXHRyZXR1cm4gIXBhcmVuRGVwdGggJiYgcmVzdWx0IHx8IHN5bnRheEVycm9yKHBhcmFtcyk7IC8vIFN5bnRheCBlcnJvciBpZiB1bmJhbGFuY2VkIHBhcmVucyBpbiBwYXJhbXMgZXhwcmVzc2lvblxufVxuXG5mdW5jdGlvbiBidWlsZENvZGUoYXN0LCB0bXBsLCBpc0xpbmtFeHByKSB7XG5cdC8vIEJ1aWxkIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBjb2RlIGZyb20gdGhlIEFTVCBub2RlcywgYW5kIHNldCBhcyBwcm9wZXJ0eSBvbiB0aGUgcGFzc2VkLWluIHRlbXBsYXRlIG9iamVjdFxuXHQvLyBVc2VkIGZvciBjb21waWxpbmcgdGVtcGxhdGVzLCBhbmQgYWxzbyBieSBKc1ZpZXdzIHRvIGJ1aWxkIGZ1bmN0aW9ucyBmb3IgZGF0YSBsaW5rIGV4cHJlc3Npb25zXG5cdHZhciBpLCBub2RlLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIHRhZ0N0eCwgaGFzVGFnLCBoYXNFbmNvZGVyLCBnZXRzVmFsLCBoYXNDbnZ0LCB1c2VDbnZ0LCB0bXBsQmluZGluZ3MsIHBhdGhCaW5kaW5ncywgcGFyYW1zLCBib3VuZE9uRXJyU3RhcnQsIGJvdW5kT25FcnJFbmQsXG5cdFx0dGFnUmVuZGVyLCBuZXN0ZWRUbXBscywgdG1wbE5hbWUsIG5lc3RlZFRtcGwsIHRhZ0FuZEVsc2VzLCBjb250ZW50LCBtYXJrdXAsIG5leHRJc0Vsc2UsIG9sZENvZGUsIGlzRWxzZSwgaXNHZXRWYWwsIHRhZ0N0eEZuLCBvbkVycm9yLCB0YWdTdGFydCwgdHJpZ2dlcixcblx0XHR0bXBsQmluZGluZ0tleSA9IDAsXG5cdFx0dXNlVmlld3MgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC51c2VWaWV3cyB8fCB0bXBsLnVzZVZpZXdzIHx8IHRtcGwudGFncyB8fCB0bXBsLnRlbXBsYXRlcyB8fCB0bXBsLmhlbHBlcnMgfHwgdG1wbC5jb252ZXJ0ZXJzLFxuXHRcdGNvZGUgPSBcIlwiLFxuXHRcdHRtcGxPcHRpb25zID0ge30sXG5cdFx0bCA9IGFzdC5sZW5ndGg7XG5cblx0aWYgKFwiXCIgKyB0bXBsID09PSB0bXBsKSB7XG5cdFx0dG1wbE5hbWUgPSBpc0xpbmtFeHByID8gJ2RhdGEtbGluaz1cIicgKyB0bXBsLnJlcGxhY2Uock5ld0xpbmUsIFwiIFwiKS5zbGljZSgxLCAtMSkgKyAnXCInIDogdG1wbDtcblx0XHR0bXBsID0gMDtcblx0fSBlbHNlIHtcblx0XHR0bXBsTmFtZSA9IHRtcGwudG1wbE5hbWUgfHwgXCJ1bm5hbWVkXCI7XG5cdFx0aWYgKHRtcGwuYWxsb3dDb2RlKSB7XG5cdFx0XHR0bXBsT3B0aW9ucy5hbGxvd0NvZGUgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAodG1wbC5kZWJ1Zykge1xuXHRcdFx0dG1wbE9wdGlvbnMuZGVidWcgPSB0cnVlO1xuXHRcdH1cblx0XHR0bXBsQmluZGluZ3MgPSB0bXBsLmJuZHM7XG5cdFx0bmVzdGVkVG1wbHMgPSB0bXBsLnRtcGxzO1xuXHR9XG5cdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHQvLyBBU1Qgbm9kZXM6IFswOiB0YWdOYW1lLCAxOiBjb252ZXJ0ZXIsIDI6IGNvbnRlbnQsIDM6IHBhcmFtcywgNDogY29kZSwgNTogb25FcnJvciwgNjogdHJpZ2dlciwgNzpwYXRoQmluZGluZ3MsIDg6IGNvbnRlbnRNYXJrdXBdXG5cdFx0bm9kZSA9IGFzdFtpXTtcblxuXHRcdC8vIEFkZCBuZXdsaW5lIGZvciBlYWNoIGNhbGxvdXQgdG8gdCgpIGMoKSBldGMuIGFuZCBlYWNoIG1hcmt1cCBzdHJpbmdcblx0XHRpZiAoXCJcIiArIG5vZGUgPT09IG5vZGUpIHtcblx0XHRcdC8vIGEgbWFya3VwIHN0cmluZyB0byBiZSBpbnNlcnRlZFxuXHRcdFx0Y29kZSArPSAnXFxuK1wiJyArIG5vZGUgKyAnXCInO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBhIGNvbXBpbGVkIHRhZyBleHByZXNzaW9uIHRvIGJlIGluc2VydGVkXG5cdFx0XHR0YWdOYW1lID0gbm9kZVswXTtcblx0XHRcdGlmICh0YWdOYW1lID09PSBcIipcIikge1xuXHRcdFx0XHQvLyBDb2RlIHRhZzoge3sqIH19XG5cdFx0XHRcdGNvZGUgKz0gXCI7XFxuXCIgKyBub2RlWzFdICsgXCJcXG5yZXQ9cmV0XCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb252ZXJ0ZXIgPSBub2RlWzFdO1xuXHRcdFx0XHRjb250ZW50ID0gIWlzTGlua0V4cHIgJiYgbm9kZVsyXTtcblx0XHRcdFx0dGFnQ3R4ID0gcGFyYW1TdHJ1Y3R1cmUobm9kZVszXSwgJ3BhcmFtcycpICsgJ30sJyArIHBhcmFtU3RydWN0dXJlKHBhcmFtcyA9IG5vZGVbNF0pO1xuXHRcdFx0XHRvbkVycm9yID0gbm9kZVs1XTtcblx0XHRcdFx0dHJpZ2dlciA9IG5vZGVbNl07XG5cdFx0XHRcdG1hcmt1cCA9IG5vZGVbOF0gJiYgbm9kZVs4XS5yZXBsYWNlKHJVbmVzY2FwZVF1b3RlcywgXCIkMVwiKTtcblx0XHRcdFx0aWYgKGlzRWxzZSA9IHRhZ05hbWUgPT09IFwiZWxzZVwiKSB7XG5cdFx0XHRcdFx0aWYgKHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0cGF0aEJpbmRpbmdzLnB1c2gobm9kZVs3XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRtcGxCaW5kaW5nS2V5ID0gMDtcblx0XHRcdFx0XHRpZiAodG1wbEJpbmRpbmdzICYmIChwYXRoQmluZGluZ3MgPSBub2RlWzddKSkgeyAvLyBBcnJheSBvZiBwYXRocywgb3IgZmFsc2UgaWYgbm90IGRhdGEtYm91bmRcblx0XHRcdFx0XHRcdHBhdGhCaW5kaW5ncyA9IFtwYXRoQmluZGluZ3NdO1xuXHRcdFx0XHRcdFx0dG1wbEJpbmRpbmdLZXkgPSB0bXBsQmluZGluZ3MucHVzaCgxKTsgLy8gQWRkIHBsYWNlaG9sZGVyIGluIHRtcGxCaW5kaW5ncyBmb3IgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dXNlVmlld3MgPSB1c2VWaWV3cyB8fCBwYXJhbXNbMV0gfHwgcGFyYW1zWzJdIHx8IHBhdGhCaW5kaW5ncyB8fCAvdmlldy4oPyFpbmRleCkvLnRlc3QocGFyYW1zWzBdKTtcblx0XHRcdFx0Ly8gdXNlVmlld3MgaXMgZm9yIHBlcmYgb3B0aW1pemF0aW9uLiBGb3IgcmVuZGVyKCkgd2Ugb25seSB1c2Ugdmlld3MgaWYgbmVjZXNzYXJ5IC0gZm9yIHRoZSBtb3JlIGFkdmFuY2VkIHNjZW5hcmlvcy5cblx0XHRcdFx0Ly8gV2UgdXNlIHZpZXdzIGlmIHRoZXJlIGFyZSBwcm9wcywgY29udGV4dHVhbCBwcm9wZXJ0aWVzIG9yIGFyZ3Mgd2l0aCAjLi4uIChvdGhlciB0aGFuICNpbmRleCkgLSBidXQgeW91IGNhbiBmb3JjZVxuXHRcdFx0XHQvLyB1c2luZyB0aGUgZnVsbCB2aWV3IGluZnJhc3RydWN0dXJlLCAoYW5kIHBheSBhIHBlcmYgcHJpY2UpIGJ5IG9wdGluZyBpbjogU2V0IHVzZVZpZXdzOiB0cnVlIG9uIHRoZSB0ZW1wbGF0ZSwgbWFudWFsbHkuLi5cblx0XHRcdFx0aWYgKGlzR2V0VmFsID0gdGFnTmFtZSA9PT0gXCI6XCIpIHtcblx0XHRcdFx0XHRpZiAoY29udmVydGVyKSB7XG5cdFx0XHRcdFx0XHR0YWdOYW1lID0gY29udmVydGVyID09PSBIVE1MID8gXCI+XCIgOiBjb252ZXJ0ZXIgKyB0YWdOYW1lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoY29udGVudCkgeyAvLyBUT0RPIG9wdGltaXplIC0gaWYgY29udGVudC5sZW5ndGggPT09IDAgb3IgaWYgdGhlcmUgaXMgYSB0bXBsPVwiLi4uXCIgc3BlY2lmaWVkIC0gc2V0IGNvbnRlbnQgdG8gbnVsbCAvIGRvbid0IHJ1biB0aGlzIGNvbXBpbGF0aW9uIGNvZGUgLSBzaW5jZSBjb250ZW50IHdvbid0IGdldCB1c2VkISFcblx0XHRcdFx0XHRcdC8vIENyZWF0ZSB0ZW1wbGF0ZSBvYmplY3QgZm9yIG5lc3RlZCB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbCA9IHRtcGxPYmplY3QobWFya3VwLCB0bXBsT3B0aW9ucyk7XG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBsLnRtcGxOYW1lID0gdG1wbE5hbWUgKyBcIi9cIiArIHRhZ05hbWU7XG5cdFx0XHRcdFx0XHQvLyBDb21waWxlIHRvIEFTVCBhbmQgdGhlbiB0byBjb21waWxlZCBmdW5jdGlvblxuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbC51c2VWaWV3cyA9IG5lc3RlZFRtcGwudXNlVmlld3MgfHwgdXNlVmlld3M7XG5cdFx0XHRcdFx0XHRidWlsZENvZGUoY29udGVudCwgbmVzdGVkVG1wbCk7XG5cdFx0XHRcdFx0XHR1c2VWaWV3cyA9IG5lc3RlZFRtcGwudXNlVmlld3M7XG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBscy5wdXNoKG5lc3RlZFRtcGwpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghaXNFbHNlKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIG5vdCBhbiBlbHNlIHRhZy5cblx0XHRcdFx0XHRcdHRhZ0FuZEVsc2VzID0gdGFnTmFtZTtcblx0XHRcdFx0XHRcdHVzZVZpZXdzID0gdXNlVmlld3MgfHwgdGFnTmFtZSAmJiAoISR0YWdzW3RhZ05hbWVdIHx8ICEkdGFnc1t0YWdOYW1lXS5mbG93KTtcblx0XHRcdFx0XHRcdC8vIFN3aXRjaCB0byBhIG5ldyBjb2RlIHN0cmluZyBmb3IgdGhpcyBib3VuZCB0YWcgKGFuZCBpdHMgZWxzZXMsIGlmIGl0IGhhcyBhbnkpIC0gZm9yIHJldHVybmluZyB0aGUgdGFnQ3R4cyBhcnJheVxuXHRcdFx0XHRcdFx0b2xkQ29kZSA9IGNvZGU7XG5cdFx0XHRcdFx0XHRjb2RlID0gXCJcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bmV4dElzRWxzZSA9IGFzdFtpICsgMV07XG5cdFx0XHRcdFx0bmV4dElzRWxzZSA9IG5leHRJc0Vsc2UgJiYgbmV4dElzRWxzZVswXSA9PT0gXCJlbHNlXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGFnU3RhcnQgPSBvbkVycm9yID8gXCI7XFxudHJ5e1xcbnJldCs9XCIgOiBcIlxcbitcIjtcblx0XHRcdFx0Ym91bmRPbkVyclN0YXJ0ID0gXCJcIjtcblx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKGlzR2V0VmFsICYmIChwYXRoQmluZGluZ3MgfHwgdHJpZ2dlciB8fCBjb252ZXJ0ZXIgJiYgY29udmVydGVyICE9PSBIVE1MKSkge1xuXHRcdFx0XHRcdC8vIEZvciBjb252ZXJ0VmFsIHdlIG5lZWQgYSBjb21waWxlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIG5ldyB0YWdDdHgocylcblx0XHRcdFx0XHR0YWdDdHhGbiA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgXCIgLy8gXCIgKyB0bXBsTmFtZSArIFwiIFwiICsgdG1wbEJpbmRpbmdLZXkgKyBcIiBcIiArIHRhZ05hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KyBcIlxcbnJldHVybiB7XCIgKyB0YWdDdHggKyBcIn07XCIpO1xuXHRcdFx0XHRcdHRhZ0N0eEZuLl9lciA9IG9uRXJyb3I7XG5cdFx0XHRcdFx0dGFnQ3R4Rm4uX3RhZyA9IHRhZ05hbWU7XG5cblx0XHRcdFx0XHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRhZ0N0eEZuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNldFBhdGhzKHRhZ0N0eEZuLCBwYXRoQmluZGluZ3MpO1xuXHRcdFx0XHRcdHRhZ1JlbmRlciA9ICdjKFwiJyArIGNvbnZlcnRlciArICdcIix2aWV3LCc7XG5cdFx0XHRcdFx0dXNlQ252dCA9IHRydWU7XG5cdFx0XHRcdFx0Ym91bmRPbkVyclN0YXJ0ID0gdGFnUmVuZGVyICsgdG1wbEJpbmRpbmdLZXkgKyBcIixcIjtcblx0XHRcdFx0XHRib3VuZE9uRXJyRW5kID0gXCIpXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29kZSArPSAoaXNHZXRWYWxcblx0XHRcdFx0XHQ/IChpc0xpbmtFeHByID8gKG9uRXJyb3IgPyBcInRyeXtcXG5cIiA6IFwiXCIpICsgXCJyZXR1cm4gXCIgOiB0YWdTdGFydCkgKyAodXNlQ252dCAvLyBDYWxsIF9jbnZ0IGlmIHRoZXJlIGlzIGEgY29udmVydGVyOiB7e2NudnQ6IC4uLiB9fSBvciB7XntjbnZ0OiAuLi4gfX1cblx0XHRcdFx0XHRcdD8gKHVzZUNudnQgPSB1bmRlZmluZWQsIHVzZVZpZXdzID0gaGFzQ252dCA9IHRydWUsIHRhZ1JlbmRlciArIChwYXRoQmluZGluZ3Ncblx0XHRcdFx0XHRcdFx0PyAoKHRtcGxCaW5kaW5nc1t0bXBsQmluZGluZ0tleSAtIDFdID0gdGFnQ3R4Rm4pLCB0bXBsQmluZGluZ0tleSkgLy8gU3RvcmUgdGhlIGNvbXBpbGVkIHRhZ0N0eEZuIGluIHRtcGwuYm5kcywgYW5kIHBhc3MgdGhlIGtleSB0byBjb252ZXJ0VmFsKClcblx0XHRcdFx0XHRcdFx0OiBcIntcIiArIHRhZ0N0eCArIFwifVwiKSArIFwiKVwiKVxuXHRcdFx0XHRcdFx0OiB0YWdOYW1lID09PSBcIj5cIlxuXHRcdFx0XHRcdFx0XHQ/IChoYXNFbmNvZGVyID0gdHJ1ZSwgXCJoKFwiICsgcGFyYW1zWzBdICsgXCIpXCIpXG5cdFx0XHRcdFx0XHRcdDogKGdldHNWYWwgPSB0cnVlLCBcIigodj1cIiArIHBhcmFtc1swXSArICcpIT1udWxsP3Y6JyArIChpc0xpbmtFeHByID8gJ251bGwpJyA6ICdcIlwiKScpKVxuXHRcdFx0XHRcdFx0XHQvLyBOb24gc3RyaWN0IGVxdWFsaXR5IHNvIGRhdGEtbGluaz1cInRpdGxlezpleHByfVwiIHdpdGggZXhwcj1udWxsL3VuZGVmaW5lZCByZW1vdmVzIHRpdGxlIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQ6IChoYXNUYWcgPSB0cnVlLCBcIlxcbnt2aWV3OnZpZXcsdG1wbDpcIiAvLyBBZGQgdGhpcyB0YWdDdHggdG8gdGhlIGNvbXBpbGVkIGNvZGUgZm9yIHRoZSB0YWdDdHhzIHRvIGJlIHBhc3NlZCB0byByZW5kZXJUYWcoKVxuXHRcdFx0XHRcdFx0KyAoY29udGVudCA/IG5lc3RlZFRtcGxzLmxlbmd0aCA6IFwiMFwiKSArIFwiLFwiIC8vIEZvciBibG9jayB0YWdzLCBwYXNzIGluIHRoZSBrZXkgKG5lc3RlZFRtcGxzLmxlbmd0aCkgdG8gdGhlIG5lc3RlZCBjb250ZW50IHRlbXBsYXRlXG5cdFx0XHRcdFx0XHQrIHRhZ0N0eCArIFwifSxcIikpO1xuXG5cdFx0XHRcdGlmICh0YWdBbmRFbHNlcyAmJiAhbmV4dElzRWxzZSkge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBkYXRhLWxpbmsgZXhwcmVzc2lvbiBvciBhbiBpbmxpbmUgdGFnIHdpdGhvdXQgYW55IGVsc2VzLCBvciB0aGUgbGFzdCB7e2Vsc2V9fSBvZiBhbiBpbmxpbmUgdGFnXG5cdFx0XHRcdFx0Ly8gV2UgY29tcGxldGUgdGhlIGNvZGUgZm9yIHJldHVybmluZyB0aGUgdGFnQ3R4cyBhcnJheVxuXHRcdFx0XHRcdGNvZGUgPSBcIltcIiArIGNvZGUuc2xpY2UoMCwgLTEpICsgXCJdXCI7XG5cdFx0XHRcdFx0dGFnUmVuZGVyID0gJ3QoXCInICsgdGFnQW5kRWxzZXMgKyAnXCIsdmlldyx0aGlzLCc7XG5cdFx0XHRcdFx0aWYgKGlzTGlua0V4cHIgfHwgcGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgYm91bmQgdGFnIChkYXRhLWxpbmsgZXhwcmVzc2lvbiBvciBpbmxpbmUgYm91bmQgdGFnIHtee3RhZyAuLi59fSkgc28gd2Ugc3RvcmUgYSBjb21waWxlZCB0YWdDdHhzIGZ1bmN0aW9uIGluIHRtcC5ibmRzXG5cdFx0XHRcdFx0XHRjb2RlID0gbmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3LGosdVwiLCBcIiAvLyBcIiArIHRtcGxOYW1lICsgXCIgXCIgKyB0bXBsQmluZGluZ0tleSArIFwiIFwiICsgdGFnQW5kRWxzZXMgKyBcIlxcbnJldHVybiBcIiArIGNvZGUgKyBcIjtcIik7XG5cdFx0XHRcdFx0XHRjb2RlLl9lciA9IG9uRXJyb3I7XG5cdFx0XHRcdFx0XHRjb2RlLl90YWcgPSB0YWdBbmRFbHNlcztcblx0XHRcdFx0XHRcdGlmIChwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdFx0c2V0UGF0aHModG1wbEJpbmRpbmdzW3RtcGxCaW5kaW5nS2V5IC0gMV0gPSBjb2RlLCBwYXRoQmluZGluZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvZGU7IC8vIEZvciBhIGRhdGEtbGluayBleHByZXNzaW9uIHdlIHJldHVybiB0aGUgY29tcGlsZWQgdGFnQ3R4cyBmdW5jdGlvblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ym91bmRPbkVyclN0YXJ0ID0gdGFnUmVuZGVyICsgdG1wbEJpbmRpbmdLZXkgKyBcIix1bmRlZmluZWQsXCI7XG5cdFx0XHRcdFx0XHRib3VuZE9uRXJyRW5kID0gXCIpXCI7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyB0aGUgbGFzdCB7e2Vsc2V9fSBmb3IgYW4gaW5saW5lIHRhZy5cblx0XHRcdFx0XHQvLyBGb3IgYSBib3VuZCB0YWcsIHBhc3MgdGhlIHRhZ0N0eHMgZm4gbG9va3VwIGtleSB0byByZW5kZXJUYWcuXG5cdFx0XHRcdFx0Ly8gRm9yIGFuIHVuYm91bmQgdGFnLCBpbmNsdWRlIHRoZSBjb2RlIGRpcmVjdGx5IGZvciBldmFsdWF0aW5nIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRjb2RlID0gb2xkQ29kZSArIHRhZ1N0YXJ0ICsgdGFnUmVuZGVyICsgKHRtcGxCaW5kaW5nS2V5IHx8IGNvZGUpICsgXCIpXCI7XG5cdFx0XHRcdFx0cGF0aEJpbmRpbmdzID0gMDtcblx0XHRcdFx0XHR0YWdBbmRFbHNlcyA9IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9uRXJyb3IpIHtcblx0XHRcdFx0XHR1c2VWaWV3cyA9IHRydWU7XG5cdFx0XHRcdFx0Y29kZSArPSAnO1xcbn1jYXRjaChlKXtyZXQnICsgKGlzTGlua0V4cHIgPyBcInVybiBcIiA6IFwiKz1cIikgKyBib3VuZE9uRXJyU3RhcnQgKyAnai5fZXJyKGUsdmlldywnICsgb25FcnJvciArICcpJyArIGJvdW5kT25FcnJFbmQgKyAnO30nICsgKGlzTGlua0V4cHIgPyBcIlwiIDogJ3JldD1yZXQnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvLyBJbmNsdWRlIG9ubHkgdGhlIHZhciByZWZlcmVuY2VzIHRoYXQgYXJlIG5lZWRlZCBpbiB0aGUgY29kZVxuXHRjb2RlID0gXCIvLyBcIiArIHRtcGxOYW1lXG5cblx0XHQrIFwiXFxudmFyIHZcIlxuXHRcdCsgKGhhc1RhZyA/IFwiLHQ9ai5fdGFnXCIgOiBcIlwiKSAgICAgICAgICAgICAgICAvLyBoYXMgdGFnXG5cdFx0KyAoaGFzQ252dCA/IFwiLGM9ai5fY252dFwiIDogXCJcIikgICAgICAgICAgICAgIC8vIGNvbnZlcnRlclxuXHRcdCsgKGhhc0VuY29kZXIgPyBcIixoPWouX2h0bWxcIiA6IFwiXCIpICAgICAgICAgICAvLyBodG1sIGNvbnZlcnRlclxuXHRcdCsgKGlzTGlua0V4cHIgPyBcIjtcXG5cIiA6ICcscmV0PVwiXCJcXG4nKVxuXHRcdCsgKHRtcGxPcHRpb25zLmRlYnVnID8gXCJkZWJ1Z2dlcjtcIiA6IFwiXCIpXG5cdFx0KyBjb2RlXG5cdFx0KyAoaXNMaW5rRXhwciA/IFwiXFxuXCIgOiBcIjtcXG5yZXR1cm4gcmV0O1wiKTtcblxuXHRpZiAoJHN1YlNldHRpbmdzLmRlYnVnTW9kZSAhPT0gZmFsc2UpIHtcblx0XHRjb2RlID0gXCJ0cnkge1xcblwiICsgY29kZSArIFwiXFxufWNhdGNoKGUpe1xcbnJldHVybiBqLl9lcnIoZSwgdmlldyk7XFxufVwiO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRjb2RlID0gbmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3LGosdVwiLCBjb2RlKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHN5bnRheEVycm9yKFwiQ29tcGlsZWQgdGVtcGxhdGUgY29kZTpcXG5cXG5cIiArIGNvZGUgKyAnXFxuOiBcIicgKyBlLm1lc3NhZ2UgKyAnXCInKTtcblx0fVxuXHRpZiAodG1wbCkge1xuXHRcdHRtcGwuZm4gPSBjb2RlO1xuXHRcdHRtcGwudXNlVmlld3MgPSAhIXVzZVZpZXdzO1xuXHR9XG5cdHJldHVybiBjb2RlO1xufVxuXG4vLz09PT09PT09PT1cbi8vIFV0aWxpdGllc1xuLy89PT09PT09PT09XG5cbi8vIE1lcmdlIG9iamVjdHMsIGluIHBhcnRpY3VsYXIgY29udGV4dHMgd2hpY2ggaW5oZXJpdCBmcm9tIHBhcmVudCBjb250ZXh0c1xuZnVuY3Rpb24gZXh0ZW5kQ3R4KGNvbnRleHQsIHBhcmVudENvbnRleHQpIHtcblx0Ly8gUmV0dXJuIGNvcHkgb2YgcGFyZW50Q29udGV4dCwgdW5sZXNzIGNvbnRleHQgaXMgZGVmaW5lZCBhbmQgaXMgZGlmZmVyZW50LCBpbiB3aGljaCBjYXNlIHJldHVybiBhIG5ldyBtZXJnZWQgY29udGV4dFxuXHQvLyBJZiBuZWl0aGVyIGNvbnRleHQgbm9yIHBhcmVudENvbnRleHQgYXJlIGRlZmluZWQsIHJldHVybiB1bmRlZmluZWRcblx0cmV0dXJuIGNvbnRleHQgJiYgY29udGV4dCAhPT0gcGFyZW50Q29udGV4dFxuXHRcdD8gKHBhcmVudENvbnRleHRcblx0XHRcdD8gJGV4dGVuZCgkZXh0ZW5kKHt9LCBwYXJlbnRDb250ZXh0KSwgY29udGV4dClcblx0XHRcdDogY29udGV4dClcblx0XHQ6IHBhcmVudENvbnRleHQgJiYgJGV4dGVuZCh7fSwgcGFyZW50Q29udGV4dCk7XG59XG5cbi8vIEdldCBjaGFyYWN0ZXIgZW50aXR5IGZvciBIVE1MIGFuZCBBdHRyaWJ1dGUgZW5jb2RpbmdcbmZ1bmN0aW9uIGdldENoYXJFbnRpdHkoY2gpIHtcblx0cmV0dXJuIGNoYXJFbnRpdGllc1tjaF0gfHwgKGNoYXJFbnRpdGllc1tjaF0gPSBcIiYjXCIgKyBjaC5jaGFyQ29kZUF0KDApICsgXCI7XCIpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRQcm9wcyhzb3VyY2UpIHtcblx0Ly8gdGhpcyBwb2ludGVyIGlzIHRoZU1hcCAtIHdoaWNoIGhhcyB0YWdDdHgucHJvcHMgdG9vXG5cdC8vIGFyZ3VtZW50czogdGFnQ3R4LmFyZ3MuXG5cdHZhciBrZXksIHByb3AsXG5cdFx0cHJvcHMgPSBbXTtcblxuXHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gT0JKRUNUKSB7XG5cdFx0Zm9yIChrZXkgaW4gc291cmNlKSB7XG5cdFx0XHRwcm9wID0gc291cmNlW2tleV07XG5cdFx0XHRpZiAoa2V5ICE9PSAkZXhwYW5kbyAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhJGlzRnVuY3Rpb24ocHJvcCkpIHtcblx0XHRcdFx0cHJvcHMucHVzaCh7a2V5OiBrZXksIHByb3A6IHByb3B9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BzO1xufVxuXG5mdW5jdGlvbiAkZm5SZW5kZXIoZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24pIHtcblx0dmFyIHRtcGxFbGVtID0gdGhpcy5qcXVlcnkgJiYgKHRoaXNbMF0gfHwgZXJyb3IoJ1Vua25vd24gdGVtcGxhdGU6IFwiJyArIHRoaXMuc2VsZWN0b3IgKyAnXCInKSksXG5cdFx0dG1wbCA9IHRtcGxFbGVtLmdldEF0dHJpYnV0ZSh0bXBsQXR0cik7XG5cblx0cmV0dXJuIHJlbmRlckNvbnRlbnQuY2FsbCh0bXBsID8gJC5kYXRhKHRtcGxFbGVtKVtqc3ZUbXBsXSA6ICR0ZW1wbGF0ZXModG1wbEVsZW0pLCBkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbik7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVnaXN0ZXIgY29udmVydGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBodG1sRW5jb2RlKHRleHQpIHtcblx0Ly8gSFRNTCBlbmNvZGU6IFJlcGxhY2UgPCA+ICYgJyBhbmQgXCIgYnkgY29ycmVzcG9uZGluZyBlbnRpdGllcy5cblx0cmV0dXJuIHRleHQgIT0gdW5kZWZpbmVkID8gcklzSHRtbC50ZXN0KHRleHQpICYmIChcIlwiICsgdGV4dCkucmVwbGFjZShySHRtbEVuY29kZSwgZ2V0Q2hhckVudGl0eSkgfHwgdGV4dCA6IFwiXCI7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kc3ViID0gJHZpZXdzLnN1YjtcbiR2aWV3c1NldHRpbmdzID0gJHZpZXdzLnNldHRpbmdzO1xuXG5pZiAoIShqc3IgfHwgJCAmJiAkLnJlbmRlcikpIHtcblx0Ly8gSnNSZW5kZXIgbm90IGFscmVhZHkgbG9hZGVkLCBvciBsb2FkZWQgd2l0aG91dCBqUXVlcnksIGFuZCB3ZSBhcmUgbm93IG1vdmluZyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXBhY2Vcblx0Zm9yIChqc3ZTdG9yZU5hbWUgaW4ganN2U3RvcmVzKSB7XG5cdFx0cmVnaXN0ZXJTdG9yZShqc3ZTdG9yZU5hbWUsIGpzdlN0b3Jlc1tqc3ZTdG9yZU5hbWVdKTtcblx0fVxuXG5cdCRjb252ZXJ0ZXJzID0gJHZpZXdzLmNvbnZlcnRlcnM7XG5cdCRoZWxwZXJzID0gJHZpZXdzLmhlbHBlcnM7XG5cdCR0YWdzID0gJHZpZXdzLnRhZ3M7XG5cblx0JHN1Yi5fdGcucHJvdG90eXBlID0ge1xuXHRcdGJhc2VBcHBseTogYmFzZUFwcGx5LFxuXHRcdGN2dEFyZ3M6IGNvbnZlcnRBcmdzXG5cdH07XG5cblx0dG9wVmlldyA9ICRzdWIudG9wVmlldyA9IG5ldyBWaWV3KCk7XG5cblx0Ly9CUk9XU0VSLVNQRUNJRklDIENPREVcblx0aWYgKCQpIHtcblxuXHRcdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIGpRdWVyeSAoPSAkKSBpcyBsb2FkZWRcblxuXHRcdCQuZm4ucmVuZGVyID0gJGZuUmVuZGVyO1xuXHRcdCRleHBhbmRvID0gJC5leHBhbmRvO1xuXHRcdGlmICgkLm9ic2VydmFibGUpIHtcblx0XHRcdCRleHRlbmQoJHN1YiwgJC52aWV3cy5zdWIpOyAvLyBqcXVlcnkub2JzZXJ2YWJsZS5qcyB3YXMgbG9hZGVkIGJlZm9yZSBqc3JlbmRlci5qc1xuXHRcdFx0JHZpZXdzLm1hcCA9ICQudmlld3MubWFwO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXHRcdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIGpRdWVyeSBpcyBub3QgbG9hZGVkLlxuXG5cdFx0JCA9IHt9O1xuXG5cdFx0aWYgKHNldEdsb2JhbHMpIHtcblx0XHRcdGdsb2JhbC5qc3JlbmRlciA9ICQ7IC8vIFdlIGFyZSBsb2FkaW5nIGpzcmVuZGVyLmpzIGZyb20gYSBzY3JpcHQgZWxlbWVudCwgbm90IEFNRCBvciBDb21tb25KUywgc28gc2V0IGdsb2JhbFxuXHRcdH1cblxuXHRcdC8vIEVycm9yIHdhcm5pbmcgaWYganNyZW5kZXIuanMgaXMgdXNlZCBhcyB0ZW1wbGF0ZSBlbmdpbmUgb24gTm9kZS5qcyAoZS5nLiBFeHByZXNzIG9yIEhhcGkuLi4pXG5cdFx0Ly8gVXNlIGpzcmVuZGVyLW5vZGUuanMgaW5zdGVhZC4uLlxuXHRcdCQucmVuZGVyRmlsZSA9ICQuX19leHByZXNzID0gJC5jb21waWxlID0gZnVuY3Rpb24oKSB7IHRocm93IFwiTm9kZS5qczogdXNlIG5wbSBqc3JlbmRlciwgb3IganNyZW5kZXItbm9kZS5qc1wiOyB9O1xuXG5cdFx0Ly9FTkQgQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0JC5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2IpIHtcblx0XHRcdHJldHVybiB0eXBlb2Ygb2IgPT09IFwiZnVuY3Rpb25cIjtcblx0XHR9O1xuXG5cdFx0JC5pc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcblx0XHRcdHJldHVybiAoe30udG9TdHJpbmcpLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuXHRcdH07XG5cblx0XHQkc3ViLl9qcSA9IGZ1bmN0aW9uKGpxKSB7IC8vIHByaXZhdGUgbWV0aG9kIHRvIG1vdmUgZnJvbSBKc1JlbmRlciBBUElzIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lc3BhY2Vcblx0XHRcdGlmIChqcSAhPT0gJCkge1xuXHRcdFx0XHQkZXh0ZW5kKGpxLCAkKTsgLy8gbWFwIG92ZXIgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVzcGFjZVxuXHRcdFx0XHQkID0ganE7XG5cdFx0XHRcdCQuZm4ucmVuZGVyID0gJGZuUmVuZGVyO1xuXHRcdFx0XHRkZWxldGUgJC5qc3JlbmRlcjtcblx0XHRcdFx0JGV4cGFuZG8gPSAkLmV4cGFuZG87XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdCQuanNyZW5kZXIgPSB2ZXJzaW9uTnVtYmVyO1xuXHR9XG5cdCRzdWJTZXR0aW5ncyA9ICRzdWIuc2V0dGluZ3M7XG5cdCRzdWJTZXR0aW5ncy5hbGxvd0NvZGUgPSBmYWxzZTtcblx0JGlzRnVuY3Rpb24gPSAkLmlzRnVuY3Rpb247XG5cdCQucmVuZGVyID0gJHJlbmRlcjtcblx0JC52aWV3cyA9ICR2aWV3cztcblx0JC50ZW1wbGF0ZXMgPSAkdGVtcGxhdGVzID0gJHZpZXdzLnRlbXBsYXRlcztcblxuXHRmb3IgKHNldHRpbmcgaW4gJHN1YlNldHRpbmdzKSB7XG5cdFx0YWRkU2V0dGluZyhzZXR0aW5nKTtcblx0fVxuXG5cdCgkdmlld3NTZXR0aW5ncy5kZWJ1Z01vZGUgPSBmdW5jdGlvbihkZWJ1Z01vZGUpIHtcblx0XHRyZXR1cm4gZGVidWdNb2RlID09PSB1bmRlZmluZWRcblx0XHRcdD8gJHN1YlNldHRpbmdzLmRlYnVnTW9kZVxuXHRcdFx0OiAoXG5cdFx0XHRcdCRzdWJTZXR0aW5ncy5kZWJ1Z01vZGUgPSBkZWJ1Z01vZGUsXG5cdFx0XHRcdCRzdWJTZXR0aW5ncy5vbkVycm9yID0gZGVidWdNb2RlICsgXCJcIiA9PT0gZGVidWdNb2RlXG5cdFx0XHRcdFx0PyBuZXcgRnVuY3Rpb24oXCJcIiwgXCJyZXR1cm4gJ1wiICsgZGVidWdNb2RlICsgXCInO1wiIClcblx0XHRcdFx0XHQ6ICRpc0Z1bmN0aW9uKGRlYnVnTW9kZSlcblx0XHRcdFx0XHRcdD8gZGVidWdNb2RlXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFx0JHZpZXdzU2V0dGluZ3MpO1xuXHR9KShmYWxzZSk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5cdCRzdWJTZXR0aW5nc0FkdmFuY2VkID0gJHN1YlNldHRpbmdzLmFkdmFuY2VkID0ge1xuXHRcdHVzZVZpZXdzOiBmYWxzZSxcblx0XHRfanN2OiBmYWxzZSAvLyBGb3IgZ2xvYmFsIGFjY2VzcyB0byBKc1ZpZXdzIHN0b3JlXG5cdH07XG5cblx0Ly89PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWdpc3RlciB0YWdzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0JHRhZ3Moe1xuXHRcdFwiaWZcIjoge1xuXHRcdFx0cmVuZGVyOiBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0Ly8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3Ige3tpZn19IGFuZCBvbmNlIGZvciBlYWNoIHt7ZWxzZX19LlxuXHRcdFx0XHQvLyBXZSB3aWxsIHVzZSB0aGUgdGFnLnJlbmRlcmluZyBvYmplY3QgZm9yIGNhcnJ5aW5nIHJlbmRlcmluZyBzdGF0ZSBhY3Jvc3MgdGhlIGNhbGxzLlxuXHRcdFx0XHQvLyBJZiBub3QgZG9uZSAoYSBwcmV2aW91cyBibG9jayBoYXMgbm90IGJlZW4gcmVuZGVyZWQpLCBsb29rIGF0IGV4cHJlc3Npb24gZm9yIHRoaXMgYmxvY2sgYW5kIHJlbmRlciB0aGUgYmxvY2sgaWYgZXhwcmVzc2lvbiBpcyB0cnV0aHlcblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHJldHVybiBcIlwiXG5cdFx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0XHR0YWdDdHggPSBzZWxmLnRhZ0N0eCxcblx0XHRcdFx0XHRyZXQgPSAoc2VsZi5yZW5kZXJpbmcuZG9uZSB8fCAhdmFsICYmIChhcmd1bWVudHMubGVuZ3RoIHx8ICF0YWdDdHguaW5kZXgpKVxuXHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHQ6IChzZWxmLnJlbmRlcmluZy5kb25lID0gdHJ1ZSwgc2VsZi5zZWxlY3RlZCA9IHRhZ0N0eC5pbmRleCxcblx0XHRcdFx0XHRcdFx0Ly8gVGVzdCBpcyBzYXRpc2ZpZWQsIHNvIHJlbmRlciBjb250ZW50IG9uIGN1cnJlbnQgY29udGV4dC4gV2UgY2FsbCB0YWdDdHgucmVuZGVyKCkgcmF0aGVyIHRoYW4gcmV0dXJuIHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQvLyAod2hpY2ggd291bGQgYWxzbyByZW5kZXIgdGhlIHRtcGwvY29udGVudCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGJ1dCB3b3VsZCBpdGVyYXRlIGlmIGl0IGlzIGFuIGFycmF5KVxuXHRcdFx0XHRcdFx0XHR0YWdDdHgucmVuZGVyKHRhZ0N0eC52aWV3LCB0cnVlKSk7IC8vIG5vIGFyZywgc28gcmVuZGVycyBhZ2FpbnN0IHBhcmVudFZpZXcuZGF0YVxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiZm9yXCI6IHtcblx0XHRcdHJlbmRlcjogZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIHt7Zm9yfX0gYW5kIG9uY2UgZm9yIGVhY2gge3tlbHNlfX0uXG5cdFx0XHRcdC8vIFdlIHdpbGwgdXNlIHRoZSB0YWcucmVuZGVyaW5nIG9iamVjdCBmb3IgY2FycnlpbmcgcmVuZGVyaW5nIHN0YXRlIGFjcm9zcyB0aGUgY2FsbHMuXG5cdFx0XHRcdHZhciBmaW5hbEVsc2UgPSAhYXJndW1lbnRzLmxlbmd0aCxcblx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0XHR0YWdDdHggPSBzZWxmLnRhZ0N0eCxcblx0XHRcdFx0XHRyZXN1bHQgPSBcIlwiLFxuXHRcdFx0XHRcdGRvbmUgPSAwO1xuXG5cdFx0XHRcdGlmICghc2VsZi5yZW5kZXJpbmcuZG9uZSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZmluYWxFbHNlID8gdGFnQ3R4LnZpZXcuZGF0YSA6IHZhbDsgLy8gRm9yIHRoZSBmaW5hbCBlbHNlLCBkZWZhdWx0cyB0byBjdXJyZW50IGRhdGEgd2l0aG91dCBpdGVyYXRpb24uXG5cdFx0XHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJlc3VsdCArPSB0YWdDdHgucmVuZGVyKHZhbHVlLCBmaW5hbEVsc2UpOyAvLyBJdGVyYXRlcyBleGNlcHQgb24gZmluYWwgZWxzZSwgaWYgZGF0YSBpcyBhbiBhcnJheS4gKFVzZSB7e2luY2x1ZGV9fSB0byBjb21wb3NlIHRlbXBsYXRlcyB3aXRob3V0IGFycmF5IGl0ZXJhdGlvbilcblx0XHRcdFx0XHRcdGRvbmUgKz0gJGlzQXJyYXkodmFsdWUpID8gdmFsdWUubGVuZ3RoIDogMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHNlbGYucmVuZGVyaW5nLmRvbmUgPSBkb25lKSB7XG5cdFx0XHRcdFx0XHRzZWxmLnNlbGVjdGVkID0gdGFnQ3R4LmluZGV4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBJZiBub3RoaW5nIHdhcyByZW5kZXJlZCB3ZSB3aWxsIGxvb2sgYXQgdGhlIG5leHQge3tlbHNlfX0uIE90aGVyd2lzZSwgd2UgYXJlIGRvbmUuXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRwcm9wczoge1xuXHRcdFx0YmFzZVRhZzogXCJmb3JcIixcblx0XHRcdGRhdGFNYXA6IGRhdGFNYXAoZ2V0VGFyZ2V0UHJvcHMpLFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0aW5jbHVkZToge1xuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCIqXCI6IHtcblx0XHRcdC8vIHt7KiBjb2RlLi4uIH19IC0gSWdub3JlZCBpZiB0ZW1wbGF0ZS5hbGxvd0NvZGUgYW5kICQudmlld3Muc2V0dGluZ3MuYWxsb3dDb2RlIGFyZSBmYWxzZS4gT3RoZXJ3aXNlIGluY2x1ZGUgY29kZSBpbiBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdFx0cmVuZGVyOiByZXRWYWwsXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcIjoqXCI6IHtcblx0XHRcdC8vIHt7OiogcmV0dXJuZWRFeHByZXNzaW9uIH19IC0gSWdub3JlZCBpZiB0ZW1wbGF0ZS5hbGxvd0NvZGUgYW5kICQudmlld3Muc2V0dGluZ3MuYWxsb3dDb2RlIGFyZSBmYWxzZS4gT3RoZXJ3aXNlIGluY2x1ZGUgY29kZSBpbiBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdFx0cmVuZGVyOiByZXRWYWwsXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRkYmc6ICRoZWxwZXJzLmRiZyA9ICRjb252ZXJ0ZXJzLmRiZyA9IGRiZ0JyZWFrIC8vIFJlZ2lzdGVyIHt7ZGJnL319LCB7e2RiZzouLi59fSBhbmQgfmRiZygpIHRvIHRocm93IGFuZCBjYXRjaCwgYXMgYnJlYWtwb2ludHMgZm9yIGRlYnVnZ2luZy5cblx0fSk7XG5cblx0JGNvbnZlcnRlcnMoe1xuXHRcdGh0bWw6IGh0bWxFbmNvZGUsXG5cdFx0YXR0cjogaHRtbEVuY29kZSwgLy8gSW5jbHVkZXMgPiBlbmNvZGluZyBzaW5jZSByQ29udmVydE1hcmtlcnMgaW4gSnNWaWV3cyBkb2VzIG5vdCBza2lwID4gY2hhcmFjdGVycyBpbiBhdHRyaWJ1dGUgc3RyaW5nc1xuXHRcdHVybDogZnVuY3Rpb24odGV4dCkge1xuXHRcdFx0Ly8gVVJMIGVuY29kaW5nIGhlbHBlci5cblx0XHRcdHJldHVybiB0ZXh0ICE9IHVuZGVmaW5lZCA/IGVuY29kZVVSSShcIlwiICsgdGV4dCkgOiB0ZXh0ID09PSBudWxsID8gdGV4dCA6IFwiXCI7IC8vIG51bGwgcmV0dXJucyBudWxsLCBlLmcuIHRvIHJlbW92ZSBhdHRyaWJ1dGUuIHVuZGVmaW5lZCByZXR1cm5zIFwiXCJcblx0XHR9XG5cdH0pO1xufVxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBEZWZpbmUgZGVmYXVsdCBkZWxpbWl0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG4kc3ViU2V0dGluZ3MgPSAkc3ViLnNldHRpbmdzO1xuJGlzQXJyYXkgPSAoJHx8anNyKS5pc0FycmF5O1xuJHZpZXdzU2V0dGluZ3MuZGVsaW1pdGVycyhcInt7XCIsIFwifX1cIiwgXCJeXCIpO1xuXG5pZiAoanNyVG9KcSkgeyAvLyBNb3ZpbmcgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVwYWNlIC0gY29weSBvdmVyIHRoZSBzdG9yZWQgaXRlbXMgKHRlbXBsYXRlcywgY29udmVydGVycywgaGVscGVycy4uLilcblx0anNyLnZpZXdzLnN1Yi5fanEoJCk7XG59XG5cbi8vPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IEpzT2JzZXJ2YWJsZSA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbi8qIEpzT2JzZXJ2YWJsZTpcbiAqIFNlZSBodHRwOi8vd3d3Lmpzdmlld3MuY29tLyNqc29ic2VydmFibGUgYW5kIGh0dHA6Ly9naXRodWIuY29tL2JvcmlzbW9vcmUvanN2aWV3c1xuICogQ29weXJpZ2h0IDIwMTYsIEJvcmlzIE1vb3JlXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgdmFycyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kdmlld3MgPSAkLnZpZXdzO1xuJHN1YiA9ICR2aWV3cy5zdWI7XG4kaXNGdW5jdGlvbiA9ICQuaXNGdW5jdGlvbjtcbiRpc0FycmF5ID0gJC5pc0FycmF5O1xuJGV4cGFuZG8gPSAkLmV4cGFuZG87XG5pZiAoISQub2JzZXJ2ZSkge1xuXG5cdHZhciAkZXZlbnRTcGVjaWFsID0gJC5ldmVudC5zcGVjaWFsLFxuXHRcdHNsaWNlID0gW10uc2xpY2UsXG5cdFx0c3BsaWNlID0gW10uc3BsaWNlLFxuXHRcdGNvbmNhdCA9IFtdLmNvbmNhdCxcblx0XHRQQVJTRUlOVCA9IHBhcnNlSW50LFxuXHRcdHJOb3RXaGl0ZSA9IC9cXFMrL2csXG5cdFx0cHJvcGVydHlDaGFuZ2VTdHIgPSAkc3ViLnByb3BDaG5nID0gJHN1Yi5wcm9wQ2huZyB8fCBcInByb3BlcnR5Q2hhbmdlXCIsLy8gVGhlc2UgdHdvIHNldHRpbmdzIGNhbiBiZSBvdmVycmlkZGVuIG9uIHNldHRpbmdzIGFmdGVyIGxvYWRpbmdcblx0XHRhcnJheUNoYW5nZVN0ciA9ICRzdWIuYXJyQ2huZyA9ICRzdWIuYXJyQ2huZyB8fCBcImFycmF5Q2hhbmdlXCIsICAgICAgICAvLyBqc1JlbmRlciwgYW5kIHByaW9yIHRvIGxvYWRpbmcganF1ZXJ5Lm9ic2VydmFibGUuanMgYW5kL29yIEpzVmlld3Ncblx0XHRjYkJpbmRpbmdzU3RvcmUgPSB7fSxcblx0XHRvYnNlcnZlU3RyID0gcHJvcGVydHlDaGFuZ2VTdHIgKyBcIi5vYnNlcnZlXCIsXG5cdFx0b2JzZXJ2ZU9iaktleSA9IDEsXG5cdFx0b2JzZXJ2ZUNiS2V5ID0gMSxcblx0XHRvYnNlcnZlSW5uZXJDYktleSA9IDEsXG5cdFx0JGhhc0RhdGEgPSAkLmhhc0RhdGEsXG5cdFx0JGRhdGEgPSAkLmRhdGEsXG5cdFx0cmVtb3ZlID0ge30sIC8vIGZsYWcgZm9yIHJlbW92ZVByb3BlcnR5XG5cblx0Ly89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0Z2V0Q2JLZXkgPSBmdW5jdGlvbihjYikge1xuXHRcdHJldHVybiBjYi5fY0lkID0gY2IuX2NJZCB8fCAoXCIub2JzXCIgKyBvYnNlcnZlQ2JLZXkrKyk7XG5cdH0sXG5cblx0T2JqZWN0T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKG5zLCBkYXRhKSB7XG5cdFx0dGhpcy5fZGF0YSA9IGRhdGE7XG5cdFx0dGhpcy5fbnMgPSBucztcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRBcnJheU9ic2VydmFibGUgPSBmdW5jdGlvbihucywgZGF0YSkge1xuXHRcdHRoaXMuX2RhdGEgPSBkYXRhO1xuXHRcdHRoaXMuX25zID0gbnM7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcEFycmF5ID0gZnVuY3Rpb24oZGF0YSkge1xuXHRcdHJldHVybiAkaXNBcnJheShkYXRhKVxuXHRcdFx0PyBbZGF0YV1cblx0XHRcdDogZGF0YTtcblx0fSxcblxuXHRyZXNvbHZlUGF0aE9iamVjdHMgPSBmdW5jdGlvbihwYXRocywgcm9vdCwgY2FsbGJhY2spIHtcblx0XHRwYXRocyA9IHBhdGhzXG5cdFx0XHQ/ICRpc0FycmF5KHBhdGhzKVxuXHRcdFx0XHQ/IHBhdGhzXG5cdFx0XHRcdDogW3BhdGhzXVxuXHRcdFx0OiBbXTtcblxuXHRcdHZhciBpLCBwYXRoLFxuXHRcdFx0b2JqZWN0ID0gcm9vdCxcblx0XHRcdG5leHRPYmogPSBvYmplY3QsXG5cdFx0XHRsID0gcGF0aHMgJiYgcGF0aHMubGVuZ3RoLFxuXHRcdFx0b3V0ID0gW107XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRwYXRoID0gcGF0aHNbaV07XG5cdFx0XHRpZiAoJGlzRnVuY3Rpb24ocGF0aCkpIHtcblx0XHRcdFx0b3V0ID0gb3V0LmNvbmNhdChyZXNvbHZlUGF0aE9iamVjdHMocGF0aC5jYWxsKHJvb3QsIHJvb3QsIGNhbGxiYWNrKSwgcm9vdCkpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH0gZWxzZSBpZiAoXCJcIiArIHBhdGggIT09IHBhdGgpIHtcblx0XHRcdFx0cm9vdCA9IG5leHRPYmogPSBwYXRoO1xuXHRcdFx0XHRpZiAobmV4dE9iaiAhPT0gb2JqZWN0KSB7XG5cdFx0XHRcdFx0b3V0LnB1c2gob2JqZWN0ID0gbmV4dE9iaik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAobmV4dE9iaiAhPT0gb2JqZWN0KSB7XG5cdFx0XHRcdG91dC5wdXNoKG9iamVjdCA9IG5leHRPYmopO1xuXHRcdFx0fVxuXHRcdFx0b3V0LnB1c2gocGF0aCk7XG5cdFx0fVxuXHRcdHJldHVybiBvdXQ7XG5cdH0sXG5cblx0cmVtb3ZlQ2JCaW5kaW5ncyA9IGZ1bmN0aW9uKGNiQmluZGluZ3MsIGNiQmluZGluZ3NJZCkge1xuXHRcdC8vIElmIHRoZSBjYkJpbmRpbmdzIGNvbGxlY3Rpb24gaXMgZW1wdHkgd2Ugd2lsbCByZW1vdmUgaXQgZnJvbSB0aGUgY2JCaW5kaW5nc1N0b3JlXG5cdFx0Zm9yICh2YXIgY2IgaW4gY2JCaW5kaW5ncykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRkZWxldGUgY2JCaW5kaW5nc1N0b3JlW2NiQmluZGluZ3NJZF07IC8vIFRoaXMgYmluZGluZyBjb2xsZWN0aW9uIGlzIGVtcHR5LCBzbyByZW1vdmUgZnJvbSBzdG9yZVxuXHR9LFxuXG5cdG9uT2JzZXJ2YWJsZUNoYW5nZSA9IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MpIHtcblx0XHRmdW5jdGlvbiBpc09iKHZhbCkge1xuXHRcdFx0cmV0dXJuIHR5cGVvZiB2YWwgPT09IE9CSkVDVCAmJiAocGF0aHNbMF0gfHwgYWxsb3dBcnJheSAmJiAkaXNBcnJheSh2YWwpKTtcblx0XHR9XG5cblx0XHRpZiAoIShldi5kYXRhICYmIGV2LmRhdGEub2ZmKSkge1xuXHRcdFx0Ly8gU2tpcCBpZiAhIWV2LmRhdGEub2ZmOiAtIGEgaGFuZGxlciB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCAobWF5YmUgd2FzIG9uIGhhbmRsZXIgY29sbGVjdGlvbiBhdCBjYWxsIHRpbWUgLSB0aGVuIHJlbW92ZWQgYnkgYW5vdGhlciBoYW5kbGVyKVxuXHRcdFx0dmFyIGFsbFBhdGgsIGZpbHRlciwgcGFyZW50T2JzLFxuXHRcdFx0XHRvbGRWYWx1ZSA9IGV2ZW50QXJncy5vbGRWYWx1ZSxcblx0XHRcdFx0dmFsdWUgPSBldmVudEFyZ3MudmFsdWUsXG5cdFx0XHRcdGN0eCA9IGV2LmRhdGEsXG5cdFx0XHRcdG9ic2VydmVBbGwgPSBjdHgub2JzZXJ2ZUFsbCxcblx0XHRcdFx0Y2IgPSBjdHguY2IsXG5cdFx0XHRcdGFsbG93QXJyYXkgPSAhY2Iubm9BcnJheSxcblx0XHRcdFx0cGF0aHMgPSBjdHgucGF0aHMsXG5cdFx0XHRcdG5zID0gY3R4Lm5zO1xuXG5cdFx0XHRpZiAoZXYudHlwZSA9PT0gYXJyYXlDaGFuZ2VTdHIpIHtcblx0XHRcdFx0KGNiLmFycmF5IHx8IGNiKS5jYWxsKGN0eCwgZXYsIGV2ZW50QXJncyk7IC8vIElmIHRoZXJlIGlzIGFuIGFycmF5SGFuZGxlciBleHBhbmRvIG9uIHRoZSByZWd1bGFyIGhhbmRsZXIsIHVzZSBpdCwgb3RoZXJ3aXNlIHVzZSB0aGUgcmVndWxhciBoYW5kbGVyIGZvciBhcnJheUNoYW5nZSBldmVudHMgYWxzbyAtIGZvciBleGFtcGxlOiAkLm9ic2VydmUoYXJyYXksIGhhbmRsZXIpXG5cdFx0XHRcdC8vIG9yIG9ic2VydmVBbGwoKSB3aXRoIGFuIGFycmF5IGluIHRoZSBncmFwaC4gTm90ZSB0aGF0IG9uIGRhdGEtbGluayBiaW5kaW5ncyB3ZSBlbnN1cmUgYWx3YXlzIHRvIGhhdmUgYW4gYXJyYXkgaGFuZGxlciAtICQubm9vcCBpZiBub25lIGlzIHNwZWNpZmllZCBlLmcuIG9uIHRoZSBkYXRhLWxpbmtlZCB0YWcuXG5cdFx0XHR9IGVsc2UgaWYgKGN0eC5wcm9wID09PSBldmVudEFyZ3MucGF0aCB8fCBjdHgucHJvcCA9PT0gXCIqXCIpIHtcblx0XHRcdFx0aWYgKG9ic2VydmVBbGwpIHtcblx0XHRcdFx0XHRhbGxQYXRoID0gb2JzZXJ2ZUFsbC5fcGF0aCArIFwiLlwiICsgZXZlbnRBcmdzLnBhdGg7XG5cdFx0XHRcdFx0ZmlsdGVyID0gb2JzZXJ2ZUFsbC5maWx0ZXI7XG5cdFx0XHRcdFx0cGFyZW50T2JzID0gW2V2LnRhcmdldF0uY29uY2F0KG9ic2VydmVBbGwucGFyZW50cygpKTtcblxuXHRcdFx0XHRcdGlmIChpc09iKG9sZFZhbHVlKSkge1xuXHRcdFx0XHRcdFx0b2JzZXJ2ZV9hcHBseShhbGxvd0FycmF5LCBucywgW29sZFZhbHVlXSwgcGF0aHMsIGNiLCB0cnVlLCBmaWx0ZXIsIFtwYXJlbnRPYnNdLCBhbGxQYXRoKTsgLy8gdW5vYnNlcnZlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpc09iKHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0b2JzZXJ2ZV9hcHBseShhbGxvd0FycmF5LCBucywgW3ZhbHVlXSwgcGF0aHMsIGNiLCB1bmRlZmluZWQsIGZpbHRlciwgW3BhcmVudE9ic10sIGFsbFBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoaXNPYihvbGRWYWx1ZSkpIHsgLy8gb2xkVmFsdWUgaXMgYW4gb2JqZWN0LCBzbyB1bm9ic2VydmVcblx0XHRcdFx0XHRcdG9ic2VydmVfYXBwbHkoYWxsb3dBcnJheSwgbnMsIFtvbGRWYWx1ZV0sIHBhdGhzLCBjYiwgdHJ1ZSk7IC8vIHVub2JzZXJ2ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaXNPYih2YWx1ZSkpIHsgLy8gdmFsdWUgaXMgYW4gb2JqZWN0LCBzbyBvYnNlcnZlXG5cdFx0XHRcdFx0XHRvYnNlcnZlX2FwcGx5KGFsbG93QXJyYXksIG5zLCBbdmFsdWVdLCBwYXRocywgY2IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRjdHguY2IoZXYsIGV2ZW50QXJncyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdG9ic2VydmVfYXBwbHkgPSBmdW5jdGlvbigpIHtcblx0XHQvLyAkLm9ic2VydmUoKSwgYnV0IGFsbG93aW5nIHlvdSB0byBpbmNsdWRlIGFycmF5cyB3aXRoaW4gdGhlIGFyZ3VtZW50cyAtIHdoaWNoIHlvdSB3YW50IGZsYXR0ZW5lZC5cblx0XHR2YXIgYXJncyA9IGNvbmNhdC5hcHBseShbXSwgYXJndW1lbnRzKTsgLy8gRmxhdHRlbiB0aGUgYXJndW1lbnRzXG5cdFx0cmV0dXJuICRvYnNlcnZlLmFwcGx5KGFyZ3Muc2hpZnQoKSwgYXJncyk7XG5cdH0sXG5cblx0JG9ic2VydmVBbGwgPSBmdW5jdGlvbihjYiwgZmlsdGVyLCB1bm9ic2VydmUpIHtcblx0XHRvYnNlcnZlQWxsKHRoaXMuX25zLCB0aGlzLl9kYXRhLCBjYiwgZmlsdGVyLCBbXSwgXCJyb290XCIsIHVub2JzZXJ2ZSk7XG5cdH0sXG5cblx0JHVub2JzZXJ2ZUFsbCA9IGZ1bmN0aW9uKGNiLCBmaWx0ZXIpIHtcblx0XHQkb2JzZXJ2ZUFsbC5jYWxsKHRoaXMsIGNiLCBmaWx0ZXIsIHRydWUpO1xuXHR9LFxuXG5cdG9ic2VydmVBbGwgPSBmdW5jdGlvbihuYW1lc3BhY2UsIG9iamVjdCwgY2IsIGZpbHRlciwgcGFyZW50T2JzLCBhbGxQYXRoLCB1bm9ic2VydmUsIG9iak1hcCkge1xuXHRcdGZ1bmN0aW9uIG9ic2VydmVBcnJheUl0ZW1zKGFyciwgdW5vYnMpIHtcblx0XHRcdGwgPSBhcnIubGVuZ3RoO1xuXHRcdFx0bmV3QWxsUGF0aCA9IGFsbFBhdGggKyBcIltdXCI7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdGZpbHRlckFuZE9ic2VydmVBbGwoYXJyLCBsLCB1bm9icywgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZmlsdGVyQW5kT2JzZXJ2ZUFsbChvYmosIHByb3AsIHVub2JzLCBuZXN0ZWRBcnJheSkge1xuXHRcdFx0dmFyIG5ld09iamVjdCwgbmV3UGFyZW50T2JzO1xuXHRcdFx0aWYgKHByb3AgIT09ICRleHBhbmRvKSB7XG5cdFx0XHRcdGlmIChuZXdPYmplY3QgPSAkb2JzZXJ2YWJsZS5fZmx0cihuZXdBbGxQYXRoLCBvYmpbcHJvcF0sIG5leHRQYXJlbnRPYnMsIGZpbHRlcikpIHtcblx0XHRcdFx0XHRuZXdQYXJlbnRPYnMgPSBuZXh0UGFyZW50T2JzLnNsaWNlKCk7XG5cdFx0XHRcdFx0aWYgKG5lc3RlZEFycmF5ICYmIHVwZGF0ZWRUZ3QgJiYgbmV3UGFyZW50T2JzWzBdICE9PSB1cGRhdGVkVGd0KSB7XG5cdFx0XHRcdFx0XHRuZXdQYXJlbnRPYnMudW5zaGlmdCh1cGRhdGVkVGd0KTsgLy8gRm9yIGFycmF5IGNoYW5nZSBldmVudHMgd2hlbiBvYnNlcnZpbmcgYW4gYXJyYXkgd2hpY2ggaXMgbm90IHRoZSByb290LCBuZWVkIHRvIGFkZCB1cGRhdGVkIGFycmF5IHRvIHBhcmVudE9ic1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvYnNlcnZlQWxsKG5hbWVzcGFjZSwgbmV3T2JqZWN0LCBjYiwgZmlsdGVyIHx8IChuZXN0ZWRBcnJheSA/IHVuZGVmaW5lZCA6IDApLCBuZXdQYXJlbnRPYnMsIG5ld0FsbFBhdGgsIHVub2JzLCBvYmpNYXApO1xuXHRcdFx0XHRcdC8vIElmIG5lc3RlZCBhcnJheSwgbmVlZCB0byBvYnNlcnZlIHRoZSBhcnJheSB0b28gLSBzbyBzZXQgZmlsdGVyIHRvIHVuZGVmaW5lZFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gd3JhcHBlZENiKGV2LCBldmVudEFyZ3MpIHtcblx0XHRcdC8vIFRoaXMgb2JqZWN0IGlzIGNoYW5naW5nLlxuXHRcdFx0YWxsUGF0aCA9IGV2LmRhdGEub2JzZXJ2ZUFsbC5fcGF0aDtcblx0XHRcdHVwZGF0ZWRUZ3QgPSBldi50YXJnZXQ7XG5cdFx0XHRzd2l0Y2ggKGV2ZW50QXJncy5jaGFuZ2UpIHsgLy8gb2JzZXJ2ZUFsbC91bm9ic2VydmVBbGwgb24gYWRkZWQgb3IgcmVtb3ZlZCBvYmplY3RzXG5cdFx0XHRcdGNhc2UgXCJpbnNlcnRcIjpcblx0XHRcdFx0XHRvYnNlcnZlQXJyYXlJdGVtcyhldmVudEFyZ3MuaXRlbXMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmVtb3ZlXCI6XG5cdFx0XHRcdFx0b2JzZXJ2ZUFycmF5SXRlbXMoZXZlbnRBcmdzLml0ZW1zLCB0cnVlKTsgLy8gdW5vYnNlcnZlQWxsIG9uIHJlbW92ZWQgaXRlbXNcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInNldFwiOlxuXHRcdFx0XHRcdG5ld0FsbFBhdGggPSBhbGxQYXRoICsgXCIuXCIgKyBldmVudEFyZ3MucGF0aDtcblx0XHRcdFx0XHRmaWx0ZXJBbmRPYnNlcnZlQWxsKGV2ZW50QXJncywgXCJvbGRWYWx1ZVwiLCB0cnVlKTsgLy8gdW5vYnNlcnZlIG9sZCB2YWx1ZVxuXHRcdFx0XHRcdGZpbHRlckFuZE9ic2VydmVBbGwoZXZlbnRBcmdzLCBcInZhbHVlXCIpOyAvLyBvYnNlcnZlIG5ldyB2YWx1ZVxuXHRcdFx0fVxuXHRcdFx0dXBkYXRlZFRndCA9IHVuZGVmaW5lZDtcblx0XHRcdGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIE9ic2VydmUgdGhpcyBvYmplY3QgKGludm9rZSB0aGUgY2FsbGJhY2spXG5cdFx0fVxuXG5cdFx0dmFyIGwsIGlzT2JqZWN0LCBuZXdBbGxQYXRoLCBuZXh0UGFyZW50T2JzLCB1cGRhdGVkVGd0LCBvYklkLFxuXHRcdFx0bm90UmVtb3ZpbmcgPSAhb2JqTWFwIHx8IG9iak1hcC51biB8fCAhdW5vYnNlcnZlOyAvLyB0cnVlIHVubGVzcyBpdCBpcyBhbiBvYnNlcnZlQWxsIGNhbGwgKG5vdCB1bm9ic2VydmVBbGwpIGFuZCB3ZSBhcmUgcmVtb3ZpbmcgYSBsaXN0ZW5lciAobm90IGFkZGluZyBvbmUpXG5cblx0XHRpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QgPT09IE9CSkVDVCkge1xuXHRcdFx0bmV4dFBhcmVudE9icyA9IFtvYmplY3RdLmNvbmNhdChwYXJlbnRPYnMpOyAvLyBUaGUgcGFyZW50T2JzIGNoYWluIGZvciB0aGUgbmV4dCBkZXB0aCBvZiBvYnNlcnZlQWxsXG5cdFx0XHRpc09iamVjdCA9ICRpc0FycmF5KG9iamVjdCkgPyBcIlwiIDogXCIqXCI7XG5cdFx0XHRpZiAob2JqTWFwICYmIG5vdFJlbW92aW5nICYmICRoYXNEYXRhKG9iamVjdCkgJiYgb2JqTWFwW29iSWQgPSAkZGF0YShvYmplY3QpLm9iSWRdKSB7XG5cdFx0XHRcdG9iak1hcFtvYklkXSsrO1xuXHRcdFx0XHRyZXR1cm47IC8vIFRoaXMgb2JqZWN0IGhhcyBhbHJlYWR5IGJlaW5nIG9ic2VydmVkL3Vub2JzZXJ2ZWQgYnkgdGhpcyBvYnNlcnZlQWxsL3Vub2JzZXJ2ZUFsbCBjYWxsIChtdXN0IGJlIGEgY3ljbGljIG9iamVjdCBncmFwaCkgc28gc2tpcCwgdG8gYXZvaWRcblx0XHRcdFx0Ly8gc3RhY2sgb3ZlcmZsb3cvbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGxpc3RlbmVyLiBTZWUganN2aWV3cy9wdWxsLzMwNVxuXHRcdFx0XHQvLyBOT1RFIC0gV0UgRE8gTk9UIHN1cHBvcnQgT2JzZXJ2ZUFsbCBvbiBkYXRhIHdpdGggY3ljbGljIGdyYXBocyB3aGljaCBpbmNsdWRlIERVUExJQ0FURSBSRUZFUkVOQ0VTIFRPIEFSUkFZIFBST1BFUlRJRVMgLSBzdWNoIGFzIGRhdGEuY2hpbGRyZW4gPSBkYXRhLmRlc2NlbmRhbnRzID0gW11cblx0XHRcdH1cblx0XHRcdGlmICghb2JqTWFwKSB7XG5cdFx0XHRcdG9iak1hcCA9IHt1bjogdW5vYnNlcnZlfTsgLy8gTWFwIG9iamVjdCB0byByZWdpc3RlciBvYnNlcnZlZCBvYmplY3RzIGZvciB0aGlzIG9ic2VydmVBbGxcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNiKSB7XG5cdFx0XHRcdC8vIE9ic2VydmUgdGhpcyBvYmplY3Qgb3IgYXJyYXkgLSBhbmQgYWxzbyBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gb2JqZWN0IGdyYXBoLCB0byBhZGQgb3IgcmVtb3ZlIG9ic2VydmVycyBmcm9tIHRoZSBtb2RpZmllZCBvYmplY3QgZ3JhcGhcblx0XHRcdFx0aWYgKGlzT2JqZWN0IHx8IGZpbHRlciAhPT0gMCkge1xuXHRcdFx0XHRcdC8vIElmIGFuIG9iamVjdCwgb2JzZXJ2ZSB0aGUgb2JqZWN0LiBJZiBhbiBhcnJheSwgb25seSBhZGQgYXJyYXlDaGFuZ2UgYmluZGluZyBpZiBoYXMgZmlsdGVyIG9yIGlmIGZpbHRlciBpcyB1bmRlZmluZWQgKCE9PSAwKSAtIHdoaWNoXG5cdFx0XHRcdFx0Ly8gaXMgdGhlIGNhc2UgZm9yIHRvcC1sZXZlbCBjYWxscyBvciBmb3IgbmVzdGVkIGFycmF5IChhcnJheSBpdGVtIG9mIGFuIGFycmF5IC0gZS5nLiBtZW1iZXIgb2YgMi1kaW1lbnNpb25hbCBhcnJheSkuXG5cdFx0XHRcdFx0Ly8gRm9yIGFycmF5IHByb3BlcnRpZXMgbG93ZXIgaW4gdGhlIHRyZWUsIHdpdGggbm8gZmlsdGVyLCBmaWx0ZXIgaXMgc2V0IHRvIDAgaW4gZmlsdGVyQW5kT2JzZXJ2ZUFsbCwgc28gbm8gYXJyYXlDaGFuZ2UgYmluZGluZyBoZXJlLFxuXHRcdFx0XHRcdC8vIHNpbmNlIHRoZXkgZ2V0IGFycmF5Q2hhbmdlIGJpbmRpbmcgYWRkZWQgZHVyaW5nIHJlZ3VsYXIgJC5vYnNlcnZlKGFycmF5IC4uLikgYmluZGluZy5cblx0XHRcdFx0XHR3cmFwcGVkQ2IuX2NJZCA9IGdldENiS2V5KGNiKTsgLy8gSWRlbnRpZnkgd3JhcHBlZCBjYWxsYmFjayB3aXRoIHVud3JhcHBlZCBjYWxsYmFjaywgc28gdW5vYnNlcnZlQWxsIHdpbGxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIHByZXZpb3VzIG9ic2VydmVBbGwgd3JhcHBlZCBjYWxsYmFjaywgaWYgaW5uZXIgY2FsbGJhY2sgd2FzIHRoZSBzYW1lO1xuXHRcdFx0XHRcdGlmIChub3RSZW1vdmluZykge1xuXHRcdFx0XHRcdFx0JG9ic2VydmUobmFtZXNwYWNlLCBvYmplY3QsIGlzT2JqZWN0LCB3cmFwcGVkQ2IsIHVub2JzZXJ2ZSwgZmlsdGVyLCBuZXh0UGFyZW50T2JzLCBhbGxQYXRoKTtcblx0XHRcdFx0XHRcdG9iSWQgPSAkZGF0YShvYmplY3QpLm9iSWQ7XG5cdFx0XHRcdFx0XHRvYmpNYXBbb2JJZF0gPSAob2JqTWFwW29iSWRdIHx8IDApICsgMTsgLy8gUmVnaXN0ZXIgb24gbWFwIG9mIG9iamVjdHMgb2JzZXJ2ZWQvdW5vYnNlcnZlZCBieSB0aGlzIG9ic2VydmVBbGwvdW5vYnNlcnZlQWxsIGNhbGxcblx0XHRcdFx0XHRcdFx0Ly8tIG9yIHJlbW92ZSBmcm9tIG1hcCBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSBvYnNlcnZlQWxsIGNhbGwuIChBdm9pZCBkdXBzLCBmb3IgY3ljbGljIGdyYXBocylcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKC0tb2JqTWFwWyRkYXRhKG9iamVjdCkub2JJZF0pIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgb24gbWFwIG9mIG9iamVjdHMgb2JzZXJ2ZWQvdW5vYnNlcnZlZCBieSB0aGlzIG9ic2VydmVBbGwvdW5vYnNlcnZlQWxsIGNhbGxcblx0XHRcdFx0XHRcdFx0Ly8tIG9yIHJlbW92ZSBmcm9tIG1hcCBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSBvYnNlcnZlQWxsIGNhbGwuIChBdm9pZCBkdXBzLCBmb3IgY3ljbGljIGdyYXBocylcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0JG9ic2VydmUobmFtZXNwYWNlLCBvYmplY3QsIGlzT2JqZWN0LCB3cmFwcGVkQ2IsIHVub2JzZXJ2ZSwgZmlsdGVyLCBuZXh0UGFyZW50T2JzLCBhbGxQYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5vIGNhbGxiYWNrLiBKdXN0IHVub2JzZXJ2ZSBpZiB1bm9ic2VydmUgPT09IHRydWUuXG5cdFx0XHRcdGlmIChvYmpNYXApIHtcblx0XHRcdFx0XHRvYmpNYXBbJGRhdGEob2JqZWN0KS5vYklkXSA9IDE7IC8vIFJlZ2lzdGVyIG9uIG1hcCBvZiBvYmplY3RzIHVub2JzZXJ2ZWQgYnkgdGhpcyB1bm9ic2VydmVBbGwgY2FsbC4gKEF2b2lkIGR1cHMsIGZvciBjeWNsaWMgZ3JhcGhzKVxuXHRcdFx0XHR9XG5cdFx0XHRcdCRvYnNlcnZlKG5hbWVzcGFjZSwgb2JqZWN0LCBpc09iamVjdCwgdW5kZWZpbmVkLCB1bm9ic2VydmUsIGZpbHRlciwgbmV4dFBhcmVudE9icywgYWxsUGF0aCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc09iamVjdCkge1xuXHRcdFx0XHQvLyBDb250aW51ZSBzdGVwcGluZyB0aHJvdWdoIG9iamVjdCBncmFwaCwgb2JzZXJ2aW5nIG9iamVjdCBhbmQgYXJyYXlzXG5cdFx0XHRcdC8vIFRvIG92ZXJyaWRlIGZpbHRlcmluZywgcGFzcyBpbiBmaWx0ZXIgZnVuY3Rpb24sIG9yIHJlcGxhY2UgJC5vYnNlcnZhYmxlLl9mbHRyXG5cdFx0XHRcdGZvciAobCBpbiBvYmplY3QpIHtcblx0XHRcdFx0XHRuZXdBbGxQYXRoID0gYWxsUGF0aCArIFwiLlwiICsgbDtcblx0XHRcdFx0XHRmaWx0ZXJBbmRPYnNlcnZlQWxsKG9iamVjdCwgbCwgdW5vYnNlcnZlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHsgLy8gT2JzZXJ2ZSBpdGVtcyBpbiBBcnJheVxuXHRcdFx0XHRvYnNlcnZlQXJyYXlJdGVtcyhvYmplY3QsIHVub2JzZXJ2ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHNoYWxsb3dGaWx0ZXIgPSBmdW5jdGlvbihhbGxQYXRoIC8qLCBvYmplY3QsIHBhcmVudE9icyovKSB7XG5cdFx0cmV0dXJuIGFsbFBhdGguaW5kZXhPZihcIi5cIikgPCAwICYmIGFsbFBhdGguaW5kZXhPZihcIltcIikgPCAwO1xuXHR9LFxuXG5cdCR1bm9ic2VydmUgPSBmdW5jdGlvbigpIHtcblx0XHRbXS5wdXNoLmNhbGwoYXJndW1lbnRzLCB0cnVlKTsgLy8gQWRkIHRydWUgYXMgYWRkaXRpb25hbCBmaW5hbCBhcmd1bWVudFxuXHRcdHJldHVybiAkb2JzZXJ2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHR9O1xuXG5cdCRvYnNlcnZlID0gZnVuY3Rpb24oKSB7XG5cdFx0Ly8gJC5vYnNlcnZlKFtuYW1lc3BhY2UsIF1yb290LCBbMSBvciBtb3JlIG9iamVjdHMsIHBhdGggb3IgcGF0aCBBcnJheSBwYXJhbXMuLi5dLCBjYWxsYmFja1ssIGNvbnRleHRDYWxsYmFja11bLCB1bm9ic2VydmVdKVxuXG5cdFx0ZnVuY3Rpb24gaW5uZXJPYnNlcnZlKCkge1xuXG5cdFx0XHRmdW5jdGlvbiBvYnNlcnZlT25PZmYobmFtZXNwYWNlLCBwYXRoU3RyLCBpc0FycmF5QmluZGluZywgb2ZmKSB7XG5cdFx0XHRcdHZhciBqLCBldkRhdGEsXG5cdFx0XHRcdFx0b2JJZEV4cGFuZG8gPSAkaGFzRGF0YShvYmplY3QpLFxuXHRcdFx0XHRcdGJvdW5kT2JPckFyciA9IHdyYXBBcnJheShvYmplY3QpLFxuXHRcdFx0XHRcdHBybnRPYnMgPSBwYXJlbnRPYnMsXG5cdFx0XHRcdFx0YWxsUHRoID0gYWxsUGF0aDtcblxuXHRcdFx0XHRuYW1lc3BhY2UgPSBpbml0aWFsTnMgPyBuYW1lc3BhY2UgKyBcIi5cIiArIGluaXRpYWxOcyA6IG5hbWVzcGFjZTtcblxuXHRcdFx0XHRpZiAoIXVub2JzZXJ2ZSAmJiAob2ZmIHx8IGlzQXJyYXlCaW5kaW5nKSkge1xuXHRcdFx0XHRcdGV2ZW50cyA9IG9iSWRFeHBhbmRvICYmICQuX2RhdGEob2JqZWN0KTtcblx0XHRcdFx0XHRldmVudHMgPSBldmVudHMgJiYgZXZlbnRzLmV2ZW50cztcblx0XHRcdFx0XHRldmVudHMgPSBldmVudHMgJiYgZXZlbnRzW2lzQXJyYXlCaW5kaW5nID8gYXJyYXlDaGFuZ2VTdHIgOiBwcm9wZXJ0eUNoYW5nZVN0cl07XG5cdFx0XHRcdFx0ZWwgPSBldmVudHMgJiYgZXZlbnRzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoZWwtLSkgeyAvLyBTa2lwIGR1cGxpY2F0ZXNcblx0XHRcdFx0XHRcdGRhdGEgPSBldmVudHNbZWxdICYmIGV2ZW50c1tlbF0uZGF0YTtcblx0XHRcdFx0XHRcdGlmIChkYXRhICYmIChvZmYgJiYgZGF0YS5ucyAhPT0gaW5pdGlhbE5zXG5cdFx0XHRcdFx0XHRcdC8vIFdoZW4gb2JzZXJ2aW5nLCBkb24ndCB1bmJpbmQgZHVwcyB1bmxlc3MgdGhleSBoYXZlIHRoZSBzYW1lIG5hbWVzcGFjZVxuXHRcdFx0XHRcdFx0XHR8fCAhb2ZmICYmIGRhdGEubnMgPT09IGluaXRpYWxOcyAmJiBkYXRhLmNiICYmIGRhdGEuY2IuX2NJZCA9PT0gY2FsbGJhY2suX2NJZCkpXG5cdFx0XHRcdFx0XHRcdC8vIFdoZW4gb2JzZXJ2aW5nIGFuZCBkb2luZyBhcnJheSBiaW5kaW5nLCBkb24ndCBiaW5kIGR1cHMgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG5hbWVzcGFjZSAoRHVwcyBjYW4gaGFwcGVuIGUuZy4gd2l0aCB7Xntmb3IgcGVvcGxlIH5mb289cGVvcGxlfX0pXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHVub2JzZXJ2ZSB8fCBvZmYpIHtcblx0XHRcdFx0XHQkKGJvdW5kT2JPckFycikub2ZmKG5hbWVzcGFjZSwgb25PYnNlcnZhYmxlQ2hhbmdlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRldkRhdGEgPSBpc0FycmF5QmluZGluZyA/IHt9XG5cdFx0XHRcdFx0XHQ6IHtcblx0XHRcdFx0XHRcdFx0ZnVsbFBhdGg6IHBhdGgsXG5cdFx0XHRcdFx0XHRcdHBhdGhzOiBwYXRoU3RyID8gW3BhdGhTdHJdIDogW10sXG5cdFx0XHRcdFx0XHRcdHByb3A6IHByb3Bcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0ZXZEYXRhLm5zID0gaW5pdGlhbE5zO1xuXHRcdFx0XHRcdGV2RGF0YS5jYiA9IGNhbGxiYWNrO1xuXG5cdFx0XHRcdFx0aWYgKGFsbFBhdGgpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYW4gb2JzZXJ2ZUFsbCBjYWxsXG5cdFx0XHRcdFx0XHRldkRhdGEub2JzZXJ2ZUFsbCA9IHtcblx0XHRcdFx0XHRcdFx0X3BhdGg6IGFsbFB0aCxcblx0XHRcdFx0XHRcdFx0cGF0aDogZnVuY3Rpb24oKSB7IC8vIFN0ZXAgdGhyb3VnaCBwYXRoIGFuZCBwYXJlbnRPYnMgcGFyZW50IGNoYWluLCByZXBsYWNpbmcgJ1tdJyBieSAnW25dJyBiYXNlZCBvbiBjdXJyZW50IGluZGV4IG9mIG9iamVjdHMgaW4gcGFyZW50IGFycmF5cy5cblx0XHRcdFx0XHRcdFx0XHRqID0gcHJudE9icy5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFsbFB0aC5yZXBsYWNlKC9bWy5dL2csIGZ1bmN0aW9uKGFsbCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ai0tO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFsbCA9PT0gXCJbXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyBcIltcIiArICQuaW5BcnJheShwcm50T2JzW2ogLSAxXSwgcHJudE9ic1tqXSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBcIi5cIjtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0cGFyZW50czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHBybnRPYnM7IC8vIFRoZSBjaGFpbiBvZiBwYXJlbnRzIGJldHdlZW4gdGhlIG1vZGlmaWVkIG9iamVjdCBhbmQgdGhlIHJvb3Qgb2JqZWN0IHVzZWQgaW4gdGhlIG9ic2VydmVBbGwoKSBjYWxsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGZpbHRlcjogZmlsdGVyXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQkKGJvdW5kT2JPckFycikub24obmFtZXNwYWNlLCBudWxsLCBldkRhdGEsIG9uT2JzZXJ2YWJsZUNoYW5nZSk7XG5cdFx0XHRcdFx0aWYgKGNiQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdC8vIEFkZCBvYmplY3QgdG8gY2JCaW5kaW5nc1xuXHRcdFx0XHRcdFx0Y2JCaW5kaW5nc1skZGF0YShvYmplY3QpLm9iSWQgfHwgJGRhdGEob2JqZWN0LCBcIm9iSWRcIiwgb2JzZXJ2ZU9iaktleSsrKV0gPSBvYmplY3Q7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGdldElubmVyQ2IoZXhwck9iKSB7XG5cdFx0XHRcdC8vIFJldHVybnMgdGhlIGlubmVyQ2IgdXNlZCBmb3IgdXBkYXRpbmcgYSBjb21wdXRlZCBpbiBhIGNvbXBpbGVkIGV4cHJlc3Npb24gKHNldHRpbmcgdGhlIG5ldyBpbnN0YW5jZSBhcyBleHByT2Iub2IsIHVub2JzZXJ2aW5nIHRoZSBwcmV2aW91cyBvYmplY3QsXG5cdFx0XHRcdC8vIGFuZCBvYnNlcnZpbmcgdGhlIG5ldyBvbmUpLCB0aGVuIGNhbGxpbmcgdGhlIG91dGVyQ0IgLSBpLmUuIHRoZSBoYW5kbGVyIGZvciB0aGUgd2hvbGUgY29tcGlsZWQgZXhwcmVzc2lvbi5cblx0XHRcdFx0Ly8gSW5pdGlhbGl6ZWQgZXhwck9iLm9iIHRvIHRoZSBjdXJyZW50IG9iamVjdC5cblx0XHRcdFx0Ly8gVXNlcyB0aGUgY29udGV4dENiIGNhbGxiYWNrIHRvIGV4ZWN1dGUgdGhlIGNvbXBpbGVkIGV4cHJPYiB0ZW1wbGF0ZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgdmlldy9kYXRhIGV0Yy4gdG8gZ2V0IHRoZSByZXR1cm5lZCB2YWx1ZSwgdHlwaWNhbGx5IGFuIG9iamVjdCBvciBhcnJheS5cblx0XHRcdFx0Ly8gSWYgaXQgaXMgYW4gYXJyYXksIHJlZ2lzdGVycyBhcnJheSBiaW5kaW5nXG5cdFx0XHRcdHZhciBvcmlnUnQgPSByb290O1xuXHRcdFx0XHQvLyBOb3RlOiBGb3IganN2aWV3cy9pc3N1ZXMvMjkyIGN0eENiIHdpbGwgbmVlZCB2YXIgY3R4Q2IgPSBjb250ZXh0Q2IgfHwgZnVuY3Rpb24oZXhwck9iLCBvcmlnUnQpIHtyZXR1cm4gZXhwck9iLl9qc3Yob3JpZ1J0KTt9O1xuXG5cdFx0XHRcdGV4cHJPYi5vYiA9IGNvbnRleHRDYihleHByT2IsIG9yaWdSdCk7IC8vIEluaXRpYWxpemUgb2JqZWN0XG5cblx0XHRcdFx0cmV0dXJuIGV4cHJPYi5jYiA9IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MpIHtcblx0XHRcdFx0XHR2YXIgb2JqID0gZXhwck9iLm9iLCAvLyBUaGUgb2xkIG9iamVjdFxuXHRcdFx0XHRcdFx0c3ViID0gZXhwck9iLnNiLFxuXHRcdFx0XHRcdFx0bmV3T2JqID0gY29udGV4dENiKGV4cHJPYiwgb3JpZ1J0KTtcblxuXHRcdFx0XHRcdGlmIChuZXdPYmogIT09IG9iaikge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBvYmogPT09IE9CSkVDVCkge1xuXHRcdFx0XHRcdFx0XHRiaW5kQXJyYXkob2JqLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0aWYgKHN1YiB8fCBhbGxvd0FycmF5ICYmICRpc0FycmF5KG9iaikpIHtcblx0XHRcdFx0XHRcdFx0XHRpbm5lck9ic2VydmUoW29ial0sIHN1YiwgY2FsbGJhY2ssIGNvbnRleHRDYiwgdHJ1ZSk7IC8vIHVub2JzZXJ2ZSBvbiB0aGUgb2xkIG9iamVjdFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRleHByT2Iub2IgPSBuZXdPYmo7XG5cdFx0XHRcdFx0XHQvLyBQdXQgdGhlIHVwZGF0ZWQgb2JqZWN0IGluc3RhbmNlIG9udG8gdGhlIGV4cHJPYiBpbiB0aGUgcGF0aHMgYXJyYXksIHNvIHN1YnNlcXVlbnQgc3RyaW5nIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGlzIG9iamVjdFxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBuZXdPYmogPT09IE9CSkVDVCkge1xuXHRcdFx0XHRcdFx0XHRiaW5kQXJyYXkobmV3T2JqKTtcblx0XHRcdFx0XHRcdFx0aWYgKHN1YiB8fCBhbGxvd0FycmF5ICYmICRpc0FycmF5KG5ld09iaikpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBSZWdpc3RlciBhcnJheSBiaW5kaW5nXG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtuZXdPYmpdLCBzdWIsIGNhbGxiYWNrLCBjb250ZXh0Q2IpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIENhbGwgdGhlIG91dGVyQ2IgLSB0byBleGVjdXRlIHRoZSBjb21waWxlZCBleHByZXNzaW9uIHRoYXQgdGhpcyBjb21wdXRlZCBpcyBwYXJ0IG9mXG5cdFx0XHRcdFx0Y2FsbGJhY2soZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGJpbmRBcnJheShhcnIsIHVuYmluZCwgaXNBcnJheSwgcmVsUGF0aCkge1xuXHRcdFx0XHRpZiAoYWxsb3dBcnJheSkge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBjYWxsIHRvIG9ic2VydmUgdGhhdCBkb2VzIG5vdCBjb21lIGZyb20gb2JzZXJ2ZUFuZEJpbmQgKHRhZyBiaW5kaW5nKSwgc28gd2UgYWxsb3cgYXJyYXlDaGFuZ2UgYmluZGluZ1xuXHRcdFx0XHRcdHZhciBwcmV2T2JqID0gb2JqZWN0LFxuXHRcdFx0XHRcdFx0cHJldkFsbFBhdGggPSBhbGxQYXRoO1xuXG5cdFx0XHRcdFx0b2JqZWN0ID0gYXJyO1xuXHRcdFx0XHRcdGlmIChyZWxQYXRoKSB7XG5cdFx0XHRcdFx0XHRvYmplY3QgPSBhcnJbcmVsUGF0aF07XG5cdFx0XHRcdFx0XHRhbGxQYXRoICs9IFwiLlwiICsgcmVsUGF0aDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGZpbHRlciAmJiBvYmplY3QpIHtcblx0XHRcdFx0XHRcdG9iamVjdCA9ICRvYnNlcnZhYmxlLl9mbHRyKGFsbFBhdGgsIG9iamVjdCwgcmVsUGF0aCA/IFthcnJdLmNvbmNhdChwYXJlbnRPYnMpIDogcGFyZW50T2JzLCBmaWx0ZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob2JqZWN0ICYmIChpc0FycmF5IHx8ICRpc0FycmF5KG9iamVjdCkpKSB7XG5cdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYoYXJyYXlDaGFuZ2VTdHIgKyBcIi5vYnNlcnZlXCIgKyAoY2FsbGJhY2sgPyBnZXRDYktleShjYWxsYmFjaykgOiBcIlwiKSwgdW5kZWZpbmVkLCB0cnVlLCB1bmJpbmQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvYmplY3QgPSBwcmV2T2JqO1xuXHRcdFx0XHRcdGFsbFBhdGggPSBwcmV2QWxsUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaSwgcCwgc2tpcCwgcGFydHMsIHByb3AsIHBhdGgsIGRlcCwgdW5vYnNlcnZlLCBjYWxsYmFjaywgY2JJZCwgaW5JZCwgZWwsIGRhdGEsIGV2ZW50cywgY29udGV4dENiLCBpdGVtcywgY2JCaW5kaW5ncyxcblx0XHRcdFx0ZGVwdGgsIGlubmVyQ2IsIHBhcmVudE9icywgYWxsUGF0aCwgZmlsdGVyLCBpbml0TnNBcnIsIGluaXROc0Fyckxlbixcblx0XHRcdFx0bnMgPSBvYnNlcnZlU3RyLFxuXHRcdFx0XHRwYXRocyA9IHRoaXMgIT0gMSAvLyBVc2luZyAhPSBmb3IgSUU8MTAgYnVnLSBzZWUganN2aWV3cy9pc3N1ZXMvMjM3XG5cdFx0XHRcdFx0PyBjb25jYXQuYXBwbHkoW10sIGFyZ3VtZW50cykgLy8gRmxhdHRlbiB0aGUgYXJndW1lbnRzIC0gdGhpcyBpcyBhICdyZWN1cnNpdmUgY2FsbCcgd2l0aCBwYXJhbXMgdXNpbmcgdGhlICd3cmFwcGVkIGFycmF5J1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBzdHlsZSAtIHN1Y2ggYXMgaW5uZXJPYnNlcnZlKFtvYmplY3RdLCBwYXRoLnBhdGgsIFtvcmlnUm9vdF0sIHBhdGgucHJtLCBpbm5lckNiLCAuLi4pO1xuXHRcdFx0XHRcdDogc2xpY2UuY2FsbChhcmd1bWVudHMpLCAvLyBEb24ndCBmbGF0dGVuIC0gdGhpcyBpcyB0aGUgZmlyc3QgJ3RvcC1sZXZlbCBjYWxsLCB0byBpbm5lck9ic2VydmUuYXBwbHkoMSwgcGF0aHMpXG5cdFx0XHRcdGxhc3RBcmcgPSBwYXRocy5wb3AoKSB8fCBmYWxzZSxcblx0XHRcdFx0cm9vdCA9IHBhdGhzLnNoaWZ0KCksXG5cdFx0XHRcdG9iamVjdCA9IHJvb3QsXG5cdFx0XHRcdGwgPSBwYXRocy5sZW5ndGg7XG5cblx0XHRcdGlmIChsYXN0QXJnICsgXCJcIiA9PT0gbGFzdEFyZykgeyAvLyBJZiBsYXN0IGFyZyBpcyBhIHN0cmluZyB0aGVuIHRoaXMgb2JzZXJ2ZSBjYWxsIGlzIHBhcnQgb2YgYW4gb2JzZXJ2ZUFsbCBjYWxsLFxuXHRcdFx0XHRhbGxQYXRoID0gbGFzdEFyZzsgICAgICAgICAgLy8gYW5kIHRoZSBsYXN0IHRocmVlIGFyZ3MgYXJlIHRoZSBwYXJlbnRPYnMgYXJyYXksIHRoZSBmaWx0ZXIsIGFuZCB0aGUgYWxsUGF0aCBzdHJpbmcuXG5cdFx0XHRcdHBhcmVudE9icyA9IHBhdGhzLnBvcCgpO1xuXHRcdFx0XHRmaWx0ZXIgPSBwYXRocy5wb3AoKTtcblx0XHRcdFx0bGFzdEFyZyA9ICEhcGF0aHMucG9wKCk7IC8vIHVub2JzZXJ2ZVxuXHRcdFx0XHRsIC09IDM7XG5cdFx0XHR9XG5cdFx0XHRpZiAobGFzdEFyZyA9PT0gISFsYXN0QXJnKSB7XG5cdFx0XHRcdHVub2JzZXJ2ZSA9IGxhc3RBcmc7XG5cdFx0XHRcdGxhc3RBcmcgPSBwYXRoc1tsLTFdO1xuXHRcdFx0XHRsYXN0QXJnID0gbCAmJiBsYXN0QXJnICsgXCJcIiAhPT0gbGFzdEFyZyAmJiAoIWxhc3RBcmcgfHwgJGlzRnVuY3Rpb24obGFzdEFyZykpID8gKGwtLSwgcGF0aHMucG9wKCkpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAodW5vYnNlcnZlICYmICFsICYmICRpc0Z1bmN0aW9uKHJvb3QpKSB7XG5cdFx0XHRcdFx0bGFzdEFyZyA9IHJvb3Q7XG5cdFx0XHRcdFx0cm9vdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y2FsbGJhY2sgPSBsYXN0QXJnO1xuXHRcdFx0aWYgKGwgJiYgJGlzRnVuY3Rpb24ocGF0aHNbbCAtIDFdKSkge1xuXHRcdFx0XHRjb250ZXh0Q2IgPSBjYWxsYmFjaztcblx0XHRcdFx0Y2FsbGJhY2sgPSBwYXRocy5wb3AoKTtcblx0XHRcdFx0bC0tO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodW5vYnNlcnZlICYmIGNhbGxiYWNrICYmICFjYWxsYmFjay5fY0lkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXNlIGEgdW5pcXVlIG5hbWVzcGFjZSAoZS5nLiBvYnM3KSBhc3NvY2lhdGVkIHdpdGggZWFjaCBvYnNlcnZlKCkgY2FsbGJhY2sgdG8gYWxsb3cgdW5vYnNlcnZlIHRvIHJlbW92ZSBoYW5kbGVyc1xuXHRcdFx0bnMgKz0gY2FsbGJhY2tcblx0XHRcdFx0PyAoKGluSWQgPSBjYWxsYmFjay5faW5JZCB8fCBcIlwiKSwgdW5vYnNlcnZlKVxuXHRcdFx0XHRcdD8gY2FsbGJhY2suX2NJZCArIGluSWRcblx0XHRcdFx0XHQ6IChjYklkID0gZ2V0Q2JLZXkoY2FsbGJhY2spKSArIGluSWRcblx0XHRcdFx0OiBcIlwiO1xuXG5cdFx0XHRpZiAoY2JJZCAmJiAhdW5vYnNlcnZlKSB7XG5cdFx0XHRcdGNiQmluZGluZ3MgPSBjYkJpbmRpbmdzU3RvcmVbY2JJZF0gPSBjYkJpbmRpbmdzU3RvcmVbY2JJZF0gfHwge307XG5cdFx0XHR9XG5cblx0XHRcdGluaXROc0FyciA9IGluaXRpYWxOcyAmJiBpbml0aWFsTnMubWF0Y2gock5vdFdoaXRlKSB8fCBbXCJcIl07XG5cdFx0XHRpbml0TnNBcnJMZW4gPSBpbml0TnNBcnIubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoaW5pdE5zQXJyTGVuLS0pIHtcblx0XHRcdFx0aW5pdGlhbE5zID0gaW5pdE5zQXJyW2luaXROc0Fyckxlbl07XG5cdFx0XHRcdGlmIChyb290ICYmIChwYXRoID0gcGF0aHNbMF0sICFwYXRoIHx8IHBhdGggKyBcIlwiICE9PSBwYXRoKSkge1xuXHRcdFx0XHRcdGlmICgkaXNBcnJheShyb290KSkge1xuXHRcdFx0XHRcdFx0YmluZEFycmF5KHJvb3QsIHVub2JzZXJ2ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh1bm9ic2VydmUpIHtcblx0XHRcdFx0XHRcdC8vIHJlbW92ZSBvbk9ic2VydmFibGVDaGFuZ2UgaGFuZGxlcnMgdGhhdCB3cmFwIHRoYXQgY2FsbGJhY2tcblx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh1bm9ic2VydmUgJiYgIWwgJiYgIXJvb3QpIHsgLy8gdW5vYnNlcnZlKCkgLSB1bm9ic2VydmVzIGFsbFxuXHRcdFx0XHRcdGZvciAocCBpbiBjYkJpbmRpbmdzU3RvcmUpIHtcblx0XHRcdFx0XHRcdHAgPSBjYkJpbmRpbmdzU3RvcmVbcF07XG5cdFx0XHRcdFx0XHRmb3IgKGRhdGEgaW4gcCkge1xuXHRcdFx0XHRcdFx0XHRvYmplY3QgPSBwW2RhdGFdO1xuXHRcdFx0XHRcdFx0XHRpZiAoJGlzQXJyYXkob2JqZWN0KSkge1xuXHRcdFx0XHRcdFx0XHRcdGJpbmRBcnJheShvYmplY3QsIHVub2JzZXJ2ZSwgdW5vYnNlcnZlKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgb25PYnNlcnZhYmxlQ2hhbmdlIGhhbmRsZXJzIHRoYXQgd3JhcCB0aGF0IGNhbGxiYWNrXG5cdFx0XHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zLCBcIlwiKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRkZXB0aCA9IDA7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRwYXRoID0gcGF0aHNbaV07XG5cdFx0XHRcdFx0aWYgKHBhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvYmplY3QgPSByb290O1xuXHRcdFx0XHRcdGlmIChcIlwiICsgcGF0aCA9PT0gcGF0aCkge1xuXHRcdFx0XHRcdFx0Ly8gQ29uc2lkZXIgc3VwcG9ydCBmb3IgY29tcHV0ZWQgcGF0aHM6IGpzdmlld3MvaXNzdWVzLzI5MlxuXHRcdFx0XHRcdFx0Ly9pZiAoL1tcXChcXFtcXCtdLy50ZXN0KHBhdGgpKSB7XG5cdFx0XHRcdFx0XHQvL1x0dmFyIGI9e2xpbmtzOnt9fSwgdCA9ICRzdWIudG1wbEZuKFwiezpcIitwYXRoK1wifVwiLCBiLCB0cnVlKSwgaXRlbXMgPSB0LnBhdGhzWzBdO1xuXHRcdFx0XHRcdFx0Ly9cdGwgKz0gaXRlbXMubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdC8vXHRzcGxpY2UuYXBwbHkocGF0aHMsIFtpLS0sIDFdLmNvbmNhdChpdGVtcykpO1xuXHRcdFx0XHRcdFx0Ly9cdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0Ly99XG5cdFx0XHRcdFx0XHRwYXJ0cyA9IHBhdGguc3BsaXQoXCJeXCIpO1xuXHRcdFx0XHRcdFx0aWYgKHBhcnRzWzFdKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdlIGJpbmQgdGhlIGxlYWYsIHBsdXMgYWRkaXRpb25hbCBub2RlcyBiYXNlZCBvbiBkZXB0aC5cblx0XHRcdFx0XHRcdFx0Ly8gXCJhLmIuY15kLmVcIiBpcyBkZXB0aCAyLCBzbyBsaXN0ZW5zIHRvIGNoYW5nZXMgb2YgZSwgcGx1cyBjaGFuZ2VzIG9mIGQgYW5kIG9mIGNcblx0XHRcdFx0XHRcdFx0ZGVwdGggPSBwYXJ0c1swXS5zcGxpdChcIi5cIikubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gcGFydHMuam9pbihcIi5cIik7XG5cdFx0XHRcdFx0XHRcdGRlcHRoID0gcGF0aC5zcGxpdChcIi5cIikubGVuZ3RoIC0gZGVwdGg7XG5cdFx0XHRcdFx0XHRcdC8vIGlmIG1vcmUgdGhhbiBvbmUgXiBpbiB0aGUgcGF0aCwgdGhlIGZpcnN0IG9uZSBkZXRlcm1pbmVzIGRlcHRoXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoY29udGV4dENiICYmIChpdGVtcyA9IGNvbnRleHRDYihwYXRoLCByb290LCBkZXB0aCkpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBhcnJheSBvZiBvYmplY3RzIGFuZCBwYXRocyByZXR1cm5lZCBieSBjb250ZXh0Q2IgaXMgbm9uIGVtcHR5LCBpbnNlcnQgdGhlbVxuXHRcdFx0XHRcdFx0XHQvLyBpbnRvIHRoZSBzZXF1ZW5jZSwgcmVwbGFjaW5nIHRoZSBjdXJyZW50IGl0ZW0gKHBhdGgpLiBPdGhlcndpc2Ugc2ltcGx5IHJlbW92ZSBjdXJyZW50IGl0ZW0gKHBhdGgpXG5cdFx0XHRcdFx0XHRcdGwgKz0gaXRlbXMubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdFx0c3BsaWNlLmFwcGx5KHBhdGhzLCBbaS0tLCAxXS5jb25jYXQoaXRlbXMpKTtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoISRpc0Z1bmN0aW9uKHBhdGgpKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChwYXRoICYmIHBhdGguX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBjb21waWxlZCBmdW5jdGlvbiBmb3IgYmluZGluZyB0byBhbiBvYmplY3QgcmV0dXJuZWQgYnkgYSBoZWxwZXIvZGF0YSBmdW5jdGlvbi5cblx0XHRcdFx0XHRcdFx0XHQvLyBTZXQgY3VycmVudCBvYmplY3Qgb24gZXhwck9iLm9iLCBhbmQgZ2V0IGlubmVyQ2IgZm9yIHVwZGF0aW5nIHRoZSBvYmplY3Rcblx0XHRcdFx0XHRcdFx0XHRpbm5lckNiID0gdW5vYnNlcnZlID8gcGF0aC5jYiA6IGdldElubmVyQ2IocGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJDYi5ub0FycmF5ID0gIWFsbG93QXJyYXk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gaW5uZXJDYi5fY3R4ID0gY2FsbGJhY2suX2N0eDsgQ291bGQgcGFzcyBjb250ZXh0IChlLmcuIGxpbmtDdHgpIGZvciB1c2UgaW4gYSBkZXBlbmRzID0gZnVuY3Rpb24oKSB7fSBjYWxsLCBzbyBkZXBlbmRzIGlzIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGxpbmtDdHgnc1xuXHRcdFx0XHRcdFx0XHRcdGlubmVyQ2IuX2NJZCA9IGNhbGxiYWNrLl9jSWQ7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2V0IHRoZSBzYW1lIGNiQmluZGluZ3NTdG9yZSBrZXkgYXMgZm9yIGNhbGxiYWNrLCBzbyB3aGVuIGNhbGxiYWNrIGlzIGRpc3Bvc2VkLCBkaXNwb3NhbCBvZiBpbm5lckNiIGhhcHBlbnMgdG9vLlxuXHRcdFx0XHRcdFx0XHRcdGlubmVyQ2IuX2luSWQgPSBpbm5lckNiLl9pbklkIHx8IFwiLm9iSW5cIiArIG9ic2VydmVJbm5lckNiS2V5Kys7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhdGguYm5kIHx8IHBhdGgucHJtICYmIHBhdGgucHJtLmxlbmd0aCB8fCAhcGF0aC5zYikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGV4cHJPYiBpcyBib3VuZCBlLmcuIGZvbygpXnN1Yi5wYXRoLCBvciBoYXMgcGFyYW1ldGVycyBlLmcuIGZvbyhiYXIpIG9yIGlzIGEgbGVhZiBvYmplY3QgKHNvIG5vIHN1YiBwYXRoKSBlLmcuIGZvbygpXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0aGVuIG9ic2VydmUgY2hhbmdlcyBvbiB0aGUgb2JqZWN0LCBvciBpdHMgcGFyYW1ldGVycyBhbmQgc3ViLXBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbb2JqZWN0XSwgcGF0aC5wYXRoLCBbb3JpZ1Jvb3RdLCBwYXRoLnBybSwgaW5uZXJDYiwgY29udGV4dENiLCB1bm9ic2VydmUpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAocGF0aC5zYikgeyAvLyBzdWJQYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRpbm5lck9ic2VydmUoW3BhdGgub2JdLCBwYXRoLnNiLCBjYWxsYmFjaywgY29udGV4dENiLCB1bm9ic2VydmUpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRwYXRoID0gb3JpZ1Jvb3Q7XG5cdFx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG9iamVjdCA9IHBhdGg7IC8vIEZvciB0b3AtbGV2ZWwgY2FsbHMsIG9iamVjdHMgaW4gdGhlIHBhdGhzIGFycmF5IGJlY29tZSB0aGUgb3JpZ1Jvb3QgZm9yIHN1YnNlcXVlbnQgcGF0aHMuXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHBhcnRzID0gW3Jvb3QgPSBwYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKG9iamVjdCAmJiAocHJvcCA9IHBhcnRzLnNoaWZ0KCkpICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2Ygb2JqZWN0ID09PSBPQkpFQ1QpIHtcblx0XHRcdFx0XHRcdFx0aWYgKFwiXCIgKyBwcm9wID09PSBwcm9wKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHByb3AgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoKHBhcnRzLmxlbmd0aCA8IGRlcHRoICsgMSkgJiYgIW9iamVjdC5ub2RlVHlwZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQWRkIG9ic2VydmVyIGZvciBlYWNoIHRva2VuIGluIHBhdGggc3RhcnRpbmcgYXQgZGVwdGgsIGFuZCBvbiB0byB0aGUgbGVhZlxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCF1bm9ic2VydmUgJiYgKGV2ZW50cyA9ICRoYXNEYXRhKG9iamVjdCkgJiYgJC5fZGF0YShvYmplY3QpKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRldmVudHMgPSBldmVudHMuZXZlbnRzO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRldmVudHMgPSBldmVudHMgJiYgZXZlbnRzW3Byb3BlcnR5Q2hhbmdlU3RyXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwgPSBldmVudHMgJiYgZXZlbnRzLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2tpcCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdoaWxlIChlbC0tKSB7IC8vIFNraXAgZHVwbGljYXRlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGEgPSBldmVudHNbZWxdLmRhdGE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGRhdGFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCYmIGRhdGEubnMgPT09IGluaXRpYWxOc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JiYgZGF0YS5jYi5fY0lkID09PSBjYWxsYmFjay5fY0lkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQmJiBkYXRhLmNiLl9pbklkID09PSBjYWxsYmFjay5faW5JZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JiYgKGRhdGEucHJvcCA9PT0gcHJvcCB8fCBkYXRhLnByb3AgPT09IFwiKlwiIHx8IGRhdGEucHJvcCA9PT0gXCIqKlwiKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHAgPSBwYXJ0cy5qb2luKFwiLlwiKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhLnBhdGhzLnB1c2gocCk7IC8vIFdlIHdpbGwgc2tpcCB0aGlzIGJpbmRpbmcsIGJ1dCBpZiBpdCBpcyBub3QgYSBsZWFmIGJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIG5lZWQgdG8ga2VlcCBiaW5kaW5ncyBmb3IgcmVzdCBvZiBwYXRoLCByZWFkeSBmb3IgaWYgdGhlIG9iamVjdCBnZXRzIHN3YXBwZWQuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRza2lwKys7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChza2lwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRHVwbGljYXRlIGJpbmRpbmcocykgZm91bmQsIHNvIG1vdmUgb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvYmplY3QgPSBvYmplY3RbcHJvcF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wID09PSBcIipcIiB8fCBwcm9wID09PSBcIioqXCIpIHsgLy8gXCIqXCIgPT4gYWxsIHByb3BlcnRpZXMuIFwiKipcIiA9PiBhbGwgcHJvcGVydGllcyBhbmQgc3ViLXByb3BlcnRpZXMgKGkuZS4gZGVlcCBvYnNlcnZlQWxsIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXVub2JzZXJ2ZSAmJiBldmVudHMgJiYgZXZlbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFJlbW92ZSBleGlzdGluZyBiaW5kaW5ncywgc2luY2UgdGhleSB3aWxsIGJlIGR1cGxpY2F0ZXMgd2l0aCBcIipcIiBvciBcIioqXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIsIGZhbHNlLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocHJvcCA9PT0gXCIqXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIpOyAvLyBvYnNlcnZlIHRoZSBvYmplY3QgZm9yIGFueSBwcm9wZXJ0eSBjaGFuZ2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHAgaW4gb2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBvYnNlcnZpbmcgXCIqXCI6IFNvIChpbiBhZGRpdGlvbiB0byBsaXN0ZW5pbmcgdG8gcHJvcCBjaGFuZ2UsIGFib3ZlKSBsaXN0ZW4gdG8gYXJyYXljaGFuZ2Ugb24gcHJvcHMgb2YgdHlwZSBhcnJheVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHAgIT09ICRleHBhbmRvKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJpbmRBcnJheShvYmplY3QsIHVub2JzZXJ2ZSwgdW5kZWZpbmVkLCBwKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JC5vYnNlcnZhYmxlKGluaXRpYWxOcywgb2JqZWN0KVsodW5vYnNlcnZlID8gXCJ1blwiIDogXCJcIikgKyBcIm9ic2VydmVBbGxcIl0oY2FsbGJhY2spOyAvLyBvYnNlcnZlIG9yIHVub2JzZXJ2ZSB0aGUgb2JqZWN0IGZvciBhbnkgcHJvcGVydHkgY2hhbmdlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHByb3ApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zICsgXCIucF9cIiArIHByb3AsIHBhcnRzLmpvaW4oXCJeXCIpKTsgLy8gQnkgdXNpbmcgXCJeXCIgcmF0aGVyIHRoYW4gXCIuXCIgd2UgZW5zdXJlIHRoYXQgZGVlcCBiaW5kaW5nIHdpbGwgYmUgdXNlZCBvbiBuZXdseSBpbnNlcnRlZCBvYmplY3QgZ3JhcGhzXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChhbGxQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhbGxQYXRoICs9IFwiLlwiICsgcHJvcDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cHJvcCA9IG9iamVjdFtwcm9wXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAoJGlzRnVuY3Rpb24ocHJvcCkpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZGVwID0gcHJvcC5kZXBlbmRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY29tcHV0ZWQgb2JzZXJ2YWJsZS4gV2Ugd2lsbCBvYnNlcnZlIGFueSBkZWNsYXJlZCBkZXBlbmRlbmNpZXNcblx0XHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbb2JqZWN0XSwgcmVzb2x2ZVBhdGhPYmplY3RzKGRlcCwgb2JqZWN0LCBjYWxsYmFjayksIGNhbGxiYWNrLCBjb250ZXh0Q2IsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG9iamVjdCA9IHByb3A7XG5cdFx0XHRcdFx0XHRcdGlmICh1bm9ic2VydmUgJiYgb2JqZWN0ID09PSByb290ICYmIChpPmwtMiB8fCBwYXRoc1tpKzFdICsgXCJcIiAhPT0gcGF0aHNbaSsxXSkpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyB1bm9ic2VydmUgYWxsIGhhbmRsZXJzIG9mIG9iamVjdCwgaWYgbm90IGZvbGxvd2VkIGJ5IHN0cmluZyBwYXRoLlxuXHRcdFx0XHRcdFx0XHRcdC8vIGUuZy4kLnVub2JzZXJ2ZShvYmplY3QxLCBvYmplY3QyLCBcInBhdGhcIiwgb2JqZWN0Mykgd2lsbCB1bm9ic2VydmUgYWxsIGZyb20gb2JqZWN0MSBhbmQgb2JqZWN0MywgYW5kIGp1c3QgXCJwYXRoXCIgbGlzdGVuZXIgZnJvbSBvYmplY3QyXG5cdFx0XHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zLCBcIlwiKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRiaW5kQXJyYXkob2JqZWN0LCB1bm9ic2VydmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoY2JJZCkge1xuXHRcdFx0XHRyZW1vdmVDYkJpbmRpbmdzKGNiQmluZGluZ3MsIGNiSWQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gdGhlIGNiQmluZGluZ3MgdG8gdGhlIHRvcC1sZXZlbCBjYWxsZXIsIGFsb25nIHdpdGggdGhlIGNiSWRcblx0XHRcdHJldHVybiB7Y2JJZDogY2JJZCwgYm5kOiBjYkJpbmRpbmdzfTtcblx0XHR9XG5cblx0XHR2YXIgaW5pdGlhbE5zLFxuXHRcdFx0YWxsb3dBcnJheSA9IHRoaXMgIT0gZmFsc2UsIC8vIElmIHRoaXMgPT09IGZhbHNlLCB0aGlzIGlzIGEgY2FsbCBmcm9tIG9ic2VydmVBbmRCaW5kIC0gZG9pbmcgYmluZGluZyBvZiBkYXRhbGluayBleHByZXNzaW9ucy4gV2UgZG9uJ3QgYmluZFxuXHRcdFx0Ly8gYXJyYXlDaGFuZ2UgZXZlbnRzIGluIHRoaXMgc2NlbmFyaW8uIEluc3RlYWQsIHtee2Zvcn19IGFuZCBzaW1pbGFyIGRvIHNwZWNpZmljIGFycmF5Q2hhbmdlIGJpbmRpbmcgdG8gdGhlIHRhZ0N0eC5hcmdzWzBdIHZhbHVlLCBpbiBvbkFmdGVyTGluay5cblx0XHRcdC8vIE5vdGUgZGVsaWJlcmF0ZWx5IHVzaW5nIHRoaXMgIT0gZmFsc2UsIHJhdGhlciB0aGFuIHRoaXMgIT09IGZhbHNlIGJlY2F1c2Ugb2YgSUU8MTAgYnVnLSBzZWUganN2aWV3cy9pc3N1ZXMvMjM3XG5cdFx0XHRwYXRocyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKSxcblx0XHRcdG9yaWdSb290ID0gcGF0aHNbMF07XG5cblx0XHRpZiAob3JpZ1Jvb3QgKyBcIlwiID09PSBvcmlnUm9vdCAmJiBhbGxvd0FycmF5KSB7XG5cdFx0XHRpbml0aWFsTnMgPSBvcmlnUm9vdDsgLy8gVGhlIGZpcnN0IGFyZyBpcyBhIG5hbWVzcGFjZSwgc2luY2UgaXQgaXMgYSBzdHJpbmcsIGFuZCB0aGlzIGNhbGwgaXMgbm90IGZyb20gb2JzZXJ2ZUFuZEJpbmRcblx0XHRcdHBhdGhzLnNoaWZ0KCk7XG5cdFx0XHRvcmlnUm9vdCA9IHBhdGhzWzBdO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbm5lck9ic2VydmUuYXBwbHkoMSwgcGF0aHMpO1xuXHR9O1xuXG5cdCRvYnNlcnZhYmxlID0gZnVuY3Rpb24obnMsIGRhdGEpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0ZGF0YSA9IG5zO1xuXHRcdFx0bnMgPSBcIlwiO1xuXHRcdH1cblx0XHRyZXR1cm4gJGlzQXJyYXkoZGF0YSlcblx0XHRcdD8gbmV3IEFycmF5T2JzZXJ2YWJsZShucywgZGF0YSlcblx0XHRcdDogbmV3IE9iamVjdE9ic2VydmFibGUobnMsIGRhdGEpO1xuXHR9O1xuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCRzdWIuZ2V0RGVwcyA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBhcmdzID0gYXJndW1lbnRzO1xuXHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBhcmcsIGRlcCxcblx0XHRcdFx0ZGVwcyA9IFtdLFxuXHRcdFx0XHRsID0gYXJncy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdGFyZyA9IGFyZ3NbbC0tXTtcblx0XHRcdFx0ZGVwID0gYXJnc1tsXTtcblx0XHRcdFx0aWYgKGRlcCkge1xuXHRcdFx0XHRcdGRlcHMgPSBkZXBzLmNvbmNhdCgkaXNGdW5jdGlvbihkZXApID8gZGVwKGFyZywgYXJnKSA6IGRlcCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBkZXBzO1xuXHRcdH07XG5cdH07XG5cblx0JC5vYnNlcnZhYmxlID0gJG9ic2VydmFibGU7XG5cdCRvYnNlcnZhYmxlLl9mbHRyID0gZnVuY3Rpb24oYWxsUGF0aCwgb2JqZWN0LCBwYXJlbnRPYnMsIGZpbHRlcikge1xuXHRcdGlmIChmaWx0ZXIgJiYgJGlzRnVuY3Rpb24oZmlsdGVyKVxuXHRcdFx0PyBmaWx0ZXIoYWxsUGF0aCwgb2JqZWN0LCBwYXJlbnRPYnMpXG5cdFx0XHQ6IHRydWUgLy8gVE9ETyBDb25zaWRlciBzdXBwb3J0aW5nIGZpbHRlciBiZWluZyBhIHN0cmluZyBvciBzdHJpbmdzIHRvIGRvIFJlZ0V4IGZpbHRlcmluZyBiYXNlZCBvbiBrZXkgYW5kL29yIGFsbFBhdGhcblx0XHQpIHtcblx0XHRcdG9iamVjdCA9ICRpc0Z1bmN0aW9uKG9iamVjdClcblx0XHRcdFx0PyBvYmplY3Quc2V0ICYmIG9iamVjdC5jYWxsKHBhcmVudE9ic1swXSkgLy8gSXQgaXMgYSBnZXR0ZXIvc2V0dGVyXG5cdFx0XHRcdDogb2JqZWN0O1xuXHRcdFx0cmV0dXJuIHR5cGVvZiBvYmplY3QgPT09IE9CSkVDVCAmJiBvYmplY3Q7XG5cdFx0fVxuXHR9O1xuXG5cdCRvYnNlcnZhYmxlLk9iamVjdCA9IE9iamVjdE9ic2VydmFibGU7XG5cdCRvYnNlcnZhYmxlLkFycmF5ID0gQXJyYXlPYnNlcnZhYmxlO1xuXHQkLm9ic2VydmUgPSAkb2JzZXJ2YWJsZS5vYnNlcnZlID0gJG9ic2VydmU7XG5cdCQudW5vYnNlcnZlID0gJG9ic2VydmFibGUudW5vYnNlcnZlID0gJHVub2JzZXJ2ZTtcblx0JG9ic2VydmFibGUuX2FwcGx5ID0gb2JzZXJ2ZV9hcHBseTtcblxuXHRPYmplY3RPYnNlcnZhYmxlLnByb3RvdHlwZSA9IHtcblx0XHRfZGF0YTogbnVsbCxcblxuXHRcdG9ic2VydmVBbGw6ICRvYnNlcnZlQWxsLFxuXHRcdHVub2JzZXJ2ZUFsbDogJHVub2JzZXJ2ZUFsbCxcblxuXHRcdGRhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2RhdGE7XG5cdFx0fSxcblxuXHRcdHNldFByb3BlcnR5OiBmdW5jdGlvbihwYXRoLCB2YWx1ZSwgbm9uU3RyaWN0KSB7XG5cdFx0XHRwYXRoID0gcGF0aCB8fCBcIlwiO1xuXHRcdFx0dmFyIGtleSwgcGFpciwgcGFydHMsXG5cdFx0XHRcdG11bHRpID0gcGF0aCArIFwiXCIgIT09IHBhdGgsXG5cdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRvYmplY3QgPSBzZWxmLl9kYXRhO1xuXG5cdFx0XHRpZiAob2JqZWN0KSB7XG5cdFx0XHRcdGlmIChtdWx0aSkge1xuXHRcdFx0XHRcdG5vblN0cmljdCA9IHZhbHVlO1xuXHRcdFx0XHRcdGlmICgkaXNBcnJheShwYXRoKSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyB0aGUgYXJyYXkgZm9ybWF0IGdlbmVyYXRlZCBieSBzZXJpYWxpemVBcnJheS4gSG93ZXZlciwgdGhpcyBoYXMgdGhlIHByb2JsZW0gdGhhdCBpdCBjb2VyY2VzIHR5cGVzIHRvIHN0cmluZyxcblx0XHRcdFx0XHRcdC8vIGFuZCBkb2VzIG5vdCBwcm92aWRlIHNpbXBsZSBzdXBwb3J0IG9mIGNvbnZlcnRUbyBhbmQgY29udmVydEZyb20gZnVuY3Rpb25zLlxuXHRcdFx0XHRcdFx0a2V5ID0gcGF0aC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoa2V5LS0pIHtcblx0XHRcdFx0XHRcdFx0cGFpciA9IHBhdGhba2V5XTtcblx0XHRcdFx0XHRcdFx0c2VsZi5zZXRQcm9wZXJ0eShwYWlyLm5hbWUsIHBhaXIudmFsdWUsIG5vblN0cmljdCA9PT0gdW5kZWZpbmVkIHx8IG5vblN0cmljdCk7IC8vSWYgbm9uU3RyaWN0IG5vdCBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gT2JqZWN0IHJlcHJlc2VudGF0aW9uIHdoZXJlIHByb3BlcnR5IG5hbWUgaXMgcGF0aCBhbmQgcHJvcGVydHkgdmFsdWUgaXMgdmFsdWUuXG5cdFx0XHRcdFx0XHRmb3IgKGtleSBpbiBwYXRoKSB7XG5cdFx0XHRcdFx0XHRcdHNlbGYuc2V0UHJvcGVydHkoa2V5LCBwYXRoW2tleV0sIG5vblN0cmljdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHBhdGggIT09ICRleHBhbmRvKSB7XG5cdFx0XHRcdFx0Ly8gU2ltcGxlIHNpbmdsZSBwcm9wZXJ0eSBjYXNlLlxuXHRcdFx0XHRcdHBhcnRzID0gcGF0aC5zcGxpdCgvWy5eXS8pO1xuXHRcdFx0XHRcdHdoaWxlIChvYmplY3QgJiYgcGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0b2JqZWN0ID0gb2JqZWN0W3BhcnRzLnNoaWZ0KCldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRzZWxmLl9zZXRQcm9wZXJ0eShvYmplY3QsIHBhcnRzWzBdLCB2YWx1ZSwgbm9uU3RyaWN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBzZWxmO1xuXHRcdH0sXG5cblx0XHRyZW1vdmVQcm9wZXJ0eTogZnVuY3Rpb24ocGF0aCkge1xuXHRcdFx0dGhpcy5zZXRQcm9wZXJ0eShwYXRoLCByZW1vdmUpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblxuXHRcdF9zZXRQcm9wZXJ0eTogZnVuY3Rpb24obGVhZiwgcGF0aCwgdmFsdWUsIG5vblN0cmljdCkge1xuXHRcdFx0dmFyIHNldHRlciwgZ2V0dGVyLCByZW1vdmVQcm9wLFxuXHRcdFx0XHRwcm9wZXJ0eSA9IHBhdGggPyBsZWFmW3BhdGhdIDogbGVhZjtcblxuXHRcdFx0aWYgKCRpc0Z1bmN0aW9uKHByb3BlcnR5KSkge1xuXHRcdFx0XHRpZiAocHJvcGVydHkuc2V0KSB7XG5cdFx0XHRcdFx0Ly8gQ2FzZSBvZiBwcm9wZXJ0eSBzZXR0ZXIvZ2V0dGVyIC0gd2l0aCBjb252ZW50aW9uIHRoYXQgcHJvcGVydHkgaXMgZ2V0dGVyIGFuZCBwcm9wZXJ0eS5zZXQgaXMgc2V0dGVyXG5cdFx0XHRcdFx0bGVhZiA9IGxlYWYuX3dycCAgLy8gQ2FzZSBvZiBKc1ZpZXdzIDItd2F5IGRhdGEtbGlua2luZyB0byBhIGhlbHBlciBmdW5jdGlvbiBhcyBnZXR0ZXIsIHdpdGggYSBzZXR0ZXIuXG5cdFx0XHRcdFx0XHQvLyBUaGUgdmlldyB3aWxsIGJlIHRoZSB0aGlzIHBvaW50ZXIgZm9yIGdldHRlciBhbmQgc2V0dGVyLiBOb3RlOiB0aGlzIGlzIHRoZSBvbmUgc2NlbmFyaW8gd2hlcmUgcGF0aCBpcyBcIlwiLlxuXHRcdFx0XHRcdFx0fHwgbGVhZjtcblx0XHRcdFx0XHRnZXR0ZXIgPSBwcm9wZXJ0eTtcblx0XHRcdFx0XHRzZXR0ZXIgPSBnZXR0ZXIuc2V0ID09PSB0cnVlID8gZ2V0dGVyIDogZ2V0dGVyLnNldDtcblx0XHRcdFx0XHRwcm9wZXJ0eSA9IGdldHRlci5jYWxsKGxlYWYpOyAvLyBnZXQgLSBvbmx5IHRyZWF0ZWQgYXMgZ2V0dGVyIGlmIGFsc28gYSBzZXR0ZXIuIE90aGVyd2lzZSBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBvZiB0eXBlIGZ1bmN0aW9uLiBTZWUgdW5pdCB0ZXN0cyAnQ2FuIG9ic2VydmUgcHJvcGVydGllcyBvZiB0eXBlIGZ1bmN0aW9uJy5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHJvcGVydHkgIT09IHZhbHVlIHx8IG5vblN0cmljdCAmJiBwcm9wZXJ0eSAhPSB2YWx1ZSkgeyAvLyBPcHRpb25hbCBub24tc3RyaWN0IGVxdWFsaXR5LCBzaW5jZSBzZXJpYWxpemVBcnJheSwgYW5kIGZvcm0tYmFzZWQgZWRpdG9ycyBjYW4gbWFwIG51bWJlcnMgdG8gc3RyaW5ncywgZXRjLlxuXHRcdFx0XHQvLyBEYXRlIG9iamVjdHMgZG9uJ3Qgc3VwcG9ydCAhPSBjb21wYXJpc29uLiBUcmVhdCBhcyBzcGVjaWFsIGNhc2UuXG5cdFx0XHRcdGlmICghKHByb3BlcnR5IGluc3RhbmNlb2YgRGF0ZSkgfHwgcHJvcGVydHkgPiB2YWx1ZSB8fCBwcm9wZXJ0eSA8IHZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKHNldHRlcikge1xuXHRcdFx0XHRcdFx0c2V0dGVyLmNhbGwobGVhZiwgdmFsdWUpOyAgIC8vc2V0XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGdldHRlci5jYWxsKGxlYWYpOyAgLy9nZXQgdXBkYXRlZCB2YWx1ZVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAocmVtb3ZlUHJvcCA9IHZhbHVlID09PSByZW1vdmUpIHtcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBsZWFmW3BhdGhdO1xuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHBhdGggPSB1bmRlZmluZWQ7IC8vIElmIHZhbHVlIHdhcyBhbHJlYWR5IHVuZGVmaW5lZCwgZG9uJ3QgdHJpZ2dlciBoYW5kbGVyIGZvciByZW1vdmVQcm9wXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChwYXRoKSB7XG5cdFx0XHRcdFx0XHRsZWFmW3BhdGhdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwYXRoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl90cmlnZ2VyKGxlYWYsIHtjaGFuZ2U6IFwic2V0XCIsIHBhdGg6IHBhdGgsIHZhbHVlOiB2YWx1ZSwgb2xkVmFsdWU6IHByb3BlcnR5LCByZW1vdmU6IHJlbW92ZVByb3B9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0X3RyaWdnZXI6IGZ1bmN0aW9uKHRhcmdldCwgZXZlbnRBcmdzKSB7XG5cdFx0XHQkKHRhcmdldCkudHJpZ2dlckhhbmRsZXIocHJvcGVydHlDaGFuZ2VTdHIgKyAodGhpcy5fbnMgPyBcIi5cIiArIC9eXFxTKy8uZXhlYyh0aGlzLl9ucylbMF0gOiBcIlwiKSwgZXZlbnRBcmdzKTsgLy8gSWYgd2hpdGUtc3BhY2Ugc2VwYXJhdGVkIG5hbWVzcGFjZXMsIHVzZSBmaXJzdCBvbmUgb25seVxuXHRcdH1cblx0fTtcblxuXHRBcnJheU9ic2VydmFibGUucHJvdG90eXBlID0ge1xuXHRcdF9kYXRhOiBudWxsLFxuXG5cdFx0b2JzZXJ2ZUFsbDogJG9ic2VydmVBbGwsXG5cdFx0dW5vYnNlcnZlQWxsOiAkdW5vYnNlcnZlQWxsLFxuXG5cdFx0ZGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZGF0YTtcblx0XHR9LFxuXG5cdFx0aW5zZXJ0OiBmdW5jdGlvbihpbmRleCwgZGF0YSkge1xuXHRcdFx0dmFyIF9kYXRhID0gdGhpcy5fZGF0YTtcblx0XHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdGRhdGEgPSBpbmRleDtcblx0XHRcdFx0aW5kZXggPSBfZGF0YS5sZW5ndGg7XG5cdFx0XHR9XG5cdFx0XHRpbmRleCA9IFBBUlNFSU5UKGluZGV4KTtcblx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdGRhdGEgPSAkaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV07XG5cdFx0XHRcdC8vIGRhdGEgY2FuIGJlIGEgc2luZ2xlIGl0ZW0gKGluY2x1ZGluZyBhIG51bGwvdW5kZWZpbmVkIHZhbHVlKSBvciBhbiBhcnJheSBvZiBpdGVtcy5cblx0XHRcdFx0Ly8gTm90ZSB0aGUgcHJvdmlkZWQgaXRlbXMgYXJlIGluc2VydGVkIHdpdGhvdXQgYmVpbmcgY2xvbmVkLCBhcyBkaXJlY3QgcmVmZXJlbmNlcyB0byB0aGUgcHJvdmlkZWQgb2JqZWN0c1xuXG5cdFx0XHRcdGlmIChkYXRhLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRoaXMuX2luc2VydChpbmRleCwgZGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfaW5zZXJ0OiBmdW5jdGlvbihpbmRleCwgZGF0YSkge1xuXHRcdFx0dmFyIF9kYXRhID0gdGhpcy5fZGF0YSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gX2RhdGEubGVuZ3RoO1xuXHRcdFx0aWYgKGluZGV4ID4gb2xkTGVuZ3RoKSB7XG5cdFx0XHRcdGluZGV4ID0gb2xkTGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0c3BsaWNlLmFwcGx5KF9kYXRhLCBbaW5kZXgsIDBdLmNvbmNhdChkYXRhKSk7XG5cdFx0XHR0aGlzLl90cmlnZ2VyKHtjaGFuZ2U6IFwiaW5zZXJ0XCIsIGluZGV4OiBpbmRleCwgaXRlbXM6IGRhdGF9LCBvbGRMZW5ndGgpO1xuXHRcdH0sXG5cblx0XHRyZW1vdmU6IGZ1bmN0aW9uKGluZGV4LCBudW1Ub1JlbW92ZSkge1xuXHRcdFx0dmFyIGl0ZW1zLFxuXHRcdFx0XHRfZGF0YSA9IHRoaXMuX2RhdGE7XG5cblx0XHRcdGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGluZGV4ID0gX2RhdGEubGVuZ3RoIC0gMTtcblx0XHRcdH1cblxuXHRcdFx0aW5kZXggPSBQQVJTRUlOVChpbmRleCk7XG5cdFx0XHRudW1Ub1JlbW92ZSA9IG51bVRvUmVtb3ZlID8gUEFSU0VJTlQobnVtVG9SZW1vdmUpIDogbnVtVG9SZW1vdmUgPT09IDAgPyAwIDogMTsgLy8gaWYgbnVsbCBvciB1bmRlZmluZWQ6IHJlbW92ZSAxXG5cdFx0XHRpZiAobnVtVG9SZW1vdmUgPiAwICYmIGluZGV4ID4gLTEpIHtcblx0XHRcdFx0aXRlbXMgPSBfZGF0YS5zbGljZShpbmRleCwgaW5kZXggKyBudW1Ub1JlbW92ZSk7XG5cdFx0XHRcdGlmIChudW1Ub1JlbW92ZSA9IGl0ZW1zLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZShpbmRleCwgbnVtVG9SZW1vdmUsIGl0ZW1zKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblxuXHRcdF9yZW1vdmU6IGZ1bmN0aW9uKGluZGV4LCBudW1Ub1JlbW92ZSwgaXRlbXMpIHtcblx0XHRcdHZhciBfZGF0YSA9IHRoaXMuX2RhdGEsXG5cdFx0XHRcdG9sZExlbmd0aCA9IF9kYXRhLmxlbmd0aDtcblxuXHRcdFx0X2RhdGEuc3BsaWNlKGluZGV4LCBudW1Ub1JlbW92ZSk7XG5cdFx0XHR0aGlzLl90cmlnZ2VyKHtjaGFuZ2U6IFwicmVtb3ZlXCIsIGluZGV4OiBpbmRleCwgaXRlbXM6IGl0ZW1zfSwgb2xkTGVuZ3RoKTtcblx0XHR9LFxuXG5cdFx0bW92ZTogZnVuY3Rpb24ob2xkSW5kZXgsIG5ld0luZGV4LCBudW1Ub01vdmUpIHtcblx0XHRcdG51bVRvTW92ZSA9IG51bVRvTW92ZSA/IFBBUlNFSU5UKG51bVRvTW92ZSkgOiBudW1Ub01vdmUgPT09IDAgPyAwIDogMTsgLy8gaWYgbnVsbCBvciB1bmRlZmluZWQ6IG1vdmUgMVxuXHRcdFx0b2xkSW5kZXggPSBQQVJTRUlOVChvbGRJbmRleCk7XG5cdFx0XHRuZXdJbmRleCA9IFBBUlNFSU5UKG5ld0luZGV4KTtcblxuXHRcdFx0aWYgKG51bVRvTW92ZSA+IDAgJiYgb2xkSW5kZXggPiAtMSAmJiBuZXdJbmRleCA+IC0xICYmIG9sZEluZGV4ICE9PSBuZXdJbmRleCkge1xuXHRcdFx0XHR0aGlzLl9tb3ZlKG9sZEluZGV4LCBuZXdJbmRleCwgbnVtVG9Nb3ZlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfbW92ZTogZnVuY3Rpb24ob2xkSW5kZXgsIG5ld0luZGV4LCBudW1Ub01vdmUpIHtcblx0XHRcdHZhciBpdGVtcyxcblx0XHRcdFx0X2RhdGEgPSB0aGlzLl9kYXRhLFxuXHRcdFx0XHRvbGRMZW5ndGggPSBfZGF0YS5sZW5ndGgsXG5cdFx0XHRcdGV4Y2VzcyA9IG9sZEluZGV4ICsgbnVtVG9Nb3ZlIC0gb2xkTGVuZ3RoO1xuXHRcdFx0aWYgKGV4Y2VzcyA+IDApIHtcblx0XHRcdFx0bnVtVG9Nb3ZlIC09IGV4Y2Vzcztcblx0XHRcdH1cblx0XHRcdGlmIChudW1Ub01vdmUpIHtcblx0XHRcdFx0aXRlbXMgPSBfZGF0YS5zcGxpY2Uob2xkSW5kZXgsIG51bVRvTW92ZSk7IC8vIHJlbW92ZVxuXHRcdFx0XHRpZiAobmV3SW5kZXggPiBfZGF0YS5sZW5ndGgpIHtcblx0XHRcdFx0XHRuZXdJbmRleCA9IF9kYXRhLmxlbmd0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRzcGxpY2UuYXBwbHkoX2RhdGEsIFtuZXdJbmRleCwgMF0uY29uY2F0KGl0ZW1zKSk7IC8vcmUtaW5zZXJ0XG5cdFx0XHRcdHRoaXMuX3RyaWdnZXIoe2NoYW5nZTogXCJtb3ZlXCIsIG9sZEluZGV4OiBvbGRJbmRleCwgaW5kZXg6IG5ld0luZGV4LCBpdGVtczogaXRlbXN9LCBvbGRMZW5ndGgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRyZWZyZXNoOiBmdW5jdGlvbihuZXdJdGVtcywgc29ydCkge1xuXHRcdFx0ZnVuY3Rpb24gaW5zZXJ0QWRkZWQoKSB7XG5cdFx0XHRcdGlmIChrKSB7XG5cdFx0XHRcdFx0c2VsZi5pbnNlcnQoai1rLCBhZGRlZEl0ZW1zKTsgLy8gTm90IGZvdW5kIGluIG9yaWdpbmFsIGFycmF5IC0gc28gaW5zZXJ0XG5cdFx0XHRcdFx0ZGF0YUxlbmd0aCArPSBrO1xuXHRcdFx0XHRcdGkgKz0gaztcblx0XHRcdFx0XHRrID0gMDtcblx0XHRcdFx0XHRhZGRlZEl0ZW1zID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yIHJlZnJlc2ggb3BlcmF0aW9uIHdlIGl0ZXJhdGl2ZWx5IHN0ZXAgdGhyb3VnaCB0aGUgdGFyZ2V0IGFycmF5IGFuZCBzb3J0IGJ5IG1vdmUvYWRkL3JlbW92ZSBvcGVyYXRpb25zIG9uIHRoZSBzb3VyY2UgYXJyYXkgdW50aWwgdGhleSBtYXRjaFxuXHRcdFx0dmFyIGksIGosIGssIG5ld0l0ZW0sIG51bSxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdGFkZGVkSXRlbXMgPSBbXSxcblx0XHRcdFx0ZGF0YSA9IHNlbGYuX2RhdGEsXG5cdFx0XHRcdG9sZEl0ZW1zID0gZGF0YS5zbGljZSgpLFxuXHRcdFx0XHRvbGRMZW5ndGggPSBkYXRhLmxlbmd0aCxcblx0XHRcdFx0ZGF0YUxlbmd0aCA9IG9sZExlbmd0aCxcblx0XHRcdFx0bmV3TGVuZ3RoID0gbmV3SXRlbXMubGVuZ3RoO1xuXHRcdFx0c2VsZi5fc3J0ID0gdHJ1ZTsgLy8gRmxhZyBmb3Igc29ydGluZyBkdXJpbmcgcmVmcmVzaFxuXHRcdFx0Zm9yIChqPWs9MDsgajxuZXdMZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAoKG5ld0l0ZW0gPSBuZXdJdGVtc1tqXSkgPT09IGRhdGFbai1rXSkge1xuXHRcdFx0XHRcdFx0aW5zZXJ0QWRkZWQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmb3IgKGk9ai1rOyBpPGRhdGFMZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0aWYgKG5ld0l0ZW0gPT09IGRhdGFbaV0pIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpPGRhdGFMZW5ndGgpIHtcblx0XHRcdFx0XHRcdGluc2VydEFkZGVkKCk7XG5cdFx0XHRcdFx0XHRudW0gPSAwO1xuXHRcdFx0XHRcdFx0d2hpbGUgKG51bSsrIDwgbmV3TGVuZ3RoLWkgJiYgbmV3SXRlbXNbaitudW1dID09PSBkYXRhW2krbnVtXSk7XG5cdFx0XHRcdFx0XHRzZWxmLm1vdmUoaSwgaiwgbnVtKTsgLy8gRm91bmQgbmV3SXRlbSBpbiBvcmlnaW5hbCBhcnJheSAtIHNvIG1vdmUgaXQgdG8gbmV3IHBvc2l0aW9uXG5cdFx0XHRcdFx0XHRqICs9IG51bSAtIDE7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGsrKztcblx0XHRcdFx0XHRcdGFkZGVkSXRlbXMucHVzaChuZXdJdGVtKTsgLy8gTm90IGZvdW5kIGluIG9yaWdpbmFsIGFycmF5IC0gc28gaW5zZXJ0XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpbnNlcnRBZGRlZCgpO1xuXHRcdFx0aWYgKGRhdGFMZW5ndGggPiBqKSB7XG5cdFx0XHRcdHNlbGYucmVtb3ZlKGosIGRhdGFMZW5ndGggLSBqKTtcblx0XHRcdH1cblx0XHRcdHNlbGYuX3NydCA9IHVuZGVmaW5lZDsgLy8gV2UgaGF2ZSBmaW5pc2hlZCBzb3J0IG9wZXJhdGlvbnMgZHVyaW5nIHJlZnJlc2hcblx0XHRcdHNlbGYuX3RyaWdnZXIoe2NoYW5nZTogXCJyZWZyZXNoXCIsIG9sZEl0ZW1zOiBvbGRJdGVtc30sIG9sZExlbmd0aCk7XG5cdFx0XHRyZXR1cm4gc2VsZjtcblx0XHR9LFxuXG5cdFx0X3RyaWdnZXI6IGZ1bmN0aW9uKGV2ZW50QXJncywgb2xkTGVuZ3RoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdF9kYXRhID0gc2VsZi5fZGF0YSxcblx0XHRcdFx0bGVuZ3RoID0gX2RhdGEubGVuZ3RoLFxuXHRcdFx0XHQkX2RhdGEgPSAkKFtfZGF0YV0pO1xuXHRcdFx0aWYgKHNlbGYuX3NydCkge1xuXHRcdFx0XHRldmVudEFyZ3MucmVmcmVzaCA9IHRydWU7IC8vIFdlIGFyZSBzb3J0aW5nIGR1cmluZyByZWZyZXNoXG5cdFx0XHR9IGVsc2UgaWYgKGxlbmd0aCAhPT0gb2xkTGVuZ3RoKSB7ICAvLyBXZSBoYXZlIGZpbmlzaGVkIHNvcnQgb3BlcmF0aW9ucyBkdXJpbmcgcmVmcmVzaFxuXHRcdFx0XHQkX2RhdGEudHJpZ2dlckhhbmRsZXIocHJvcGVydHlDaGFuZ2VTdHIsIHtjaGFuZ2U6IFwic2V0XCIsIHBhdGg6IFwibGVuZ3RoXCIsIHZhbHVlOiBsZW5ndGgsIG9sZFZhbHVlOiBvbGRMZW5ndGh9KTtcblx0XHRcdH1cblx0XHRcdCRfZGF0YS50cmlnZ2VySGFuZGxlcihhcnJheUNoYW5nZVN0ciArIChzZWxmLl9ucyA/IFwiLlwiICsgL15cXFMrLy5leGVjKHNlbGYuX25zKVswXSA6IFwiXCIpLCBldmVudEFyZ3MpOyAvLyBJZiB3aGl0ZS1zcGFjZSBzZXBhcmF0ZWQgbmFtZXNwYWNlcywgdXNlIGZpcnN0IG9uZSBvbmx5XG5cdFx0fVxuXHR9O1xuXG5cdCRldmVudFNwZWNpYWxbcHJvcGVydHlDaGFuZ2VTdHJdID0gJGV2ZW50U3BlY2lhbFthcnJheUNoYW5nZVN0cl0gPSB7XG5cdFx0Ly8gUmVnaXN0ZXIgYSBqUXVlcnkgc3BlY2lhbCAncmVtb3ZlJyBldmVudCwgdG8gYWNjZXNzIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBoYW5kbGVycyBiZWluZyByZW1vdmVkIGJ5IGpRdWVyeS5vZmYoKS5cblx0XHQvLyBXZSBnZXQgZGF0YS5jYi5fY0lkIGZyb20gdGhlIGV2ZW50IGhhbmRsZU9iaiBhbmQgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIGNiQmluZGluZ3MgaGFzaCBmcm9tIHRoZSBjYkJpbmRpbmdzU3RvcmUsXG5cdFx0Ly8gdGhlbiByZW1vdmUgdGhpcyBvYmplY3QgZnJvbSB0aGF0IGJpbmRpbmdzIGhhc2ggLSBpZiB0aGUgb2JqZWN0IGRvZXMgbm90IGhhdmUgYW55IG90aGVyIGhhbmRsZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBjYWxsYmFjay5cblx0XHRyZW1vdmU6IGZ1bmN0aW9uIChoYW5kbGVPYmopIHtcblx0XHRcdHZhciBjYkJpbmRpbmdzLCBmb3VuZCwgZXZlbnRzLCBsLCBkYXRhLFxuXHRcdFx0XHRldkRhdGEgPSBoYW5kbGVPYmouZGF0YTtcblx0XHRcdGlmICgoZXZEYXRhKSAmJiAoZXZEYXRhLm9mZiA9IHRydWUsIGV2RGF0YSA9IGV2RGF0YS5jYikpIHsgLy9TZXQgb2ZmID0gdHJ1ZSBhcyBtYXJrZXIgZm9yIGRpc3Bvc2VkIGV2ZW50XG5cdFx0XHRcdC8vIEdldCB0aGUgY2IuX2NJZCBmcm9tIGhhbmRsZU9iai5kYXRhLmNiLl9jSWRcblx0XHRcdFx0aWYgKGNiQmluZGluZ3MgPSBjYkJpbmRpbmdzU3RvcmVbZXZEYXRhLl9jSWRdKSB7XG5cdFx0XHRcdFx0Ly8gVGhlcmUgd2VyZSBiaW5kaW5ncyBmb3IgdGhpcyBjYWxsYmFjay4gSWYgdGhpcyB3YXMgdGhlIGxhc3Qgb25lLCB3ZSdsbCByZW1vdmUgaXQuXG5cdFx0XHRcdFx0ZXZlbnRzID0gJC5fZGF0YSh0aGlzKS5ldmVudHNbaGFuZGxlT2JqLnR5cGVdO1xuXHRcdFx0XHRcdGwgPSBldmVudHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChsLS0gJiYgIWZvdW5kKSB7XG5cdFx0XHRcdFx0XHRmb3VuZCA9IChkYXRhID0gZXZlbnRzW2xdLmRhdGEpICYmIGRhdGEuY2IgJiYgZGF0YS5jYi5fY0lkID09PSBldkRhdGEuX2NJZDtcblx0XHRcdFx0XHRcdC8vIEZvdW5kIGFub3RoZXIgb25lIHdpdGggc2FtZSBjYWxsYmFjayAodGhvdWdoIG1heSBiZSBhIGRpZmZlcmVudCBpbm5lckNhbGxiYWNrKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIHdhcyB0aGUgbGFzdCBoYW5kbGVyIGZvciB0aGlzIGNhbGxiYWNrIGFuZCBvYmplY3QsIHNvIHJlbW92ZSB0aGUgYmluZGluZyBlbnRyeVxuXHRcdFx0XHRcdFx0ZGVsZXRlIGNiQmluZGluZ3NbJGRhdGEodGhpcykub2JJZF07XG5cdFx0XHRcdFx0XHRyZW1vdmVDYkJpbmRpbmdzKGNiQmluZGluZ3MsIGV2RGF0YS5fY0lkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0JHZpZXdzLm1hcCA9IGZ1bmN0aW9uKG1hcERlZikge1xuXHRcdGZ1bmN0aW9uIE1hcChzb3VyY2UsIG9wdGlvbnMsIHRhcmdldCwgdW5ib3VuZCkge1xuXHRcdFx0dmFyIGNoYW5naW5nLFxuXHRcdFx0XHRtYXAgPSB0aGlzO1xuXHRcdFx0aWYgKHRoaXMuc3JjKSB7XG5cdFx0XHRcdHRoaXMudW5tYXAoKTsgLy8gV2UgYXJlIHJlLW1hcHBpbmcgYSBuZXcgc291cmNlXG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gT0JKRUNUKSB7XG5cdFx0XHRcdG1hcC5zcmMgPSBzb3VyY2U7XG5cdFx0XHRcdG1hcC50Z3QgPSB0YXJnZXQgfHwgbWFwLnRndCB8fCBbXTtcblx0XHRcdFx0bWFwLm9wdGlvbnMgPSBvcHRpb25zIHx8IG1hcC5vcHRpb25zO1xuXHRcdFx0XHRtYXAudXBkYXRlKCk7XG5cdFx0XHRcdGlmICghdW5ib3VuZCkge1xuXHRcdFx0XHRcdGlmIChtYXBEZWYub2JzU3JjKSB7XG5cdFx0XHRcdFx0XHQkb2JzZXJ2YWJsZShtYXAuc3JjKS5vYnNlcnZlQWxsKG1hcC5vYnMgPSBmdW5jdGlvbihldiwgZXZlbnRBcmdzKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghY2hhbmdpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0bWFwRGVmLm9ic1NyYyhtYXAsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5naW5nID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LCBtYXAuc3JjRmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG1hcERlZi5vYnNUZ3QgKSB7XG5cdFx0XHRcdFx0XHQkb2JzZXJ2YWJsZShtYXAudGd0KS5vYnNlcnZlQWxsKG1hcC5vYnQgPSBmdW5jdGlvbihldiwgZXZlbnRBcmdzKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWNoYW5naW5nKSB7XG5cdFx0XHRcdFx0XHRcdGNoYW5naW5nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0bWFwRGVmLm9ic1RndChtYXAsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sIG1hcC50Z3RGbHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICgkaXNGdW5jdGlvbihtYXBEZWYpKSB7XG5cdFx0XHQvLyBTaW1wbGUgbWFwIGRlY2xhcmVkIGFzIGZ1bmN0aW9uXG5cdFx0XHRtYXBEZWYgPSB7XG5cdFx0XHRcdGdldFRndDogbWFwRGVmXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChtYXBEZWYuYmFzZU1hcCkge1xuXHRcdFx0bWFwRGVmID0gJC5leHRlbmQoe30sIG1hcERlZi5iYXNlTWFwLCBtYXBEZWYpO1xuXHRcdH1cblxuXHRcdG1hcERlZi5tYXAgPSBmdW5jdGlvbihzb3VyY2UsIG9wdGlvbnMsIHRhcmdldCwgdW5ib3VuZCkge1xuXHRcdFx0cmV0dXJuIG5ldyBNYXAoc291cmNlLCBvcHRpb25zLCB0YXJnZXQsIHVuYm91bmQpO1xuXHRcdH07XG5cblx0XHQoTWFwLnByb3RvdHlwZSA9IHtcblx0XHRcdHNyY0ZsdDogbWFwRGVmLnNyY0ZsdCB8fCBzaGFsbG93RmlsdGVyLCAvLyBkZWZhdWx0IHRvIHNoYWxsb3dGaWx0ZXJcblx0XHRcdHRndEZsdDogbWFwRGVmLnRndEZsdCB8fCBzaGFsbG93RmlsdGVyLFxuXHRcdFx0dXBkYXRlOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBtYXAgPSB0aGlzO1xuXHRcdFx0XHQkb2JzZXJ2YWJsZShtYXAudGd0KS5yZWZyZXNoKG1hcERlZi5nZXRUZ3QobWFwLnNyYywgbWFwLm9wdGlvbnMgPSBvcHRpb25zIHx8IG1hcC5vcHRpb25zKSk7XG5cdFx0XHR9LFxuXHRcdFx0dW5tYXA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbWFwID0gdGhpcztcblx0XHRcdFx0aWYgKG1hcC5zcmMpIHtcblx0XHRcdFx0XHRpZiAobWFwLm9icykge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnNyYykudW5vYnNlcnZlQWxsKG1hcC5vYnMsIG1hcC5zcmNGbHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobWFwLm9idCkge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnRndCkudW5vYnNlcnZlQWxsKG1hcC5vYnQsIG1hcC50Z3RGbHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtYXAuc3JjID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0bWFwOiBNYXAsXG5cdFx0XHRfZGVmOiBtYXBEZWZcblx0XHR9KS5jb25zdHJ1Y3RvciA9IE1hcDtcblxuXHRcdHJldHVybiBtYXBEZWY7XG5cdH07XG5cblx0JHN1Yi5hZHZTZXQgPSBmdW5jdGlvbigpIHsgLy8gcmVmcmVzaCBhZHZhbmNlZCBzZXR0aW5nc1xuXHRcdGdsb2JhbC5fanN2ID0gJHN1YlNldHRpbmdzLmFkdmFuY2VkLl9qc3Zcblx0XHRcdD8geyAvLyBjcmVhdGUgZ2xvYmFsIF9qc3YsIGZvciBhY2Nlc3Npbmcgdmlld3MsIGV0Y1xuXHRcdFx0XHRcdGNiQmluZGluZ3M6IGNiQmluZGluZ3NTdG9yZVxuXHRcdFx0XHR9XG5cdFx0XHQ6IHVuZGVmaW5lZDsgLy8gSW4gSUU4IGNhbm5vdCBkbyBkZWxldGUgZ2xvYmFsLl9qc3Zcblx0fTtcbn1cblxuLy88PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwgSnNWaWV3cyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbi8qIEpzVmlld3M6XG4gKiBJbnRlcmFjdGl2ZSBkYXRhLWRyaXZlbiB2aWV3cyB1c2luZyB0ZW1wbGF0ZXMgYW5kIGRhdGEtbGlua2luZy5cbiAqIFNlZSBodHRwOi8vd3d3Lmpzdmlld3MuY29tLyNqc3ZpZXdzIGFuZCBodHRwOi8vZ2l0aHViLmNvbS9Cb3Jpc01vb3JlL2pzdmlld3NcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJHZpZXdzU2V0dGluZ3MgPSAkdmlld3Muc2V0dGluZ3M7XG4kc3ViU2V0dGluZ3MgPSAkc3ViLnNldHRpbmdzO1xuJHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQ7XG4kY29udmVydGVycyA9ICR2aWV3cy5jb252ZXJ0ZXJzO1xuJC50ZW1wbGF0ZXMgPSAkdGVtcGxhdGVzID0gJHZpZXdzLnRlbXBsYXRlcztcbiR0YWdzID0gJHZpZXdzLnRhZ3M7XG5yRmlyc3RFbGVtID0gLzwoPyFzY3JpcHQpKFxcdyspWz5cXHNdLztcblxuaWYgKCQubGluaykgeyByZXR1cm4gJDsgfSAvLyBKc1ZpZXdzIGlzIGFscmVhZHkgbG9hZGVkXG5cbiRzdWJTZXR0aW5ncy50cmlnZ2VyID0gdHJ1ZTtcbnZhciBhY3RpdmVCb2R5LCByVGFnRGF0YWxpbmssICR2aWV3LCAkdmlld3NMaW5rQXR0ciwgbGlua1ZpZXdzU2VsLCB3cmFwTWFwLCB2aWV3U3RvcmUsIG9sZEFkdlNldCxcblx0anN2QXR0clN0ciA9IFwiZGF0YS1qc3ZcIixcblx0ZWxlbWVudENoYW5nZVN0ciA9IFwiY2hhbmdlLmpzdlwiLFxuXHRvbkJlZm9yZUNoYW5nZVN0ciA9IFwib25CZWZvcmVDaGFuZ2VcIixcblx0b25BZnRlckNoYW5nZVN0ciA9IFwib25BZnRlckNoYW5nZVwiLFxuXHRvbkFmdGVyQ3JlYXRlU3RyID0gXCJvbkFmdGVyQ3JlYXRlXCIsXG5cdENIRUNLRUQgPSBcImNoZWNrZWRcIixcblx0Q0hFQ0tCT1ggPSBcImNoZWNrYm94XCIsXG5cdFJBRElPID0gXCJyYWRpb1wiLFxuXHROT05FID0gXCJub25lXCIsXG5cdFNDUklQVCA9IFwiU0NSSVBUXCIsXG5cdFRSVUUgPSBcInRydWVcIixcblx0Y2xvc2VTY3JpcHQgPSAnXCI+PC9zY3JpcHQ+Jyxcblx0b3BlblNjcmlwdCA9ICc8c2NyaXB0IHR5cGU9XCJqc3YnLFxuXHRkZWZlckF0dHIgPSBqc3ZBdHRyU3RyICsgXCItZGZcIixcblx0YmluZEVsc1NlbCA9IFwic2NyaXB0LFtcIiArIGpzdkF0dHJTdHIgKyBcIl1cIixcblx0Zm5TZXR0ZXJzID0ge1xuXHRcdHZhbHVlOiBcInZhbFwiLFxuXHRcdGlucHV0OiBcInZhbFwiLFxuXHRcdGh0bWw6IEhUTUwsXG5cdFx0dGV4dDogXCJ0ZXh0XCJcblx0fSxcblx0dmFsdWVCaW5kaW5nID0ge2Zyb206IFwidmFsdWVcIiwgdG86IFwidmFsdWVcIn0sXG5cdGlzQ2xlYW5DYWxsID0gMCxcblx0b2xkQ2xlYW5EYXRhID0gJC5jbGVhbkRhdGEsXG5cdG9sZEpzdkRlbGltaXRlcnMgPSAkdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzLFxuXHRzYWZlRnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdHFzYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IsXG5cblx0Ly8gZWxDb250ZW50IG1hcHMgdGFnTmFtZXMgd2hpY2ggaGF2ZSBvbmx5IGVsZW1lbnQgY29udGVudCwgc28gbWF5IG5vdCBzdXBwb3J0IHNjcmlwdCBub2Rlcy5cblx0ZWxDb250ZW50ID0ge29sOiAxLCB1bDogMSwgdGFibGU6IDEsIHRib2R5OiAxLCB0aGVhZDogMSwgdGZvb3Q6IDEsIHRyOiAxLCBjb2xncm91cDogMSwgZGw6IDEsIHNlbGVjdDogMSwgb3B0Z3JvdXA6IDEsIHN2ZzogMSwgc3ZnX25zOiAxfSxcblx0YmFkUGFyZW50ID0ge3RyOiBcInRhYmxlXCJ9LFxuXHR2b2lkRWxlbXMgPSB7YnI6IDEsIGltZzogMSwgaW5wdXQ6IDEsIGhyOiAxLCBhcmVhOiAxLCBiYXNlOiAxLCBjb2w6IDEsIGxpbms6IDEsIG1ldGE6IDEsXG5cdFx0Y29tbWFuZDogMSwgZW1iZWQ6IDEsIGtleWdlbjogMSwgcGFyYW06IDEsIHNvdXJjZTogMSwgdHJhY2s6IDEsIHdicjogMX0sXG5cdGRpc3BsYXlTdHlsZXMgPSB7fSxcblx0YmluZGluZ1N0b3JlID0ge30sXG5cdGJpbmRpbmdLZXkgPSAxLFxuXHRyVmlld1BhdGggPSAvXiModmlld1xcLj8pPy8sXG5cdHJDb252ZXJ0TWFya2VycyA9IC8oKFxcLz4pfDxcXC8oXFx3Kyk+fCkoXFxzKikoWyNcXC9dXFxkKyg/Ol98KFxcXikpKWAoXFxzKikoPFxcdysoPz1bXFxzXFwvPl0pKT98XFxzKig/Oig8XFx3Kyg/PVtcXHNcXC8+XSkpfDxcXC8oXFx3Kyk+KFxccyopfChcXC8+KVxccyp8KD4pfCQpL2csXG5cdHJPcGVuVmlld01hcmtlcnMgPSAvKCMpKCkoXFxkKykoXykvZyxcblx0ck9wZW5NYXJrZXJzID0gLygjKSgpKFxcZCspKFtfXl0pL2csXG5cdHJWaWV3TWFya2VycyA9IC8oPzooIyl8KFxcLykpKFxcZCspKF8pL2csXG5cdHJPcGVuVGFnTWFya2VycyA9IC8oIykoKShcXGQrKShcXF4pL2csXG5cdHJNYXJrZXJUb2tlbnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShbX15dKShbLStAXFxkXSspPy9nLFxuXHRyU3BsaXRCaW5kaW5ncyA9IC8mKFxcZCspXFwrPy9nLFxuXHRnZXRDb21wdXRlZFN0eWxlID0gZ2xvYmFsLmdldENvbXB1dGVkU3R5bGU7XG5cbiRvYnNlcnZhYmxlID0gJC5vYnNlcnZhYmxlO1xuXG5pZiAoISRvYnNlcnZhYmxlKSB7XG5cdC8vIEpzT2JzZXJ2YWJsZSBpcyBub3QgbG9hZGVkLlxuXHR0aHJvdyByZXF1aXJlc1N0ciArIFwiSnNPYnNlcnZhYmxlXCI7IC8vIGpxdWVyeS5vYnNlcnZhYmxlLmpzIG11c3QgYmUgbG9hZGVkIGJlZm9yZSBKc1ZpZXdzXG59XG5cbiRvYnNlcnZlID0gJG9ic2VydmFibGUub2JzZXJ2ZTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBFdmVudCBoYW5kbGVyc1xuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZWxlbUNoYW5nZUhhbmRsZXIoZXYsIHBhcmFtcywgc291cmNlVmFsdWUpIHtcblx0dmFyIHNldHRlciwgY2FuY2VsLCBmcm9tQXR0ciwgbGlua0N0eCwgY3Z0QmFjaywgY252dE5hbWUsIHRhcmdldCwgJHNvdXJjZSwgdmlldywgYmluZGluZywgb2xkTGlua0N0eCwgb25CZWZvcmVDaGFuZ2UsIG9uQWZ0ZXJDaGFuZ2UsIHRhZywgdG8sIGV2ZW50QXJncywgZXhwck9iLFxuXHRcdHNvdXJjZSA9IGV2LnRhcmdldCxcblx0XHRiaW5kaW5ncyA9IHNvdXJjZS5fanN2Qm5kO1xuXG5cdC8vIF9qc3ZCbmQgaXMgYSBzdHJpbmcgd2l0aCB0aGUgc3ludGF4OiBcIiZiaW5kaW5nSWQxJmJpbmRpbmdJZDJcIlxuXHRpZiAoYmluZGluZ3MgJiYgZXYuY2hhciE9PVwiXCIpIHtcblx0XHR3aGlsZSAoYmluZGluZyA9IHJTcGxpdEJpbmRpbmdzLmV4ZWMoYmluZGluZ3MpKSB7XG5cdFx0XHRpZiAoYmluZGluZyA9IGJpbmRpbmdTdG9yZVtiaW5kaW5nWzFdXSkge1xuXHRcdFx0XHRpZiAodG8gPSBiaW5kaW5nLnRvKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIGJpbmRpbmcgaGFzIGEgJ3RvJyBmaWVsZCwgd2hpY2ggaXMgb2YgdGhlIGZvcm0gW1t0YXJnZXRPYmplY3QsIHRvUGF0aF0sIGN2dEJhY2tdXG5cdFx0XHRcdFx0bGlua0N0eCA9IGJpbmRpbmcubGlua0N0eDtcblx0XHRcdFx0XHR2aWV3ID0gbGlua0N0eC52aWV3O1xuXHRcdFx0XHRcdHRhZyA9IGxpbmtDdHgudGFnIHx8IHZpZXcudGFnO1xuXHRcdFx0XHRcdCRzb3VyY2UgPSAkKHNvdXJjZSk7XG5cdFx0XHRcdFx0b25CZWZvcmVDaGFuZ2UgPSB2aWV3LmhscChvbkJlZm9yZUNoYW5nZVN0cik7IC8vIFRPRE8gQ2FuIHdlIG9wdGltaXplIHRoaXMgYW5kIG90aGVyIGluc3RhbmNlcyBvZiBzYW1lP1xuXHRcdFx0XHRcdG9uQWZ0ZXJDaGFuZ2UgPSB2aWV3LmhscChvbkFmdGVyQ2hhbmdlU3RyKTsgLy8gVE9ETyBDYW4gd2Ugb3B0aW1pemUgdGhpcyBhbmQgb3RoZXIgaW5zdGFuY2VzIG9mIHNhbWVcblx0XHRcdFx0XHRmcm9tQXR0ciA9IGRlZmF1bHRBdHRyKHNvdXJjZSk7XG5cdFx0XHRcdFx0c2V0dGVyID0gZm5TZXR0ZXJzW2Zyb21BdHRyXTtcblx0XHRcdFx0XHRpZiAoc291cmNlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0c291cmNlVmFsdWUgPSAkaXNGdW5jdGlvbihmcm9tQXR0cilcblx0XHRcdFx0XHRcdFx0PyBmcm9tQXR0cihzb3VyY2UpXG5cdFx0XHRcdFx0XHRcdDogc2V0dGVyXG5cdFx0XHRcdFx0XHRcdFx0PyAkc291cmNlW3NldHRlcl0oKVxuXHRcdFx0XHRcdFx0XHRcdDogJHNvdXJjZS5hdHRyKGZyb21BdHRyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y252dE5hbWUgPSB0b1sxXTtcblx0XHRcdFx0XHR0byA9IHRvWzBdOyAvLyBbb2JqZWN0LCBwYXRoXVxuXHRcdFx0XHRcdHRvID0gdG8gKyBcIlwiID09PSB0byA/IFtsaW5rQ3R4LmRhdGEsIHRvXSA6IHRvO1xuXHRcdFx0XHRcdGlmIChjbnZ0TmFtZSkge1xuXHRcdFx0XHRcdFx0aWYgKCRpc0Z1bmN0aW9uKGNudnROYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRjdnRCYWNrID0gY252dE5hbWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjdnRCYWNrID0gdmlldy5nZXRSc2MoXCJjb252ZXJ0ZXJzXCIsIGNudnROYW1lKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGxpbmtDdHguZWxlbS5ub2RlTmFtZSA9PT0gXCJTRUxFQ1RcIikge1xuXHRcdFx0XHRcdFx0bGlua0N0eC5lbGVtLl9qc3ZTZWwgPSBzb3VyY2VWYWx1ZSA9IHNvdXJjZVZhbHVlIHx8IChsaW5rQ3R4LmVsZW0ubXVsdGlwbGUgPyBbXSA6IHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0XHRcdC8vIGRhdGEtbGluayA8c2VsZWN0PiB0byBzdHJpbmcgb3IgKG11bHRpc2VsZWN0KSBhcnJheSBvZiBzdHJpbmdzXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChjdnRCYWNrKSB7XG5cdFx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGN2dEJhY2suY2FsbCh0YWcsIHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTZXQgbGlua0N0eCBvbiB2aWV3LCBkeW5hbWljYWxseSwganVzdCBkdXJpbmcgdGhpcyBoYW5kbGVyIGNhbGxcblx0XHRcdFx0XHRvbGRMaW5rQ3R4ID0gdmlldy5saW5rQ3R4O1xuXHRcdFx0XHRcdHZpZXcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdFx0ZXZlbnRBcmdzID0ge1xuXHRcdFx0XHRcdFx0Y2hhbmdlOiBcImNoYW5nZVwiLFxuXHRcdFx0XHRcdFx0b2xkVmFsdWU6IGxpbmtDdHguX3ZhbCxcblx0XHRcdFx0XHRcdHZhbHVlOiBzb3VyY2VWYWx1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0aWYgKCghb25CZWZvcmVDaGFuZ2UgfHwgIShjYW5jZWwgPSBvbkJlZm9yZUNoYW5nZS5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpID09PSBmYWxzZSkpICYmXG5cdFx0XHRcdFx0XHRcdCghdGFnIHx8ICF0YWcub25CZWZvcmVDaGFuZ2UgfHwgIShjYW5jZWwgPSB0YWcub25CZWZvcmVDaGFuZ2UoZXYsIGV2ZW50QXJncykgPT09IGZhbHNlKSkgJiZcblx0XHRcdFx0XHRcdFx0c291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGFyZ2V0ID0gdG9bMF07IC8vIFtvYmplY3QsIHBhdGhdXG5cdFx0XHRcdFx0XHRpZiAoc291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRhcmdldC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwck9iID0gdGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHRcdHRhcmdldCA9IGxpbmtDdHguZGF0YTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoZXhwck9iICYmIGV4cHJPYi5zYikge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gbGlua0N0eC5fY3R4Q2IoZXhwck9iLCB0YXJnZXQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwck9iID0gZXhwck9iLnNiO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFnLl8uY2hnaW5nID0gdHJ1ZTsgLy8gbWFya2VyIHRvIHByZXZlbnQgdGFnIGNoYW5nZSBldmVudCB0cmlnZ2VyaW5nIGl0cyBvd24gcmVmcmVzaFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldCkuc2V0UHJvcGVydHkodG9bMV0sIHNvdXJjZVZhbHVlKTsgLy8gMndheSBiaW5kaW5nIGNoYW5nZSBldmVudCAtIG9ic2VydmFibHkgdXBkYXRpbmcgYm91bmQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdGlmIChvbkFmdGVyQ2hhbmdlKSB7XG5cdFx0XHRcdFx0XHRcdFx0b25BZnRlckNoYW5nZS5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGFnLm9uQWZ0ZXJDaGFuZ2UpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRhZy5vbkFmdGVyQ2hhbmdlKGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR0YWcuXy5jaGdpbmcgPSB1bmRlZmluZWQ7IC8vIGNsZWFyIHRoZSBtYXJrZXJcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRsaW5rQ3R4Ll92YWwgPSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmlldy5saW5rQ3R4ID0gb2xkTGlua0N0eDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIoZXYsIGV2ZW50QXJncywgbGlua0ZuKSB7XG5cdHZhciBhdHRyLCBzb3VyY2VWYWx1ZSwgbm9VcGRhdGUsIGZvcmNlVXBkYXRlLCBoYXNFcnJvciwgb25FcnJvcixcblx0XHRsaW5rQ3R4ID0gdGhpcyxcblx0XHR0YWcgPSBsaW5rQ3R4LnRhZyxcblx0XHRzb3VyY2UgPSBsaW5rQ3R4LmRhdGEsXG5cdFx0dGFyZ2V0ID0gbGlua0N0eC5lbGVtLFxuXHRcdGN2dCA9IGxpbmtDdHguY29udmVydCxcblx0XHRwYXJlbnRFbGVtID0gdGFyZ2V0LnBhcmVudE5vZGUsXG5cdFx0dmlldyA9IGxpbmtDdHgudmlldyxcblx0XHRvbGRMaW5rQ3R4ID0gdmlldy5saW5rQ3R4LFxuXHRcdG9uRXZlbnQgPSB2aWV3LmhscChvbkJlZm9yZUNoYW5nZVN0cik7XG5cblx0Ly8gU2V0IGxpbmtDdHggb24gdmlldywgZHluYW1pY2FsbHksIGp1c3QgZHVyaW5nIHRoaXMgaGFuZGxlciBjYWxsXG5cdHZpZXcubGlua0N0eCA9IGxpbmtDdHg7XG5cblx0aWYgKHBhcmVudEVsZW0gJiYgKCFvbkV2ZW50IHx8ICEoZXZlbnRBcmdzICYmIG9uRXZlbnQuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKVxuXHRcdFx0Ly8gSWYgZGF0YSBjaGFuZ2VkLCB0aGUgZXYuZGF0YSBpcyBzZXQgdG8gYmUgdGhlIHBhdGguIFVzZSB0aGF0IHRvIGZpbHRlciB0aGUgaGFuZGxlciBhY3Rpb24uLi5cblx0XHRcdCYmICEoZXZlbnRBcmdzICYmIGV2LmRhdGEucHJvcCAhPT0gXCIqXCIgJiYgZXYuZGF0YS5wcm9wICE9PSBldmVudEFyZ3MucGF0aCkpIHtcblxuXHRcdGlmIChldmVudEFyZ3MpIHtcblx0XHRcdGxpbmtDdHguZXZlbnRBcmdzID0gZXZlbnRBcmdzO1xuXHRcdH1cblx0XHRpZiAoZXZlbnRBcmdzIHx8IGxpbmtDdHguX3RvTGspIHtcblx0XHRcdC8vIElmIGV2ZW50QXJncyBhcmUgZGVmaW5lZCwgdGhpcyBpcyBhIGRhdGEgdXBkYXRlXG5cdFx0XHQvLyBPdGhlcndpc2UgdGhpcyBpcyB0aGUgaW5pdGlhbCBkYXRhLWxpbmsgcmVuZGVyaW5nIGNhbGwuIEJpbmQgb24gdGhpcyB0aGUgZmlyc3QgdGltZSBpdCBnZXQgY2FsbGVkXG5cdFx0XHRsaW5rQ3R4Ll90b0xrID0gMDsgLy8gUmVtb3ZlIGZsYWcgdG8gc2tpcCB1bm5lY2Nlc3NhcnkgcmViaW5kaW5nIG5leHQgdGltZVxuXHRcdFx0aWYgKGxpbmtGbi5fZXIpIHtcblx0XHRcdFx0Ly8gZGF0YS1saW5rPVwiZXhwclVzaW5nVGFnT3JDdnQgd2l0aCBvbmVycm9yPS4uLlwiIC0gZS5nLiB7dGFnIC4uLiB7Y3Z0Oi4uLiB7Oi4uLiBjb252ZXJ0PSdjdnQnXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0c291cmNlVmFsdWUgPSBsaW5rRm4oc291cmNlLCB2aWV3KTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdGhhc0Vycm9yID0gbGlua0ZuLl9lcjtcblx0XHRcdFx0XHRvbkVycm9yID0gb25SZW5kZXJFcnJvcihlLHZpZXcsKG5ldyBGdW5jdGlvbihcImRhdGEsdmlld1wiLCBcInJldHVybiBcIiArIGhhc0Vycm9yICsgXCI7XCIpKShzb3VyY2UsIHZpZXcpKTtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IFt7cHJvcHM6IHt9LCBhcmdzOiBbb25FcnJvcl19XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c291cmNlVmFsdWUgPSBsaW5rRm4oc291cmNlLCB2aWV3LCAkc3ViKTtcblx0XHRcdH1cblx0XHRcdC8vIENvbXBpbGVkIGxpbmsgZXhwcmVzc2lvbiBmb3IgbGlua1RhZzogcmV0dXJuIHZhbHVlIGZvciBkYXRhLWxpbms9XCJ7Onh4eH1cIiB3aXRoIG5vIGN2dCBvciBjdnRCaywgb3RoZXJ3aXNlIHRhZ0N0eCBvciB0YWdDdHhzXG5cblx0XHRcdGF0dHIgPSBnZXRUYXJnZXRWYWwoc291cmNlVmFsdWUsIGxpbmtDdHgsIHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdFx0XHRcdGxpbmtDdHguYXR0ciB8fCBkZWZhdWx0QXR0cih0YXJnZXQsIHRydWUsIGN2dCAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdC8vIEV4aXN0aW5nIHRhZyBpbnN0YW5jZVxuXHRcdFx0XHRmb3JjZVVwZGF0ZSA9IGhhc0Vycm9yIHx8IHRhZy5fZXI7XG5cdFx0XHRcdC8vIElmIHRoZSBuZXcgdGFnQ3R4cyBoYXNFcnJvciBvciB0aGUgcHJldmlvdXMgdGFnQ3R4cyBoYWQgZXJyb3IsIHRoZW4gZm9yY2UgdXBkYXRlXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWVbMF0gPyBzb3VyY2VWYWx1ZSA6IFtzb3VyY2VWYWx1ZV07XG5cdFx0XHRcdG5vVXBkYXRlID0gIWZvcmNlVXBkYXRlICYmIGV2ZW50QXJncyAmJiB0YWcub25VcGRhdGUgJiYgdGFnLm9uVXBkYXRlKGV2LCBldmVudEFyZ3MsIHNvdXJjZVZhbHVlKSA9PT0gZmFsc2U7XG5cblx0XHRcdFx0bWVyZ2VDdHhzKHRhZywgc291cmNlVmFsdWUsIGZvcmNlVXBkYXRlKTtcblxuXHRcdFx0XHRpZiAobm9VcGRhdGUgfHwgYXR0ciA9PT0gTk9ORSkge1xuXHRcdFx0XHRcdC8vIG9uVXBkYXRlIHJldHVybmVkIGZhbHNlLCBvciBhdHRyID09PSBcIm5vbmVcIiwgb3IgdGhpcyBpcyBhbiB1cGRhdGUgY29taW5nIGZyb20gdGhlIHRhZydzIG93biBjaGFuZ2UgZXZlbnRcblx0XHRcdFx0XHQvLyAtIHNvIGRvbid0IHJlZnJlc2ggdGhlIHRhZzogd2UganVzdCB1c2UgdGhlIG5ldyB0YWdDdHhzIG1lcmdlZCBmcm9tIHRoZSBzb3VyY2VWYWx1ZSxcblx0XHRcdFx0XHQvLyAod2hpY2ggbWF5IG9wdGlvbmFsbHkgaGF2ZSBiZWVuIG1vZGlmZWQgaW4gb25VcGRhdGUoKS4uLikgYW5kIHRoZW4gYmluZCwgYW5kIHdlIGFyZSBkb25lXG5cdFx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KTtcblx0XHRcdFx0XHR2aWV3LmxpbmtDdHggPSBvbGRMaW5rQ3R4O1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGFnLl8uY2hnaW5nKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRhZy5vblVuYmluZCkge1xuXHRcdFx0XHRcdHRhZy5vblVuYmluZCh0YWcudGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4LCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gdGFnLnRhZ05hbWUgPT09IFwiOlwiIC8vIENhbGwgY29udmVydFZhbCBpZiBpdCBpcyBhIHt7Y3Z0Oi4uLn19IC0gb3RoZXJ3aXNlIGNhbGwgcmVuZGVyVGFnXG5cdFx0XHRcdFx0PyAkc3ViLl9jbnZ0KHRhZy5jdnQsIHZpZXcsIHNvdXJjZVZhbHVlWzBdKVxuXHRcdFx0XHRcdDogJHN1Yi5fdGFnKHRhZywgdmlldywgdmlldy50bXBsLCBzb3VyY2VWYWx1ZSwgdHJ1ZSwgb25FcnJvcik7XG5cdFx0XHR9IGVsc2UgaWYgKGxpbmtGbi5fdGFnKSB7XG5cdFx0XHRcdC8vIEZvciB7ezogLi4ufX0gd2l0aG91dCBhIGNvbnZlcnQgb3IgY29udmVydEJhY2ssIHdlIGFscmVhZHkgaGF2ZSB0aGUgc291cmNlVmFsdWUsIGFuZCB3ZSBhcmUgZG9uZVxuXHRcdFx0XHQvLyBGb3Ige3s6IC4uLn19IHdpdGggZWl0aGVyIGN2dCBvciBjdnRCYWNrIHdlIGNhbGwgY29udmVydFZhbCB0byBnZXQgdGhlIHNvdXJjZVZhbHVlIGFuZCBpbnN0YW50aWF0ZSB0aGUgdGFnXG5cdFx0XHRcdC8vIElmIGN2dCBpcyB1bmRlZmluZWQgdGhlbiB0aGlzIGlzIGEgdGFnLCBhbmQgd2UgY2FsbCByZW5kZXJUYWcgdG8gZ2V0IHRoZSByZW5kZXJlZCBjb250ZW50IGFuZCBpbnN0YW50aWF0ZSB0aGUgdGFnXG5cdFx0XHRcdGN2dCA9IGN2dCA9PT0gXCJcIiA/IFRSVUUgOiBjdnQ7IC8vIElmIHRoZXJlIGlzIGEgY3Z0QmFjayBidXQgbm8gY3Z0LCBzZXQgY3Z0IHRvIFwidHJ1ZVwiXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gY3Z0IC8vIENhbGwgY29udmVydFZhbCBpZiBpdCBpcyBhIHt7Y3Z0Oi4uLn19IC0gb3RoZXJ3aXNlIGNhbGwgcmVuZGVyVGFnXG5cdFx0XHRcdFx0PyAkc3ViLl9jbnZ0KGN2dCwgdmlldywgc291cmNlVmFsdWVbMF0gfHwgc291cmNlVmFsdWUpIC8vIGNvbnZlcnRWYWxcblx0XHRcdFx0XHQ6ICRzdWIuX3RhZyhsaW5rRm4uX3RhZywgdmlldywgdmlldy50bXBsLCBzb3VyY2VWYWx1ZSwgdHJ1ZSwgb25FcnJvcik7IC8vIHJlbmRlclRhZ1xuXG5cdFx0XHRcdGFkZExpbmtNZXRob2RzKHRhZyA9IGxpbmtDdHgudGFnLCB0cnVlKTsgLy8gSW4gYm90aCBjb252ZXJ0VmFsIGFuZCByZW5kZXJUYWcgd2UgaGF2ZSBpbnN0YW50aWF0ZWQgYSB0YWdcblx0XHRcdFx0YXR0ciA9IGxpbmtDdHguYXR0ciB8fCBhdHRyOyAvLyBsaW5rQ3R4LmF0dHIgbWF5IGhhdmUgYmVlbiBzZXQgdG8gdGFnLmF0dHIgZHVyaW5nIHRhZyBpbnN0YW50aWF0aW9uIGluIHJlbmRlclRhZ1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodXBkYXRlQ29udGVudChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgYXR0ciwgdGFnKVxuXHRcdFx0XHRcdCYmIGV2ZW50QXJnc1xuXHRcdFx0XHRcdCYmIChvbkV2ZW50ID0gdmlldy5obHAob25BZnRlckNoYW5nZVN0cikpKSB7XG5cdFx0XHRcdG9uRXZlbnQuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdH1cblx0XHRcdGxpbmtDdHguX25vVXBkID0gMDsgLy8gRm9yIGRhdGEtbGluaz1cIl57Li4ufVwiIHJlbW92ZSBfbm9VcGQgZmxhZyBzbyB1cGRhdGVzIG9uIHN1YnNlcXVlbnQgY2FsbHNcblxuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHR0YWcuX2VyID0gaGFzRXJyb3I7XG5cdFx0XHRcdGNhbGxBZnRlckxpbmsodGFnLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvYnNlcnZlQW5kQmluZChsaW5rQ3R4LCBzb3VyY2UsIHRhcmdldCk7XG5cblx0XHQvLyBSZW1vdmUgZHluYW1pY2FsbHkgYWRkZWQgbGlua0N0eCBmcm9tIHZpZXdcblx0XHR2aWV3LmxpbmtDdHggPSBvbGRMaW5rQ3R4O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldFZhbChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgdGFnLCBhdHRyKSB7XG5cdHZhciBjdXJyZW50VmFsdWUsIHNldHRlciwgY3NzLCAkdGFyZ2V0LFxuXHRcdHRhcmdldCA9IHRhZyAmJiB0YWcucGFyZW50RWxlbSB8fCBsaW5rQ3R4LmVsZW07XG5cblx0aWYgKHNvdXJjZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHQkdGFyZ2V0ID0gJCh0YXJnZXQpO1xuXHRcdGF0dHIgPSB0YWcgJiYgdGFnLmF0dHIgfHwgYXR0cjtcblx0XHRpZiAoJGlzRnVuY3Rpb24oc291cmNlVmFsdWUpKSB7XG5cdFx0XHRlcnJvcihsaW5rQ3R4LmV4cHIgKyBcIjogbWlzc2luZyBwYXJlbnNcIik7XG5cdFx0fVxuXG5cdFx0aWYgKGNzcyA9IC9eY3NzLS8udGVzdChhdHRyKSAmJiBhdHRyLnNsaWNlKDQpKSB7XG5cdFx0XHRjdXJyZW50VmFsdWUgPSAkLnN0eWxlKHRhcmdldCwgY3NzKTtcblx0XHRcdGlmICgrc291cmNlVmFsdWUgPT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdC8vIE9wdGltaXphdGlvbiBmb3IgcGVyZiBvbiBpbnRlZ2VyIHZhbHVlcyAtIGUuZy4gY3NzLXdpZHRoezp3aWR0aCsncHgnfVxuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBwYXJzZUludChjdXJyZW50VmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoYXR0ciAhPT0gXCJsaW5rXCIpIHsgLy8gYXR0ciA9PT0gXCJsaW5rXCIgaXMgZm9yIHRhZyBjb250cm9scyB3aGljaCBkbyBkYXRhIGJpbmRpbmcgYnV0IGhhdmUgbm8gcmVuZGVyZWQgb3V0cHV0IG9yIHRhcmdldFxuXHRcdFx0aWYgKGF0dHIgPT09IFwidmFsdWVcIikge1xuXHRcdFx0XHRpZiAodGFyZ2V0LnR5cGUgPT09IENIRUNLQk9YKSB7XG5cdFx0XHRcdFx0Y3VycmVudFZhbHVlID0gJHRhcmdldC5wcm9wKGF0dHIgPSBDSEVDS0VEKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhdHRyID09PSBSQURJTykge1xuXHRcdFx0XHRpZiAodGFyZ2V0LnZhbHVlID09PSAoXCJcIiArIHNvdXJjZVZhbHVlKSkge1xuXHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSA9ICR0YXJnZXQucHJvcChDSEVDS0VEKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gYXR0cjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0c2V0dGVyID0gZm5TZXR0ZXJzW2F0dHJdO1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBzZXR0ZXIgPyAkdGFyZ2V0W3NldHRlcl0oKSA6ICR0YXJnZXQuYXR0cihhdHRyKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGlua0N0eC5fdmFsID0gY3VycmVudFZhbHVlO1xuXHR9XG5cdHJldHVybiBhdHRyO1xufVxuXG5mdW5jdGlvbiBzZXREZWZlcihlbGVtLCB2YWx1ZSkge1xuXHRlbGVtLl9kZiA9IHZhbHVlOyAvLyBVc2UgYm90aCBhbiBleHBhbmRvIGFuZCBhbiBhdHRyaWJ1dGUgdG8gdHJhY2sgZGVmZXJlZCB0b2tlbnMuIEF0dHJpYnV0ZSBpcyBuZWVkZWQgZm9yIHF1ZXJ5U2VsZWN0b3JBbGwgZm9yIGdldFZpZXdJbmZvcyAoY2hpbGRUYWdzKVxuXHRlbGVtWyh2YWx1ZSA/IFwic2V0XCIgOiBcInJlbW92ZVwiKSArIFwiQXR0cmlidXRlXCJdKGRlZmVyQXR0ciwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQoc291cmNlVmFsdWUsIGxpbmtDdHgsIGF0dHIsIHRhZykge1xuXHQvLyBXaGVuIGNhbGxlZCBmb3IgYSB0YWcsIGVpdGhlciBpbiB0YWcucmVmcmVzaCgpIG9yIHByb3BlcnR5Q2hhbmdlSGFuZGxlcigpLCByZXR1cm5zIGEgcHJvbWlzZSAoYW5kIHN1cHBvcnRzIGFzeW5jKVxuXHQvLyBXaGVuIGNhbGxlZCAoaW4gcHJvcGVydHlDaGFuZ2VIYW5kbGVyKSBmb3IgdGFyZ2V0IEhUTUwgcmV0dXJucyB0cnVlXG5cdC8vIFdoZW4gY2FsbGVkIChpbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIpIGZvciBvdGhlciB0YXJnZXRzIHJldHVybnMgYm9vbGVhbiBmb3IgXCJjaGFuZ2VkXCJcblx0dmFyIHNldHRlciwgcHJldk5vZGUsIG5leHROb2RlLCBwcm9taXNlLCBub2Rlc1RvUmVtb3ZlLCB1c2VQcm9wLCB0b2tlbnMsIGlkLCBvcGVuSW5kZXgsIGNsb3NlSW5kZXgsIHRlc3RFbGVtLCBub2RlTmFtZSwgY1N0eWxlLCBqc3ZTZWwsXG5cdFx0cmVuZGVycyA9IGF0dHIgIT09IE5PTkUgJiYgc291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhbGlua0N0eC5fbm9VcGQsIC8vIEZvciBkYXRhLWxpbms9XCJeey4uLn1cIiwgZG9uJ3QgdXBkYXRlIHRoZSBmaXJzdCB0aW1lIChubyBpbml0aWFsIHJlbmRlcikgLSBlLmcuIHRvIGxlYXZlIHNlcnZlciByZW5kZXJlZCB2YWx1ZXMuXG5cdFx0c291cmNlID0gbGlua0N0eC5kYXRhLFxuXHRcdHRhcmdldCA9IHRhZyAmJiB0YWcucGFyZW50RWxlbSB8fCBsaW5rQ3R4LmVsZW0sXG5cdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0LnBhcmVudE5vZGUsXG5cdFx0JHRhcmdldCA9ICQodGFyZ2V0KSxcblx0XHR2aWV3ID0gbGlua0N0eC52aWV3LFxuXHRcdHRhcmdldFZhbCA9IGxpbmtDdHguX3ZhbCxcblx0XHRvbGRMaW5rQ3R4ID0gdmlldy5saW5rQ3R4LFxuXHRcdC8vIElmIG5vdCBhIHRhZyB3ZSBjYW4gdXNlIHRoZSAuX3ZhbCBvYnRhaW5lZCBmcm9tIGdldFRhcmdldFZhbCgpXG5cdFx0Ly8gYW5kIG9ubHkgdXBkYXRlIHdoZW4gdGhlIG5ldyB2YWx1ZSAoc291cmNlVmFsdWUpIGhhcyBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIG9uZVxuXHRcdGNoYW5nZSA9IHRhZztcblxuXHRpZiAodGFnKSB7XG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgdGFnIHdpdGggZWxlbWVudCByZWZlcmVuY2VzXG5cdFx0dGFnLl8udW5saW5rZWQgPSB0cnVlOyAvLyBTZXQgdG8gdW5saW5rZWQsIHNvIGluaXRpYWxpemF0aW9uIGlzIHRyaWdnZXJlZCBhZnRlciByZS1yZW5kZXJpbmcsIGUuZy4gZm9yIHNldHRpbmcgbGlua2VkRWxlbSwgYW5kIGNhbGxpbmcgb25CaW5kXG5cdFx0dGFnLnBhcmVudEVsZW0gPSB0YWcucGFyZW50RWxlbSB8fCAobGlua0N0eC5leHByIHx8IHRhZy5fZWxDbnQpID8gdGFyZ2V0IDogdGFyZ2V0UGFyZW50O1xuXHRcdHByZXZOb2RlID0gdGFnLl9wcnY7XG5cdFx0bmV4dE5vZGUgPSB0YWcuX254dDtcblx0fVxuXHRpZiAoIXJlbmRlcnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoYXR0ciA9PT0gXCJ2aXNpYmxlXCIpIHtcblx0XHRhdHRyID0gXCJjc3MtZGlzcGxheVwiO1xuXHR9XG5cdGlmICgvXmNzcy0vLnRlc3QoYXR0cikpIHtcblx0XHRpZiAobGlua0N0eC5hdHRyID09PSBcInZpc2libGVcIikge1xuXHRcdFx0Ly8gR2V0IHRoZSBjdXJyZW50IGRpc3BsYXkgc3R5bGVcblx0XHRcdGNTdHlsZSA9ICh0YXJnZXQuY3VycmVudFN0eWxlIHx8IGdldENvbXB1dGVkU3R5bGUuY2FsbChnbG9iYWwsIHRhcmdldCwgXCJcIikpLmRpc3BsYXk7XG5cblx0XHRcdGlmIChzb3VyY2VWYWx1ZSkge1xuXHRcdFx0XHQvLyBXZSBhcmUgc2hvd2luZyB0aGUgZWxlbWVudC5cblx0XHRcdFx0Ly8gR2V0IHRoZSBjYWNoZWQgJ3Zpc2libGUnIGRpc3BsYXkgdmFsdWUgZnJvbSB0aGUgLWpzdmQgZXhwYW5kb1xuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IHRhcmdldC5fanN2ZFxuXHRcdFx0XHRcdC8vIE9yLCBpZiBub3QgeWV0IGNhY2hlZCwgZ2V0IHRoZSBjdXJyZW50IGRpc3BsYXkgdmFsdWVcblx0XHRcdFx0XHR8fCBjU3R5bGU7XG5cdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSA9PT0gTk9ORSAmJiAhKHNvdXJjZVZhbHVlID0gZGlzcGxheVN0eWxlc1tub2RlTmFtZSA9IHRhcmdldC5ub2RlTmFtZV0pKSB7XG5cdFx0XHRcdFx0Ly8gQ3VycmVudGx5IGRpc3BsYXkgdmFsdWUgaXMgJ25vbmUnLCBhbmQgdGhlICd2aXNpYmxlJyBzdHlsZSBoYXMgbm90IGJlZW4gY2FjaGVkLlxuXHRcdFx0XHRcdC8vIFdlIGNyZWF0ZSBhbiBlbGVtZW50IHRvIGZpbmQgdGhlIGNvcnJlY3QgJ3Zpc2libGUnIGRpc3BsYXkgc3R5bGUgZm9yIHRoaXMgbm9kZU5hbWVcblx0XHRcdFx0XHR0ZXN0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpO1xuXHRcdFx0XHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVzdEVsZW0pO1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBkZWZhdWx0IHN0eWxlIGZvciB0aGlzIEhUTUwgdGFnIHRvIHVzZSBhcyAndmlzaWJsZScgc3R5bGVcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZVxuXHRcdFx0XHRcdFx0Ly8gYW5kIGNhY2hlIGl0IGFzIGEgaGFzaCBhZ2FpbnN0IG5vZGVOYW1lXG5cdFx0XHRcdFx0XHQ9IGRpc3BsYXlTdHlsZXNbbm9kZU5hbWVdXG5cdFx0XHRcdFx0XHQ9ICh0ZXN0RWxlbS5jdXJyZW50U3R5bGUgfHwgZ2V0Q29tcHV0ZWRTdHlsZS5jYWxsKGdsb2JhbCwgdGVzdEVsZW0sIFwiXCIpKS5kaXNwbGF5O1xuXHRcdFx0XHRcdGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVzdEVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXZSBhcmUgaGlkaW5nIHRoZSBlbGVtZW50LlxuXHRcdFx0XHQvLyBDYWNoZSB0aGUgY3VycmVudCBkaXNwbGF5IHZhbHVlIGFzICd2aXNpYmxlJyBzdHlsZSwgb24gX2pzdmQgZXhwYW5kbywgZm9yIHdoZW4gd2Ugc2hvdyB0aGUgZWxlbWVudCBhZ2FpblxuXHRcdFx0XHR0YXJnZXQuX2pzdmQgPSBjU3R5bGU7XG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gTk9ORTsgLy8gSGlkZSB0aGUgZWxlbWVudFxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoY2hhbmdlID0gY2hhbmdlIHx8IHRhcmdldFZhbCAhPT0gc291cmNlVmFsdWUpIHtcblx0XHRcdCQuc3R5bGUodGFyZ2V0LCBhdHRyLnNsaWNlKDQpLCBzb3VyY2VWYWx1ZSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGF0dHIgIT09IFwibGlua1wiKSB7IC8vIGF0dHIgPT09IFwibGlua1wiIGlzIGZvciB0YWcgY29udHJvbHMgd2hpY2ggZG8gZGF0YSBiaW5kaW5nIGJ1dCBoYXZlIG5vIHJlbmRlcmVkIG91dHB1dCBvciB0YXJnZXRcblx0XHRpZiAoL15kYXRhLS8udGVzdChhdHRyKSkge1xuXHRcdFx0JC5kYXRhKHRhcmdldCwgYXR0ci5zbGljZSg1KSwgc291cmNlVmFsdWUpOyAvLyBTdXBwb3J0IGZvciBiaW5kaW5nIHRvIGRhdGEgYXR0cmlidXRlczogZGF0YS1mb297OmV4cHJ9OiBkYXRhLWZvbyBhdHRyaWJ1dGUgd2lsbCBiZVxuXHRcdFx0Ly8gZXhwci50b1N0cmluZygpLCBidXQgJC5kYXRhKGVsZW1lbnQsIFwiZm9vXCIpIGFuZCAkKGVsZW1lbnQpLmRhdGEoXCJmb29cIikgd2lsbCBhY3R1YWxseSByZXR1cm4gdmFsdWUgb2YgZXhwciwgZXZlbiBpZiBvZiB0eXBlIG9iamVjdFxuXHRcdH1cblx0XHRpZiAoYXR0ciA9PT0gQ0hFQ0tFRCkge1xuXHRcdFx0dXNlUHJvcCA9IHRydWU7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IHNvdXJjZVZhbHVlICYmIHNvdXJjZVZhbHVlICE9PSBcImZhbHNlXCI7XG5cdFx0XHQvLyBUaGUgc3RyaW5nIHZhbHVlIFwiZmFsc2VcIiBjYW4gb2NjdXIgd2l0aCBkYXRhLWxpbms9XCJjaGVja2Vke2F0dHI6ZXhwcn1cIiAtIGFzIGEgcmVzdWx0IG9mIGF0dHIsIGFuZCBoZW5jZSB1c2luZyBjb252ZXJ0VmFsKClcblx0XHRcdC8vIFdlIHdpbGwgc2V0IHRoZSBcImNoZWNrZWRcIiBwcm9wZXJ0eVxuXHRcdFx0Ly8gV2Ugd2lsbCBjb21wYXJlIHRoaXMgd2l0aCB0aGUgY3VycmVudCB2YWx1ZVxuXHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gUkFESU8pIHtcblx0XHRcdC8vIFRoaXMgaXMgYSBzcGVjaWFsIGJpbmRpbmcgYXR0cmlidXRlIGZvciByYWRpbyBidXR0b25zLCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZGVmYXVsdCAndG8nIGJpbmRpbmcuXG5cdFx0XHQvLyBUaGlzIGFsbG93cyBiaW5kaW5nIGJvdGggdG8gdmFsdWUgKGZvciBlYWNoIGlucHV0KSBhbmQgdG8gdGhlIGRlZmF1bHQgY2hlY2tlZCByYWRpbyBidXR0b24gKGZvciBlYWNoIGlucHV0IGluIG5hbWVkIGdyb3VwLFxuXHRcdFx0Ly8gZS5nLiBiaW5kaW5nIHRvIHBhcmVudCBkYXRhKS5cblx0XHRcdC8vIFBsYWNlIHZhbHVlIGJpbmRpbmcgZmlyc3Q6IDxpbnB1dCB0eXBlPVwicmFkaW9cIiBkYXRhLWxpbms9XCJ2YWx1ZXs6bmFtZX0gezojZ2V0KCdkYXRhJykuZGF0YS5jdXJyZW5jeTp9IFwiIC4uLi8+XG5cdFx0XHQvLyBvciAoYWxsb3dpbmcgYW55IG9yZGVyIGZvciB0aGUgYmluZGluZyBleHByZXNzaW9ucyk6XG5cdFx0XHQvLyA8aW5wdXQgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJ7ezpuYW1lfX1cIiBkYXRhLWxpbms9XCJ7OiNnZXQoJ2RhdGEnKS5kYXRhLmN1cnJlbmN5On0gdmFsdWVeezpuYW1lfVwiIC4uLi8+XG5cdFx0XHR1c2VQcm9wID0gdHJ1ZTtcblx0XHRcdGF0dHIgPSBDSEVDS0VEO1xuXHRcdFx0c291cmNlVmFsdWUgPSB0YXJnZXQudmFsdWUgPT09IChcIlwiICsgc291cmNlVmFsdWUpO1xuXHRcdFx0Ly8gSWYgdGhlIGRhdGEgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiB0aGlzIHJhZGlvIGJ1dHRvbiBpbnB1dCwgc2V0IHRoZSBjaGVja2VkIHByb3BlcnR5IHRvIHRydWVcblx0XHRcdC8vIE90aGVyd2lzZSBzZXQgdGhlIGNoZWNrZWQgcHJvcGVydHkgdG8gZmFsc2Vcblx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFwic2VsZWN0ZWRcIiB8fCBhdHRyID09PSBcImRpc2FibGVkXCIgfHwgYXR0ciA9PT0gXCJtdWx0aXBsZVwiIHx8IGF0dHIgPT09IFwicmVhZG9ubHlcIikge1xuXHRcdFx0c291cmNlVmFsdWUgPSAoc291cmNlVmFsdWUgJiYgc291cmNlVmFsdWUgIT09IFwiZmFsc2VcIikgPyBhdHRyIDogbnVsbDtcblx0XHRcdC8vIFVzZSBhdHRyLCBub3QgcHJvcCwgc28gd2hlbiB0aGUgb3B0aW9ucyAoZm9yIGV4YW1wbGUpIGFyZSBjaGFuZ2VkIGR5bmFtaWNhbGx5LCBidXQgaW5jbHVkZSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCB2YWx1ZSxcblx0XHRcdC8vIHRoZXkgd2lsbCBzdGlsbCBiZSBzZWxlY3RlZCBhZnRlciB0aGUgY2hhbmdlXG5cdFx0fSBlbHNlIGlmIChhdHRyID09PSBcInZhbHVlXCIgJiYgdGFyZ2V0Lm5vZGVOYW1lID09PSBcIlNFTEVDVFwiKSB7XG5cdFx0XHR0YXJnZXQuX2pzdlNlbCA9ICRpc0FycmF5KHNvdXJjZVZhbHVlKVxuXHRcdFx0XHQ/IHNvdXJjZVZhbHVlXG5cdFx0XHRcdDogXCJcIiArIHNvdXJjZVZhbHVlOyAvLyBJZiBub3QgYXJyYXksIGNvZXJjZSB0byBzdHJpbmdcblx0XHR9XG5cblx0XHRpZiAoc2V0dGVyID0gZm5TZXR0ZXJzW2F0dHJdKSB7XG5cdFx0XHRpZiAoYXR0ciA9PT0gSFRNTCkge1xuXHRcdFx0XHQvLyBTZXQgbGlua0N0eCBvbiB2aWV3LCBkeW5hbWljYWxseSwganVzdCBkdXJpbmcgdGhpcyBoYW5kbGVyIGNhbGxcblx0XHRcdFx0dmlldy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdFx0aWYgKHRhZyAmJiB0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0XHRub2Rlc1RvUmVtb3ZlID0gdGFnLm5vZGVzKHRydWUpO1xuXHRcdFx0XHRcdGlmICh0YWcuX2VsQ250KSB7XG5cdFx0XHRcdFx0XHRpZiAocHJldk5vZGUgJiYgcHJldk5vZGUgIT09IG5leHROb2RlKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgcHJldk5vZGUgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIERPTSwgc28gdHJhbnNmZXIgdGhlIHZpZXcgdG9rZW5zIG9uIHByZXZOb2RlIHRvIG5leHROb2RlIG9mIHRoaXMgJ3ZpZXdUb1JlZnJlc2gnXG5cdFx0XHRcdFx0XHRcdHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHRhcmdldCwgdGFnLl90Z0lkLCBcIl5cIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRva2VucyA9IHRhcmdldC5fZGYpIHsgLy8gVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSBpcyBubyBuZXh0Tm9kZSwgYW5kIHNvIHRoZSB0YXJnZXQuX2RmIG1heSBpbmNsdWRlIHRva2VucyByZWZlcmVuY2luZ1xuXHRcdFx0XHRcdFx0XHQvLyB2aWV3IGFuZCB0YWcgYmluZGluZ3MgY29udGFpbmVkIHdpdGhpbiB0aGUgb3BlbiBhbmQgY2xvc2UgdG9rZW5zIG9mIHRoZSB1cGRhdGVkIHRhZyBjb250cm9sLiBUaGV5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIChkaXNwb3NlZClcblx0XHRcdFx0XHRcdFx0aWQgPSB0YWcuX3RnSWQgKyBcIl5cIjtcblx0XHRcdFx0XHRcdFx0b3BlbkluZGV4ID0gdG9rZW5zLmluZGV4T2YoXCIjXCIgKyBpZCkgKyAxO1xuXHRcdFx0XHRcdFx0XHRjbG9zZUluZGV4ID0gdG9rZW5zLmluZGV4T2YoXCIvXCIgKyBpZCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9wZW5JbmRleCAmJiBjbG9zZUluZGV4ID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdG9wZW5JbmRleCArPSBpZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNsb3NlSW5kZXggPiBvcGVuSW5kZXgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldCwgdG9rZW5zLnNsaWNlKDAsIG9wZW5JbmRleCkgKyB0b2tlbnMuc2xpY2UoY2xvc2VJbmRleCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGlzcG9zZVRva2Vucyh0b2tlbnMuc2xpY2Uob3BlbkluZGV4LCBjbG9zZUluZGV4KSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwcmV2Tm9kZSA9IHByZXZOb2RlXG5cdFx0XHRcdFx0XHRcdD8gcHJldk5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdFx0XHRcdDogbmV4dE5vZGVcblx0XHRcdFx0XHRcdFx0XHQ/IG5leHROb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHRcdFx0XHRcdDogdGFyZ2V0Lmxhc3RDaGlsZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIEhUTUwgbm9kZXNcblx0XHRcdFx0XHQkKG5vZGVzVG9SZW1vdmUpLnJlbW92ZSgpOyAvLyBOb3RlIGlmICF0YWcuX2VsQ250IHJlbW92aW5nIHRoZSBub2Rlc1RvUmVtb3ZlIHdpbGwgcHJvY2VzcyBhbmQgZGlzcG9zZSB2aWV3IGFuZCB0YWcgYmluZGluZ3MgY29udGFpbmVkIHdpdGhpbiB0aGUgdXBkYXRlZCB0YWcgY29udHJvbFxuXG5cdFx0XHRcdFx0Ly8gSW5zZXJ0IGFuZCBsaW5rIG5ldyBjb250ZW50XG5cdFx0XHRcdFx0cHJvbWlzZSA9IHZpZXcubGluayh2aWV3LmRhdGEsIHRhcmdldCwgcHJldk5vZGUsIG5leHROb2RlLCBzb3VyY2VWYWx1ZSwgdGFnICYmIHt0YWc6IHRhZy5fdGdJZCwgbGF6eUxpbms6IHRhZy50YWdDdHgucHJvcHMubGF6eUxpbmt9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBkYXRhLWxpbmtlZCB2YWx1ZSB0YXJnZXRpbmcgaW5uZXJIVE1MOiBkYXRhLWxpbms9XCJodG1sezpleHByfVwiIG9yIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIlxuXHRcdFx0XHRcdHJlbmRlcnMgPSByZW5kZXJzICYmIHRhcmdldFZhbCAhPT0gc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0aWYgKHJlbmRlcnMpIHtcblx0XHRcdFx0XHRcdCR0YXJnZXQuZW1wdHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHJlbmRlcnMpIHtcblx0XHRcdFx0XHRcdHByb21pc2UgPSB2aWV3Lmxpbmsoc291cmNlLCB0YXJnZXQsIHByZXZOb2RlLCBuZXh0Tm9kZSwgc291cmNlVmFsdWUsIHRhZyAmJiB7dGFnOiB0YWcuX3RnSWR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gUmVtb3ZlIGR5bmFtaWNhbGx5IGFkZGVkIGxpbmtDdHggYW5kIGN0eCBmcm9tIHZpZXdcblx0XHRcdFx0dmlldy5saW5rQ3R4ID0gb2xkTGlua0N0eDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChjaGFuZ2UgPSBjaGFuZ2UgfHwgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0XHRcdGlmIChhdHRyID09PSBcInRleHRcIiAmJiB0YXJnZXQuY2hpbGRyZW4gJiYgIXRhcmdldC5jaGlsZHJlblswXSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBjb2RlIGlzIGZhc3RlciB0aGVuICR0YXJnZXQudGV4dCgpXG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0LnRleHRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0LnRleHRDb250ZW50ID0gc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQuaW5uZXJUZXh0ID0gc291cmNlVmFsdWUgPT09IG51bGwgPyBcIlwiIDogc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdCR0YXJnZXRbc2V0dGVyXShzb3VyY2VWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgoanN2U2VsID0gdGFyZ2V0UGFyZW50Ll9qc3ZTZWwpXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB2YWx1ZSBvZiA8b3B0aW9uPiBlbGVtZW50XG5cdFx0XHRcdFx0JiYgKGF0dHIgPT09IFwidmFsdWVcIiB8fCAhJHRhcmdldC5hdHRyKFwidmFsdWVcIikpKSB7IC8vIFNldHRpbmcgdmFsdWUgYXR0cmlidXRlLCBvciBzZXR0aW5nIHRleHRDb250ZW50IGlmIGF0dHJpYnV0ZSBpcyBudWxsXG5cdFx0XHRcdFx0Ly8gU2V0L3Vuc2VsZWN0IHNlbGVjdGlvbiBiYXNlZCBvbiB2YWx1ZSBzZXQgb24gcGFyZW50IDxzZWxlY3Q+LiBXb3JrcyBmb3IgbXVsdGlzZWxlY3QgdG9vXG5cdFx0XHRcdFx0dGFyZ2V0LnNlbGVjdGVkID0gJC5pbkFycmF5KFwiXCIgKyBzb3VyY2VWYWx1ZSwgJGlzQXJyYXkoanN2U2VsKSA/IGpzdlNlbCA6IFtqc3ZTZWxdKSA+IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjaGFuZ2UgPSBjaGFuZ2UgfHwgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0Ly8gU2V0dGluZyBhbiBhdHRyaWJ1dGUgdG8gdW5kZWZpbmVkIHNob3VsZCByZW1vdmUgdGhlIGF0dHJpYnV0ZVxuXHRcdFx0JHRhcmdldFt1c2VQcm9wID8gXCJwcm9wXCIgOiBcImF0dHJcIl0oYXR0ciwgc291cmNlVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhdXNlUHJvcCA/IG51bGwgOiBzb3VyY2VWYWx1ZSk7XG5cdFx0fVxuXHRcdGxpbmtDdHguX3ZhbCA9IHNvdXJjZVZhbHVlO1xuXHR9XG5cdHJldHVybiBwcm9taXNlIHx8IGNoYW5nZTtcbn1cblxuZnVuY3Rpb24gYXJyYXlDaGFuZ2VIYW5kbGVyKGV2LCBldmVudEFyZ3MpIHtcblx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdG9uQmVmb3JlQ2hhbmdlID0gc2VsZi5obHAob25CZWZvcmVDaGFuZ2VTdHIpLFxuXHRcdG9uQWZ0ZXJDaGFuZ2UgPSBzZWxmLmhscChvbkFmdGVyQ2hhbmdlU3RyKTtcblx0aWYgKCFvbkJlZm9yZUNoYW5nZSB8fCBvbkJlZm9yZUNoYW5nZS5jYWxsKHRoaXMsIGV2LCBldmVudEFyZ3MpICE9PSBmYWxzZSkge1xuXHRcdGlmIChldmVudEFyZ3MpIHtcblx0XHRcdC8vIFRoaXMgaXMgYW4gb2JzZXJ2YWJsZSBhY3Rpb24gKG5vdCBhIHRyaWdnZXIvaGFuZGxlciBjYWxsIGZyb20gcHVzaFZhbHVlcywgb3Igc2ltaWxhciwgZm9yIHdoaWNoIGV2ZW50QXJncyB3aWxsIGJlIG51bGwpXG5cdFx0XHR2YXIgYWN0aW9uID0gZXZlbnRBcmdzLmNoYW5nZSxcblx0XHRcdFx0aW5kZXggPSBldmVudEFyZ3MuaW5kZXgsXG5cdFx0XHRcdGl0ZW1zID0gZXZlbnRBcmdzLml0ZW1zO1xuXHRcdFx0c2VsZi5fLnNydCA9IGV2ZW50QXJncy5yZWZyZXNoOyAvLyB0cnVlIGlmIHBhcnQgb2YgYSAnc29ydCcgb24gcmVmcmVzaFxuXHRcdFx0c3dpdGNoIChhY3Rpb24pIHtcblx0XHRcdFx0Y2FzZSBcImluc2VydFwiOlxuXHRcdFx0XHRcdHNlbGYuYWRkVmlld3MoaW5kZXgsIGl0ZW1zKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInJlbW92ZVwiOlxuXHRcdFx0XHRcdHNlbGYucmVtb3ZlVmlld3MoaW5kZXgsIGl0ZW1zLmxlbmd0aCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJtb3ZlXCI6XG5cdFx0XHRcdFx0c2VsZi5yZW1vdmVWaWV3cyhldmVudEFyZ3Mub2xkSW5kZXgsIGl0ZW1zLmxlbmd0aCwgdW5kZWZpbmVkLCB0cnVlKTsgLy8gcmVtb3ZlXG5cdFx0XHRcdFx0c2VsZi5hZGRWaWV3cyhpbmRleCwgaXRlbXMpOyAvLyByZS1pbnNlcnRcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInJlZnJlc2hcIjpcblx0XHRcdFx0XHRzZWxmLl8uc3J0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdHNlbGYuZml4SW5kZXgoMCk7XG5cdFx0XHRcdFx0Ly8gT3RoZXIgY2FzZXM6IChlLmcudW5kZWZpbmVkLCBmb3Igc2V0UHJvcGVydHkgb24gb2JzZXJ2YWJsZSBvYmplY3QpIGV0Yy4gZG8gbm90aGluZ1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob25BZnRlckNoYW5nZSkge1xuXHRcdFx0b25BZnRlckNoYW5nZS5jYWxsKHRoaXMsIGV2LCBldmVudEFyZ3MpO1xuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVdGlsaXRpZXMgZm9yIGV2ZW50IGhhbmRsZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHNldEFycmF5Q2hhbmdlTGluayh2aWV3KSB7XG5cdC8vIEFkZC9yZW1vdmUgYXJyYXlDaGFuZ2UgaGFuZGxlciBvbiB2aWV3XG5cdHZhciBoYW5kbGVyLCBhcnJheUJpbmRpbmcsXG5cdFx0dHlwZSA9IHZpZXcudHlwZSwgLy8gdW5kZWZpbmVkIGlmIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdGRhdGEgPSB2aWV3LmRhdGEsXG5cdFx0Ym91bmQgPSB2aWV3Ll8uYm5kOyAvLyB0cnVlIGZvciB0b3AtbGV2ZWwgbGluaygpIG9yIGRhdGEtbGluaz1cIntmb3J9XCIsIG9yIHRoZSBmb3IgdGFnIGluc3RhbmNlIGZvciB7Xntmb3J9fSAob3IgZm9yIGFueSBjdXN0b20gdGFnIHRoYXQgaGFzIGFuIG9uQXJyYXlDaGFuZ2UgaGFuZGxlcilcblxuXHRpZiAoIXZpZXcuXy51c2VLZXkgJiYgYm91bmQpIHtcblx0XHQvLyBUaGlzIGlzIGFuIGFycmF5IHZpZXcuICh2aWV3Ll8udXNlS2V5IG5vdCBkZWZpbmVkID0+IGRhdGEgaXMgYXJyYXkpLCBhbmQgaXMgZGF0YS1ib3VuZCB0byBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHNcblxuXHRcdGlmIChhcnJheUJpbmRpbmcgPSB2aWV3Ll8uYm5kQXJyKSB7XG5cdFx0XHQvLyBGaXJzdCByZW1vdmUgdGhlIGN1cnJlbnQgaGFuZGxlciBpZiB0aGVyZSBpcyBvbmVcblx0XHRcdCQoW2FycmF5QmluZGluZ1sxXV0pLm9mZihhcnJheUNoYW5nZVN0ciwgYXJyYXlCaW5kaW5nWzBdKTtcblx0XHRcdHZpZXcuXy5ibmRBcnIgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmIChib3VuZCAhPT0gISFib3VuZCkge1xuXHRcdFx0Ly8gYm91bmQgaXMgbm90IGEgYm9vbGVhbiwgc28gaXQgaXMgdGhlIGRhdGEtbGlua2VkIHRhZyB0aGF0ICdvd25zJyB0aGlzIGFycmF5IGJpbmRpbmcgLSBlLmcuIHtee2Zvci4uLn19XG5cdFx0XHRpZiAodHlwZSkge1xuXHRcdFx0XHRib3VuZC5fLmFyclZ3c1t2aWV3Ll8uaWRdID0gdmlldztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBib3VuZC5fLmFyclZ3c1t2aWV3Ll8uaWRdOyAvLyBpZiB2aWV3LnR5cGUgaXMgdW5kZWZpbmVkLCB2aWV3IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHR5cGUgJiYgZGF0YSkge1xuXHRcdFx0Ly8gSWYgdGhpcyB2aWV3IGlzIG5vdCBiZWluZyByZW1vdmVkLCBidXQgdGhlIGRhdGEgYXJyYXkgaGFzIGJlZW4gcmVwbGFjZWQsIHRoZW4gYmluZCB0byB0aGUgbmV3IGRhdGEgYXJyYXlcblx0XHRcdGhhbmRsZXIgPSBmdW5jdGlvbihldikge1xuXHRcdFx0XHRpZiAoIShldi5kYXRhICYmIGV2LmRhdGEub2ZmKSkge1xuXHRcdFx0XHRcdC8vIFNraXAgaWYgISFldi5kYXRhLm9mZjogLSBhIGhhbmRsZXIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgKG1heWJlIHdhcyBvbiBoYW5kbGVyIGNvbGxlY3Rpb24gYXQgY2FsbCB0aW1lIC0gdGhlbiByZW1vdmVkIGJ5IGFub3RoZXIgaGFuZGxlcilcblx0XHRcdFx0XHQvLyBJZiB2aWV3LnR5cGUgaXMgdW5kZWZpbmVkLCBkbyBub3RoaW5nLiAoQ29ycmVzcG9uZHMgdG8gY2FzZSB3aGVyZSB0aGVyZSBpcyBhbm90aGVyIGhhbmRsZXIgb24gdGhlIHNhbWUgZGF0YSB3aG9zZVxuXHRcdFx0XHRcdC8vIGVmZmVjdCB3YXMgdG8gcmVtb3ZlIHRoaXMgdmlldywgYW5kIHdoaWNoIGhhcHBlbmVkIHRvIHByZWNlZGUgdGhpcyBldmVudCBpbiB0aGUgdHJpZ2dlciBzZXF1ZW5jZS4gU28gYWx0aG91Z2ggdGhpc1xuXHRcdFx0XHRcdC8vIGV2ZW50IGhhcyBiZWVuIHJlbW92ZWQgbm93LCBpdCBpcyBzdGlsbCBjYWxsZWQgc2luY2UgYWxyZWFkeSBvbiB0aGUgdHJpZ2dlciBzZXF1ZW5jZSlcblx0XHRcdFx0XHRhcnJheUNoYW5nZUhhbmRsZXIuYXBwbHkodmlldywgYXJndW1lbnRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdCQoW2RhdGFdKS5vbihhcnJheUNoYW5nZVN0ciwgaGFuZGxlcik7XG5cdFx0XHR2aWV3Ll8uYm5kQXJyID0gW2hhbmRsZXIsIGRhdGFdO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXR0cihlbGVtLCB0bywgbGlua0dldFZhbCkge1xuXHQvLyB0bzogdHJ1ZSAtIGRlZmF1bHQgYXR0cmlidXRlIGZvciBzZXR0aW5nIGRhdGEgdmFsdWUgb24gSFRNTCBlbGVtZW50OyBmYWxzZTogZGVmYXVsdCBhdHRyaWJ1dGUgZm9yIGdldHRpbmcgdmFsdWUgZnJvbSBIVE1MIGVsZW1lbnRcblx0Ly8gTWVyZ2UgaW4gdGhlIGRlZmF1bHQgYXR0cmlidXRlIGJpbmRpbmdzIGZvciB0aGlzIHRhcmdldCBlbGVtZW50XG5cdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxcblx0XHRhdHRyID1cblx0XHRcdCRzdWJTZXR0aW5nc0FkdmFuY2VkLl9mZVtub2RlTmFtZV0gLy8gZ2V0IGZvcm0gZWxlbWVudCBiaW5kaW5nIHNldHRpbmdzIGZvciBpbnB1dCB0ZXh0YXJlYSBzZWxlY3Qgb3Igb3B0Z3JvdXBcblx0XHRcdHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSBUUlVFICYmIHt0bzogSFRNTCwgZnJvbTogSFRNTH07IC8vIE9yIGlmIGNvbnRlbnRFZGl0YWJsZSBzZXQgdG8gXCJ0cnVlXCIgc2V0IGF0dHIgdG8gXCJodG1sXCJcblx0cmV0dXJuIGF0dHJcblx0XHQ/ICh0b1xuXHRcdFx0PyAoKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBSQURJTykgLy8gRm9yIHJhZGlvIGJ1dHRvbnMsIGJpbmQgZnJvbSB2YWx1ZSwgYnV0IGJpbmQgdG8gJ3JhZGlvJyAtIHNwZWNpYWwgdmFsdWUuXG5cdFx0XHRcdD8gUkFESU9cblx0XHRcdFx0OiBhdHRyLnRvKVxuXHRcdFx0OiBhdHRyLmZyb20pXG5cdFx0OiB0b1xuXHRcdFx0PyBsaW5rR2V0VmFsID8gXCJ0ZXh0XCIgOiBIVE1MIC8vIERlZmF1bHQgaW5uZXJUZXh0IGZvciBkYXRhLWxpbms9XCJhLmIuY1wiIG9yIGRhdGEtbGluaz1cIns6YS5iLmN9XCIgKHdpdGggb3Igd2l0aG91dCBjb252ZXJ0ZXJzKS0gb3RoZXJ3aXNlIGlubmVySFRNTFxuXHRcdFx0OiBcIlwiOyAvLyBEZWZhdWx0IGlzIG5vdCB0byBiaW5kIGZyb21cbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlbmRlcmluZyBhbmQgRE9NIGluc2VydGlvblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVuZGVyQW5kTGluayh2aWV3LCBpbmRleCwgdG1wbCwgdmlld3MsIGRhdGEsIGNvbnRleHQsIHJlZnJlc2gpIHtcblx0dmFyIGh0bWwsIGxpbmtUb05vZGUsIHByZXZWaWV3LCBub2Rlc1RvUmVtb3ZlLCBiaW5kSWQsXG5cdFx0cGFyZW50Tm9kZSA9IHZpZXcucGFyZW50RWxlbSxcblx0XHRwcmV2Tm9kZSA9IHZpZXcuX3Bydixcblx0XHRuZXh0Tm9kZSA9IHZpZXcuX254dCxcblx0XHRlbENudCA9IHZpZXcuX2VsQ250O1xuXG5cdGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5wYXJlbnROb2RlICE9PSBwYXJlbnROb2RlKSB7XG5cdFx0ZXJyb3IoXCJNaXNzaW5nIHBhcmVudE5vZGVcIik7XG5cdFx0Ly8gQWJhbmRvbiwgc2luY2Ugbm9kZSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIG9yIHdyYXBwZXIgZWxlbWVudCBoYXMgYmVlbiBpbnNlcnRlZCBiZXR3ZWVuIHByZXZOb2RlIGFuZCBwYXJlbnROb2RlXG5cdH1cblxuXHRpZiAocmVmcmVzaCkge1xuXHRcdG5vZGVzVG9SZW1vdmUgPSB2aWV3Lm5vZGVzKCk7XG5cdFx0aWYgKGVsQ250ICYmIHByZXZOb2RlICYmIHByZXZOb2RlICE9PSBuZXh0Tm9kZSkge1xuXHRcdFx0Ly8gVGhpcyBwcmV2Tm9kZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB0cmFuc2ZlciB0aGUgdmlldyB0b2tlbnMgb24gcHJldk5vZGUgdG8gbmV4dE5vZGUgb2YgdGhpcyAndmlld1RvUmVmcmVzaCdcblx0XHRcdHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHBhcmVudE5vZGUsIHZpZXcuXy5pZCwgXCJfXCIsIHRydWUpO1xuXHRcdH1cblx0XHQvLyBSZW1vdmUgY2hpbGQgdmlld3Ncblx0XHR2aWV3LnJlbW92ZVZpZXdzKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRsaW5rVG9Ob2RlID0gbmV4dE5vZGU7XG5cblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVcblx0XHRcdFx0PyBwcmV2Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0OiBuZXh0Tm9kZVxuXHRcdFx0XHRcdD8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdFx0OiBwYXJlbnROb2RlLmxhc3RDaGlsZDtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgSFRNTCBub2Rlc1xuXHRcdCQobm9kZXNUb1JlbW92ZSkucmVtb3ZlKCk7XG5cblx0XHRmb3IgKGJpbmRJZCBpbiB2aWV3Ll8uYm5kcykge1xuXHRcdFx0Ly8gVGhlIHZpZXcgYmluZGluZ3MgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgYWJvdmUgaW46ICQobm9kZXNUb1JlbW92ZSkucmVtb3ZlKCk7XG5cdFx0XHQvLyBJZiBub3QsIHJlbW92ZSB0aGVtIGhlcmU6XG5cdFx0XHRyZW1vdmVWaWV3QmluZGluZyhiaW5kSWQpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBhZGRWaWV3cy4gT25seSBjYWxsZWQgaWYgdmlldyBpcyBvZiB0eXBlIFwiYXJyYXlcIlxuXHRcdGlmIChpbmRleCkge1xuXHRcdFx0Ly8gaW5kZXggaXMgYSBudW1iZXIsIHNvIGluZGV4ZWQgdmlldyBpbiB2aWV3IGFycmF5XG5cdFx0XHRwcmV2VmlldyA9IHZpZXdzW2luZGV4IC0gMV07XG5cdFx0XHRpZiAoIXByZXZWaWV3KSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTsgLy8gSWYgc3VidmlldyBmb3IgcHJvdmlkZWQgaW5kZXggZG9lcyBub3QgZXhpc3QsIGRvIG5vdGhpbmdcblx0XHRcdH1cblx0XHRcdHByZXZOb2RlID0gcHJldlZpZXcuX254dDtcblx0XHR9XG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHRsaW5rVG9Ob2RlID0gcHJldk5vZGU7XG5cdFx0XHRwcmV2Tm9kZSA9IGxpbmtUb05vZGVcblx0XHRcdFx0PyBsaW5rVG9Ob2RlLnByZXZpb3VzU2libGluZyAgICAgICAgIC8vIFRoZXJlIGlzIGEgbGlua1RvTm9kZSwgc28gaW5zZXJ0IGFmdGVyIHByZXZpb3VzU2libGluZywgb3IgYXQgdGhlIGJlZ2lubmluZ1xuXHRcdFx0XHQ6IHBhcmVudE5vZGUubGFzdENoaWxkOyAgICAgICAgICAgICAgLy8gSWYgbm8gcHJldlZpZXcgYW5kIG5vIHByZXZOb2RlLCBpbmRleCBpcyAwIGFuZCB0aGUgY29udGFpbmVyIGlzIGVtcHR5LFxuXHRcdFx0XHQvLyBzbyBwcmV2Tm9kZSA9IGxpbmtUb05vZGUgPSBudWxsLiBCdXQgaWYgcHJldlZpZXcuX254dCBpcyBudWxsIHRoZW4gd2Ugc2V0IHByZXZOb2RlIHRvIHBhcmVudE5vZGUubGFzdENoaWxkXG5cdFx0XHRcdC8vICh3aGljaCBtdXN0IGJlIGJlZm9yZSB0aGUgcHJldlZpZXcpIHNvIHdlIGluc2VydCBhZnRlciB0aGF0IG5vZGUgLSBhbmQgb25seSBsaW5rIHRoZSBpbnNlcnRlZCBub2Rlc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsaW5rVG9Ob2RlID0gcHJldk5vZGUubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdGh0bWwgPSB0bXBsLnJlbmRlcihkYXRhLCBjb250ZXh0LCB2aWV3Ll8udXNlS2V5ICYmIHJlZnJlc2gsIHZpZXcsIHJlZnJlc2ggfHwgaW5kZXgsIHRydWUpO1xuXHQvLyBQYXNzIGluIHZpZXcuXy51c2VLZXkgYXMgdGVzdCBmb3Igbm9JdGVyYXRpb24gKHdoaWNoIGNvcnJlc3BvbmRzIHRvIHdoZW4gc2VsZi5fLnVzZUtleSA+IDAgYW5kIHNlbGYuZGF0YSBpcyBhbiBhcnJheSlcblxuXHQvLyBMaW5rIHRoZSBuZXcgSFRNTCBub2RlcyB0byB0aGUgZGF0YVxuXHR2aWV3LmxpbmsoZGF0YSwgcGFyZW50Tm9kZSwgcHJldk5vZGUsIGxpbmtUb05vZGUsIGh0bWwsIHByZXZWaWV3KTtcbi8vfSwgMCk7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09XG4vLyBhZGRCaW5kaW5nTWFya2Vyc1xuLy89PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gYWRkQmluZGluZ01hcmtlcnModmFsdWUsIHZpZXcsIHRhZykge1xuXHQvLyBJbnNlcnQgYmluZGluZyBtYXJrZXJzIGludG8gdGhlIHJlbmRlcmVkIHRlbXBsYXRlIG91dHB1dCwgd2hpY2ggd2lsbCBnZXQgY29udmVydGVkIHRvIGFwcHJvcHJpYXRlXG5cdC8vIGRhdGEtanN2IGF0dHJpYnV0ZXMgKGVsZW1lbnQtb25seSBjb250ZW50KSBvciBzY3JpcHQgbWFya2VyIG5vZGVzIChwaHJhc2luZyBvciBmbG93IGNvbnRlbnQpLCBpbiBjb252ZXJ0TWFya2Vycyxcblx0Ly8gd2l0aGluIHZpZXcubGluaywgcHJpb3IgdG8gaW5zZXJ0aW5nIGludG8gdGhlIERPTS4gTGlua2luZyB3aWxsIHRoZW4gYmluZCBiYXNlZCBvbiB0aGVzZSBtYXJrZXJzIGluIHRoZSBET00uXG5cdC8vIEFkZGVkIHZpZXcgbWFya2VyczogI21fLi4uVklFVy4uLi9tX1xuXHQvLyBBZGRlZCB0YWcgbWFya2VyczogI21eLi4uVEFHLi4uLi9tXlxuXHR2YXIgaWQsIGVuZDtcblx0aWYgKHRhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBiaW5kaW5nIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRlbmQgPSBcIl5gXCI7XG5cdFx0YWRkTGlua01ldGhvZHModGFnLCB0cnVlKTsgLy8gVGhpcyBpcyB7Xns+Li4ufX0gb3Ige157dGFnIC4uLn19LCB7e2N2dDouLi59IG9yIHteezouLi59fSwgYW5kIHRhZyB3YXMgZGVmaW5lZCBpbiBjb252ZXJ0VmFsIG9yIHJlbmRlclRhZ1xuXHRcdGlkID0gdGFnLl90Z0lkO1xuXHRcdGlmICghaWQpIHtcblx0XHRcdGJpbmRpbmdTdG9yZVtpZCA9IGJpbmRpbmdLZXkrK10gPSB0YWc7IC8vIFN0b3JlIHRoZSB0YWcgdGVtcG9yYXJpbHksIHJlYWR5IGZvciBkYXRhYmluZGluZy5cblx0XHRcdC8vIER1cmluZyBsaW5raW5nLCBpbiBhZGREYXRhQmluZGluZywgdGhlIHRhZyB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBsaW5rQ3R4LFxuXHRcdFx0Ly8gYW5kIHRoZW4gaW4gb2JzZXJ2ZUFuZEJpbmQsIGJpbmRpbmdTdG9yZVtiaW5kSWRdIHdpbGwgYmUgcmVwbGFjZWQgYnkgYmluZGluZyBpbmZvLlxuXHRcdFx0dGFnLl90Z0lkID0gXCJcIiArIGlkO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBUaGlzIGlzIGEgYmluZGluZyBtYXJrZXIgZm9yIGEgdmlld1xuXHRcdC8vIEFkZCB0aGUgdmlldyB0byB0aGUgc3RvcmUgb2YgY3VycmVudCBsaW5rZWQgdmlld3Ncblx0XHRlbmQgPSBcIl9gXCI7XG5cdFx0YWRkTGlua01ldGhvZHModmlld1N0b3JlW2lkID0gdmlldy5fLmlkXSA9IHZpZXcpO1xuXHR9XG5cdC8vIEV4YW1wbGU6IFwiIzIzXlRoZVZhbHVlLzIzXlwiXG5cdHJldHVybiBcIiNcIiArIGlkICsgZW5kXG5cdFx0KyAodmFsdWUgIT0gdW5kZWZpbmVkID8gdmFsdWUgOiBcIlwiKSAvLyBGb3Ige157Om5hbWV9fSB0aGlzIGdpdmVzIHRoZSBlcXVpdmFsZW50IHNlbWFudGljcyB0byBjb21waWxlZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vICh2PWRhdGEubmFtZSkhPW51bGw/djpcIlwiOyB1c2VkIGluIHt7Om5hbWV9fSBvciBkYXRhLWxpbms9XCJuYW1lXCJcblx0XHQrIFwiL1wiICsgaWQgKyBlbmQ7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEYXRhLWxpbmtpbmcgYW5kIGRhdGEgYmluZGluZ1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8tLS0tLS0tLS0tLS0tLS1cbi8vIG9ic2VydmVBbmRCaW5kXG4vLy0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBvYnNlcnZlQW5kQmluZChsaW5rQ3R4LCBzb3VyY2UsIHRhcmdldCkgeyAvL1RPRE8/IGxpbmtGbkFyZ3MpIHs7XG5cdHZhciBiaW5kaW5nLCBsLCBsaW5rZWRFbGVtLCBleHByRm5EZXBzLCBleHByT2IsXG5cdFx0dGFnID0gbGlua0N0eC50YWcsXG5cdFx0Y3Z0QmsgPSBsaW5rQ3R4LmNvbnZlcnRCYWNrLFxuXHRcdGRlcGVuZHMgPSBbXSxcblx0XHRiaW5kSWQgPSBsaW5rQ3R4Ll9ibmRJZCB8fCBcIlwiICsgYmluZGluZ0tleSsrLFxuXHRcdGhhbmRsZXIgPSBsaW5rQ3R4Ll9oZGw7XG5cblx0bGlua0N0eC5fYm5kSWQgPSB1bmRlZmluZWQ7XG5cblx0aWYgKHRhZykge1xuXHRcdC8vIFVzZSB0aGUgJ2RlcGVuZHMnIHBhdGhzIHNldCBvbiBsaW5rQ3R4LnRhZyAtIHdoaWNoIG1heSBoYXZlIGJlZW4gc2V0IG9uIGRlY2xhcmF0aW9uXG5cdFx0Ly8gb3IgaW4gZXZlbnRzOiBpbml0LCByZW5kZXIsIG9uQWZ0ZXJMaW5rIGV0Yy5cblx0XHRkZXBlbmRzID0gdGFnLmRlcGVuZHMgfHwgZGVwZW5kcztcblx0XHRkZXBlbmRzID0gJGlzRnVuY3Rpb24oZGVwZW5kcykgPyB0YWcuZGVwZW5kcyh0YWcpIDogZGVwZW5kcztcblx0XHRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW07XG5cdH1cblx0aWYgKCFsaW5rQ3R4Ll9kZXBlbmRzIHx8IChcIlwiICsgbGlua0N0eC5fZGVwZW5kcyAhPT0gXCJcIiArIGRlcGVuZHMpKSB7XG5cdFx0Ly8gT25seSBiaW5kIHRoZSBmaXJzdCB0aW1lLCBvciBpZiB0aGUgbmV3IGRlcGVuZHMgKHRvU3RyaW5nKSBoYXMgY2hhbmdlZCBmcm9tIHdoZW4gbGFzdCBib3VuZFxuXHRcdGlmIChsaW5rQ3R4Ll9kZXBlbmRzKSB7XG5cdFx0XHQvLyBVbm9ic2VydmUgcHJldmlvdXMgYmluZGluZ1xuXHRcdFx0JG9ic2VydmFibGUuX2FwcGx5KGZhbHNlLCBbc291cmNlXSwgbGlua0N0eC5fZGVwZW5kcywgaGFuZGxlciwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0ZXhwckZuRGVwcyA9IGxpbmtDdHguZm4uZGVwcy5zbGljZSgpOyAvLyBNYWtlIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBwYXRocyBmb3IgdGhlIGNvbXBpbGVkIGxpbmtDdHggZXhwcmVzc2lvbiAtIHRvIHBhc3MgdG8gb2JzZXJ2ZSgpLiBJbiBnZXRJbm5lckNiKCksXG5cdFx0Ly8gKGFuZCB3aGVuZXZlciB0aGUgb2JqZWN0IGlzIHVwZGF0ZWQsIGluIGlubmVyQ2IpLCB3ZSB3aWxsIHNldCBleHByT2Iub2IgdG8gdGhlIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IHRoYXQgY29tcHV0ZWQgZXhwcmVzc2lvbiwgZm9yIHRoaXMgdmlldy5cblx0XHRsID0gZXhwckZuRGVwcy5sZW5ndGg7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0ZXhwck9iID0gZXhwckZuRGVwc1tsXTtcblx0XHRcdGlmIChleHByT2IuX2pzdikge1xuXHRcdFx0XHQvLyBUaGlzIHBhdGggaXMgYW4gJ2V4cHJPYicsIGNvcnJlc3BvbmRpbmcgdG8gYSBjb21wdXRlZCwgcmV0dXJuaW5nIGFuIG9iamVjdC4gV2UgcmVwbGFjZSB0aGUgZXhwck9iIGJ5XG5cdFx0XHRcdC8vIGEgdmlldy1iaW5kaW5nLXNwZWNpZmljIGV4cHJPYiBpbnN0YW5jZS4gVGhlIGN1cnJlbnQgb2JqZWN0IHdpbGwgYmUgc3RvcmVkIGFzIGV4cHJPYi5vYi5cblx0XHRcdFx0ZXhwckZuRGVwc1tsXSA9ICRleHRlbmQoe30sIGV4cHJPYik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YmluZGluZyA9ICRvYnNlcnZhYmxlLl9hcHBseShcblx0XHRcdGZhbHNlLFxuXHRcdFx0W3NvdXJjZV0sXG5cdFx0XHRleHByRm5EZXBzLCAvLyBmbGF0dGVuIHRoZSBwYXRocyAtIHRvIGdhdGhlciBhbGwgdGhlIGRlcGVuZGVuY2llcyBhY3Jvc3MgYXJncyBhbmQgYm91bmQgcGFyYW1zXG5cdFx0XHRkZXBlbmRzLFxuXHRcdFx0aGFuZGxlcixcblx0XHRcdGxpbmtDdHguX2N0eENiKTtcblx0XHQvLyBUaGUgYmluZGluZyByZXR1cm5lZCBieSAkb2JzZXJ2ZSBoYXMgYSBibmQgYXJyYXkgd2l0aCB0aGUgc291cmNlIG9iamVjdHMgb2YgdGhlIGluZGl2aWR1YWwgYmluZGluZ3MuXG5cblx0XHRiaW5kaW5nLmVsZW0gPSB0YXJnZXQ7IC8vIFRoZSB0YXJnZXQgb2YgYWxsIHRoZSBpbmRpdmlkdWFsIGJpbmRpbmdzXG5cdFx0YmluZGluZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRiaW5kaW5nLl90Z0lkID0gYmluZElkO1xuXG5cdFx0Ly8gQWRkIHRvIHRoZSBfanN2Qm5kIG9uIHRoZSB0YXJnZXQgdGhlIHZpZXcgaWQgYW5kIGJpbmRpbmcgaWQgLSBmb3IgdW5iaW5kaW5nIHdoZW4gdGhlIHRhcmdldCBlbGVtZW50IGlzIHJlbW92ZWRcblx0XHR0YXJnZXQuX2pzdkJuZCA9IHRhcmdldC5fanN2Qm5kIHx8IFwiXCI7XG5cdFx0dGFyZ2V0Ll9qc3ZCbmQgKz0gXCImXCIgKyBiaW5kSWQ7XG5cdFx0bGlua0N0eC5fZGVwZW5kcyA9IGRlcGVuZHM7XG5cdFx0Ly8gU3RvcmUgdGhlIGJpbmRpbmcga2V5IG9uIHRoZSB2aWV3LCBmb3IgZGlzcG9zYWwgd2hlbiB0aGUgdmlldyBpcyByZW1vdmVkXG5cdFx0bGlua0N0eC52aWV3Ll8uYm5kc1tiaW5kSWRdID0gYmluZElkO1xuXHRcdC8vIFN0b3JlIHRoZSBiaW5kaW5nLlxuXHRcdGJpbmRpbmdTdG9yZVtiaW5kSWRdID0gYmluZGluZzsgLy8gTm90ZTogSWYgdGhpcyBjb3JyZXNwb25kcyB0byBhIGRhdGEtbGlua2VkIHRhZywgd2UgYXJlIHJlcGxhY2luZyB0aGVcblx0XHQvLyB0ZW1wb3JhcmlseSBzdG9yZWQgdGFnIGJ5IHRoZSBzdG9yZWQgYmluZGluZy4gVGhlIHRhZyB3aWxsIG5vdyBiZSBhdCBiaW5kaW5nLmxpbmtDdHgudGFnXG5cblx0XHRpZiAobGlua2VkRWxlbSkge1xuXHRcdFx0bCA9IGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRsaW5rZWRFbGVtW2xdLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCBsaW5rZWRFbGVtW2xdKTtcblx0XHRcdFx0bGlua2VkRWxlbVtsXS5fanN2Qm5kID0gXCImXCIgKyBiaW5kaW5nLl90Z0lkICsgXCIrXCI7IC8vIEFkZCBhIFwiK1wiIGZvciBjbG9uZWQgYmluZGluZyAtIHNvIHJlbW92aW5nXG5cdFx0XHRcdC8vIGVsZW1zIHdpdGggY2xvbmVkIGJpbmRpbmdzIHdpbGwgbm90IHJlbW92ZSB0aGUgJ3BhcmVudCcgYmluZGluZyBmcm9tIHRoZSBiaW5kaW5nU3RvcmUuXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjdnRCayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCB0YXJnZXQsIGN2dEJrKTtcblx0XHR9XG5cblx0XHRpZiAodGFnKSB7XG5cdFx0XHRpZiAoIXRhZy5mbG93ICYmICF0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0dGFyZ2V0LnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCAodGFyZ2V0LmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKXx8XCJcIikgKyBcIiNcIiArIGJpbmRJZCArIFwiXi9cIiArIGJpbmRJZCArIFwiXlwiKTtcblx0XHRcdFx0dGFnLl90Z0lkID0gXCJcIiArIGJpbmRJZDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLy8tLS0tLS0tXG4vLyAkLmxpbmtcbi8vLS0tLS0tLVxuXG5mdW5jdGlvbiB0bXBsTGluayh0bywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRyZXR1cm4gJGxpbmsodGhpcywgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpO1xufVxuXG5mdW5jdGlvbiAkbGluayh0bXBsT3JMaW5rRXhwciwgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0Ly8gV2hlbiBsaW5raW5nIGZyb20gYSB0ZW1wbGF0ZSwgcHJldk5vZGUgYW5kIG5leHROb2RlIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWRcblx0aWYgKGNvbnRleHQgPT09IHRydWUpIHtcblx0XHRub0l0ZXJhdGlvbiA9IGNvbnRleHQ7IC8vIHBhc3NpbmcgYm9vbGVhbiBhcyB0aGlyZCBwYXJhbSAtIG5vSXRlcmF0aW9uXG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICh0eXBlb2YgY29udGV4dCAhPT0gXCJvYmplY3RcIikge1xuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7IC8vIGNvbnRleHQgbXVzdCBiZSBhIGJvb2xlYW4gKG5vSXRlcmF0aW9uKSBvciBhIHBsYWluIG9iamVjdFxuXHR9IGVsc2Uge1xuXHRcdGNvbnRleHQgPSAkZXh0ZW5kKHt9LCBjb250ZXh0KTtcblx0fVxuXHRpZiAodG1wbE9yTGlua0V4cHIgJiYgdG8pIHtcblx0XHR0byA9IHRvLmpxdWVyeSA/IHRvIDogJCh0byk7IC8vIHRvIGlzIGEganF1ZXJ5IG9iamVjdCBvciBhbiBlbGVtZW50IG9yIHNlbGVjdG9yXG5cblx0XHRpZiAoIWFjdGl2ZUJvZHkpIHtcblx0XHRcdGFjdGl2ZUJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHRcdFx0JChhY3RpdmVCb2R5KVxuXHRcdFx0XHQub24oZWxlbWVudENoYW5nZVN0ciwgZWxlbUNoYW5nZUhhbmRsZXIpXG5cdFx0XHRcdC5vbignYmx1cicsICdbY29udGVudGVkaXRhYmxlXScsIGVsZW1DaGFuZ2VIYW5kbGVyKTtcblx0XHR9XG5cblx0XHR2YXIgaSwgaywgaHRtbCwgdndJbmZvcywgdmlldywgcGxhY2Vob2xkZXJQYXJlbnQsIHRhcmdldEVsLCByZWZyZXNoLCB0b3BMZXZlbENhbGwsXG5cdFx0XHRvblJlbmRlciA9IGFkZEJpbmRpbmdNYXJrZXJzLFxuXHRcdFx0cmVwbGFjZU1vZGUgPSBjb250ZXh0ICYmIGNvbnRleHQudGFyZ2V0ID09PSBcInJlcGxhY2VcIixcblx0XHRcdGwgPSB0by5sZW5ndGg7XG5cblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHR0YXJnZXRFbCA9IHRvW2xdO1xuXG5cdFx0XHRwYXJlbnRWaWV3ID0gcGFyZW50VmlldyB8fCAkdmlldyh0YXJnZXRFbCk7XG5cblx0XHRcdGlmICh0b3BMZXZlbENhbGwgPSBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdHRvcFZpZXcuZGF0YSA9ICh0b3BWaWV3LmN0eCA9IGNvbnRleHQgfHwge30pLnJvb3QgPSBmcm9tO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFwiXCIgKyB0bXBsT3JMaW5rRXhwciA9PT0gdG1wbE9yTGlua0V4cHIpIHtcblx0XHRcdFx0Ly8gdG1wbE9yTGlua0V4cHIgaXMgYSBzdHJpbmc6IHRyZWF0IGFzIGRhdGEtbGluayBleHByZXNzaW9uLlxuXHRcdFx0XHRhZGREYXRhQmluZGluZyh0bXBsT3JMaW5rRXhwciwgdGFyZ2V0RWwsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdHJ1ZSwgZnJvbSwgY29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodG1wbE9yTGlua0V4cHIubWFya3VwICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKClcblx0XHRcdFx0XHRpZiAocmVwbGFjZU1vZGUpIHtcblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyUGFyZW50ID0gdGFyZ2V0RWwucGFyZW50Tm9kZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRodG1sID0gdG1wbE9yTGlua0V4cHIucmVuZGVyKGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCB1bmRlZmluZWQsIG9uUmVuZGVyKTtcblx0XHRcdFx0XHQvLyBUT0RPIENvbnNpZGVyIGZpbmRpbmcgYSB3YXkgdG8gYmluZCBkYXRhIChsaW5rKSB3aXRoaW4gdGVtcGxhdGUgd2l0aG91dCBodG1sIGJlaW5nIGRpZmZlcmVudCBmb3IgZWFjaCB2aWV3LCB0aGUgSFRNTCBjYW5cblx0XHRcdFx0XHQvLyBiZSBldmFsdWF0ZWQgb25jZSBvdXRzaWRlIHRoZSB3aGlsZSAobC0tKSwgYW5kIHB1c2hlZCBpbnRvIGEgZG9jdW1lbnQgZnJhZ21lbnQsIHRoZW4gY2xvbmVkIGFuZCBpbnNlcnRlZCBhdCBlYWNoIHRhcmdldC5cblxuXHRcdFx0XHRcdGlmIChwbGFjZWhvbGRlclBhcmVudCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyB0YXJnZXQ9XCJyZXBsYWNlXCIgbW9kZVxuXHRcdFx0XHRcdFx0cHJldk5vZGUgPSB0YXJnZXRFbC5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHRcdFx0XHRuZXh0Tm9kZSA9IHRhcmdldEVsLm5leHRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0JC5jbGVhbkRhdGEoW3RhcmdldEVsXSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRwbGFjZWhvbGRlclBhcmVudC5yZW1vdmVDaGlsZCh0YXJnZXRFbCk7XG5cblx0XHRcdFx0XHRcdHRhcmdldEVsID0gcGxhY2Vob2xkZXJQYXJlbnQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHByZXZOb2RlID0gbmV4dE5vZGUgPSB1bmRlZmluZWQ7IC8vIFdoZW4gbGlua2luZyBmcm9tIGEgdGVtcGxhdGUsIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkXG5cdFx0XHRcdFx0XHQkKHRhcmdldEVsKS5lbXB0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0bXBsT3JMaW5rRXhwciA9PT0gdHJ1ZSAmJiBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdFx0Ly8gJC5saW5rKHRydWUsIHNlbGVjdG9yLCBkYXRhLCBjdHgpIC0gd2hlcmUgc2VsZWN0b3IgcG9pbnRzIHRvIGVsZW0gaW4gdG9wLWxldmVsIGNvbnRlbnQuIChJZiBub3QgdG9wLWxldmVsIGNvbnRlbnQsIG5vLW9wKVxuXHRcdFx0XHRcdHJlZnJlc2ggPSB7bG5rOiAxfTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG4vLyBUT0RPIENvbnNpZGVyIGRlZmVycmVkIGxpbmtpbmcgQVBJIGZlYXR1cmUgb24gcGVyLXRlbXBsYXRlIGJhc2lzIC0ge0B7IGluc3RlYWQgb2Yge157IHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIHJlbmRlcmVkIGNvbnRlbnRcbi8vIGJlZm9yZSB0aGF0IGNvbnRlbnQgaXMgbGlua2VkLCB3aXRoIGJldHRlciBwZXJjZWl2ZWQgcGVyZi4gSGF2ZSB2aWV3LmxpbmsgcmV0dXJuIGEgZGVmZXJyZWQsIGFuZCBwYXNzIHRoYXQgdG8gb25BZnRlckxpbmsuLi5cbi8vIG9yIHNvbWV0aGluZyBhbG9uZyB0aG9zZSBsaW5lcy5cbi8vIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0aWYgKHRhcmdldEVsLl9kZiAmJiAhbmV4dE5vZGUpIHtcblx0XHRcdFx0XHQvLyBXZSBhcmUgaW5zZXJ0aW5nIG5ldyBjb250ZW50IGFuZCB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzIHNvbWUgZGVmZXJyZWQgYmluZGluZyBhbm5vdGF0aW9ucyxhbmQgdGhlcmUgaXMgbm8gbmV4dE5vZGUuXG5cdFx0XHRcdFx0Ly8gVGhvc2Ugdmlld3MgbWF5IGJlIHN0YWxlIHZpZXdzICh0aGF0IHdpbGwgYmUgcmVjcmVhdGVkIGluIHRoaXMgbmV3IGxpbmtpbmcgYWN0aW9uKSBzbyB3ZSB3aWxsIGZpcnN0IHJlbW92ZSB0aGVtXG5cdFx0XHRcdFx0Ly8gKGlmIG5vdCBhbHJlYWR5IHJlbW92ZWQpLlxuXHRcdFx0XHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3ModGFyZ2V0RWwuX2RmLCB0cnVlLCByT3BlblZpZXdNYXJrZXJzKTtcblxuXHRcdFx0XHRcdGZvciAoaSA9IDAsIGsgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGs7IGkrKykge1xuXHRcdFx0XHRcdFx0dmlldyA9IHZ3SW5mb3NbaV07XG5cdFx0XHRcdFx0XHRpZiAoKHZpZXcgPSB2aWV3U3RvcmVbdmlldy5pZF0pICYmIHZpZXcuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoaXMgaXMgdGhlIF9wcnYgKHByZXZOb2RlKSBmb3IgYSB2aWV3LCByZW1vdmUgdGhlIHZpZXdcblx0XHRcdFx0XHRcdFx0Ly8gLSB1bmxlc3Mgdmlldy5kYXRhIGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHRcdFx0dmlldy5wYXJlbnQucmVtb3ZlVmlld3Modmlldy5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0RWwpOyAvLyByZW1vdmUgZGVmZXIgdG9rZW5zXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMaW5rIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50LCBzaW5jZSB0aGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKCksIG9yIHRvICQoZWwpLmxpbmsodHJ1ZSwgLi4uKSxcblx0XHRcdFx0cGFyZW50Vmlldy5saW5rKGZyb20sIHRhcmdldEVsLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIGh0bWwsIHJlZnJlc2gsIGNvbnRleHQpO1xuLy99LCAwKTtcblx0XHRcdH1cblx0XHRcdGlmICh0b3BMZXZlbENhbGwpIHtcblx0XHRcdFx0dG9wVmlldy5kYXRhID0gdG9wVmlldy5jdHggPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0bzsgLy8gQWxsb3cgY2hhaW5pbmcsIHRvIGF0dGFjaCBldmVudCBoYW5kbGVycywgZXRjLlxufVxuXG4vLy0tLS0tLS0tLS1cbi8vIHZpZXcubGlua1xuLy8tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHZpZXdMaW5rKG91dGVyRGF0YSwgcGFyZW50Tm9kZSwgcHJldk5vZGUsIG5leHROb2RlLCBodG1sLCByZWZyZXNoLCBjb250ZXh0LCB2YWxpZGF0ZU9ubHkpIHtcblx0Ly8gT3B0aW9uYWxseSBpbnNlcnQgSFRNTCBpbnRvIERPTSB1c2luZyBkb2N1bWVudEZyYWdtZW50cyAoYW5kIHdyYXBwaW5nIEhUTUwgYXBwcm9wcmlhdGVseSkuXG5cdC8vIERhdGEtbGluayBleGlzdGluZyBjb250ZW50cyBvZiBwYXJlbnROb2RlLCBvciB0aGUgaW5zZXJ0ZWQgSFRNTCwgaWYgcHJvdmlkZWRcblxuXHQvLyBEZXBlbmRpbmcgb24gdGhlIGNvbnRlbnQgbW9kZWwgZm9yIHRoZSBIVE1MIGVsZW1lbnRzLCB0aGUgc3RhbmRhcmQgZGF0YS1saW5raW5nIG1hcmtlcnMgaW5zZXJ0ZWQgaW4gdGhlIEhUTUwgYnkgYWRkQmluZGluZ01hcmtlcnMgZHVyaW5nXG5cdC8vIHRlbXBsYXRlIHJlbmRlcmluZyB3aWxsIGJlIGNvbnZlcnRlZCBlaXRoZXIgdG8gc2NyaXB0IG1hcmtlciBub2RlcyBvciwgZm9yIGVsZW1lbnQtb25seSBjb250ZW50IHNlY3Rpb25zLCB0byBkYXRhLWpzdiBlbGVtZW50IGFubm90YXRpb25zLlxuXG5cdC8vIERhdGEtbGlua2luZyB3aWxsIHRoZW4gYWRkIF9wcnYgYW5kIF9ueHQgdG8gdmlld3MsIHdoZXJlOlxuXHQvLyAgICAgX3BydjogUmVmZXJlbmNlcyB0aGUgcHJldmlvdXMgbm9kZSAoc2NyaXB0IGVsZW1lbnQgb2YgdHlwZSBcImpzdjEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIGZpcnN0IGVsZW1lbnQgbm9kZSBpbiB0aGUgdmlldyAob3IgaWYgbm9uZSwgc2V0IF9wcnYgPSBfbnh0KVxuXHQvLyAgICAgX254dDogUmVmZXJlbmNlcyB0aGUgbGFzdCBub2RlIChzY3JpcHQgZWxlbWVudCBvZiB0eXBlIFwianN2LzEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIG5leHQgZWxlbWVudCBub2RlIGFmdGVyIHRoZSB2aWV3LlxuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gY29udmVydE1hcmtlcnMoYWxsLCBwcmVjZWRpbmcsIHNlbGZDbG9zZSwgY2xvc2VUYWcsIHNwYWNlQmVmb3JlLCBpZCwgYm91bmRJZCwgc3BhY2VBZnRlciwgdGFnMSwgdGFnMiwgY2xvc2VUYWcyLCBzcGFjZUFmdGVyQ2xvc2UsIHNlbGZDbG9zZTIsIGVuZE9wZW5UYWcpIHtcblx0XHQvLyByQ29udmVydE1hcmtlcnMgPSAvKF58KFxcLz4pfDxcXC8oXFx3Kyk+fCkoXFxzKikoWyNcXC9dXFxkKyg/Ol98KFxcXikpKWAoXFxzKikoPFxcdysoPz1bXFxzXFwvPl0pKT98XFxzKig/Oig8XFx3Kyg/PVtcXHNcXC8+XSkpfDxcXC8oXFx3Kyk+KFxccyopfChcXC8+KVxccyp8KD4pKS9nLFxuXHRcdC8vICAgICAgICAgICAgICAgICBwcmVjLCBzbGZDbCwgY2xzVGFnLCAgc3BCZWZvcmUsIGlkLCAgICAgIGJuZElkICBzcEFmdGVyLHRhZzEsICAgICAgICAgICAgICAgICAgIHRhZzIsICAgICAgICAgICAgICAgY2xUYWcyLHNhYyAgc2xmQ2wyLCBlbmRPcGVuVGFnXG5cdFx0Ly8gQ29udmVydCB0aGUgbWFya2VycyB0aGF0IHdlcmUgaW5jbHVkZWQgYnkgYWRkQmluZGluZ01hcmtlcnMgaW4gdGVtcGxhdGUgb3V0cHV0LCB0byBhcHByb3ByaWF0ZSBET00gYW5ub3RhdGlvbnM6XG5cdFx0Ly8gZGF0YS1qc3YgYXR0cmlidXRlcyAoZm9yIGVsZW1lbnQtb25seSBjb250ZW50KSBvciBzY3JpcHQgbWFya2VyIG5vZGVzICh3aXRoaW4gcGhyYXNpbmcgb3IgZmxvdyBjb250ZW50KS5cblxuLy8gVE9ETyBjb25zaWRlciBkZXRlY3RpbmcgJ3F1b3RlZCcgY29udGV4dHMgKGF0dHJpYnV0ZSBzdHJpbmdzKSBzbyB0aGF0IGF0dHJpYnV0ZSBlbmNvZGluZyBkb2VzIG5vdCBuZWVkIHRvIGVuY29kZSA+XG4vLyBDdXJyZW50bHkgckF0dHJFbmNvZGUgPSAvWz48XCInJl0vZyBpbmNsdWRlcyAnPicgZW5jb2RpbmcgaW4gb3JkZXIgdG8gYXZvaWQgZXJyb25lb3VzIHBhcnNpbmcgb2YgPHNwYW4gdGl0bGU9XCImbHQ7YS8+XCI+PC9zcGFuPlwiPlxuXHRcdHZhciBlcnJvck1zZywgYm5kSWQsXG5cdFx0XHRlbmRPZkVsQ250ID0gXCJcIjtcblx0XHRpZiAoZW5kT3BlblRhZykge1xuXHRcdFx0aW5UYWcgPSAwO1xuXHRcdFx0cmV0dXJuIGFsbDtcblx0XHR9XG5cdFx0dGFnID0gdGFnMSB8fCB0YWcyIHx8IFwiXCI7XG5cdFx0Y2xvc2VUYWcgPSBjbG9zZVRhZyB8fCBjbG9zZVRhZzI7XG5cdFx0c2VsZkNsb3NlID0gc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTI7XG5cdFx0aWYgKGlzVm9pZCAmJiAhc2VsZkNsb3NlICYmICggIWFsbCB8fCBjbG9zZVRhZyB8fCB0YWcgfHwgaWQgJiYgIWluVGFnKSkgeyAvLyAhYWxsID0gZW5kIG9mIHN0cmluZ1xuXHRcdFx0aXNWb2lkID0gdW5kZWZpbmVkO1xuXHRcdFx0cGFyZW50VGFnID0gdGFnU3RhY2suc2hpZnQoKTsgLy8gcHJlY2VkaW5nIHRhZyB3YXMgYSB2b2lkIGVsZW1lbnQsIHdpdGggbm8gY2xvc2luZyBzbGFzaCwgc3VjaCBhcyA8YnI+LlxuXHRcdH1cblx0XHRjbG9zZVRhZyA9IGNsb3NlVGFnIHx8IHNlbGZDbG9zZTtcblx0XHRpZiAoY2xvc2VUYWcpIHtcblx0XHRcdGluVGFnID0gMDtcblx0XHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRcdC8vIFRPRE86IHNtYXJ0IGluc2VydGlvbiBvZiA8dGJvZHk+IC0gdG8gYmUgY29tcGxldGVkIGZvciByb2J1c3QgaW5zZXJ0aW9uIG9mIGRlZmVycmVkIGJpbmRpbmdzIGV0Yy5cblx0XHRcdC8vaWYgKGNsb3NlVGFnID09PSBcInRhYmxlXCIgJiYgcGFyZW50VGFnID09PSBcInRib2R5XCIpIHtcblx0XHRcdC8vXHRwcmVjZWRpbmcgPSBcIjwvdGJvZHk+XCIgKyBwcmVjZWRpbmc7XG5cdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0YWJsZVwiO1xuXHRcdFx0Ly9cdHRhZ1N0YWNrLnNoaWZ0KCk7XG5cdFx0XHQvL31cblx0XHRcdGlmICh2YWxpZGF0ZSkge1xuXHRcdFx0XHRpZiAoc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTIpIHtcblx0XHRcdFx0XHRpZiAoIXZvaWRFbGVtc1twYXJlbnRUYWddICYmICEvO3N2Zzt8O21hdGg7Ly50ZXN0KFwiO1wiICsgdGFnU3RhY2suam9pbihcIjtcIikgKyBcIjtcIikpIHtcblx0XHRcdFx0XHRcdC8vIE9ubHkgc2VsZi1jbG9zaW5nIGVsZW1lbnRzIG11c3QgYmUgbGVnaXRpbWF0ZSB2b2lkIGVsZW1lbnRzLCBzdWNoIGFzIDxici8+LCBwZXIgSFRNTCBzY2hlbWEsXG5cdFx0XHRcdFx0XHQvLyBvciB1bmRlciBzdmcgb3IgbWF0aCBmb3JlaWduIG5hbWVzcGFjZSBlbGVtZW50cy5cblx0XHRcdFx0XHRcdGVycm9yTXNnID0gXCInPFwiICsgcGFyZW50VGFnICsgXCIuLi4vXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZvaWRFbGVtc1tjbG9zZVRhZ10pIHtcblx0XHRcdFx0XHRlcnJvck1zZyA9IFwiJzwvXCIgKyBjbG9zZVRhZzsgLy8gY2xvc2luZyB0YWcgc3VjaCBhcyA8L2lucHV0PlxuXHRcdFx0XHR9IGVsc2UgaWYgKCF0YWdTdGFjay5sZW5ndGggfHwgY2xvc2VUYWcgIT09IHBhcmVudFRhZykge1xuXHRcdFx0XHRcdGVycm9yTXNnID0gXCJNaXNtYXRjaDogJzwvXCIgKyBjbG9zZVRhZztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyb3JNc2cpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihlcnJvck1zZyArIFwiPicgaW46XFxuXCIgKyBodG1sKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJldkVsQ250ID0gZWxDbnQ7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWdTdGFjay5zaGlmdCgpO1xuXHRcdFx0ZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXTtcblx0XHRcdGNsb3NlVGFnMiA9IGNsb3NlVGFnMiA/IChcIjwvXCIgKyBjbG9zZVRhZzIgKyBcIj5cIikgOiBcIlwiO1xuXHRcdFx0aWYgKHByZXZFbENudCkge1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHRcdGRlZmVyICs9IGlkcztcblx0XHRcdFx0aWRzID0gXCJcIjtcblx0XHRcdFx0aWYgKCFlbENudCkge1xuXHRcdFx0XHRcdGVuZE9mRWxDbnQgPSBjbG9zZVRhZzIgKyBvcGVuU2NyaXB0ICsgXCJAXCIgKyBkZWZlciArIGNsb3NlU2NyaXB0ICsgKHNwYWNlQWZ0ZXJDbG9zZSB8fCBcIlwiKTtcblx0XHRcdFx0XHRkZWZlciA9IGRlZmVyU3RhY2suc2hpZnQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlciArPSBcIi1cIjsgLy8gV2lsbCBiZSB1c2VkIGZvciBzdGVwcGluZyBiYWNrIHRocm91Z2ggZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHQvLyBlbENvbnRlbnQgbWFwcyB0YWdOYW1lcyB3aGljaCBoYXZlIG9ubHkgZWxlbWVudCBjb250ZW50LCBzbyBtYXkgbm90IHN1cHBvcnQgc2NyaXB0IG5vZGVzLlxuXHRcdFx0Ly8gV2UgYXJlIGluIGVsZW1lbnQtb25seSBjb250ZW50LCBjYW4gcmVtb3ZlIHdoaXRlIHNwYWNlLCBhbmQgdXNlIGRhdGEtanN2IGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgYXMgbWFya2Vyc1xuXHRcdFx0Ly8gRXhhbXBsZTogPHRyIGRhdGEtanN2PVwiLzJfIzZfXCI+IC0gY2xvc2UgbWFya2VyIGZvciB2aWV3IDIgYW5kIG9wZW4gbWFya2VyIGZvciB2aWV3IDZcblxuXHRcdFx0aWYgKGlkKSB7XG5cdFx0XHRcdC8vIGFwcGVuZCBtYXJrZXIgZm9yIHRoaXMgaWQsIHRvIGlkcyBzdHJpbmdcblx0XHRcdFx0aWRzICs9IGlkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJlY2VkaW5nID0gKGNsb3NlVGFnMiB8fCBzZWxmQ2xvc2UyIHx8IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHQvLyBUT0RPOiBzbWFydCBpbnNlcnRpb24gb2YgPHRib2R5PiAtIHRvIGJlIGNvbXBsZXRlZCBmb3Igcm9idXN0IGluc2VydGlvbiBvZiBkZWZlcnJlZCBiaW5kaW5ncyBldGMuXG5cdFx0XHRcdC8vaWYgKHRhZyA9PT0gXCI8dHJcIiAmJiBwYXJlbnRUYWcgPT09IFwidGFibGVcIikge1xuXHRcdFx0XHQvL1x0dGFnU3RhY2sudW5zaGlmdChwYXJlbnRUYWcpO1xuXHRcdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0Ym9keVwiO1xuXHRcdFx0XHQvL1x0cHJlY2VkaW5nICs9IFwiPFwiICsgcGFyZW50VGFnICsgXCI+XCI7XG5cdFx0XHRcdC8vXHRpZiAoZGVmZXIpIHtcblx0XHRcdFx0Ly9cdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0XHQvL1x0fVxuXHRcdFx0XHQvL1x0Ly8gVE9ETzogbW92ZSB0aGlzIHRvIGRlc2lnbi10aW1lIHZhbGlkYXRpb24gY2hlY2tcblx0XHRcdFx0Ly9cdC8vXHRlcnJvcignXCInICsgcGFyZW50VGFnICsgJ1wiIGhhcyBpbmNvcnJlY3QgcGFyZW50IHRhZycpO1xuXHRcdFx0XHQvL31cblx0XHRcdFx0cHJlY2VkaW5nICs9IHRhZztcblx0XHRcdFx0aWYgKGlkcykge1xuXHRcdFx0XHRcdHByZWNlZGluZyArPSAnICcgKyBqc3ZBdHRyU3RyICsgJz1cIicgKyBpZHMgKyAnXCInO1xuXHRcdFx0XHRcdGlkcyA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgYXJlIGluIHBocmFzaW5nIG9yIGZsb3cgY29udGVudCwgc28gdXNlIHNjcmlwdCBtYXJrZXIgbm9kZXNcblx0XHRcdC8vIEV4YW1wbGU6IDxzY3JpcHQgdHlwZT1cImpzdjMvXCI+PC9zY3JpcHQ+IC0gZGF0YS1saW5rZWQgdGFnLCBjbG9zZSBtYXJrZXJcblx0XHRcdC8vIFdlIHZhbGlkYXRlIHdpdGggaW5UYWcgc28gbm8gc2NyaXB0IG1hcmtlcnMgYXJlIGluc2VydGVkIGluIGF0dHJpYnV0ZSBjb250ZXh0IGUuZy4gZm9yOlxuXHRcdFx0Ly8gXCI8dGFibGUge3tpZiAuLi59fS4uLnt7L2lmfX0uLi4gPlwiIG9yIFwiPHRhYmxlIHt7aWYgLi4ufX0uLi4+IC4uLnt7L2lmfX0uLi5cIlxuXHRcdFx0cHJlY2VkaW5nID0gaWRcblx0XHRcdFx0PyAocHJlY2VkaW5nICsgZW5kT2ZFbENudCArIHNwYWNlQmVmb3JlICsgKGluVGFnID8gXCJcIiA6IG9wZW5TY3JpcHQgKyBpZCArIGNsb3NlU2NyaXB0KSsgc3BhY2VBZnRlciArIHRhZylcblx0XHRcdFx0OiBlbmRPZkVsQ250IHx8IGFsbDtcblx0XHR9XG5cblx0XHRpZiAodmFsaWRhdGUgJiYgYm91bmRJZCkge1xuXHRcdFx0aWYgKGluVGFnKSB7XG5cdFx0XHRcdC8vIEpzVmlld3MgZGF0YS1saW5raW5nIHRhZ3MgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbiBlbGVtZW50IG1hcmt1cC5cblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzMwM1xuXHRcdFx0XHRzeW50YXhFcnJvcigne157IHdpdGhpbiBlbGVtIG1hcmt1cCAoJyArIGluVGFnICsgJyApLiBVc2UgZGF0YS1saW5rPVwiLi4uXCInKTtcblx0XHRcdH1cblx0XHRcdGlmIChpZC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdHRhZ1N0YWNrLnVuc2hpZnQoaWQuc2xpY2UoMSkpO1xuXHRcdFx0fSBlbHNlIGlmIChpZC5zbGljZSgxKSAhPT0gKGJuZElkID0gdGFnU3RhY2suc2hpZnQoKSkpIHtcblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzIxM1xuXHRcdFx0XHRzeW50YXhFcnJvcignQ2xvc2luZyB0YWcgZm9yIHteey4uLn19IHVuZGVyIGRpZmZlcmVudCBlbGVtOiA8JyArIGJuZElkICsgJz4nKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRhZykge1xuXHRcdFx0aW5UYWcgPSB0YWc7XG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHR0YWdTdGFjay51bnNoaWZ0KHBhcmVudFRhZyk7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWcuc2xpY2UoMSk7XG5cdFx0XHRpZiAodmFsaWRhdGUgJiYgdGFnU3RhY2tbMF0gJiYgdGFnU3RhY2tbMF0gPT09IGJhZFBhcmVudFtwYXJlbnRUYWddKSB7XG5cdFx0XHRcdC8vIE1pc3NpbmcgPHRib2R5PlxuXHRcdFx0XHQvLyBUT0RPOiByZXBsYWNlIHRoaXMgYnkgc21hcnQgaW5zZXJ0aW9uIG9mIDx0Ym9keT4gdGFnc1xuXHRcdFx0XHRlcnJvcignUGFyZW50IG9mIDx0cj4gbXVzdCBiZSA8dGJvZHk+Jyk7XG5cdFx0XHR9XG5cdFx0XHRpc1ZvaWQgPSB2b2lkRWxlbXNbcGFyZW50VGFnXTtcblx0XHRcdGlmICgoZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXSkgJiYgIXByZXZFbENudCkge1xuXHRcdFx0XHRkZWZlclN0YWNrLnVuc2hpZnQoZGVmZXIpO1xuXHRcdFx0XHRkZWZlciA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRwcmV2RWxDbnQgPSBlbENudDtcbi8vVE9ETyBDb25zaWRlciBwcm92aWRpbmcgdmFsaWRhdGlvbiB3aGljaCB0aHJvd3MgaWYgeW91IHBsYWNlIDxzcGFuPiBhcyBjaGlsZCBvZiA8dHI+LCBldGMuIC0gc2luY2UgaWYgbm90IGNhdWdodCxcbi8vdGhpcyBjYW4gY2F1c2UgZXJyb3JzIHN1YnNlcXVlbnRseSB3aGljaCBhcmUgZGlmZmljdWx0IHRvIGRlYnVnLlxuLy9cdFx0XHRcdGlmIChlbENvbnRlbnRbdGFnU3RhY2tbMF1dPjIgJiYgIWVsQ250KSB7XG4vL1x0XHRcdFx0XHRlcnJvcihwYXJlbnRUYWcgKyBcIiBpbiBcIiArIHRhZ1N0YWNrWzBdKTtcbi8vXHRcdFx0XHR9XG5cdFx0XHRpZiAoZGVmZXIgJiYgZWxDbnQpIHtcblx0XHRcdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcHJlY2VkaW5nO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJvY2Vzc1ZpZXdJbmZvcyh2d0luZm9zLCB0YXJnZXRQYXJlbnQpIHtcblx0XHQvLyBJZiB0YXJnZXRQYXJlbnQsIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyAod2hpY2ggbWF5IGluY2x1ZGUgbmF2aWdhdGlvbiB0aHJvdWdoICcrLScgcGF0aHMpIGFuZCBob29raW5nIHVwIHRvIHRoZSByaWdodCBwYXJlbnRFbGVtIGV0Yy5cblx0XHQvLyAoYW5kIGVsZW0gbWF5IGFsc28gYmUgZGVmaW5lZCAtIHRoZSBuZXh0IG5vZGUpXG5cdFx0Ly8gSWYgbm8gdGFyZ2V0UGFyZW50LCB0aGVuIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyBvbiBuZXdseSBpbnNlcnRlZCBjb250ZW50XG5cdFx0dmFyIGRlZmVyUGF0aCwgZGVmZXJDaGFyLCBiaW5kQ2hhciwgcGFyZW50RWxlbSwgaWQsIG9uQWZ0Q3IsIGRlZXAsXG5cdFx0XHRhZGRlZEJpbmRFbHMgPSBbXTtcblxuXHRcdC8vIEluIGVsQ250IGNvbnRleHQgKGVsZW1lbnQtb25seSBjb250ZW50IG1vZGVsKSwgcHJldk5vZGUgaXMgdGhlIGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIG9wZW4sIG5leHROb2RlIGlzIHRoZSBmaXJzdCBub2RlIGFmdGVyIHRoZSBjbG9zZS5cblx0XHQvLyBJZiBib3RoIGFyZSBudWxsL3VuZGVmaW5lZCwgdGhlbiBvcGVuIGFuZCBjbG9zZSBhcmUgYXQgZW5kIG9mIHBhcmVudCBjb250ZW50LCBzbyB0aGUgdmlldyBpcyBlbXB0eSwgYW5kIGl0cyBwbGFjZWhvbGRlciBpcyB0aGVcblx0XHQvLyAnbGFzdENoaWxkJyBvZiB0aGUgcGFyZW50Tm9kZS4gSWYgdGhlcmUgaXMgYSBwcmV2Tm9kZSwgdGhlbiBpdCBpcyBlaXRoZXIgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXcsIG9yIHRoZSB2aWV3IGlzIGVtcHR5IGFuZFxuXHRcdC8vIGl0cyBwbGFjZWhvbGRlciBpcyB0aGUgJ3ByZXZpb3VzU2libGluZycgb2YgdGhlIHByZXZOb2RlLCB3aGljaCBpcyBhbHNvIHRoZSBuZXh0Tm9kZS5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0aWYgKHZ3SW5mb3MuX3RrbnMuY2hhckF0KDApID09PSBcIkBcIikge1xuXHRcdFx0XHQvLyBXZSBhcmUgcHJvY2Vzc2luZyBuZXdseSBpbnNlcnRlZCBjb250ZW50LiBUaGlzIGlzIGEgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkIGluIGNvbnZlcnRNYXJrZXJzKCkgdG8gcHJvY2VzcyBkZWZlcnJlZCBiaW5kaW5ncyxcblx0XHRcdFx0Ly8gYW5kIGluc2VydGVkIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHBhcmVudCBlbGVtZW50IC0gYmVjYXVzZSBubyBlbGVtZW50IHRhZ3MgKG91dHNpZGUgZWxDbnQpIHdlcmUgZW5jb3VudGVyZWQgdG8gY2FycnkgdGhvc2UgYmluZGluZyB0b2tlbnMuXG5cdFx0XHRcdC8vIFdlIHdpbGwgc3RlcCBiYWNrIGZyb20gdGhlIHByZWNlZGluZyBzaWJsaW5nIG9mIHRoaXMgZWxlbWVudCwgbG9va2luZyBhdCB0YXJnZXRQYXJlbnQgZWxlbWVudHMgdW50aWwgd2UgZmluZCB0aGUgb25lIHRoYXQgdGhlIGN1cnJlbnQgYmluZGluZ1xuXHRcdFx0XHQvLyB0b2tlbiBiZWxvbmdzIHRvLiBTZXQgZWxlbSB0byBudWxsICh0aGUgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCksIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgRE9NLlxuXHRcdFx0XHR0YXJnZXRQYXJlbnQgPSBlbGVtLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW0pO1xuXHRcdFx0XHRlbGVtID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tsZW5dO1xuLy9pZiAocHJldklkcy5pbmRleE9mKHZ3SW5mby50b2tlbikgPCAwKSB7IC8vIFRoaXMgdG9rZW4gaXMgYSBuZXdseSBjcmVhdGVkIHZpZXcgb3IgdGFnIGJpbmRpbmdcblx0XHRcdFx0YmluZENoYXIgPSB2d0luZm8uY2g7XG5cdFx0XHRcdGlmIChkZWZlclBhdGggPSB2d0luZm8ucGF0aCkge1xuXHRcdFx0XHRcdC8vIFdlIGhhdmUgYSAnZGVmZXJyZWQgcGF0aCdcblx0XHRcdFx0XHRqID0gZGVmZXJQYXRoLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0d2hpbGUgKGRlZmVyQ2hhciA9IGRlZmVyUGF0aC5jaGFyQXQoai0tKSkge1xuXHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBcIitcIiBhbmRcIi1cIiBjaGFyYWN0ZXJzIHRvIG5hdmlnYXRlIHRoZSBwYXRoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBhcmVudCBub2RlIHdoZXJlIHRoZSBkZWZlcnJlZCBiaW5kaW5ncyBvY3VycmVkXG5cdFx0XHRcdFx0XHRpZiAoZGVmZXJDaGFyID09PSBcIitcIikge1xuXHRcdFx0XHRcdFx0XHRpZiAoZGVmZXJQYXRoLmNoYXJBdChqKSA9PT0gXCItXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRqLS07XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50LnByZXZpb3VzU2libGluZztcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50Lmxhc3RDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIE5vdGU6IENhbiB1c2UgcHJldmlvdXNTaWJsaW5nIGFuZCBsYXN0Q2hpbGQsIG5vdCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFuZCBsYXN0RWxlbWVudENoaWxkLFxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgaGF2ZSByZW1vdmVkIHdoaXRlIHNwYWNlIHdpdGhpbiBlbENudC4gSGVuY2Ugc3VwcG9ydCBJRSA8IDlcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJpbmRDaGFyID09PSBcIl5cIikge1xuXHRcdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgYmluZGluZyBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQsIGZvciBleGFtcGxlIGluIGEgZGlmZmVyZW50IGhhbmRsZXIgdG8gYW4gYXJyYXkgY29sbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHRhZyBiaW5kaW5nXG5cdFx0XHRcdFx0XHRkZWVwID0gdGFyZ2V0UGFyZW50ICYmICghZWxlbSB8fCBlbGVtLnBhcmVudE5vZGUgIT09IHRhcmdldFBhcmVudCk7IC8vIFdlIGFyZSBzdGVwcGluZyBiYWNrIGxvb2tpbmcgZm9yIHRoZSByaWdodCB0YXJnZXRQYXJlbnQsXG5cdFx0XHRcdFx0XHQvLyBvciB3ZSBhcmUgbGlua2luZyBleGlzdGluZyBjb250ZW50IGFuZCB0aGlzIGVsZW1lbnQgaXMgaW4gZWxDbnQsIG5vdCBhbiBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIHRhcmdldFBhcmVudC5cblx0XHRcdFx0XHRcdGlmICghZWxlbSB8fCBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHZ3SW5mby5lbENudCAmJiBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdpdGggZWxlbWVudCBvbmx5IGNvbnRlbnQsIGlmIHRoZXJlIGlzIG5vIGZvbGxvd2luZyBlbGVtZW50LCBvciBpZiB0aGUgYmluZGluZyBpcyBkZWVwZXIgdGhhbiB0aGUgZm9sbG93aW5nIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0Ly8gdGhlbiB3ZSBuZWVkIHRvIHNldCB0aGUgb3BlbiBvciBjbG9zZSB0b2tlbiBhcyBhIGRlZmVycmVkIGJpbmRpbmcgYW5ub3RhdGlvbiBvbiB0aGUgcGFyZW50XG5cdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldFBhcmVudCwgKHZ3SW5mby5vcGVuID8gXCIjXCIgOiBcIi9cIikgKyBpZCArIGJpbmRDaGFyICsgKHRhcmdldFBhcmVudC5fZGYgfHwgXCJcIikpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG9yIGNsb3NlIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0uIEFkZCBpdCB0byBiaW5kRWxzLlxuXHRcdFx0XHRcdFx0YWRkZWRCaW5kRWxzLnB1c2goW2RlZXAgPyBudWxsIDogZWxlbSwgdndJbmZvXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZpZXcgPSB2aWV3U3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHZpZXcgbWF5IGhhdmUgYmVlbiBkZWxldGVkLCBmb3IgZXhhbXBsZSBpbiBhIGRpZmZlcmVudCBoYW5kbGVyIHRvIGFuIGFycmF5IGNvbGxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdFx0XHRpZiAoIXZpZXcucGFyZW50RWxlbSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdmlldyBpcyBub3QgYWxyZWFkeSBleHRlbmRlZCBmb3IgSnNWaWV3cywgZXh0ZW5kIGFuZCBpbml0aWFsaXplIHRoZSB2aWV3IG9iamVjdCBjcmVhdGVkIGluIEpzUmVuZGVyLCBhcyBhIEpzVmlld3Mgdmlld1xuXHRcdFx0XHRcdFx0dmlldy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50IHx8IGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlIHx8IHBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHR2aWV3Ll8ub25SZW5kZXIgPSBhZGRCaW5kaW5nTWFya2Vycztcblx0XHRcdFx0XHRcdHZpZXcuXy5vbkFycmF5Q2hhbmdlID0gYXJyYXlDaGFuZ2VIYW5kbGVyO1xuXHRcdFx0XHRcdFx0c2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXJlbnRFbGVtID0gdmlldy5wYXJlbnRFbGVtO1xuXHRcdFx0XHRcdGlmICh2d0luZm8ub3Blbikge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiAnb3BlbiB2aWV3JyBub2RlIChwcmVjZWRpbmcgc2NyaXB0IG1hcmtlciBub2RlLFxuXHRcdFx0XHRcdFx0Ly8gb3IgaWYgZWxDbnQsIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSB2aWV3LCB3aXRoIGEgZGF0YS1qc3YgYW5ub3RhdGlvbikgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdHZpZXcuX2VsQ250ID0gdndJbmZvLmVsQ250O1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFBhcmVudCAmJiAhZWxlbSkge1xuXHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRQYXJlbnQsIFwiI1wiICsgaWQgKyBiaW5kQ2hhciArICh0YXJnZXRQYXJlbnQuX2RmIHx8IFwiXCIpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIE5vIHRhcmdldFBhcmVudCwgc28gdGhlcmUgaXMgYSAuX254dCBlbGVtIChhbmQgdGhpcyBpcyBwcm9jZXNzaW5nIHRva2VucyBvbiB0aGUgZWxlbSlcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9wcnYpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiI1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSAnY2xvc2UgdmlldycgbWFya2VyIG5vZGUgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdGlmICh0YXJnZXRQYXJlbnQgJiYgKCFlbGVtIHx8IGVsZW0ucGFyZW50Tm9kZSAhPT0gdGFyZ2V0UGFyZW50KSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGVyZSBpcyBubyAuX254dCBzbyBhZGQgdG9rZW4gdG8gX2RmLiBJdCBpcyBkZWZlcnJlZC5cblx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0UGFyZW50LCBcIi9cIiArIGlkICsgYmluZENoYXIgKyAodGFyZ2V0UGFyZW50Ll9kZiB8fCBcIlwiKSk7XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZWxlbSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIHZpZXcgZGlkIG5vdCBoYXZlIGEgLl9ueHQsIGJ1dCBoYXMgb25lIG5vdywgc28gdG9rZW4gbWF5IGJlIGluIF9kZiwgYW5kIG11c3QgYmUgcmVtb3ZlZC4gKE5vIGxvbmdlciBkZWZlcnJlZClcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9ueHQpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiL1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob25BZnRDciA9IHZpZXcuY3R4ICYmIHZpZXcuY3R4W29uQWZ0ZXJDcmVhdGVTdHJdIHx8IG9uQWZ0ZXJDcmVhdGUpIHtcblx0XHRcdFx0XHRcdFx0b25BZnRDci5jYWxsKHZpZXcuY3R4LnRhZywgdmlldyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuLy99XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxlbiA9IGFkZGVkQmluZEVscy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0Ly8gVGhlc2Ugd2VyZSBhZGRlZCBpbiByZXZlcnNlIG9yZGVyIHRvIGFkZGVkQmluZEVscy4gV2UgcHVzaCB0aGVtIGluIEJpbmRFbHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG5cdFx0XHRcdGJpbmRFbHMucHVzaChhZGRlZEJpbmRFbHNbbGVuXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAhdndJbmZvcyB8fCB2d0luZm9zLmVsQ250O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Vmlld0luZm9zKHZ3SW5mb3MpIHtcblx0XHQvLyBVc2VkIGJ5IHZpZXcuY2hpbGRUYWdzKCkgYW5kIHRhZy5jaGlsZFRhZ3MoKVxuXHRcdC8vIFNpbWlsYXIgdG8gcHJvY2Vzc1ZpZXdJbmZvcyBpbiBob3cgaXQgc3RlcHMgdGhyb3VnaCBiaW5kaW5ncyB0byBmaW5kIHRhZ3MuIE9ubHkgZmluZHMgZGF0YS1saW5rZWQgdGFncy5cblx0XHR2YXIgbGV2ZWwsIHBhcmVudFRhZywgbmFtZWQ7XG5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tqXTtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0sIHdpdGhpbiB0aGUgY29udGVudCBvZiB0aGUgdGFnIHdob3NlIGlkIGlzIGdldC5pZC4gQWRkIGl0IHRvIGJpbmRFbHMuXG5cdFx0XHRcdC8vIE5vdGUgLSBpZiBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5faXMgPT09IFwidGFnXCIgdGhlbiBnZXRWaWV3SW5mb3MgaXMgYmVpbmcgY2FsbGVkIHRvbyBzb29uIC0gZHVyaW5nIGZpcnN0IGxpbmtpbmcgcGFzc1xuXHRcdFx0XHRwYXJlbnRUYWcgPSB0YWcgPSBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5saW5rQ3R4LnRhZztcblx0XHRcdFx0bmFtZWQgPSB0YWcudGFnTmFtZSA9PT0gdGFnTmFtZTtcblx0XHRcdFx0aWYgKCF0YWcuZmxvdyB8fCBuYW1lZCkge1xuXHRcdFx0XHRcdGlmICghZGVlcCkge1xuXHRcdFx0XHRcdFx0bGV2ZWwgPSAxO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHBhcmVudFRhZyA9IHBhcmVudFRhZy5wYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0bGV2ZWwrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRhZ0RlcHRoID0gdGFnRGVwdGggfHwgbGV2ZWw7IC8vIFRoZSBsZXZlbCBvZiB0aGUgZmlyc3QgdGFnIGVuY291bnRlcmVkLlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoKGRlZXAgfHwgbGV2ZWwgPT09IHRhZ0RlcHRoKSAmJiAoIXRhZ05hbWUgfHwgbmFtZWQpKSB7XG5cdFx0XHRcdFx0XHQvLyBGaWx0ZXIgb24gdG9wLWxldmVsIG9yIHRhZ05hbWUgYXMgYXBwcm9wcmlhdGVcblx0XHRcdFx0XHRcdHRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGRhdGFMaW5rKCkge1xuXHRcdC8vPT09PT09PT09PT09PT09PSBEYXRhLWxpbmsgYW5kIGZpeHVwIG9mIGRhdGEtanN2IGFubm90YXRpb25zID09PT09PT09PT09PT09PT1cblx0XHR2YXIgaiwgaW5kZXgsXG5cdFx0XHR0b2tlbnMgPSBcIlwiLFxuXHRcdFx0d3JhcCA9IHt9LFxuXHRcdFx0c2VsZWN0b3IgPSBsaW5rVmlld3NTZWwgKyAoZ2V0ID8gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgOiBcIlwiKTtcblx0XHRcdC8vIElmIGEgY2hpbGRUYWdzKCkgY2FsbCwgZ2V0ID0gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgLSBzaW5jZSB3ZSBuZWVkIHRvIGluY2x1ZGUgZWxlbWVudHMgdGhhdCBoYXZlIGEgLl9kZiBleHBhbmRvIGZvciBkZWZlcnJlZCB0b2tlbnNcblxuXHRcdGVsZW1zID0gcXNhID8gcGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHBhcmVudE5vZGUpLmdldCgpO1xuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0XHQvLyBUaGUgcHJldk5vZGUgd2lsbCBiZSBpbiB0aGUgcmV0dXJuZWQgcXVlcnksIHNpbmNlIHdlIGNhbGxlZCBtYXJrUHJldk9yTmV4dE5vZGUoKSBvbiBpdC5cblx0XHQvLyBCdXQgaXQgbWF5IGhhdmUgY29udGFpbmVkIG5vZGVzIHRoYXQgc2F0aXNmeSB0aGUgc2VsZWN0b3IgYWxzby5cblx0XHRpZiAocHJldk5vZGUgJiYgcHJldk5vZGUuaW5uZXJIVE1MKSB7XG5cdFx0XHQvLyBGaW5kIHRoZSBsYXN0IGNvbnRhaW5lZCBub2RlIG9mIHByZXZOb2RlLCB0byB1c2UgYXMgdGhlIHByZXZOb2RlIC0gc28gd2Ugb25seSBsaW5rIHN1YnNlcXVlbnQgZWxlbXMgaW4gdGhlIHF1ZXJ5XG5cdFx0XHRwcmV2Tm9kZXMgPSBxc2EgPyBwcmV2Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHByZXZOb2RlKS5nZXQoKTtcblx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVzLmxlbmd0aCA/IHByZXZOb2Rlc1twcmV2Tm9kZXMubGVuZ3RoIC0gMV0gOiBwcmV2Tm9kZTtcblx0XHR9XG5cblx0XHR0YWdEZXB0aCA9IDA7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0ZWxlbSA9IGVsZW1zW2ldO1xuXHRcdFx0aWYgKHByZXZOb2RlICYmICFmb3VuZCkge1xuXHRcdFx0XHQvLyBJZiBwcmV2Tm9kZSBpcyBzZXQsIG5vdCBmYWxzZSwgc2tpcCBsaW5raW5nLiBJZiB0aGlzIGVsZW1lbnQgaXMgdGhlIHByZXZOb2RlLCBzZXQgdG8gZmFsc2Ugc28gc3Vic2VxdWVudCBlbGVtZW50cyB3aWxsIGxpbmsuXG5cdFx0XHRcdGZvdW5kID0gKGVsZW0gPT09IHByZXZOb2RlKTtcblx0XHRcdH0gZWxzZSBpZiAobmV4dE5vZGUgJiYgZWxlbSA9PT0gbmV4dE5vZGUpIHtcblx0XHRcdFx0Ly8gSWYgbmV4dE5vZGUgaXMgc2V0IHRoZW4gYnJlYWsgd2hlbiB3ZSBnZXQgdG8gbmV4dE5vZGVcblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSBpZiAoZWxlbS5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdC8vIGVsZW0gaGFzIG5vdCBiZWVuIHJlbW92ZWQgZnJvbSBET01cblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0XHRpZiAoZWxlbS5fZGYpIHtcblx0XHRcdFx0XHRcdGogPSBpICsgMTtcblx0XHRcdFx0XHRcdHdoaWxlIChqIDwgbCAmJiBlbGVtLmNvbnRhaW5zKGVsZW1zW2pdKSkge1xuXHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBBZGQgZGVmZXJlZCB0b2tlbnMgYWZ0ZXIgYW55IHRva2VucyBvbiBkZXNjZW5kYW50IGVsZW1lbnRzIG9mIHRoaXMgb25lXG5cdFx0XHRcdFx0XHR3cmFwW2otMV0gPSBlbGVtLl9kZjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHdyYXBbaV0pIHtcblx0XHRcdFx0XHRcdHRva2VucyArPSB3cmFwW2ldIHx8IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChpc0xpbmsgJiYgKHZ3SW5mbyA9IHZpZXdJbmZvcyhlbGVtLCB1bmRlZmluZWQsIHJWaWV3TWFya2VycykpICYmICh2d0luZm8gPSB2d0luZm9bMF0pKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIGEgbGluayh0cnVlT3JTdHJpbmcgLi4uKSBjYWxsIHdlIHdpbGwgYXZvaWQgcmUtYmluZGluZyB0byBlbGVtcyB0aGF0IGFyZSB3aXRoaW4gdGVtcGxhdGUtcmVuZGVyZWQgdmlld3Ncblx0XHRcdFx0XHRcdHNraXAgPSBza2lwID8gKHZ3SW5mby5pZCAhPT0gc2tpcCAmJiBza2lwKSA6IHZ3SW5mby5vcGVuICYmIHZ3SW5mby5pZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFza2lwICYmIHByb2Nlc3NJbmZvcyh2aWV3SW5mb3MoZWxlbSkpXG5cdFx0XHRcdFx0XHQvLyBJZiBhIGxpbmsoKSBjYWxsLCBwcm9jZXNzVmlld0luZm9zKCkgYWRkcyBiaW5kaW5ncyB0byBiaW5kRWxzLCBhbmQgcmV0dXJucyB0cnVlIGZvciBub24tc2NyaXB0IG5vZGVzLCBmb3IgYWRkaW5nIGRhdGEtbGluayBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBjaGlsZFRhZ3MoKSBjYWxsLCBnZXRWaWV3SW5mb3MgcmV0dXJucyBhcnJheSBvZiB0YWcgYmluZGluZ3MuXG5cdFx0XHRcdFx0XHRcdCYmIGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0XHRcdFx0YmluZEVscy5wdXNoKFtlbGVtXSk7IC8vIEEgZGF0YS1saW5rZWQgZWxlbWVudCBzbyBhZGQgdG8gYmluZEVscyB0b29cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0KSB7XG5cdFx0XHR0b2tlbnMgKz0gcGFyZW50Tm9kZS5fZGYgfHwgXCJcIjtcblx0XHRcdGlmIChpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiI1wiICsgZ2V0LmlkKSArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gc3RhcnQgYWZ0ZXIgdGhlIG9wZW4gdG9rZW4gb2YgdGhlIHBhcmVudCB2aWV3IG9yIHRhZy5cblx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKGluZGV4ICsgZ2V0LmlkLmxlbmd0aCk7XG5cdFx0XHR9XG5cdFx0XHRpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiL1wiICsgZ2V0LmlkKTtcblx0XHRcdGlmIChpbmRleCArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gZG9uJ3QgbG9vayBiZXlvbmQgdGhlIGNsb3NlIHRva2VuIG9mIHRoZSBwYXJlbnQgdmlldyBvciB0YWcuXG5cdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZSgwLCBpbmRleCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBDYWxsIGdldFZpZXdJbmZvcyB0byBhZGQgdGhlIGZvdW5kIGNoaWxkVGFncyB0byB0aGUgdGFncyBhcnJheVxuXHRcdFx0Z2V0Vmlld0luZm9zKHZpZXdJbmZvcyh0b2tlbnMsIHVuZGVmaW5lZCwgck9wZW5UYWdNYXJrZXJzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKGh0bWwgPT09IHVuZGVmaW5lZCAmJiBwYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikpIHtcblx0XHRcdGJpbmRFbHMucHVzaChbcGFyZW50Tm9kZV0pOyAvLyBTdXBwb3J0IGRhdGEtbGlua2luZyB0b3AtbGV2ZWwgZWxlbWVudCBkaXJlY3RseSAobm90IHdpdGhpbiBhIGRhdGEtbGlua2VkIGNvbnRhaW5lcilcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGVtcG9yYXJ5IG1hcmtlciBzY3JpcHQgbm9kZXMgdGhleSB3ZXJlIGFkZGVkIGJ5IG1hcmtQcmV2T3JOZXh0Tm9kZVxuXHRcdHVubWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdFx0dW5tYXJrUHJldk9yTmV4dE5vZGUobmV4dE5vZGUsIGVsQ250KTtcblxuXHRcdGlmIChnZXQpIHtcblx0XHRcdGlmIChsYXp5TGluaykge1xuXHRcdFx0XHRsYXp5TGluay5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47IC8vIFdlIGhhdmUgYWRkZWQgY2hpbGRUYWdzIHRvIHRoZSB0YWdzIGFycmF5LCBzbyB3ZSBhcmUgZG9uZVxuXHRcdH1cblxuXHRcdGlmIChlbENudCAmJiBkZWZlciArIGlkcykge1xuXHRcdFx0Ly8gVGhlcmUgYXJlIHNvbWUgdmlld3Mgd2l0aCBlbENudCwgZm9yIHdoaWNoIHRoZSBvcGVuIG9yIGNsb3NlIGRpZCBub3QgcHJlY2VkZSBhbnkgSFRNTCB0YWcgLSBzbyB0aGV5IGhhdmUgbm90IGJlZW4gcHJvY2Vzc2VkIHlldFxuXHRcdFx0ZWxlbSA9IG5leHROb2RlO1xuXHRcdFx0aWYgKGRlZmVyKSB7XG5cdFx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHRcdHByb2Nlc3NWaWV3SW5mb3Modmlld0luZm9zKGRlZmVyICsgXCIrXCIsIHRydWUpLCBuZXh0Tm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoZGVmZXIsIHRydWUpLCBwYXJlbnROb2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoaWRzLCB0cnVlKSwgcGFyZW50Tm9kZSk7XG5cdFx0XHQvLyBJZiB0aGVyZSB3ZXJlIGFueSB0b2tlbnMgb24gbmV4dE5vZGUgd2hpY2ggaGF2ZSBub3cgYmVlbiBhc3NvY2lhdGVkIHdpdGggaW5zZXJ0ZWQgSFRNTCB0YWdzLCByZW1vdmUgdGhlbSBmcm9tIG5leHROb2RlXG5cdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0dG9rZW5zID0gbmV4dE5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpO1xuXHRcdFx0XHRpZiAobCA9IHRva2Vucy5pbmRleE9mKHByZXZJZHMpICsgMSkge1xuXHRcdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZShsICsgcHJldklkcy5sZW5ndGggLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRuZXh0Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgaWRzICsgdG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLz09PT09PT09PT09PT09PT0gQmluZCB0aGUgZGF0YS1saW5rZWQgZWxlbWVudHMgYW5kIHRhZ3MgPT09PT09PT09PT09PT09PVxuXHRcdGwgPSBiaW5kRWxzLmxlbmd0aDtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRlbGVtID0gYmluZEVsc1tpXTtcblx0XHRcdGxpbmtJbmZvID0gZWxlbVsxXTtcblx0XHRcdGVsZW0gPSBlbGVtWzBdO1xuXHRcdFx0aWYgKGxpbmtJbmZvKSB7XG5cdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbbGlua0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtDdHggPSB0YWcubGlua0N0eCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHRhZyBtYXkgaGF2ZSBiZWVuIHN0b3JlZCB0ZW1wb3JhcmlseSBvbiB0aGUgYmluZGluZ1N0b3JlIC0gb3IgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBhY3R1YWwgYmluZGluZ1xuXHRcdFx0XHRcdFx0dGFnID0gbGlua0N0eC50YWc7XG5cdFx0XHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsaW5rSW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuICdvcGVuIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRcdFx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHR0YWcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0YWcuX2VsQ250ID0gbGlua0luZm8uZWxDbnQ7XG5cdFx0XHRcdFx0XHQvLyBXZSBkYXRhLWxpbmsgZGVwdGgtZmlyc3QgKFwib24gdGhlIHdheSBpblwiKSwgd2hpY2ggaXMgYmV0dGVyIGZvciBwZXJmIC0gYW5kIGFsbG93cyBzZXR0aW5nIHBhcmVudCB0YWdzIGV0Yy5cblx0XHRcdFx0XHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXc7XG5cdFx0XHRcdFx0XHRhZGREYXRhQmluZGluZyh1bmRlZmluZWQsIHRhZy5fcHJ2LCB2aWV3LCBsaW5rSW5mby5pZCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRhZy5fbnh0ID0gZWxlbTtcblx0XHRcdFx0XHRcdGlmICh0YWcuXy51bmxpbmtlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgJ2Nsb3NlIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHQvLyBBZGQgZGF0YSBiaW5kaW5nXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eCA9IHRhZy50YWdDdHg7XG5cdFx0XHRcdFx0XHRcdHZpZXcgPSB0YWdDdHgudmlldztcblx0XHRcdFx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQWRkIGRhdGEgYmluZGluZyBmb3IgYSBkYXRhLWxpbmtlZCBlbGVtZW50ICh3aXRoIGRhdGEtbGluayBhdHRyaWJ1dGUpXG5cdFx0XHRcdGFkZERhdGFCaW5kaW5nKGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSwgZWxlbSwgJHZpZXcoZWxlbSksIHVuZGVmaW5lZCwgaXNMaW5rLCBvdXRlckRhdGEsIGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobGF6eUxpbmspIHtcblx0XHRcdGxhenlMaW5rLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblx0Ly89PT09IC9lbmQgb2YgbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cblx0dmFyIGluVGFnLCBsaW5rQ3R4LCB0YWcsIGksIGwsIGosIGxlbiwgZWxlbXMsIGVsZW0sIHZpZXcsIHZ3SW5mbywgbGlua0luZm8sIHByZXZOb2RlcywgdG9rZW4sIHByZXZWaWV3LCBuZXh0Vmlldyxcblx0XHRub2RlLCB0YWdzLCBkZWVwLCB0YWdOYW1lLCB0YWdDdHgsIHZhbGlkYXRlLCB0YWdEZXB0aCwgZGVwdGgsIGZyYWdtZW50LCBjb3BpZWROb2RlLCBmaXJzdFRhZywgcGFyZW50VGFnLFxuXHRcdGlzVm9pZCwgd3JhcHBlciwgZGl2LCB0b2tlbnMsIGVsQ250LCBwcmV2RWxDbnQsIGh0bWxUYWcsIGlkcywgcHJldklkcywgZm91bmQsIHNraXAsIGxhenlMaW5rLCBpc0xpbmssIGdldCxcblx0XHRzZWxmID0gdGhpcyxcblx0XHR0aGlzSWQgPSBzZWxmLl8uaWQgKyBcIl9cIixcblx0XHRkZWZlciA9IFwiXCIsXG5cdFx0Ly8gVGhlIG1hcmtlciBpZHMgZm9yIHdoaWNoIG5vIHRhZyB3YXMgZW5jb3VudGVyZWQgKGVtcHR5IHZpZXdzIG9yIGZpbmFsIGNsb3NpbmcgbWFya2Vycykgd2hpY2ggd2UgY2Fycnkgb3ZlciB0byBjb250YWluZXIgdGFnXG5cdFx0YmluZEVscyA9IFtdLFxuXHRcdHRhZ1N0YWNrID0gW10sXG5cdFx0ZGVmZXJTdGFjayA9IFtdLFxuXHRcdG9uQWZ0ZXJDcmVhdGUgPSBzZWxmLmhscChvbkFmdGVyQ3JlYXRlU3RyKSxcblx0XHRwcm9jZXNzSW5mb3MgPSBwcm9jZXNzVmlld0luZm9zO1xuXG5cdGlmIChyZWZyZXNoKSB7XG5cdFx0bGF6eUxpbmsgPSByZWZyZXNoLmxhenlMaW5rICYmICQuRGVmZXJyZWQoKTtcblx0XHRpZiAocmVmcmVzaC50bXBsKSB7XG5cdFx0XHQvLyByZWZyZXNoIGlzIHRoZSBwcmV2VmlldywgcGFzc2VkIGluIGZyb20gYWRkVmlld3MoKVxuXHRcdFx0cHJldlZpZXcgPSBcIi9cIiArIHJlZnJlc2guXy5pZCArIFwiX1wiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpc0xpbmsgPSByZWZyZXNoLmxuazsgLy8gVG9wLWxldmVsIGxpbmtpbmdcblx0XHRcdGlmIChyZWZyZXNoLnRhZykge1xuXHRcdFx0XHR0aGlzSWQgPSByZWZyZXNoLnRhZyArIFwiXlwiO1xuXHRcdFx0XHRyZWZyZXNoID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChnZXQgPSByZWZyZXNoLmdldCkge1xuXHRcdFx0XHRwcm9jZXNzSW5mb3MgPSBnZXRWaWV3SW5mb3M7XG5cdFx0XHRcdHRhZ3MgPSBnZXQudGFncztcblx0XHRcdFx0ZGVlcCA9IGdldC5kZWVwO1xuXHRcdFx0XHR0YWdOYW1lID0gZ2V0Lm5hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlZnJlc2ggPSByZWZyZXNoID09PSB0cnVlO1xuXHR9XG5cblx0cGFyZW50Tm9kZSA9IHBhcmVudE5vZGVcblx0XHQ/IChcIlwiICsgcGFyZW50Tm9kZSA9PT0gcGFyZW50Tm9kZVxuXHRcdFx0PyAkKHBhcmVudE5vZGUpWzBdICAvLyBJdCBpcyBhIHN0cmluZywgc28gdHJlYXQgYXMgc2VsZWN0b3Jcblx0XHRcdDogcGFyZW50Tm9kZS5qcXVlcnlcblx0XHRcdFx0PyBwYXJlbnROb2RlWzBdIC8vIEEgalF1ZXJ5IG9iamVjdCAtIHRha2UgZmlyc3QgZWxlbWVudC5cblx0XHRcdFx0OiBwYXJlbnROb2RlKVxuXHRcdDogKHNlbGYucGFyZW50RWxlbSAgICAgIC8vIHZpZXcubGluaygpXG5cdFx0XHR8fCBkb2N1bWVudC5ib2R5KTsgIC8vIGxpbmsobnVsbCwgZGF0YSkgdG8gbGluayB0aGUgd2hvbGUgZG9jdW1lbnRcblxuXHR2YWxpZGF0ZSA9ICEkc3ViU2V0dGluZ3NBZHZhbmNlZC5ub1ZhbGlkYXRlICYmIHBhcmVudE5vZGUuY29udGVudEVkaXRhYmxlICE9PSBUUlVFO1xuXHRwYXJlbnRUYWcgPSBwYXJlbnROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblx0ZWxDbnQgPSAhIWVsQ29udGVudFtwYXJlbnRUYWddO1xuXG5cdHByZXZOb2RlID0gcHJldk5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdG5leHROb2RlID0gbmV4dE5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKG5leHROb2RlLCBlbENudCkgfHwgbnVsbDtcblxuXHRpZiAoaHRtbCAhPSB1bmRlZmluZWQpIHtcblx0XHQvLz09PT09PT09PT09PT09PT0gSW5zZXJ0IGh0bWwgaW50byBET00gdXNpbmcgZG9jdW1lbnRGcmFnbWVudHMgKGFuZCB3cmFwcGluZyBIVE1MIGFwcHJvcHJpYXRlbHkpLiA9PT09PT09PT09PT09PT09XG5cdFx0Ly8gQWxzbyBjb252ZXJ0IG1hcmtlcnMgdG8gRE9NIGFubm90YXRpb25zLCBiYXNlZCBvbiBjb250ZW50IG1vZGVsLlxuXHRcdC8vIENvcnJlc3BvbmRzIHRvIG5leHROb2RlID8gJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIDogJChwYXJlbnROb2RlKS5odG1sKGh0bWwpO1xuXHRcdC8vIGJ1dCBhbGxvd3MgaW5zZXJ0aW9uIHRvIHdyYXAgY29ycmVjdGx5IGV2ZW4gd2l0aCBpbnNlcnRlZCBzY3JpcHQgbm9kZXMuIGpRdWVyeSB2ZXJzaW9uIHdpbGwgZmFpbCBlLmcuIHVuZGVyIHRib2R5IG9yIHNlbGVjdC5cblx0XHQvLyBUaGlzIHZlcnNpb24gc2hvdWxkIGFsc28gYmUgc2xpZ2h0bHkgZmFzdGVyXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR3cmFwcGVyID0gZGl2O1xuXHRcdHByZXZJZHMgPSBpZHMgPSBcIlwiO1xuXHRcdGh0bWxUYWcgPSBwYXJlbnROb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiID8gXCJzdmdfbnNcIiA6IChmaXJzdFRhZyA9IHJGaXJzdEVsZW0uZXhlYyhodG1sKSkgJiYgZmlyc3RUYWdbMV0gfHwgXCJcIjtcblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdC8vIE5vdyBsb29rIGZvciBmb2xsb3dpbmcgdmlldywgYW5kIGZpbmQgaXRzIHRva2Vucywgb3IgaWYgbm90IGZvdW5kLCBnZXQgdGhlIHBhcmVudE5vZGUuX2RmIHRva2Vuc1xuXHRcdFx0bm9kZSA9IG5leHROb2RlO1xuXHRcdFx0d2hpbGUgKG5vZGUgJiYgIShuZXh0VmlldyA9IHZpZXdJbmZvcyhub2RlKSkpIHtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAodG9rZW5zID0gbmV4dFZpZXcgPyBuZXh0Vmlldy5fdGtucyA6IHBhcmVudE5vZGUuX2RmKSB7XG5cdFx0XHRcdHRva2VuID0gcHJldlZpZXcgfHwgXCJcIjtcblx0XHRcdFx0aWYgKHJlZnJlc2ggfHwgIXByZXZWaWV3KSB7XG5cdFx0XHRcdFx0dG9rZW4gKz0gXCIjXCIgKyB0aGlzSWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aiA9IHRva2Vucy5pbmRleE9mKHRva2VuKTtcblx0XHRcdFx0aWYgKGogKyAxKSB7XG5cdFx0XHRcdFx0aiArPSB0b2tlbi5sZW5ndGg7XG5cdFx0XHRcdFx0Ly8gVHJhbnNmZXIgdGhlIGluaXRpYWwgdG9rZW5zIHRvIGluc2VydGVkIG5vZGVzLCBieSBzZXR0aW5nIHRoZW0gYXMgdGhlIGlkcyB2YXJpYWJsZSwgcGlja2VkIHVwIGluIGNvbnZlcnRNYXJrZXJzXG5cdFx0XHRcdFx0cHJldklkcyA9IGlkcyA9IHRva2Vucy5zbGljZSgwLCBqKTtcblx0XHRcdFx0XHR0b2tlbnMgPSB0b2tlbnMuc2xpY2Uoaik7XG5cdFx0XHRcdFx0aWYgKG5leHRWaWV3KSB7XG5cdFx0XHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnROb2RlLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vPT09PT09PT09PT09PT09PSBDb252ZXJ0IHRoZSBtYXJrZXJzIHRvIERPTSBhbm5vdGF0aW9ucywgYmFzZWQgb24gY29udGVudCBtb2RlbC4gPT09PT09PT09PT09PT09PVxuLy9cdFx0XHRvbGRFbENudCA9IGVsQ250O1xuXHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRodG1sID0gKFwiXCIgKyBodG1sKS5yZXBsYWNlKHJDb252ZXJ0TWFya2VycywgY29udmVydE1hcmtlcnMpO1xuLy9cdFx0XHRpZiAoISFvbGRFbENudCAhPT0gISFlbENudCkge1xuLy9cdFx0XHRcdGVycm9yKFwiUGFyc2U6IFwiICsgaHRtbCk7IC8vIFBhcnNlIGVycm9yLiBDb250ZW50IG5vdCB3ZWxsLWZvcm1lZD9cbi8vXHRcdFx0fVxuXHRcdGlmICh2YWxpZGF0ZSAmJiB0YWdTdGFjay5sZW5ndGgpIHtcblx0XHRcdHN5bnRheEVycm9yKFwiTWlzbWF0Y2hlZCAnPFwiICsgcGFyZW50VGFnICsgXCIuLi4+JyBpbjpcXG5cIiArIGh0bWwpOyAvLyBVbm1hdGNoZWQgdGFnXG5cdFx0fVxuXHRcdGlmICh2YWxpZGF0ZU9ubHkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gQXBwZW5kIHdyYXBwZXIgZWxlbWVudCB0byBkb2MgZnJhZ21lbnRcblx0XHRzYWZlRnJhZ21lbnQuYXBwZW5kQ2hpbGQoZGl2KTtcblxuXHRcdC8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnNcblx0XHQvLyBDb3JyZXNwb25kcyB0byBqUXVlcnkgJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIG9yICQocGFyZW50Tm9kZSkuaHRtbChodG1sKTtcblx0XHQvLyBidXQgc3VwcG9ydHMgc3ZnIGVsZW1lbnRzLCBhbmQgb3RoZXIgZmVhdHVyZXMgbWlzc2luZyBmcm9tIGpRdWVyeSB2ZXJzaW9uIChhbmQgdGhpcyB2ZXJzaW9uIHNob3VsZCBhbHNvIGJlIHNsaWdodGx5IGZhc3Rlcilcblx0XHRodG1sVGFnID0gd3JhcE1hcFtodG1sVGFnXSB8fCB3cmFwTWFwLmRpdjtcblx0XHRkZXB0aCA9IGh0bWxUYWdbMF07XG5cdFx0d3JhcHBlci5pbm5lckhUTUwgPSBodG1sVGFnWzFdICsgaHRtbCArIGh0bWxUYWdbMl07XG5cdFx0d2hpbGUgKGRlcHRoLS0pIHtcblx0XHRcdHdyYXBwZXIgPSB3cmFwcGVyLmxhc3RDaGlsZDtcblx0XHR9XG5cdFx0c2FmZUZyYWdtZW50LnJlbW92ZUNoaWxkKGRpdik7XG5cdFx0ZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0d2hpbGUgKGNvcGllZE5vZGUgPSB3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcblx0XHRcdGZyYWdtZW50LmFwcGVuZENoaWxkKGNvcGllZE5vZGUpO1xuXHRcdH1cblx0XHQvLyBJbnNlcnQgaW50byB0aGUgRE9NXG5cdFx0cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIG5leHROb2RlKTtcblx0fVxuXG5cdGlmIChsYXp5TGluaykge1xuXHRcdHNldFRpbWVvdXQoZGF0YUxpbmssIDApO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGFMaW5rKCk7XG5cdH1cblxuXHRyZXR1cm4gbGF6eUxpbmsgJiYgbGF6eUxpbmsucHJvbWlzZSgpO1xufVxuXG5mdW5jdGlvbiBhZGREYXRhQmluZGluZyhsaW5rTWFya3VwLCBub2RlLCBjdXJyZW50VmlldywgYm91bmRUYWdJZCwgaXNMaW5rLCBkYXRhLCBjb250ZXh0KSB7XG5cdC8vIEFkZCBkYXRhIGJpbmRpbmcgZm9yIGRhdGEtbGlua2VkIGVsZW1lbnRzIG9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZ3Ncblx0dmFyIHRtcGwsIHRva2VucywgYXR0ciwgY29udmVydEJhY2ssIHRhZ0V4cHIsIGxpbmtGbiwgbGlua0N0eCwgdGFnLCByVGFnSW5kZXgsIGhhc0Vsc2UsIGxhc3RJbmRleCxcblx0XHRsaW5rRXhwcmVzc2lvbnMgPSBbXTtcblxuXHRpZiAoYm91bmRUYWdJZCkge1xuXHRcdC8vIGJvdW5kVGFnSWQgaXMgYSBzdHJpbmcgZm9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZy4gU28gb25seSBvbmUgbGlua1RhZyBpbiBsaW5rTWFya3VwXG5cdFx0Ly8gZGF0YSBhbmQgY29udGV4dCBwYXJhbWV0ZXJzIGFyZSB1bmRlZmluZWRcblx0XHR0YWcgPSBiaW5kaW5nU3RvcmVbYm91bmRUYWdJZF07XG5cdFx0dGFnID0gdGFnLmxpbmtDdHggPyB0YWcubGlua0N0eC50YWcgOiB0YWc7XG5cblx0XHRsaW5rQ3R4ID0gdGFnLmxpbmtDdHggfHwge1xuXHRcdFx0dHlwZTogXCJpbmxpbmVcIixcblx0XHRcdGRhdGE6IGN1cnJlbnRWaWV3LmRhdGEsICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZVxuXHRcdFx0ZWxlbTogdGFnLl9lbENudCA/IHRhZy5wYXJlbnRFbGVtIDogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHR2aWV3OiBjdXJyZW50Vmlldyxcblx0XHRcdGN0eDogY3VycmVudFZpZXcuY3R4LFxuXHRcdFx0YXR0cjogSFRNTCwgLy8gU2NyaXB0IG1hcmtlciBub2RlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHteeyBhbmQgYWx3YXlzIHRhcmdldCBIVE1MLlxuXHRcdFx0Zm46IHRhZy5fLmJuZCxcblx0XHRcdHRhZzogdGFnLFxuXHRcdFx0Ly8gUGFzcyB0aGUgYm91bmRUYWdJZCBpbiB0aGUgbGlua0N0eCwgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGluIG9ic2VydmVBbmRCaW5kXG5cdFx0XHRfYm5kSWQ6IGJvdW5kVGFnSWRcblx0XHR9O1xuXHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rQ3R4LmZuKTtcblx0fSBlbHNlIGlmIChsaW5rTWFya3VwICYmIG5vZGUpIHtcblx0XHQvLyBJZiBpc0xpbmsgdGhlbiB0aGlzIGlzIGEgdG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb24sIHRhcmdldCwgZGF0YSwgLi4uLikgb3Jcblx0XHQvLyAubGluayh0cnVlLCB0YXJnZXQsIGRhdGEsIC4uLi4pIHNjZW5hcmlvIC0gYW5kIGRhdGEgYW5kIGNvbnRleHQgYXJlIHBhc3NlZCBpbiBzZXBhcmF0ZWx5IGZyb20gdGhlIHZpZXdcblx0XHRkYXRhID0gaXNMaW5rID8gZGF0YSA6IGN1cnJlbnRWaWV3LmRhdGE7XG5cblx0XHQvLyBDb21waWxlZCBsaW5rRm4gZXhwcmVzc2lvbnMgY291bGQgYmUgc3RvcmVkIGluIHRoZSB0bXBsLmxpbmtzIGFycmF5IG9mIHRoZSB0ZW1wbGF0ZVxuXHRcdC8vIFRPRE8gLSBjb25zaWRlciBhbHNvIGNhY2hpbmcgZ2xvYmFsbHkgc28gdGhhdCBpZiB7ezpmb299fSBvciBkYXRhLWxpbms9XCJmb29cIiBvY2N1cnMgaW4gZGlmZmVyZW50IHBsYWNlcyxcblx0XHQvLyB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZm9yIHRoaXMgaXMgY2FjaGVkIGFuZCBvbmx5IGNvbXBpbGVkIG9uY2UuLi5cblx0XHQvL2xpbmtzID0gY3VycmVudFZpZXcubGlua3MgfHwgY3VycmVudFZpZXcudG1wbC5saW5rcztcblxuXHRcdHRtcGwgPSBjdXJyZW50Vmlldy50bXBsO1xuXG4vL1x0XHRcdGlmICghKGxpbmtUYWdzID0gbGlua3NbbGlua01hcmt1cF0pKSB7XG5cdFx0Ly8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGlzIHZpZXcgdGVtcGxhdGUgaGFzIGJlZW4gbGlua2VkLCBzbyB3ZSBjb21waWxlIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSB0ZW1wbGF0ZS5cblxuXHRcdGxpbmtNYXJrdXAgPSBub3JtYWxpemVMaW5rVGFnKGxpbmtNYXJrdXAsIGRlZmF1bHRBdHRyKG5vZGUpKTtcblx0XHRsYXN0SW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4ID0gMDtcblx0XHR3aGlsZSAodG9rZW5zID0gclRhZ0RhdGFsaW5rLmV4ZWMobGlua01hcmt1cCkpIHsgLy8gVE9ETyByZXF1aXJlIH0gdG8gYmUgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAkLCBhbmQgcmVtb3ZlIHRoZSBcXH0oIVxcfSkgb3B0aW9uLlxuXHRcdFx0bGlua0V4cHJlc3Npb25zLnB1c2godG9rZW5zKTtcblx0XHRcdGxhc3RJbmRleCA9IHJUYWdEYXRhbGluay5sYXN0SW5kZXg7XG5cdFx0fVxuXHRcdGlmIChsYXN0SW5kZXggPCBsaW5rTWFya3VwLmxlbmd0aCkge1xuXHRcdFx0c3ludGF4RXJyb3IobGlua01hcmt1cCk7XG5cdFx0fVxuXHRcdHdoaWxlICh0b2tlbnMgPSBsaW5rRXhwcmVzc2lvbnMuc2hpZnQoKSkge1xuXHRcdFx0Ly8gSXRlcmF0ZSBvdmVyIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGZvciBkaWZmZXJlbnQgdGFyZ2V0IGF0dHJzLFxuXHRcdFx0Ly8gZS5nLiA8aW5wdXQgZGF0YS1saW5rPVwiezpmaXJzdE5hbWU6fSB0aXRsZXs+fmRlc2NyaXB0aW9uKGZpcnN0TmFtZSwgbGFzdE5hbWUpfVwiXG5cdFx0XHQvLyB0b2tlbnM6IFthbGwsIGF0dHIsIGJpbmRPbmx5LCB0YWdFeHByLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIGNvbG9uLCBodG1sLCBjb21tZW50LCBjb2RlLCBwYXJhbXNdXG5cdFx0XHRyVGFnSW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4O1xuXHRcdFx0YXR0ciA9IHRva2Vuc1sxXTtcblx0XHRcdHRhZ0V4cHIgPSB0b2tlbnNbM107XG5cdFx0XHR3aGlsZSAobGlua0V4cHJlc3Npb25zWzBdICYmIGxpbmtFeHByZXNzaW9uc1swXVs0XSA9PT0gXCJlbHNlXCIpIHsgLy8gSWYgdGhpcyBpcyB7c29tZVRhZy4uLn0gYW5kIGlzIGZvbGxvd2VkIGJ5IGFuIHtlbHNlLi4ufSBhZGQgdG8gdGFnRXhwclxuXHRcdFx0XHR0YWdFeHByICs9IGRlbGltQ2xvc2VDaGFyMSArIGRlbGltT3BlbkNoYXIwICsgbGlua0V4cHJlc3Npb25zLnNoaWZ0KClbM107XG5cdFx0XHRcdGhhc0Vsc2UgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGhhc0Vsc2UpIHsgLy8gSWYgYW4ge2Vsc2V9IGhhcyBiZWVuIGFkZGVkLCBuZWVkIGFsc28gdG8gYWRkIGNsb3Npbmcge3svc29tZVRhZ319XG5cdFx0XHRcdHRhZ0V4cHIgKz0gZGVsaW1DbG9zZUNoYXIxICsgZGVsaW1PcGVuQ2hhcjAgKyBkZWxpbU9wZW5DaGFyMSArIFwiL1wiICsgdG9rZW5zWzRdICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eCA9IHtcblx0XHRcdFx0dHlwZTogaXNMaW5rID8gXCJ0b3BcIiA6IFwibGlua1wiLFxuXHRcdFx0XHRkYXRhOiBkYXRhLCAvLyBzb3VyY2Vcblx0XHRcdFx0ZWxlbTogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHRcdHZpZXc6IGN1cnJlbnRWaWV3LFxuXHRcdFx0XHRjdHg6IGNvbnRleHQsXG5cdFx0XHRcdGF0dHI6IGF0dHIsXG5cdFx0XHRcdGlzTGs6IGlzTGluaywgLy8gdG9wLWxldmVsIGxpbmtpbmc/XG5cdFx0XHRcdF90b0xrIDogMSwgLy8gRmxhZyB0byBkYXRhLWxpbmsgb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCByZW5kZXJpbmcgY2FsbFxuXHRcdFx0XHRfbm9VcGQgOiB0b2tlbnNbMl0gLy8gRmxhZyBmb3IgZGF0YS1saW5rPVwiXnsuLi59XCIgc28gb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCB3aWxsIGJpbmQsIGJ1dCBub3QgcmVuZGVyKVxuXHRcdFx0fTtcblxuXHRcdFx0Y29udmVydEJhY2sgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodG9rZW5zWzZdKSB7XG5cdFx0XHRcdGNvbnZlcnRCYWNrID0gdG9rZW5zWzEwXSB8fCB1bmRlZmluZWQ7XG5cdFx0XHRcdGxpbmtDdHguY29udmVydCA9IHRva2Vuc1s1XSB8fCBcIlwiO1xuXHRcdFx0XHRpZiAoIWF0dHIgJiYgY29udmVydEJhY2sgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0QXR0cihub2RlKSkge1xuXHRcdFx0XHRcdC8vIERlZmF1bHQgdGFyZ2V0LCBzbyBhbGxvdyAyIHdheSBiaW5kaW5nXG5cdFx0XHRcdFx0bGlua0N0eC5jb252ZXJ0QmFjayA9IGNvbnZlcnRCYWNrID0gY29udmVydEJhY2suc2xpY2UoMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIENvbXBpbGUgdGhlIGxpbmtGbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyBhbmQgYmluZHMgYSBkYXRhLWxpbmsgZXhwcmVzc2lvblxuXHRcdFx0Ly8gVE9ETyAtIG9wdGltaXplIGZvciB0aGUgY2FzZSBvZiBzaW1wbGUgZGF0YSBwYXRoIHdpdGggbm8gY29udmVyc2lvbiwgaGVscGVycywgZXRjLjpcblx0XHRcdC8vICAgICBpLmUuIGRhdGEtbGluaz1cImEuYi5jXCIuIEF2b2lkIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgb2YgRnVuY3Rpb24gZXZlcnkgdGltZS4gQ2FuIHVzZSBhIGRlZmF1bHQgZnVuY3Rpb24gZm9yIGFsbCBvZiB0aGVzZS4uLlxuXG5cdFx0XHRsaW5rQ3R4LmV4cHIgPSBhdHRyICsgdGFnRXhwcjtcblx0XHRcdGxpbmtGbiA9IHRtcGwubGlua3NbdGFnRXhwcl07XG5cdFx0XHRpZiAoIWxpbmtGbikge1xuXHRcdFx0XHR0bXBsLmxpbmtzW3RhZ0V4cHJdID0gbGlua0ZuID0gJHN1Yi50bXBsRm4odGFnRXhwciwgdG1wbCwgdHJ1ZSwgY29udmVydEJhY2ssIGhhc0Vsc2UpO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eC5mbiA9IGxpbmtGbjtcblx0XHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pO1xuXHRcdFx0Ly8gV2Ugc3RvcmUgclRhZ0luZGV4IGluIGxvY2FsIHNjb3BlLCBzaW5jZSB0aGlzIGFkZERhdGFCaW5kaW5nIG1ldGhvZCBjYW4gc29tZXRpbWVzIGJlIGNhbGxlZCByZWN1cnNpdmVseSxcblx0XHRcdC8vIGFuZCBlYWNoIGlzIHVzaW5nIHRoZSBzYW1lIHJUYWdEYXRhbGluayBpbnN0YW5jZS5cblx0XHRcdHJUYWdEYXRhbGluay5sYXN0SW5kZXggPSByVGFnSW5kZXg7XG5cdFx0fVxuLy9cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pIHtcblx0Ly8gQWRkIGRhdGEgbGluayBiaW5kaW5ncyBmb3IgYSBsaW5rIGV4cHJlc3Npb24gaW4gZGF0YS1saW5rIGF0dHJpYnV0ZSBtYXJrdXBcblx0ZnVuY3Rpb24gaGFuZGxlcihldiwgZXZlbnRBcmdzKSB7XG5cdFx0cHJvcGVydHlDaGFuZ2VIYW5kbGVyLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncywgbGlua0ZuKTtcblx0XHQvLyBJZiB0aGUgbGluayBleHByZXNzaW9uIHVzZXMgYSBjdXN0b20gdGFnLCB0aGUgcHJvcGVydHlDaGFuZ2VIYW5kbGVyIGNhbGwgd2lsbCBjYWxsIHJlbmRlclRhZywgd2hpY2ggd2lsbCBzZXQgdGFnQ3R4IG9uIGxpbmtDdHhcblx0fVxuXHRoYW5kbGVyLm5vQXJyYXkgPSB0cnVlO1xuXHRpZiAobGlua0N0eC5pc0xrKSB7XG5cdFx0Ly8gVG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb25PclRydWUsIGRhdGEsIGNvbnRleHQpIC0gc28gd2UgbmVlZCB0byBjcmVhdGUgYSB2aWV3IGZvciB0aGUgbGlua2luZywgd2l0aCB0aGUgZGF0YSBhbmQgY3R4XG5cdFx0Ly8gd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIHRhcmdldC4gTm90ZSB0aGF0IHRoaXMgdmlldyBpcyBub3QgYSBzdGFuZGFyZCBkYXRhLWxpbmtlZCB2aWV3LCBzbyBpdCB3aWxsXG5cdFx0Ly8gYmUgZGlzcG9zZWQgb25seSB3aGVuIGl0cyBwYXJlbnQgdmlldyBpcyBkaXNwb3NlZC5cblx0XHRhZGRMaW5rTWV0aG9kcyhsaW5rQ3R4LnZpZXcgPSBuZXcgJHN1Yi5WaWV3KFxuXHRcdFx0JHN1Yi5leHRlbmRDdHgobGlua0N0eC5jdHgsIGxpbmtDdHgudmlldy5jdHgpLFxuXHRcdFx0XCJsaW5rXCIsIGxpbmtDdHgudmlldywgbGlua0N0eC5kYXRhLCBsaW5rQ3R4LmV4cHIsIHVuZGVmaW5lZCwgYWRkQmluZGluZ01hcmtlcnMpKTtcblx0fVxuXHRsaW5rQ3R4Ll9jdHhDYiA9IGdldENvbnRleHRDYihsaW5rQ3R4LnZpZXcpOyAvLyBfY3R4Q2IgaXMgZm9yIGZpbHRlcmluZy9hcHBlbmRpbmcgdG8gZGVwZW5kZW5jeSBwYXRoczogZnVuY3Rpb24ocGF0aCwgb2JqZWN0KSB7IHJldHVybiBbKG9iamVjdHxwYXRoKSpdfVxuXHRsaW5rQ3R4Ll9oZGwgPSBoYW5kbGVyO1xuXHQvLyBoYW5kbGVyLl9jdHggPSBsaW5rQ3R4OyBDb3VsZCBwYXNzIGxpbmtDdHggZm9yIHVzZSBpbiBhIGRlcGVuZHMgPSBmdW5jdGlvbigpIHt9IGNhbGwsIHNvIGRlcGVuZHMgaXMgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgbGlua0N0eCdzXG5cdGhhbmRsZXIodHJ1ZSk7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09XG4vLyBEYXRhLWxpbmtpbmcgaGVscGVyc1xuLy89PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVtb3ZlU3ViU3RyKHN0ciwgc3Vic3RyKSB7XG5cdHZhciBrO1xuXHRyZXR1cm4gc3RyXG5cdFx0PyAoayA9IHN0ci5pbmRleE9mKHN1YnN0ciksXG5cdFx0XHQoayArIDFcblx0XHRcdFx0PyBzdHIuc2xpY2UoMCwgaykgKyBzdHIuc2xpY2UoayArIHN1YnN0ci5sZW5ndGgpXG5cdFx0XHRcdDogc3RyKSlcblx0XHQ6IFwiXCI7XG59XG5cbmZ1bmN0aW9uIG1hcmtlck5vZGVJbmZvKG5vZGUpIHtcblx0cmV0dXJuIG5vZGUgJiZcblx0XHQoXCJcIiArIG5vZGUgPT09IG5vZGVcblx0XHRcdD8gbm9kZVxuXHRcdFx0OiBub2RlLnRhZ05hbWUgPT09IFNDUklQVFxuXHRcdFx0XHQ/IG5vZGUudHlwZS5zbGljZSgzKVxuXHRcdFx0XHQ6IG5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cikgfHwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHZpZXdJbmZvcyhub2RlLCBpc1ZhbCwgckJpbmRpbmcpIHtcblx0Ly8gVGVzdCB3aGV0aGVyIG5vZGUgaXMgYSBzY3JpcHQgbWFya2VyIG5vZGUsIGFuZCBpZiBzbywgcmV0dXJuIG1ldGFkYXRhXG5cdGZ1bmN0aW9uIGdldEluZm9zKGFsbCwgb3BlbiwgY2xvc2UsIGlkLCBjaCwgZWxQYXRoKSB7XG5cdFx0aW5mb3MucHVzaCh7XG5cdFx0XHRlbENudDogZWxDbnQsXG5cdFx0XHRpZDogaWQsXG5cdFx0XHRjaDogY2gsXG5cdFx0XHRvcGVuOiBvcGVuLFxuXHRcdFx0Y2xvc2U6IGNsb3NlLFxuXHRcdFx0cGF0aDogZWxQYXRoLFxuXHRcdFx0dG9rZW46IGFsbFxuXHRcdH0pO1xuXHR9XG5cdHZhciBlbENudCwgdG9rZW5zLFxuXHRcdGluZm9zID0gW107XG5cdGlmICh0b2tlbnMgPSBpc1ZhbCA/IG5vZGUgOiBtYXJrZXJOb2RlSW5mbyhub2RlKSkge1xuXHRcdGVsQ250ID0gaW5mb3MuZWxDbnQgPSBub2RlLnRhZ05hbWUgIT09IFNDUklQVDtcblx0XHRlbENudCA9IHRva2Vucy5jaGFyQXQoMCkgPT09IFwiQFwiIHx8IGVsQ250O1xuXHRcdGluZm9zLl90a25zID0gdG9rZW5zO1xuXHRcdC8vIHJNYXJrZXJUb2tlbnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShbX15dKShbLStAXFxkXSspPy9nO1xuXHRcdHRva2Vucy5yZXBsYWNlKHJCaW5kaW5nIHx8IHJNYXJrZXJUb2tlbnMsIGdldEluZm9zKTtcblx0XHRyZXR1cm4gaW5mb3M7XG5cdH1cbn1cblxuZnVuY3Rpb24gdW5tYXJrUHJldk9yTmV4dE5vZGUobm9kZSwgZWxDbnQpIHtcblx0aWYgKG5vZGUpIHtcblx0XHRpZiAobm9kZS50eXBlID09PSBcImpzdlwiKSB7XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG5cdFx0fSBlbHNlIGlmIChlbENudCAmJiBub2RlLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikgPT09IFwiXCIpIHtcblx0XHRcdG5vZGUucmVtb3ZlQXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbWFya1ByZXZPck5leHROb2RlKG5vZGUsIGVsQ250KSB7XG5cdHZhciBtYXJrZXIgPSBub2RlO1xuXHR3aGlsZSAoZWxDbnQgJiYgbWFya2VyICYmIG1hcmtlci5ub2RlVHlwZSAhPT0gMSkge1xuXHRcdG1hcmtlciA9IG1hcmtlci5wcmV2aW91c1NpYmxpbmc7XG5cdH1cblx0aWYgKG1hcmtlcikge1xuXHRcdGlmIChtYXJrZXIubm9kZVR5cGUgIT09IDEpIHtcblx0XHRcdC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSB3aWxsIGFkZCBhIHNjcmlwdCBub2RlIGJlZm9yZVxuXHRcdFx0bWFya2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChTQ1JJUFQpO1xuXHRcdFx0bWFya2VyLnR5cGUgPSBcImpzdlwiO1xuXHRcdFx0bm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShtYXJrZXIsIG5vZGUpO1xuXHRcdH0gZWxzZSBpZiAoIW1hcmtlck5vZGVJbmZvKG1hcmtlcikgJiYgIW1hcmtlci5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpKSB7XG5cdFx0XHQvLyBGb3IgZWxlbWVudCBub2Rlcywgd2Ugd2lsbCBhZGQgYSBkYXRhLWxpbmsgYXR0cmlidXRlICh1bmxlc3MgdGhlcmUgaXMgYWxyZWFkeSBvbmUpXG5cdFx0XHQvLyBzbyB0aGF0IHRoaXMgbm9kZSBnZXRzIGluY2x1ZGVkIGluIHRoZSBub2RlIGxpbmtpbmcgcHJvY2Vzcy5cblx0XHRcdG1hcmtlci5zZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIsIFwiXCIpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWFya2VyO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMaW5rVGFnKGxpbmtNYXJrdXAsIHR3b3dheSkge1xuXHRsaW5rTWFya3VwID0gJC50cmltKGxpbmtNYXJrdXApLnJlcGxhY2UockVzY2FwZVF1b3RlcywgXCJcXFxcJCZcIik7XG5cdHJldHVybiBsaW5rTWFya3VwLnNsaWNlKC0xKSAhPT0gZGVsaW1DbG9zZUNoYXIwXG5cdC8vIElmIHNpbXBsaWZpZWQgc3ludGF4IGlzIHVzZWQ6IGRhdGEtbGluaz1cImV4cHJlc3Npb25cIiwgY29udmVydCB0byBkYXRhLWxpbms9XCJ7OmV4cHJlc3Npb259XCIsXG5cdC8vIG9yIGZvciBpbnB1dHMsIGRhdGEtbGluaz1cIns6ZXhwcmVzc2lvbjp9XCIgZm9yIChkZWZhdWx0KSB0d28td2F5IGJpbmRpbmdcblx0XHQ/IGxpbmtNYXJrdXAgPSBkZWxpbU9wZW5DaGFyMSArIFwiOlwiICsgbGlua01hcmt1cCArICh0d293YXkgPyBcIjpcIiA6IFwiXCIpICsgZGVsaW1DbG9zZUNoYXIwXG5cdFx0OiBsaW5rTWFya3VwO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTWV0aG9kcyBmb3Igdmlld3MgYW5kIHRhZ3Ncbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNhbGxBZnRlckxpbmsodGFnLCBldiwgZXZlbnRBcmdzKSB7XG5cdHZhciBsaW5rZWRFbGVtLCBkaXNwbGF5RWxlbSwgbGlua2VkRWwsIHZhbCwgbCwgbGlua2VkVGFnLCBvbGRUcmlnLCBuZXdUcmlnLCB0YWdQcm9wcywgcHJvcHNFeHByLCBsaW5rZWRFbGVtVmlldywgcHJvcCwgcHJvcERlZixcblx0XHR0YWdDdHggPSB0YWcudGFnQ3R4LFxuXHRcdHZpZXcgPSB0YWdDdHgudmlldyxcblx0XHRwcm9wcyA9IHRhZ0N0eC5wcm9wcyxcblx0XHRsaW5rQ3R4ID0gdGFnLmxpbmtDdHg7XG5cblx0aWYgKHRhZy5fLnVubGlua2VkKSB7IC8vIEZpcnN0IGNhbGwgdG8gb25BZnRlckxpbmssIG9yIGZpcnN0IGNhbGwgYWZ0ZXIgb25VcGRhdGU6IHVwZGF0ZUNvbnRlbnQuIEluaXRpYWxpemUgYW5kIGNhbGwgb25CaW5kIGFuZCBzZXQgcHJvcGVydGllc1xuXHRcdGlmICh0YWcubGlua2VkRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBsaW5rZWRFbGVtZW50OiAtIHNlbGVjdG9yIGZvciBpZGVudGlmeWluZyBsaW5rZWQgZWxlbWVudCBpbiB0ZW1wbGF0ZS9yZW5kZXJlZCBjb250ZW50XG5cdFx0XHR0YWcubGlua2VkRWxlbSA9IHRhZy5fLmlubGluZSA/IHRhZy5jb250ZW50cyh0cnVlLCB0YWcubGlua2VkRWxlbWVudCB8fCBcIipcIikuZmlyc3QoKSA6ICQobGlua0N0eC5lbGVtKTtcblx0XHR9XG5cdFx0aWYgKHRhZy5vbkJpbmQpIHtcblx0XHRcdHRhZy5vbkJpbmQodGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4LCBldiwgZXZlbnRBcmdzKTtcblx0XHR9XG5cdH1cblxuXHRpZiAodGFnLm9uQWZ0ZXJMaW5rKSB7XG5cdFx0dGFnLm9uQWZ0ZXJMaW5rKHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgZXYsIGV2ZW50QXJncyk7XG5cdH1cblxuXHRsaW5rZWRFbGVtID0gdGFnLnRhcmdldFRhZyA/IHRhZy50YXJnZXRUYWcubGlua2VkRWxlbSA6IHRhZy5saW5rZWRFbGVtO1xuXHRkaXNwbGF5RWxlbSA9IHRhZy5kaXNwbGF5RWxlbSB8fCBsaW5rZWRFbGVtO1xuXG5pZiAobGlua2VkRWxlbSAmJiBsaW5rZWRFbGVtWzBdKSB7XG5cdFx0aWYgKCF0YWcuXy5jaGdpbmcpIHtcblx0XHRcdHZhbCA9IHRhZy5jdnRBcmdzKClbMF07XG5cdFx0XHRsID0gbGlua2VkRWxlbS5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdGxpbmtlZEVsID0gbGlua2VkRWxlbVtsXTtcblx0XHRcdFx0aWYgKHRhZy5fLnVubGlua2VkICYmIGxpbmtlZEVsICE9PSBsaW5rQ3R4LmVsZW0pIHtcblx0XHRcdFx0XHRsaW5rZWRUYWcgPSBsaW5rZWRFbC5fanN2TGtFbDtcblx0XHRcdFx0XHRpZiAodGFnLl8uaW5saW5lICYmICghbGlua2VkVGFnIHx8IGxpbmtlZFRhZyAhPT0gdGFnICYmIGxpbmtlZFRhZy50YXJnZXRUYWcgIT09IHRhZykpIHtcblx0XHRcdFx0XHRcdC8vIEZvciBkYXRhLWxpbmtlZCB0YWdzLCBpZGVudGlmeSB0aGUgbGlua2VkRWwgd2l0aCB0aGUgdGFnLCBmb3IgXCJ0b1wiIGJpbmRpbmdcblx0XHRcdFx0XHRcdC8vIChGb3IgZGF0YS1saW5rZWQgZWxlbWVudHMsIGlmIG5vdCB5ZXQgYm91bmQsIHdlIGlkZW50aWZ5IGxhdGVyIHdoZW4gdGhlIGxpbmtDdHguZWxlbSBpcyBib3VuZClcblx0XHRcdFx0XHRcdGxpbmtlZEVsLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRcdFx0YmluZFRvKGJpbmRpbmdTdG9yZVt0YWcuX3RnSWRdLCB0YWcsIGxpbmtlZEVsKTtcblx0XHRcdFx0XHRcdGxpbmtlZEVsLl9qc3ZCbmQgPSBcIiZcIiArIHRhZy5fdGdJZCArIFwiK1wiOyAvLyBBZGQgYSBcIitcIiBmb3IgY2xvbmVkIGJpbmRpbmcgLSBzbyByZW1vdmluZ1xuXHRcdFx0XHRcdFx0Ly8gZWxlbXMgd2l0aCBjbG9uZWQgYmluZGluZ3Mgd2lsbCBub3QgcmVtb3ZlIHRoZSAncGFyZW50JyBiaW5kaW5nIGZyb20gdGhlIGJpbmRpbmdTdG9yZS5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtlZEVsLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGlmIChsaW5rZWRFbC50eXBlID09PSBDSEVDS0JPWCkge1xuXHRcdFx0XHRcdFx0XHRsaW5rZWRFbFtDSEVDS0VEXSA9IHZhbCAmJiB2YWwgIT09IFwiZmFsc2VcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobGlua2VkRWwudHlwZSA9PT0gUkFESU8pIHtcblx0XHRcdFx0XHRcdFx0bGlua2VkRWxbQ0hFQ0tFRF0gPSAobGlua2VkRWwudmFsdWUgPT09IHZhbCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRsaW5rZWRFbC52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpbmtlZEVsLmNvbnRlbnRFZGl0YWJsZSA9PT0gVFJVRSkge1xuXHRcdFx0XHRcdFx0bGlua2VkRWwuaW5uZXJIVE1MID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsaW5rQ3R4Ll92YWwgPSB2YWw7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BzLm5hbWUpIHtcblx0XHRcdFx0XHRsaW5rZWRFbC5uYW1lID0gbGlua2VkRWwubmFtZSB8fCBwcm9wcy5uYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0YWcuc2V0U2l6ZSkge1xuXHRcdFx0aWYgKHByb3BzLmhlaWdodCkge1xuXHRcdFx0XHRkaXNwbGF5RWxlbS5oZWlnaHQocHJvcHMuaGVpZ2h0KTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wcy53aWR0aCkge1xuXHRcdFx0XHRkaXNwbGF5RWxlbS53aWR0aChwcm9wcy53aWR0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChwcm9wcy50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRkaXNwbGF5RWxlbS5hdHRyKFwidGl0bGVcIiwgcHJvcHMudGl0bGUpO1xuXHRcdH1cblx0XHRpZiAocHJvcHNbXCJjbGFzc1wiXSkge1xuXHRcdFx0Ly8gVGhpcyBjb2RlIHN1cHBvcnRzIGR5bmFtaWMgYmluZGluZyB0byBjbGFzcyAtIHdoZXJlIGl0IGFkZHMgdGhlIGNsYXNzIGlmIGFic2VudCwgYW5kIHJlbW92ZXMvYWRkcyBpZiBhIHByZXZpb3VzIHZhbHVlIGlzIHByZXNlbnRcblx0XHRcdGlmIChldmVudEFyZ3MgJiYgZGlzcGxheUVsZW0uaGFzQ2xhc3MoZXZlbnRBcmdzLm9sZFZhbHVlKSkge1xuXHRcdFx0XHRkaXNwbGF5RWxlbS5yZW1vdmVDbGFzcyhldmVudEFyZ3Mub2xkVmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0ZGlzcGxheUVsZW0uYWRkQ2xhc3MocHJvcHNbXCJjbGFzc1wiXSk7XG5cdFx0fVxuXHRcdGlmIChwcm9wcy5pZCkge1xuXHRcdFx0bGlua2VkRWxlbVswXS5pZCA9IHByb3BzLmlkO1xuXHRcdH1cblx0fVxuXHR0YWcuXy51bmxpbmtlZCA9IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXN5bmNFbGVtQ2hhbmdlSGFuZGxlcihldikge1xuXHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdGVsZW1DaGFuZ2VIYW5kbGVyKGV2KTtcblx0fSwgMCk7XG59XG5cbmZ1bmN0aW9uIGJpbmRFbENoYW5nZSgkZWxlbSwgdHJpZywgb25vZmYpIHtcblx0aWYgKHRyaWcpIHtcblx0XHR0cmlnID0gXCJcIiArIHRyaWcgPT09IHRyaWcgPyB0cmlnIDogXCJrZXlkb3duXCI7IC8vIFNldCB0cmlnZ2VyIHRvICh0cnVlIHx8IHRydWV5IG5vbi1zdHJpbmcgKGUuZy4gMSkgfHwgJ2tleWRvd24nKTogR2V0ICdrZXlkb3duJyB3aXRoIGFzeW5jXG5cdFx0JGVsZW1bb25vZmZdKHRyaWcsIHRyaWcgPT09IFwia2V5ZG93blwiID8gYXN5bmNFbGVtQ2hhbmdlSGFuZGxlciA6IGVsZW1DaGFuZ2VIYW5kbGVyKTtcblx0fVxufVxuXG5mdW5jdGlvbiBiaW5kVG8oYmluZGluZywgdGFnLCBsaW5rZWRFbGVtLCBjdnRCaykge1xuXHQvLyBUd28td2F5IGJpbmRpbmcuXG5cdC8vIFdlIHNldCB0aGUgYmluZGluZy50b1sxXSB0byBiZSB0aGUgY3Z0QmFjaywgYW5kIGJpbmRpbmcudG9bMF0gdG8gYmUgZWl0aGVyIHRoZSBwYXRoIHRvIHRoZSB0YXJnZXQsIG9yIFtvYmplY3QsIHBhdGhdIHdoZXJlIHRoZSB0YXJnZXQgaXMgdGhlIHBhdGggb24gdGhlIHByb3ZpZGVkIG9iamVjdC5cblx0Ly8gU28gZm9yIGEgY29tcHV0ZWQgcGF0aCB3aXRoIGFuIG9iamVjdCBjYWxsOiBhLmIuZ2V0T2JqZWN0KCkuZC5lLCB0aGVuIHdlIHNldCB0b1swXSB0byBiZSBbZXhwck9iLCBcImQuZVwiXSwgYW5kIHdlIGJpbmQgdG8gdGhlIHBhdGggb24gdGhlIHJldHVybmVkIG9iamVjdCwgZXhwck9iLm9iLCBhcyB0YXJnZXRcblx0Ly8gT3RoZXJ3aXNlIG91ciB0YXJnZXQgaXMgdGhlIGZpcnN0IHBhdGgsIHBhdGhzWzBdLCB3aGljaCB3ZSB3aWxsIGNvbnZlcnQgd2l0aCBjb250ZXh0Q2IoKSBmb3IgcGF0aHMgbGlrZSB+YS5iLmMgb3IgI3gueS56XG5cblx0dmFyIGJpbmR0bywgcGF0aEluZGV4LCBwYXRoLCBsYXN0UGF0aCwgYmluZHRvT2IsICRsaW5rZWRFbGVtLCBuZXdUcmlnLCBvbGRUcmlnLCB0bywgbCwgdG90cnksXG5cdFx0bGlua0N0eCA9IGJpbmRpbmcubGlua0N0eCxcblx0XHRzb3VyY2UgPSBsaW5rQ3R4LmRhdGEsXG5cdFx0cGF0aHMgPSBsaW5rQ3R4LmZuLnBhdGhzO1xuXG5cdHRhZyA9IHRhZyB8fCBsaW5rZWRFbGVtLl9qc3ZMa0VsO1xuXG5cdFx0aWYgKGJpbmRpbmcgJiYgcGF0aHMgJiYgIWJpbmRpbmcudG8pIHtcblx0XHRvbGRUcmlnID0gbGlua2VkRWxlbS5fanN2VHIgfHwgZmFsc2U7XG5cdFx0aWYgKHRhZykge1xuXHRcdFx0Y3Z0QmsgPSB0YWcuY29udmVydEJhY2sgfHwgY3Z0Qms7XG5cdFx0XHRuZXdUcmlnID0gdGFnLnRhZ0N0eC5wcm9wcy50cmlnZ2VyO1xuXHRcdH1cblx0XHRuZXdUcmlnID0gbmV3VHJpZyA9PT0gdW5kZWZpbmVkID8gJHN1YlNldHRpbmdzLnRyaWdnZXIgOiBuZXdUcmlnO1xuXHRcdC8vIFRyaWdnZXIgaXMgbm9vcCBleGNlcHQgZm9yIHRleHQgYm94LCB0ZXh0YXJlYSwgY29udGVudGVkaXRhYmxlLi4uXG5cdFx0bmV3VHJpZyA9IG5ld1RyaWcgJiYgKGxpbmtlZEVsZW0udGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmIGxpbmtlZEVsZW0udHlwZSAhPT0gQ0hFQ0tCT1ggJiYgbGlua2VkRWxlbS50eXBlICE9PSBSQURJTyB8fCBsaW5rZWRFbGVtLnR5cGUgPT09IFwidGV4dGFyZWFcIiB8fCBsaW5rZWRFbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gVFJVRSkgJiYgbmV3VHJpZyB8fCBmYWxzZTtcblxuXHRcdGlmIChvbGRUcmlnICE9PSBuZXdUcmlnKSB7XG5cdFx0XHQkbGlua2VkRWxlbSA9ICQobGlua2VkRWxlbSk7XG5cdFx0XHRiaW5kRWxDaGFuZ2UoJGxpbmtlZEVsZW0sIG9sZFRyaWcsIFwib2ZmXCIpO1xuXHRcdFx0YmluZEVsQ2hhbmdlKFxuXHRcdFx0XHQkbGlua2VkRWxlbSxcblx0XHRcdFx0bGlua2VkRWxlbS5fanN2VHIgPSBuZXdUcmlnLFxuXHRcdFx0XHRcIm9uXCJcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cGF0aHMgPSAoYmluZHRvID0gcGF0aHMuX2pzdnRvKSB8fCBwYXRoc1swXTtcblx0XHRwYXRoSW5kZXggPSBwYXRocyAmJiBwYXRocy5sZW5ndGg7XG5cdFx0aWYgKHBhdGhJbmRleCAmJiAoIXRhZyB8fCB0YWcudGFnQ3R4LmFyZ3MubGVuZ3RoKSkge1xuXHRcdFx0bGFzdFBhdGggPSBwYXRoc1twYXRoSW5kZXggLSAxXTtcblx0XHRcdGlmIChsYXN0UGF0aC5fanN2KSB7XG5cdFx0XHRcdGJpbmR0b09iID0gbGFzdFBhdGg7XG5cdFx0XHRcdHdoaWxlIChsYXN0UGF0aC5zYiAmJiBsYXN0UGF0aC5zYi5fanN2KSB7XG5cdFx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoID0gbGFzdFBhdGguc2I7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoLnNiIHx8IHBhdGggJiYgcGF0aC5wYXRoO1xuXHRcdFx0XHRsYXN0UGF0aCA9IHBhdGggPyBwYXRoLnNsaWNlKDEpIDogYmluZHRvT2IucGF0aDtcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoKSB7XG5cdFx0XHRcdHRvID0gW1xuXHRcdFx0XHRcdFx0YmluZHRvT2IsIC8vICdleHByT2InIGZvciB0aGlzIGV4cHJlc3Npb24gYW5kIHZpZXctYmluZGluZy4gU28gYmluZHRvT2Iub2IgaXMgY3VycmVudCBvYmplY3QgcmV0dXJuZWQgYnkgZXhwcmVzc2lvbi5cblx0XHRcdFx0XHRcdGxhc3RQYXRoXG5cdFx0XHRcdFx0XTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlICgodG90cnkgPSBsaW5rQ3R4Ll9jdHhDYihwYXRoID0gbGFzdFBhdGguc3BsaXQoXCJeXCIpLmpvaW4oXCIuXCIpLCBzb3VyY2UpKSAmJiAobCA9IHRvdHJ5Lmxlbmd0aCkpIHtcblx0XHRcdFx0XHQvLyBSZWN1cnNpdmVseSBkZXJlZmVyZW5jZSBhbnkgfmZvbyBvciAjYmFyIHRva2VucyBpbiB0aGUgcGF0aC4gKFJlY3Vyc2l2ZSBiZWNhdXNlIH5mb28gbWF5IGJlIGEgY29udGV4dHVhbCBwYXJhbSB3aGljaCBoYXNcblx0XHRcdFx0XHQvLyBpdHMgb3duIGRlcGVuZGVuY2llcyBvbiBvdGhlciB+Zm9vICNiYXIgY29tcG9uZW50cylcblx0XHRcdFx0XHR0byA9IHRvdHJ5O1xuXHRcdFx0XHRcdGlmICh0by5fY3ApIHsgLy8gVHdvLXdheSBiaW5kaW5nIHRvIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIgcmVmZXJlbmNlLCB+Zm9vIChkZWNsYXJlZCBhcyB+Zm9vPWV4cHIgb24gYSBwYXJlbnQgdGFnKVxuXHRcdFx0XHRcdFx0dG8gPSBbdG9bbC0zXSwgdG9bbC0yXV07XG5cdFx0XHRcdFx0XHRsYXN0UGF0aCA9IHRvWzFdO1xuXHRcdFx0XHRcdFx0aWYgKGxhc3RQYXRoLl9qc3YpIHtcblx0XHRcdFx0XHRcdFx0YmluZHRvT2IgPSBsYXN0UGF0aDtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKGxhc3RQYXRoLnNiICYmIGxhc3RQYXRoLnNiLl9qc3YpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoID0gbGFzdFBhdGggPSBsYXN0UGF0aC5zYjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRwYXRoID0gbGFzdFBhdGguc2IgfHwgcGF0aCAmJiBwYXRoLnBhdGg7XG5cdFx0XHRcdFx0XHRcdGxhc3RQYXRoID0gcGF0aCA/IHBhdGguc2xpY2UoMSkgOiBiaW5kdG9PYi5wYXRoO1xuXHRcdFx0XHRcdFx0XHR0byA9IFtcblx0XHRcdFx0XHRcdFx0XHRiaW5kdG9PYiwgLy8gJ2V4cHJPYicgZm9yIHRoaXMgZXhwcmVzc2lvbiBhbmQgdmlldy1iaW5kaW5nLiBTbyBiaW5kdG9PYi5vYiBpcyBjdXJyZW50IG9iamVjdCByZXR1cm5lZCBieSBleHByZXNzaW9uLlxuXHRcdFx0XHRcdFx0XHRcdGxhc3RQYXRoXG5cdFx0XHRcdFx0XHRcdF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHsgLy8gVHdvLXdheSBiaW5kaW5nIHRvIGEgaGVscGVyIC0gZS5nLiB+YWRkcmVzcy5zdHJlZXQsIG9yIGNvbXB1dGVkLCBlLmcuIH5mdWxsTmFtZSgpLCBvciB2aWV3IHByb3BlcnR5IGUuZy4gI2RhdGEuZm9vXG5cdFx0XHRcdFx0XHR0byA9IGw+MlxuXHRcdFx0XHRcdFx0XHQ/IFt0b1tsLTNdLCB0b1tsLTJdXSAvLyBXaXRoIHBhdGg6IFtvYmplY3QsIHBhdGhdXG5cdFx0XHRcdFx0XHRcdDogW3RvW2wtMl1dOyAgICAgICAgIC8vIE5vIHBhdGgsIChlLmcuIFtmdW5jdGlvbl0gZm9yIGNvbXB1dGVkIHdpdGggc2V0dGVyKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzb3VyY2UgPSB0b1swXTtcblx0XHRcdFx0XHRsYXN0UGF0aCA9IHRvWzFdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRvID0gdG8gfHwgW3NvdXJjZSwgcGF0aF07IC8vIFR3byB3YXkgYmluZGluZyB0byBhbiBvYmplY3QgKG5laXRoZXIgfmZvbyBub3IgI2Jhcilcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dG8gPSBbXTtcblx0XHR9XG5cdFx0YmluZGluZy50byA9IFtcblx0XHRcdHRvLFxuXHRcdFx0Y3Z0Qmtcblx0XHRdO1xuXHR9XG59XG5cbmZ1bmN0aW9uIG1lcmdlQ3R4cyh0YWcsIG5ld0N0eHMsIHJlcGxhY2UpIHsgLy8gTWVyZ2UgdXBkYXRlZCB0YWdDdHhzIGludG8gdGFnLnRhZ0N0eHNcblx0dmFyIHRhZ0N0eCwgbmV3VGFnQ3R4LFxuXHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXcsXG5cdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzIHx8IFt0YWcudGFnQ3R4XSxcblx0XHRsID0gdGFnQ3R4cy5sZW5ndGgsXG5cdFx0cmVmcmVzaCA9ICFuZXdDdHhzO1xuXG5cdG5ld0N0eHMgPSBuZXdDdHhzIHx8IHRhZy5fLmJuZC5jYWxsKHZpZXcudG1wbCwgKHRhZy5saW5rQ3R4IHx8IHZpZXcpLmRhdGEsIHZpZXcsICRzdWIpO1xuXG5cdGlmIChyZXBsYWNlKSB7XG5cdFx0Ly8gUmVwbGFjZSBwcmV2aW91cyB0YWdDdHhzIGJ5IG5ldyBvbmVzLCByYXRoZXIgdGhhbiBtZXJnaW5nXG5cdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzID0gbmV3Q3R4cztcblx0XHR0YWcudGFnQ3R4ID0gdGFnQ3R4c1swXTtcblx0fSBlbHNlIHtcblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHR0YWdDdHggPSB0YWdDdHhzW2xdO1xuXHRcdFx0bmV3VGFnQ3R4ID0gbmV3Q3R4c1tsXTtcblx0XHRcdCRvYnNlcnZhYmxlKHRhZ0N0eC5wcm9wcykuc2V0UHJvcGVydHkobmV3VGFnQ3R4LnByb3BzKTtcblx0XHRcdCRleHRlbmQodGFnQ3R4LmN0eCwgbmV3VGFnQ3R4LmN0eCk7IC8vIFdlIGRvbid0IHN1cHBvcnQgcHJvcGFnYXRpbmcgY3R4IHZhcmlhYmxlcywgfmZvbywgb2JzZXJ2YWJseSwgdG8gbmVzdGVkIHZpZXdzLiBTbyBleHRlbmQsIG5vdCBzZXRQcm9wZXJ0eS4uLlxuXHRcdFx0dGFnQ3R4LmFyZ3MgPSBuZXdUYWdDdHguYXJncztcblx0XHRcdGlmIChyZWZyZXNoKSB7XG5cdFx0XHRcdHRhZ0N0eC50bXBsID0gbmV3VGFnQ3R4LnRtcGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdCRzdWIuX3Rocyh0YWcsIHRhZ0N0eHNbMF0pOyAvLyB0YWdIYW5kbGVyc0Zyb21Qcm9wc1xuXHRyZXR1cm4gdGFnQ3R4cztcbn1cblxuLy89PT09PT09PT1cbi8vIERpc3Bvc2FsXG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBjbGVhbihlbGVtcykge1xuXHQvLyBSZW1vdmUgZGF0YS1saW5rIGJpbmRpbmdzLCBvciBjb250YWluZWQgdmlld3Ncblx0dmFyIGwsIGVsZW0sIGJpbmRpbmdzLFxuXHRcdGVsZW1BcnJheSA9IFtdLFxuXHRcdGxlbiA9IGVsZW1zLmxlbmd0aCxcblx0XHRpID0gbGVuO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0Ly8gQ29weSBpbnRvIGFuIGFycmF5LCBzbyB0aGF0IGRlbGV0aW9uIG9mIG5vZGVzIGZyb20gRE9NIHdpbGwgbm90IGNhdXNlIG91ciAnaScgY291bnRlciB0byBnZXQgc2hpZnRlZFxuXHRcdC8vIChOb3RlOiBUaGlzIHNlZW1zIGFzIGZhc3Qgb3IgZmFzdGVyIHRoYW4gZWxlbUFycmF5ID0gW10uc2xpY2UuY2FsbChlbGVtcyk7IC4uLilcblx0XHRlbGVtQXJyYXkucHVzaChlbGVtc1tpXSk7XG5cdH1cblx0aSA9IGxlbjtcblx0d2hpbGUgKGktLSkge1xuXHRcdGVsZW0gPSBlbGVtQXJyYXlbaV07XG5cdFx0aWYgKGVsZW0ucGFyZW50Tm9kZSkge1xuXHRcdFx0Ly8gSGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBET01cblx0XHRcdGlmIChiaW5kaW5ncyA9IGVsZW0uX2pzdkJuZCkge1xuXHRcdFx0XHQvLyBHZXQgcHJvcGVydHlDaGFuZ2UgYmluZGluZ3MgZm9yIHRoaXMgZWxlbWVudFxuXHRcdFx0XHQvLyBUaGlzIG1heSBiZSBhbiBlbGVtZW50IHdpdGggZGF0YS1saW5rLCBvciB0aGUgb3BlbmluZyBzY3JpcHQgbWFya2VyIG5vZGUgZm9yIGEgZGF0YS1saW5rZWQgdGFnIHteey4uLn19XG5cdFx0XHRcdC8vIGJpbmRpbmdzIGlzIGEgc3RyaW5nIHdpdGggdGhlIHN5bnRheDogXCIoJmJpbmRpbmdJZCkqXCJcblx0XHRcdFx0YmluZGluZ3MgPSBiaW5kaW5ncy5zbGljZSgxKS5zcGxpdChcIiZcIik7XG5cdFx0XHRcdGVsZW0uX2pzdkJuZCA9IFwiXCI7XG5cdFx0XHRcdGwgPSBiaW5kaW5ncy5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHQvLyBSZW1vdmUgYXNzb2NpYXRlZCBiaW5kaW5nc1xuXHRcdFx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRpbmdzW2xdLCBlbGVtLl9qc3ZMa0VsLCBlbGVtKTsgLy8gdW5iaW5kIGJpbmRpbmdzIHdpdGggdGhpcyBiaW5kaW5nSWQgb24gdGhpcyB2aWV3XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGRpc3Bvc2VUb2tlbnMobWFya2VyTm9kZUluZm8oZWxlbSkgKyAoZWxlbS5fZGYgfHwgXCJcIikpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiByZW1vdmVWaWV3QmluZGluZyhiaW5kSWQsIGxpbmtlZEVsZW1UYWcsIGVsZW0pIHtcblx0Ly8gVW5iaW5kXG5cdHZhciBvYmpJZCwgbGlua0N0eCwgdGFnLCBvYmplY3QsIG9ic0lkLCB0YWdDdHhzLCBsLCBtYXAsICRsaW5rZWRFbGVtLCBsaW5rZWRFbGVtLCB0cmlnZ2VyLCB2aWV3LCB0YXJnZXRUYWcsXG5cdFx0YmluZGluZyA9IGJpbmRpbmdTdG9yZVtiaW5kSWRdO1xuXG5cdGlmIChsaW5rZWRFbGVtVGFnKSB7XG5cdFx0bGlua2VkRWxlbVRhZyA9IGxpbmtlZEVsZW1UYWcudGFyZ2V0VGFnIHx8IGxpbmtlZEVsZW1UYWc7XG5cdFx0ZWxlbS5fanN2TGtFbCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChiaW5kaW5nKSB7XG5cdFx0ZGVsZXRlIGJpbmRpbmdTdG9yZVtiaW5kSWRdOyAvLyBEZWxldGUgYWxyZWFkeSwgc28gY2FsbCB0byBvbkRpc3Bvc2UgaGFuZGxlciBiZWxvdyBjYW5ub3QgdHJpZ2dlciByZWN1cnNpdmUgZGVsZXRpb24gKHRocm91Z2ggcmVjdXJzaXZlIGNhbGwgdG8galF1ZXJ5IGNsZWFuRGF0YSlcblx0XHRmb3IgKG9iaklkIGluIGJpbmRpbmcuYm5kKSB7XG5cdFx0XHRvYmplY3QgPSBiaW5kaW5nLmJuZFtvYmpJZF07XG5cdFx0XHRvYnNJZCA9IGJpbmRpbmcuY2JJZDtcblx0XHRcdGlmICgkaXNBcnJheShvYmplY3QpKSB7XG5cdFx0XHRcdCQoW29iamVjdF0pLm9mZihhcnJheUNoYW5nZVN0ciArIG9ic0lkKS5vZmYocHJvcGVydHlDaGFuZ2VTdHIgKyBvYnNJZCk7IC8vIFRoZXJlIG1heSBiZSBlaXRoZXIgb3IgYm90aCBvZiBhcnJheUNoYW5nZSBhbmQgcHJvcGVydHlDaGFuZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCQob2JqZWN0KS5vZmYocHJvcGVydHlDaGFuZ2VTdHIgKyBvYnNJZCk7XG5cdFx0XHR9XG5cdFx0XHRkZWxldGUgYmluZGluZy5ibmRbb2JqSWRdO1xuXHRcdH1cblxuXHRcdGlmIChsaW5rQ3R4ID0gYmluZGluZy5saW5rQ3R4KSB7XG5cdFx0XHRpZiAodGFnID0gbGlua0N0eC50YWcpIHtcblx0XHRcdFx0aWYgKHRhZ0N0eHMgPSB0YWcudGFnQ3R4cykge1xuXHRcdFx0XHRcdGwgPSB0YWdDdHhzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdFx0XHRpZiAobWFwID0gdGFnQ3R4c1tsXS5tYXApIHtcblx0XHRcdFx0XHRcdFx0bWFwLnVubWFwKCk7IC8vdW5vYnNlcnZlXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdCRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW07XG5cblx0XHRcdFx0aWYgKHRhZy5vblVuYmluZCkge1xuXHRcdFx0XHRcdHRhZy5vblVuYmluZCh0YWcudGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4LCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGFnLm9uRGlzcG9zZSkge1xuXHRcdFx0XHRcdHRhZy5vbkRpc3Bvc2UoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghdGFnLl9lbENudCkge1xuXHRcdFx0XHRcdGlmICh0YWcuX3Bydikge1xuXHRcdFx0XHRcdFx0dGFnLl9wcnYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YWcuX3Bydik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0YWcuX254dCkge1xuXHRcdFx0XHRcdFx0dGFnLl9ueHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YWcuX254dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsaW5rZWRFbGVtID0gJGxpbmtlZEVsZW0gJiYgJGxpbmtlZEVsZW1bMF0gfHwgbGlua0N0eC5lbGVtO1xuXG5cdFx0XHRpZiAodHJpZ2dlciA9IGxpbmtlZEVsZW0gJiYgbGlua2VkRWxlbS5fanN2VHIpIHtcblx0XHRcdFx0YmluZEVsQ2hhbmdlKCRsaW5rZWRFbGVtIHx8ICQobGlua2VkRWxlbSksIHRyaWdnZXIsIFwib2ZmXCIpO1xuXHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZUciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHZpZXcgPSBsaW5rQ3R4LnZpZXc7XG5cdFx0XHRpZiAodmlldy50eXBlID09PSBcImxpbmtcIikge1xuXHRcdFx0XHR2aWV3LnBhcmVudC5yZW1vdmVWaWV3cyh2aWV3Ll8ua2V5LCB1bmRlZmluZWQsIHRydWUpOyAvLyBBIFwibGlua1wiIHZpZXcgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBiaW5kaW5nLCBzbyBzaG91bGQgYmUgZGlzcG9zZWQgd2l0aCBiaW5kaW5nLlxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIHZpZXcuXy5ibmRzW2JpbmRJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGRlbGV0ZSBjYkJpbmRpbmdzU3RvcmVbYmluZGluZy5jYklkXTtcblx0fVxufVxuXG5mdW5jdGlvbiAkdW5saW5rKHRvKSB7XG5cdGlmICh0bykge1xuXHRcdHRvID0gdG8uanF1ZXJ5ID8gdG8gOiAkKHRvKTtcblx0XHR0by5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGlubmVyVmlldztcblx0XHRcdC8vVE9ETyBmaXggdGhpcyBmb3IgYmV0dGVyIHBlcmYuIFJhdGhlciB0aGF0IGNhbGxpbmcgaW5uZXIgdmlldyBtdWx0aXBsZSB0aW1lcyB3aGljaCBkb2VzIHF1ZXJ5U2VsZWN0b3JBbGwgZWFjaCB0aW1lLCBjb25zaWRlciBhIHNpbmdsZSBxdWVyeVNlbGVjdG9yQWxsXG5cdFx0XHQvLyBvciBzaW1wbHkgY2FsbCB2aWV3LnJlbW92ZVZpZXdzKCkgb24gdGhlIHRvcC1sZXZlbCB2aWV3cyB1bmRlciB0aGUgdGFyZ2V0ICd0bycgbm9kZSwgdGhlbiBjbGVhbiguLi4pXG5cdFx0XHR3aGlsZSAoKGlubmVyVmlldyA9ICR2aWV3KHRoaXMsIHRydWUpKSAmJiBpbm5lclZpZXcucGFyZW50KSB7XG5cdFx0XHRcdGlubmVyVmlldy5wYXJlbnQucmVtb3ZlVmlld3MoaW5uZXJWaWV3Ll8ua2V5LCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0Y2xlYW4odGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikpO1xuXHRcdH0pO1xuXHRcdGNsZWFuKHRvKTtcblx0fSBlbHNlIHtcblx0XHQvLyBDYWxsIHRvICQudW5saW5rKCkgaXMgZXF1aXZhbGVudCB0byAkLnVubGluayh0cnVlLCBcImJvZHlcIilcblx0XHRpZiAoYWN0aXZlQm9keSkge1xuXHRcdFx0JChhY3RpdmVCb2R5KVxuXHRcdFx0XHQub2ZmKGVsZW1lbnRDaGFuZ2VTdHIsIGVsZW1DaGFuZ2VIYW5kbGVyKVxuXHRcdFx0XHQub2ZmKCdibHVyJywgJ1tjb250ZW50ZWRpdGFibGVdJywgZWxlbUNoYW5nZUhhbmRsZXIpO1xuXHRcdFx0YWN0aXZlQm9keSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dG9wVmlldy5yZW1vdmVWaWV3cygpO1xuXHRcdGNsZWFuKGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpKTtcblx0fVxufVxuXG4vLz09PT09PT09XG4vLyBIZWxwZXJzXG4vLz09PT09PT09XG5cbmZ1bmN0aW9uIGdldENvbnRleHRDYih2aWV3KSB7IC8vIFJldHVybiBhIGNhbGxiYWNrIGZvciBhY2Nlc3NpbmcgdGhlIGNvbnRleHQgb2YgYSB0ZW1wbGF0ZS9kYXRhLWxpbmsgZXhwcmVzc2lvbiAtIGFuZCBjb252ZXJ0aW5nIH5mb28sICNmb28gZXRjLlxuXHQvLyBUT0RPIENvbnNpZGVyIGV4cG9zaW5nIG9yIGFsbG93aW5nIG92ZXJyaWRlLCBhcyBwdWJsaWMgQVBJXG5cdHJldHVybiBmdW5jdGlvbihwYXRoLCBvYmplY3QsIGRlcHRoKSB7XG5cdFx0Ly8gVE9ETyBjb25zaWRlciBvbmx5IGNhbGxpbmcgdGhlIGNvbnRleHRDYiBvbiB0aGUgaW5pdGlhbCB0b2tlbiBpbiBwYXRoICd+YS5iLmMnIGFuZCBub3QgY2FsbGluZyBhZ2FpbiBvblxuXHRcdC8vIHRoZSBpbmRpdmlkdWFsIHRva2VucywgJ2EnLCAnYicsICdjJy4uLiBDdXJyZW50bHkgaXQgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzXG5cdFx0dmFyIHRva2VucywgdGFnLCBpdGVtcywgaGVscGVyLCBsYXN0LCBuZXh0UGF0aCwgbDtcblx0XHRpZiAodmlldyAmJiBwYXRoKSB7XG5cdFx0XHRpZiAocGF0aC5fanN2KSB7XG5cdFx0XHRcdHJldHVybiBwYXRoLl9qc3YuY2FsbCh2aWV3LnRtcGwsIG9iamVjdCwgdmlldywgJHN1Yik7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5jaGFyQXQoMCkgPT09IFwiflwiKSB7XG5cdFx0XHRcdC8vIFdlIHJldHVybiBuZXcgaXRlbXMgdG8gaW5zZXJ0IGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIFwifmEuYi5jXCIgc3RyaW5nOlxuXHRcdFx0XHQvLyBbaGVscGVyT2JqZWN0ICdhJywgXCJhLmIuY1wiIGN1cnJlbnREYXRhSXRlbV0gc28gY3VycmVudERhdGFJdGVtIGJlY29tZXMgdGhlIG9iamVjdCBmb3Igc3Vic2VxdWVudCBwYXRocy5cblx0XHRcdFx0aWYgKHBhdGguc2xpY2UoMCwgNCkgPT09IFwifnRhZ1wiKSB7XG5cdFx0XHRcdFx0dGFnID0gdmlldy5jdHg7XG5cdFx0XHRcdFx0aWYgKHBhdGguY2hhckF0KDQpID09PSBcIi5cIikge1xuXHRcdFx0XHRcdFx0Ly8gXCJ+dGFnLnh4eFwiXG5cdFx0XHRcdFx0XHR0b2tlbnMgPSBwYXRoLnNsaWNlKDUpLnNwbGl0KFwiLlwiKTtcblx0XHRcdFx0XHRcdHRhZyA9IHRhZy50YWc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0b2tlbnMpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0YWcgPyBbdGFnLCB0b2tlbnMuam9pbihcIi5cIiksIG9iamVjdF0gOiBbXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aCA9IHBhdGguc2xpY2UoMSkuc3BsaXQoXCIuXCIpO1xuXHRcdFx0XHRpZiAoaGVscGVyID0gdmlldy5obHAobGFzdCA9IHBhdGguc2hpZnQoKSwgdHJ1ZSkpIHtcblx0XHRcdFx0XHRpZiAoaGVscGVyLl9jcCkgeyAgLy8gaGVscGVyIGZvciAoY29udGV4dHVhbCBwYXJhbWV0ZXIgfmZvbz0uLi4pIGlzIGFuIGFycmF5IC0gW2RhdGEsIGN0eFBybURlcGVuZGVuY2llcyAuLi5dXG5cdFx0XHRcdFx0XHRpZiAocGF0aC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0bmV4dFBhdGggPSBcIi5cIiArIHBhdGguam9pbihcIi5cIik7XG5cdFx0XHRcdFx0XHRcdGxhc3QgPSBoZWxwZXJbbCA9IGhlbHBlci5sZW5ndGgtMV07XG5cdFx0XHRcdFx0XHRcdGlmIChsYXN0Ll9qc3YpIHtcblx0XHRcdFx0XHRcdFx0XHRsYXN0LnNiID0gbmV4dFBhdGg7XG5cdFx0XHRcdFx0XHRcdFx0bGFzdC5ibmQgPSAhIWRlcHRoO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGhlbHBlcltsXSA9IChsYXN0ICsgbmV4dFBhdGgpLnJlcGxhY2UoXCIjZGF0YS5cIiwgXCJcIik7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGxhc3Quc2xpY2UoMCwgNSkgPT09IFwiI3ZpZXdcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0aGVscGVyW2xdID0gaGVscGVyW2xdLnNsaWNlKDYpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aGVscGVyLnNwbGljZShsLCAwLCB2aWV3KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGhlbHBlci5wdXNoKG9iamVjdCk7XG5cdFx0XHRcdFx0XHRpdGVtcyA9IGhlbHBlcjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhdGgubGVuZ3RoIHx8ICRpc0Z1bmN0aW9uKGhlbHBlcikpIHtcblx0XHRcdFx0XHRcdGl0ZW1zID0gW2hlbHBlciwgcGF0aC5qb2luKFwiLlwiKSwgb2JqZWN0XTsgLy8gMndheSBiaW5kbmcgb24gfmZvby5oZWxwZXJMZWFmUHJvcGVydHkgb3IgfmNvbXB1dGVkKCkgb3IgfmNvbnRleHR1YWxQYXJhbVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaXRlbXMgfHwgW107XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdC8vIFdlIHJldHVybiBuZXcgaXRlbXMgdG8gaW5zZXJ0IGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIFwiI2EuYi5jXCIgc3RyaW5nOiBbdmlldywgXCJhLmIuY1wiIGN1cnJlbnREYXRhSXRlbV1cblx0XHRcdFx0Ly8gc28gY3VycmVudERhdGFJdGVtIGJlY29tZXMgdGhlIG9iamVjdCBmb3Igc3Vic2VxdWVudCBwYXRocy4gVGhlICd0cnVlJyBmbGFnIG1ha2VzIHRoZSBwYXRocyBiaW5kIG9ubHkgdG8gbGVhZiBjaGFuZ2VzLlxuXHRcdFx0XHRyZXR1cm4gcGF0aCA9PT0gXCIjZGF0YVwiID8gW10gOiBbdmlldywgcGF0aC5yZXBsYWNlKHJWaWV3UGF0aCwgXCJcIiksIG9iamVjdF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBpbnB1dEF0dHJpYihlbGVtKSB7XG5cdHJldHVybiBlbGVtLnR5cGUgPT09IENIRUNLQk9YID8gZWxlbVtDSEVDS0VEXSA6IGVsZW0udmFsdWU7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PT09PT09PVxuLy8gSnNSZW5kZXIgaW50ZWdyYXRpb25cbi8vPT09PT09PT09PT09PT09PT09PT09XG5cbiRzdWIub25TdG9yZS50ZW1wbGF0ZSA9IGZ1bmN0aW9uKG5hbWUsIGl0ZW0pIHtcblx0aXRlbS5saW5rID0gdG1wbExpbms7XG5cdGlmIChuYW1lKSB7XG5cdFx0JC5saW5rW25hbWVdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdG1wbExpbmsuYXBwbHkoaXRlbSwgYXJndW1lbnRzKTtcblx0XHR9O1xuXHR9XG59O1xuXG4kc3ViLnZpZXdJbmZvcyA9IHZpZXdJbmZvczsgLy8gRXhwb3NlIHZpZXdJbmZvcygpIGFzIHB1YmxpYyBoZWxwZXIgbWV0aG9kXG5cbi8vIERlZmluZSBKc1ZpZXdzIHZlcnNpb24gb2YgZGVsaW1pdGVycygpLCBhbmQgaW5pdGlhbGl6ZVxuKCR2aWV3c1NldHRpbmdzLmRlbGltaXRlcnMgPSBmdW5jdGlvbigpIHtcblx0Ly8gUnVuIGRlbGltaXRlcnMgaW5pdGlhbGl6YXRpb24gaW4gY29udGV4dCBvZiBqc3JlbmRlci5qc1xuXHR2YXIgcmV0ID0gb2xkSnN2RGVsaW1pdGVycy5hcHBseSgwLCBhcmd1bWVudHMpO1xuXG5cdGlmIChvbGRKc3ZEZWxpbWl0ZXJzICE9PSAkdmlld3NEZWxpbWl0ZXJzKSB7XG5cdFx0Ly8gSWYgSnNSZW5kZXIgd2FzIGxvYWRlZCBiZWZvcmUgSnNWaWV3cywgdGhlbiBuZWVkIGFsc28gdG8gaW5pdGlhbGl6ZSBhbmQgc2V0IGdsb2JhbHMgaW4gdGhhdCBKc1JlbmRlciBpbnN0YW5jZVxuXHRcdHJldCA9ICR2aWV3c0RlbGltaXRlcnMuYXBwbHkoMCwgYXJndW1lbnRzKTtcblx0fVxuXG5cdC8vIERhdGEtbGlua2luZyBtdXN0IHVzZSBuZXcgZGVsaW1pdGVyc1xuXHRyVGFnRGF0YWxpbmsgPSBuZXcgUmVnRXhwKFwiKD86XnxcXFxccyopKFtcXFxcdy1dKikoXFxcXFwiICsgbGlua0NoYXIgKyBcIik/KFxcXFxcIiArIGRlbGltT3BlbkNoYXIxICsgJHN1Yi5yVGFnICsgXCIoOlxcXFx3Kik/XFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCIpXCIsIFwiZ1wiKTtcblx0cmV0dXJuIHJldDtcbn0pKCk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG4kc3ViLmFkZFNldHRpbmcoXCJ0cmlnZ2VyXCIpO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQWRkaXRpb25hbCBtZW1iZXJzIGZvciBsaW5rZWQgdmlld3Ncbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHBhcmVudEVsZW0sIGlkLCB2aWV3T3JUYWdDaGFyLCByZWZyZXNoKSB7XG5cdC8vIFRyYW5zZmVyIHRva2VucyBvbiBwcmV2Tm9kZSBvZiB2aWV3VG9SZW1vdmUvdmlld1RvUmVmcmVzaCB0byBuZXh0Tm9kZSBvciBwYXJlbnRFbGVtLl9kZlxuXHR2YXIgaSwgbCwgdndJbmZvcywgdndJbmZvLCB2aWV3T3JUYWcsIHZpZXdJZCwgdG9rZW5zLFxuXHRcdHByZWNlZGluZ0xlbmd0aCA9IDAsXG5cdFx0ZW1wdHlWaWV3ID0gcHJldk5vZGUgPT09IG5leHROb2RlO1xuXG5cdGlmIChwcmV2Tm9kZSkge1xuXHRcdC8vIHByZXZOb2RlIGlzIGVpdGhlciB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgdmlld09yVGFnLCBvciBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgdndJbmZvcyB0b2tlbnMgc3RyaW5nXG5cdFx0dndJbmZvcyA9IHZpZXdJbmZvcyhwcmV2Tm9kZSkgfHwgW107XG5cdFx0Zm9yIChpID0gMCwgbCA9IHZ3SW5mb3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHQvLyBTdGVwIHRocm91Z2ggdmlld3Mgb3IgdGFncyBvbiB0aGUgcHJldk5vZGVcblx0XHRcdHZ3SW5mbyA9IHZ3SW5mb3NbaV07XG5cdFx0XHR2aWV3SWQgPSB2d0luZm8uaWQ7XG5cdFx0XHRpZiAodmlld0lkID09PSBpZCAmJiB2d0luZm8uY2ggPT09IHZpZXdPclRhZ0NoYXIpIHtcblx0XHRcdFx0aWYgKHJlZnJlc2gpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIHZpZXdPclRhZ1RvUmVmcmVzaCwgdGhpcyBpcyB0aGUgbGFzdCB2aWV3T3JUYWcgdG8gcHJvY2Vzcy4uLlxuXHRcdFx0XHRcdGwgPSAwO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgdmlld09yVGFnVG9SZW1vdmUsIHNvIHdlIGFyZSBkb25lLi4uXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghZW1wdHlWaWV3KSB7XG5cdFx0XHRcdHZpZXdPclRhZyA9IHZ3SW5mby5jaCA9PT0gXCJfXCJcblx0XHRcdFx0XHQ/IHZpZXdTdG9yZVt2aWV3SWRdXG5cdFx0XHRcdFx0OiBiaW5kaW5nU3RvcmVbdmlld0lkXS5saW5rQ3R4LnRhZztcblx0XHRcdFx0aWYgKHZ3SW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0Ly8gQSBcIiNtXCIgdG9rZW5cblx0XHRcdFx0XHR2aWV3T3JUYWcuX3BydiA9IG5leHROb2RlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHZ3SW5mby5jbG9zZSkge1xuXHRcdFx0XHRcdC8vIEEgXCIvbVwiIHRva2VuXG5cdFx0XHRcdFx0dmlld09yVGFnLl9ueHQgPSBuZXh0Tm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJlY2VkaW5nTGVuZ3RoICs9IHZpZXdJZC5sZW5ndGggKyAyO1xuXHRcdH1cblxuXHRcdGlmIChwcmVjZWRpbmdMZW5ndGgpIHtcblx0XHRcdHByZXZOb2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCBwcmV2Tm9kZS5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cikuc2xpY2UocHJlY2VkaW5nTGVuZ3RoKSk7XG5cdFx0fVxuXHRcdHRva2VucyA9IG5leHROb2RlID8gbmV4dE5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpIDogcGFyZW50RWxlbS5fZGY7XG5cdFx0aWYgKGwgPSB0b2tlbnMuaW5kZXhPZihcIi9cIiArIGlkICsgdmlld09yVGFnQ2hhcikgKyAxKSB7XG5cdFx0XHR0b2tlbnMgPSB2d0luZm9zLl90a25zLnNsaWNlKDAsIHByZWNlZGluZ0xlbmd0aCkgKyB0b2tlbnMuc2xpY2UobCArIChyZWZyZXNoID8gLTEgOiBpZC5sZW5ndGggKyAxKSk7XG5cdFx0fVxuXHRcdGlmICh0b2tlbnMpIHtcblx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHQvLyBJZiB2aWV3T3JUYWdUb1JlbW92ZSB3YXMgYW4gZW1wdHkgdmlld09yVGFnLCB3ZSB3aWxsIHJlbW92ZSBib3RoICNuIGFuZCAvblxuXHRcdFx0XHQvLyAoYW5kIGFueSBpbnRlcnZlbmluZyB0b2tlbnMpIGZyb20gdGhlIG5leHROb2RlICg9PT0gcHJldk5vZGUpXG5cdFx0XHRcdC8vIElmIHZpZXdPclRhZ1RvUmVtb3ZlIHdhcyBub3QgZW1wdHksIHdlIHdpbGwgdGFrZSB0b2tlbnMgcHJlY2VkaW5nICNuIGZyb20gcHJldk5vZGUsXG5cdFx0XHRcdC8vIGFuZCBjb25jYXRlbmF0ZSB3aXRoIHRva2VucyBmb2xsb3dpbmcgL24gb24gbmV4dE5vZGVcblx0XHRcdFx0bmV4dE5vZGUuc2V0QXR0cmlidXRlKGpzdkF0dHJTdHIsIHRva2Vucyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCB0b2tlbnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyAhcHJldk5vZGUsIHNvIHRoZXJlIG1heSBiZSBhIGRlZmVycmVkIG5vZGVzIHRva2VuIG9uIHRoZSBwYXJlbnRFbGVtLiBSZW1vdmUgaXQuXG5cdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgcmVtb3ZlU3ViU3RyKHBhcmVudEVsZW0uX2RmLCBcIiNcIiArIGlkICsgdmlld09yVGFnQ2hhcikpO1xuXHRcdGlmICghcmVmcmVzaCAmJiAhbmV4dE5vZGUpIHtcblx0XHRcdC8vIElmIHRoaXMgdmlld09yVGFnIGlzIGJlaW5nIHJlbW92ZWQsIGFuZCB0aGVyZSB3YXMgbm8gLm54dCwgcmVtb3ZlIGNsb3NpbmcgdG9rZW4gZnJvbSBkZWZlcnJlZCB0b2tlbnNcblx0XHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIvXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGlzcG9zZVRva2Vucyh0b2tlbnMpIHtcblx0dmFyIGksIGwsIHZ3SXRlbSwgdndJbmZvcztcblx0aWYgKHZ3SW5mb3MgPSB2aWV3SW5mb3ModG9rZW5zLCB0cnVlLCByT3Blbk1hcmtlcnMpKSB7XG5cdFx0Zm9yIChpID0gMCwgbCA9IHZ3SW5mb3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR2d0l0ZW0gPSB2d0luZm9zW2ldO1xuXHRcdFx0aWYgKHZ3SXRlbS5jaCA9PT0gXCJfXCIpIHtcblx0XHRcdFx0aWYgKCh2d0l0ZW0gPSB2aWV3U3RvcmVbdndJdGVtLmlkXSkgJiYgdndJdGVtLnR5cGUpIHtcblx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIHRoZSBfcHJ2IChwcmV2Tm9kZSkgZm9yIGEgdmlldywgcmVtb3ZlIHRoZSB2aWV3XG5cdFx0XHRcdFx0Ly8gLSB1bmxlc3Mgdmlldy50eXBlIGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHR2d0l0ZW0ucGFyZW50LnJlbW92ZVZpZXdzKHZ3SXRlbS5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcodndJdGVtLmlkKTsgLy8gdW5iaW5kIGJpbmRpbmdzIHdpdGggdGhpcyBiaW5kaW5nSWQgb24gdGhpcyB2aWV3XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBZGQgbGluayBtZXRob2RzIHRvIGRhdGEtbGlua2VkIHZpZXcgb3IgdGFnXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gYWRkTGlua01ldGhvZHModGFnT3JWaWV3LCBpc1RhZykge1xuXG5cdHRhZ09yVmlldy5jb250ZW50cyA9IGZ1bmN0aW9uKGRlZXAsIHNlbGVjdCkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiBqUXVlcnkgb2JqZWN0IHdpdGggdGhlIGNvbnRlbnQgbm9kZXMsXG5cdFx0aWYgKGRlZXAgIT09ICEhZGVlcCkge1xuXHRcdFx0Ly8gZGVlcCBub3QgYm9vbGVhbiwgc28gdGhpcyBpcyBjb250ZW50cyhzZWxlY3Rvcilcblx0XHRcdHNlbGVjdCA9IGRlZXA7XG5cdFx0XHRkZWVwID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR2YXIgZmlsdGVyZWQsXG5cdFx0XHRub2RlcyA9ICQodGhpcy5ub2RlcygpKTtcblx0XHRpZiAobm9kZXNbMF0pIHtcblx0XHRcdGZpbHRlcmVkID0gc2VsZWN0ID8gbm9kZXMuZmlsdGVyKHNlbGVjdCkgOiBub2Rlcztcblx0XHRcdG5vZGVzID0gZGVlcCAmJiBzZWxlY3QgPyBmaWx0ZXJlZC5hZGQobm9kZXMuZmluZChzZWxlY3QpKSA6IGZpbHRlcmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gbm9kZXM7XG5cdH07XG5cblx0dGFnT3JWaWV3Lm5vZGVzID0gZnVuY3Rpb24od2l0aE1hcmtlcnMsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiB0b3AtbGV2ZWwgbm9kZXNcblx0XHQvLyBEbyBub3QgcmV0dXJuIGFueSBzY3JpcHQgbWFya2VyIG5vZGVzLCB1bmxlc3Mgd2l0aE1hcmtlcnMgaXMgdHJ1ZVxuXHRcdC8vIE9wdGlvbmFsbHkgbGltaXQgcmFuZ2UsIGJ5IHBhc3NpbmcgaW4gcHJldk5vZGUgb3IgbmV4dE5vZGUgcGFyYW1ldGVyc1xuXG5cdFx0dmFyIG5vZGUsXG5cdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdGVsQ250ID0gc2VsZi5fZWxDbnQsXG5cdFx0XHRwcmV2SXNGaXJzdE5vZGUgPSAhcHJldk5vZGUgJiYgZWxDbnQsXG5cdFx0XHRub2RlcyA9IFtdO1xuXG5cdFx0cHJldk5vZGUgPSBwcmV2Tm9kZSB8fCBzZWxmLl9wcnY7XG5cdFx0bmV4dE5vZGUgPSBuZXh0Tm9kZSB8fCBzZWxmLl9ueHQ7XG5cblx0XHRub2RlID0gcHJldklzRmlyc3ROb2RlXG5cdFx0XHQ/IChwcmV2Tm9kZSA9PT0gc2VsZi5fbnh0XG5cdFx0XHRcdD8gc2VsZi5wYXJlbnRFbGVtLmxhc3RTaWJsaW5nXG5cdFx0XHRcdDogcHJldk5vZGUpXG5cdFx0XHQ6IChzZWxmLl8uaW5saW5lID09PSBmYWxzZVxuXHRcdFx0XHQ/IHByZXZOb2RlIHx8IHNlbGYubGlua0N0eC5lbGVtLmZpcnN0Q2hpbGRcblx0XHRcdFx0OiBwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5uZXh0U2libGluZyk7XG5cblx0XHR3aGlsZSAobm9kZSAmJiAoIW5leHROb2RlIHx8IG5vZGUgIT09IG5leHROb2RlKSkge1xuXHRcdFx0aWYgKHdpdGhNYXJrZXJzIHx8IGVsQ250IHx8IG5vZGUudGFnTmFtZSAhPT0gU0NSSVBUKSB7XG5cdFx0XHRcdC8vIEFsbCB0aGUgdG9wLWxldmVsIG5vZGVzIGluIHRoZSB2aWV3XG5cdFx0XHRcdC8vIChleGNlcHQgc2NyaXB0IG1hcmtlciBub2RlcywgdW5sZXNzIHdpdGhNYXJrZXJzID0gdHJ1ZSlcblx0XHRcdFx0Ly8gKE5vdGU6IElmIGEgc2NyaXB0IG1hcmtlciBub2RlLCB2aWV3SW5mby5lbENudCB1bmRlZmluZWQpXG5cdFx0XHRcdG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0XHR9XG5cdFx0XHRub2RlID0gbm9kZS5uZXh0U2libGluZztcblx0XHR9XG5cdFx0cmV0dXJuIG5vZGVzO1xuXHR9O1xuXG5cdHRhZ09yVmlldy5jaGlsZFRhZ3MgPSBmdW5jdGlvbihkZWVwLCB0YWdOYW1lKSB7XG5cdFx0Ly8gRm9yIGEgdmlldyBvciBhIHRhZywgcmV0dXJuIGNoaWxkIHRhZ3MgLSBhdCBhbnkgZGVwdGgsIG9yIGFzIGltbWVkaWF0ZSBjaGlsZHJlbiBvbmx5LlxuXHRcdGlmIChkZWVwICE9PSAhIWRlZXApIHtcblx0XHRcdC8vIGRlZXAgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgY2hpbGRUYWdzKHRhZ05hbWUpIC0gd2hpY2ggbG9va3MgZm9yIHRvcC1sZXZlbCB0YWdzIG9mIGdpdmVuIHRhZ05hbWVcblx0XHRcdHRhZ05hbWUgPSBkZWVwO1xuXHRcdFx0ZGVlcCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHR2aWV3ID0gc2VsZi5saW5rID8gc2VsZiA6IHNlbGYudGFnQ3R4LnZpZXcsIC8vIHRoaXMgbWF5IGJlIGEgdmlldyBvciBhIHRhZy4gSWYgYSB0YWcsIGdldCB0aGUgdmlldyBmcm9tIHRhZy52aWV3LnRhZ0N0eFxuXHRcdFx0cHJldk5vZGUgPSBzZWxmLl9wcnYsXG5cdFx0XHRlbENudCA9IHNlbGYuX2VsQ250LFxuXHRcdFx0dGFncyA9IFtdO1xuXG5cdFx0dmlldy5saW5rKFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0c2VsZi5wYXJlbnRFbGVtLFxuXHRcdFx0ZWxDbnQgPyBwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5wcmV2aW91c1NpYmxpbmcgOiBwcmV2Tm9kZSxcblx0XHRcdHNlbGYuX254dCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHtnZXQ6e1xuXHRcdFx0XHR0YWdzOiB0YWdzLFxuXHRcdFx0XHRkZWVwOiBkZWVwLFxuXHRcdFx0XHRuYW1lOiB0YWdOYW1lLFxuXHRcdFx0XHRpZDogc2VsZi5saW5rID8gc2VsZi5fLmlkICsgXCJfXCIgOiBzZWxmLl90Z0lkICsgXCJeXCJcblx0XHRcdH19XG5cdFx0KTtcblx0XHRyZXR1cm4gdGFncztcblx0fTtcblxuXHR0YWdPclZpZXcucmVmcmVzaCA9IGZ1bmN0aW9uKHNvdXJjZVZhbHVlKSB7XG5cdFx0dmFyIHByb21pc2UsIGF0dHIsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0bGlua0N0eCA9IHRhZy5saW5rQ3R4LFxuXHRcdFx0dmlldyA9IHRhZy50YWdDdHgudmlldztcblxuXHRcdGlmICh0YWcuZGlzcG9zZWQpIHsgZXJyb3IoXCJSZW1vdmVkIHRhZ1wiKTsgfVxuXHRcdGlmIChzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9ICRzdWIuX3RhZyh0YWcsIHZpZXcsIHZpZXcudG1wbCwgbWVyZ2VDdHhzKHRhZyksIHRydWUpOyAvLyBHZXQgcmVuZGVyZWQgSFRNTCBmb3IgdGFnLCBiYXNlZCBvbiByZWZyZXNoZWQgdGFnQ3R4c1xuXHRcdH1cblx0XHRpZiAoc291cmNlVmFsdWUgKyBcIlwiID09PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0Ly8gSWYgbm8gcmVuZGVyZWQgY29udGVudCwgc291cmNlVmFsdWUgd2lsbCBub3QgYmUgYSBzdHJpbmcgKGNhbiBiZSAwIG9yIHVuZGVmaW5lZClcblx0XHRcdGlmICh0YWcub25VbmJpbmQpIHtcblx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgpO1xuXHRcdFx0fVxuXHRcdFx0YXR0ciA9IHRhZy5fLmlubGluZSA/IEhUTUwgOiAobGlua0N0eC5hdHRyIHx8IGRlZmF1bHRBdHRyKHRhZy5wYXJlbnRFbGVtLCB0cnVlKSk7XG5cdFx0XHRwcm9taXNlID0gdXBkYXRlQ29udGVudChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgYXR0ciwgdGFnKTtcblx0XHR9XG5cblx0XHRjYWxsQWZ0ZXJMaW5rKHRhZyk7XG5cdFx0cmV0dXJuIHByb21pc2UgfHwgdGFnO1xuXHR9O1xuXG5cdHRhZ09yVmlldy51cGRhdGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHZhciBsaW5rZWRFbGVtID0gdGhpcy5saW5rZWRFbGVtO1xuXHRcdGlmIChsaW5rZWRFbGVtKSB7XG5cdFx0XHRlbGVtQ2hhbmdlSGFuZGxlcih7XG5cdFx0XHRcdHRhcmdldDogbGlua2VkRWxlbVswXVxuXHRcdFx0fSwgdW5kZWZpbmVkLCB2YWx1ZSk7XG5cdFx0fVxuXHR9O1xuXG5cdGlmIChpc1RhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBUQUdcblx0XHR0YWdPclZpZXcuZG9tQ2hhbmdlID0gZnVuY3Rpb24oKSB7IC8vIGRvbUNoYW5nZSBub3RpZmljYXRpb24gc3VwcG9ydFxuXHRcdFx0dmFyIGVsZW0gPSB0aGlzLnBhcmVudEVsZW0sXG5cdFx0XHRcdGhhc0xpc3RlbmVyID0gJC5oYXNEYXRhKGVsZW0pICYmICQuX2RhdGEoZWxlbSkuZXZlbnRzLFxuXHRcdFx0XHRkb21DaGFuZ2VOb3RpZmljYXRpb24gPSBcImpzdi1kb21jaGFuZ2VcIjtcblxuXHRcdFx0aWYgKGhhc0xpc3RlbmVyICYmIGhhc0xpc3RlbmVyW2RvbUNoYW5nZU5vdGlmaWNhdGlvbl0pIHtcblx0XHRcdFx0Ly8gT25seSB0cmlnZ2VyIGhhbmRsZXIgaWYgdGhlcmUgaXMgYSBoYW5kbGVyIGxpc3RlbmluZyBmb3IgdGhpcyBldmVudC4gKE5vdGUgdXNpbmcgdHJpZ2dlckhhbmRsZXIgLSBzbyBubyBldmVudCBidWJibGluZy4pXG5cdFx0XHRcdCQoZWxlbSkudHJpZ2dlckhhbmRsZXIoZG9tQ2hhbmdlTm90aWZpY2F0aW9uLCBhcmd1bWVudHMpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyBhIFZJRVdcblx0XHQvLyBOb3RlOiBhIGxpbmtlZCB2aWV3IHdpbGwgYWxzbywgYWZ0ZXIgbGlua2luZyBoYXZlIG5vZGVzW10sIF9wcnYgKHByZXZOb2RlKSwgX254dCAobmV4dE5vZGUpIC4uLlxuXHRcdHRhZ09yVmlldy5hZGRWaWV3cyA9IGZ1bmN0aW9uKGluZGV4LCBkYXRhSXRlbXMpIHtcblx0XHRcdC8vIGlmIHZpZXcgaXMgbm90IGFuIGFycmF5IHZpZXcsIGRvIG5vdGhpbmdcblx0XHRcdHZhciBpLCB2aWV3c0NvdW50LFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0aXRlbXNDb3VudCA9IGRhdGFJdGVtcy5sZW5ndGgsXG5cdFx0XHRcdHZpZXdzID0gc2VsZi52aWV3cztcblxuXHRcdFx0aWYgKCFzZWxmLl8udXNlS2V5ICYmIGl0ZW1zQ291bnQpIHtcblx0XHRcdFx0Ly8gdmlldyBpcyBvZiB0eXBlIFwiYXJyYXlcIlxuXHRcdFx0XHR2aWV3c0NvdW50ID0gdmlld3MubGVuZ3RoICsgaXRlbXNDb3VudDtcblxuXHRcdFx0XHRpZiAodmlld3NDb3VudCA9PT0gc2VsZi5kYXRhLmxlbmd0aCAvLyBJZiB2aWV3cyBub3QgYWxyZWFkeSBzeW5jZWQgdG8gYXJyYXkgKGUuZy4gdHJpZ2dlcmVkIGJ5IGFycmF5Lmxlbmd0aCBwcm9wZXJ0eUNoYW5nZSAtIGpzdmlld3MvaXNzdWVzLzMwMSlcblx0XHRcdFx0XHRcdCYmIHJlbmRlckFuZExpbmsoc2VsZiwgaW5kZXgsIHNlbGYudG1wbCwgdmlld3MsIGRhdGFJdGVtcywgc2VsZi5jdHgpICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdGlmICghc2VsZi5fLnNydCkgeyAvLyBOb3QgcGFydCBvZiBhICdzb3J0JyBvbiByZWZyZXNoXG5cdFx0XHRcdFx0XHRzZWxmLmZpeEluZGV4KGluZGV4ICsgaXRlbXNDb3VudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5yZW1vdmVWaWV3cyA9IGZ1bmN0aW9uKGluZGV4LCBpdGVtc0NvdW50LCBrZWVwTm9kZXMsIGlzTW92ZSkge1xuXHRcdFx0Ly8gdmlldy5yZW1vdmVWaWV3cygpIHJlbW92ZXMgYWxsIHRoZSBjaGlsZCB2aWV3c1xuXHRcdFx0Ly8gdmlldy5yZW1vdmVWaWV3cyhpbmRleCkgcmVtb3ZlcyB0aGUgY2hpbGQgdmlldyB3aXRoIHNwZWNpZmllZCBpbmRleCBvciBrZXlcblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoaW5kZXgsIGNvdW50KSByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbnVtbWJlciBvZiBjaGlsZCB2aWV3cywgc3RhcnRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4XG5cdFx0XHRmdW5jdGlvbiByZW1vdmVWaWV3KGluZGV4KSB7XG5cdFx0XHRcdHZhciBpZCwgYmluZElkLCBwYXJlbnRFbGVtLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIG5vZGVzVG9SZW1vdmUsXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlID0gdmlld3NbaW5kZXhdO1xuXG5cdFx0XHRcdGlmICh2aWV3VG9SZW1vdmUgJiYgdmlld1RvUmVtb3ZlLmxpbmspIHtcblx0XHRcdFx0XHRpZCA9IHZpZXdUb1JlbW92ZS5fLmlkO1xuXHRcdFx0XHRcdGlmICgha2VlcE5vZGVzKSB7XG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgdGhlIEhUTUwgbm9kZXMgZnJvbSB0aGUgRE9NLCB1bmxlc3MgdGhleSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkLCBpbmNsdWRpbmcgbm9kZXMgb2YgY2hpbGQgdmlld3Ncblx0XHRcdFx0XHRcdG5vZGVzVG9SZW1vdmUgPSB2aWV3VG9SZW1vdmUubm9kZXMoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBSZW1vdmUgY2hpbGQgdmlld3MsIHdpdGhvdXQgcmVtb3Zpbmcgbm9kZXNcblx0XHRcdFx0XHR2aWV3VG9SZW1vdmUucmVtb3ZlVmlld3ModW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlLnR5cGUgPSB1bmRlZmluZWQ7IC8vIFNldCB0eXBlIHRvIHVuZGVmaW5lZDogdXNlZCBhcyBhIGZsYWcgdGhhdCB0aGlzIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0XHRcdHByZXZOb2RlID0gdmlld1RvUmVtb3ZlLl9wcnY7XG5cdFx0XHRcdFx0bmV4dE5vZGUgPSB2aWV3VG9SZW1vdmUuX254dDtcblx0XHRcdFx0XHRwYXJlbnRFbGVtID0gdmlld1RvUmVtb3ZlLnBhcmVudEVsZW07XG5cdFx0XHRcdFx0Ly8gSWYgcHJldk5vZGUgYW5kIG5leHROb2RlIGFyZSB0aGUgc2FtZSwgdGhlIHZpZXcgaXMgZW1wdHlcblx0XHRcdFx0XHRpZiAoIWtlZXBOb2Rlcykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBIVE1MIG5vZGVzIGZyb20gdGhlIERPTSwgdW5sZXNzIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgaW5jbHVkaW5nIG5vZGVzIG9mIGNoaWxkIHZpZXdzXG5cdFx0XHRcdFx0XHRpZiAodmlld1RvUmVtb3ZlLl9lbENudCkge1xuXHRcdFx0XHRcdFx0XHQvLyBpZiBrZWVwTm9kZXMgaXMgZmFsc2UgKGFuZCB0cmFuc2ZlcnJpbmcgb2YgdG9rZW5zIGhhcyBub3QgYWxyZWFkeSBiZWVuIGRvbmUgYXQgYSBoaWdoZXIgbGV2ZWwpXG5cdFx0XHRcdFx0XHRcdC8vIHRoZW4gdHJhbnNmZXIgdG9rZW5zIGZyb20gcHJldk5vZGUgd2hpY2ggaXMgYmVpbmcgcmVtb3ZlZCwgdG8gbmV4dE5vZGUuXG5cdFx0XHRcdFx0XHRcdHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHBhcmVudEVsZW0sIGlkLCBcIl9cIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQkKG5vZGVzVG9SZW1vdmUpLnJlbW92ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXZpZXdUb1JlbW92ZS5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHByZXZOb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocHJldk5vZGUpOyAvLyAocHJldk5vZGUucGFyZW50Tm9kZSBpcyBwYXJlbnRFbGVtLCBleGNlcHQgaWYgalF1ZXJ5IE1vYmlsZSBvciBzaW1pbGFyIGhhcyBpbnNlcnRlZCBhbiBpbnRlcm1lZGlhdGUgd3JhcHBlclxuXHRcdFx0XHRcdFx0XHRuZXh0Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5leHROb2RlKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNldEFycmF5Q2hhbmdlTGluayh2aWV3VG9SZW1vdmUpO1xuXHRcdFx0XHRcdGZvciAoYmluZElkIGluIHZpZXdUb1JlbW92ZS5fLmJuZHMpIHtcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRlbGV0ZSB2aWV3U3RvcmVbaWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjdXJyZW50LCB2aWV3LCB2aWV3c0NvdW50LFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0aXNBcnJheSA9ICFzZWxmLl8udXNlS2V5LFxuXHRcdFx0XHR2aWV3cyA9IHNlbGYudmlld3M7XG5cblx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdHZpZXdzQ291bnQgPSB2aWV3cy5sZW5ndGg7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBSZW1vdmUgYWxsIGNoaWxkIHZpZXdzXG5cdFx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdFx0Ly8gdmlld3MgYW5kIGRhdGEgYXJlIGFycmF5c1xuXHRcdFx0XHRcdGN1cnJlbnQgPSB2aWV3c0NvdW50O1xuXHRcdFx0XHRcdHdoaWxlIChjdXJyZW50LS0pIHtcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXcoY3VycmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGYudmlld3MgPSBbXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB2aWV3cyBhbmQgZGF0YSBhcmUgb2JqZWN0c1xuXHRcdFx0XHRcdGZvciAodmlldyBpbiB2aWV3cykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGJ5IGtleVxuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyh2aWV3KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VsZi52aWV3cyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoaXRlbXNDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGlzQXJyYXkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBwYXJlbnRWaWV3IGlzIGRhdGEgYXJyYXkgdmlldy5cblx0XHRcdFx0XHRcdC8vIFNldCBpdGVtc0NvdW50IHRvIDEsIHRvIHJlbW92ZSB0aGlzIGl0ZW1cblx0XHRcdFx0XHRcdGl0ZW1zQ291bnQgPSAxO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgY2hpbGQgdmlldyB3aXRoIGtleSAnaW5kZXgnXG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGluZGV4KTtcblx0XHRcdFx0XHRcdGRlbGV0ZSB2aWV3c1tpbmRleF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChpc0FycmF5ICYmIGl0ZW1zQ291bnRcblx0XHRcdFx0XHQmJiAoaXNNb3ZlIHx8IHZpZXdzQ291bnQgLSBpdGVtc0NvdW50ID09PSBzZWxmLmRhdGEubGVuZ3RoKSkgeyAvLyBJZiB2aWV3cyBub3QgYWxyZWFkeSBzeW5jZWQgdG8gYXJyYXkgKGUuZy4gdHJpZ2dlcmVkIGJ5IGFycmF5Lmxlbmd0aCBwcm9wZXJ0eUNoYW5nZSAtIGpzdmlld3MvaXNzdWVzLzMwMSlcblx0XHRcdFx0XHRjdXJyZW50ID0gaW5kZXggKyBpdGVtc0NvdW50O1xuXHRcdFx0XHRcdC8vIFJlbW92ZSBpbmRleGVkIGl0ZW1zIChwYXJlbnRWaWV3IGlzIGRhdGEgYXJyYXkgdmlldyk7XG5cdFx0XHRcdFx0d2hpbGUgKGN1cnJlbnQtLSA+IGluZGV4KSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGN1cnJlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2aWV3cy5zcGxpY2UoaW5kZXgsIGl0ZW1zQ291bnQpO1xuXHRcdFx0XHRcdGlmICghc2VsZi5fLnNvcnQpIHtcblx0XHRcdFx0XHRcdHNlbGYuZml4SW5kZXgoaW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0YWdPclZpZXcucmVmcmVzaCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRwYXJlbnQgPSBzZWxmLnBhcmVudDtcblxuXHRcdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0XHRyZW5kZXJBbmRMaW5rKHNlbGYsIHNlbGYuaW5kZXgsIHNlbGYudG1wbCwgcGFyZW50LnZpZXdzLCBzZWxmLmRhdGEsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdHNldEFycmF5Q2hhbmdlTGluayhzZWxmKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LmZpeEluZGV4ID0gZnVuY3Rpb24oZnJvbUluZGV4KSB7XG5cdFx0XHQvLyBGaXh1cCBpbmRleCBvbiBmb2xsb3dpbmcgdmlldyBpdGVtcy4uLlxuXHRcdFx0dmFyIHZpZXdzID0gdGhpcy52aWV3cyxcblx0XHRcdFx0aW5kZXggPSB2aWV3cy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoZnJvbUluZGV4IDwgaW5kZXgtLSkge1xuXHRcdFx0XHRpZiAodmlld3NbaW5kZXhdLmluZGV4ICE9PSBpbmRleCkge1xuXHRcdFx0XHRcdCRvYnNlcnZhYmxlKHZpZXdzW2luZGV4XSkuc2V0UHJvcGVydHkoXCJpbmRleFwiLCBpbmRleCk7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBmaXhpbmcgdXAgaW5kZXgsIGJ1dCBub3Qga2V5LCBhbmQgbm90IGluZGV4IG9uIGNoaWxkIHZpZXdzLiBGcm9tIGNoaWxkIHZpZXdzLCB1c2Ugdmlldy5nZXRJbmRleCgpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LmxpbmsgPSB2aWV3TGluaztcblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSnNWaWV3cy1zcGVjaWZpYyBjb252ZXJ0ZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kY29udmVydGVycy5tZXJnZSA9IGZ1bmN0aW9uKHZhbCkge1xuXHQvLyBTcGVjaWFsIGNvbnZlcnRlciB1c2VkIGluIGRhdGEtbGlua2luZyB0byBzcGFjZS1zZXBhcmF0ZWQgbGlzdHMsIHN1Y2ggYXMgY2xhc3NOYW1lOlxuXHQvLyBDdXJyZW50bHkgb25seSBzdXBwb3J0cyB0b2dnbGUgc2VtYW50aWNzIC0gYW5kIGhhcyBubyBlZmZlY3QgaWYgdG9nZ2xlIHN0cmluZyBpcyBub3Qgc3BlY2lmaWVkXG5cdC8vIGRhdGEtbGluaz1cImNsYXNze21lcmdlOmJvb2xFeHByIHRvZ2dsZT1jbGFzc05hbWV9XCJcblx0dmFyIHJlZ3VsYXJFeHByZXNzaW9uLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHRoaXMubGlua0N0eC5fdmFsIHx8IFwiXCIsXG5cdFx0dG9nZ2xlID0gdGhpcy50YWdDdHgucHJvcHMudG9nZ2xlO1xuXG5cdGlmICh0b2dnbGUpIHtcblx0XHQvLyBXZSBhcmUgdG9nZ2xpbmcgdGhlIGNsYXNzIHNwZWNpZmllZCBieSB0aGUgdG9nZ2xlIHByb3BlcnR5LFxuXHRcdC8vIGFuZCB0aGUgYm9vbGVhbiB2YWwgYmluZGluZyBpcyBkcml2aW5nIHRoZSBpbnNlcnQvcmVtb3ZlIHRvZ2dsZVxuXG5cdFx0cmVndWxhckV4cHJlc3Npb24gPSB0b2dnbGUucmVwbGFjZSgvW1xcXFxeJC58PyorKClbe10vZywgXCJcXFxcJCZcIik7XG5cdFx0Ly8gRXNjYXBlIGFueSByZWd1bGFyIGV4cHJlc3Npb24gc3BlY2lhbCBjaGFyYWN0ZXJzIChtZXRhY2hhcmFjdGVycykgd2l0aGluIHRoZSB0b2dnbGUgc3RyaW5nXG5cdFx0cmVndWxhckV4cHJlc3Npb24gPSBcIihcXFxccyg/PVwiICsgcmVndWxhckV4cHJlc3Npb24gKyBcIiQpfChcXFxccyl8XikoXCIgKyByZWd1bGFyRXhwcmVzc2lvbiArIFwiKFxcXFxzfCQpKVwiO1xuXHRcdC8vIEV4YW1wbGU6IC8oXFxzKD89bXljbGFzcyQpfChcXHMpfF4pPyhteWNsYXNzKFxcc3wkKSkvIC0gc28gbWF0Y2hlcyAoXCIgbXljbGFzc1wiIG9yIFwiIFwiIG9yIF4gKSBmb2xsb3dlZCBieSAoXCJteWNsYXNzIFwiIG9yIFwibXljbGFzcyRcIikgd2hlcmUgXi8kIGFyZSBiZWdpbm5pbmcvZW5kIG9mIHN0cmluZ1xuXHRcdGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAocmVndWxhckV4cHJlc3Npb24pLCBcIiQyXCIpO1xuXHRcdHZhbCA9IGN1cnJlbnRWYWx1ZSArICh2YWwgPyAoY3VycmVudFZhbHVlICYmIFwiIFwiKSArIHRvZ2dsZSA6IFwiXCIpO1xuXHR9XG5cdHJldHVybiB2YWw7XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSnNWaWV3cy1zcGVjaWZpYyB0YWdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBrZWVwUGFyZW50RGF0YUN0eCh2YWwpIHtcblx0cmV0dXJuIHRoaXMudGFnQ3R4LnZpZXc7IC8vIFJldHVybiB0aGUgcGFyZW50IHZpZXcgYXMgZGF0YSBjb250ZXh0IGZvciByZW5kZXJpbmcgYmxvY2sgY29udGVudFxufVxuXG4kdGFncyh7XG5cdG9uOiB7XG5cdFx0YXR0cjogTk9ORSxcblx0XHRpbml0OiBmdW5jdGlvbih0YWdDdHgpIHtcblx0XHRcdHZhciBjb250ZW50LFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0YXJncyA9IHRhZ0N0eC5hcmdzLCAvLyBbZXZlbnRzLF0gW3NlbGVjdG9yLF0gaGFuZGxlclxuXHRcdFx0XHRsID0gYXJncy5sZW5ndGg7XG5cblx0XHRcdGZvciAoOyBpPGwgJiYgISRpc0Z1bmN0aW9uKGFyZ3NbaV0pOyBpKyspOyAvLyBIYW5kbGVyIGlzIGZpcnN0IGFyZyBvZiB0eXBlIGZ1bmN0aW9uXG5cdFx0XHR0YWcuX2hpID0gbD5pICYmIGkrMTsgLy8gaGFuZGxlciBpbmRleFxuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHRpZiAoISRzdWIuclRtcGwuZXhlYyhjb250ZW50ID0gdGFnQ3R4LnRtcGwubWFya3VwKSkge1xuXHRcdFx0XHRcdC8vIElubGluZSB7Xntvbn19IHRhZyB3aXRoIG5vIGNvbnRlbnQgKG9yIGV4dGVybmFsIHRlbXBsYXRlIGNvbnRlbnQpIG9yIHdpdGggY29udGVudCBjb250YWluaW5nXG5cdFx0XHRcdFx0Ly8gbm8gSFRNTCBvciBKc1JlbmRlciB0YWdzOiBXZSB3aWxsIHdyYXAgdGhlICh0ZXh0KSBjb250ZW50LCBvciB0aGUgb3BlcmF0aW9uIG5hbWUgaW4gYSA8YnV0dG9uPiBlbGVtZW50XG5cdFx0XHRcdFx0Ly8gKE90aGVyd2lzZSB3ZSB3aWxsIGF0dGFjaCB0aGUgaGFuZGxlciB0byB0aGUgZWxlbWVudCBjb250ZW50IGFmdGVyIGRhdGEtbGlua2luZylcblx0XHRcdFx0XHR0YWcudGVtcGxhdGUgPSBcIjxidXR0b24+XCIgKyAoJC50cmltKGNvbnRlbnQpIHx8IHRhZ0N0eC5wYXJhbXMuYXJnc1tpXSB8fCBcIm5vb3BcIikgKyBcIjwvYnV0dG9uPlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZy5hdHRyID0gSFRNTDtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uQWZ0ZXJMaW5rOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHRcdHZhciBoYW5kbGVyLCBwYXJhbXMsIGZpbmQsIGFjdGl2ZUVsZW0sXG5cdFx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRcdGkgPSB0YWcuX2hpLFxuXHRcdFx0XHRhcmdzID0gdGFnQ3R4LmFyZ3MsIC8vIFtldmVudHMsXSBbc2VsZWN0b3IsXSBoYW5kbGVyXG5cdFx0XHRcdGwgPSBhcmdzLmxlbmd0aCxcblx0XHRcdFx0cHJvcHMgPSB0YWdDdHgucHJvcHMsXG5cdFx0XHRcdGRhdGEgPSBwcm9wcy5kYXRhLFxuXHRcdFx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0XHRcdGNvbnRleHRPYiA9IHByb3BzLmNvbnRleHQ7IC8vIENvbnRleHQgKCd0aGlzJyBwb2ludGVyKSBmb3IgYXR0YWNoZWQgaGFuZGxlclxuXG5cdFx0XHRpZiAoaSkgeyAvLyBUaGVyZSBpcyBhIGhhbmRsZXJcblx0XHRcdFx0aGFuZGxlciA9IGFyZ3NbaS0xXTtcblx0XHRcdFx0cGFyYW1zID0gYXJncy5zbGljZShpKTsgLy8gU3Vic2VxdWVudCBhcmdzIGFyZSBwYXJhbXNcblx0XHRcdFx0YXJncyA9IGFyZ3Muc2xpY2UoMCwgaS0xKTsgLy8gUHJlY2VkaW5nIGFyZ3MgKGlmIGFueSkgYXJlIGV2ZW50cyBhbmQgc2VsZWN0b3Jcblx0XHRcdFx0dGFnLl9zZWwgPSBhcmdzWzFdOyAvLyBTZWxlY3RvciBmb3IgZGVzY2VuZGFudCBlbGVtZW50cyAtIGZvciBkZWxlZ2F0ZWQgZXZlbnRzIG9uIHRob3NlIGVsZW1lbnRzLCBkZWxlZ2F0aW5nIHRvIHRoZSBhY3RpdmVFbGVtXG5cblx0XHRcdFx0YWN0aXZlRWxlbSA9IHRhZy5hY3RpdmVFbGVtID0gdGFnLmFjdGl2ZUVsZW0gfHwgJCh0YWcuXy5pbmxpbmVcblx0XHRcdFx0XHQ/ICh0YWcuX3NlbCA9IGFyZ3NbMV0gfHwgXCIqXCIsIHRhZy5wYXJlbnRFbGVtKVxuXHRcdFx0XHRcdC8vIElmIGlubGluZSwgYXR0YWNoIHRvIGNoaWxkIGVsZW1lbnRzIG9mIHRhZyBwYXJlbnQgZWxlbWVudCAoZmlsdGVyZWQgYnkgc2VsZWN0b3IgYXJndW1lbnQgaWYgcHJvdmlkZWQuXG5cdFx0XHRcdFx0Ly8gKEluIGhhbmRsZXIgd2UnbGwgZmlsdGVyIG91dCBldmVudHMgZnJvbSBzaWJsaW5nIGVsZW1lbnRzIHByZWNlZGluZyBvciBmb2xsb3dpbmcgdGFnLilcblx0XHRcdFx0XHQvLyBUaGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIGRlbGVnYXRlZCBwYXR0ZXJuIHdoZXJlIHRoZSBhdHRhY2hlZCBldmVudCB3b3JrcyBldmVuIGZvciBhZGRlZCBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZSBzZWxlY3RvclxuXHRcdFx0XHRcdDogbGlua0N0eC5lbGVtKTtcblxuXHRcdFx0XHRpZiAoIWNvbnRleHRPYikge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgcGF0aCBmb3IgdGhlIHByZWNlZGluZyBvYmplY3QgKGNvbnRleHQgb2JqZWN0KSBvZiBoYW5kbGVyICh3aGljaCBpcyB0aGUgbGFzdCBhcmcpLCBjb21waWxlIGZ1bmN0aW9uXG5cdFx0XHRcdFx0Ly8gdG8gcmV0dXJuIHRoYXQgY29udGV4dCBvYmplY3QsIGFuZCBydW4gY29tcGlsZWQgZnVuY3Rpb24gYWdhaW5zdCBkYXRhXG5cdFx0XHRcdFx0Y29udGV4dE9iID0gL14oLiopW1xcLl5dW1xcdyRdKyQvLmV4ZWModGFnQ3R4LnBhcmFtcy5hcmdzLnNsaWNlKC1wYXJhbXMubGVuZ3RoIC0gMSlbMF0pO1xuXHRcdFx0XHRcdGNvbnRleHRPYiA9IGNvbnRleHRPYiAmJiAkc3ViLnRtcGxGbihkZWxpbU9wZW5DaGFyMSArIFwiOlwiICsgY29udGV4dE9iWzFdICsgZGVsaW1DbG9zZUNoYXIwLCB2aWV3LnRtcGwsIHRydWUpKGxpbmtDdHguZGF0YSwgdmlldyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGFnLl9ldnMpIHtcblx0XHRcdFx0XHR0YWcub25VbmJpbmQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjdGl2ZUVsZW0ub24oXG5cdFx0XHRcdFx0dGFnLl9ldnMgPSBhcmdzWzBdIHx8IFwiY2xpY2tcIiwgLy8gZXZlbnRzIGRlZmF1bHRzIHRvIFwiY2xpY2tcIlxuXHRcdFx0XHRcdHRhZy5fc2VsLFxuXHRcdFx0XHRcdGRhdGEgPT0gdW5kZWZpbmVkID8gbnVsbCA6IGRhdGEsXG5cdFx0XHRcdFx0dGFnLl9obHIgPSBmdW5jdGlvbiBobmRscihldikge1xuXHRcdFx0XHRcdFx0dmFyIG5vZGVzLCBsZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGZvdW5kID0gIXRhZy5fLmlubGluZTtcblxuXHRcdFx0XHRcdFx0aWYgKCFmb3VuZCkgeyAvLyBJZiBpbmxpbmUsIGZpbHRlciBvdXQgZXZlbnRzIGZyb20gc2libGluZyBlbGVtZW50cyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRhZy5cblx0XHRcdFx0XHRcdFx0bm9kZXMgPSB0YWcuY29udGVudHMoXCIqXCIpO1xuXHRcdFx0XHRcdFx0XHRsID0gbm9kZXMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIWZvdW5kICYmIGwtLSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChub2Rlc1tsXS5jb250YWlucyhldi50YXJnZXQpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoZm91bmQpIHsgLy8gdGFyZ2V0IGVsZW0gaXMgaW5kZWVkIHdpdGhpbiB0aGUgdGFnLCBzbyBjYWxsIHRoZSB7b259IGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGhhbmRsZXIuYXBwbHkoY29udGV4dE9iIHx8IGxpbmtDdHguZGF0YSwgW10uY29uY2F0KFxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcywgLy8gZS5nLiBwYXIxLCBwYXIyXG5cdFx0XHRcdFx0XHRcdFx0ZXYsXG5cdFx0XHRcdFx0XHRcdFx0e2NoYW5nZTogZXYudHlwZSwgdmlldzogdmlldywgbGlua0N0eDogbGlua0N0eH0sXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW1zLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSAvLyBJZiB0cmlnZ2VyaW5nIGV2ZW50IChlLmcuIGpzdi1kb21jaGFuZ2UpIGhhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlciBldiwgcGFzcyB0aGVtIHRvb1xuXHRcdFx0XHRcdFx0XHQpKTtcblx0XHRcdFx0XHRcdFx0Ly8gZm9yIHtvbiAnY2xpY2snIGhhbmRsZXIgcGFyMSBwYXIyfSB1c2UgaGFuZGxlcihwYXIxLCBwYXIyLCBldiwgZG9tY2hhbmdlRXZlbnRBcmdzKVxuXHRcdFx0XHRcdFx0XHQvLyBmb3Ige29uICdqc3YtZG9tY2hhbmdlJyBoYW5kbGVyIHBhcjEgcGFyMn0gdXNlIGhhbmRsZXIocGFyMSwgcGFyMiwgZXYsIGRvbWNoYW5nZUV2ZW50QXJncywgdGFnQ3R4LCBsaW5rQ3R4LCBvYnNlcnZhYmxlRXZlbnRBcmdzKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdG9uVW5iaW5kOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRcdGlmIChzZWxmLmFjdGl2ZUVsZW0pIHtcblx0XHRcdFx0c2VsZi5hY3RpdmVFbGVtLm9mZihzZWxmLl9ldnMsIHNlbGYuX3NlbCwgc2VsZi5faGxyKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGZsb3c6IHRydWUsXG5cdFx0Y29udGVudEN0eDoga2VlcFBhcmVudERhdGFDdHgsXG5cdFx0ZGF0YUJvdW5kT25seTogdHJ1ZVxuXHR9LFxuXHRyYWRpb2dyb3VwOiB7XG5cdFx0aW5pdDogZnVuY3Rpb24odGFnQ3R4KSB7XG5cdFx0XHR0aGlzLm5hbWUgPSB0YWdDdHgucHJvcHMubmFtZSB8fCAoXCJqc3ZcIiArIE1hdGgucmFuZG9tKCkpO1xuXHRcdH0sXG5cdFx0b25CaW5kOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHRcdHZhciBkb21DaG5nQ250bnIsXG5cdFx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRcdCRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW0gPSAodGFnLl8uaW5saW5lID8gdGFnLmNvbnRlbnRzKHRydWUsIFwiaW5wdXRbdHlwZT1yYWRpb11cIikgOiAkKGxpbmtDdHguZWxlbSkuZmluZChcImlucHV0W3R5cGU9cmFkaW9dXCIpKSxcblx0XHRcdFx0bCA9ICRsaW5rZWRFbGVtLmxlbmd0aDtcblxuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHQvLyBJZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBvd25lZCBieSAocmVuZGVyZWQgYnkpIHRoaXMgdGFnIChub3QgYnkgYSBjaGlsZFRhZyBzdWNoIGFzIHtee2Zvcn19KVxuXHRcdFx0XHQvLyB1c2UgaXQgYXMgY29udGFpbmVyIGZvciBkZXRlY3RpbmcgZG9tIGNoYW5nZXNcblx0XHRcdFx0ZG9tQ2huZ0NudG5yID0gdGFnLmNvbnRlbnRzKFwiKlwiKVswXTtcblx0XHRcdFx0ZG9tQ2huZ0NudG5yID0gZG9tQ2huZ0NudG5yICYmICQudmlldyhkb21DaG5nQ250bnIpLmN0eC50YWcgPT09IHRhZy5wYXJlbnQgPyBkb21DaG5nQ250bnIgOiB0YWcucGFyZW50RWxlbTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IGxpbmtDdHguZWxlbTtcblx0XHRcdH1cblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0Ly8gQ29uZmlndXJlIHRoZSBuYW1lIGZvciBlYWNoIHJhZGlvIGlucHV0IGVsZW1lbnRcblx0XHRcdFx0JGxpbmtlZEVsZW1bbF0ubmFtZSA9ICRsaW5rZWRFbGVtW2xdLm5hbWUgfHwgdGFnLm5hbWU7XG5cdFx0XHR9XG5cdFx0XHQvLyBFc3RhYmxpc2ggYSBkb21jaGFuZ2UgbGlzdGVuZXIgaW4gY2FzZSB0aGlzIHJhZGlvZ3JvdXAgd3JhcHMgYSB7Xntmb3J9fSBvciB7XntpZn19IG9yIHNpbWlsYXIgd2hpY2ggbWlnaHQgZHluYW1pY2FsbHkgaW5zZXJ0IG5ldyByYWRpbyBpbnB1dCBlbGVtZW50c1xuXHRcdFx0JChkb21DaG5nQ250bnIpLm9uKFwianN2LWRvbWNoYW5nZVwiLCBmdW5jdGlvbihldiwgZm9yT3JJZlRhZ0N0eCkge1xuXHRcdFx0XHR2YXIgbGlua2VkRWxlbSxcblx0XHRcdFx0XHRwYXJlbnRUYWdzID0gZm9yT3JJZlRhZ0N0eC5jdHgucGFyZW50VGFncztcblx0XHRcdFx0aWYgKCF0YWcuXy5pbmxpbmUgfHwgZG9tQ2huZ0NudG5yICE9PSB0YWcucGFyZW50RWxlbSAvLyBUaGUgZG9tQ2huZ0NudG5yIGlzIHNwZWNpZmljIHRvIHRoaXMgdGFnXG5cdFx0XHRcdFx0Ly8gVGhlIGRvbUNobmdDbnRuciBpcyB0aGUgcGFyZW50RWxlbSBvZiB0aGlzIHRhZywgc28gbmVlZCB0byBtYWtlIHN1cmUgZG9tIGNoYW5nZSBldmVudCBpcyBmb3Jcblx0XHRcdFx0XHQvLyBhIGNvbnRlbnQgY2hhbmdlIHdpdGhpbiB0aGlzIHRhZywgbm90IG91dHNpZGUgaXQuXG5cdFx0XHRcdFx0fHwgcGFyZW50VGFncyAmJiBwYXJlbnRUYWdzW3RhZy50YWdOYW1lXSA9PT0gdGFnKSB7XG5cdFx0XHRcdFx0Ly8gQ29udGVudHMgaGF2ZSBjaGFuZ2VkIHNvIHJlY3JlYXRlICRsaW5rZWRFbGVtIGZvciB0aGUgcmFkaW8gaW5wdXQgZWxlbWVudHMgKGluY2x1ZGluZyBwb3NzaWJsZSBuZXcgb25lIGp1c3QgaW5zZXJ0ZWQpXG5cdFx0XHRcdFx0JGxpbmtlZEVsZW0gPSB0YWcubGlua2VkRWxlbSA9IHRhZy5jb250ZW50cyh0cnVlLCBcImlucHV0W3R5cGU9cmFkaW9dXCIpO1xuXHRcdFx0XHRcdGwgPSAkbGlua2VkRWxlbS5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdFx0Ly8gQ29uZmlndXJlIGJpbmRpbmcgIGFuZCBuYW1lIGZvciBlYWNoIHJhZGlvIGlucHV0IGVsZW1lbnRcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0gPSAkbGlua2VkRWxlbVtsXTtcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0uX2pzdkxrRWwgPSB0YWc7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLm5hbWUgPSBsaW5rZWRFbGVtLm5hbWUgfHwgdGFnLm5hbWU7XG5cdFx0XHRcdFx0XHRiaW5kVG8oYmluZGluZ1N0b3JlW3RhZy5fdGdJZF0sIHRhZywgbGlua2VkRWxlbSk7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZCbmQgPSBcIiZcIiArIHRhZy5fdGdJZCArIFwiK1wiO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5jaGVja2VkID0gdGFnLmN2dEFyZ3MoKVswXSA9PT0gbGlua2VkRWxlbS52YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0b25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIHRhZ0N0eHMpIHtcblx0XHRcdHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgcmVyZW5kZXJcblx0XHR9LFxuXHRcdGNvbnRlbnRDdHg6IGtlZXBQYXJlbnREYXRhQ3R4LFxuXHRcdGRhdGFCb3VuZE9ubHk6IHRydWVcblx0fVxufSk7XG5cbiRleHRlbmQoJHRhZ3NbXCJmb3JcIl0sIHtcblx0Ly9vblVwZGF0ZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgbmV3VGFnQ3R4cykge1xuXHRcdC8vQ29uc2lkZXIgYWRkaW5nIGZpbHRlcmluZyBmb3IgcGVyZiBvcHRpbWl6YXRpb24uIEhvd2V2ZXIgdGhlIGJlbG93IHByZXZlbnRzIHVwZGF0ZSBvbiBzb21lIHNjZW5hcmlvcyB3aGljaCBfc2hvdWxkXyB1cGRhdGUgLSBuYW1lbHkgd2hlbiB0aGVyZSBpcyBhbm90aGVyIGFycmF5IG9uIHdoaWNoIGZvciBhbHNvIGRlcGVuZHMuXG5cdFx0Ly92YXIgaSwgbCwgdGNpLCBwcmV2QXJnO1xuXHRcdC8vZm9yICh0Y2kgPSAwOyAocHJldkFyZyA9IHRoaXMudGFnQ3R4c1t0Y2ldKSAmJiBwcmV2QXJnLmFyZ3MubGVuZ3RoOyB0Y2krKykge1xuXHRcdC8vXHRpZiAocHJldkFyZy5hcmdzWzBdICE9PSBuZXdUYWdDdHhzW3RjaV0uYXJnc1swXSkge1xuXHRcdC8vXHRcdHJldHVybiB0cnVlO1xuXHRcdC8vXHR9XG5cdFx0Ly99XG5cdFx0Ly9yZXR1cm4gZmFsc2U7XG5cdC8vfSxcblx0b25BcnJheUNoYW5nZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgdGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0dmFyIGFycmF5Vmlldyxcblx0XHRcdHRhcmdldCA9IGV2LnRhcmdldCxcblx0XHRcdHRhcmdldExlbmd0aCA9IHRhcmdldC5sZW5ndGgsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0Y2hhbmdlID0gZXZlbnRBcmdzLmNoYW5nZTtcblx0XHRpZiAodGFnLl8ubm9Wd3MgLy8gQ2hpbGQgdmlld3Mgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHRhcmdldCBpcyBub3QgaHRtbCAtIGUuZy4gZGF0YS1saW5rPVwidGl0bGV7Zm9yIC4uLn1cIlxuXHRcdFx0fHwgdGFnLnRhZ0N0eHNbMV0gJiYgKCAvLyBUaGVyZSBpcyBhbiB7e2Vsc2V9fVxuXHRcdFx0XHRjaGFuZ2UgPT09IFwiaW5zZXJ0XCIgJiYgdGFyZ2V0TGVuZ3RoID09PSBldmVudEFyZ3MuaXRlbXMubGVuZ3RoIC8vIGluc2VydGluZywgYW5kIG5ldyBsZW5ndGggaXMgc2FtZSBhcyBpbnNlcnRlZCBsZW5ndGgsIHNvIGdvaW5nIGZyb20gMCB0byBuXG5cdFx0XHRcdHx8IGNoYW5nZSA9PT0gXCJyZW1vdmVcIiAmJiAhdGFyZ2V0TGVuZ3RoIC8vIHJlbW92aW5nICwgYW5kIG5ldyBsZW5ndGggMCwgc28gZ29pbmcgZnJvbSBuIHRvIDBcblx0XHRcdCkpIHtcblx0XHRcdHRhZy5yZWZyZXNoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoYXJyYXlWaWV3IGluIHRhZy5fLmFyclZ3cykge1xuXHRcdFx0XHRhcnJheVZpZXcgPSB0YWcuXy5hcnJWd3NbYXJyYXlWaWV3XTtcblx0XHRcdFx0aWYgKGFycmF5Vmlldy5kYXRhID09PSB0YXJnZXQpIHtcblx0XHRcdFx0XHRhcnJheVZpZXcuXy5vbkFycmF5Q2hhbmdlLmFwcGx5KGFycmF5VmlldywgYXJndW1lbnRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0YWcuZG9tQ2hhbmdlKHRhZ0N0eCwgbGlua0N0eCwgZXZlbnRBcmdzKTtcblx0XHRldi5kb25lID0gdHJ1ZTtcblx0fSxcblx0b25BZnRlckxpbms6IGZ1bmN0aW9uKHRhZ0N0eCwgbGlua0N0eCkge1xuXHRcdHZhciBpLCBhcnJIYW5kbGVyLCBhcnJCaW5kaW5nLCBkYXRhLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGFycmF5QmluZGluZ3MgPSB0YWcuX2FycyB8fCB7fSxcblx0XHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cyxcblx0XHRcdGwgPSB0YWdDdHhzLmxlbmd0aCxcblx0XHRcdHNlbGVjdGVkID0gdGFnLnNlbGVjdGVkIHx8IDA7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDw9IHNlbGVjdGVkOyBpKyspIHtcblx0XHRcdHRhZ0N0eCA9IHRhZ0N0eHNbaV07ICAgICAgICAvLyBsb29wIHRocm91Z2ggdGFnQ3R4cyB1cCB0byBzZWxlY3RlZFxuXHRcdFx0ZGF0YSA9IHRhZ0N0eC5tYXBcblx0XHRcdFx0PyB0YWdDdHgubWFwLnRndCAgICAgICAgLy8gJ2RhdGEnIGlzIG1hcHBlZCBkYXRhXG5cdFx0XHRcdDogdGFnQ3R4LmFyZ3MubGVuZ3RoXG5cdFx0XHRcdFx0PyB0YWdDdHguYXJnc1swXSAgICAvLyBvciBhcmdzWzBdXG5cdFx0XHRcdFx0OiB0YWdDdHgudmlldy5kYXRhOyAvLyBvciBkZWZhdWx0cyB0byBjdXJyZW50IGRhdGEuXG5cblx0XHRcdGlmICgoYXJyQmluZGluZyA9IGFycmF5QmluZGluZ3NbaV0pICYmIGRhdGEgIT09IGFyckJpbmRpbmdbMF0pIHsgLy8gSXMgdGhlcmUgcHJldmlvdXMgYXJyYXkgZGF0YSBvbiB0aGlzIHRhZ0N0eCwgZGlmZmVyZW50IGZyb20gbmV3IGRhdGFcblx0XHRcdFx0JG9ic2VydmUoYXJyQmluZGluZ1swXSwgYXJyQmluZGluZ1sxXSwgdHJ1ZSk7IC8vdW5vYnNlcnZlIHByZXZpb3VzIGFycmF5XG5cdFx0XHRcdGRlbGV0ZSBhcnJheUJpbmRpbmdzW2ldO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFhcnJheUJpbmRpbmdzW2ldICYmICRpc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRcdCRvYnNlcnZlKGRhdGEsIGFyckhhbmRsZXIgPSBmdW5jdGlvbihldiwgZXZlbnRBcmdzKSB7XG5cdFx0XHRcdFx0dmFyIHRhZ0N0ID0gdGFnQ3R4O1xuXHRcdFx0XHRcdHRhZy5vbkFycmF5Q2hhbmdlKGV2LCBldmVudEFyZ3MsIHRhZ0N0LCBsaW5rQ3R4KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFycmF5QmluZGluZ3NbaV0gPSBbZGF0YSwgYXJySGFuZGxlcl07IC8vIFN0b3JlIGFycmF5IGRhdGEgYW5kIGFycmF5Q2hhbmdlSGFuZGxlciBvbiB0YWcuX2Fyc1tpXVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGkgPSBzZWxlY3RlZCArIDE7IGkgPCBsOyBpKyspIHsgLy8gSWYgdGhlcmUgd2VyZSBwcmV2aW91cyBiaW5kaW5ncyBvbiBsYXRlciB0YWdDdHhzLCByZW1vdmUgdGhlbVxuXHRcdFx0aWYgKGFyckJpbmRpbmcgPSBhcnJheUJpbmRpbmdzW2ldKSB7XG5cdFx0XHRcdCRvYnNlcnZlKGFyckJpbmRpbmdbMF0sIGFyckJpbmRpbmdbMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZSBwcmV2aW91cyBiaW5kaW5nXG5cdFx0XHRcdGRlbGV0ZSBhcnJheUJpbmRpbmdzW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0YWcuX2FycyA9IGFycmF5QmluZGluZ3M7XG5cdH0sXG5cdG9uRGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGwsIHRhZyA9IHRoaXM7XG5cdFx0Zm9yIChsIGluIHRhZy5fYXJzKSB7XG5cdFx0XHQkb2JzZXJ2ZSh0YWcuX2Fyc1tsXVswXSwgdGFnLl9hcnNbbF1bMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZVxuXHRcdH1cblx0fVxufSk7XG5cbiRleHRlbmQoJHRhZ3NbXCJpZlwiXSwge1xuXHRvblVwZGF0ZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgbmV3VGFnQ3R4cykge1xuXHRcdHZhciB0Y2ksIHByZXZBcmcsIGRpZmZlcmVudDtcblx0XHRmb3IgKHRjaSA9IDA7IChwcmV2QXJnID0gdGhpcy50YWdDdHhzW3RjaV0pOyB0Y2krKykge1xuXHRcdFx0ZGlmZmVyZW50ID0gcHJldkFyZy5wcm9wcy50bXBsICE9PSBuZXdUYWdDdHhzW3RjaV0ucHJvcHMudG1wbCB8fCBwcmV2QXJnLmFyZ3MubGVuZ3RoICYmICEocHJldkFyZyA9IHByZXZBcmcuYXJnc1swXSkgIT09ICFuZXdUYWdDdHhzW3RjaV0uYXJnc1swXTtcblx0XHRcdGlmICgoIXRoaXMuY29udmVydCAmJiAhIXByZXZBcmcpIHx8IGRpZmZlcmVudCkge1xuXHRcdFx0XHRyZXR1cm4gZGlmZmVyZW50O1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBub3QgYSBjaGFuZ2Ugb2YgdGVtcGxhdGUsIGFuZCB0aGVyZSBpcyBubyBjb252ZXJ0ZXIsIGFuZCBuZXdBcmcgYW5kIHByZXZBcmcgYXJlIGJvdGggdHJ1dGh5LCByZXR1cm4gZmFsc2UgdG8gY2FuY2VsIHVwZGF0ZS5cblx0XHRcdFx0Ly8gKEV2ZW4gaWYgdmFsdWVzIG9uIGxhdGVyIGVsc2VzIGFyZSBkaWZmZXJlbnQsIHdlIHN0aWxsIGRvbid0IHdhbnQgdG8gdXBkYXRlLCBzaW5jZSByZW5kZXJlZCBvdXRwdXQgd291bGQgYmUgdW5jaGFuZ2VkKVxuXHRcdFx0XHQvLyBJZiBuZXdBcmcgYW5kIHByZXZBcmcgYXJlIGRpZmZlcmVudCwgcmV0dXJuIHRydWUsIHRvIHVwZGF0ZVxuXHRcdFx0XHQvLyBJZiBuZXdBcmcgYW5kIHByZXZBcmcgYXJlIGJvdGggZmFsc2V5LCBtb3ZlIHRvIHRoZSBuZXh0IHt7ZWxzZSAuLi59fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBCb29sZWFuIHZhbHVlIG9mIGFsbCBhcmdzIGFyZSB1bmNoYW5nZWQgKGZhbHNleSksIHNvIHJldHVybiBmYWxzZSB0byBjYW5jZWwgdXBkYXRlXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHRvbkFmdGVyTGluazogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4LCBjdHgsIGV2LCBldmVudEFyZ3MpIHtcblx0XHRpZiAoZXZlbnRBcmdzKSB7XG5cdFx0XHR0aGlzLmRvbUNoYW5nZSh0YWdDdHgsIGxpbmtDdHgsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG59KTtcblxuZnVuY3Rpb24gb2JzZXJ2ZVByb3BzKG1hcCwgZXYsIGV2ZW50QXJncykge1xuXHRpZiAoZXZlbnRBcmdzLmNoYW5nZSA9PT0gXCJzZXRcIikge1xuXHRcdHZhciB0YXJnZXQgPSBtYXAudGd0LFxuXHRcdFx0bCA9IHRhcmdldC5sZW5ndGg7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0aWYgKHRhcmdldFtsXS5rZXkgPT09IGV2ZW50QXJncy5wYXRoKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobCA9PT0gLTEpIHtcblx0XHRcdGlmIChldmVudEFyZ3MucGF0aCAmJiAhZXZlbnRBcmdzLnJlbW92ZSkge1xuXHRcdFx0XHQkb2JzZXJ2YWJsZSh0YXJnZXQpLmluc2VydCh7a2V5OiBldmVudEFyZ3MucGF0aCwgcHJvcDogZXZlbnRBcmdzLnZhbHVlfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChldmVudEFyZ3MucmVtb3ZlKSB7XG5cdFx0XHQkb2JzZXJ2YWJsZSh0YXJnZXQpLnJlbW92ZShsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JG9ic2VydmFibGUodGFyZ2V0W2xdKS5zZXRQcm9wZXJ0eShcInByb3BcIiwgZXZlbnRBcmdzLnZhbHVlKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gb2JzZXJ2ZU1hcHBlZFByb3BzKG1hcCwgZXYsIGV2ZW50QXJncykge1xuXHR2YXIgaXRlbSxcblx0XHRzb3VyY2UgPSBtYXAuc3JjLFxuXHRcdGNoYW5nZSA9IGV2ZW50QXJncy5jaGFuZ2U7XG5cblx0aWYgKGNoYW5nZSA9PT0gXCJzZXRcIikge1xuXHRcdGlmIChldmVudEFyZ3MucGF0aCA9PT0gXCJwcm9wXCIpIHtcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoZXYudGFyZ2V0LmtleSwgZXZlbnRBcmdzLnZhbHVlKTtcblx0XHR9IGVsc2UgeyAvLyBwYXRoID09PSBcImtleVwiXG5cdFx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnJlbW92ZVByb3BlcnR5KGV2ZW50QXJncy5vbGRWYWx1ZSk7IC8vIFdoZW4ga2V5IGlzIG1vZGlmaWVkIG9ic2VydmFibHksIHJlbW92ZSBvbGQgb25lIGFuZCBzZXQgbmV3IG9uZVxuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5zZXRQcm9wZXJ0eShldmVudEFyZ3MudmFsdWUsIGV2LnRhcmdldC5wcm9wKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoY2hhbmdlID09PSBcInJlbW92ZVwiKSB7XG5cdFx0aXRlbSA9IGV2ZW50QXJncy5pdGVtc1swXTtcblx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnJlbW92ZVByb3BlcnR5KGl0ZW0ua2V5KTtcblx0XHRkZWxldGUgc291cmNlW2l0ZW0ua2V5XTtcblx0fSBlbHNlIGlmIChjaGFuZ2UgPT09IFwiaW5zZXJ0XCIpIHtcblx0XHRpdGVtID0gZXZlbnRBcmdzLml0ZW1zWzBdO1xuXHRcdGlmIChpdGVtLmtleSkge1xuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5zZXRQcm9wZXJ0eShpdGVtLmtleSwgaXRlbS5wcm9wKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gc2hhbGxvd0FycmF5RmlsdGVyKGFsbFBhdGggLyosIG9iamVjdCwgcGFyZW50T2JzKi8pIHsgLy8gRmlsdGVyIHVzZWQgYnkge3twcm9wc319IGZvciB0aGUgbWFwcGVkUHJvcHMgdGFyZ2V0IGFycmF5XG5cdHJldHVybiBhbGxQYXRoLmluZGV4T2YoXCIuXCIpIDwgMDtcbn1cblxuJHRhZ3MoXCJwcm9wc1wiLCB7XG5cdGJhc2VUYWc6IFwiZm9yXCIsXG5cdGRhdGFNYXA6ICR2aWV3cy5tYXAoe1xuXHRcdGdldFRndDogJHRhZ3MucHJvcHMuZGF0YU1hcC5nZXRUZ3QsXG5cdFx0b2JzU3JjOiBvYnNlcnZlUHJvcHMsXG5cdFx0b2JzVGd0OiBvYnNlcnZlTWFwcGVkUHJvcHMsXG5cdFx0dGd0Rmx0OiBzaGFsbG93QXJyYXlGaWx0ZXJcblx0fSksXG5cdGZsb3c6IHRydWVcbn0pO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIGpRdWVyeSBuYW1lc3BhY2Vcbi8vPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRleHRlbmQoJCwge1xuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8galF1ZXJ5ICQudmlldygpIHBsdWdpblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09XG5cblx0dmlldzogJHZpZXcgPSBmdW5jdGlvbihub2RlLCBpbm5lciwgdHlwZSkge1xuXHRcdC8vICQudmlldygpIHJldHVybnMgdG9wIHZpZXdcblx0XHQvLyAkLnZpZXcobm9kZSkgcmV0dXJucyB2aWV3IHRoYXQgY29udGFpbnMgbm9kZVxuXHRcdC8vICQudmlldyhzZWxlY3RvcikgcmV0dXJucyB2aWV3IHRoYXQgY29udGFpbnMgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudFxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgdHlwZSkgcmV0dXJucyBuZWFyZXN0IGNvbnRhaW5pbmcgdmlldyBvZiBnaXZlbiB0eXBlXG5cdFx0Ly8gJC52aWV3KG5vZGVPclNlbGVjdG9yLCBcInJvb3RcIikgcmV0dXJucyByb290IGNvbnRhaW5pbmcgdmlldyAoY2hpbGQgb2YgdG9wIHZpZXcpXG5cdFx0Ly8gJC52aWV3KG5vZGVPclNlbGVjdG9yLCB0cnVlLCB0eXBlKSByZXR1cm5zIG5lYXJlc3QgaW5uZXIgKGNvbnRhaW5lZCkgdmlldyBvZiBnaXZlbiB0eXBlXG5cblx0XHRmdW5jdGlvbiBnZXRJbm5lclZpZXcobmQsIGlzVmwpIHtcblx0XHRcdGlmIChuZCkge1xuXHRcdFx0XHR2d0luZm9zID0gdmlld0luZm9zKG5kLCBpc1ZsLCByT3BlblZpZXdNYXJrZXJzKTtcblx0XHRcdFx0Zm9yIChqID0gMCwgayA9IHZ3SW5mb3MubGVuZ3RoOyBqIDwgazsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKCh2aWV3ID0gdmlld1N0b3JlW3Z3SW5mb3Nbal0uaWRdKSAmJiAodmlldyA9IHZpZXcgJiYgdHlwZSA/IHZpZXcuZ2V0KHRydWUsIHR5cGUpIDogdmlldykpIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpbm5lciAhPT0gISFpbm5lcikge1xuXHRcdFx0Ly8gaW5uZXIgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgdmlldyhub2RlT3JTZWxlY3RvciwgdHlwZSlcblx0XHRcdHR5cGUgPSBpbm5lcjtcblx0XHRcdGlubmVyID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR2YXIgdmlldywgdndJbmZvcywgaSwgaiwgaywgbCwgZWxlbXMsXG5cdFx0XHRsZXZlbCA9IDAsXG5cdFx0XHRib2R5ID0gZG9jdW1lbnQuYm9keTtcblxuXHRcdGlmIChub2RlICYmIG5vZGUgIT09IGJvZHkgJiYgdG9wVmlldy5fLnVzZUtleSA+IDEpIHtcblx0XHRcdC8vIFBlcmYgb3B0aW1pemF0aW9uIGZvciBjb21tb24gY2FzZXNcblxuXHRcdFx0bm9kZSA9IFwiXCIgKyBub2RlID09PSBub2RlXG5cdFx0XHRcdD8gJChub2RlKVswXVxuXHRcdFx0XHQ6IG5vZGUuanF1ZXJ5XG5cdFx0XHRcdFx0PyBub2RlWzBdXG5cdFx0XHRcdFx0OiBub2RlO1xuXG5cdFx0XHRpZiAobm9kZSkge1xuXHRcdFx0XHRpZiAoaW5uZXIpIHtcblx0XHRcdFx0XHRnZXRJbm5lclZpZXcobm9kZS5fZGYsIHRydWUpO1xuXHRcdFx0XHRcdGlmICghdmlldykge1xuXHRcdFx0XHRcdFx0Ly8gVHJlYXQgc3VwcGxpZWQgbm9kZSBhcyBhIGNvbnRhaW5lciBlbGVtZW50IGFuZCByZXR1cm4gdGhlIGZpcnN0IHZpZXcgZW5jb3VudGVyZWQuXG5cdFx0XHRcdFx0XHRlbGVtcyA9IHFzYSA/IG5vZGUucXVlcnlTZWxlY3RvckFsbChiaW5kRWxzU2VsKSA6ICQoYmluZEVsc1NlbCwgbm9kZSkuZ2V0KCk7XG5cdFx0XHRcdFx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgIXZpZXcgJiYgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRnZXRJbm5lclZpZXcoZWxlbXNbaV0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmlldztcblx0XHRcdFx0fVxuXHRcdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRcdC8vIE1vdmUgYmFjayB0aHJvdWdoIHNpYmxpbmdzIGFuZCB1cCB0aHJvdWdoIHBhcmVudHMgdG8gZmluZCBwcmVjZWRpbmcgbm9kZSB3aGljaCBpcyBhIF9wcnYgKHByZXZOb2RlKVxuXHRcdFx0XHRcdC8vIHNjcmlwdCBtYXJrZXIgbm9kZSBmb3IgYSBub24tZWxlbWVudC1jb250ZW50IHZpZXcsIG9yIGEgX3BydiAoZmlyc3Qgbm9kZSkgZm9yIGFuIGVsQ250IHZpZXdcblx0XHRcdFx0XHRpZiAodndJbmZvcyA9IHZpZXdJbmZvcyhub2RlLCB1bmRlZmluZWQsIHJWaWV3TWFya2VycykpIHtcblx0XHRcdFx0XHRcdGwgPSB2d0luZm9zLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdFx0dmlldyA9IHZ3SW5mb3NbbF07XG5cdFx0XHRcdFx0XHRcdGlmICh2aWV3Lm9wZW4pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobGV2ZWwgPCAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2aWV3ID0gdmlld1N0b3JlW3ZpZXcuaWRdO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHZpZXcgJiYgdHlwZSA/IHZpZXcuZ2V0KHR5cGUpIDogdmlldyB8fCB0b3BWaWV3O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRsZXZlbC0tO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGxldmVsIHN0YXJ0cyBhdCB6ZXJvLiBJZiB3ZSBoaXQgYSB2aWV3LmNsb3NlLCB0aGVuIHdlIG1vdmUgbGV2ZWwgdG8gMSwgYW5kIHdlIGRvbid0IHJldHVybiBhIHZpZXcgdW50aWxcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBhcmUgYmFjayBhdCBsZXZlbCB6ZXJvIChvciBhIHBhcmVudCB2aWV3IHdpdGggbGV2ZWwgPCAwKVxuXHRcdFx0XHRcdFx0XHRcdGxldmVsKys7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nIHx8IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdG9wVmlldztcblx0fSxcblxuXHRsaW5rOiAkbGluayxcblx0dW5saW5rOiAkdW5saW5rLFxuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09XG5cdC8vIG92ZXJyaWRlICQuY2xlYW5EYXRhXG5cdC8vPT09PT09PT09PT09PT09PT09PT09XG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oZWxlbXMpIHtcblx0XHRpZiAoZWxlbXMubGVuZ3RoICYmIGlzQ2xlYW5DYWxsKSB7XG5cdFx0XHQvLyBSZW1vdmUgSnNWaWV3cyBiaW5kaW5ncy4gQWxzbywgcmVtb3ZlIGZyb20gdGhlIERPTSBhbnkgY29ycmVzcG9uZGluZyBzY3JpcHQgbWFya2VyIG5vZGVzXG5cdFx0XHRjbGVhbihlbGVtcyk7XG5cdFx0fVxuXHRcdG9sZENsZWFuRGF0YS5hcHBseSgkLCBhcmd1bWVudHMpO1xuXHR9XG59KTtcblxuLy8gUG9zc2libGUgZnV0dXJlIGFkZGl0aW9uIC0gZS5nLiBmb3IgY2tlZGl0b3IgdGFnIGNvbnRyb2xcbi8vJHZpZXdzLnV0aWxpdHkgPSB7XG4vL1x0dmFsaWRhdGU6IGZ1bmN0aW9uKGh0bWwpIHtcbi8vXHRcdHRyeSB7XG4vL1x0XHRcdHRvcFZpZXcubGluayh1bmRlZmluZWQsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBodG1sLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgMSk7XG4vL1x0XHR9XG4vL1x0XHRjYXRjaCAoZSkge1xuLy9cdFx0XHRyZXR1cm4gZS5tZXNzYWdlO1xuLy9cdFx0fVxuLy9cdH1cbi8vfTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgalF1ZXJ5IGluc3RhbmNlIHBsdWdpbnNcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kZXh0ZW5kKCQuZm4sIHtcblx0bGluazogZnVuY3Rpb24oZXhwciwgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRcdHJldHVybiAkbGluayhleHByLCB0aGlzLCBmcm9tLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50VmlldywgcHJldk5vZGUsIG5leHROb2RlKTtcblx0fSxcblx0dW5saW5rOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJHVubGluayh0aGlzKTtcblx0fSxcblx0dmlldzogZnVuY3Rpb24oaW5uZXIsIHR5cGUpIHtcblx0XHRyZXR1cm4gJHZpZXcodGhpc1swXSwgaW5uZXIsIHR5cGUpO1xuXHR9XG59KTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE92ZXJyaWRlIGpRdWVyeSBtZXRob2RzIHRoYXQgY2FsbCBvdXIgb3ZlcnJpZGRlbiBjbGVhbkRhdGEsIGZvciBkaXNwb3NhbCBldGMuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kLmVhY2goW0hUTUwsIFwicmVwbGFjZVdpdGhcIiwgXCJlbXB0eVwiLCBcInJlbW92ZVwiXSwgZnVuY3Rpb24oaSwgbmFtZSkge1xuXHR2YXIgb2xkRm4gPSAkLmZuW25hbWVdO1xuXHQkLmZuW25hbWVdID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJlc3VsdDtcblx0XHRpc0NsZWFuQ2FsbCA9IDE7IC8vIE1ha2Ugc3VyZSBjbGVhbkRhdGEgZG9lcyBkaXNwb3NhbCBvbmx5IHdoZW4gY29taW5nIGZyb20gdGhlc2UgY2FsbHMuXG5cdFx0dHJ5IHtcblx0XHRcdHJlc3VsdCA9IG9sZEZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0fVxuXHRcdGZpbmFsbHkge1xuXHRcdFx0aXNDbGVhbkNhbGwgPSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xufSk7XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgdG9wVmlld1xuLy89PT09PT09PT09PT09PT1cblxuYWRkTGlua01ldGhvZHMoJGV4dGVuZCh0b3BWaWV3ID0gJHN1Yi50b3BWaWV3LCB7dG1wbDoge2xpbmtzOiB7fX19KSk7XG5cbnZpZXdTdG9yZSA9IHswOiB0b3BWaWV3fTsgLy8gVG9wLWxldmVsIHZpZXdcbi8vPT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgJC52aWV3c1xuLy89PT09PT09PT09PT09PT1cblxuJHZpZXdzLmdldEN0eCA9IGZ1bmN0aW9uKHBhcmFtKSB7IC8vIFJldHVybiB2YWx1ZSBvZiBjdHguZm9vLCBpbmNsdWRpbmcgZm9yIGNvbXBpbGVkIGNvbnRleHR1YWwgcGFyYW1ldGVycywgfmZvbz1leHByXG5cdGlmIChwYXJhbSAmJiBwYXJhbS5fY3ApIHsgLy8gSWYgdGhpcyBoZWxwZXIgcmVzb3VyY2UgaXMgYSBjb250ZXh0dWFsIHBhcmFtZXRlciwgfmZvbz1leHByXG5cdFx0cGFyYW0gPSAgcGFyYW1bMV0ocGFyYW1bMF0uZGF0YSwgcGFyYW1bMF0sICRzdWIpO1xuXHR9XG5cdHJldHVybiBwYXJhbTtcbn07XG5cbi8vPT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kICQudmlld3Muc3ViXG4vLz09PT09PT09PT09PT09PT09PT1cblxuJHN1Yi5fY3AgPSBmdW5jdGlvbihwYXJhbVZhbCwgcGFyYW1zLCB2aWV3KSB7IC8vIEdldCBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMgKG9yIHByb3BlcnRpZXMpIH5mb289ZXhwci5cblx0aWYgKHZpZXcubGlua2VkKSB7IC8vIEluIEpzVmlld3MsIHJldHVybnMgW3ZpZXcsIGxpbmtGbl0gd2hlcmUgbGlua0ZuIGlzIGNvbXBpbGVkIGZ1bmN0aW9uIGZvciBleHByZXNzaW9uXG5cdFx0cGFyYW1zID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIHBhcmFtcyArIGRlbGltQ2xvc2VDaGFyMDtcblx0XHR2YXIgdG1wbCA9IHZpZXcudG1wbCxcblx0XHRcdGxpbmtzID0gdG9wVmlldy50bXBsLmxpbmtzLCAvLyBVc2UgdG9wVmlldyBsaW5rcywgYXMgZm9yIGNvbXBpbGVkIHRvcC1sZXZlbCBsaW5raW5nIGV4cHJlc3Npb25zLiBUbyBkbyAtIHNob3VsZCB0aGlzIGV2ZXIgZ2V0IGRpc3Bvc2VkP1xuXHRcdFx0bGlua0ZuID0gbGlua3NbcGFyYW1zXTtcblx0XHRpZiAoIWxpbmtGbikge1xuXHRcdFx0bGlua3NbcGFyYW1zXSA9IGxpbmtGbiA9ICRzdWIudG1wbEZuKHBhcmFtcywgdG1wbCwgdHJ1ZSk7XG5cdFx0fVxuXHRcdHBhcmFtVmFsID0gW3ZpZXcsIGxpbmtGbl07XG5cdFx0cGFyYW1WYWwuX2NwID0gdHJ1ZTsgLy8gRmxhZyB0aGF0IHRoaXMgaXMgYSBjb250ZXh0dWFsIHBhcmFtZXRlclxuXHR9XG5cdHJldHVybiBwYXJhbVZhbDsgLy8gSW4gSnNSZW5kZXIgcmV0dXJucyBldmFsdWF0ZWQgZXhwcmVzc2lvblxufTtcblxuJHN1Yi5fY2VvID0gZnVuY3Rpb24gY2xvbmVFeHByT2JqZWN0cyhvYnMpIHsgIC8vIENsb25lIGV4cHJPYnMgc28gdGhhdCBlYWNoIHJlZmVyZW5jZWQgY29udGV4dHVhbCBwYXJhbWV0ZXIgfmZvbyB1c2VzIGl0cyBvd24gZXhwck9iIGluc3RhbmNlc1xuXHR2YXIgb2IsXG5cdFx0Y2xvbmVzID0gb2JzLFxuXHRcdGwgPSBvYnMubGVuZ3RoO1xuXHRpZiAobCkge1xuXHRcdGNsb25lcyA9IFtdO1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdG9iID0gb2JzW2xdO1xuXHRcdFx0aWYgKG9iLl9qc3YpIHtcblx0XHRcdFx0b2IgPSAkZXh0ZW5kKHt9LCBvYik7ICAgICAgICAgICAgICAvLyBJZiBhbiBleHByT2IsIGNsb25lIGl0LiBJZiBhIHN0cmluZywga2VlcCBhcyBpc1xuXHRcdFx0XHRvYi5wcm0gPSBjbG9uZUV4cHJPYmplY3RzKG9iLnBybSk7IC8vIFJlY3Vyc2l2ZWx5IGNsb25lIGV4cHJPYnMgaW4gcGFyYW1ldGVycywgdG9vXG5cdFx0XHR9XG5cdFx0XHRjbG9uZXMudW5zaGlmdChvYik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBjbG9uZXM7XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCAkLnZpZXdzLnNldHRpbmdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT1cblxub2xkQWR2U2V0ID0gJHN1Yi5hZHZTZXQ7XG5cbiRzdWIuYWR2U2V0ID0gZnVuY3Rpb24oKSB7IC8vIHJlZnJlc2ggYWR2YW5jZWQgc2V0dGluZ3Ncblx0b2xkQWR2U2V0KCk7XG5cdGdsb2JhbC5fanN2ID0gJHN1YlNldHRpbmdzQWR2YW5jZWQuX2pzdlxuXHRcdD8gJGV4dGVuZChnbG9iYWwuX2pzdiB8fCB7fSwgeyAvLyBjcmVhdGUgZ2xvYmFsIF9qc3YsIGZvciBhY2Nlc3Npbmcgdmlld3MsIGV0Y1xuXHRcdFx0XHR2aWV3czogdmlld1N0b3JlLFxuXHRcdFx0XHRiaW5kaW5nczogYmluZGluZ1N0b3JlXG5cdFx0XHR9KVxuXHRcdDogdW5kZWZpbmVkOyAvLyBJbiBJRTggY2Fubm90IGRvIGRlbGV0ZSBnbG9iYWwuX2pzdlxuXHQkdmlld3NMaW5rQXR0ciA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLmxpbmtBdHRyO1xuXHRsaW5rVmlld3NTZWwgPSBiaW5kRWxzU2VsICsgXCIsW1wiICsgJHZpZXdzTGlua0F0dHIgKyBcIl1cIjtcblx0d3JhcE1hcCA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl93bTtcblx0d3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXHR3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xuXHR3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcbn07XG5cbiR2aWV3c1NldHRpbmdzLmFkdmFuY2VkKHtcblx0bGlua0F0dHI6IFwiZGF0YS1saW5rXCIsXG5cdHVzZVZpZXdzOiBmYWxzZSxcblx0bm9WYWxpZGF0ZTogZmFsc2UsXG5cdC8vIHdyYXBNYXAgcHJvdmlkZSBhcHByb3ByaWF0ZSB3cmFwcGVycyBmb3IgaW5zZXJ0aW5nIGlubmVySFRNTCwgdXNlZCBpbiBpbnNlcnRCZWZvcmVcblx0Ly8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMClcblx0Ly8gVE9ETyBpbnZlc3RpZ2F0ZSB3aGV0aGVyIG1vcmUgcmVjZW50IGpRdWVyeSBpbXBsZW1lbnRhdGlvbiB1c2luZyB3cmFwTWFwIGluIGRvbU1hbmlwLyQoKS5odG1sKCkgZXRjLiBpcyBiZXR0ZXIgb3B0aW1pemVkIG5vdy4uLlxuXHRfd206IHtcblx0XHRvcHRpb246IFsxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIl0sXG5cdFx0bGVnZW5kOiBbMSwgXCI8ZmllbGRzZXQ+XCIsIFwiPC9maWVsZHNldD5cIl0sXG5cdFx0YXJlYTogWzEsIFwiPG1hcD5cIiwgXCI8L21hcD5cIl0sXG5cdFx0cGFyYW06IFsxLCBcIjxvYmplY3Q+XCIsIFwiPC9vYmplY3Q+XCJdLFxuXHRcdHRoZWFkOiBbMSwgXCI8dGFibGU+XCIsIFwiPC90YWJsZT5cIl0sXG5cdFx0dHI6IFsyLCBcIjx0YWJsZT48dGJvZHk+XCIsIFwiPC90Ym9keT48L3RhYmxlPlwiXSxcblx0XHR0ZDogWzMsIFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsIFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCJdLFxuXHRcdGNvbDogWzIsIFwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCJdLFxuXHRcdHN2Z19uczogWzEsIFwiPHN2Zz5cIiwgXCI8L3N2Zz5cIl0sXG5cdFx0Ly8gSUU2LTggY2FuJ3Qgc2VyaWFsaXplIGxpbmssIHNjcmlwdCwgc3R5bGUsIG9yIGFueSBodG1sNSAoTm9TY29wZSkgdGFncyxcblx0XHQvLyB1bmxlc3Mgd3JhcHBlZCBpbiBhIGRpdiB3aXRoIG5vbi1icmVha2luZyBjaGFyYWN0ZXJzIGluIGZyb250IG9mIGl0LlxuXHRcdGRpdjogJC5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgPyBbMCwgXCJcIiwgXCJcIl0gOiBbMSwgXCJYPGRpdj5cIiwgXCI8L2Rpdj5cIl1cblx0fSxcblx0X2ZlOiB7XG5cdFx0aW5wdXQ6IHtcblx0XHRcdGZyb206IGlucHV0QXR0cmliLCB0bzogXCJ2YWx1ZVwiXG5cdFx0fSxcblx0XHR0ZXh0YXJlYTogdmFsdWVCaW5kaW5nLFxuXHRcdHNlbGVjdDogdmFsdWVCaW5kaW5nLFxuXHRcdG9wdGdyb3VwOiB7XG5cdFx0XHR0bzogXCJsYWJlbFwiXG5cdFx0fVxuXHR9XG59KTtcblxucmV0dXJuICQ7XG59LCB3aW5kb3cpKTtcbiIsIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2Mi4xLjRcbiAqIGh0dHA6Ly9qcXVlcnkuY29tL1xuICpcbiAqIEluY2x1ZGVzIFNpenpsZS5qc1xuICogaHR0cDovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgMjAwNSwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE1LTA0LTI4VDE2OjAxWlxuICovXG5cbihmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Ly8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YFxuXHRcdC8vIGlzIHByZXNlbnQsIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkuXG5cdFx0Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBoYXZlIGEgYHdpbmRvd2Agd2l0aCBhIGBkb2N1bWVudGBcblx0XHQvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy5cblx0XHQvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIGB3aW5kb3dgLlxuXHRcdC8vIGUuZy4gdmFyIGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIikod2luZG93KTtcblx0XHQvLyBTZWUgdGlja2V0ICMxNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrXG4vLyBDYW4ndCBiZSBpbiBzdHJpY3QgbW9kZSwgc2V2ZXJhbCBsaWJzIGluY2x1ZGluZyBBU1AuTkVUIHRyYWNlXG4vLyB0aGUgc3RhY2sgdmlhIGFyZ3VtZW50cy5jYWxsZXIuY2FsbGVlIGFuZCBGaXJlZm94IGRpZXMgaWZcbi8vIHlvdSB0cnkgdG8gdHJhY2UgdGhyb3VnaCBcInVzZSBzdHJpY3RcIiBjYWxsIGNoYWlucy4gKCMxMzMzNSlcbi8vXG5cbnZhciBhcnIgPSBbXTtcblxudmFyIHNsaWNlID0gYXJyLnNsaWNlO1xuXG52YXIgY29uY2F0ID0gYXJyLmNvbmNhdDtcblxudmFyIHB1c2ggPSBhcnIucHVzaDtcblxudmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjtcblxudmFyIGNsYXNzMnR5cGUgPSB7fTtcblxudmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxudmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cblxuXG52YXJcblx0Ly8gVXNlIHRoZSBjb3JyZWN0IGRvY3VtZW50IGFjY29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5kYm94KVxuXHRkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCxcblxuXHR2ZXJzaW9uID0gXCIyLjEuNFwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjFcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLFxuXG5cdC8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xuXHRybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW1xcZGEtel0pL2dpLFxuXG5cdC8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKClcblx0ZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHtcblx0XHRyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG5cdH07XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvclxuXHRzZWxlY3RvcjogXCJcIixcblxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcblx0bGVuZ3RoOiAwLFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxuXHQvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheVxuXHRnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7XG5cdFx0cmV0dXJuIG51bSAhPSBudWxsID9cblxuXHRcdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldFxuXHRcdFx0KCBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdICkgOlxuXG5cdFx0XHQvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBpbiBhIGNsZWFuIGFycmF5XG5cdFx0XHRzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXHRcdHJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdC8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzXG5cdC8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5Lilcblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApO1xuXHRcdH0pKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzW2pdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKG51bGwpO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXG5cdHB1c2g6IHB1c2gsXG5cdHNvcnQ6IGFyci5zb3J0LFxuXHRzcGxpY2U6IGFyci5zcGxpY2Vcbn07XG5cbmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG5cdHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSxcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdC8vIEV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZFxuXHRpZiAoIGkgPT09IGxlbmd0aCApIHtcblx0XHR0YXJnZXQgPSB0aGlzO1xuXHRcdGktLTtcblx0fVxuXG5cdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoIChvcHRpb25zID0gYXJndW1lbnRzWyBpIF0pICE9IG51bGwgKSB7XG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRcdHNyYyA9IHRhcmdldFsgbmFtZSBdO1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1sgbmFtZSBdO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0aWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdChjb3B5KSB8fCAoY29weUlzQXJyYXkgPSBqUXVlcnkuaXNBcnJheShjb3B5KSkgKSApIHtcblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICkge1xuXHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0aXNGdW5jdGlvbjogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gXCJmdW5jdGlvblwiO1xuXHR9LFxuXG5cdGlzQXJyYXk6IEFycmF5LmlzQXJyYXksXG5cblx0aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fSxcblxuXHRpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKG51bGx8dHJ1ZXxmYWxzZXxcIlwiKVxuXHRcdC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcblx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHQvLyBhZGRpbmcgMSBjb3JyZWN0cyBsb3NzIG9mIHByZWNpc2lvbiBmcm9tIHBhcnNlRmxvYXQgKCMxNTEwMClcblx0XHRyZXR1cm4gIWpRdWVyeS5pc0FycmF5KCBvYmogKSAmJiAob2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKyAxKSA+PSAwO1xuXHR9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0Ly8gTm90IHBsYWluIG9iamVjdHM6XG5cdFx0Ly8gLSBBbnkgb2JqZWN0IG9yIHZhbHVlIHdob3NlIGludGVybmFsIFtbQ2xhc3NdXSBwcm9wZXJ0eSBpcyBub3QgXCJbb2JqZWN0IE9iamVjdF1cIlxuXHRcdC8vIC0gRE9NIG5vZGVzXG5cdFx0Ly8gLSB3aW5kb3dcblx0XHRpZiAoIGpRdWVyeS50eXBlKCBvYmogKSAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIG9iai5jb25zdHJ1Y3RvciAmJlxuXHRcdFx0XHQhaGFzT3duLmNhbGwoIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiaXNQcm90b3R5cGVPZlwiICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGZ1bmN0aW9uIGhhc24ndCByZXR1cm5lZCBhbHJlYWR5LCB3ZSdyZSBjb25maWRlbnQgdGhhdFxuXHRcdC8vIHxvYmp8IGlzIGEgcGxhaW4gb2JqZWN0LCBjcmVhdGVkIGJ5IHt9IG9yIGNvbnN0cnVjdGVkIHdpdGggbmV3IE9iamVjdFxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdGlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIG5hbWU7XG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHRcdH1cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMCwgaU9TPDYgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbChvYmopIF0gfHwgXCJvYmplY3RcIiA6XG5cdFx0XHR0eXBlb2Ygb2JqO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0XG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlICkge1xuXHRcdHZhciBzY3JpcHQsXG5cdFx0XHRpbmRpcmVjdCA9IGV2YWw7XG5cblx0XHRjb2RlID0galF1ZXJ5LnRyaW0oIGNvZGUgKTtcblxuXHRcdGlmICggY29kZSApIHtcblx0XHRcdC8vIElmIHRoZSBjb2RlIGluY2x1ZGVzIGEgdmFsaWQsIHByb2xvZ3VlIHBvc2l0aW9uXG5cdFx0XHQvLyBzdHJpY3QgbW9kZSBwcmFnbWEsIGV4ZWN1dGUgY29kZSBieSBpbmplY3RpbmcgYVxuXHRcdFx0Ly8gc2NyaXB0IHRhZyBpbnRvIHRoZSBkb2N1bWVudC5cblx0XHRcdGlmICggY29kZS5pbmRleE9mKFwidXNlIHN0cmljdFwiKSA9PT0gMSApIHtcblx0XHRcdFx0c2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcblx0XHRcdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPdGhlcndpc2UsIGF2b2lkIHRoZSBET00gbm9kZSBjcmVhdGlvbiwgaW5zZXJ0aW9uXG5cdFx0XHQvLyBhbmQgcmVtb3ZhbCBieSB1c2luZyBhbiBpbmRpcmVjdCBnbG9iYWwgZXZhbFxuXHRcdFx0XHRpbmRpcmVjdCggY29kZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxuXHRjYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG5cdH0sXG5cblx0bm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9LFxuXG5cdC8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2ssIGFyZ3MgKSB7XG5cdFx0dmFyIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoLFxuXHRcdFx0aXNBcnJheSA9IGlzQXJyYXlsaWtlKCBvYmogKTtcblxuXHRcdGlmICggYXJncyApIHtcblx0XHRcdGlmICggaXNBcnJheSApIHtcblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggaXNBcnJheSApIHtcblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApO1xuXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xXG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlsaWtlKCBPYmplY3QoYXJyKSApICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHJldCxcblx0XHRcdFx0XHR0eXBlb2YgYXJyID09PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTtcblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRpc0FycmF5ID0gaXNBcnJheWxpa2UoIGVsZW1zICksXG5cdFx0XHRyZXQgPSBbXTtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpciBuZXcgdmFsdWVzXG5cdFx0aWYgKCBpc0FycmF5ICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBjb25jYXQuYXBwbHkoIFtdLCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcblx0Ly8gYXJndW1lbnRzLlxuXHRwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkge1xuXHRcdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XG5cdFx0XHRjb250ZXh0ID0gZm47XG5cdFx0XHRmbiA9IHRtcDtcblx0XHR9XG5cblx0XHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHRcdC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuXG5cdFx0aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFNpbXVsYXRlZCBiaW5kXG5cdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApO1xuXHRcdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQgfHwgdGhpcywgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTtcblx0XHR9O1xuXG5cdFx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdFx0cHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7XG5cblx0XHRyZXR1cm4gcHJveHk7XG5cdH0sXG5cblx0bm93OiBEYXRlLm5vdyxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSk7XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yXCIuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbihpLCBuYW1lKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlsaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogaU9TIDguMiAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0b3IpXG5cdC8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSlcblx0Ly8gaGFzT3duIGlzbid0IHVzZWQgaGVyZSBkdWUgdG8gZmFsc2UgbmVnYXRpdmVzXG5cdC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUVcblx0dmFyIGxlbmd0aCA9IFwibGVuZ3RoXCIgaW4gb2JqICYmIG9iai5sZW5ndGgsXG5cdFx0dHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblxuXHRpZiAoIHR5cGUgPT09IFwiZnVuY3Rpb25cIiB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggb2JqLm5vZGVUeXBlID09PSAxICYmIGxlbmd0aCApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4yLjAtcHJlXG4gKiBodHRwOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCAyMDA4LCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTQtMTItMTZcbiAqL1xuKGZ1bmN0aW9uKCB3aW5kb3cgKSB7XG5cbnZhciBpLFxuXHRzdXBwb3J0LFxuXHRFeHByLFxuXHRnZXRUZXh0LFxuXHRpc1hNTCxcblx0dG9rZW5pemUsXG5cdGNvbXBpbGUsXG5cdHNlbGVjdCxcblx0b3V0ZXJtb3N0Q29udGV4dCxcblx0c29ydElucHV0LFxuXHRoYXNEdXBsaWNhdGUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRzZXREb2N1bWVudCxcblx0ZG9jdW1lbnQsXG5cdGRvY0VsZW0sXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdHJidWdneU1hdGNoZXMsXG5cdG1hdGNoZXMsXG5cdGNvbnRhaW5zLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IFwic2l6emxlXCIgKyAxICogbmV3IERhdGUoKSxcblx0cHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEdlbmVyYWwtcHVycG9zZSBjb25zdGFudHNcblx0TUFYX05FR0FUSVZFID0gMSA8PCAzMSxcblxuXHQvLyBJbnN0YW5jZSBtZXRob2RzXG5cdGhhc093biA9ICh7fSkuaGFzT3duUHJvcGVydHksXG5cdGFyciA9IFtdLFxuXHRwb3AgPSBhcnIucG9wLFxuXHRwdXNoX25hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXHQvLyBVc2UgYSBzdHJpcHBlZC1kb3duIGluZGV4T2YgYXMgaXQncyBmYXN0ZXIgdGhhbiBuYXRpdmVcblx0Ly8gaHR0cDovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFtpXSA9PT0gZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlXG5cdHdoaXRlc3BhY2UgPSBcIltcXFxceDIwXFxcXHRcXFxcclxcXFxuXFxcXGZdXCIsXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNjaGFyYWN0ZXJzXG5cdGNoYXJhY3RlckVuY29kaW5nID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXFxceDAwLVxcXFx4YTBdKStcIixcblxuXHQvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVyc1xuXHQvLyBBbiB1bnF1b3RlZCB2YWx1ZSBzaG91bGQgYmUgYSBDU1MgaWRlbnRpZmllciBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHQvLyBQcm9wZXIgc3ludGF4OiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcblx0aWRlbnRpZmllciA9IGNoYXJhY3RlckVuY29kaW5nLnJlcGxhY2UoIFwid1wiLCBcIncjXCIgKSxcblxuXHQvLyBBdHRyaWJ1dGUgc2VsZWN0b3JzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cdFx0Ly8gT3BlcmF0b3IgKGNhcHR1cmUgMilcblx0XHRcIiooWypeJHwhfl0/PSlcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGNoYXJhY3RlckVuY29kaW5nICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKVwiICksXG5cdFx0XCJDTEFTU1wiOiBuZXcgUmVnRXhwKCBcIl5cXFxcLihcIiArIGNoYXJhY3RlckVuY29kaW5nICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCBcIndcIiwgXCJ3KlwiICkgKyBcIilcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblx0cmVzY2FwZSA9IC8nfFxcXFwvZyxcblxuXHQvLyBDU1MgZXNjYXBlcyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gVXNlZCBmb3IgaWZyYW1lc1xuXHQvLyBTZWUgc2V0RG9jdW1lbnQoKVxuXHQvLyBSZW1vdmluZyB0aGUgZnVuY3Rpb24gd3JhcHBlciBjYXVzZXMgYSBcIlBlcm1pc3Npb24gRGVuaWVkXCJcblx0Ly8gZXJyb3IgaW4gSUVcblx0dW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNldERvY3VtZW50KCk7XG5cdH07XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG1hdGNoLCBlbGVtLCBtLCBub2RlVHlwZSxcblx0XHQvLyBRU0EgdmFyc1xuXHRcdGksIGdyb3Vwcywgb2xkLCBuaWQsIG5ld0NvbnRleHQsIG5ld1NlbGVjdG9yO1xuXG5cdGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXG5cdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblx0bm9kZVR5cGUgPSBjb250ZXh0Lm5vZGVUeXBlO1xuXG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0aWYgKCAhc2VlZCAmJiBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgd2hlbiBwb3NzaWJsZSAoZS5nLiwgbm90IHVuZGVyIERvY3VtZW50RnJhZ21lbnQpXG5cdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHtcblx0XHRcdC8vIFNwZWVkLXVwOiBTaXp6bGUoXCIjSURcIilcblx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XG5cdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKTtcblx0XHRcdFx0XHQvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJuc1xuXHRcdFx0XHRcdC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKGpRdWVyeSAjNjk2Mylcblx0XHRcdFx0XHRpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXNcblx0XHRcdFx0XHRcdC8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDb250ZXh0IGlzIG5vdCBhIGRvY3VtZW50XG5cdFx0XHRcdFx0aWYgKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgJiYgKGVsZW0gPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgJiZcblx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiYgZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdC8vIFNwZWVkLXVwOiBTaXp6bGUoXCJUQUdcIilcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzJdICkge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiLkNMQVNTXCIpXG5cdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFFTQSBwYXRoXG5cdFx0aWYgKCBzdXBwb3J0LnFzYSAmJiAoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkge1xuXHRcdFx0bmlkID0gb2xkID0gZXhwYW5kbztcblx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0bmV3U2VsZWN0b3IgPSBub2RlVHlwZSAhPT0gMSAmJiBzZWxlY3RvcjtcblxuXHRcdFx0Ly8gcVNBIHdvcmtzIHN0cmFuZ2VseSBvbiBFbGVtZW50LXJvb3RlZCBxdWVyaWVzXG5cdFx0XHQvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290XG5cdFx0XHQvLyBhbmQgd29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhlIHRlY2huaXF1ZSlcblx0XHRcdC8vIElFIDggZG9lc24ndCB3b3JrIG9uIG9iamVjdCBlbGVtZW50c1xuXHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXG5cdFx0XHRcdGlmICggKG9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIikpICkge1xuXHRcdFx0XHRcdG5pZCA9IG9sZC5yZXBsYWNlKCByZXNjYXBlLCBcIlxcXFwkJlwiICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgbmlkICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bmlkID0gXCJbaWQ9J1wiICsgbmlkICsgXCInXSBcIjtcblxuXHRcdFx0XHRpID0gZ3JvdXBzLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0Z3JvdXBzW2ldID0gbmlkICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQ7XG5cdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oXCIsXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsXG5cdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9IGNhdGNoKHFzYUVycm9yKSB7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCAhb2xkICkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoXCJpZFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBbGwgb3RoZXJzXG5cdHJldHVybiBzZWxlY3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApO1xufVxuXG4vKipcbiAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZVxuICogQHJldHVybnMge0Z1bmN0aW9uKHN0cmluZywgT2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aFxuICpcdHByb3BlcnR5IG5hbWUgdGhlIChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4cHIuY2FjaGVMZW5ndGgpXG4gKlx0ZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeVxuICovXG5mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcblx0dmFyIGtleXMgPSBbXTtcblxuXHRmdW5jdGlvbiBjYWNoZSgga2V5LCB2YWx1ZSApIHtcblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblx0XHRcdC8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllc1xuXHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTtcblx0XHR9XG5cdFx0cmV0dXJuIChjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrXG4gKi9cbmZ1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7XG5cdGZuWyBleHBhbmRvIF0gPSB0cnVlO1xuXHRyZXR1cm4gZm47XG59XG5cbi8qKlxuICogU3VwcG9ydCB0ZXN0aW5nIHVzaW5nIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFBhc3NlZCB0aGUgY3JlYXRlZCBkaXYgYW5kIGV4cGVjdHMgYSBib29sZWFuIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhc3NlcnQoIGZuICkge1xuXHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBkaXYgKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblx0XHQvLyBSZW1vdmUgZnJvbSBpdHMgcGFyZW50IGJ5IGRlZmF1bHRcblx0XHRpZiAoIGRpdi5wYXJlbnROb2RlICkge1xuXHRcdFx0ZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApO1xuXHRcdH1cblx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxuXHRcdGRpdiA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KFwifFwiKSxcblx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGRvY3VtZW50IG9yZGVyIG9mIHR3byBzaWJsaW5nc1xuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgbGVzcyB0aGFuIDAgaWYgYSBwcmVjZWRlcyBiLCBncmVhdGVyIHRoYW4gMCBpZiBhIGZvbGxvd3MgYlxuICovXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7XG5cdHZhciBjdXIgPSBiICYmIGEsXG5cdFx0ZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdCggfmIuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICkgLVxuXHRcdFx0KCB+YS5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKTtcblxuXHQvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXNcblx0aWYgKCBkaWZmICkge1xuXHRcdHJldHVybiBkaWZmO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgYiBmb2xsb3dzIGFcblx0aWYgKCBjdXIgKSB7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAobmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgcGFyZW50LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBJZiBubyBkb2N1bWVudCBhbmQgZG9jdW1lbnRFbGVtZW50IGlzIGF2YWlsYWJsZSwgcmV0dXJuXG5cdGlmICggZG9jID09PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9XG5cblx0Ly8gU2V0IG91ciBkb2N1bWVudFxuXHRkb2N1bWVudCA9IGRvYztcblx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdHBhcmVudCA9IGRvYy5kZWZhdWx0VmlldztcblxuXHQvLyBTdXBwb3J0OiBJRT44XG5cdC8vIElmIGlmcmFtZSBkb2N1bWVudCBpcyBhc3NpZ25lZCB0byBcImRvY3VtZW50XCIgdmFyaWFibGUgYW5kIGlmIGlmcmFtZSBoYXMgYmVlbiByZWxvYWRlZCxcblx0Ly8gSUUgd2lsbCB0aHJvdyBcInBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBhY2Nlc3NpbmcgXCJkb2N1bWVudFwiIHZhcmlhYmxlLCBzZWUgalF1ZXJ5ICMxMzkzNlxuXHQvLyBJRTYtOCBkbyBub3Qgc3VwcG9ydCB0aGUgZGVmYXVsdFZpZXcgcHJvcGVydHkgc28gcGFyZW50IHdpbGwgYmUgdW5kZWZpbmVkXG5cdGlmICggcGFyZW50ICYmIHBhcmVudCAhPT0gcGFyZW50LnRvcCApIHtcblx0XHQvLyBJRTExIGRvZXMgbm90IGhhdmUgYXR0YWNoRXZlbnQsIHNvIGFsbCBtdXN0IHN1ZmZlclxuXHRcdGlmICggcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblx0XHR9IGVsc2UgaWYgKCBwYXJlbnQuYXR0YWNoRXZlbnQgKSB7XG5cdFx0XHRwYXJlbnQuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgdW5sb2FkSGFuZGxlciApO1xuXHRcdH1cblx0fVxuXG5cdC8qIFN1cHBvcnQgdGVzdHNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jICk7XG5cblx0LyogQXR0cmlidXRlc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gU3VwcG9ydDogSUU8OFxuXHQvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXNcblx0Ly8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpXG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWRpdi5nZXRBdHRyaWJ1dGUoXCJjbGFzc05hbWVcIik7XG5cdH0pO1xuXG5cdC8qIGdldEVsZW1lbnQocylCeSpcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUNvbW1lbnQoXCJcIikgKTtcblx0XHRyZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBTdXBwb3J0OiBJRTw5XG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IHJuYXRpdmUudGVzdCggZG9jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvYy5nZXRFbGVtZW50c0J5TmFtZSB8fCAhZG9jLmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaW5kIGFuZCBmaWx0ZXJcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maW5kW1wiSURcIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cdFx0XHRcdC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zXG5cdFx0XHRcdC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjNcblx0XHRcdFx0cmV0dXJuIG0gJiYgbS5wYXJlbnROb2RlID8gWyBtIF0gOiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdEV4cHIuZmlsdGVyW1wiSURcIl0gPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHQvLyBTdXBwb3J0OiBJRTYvN1xuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRkZWxldGUgRXhwci5maW5kW1wiSURcIl07XG5cblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbXCJUQUdcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFtcIkNMQVNTXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApO1xuXHRcdH1cblx0fTtcblxuXHQvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0XG5cblx0Ly8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSlcblx0cmJ1Z2d5TWF0Y2hlcyA9IFtdO1xuXG5cdC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpXG5cdC8vIFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRocm93cyBhbiBlcnJvclxuXHQvLyB3aGVuZXZlciBgZG9jdW1lbnQuYWN0aXZlRWxlbWVudGAgaXMgYWNjZXNzZWQgb24gYW4gaWZyYW1lXG5cdC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yXG5cdC8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OFxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHRpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jLnF1ZXJ5U2VsZWN0b3JBbGwgKSkgKSB7XG5cdFx0Ly8gQnVpbGQgUVNBIHJlZ2V4XG5cdFx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OVxuXHRcdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZGl2ICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2hoNDY1Mzg4LmFzcHgjYXR0cmlidXRlX3NlY3Rpb25cblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbc2VsZWN0ZWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuMissIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS43K1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiOmNoZWNrZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2liaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIuIy4rWyt+XVwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvYy5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcImhpZGRlblwiICk7XG5cdFx0XHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZT1kXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIipbKl4kfCF+XT89XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZClcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqLDp4XCIpO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIsLio6XCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8XG5cdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IpICkpICkge1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3Jcblx0XHRcdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpXG5cdFx0XHRzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBkaXYsIFwiZGl2XCIgKTtcblxuXHRcdFx0Ly8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvblxuXHRcdFx0Ly8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZFxuXHRcdFx0bWF0Y2hlcy5jYWxsKCBkaXYsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgZG9lcyBub3QgaW1wbGVtZW50IGluY2x1c2l2ZSBkZXNjZW5kZW50XG5cdC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmXG5cdGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29udGFpbnMgKSA/XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLFxuXHRcdFx0XHRidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblx0XHRcdHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRhZG93bi5jb250YWlucyA/XG5cdFx0XHRcdFx0YWRvd24uY29udGFpbnMoIGJ1cCApIDpcblx0XHRcdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0XHRcdCkpO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0aWYgKCBiICkge1xuXHRcdFx0XHR3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHtcblx0XHRcdFx0XHRpZiAoIGIgPT09IGEgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdC8qIFNvcnRpbmdcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmdcblx0c29ydE9yZGVyID0gaGFzQ29tcGFyZSA/XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuXHRcdHZhciBjb21wYXJlID0gIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtcblx0XHRpZiAoIGNvbXBhcmUgKSB7XG5cdFx0XHRyZXR1cm4gY29tcGFyZTtcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRoZSBzYW1lIGRvY3VtZW50XG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID9cblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0MTtcblxuXHRcdC8vIERpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdGlmICggY29tcGFyZSAmIDEgfHxcblx0XHRcdCghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlKSApIHtcblxuXHRcdFx0Ly8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50XG5cdFx0XHRpZiAoIGEgPT09IGRvYyB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGEpICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGIgPT09IGRvYyB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jID8gLTEgOlxuXHRcdFx0XHRiID09PSBkb2MgPyAxIDpcblx0XHRcdFx0YXVwID8gLTEgOlxuXHRcdFx0XHRidXAgPyAxIDpcblx0XHRcdFx0c29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Ly8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2tcblx0XHR9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHtcblx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvblxuXHRcdGN1ciA9IGE7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YXAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXHRcdGN1ciA9IGI7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YnAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3lcblx0XHR3aGlsZSAoIGFwW2ldID09PSBicFtpXSApIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gaSA/XG5cdFx0XHQvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3Jcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3Rcblx0XHRcdGFwW2ldID09PSBwcmVmZXJyZWREb2MgPyAtMSA6XG5cdFx0XHRicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6XG5cdFx0XHQwO1xuXHR9O1xuXG5cdHJldHVybiBkb2M7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIGRpZmYsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9IG5vZGVbIGRpciBdKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggb2ZUeXBlID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gcGFyZW50WyBleHBhbmRvIF0gfHwgKHBhcmVudFsgZXhwYW5kbyBdID0ge30pO1xuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IG91dGVyQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMV07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBjYWNoZVsyXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHNlZWtpbmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVha1xuXHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB1c2VDYWNoZSAmJiAoY2FjaGUgPSAoZWxlbVsgZXhwYW5kbyBdIHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSkpWyB0eXBlIF0pICYmIGNhY2hlWzBdID09PSBkaXJydW5zICkge1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gY2FjaGVbMV07XG5cblx0XHRcdFx0XHRcdC8vIHhtbCA6bnRoLWNoaWxkKC4uLikgb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYgKytkaWZmICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0KG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkge1xuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXG5cdFx0XHQvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyc1xuXHRcdFx0Ly8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvc1xuXHRcdFx0dmFyIGFyZ3MsXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBTaXp6bGUgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZiggc2VlZCwgbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmbjtcblx0XHR9XG5cdH0sXG5cblx0cHNldWRvczoge1xuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksXG5cdFx0XHRcdFx0XHRpID0gc2VlZC5sZW5ndGg7XG5cblx0XHRcdFx0XHQvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgXG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdGlucHV0WzBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdFx0XHRpbnB1dFswXSA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuICFyZXN1bHRzLnBvcCgpO1xuXHRcdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJoYXNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkb1xuXHRcdFwibGFuZ1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8IFwiXCIpICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0XCJ0YXJnZXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDtcblx0XHR9LFxuXG5cdFx0XCJyb290XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY0VsZW07XG5cdFx0fSxcblxuXHRcdFwiZm9jdXNcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRcImVuYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7XG5cdFx0fSxcblxuXHRcdFwiZGlzYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJjaGVja2VkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09IFwib3B0aW9uXCIgJiYgISFlbGVtLnNlbGVjdGVkKTtcblx0XHR9LFxuXG5cdFx0XCJzZWxlY3RlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcblx0XHRcdC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHlcblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0XCJlbXB0eVwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJwYXJlbnRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1tcImVtcHR5XCJdKCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJidXR0b25cIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblxuXHRcdFwidGV4dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRcdC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCBcInNlYXJjaFwiKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09IFwidGV4dFwiXG5cdFx0XHRcdCggKGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIiApO1xuXHRcdH0sXG5cblx0XHQvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uXG5cdFx0XCJmaXJzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFsgMCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJsYXN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0pLFxuXG5cdFx0XCJlcVwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSksXG5cblx0XHRcImV2ZW5cIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcIm9kZFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwibHRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJndFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pXG5cdH1cbn07XG5cbkV4cHIucHNldWRvc1tcIm50aFwiXSA9IEV4cHIucHNldWRvc1tcImVxXCJdO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbnRva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7XG5cdHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLFxuXHRcdHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggY2FjaGVkICkge1xuXHRcdHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7XG5cdH1cblxuXHRzb0ZhciA9IHNlbGVjdG9yO1xuXHRncm91cHMgPSBbXTtcblx0cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyO1xuXG5cdHdoaWxlICggc29GYXIgKSB7XG5cblx0XHQvLyBDb21tYSBhbmQgZmlyc3QgcnVuXG5cdFx0aWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0Zhcjtcblx0XHRcdH1cblx0XHRcdGdyb3Vwcy5wdXNoKCAodG9rZW5zID0gW10pICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCBcIiBcIiApXG5cdFx0XHR9KTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoIChtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdChtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xuXHQvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmdcblx0Ly8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zXG5cdHJldHVybiBwYXJzZU9ubHkgP1xuXHRcdHNvRmFyLmxlbmd0aCA6XG5cdFx0c29GYXIgP1xuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcblx0XHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHRcdHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApO1xufTtcblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRjaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBkaXIgPT09IFwicGFyZW50Tm9kZVwiLFxuXHRcdGRvbmVOYW1lID0gZG9uZSsrO1xuXG5cdHJldHVybiBjb21iaW5hdG9yLmZpcnN0ID9cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGFsbCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudHNcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIG9sZENhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gZGlyIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXHRcdFx0XHRcdFx0aWYgKCAob2xkQ2FjaGUgPSBvdXRlckNhY2hlWyBkaXIgXSkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsgZGlyIF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ICE9PSBkb2N1bWVudCAmJiBjb250ZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgZWxlbWVudHMgcGFzc2luZyBlbGVtZW50TWF0Y2hlcnMgZGlyZWN0bHkgdG8gcmVzdWx0c1xuXHRcdFx0Ly8gS2VlcCBgaWAgYSBzdHJpbmcgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIHNvIGBtYXRjaGVkQ291bnRgIHdpbGwgYmUgXCIwMFwiIGJlbG93XG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZvciBzZXQgZmlsdGVyc1xuXHRcdFx0XHRpZiAoIGJ5U2V0ICkge1xuXHRcdFx0XHRcdC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnNcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gIW1hdGNoZXIgJiYgZWxlbSkgKSB7XG5cdFx0XHRcdFx0XHRtYXRjaGVkQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90XG5cdFx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdFx0dW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblx0XHRcdGlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkge1xuXHRcdFx0XHRqID0gMDtcblx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IHNldE1hdGNoZXJzW2orK10pICkge1xuXHRcdFx0XHRcdG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0Ly8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZ1xuXHRcdFx0XHRcdGlmICggbWF0Y2hlZENvdW50ID4gMCApIHtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRcdHNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRGlzY2FyZCBpbmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXNcblx0XHRcdFx0XHRzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHNcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApO1xuXG5cdFx0XHRcdC8vIFNlZWRsZXNzIHNldCBtYXRjaGVzIHN1Y2NlZWRpbmcgbXVsdGlwbGUgc3VjY2Vzc2Z1bCBtYXRjaGVycyBzdGlwdWxhdGUgc29ydGluZ1xuXHRcdFx0XHRpZiAoIG91dGVybW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHQoIG1hdGNoZWRDb3VudCArIHNldE1hdGNoZXJzLmxlbmd0aCApID4gMSApIHtcblxuXHRcdFx0XHRcdFNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gT3ZlcnJpZGUgbWFuaXB1bGF0aW9uIG9mIGdsb2JhbHMgYnkgbmVzdGVkIG1hdGNoZXJzXG5cdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5tYXRjaGVkO1xuXHRcdH07XG5cblx0cmV0dXJuIGJ5U2V0ID9cblx0XHRtYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDpcblx0XHRzdXBlck1hdGNoZXI7XG59XG5cbmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdHZhciBpLFxuXHRcdHNldE1hdGNoZXJzID0gW10sXG5cdFx0ZWxlbWVudE1hdGNoZXJzID0gW10sXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggIWNhY2hlZCApIHtcblx0XHQvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnRcblx0XHRpZiAoICFtYXRjaCApIHtcblx0XHRcdG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0fVxuXHRcdGkgPSBtYXRjaC5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTtcblx0XHRcdGlmICggY2FjaGVkWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvblxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoIHNlbGVjdG9yLCBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSApO1xuXG5cdFx0Ly8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uXG5cdFx0Y2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdH1cblx0cmV0dXJuIGNhY2hlZDtcbn07XG5cbi8qKlxuICogQSBsb3ctbGV2ZWwgc2VsZWN0aW9uIGZ1bmN0aW9uIHRoYXQgd29ya3Mgd2l0aCBTaXp6bGUncyBjb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uc1xuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHNlbGVjdG9yIEEgc2VsZWN0b3Igb3IgYSBwcmUtY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbiBidWlsdCB3aXRoIFNpenpsZS5jb21waWxlXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHRcbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHRzXVxuICogQHBhcmFtIHtBcnJheX0gW3NlZWRdIEEgc2V0IG9mIGVsZW1lbnRzIHRvIG1hdGNoIGFnYWluc3RcbiAqL1xuc2VsZWN0ID0gU2l6emxlLnNlbGVjdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsXG5cdFx0Y29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBzZWxlY3Rvcixcblx0XHRtYXRjaCA9ICFzZWVkICYmIHRva2VuaXplKCAoc2VsZWN0b3IgPSBjb21waWxlZC5zZWxlY3RvciB8fCBzZWxlY3RvcikgKTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBubyBzZWVkIGFuZCBvbmx5IG9uZSBncm91cFxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0c3VwcG9ydC5nZXRCeUlkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHRcdFx0RXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kW1wiSURcIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwcltcIm5lZWRzQ29udGV4dFwiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHtcblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdFx0XHRcdCkpICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0cnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KFwiXCIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oXCJcIikgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGRpdjEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHhcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PSBcIiNcIiA7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidHlwZVwiID8gMSA6IDIgKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5pZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRkaXYuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiwgXCJcIiApO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRyZXR1cm4gZGl2LmdldEF0dHJpYnV0ZShcImRpc2FibGVkXCIpID09IG51bGw7XG59KSApIHtcblx0YWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciB2YWw7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0fVxuXHR9KTtcbn1cblxucmV0dXJuIFNpenpsZTtcblxufSkoIHdpbmRvdyApO1xuXG5cblxualF1ZXJ5LmZpbmQgPSBTaXp6bGU7XG5qUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7XG5qUXVlcnkuZXhwcltcIjpcIl0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0O1xualF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDtcbmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDtcbmpRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWlucztcblxuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG52YXIgcnNpbmdsZVRhZyA9ICgvXjwoXFx3KylcXHMqXFwvPz4oPzo8XFwvXFwxPnwpJC8pO1xuXG5cblxudmFyIHJpc1NpbXBsZSA9IC9eLlteOiNcXFtcXC4sXSokLztcblxuLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3RcbmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkge1xuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0cmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90O1xuXHRcdH0pO1xuXG5cdH1cblxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSk7XG5cblx0fVxuXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRpZiAoIHJpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTtcblx0XHR9XG5cblx0XHRxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzICk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID49IDAgKSAhPT0gbm90O1xuXHR9KTtcbn1cblxualF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xuXHR2YXIgZWxlbSA9IGVsZW1zWyAwIF07XG5cblx0aWYgKCBub3QgKSB7XG5cdFx0ZXhwciA9IFwiOm5vdChcIiArIGV4cHIgKyBcIilcIjtcblx0fVxuXG5cdHJldHVybiBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSA/XG5cdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdIDpcblx0XHRqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdFx0fSkpO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSkgKTtcblx0XHR9XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApO1xuXHRcdH1cblxuXHRcdC8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVjdG9yLCBjb250ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKVxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQgKTtcblx0XHRyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciArIFwiIFwiICsgc2VsZWN0b3IgOiBzZWxlY3Rvcjtcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UpICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0pO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKikpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIEhUTUwgc3RyaW5nc1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0aWYgKCBzZWxlY3RvclswXSA9PT0gXCI8XCIgJiYgc2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiYgc2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWzFdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFswXSA6IGNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBPcHRpb24gdG8gcnVuIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbGx5IGxldCB0aGUgZXJyb3IgYmUgdGhyb3duIGlmIHBhcnNlSFRNTCBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTChcblx0XHRcdFx0XHRcdG1hdGNoWzFdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWzFdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFByb3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGVcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBCbGFja2JlcnJ5IDQuNlxuXHRcdFx0XHRcdC8vIGdFQklEIHJldHVybnMgbm9kZXMgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAoIzY5NjMpXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0XHR0aGlzWzBdID0gZWxlbTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLmNvbnRleHQgPSBkb2N1bWVudDtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsICQoLi4uKSlcblx0XHRcdH0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gKCBjb250ZXh0IHx8IHJvb3RqUXVlcnkgKS5maW5kKCBzZWxlY3RvciApO1xuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dClcblx0XHRcdC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSEFORExFOiAkKERPTUVsZW1lbnQpXG5cdFx0fSBlbHNlIGlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiB0eXBlb2Ygcm9vdGpRdWVyeS5yZWFkeSAhPT0gXCJ1bmRlZmluZWRcIiA/XG5cdFx0XHRcdHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0O1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHRcdHZhciBtYXRjaGVkID0gW10sXG5cdFx0XHR0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7XG5cblx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBtYXRjaGVkO1xuXHR9LFxuXG5cdHNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkge1xuXHRcdHZhciBtYXRjaGVkID0gW107XG5cblx0XHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdFx0aWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7XG5cdFx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVkO1xuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGhhczogZnVuY3Rpb24oIHRhcmdldCApIHtcblx0XHR2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksXG5cdFx0XHRsID0gdGFyZ2V0cy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDpcblx0XHRcdFx0MDtcblxuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdGZvciAoIGN1ciA9IHRoaXNbaV07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHQvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHNcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAocG9zID9cblx0XHRcdFx0XHRwb3MuaW5kZXgoY3VyKSA+IC0xIDpcblxuXHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSkgKSB7XG5cblx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlKCBtYXRjaGVkICkgOiBtYXRjaGVkICk7XG5cdH0sXG5cblx0Ly8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0XG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBJbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcyxcblxuXHRcdFx0Ly8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkXG5cdFx0XHRlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW1cblx0XHQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWUoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihzZWxlY3Rvcilcblx0XHQpO1xuXHR9XG59KTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKGN1ciA9IGN1cltkaXJdKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCh7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LnNpYmxpbmcoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudCB8fCBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZSggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0pO1xudmFyIHJub3R3aGl0ZSA9ICgvXFxTKy9nKTtcblxuXG5cbi8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGVcbnZhciBvcHRpb25zQ2FjaGUgPSB7fTtcblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0gb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0pO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdCggb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gfHwgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIExhc3QgZmlyZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cylcblx0XHRtZW1vcnksXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXHRcdC8vIEZpcnN0IGNhbGxiYWNrIHRvIGZpcmUgKHVzZWQgaW50ZXJuYWxseSBieSBhZGQgYW5kIGZpcmVXaXRoKVxuXHRcdGZpcmluZ1N0YXJ0LFxuXHRcdC8vIEVuZCBvZiB0aGUgbG9vcCB3aGVuIGZpcmluZ1xuXHRcdGZpcmluZ0xlbmd0aCxcblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1vdmUgaWYgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4LFxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXHRcdC8vIFN0YWNrIG9mIGZpcmUgY2FsbHMgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRzdGFjayA9ICFvcHRpb25zLm9uY2UgJiYgW10sXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdFx0XHRtZW1vcnkgPSBvcHRpb25zLm1lbW9yeSAmJiBkYXRhO1xuXHRcdFx0ZmlyZWQgPSB0cnVlO1xuXHRcdFx0ZmlyaW5nSW5kZXggPSBmaXJpbmdTdGFydCB8fCAwO1xuXHRcdFx0ZmlyaW5nU3RhcnQgPSAwO1xuXHRcdFx0ZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRmaXJpbmcgPSB0cnVlO1xuXHRcdFx0Zm9yICggOyBsaXN0ICYmIGZpcmluZ0luZGV4IDwgZmlyaW5nTGVuZ3RoOyBmaXJpbmdJbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIGRhdGFbIDAgXSwgZGF0YVsgMSBdICkgPT09IGZhbHNlICYmIG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7IC8vIFRvIHByZXZlbnQgZnVydGhlciBjYWxscyB1c2luZyBhZGRcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdGlmICggc3RhY2sgKSB7XG5cdFx0XHRcdFx0aWYgKCBzdGFjay5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCBzdGFjay5zaGlmdCgpICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYuZGlzYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0Ly8gRmlyc3QsIHdlIHNhdmUgdGhlIGN1cnJlbnQgbGVuZ3RoXG5cdFx0XHRcdFx0dmFyIHN0YXJ0ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0KGZ1bmN0aW9uIGFkZCggYXJncyApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcblx0XHRcdFx0XHRcdFx0XHRhZGQoIGFyZyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KSggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0Ly8gRG8gd2UgbmVlZCB0byBhZGQgdGhlIGNhbGxiYWNrcyB0byB0aGVcblx0XHRcdFx0XHQvLyBjdXJyZW50IGZpcmluZyBiYXRjaD9cblx0XHRcdFx0XHRpZiAoIGZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdC8vIFdpdGggbWVtb3J5LCBpZiB3ZSdyZSBub3QgZmlyaW5nIHRoZW5cblx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgY2FsbCByaWdodCBhd2F5XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdFx0ZmlyaW5nU3RhcnQgPSBzdGFydDtcblx0XHRcdFx0XHRcdGZpcmUoIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0XHRsaXN0LnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzXG5cdFx0XHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nTGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyaW5nTGVuZ3RoLS07XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmaXJpbmdJbmRleC0tO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuXG5cdFx0XHQvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC5cblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRyZXR1cm4gZm4gPyBqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDogISEoIGxpc3QgJiYgbGlzdC5sZW5ndGggKTtcblx0XHRcdH0sXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0ZmlyaW5nTGVuZ3RoID0gMDtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gSGF2ZSB0aGUgbGlzdCBkbyBub3RoaW5nIGFueW1vcmVcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsaXN0ID0gc3RhY2sgPSBtZW1vcnkgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIElzIGl0IGRpc2FibGVkP1xuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gTG9jayB0aGUgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZVxuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHN0YWNrID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoICFtZW1vcnkgKSB7XG5cdFx0XHRcdFx0c2VsZi5kaXNhYmxlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gSXMgaXQgbG9ja2VkP1xuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFzdGFjaztcblx0XHRcdH0sXG5cdFx0XHQvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XG5cdFx0XHRcdGlmICggbGlzdCAmJiAoICFmaXJlZCB8fCBzdGFjayApICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0aWYgKCBmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRzdGFjay5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZpcmUoIGFyZ3MgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcblx0XHRcdGZpcmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmpRdWVyeS5leHRlbmQoe1xuXG5cdERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHtcblx0XHR2YXIgdHVwbGVzID0gW1xuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3RhdGVcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwgXCJyZWplY3RlZFwiIF0sXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKFwibWVtb3J5XCIpIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBmbnNbIGkgXSApICYmIGZuc1sgaSBdO1xuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3RGVmZXJcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oIHRoaXMgPT09IHByb21pc2UgPyBuZXdEZWZlci5wcm9taXNlKCkgOiB0aGlzLCBmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDMgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZVsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWzFdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdXG5cdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblxuXHRcdFx0XHQvLyBbIHJlamVjdF9saXN0IHwgcmVzb2x2ZV9saXN0IF0uZGlzYWJsZTsgcHJvZ3Jlc3NfbGlzdC5sb2NrXG5cdFx0XHRcdH0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbMF0gXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbMF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHByb21pc2UgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdICsgXCJXaXRoXCIgXSA9IGxpc3QuZmlyZVdpdGg7XG5cdFx0fSk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblx0XHRcdGxlbmd0aCA9IHJlc29sdmVWYWx1ZXMubGVuZ3RoLFxuXG5cdFx0XHQvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBsZW5ndGggIT09IDEgfHwgKCBzdWJvcmRpbmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggc3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLFxuXG5cdFx0XHQvLyB0aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNpbmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC5cblx0XHRcdGRlZmVycmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSxcblxuXHRcdFx0Ly8gVXBkYXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlc1xuXHRcdFx0dXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpLCBjb250ZXh0cywgdmFsdWVzICkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdGNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggdmFsdWVzID09PSBwcm9ncmVzc1ZhbHVlcyApIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXG5cdFx0XHRwcm9ncmVzc1ZhbHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBEZWZlcnJlZCBzdWJvcmRpbmF0ZXM7IHRyZWF0IG90aGVycyBhcyByZXNvbHZlZFxuXHRcdGlmICggbGVuZ3RoID4gMSApIHtcblx0XHRcdHByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHByb2dyZXNzQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHQuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKVxuXHRcdFx0XHRcdFx0LmZhaWwoIGRlZmVycmVkLnJlamVjdCApXG5cdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQtLXJlbWFpbmluZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElmIHdlJ3JlIG5vdCB3YWl0aW5nIG9uIGFueXRoaW5nLCByZXNvbHZlIHRoZSBtYXN0ZXJcblx0XHRpZiAoICFyZW1haW5pbmcgKSB7XG5cdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcblx0fVxufSk7XG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0O1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cdC8vIEFkZCB0aGUgY2FsbGJhY2tcblx0alF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBmbiApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhvbGQgKG9yIHJlbGVhc2UpIHRoZSByZWFkeSBldmVudFxuXHRob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkge1xuXHRcdGlmICggaG9sZCApIHtcblx0XHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0XHR9IGVsc2Uge1xuXHRcdFx0alF1ZXJ5LnJlYWR5KCB0cnVlICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblxuXHRcdC8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50c1xuXHRcdGlmICggalF1ZXJ5LmZuLnRyaWdnZXJIYW5kbGVyICkge1xuXHRcdFx0alF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXJIYW5kbGVyKCBcInJlYWR5XCIgKTtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS5vZmYoIFwicmVhZHlcIiApO1xuXHRcdH1cblx0fVxufSk7XG5cbi8qKlxuICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkLCBmYWxzZSApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblx0alF1ZXJ5LnJlYWR5KCk7XG59XG5cbmpRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHtcblx0aWYgKCAhcmVhZHlMaXN0ICkge1xuXG5cdFx0cmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHQvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cblx0XHQvLyBXZSBvbmNlIHRyaWVkIHRvIHVzZSByZWFkeVN0YXRlIFwiaW50ZXJhY3RpdmVcIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmVcblx0XHQvLyBkaXNjb3ZlcmVkIGJ5IENocmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1XG5cdFx0aWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgKSB7XG5cdFx0XHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0XHRcdHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblxuXHRcdFx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApO1xufTtcblxuLy8gS2ljayBvZmYgdGhlIERPTSByZWFkeSBjaGVjayBldmVuIGlmIHRoZSB1c2VyIGRvZXMgbm90XG5qUXVlcnkucmVhZHkucHJvbWlzZSgpO1xuXG5cblxuXG4vLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cbi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvblxudmFyIGFjY2VzcyA9IGpRdWVyeS5hY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCBqUXVlcnkudHlwZSgga2V5ICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblx0XHRmb3IgKCBpIGluIGtleSApIHtcblx0XHRcdGpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmF3ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGJ1bGsgKSB7XG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbiggZWxlbXNbaV0sIGtleSwgcmF3ID8gdmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNoYWluYWJsZSA/XG5cdFx0ZWxlbXMgOlxuXG5cdFx0Ly8gR2V0c1xuXHRcdGJ1bGsgP1xuXHRcdFx0Zm4uY2FsbCggZWxlbXMgKSA6XG5cdFx0XHRsZW4gPyBmbiggZWxlbXNbMF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9iamVjdCBjYW4gaGF2ZSBkYXRhXG4gKi9cbmpRdWVyeS5hY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0LyoganNoaW50IC1XMDE4ICovXG5cdHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTtcbn07XG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LFxuXHQvLyBPbGQgV2ViS2l0IGRvZXMgbm90IGhhdmUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zL2ZyZWV6ZSBtZXRob2QsXG5cdC8vIHJldHVybiBuZXcgZW1wdHkgb2JqZWN0IGluc3RlYWQgd2l0aCBubyBbW3NldF1dIGFjY2Vzc29yXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcy5jYWNoZSA9IHt9LCAwLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cdH0pO1xuXG5cdHRoaXMuZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvICsgRGF0YS51aWQrKztcbn1cblxuRGF0YS51aWQgPSAxO1xuRGF0YS5hY2NlcHRzID0galF1ZXJ5LmFjY2VwdERhdGE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXHRrZXk6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdC8vIEFsd2F5cyByZXR1cm4gdGhlIGtleSBmb3IgYSBmcm96ZW4gb2JqZWN0LlxuXHRcdGlmICggIURhdGEuYWNjZXB0cyggb3duZXIgKSApIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHZhciBkZXNjcmlwdG9yID0ge30sXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUga2V5XG5cdFx0XHR1bmxvY2sgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF1bmxvY2sgKSB7XG5cdFx0XHR1bmxvY2sgPSBEYXRhLnVpZCsrO1xuXG5cdFx0XHQvLyBTZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnR5XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkZXNjcmlwdG9yWyB0aGlzLmV4cGFuZG8gXSA9IHsgdmFsdWU6IHVubG9jayB9O1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggb3duZXIsIGRlc2NyaXB0b3IgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0XG5cdFx0XHQvLyBGYWxsYmFjayB0byBhIGxlc3Mgc2VjdXJlIGRlZmluaXRpb25cblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRkZXNjcmlwdG9yWyB0aGlzLmV4cGFuZG8gXSA9IHVubG9jaztcblx0XHRcdFx0alF1ZXJ5LmV4dGVuZCggb3duZXIsIGRlc2NyaXB0b3IgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgdGhlIGNhY2hlIG9iamVjdFxuXHRcdGlmICggIXRoaXMuY2FjaGVbIHVubG9jayBdICkge1xuXHRcdFx0dGhpcy5jYWNoZVsgdW5sb2NrIF0gPSB7fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5sb2NrO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHQvLyBUaGVyZSBtYXkgYmUgYW4gdW5sb2NrIGFzc2lnbmVkIHRvIHRoaXMgbm9kZSxcblx0XHRcdC8vIGlmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciB0aGlzIFwib3duZXJcIiwgY3JlYXRlIG9uZSBpbmxpbmVcblx0XHRcdC8vIGFuZCBzZXQgdGhlIHVubG9jayBhcyB0aG91Z2ggYW4gb3duZXIgZW50cnkgaGFkIGFsd2F5cyBleGlzdGVkXG5cdFx0XHR1bmxvY2sgPSB0aGlzLmtleSggb3duZXIgKSxcblx0XHRcdGNhY2hlID0gdGhpcy5jYWNoZVsgdW5sb2NrIF07XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGNhY2hlWyBkYXRhIF0gPSB2YWx1ZTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEZyZXNoIGFzc2lnbm1lbnRzIGJ5IG9iamVjdCBhcmUgc2hhbGxvdyBjb3BpZWRcblx0XHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5leHRlbmQoIHRoaXMuY2FjaGVbIHVubG9jayBdLCBkYXRhICk7XG5cdFx0XHQvLyBPdGhlcndpc2UsIGNvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBwcm9wIGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0Y2FjaGVbIHByb3AgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2FjaGU7XG5cdH0sXG5cdGdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0Ly8gRWl0aGVyIGEgdmFsaWQgY2FjaGUgaXMgZm91bmQsIG9yIHdpbGwgYmUgY3JlYXRlZC5cblx0XHQvLyBOZXcgY2FjaGVzIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIHVubG9jayByZXR1cm5lZCxcblx0XHQvLyBhbGxvd2luZyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBuZXdseSBjcmVhdGVkXG5cdFx0Ly8gZW1wdHkgZGF0YSBvYmplY3QuIEEgdmFsaWQgb3duZXIgb2JqZWN0IG11c3QgYmUgcHJvdmlkZWQuXG5cdFx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZVsgdGhpcy5rZXkoIG93bmVyICkgXTtcblxuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRjYWNoZSA6IGNhY2hlWyBrZXkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIHN0b3JlZDtcblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoKGtleSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSApIHtcblxuXHRcdFx0c3RvcmVkID0gdGhpcy5nZXQoIG93bmVyLCBrZXkgKTtcblxuXHRcdFx0cmV0dXJuIHN0b3JlZCAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0c3RvcmVkIDogdGhpcy5nZXQoIG93bmVyLCBqUXVlcnkuY2FtZWxDYXNlKGtleSkgKTtcblx0XHR9XG5cblx0XHQvLyBbKl1XaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllc1xuXHRcdC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly9cblx0XHR0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTtcblxuXHRcdC8vIFNpbmNlIHRoZSBcInNldFwiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50c1xuXHRcdC8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXVxuXHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7XG5cdH0sXG5cdHJlbW92ZTogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGNhbWVsLFxuXHRcdFx0dW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGVbIHVubG9jayBdO1xuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHRoaXMuY2FjaGVbIHVubG9jayBdID0ge307XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIGtleSApICkge1xuXHRcdFx0XHQvLyBJZiBcIm5hbWVcIiBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdoZW4gZGF0YSBpcyBpbml0aWFsbHkgY3JlYXRlZCwgdmlhIChcImtleVwiLCBcInZhbFwiKSBzaWduYXR1cmUsXG5cdFx0XHRcdC8vIGtleXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlLlxuXHRcdFx0XHQvLyBTaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBfaG93XyBhIGtleSB3YXMgYWRkZWQsIHJlbW92ZVxuXHRcdFx0XHQvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2XG5cdFx0XHRcdC8vIFRoaXMgd2lsbCBvbmx5IHBlbmFsaXplIHRoZSBhcnJheSBhcmd1bWVudCBwYXRoLlxuXHRcdFx0XHRuYW1lID0ga2V5LmNvbmNhdCgga2V5Lm1hcCggalF1ZXJ5LmNhbWVsQ2FzZSApICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjYW1lbCA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXHRcdFx0XHQvLyBUcnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvblxuXHRcdFx0XHRpZiAoIGtleSBpbiBjYWNoZSApIHtcblx0XHRcdFx0XHRuYW1lID0gWyBrZXksIGNhbWVsIF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LlxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0bmFtZSA9IGNhbWVsO1xuXHRcdFx0XHRcdG5hbWUgPSBuYW1lIGluIGNhY2hlID9cblx0XHRcdFx0XHRcdFsgbmFtZSBdIDogKCBuYW1lLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGkgPSBuYW1lLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIG5hbWVbIGkgXSBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHJldHVybiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoXG5cdFx0XHR0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXSB8fCB7fVxuXHRcdCk7XG5cdH0sXG5cdGRpc2NhcmQ6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHRpZiAoIG93bmVyWyB0aGlzLmV4cGFuZG8gXSApIHtcblx0XHRcdGRlbGV0ZSB0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXTtcblx0XHR9XG5cdH1cbn07XG52YXIgZGF0YV9wcml2ID0gbmV3IERhdGEoKTtcblxudmFyIGRhdGFfdXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvKFtBLVpdKS9nO1xuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJDFcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGRhdGEgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6XG5cdFx0XHRcdFx0ZGF0YSA9PT0gXCJmYWxzZVwiID8gZmFsc2UgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwibnVsbFwiID8gbnVsbCA6XG5cdFx0XHRcdFx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0XHRcdFx0XHQrZGF0YSArIFwiXCIgPT09IGRhdGEgPyArZGF0YSA6XG5cdFx0XHRcdFx0cmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6XG5cdFx0XHRcdFx0ZGF0YTtcblx0XHRcdH0gY2F0Y2goIGUgKSB7fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXJcblx0XHRcdGRhdGFfdXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkYXRhX3VzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFfcHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFfdXNlci5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhX3VzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YV9wcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVsZW0gKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFfcHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTExK1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxsICgjMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZS5zbGljZSg1KSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhX3ByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhX3VzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhLFxuXHRcdFx0XHRjYW1lbEtleSA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gd2l0aCB0aGUga2V5IGFzLWlzXG5cdFx0XHRcdGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIHdpdGggdGhlIGtleSBjYW1lbGl6ZWRcblx0XHRcdFx0ZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVsZW0sIGNhbWVsS2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGNhbWVsS2V5LCB1bmRlZmluZWQgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSB0cmllZCByZWFsbHkgaGFyZCwgYnV0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBkYXRhLi4uXG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIEZpcnN0LCBhdHRlbXB0IHRvIHN0b3JlIGEgY29weSBvciByZWZlcmVuY2Ugb2YgYW55XG5cdFx0XHRcdC8vIGRhdGEgdGhhdCBtaWdodCd2ZSBiZWVuIHN0b3JlIHdpdGggYSBjYW1lbENhc2VkIGtleS5cblx0XHRcdFx0dmFyIGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCB0aGlzLCBjYW1lbEtleSApO1xuXG5cdFx0XHRcdC8vIEZvciBIVE1MNSBkYXRhLSogYXR0cmlidXRlIGludGVyb3AsIHdlIGhhdmUgdG9cblx0XHRcdFx0Ly8gc3RvcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBkYXNoZXMgaW4gYSBjYW1lbENhc2UgZm9ybS5cblx0XHRcdFx0Ly8gVGhpcyBtaWdodCBub3QgYXBwbHkgdG8gYWxsIHByb3BlcnRpZXMuLi4qXG5cdFx0XHRcdGRhdGFfdXNlci5zZXQoIHRoaXMsIGNhbWVsS2V5LCB2YWx1ZSApO1xuXG5cdFx0XHRcdC8vICouLi4gSW4gdGhlIGNhc2Ugb2YgcHJvcGVydGllcyB0aGF0IG1pZ2h0IF9hY3R1YWxseV9cblx0XHRcdFx0Ly8gaGF2ZSBkYXNoZXMsIHdlIG5lZWQgdG8gYWxzbyBzdG9yZSBhIGNvcHkgb2YgdGhhdFxuXHRcdFx0XHQvLyB1bmNoYW5nZWQgcHJvcGVydHkuXG5cdFx0XHRcdGlmICgga2V5LmluZGV4T2YoXCItXCIpICE9PSAtMSAmJiBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0ZGF0YV91c2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhX3VzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9KTtcblx0fVxufSk7XG5cblxualF1ZXJ5LmV4dGVuZCh7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXBcblx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0aWYgKCAhcXVldWUgfHwgalF1ZXJ5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBkYXRhICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBxdWV1ZSB8fCBbXTtcblx0XHR9XG5cdH0sXG5cblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXG5cdFx0XHRzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCxcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKSxcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXG5cdFx0XHRuZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbFxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0c3RhcnRMZW5ndGgtLTtcblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXG5cdFx0XHQvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nXG5cdFx0XHQvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcblx0XHRcdFx0cXVldWUudW5zaGlmdCggXCJpbnByb2dyZXNzXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvblxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xuXHRcdH1cblxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBOb3QgcHVibGljIC0gZ2VuZXJhdGUgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJuIHRoZSBjdXJyZW50IG9uZVxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dmFyIGtleSA9IHR5cGUgKyBcInF1ZXVlSG9va3NcIjtcblx0XHRyZXR1cm4gZGF0YV9wcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YV9wcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLmFkZChmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgWyB0eXBlICsgXCJxdWV1ZVwiLCBrZXkgXSApO1xuXHRcdFx0fSlcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcyA6XG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWzBdICE9PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSk7XG5cdH0sXG5cdGNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0fSxcblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59KTtcbnZhciBwbnVtID0gKC9bKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkvKS5zb3VyY2U7XG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24oIGVsZW0sIGVsICkge1xuXHRcdC8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247XG5cdFx0Ly8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwgYmUgc2Vjb25kIGFyZ3VtZW50XG5cdFx0ZWxlbSA9IGVsIHx8IGVsZW07XG5cdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiIHx8ICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXHR9O1xuXG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoL14oPzpjaGVja2JveHxyYWRpbykkL2kpO1xuXG5cblxuKGZ1bmN0aW9uKCkge1xuXHR2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0ZGl2ID0gZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApLFxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cblx0Ly8gU3VwcG9ydDogU2FmYXJpPD01LjFcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKCMxMTIxNylcblx0Ly8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKVxuXHQvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSlcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XG5cblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdC8vIFN1cHBvcnQ6IFNhZmFyaTw9NS4xLCBBbmRyb2lkPDQuMlxuXHQvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0pKCk7XG52YXIgc3RydW5kZWZpbmVkID0gdHlwZW9mIHVuZGVmaW5lZDtcblxuXG5cbnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXJcblx0cmtleUV2ZW50ID0gL15rZXkvLFxuXHRybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudSl8Y2xpY2svLFxuXHRyZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcXC4oLispfCkkLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxuICovXG5qUXVlcnkuZXZlbnQgPSB7XG5cblx0Z2xvYmFsOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XG5cblx0XHR2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YV9wcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cylcblx0XHRpZiAoICFlbGVtRGF0YSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzKSApIHtcblx0XHRcdGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRpZiAoICEoZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUpICkge1xuXHRcdFx0ZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHtcblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gc3RydW5kZWZpbmVkICYmIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSA/XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBlbGVtLCBhcmd1bWVudHMgKSA6IHVuZGVmaW5lZDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZVxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVyc1xuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcblx0XHRcdGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoe1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbihcIi5cIilcblx0XHRcdH0sIGhhbmRsZU9iakluICk7XG5cblx0XHRcdC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0XG5cdFx0XHRpZiAoICEoaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSkgKSB7XG5cdFx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTtcblx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7XG5cblx0XHRcdFx0Ly8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XG5cdFx0XHRcdHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udFxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cblx0XHRcdGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7XG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50XG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XG5cblx0XHR2YXIgaiwgb3JpZ0NvdW50LCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhX3ByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZFxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsyXSAmJiBuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKFwiXFxcXC4oPzouKlxcXFwufClcIikgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gXCIqKlwiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkge1xuXHRcdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaiwgMSApO1xuXG5cdFx0XHRcdFx0aWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc3BlY2lhbC5yZW1vdmUgKSB7XG5cdFx0XHRcdFx0XHRzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdFxuXHRcdFx0Ly8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpXG5cdFx0XHRpZiAoIG9yaWdDb3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8IHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7XG5cdFx0XHRkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBcImV2ZW50c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xuXG5cdFx0dmFyIGksIGN1ciwgdG1wLCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdChcIi5cIikgOiBbXTtcblxuXHRcdGN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoXCIuXCIpID49IDAgKSB7XG5cdFx0XHQvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdChcIi5cIik7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZihcIjpcIikgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbihcIi5cIik7XG5cdFx0ZXZlbnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKSArIFwiKFxcXFwufCQpXCIgKSA6XG5cdFx0XHRudWxsO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXG5cdFx0ZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkO1xuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxuXHRcdGRhdGEgPSBkYXRhID09IG51bGwgP1xuXHRcdFx0WyBldmVudCBdIDpcblx0XHRcdGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZlbnQgXSApO1xuXG5cdFx0Ly8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lc1xuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09IChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKGN1ciA9IGV2ZW50UGF0aFtpKytdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9ICggZGF0YV9wcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmIGRhdGFfcHJpdi5nZXQoIGN1ciwgXCJoYW5kbGVcIiApO1xuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XG5cdFx0XHRcdGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5hdGl2ZSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTtcblx0XHRcdGlmICggaGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSkgJiZcblx0XHRcdFx0alF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHtcblxuXHRcdFx0XHQvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSApICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2Rcblx0XHRcdFx0XHR0bXAgPSBlbGVtWyBvbnR5cGUgXTtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBudWxsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7XG5cdFx0XHRcdFx0ZWxlbVsgdHlwZSBdKCk7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApO1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRoYW5kbGVycyA9ICggZGF0YV9wcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWzBdID0gZXZlbnQ7XG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAobWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0pICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoIChoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSkgJiYgIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvciAyKSBoYXZlIG5hbWVzcGFjZShzKVxuXHRcdFx0XHQvLyBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS5cblx0XHRcdFx0aWYgKCAhZXZlbnQubmFtZXNwYWNlX3JlIHx8IGV2ZW50Lm5hbWVzcGFjZV9yZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9KS5oYW5kbGUgfHwgaGFuZGxlT2JqLmhhbmRsZXIgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdGlmICggKGV2ZW50LnJlc3VsdCA9IHJldCkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgbWF0Y2hlcywgc2VsLCBoYW5kbGVPYmosXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICgjMTMxODApXG5cdFx0Ly8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmIGN1ci5ub2RlVHlwZSAmJiAoIWV2ZW50LmJ1dHRvbiB8fCBldmVudC50eXBlICE9PSBcImNsaWNrXCIpICkge1xuXG5cdFx0XHRmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiICkge1xuXHRcdFx0XHRcdG1hdGNoZXMgPSBbXTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDAgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG1hdGNoZXMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVzIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnNcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IHRoaXMsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBoYW5kbGVyUXVldWU7XG5cdH0sXG5cblx0Ly8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnRcblx0cHJvcHM6IFwiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoXCIuc3BsaXQoXCIgXCIpLFxuXG5cdGZpeEhvb2tzOiB7fSxcblxuXHRrZXlIb29rczoge1xuXHRcdHByb3BzOiBcImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGVcIi5zcGxpdChcIiBcIiksXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xuXG5cdFx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRcdGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCApIHtcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXHR9LFxuXG5cdG1vdXNlSG9va3M6IHtcblx0XHRwcm9wczogXCJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnRcIi5zcGxpdChcIiBcIiksXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xuXHRcdFx0dmFyIGV2ZW50RG9jLCBkb2MsIGJvZHksXG5cdFx0XHRcdGJ1dHRvbiA9IG9yaWdpbmFsLmJ1dHRvbjtcblxuXHRcdFx0Ly8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZVxuXHRcdFx0aWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIG9yaWdpbmFsLmNsaWVudFggIT0gbnVsbCApIHtcblx0XHRcdFx0ZXZlbnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcblx0XHRcdFx0ZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0XHRib2R5ID0gZXZlbnREb2MuYm9keTtcblxuXHRcdFx0XHRldmVudC5wYWdlWCA9IG9yaWdpbmFsLmNsaWVudFggKyAoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwICk7XG5cdFx0XHRcdGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdFx0Ly8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXRcblx0XHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRldmVudC53aGljaCA9ICggYnV0dG9uICYgMSA/IDEgOiAoIGJ1dHRvbiAmIDIgPyAzIDogKCBidXR0b24gJiA0ID8gMiA6IDAgKSApICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHtcblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXNcblx0XHR2YXIgaSwgcHJvcCwgY29weSxcblx0XHRcdHR5cGUgPSBldmVudC50eXBlLFxuXHRcdFx0b3JpZ2luYWxFdmVudCA9IGV2ZW50LFxuXHRcdFx0Zml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTtcblxuXHRcdGlmICggIWZpeEhvb2sgKSB7XG5cdFx0XHR0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBmaXhIb29rID1cblx0XHRcdFx0cm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDpcblx0XHRcdFx0cmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOlxuXHRcdFx0XHR7fTtcblx0XHR9XG5cdFx0Y29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlzLnByb3BzLmNvbmNhdCggZml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wcztcblxuXHRcdGV2ZW50ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXG5cdFx0aSA9IGNvcHkubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0cHJvcCA9IGNvcHlbIGkgXTtcblx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogQ29yZG92YSAyLjUgKFdlYktpdCkgKCMxMzI1NSlcblx0XHQvLyBBbGwgZXZlbnRzIHNob3VsZCBoYXZlIGEgdGFyZ2V0OyBDb3Jkb3ZhIGRldmljZXJlYWR5IGRvZXNuJ3Rcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBkb2N1bWVudDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgNi4wKywgQ2hyb21lPDI4XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsICMxMzE0Mylcblx0XHRpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaXhIb29rLmZpbHRlciA/IGZpeEhvb2suZmlsdGVyKCBldmVudCwgb3JpZ2luYWxFdmVudCApIDogZXZlbnQ7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRmb2N1czoge1xuXHRcdFx0Ly8gRmlyZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1ZW5jZSBpcyBjb3JyZWN0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzICE9PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuZm9jdXMgKSB7XG5cdFx0XHRcdFx0dGhpcy5mb2N1cygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGVnYXRlVHlwZTogXCJmb2N1c2luXCJcblx0XHR9LFxuXHRcdGJsdXI6IHtcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMgPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5ibHVyICkge1xuXHRcdFx0XHRcdHRoaXMuYmx1cigpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGVnYXRlVHlwZTogXCJmb2N1c291dFwiXG5cdFx0fSxcblx0XHRjbGljazoge1xuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR0aGlzLmNsaWNrKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9uJ3QgZmlyZSBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgXCJhXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YmVmb3JldW5sb2FkOiB7XG5cdFx0XHRwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDIwK1xuXHRcdFx0XHQvLyBGaXJlZm94IGRvZXNuJ3QgYWxlcnQgaWYgdGhlIHJldHVyblZhbHVlIGZpZWxkIGlzIG5vdCBzZXQuXG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHtcblx0XHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuXG5cdFx0Ly8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlXG5cdFx0Ly8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuXG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlLFxuXHRcdFx0XHRvcmlnaW5hbEV2ZW50OiB7fVxuXHRcdFx0fVxuXHRcdCk7XG5cdFx0aWYgKCBidWJibGUgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guY2FsbCggZWxlbSwgZSApO1xuXHRcdH1cblx0XHRpZiAoIGUuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7XG5cdH1cbn07XG5cbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQpICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IGpRdWVyeS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnByZXZlbnREZWZhdWx0ICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fSxcblx0c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmIGUuc3RvcFByb3BhZ2F0aW9uICkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiApIHtcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcblx0fVxufTtcblxuLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTUrXG5qUXVlcnkuZWFjaCh7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSk7XG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3gsIENocm9tZSwgU2FmYXJpXG4vLyBDcmVhdGUgXCJidWJibGluZ1wiIGZvY3VzIGFuZCBibHVyIGV2ZW50c1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHtcblx0alF1ZXJ5LmVhY2goeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSwgdHJ1ZSApO1xuXHRcdFx0fTtcblxuXHRcdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHtcblx0XHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4ICkgLSAxO1xuXG5cdFx0XHRcdGlmICggIWF0dGFjaGVzICkge1xuXHRcdFx0XHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSk7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHtcblx0XHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdFx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKVxuXHRcdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vbiggdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblx0XHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHQvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKVxuXHRcdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXG5cdFx0XHRcdGZuID0gZGF0YTtcblx0XHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICggb25lID09PSAxICkge1xuXHRcdFx0b3JpZ0ZuID0gZm47XG5cdFx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdFx0cmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9O1xuXHRcdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0XHR9KTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID8gaGFuZGxlT2JqLm9yaWdUeXBlICsgXCIuXCIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDogaGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRcdFx0Ly8gKCB0eXBlcyBbLCBmbl0gKVxuXHRcdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSk7XG5cdH0sXG5cdHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgZWxlbSA9IHRoaXNbMF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59KTtcblxuXG52YXJcblx0cnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1xcdzpdKylbXj5dKilcXC8+L2dpLFxuXHRydGFnTmFtZSA9IC88KFtcXHc6XSspLyxcblx0cmh0bWwgPSAvPHwmIz9cXHcrOy8sXG5cdHJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksXG5cdC8vIGNoZWNrZWQ9XCJjaGVja2VkXCIgb3IgY2hlY2tlZFxuXHRyY2hlY2tlZCA9IC9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksXG5cdHJzY3JpcHRUeXBlID0gL14kfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxcblx0cnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcXC8oLiopLyxcblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nLFxuXG5cdC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApXG5cdHdyYXBNYXAgPSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRvcHRpb246IFsgMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCIgXSxcblxuXHRcdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0XHRjb2w6IFsgMiwgXCI8dGFibGU+PGNvbGdyb3VwPlwiLCBcIjwvY29sZ3JvdXA+PC90YWJsZT5cIiBdLFxuXHRcdHRyOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCIgXSxcblx0XHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0XHRfZGVmYXVsdDogWyAwLCBcIlwiLCBcIlwiIF1cblx0fTtcblxuLy8gU3VwcG9ydDogSUU5XG53cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247XG5cbndyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7XG53cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcblxuLy8gU3VwcG9ydDogMS54IGNvbXBhdGliaWxpdHlcbi8vIE1hbmlwdWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0Ym9keVxuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdGpRdWVyeS5ub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSA/XG5cblx0XHRlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGJvZHlcIilbMF0gfHxcblx0XHRcdGVsZW0uYXBwZW5kQ2hpbGQoIGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIikgKSA6XG5cdFx0ZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gbnVsbCkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHR2YXIgbWF0Y2ggPSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTtcblxuXHRpZiAoIG1hdGNoICkge1xuXHRcdGVsZW0udHlwZSA9IG1hdGNoWyAxIF07XG5cdH0gZWxzZSB7XG5cdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YV9wcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sIFwiZ2xvYmFsRXZhbFwiLCAhcmVmRWxlbWVudHMgfHwgZGF0YV9wcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0dmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YV9wcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YV9wcml2LmFjY2Vzcyggc3JjICk7XG5cdFx0cGRhdGFDdXIgPSBkYXRhX3ByaXYuc2V0KCBkZXN0LCBwZGF0YU9sZCApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTtcblx0XHRcdHBkYXRhQ3VyLmV2ZW50cyA9IHt9O1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhX3VzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhX3VzZXIuYWNjZXNzKCBzcmMgKTtcblx0XHR1ZGF0YUN1ciA9IGpRdWVyeS5leHRlbmQoIHt9LCB1ZGF0YU9sZCApO1xuXG5cdFx0ZGF0YV91c2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHtcblx0dmFyIHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHRjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgPyBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCBcIipcIiApIDpcblx0XHRcdFtdO1xuXG5cdHJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/XG5cdFx0alF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICkgOlxuXHRcdHJldDtcbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXG5cdFx0Ly8gRml4IElFIGNsb25pbmcgaXNzdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJlxuXHRcdFx0XHQhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cDovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRidWlsZEZyYWdtZW50OiBmdW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiApIHtcblx0XHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLFxuXHRcdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRcdG5vZGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRcdGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBRdFdlYktpdCwgUGhhbnRvbUpTXG5cdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0XHQvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcblx0XHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0XHQvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXNcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudChcImRpdlwiKSApO1xuXG5cdFx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHRcdHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBlbGVtLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdFx0Ly8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50XG5cdFx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHRcdHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXQsIFBoYW50b21KU1xuXHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApO1xuXG5cdFx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdFx0Ly8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKVxuXHRcdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50XG5cdFx0ZnJhZ21lbnQudGV4dENvbnRlbnQgPSBcIlwiO1xuXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoZWxlbSA9IG5vZGVzWyBpKysgXSkgKSB7XG5cblx0XHRcdC8vICM0MDg3IC0gSWYgb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBlbGVtZW50cyBhcmUgdGhlIHNhbWUsIGFuZCB0aGlzIGlzXG5cdFx0XHQvLyB0aGF0IGVsZW1lbnQsIGRvIG5vdCBkbyBhbnl0aGluZ1xuXHRcdFx0aWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApICE9PSAtMSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0XHR0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksIFwic2NyaXB0XCIgKTtcblxuXHRcdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdFx0aWYgKCBjb250YWlucyApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggdG1wICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRcdGlmICggc2NyaXB0cyApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSB0bXBbIGorKyBdKSApIHtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0XHRzY3JpcHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZnJhZ21lbnQ7XG5cdH0sXG5cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cdFx0dmFyIGRhdGEsIGVsZW0sIHR5cGUsIGtleSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoZWxlbSA9IGVsZW1zWyBpIF0pICE9PSB1bmRlZmluZWQ7IGkrKyApIHtcblx0XHRcdGlmICggalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0a2V5ID0gZWxlbVsgZGF0YV9wcml2LmV4cGFuZG8gXTtcblxuXHRcdFx0XHRpZiAoIGtleSAmJiAoZGF0YSA9IGRhdGFfcHJpdi5jYWNoZVsga2V5IF0pICkge1xuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZFxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGRhdGFfcHJpdi5jYWNoZVsga2V5IF0gKSB7XG5cdFx0XHRcdFx0XHQvLyBEaXNjYXJkIGFueSByZW1haW5pbmcgYHByaXZhdGVgIGRhdGFcblx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gRGlzY2FyZCBhbnkgcmVtYWluaW5nIGB1c2VyYCBkYXRhXG5cdFx0XHRkZWxldGUgZGF0YV91c2VyLmNhY2hlWyBlbGVtWyBkYXRhX3VzZXIuZXhwYW5kbyBdIF07XG5cdFx0fVxuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS50ZXh0KCB0aGlzICkgOlxuXHRcdFx0XHR0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGVsZW1zID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgdGhpcyApIDogdGhpcyxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0gKSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkge1xuXHRcdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzXG5cdFx0XHRcdGVsZW0udGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcblx0XHRkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7XG5cblx0XHRyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoKCBlICkge31cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHR0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBhcmcgPSBhcmd1bWVudHNbIDAgXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRhcmcgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cblx0XHRcdGlmICggYXJnICkge1xuXHRcdFx0XHRhcmcucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBGb3JjZSByZW1vdmFsIGlmIHRoZXJlIHdhcyBubyBuZXcgY29udGVudCAoZS5nLiwgZnJvbSBlbXB0eSBhcmd1bWVudHMpXG5cdFx0cmV0dXJuIGFyZyAmJiAoYXJnLmxlbmd0aCB8fCBhcmcubm9kZVR5cGUpID8gdGhpcyA6IHRoaXMucmVtb3ZlKCk7XG5cdH0sXG5cblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlKCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdGRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHRcdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2V0ID0gdGhpcyxcblx0XHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdC8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdFxuXHRcdGlmICggaXNGdW5jdGlvbiB8fFxuXHRcdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHRcdHZhciBzZWxmID0gc2V0LmVxKCBpbmRleCApO1xuXHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdFx0YXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2VsZi5kb21NYW5pcCggYXJncywgY2FsbGJhY2sgKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICggbCApIHtcblx0XHRcdGZyYWdtZW50ID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIGFyZ3MsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgdGhpcyApO1xuXHRcdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGZpcnN0ICkge1xuXHRcdFx0XHRzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgXCJzY3JpcHRcIiApLCBkaXNhYmxlU2NyaXB0ICk7XG5cdFx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cFxuXHRcdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IGZyYWdtZW50O1xuXG5cdFx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdFx0Ly8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvblxuXHRcdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBRdFdlYktpdFxuXHRcdFx0XHRcdFx0XHQvLyBqUXVlcnkubWVyZ2UgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjYWxsYmFjay5jYWxsKCB0aGlzWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdFx0Ly8gUmVlbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRcdGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTtcblxuXHRcdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBzY3JpcHRzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdFx0IWRhdGFfcHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiYgalF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUuc3JjICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKHtcblx0YXBwZW5kVG86IFwiYXBwZW5kXCIsXG5cdHByZXBlbmRUbzogXCJwcmVwZW5kXCIsXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcblx0aW5zZXJ0QWZ0ZXI6IFwiYWZ0ZXJcIixcblx0cmVwbGFjZUFsbDogXCJyZXBsYWNlV2l0aFwiXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBlbGVtcyxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxuXHRcdFx0bGFzdCA9IGluc2VydC5sZW5ndGggLSAxLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkge1xuXHRcdFx0ZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTtcblx0XHRcdGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXRcblx0XHRcdC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Ncblx0XHRcdHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSk7XG5cblxudmFyIGlmcmFtZSxcblx0ZWxlbWRpc3BsYXkgPSB7fTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIGRpc3BsYXkgb2YgYSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBub2RlTmFtZSBvZiB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IGRvYyBEb2N1bWVudCBvYmplY3RcbiAqL1xuLy8gQ2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gZGVmYXVsdERpc3BsYXlcbmZ1bmN0aW9uIGFjdHVhbERpc3BsYXkoIG5hbWUsIGRvYyApIHtcblx0dmFyIHN0eWxlLFxuXHRcdGVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVtZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9jLmJvZHkgKSxcblxuXHRcdC8vIGdldERlZmF1bHRDb21wdXRlZFN0eWxlIG1pZ2h0IGJlIHJlbGlhYmx5IHVzZWQgb25seSBvbiBhdHRhY2hlZCBlbGVtZW50XG5cdFx0ZGlzcGxheSA9IHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSAmJiAoIHN0eWxlID0gd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlKCBlbGVtWyAwIF0gKSApID9cblxuXHRcdFx0Ly8gVXNlIG9mIHRoaXMgbWV0aG9kIGlzIGEgdGVtcG9yYXJ5IGZpeCAobW9yZSBsaWtlIG9wdGltaXphdGlvbikgdW50aWwgc29tZXRoaW5nIGJldHRlciBjb21lcyBhbG9uZyxcblx0XHRcdC8vIHNpbmNlIGl0IHdhcyByZW1vdmVkIGZyb20gc3BlY2lmaWNhdGlvbiBhbmQgc3VwcG9ydGVkIG9ubHkgaW4gRkZcblx0XHRcdHN0eWxlLmRpc3BsYXkgOiBqUXVlcnkuY3NzKCBlbGVtWyAwIF0sIFwiZGlzcGxheVwiICk7XG5cblx0Ly8gV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSBzdG9yZWQgb24gdGhlIGVsZW1lbnQsXG5cdC8vIHNvIHVzZSBcImRldGFjaFwiIG1ldGhvZCBhcyBmYXN0IHdheSB0byBnZXQgcmlkIG9mIHRoZSBlbGVtZW50XG5cdGVsZW0uZGV0YWNoKCk7XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG5cbi8qKlxuICogVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZVxuICovXG5mdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7XG5cdHZhciBkb2MgPSBkb2N1bWVudCxcblx0XHRkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07XG5cblx0aWYgKCAhZGlzcGxheSApIHtcblx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXG5cdFx0Ly8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1lXG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiB8fCAhZGlzcGxheSApIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxlXG5cdFx0XHRpZnJhbWUgPSAoaWZyYW1lIHx8IGpRdWVyeSggXCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+XCIgKSkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVsZW1lbnQgKTtcblxuXHRcdFx0Ly8gQWx3YXlzIHdyaXRlIGEgbmV3IEhUTUwgc2tlbGV0b24gc28gV2Via2l0IGFuZCBGaXJlZm94IGRvbid0IGNob2tlIG9uIHJldXNlXG5cdFx0XHRkb2MgPSBpZnJhbWVbIDAgXS5jb250ZW50RG9jdW1lbnQ7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0XHRkb2Mud3JpdGUoKTtcblx0XHRcdGRvYy5jbG9zZSgpO1xuXG5cdFx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXHRcdFx0aWZyYW1lLmRldGFjaCgpO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheVxuXHRcdGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTtcblx0fVxuXG5cdHJldHVybiBkaXNwbGF5O1xufVxudmFyIHJtYXJnaW4gPSAoL15tYXJnaW4vKTtcblxudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0Ly8gU3VwcG9ydDogSUU8PTExKywgRmlyZWZveDw9MzArICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHRpZiAoIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5vcGVuZXIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTtcblx0fTtcblxuXG5cbmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7XG5cdHZhciB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLCByZXQsXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdC8vIGdldFByb3BlcnR5VmFsdWUgaXMgb25seSBuZWVkZWQgZm9yIC5jc3MoJ2ZpbHRlcicpICgjMTI1MzcpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cdH1cblxuXHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgPCA2XG5cdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdC8vIGlPUyA8IDYgKGF0IGxlYXN0KSByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIGEgbGFyZ2VyIHNldCBvZiB2YWx1ZXMsIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHNcblx0XHQvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBybWFyZ2luLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cdFx0Ly8gU3VwcG9ydDogSUVcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICh0aGlzLmdldCA9IGhvb2tGbikuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG4oZnVuY3Rpb24oKSB7XG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCxcblx0XHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4O1wiICtcblx0XHRcInBvc2l0aW9uOmFic29sdXRlXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVQaXhlbFBvc2l0aW9uQW5kQm94U2l6aW5nUmVsaWFibGUoKSB7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjNcblx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtcIiArXG5cdFx0XHRcImJveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MSU7dG9wOjElO1wiICtcblx0XHRcdFwiYm9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGVcIjtcblx0XHRkaXYuaW5uZXJIVE1MID0gXCJcIjtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYsIG51bGwgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cdFx0Ym94U2l6aW5nUmVsaWFibGVWYWwgPSBkaXZTdHlsZS53aWR0aCA9PT0gXCI0cHhcIjtcblxuXHRcdGRvY0VsZW0ucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogbm9kZS5qcyBqc2RvbVxuXHQvLyBEb24ndCBhc3N1bWUgdGhhdCBnZXRDb21wdXRlZFN0eWxlIGlzIGEgcHJvcGVydHkgb2YgdGhlIGdsb2JhbCBvYmplY3Rcblx0aWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCBzdXBwb3J0LCB7XG5cdFx0XHRwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBUaGlzIHRlc3QgaXMgZXhlY3V0ZWQgb25seSBvbmNlIGJ1dCB3ZSBzdGlsbCBkbyBtZW1vaXppbmdcblx0XHRcdFx0Ly8gc2luY2Ugd2UgY2FuIHVzZSB0aGUgYm94U2l6aW5nUmVsaWFibGUgcHJlLWNvbXB1dGluZy5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byBjaGVjayBpZiB0aGUgdGVzdCB3YXMgYWxyZWFkeSBwZXJmb3JtZWQsIHRob3VnaC5cblx0XHRcdFx0Y29tcHV0ZVBpeGVsUG9zaXRpb25BbmRCb3hTaXppbmdSZWxpYWJsZSgpO1xuXHRcdFx0XHRyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDtcblx0XHRcdH0sXG5cdFx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdFx0fSxcblx0XHRcdHJlbGlhYmxlTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHRcdC8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHlcblx0XHRcdFx0Ly8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiAoIzMzMzMpXG5cdFx0XHRcdC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodFxuXHRcdFx0XHQvLyBUaGlzIHN1cHBvcnQgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBvbmNlIHNvIG5vIG1lbW9pemluZyBpcyBuZWVkZWQuXG5cdFx0XHRcdHZhciByZXQsXG5cdFx0XHRcdFx0bWFyZ2luRGl2ID0gZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHRcdFx0XHQvLyBSZXNldCBDU1M6IGJveC1zaXppbmc7IGRpc3BsYXk7IG1hcmdpbjsgYm9yZGVyOyBwYWRkaW5nXG5cdFx0XHRcdG1hcmdpbkRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFuZHJvaWQgMi4zXG5cdFx0XHRcdFx0Ly8gVmVuZG9yLXByZWZpeCBib3gtc2l6aW5nXG5cdFx0XHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O1wiICtcblx0XHRcdFx0XHRcImJveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjBcIjtcblx0XHRcdFx0bWFyZ2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gXCIwXCI7XG5cdFx0XHRcdGRpdi5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XG5cdFx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0XHRcdHJldCA9ICFwYXJzZUZsb2F0KCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkubWFyZ2luUmlnaHQgKTtcblxuXHRcdFx0XHRkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0XHRcdFx0ZGl2LnJlbW92ZUNoaWxkKCBtYXJnaW5EaXYgKTtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KSgpO1xuXG5cbi8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMuXG5qUXVlcnkuc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjaywgYXJncyApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhclxuXHQvLyBTd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxuXHQvLyBTZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXlcblx0cmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFxuXHRybnVtc3BsaXQgPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKC4qKSRcIiwgXCJpXCIgKSxcblx0cnJlbE51bSA9IG5ldyBSZWdFeHAoIFwiXihbKy1dKT0oXCIgKyBwbnVtICsgXCIpXCIsIFwiaVwiICksXG5cblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH0sXG5cblx0Y3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiT1wiLCBcIk1velwiLCBcIm1zXCIgXTtcblxuLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBuYW1lICkge1xuXG5cdC8vIFNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkXG5cdGlmICggbmFtZSBpbiBzdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLFxuXHRcdG9yaWdOYW1lID0gbmFtZSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb3JpZ05hbWU7XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cdHZhciBtYXRjaGVzID0gcm51bXNwbGl0LmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAxIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAyIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMgKSB7XG5cdHZhciBpID0gZXh0cmEgPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSA/XG5cdFx0Ly8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJlbWVudCwgYXZvaWQgYXVnbWVudGF0aW9uXG5cdFx0NCA6XG5cdFx0Ly8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllc1xuXHRcdG5hbWUgPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXG5cdFx0dmFsID0gMDtcblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cdFx0Ly8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luLCBzbyBhZGQgaXQgaWYgd2Ugd2FudCBpdFxuXHRcdGlmICggZXh0cmEgPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0JvcmRlckJveCApIHtcblx0XHRcdC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudFxuXHRcdFx0aWYgKCBleHRyYSA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBtYXJnaW4sIHNvIHJlbW92ZSBib3JkZXJcblx0XHRcdGlmICggZXh0cmEgIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZ1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWVcblx0dmFyIHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLFxuXHRcdHZhbCA9IG5hbWUgPT09IFwid2lkdGhcIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCxcblx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0Ly8gU29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkXG5cdC8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NVxuXHQvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2Njhcblx0aWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHtcblx0XHQvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3Nhcnlcblx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdGlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdHZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLlxuXHRcdGlmICggcm51bW5vbnB4LnRlc3QodmFsKSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0XHQvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmXG5cdFx0XHQoIHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApO1xuXG5cdFx0Ly8gTm9ybWFsaXplIFwiXCIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuXHRcdHZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7XG5cdH1cblxuXHQvLyBVc2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlc1xuXHRyZXR1cm4gKCB2YWwgK1xuXHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0ZWxlbSxcblx0XHRcdG5hbWUsXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXG5cdFx0XHR2YWx1ZUlzQm9yZGVyQm94LFxuXHRcdFx0c3R5bGVzXG5cdFx0KVxuXHQpICsgXCJweFwiO1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLCBoaWRkZW4sXG5cdFx0dmFsdWVzID0gW10sXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YV9wcml2LmdldCggZWxlbSwgXCJvbGRkaXNwbGF5XCIgKTtcblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblx0XHRcdC8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXNcblx0XHRcdC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3Rcblx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBvdmVycmlkZGVuIHdpdGggZGlzcGxheTogbm9uZVxuXHRcdFx0Ly8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXNcblx0XHRcdC8vIGZvciBzdWNoIGFuIGVsZW1lbnRcblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuKCBlbGVtICkgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIFwib2xkZGlzcGxheVwiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRoaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApO1xuXG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiIHx8ICFoaWRkZW4gKSB7XG5cdFx0XHRcdGRhdGFfcHJpdi5zZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiLCBoaWRkZW4gPyBkaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wXG5cdC8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3dcblx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAoICFzaG93IHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCBcIlwiIDogXCJub25lXCI7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZXh0ZW5kKHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiY29sdW1uQ291bnRcIjogdHJ1ZSxcblx0XHRcImZpbGxPcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJmbGV4R3Jvd1wiOiB0cnVlLFxuXHRcdFwiZmxleFNocmlua1wiOiB0cnVlLFxuXHRcdFwiZm9udFdlaWdodFwiOiB0cnVlLFxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxuXHRcdFwib3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwib3JkZXJcIjogdHJ1ZSxcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcblx0XHRcIndpZG93c1wiOiB0cnVlLFxuXHRcdFwiekluZGV4XCI6IHRydWUsXG5cdFx0XCJ6b29tXCI6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHtcblx0XHRcImZsb2F0XCI6IFwiY3NzRmxvYXRcIlxuXHR9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG9yaWdOYW1lICkgKTtcblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgKHJldCA9IHJyZWxOdW0uZXhlYyggdmFsdWUgKSkgKSB7XG5cdFx0XHRcdHZhbHVlID0gKCByZXRbMV0gKyAxICkgKiByZXRbMl0gKyBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICkgKTtcblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7XG5cdFx0XHRcdHZhbHVlICs9IFwicHhcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgIShcInNldFwiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XG5cdFx0XHRyZXR1cm4gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHtcblx0XHR2YXIgdmFsLCBudW0sIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTtcblxuXHRcdC8vIFRyeSBwcmVmaXhlZCBuYW1lIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIG5hbWVcblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0XG5cdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBcIm5vcm1hbFwiIHRvIGNvbXB1dGVkIHZhbHVlXG5cdFx0aWYgKCB2YWwgPT09IFwibm9ybWFsXCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7XG5cdFx0XHR2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWNcblx0XHRpZiAoIGV4dHJhID09PSBcIlwiIHx8IGV4dHJhICkge1xuXHRcdFx0bnVtID0gcGFyc2VGbG9hdCggdmFsICk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgalF1ZXJ5LmlzTnVtZXJpYyggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJiBlbGVtLm9mZnNldFdpZHRoID09PSAwID9cblx0XHRcdFx0XHRqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdFx0XHR9KSA6XG5cdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgP1xuXHRcdFx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0XHRzdHlsZXNcblx0XHRcdFx0KSA6IDBcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xufSk7XG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luUmlnaHQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIHsgXCJkaXNwbGF5XCI6IFwiaW5saW5lLWJsb2NrXCIgfSxcblx0XHRcdFx0Y3VyQ1NTLCBbIGVsZW0sIFwibWFyZ2luUmlnaHRcIiBdICk7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCh7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdChcIiBcIikgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0Y3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0dmFyIHN0eWxlcywgbGVuLFxuXHRcdFx0XHRtYXAgPSB7fSxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW4oIHRoaXMgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuc2hvdygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgXCJzd2luZ1wiO1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJlxuXHRcdFx0XHQoIXR3ZWVuLmVsZW0uc3R5bGUgfHwgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwpICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMuXG5cdFx0XHQvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdDtcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMtaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cdFx0XHQvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kIFwiYXV0b1wiIGFyZSBjb252ZXJ0ZWQgdG8gMC5cblx0XHRcdHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gXCJhdXRvXCIgPyAwIDogcmVzdWx0O1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLnN0eWxlICYmICggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8IGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUU5XG4vLyBQYW5pYyBiYXNlZCBhcHByb2FjaCB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHtcblx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5lYXNpbmcgPSB7XG5cdGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIHA7XG5cdH0sXG5cdHN3aW5nOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAgKiBNYXRoLlBJICkgLyAyO1xuXHR9XG59O1xuXG5qUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDtcblxuLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnRcbmpRdWVyeS5meC5zdGVwID0ge307XG5cblxuXG5cbnZhclxuXHRmeE5vdywgdGltZXJJZCxcblx0cmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sXG5cdHJmeG51bSA9IG5ldyBSZWdFeHAoIFwiXig/OihbKy1dKT18KShcIiArIHBudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICksXG5cdHJydW4gPSAvcXVldWVIb29rcyQvLFxuXHRhbmltYXRpb25QcmVmaWx0ZXJzID0gWyBkZWZhdWx0UHJlZmlsdGVyIF0sXG5cdHR3ZWVuZXJzID0ge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksXG5cdFx0XHRcdHRhcmdldCA9IHR3ZWVuLmN1cigpLFxuXHRcdFx0XHRwYXJ0cyA9IHJmeG51bS5leGVjKCB2YWx1ZSApLFxuXHRcdFx0XHR1bml0ID0gcGFydHMgJiYgcGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdFx0XHQvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlc1xuXHRcdFx0XHRzdGFydCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiArdGFyZ2V0ICkgJiZcblx0XHRcdFx0XHRyZnhudW0uZXhlYyggalF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgcHJvcCApICksXG5cdFx0XHRcdHNjYWxlID0gMSxcblx0XHRcdFx0bWF4SXRlcmF0aW9ucyA9IDIwO1xuXG5cdFx0XHRpZiAoIHN0YXJ0ICYmIHN0YXJ0WyAzIF0gIT09IHVuaXQgKSB7XG5cdFx0XHRcdC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3Ncblx0XHRcdFx0dW5pdCA9IHVuaXQgfHwgc3RhcnRbIDMgXTtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0XHRcdHBhcnRzID0gcGFydHMgfHwgW107XG5cblx0XHRcdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRcdFx0c3RhcnQgPSArdGFyZ2V0IHx8IDE7XG5cblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdC8vIElmIHByZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3VibGUgdW50aWwgd2UgZ2V0ICpzb21ldGhpbmcqLlxuXHRcdFx0XHRcdC8vIFVzZSBzdHJpbmcgZm9yIGRvdWJsaW5nIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93XG5cdFx0XHRcdFx0c2NhbGUgPSBzY2FsZSB8fCBcIi41XCI7XG5cblx0XHRcdFx0XHQvLyBBZGp1c3QgYW5kIGFwcGx5XG5cdFx0XHRcdFx0c3RhcnQgPSBzdGFydCAvIHNjYWxlO1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgcHJvcCwgc3RhcnQgKyB1bml0ICk7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKCksXG5cdFx0XHRcdC8vIGJyZWFrIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2hcblx0XHRcdFx0fSB3aGlsZSAoIHNjYWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIoKSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSB0d2VlbiBwcm9wZXJ0aWVzXG5cdFx0XHRpZiAoIHBhcnRzICkge1xuXHRcdFx0XHRzdGFydCA9IHR3ZWVuLnN0YXJ0ID0gK3N0YXJ0IHx8ICt0YXJnZXQgfHwgMDtcblx0XHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHRcdC8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvblxuXHRcdFx0XHR0d2Vlbi5lbmQgPSBwYXJ0c1sgMSBdID9cblx0XHRcdFx0XHRzdGFydCArICggcGFydHNbIDEgXSArIDEgKSAqIHBhcnRzWyAyIF0gOlxuXHRcdFx0XHRcdCtwYXJ0c1sgMiBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH07XG5cbi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHlcbmZ1bmN0aW9uIGNyZWF0ZUZ4Tm93KCkge1xuXHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9KTtcblx0cmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRpID0gMCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07XG5cblx0Ly8gSWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNCA7IGkgKz0gMiAtIGluY2x1ZGVXaWR0aCApIHtcblx0XHR3aGljaCA9IGNzc0V4cGFuZFsgaSBdO1xuXHRcdGF0dHJzWyBcIm1hcmdpblwiICsgd2hpY2ggXSA9IGF0dHJzWyBcInBhZGRpbmdcIiArIHdoaWNoIF0gPSB0eXBlO1xuXHR9XG5cblx0aWYgKCBpbmNsdWRlV2lkdGggKSB7XG5cdFx0YXR0cnMub3BhY2l0eSA9IGF0dHJzLndpZHRoID0gdHlwZTtcblx0fVxuXG5cdHJldHVybiBhdHRycztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7XG5cdHZhciB0d2Vlbixcblx0XHRjb2xsZWN0aW9uID0gKCB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICh0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApKSApIHtcblxuXHRcdFx0Ly8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBob29rcywgb2xkZmlyZSwgZGlzcGxheSwgY2hlY2tEaXNwbGF5LFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YV9wcml2LmdldCggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIEhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXNcblx0aWYgKCAhb3B0cy5xdWV1ZSApIHtcblx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgXCJmeFwiICk7XG5cdFx0aWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkge1xuXHRcdFx0aG9va3MudW5xdWV1ZWQgPSAwO1xuXHRcdFx0b2xkZmlyZSA9IGhvb2tzLmVtcHR5LmZpcmU7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggIWhvb2tzLnVucXVldWVkICkge1xuXHRcdFx0XHRcdG9sZGZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0aG9va3MudW5xdWV1ZWQrKztcblxuXHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gRW5zdXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVyIGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBjb21wbGV0ZXNcblx0XHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gSGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3Ncblx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCJoZWlnaHRcIiBpbiBwcm9wcyB8fCBcIndpZHRoXCIgaW4gcHJvcHMgKSApIHtcblx0XHQvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXRcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFOS0xMCBkbyBub3Rcblx0XHQvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmRcblx0XHQvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZVxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gaW5saW5lLWJsb2NrIGZvciBoZWlnaHQvd2lkdGhcblx0XHQvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkXG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cblx0XHQvLyBUZXN0IGRlZmF1bHQgZGlzcGxheSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSBcIm5vbmVcIlxuXHRcdGNoZWNrRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID9cblx0XHRcdGRhdGFfcHJpdi5nZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiICkgfHwgZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXk7XG5cblx0XHRpZiAoIGNoZWNrRGlzcGxheSA9PT0gXCJpbmxpbmVcIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBzaG93L2hpZGUgcGFzc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGRhdGFTaG93IGxlZnQgb3ZlciBmcm9tIGEgc3RvcHBlZCBoaWRlIG9yIHNob3cgYW5kIHdlIGFyZSBnb2luZyB0byBwcm9jZWVkIHdpdGggc2hvdywgd2Ugc2hvdWxkIHByZXRlbmQgdG8gYmUgaGlkZGVuXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXG5cdFx0Ly8gQW55IG5vbi1meCB2YWx1ZSBzdG9wcyB1cyBmcm9tIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXNwbGF5ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0aWYgKCBkYXRhU2hvdyApIHtcblx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhU2hvdyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIFwiZnhzaG93XCIsIHt9ICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgc3RhdGUgaWYgaXRzIHRvZ2dsZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byBcInJldmVyc2VcIlxuXHRcdGlmICggdG9nZ2xlICkge1xuXHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHR9XG5cdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRqUXVlcnkoIGVsZW0gKS5zaG93KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFuaW0uZG9uZShmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5KCBlbGVtICkuaGlkZSgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGFuaW0uZG9uZShmdW5jdGlvbigpIHtcblx0XHRcdHZhciBwcm9wO1xuXG5cdFx0XHRkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0dHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblxuXHRcdFx0aWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7XG5cdFx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDtcblx0XHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdFx0dHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdFx0dHdlZW4uc3RhcnQgPSBwcm9wID09PSBcIndpZHRoXCIgfHwgcHJvcCA9PT0gXCJoZWlnaHRcIiA/IDEgOiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdC8vIElmIHRoaXMgaXMgYSBub29wIGxpa2UgLmhpZGUoKS5oaWRlKCksIHJlc3RvcmUgYW4gb3ZlcndyaXR0ZW4gZGlzcGxheSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCAoZGlzcGxheSA9PT0gXCJub25lXCIgPyBkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApIDogZGlzcGxheSkgPT09IFwiaW5saW5lXCIgKSB7XG5cdFx0c3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApO1xuXHRcdGVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTtcblx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdO1xuXHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGFuaW1hdGlvblByZWZpbHRlcnMubGVuZ3RoLFxuXHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9KSxcblx0XHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSk7XG5cblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSh7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9IH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXHRcdFx0XHRcdC8vIElmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVuc1xuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxuXHRcdFx0XHRcdGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7XG5cdFx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9KSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdHJlc3VsdCA9IGFuaW1hdGlvblByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xuXHRcdGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApO1xuXHR9XG5cblx0alF1ZXJ5LmZ4LnRpbWVyKFxuXHRcdGpRdWVyeS5leHRlbmQoIHRpY2ssIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRhbmltOiBhbmltYXRpb24sXG5cdFx0XHRxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWVcblx0XHR9KVxuXHQpO1xuXG5cdC8vIGF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdHJldHVybiBhbmltYXRpb24ucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5zcGxpdChcIiBcIik7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdHR3ZWVuZXJzWyBwcm9wIF0gPSB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xuXHRcdFx0dHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRhbmltYXRpb25QcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFuaW1hdGlvblByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsXG5cdFx0ZHVyYXRpb246IHNwZWVkLFxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gXCJudW1iZXJcIiA/IG9wdC5kdXJhdGlvbiA6XG5cdFx0b3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7XG5cblx0Ly8gTm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXG5cdGlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkge1xuXHRcdG9wdC5xdWV1ZSA9IFwiZnhcIjtcblx0fVxuXG5cdC8vIFF1ZXVlaW5nXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XG5cblx0b3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gU2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFfcHJpdi5nZXQoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFfcHJpdi5nZXQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZC5cblx0XHRcdC8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2hcblx0XHRcdC8vIHdpbGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC5cblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YV9wcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSBcImJvb2xlYW5cIiA/XG5cdFx0XHRjc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOlxuXHRcdFx0dGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKHtcblx0c2xpZGVEb3duOiBnZW5GeChcInNob3dcIiksXG5cdHNsaWRlVXA6IGdlbkZ4KFwiaGlkZVwiKSxcblx0c2xpZGVUb2dnbGU6IGdlbkZ4KFwidG9nZ2xlXCIpLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0pO1xuXG5qUXVlcnkudGltZXJzID0gW107XG5qUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgdGltZXIsXG5cdFx0aSA9IDAsXG5cdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycztcblxuXHRmeE5vdyA9IGpRdWVyeS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblx0XHQvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWRcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRpZiAoIHRpbWVyKCkgKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnRpbWVycy5wb3AoKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5cbmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXHRpZiAoICF0aW1lcklkICkge1xuXHRcdHRpbWVySWQgPSBzZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHR9XG59O1xuXG5qUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRjbGVhckludGVydmFsKCB0aW1lcklkICk7XG5cdHRpbWVySWQgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cdC8vIERlZmF1bHQgc3BlZWRcblx0X2RlZmF1bHQ6IDQwMFxufTtcblxuXG4vLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uXG4vLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSk7XG59O1xuXG5cbihmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBpT1M8PTUuMSwgQW5kcm9pZDw9NC4yK1xuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8PTIuM1xuXHQvLyBPcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZSBpbmNvcnJlY3RseSBtYXJrZWQgYXMgZGlzYWJsZWRcblx0c2VsZWN0LmRpc2FibGVkID0gdHJ1ZTtcblx0c3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59KSgpO1xuXG5cbnZhciBub2RlSG9vaywgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBkb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBzdHJ1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2VyY2FzZVxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyBcIlwiICk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID9cblx0XHRcdFx0dW5kZWZpbmVkIDpcblx0XHRcdFx0cmV0O1xuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsIHByb3BOYW1lLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAobmFtZSA9IGF0dHJOYW1lc1tpKytdKSApIHtcblx0XHRcdFx0cHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cblx0XHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGdldCBzcGVjaWFsIHRyZWF0bWVudCAoIzEwODcwKVxuXHRcdFx0XHRpZiAoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRcdC8vIFNldCBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHRvIGZhbHNlXG5cdFx0XHRcdFx0ZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0YXR0ckhvb2tzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmXG5cdFx0XHRcdFx0alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgcmV0LCBoYW5kbGU7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBuYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSBoYW5kbGU7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG59KTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdO1xuXHRcdH0pO1xuXHR9XG59KTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fSxcblxuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsIG5vdHhtbCxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTtcblxuXHRcdGlmICggbm90eG1sICkge1xuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybiBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyZXQgOlxuXHRcdFx0XHQoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCA/XG5cdFx0XHRcdHJldCA6XG5cdFx0XHRcdGVsZW1bIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmhhc0F0dHJpYnV0ZSggXCJ0YWJpbmRleFwiICkgfHwgcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgZWxlbS5ocmVmID9cblx0XHRcdFx0XHRlbGVtLnRhYkluZGV4IDpcblx0XHRcdFx0XHQtMTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKFtcblx0XCJ0YWJJbmRleFwiLFxuXHRcInJlYWRPbmx5XCIsXG5cdFwibWF4TGVuZ3RoXCIsXG5cdFwiY2VsbFNwYWNpbmdcIixcblx0XCJjZWxsUGFkZGluZ1wiLFxuXHRcInJvd1NwYW5cIixcblx0XCJjb2xTcGFuXCIsXG5cdFwidXNlTWFwXCIsXG5cdFwiZnJhbWVCb3JkZXJcIixcblx0XCJjb250ZW50RWRpdGFibGVcIlxuXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7XG59KTtcblxuXG5cblxudmFyIHJjbGFzcyA9IC9bXFx0XFxyXFxuXFxmXS9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdHByb2NlZWQgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIHByb2NlZWQgKSB7XG5cdFx0XHQvLyBUaGUgZGlzanVuY3Rpb24gaGVyZSBpcyBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIHJlbW92ZUNsYXNzKVxuXHRcdFx0Y2xhc3NlcyA9ICggdmFsdWUgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF07XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/XG5cdFx0XHRcdFx0KCBcIiBcIiArIGVsZW0uY2xhc3NOYW1lICsgXCIgXCIgKS5yZXBsYWNlKCByY2xhc3MsIFwiIFwiICkgOlxuXHRcdFx0XHRcdFwiIFwiXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBvbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBqUXVlcnkudHJpbSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0cHJvY2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmICggcHJvY2VlZCApIHtcblx0XHRcdGNsYXNzZXMgPSAoIHZhbHVlIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdO1xuXHRcdFx0XHQvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKVxuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgP1xuXHRcdFx0XHRcdCggXCIgXCIgKyBlbGVtLmNsYXNzTmFtZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApIDpcblx0XHRcdFx0XHRcIlwiXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPj0gMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjdXIgKSA6IFwiXCI7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHtcblx0XHR2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdGlmICggdHlwZW9mIHN0YXRlVmFsID09PSBcImJvb2xlYW5cIiAmJiB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlVmFsID8gdGhpcy5hZGRDbGFzcyggdmFsdWUgKSA6IHRoaXMucmVtb3ZlQ2xhc3MoIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnRvZ2dsZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGksIHRoaXMuY2xhc3NOYW1lLCBzdGF0ZVZhbCksIHN0YXRlVmFsICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHR2YXIgY2xhc3NOYW1lLFxuXHRcdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRcdHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0XHRjbGFzc05hbWVzID0gdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRcdHdoaWxlICggKGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdKSApIHtcblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gc3RydW5kZWZpbmVkIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0XHRpZiAoIHRoaXMuY2xhc3NOYW1lICkge1xuXHRcdFx0XHRcdC8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXRcblx0XHRcdFx0XHRkYXRhX3ByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgdGhpcy5jbGFzc05hbWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkIGBmYWxzZWAsXG5cdFx0XHRcdC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksXG5cdFx0XHRcdC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cblx0XHRcdFx0dGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyBcIlwiIDogZGF0YV9wcml2LmdldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdGlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoXCIgXCIgKyB0aGlzW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKHJjbGFzcywgXCIgXCIpLmluZGV4T2YoIGNsYXNzTmFtZSApID49IDAgKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIGlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1swXTtcblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRcdHJldC5yZXBsYWNlKHJyZXR1cm4sIFwiXCIpIDpcblx0XHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0XHRyZXQgPT0gbnVsbCA/IFwiXCIgOiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHR2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCI7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoXCJzZXRcIiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0dmFsSG9va3M6IHtcblx0XHRvcHRpb246IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFMTAtMTErXG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdGpRdWVyeS50cmltKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIiB8fCBpbmRleCA8IDAsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoLFxuXHRcdFx0XHRcdGkgPSBpbmRleCA8IDAgP1xuXHRcdFx0XHRcdFx0bWF4IDpcblx0XHRcdFx0XHRcdG9uZSA/IGluZGV4IDogMDtcblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIElFNi05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKCMyNTUxKVxuXHRcdFx0XHRcdGlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJlxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCggc3VwcG9ydC5vcHREaXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0QXR0cmlidXRlKCBcImRpc2FibGVkXCIgKSA9PT0gbnVsbCApICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cdFx0XHRcdFx0aWYgKCAob3B0aW9uLnNlbGVjdGVkID0galF1ZXJ5LmluQXJyYXkoIG9wdGlvbi52YWx1ZSwgdmFsdWVzICkgPj0gMCkgKSB7XG5cdFx0XHRcdFx0XHRvcHRpb25TZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaChbIFwicmFkaW9cIiwgXCJjaGVja2JveFwiIF0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoZWxlbSkudmFsKCksIHZhbHVlICkgPj0gMCApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKCAhc3VwcG9ydC5jaGVja09uICkge1xuXHRcdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0pO1xuXG5cblxuXG4vLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRyaWJ1dGVzLW9ubHkgaW5jbHVzaW9uXG5cblxualF1ZXJ5LmVhY2goIChcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudVwiKS5zcGxpdChcIiBcIiksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH0sXG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyB0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XG5cdH1cbn0pO1xuXG5cbnZhciBub25jZSA9IGpRdWVyeS5ub3coKTtcblxudmFyIHJxdWVyeSA9ICgvXFw/Lyk7XG5cblxuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuLy8gV29ya2Fyb3VuZCBmYWlsdXJlIHRvIHN0cmluZy1jYXN0IG51bGwgaW5wdXRcbmpRdWVyeS5wYXJzZUpTT04gPSBmdW5jdGlvbiggZGF0YSApIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKyBcIlwiICk7XG59O1xuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sLCB0bXA7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTlcblx0dHJ5IHtcblx0XHR0bXAgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdFx0eG1sID0gdG1wLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyaGFzaCA9IC8jLiokLyxcblx0cnRzID0gLyhbPyZdKV89W14mXSovLFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvbWcsXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXHRydXJsID0gL14oW1xcdy4rLV0rOikoPzpcXC9cXC8oPzpbXlxcLz8jXSpAfCkoW15cXC8/IzpdKikoPzo6KFxcZCspfCl8KS8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uXG5cdGFsbFR5cGVzID0gXCIqL1wiLmNvbmNhdCggXCIqXCIgKSxcblxuXHQvLyBEb2N1bWVudCBsb2NhdGlvblxuXHRhamF4TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZixcblxuXHQvLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHNcblx0YWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdO1xuXG4vLyBCYXNlIFwiY29uc3RydWN0b3JcIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0XG5mdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHtcblxuXHQvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIFwiKlwiXG5cdHJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkge1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZnVuYyA9IGRhdGFUeXBlRXhwcmVzc2lvbjtcblx0XHRcdGRhdGFUeXBlRXhwcmVzc2lvbiA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdHZhciBkYXRhVHlwZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0ZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkge1xuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoZGF0YVR5cGUgPSBkYXRhVHlwZXNbaSsrXSkgKSB7XG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbMF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS51bnNoaWZ0KCBmdW5jICk7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdChzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiYgIXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoZGVlcCA9IHt9KSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1UeXBlXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZVxuXHRpZiAoIGN0ICkge1xuXHRcdGZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7XG5cdFx0XHRpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkge1xuXHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHJlc3BvbnNlIGZvciB0aGUgZXhwZWN0ZWQgZGF0YVR5cGVcblx0aWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7XG5cdFx0ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWzBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmVcblx0XHRmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlO1xuXHR9XG5cblx0Ly8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZVxuXHQvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZFxuXHQvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG5cdGlmICggZmluYWxEYXRhVHlwZSApIHtcblx0XHRpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkge1xuXHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdO1xuXHR9XG59XG5cbi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcbiAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7XG5cdHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBwcmV2LFxuXHRcdGNvbnZlcnRlcnMgPSB7fSxcblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgY29udjIgXTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudCA9IHRtcFsgMCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpXG5cdFx0XHRcdGlmICggY29udiAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW1cblx0XHRcdFx0XHRpZiAoIGNvbnYgJiYgc1sgXCJ0aHJvd3NcIiBdICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgc3RhdGU6IFwicGFyc2VyZXJyb3JcIiwgZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50IH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBhamF4TG9jYXRpb24sXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL3htbC8sXG5cdFx0XHRodG1sOiAvaHRtbC8sXG5cdFx0XHRqc29uOiAvanNvbi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogalF1ZXJ5LnBhcnNlSlNPTixcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXHRcdFx0Ly8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbVxuXHRcdFx0Y2FjaGVVUkwsXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXHRcdFx0Ly8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzXG5cdFx0XHRwYXJ0cyxcblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxuXHRcdFx0cyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYgKCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdGpRdWVyeS5ldmVudCxcblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXHRcdFx0Ly8gVGhlIGpxWEhSIHN0YXRlXG5cdFx0XHRzdGF0ZSA9IDAsXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXHRcdFx0Ly8gRmFrZSB4aHJcblx0XHRcdGpxWEhSID0ge1xuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxuXG5cdFx0XHRcdC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWRcblx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXHRcdFx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIChtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnNbIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0dmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVEZWZlcnJlZC5hZGQ7XG5cdFx0anFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7XG5cdFx0anFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsO1xuXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9tb3Rpb24pXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgYWpheExvY2F0aW9uICkgKyBcIlwiICkucmVwbGFjZSggcmhhc2gsIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNFxuXHRcdHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7XG5cblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XG5cdFx0cy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHdlIGhhdmUgYSBwcm90b2NvbDpob3N0OnBvcnQgbWlzbWF0Y2hcblx0XHRpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHtcblx0XHRcdHBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7XG5cdFx0XHRzLmNyb3NzRG9tYWluID0gISEoIHBhcnRzICYmXG5cdFx0XHRcdCggcGFydHNbIDEgXSAhPT0gYWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHxcblx0XHRcdFx0XHQoIHBhcnRzWyAzIF0gfHwgKCBwYXJ0c1sgMSBdID09PSBcImh0dHA6XCIgPyBcIjgwXCIgOiBcIjQ0M1wiICkgKSAhPT1cblx0XHRcdFx0XHRcdCggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gXCI4MFwiIDogXCI0NDNcIiApICkgKVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpXG5cdFx0ZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7XG5cblx0XHQvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzXG5cdFx0aWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcihcImFqYXhTdGFydFwiKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHRjYWNoZVVSTCA9IHMudXJsO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9ICggcy51cmwgKz0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuZGF0YSApO1xuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgP1xuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJhbWV0ZXIsIHNldCBpdHMgdmFsdWVcblx0XHRcdFx0XHRjYWNoZVVSTC5yZXBsYWNlKCBydHMsIFwiJDFfPVwiICsgbm9uY2UrKyApIDpcblxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmRcblx0XHRcdFx0XHRjYWNoZVVSTCArICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyBub25jZSsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gP1xuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJiAoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IHN0YXRlID09PSAyICkgKSB7XG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Zm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkge1xuXHRcdFx0anFYSFJbIGkgXSggc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGpxWEhSLmFib3J0KFwidGltZW91dFwiKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHN0YXRlID0gMTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0Ly8gUHJvcGFnYXRlIGV4Y2VwdGlvbiBhcyBlcnJvciBpZiBub3QgZG9uZVxuXHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0XHQvLyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lXG5cdFx0ZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7XG5cdFx0XHR2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLFxuXHRcdFx0XHRzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dDtcblxuXHRcdFx0Ly8gQ2FsbGVkIG9uY2Vcblx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdGUgaXMgXCJkb25lXCIgbm93XG5cdFx0XHRzdGF0ZSA9IDI7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb25cblx0XHRcdC8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcblxuXHRcdFx0Ly8gU2V0IHJlYWR5U3RhdGVcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XG5cblx0XHRcdC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsXG5cdFx0XHRpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNDtcblxuXHRcdFx0Ly8gR2V0IHJlc3BvbnNlIGRhdGFcblx0XHRcdGlmICggcmVzcG9uc2VzICkge1xuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJMYXN0LU1vZGlmaWVkXCIpO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJldGFnXCIpO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcihcImFqYXhTdG9wXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59KTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XG5cdFx0XHRjYWxsYmFjayA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkuYWpheCh7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSk7XG5cdH07XG59KTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoe1xuXHRcdHVybDogdXJsLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cdFx0XCJ0aHJvd3NcIjogdHJ1ZVxuXHR9KTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXNbIDAgXSApIHtcblxuXHRcdFx0Ly8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmRcblx0XHRcdHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1ZSApO1xuXG5cdFx0XHRpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR3cmFwLmluc2VydEJlZm9yZSggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXAubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9KS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKHRoaXMsIGkpICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0Y29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7XG5cblx0XHRcdGlmICggY29udGVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250ZW50cy53cmFwQWxsKCBodG1sICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYXBwZW5kKCBodG1sICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0d3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGlzRnVuY3Rpb24gPyBodG1sLmNhbGwodGhpcywgaSkgOiBodG1sICk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dW53cmFwOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImJvZHlcIiApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0XHR9XG5cdFx0fSkuZW5kKCk7XG5cdH1cbn0pO1xuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdC8vIFN1cHBvcnQ6IE9wZXJhIDw9IDEyLjEyXG5cdC8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBvZmZzZXRIZWlnaHRzIGxlc3MgdGhhbiB6ZXJvIG9uIHNvbWUgZWxlbWVudHNcblx0cmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPD0gMCAmJiBlbGVtLm9mZnNldEhlaWdodCA8PSAwO1xufTtcbmpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7XG59O1xuXG5cblxuXG52YXIgcjIwID0gLyUyMC9nLFxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHtcblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgPyBpIDogXCJcIiApICsgXCJdXCIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgalF1ZXJ5LnR5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblx0XHQvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xuXHR9XG59XG5cbi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mXG4vLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmdcbmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHtcblx0dmFyIHByZWZpeCxcblx0XHRzID0gW10sXG5cdFx0YWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWVcblx0XHRcdHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSApO1xuXHRcdH07XG5cblx0Ly8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci5cblx0aWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0pO1xuXG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApLnJlcGxhY2UoIHIyMCwgXCIrXCIgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSlcblx0XHQuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRcdC8vIFVzZSAuaXMoIFwiOmRpc2FibGVkXCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9KVxuXHRcdC5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdHJldHVybiB2YWwgPT0gbnVsbCA/XG5cdFx0XHRcdG51bGwgOlxuXHRcdFx0XHRqUXVlcnkuaXNBcnJheSggdmFsICkgP1xuXHRcdFx0XHRcdGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9KS5nZXQoKTtcblx0fVxufSk7XG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cdH0gY2F0Y2goIGUgKSB7fVxufTtcblxudmFyIHhocklkID0gMCxcblx0eGhyQ2FsbGJhY2tzID0ge30sXG5cdHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cdFx0Ly8gZmlsZSBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyBjb2RlIDAsIGFzc3VtZSAyMDBcblx0XHQwOiAyMDAsXG5cdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbi8vIFN1cHBvcnQ6IElFOVxuLy8gT3BlbiByZXF1ZXN0cyBtdXN0IGJlIG1hbnVhbGx5IGFib3J0ZWQgb24gdW5sb2FkICgjNTI4MClcbi8vIFNlZSBodHRwczovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8yODU2NzQ2IGZvciBtb3JlIGluZm9cbmlmICggd2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHR3aW5kb3cuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgZnVuY3Rpb24oKSB7XG5cdFx0Zm9yICggdmFyIGtleSBpbiB4aHJDYWxsYmFja3MgKSB7XG5cdFx0XHR4aHJDYWxsYmFja3NbIGtleSBdKCk7XG5cdFx0fVxuXHR9KTtcbn1cblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHR2YXIgY2FsbGJhY2s7XG5cblx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxuXHRpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0dmFyIGksXG5cdFx0XHRcdFx0eGhyID0gb3B0aW9ucy54aHIoKSxcblx0XHRcdFx0XHRpZCA9ICsreGhySWQ7XG5cblx0XHRcdFx0eGhyLm9wZW4oIG9wdGlvbnMudHlwZSwgb3B0aW9ucy51cmwsIG9wdGlvbnMuYXN5bmMsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQgKTtcblxuXHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRcdHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcblx0XHRcdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXJcblx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxuXHRcdFx0XHQvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLlxuXHRcdFx0XHQvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cClcblx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXG5cdFx0XHRcdGlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbXCJYLVJlcXVlc3RlZC1XaXRoXCJdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbXCJYLVJlcXVlc3RlZC1XaXRoXCJdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHhockNhbGxiYWNrc1sgaWQgXTtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSB4aHIub25sb2FkID0geGhyLm9uZXJyb3IgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJhYm9ydFwiICkge1xuXHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcImVycm9yXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBmaWxlOiBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyAwOyBzZWUgIzg2MDUsICMxNDIwN1xuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEFjY2Vzc2luZyBiaW5hcnktZGF0YSByZXNwb25zZVRleHQgdGhyb3dzIGFuIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gKCMxMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiB4aHIucmVzcG9uc2VUZXh0ID09PSBcInN0cmluZ1wiID8ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiB4aHIucmVzcG9uc2VUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHR9IDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0eGhyLm9uZXJyb3IgPSBjYWxsYmFjayhcImVycm9yXCIpO1xuXG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSB4aHJDYWxsYmFja3NbIGlkIF0gPSBjYWxsYmFjayhcImFib3J0XCIpO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0Ly8gIzE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3RpZmllZCBhcyBhbiBlcnJvciB5ZXRcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSk7XG5cblxuXG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvKD86amF2YXxlY21hKXNjcmlwdC9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59KTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0pO1xuXG4vLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnRcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KFwiPHNjcmlwdD5cIikucHJvcCh7XG5cdFx0XHRcdFx0YXN5bmM6IHRydWUsXG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSkub24oXG5cdFx0XHRcdFx0XCJsb2FkIGVycm9yXCIsXG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggZXZ0ICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBldnQudHlwZSA9PT0gXCJlcnJvclwiID8gNDA0IDogMjAwLCBldnQudHlwZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTtcblx0XHRcdH0sXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0pO1xuXG5cblxuXG52YXIgb2xkQ2FsbGJhY2tzID0gW10sXG5cdHJqc29ucCA9IC8oPSlcXD8oPz0mfCQpfFxcP1xcPy87XG5cbi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3NcbmpRdWVyeS5hamF4U2V0dXAoe1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0pO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmICEoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIikgJiYgcmpzb25wLnRlc3QoIHMuZGF0YSApICYmIFwiZGF0YVwiXG5cdFx0KTtcblxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XG5cdGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gXCJqc29ucFwiICkge1xuXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxuXHRcdGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbXCJzY3JpcHQganNvblwiXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIGZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlXG5cdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XG5cblx0XHRcdC8vIFNhdmUgYmFjayBhcyBmcmVlXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xuXHRcdFx0XHQvLyBtYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSk7XG5cblxuXG5cbi8vIGRhdGE6IHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0dmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLFxuXHRcdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsxXSApIF07XG5cdH1cblxuXHRwYXJzZWQgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZFxudmFyIF9sb2FkID0galF1ZXJ5LmZuLmxvYWQ7XG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdGlmICggdHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIiAmJiBfbG9hZCApIHtcblx0XHRyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG5cblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZihcIiBcIik7XG5cblx0aWYgKCBvZmYgPj0gMCApIHtcblx0XHRzZWxlY3RvciA9IGpRdWVyeS50cmltKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoe1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIGlmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWRcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhVHlwZTogXCJodG1sXCIsXG5cdFx0XHRkYXRhOiBwYXJhbXNcblx0XHR9KS5kb25lKGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KFwiPGRpdj5cIikuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0fSkuY29tcGxldGUoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBjYWxsYmFjaywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFsgXCJhamF4U3RhcnRcIiwgXCJhamF4U3RvcFwiLCBcImFqYXhDb21wbGV0ZVwiLCBcImFqYXhFcnJvclwiLCBcImFqYXhTdWNjZXNzXCIsIFwiYWpheFNlbmRcIiBdLCBmdW5jdGlvbiggaSwgdHlwZSApIHtcblx0alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7XG5cdH07XG59KTtcblxuXG5cblxualF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9KS5sZW5ndGg7XG59O1xuXG5cblxuXG52YXIgZG9jRWxlbSA9IHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbi8qKlxuICogR2V0cyBhIHdpbmRvdyBmcm9tIGFuIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPyBlbGVtIDogZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRlZmF1bHRWaWV3O1xufVxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoXCJhdXRvXCIpID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkge1xuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgY3VyT2Zmc2V0ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0XHRqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHR2YXIgZG9jRWxlbSwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sXG5cdFx0XHRkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1bWVudDtcblxuXHRcdGlmICggIWRvYyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhIGRpc2Nvbm5lY3RlZCBET00gbm9kZVxuXHRcdGlmICggIWpRdWVyeS5jb250YWlucyggZG9jRWxlbSwgZWxlbSApICkge1xuXHRcdFx0cmV0dXJuIGJveDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBCbGFja0JlcnJ5IDUsIGlPUyAzIChvcmlnaW5hbCBpUGhvbmUpXG5cdFx0Ly8gSWYgd2UgZG9uJ3QgaGF2ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0aGVyIHRoYW4gZXJyb3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gc3RydW5kZWZpbmVkICkge1xuXHRcdFx0Ym94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR9XG5cdFx0d2luID0gZ2V0V2luZG93KCBkb2MgKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBib3gudG9wICsgd2luLnBhZ2VZT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRUb3AsXG5cdFx0XHRsZWZ0OiBib3gubGVmdCArIHdpbi5wYWdlWE9mZnNldCAtIGRvY0VsZW0uY2xpZW50TGVmdFxuXHRcdH07XG5cdH0sXG5cblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sIGJlY2F1c2UgaXQgaXMgaXRzIG9ubHkgb2Zmc2V0IHBhcmVudFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblx0XHRcdC8vIEFzc3VtZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXMgdGhlcmUgd2hlbiBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudFxuXHRcdFx0b2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKTtcblxuXHRcdFx0Ly8gR2V0IGNvcnJlY3Qgb2Zmc2V0c1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sIFwiaHRtbFwiICkgKSB7XG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzXG5cdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdG9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY0VsZW07XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50LCBcImh0bWxcIiApICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSApIHtcblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2NFbGVtO1xuXHRcdH0pO1xuXHR9XG59KTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXHRcdFx0dmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApO1xuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luZG93LnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbmRvdy5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApO1xuXHR9O1xufSk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaTw3KywgQ2hyb21lPDM3K1xuLy8gQWRkIHRoZSB0b3AvbGVmdCBjc3NIb29rcyB1c2luZyBqUXVlcnkuZm4ucG9zaXRpb25cbi8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NFxuLy8gQmxpbmsgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjI5MjgwXG4vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0O1xuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5waXhlbFBvc2l0aW9uLFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGNvbXB1dGVkID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7XG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSk7XG5cblxuLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBIZWlnaHQ6IFwiaGVpZ2h0XCIsIFdpZHRoOiBcIndpZHRoXCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7XG5cdGpRdWVyeS5lYWNoKCB7IHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsIFwiXCI6IFwib3V0ZXJcIiArIG5hbWUgfSwgZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXHRcdFx0XHRcdC8vIEFzIG9mIDUvOC8yMDEyIHRoaXMgd2lsbCB5aWVsZCBpbmNvcnJlY3QgcmVzdWx0cyBmb3IgTW9iaWxlIFNhZmFyaSwgYnV0IHRoZXJlXG5cdFx0XHRcdFx0Ly8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOlxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNzY0XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBcImNsaWVudFwiICsgbmFtZSBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodFxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0ZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdFx0XHQvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRoL0hlaWdodF0sXG5cdFx0XHRcdFx0Ly8gd2hpY2hldmVyIGlzIGdyZWF0ZXN0XG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcInNjcm9sbFwiICsgbmFtZSBdLCBkb2NbIFwic2Nyb2xsXCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwib2Zmc2V0XCIgKyBuYW1lIF0sIGRvY1sgXCJvZmZzZXRcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGRvY1sgXCJjbGllbnRcIiArIG5hbWUgXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApO1xuXHRcdH07XG5cdH0pO1xufSk7XG5cblxuLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXRcbmpRdWVyeS5mbi5zaXplID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbmpRdWVyeS5mbi5hbmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSk7XG59XG5cblxuXG5cbnZhclxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoIHR5cGVvZiBub0dsb2JhbCA9PT0gc3RydW5kZWZpbmVkICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cbnJldHVybiBqUXVlcnk7XG5cbn0pKTtcbiIsIi8qISBKc1JlbmRlciB2MC45LjgyIChCZXRhKTogaHR0cDovL2pzdmlld3MuY29tLyNqc3JlbmRlciAqL1xuLyohICoqVkVSU0lPTiBGT1IgV0VCKiogKEZvciBOT0RFLkpTIHNlZSBodHRwOi8vanN2aWV3cy5jb20vZG93bmxvYWQvanNyZW5kZXItbm9kZS5qcykgKi9cbi8qXG4gKiBCZXN0LW9mLWJyZWVkIHRlbXBsYXRpbmcgaW4gYnJvd3NlciBvciBvbiBOb2RlLmpzLlxuICogRG9lcyBub3QgcmVxdWlyZSBqUXVlcnksIG9yIEhUTUwgRE9NXG4gKiBJbnRlZ3JhdGVzIHdpdGggSnNWaWV3cyAoaHR0cDovL2pzdmlld3MuY29tLyNqc3ZpZXdzKVxuICpcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vanNoaW50IC1XMDE4LCAtVzA0MVxuXG4oZnVuY3Rpb24oZmFjdG9yeSwgZ2xvYmFsKSB7XG5cdC8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG5cdHZhciAkID0gZ2xvYmFsLmpRdWVyeTtcblxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHsgLy8gQ29tbW9uSlMgZS5nLiBCcm93c2VyaWZ5XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSAkXG5cdFx0XHQ/IGZhY3RvcnkoZ2xvYmFsLCAkKVxuXHRcdFx0OiBmdW5jdGlvbigkKSB7IC8vIElmIG5vIGdsb2JhbCBqUXVlcnksIHRha2Ugb3B0aW9uYWwgalF1ZXJ5IHBhc3NlZCBhcyBwYXJhbWV0ZXI6IHJlcXVpcmUoJ2pzcmVuZGVyJykoalF1ZXJ5KVxuXHRcdFx0XHRpZiAoJCAmJiAhJC5mbikge1xuXHRcdFx0XHRcdHRocm93IFwiUHJvdmlkZSBqUXVlcnkgb3IgbnVsbFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KGdsb2JhbCwgJCk7XG5cdFx0XHR9O1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRCBzY3JpcHQgbG9hZGVyLCBlLmcuIFJlcXVpcmVKU1xuXHRcdGRlZmluZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmYWN0b3J5KGdsb2JhbCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7IC8vIEJyb3dzZXIgdXNpbmcgcGxhaW4gPHNjcmlwdD4gdGFnXG5cdFx0ZmFjdG9yeShnbG9iYWwsIGZhbHNlKTtcblx0fVxufSAoXG5cbi8vIGZhY3RvcnkgKGZvciBqc3JlbmRlci5qcylcbmZ1bmN0aW9uKGdsb2JhbCwgJCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcbnZhciBzZXRHbG9iYWxzID0gJCA9PT0gZmFsc2U7IC8vIE9ubHkgc2V0IGdsb2JhbHMgaWYgc2NyaXB0IGJsb2NrIGluIGJyb3dzZXIgKG5vdCBBTUQgYW5kIG5vdCBDb21tb25KUylcblxuJCA9ICQgJiYgJC5mbiA/ICQgOiBnbG9iYWwualF1ZXJ5OyAvLyAkIGlzIGpRdWVyeSBwYXNzZWQgaW4gYnkgQ29tbW9uSlMgbG9hZGVyIChCcm93c2VyaWZ5KSwgb3IgZ2xvYmFsIGpRdWVyeS5cblxudmFyIHZlcnNpb25OdW1iZXIgPSBcInYwLjkuODJcIixcblx0anN2U3RvcmVOYW1lLCByVGFnLCByVG1wbFN0cmluZywgdG9wVmlldywgJHZpZXdzLFx0JGV4cGFuZG8sXG5cbi8vVE9ET1x0dG1wbEZuc0NhY2hlID0ge30sXG5cdCRpc0Z1bmN0aW9uLCAkaXNBcnJheSwgJHRlbXBsYXRlcywgJGNvbnZlcnRlcnMsICRoZWxwZXJzLCAkdGFncywgJHN1YiwgJHN1YlNldHRpbmdzLCAkc3ViU2V0dGluZ3NBZHZhbmNlZCwgJHZpZXdzU2V0dGluZ3MsIGRlbGltT3BlbkNoYXIwLCBkZWxpbU9wZW5DaGFyMSwgZGVsaW1DbG9zZUNoYXIwLCBkZWxpbUNsb3NlQ2hhcjEsIGxpbmtDaGFyLCBzZXR0aW5nLCBiYXNlT25FcnJvcixcblxuXHRyUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHQvLyAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cblx0clBhcmFtcyA9IC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICAgICAgICAgbGZ0UHJuMCAgICAgICAgbGZ0UHJuICAgICAgICBib3VuZCAgICAgICAgICAgIHBhdGggICAgb3BlcmF0b3IgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgICAgICAgICAgICAgcGF0aDIgICAgICAgcHJuICAgIGNvbW1hICAgbGZ0UHJuMiAgIGFwb3MgcXVvdCAgICAgIHJ0UHJuIHJ0UHJuRG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuMiAgc3BhY2Vcblx0Ly8gKGxlZnQgcGFyZW4/IGZvbGxvd2VkIGJ5IChwYXRoPyBmb2xsb3dlZCBieSBvcGVyYXRvcikgb3IgKHBhdGggZm9sbG93ZWQgYnkgbGVmdCBwYXJlbj8pKSBvciBjb21tYSBvciBhcG9zIG9yIHF1b3Qgb3IgcmlnaHQgcGFyZW4gb3Igc3BhY2VcblxuXHRpc1JlbmRlckNhbGwsXG5cdHJOZXdMaW5lID0gL1sgXFx0XSooXFxyXFxufFxcbnxcXHIpL2csXG5cdHJVbmVzY2FwZVF1b3RlcyA9IC9cXFxcKFsnXCJdKS9nLFxuXHRyRXNjYXBlUXVvdGVzID0gL1snXCJcXFxcXS9nLCAvLyBFc2NhcGUgcXVvdGVzIGFuZCBcXCBjaGFyYWN0ZXJcblx0ckJ1aWxkSGFzaCA9IC8oPzpcXHgwOHxeKShvbmVycm9yOik/KD86KH4/KSgoW1xcdyRfXFwuXSspOik/KFteXFx4MDhdKykpXFx4MDgoLCk/KFteXFx4MDhdKykvZ2ksXG5cdHJUZXN0RWxzZUlmID0gL15pZlxccy8sXG5cdHJGaXJzdEVsZW0gPSAvPChcXHcrKVs+XFxzXS8sXG5cdHJBdHRyRW5jb2RlID0gL1tcXHgwMGA+PFwiJyY9XS9nLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdHJJc0h0bWwgPSAvW1xceDAwYD48XFxcIicmPV0vLFxuXHRySGFzSGFuZGxlcnMgPSAvXm9uW0EtWl18XmNvbnZlcnQoQmFjayk/JC8sXG5cdHJXcmFwcGVkSW5WaWV3TWFya2VyID0gL15cXCNcXGQrX2BbXFxzXFxTXSpcXC9cXGQrX2AkLyxcblx0ckh0bWxFbmNvZGUgPSByQXR0ckVuY29kZSxcblx0dmlld0lkID0gMCxcblx0Y2hhckVudGl0aWVzID0ge1xuXHRcdFwiJlwiOiBcIiZhbXA7XCIsXG5cdFx0XCI8XCI6IFwiJmx0O1wiLFxuXHRcdFwiPlwiOiBcIiZndDtcIixcblx0XHRcIlxceDAwXCI6IFwiJiMwO1wiLFxuXHRcdFwiJ1wiOiBcIiYjMzk7XCIsXG5cdFx0J1wiJzogXCImIzM0O1wiLFxuXHRcdFwiYFwiOiBcIiYjOTY7XCIsXG5cdFx0XCI9XCI6IFwiJiM2MTtcIlxuXHR9LFxuXHRIVE1MID0gXCJodG1sXCIsXG5cdE9CSkVDVCA9IFwib2JqZWN0XCIsXG5cdHRtcGxBdHRyID0gXCJkYXRhLWpzdi10bXBsXCIsXG5cdGpzdlRtcGwgPSBcImpzdlRtcGxcIixcblx0aW5kZXhTdHIgPSBcIkZvciAjaW5kZXggaW4gbmVzdGVkIGJsb2NrIHVzZSAjZ2V0SW5kZXgoKS5cIixcblx0JHJlbmRlciA9IHt9LFxuXG5cdGpzciA9IGdsb2JhbC5qc3JlbmRlcixcblx0anNyVG9KcSA9IGpzciAmJiAkICYmICEkLnJlbmRlciwgLy8gSnNSZW5kZXIgYWxyZWFkeSBsb2FkZWQsIHdpdGhvdXQgalF1ZXJ5LiBidXQgd2Ugd2lsbCByZS1sb2FkIGl0IG5vdyB0byBhdHRhY2ggdG8galF1ZXJ5XG5cblx0anN2U3RvcmVzID0ge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVG1wbFxuXHRcdH0sXG5cdFx0dGFnOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVGFnXG5cdFx0fSxcblx0XHR2aWV3TW9kZWw6IHtcblx0XHRcdGNvbXBpbGU6IGNvbXBpbGVWaWV3TW9kZWxcblx0XHR9LFxuXHRcdGhlbHBlcjoge30sXG5cdFx0Y29udmVydGVyOiB7fVxuXHR9O1xuXG5cdC8vIHZpZXdzIG9iamVjdCAoJC52aWV3cyBpZiBqUXVlcnkgaXMgbG9hZGVkLCBqc3JlbmRlci52aWV3cyBpZiBubyBqUXVlcnksIGUuZy4gaW4gTm9kZS5qcylcblx0JHZpZXdzID0ge1xuXHRcdGpzdmlld3M6IHZlcnNpb25OdW1iZXIsXG5cdFx0c3ViOiB7XG5cdFx0XHQvLyBzdWJzY3JpcHRpb24sIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0VmlldzogVmlldyxcblx0XHRcdEVycjogSnNWaWV3c0Vycm9yLFxuXHRcdFx0dG1wbEZuOiB0bXBsRm4sXG5cdFx0XHRwYXJzZTogcGFyc2VQYXJhbXMsXG5cdFx0XHRleHRlbmQ6ICRleHRlbmQsXG5cdFx0XHRleHRlbmRDdHg6IGV4dGVuZEN0eCxcblx0XHRcdHN5bnRheEVycjogc3ludGF4RXJyb3IsXG5cdFx0XHRvblN0b3JlOiB7fSxcblx0XHRcdGFkZFNldHRpbmc6IGFkZFNldHRpbmcsXG5cdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRhbGxvd0NvZGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0YWR2U2V0OiBub29wLCAvLyBVcGRhdGUgYWR2YW5jZWQgc2V0dGluZ3Ncblx0XHRcdF90aHM6IHRhZ0hhbmRsZXJzRnJvbVByb3BzLFxuXHRcdFx0X3RnOiBmdW5jdGlvbigpIHt9LCAvLyBDb25zdHJ1Y3RvciBmb3IgdGFnRGVmXG5cdFx0XHRfY252dDogY29udmVydFZhbCxcblx0XHRcdF90YWc6IHJlbmRlclRhZyxcblx0XHRcdF9lcjogZXJyb3IsXG5cdFx0XHRfZXJyOiBvblJlbmRlckVycm9yLFxuXHRcdFx0X2h0bWw6IGh0bWxFbmNvZGUsXG5cdFx0XHRfY3A6IHJldFZhbCwgLy8gR2V0IGNvbXBpbGVkIGNvbnRleHR1YWwgcGFyYW1ldGVycyAob3IgcHJvcGVydGllcykgfmZvbz1leHByLiBJbiBKc1JlbmRlciwgc2ltcGx5IHJldHVybnMgdmFsLlxuXHRcdFx0X3NxOiBmdW5jdGlvbih0b2tlbikge1xuXHRcdFx0XHRpZiAodG9rZW4gPT09IFwiY29uc3RydWN0b3JcIikge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0b2tlbjtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNldHRpbmdzOiB7XG5cdFx0XHRkZWxpbWl0ZXJzOiAkdmlld3NEZWxpbWl0ZXJzLFxuXHRcdFx0YWR2YW5jZWQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZVxuXHRcdFx0XHRcdD8gKFxuXHRcdFx0XHRcdFx0XHQkZXh0ZW5kKCRzdWJTZXR0aW5nc0FkdmFuY2VkLCB2YWx1ZSksXG5cdFx0XHRcdFx0XHRcdCRzdWIuYWR2U2V0KCksXG5cdFx0XHRcdFx0XHRcdCR2aWV3c1NldHRpbmdzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6ICRzdWJTZXR0aW5nc0FkdmFuY2VkO1xuXHRcdFx0XHR9XG5cdFx0fSxcblx0XHRnZXRDdHg6IHJldFZhbCwgLy8gR2V0IGN0eC5mb28gdmFsdWUuIEluIEpzUmVuZGVyLCBzaW1wbHkgcmV0dXJucyB2YWwuXG5cdFx0bWFwOiBkYXRhTWFwICAgIC8vIElmIGpzT2JzZXJ2YWJsZSBsb2FkZWQgZmlyc3QsIHVzZSB0aGF0IGRlZmluaXRpb24gb2YgZGF0YU1hcFxuXHR9O1xuXG5mdW5jdGlvbiBnZXREZXJpdmVkTWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJldCxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRwcmV2QmFzZSA9IHRhZy5iYXNlO1xuXG5cdFx0dGFnLmJhc2UgPSBiYXNlTWV0aG9kOyAvLyBXaXRoaW4gbWV0aG9kIGNhbGwsIGNhbGxpbmcgdGhpcy5iYXNlIHdpbGwgY2FsbCB0aGUgYmFzZSBtZXRob2Rcblx0XHRyZXQgPSBtZXRob2QuYXBwbHkodGFnLCBhcmd1bWVudHMpOyAvLyBDYWxsIHRoZSBtZXRob2Rcblx0XHR0YWcuYmFzZSA9IHByZXZCYXNlOyAvLyBSZXBsYWNlIHRoaXMuYmFzZSB0byBiZSB0aGUgYmFzZSBtZXRob2Qgb2YgdGhlIHByZXZpb3VzIGNhbGwsIGZvciBjaGFpbmVkIGNhbGxzXG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0TWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHQvLyBGb3IgZGVyaXZlZCBtZXRob2RzIChvciBoYW5kbGVycyBkZWNsYXJlZCBkZWNsYXJhdGl2ZWx5IGFzIGluIHt7OmZvbyBvbkNoYW5nZT1+Zm9vQ2hhbmdlZH19IHJlcGxhY2UgYnkgYSBkZXJpdmVkIG1ldGhvZCwgdG8gYWxsb3cgdXNpbmcgdGhpcy5iYXNlKC4uLilcblx0Ly8gb3IgdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSB0byBjYWxsIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLiAoRXF1aXZhbGVudCB0byB0aGlzLl9zdXBlciguLi4pIGFuZCB0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cykgaW4galF1ZXJ5IFVJKVxuXHRpZiAoJGlzRnVuY3Rpb24obWV0aG9kKSkge1xuXHRcdG1ldGhvZCA9IGdldERlcml2ZWRNZXRob2QoXG5cdFx0XHRcdCFiYXNlTWV0aG9kXG5cdFx0XHRcdFx0PyBub29wIC8vIG5vIGJhc2UgbWV0aG9kIGltcGxlbWVudGF0aW9uLCBzbyB1c2Ugbm9vcCBhcyBiYXNlIG1ldGhvZFxuXHRcdFx0XHRcdDogYmFzZU1ldGhvZC5fZFxuXHRcdFx0XHRcdFx0PyBiYXNlTWV0aG9kIC8vIGJhc2VNZXRob2QgaXMgYSBkZXJpdmVkIG1ldGhvZCwgc28gdXMgaXRcblx0XHRcdFx0XHRcdDogZ2V0RGVyaXZlZE1ldGhvZChub29wLCBiYXNlTWV0aG9kKSwgLy8gYmFzZU1ldGhvZCBpcyBub3QgZGVyaXZlZCBzbyBtYWtlIGl0cyBiYXNlIG1ldGhvZCBiZSB0aGUgbm9vcCBtZXRob2Rcblx0XHRcdFx0bWV0aG9kXG5cdFx0XHQpO1xuXHRcdG1ldGhvZC5fZCA9IDE7IC8vIEFkZCBmbGFnIHRoYXQgdGhpcyBpcyBhIGRlcml2ZWQgbWV0aG9kXG5cdH1cblx0cmV0dXJuIG1ldGhvZDtcbn1cblxuZnVuY3Rpb24gdGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHgpIHtcblx0Zm9yICh2YXIgcHJvcCBpbiB0YWdDdHgucHJvcHMpIHtcblx0XHRpZiAockhhc0hhbmRsZXJzLnRlc3QocHJvcCkpIHtcblx0XHRcdHRhZ1twcm9wXSA9IGdldE1ldGhvZCh0YWdbcHJvcF0sIHRhZ0N0eC5wcm9wc1twcm9wXSk7XG5cdFx0XHQvLyBDb3B5IG92ZXIgdGhlIG9uRm9vIHByb3BzLCBjb252ZXJ0IGFuZCBjb252ZXJ0QmFjayBmcm9tIHRhZ0N0eC5wcm9wcyB0byB0YWcgKG92ZXJyaWRlcyB2YWx1ZXMgaW4gdGFnRGVmKS5cblx0XHRcdC8vIE5vdGU6IHVuc3VwcG9ydGVkIHNjZW5hcmlvOiBpZiBoYW5kbGVycyBhcmUgZHluYW1pY2FsbHkgYWRkZWQgXm9uRm9vPWV4cHJlc3Npb24gdGhpcyB3aWxsIHdvcmssIGJ1dCBkeW5hbWljYWxseSByZW1vdmluZyB3aWxsIG5vdCB3b3JrLlxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiByZXRWYWwodmFsKSB7XG5cdHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7XG5cdHJldHVybiBcIlwiO1xufVxuXG5mdW5jdGlvbiBkYmdCcmVhayh2YWwpIHtcblx0Ly8gVXNhZ2UgZXhhbXBsZXM6IHt7ZGJnOi4uLn19LCB7ezp+ZGJnKC4uLil9fSwge3tkYmcgLi4uL319LCB7Xntmb3IgLi4uIG9uQWZ0ZXJMaW5rPX5kYmd9fSBldGMuXG5cdHRyeSB7XG5cdFx0Y29uc29sZS5sb2coXCJKc1JlbmRlciBkYmcgYnJlYWtwb2ludDogXCIgKyB2YWwpO1xuXHRcdHRocm93IFwiZGJnIGJyZWFrcG9pbnRcIjsgLy8gVG8gYnJlYWsgaGVyZSwgc3RvcCBvbiBjYXVnaHQgZXhjZXB0aW9ucy5cblx0fVxuXHRjYXRjaCAoZSkge31cblx0cmV0dXJuIHRoaXMuYmFzZSA/IHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgOiB2YWw7XG59XG5cbmZ1bmN0aW9uIEpzVmlld3NFcnJvcihtZXNzYWdlKSB7XG5cdC8vIEVycm9yIGV4Y2VwdGlvbiB0eXBlIGZvciBKc1ZpZXdzL0pzUmVuZGVyXG5cdC8vIE92ZXJyaWRlIG9mICQudmlld3Muc3ViLkVycm9yIGlzIHBvc3NpYmxlXG5cdHRoaXMubmFtZSA9ICgkLmxpbmsgPyBcIkpzVmlld3NcIiA6IFwiSnNSZW5kZXJcIikgKyBcIiBFcnJvclwiO1xuXHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IHRoaXMubmFtZTtcbn1cblxuZnVuY3Rpb24gJGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuXHRmb3IgKHZhciBuYW1lIGluIHNvdXJjZSkge1xuXHRcdHRhcmdldFtuYW1lXSA9IHNvdXJjZVtuYW1lXTtcblx0fVxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4oSnNWaWV3c0Vycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpKS5jb25zdHJ1Y3RvciA9IEpzVmlld3NFcnJvcjtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vPT09PT09PT09PT09PT09PT09PVxuLy8gdmlld3MuZGVsaW1pdGVyc1xuLy89PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uICR2aWV3c0RlbGltaXRlcnMob3BlbkNoYXJzLCBjbG9zZUNoYXJzLCBsaW5rKSB7XG5cdC8vIFNldCB0aGUgdGFnIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyBhbmQgJ2xpbmsnIGNoYXJhY3Rlci4gRGVmYXVsdCBpcyBcInt7XCIsIFwifX1cIiBhbmQgXCJeXCJcblx0Ly8gb3BlbkNoYXJzLCBjbG9zZUNoYXJzOiBvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MsIGVhY2ggd2l0aCB0d28gY2hhcmFjdGVyc1xuXHRpZiAoIW9wZW5DaGFycykge1xuXHRcdHJldHVybiAkc3ViU2V0dGluZ3MuZGVsaW1pdGVycztcblx0fVxuXHRpZiAoJGlzQXJyYXkob3BlbkNoYXJzKSkge1xuXHRcdHJldHVybiAkdmlld3NEZWxpbWl0ZXJzLmFwcGx5KCR2aWV3cywgb3BlbkNoYXJzKTtcblx0fVxuXG5cdCRzdWJTZXR0aW5ncy5kZWxpbWl0ZXJzID0gW29wZW5DaGFycywgY2xvc2VDaGFycywgbGlua0NoYXIgPSBsaW5rID8gbGluay5jaGFyQXQoMCkgOiBsaW5rQ2hhcl07XG5cblx0ZGVsaW1PcGVuQ2hhcjAgPSBvcGVuQ2hhcnMuY2hhckF0KDApOyAvLyBFc2NhcGUgdGhlIGNoYXJhY3RlcnMgLSBzaW5jZSB0aGV5IGNvdWxkIGJlIHJlZ2V4IHNwZWNpYWwgY2hhcmFjdGVyc1xuXHRkZWxpbU9wZW5DaGFyMSA9IG9wZW5DaGFycy5jaGFyQXQoMSk7XG5cdGRlbGltQ2xvc2VDaGFyMCA9IGNsb3NlQ2hhcnMuY2hhckF0KDApO1xuXHRkZWxpbUNsb3NlQ2hhcjEgPSBjbG9zZUNoYXJzLmNoYXJBdCgxKTtcblx0b3BlbkNoYXJzID0gXCJcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxOyAvLyBEZWZhdWx0IGlzIFwie157XCJcblx0Y2xvc2VDaGFycyA9IFwiXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCJcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjE7ICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgXCJ9fVwiXG5cdC8vIEJ1aWxkIHJlZ2V4IHdpdGggbmV3IGRlbGltaXRlcnNcblx0Ly8gICAgICAgICAgW3RhZyAgICAoZm9sbG93ZWQgYnkgLyBzcGFjZSBvciB9KSAgb3IgY3Z0citjb2xvbiBvciBodG1sIG9yIGNvZGVdIGZvbGxvd2VkIGJ5IHNwYWNlK3BhcmFtcyB0aGVuIGNvbnZlcnRCYWNrP1xuXHRyVGFnID0gXCIoPzooXFxcXHcrKD89W1xcXFwvXFxcXHNcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl0pKXwoXFxcXHcrKT8oOil8KD4pfChcXFxcKikpXFxcXHMqKCg/OlteXFxcXFwiXG5cdFx0KyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl18XFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCIoPyFcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjEgKyBcIikpKj8pXCI7XG5cblx0Ly8gTWFrZSByVGFnIGF2YWlsYWJsZSB0byBKc1ZpZXdzIChvciBvdGhlciBjb21wb25lbnRzKSBmb3IgcGFyc2luZyBiaW5kaW5nIGV4cHJlc3Npb25zXG5cdCRzdWIuclRhZyA9IFwiKD86XCIgKyByVGFnICsgXCIpXCI7XG5cdC8vICAgICAgICAgICAgICAgICAgICAgICAgeyBePyB7ICAgdGFnK3BhcmFtcyBzbGFzaD8gIG9yIGNsb3NpbmdUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBjb21tZW50XG5cdHJUYWcgPSBuZXcgUmVnRXhwKFwiKD86XCIgKyBvcGVuQ2hhcnMgKyByVGFnICsgXCIoXFxcXC8pP3xcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxICsgXCIoPzooPzpcXFxcLyhcXFxcdyspKVxcXFxzKnwhLS1bXFxcXHNcXFxcU10qPy0tKSlcIiArIGNsb3NlQ2hhcnMsIFwiZ1wiKTtcblxuXHQvLyBEZWZhdWx0OiAgYmluZCAgICAgdGFnTmFtZSAgICAgICAgIGN2dCAgIGNsbiBodG1sIGNvZGUgICAgcGFyYW1zICAgICAgICAgICAgc2xhc2ggICBiaW5kMiAgICAgICAgIGNsb3NlQmxrICBjb21tZW50XG5cdC8vICAgICAgLyg/OnsoXFxeKT97KD86KFxcdysoPz1bXFwvXFxzfV0pKXwoXFx3Kyk/KDopfCg+KXwoXFwqKSlcXHMqKCg/OltefV18fSg/IX0pKSo/KShcXC8pP3x7KFxcXik/eyg/Oig/OlxcLyhcXHcrKSlcXHMqfCEtLVtcXHNcXFNdKj8tLSkpfX1cblxuXHQkc3ViLnJUbXBsID0gbmV3IFJlZ0V4cChcIjwuKj58KFteXFxcXFxcXFxdfF4pW3t9XXxcIiArIG9wZW5DaGFycyArIFwiLipcIiArIGNsb3NlQ2hhcnMpO1xuXHQvLyAkc3ViLnJUbXBsIGxvb2tzIGZvciBodG1sIHRhZ3Mgb3IgeyBvciB9IGNoYXIgbm90IHByZWNlZGVkIGJ5IFxcXFwsIG9yIEpzUmVuZGVyIHRhZ3Mge3t4eHh9fS4gRWFjaCBvZiB0aGVzZSBzdHJpbmdzIGFyZSBjb25zaWRlcmVkXG5cdC8vIE5PVCB0byBiZSBqUXVlcnkgc2VsZWN0b3JzXG5cdHJldHVybiAkdmlld3NTZXR0aW5ncztcbn1cblxuLy89PT09PT09PT1cbi8vIFZpZXcuZ2V0XG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRWaWV3KGlubmVyLCB0eXBlKSB7IC8vdmlldy5nZXQoaW5uZXIsIHR5cGUpXG5cdGlmICghdHlwZSAmJiBpbm5lciAhPT0gdHJ1ZSkge1xuXHRcdC8vIHZpZXcuZ2V0KHR5cGUpXG5cdFx0dHlwZSA9IGlubmVyO1xuXHRcdGlubmVyID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dmFyIHZpZXdzLCBpLCBsLCBmb3VuZCxcblx0XHR2aWV3ID0gdGhpcyxcblx0XHRyb290ID0gIXR5cGUgfHwgdHlwZSA9PT0gXCJyb290XCI7XG5cdFx0Ly8gSWYgdHlwZSBpcyB1bmRlZmluZWQsIHJldHVybnMgcm9vdCB2aWV3ICh2aWV3IHVuZGVyIHRvcCB2aWV3KS5cblxuXHRpZiAoaW5uZXIpIHtcblx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgbmVzdGVkIG9uZXMsIGRlcHRoLWZpcnN0IC0gYW5kIHJldHVybiBmaXJzdCBvbmUgd2l0aCBnaXZlbiB0eXBlLlxuXHRcdC8vIElmIHR5cGUgaXMgdW5kZWZpbmVkLCBpLmUuIHZpZXcuZ2V0KHRydWUpLCByZXR1cm4gZmlyc3QgY2hpbGQgdmlldy5cblx0XHRmb3VuZCA9IHR5cGUgJiYgdmlldy50eXBlID09PSB0eXBlICYmIHZpZXc7XG5cdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0dmlld3MgPSB2aWV3LnZpZXdzO1xuXHRcdFx0aWYgKHZpZXcuXy51c2VLZXkpIHtcblx0XHRcdFx0Zm9yIChpIGluIHZpZXdzKSB7XG5cdFx0XHRcdFx0aWYgKGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGkgPSAwLCBsID0gdmlld3MubGVuZ3RoOyAhZm91bmQgJiYgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChyb290KSB7XG5cdFx0Ly8gRmluZCByb290IHZpZXcuICh2aWV3IHdob3NlIHBhcmVudCBpcyB0b3Agdmlldylcblx0XHR3aGlsZSAodmlldy5wYXJlbnQpIHtcblx0XHRcdGZvdW5kID0gdmlldztcblx0XHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0d2hpbGUgKHZpZXcgJiYgIWZvdW5kKSB7XG5cdFx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgcGFyZW50IG9uZXMgLSBhbmQgcmV0dXJuIGZpcnN0IG9uZSB3aXRoIGdpdmVuIHR5cGUuXG5cdFx0XHRmb3VuZCA9IHZpZXcudHlwZSA9PT0gdHlwZSA/IHZpZXcgOiB1bmRlZmluZWQ7XG5cdFx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkSW5kZXgoKSB7XG5cdHZhciB2aWV3ID0gdGhpcy5nZXQoXCJpdGVtXCIpO1xuXHRyZXR1cm4gdmlldyA/IHZpZXcuaW5kZXggOiB1bmRlZmluZWQ7XG59XG5cbmdldE5lc3RlZEluZGV4LmRlcGVuZHMgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIFt0aGlzLmdldChcIml0ZW1cIiksIFwiaW5kZXhcIl07XG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleCgpIHtcblx0cmV0dXJuIHRoaXMuaW5kZXg7XG59XG5cbmdldEluZGV4LmRlcGVuZHMgPSBcImluZGV4XCI7XG5cbi8vPT09PT09PT09PVxuLy8gVmlldy5obHBcbi8vPT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRIZWxwZXIoaGVscGVyLCBpc0NvbnRleHRDYikge1xuXHQvLyBIZWxwZXIgbWV0aG9kIGNhbGxlZCBhcyB2aWV3LmhscChrZXkpIGZyb20gY29tcGlsZWQgdGVtcGxhdGUsIGZvciBoZWxwZXJzIG9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgfmZvb1xuXHR2YXIgd3JhcHBlZCwgZGVwcyxcblx0dmlldyA9IHRoaXMsXG5cdHJlcyA9IHZpZXcuY3R4O1xuXG5cdGlmIChyZXMpIHtcblx0XHRyZXMgPSByZXNbaGVscGVyXTtcblx0fVxuXHRpZiAocmVzID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXMgPSAkaGVscGVyc1toZWxwZXJdO1xuXHR9XG5cdGlmIChyZXMgJiYgcmVzLl9jcCkgeyAvLyBJZiB0aGlzIGhlbHBlciByZXNvdXJjZSBpcyBhIGNvbnRleHR1YWwgcGFyYW1ldGVyLCB+Zm9vPWV4cHJcblx0XHRpZiAoaXNDb250ZXh0Q2IpIHsgLy8gSW4gYSBjb250ZXh0IGNhbGxiYWNrIGZvciBhIGNvbnRleHR1YWwgcGFyYW0sIHJldHVybiB0aGUgW2N1cnJlbnREYXRhLCBkZXBlbmRlbmNpZXMuLi5dIGFycmF5IC0gbmVlZGVkIGZvciBvYnNlcnZlIGNhbGxcblx0XHRcdGRlcHMgPSAkc3ViLl9jZW8ocmVzWzFdLmRlcHMpOyAgLy8gZm4gZGVwcywgd2l0aCBhbnkgZXhwck9icyBjbG9uZWRcblx0XHRcdGRlcHMudW5zaGlmdChyZXNbMF0uZGF0YSk7ICAgICAgLy8gdmlldy5kYXRhXG5cdFx0XHRkZXBzLl9jcCA9IHRydWU7XG5cdFx0XHRyZXR1cm4gZGVwcztcblx0XHR9XG5cdFx0cmVzID0gJHZpZXdzLmdldEN0eChyZXMpOyAvLyBJZiBhIGNvbnRleHR1YWwgcGFyYW0sIGJ1dCBub3QgYSBjb250ZXh0IGNhbGxiYWNrLCByZXR1cm4gZXZhbHVhdGVkIHBhcmFtIC0gZm4oZGF0YSwgdmlldywgailcblx0fVxuXG5cdGlmIChyZXMpIHtcblx0XHRpZiAoJGlzRnVuY3Rpb24ocmVzKSAmJiAhcmVzLl93cnApIHtcblx0XHRcdC8vIElmIGl0IGlzIG9mIHR5cGUgZnVuY3Rpb24sIGFuZCBub3QgYWxyZWFkeSB3cmFwcGVkLCB3ZSB3aWxsIHdyYXAgaXQsIHNvIGlmIGNhbGxlZCB3aXRoIG5vIHRoaXMgcG9pbnRlciBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuXHRcdFx0Ly8gdmlldyBhcyAndGhpcycgY29udGV4dC4gSWYgdGhlIGhlbHBlciB+Zm9vKCkgd2FzIGluIGEgZGF0YS1saW5rIGV4cHJlc3Npb24sIHRoZSB2aWV3IHdpbGwgaGF2ZSBhICd0ZW1wb3JhcnknIGxpbmtDdHggcHJvcGVydHkgdG9vLlxuXHRcdFx0Ly8gTm90ZSB0aGF0IGhlbHBlciBmdW5jdGlvbnMgb24gZGVlcGVyIHBhdGhzIHdpbGwgaGF2ZSBzcGVjaWZpYyB0aGlzIHBvaW50ZXJzLCBmcm9tIHRoZSBwcmVjZWRpbmcgcGF0aC5cblx0XHRcdC8vIEZvciBleGFtcGxlLCB+dXRpbC5mb28oKSB3aWxsIGhhdmUgdGhlIH51dGlsIG9iamVjdCBhcyAndGhpcycgcG9pbnRlclxuXHRcdFx0d3JhcHBlZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gcmVzLmFwcGx5KCghdGhpcyB8fCB0aGlzID09PSBnbG9iYWwpID8gdmlldyA6IHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHR9O1xuXHRcdFx0d3JhcHBlZC5fd3JwID0gdmlldztcblx0XHRcdCRleHRlbmQod3JhcHBlZCwgcmVzKTsgLy8gQXR0YWNoIHNhbWUgZXhwYW5kb3MgKGlmIGFueSkgdG8gdGhlIHdyYXBwZWQgZnVuY3Rpb25cblx0XHR9XG5cdH1cblx0cmV0dXJuIHdyYXBwZWQgfHwgcmVzO1xufVxuXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSh0bXBsKSB7XG5cdHJldHVybiB0bXBsICYmICh0bXBsLmZuXG5cdFx0PyB0bXBsXG5cdFx0OiB0aGlzLmdldFJzYyhcInRlbXBsYXRlc1wiLCB0bXBsKSB8fCAkdGVtcGxhdGVzKHRtcGwpKTsgLy8gbm90IHlldCBjb21waWxlZFxufVxuXG4vLz09PT09PT09PT09PT09XG4vLyB2aWV3cy5fY252dFxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb252ZXJ0VmFsKGNvbnZlcnRlciwgdmlldywgdGFnQ3R4LCBvbkVycm9yKSB7XG5cdC8vIHNlbGYgaXMgdGVtcGxhdGUgb2JqZWN0IG9yIGxpbmtDdHggb2JqZWN0XG5cdHZhciB0YWcsIHZhbHVlLFxuXHRcdC8vIGlmIHRhZ0N0eCBpcyBhbiBpbnRlZ2VyLCB0aGVuIGl0IGlzIHRoZSBrZXkgZm9yIHRoZSBjb21waWxlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGJvdW5kVGFnIHRhZ0N0eFxuXHRcdGJvdW5kVGFnID0gdHlwZW9mIHRhZ0N0eCA9PT0gXCJudW1iZXJcIiAmJiB2aWV3LnRtcGwuYm5kc1t0YWdDdHgtMV0sXG5cdFx0bGlua0N0eCA9IHZpZXcubGlua0N0eDsgLy8gRm9yIGRhdGEtbGluaz1cIntjdnQ6Li4ufVwiLi4uXG5cblx0aWYgKG9uRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhZ0N0eCA9IG9uRXJyb3IgPSB7cHJvcHM6IHt9LCBhcmdzOiBbb25FcnJvcl19O1xuXHR9IGVsc2UgaWYgKGJvdW5kVGFnKSB7XG5cdFx0dGFnQ3R4ID0gYm91bmRUYWcodmlldy5kYXRhLCB2aWV3LCAkc3ViKTtcblx0fVxuXG5cdHZhbHVlID0gdGFnQ3R4LmFyZ3NbMF07XG5cdGlmIChjb252ZXJ0ZXIgfHwgYm91bmRUYWcpIHtcblx0XHR0YWcgPSBsaW5rQ3R4ICYmIGxpbmtDdHgudGFnO1xuXHRcdGlmICghdGFnKSB7XG5cdFx0XHR0YWcgPSAkZXh0ZW5kKG5ldyAkc3ViLl90ZygpLCB7XG5cdFx0XHRcdF86IHtcblx0XHRcdFx0XHRpbmxpbmU6ICFsaW5rQ3R4LFxuXHRcdFx0XHRcdGJuZDogYm91bmRUYWcsXG5cdFx0XHRcdFx0dW5saW5rZWQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0dGFnTmFtZTogXCI6XCIsXG5cdFx0XHRcdGN2dDogY29udmVydGVyLFxuXHRcdFx0XHRmbG93OiB0cnVlLFxuXHRcdFx0XHR0YWdDdHg6IHRhZ0N0eFxuXHRcdFx0fSk7XG5cdFx0XHRpZiAobGlua0N0eCkge1xuXHRcdFx0XHRsaW5rQ3R4LnRhZyA9IHRhZztcblx0XHRcdFx0dGFnLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0fVxuXHRcdFx0dGFnQ3R4LmN0eCA9IGV4dGVuZEN0eCh0YWdDdHguY3R4LCAobGlua0N0eCA/IGxpbmtDdHgudmlldyA6IHZpZXcpLmN0eCk7XG5cdFx0fVxuXHRcdHRhZy5fZXIgPSBvbkVycm9yICYmIHZhbHVlO1xuXHRcdHRhZ0hhbmRsZXJzRnJvbVByb3BzKHRhZywgdGFnQ3R4KTtcblxuXHRcdHRhZ0N0eC52aWV3ID0gdmlldztcblxuXHRcdHRhZy5jdHggPSB0YWdDdHguY3R4IHx8IHRhZy5jdHggfHwge307XG5cdFx0dGFnQ3R4LmN0eCA9IHVuZGVmaW5lZDtcblxuXHRcdHZhbHVlID0gdGFnLmN2dEFyZ3MoY29udmVydGVyICE9PSBcInRydWVcIiAmJiBjb252ZXJ0ZXIpWzBdOyAvLyBJZiB0aGVyZSBpcyBhIGNvbnZlcnRCYWNrIGJ1dCBubyBjb252ZXJ0LCBjb252ZXJ0ZXIgd2lsbCBiZSBcInRydWVcIlxuXG5cdFx0Ly8gQ2FsbCBvblJlbmRlciAodXNlZCBieSBKc1ZpZXdzIGlmIHByZXNlbnQsIHRvIGFkZCBiaW5kaW5nIGFubm90YXRpb25zIGFyb3VuZCByZW5kZXJlZCBjb250ZW50KVxuXHRcdHZhbHVlID0gYm91bmRUYWcgJiYgdmlldy5fLm9uUmVuZGVyXG5cdFx0XHQ/IHZpZXcuXy5vblJlbmRlcih2YWx1ZSwgdmlldywgdGFnKVxuXHRcdFx0OiB2YWx1ZTtcblx0fVxuXHRyZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkID8gdmFsdWUgOiBcIlwiO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0QXJncyhjb252ZXJ0ZXIpIHtcblx0dmFyIHRhZyA9IHRoaXMsXG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eCxcblx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0YXJncyA9IHRhZ0N0eC5hcmdzO1xuXG5cdGNvbnZlcnRlciA9IGNvbnZlcnRlciB8fCB0YWcuY29udmVydDtcblx0Y29udmVydGVyID0gY29udmVydGVyICYmIChcIlwiICsgY29udmVydGVyID09PSBjb252ZXJ0ZXJcblx0XHQ/ICh2aWV3LmdldFJzYyhcImNvbnZlcnRlcnNcIiwgY29udmVydGVyKSB8fCBlcnJvcihcIlVua25vd24gY29udmVydGVyOiAnXCIgKyBjb252ZXJ0ZXIgKyBcIidcIikpXG5cdFx0OiBjb252ZXJ0ZXIpO1xuXG5cdGFyZ3MgPSAhYXJncy5sZW5ndGggJiYgIXRhZ0N0eC5pbmRleCAvLyBPbiB0aGUgb3BlbmluZyB0YWcgd2l0aCBubyBhcmdzLCBiaW5kIHRvIHRoZSBjdXJyZW50IGRhdGEgY29udGV4dFxuXHRcdD8gW3ZpZXcuZGF0YV1cblx0XHQ6IGNvbnZlcnRlclxuXHRcdFx0PyBhcmdzLnNsaWNlKCkgLy8gSWYgdGhlcmUgaXMgYSBjb252ZXJ0ZXIsIHVzZSBhIGNvcHkgb2YgdGhlIHRhZ0N0eC5hcmdzIGFycmF5IGZvciByZW5kZXJpbmcsIGFuZCByZXBsYWNlIHRoZSBhcmdzWzBdIGluXG5cdFx0XHQvLyB0aGUgY29waWVkIGFycmF5IHdpdGggdGhlIGNvbnZlcnRlZCB2YWx1ZS4gQnV0IHdlIGRvIG5vdCBtb2RpZnkgdGhlIHZhbHVlIG9mIHRhZy50YWdDdHguYXJnc1swXSAodGhlIG9yaWdpbmFsIGFyZ3MgYXJyYXkpXG5cdFx0XHQ6IGFyZ3M7IC8vIElmIG5vIGNvbnZlcnRlciwgZ2V0IHRoZSBvcmlnaW5hbCB0YWdDdHguYXJnc1xuXG5cdGlmIChjb252ZXJ0ZXIpIHtcblx0XHRpZiAoY29udmVydGVyLmRlcGVuZHMpIHtcblx0XHRcdHRhZy5kZXBlbmRzID0gJHN1Yi5nZXREZXBzKHRhZy5kZXBlbmRzLCB0YWcsIGNvbnZlcnRlci5kZXBlbmRzLCBjb252ZXJ0ZXIpO1xuXHRcdH1cblx0XHRhcmdzWzBdID0gY29udmVydGVyLmFwcGx5KHRhZywgYXJncyk7XG5cdH1cblx0cmV0dXJuIGFyZ3M7XG59XG5cbi8vPT09PT09PT09PT09PVxuLy8gdmlld3MuX3RhZ1xuLy89PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdldFJlc291cmNlKHJlc291cmNlVHlwZSwgaXRlbU5hbWUpIHtcblx0dmFyIHJlcywgc3RvcmUsXG5cdFx0dmlldyA9IHRoaXM7XG5cdHdoaWxlICgocmVzID09PSB1bmRlZmluZWQpICYmIHZpZXcpIHtcblx0XHRzdG9yZSA9IHZpZXcudG1wbCAmJiB2aWV3LnRtcGxbcmVzb3VyY2VUeXBlXTtcblx0XHRyZXMgPSBzdG9yZSAmJiBzdG9yZVtpdGVtTmFtZV07XG5cdFx0dmlldyA9IHZpZXcucGFyZW50O1xuXHR9XG5cdHJldHVybiByZXMgfHwgJHZpZXdzW3Jlc291cmNlVHlwZV1baXRlbU5hbWVdO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUYWcodGFnTmFtZSwgcGFyZW50VmlldywgdG1wbCwgdGFnQ3R4cywgaXNVcGRhdGUsIG9uRXJyb3IpIHtcblx0cGFyZW50VmlldyA9IHBhcmVudFZpZXcgfHwgdG9wVmlldztcblx0dmFyIHRhZywgdGFnXywgdGFnRGVmLCB0ZW1wbGF0ZSwgdGFncywgYXR0ciwgcGFyZW50VGFnLCBpLCBsLCBpdGVtUmV0LCB0YWdDdHgsIHRhZ0N0eEN0eCxcblx0XHRjb250ZW50LCBjYWxsSW5pdCwgbWFwRGVmLCB0aGlzTWFwLCBhcmdzLCBwcm9wcywgaW5pdGlhbFRtcGwsIHRhZ0RhdGFNYXAsIGNvbnRlbnRDdHgsXG5cdFx0cmV0ID0gXCJcIixcblx0XHRsaW5rQ3R4ID0gcGFyZW50Vmlldy5saW5rQ3R4IHx8IDAsXG5cdFx0Y3R4ID0gcGFyZW50Vmlldy5jdHgsXG5cdFx0cGFyZW50VG1wbCA9IHRtcGwgfHwgcGFyZW50Vmlldy50bXBsLFxuXHRcdC8vIGlmIHRhZ0N0eCBpcyBhbiBpbnRlZ2VyLCB0aGVuIGl0IGlzIHRoZSBrZXkgZm9yIHRoZSBjb21waWxlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGJvdW5kVGFnIHRhZ0N0eHNcblx0XHRib3VuZFRhZyA9IHR5cGVvZiB0YWdDdHhzID09PSBcIm51bWJlclwiICYmIHBhcmVudFZpZXcudG1wbC5ibmRzW3RhZ0N0eHMtMV07XG5cblx0aWYgKHRhZ05hbWUuX2lzID09PSBcInRhZ1wiKSB7XG5cdFx0dGFnID0gdGFnTmFtZTtcblx0XHR0YWdOYW1lID0gdGFnLnRhZ05hbWU7XG5cdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzO1xuXHRcdHRlbXBsYXRlID0gdGFnLnRlbXBsYXRlO1xuXHR9IGVsc2Uge1xuXHRcdHRhZ0RlZiA9IHBhcmVudFZpZXcuZ2V0UnNjKFwidGFnc1wiLCB0YWdOYW1lKSB8fCBlcnJvcihcIlVua25vd24gdGFnOiB7e1wiICsgdGFnTmFtZSArIFwifX0gXCIpO1xuXHRcdHRlbXBsYXRlID0gdGFnRGVmLnRlbXBsYXRlO1xuXHR9XG5cblx0aWYgKG9uRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldCArPSBvbkVycm9yO1xuXHRcdHRhZ0N0eHMgPSBvbkVycm9yID0gW3twcm9wczoge30sIGFyZ3M6IFtdfV07XG5cdH0gZWxzZSBpZiAoYm91bmRUYWcpIHtcblx0XHR0YWdDdHhzID0gYm91bmRUYWcocGFyZW50Vmlldy5kYXRhLCBwYXJlbnRWaWV3LCAkc3ViKTtcblx0fVxuXG5cdGwgPSB0YWdDdHhzLmxlbmd0aDtcblx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdHRhZ0N0eCA9IHRhZ0N0eHNbaV07XG5cdFx0aWYgKCFsaW5rQ3R4IHx8ICFsaW5rQ3R4LnRhZyB8fCBpICYmICFsaW5rQ3R4LnRhZy5fLmlubGluZSB8fCB0YWcuX2VyKSB7XG5cdFx0XHQvLyBJbml0aWFsaXplIHRhZ0N0eFxuXHRcdFx0Ly8gRm9yIGJsb2NrIHRhZ3MsIHRhZ0N0eC50bXBsIGlzIGFuIGludGVnZXIgPiAwXG5cdFx0XHRpZiAoY29udGVudCA9IHBhcmVudFRtcGwudG1wbHMgJiYgdGFnQ3R4LnRtcGwpIHtcblx0XHRcdFx0Y29udGVudCA9IHRhZ0N0eC5jb250ZW50ID0gcGFyZW50VG1wbC50bXBsc1tjb250ZW50IC0gMV07XG5cdFx0XHR9XG5cdFx0XHR0YWdDdHguaW5kZXggPSBpO1xuXHRcdFx0dGFnQ3R4LnRtcGwgPSBjb250ZW50OyAvLyBTZXQgdGhlIHRtcGwgcHJvcGVydHkgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2NrIHRhZ1xuXHRcdFx0dGFnQ3R4LnJlbmRlciA9IHJlbmRlckNvbnRlbnQ7XG5cdFx0XHR0YWdDdHgudmlldyA9IHBhcmVudFZpZXc7XG5cdFx0XHR0YWdDdHguY3R4ID0gZXh0ZW5kQ3R4KHRhZ0N0eC5jdHgsIGN0eCk7IC8vIENsb25lIGFuZCBleHRlbmQgcGFyZW50Vmlldy5jdHhcblx0XHR9XG5cdFx0aWYgKHRtcGwgPSB0YWdDdHgucHJvcHMudG1wbCkge1xuXHRcdFx0Ly8gSWYgdGhlIHRtcGwgcHJvcGVydHkgaXMgb3ZlcnJpZGRlbiwgc2V0IHRoZSB2YWx1ZSAod2hlbiBpbml0aWFsaXppbmcsIG9yLCBpbiBjYXNlIG9mIGJpbmRpbmc6IF50bXBsPS4uLiwgd2hlbiB1cGRhdGluZylcblx0XHRcdHRhZ0N0eC50bXBsID0gcGFyZW50Vmlldy5nZXRUbXBsKHRtcGwpO1xuXHRcdH1cblxuXHRcdGlmICghdGFnKSB7XG5cdFx0XHQvLyBUaGlzIHdpbGwgb25seSBiZSBoaXQgZm9yIGluaXRpYWwgdGFnQ3R4IChub3QgZm9yIHt7ZWxzZX19KSAtIGlmIHRoZSB0YWcgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgeWV0XG5cdFx0XHQvLyBJbnN0YW50aWF0ZSB0YWcgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0XG5cdFx0XHQvLyBJZiB0aGUgdGFnIGhhcyBub3QgYWxyZWFkeSBiZWVuIGluc3RhbnRpYXRlZCwgd2Ugd2lsbCBjcmVhdGUgYSBuZXcgaW5zdGFuY2UuXG5cdFx0XHQvLyB+dGFnIHdpbGwgYWNjZXNzIHRoZSB0YWcsIGV2ZW4gd2l0aGluIHRoZSByZW5kZXJpbmcgb2YgdGhlIHRlbXBsYXRlIGNvbnRlbnQgb2YgdGhpcyB0YWcuXG5cdFx0XHQvLyBGcm9tIGNoaWxkL2Rlc2NlbmRhbnQgdGFncywgY2FuIGFjY2VzcyB1c2luZyB+dGFnLnBhcmVudCwgb3IgfnBhcmVudFRhZ3MudGFnTmFtZVxuXHRcdFx0dGFnID0gbmV3IHRhZ0RlZi5fY3RyKCk7XG5cdFx0XHRjYWxsSW5pdCA9ICEhdGFnLmluaXQ7XG5cblx0XHRcdHRhZy5wYXJlbnQgPSBwYXJlbnRUYWcgPSBjdHggJiYgY3R4LnRhZztcblx0XHRcdHRhZy50YWdDdHhzID0gdGFnQ3R4cztcblx0XHRcdHRhZ0RhdGFNYXAgPSB0YWcuZGF0YU1hcDtcblxuXHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0dGFnLl8uaW5saW5lID0gZmFsc2U7XG5cdFx0XHRcdGxpbmtDdHgudGFnID0gdGFnO1xuXHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFnLl8uYm5kID0gYm91bmRUYWcgfHwgbGlua0N0eC5mbikge1xuXHRcdFx0XHQvLyBCb3VuZCBpZiB7Xnt0YWcuLi59fSBvciBkYXRhLWxpbms9XCJ7dGFnLi4ufVwiXG5cdFx0XHRcdHRhZy5fLmFyclZ3cyA9IHt9O1xuXHRcdFx0fSBlbHNlIGlmICh0YWcuZGF0YUJvdW5kT25seSkge1xuXHRcdFx0XHRlcnJvcihcIntee1wiICsgdGFnTmFtZSArIFwifX0gdGFnIG11c3QgYmUgZGF0YS1ib3VuZFwiKTtcblx0XHRcdH1cblx0XHRcdC8vVE9ETyBiZXR0ZXIgcGVyZiBmb3IgY2hpbGRUYWdzKCkgLSBrZWVwIGNoaWxkIHRhZy50YWdzIGFycmF5LCAoYW5kIHJlbW92ZSBjaGlsZCwgd2hlbiBkaXNwb3NlZClcblx0XHRcdC8vIHRhZy50YWdzID0gW107XG5cdFx0fVxuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cztcblx0XHR0YWdEYXRhTWFwID0gdGFnLmRhdGFNYXA7XG5cblx0XHR0YWdDdHgudGFnID0gdGFnO1xuXHRcdGlmICh0YWdEYXRhTWFwICYmIHRhZ0N0eHMpIHtcblx0XHRcdHRhZ0N0eC5tYXAgPSB0YWdDdHhzW2ldLm1hcDsgLy8gQ29weSBvdmVyIHRoZSBjb21waWxlZCBtYXAgaW5zdGFuY2UgZnJvbSB0aGUgcHJldmlvdXMgdGFnQ3R4cyB0byB0aGUgcmVmcmVzaGVkIG9uZXNcblx0XHR9XG5cdFx0aWYgKCF0YWcuZmxvdykge1xuXHRcdFx0dGFnQ3R4Q3R4ID0gdGFnQ3R4LmN0eCA9IHRhZ0N0eC5jdHggfHwge307XG5cblx0XHRcdC8vIHRhZ3MgaGFzaDogdGFnLmN0eC50YWdzLCBtZXJnZWQgd2l0aCBwYXJlbnRWaWV3LmN0eC50YWdzLFxuXHRcdFx0dGFncyA9IHRhZy5wYXJlbnRzID0gdGFnQ3R4Q3R4LnBhcmVudFRhZ3MgPSBjdHggJiYgZXh0ZW5kQ3R4KHRhZ0N0eEN0eC5wYXJlbnRUYWdzLCBjdHgucGFyZW50VGFncykgfHwge307XG5cdFx0XHRpZiAocGFyZW50VGFnKSB7XG5cdFx0XHRcdHRhZ3NbcGFyZW50VGFnLnRhZ05hbWVdID0gcGFyZW50VGFnO1xuXHRcdFx0XHQvL1RPRE8gYmV0dGVyIHBlcmYgZm9yIGNoaWxkVGFnczogcGFyZW50VGFnLnRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0fVxuXHRcdFx0dGFnc1t0YWcudGFnTmFtZV0gPSB0YWdDdHhDdHgudGFnID0gdGFnO1xuXHRcdH1cblx0fVxuXHRpZiAoISh0YWcuX2VyID0gb25FcnJvcikpIHtcblx0XHR0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eHNbMF0pO1xuXHRcdHRhZy5yZW5kZXJpbmcgPSB7fTsgLy8gUHJvdmlkZSBvYmplY3QgZm9yIHN0YXRlIGR1cmluZyByZW5kZXIgY2FsbHMgdG8gdGFnIGFuZCBlbHNlcy4gKFVzZWQgYnkge3tpZn19IGFuZCB7e2Zvcn19Li4uKVxuXHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdHRhZ0N0eCA9IHRhZy50YWdDdHggPSB0YWdDdHhzW2ldO1xuXHRcdFx0cHJvcHMgPSB0YWdDdHgucHJvcHM7XG5cdFx0XHRhcmdzID0gdGFnLmN2dEFyZ3MoKTtcblxuXHRcdFx0aWYgKG1hcERlZiA9IHByb3BzLmRhdGFNYXAgfHwgdGFnRGF0YU1hcCkge1xuXHRcdFx0XHRpZiAoYXJncy5sZW5ndGggfHwgcHJvcHMuZGF0YU1hcCkge1xuXHRcdFx0XHRcdHRoaXNNYXAgPSB0YWdDdHgubWFwO1xuXHRcdFx0XHRcdGlmICghdGhpc01hcCB8fCB0aGlzTWFwLnNyYyAhPT0gYXJnc1swXSB8fCBpc1VwZGF0ZSkge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXNNYXAgJiYgdGhpc01hcC5zcmMpIHtcblx0XHRcdFx0XHRcdFx0dGhpc01hcC51bm1hcCgpOyAvLyBvbmx5IGNhbGxlZCBpZiBvYnNlcnZhYmxlIG1hcCAtIG5vdCB3aGVuIG9ubHkgdXNlZCBpbiBKc1JlbmRlciwgZS5nLiBieSB7e3Byb3BzfX1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXNNYXAgPSB0YWdDdHgubWFwID0gbWFwRGVmLm1hcChhcmdzWzBdLCBwcm9wcywgdW5kZWZpbmVkLCAhdGFnLl8uYm5kKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXJncyA9IFt0aGlzTWFwLnRndF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRhZy5jdHggPSB0YWdDdHguY3R4O1xuXG5cdFx0XHRpZiAoIWkpIHtcblx0XHRcdFx0aWYgKGNhbGxJbml0KSB7XG5cdFx0XHRcdFx0aW5pdGlhbFRtcGwgPSB0YWcudGVtcGxhdGU7XG5cdFx0XHRcdFx0dGFnLmluaXQodGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4KTtcblx0XHRcdFx0XHRjYWxsSW5pdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobGlua0N0eCkge1xuXHRcdFx0XHRcdC8vIFNldCBhdHRyIG9uIGxpbmtDdHggdG8gZW5zdXJlIG91dHB1dHRpbmcgdG8gdGhlIGNvcnJlY3QgdGFyZ2V0IGF0dHJpYnV0ZS5cblx0XHRcdFx0XHQvLyBTZXR0aW5nIGVpdGhlciBsaW5rQ3R4LmF0dHIgb3IgdGhpcy5hdHRyIGluIHRoZSBpbml0KCkgYWxsb3dzIHBlci1pbnN0YW5jZSBjaG9pY2Ugb2YgdGFyZ2V0IGF0dHJpYi5cblx0XHRcdFx0XHRsaW5rQ3R4LmF0dHIgPSB0YWcuYXR0ciA9IGxpbmtDdHguYXR0ciB8fCB0YWcuYXR0cjtcblx0XHRcdFx0fVxuXHRcdFx0XHRhdHRyID0gdGFnLmF0dHI7XG5cdFx0XHRcdHRhZy5fLm5vVndzID0gYXR0ciAmJiBhdHRyICE9PSBIVE1MO1xuXHRcdFx0fVxuXG5cdFx0XHRpdGVtUmV0ID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHRhZy5yZW5kZXIpIHtcblx0XHRcdFx0aXRlbVJldCA9IHRhZy5yZW5kZXIuYXBwbHkodGFnLCBhcmdzKTtcblx0XHRcdFx0aWYgKHBhcmVudFZpZXcubGlua2VkICYmIGl0ZW1SZXQgJiYgdGFnLmxpbmtlZEVsZW0gJiYgIXJXcmFwcGVkSW5WaWV3TWFya2VyLnRlc3QoaXRlbVJldCkpIHtcblx0XHRcdFx0XHQvLyBXaGVuIGEgdGFnIHJlbmRlcnMgY29udGVudCBmcm9tIHRoZSByZW5kZXIgbWV0aG9kLCB3aXRoIGRhdGEgbGlua2luZywgYW5kIGhhcyBhIGxpbmtlZEVsZW0gYmluZGluZywgdGhlbiB3ZSBuZWVkIHRvIHdyYXAgd2l0aFxuXHRcdFx0XHRcdC8vIHZpZXcgbWFya2VycywgaWYgYWJzZW50LCBzbyB0aGUgY29udGVudCBpcyBhIHZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWcsIHdoaWNoIHdpbGwgY29ycmVjdGx5IGRpc3Bvc2UgYmluZGluZ3MgaWYgZGVsZXRlZC5cblx0XHRcdFx0XHRpdGVtUmV0ID0gcmVuZGVyV2l0aFZpZXdzKCQudGVtcGxhdGVzKGl0ZW1SZXQpLCBhcmdzWzBdLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcGFyZW50VmlldywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRhZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghYXJncy5sZW5ndGgpIHtcblx0XHRcdFx0YXJncyA9IFtwYXJlbnRWaWV3XTsgLy8gbm8gYXJndW1lbnRzIC0gKGUuZy4ge3tlbHNlfX0pIGdldCBkYXRhIGNvbnRleHQgZnJvbSB2aWV3LlxuXHRcdFx0fVxuXHRcdFx0aWYgKGl0ZW1SZXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250ZW50Q3R4ID0gYXJnc1swXTsgLy8gRGVmYXVsdCBkYXRhIGNvbnRleHQgZm9yIHdyYXBwZWQgYmxvY2sgY29udGVudCBpcyB0aGUgZmlyc3QgYXJndW1lbnQuIERlZmluZWQgdGFnLmNvbnRlbnRDdHggZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhpcy5cblx0XHRcdFx0aWYgKHRhZy5jb250ZW50Q3R4KSB7XG5cdFx0XHRcdFx0Y29udGVudEN0eCA9IHRhZy5jb250ZW50Q3R4KGNvbnRlbnRDdHgpIHx8IGNvbnRlbnRDdHg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aXRlbVJldCA9IHRhZ0N0eC5yZW5kZXIoY29udGVudEN0eCwgdHJ1ZSkgfHwgKGlzVXBkYXRlID8gdW5kZWZpbmVkIDogXCJcIik7XG5cdFx0XHR9XG5cdFx0XHQvLyBObyByZXR1cm4gdmFsdWUgZnJvbSByZW5kZXIsIGFuZCBubyB0ZW1wbGF0ZS9jb250ZW50IHRhZ0N0eC5yZW5kZXIoLi4uKSwgc28gcmV0dXJuIHVuZGVmaW5lZFxuXHRcdFx0cmV0ID0gcmV0ID8gcmV0ICsgKGl0ZW1SZXQgfHwgXCJcIikgOiBpdGVtUmV0OyAvLyBJZiBubyByZW5kZXJlZCBjb250ZW50LCB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkXG5cdFx0fVxuXHRcdHRhZy5yZW5kZXJpbmcgPSB1bmRlZmluZWQ7XG5cdH1cblx0dGFnLnRhZ0N0eCA9IHRhZ0N0eHNbMF07XG5cdHRhZy5jdHggPSB0YWcudGFnQ3R4LmN0eDtcblxuXHRpZiAodGFnLl8ubm9Wd3MpIHtcblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdC8vIGlubGluZSB0YWcgd2l0aCBhdHRyIHNldCB0byBcInRleHRcIiB3aWxsIGluc2VydCBIVE1MLWVuY29kZWQgY29udGVudCAtIGFzIGlmIGl0IHdhcyBlbGVtZW50LWJhc2VkIGlubmVyVGV4dFxuXHRcdFx0cmV0ID0gYXR0ciA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0PyAkY29udmVydGVycy5odG1sKHJldClcblx0XHRcdFx0OiBcIlwiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYm91bmRUYWcgJiYgcGFyZW50Vmlldy5fLm9uUmVuZGVyXG5cdFx0Ly8gQ2FsbCBvblJlbmRlciAodXNlZCBieSBKc1ZpZXdzIGlmIHByZXNlbnQsIHRvIGFkZCBiaW5kaW5nIGFubm90YXRpb25zIGFyb3VuZCByZW5kZXJlZCBjb250ZW50KVxuXHRcdD8gcGFyZW50Vmlldy5fLm9uUmVuZGVyKHJldCwgcGFyZW50VmlldywgdGFnKVxuXHRcdDogcmV0O1xufVxuXG4vLz09PT09PT09PT09PT09PT09XG4vLyBWaWV3IGNvbnN0cnVjdG9yXG4vLz09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIFZpZXcoY29udGV4dCwgdHlwZSwgcGFyZW50VmlldywgZGF0YSwgdGVtcGxhdGUsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKSB7XG5cdC8vIENvbnN0cnVjdG9yIGZvciB2aWV3IG9iamVjdCBpbiB2aWV3IGhpZXJhcmNoeS4gKEF1Z21lbnRlZCBieSBKc1ZpZXdzIGlmIEpzVmlld3MgaXMgbG9hZGVkKVxuXHR2YXIgdmlld3MsIHBhcmVudFZpZXdfLCB0YWcsIHNlbGZfLFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdGlzQXJyYXkgPSB0eXBlID09PSBcImFycmF5XCI7XG5cblx0c2VsZi5jb250ZW50ID0gY29udGVudFRtcGw7XG5cdHNlbGYudmlld3MgPSBpc0FycmF5ID8gW10gOiB7fTtcblx0c2VsZi5wYXJlbnQgPSBwYXJlbnRWaWV3O1xuXHRzZWxmLnR5cGUgPSB0eXBlIHx8IFwidG9wXCI7XG5cdHNlbGYuZGF0YSA9IGRhdGE7XG5cdHNlbGYudG1wbCA9IHRlbXBsYXRlO1xuXHQvLyBJZiB0aGUgZGF0YSBpcyBhbiBhcnJheSwgdGhpcyBpcyBhbiAnYXJyYXkgdmlldycgd2l0aCBhIHZpZXdzIGFycmF5IGZvciBlYWNoIGNoaWxkICdpdGVtIHZpZXcnXG5cdC8vIElmIHRoZSBkYXRhIGlzIG5vdCBhbiBhcnJheSwgdGhpcyBpcyBhbiAnaXRlbSB2aWV3JyB3aXRoIGEgdmlld3MgJ2hhc2gnIG9iamVjdCBmb3IgYW55IGNoaWxkIG5lc3RlZCB2aWV3c1xuXHQvLyAuXy51c2VLZXkgaXMgbm9uIHplcm8gaWYgaXMgbm90IGFuICdhcnJheSB2aWV3JyAob3duaW5nIGEgZGF0YSBhcnJheSkuIFVzZSB0aGlzIGFzIG5leHQga2V5IGZvciBhZGRpbmcgdG8gY2hpbGQgdmlld3MgaGFzaFxuXHRzZWxmXyA9IHNlbGYuXyA9IHtcblx0XHRrZXk6IDAsXG5cdFx0dXNlS2V5OiBpc0FycmF5ID8gMCA6IDEsXG5cdFx0aWQ6IFwiXCIgKyB2aWV3SWQrKyxcblx0XHRvblJlbmRlcjogb25SZW5kZXIsXG5cdFx0Ym5kczoge31cblx0fTtcblx0c2VsZi5saW5rZWQgPSAhIW9uUmVuZGVyO1xuXHRpZiAocGFyZW50Vmlldykge1xuXHRcdHZpZXdzID0gcGFyZW50Vmlldy52aWV3cztcblx0XHRwYXJlbnRWaWV3XyA9IHBhcmVudFZpZXcuXztcblx0XHRpZiAocGFyZW50Vmlld18udXNlS2V5KSB7XG5cdFx0XHQvLyBQYXJlbnQgaXMgbm90IGFuICdhcnJheSB2aWV3Jy4gQWRkIHRoaXMgdmlldyB0byBpdHMgdmlld3Mgb2JqZWN0XG5cdFx0XHQvLyBzZWxmLl9rZXkgPSBpcyB0aGUga2V5IGluIHRoZSBwYXJlbnQgdmlldyBoYXNoXG5cdFx0XHR2aWV3c1tzZWxmXy5rZXkgPSBcIl9cIiArIHBhcmVudFZpZXdfLnVzZUtleSsrXSA9IHNlbGY7XG5cdFx0XHRzZWxmLmluZGV4ID0gaW5kZXhTdHI7XG5cdFx0XHRzZWxmLmdldEluZGV4ID0gZ2V0TmVzdGVkSW5kZXg7XG5cdFx0fSBlbHNlIGlmICh2aWV3cy5sZW5ndGggPT09IChzZWxmXy5rZXkgPSBzZWxmLmluZGV4ID0ga2V5KSkgeyAvLyBQYXJlbnQgaXMgYW4gJ2FycmF5IHZpZXcnLiBBZGQgdGhpcyB2aWV3IHRvIGl0cyB2aWV3cyBhcnJheVxuXHRcdFx0dmlld3MucHVzaChzZWxmKTsgLy8gQWRkaW5nIHRvIGVuZCBvZiB2aWV3cyBhcnJheS4gKFVzaW5nIHB1c2ggd2hlbiBwb3NzaWJsZSAtIGJldHRlciBwZXJmIHRoYW4gc3BsaWNlKVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2aWV3cy5zcGxpY2Uoa2V5LCAwLCBzZWxmKTsgLy8gSW5zZXJ0aW5nIGluIHZpZXdzIGFycmF5XG5cdFx0fVxuXHRcdC8vIElmIG5vIGNvbnRleHQgd2FzIHBhc3NlZCBpbiwgdXNlIHBhcmVudCBjb250ZXh0XG5cdFx0Ly8gSWYgY29udGV4dCB3YXMgcGFzc2VkIGluLCBpdCBzaG91bGQgaGF2ZSBiZWVuIG1lcmdlZCBhbHJlYWR5IHdpdGggcGFyZW50IGNvbnRleHRcblx0XHRzZWxmLmN0eCA9IGNvbnRleHQgfHwgcGFyZW50Vmlldy5jdHg7XG5cdH0gZWxzZSB7XG5cdFx0c2VsZi5jdHggPSBjb250ZXh0O1xuXHR9XG59XG5cblZpZXcucHJvdG90eXBlID0ge1xuXHRnZXQ6IGdldFZpZXcsXG5cdGdldEluZGV4OiBnZXRJbmRleCxcblx0Z2V0UnNjOiBnZXRSZXNvdXJjZSxcblx0Z2V0VG1wbDogZ2V0VGVtcGxhdGUsXG5cdGhscDogZ2V0SGVscGVyLFxuXHRfaXM6IFwidmlld1wiXG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlZ2lzdHJhdGlvblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbXBpbGVDaGlsZFJlc291cmNlcyhwYXJlbnRUbXBsKSB7XG5cdHZhciBzdG9yZU5hbWUsIHN0b3JlTmFtZXMsIHJlc291cmNlcztcblx0Zm9yIChzdG9yZU5hbWUgaW4ganN2U3RvcmVzKSB7XG5cdFx0c3RvcmVOYW1lcyA9IHN0b3JlTmFtZSArIFwic1wiO1xuXHRcdGlmIChwYXJlbnRUbXBsW3N0b3JlTmFtZXNdKSB7XG5cdFx0XHRyZXNvdXJjZXMgPSBwYXJlbnRUbXBsW3N0b3JlTmFtZXNdOyAgICAvLyBSZXNvdXJjZXMgbm90IHlldCBjb21waWxlZFxuXHRcdFx0cGFyZW50VG1wbFtzdG9yZU5hbWVzXSA9IHt9OyAgICAgICAgICAgICAgIC8vIFJlbW92ZSB1bmNvbXBpbGVkIHJlc291cmNlc1xuXHRcdFx0JHZpZXdzW3N0b3JlTmFtZXNdKHJlc291cmNlcywgcGFyZW50VG1wbCk7IC8vIEFkZCBiYWNrIGluIHRoZSBjb21waWxlZCByZXNvdXJjZXNcblx0XHR9XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT1cbi8vIGNvbXBpbGVUYWdcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbXBpbGVUYWcobmFtZSwgdGFnRGVmLCBwYXJlbnRUbXBsKSB7XG5cdHZhciB0bXBsLCBiYXNlVGFnLCBwcm9wLFxuXHRcdGNvbXBpbGVkRGVmID0gbmV3ICRzdWIuX3RnKCk7XG5cblx0ZnVuY3Rpb24gVGFnKCkge1xuXHRcdHZhciB0YWcgPSB0aGlzO1xuXHRcdHRhZy5fID0ge1xuXHRcdFx0aW5saW5lOiB0cnVlLFxuXHRcdFx0dW5saW5rZWQ6IHRydWVcblx0XHR9O1xuXG5cdFx0dGFnLnRhZ05hbWUgPSBuYW1lO1xuXHR9XG5cblx0aWYgKCRpc0Z1bmN0aW9uKHRhZ0RlZikpIHtcblx0XHQvLyBTaW1wbGUgdGFnIGRlY2xhcmVkIGFzIGZ1bmN0aW9uLiBObyBwcmVzZW50ZXIgaW5zdGFudGF0aW9uLlxuXHRcdHRhZ0RlZiA9IHtcblx0XHRcdGRlcGVuZHM6IHRhZ0RlZi5kZXBlbmRzLFxuXHRcdFx0cmVuZGVyOiB0YWdEZWZcblx0XHR9O1xuXHR9IGVsc2UgaWYgKFwiXCIgKyB0YWdEZWYgPT09IHRhZ0RlZikge1xuXHRcdHRhZ0RlZiA9IHt0ZW1wbGF0ZTogdGFnRGVmfTtcblx0fVxuXHRpZiAoYmFzZVRhZyA9IHRhZ0RlZi5iYXNlVGFnKSB7XG5cdFx0dGFnRGVmLmZsb3cgPSAhIXRhZ0RlZi5mbG93OyAvLyBTZXQgZmxvdyBwcm9wZXJ0eSwgc28gZGVmYXVsdHMgdG8gZmFsc2UgZXZlbiBpZiBiYXNlVGFnIGhhcyBmbG93PXRydWVcblx0XHR0YWdEZWYuYmFzZVRhZyA9IGJhc2VUYWcgPSBcIlwiICsgYmFzZVRhZyA9PT0gYmFzZVRhZ1xuXHRcdFx0PyAocGFyZW50VG1wbCAmJiBwYXJlbnRUbXBsLnRhZ3NbYmFzZVRhZ10gfHwgJHRhZ3NbYmFzZVRhZ10pXG5cdFx0XHQ6IGJhc2VUYWc7XG5cblx0XHRjb21waWxlZERlZiA9ICRleHRlbmQoY29tcGlsZWREZWYsIGJhc2VUYWcpO1xuXG5cdFx0Zm9yIChwcm9wIGluIHRhZ0RlZikge1xuXHRcdFx0Y29tcGlsZWREZWZbcHJvcF0gPSBnZXRNZXRob2QoYmFzZVRhZ1twcm9wXSwgdGFnRGVmW3Byb3BdKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29tcGlsZWREZWYgPSAkZXh0ZW5kKGNvbXBpbGVkRGVmLCB0YWdEZWYpO1xuXHR9XG5cblx0Ly8gVGFnIGRlY2xhcmVkIGFzIG9iamVjdCwgdXNlZCBhcyB0aGUgcHJvdG90eXBlIGZvciB0YWcgaW5zdGFudGlhdGlvbiAoY29udHJvbC9wcmVzZW50ZXIpXG5cdGlmICgodG1wbCA9IGNvbXBpbGVkRGVmLnRlbXBsYXRlKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Y29tcGlsZWREZWYudGVtcGxhdGUgPSBcIlwiICsgdG1wbCA9PT0gdG1wbCA/ICgkdGVtcGxhdGVzW3RtcGxdIHx8ICR0ZW1wbGF0ZXModG1wbCkpIDogdG1wbDtcblx0fVxuXHRpZiAoY29tcGlsZWREZWYuaW5pdCAhPT0gZmFsc2UpIHtcblx0XHQvLyBTZXQgaW5pdDogZmFsc2Ugb24gdGFnRGVmIGlmIHlvdSB3YW50IHRvIHByb3ZpZGUganVzdCBhIHJlbmRlciBtZXRob2QsIG9yIHJlbmRlciBhbmQgdGVtcGxhdGUsIGJ1dCBubyBjb25zdHJ1Y3RvciBvciBwcm90b3R5cGUuXG5cdFx0Ly8gc28gZXF1aXZhbGVudCB0byBzZXR0aW5nIHRhZyB0byByZW5kZXIgZnVuY3Rpb24sIGV4Y2VwdCB5b3UgY2FuIGFsc28gcHJvdmlkZSBhIHRlbXBsYXRlLlxuXHRcdChUYWcucHJvdG90eXBlID0gY29tcGlsZWREZWYpLmNvbnN0cnVjdG9yID0gY29tcGlsZWREZWYuX2N0ciA9IFRhZztcblx0fVxuXG5cdGlmIChwYXJlbnRUbXBsKSB7XG5cdFx0Y29tcGlsZWREZWYuX3BhcmVudFRtcGwgPSBwYXJlbnRUbXBsO1xuXHR9XG5cdHJldHVybiBjb21waWxlZERlZjtcbn1cblxuZnVuY3Rpb24gYmFzZUFwcGx5KGFyZ3MpIHtcblx0Ly8gSW4gZGVyaXZlZCBtZXRob2QgKG9yIGhhbmRsZXIgZGVjbGFyZWQgZGVjbGFyYXRpdmVseSBhcyBpbiB7ezpmb28gb25DaGFuZ2U9fmZvb0NoYW5nZWR9fSBjYW4gY2FsbCBiYXNlIG1ldGhvZCxcblx0Ly8gdXNpbmcgdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSAoRXF1aXZhbGVudCB0byB0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cykgaW4galF1ZXJ5IFVJKVxuXHRyZXR1cm4gdGhpcy5iYXNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xufVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVRtcGxcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbXBpbGVUbXBsKG5hbWUsIHRtcGwsIHBhcmVudFRtcGwsIG9wdGlvbnMpIHtcblx0Ly8gdG1wbCBpcyBlaXRoZXIgYSB0ZW1wbGF0ZSBvYmplY3QsIGEgc2VsZWN0b3IgZm9yIGEgdGVtcGxhdGUgc2NyaXB0IGJsb2NrLCB0aGUgbmFtZSBvZiBhIGNvbXBpbGVkIHRlbXBsYXRlLCBvciBhIHRlbXBsYXRlIG9iamVjdFxuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gbG9va3VwVGVtcGxhdGUodmFsdWUpIHtcblx0XHQvLyBJZiB2YWx1ZSBpcyBvZiB0eXBlIHN0cmluZyAtIHRyZWF0IGFzIHNlbGVjdG9yLCBvciBuYW1lIG9mIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0Ly8gUmV0dXJuIHRoZSB0ZW1wbGF0ZSBvYmplY3QsIGlmIGFscmVhZHkgY29tcGlsZWQsIG9yIHRoZSBtYXJrdXAgc3RyaW5nXG5cdFx0dmFyIGN1cnJlbnROYW1lLCB0bXBsO1xuXHRcdGlmICgoXCJcIiArIHZhbHVlID09PSB2YWx1ZSkgfHwgdmFsdWUubm9kZVR5cGUgPiAwICYmIChlbGVtID0gdmFsdWUpKSB7XG5cdFx0XHRpZiAoIWVsZW0pIHtcblx0XHRcdFx0aWYgKC9eXFwuXFwvW15cXFxcOio/XCI8Pl0qJC8udGVzdCh2YWx1ZSkpIHtcblx0XHRcdFx0XHQvLyB0bXBsPVwiLi9zb21lL2ZpbGUuaHRtbFwiXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHRlbXBsYXRlIGlzIG5vdCBuYW1lZCwgdXNlIFwiLi9zb21lL2ZpbGUuaHRtbFwiIGFzIG5hbWUuXG5cdFx0XHRcdFx0aWYgKHRtcGwgPSAkdGVtcGxhdGVzW25hbWUgPSBuYW1lIHx8IHZhbHVlXSkge1xuXHRcdFx0XHRcdFx0dmFsdWUgPSB0bXBsO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBCUk9XU0VSLVNQRUNJRklDIENPREUgKG5vdCBvbiBOb2RlLmpzKTpcblx0XHRcdFx0XHRcdC8vIExvb2sgZm9yIHNlcnZlci1nZW5lcmF0ZWQgc2NyaXB0IGJsb2NrIHdpdGggaWQgXCIuL3NvbWUvZmlsZS5odG1sXCJcblx0XHRcdFx0XHRcdGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCQuZm4gJiYgISRzdWIuclRtcGwudGVzdCh2YWx1ZSkpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9ICQoZG9jdW1lbnQpLmZpbmQodmFsdWUpWzBdOyAvLyBpZiBqUXVlcnkgaXMgbG9hZGVkLCB0ZXN0IGZvciBzZWxlY3RvciByZXR1cm5pbmcgZWxlbWVudHMsIGFuZCBnZXQgZmlyc3QgZWxlbWVudFxuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdH0vLyBFTkQgQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0XHR9IC8vQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0XHRpZiAoZWxlbSkge1xuXHRcdFx0XHQvLyBHZW5lcmFsbHkgdGhpcyBpcyBhIHNjcmlwdCBlbGVtZW50LlxuXHRcdFx0XHQvLyBIb3dldmVyIHdlIGFsbG93IGl0IHRvIGJlIGFueSBlbGVtZW50LCBzbyB5b3UgY2FuIGZvciBleGFtcGxlIHRha2UgdGhlIGNvbnRlbnQgb2YgYSBkaXYsXG5cdFx0XHRcdC8vIHVzZSBpdCBhcyBhIHRlbXBsYXRlLCBhbmQgcmVwbGFjZSBpdCBieSB0aGUgc2FtZSBjb250ZW50IHJlbmRlcmVkIGFnYWluc3QgZGF0YS5cblx0XHRcdFx0Ly8gZS5nLiBmb3IgbGlua2luZyB0aGUgY29udGVudCBvZiBhIGRpdiB0byBhIGNvbnRhaW5lciwgYW5kIHVzaW5nIHRoZSBpbml0aWFsIGNvbnRlbnQgYXMgdGVtcGxhdGU6XG5cdFx0XHRcdC8vICQubGluayhcIiNjb250ZW50XCIsIG1vZGVsLCB7dG1wbDogXCIjY29udGVudFwifSk7XG5cdFx0XHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHRcdFx0Ly8gV2Ugd2lsbCBjb21waWxlIGEgbmV3IHRlbXBsYXRlIHVzaW5nIHRoZSBtYXJrdXAgaW4gdGhlIHNjcmlwdCBlbGVtZW50XG5cdFx0XHRcdFx0dmFsdWUgPSBlbGVtLmlubmVySFRNTDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBXZSB3aWxsIGNhY2hlIGEgc2luZ2xlIGNvcHkgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIG5hbWVcblx0XHRcdFx0XHQvLyAocmVuYW1pbmcgZnJvbSBhIHByZXZpb3VzIG5hbWUgaWYgdGhlcmUgd2FzIG9uZSkuXG5cdFx0XHRcdFx0Y3VycmVudE5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZSh0bXBsQXR0cik7XG5cdFx0XHRcdFx0aWYgKGN1cnJlbnROYW1lKSB7XG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudE5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSAkdGVtcGxhdGVzW2N1cnJlbnROYW1lXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlICR0ZW1wbGF0ZXNbY3VycmVudE5hbWVdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICgkLmZuKSB7XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gJC5kYXRhKGVsZW0pW2pzdlRtcGxdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gbmFtZSB8fCAoJC5mbiA/IGpzdlRtcGwgOiB2YWx1ZSk7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGNvbXBpbGVUbXBsKG5hbWUsIGVsZW0uaW5uZXJIVE1MLCBwYXJlbnRUbXBsLCBvcHRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFsdWUudG1wbE5hbWUgPSBuYW1lID0gbmFtZSB8fCBjdXJyZW50TmFtZTtcblx0XHRcdFx0XHRpZiAobmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0XHRcdFx0JHRlbXBsYXRlc1tuYW1lXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSh0bXBsQXR0ciwgbmFtZSk7XG5cdFx0XHRcdFx0aWYgKCQuZm4pIHtcblx0XHRcdFx0XHRcdCQuZGF0YShlbGVtLCBqc3ZUbXBsLCB2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IC8vIEVORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdGVsZW0gPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmICghdmFsdWUuZm4pIHtcblx0XHRcdHZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgbm90IGEgc3RyaW5nLiBIVE1MIGVsZW1lbnQsIG9yIGNvbXBpbGVkIHRlbXBsYXRlLCByZXR1cm4gdW5kZWZpbmVkXG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHZhciBlbGVtLCBjb21waWxlZFRtcGwsXG5cdFx0dG1wbE9yTWFya3VwID0gdG1wbCA9IHRtcGwgfHwgXCJcIjtcblxuXHQvLz09PT0gQ29tcGlsZSB0aGUgdGVtcGxhdGUgPT09PVxuXHRpZiAob3B0aW9ucyA9PT0gMCkge1xuXHRcdG9wdGlvbnMgPSB1bmRlZmluZWQ7XG5cdFx0dG1wbE9yTWFya3VwID0gbG9va3VwVGVtcGxhdGUodG1wbE9yTWFya3VwKTsgLy8gVG9wLWxldmVsIGNvbXBpbGUgc28gZG8gYSB0ZW1wbGF0ZSBsb29rdXBcblx0fVxuXG5cdC8vIElmIG9wdGlvbnMsIHRoZW4gdGhpcyB3YXMgYWxyZWFkeSBjb21waWxlZCBmcm9tIGEgKHNjcmlwdCkgZWxlbWVudCB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi5cblx0Ly8gSWYgbm90LCB0aGVuIGlmIHRtcGwgaXMgYSB0ZW1wbGF0ZSBvYmplY3QsIHVzZSBpdCBmb3Igb3B0aW9uc1xuXHRvcHRpb25zID0gb3B0aW9ucyB8fCAodG1wbC5tYXJrdXAgPyB0bXBsIDoge30pO1xuXHRvcHRpb25zLnRtcGxOYW1lID0gbmFtZTtcblx0aWYgKHBhcmVudFRtcGwpIHtcblx0XHRvcHRpb25zLl9wYXJlbnRUbXBsID0gcGFyZW50VG1wbDtcblx0fVxuXHQvLyBJZiB0bXBsIGlzIG5vdCBhIG1hcmt1cCBzdHJpbmcgb3IgYSBzZWxlY3RvciBzdHJpbmcsIHRoZW4gaXQgbXVzdCBiZSBhIHRlbXBsYXRlIG9iamVjdFxuXHQvLyBJbiB0aGF0IGNhc2UsIGdldCBpdCBmcm9tIHRoZSBtYXJrdXAgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxuXHRpZiAoIXRtcGxPck1hcmt1cCAmJiB0bXBsLm1hcmt1cCAmJiAodG1wbE9yTWFya3VwID0gbG9va3VwVGVtcGxhdGUodG1wbC5tYXJrdXApKSkge1xuXHRcdGlmICh0bXBsT3JNYXJrdXAuZm4pIHtcblx0XHRcdC8vIElmIHRoZSBzdHJpbmcgcmVmZXJlbmNlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIG9iamVjdCwgbmVlZCB0byByZWNvbXBpbGUgdG8gbWVyZ2UgYW55IG1vZGlmaWVkIG9wdGlvbnNcblx0XHRcdHRtcGxPck1hcmt1cCA9IHRtcGxPck1hcmt1cC5tYXJrdXA7XG5cdFx0fVxuXHR9XG5cdGlmICh0bXBsT3JNYXJrdXAgIT09IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0bXBsT3JNYXJrdXAuZm4gfHwgdG1wbC5mbikge1xuXHRcdFx0Ly8gdG1wbCBpcyBhbHJlYWR5IGNvbXBpbGVkLCBzbyB1c2UgaXRcblx0XHRcdGlmICh0bXBsT3JNYXJrdXAuZm4pIHtcblx0XHRcdFx0Y29tcGlsZWRUbXBsID0gdG1wbE9yTWFya3VwO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB0bXBsT3JNYXJrdXAgaXMgYSBtYXJrdXAgc3RyaW5nLCBub3QgYSBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdFx0Ly8gQ3JlYXRlIHRlbXBsYXRlIG9iamVjdFxuXHRcdFx0dG1wbCA9IHRtcGxPYmplY3QodG1wbE9yTWFya3VwLCBvcHRpb25zKTtcblx0XHRcdC8vIENvbXBpbGUgdG8gQVNUIGFuZCB0aGVuIHRvIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHR0bXBsRm4odG1wbE9yTWFya3VwLnJlcGxhY2UockVzY2FwZVF1b3RlcywgXCJcXFxcJCZcIiksIHRtcGwpO1xuXHRcdH1cblx0XHRpZiAoIWNvbXBpbGVkVG1wbCkge1xuXHRcdFx0Y29tcGlsZWRUbXBsID0gJGV4dGVuZChmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVkVG1wbC5yZW5kZXIuYXBwbHkoY29tcGlsZWRUbXBsLCBhcmd1bWVudHMpO1xuXHRcdFx0fSwgdG1wbCk7XG5cblx0XHRcdGNvbXBpbGVDaGlsZFJlc291cmNlcyhjb21waWxlZFRtcGwpO1xuXHRcdH1cblx0XHRpZiAobmFtZSAmJiAhcGFyZW50VG1wbCAmJiBuYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHQkcmVuZGVyW25hbWVdID0gY29tcGlsZWRUbXBsO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZWRUbXBsO1xuXHR9XG59XG5cbi8vPT09PSAvZW5kIG9mIGZ1bmN0aW9uIGNvbXBpbGVUbXBsID09PT1cblxuLy89PT09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVZpZXdNb2RlbFxuLy89PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VmFsKGRlZmF1bHRWYWwsIGRhdGEpIHtcblx0cmV0dXJuICQuaXNGdW5jdGlvbihkZWZhdWx0VmFsKVxuXHRcdD8gZGVmYXVsdFZhbC5jYWxsKGRhdGEpXG5cdFx0OiBkZWZhdWx0VmFsO1xufVxuXG5mdW5jdGlvbiB1bm1hcEFycmF5KG1vZGVsQXJyKSB7XG5cdFx0dmFyIGksIGFyciA9IFtdLFxuXHRcdFx0bCA9IG1vZGVsQXJyLmxlbmd0aDtcblx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdGFyci5wdXNoKG1vZGVsQXJyW2ldLnVubWFwKCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBjb21waWxlVmlld01vZGVsKG5hbWUsIHR5cGUpIHtcblx0dmFyIGksIGNvbnN0cnVjdG9yLFxuXHRcdHZpZXdNb2RlbHMgPSB0aGlzLFxuXHRcdGdldHRlcnMgPSB0eXBlLmdldHRlcnMsXG5cdFx0ZXh0ZW5kID0gdHlwZS5leHRlbmQsXG5cdFx0aWQgPSB0eXBlLmlkLFxuXHRcdHByb3RvID0gJC5leHRlbmQoe1xuXHRcdFx0X2lzOiBuYW1lIHx8IFwidW5uYW1lZFwiLFxuXHRcdFx0dW5tYXA6IHVubWFwLFxuXHRcdFx0bWVyZ2U6IG1lcmdlXG5cdFx0fSwgZXh0ZW5kKSxcblx0XHRhcmdzID0gXCJcIixcblx0XHRib2R5ID0gXCJcIixcblx0XHRsID0gZ2V0dGVycyA/IGdldHRlcnMubGVuZ3RoIDogMCxcblx0XHQkb2JzZXJ2YWJsZSA9ICQub2JzZXJ2YWJsZSxcblx0XHRnZXR0ZXJOYW1lcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIEdldE5ldyhhcmdzKSB7XG5cdFx0Y29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJncyk7XG5cdH1cblxuXHRmdW5jdGlvbiB2bSgpIHtcblx0XHRyZXR1cm4gbmV3IEdldE5ldyhhcmd1bWVudHMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gaXRlcmF0ZShkYXRhLCBhY3Rpb24pIHtcblx0XHR2YXIgaiwgZ2V0dGVyVHlwZSwgZGVmYXVsdFZhbCwgcHJvcCwgb2IsXG5cdFx0XHRtID0gZ2V0dGVycy5sZW5ndGg7XG5cdFx0Zm9yIChqPTA7IGo8bTsgaisrKSB7XG5cdFx0XHRwcm9wID0gZ2V0dGVyc1tqXTtcblx0XHRcdGdldHRlclR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAocHJvcCArIFwiXCIgIT09IHByb3ApIHtcblx0XHRcdFx0Z2V0dGVyVHlwZSA9IHByb3A7XG5cdFx0XHRcdHByb3AgPSBnZXR0ZXJUeXBlLmdldHRlcjtcblx0XHRcdH1cblx0XHRcdGlmICgob2IgPSBkYXRhW3Byb3BdKSA9PT0gdW5kZWZpbmVkICYmIGdldHRlclR5cGUgJiYgKGRlZmF1bHRWYWwgPSBnZXR0ZXJUeXBlLmRlZmF1bHRWYWwpICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0b2IgPSBnZXREZWZhdWx0VmFsKGRlZmF1bHRWYWwsIGRhdGEpO1xuXHRcdFx0fVxuXHRcdFx0YWN0aW9uKG9iLCBnZXR0ZXJUeXBlICYmIHZpZXdNb2RlbHNbZ2V0dGVyVHlwZS50eXBlXSwgcHJvcCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gbWFwKGRhdGEpIHtcblx0XHRkYXRhID0gZGF0YSArIFwiXCIgPT09IGRhdGFcblx0XHRcdD8gSlNPTi5wYXJzZShkYXRhKSAvLyBBY2NlcHQgSlNPTiBzdHJpbmdcblx0XHRcdDogZGF0YTsgICAgICAgICAgICAvLyBvciBvYmplY3QvYXJyYXlcblx0XHR2YXIgaSwgaiwgIGwsIG0sIHByb3AsXG5cdFx0XHRvYiA9IGRhdGEsXG5cdFx0XHRhcnIgPSBbXTtcblxuXHRcdGlmICgkaXNBcnJheShkYXRhKSkge1xuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgW107XG5cdFx0XHRsID0gZGF0YS5sZW5ndGg7XG5cdFx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdFx0YXJyLnB1c2godGhpcy5tYXAoZGF0YVtpXSkpO1xuXHRcdFx0fVxuXHRcdFx0YXJyLl9pcyA9IG5hbWU7XG5cdFx0XHRhcnIudW5tYXAgPSB1bm1hcDtcblx0XHRcdGFyci5tZXJnZSA9IG1lcmdlO1xuXHRcdFx0cmV0dXJuIGFycjtcblx0XHR9XG5cblx0XHRpZiAoZGF0YSkge1xuXHRcdFx0aXRlcmF0ZShkYXRhLCBmdW5jdGlvbihvYiwgdmlld01vZGVsKSB7XG5cdFx0XHRcdGlmICh2aWV3TW9kZWwpIHsgLy8gSXRlcmF0ZSB0byBidWlsZCBnZXR0ZXJzIGFyZyBhcnJheSAodmFsdWUsIG9yIG1hcHBlZCB2YWx1ZSlcblx0XHRcdFx0XHRvYiA9IHZpZXdNb2RlbC5tYXAob2IpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFyci5wdXNoKG9iKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRvYiA9IHRoaXMuYXBwbHkodGhpcywgYXJyKTsgLy8gSW5zYW50aWF0ZSB0aGlzIFZpZXcgTW9kZWwsIHBhc3NpbmcgZ2V0dGVycyBhcmdzIGFycmF5IHRvIGNvbnN0cnVjdG9yXG5cdFx0XHRmb3IgKHByb3AgaW4gZGF0YSkgeyAvLyBDb3B5IG92ZXIgYW55IG90aGVyIHByb3BlcnRpZXMuIHRoYXQgYXJlIG5vdCBnZXQvc2V0IHByb3BlcnRpZXNcblx0XHRcdFx0aWYgKHByb3AgIT09ICRleHBhbmRvICAmJiAhZ2V0dGVyTmFtZXNbcHJvcF0pIHtcblx0XHRcdFx0XHRvYltwcm9wXSA9IGRhdGFbcHJvcF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9iO1xuXHR9XG5cblx0ZnVuY3Rpb24gbWVyZ2UoZGF0YSkge1xuXHRcdGRhdGEgPSBkYXRhICsgXCJcIiA9PT0gZGF0YVxuXHRcdFx0PyBKU09OLnBhcnNlKGRhdGEpIC8vIEFjY2VwdCBKU09OIHN0cmluZ1xuXHRcdFx0OiBkYXRhOyAgICAgICAgICAgIC8vIG9yIG9iamVjdC9hcnJheVxuXHRcdHZhciBpLCBqLCBsLCBtLCBwcm9wLCBtb2QsIGZvdW5kLCBhc3NpZ25lZCwgb2IsIG5ld01vZEFycixcblx0XHRcdG1vZGVsID0gdGhpcztcblxuXHRcdGlmICgkaXNBcnJheShtb2RlbCkpIHtcblx0XHRcdGFzc2lnbmVkID0ge307XG5cdFx0XHRuZXdNb2RBcnIgPSBbXTtcblx0XHRcdGwgPSBkYXRhLmxlbmd0aDtcblx0XHRcdG0gPSBtb2RlbC5sZW5ndGg7XG5cdFx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdFx0b2IgPSBkYXRhW2ldO1xuXHRcdFx0XHRmb3VuZCA9IGZhbHNlO1xuXHRcdFx0XHRmb3IgKGo9MDsgajxtICYmICFmb3VuZDsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKGFzc2lnbmVkW2pdKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kID0gbW9kZWxbal07XG5cblx0XHRcdFx0XHRpZiAoaWQpIHtcblx0XHRcdFx0XHRcdGFzc2lnbmVkW2pdID0gZm91bmQgPSBpZCArIFwiXCIgPT09IGlkXG5cdFx0XHRcdFx0XHQ/IChvYltpZF0gJiYgKGdldHRlck5hbWVzW2lkXSA/IG1vZFtpZF0oKSA6IG1vZFtpZF0pID09PSBvYltpZF0pXG5cdFx0XHRcdFx0XHQ6IGlkKG1vZCwgb2IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZm91bmQpIHtcblx0XHRcdFx0XHRtb2QubWVyZ2Uob2IpO1xuXHRcdFx0XHRcdG5ld01vZEFyci5wdXNoKG1vZCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bmV3TW9kQXJyLnB1c2godm0ubWFwKG9iKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHQkb2JzZXJ2YWJsZShtb2RlbCkucmVmcmVzaChuZXdNb2RBcnIsIHRydWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kZWwuc3BsaWNlLmFwcGx5KG1vZGVsLCBbMCwgbW9kZWwubGVuZ3RoXS5jb25jYXQobmV3TW9kQXJyKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGl0ZXJhdGUoZGF0YSwgZnVuY3Rpb24ob2IsIHZpZXdNb2RlbCwgZ2V0dGVyKSB7XG5cdFx0XHRpZiAodmlld01vZGVsKSB7XG5cdFx0XHRcdG1vZGVsW2dldHRlcl0oKS5tZXJnZShvYik7IC8vIFVwZGF0ZSB0eXBlZCBwcm9wZXJ0eVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kZWxbZ2V0dGVyXShvYik7IC8vIFVwZGF0ZSBub24tdHlwZWQgcHJvcGVydHlcblx0XHRcdH1cblx0XHR9KTtcblx0XHRmb3IgKHByb3AgaW4gZGF0YSkge1xuXHRcdFx0aWYgKHByb3AgIT09ICRleHBhbmRvICYmICFnZXR0ZXJOYW1lc1twcm9wXSkge1xuXHRcdFx0XHRtb2RlbFtwcm9wXSA9IGRhdGFbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gdW5tYXAoKSB7XG5cdFx0dmFyIG9iLCBwcm9wLCBpLCBsLCBnZXR0ZXJUeXBlLCBhcnIsIHZhbHVlLFxuXHRcdFx0bW9kZWwgPSB0aGlzO1xuXG5cdFx0aWYgKCRpc0FycmF5KG1vZGVsKSkge1xuXHRcdFx0cmV0dXJuIHVubWFwQXJyYXkobW9kZWwpO1xuXHRcdH1cblx0XHRvYiA9IHt9O1xuXHRcdGwgPSBnZXR0ZXJzLmxlbmd0aDtcblx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdHByb3AgPSBnZXR0ZXJzW2ldO1xuXHRcdFx0Z2V0dGVyVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGlmIChwcm9wICsgXCJcIiAhPT0gcHJvcCkge1xuXHRcdFx0XHRnZXR0ZXJUeXBlID0gcHJvcDtcblx0XHRcdFx0cHJvcCA9IGdldHRlclR5cGUuZ2V0dGVyO1xuXHRcdFx0fVxuXHRcdFx0dmFsdWUgPSBtb2RlbFtwcm9wXSgpO1xuXHRcdFx0b2JbcHJvcF0gPSBnZXR0ZXJUeXBlICYmIHZhbHVlICYmIHZpZXdNb2RlbHNbZ2V0dGVyVHlwZS50eXBlXVxuXHRcdFx0XHQ/ICRpc0FycmF5KHZhbHVlKVxuXHRcdFx0XHRcdD8gdW5tYXBBcnJheSh2YWx1ZSlcblx0XHRcdFx0XHQ6IHZhbHVlLnVubWFwKClcblx0XHRcdFx0OiB2YWx1ZTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wIGluIG1vZGVsKSB7XG5cdFx0XHRpZiAocHJvcCAhPT0gXCJfaXNcIiAmJiAhZ2V0dGVyTmFtZXNbcHJvcF0gJiYgcHJvcCAhPT0gJGV4cGFuZG8gICYmIChwcm9wLmNoYXJBdCgwKSAhPT0gXCJfXCIgfHwgIWdldHRlck5hbWVzW3Byb3Auc2xpY2UoMSldKSAmJiAhJC5pc0Z1bmN0aW9uKG1vZGVsW3Byb3BdKSkge1xuXHRcdFx0XHRvYltwcm9wXSA9IG1vZGVsW3Byb3BdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb2I7XG5cdH1cblxuXHRHZXROZXcucHJvdG90eXBlID0gcHJvdG87XG5cblx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0KGZ1bmN0aW9uKGdldHRlcikge1xuXHRcdFx0Z2V0dGVyID0gZ2V0dGVyLmdldHRlciB8fCBnZXR0ZXI7XG5cdFx0XHRnZXR0ZXJOYW1lc1tnZXR0ZXJdID0gaSsxO1xuXHRcdFx0dmFyIHByaXZGaWVsZCA9IFwiX1wiICsgZ2V0dGVyO1xuXG5cdFx0XHRhcmdzICs9IChhcmdzID8gXCIsXCIgOiBcIlwiKSArIGdldHRlcjtcblx0XHRcdGJvZHkgKz0gXCJ0aGlzLlwiICsgcHJpdkZpZWxkICsgXCIgPSBcIiArIGdldHRlciArIFwiO1xcblwiO1xuXHRcdFx0cHJvdG9bZ2V0dGVyXSA9IHByb3RvW2dldHRlcl0gfHwgZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzW3ByaXZGaWVsZF07IC8vIElmIHRoZXJlIGlzIG5vIGFyZ3VtZW50LCB1c2UgYXMgYSBnZXR0ZXJcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoJG9ic2VydmFibGUpIHtcblx0XHRcdFx0XHQkb2JzZXJ2YWJsZSh0aGlzKS5zZXRQcm9wZXJ0eShnZXR0ZXIsIHZhbCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpc1twcml2RmllbGRdID0gdmFsO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoJG9ic2VydmFibGUpIHtcblx0XHRcdFx0cHJvdG9bZ2V0dGVyXS5zZXQgPSBwcm90b1tnZXR0ZXJdLnNldCB8fCBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0XHR0aGlzW3ByaXZGaWVsZF0gPSB2YWw7IC8vIFNldHRlciBjYWxsZWQgYnkgb2JzZXJ2YWJsZSBwcm9wZXJ0eSBjaGFuZ2Vcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9KShnZXR0ZXJzW2ldKTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yID0gbmV3IEZ1bmN0aW9uKGFyZ3MsIGJvZHkuc2xpY2UoMCwgLTEpKTtcblx0Y29uc3RydWN0b3IucHJvdG90eXBlID0gcHJvdG87XG5cdHByb3RvLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG5cblx0dm0ubWFwID0gbWFwO1xuXHR2bS5nZXR0ZXJzID0gZ2V0dGVycztcblx0dm0uZXh0ZW5kID0gZXh0ZW5kO1xuXHR2bS5pZCA9IGlkO1xuXHRyZXR1cm4gdm07XG59XG5cbmZ1bmN0aW9uIHRtcGxPYmplY3QobWFya3VwLCBvcHRpb25zKSB7XG5cdC8vIFRlbXBsYXRlIG9iamVjdCBjb25zdHJ1Y3RvclxuXHR2YXIgaHRtbFRhZyxcblx0XHR3cmFwTWFwID0gJHN1YlNldHRpbmdzQWR2YW5jZWQuX3dtIHx8IHt9LCAvLyBPbmx5IHVzZWQgaW4gSnNWaWV3cy4gT3RoZXJ3aXNlIGVtcHR5OiB7fVxuXHRcdHRtcGwgPSAkZXh0ZW5kKFxuXHRcdFx0e1xuXHRcdFx0XHR0bXBsczogW10sXG5cdFx0XHRcdGxpbmtzOiB7fSwgLy8gQ29tcGlsZWQgZnVuY3Rpb25zIGZvciBsaW5rIGV4cHJlc3Npb25zXG5cdFx0XHRcdGJuZHM6IFtdLFxuXHRcdFx0XHRfaXM6IFwidGVtcGxhdGVcIixcblx0XHRcdFx0cmVuZGVyOiByZW5kZXJDb250ZW50XG5cdFx0XHR9LFxuXHRcdFx0b3B0aW9uc1xuXHRcdCk7XG5cblx0dG1wbC5tYXJrdXAgPSBtYXJrdXA7XG5cdGlmICghb3B0aW9ucy5odG1sVGFnKSB7XG5cdFx0Ly8gU2V0IHRtcGwudGFnIHRvIHRoZSB0b3AtbGV2ZWwgSFRNTCB0YWcgdXNlZCBpbiB0aGUgdGVtcGxhdGUsIGlmIGFueS4uLlxuXHRcdGh0bWxUYWcgPSByRmlyc3RFbGVtLmV4ZWMobWFya3VwKTtcblx0XHR0bXBsLmh0bWxUYWcgPSBodG1sVGFnID8gaHRtbFRhZ1sxXS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcblx0fVxuXHRodG1sVGFnID0gd3JhcE1hcFt0bXBsLmh0bWxUYWddO1xuXHRpZiAoaHRtbFRhZyAmJiBodG1sVGFnICE9PSB3cmFwTWFwLmRpdikge1xuXHRcdC8vIFdoZW4gdXNpbmcgSnNWaWV3cywgd2UgdHJpbSB0ZW1wbGF0ZXMgd2hpY2ggYXJlIGluc2VydGVkIGludG8gSFRNTCBjb250ZXh0cyB3aGVyZSB0ZXh0IG5vZGVzIGFyZSBub3QgcmVuZGVyZWQgKGkuZS4gbm90ICdQaHJhc2luZyBDb250ZW50JykuXG5cdFx0Ly8gQ3VycmVudGx5IG5vdCB0cmltbWVkIGZvciA8bGk+IHRhZy4gKE5vdCB3b3J0aCBhZGRpbmcgcGVyZiBjb3N0KVxuXHRcdHRtcGwubWFya3VwID0gJC50cmltKHRtcGwubWFya3VwKTtcblx0fVxuXG5cdHJldHVybiB0bXBsO1xufVxuXG4vLz09PT09PT09PT09PT09XG4vLyByZWdpc3RlclN0b3JlXG4vLz09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU3RvcmUoc3RvcmVOYW1lLCBzdG9yZVNldHRpbmdzKSB7XG5cblx0ZnVuY3Rpb24gdGhlU3RvcmUobmFtZSwgaXRlbSwgcGFyZW50VG1wbCkge1xuXHRcdC8vIFRoZSBzdG9yZSBpcyBhbHNvIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGFkZCBpdGVtcyB0byB0aGUgc3RvcmUuIGUuZy4gJC50ZW1wbGF0ZXMsIG9yICQudmlld3MudGFnc1xuXG5cdFx0Ly8gRm9yIHN0b3JlIG9mIG5hbWUgJ3RoaW5nJywgQ2FsbCBhczpcblx0XHQvLyAgICAkLnZpZXdzLnRoaW5ncyhpdGVtc1ssIHBhcmVudFRtcGxdKSxcblx0XHQvLyBvciAkLnZpZXdzLnRoaW5ncyhuYW1lLCBpdGVtWywgcGFyZW50VG1wbF0pXG5cblx0XHR2YXIgb25TdG9yZSwgY29tcGlsZSwgaXRlbU5hbWUsIHRoaXNTdG9yZTtcblx0XHRpZiAobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gT0JKRUNUICYmICFuYW1lLm5vZGVUeXBlICYmICFuYW1lLm1hcmt1cCAmJiAhbmFtZS5nZXRUZ3QgJiYgIShzdG9yZU5hbWUgPT09IFwidmlld01vZGVsXCIgJiYgbmFtZS5nZXR0ZXJzIHx8IG5hbWUuZXh0ZW5kKSkge1xuXHRcdFx0Ly8gQ2FsbCB0byAkLnZpZXdzLnRoaW5ncyhpdGVtc1ssIHBhcmVudFRtcGxdKSxcblxuXHRcdFx0Ly8gQWRkaW5nIGl0ZW1zIHRvIHRoZSBzdG9yZVxuXHRcdFx0Ly8gSWYgbmFtZSBpcyBhIGhhc2gsIHRoZW4gaXRlbSBpcyBwYXJlbnRUbXBsLiBJdGVyYXRlIG92ZXIgaGFzaCBhbmQgY2FsbCBzdG9yZSBmb3Iga2V5LlxuXHRcdFx0Zm9yIChpdGVtTmFtZSBpbiBuYW1lKSB7XG5cdFx0XHRcdHRoZVN0b3JlKGl0ZW1OYW1lLCBuYW1lW2l0ZW1OYW1lXSwgaXRlbSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaXRlbSB8fCAkdmlld3M7XG5cdFx0fVxuXHRcdC8vIEFkZGluZyBhIHNpbmdsZSB1bm5hbWVkIGl0ZW0gdG8gdGhlIHN0b3JlXG5cdFx0aWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aXRlbSA9IG5hbWU7XG5cdFx0XHRuYW1lID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAobmFtZSAmJiBcIlwiICsgbmFtZSAhPT0gbmFtZSkgeyAvLyBuYW1lIG11c3QgYmUgYSBzdHJpbmdcblx0XHRcdHBhcmVudFRtcGwgPSBpdGVtO1xuXHRcdFx0aXRlbSA9IG5hbWU7XG5cdFx0XHRuYW1lID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0aGlzU3RvcmUgPSBwYXJlbnRUbXBsXG5cdFx0XHQ/IHN0b3JlTmFtZSA9PT0gXCJ2aWV3TW9kZWxcIlxuXHRcdFx0XHQ/IHBhcmVudFRtcGxcblx0XHRcdFx0OiAocGFyZW50VG1wbFtzdG9yZU5hbWVzXSA9IHBhcmVudFRtcGxbc3RvcmVOYW1lc10gfHwge30pXG5cdFx0XHQ6IHRoZVN0b3JlO1xuXHRcdGNvbXBpbGUgPSBzdG9yZVNldHRpbmdzLmNvbXBpbGU7XG5cdFx0aWYgKGl0ZW0gPT09IG51bGwpIHtcblx0XHRcdC8vIElmIGl0ZW0gaXMgbnVsbCwgZGVsZXRlIHRoaXMgZW50cnlcblx0XHRcdGlmIChuYW1lKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzU3RvcmVbbmFtZV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGl0ZW0gPSBjb21waWxlID8gY29tcGlsZS5jYWxsKHRoaXNTdG9yZSwgbmFtZSwgaXRlbSwgcGFyZW50VG1wbCwgMCkgOiBpdGVtO1xuXHRcdFx0aWYgKG5hbWUpIHtcblx0XHRcdFx0dGhpc1N0b3JlW25hbWVdID0gaXRlbTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNvbXBpbGUgJiYgaXRlbSkge1xuXHRcdFx0aXRlbS5faXMgPSBzdG9yZU5hbWU7IC8vIE9ubHkgZG8gdGhpcyBmb3IgY29tcGlsZWQgb2JqZWN0cyAodGFncywgdGVtcGxhdGVzLi4uKVxuXHRcdH1cblx0XHRpZiAoaXRlbSAmJiAob25TdG9yZSA9ICRzdWIub25TdG9yZVtzdG9yZU5hbWVdKSkge1xuXHRcdFx0Ly8gZS5nLiBKc1ZpZXdzIGludGVncmF0aW9uXG5cdFx0XHRvblN0b3JlKG5hbWUsIGl0ZW0sIGNvbXBpbGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gaXRlbTtcblx0fVxuXG5cdHZhciBzdG9yZU5hbWVzID0gc3RvcmVOYW1lICsgXCJzXCI7XG5cblx0JHZpZXdzW3N0b3JlTmFtZXNdID0gdGhlU3RvcmU7XG59XG5cbmZ1bmN0aW9uIGFkZFNldHRpbmcoc3QpIHtcblx0JHZpZXdzU2V0dGluZ3Nbc3RdID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuXHRcdFx0PyAoJHN1YlNldHRpbmdzW3N0XSA9IHZhbHVlLCAkdmlld3NTZXR0aW5ncylcblx0XHRcdDogJHN1YlNldHRpbmdzW3N0XTtcblx0fTtcbn1cblxuLy89PT09PT09PT1cbi8vIGRhdGFNYXBcbi8vPT09PT09PT09XG5cbmZ1bmN0aW9uIGRhdGFNYXAobWFwRGVmKSB7XG5cdGZ1bmN0aW9uIE1hcChzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHR0aGlzLnRndCA9IG1hcERlZi5nZXRUZ3Qoc291cmNlLCBvcHRpb25zKTtcblx0fVxuXG5cdGlmICgkaXNGdW5jdGlvbihtYXBEZWYpKSB7XG5cdFx0Ly8gU2ltcGxlIG1hcCBkZWNsYXJlZCBhcyBmdW5jdGlvblxuXHRcdG1hcERlZiA9IHtcblx0XHRcdGdldFRndDogbWFwRGVmXG5cdFx0fTtcblx0fVxuXG5cdGlmIChtYXBEZWYuYmFzZU1hcCkge1xuXHRcdG1hcERlZiA9ICRleHRlbmQoJGV4dGVuZCh7fSwgbWFwRGVmLmJhc2VNYXApLCBtYXBEZWYpO1xuXHR9XG5cblx0bWFwRGVmLm1hcCA9IGZ1bmN0aW9uKHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdHJldHVybiBuZXcgTWFwKHNvdXJjZSwgb3B0aW9ucyk7XG5cdH07XG5cdHJldHVybiBtYXBEZWY7XG59XG5cbi8vPT09PT09PT09PT09PT1cbi8vIHJlbmRlckNvbnRlbnRcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVuZGVyQ29udGVudChkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50Vmlldywga2V5LCBvblJlbmRlcikge1xuXHR2YXIgaSwgbCwgdGFnLCB0bXBsLCB0YWdDdHgsIGlzVG9wUmVuZGVyQ2FsbCwgcHJldkRhdGEsIHByZXZJbmRleCxcblx0XHR2aWV3ID0gcGFyZW50Vmlldyxcblx0XHRyZXN1bHQgPSBcIlwiO1xuXG5cdGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG5cdFx0bm9JdGVyYXRpb24gPSBjb250ZXh0OyAvLyBwYXNzaW5nIGJvb2xlYW4gYXMgc2Vjb25kIHBhcmFtIC0gbm9JdGVyYXRpb25cblx0XHRjb250ZXh0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSBPQkpFQ1QpIHtcblx0XHRjb250ZXh0ID0gdW5kZWZpbmVkOyAvLyBjb250ZXh0IG11c3QgYmUgYSBib29sZWFuIChub0l0ZXJhdGlvbikgb3IgYSBwbGFpbiBvYmplY3Rcblx0fVxuXG5cdGlmICh0YWcgPSB0aGlzLnRhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBjYWxsIGZyb20gcmVuZGVyVGFnIG9yIHRhZ0N0eC5yZW5kZXIoLi4uKVxuXHRcdHRhZ0N0eCA9IHRoaXM7XG5cdFx0dmlldyA9IHZpZXcgfHwgdGFnQ3R4LnZpZXc7XG5cdFx0dG1wbCA9IHZpZXcuZ2V0VG1wbCh0YWcudGVtcGxhdGUgfHwgdGFnQ3R4LnRtcGwpO1xuXHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0ZGF0YSA9IHZpZXc7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZS5yZW5kZXIoLi4uKSBjYWxsXG5cdFx0dG1wbCA9IHRoaXM7XG5cdH1cblxuXHRpZiAodG1wbCkge1xuXHRcdGlmICghcGFyZW50VmlldyAmJiBkYXRhICYmIGRhdGEuX2lzID09PSBcInZpZXdcIikge1xuXHRcdFx0dmlldyA9IGRhdGE7IC8vIFdoZW4gcGFzc2luZyBpbiBhIHZpZXcgdG8gcmVuZGVyIG9yIGxpbmsgKGFuZCBub3QgcGFzc2luZyBpbiBhIHBhcmVudCB2aWV3KSB1c2UgdGhlIHBhc3NlZC1pbiB2aWV3IGFzIHBhcmVudFZpZXdcblx0XHR9XG5cblx0XHRpZiAodmlldykge1xuXHRcdFx0aWYgKGRhdGEgPT09IHZpZXcpIHtcblx0XHRcdFx0Ly8gSW5oZXJpdCB0aGUgZGF0YSBmcm9tIHRoZSBwYXJlbnQgdmlldy5cblx0XHRcdFx0Ly8gVGhpcyBtYXkgYmUgdGhlIGNvbnRlbnRzIG9mIGFuIHt7aWZ9fSBibG9ja1xuXHRcdFx0XHRkYXRhID0gdmlldy5kYXRhO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlzVG9wUmVuZGVyQ2FsbCA9ICF2aWV3O1xuXHRcdGlzUmVuZGVyQ2FsbCA9IGlzUmVuZGVyQ2FsbCB8fCBpc1RvcFJlbmRlckNhbGw7XG5cdFx0aWYgKCF2aWV3KSB7XG5cdFx0XHQoY29udGV4dCA9IGNvbnRleHQgfHwge30pLnJvb3QgPSBkYXRhOyAvLyBQcm92aWRlIH5yb290IGFzIHNob3J0Y3V0IHRvIHRvcC1sZXZlbCBkYXRhLlxuXHRcdH1cblx0XHRpZiAoIWlzUmVuZGVyQ2FsbCB8fCAkc3ViU2V0dGluZ3NBZHZhbmNlZC51c2VWaWV3cyB8fCB0bXBsLnVzZVZpZXdzIHx8IHZpZXcgJiYgdmlldyAhPT0gdG9wVmlldykge1xuXHRcdFx0cmVzdWx0ID0gcmVuZGVyV2l0aFZpZXdzKHRtcGwsIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCB2aWV3LCBrZXksIG9uUmVuZGVyLCB0YWcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodmlldykgeyAvLyBJbiBhIGJsb2NrXG5cdFx0XHRcdHByZXZEYXRhID0gdmlldy5kYXRhO1xuXHRcdFx0XHRwcmV2SW5kZXggPSB2aWV3LmluZGV4O1xuXHRcdFx0XHR2aWV3LmluZGV4ID0gaW5kZXhTdHI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2aWV3ID0gdG9wVmlldztcblx0XHRcdFx0dmlldy5kYXRhID0gZGF0YTtcblx0XHRcdFx0dmlldy5jdHggPSBjb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0aWYgKCRpc0FycmF5KGRhdGEpICYmICFub0l0ZXJhdGlvbikge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciB0aGUgYXJyYXksIHdob3NlIGNoaWxkIHZpZXdzIGNvcnJlc3BvbmQgdG8gZWFjaCBkYXRhIGl0ZW0uIChOb3RlOiBpZiBrZXkgYW5kIHBhcmVudFZpZXcgYXJlIHBhc3NlZCBpblxuXHRcdFx0XHQvLyBhbG9uZyB3aXRoIHBhcmVudCB2aWV3LCB0cmVhdCBhcyBpbnNlcnQgLWUuZy4gZnJvbSB2aWV3LmFkZFZpZXdzIC0gc28gcGFyZW50VmlldyBpcyBhbHJlYWR5IHRoZSB2aWV3IGl0ZW0gZm9yIGFycmF5KVxuXHRcdFx0XHRmb3IgKGkgPSAwLCBsID0gZGF0YS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHR2aWV3LmluZGV4ID0gaTtcblx0XHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhW2ldO1xuXHRcdFx0XHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGFbaV0sIHZpZXcsICRzdWIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhO1xuXHRcdFx0XHRyZXN1bHQgKz0gdG1wbC5mbihkYXRhLCB2aWV3LCAkc3ViKTtcblx0XHRcdH1cblx0XHRcdHZpZXcuZGF0YSA9IHByZXZEYXRhO1xuXHRcdFx0dmlldy5pbmRleCA9IHByZXZJbmRleDtcblx0XHR9XG5cdFx0aWYgKGlzVG9wUmVuZGVyQ2FsbCkge1xuXHRcdFx0aXNSZW5kZXJDYWxsID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoVmlld3ModG1wbCwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHZpZXcsIGtleSwgb25SZW5kZXIsIHRhZykge1xuXHRmdW5jdGlvbiBzZXRJdGVtVmFyKGl0ZW0pIHtcblx0XHQvLyBXaGVuIGl0ZW1WYXIgaXMgc3BlY2lmaWVkLCBzZXQgbW9kaWZpZWQgY3R4IHdpdGggdXNlci1uYW1lZCB+aXRlbVxuXHRcdG5ld0N0eCA9ICRleHRlbmQoe30sIGNvbnRleHQpO1xuXHRcdG5ld0N0eFtpdGVtVmFyXSA9IGl0ZW07XG5cdH1cblxuXHQvLyBSZW5kZXIgdGVtcGxhdGUgYWdhaW5zdCBkYXRhIGFzIGEgdHJlZSBvZiBzdWJ2aWV3cyAobmVzdGVkIHJlbmRlcmVkIHRlbXBsYXRlIGluc3RhbmNlcyksIG9yIGFzIGEgc3RyaW5nICh0b3AtbGV2ZWwgdGVtcGxhdGUpLlxuXHQvLyBJZiB0aGUgZGF0YSBpcyB0aGUgcGFyZW50IHZpZXcsIHRyZWF0IGFzIG5vSXRlcmF0aW9uLCByZS1yZW5kZXIgd2l0aCB0aGUgc2FtZSBkYXRhIGNvbnRleHQuXG5cdHZhciBpLCBsLCBuZXdWaWV3LCBjaGlsZFZpZXcsIGl0ZW1SZXN1bHQsIHN3YXBDb250ZW50LCBjb250ZW50VG1wbCwgb3V0ZXJPblJlbmRlciwgdG1wbE5hbWUsIGl0ZW1WYXIsIG5ld0N0eCwgdGFnQ3R4LFxuXHRcdHJlc3VsdCA9IFwiXCI7XG5cblx0aWYgKHRhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBjYWxsIGZyb20gcmVuZGVyVGFnIG9yIHRhZ0N0eC5yZW5kZXIoLi4uKVxuXHRcdHRtcGxOYW1lID0gdGFnLnRhZ05hbWU7XG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eDtcblx0XHRjb250ZXh0ID0gY29udGV4dCA/IGV4dGVuZEN0eChjb250ZXh0LCB0YWcuY3R4KSA6IHRhZy5jdHg7XG5cblx0XHRpZiAodG1wbCA9PT0gdmlldy5jb250ZW50KSB7IC8vIHt7eHh4IHRtcGw9I2NvbnRlbnR9fVxuXHRcdFx0Y29udGVudFRtcGwgPSB0bXBsICE9PSB2aWV3LmN0eC5fd3JwIC8vIFdlIGFyZSByZW5kZXJpbmcgdGhlICNjb250ZW50XG5cdFx0XHRcdD8gdmlldy5jdHguX3dycCAvLyAjY29udGVudCB3YXMgdGhlIHRhZ0N0eC5wcm9wcy50bXBsIHdyYXBwZXIgb2YgdGhlIGJsb2NrIGNvbnRlbnQgLSBzbyB3aXRoaW4gdGhpcyB2aWV3LCAjY29udGVudCB3aWxsIG5vdyBiZSB0aGUgdmlldy5jdHguX3dycCBibG9jayBjb250ZW50XG5cdFx0XHRcdDogdW5kZWZpbmVkOyAvLyAjY29udGVudCB3YXMgdGhlIHZpZXcuY3R4Ll93cnAgYmxvY2sgY29udGVudCAtIHNvIHdpdGhpbiB0aGlzIHZpZXcsIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgI2NvbnRlbnQgdG8gd3JhcC5cblx0XHR9IGVsc2UgaWYgKHRtcGwgIT09IHRhZ0N0eC5jb250ZW50KSB7XG5cdFx0XHRpZiAodG1wbCA9PT0gdGFnLnRlbXBsYXRlKSB7IC8vIFJlbmRlcmluZyB7e3RhZ319IHRhZy50ZW1wbGF0ZSwgcmVwbGFjaW5nIGJsb2NrIGNvbnRlbnQuXG5cdFx0XHRcdGNvbnRlbnRUbXBsID0gdGFnQ3R4LnRtcGw7IC8vIFNldCAjY29udGVudCB0byBibG9jayBjb250ZW50IChvciB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgaWYgdGFnQ3R4LnByb3BzLnRtcGwgaXMgc2V0KVxuXHRcdFx0XHRjb250ZXh0Ll93cnAgPSB0YWdDdHguY29udGVudDsgLy8gUGFzcyB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgdG8gbmVzdGVkIHZpZXdzXG5cdFx0XHR9IGVsc2UgeyAvLyBSZW5kZXJpbmcgdGFnQ3R4LnByb3BzLnRtcGwgd3JhcHBlclxuXHRcdFx0XHRjb250ZW50VG1wbCA9IHRhZ0N0eC5jb250ZW50IHx8IHZpZXcuY29udGVudDsgLy8gU2V0ICNjb250ZW50IHRvIHdyYXBwZWQgYmxvY2sgY29udGVudFxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250ZW50VG1wbCA9IHZpZXcuY29udGVudDsgLy8gTmVzdGVkIHZpZXdzIGluaGVyaXQgc2FtZSB3cmFwcGVkICNjb250ZW50IHByb3BlcnR5XG5cdFx0fVxuXG5cdFx0aWYgKHRhZ0N0eC5wcm9wcy5saW5rID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gbGluaz1mYWxzZSBzZXR0aW5nIG9uIGJsb2NrIHRhZ1xuXHRcdFx0Ly8gV2Ugd2lsbCBvdmVycmlkZSBpbmhlcml0ZWQgdmFsdWUgb2YgbGluayBieSB0aGUgZXhwbGljaXQgc2V0dGluZyBsaW5rPWZhbHNlIHRha2VuIGZyb20gcHJvcHNcblx0XHRcdC8vIFRoZSBjaGlsZCB2aWV3cyBvZiBhbiB1bmxpbmtlZCB2aWV3IGFyZSBhbHNvIHVubGlua2VkLiBTbyBzZXR0aW5nIGNoaWxkIGJhY2sgdG8gdHJ1ZSB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QuXG5cdFx0XHRjb250ZXh0ID0gY29udGV4dCB8fCB7fTtcblx0XHRcdGNvbnRleHQubGluayA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtVmFyID0gdGFnQ3R4LnByb3BzLml0ZW1WYXIpIHtcblx0XHRcdGlmIChpdGVtVmFyLmNoYXJBdCgwKSAhPT0gXCJ+XCIpIHtcblx0XHRcdFx0c3ludGF4RXJyb3IoXCJVc2UgaXRlbVZhcj0nfm15SXRlbSdcIik7XG5cdFx0XHR9XG5cdFx0XHRpdGVtVmFyID0gaXRlbVZhci5zbGljZSgxKTtcblx0XHR9XG5cdH1cblxuXHRpZiAodmlldykge1xuXHRcdG9uUmVuZGVyID0gb25SZW5kZXIgfHwgdmlldy5fLm9uUmVuZGVyO1xuXHRcdGNvbnRleHQgPSBleHRlbmRDdHgoY29udGV4dCwgdmlldy5jdHgpO1xuXHR9XG5cblx0aWYgKGtleSA9PT0gdHJ1ZSkge1xuXHRcdHN3YXBDb250ZW50ID0gdHJ1ZTtcblx0XHRrZXkgPSAwO1xuXHR9XG5cblx0Ly8gSWYgbGluaz09PWZhbHNlLCBkbyBub3QgY2FsbCBvblJlbmRlciwgc28gbm8gZGF0YS1saW5raW5nIG1hcmtlciBub2Rlc1xuXHRpZiAob25SZW5kZXIgJiYgKGNvbnRleHQgJiYgY29udGV4dC5saW5rID09PSBmYWxzZSB8fCB0YWcgJiYgdGFnLl8ubm9Wd3MpKSB7XG5cdFx0b25SZW5kZXIgPSB1bmRlZmluZWQ7XG5cdH1cblx0b3V0ZXJPblJlbmRlciA9IG9uUmVuZGVyO1xuXHRpZiAob25SZW5kZXIgPT09IHRydWUpIHtcblx0XHQvLyBVc2VkIGJ5IHZpZXcucmVmcmVzaCgpLiBEb24ndCBjcmVhdGUgYSBuZXcgd3JhcHBlciB2aWV3LlxuXHRcdG91dGVyT25SZW5kZXIgPSB1bmRlZmluZWQ7XG5cdFx0b25SZW5kZXIgPSB2aWV3Ll8ub25SZW5kZXI7XG5cdH1cblx0Ly8gU2V0IGFkZGl0aW9uYWwgY29udGV4dCBvbiB2aWV3cyBjcmVhdGVkIGhlcmUsIChhcyBtb2RpZmllZCBjb250ZXh0IGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQsIGFuZCB0byBiZSBpbmhlcml0ZWQgYnkgY2hpbGQgdmlld3MpXG5cdGNvbnRleHQgPSB0bXBsLmhlbHBlcnNcblx0XHQ/IGV4dGVuZEN0eCh0bXBsLmhlbHBlcnMsIGNvbnRleHQpXG5cdFx0OiBjb250ZXh0O1xuXG5cdG5ld0N0eCA9IGNvbnRleHQ7XG5cdGlmICgkaXNBcnJheShkYXRhKSAmJiAhbm9JdGVyYXRpb24pIHtcblx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciB0aGUgYXJyYXksIHdob3NlIGNoaWxkIHZpZXdzIGNvcnJlc3BvbmQgdG8gZWFjaCBkYXRhIGl0ZW0uIChOb3RlOiBpZiBrZXkgYW5kIHZpZXcgYXJlIHBhc3NlZCBpblxuXHRcdC8vIGFsb25nIHdpdGggcGFyZW50IHZpZXcsIHRyZWF0IGFzIGluc2VydCAtZS5nLiBmcm9tIHZpZXcuYWRkVmlld3MgLSBzbyB2aWV3IGlzIGFscmVhZHkgdGhlIHZpZXcgaXRlbSBmb3IgYXJyYXkpXG5cdFx0bmV3VmlldyA9IHN3YXBDb250ZW50XG5cdFx0XHQ/IHZpZXdcblx0XHRcdDogKGtleSAhPT0gdW5kZWZpbmVkICYmIHZpZXcpXG5cdFx0XHRcdHx8IG5ldyBWaWV3KGNvbnRleHQsIFwiYXJyYXlcIiwgdmlldywgZGF0YSwgdG1wbCwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpO1xuXHRcdGlmICh2aWV3ICYmIHZpZXcuXy51c2VLZXkpIHtcblx0XHRcdC8vIFBhcmVudCBpcyBub3QgYW4gJ2FycmF5IHZpZXcnXG5cdFx0XHRuZXdWaWV3Ll8uYm5kID0gIXRhZyB8fCB0YWcuXy5ibmQgJiYgdGFnOyAvLyBGb3IgYXJyYXkgdmlld3MgdGhhdCBhcmUgZGF0YSBib3VuZCBmb3IgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLCBzZXQgdGhlXG5cdFx0XHQvLyB2aWV3Ll8uYm5kIHByb3BlcnR5IHRvIHRydWUgZm9yIHRvcC1sZXZlbCBsaW5rKCkgb3IgZGF0YS1saW5rPVwie2Zvcn1cIiwgb3IgdG8gdGhlIHRhZyBpbnN0YW5jZSBmb3IgYSBkYXRhLWJvdW5kIHRhZywgZS5nLiB7Xntmb3IgLi4ufX1cblx0XHR9XG5cdFx0aWYgKGl0ZW1WYXIpIHtcblx0XHRcdG5ld1ZpZXcuaXQgPSBpdGVtVmFyO1xuXHRcdH1cblx0XHRpdGVtVmFyID0gbmV3Vmlldy5pdDtcblx0XHRmb3IgKGkgPSAwLCBsID0gZGF0YS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIGVhY2ggZGF0YSBpdGVtLlxuXHRcdFx0aWYgKGl0ZW1WYXIpIHtcblx0XHRcdFx0c2V0SXRlbVZhcihkYXRhW2ldKTsgLy8gdXNlIG1vZGlmaWVkIGN0eCB3aXRoIHVzZXItbmFtZWQgfml0ZW1cblx0XHRcdH1cblx0XHRcdGNoaWxkVmlldyA9IG5ldyBWaWV3KG5ld0N0eCwgXCJpdGVtXCIsIG5ld1ZpZXcsIGRhdGFbaV0sIHRtcGwsIChrZXkgfHwgMCkgKyBpLCBvblJlbmRlciwgbmV3Vmlldy5jb250ZW50KTtcblxuXHRcdFx0aXRlbVJlc3VsdCA9IHRtcGwuZm4oZGF0YVtpXSwgY2hpbGRWaWV3LCAkc3ViKTtcblx0XHRcdHJlc3VsdCArPSBuZXdWaWV3Ll8ub25SZW5kZXIgPyBuZXdWaWV3Ll8ub25SZW5kZXIoaXRlbVJlc3VsdCwgY2hpbGRWaWV3KSA6IGl0ZW1SZXN1bHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHNpbmdsZXRvbiBkYXRhIG9iamVjdC4gVGhlIHR5cGUgb2YgdGhlIHZpZXcgd2lsbCBiZSB0aGUgdGFnIG5hbWUsIGUuZy4gXCJpZlwiIG9yIFwibXlUYWdcIiBleGNlcHQgZm9yXG5cdFx0Ly8gXCJpdGVtXCIsIFwiYXJyYXlcIiBhbmQgXCJkYXRhXCIgdmlld3MuIEEgXCJkYXRhXCIgdmlldyBpcyBmcm9tIHByb2dyYW1tYXRpYyByZW5kZXIob2JqZWN0KSBhZ2FpbnN0IGEgJ3NpbmdsZXRvbicuXG5cdFx0aWYgKGl0ZW1WYXIpIHtcblx0XHRcdHNldEl0ZW1WYXIoZGF0YSk7XG5cdFx0fVxuXHRcdG5ld1ZpZXcgPSBzd2FwQ29udGVudCA/IHZpZXcgOiBuZXcgVmlldyhuZXdDdHgsIHRtcGxOYW1lIHx8IFwiZGF0YVwiLCB2aWV3LCBkYXRhLCB0bXBsLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCk7XG5cdFx0aWYgKHRhZyAmJiAhdGFnLmZsb3cpIHtcblx0XHRcdG5ld1ZpZXcudGFnID0gdGFnO1xuXHRcdFx0dGFnLnZpZXcgPSBuZXdWaWV3O1xuXHRcdH1cblx0XHRyZXN1bHQgKz0gdG1wbC5mbihkYXRhLCBuZXdWaWV3LCAkc3ViKTtcblx0fVxuXHRyZXR1cm4gb3V0ZXJPblJlbmRlciA/IG91dGVyT25SZW5kZXIocmVzdWx0LCBuZXdWaWV3KSA6IHJlc3VsdDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWxkIGFuZCBjb21waWxlIHRlbXBsYXRlXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBHZW5lcmF0ZSBhIHJldXNhYmxlIGZ1bmN0aW9uIHRoYXQgd2lsbCBzZXJ2ZSB0byByZW5kZXIgYSB0ZW1wbGF0ZSBhZ2FpbnN0IGRhdGFcbi8vIChDb21waWxlIEFTVCB0aGVuIGJ1aWxkIHRlbXBsYXRlIGZ1bmN0aW9uKVxuXG5mdW5jdGlvbiBvblJlbmRlckVycm9yKGUsIHZpZXcsIGZhbGxiYWNrKSB7XG5cdHZhciBtZXNzYWdlID0gZmFsbGJhY2sgIT09IHVuZGVmaW5lZFxuXHRcdD8gJGlzRnVuY3Rpb24oZmFsbGJhY2spXG5cdFx0XHQ/IGZhbGxiYWNrLmNhbGwodmlldy5kYXRhLCBlLCB2aWV3KVxuXHRcdFx0OiBmYWxsYmFjayB8fCBcIlwiXG5cdFx0OiBcIntFcnJvcjogXCIgKyBlLm1lc3NhZ2UgKyBcIn1cIjtcblxuXHRpZiAoJHN1YlNldHRpbmdzLm9uRXJyb3IgJiYgKGZhbGxiYWNrID0gJHN1YlNldHRpbmdzLm9uRXJyb3IuY2FsbCh2aWV3LmRhdGEsIGUsIGZhbGxiYWNrICYmIG1lc3NhZ2UsIHZpZXcpKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0bWVzc2FnZSA9IGZhbGxiYWNrOyAvLyBUaGVyZSBpcyBhIHNldHRpbmdzLmRlYnVnTW9kZShoYW5kbGVyKSBvbkVycm9yIG92ZXJyaWRlLiBDYWxsIGl0LCBhbmQgdXNlIHJldHVybiB2YWx1ZSAoaWYgYW55KSB0byByZXBsYWNlIG1lc3NhZ2Vcblx0fVxuXG5cdHJldHVybiB2aWV3ICYmICF2aWV3LmxpbmtDdHggPyAkY29udmVydGVycy5odG1sKG1lc3NhZ2UpIDogbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSkge1xuXHR0aHJvdyBuZXcgJHN1Yi5FcnIobWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHN5bnRheEVycm9yKG1lc3NhZ2UpIHtcblx0ZXJyb3IoXCJTeW50YXggZXJyb3JcXG5cIiArIG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiB0bXBsRm4obWFya3VwLCB0bXBsLCBpc0xpbmtFeHByLCBjb252ZXJ0QmFjaywgaGFzRWxzZSkge1xuXHQvLyBDb21waWxlIG1hcmt1cCB0byBBU1QgKGFidHJhY3Qgc3ludGF4IHRyZWUpIHRoZW4gYnVpbGQgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIGNvZGUgZnJvbSB0aGUgQVNUIG5vZGVzXG5cdC8vIFVzZWQgZm9yIGNvbXBpbGluZyB0ZW1wbGF0ZXMsIGFuZCBhbHNvIGJ5IEpzVmlld3MgdG8gYnVpbGQgZnVuY3Rpb25zIGZvciBkYXRhIGxpbmsgZXhwcmVzc2lvbnNcblxuXHQvLz09PT0gbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cdGZ1bmN0aW9uIHB1c2hwcmVjZWRpbmdDb250ZW50KHNoaWZ0KSB7XG5cdFx0c2hpZnQgLT0gbG9jO1xuXHRcdGlmIChzaGlmdCkge1xuXHRcdFx0Y29udGVudC5wdXNoKG1hcmt1cC5zdWJzdHIobG9jLCBzaGlmdCkucmVwbGFjZShyTmV3TGluZSwgXCJcXFxcblwiKSk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gYmxvY2tUYWdDaGVjayh0YWdOYW1lLCBibG9jaykge1xuXHRcdGlmICh0YWdOYW1lKSB7XG5cdFx0XHR0YWdOYW1lICs9ICd9fSc7XG5cdFx0XHQvL1x0XHRcdCd7e2luY2x1ZGV9fSBibG9jayBoYXMge3svZm9yfX0gd2l0aCBubyBvcGVuIHt7Zm9yfX0nXG5cdFx0XHRzeW50YXhFcnJvcigoXG5cdFx0XHRcdGJsb2NrXG5cdFx0XHRcdFx0PyAne3snICsgYmxvY2sgKyAnfX0gYmxvY2sgaGFzIHt7LycgKyB0YWdOYW1lICsgJyB3aXRob3V0IHt7JyArIHRhZ05hbWVcblx0XHRcdFx0XHQ6ICdVbm1hdGNoZWQgb3IgbWlzc2luZyB7ey8nICsgdGFnTmFtZSkgKyAnLCBpbiB0ZW1wbGF0ZTpcXG4nICsgbWFya3VwKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZVRhZyhhbGwsIGJpbmQsIHRhZ05hbWUsIGNvbnZlcnRlciwgY29sb24sIGh0bWwsIGNvZGVUYWcsIHBhcmFtcywgc2xhc2gsIGJpbmQyLCBjbG9zZUJsb2NrLCBpbmRleCkge1xuLypcblxuICAgICBiaW5kICAgICB0YWdOYW1lICAgICAgICAgY3Z0ICAgY2xuIGh0bWwgY29kZSAgICBwYXJhbXMgICAgICAgICAgICBzbGFzaCAgIGJpbmQyICAgICAgICAgY2xvc2VCbGsgIGNvbW1lbnRcbi8oPzp7KFxcXik/eyg/OihcXHcrKD89W1xcL1xcc31dKSl8KFxcdyspPyg6KXwoPil8KFxcKikpXFxzKigoPzpbXn1dfH0oPyF9KSkqPykoXFwvKT98eyhcXF4pP3soPzooPzpcXC8oXFx3KykpXFxzKnwhLS1bXFxzXFxTXSo/LS0pKX19L2dcblxuKD86XG4gIHsoXFxeKT97ICAgICAgICAgICAgYmluZFxuICAoPzpcbiAgICAoXFx3KyAgICAgICAgICAgICB0YWdOYW1lXG4gICAgICAoPz1bXFwvXFxzfV0pXG4gICAgKVxuICAgIHxcbiAgICAoXFx3Kyk/KDopICAgICAgICBjb252ZXJ0ZXIgY29sb25cbiAgICB8XG4gICAgKD4pICAgICAgICAgICAgICBodG1sXG4gICAgfFxuICAgIChcXCopICAgICAgICAgICAgIGNvZGVUYWdcbiAgKVxuICBcXHMqXG4gICggICAgICAgICAgICAgICAgICBwYXJhbXNcbiAgICAoPzpbXn1dfH0oPyF9KSkqP1xuICApXG4gIChcXC8pPyAgICAgICAgICAgICAgc2xhc2hcbiAgfFxuICB7KFxcXik/eyAgICAgICAgICAgIGJpbmQyXG4gICg/OlxuICAgICg/OlxcLyhcXHcrKSlcXHMqICAgY2xvc2VCbG9ja1xuICAgIHxcbiAgICAhLS1bXFxzXFxTXSo/LS0gICAgY29tbWVudFxuICApXG4pXG59fS9nXG5cbiovXG5cdFx0aWYgKGNvZGVUYWcgJiYgYmluZCB8fCBzbGFzaCAmJiAhdGFnTmFtZSB8fCBwYXJhbXMgJiYgcGFyYW1zLnNsaWNlKC0xKSA9PT0gXCI6XCIgfHwgYmluZDIpIHtcblx0XHRcdHN5bnRheEVycm9yKGFsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQnVpbGQgYWJzdHJhY3Qgc3ludGF4IHRyZWUgKEFTVCk6IFt0YWdOYW1lLCBjb252ZXJ0ZXIsIHBhcmFtcywgY29udGVudCwgaGFzaCwgYmluZGluZ3MsIGNvbnRlbnRNYXJrdXBdXG5cdFx0aWYgKGh0bWwpIHtcblx0XHRcdGNvbG9uID0gXCI6XCI7XG5cdFx0XHRjb252ZXJ0ZXIgPSBIVE1MO1xuXHRcdH1cblx0XHRzbGFzaCA9IHNsYXNoIHx8IGlzTGlua0V4cHIgJiYgIWhhc0Vsc2U7XG5cblx0XHR2YXIgcGF0aEJpbmRpbmdzID0gKGJpbmQgfHwgaXNMaW5rRXhwcikgJiYgW1tdXSxcblx0XHRcdHByb3BzID0gXCJcIixcblx0XHRcdGFyZ3MgPSBcIlwiLFxuXHRcdFx0Y3R4UHJvcHMgPSBcIlwiLFxuXHRcdFx0cGFyYW1zQXJncyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNQcm9wcyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNDdHhQcm9wcyA9IFwiXCIsXG5cdFx0XHRvbkVycm9yID0gXCJcIixcblx0XHRcdHVzZVRyaWdnZXIgPSBcIlwiLFxuXHRcdFx0Ly8gQmxvY2sgdGFnIGlmIG5vdCBzZWxmLWNsb3NpbmcgYW5kIG5vdCB7ezp9fSBvciB7ez59fSAoc3BlY2lhbCBjYXNlKSBhbmQgbm90IGEgZGF0YS1saW5rIGV4cHJlc3Npb25cblx0XHRcdGJsb2NrID0gIXNsYXNoICYmICFjb2xvbjtcblxuXHRcdC8vPT09PSBuZXN0ZWQgaGVscGVyIGZ1bmN0aW9uID09PT1cblx0XHR0YWdOYW1lID0gdGFnTmFtZSB8fCAocGFyYW1zID0gcGFyYW1zIHx8IFwiI2RhdGFcIiwgY29sb24pOyAvLyB7ezp9fSBpcyBlcXVpdmFsZW50IHRvIHt7OiNkYXRhfX1cblx0XHRwdXNocHJlY2VkaW5nQ29udGVudChpbmRleCk7XG5cdFx0bG9jID0gaW5kZXggKyBhbGwubGVuZ3RoOyAvLyBsb2NhdGlvbiBtYXJrZXIgLSBwYXJzZWQgdXAgdG8gaGVyZVxuXHRcdGlmIChjb2RlVGFnKSB7XG5cdFx0XHRpZiAoYWxsb3dDb2RlKSB7XG5cdFx0XHRcdGNvbnRlbnQucHVzaChbXCIqXCIsIFwiXFxuXCIgKyBwYXJhbXMucmVwbGFjZSgvXjovLCBcInJldCs9IFwiKS5yZXBsYWNlKHJVbmVzY2FwZVF1b3RlcywgXCIkMVwiKSArIFwiO1xcblwiXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0YWdOYW1lKSB7XG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCJlbHNlXCIpIHtcblx0XHRcdFx0aWYgKHJUZXN0RWxzZUlmLnRlc3QocGFyYW1zKSkge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKCdmb3IgXCJ7e2Vsc2UgaWYgZXhwcn19XCIgdXNlIFwie3tlbHNlIGV4cHJ9fVwiJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aEJpbmRpbmdzID0gY3VycmVudFs3XSAmJiBbW11dO1xuXHRcdFx0XHRjdXJyZW50WzhdID0gbWFya3VwLnN1YnN0cmluZyhjdXJyZW50WzhdLCBpbmRleCk7IC8vIGNvbnRlbnRNYXJrdXAgZm9yIGJsb2NrIHRhZ1xuXHRcdFx0XHRjdXJyZW50ID0gc3RhY2sucG9wKCk7XG5cdFx0XHRcdGNvbnRlbnQgPSBjdXJyZW50WzJdO1xuXHRcdFx0XHRibG9jayA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zKSB7XG5cdFx0XHRcdC8vIHJlbW92ZSBuZXdsaW5lcyBmcm9tIHRoZSBwYXJhbXMgc3RyaW5nLCB0byBhdm9pZCBjb21waWxlZCBjb2RlIGVycm9ycyBmb3IgdW50ZXJtaW5hdGVkIHN0cmluZ3Ncblx0XHRcdFx0cGFyc2VQYXJhbXMocGFyYW1zLnJlcGxhY2Uock5ld0xpbmUsIFwiIFwiKSwgcGF0aEJpbmRpbmdzLCB0bXBsKVxuXHRcdFx0XHRcdC5yZXBsYWNlKHJCdWlsZEhhc2gsIGZ1bmN0aW9uKGFsbCwgb25lcnJvciwgaXNDdHgsIGtleSwga2V5VG9rZW4sIGtleVZhbHVlLCBhcmcsIHBhcmFtKSB7XG5cdFx0XHRcdFx0XHRrZXkgPSBcIidcIiArIGtleVRva2VuICsgXCInOlwiO1xuXHRcdFx0XHRcdFx0aWYgKGFyZykge1xuXHRcdFx0XHRcdFx0XHRhcmdzICs9IGtleVZhbHVlICsgXCIsXCI7XG5cdFx0XHRcdFx0XHRcdHBhcmFtc0FyZ3MgKz0gXCInXCIgKyBwYXJhbSArIFwiJyxcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNDdHgpIHtcblx0XHRcdFx0XHRcdFx0Y3R4UHJvcHMgKz0ga2V5ICsgJ2ouX2NwKCcgKyBrZXlWYWx1ZSArICcsXCInICsgcGFyYW0gKyAnXCIsdmlldyksJztcblx0XHRcdFx0XHRcdFx0Ly8gQ29tcGlsZWQgY29kZSBmb3IgZXZhbHVhdGluZyB0YWdDdHggb24gYSB0YWcgd2lsbCBoYXZlOiBjdHg6eydmb28nOmouX2NwKGNvbXBpbGVkRXhwciwgXCJleHByXCIsIHZpZXcpfVxuXHRcdFx0XHRcdFx0XHRwYXJhbXNDdHhQcm9wcyArPSBrZXkgKyBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvbmVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdG9uRXJyb3IgKz0ga2V5VmFsdWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAoa2V5VG9rZW4gPT09IFwidHJpZ2dlclwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0dXNlVHJpZ2dlciArPSBrZXlWYWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRwcm9wcyArPSBrZXkgKyBrZXlWYWx1ZSArIFwiLFwiO1xuXHRcdFx0XHRcdFx0XHRwYXJhbXNQcm9wcyArPSBrZXkgKyBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0XHRoYXNIYW5kbGVycyA9IGhhc0hhbmRsZXJzIHx8IHJIYXNIYW5kbGVycy50ZXN0KGtleVRva2VuKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBcIlwiO1xuXHRcdFx0XHRcdH0pLnNsaWNlKDAsIC0xKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBhdGhCaW5kaW5ncyAmJiBwYXRoQmluZGluZ3NbMF0pIHtcblx0XHRcdFx0cGF0aEJpbmRpbmdzLnBvcCgpOyAvLyBSZW1vdmUgdGhlIGJpbmRpbmdzIHRoYXQgd2FzIHByZXBhcmVkIGZvciBuZXh0IGFyZy4gKFRoZXJlIGlzIGFsd2F5cyBhbiBleHRyYSBvbmUgcmVhZHkpLlxuXHRcdFx0fVxuXG5cdFx0XHRuZXdOb2RlID0gW1xuXHRcdFx0XHRcdHRhZ05hbWUsXG5cdFx0XHRcdFx0Y29udmVydGVyIHx8ICEhY29udmVydEJhY2sgfHwgaGFzSGFuZGxlcnMgfHwgXCJcIixcblx0XHRcdFx0XHRibG9jayAmJiBbXSxcblx0XHRcdFx0XHRwYXJzZWRQYXJhbShwYXJhbXNBcmdzIHx8ICh0YWdOYW1lID09PSBcIjpcIiA/IFwiJyNkYXRhJyxcIiA6IFwiXCIpLCBwYXJhbXNQcm9wcywgcGFyYW1zQ3R4UHJvcHMpLCAvLyB7ezp9fSBlcXVpdmFsZW50IHRvIHt7OiNkYXRhfX1cblx0XHRcdFx0XHRwYXJzZWRQYXJhbShhcmdzIHx8ICh0YWdOYW1lID09PSBcIjpcIiA/IFwiZGF0YSxcIiA6IFwiXCIpLCBwcm9wcywgY3R4UHJvcHMpLFxuXHRcdFx0XHRcdG9uRXJyb3IsXG5cdFx0XHRcdFx0dXNlVHJpZ2dlcixcblx0XHRcdFx0XHRwYXRoQmluZGluZ3MgfHwgMFxuXHRcdFx0XHRdO1xuXHRcdFx0Y29udGVudC5wdXNoKG5ld05vZGUpO1xuXHRcdFx0aWYgKGJsb2NrKSB7XG5cdFx0XHRcdHN0YWNrLnB1c2goY3VycmVudCk7XG5cdFx0XHRcdGN1cnJlbnQgPSBuZXdOb2RlO1xuXHRcdFx0XHRjdXJyZW50WzhdID0gbG9jOyAvLyBTdG9yZSBjdXJyZW50IGxvY2F0aW9uIG9mIG9wZW4gdGFnLCB0byBiZSBhYmxlIHRvIGFkZCBjb250ZW50TWFya3VwIHdoZW4gd2UgcmVhY2ggY2xvc2luZyB0YWdcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGNsb3NlQmxvY2spIHtcblx0XHRcdGJsb2NrVGFnQ2hlY2soY2xvc2VCbG9jayAhPT0gY3VycmVudFswXSAmJiBjdXJyZW50WzBdICE9PSBcImVsc2VcIiAmJiBjbG9zZUJsb2NrLCBjdXJyZW50WzBdKTtcblx0XHRcdGN1cnJlbnRbOF0gPSBtYXJrdXAuc3Vic3RyaW5nKGN1cnJlbnRbOF0sIGluZGV4KTsgLy8gY29udGVudE1hcmt1cCBmb3IgYmxvY2sgdGFnXG5cdFx0XHRjdXJyZW50ID0gc3RhY2sucG9wKCk7XG5cdFx0fVxuXHRcdGJsb2NrVGFnQ2hlY2soIWN1cnJlbnQgJiYgY2xvc2VCbG9jayk7XG5cdFx0Y29udGVudCA9IGN1cnJlbnRbMl07XG5cdH1cblx0Ly89PT09IC9lbmQgb2YgbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cblx0dmFyIGksIHJlc3VsdCwgbmV3Tm9kZSwgaGFzSGFuZGxlcnMsIGJpbmRpbmdzLFxuXHRcdGFsbG93Q29kZSA9ICRzdWJTZXR0aW5ncy5hbGxvd0NvZGUgfHwgdG1wbCAmJiB0bXBsLmFsbG93Q29kZVxuXHRcdFx0fHwgJHZpZXdzU2V0dGluZ3MuYWxsb3dDb2RlID09PSB0cnVlLCAvLyBpbmNsdWRlIGRpcmVjdCBzZXR0aW5nIG9mIHNldHRpbmdzLmFsbG93Q29kZSB0cnVlIGZvciBiYWNrd2FyZCBjb21wYXQgb25seVxuXHRcdGFzdFRvcCA9IFtdLFxuXHRcdGxvYyA9IDAsXG5cdFx0c3RhY2sgPSBbXSxcblx0XHRjb250ZW50ID0gYXN0VG9wLFxuXHRcdGN1cnJlbnQgPSBbLCxhc3RUb3BdO1xuXG5cdGlmIChhbGxvd0NvZGUgJiYgdG1wbC5faXMpIHtcblx0XHR0bXBsLmFsbG93Q29kZSA9IGFsbG93Q29kZTtcblx0fVxuXG4vL1RPRE9cdHJlc3VsdCA9IHRtcGxGbnNDYWNoZVttYXJrdXBdOyAvLyBPbmx5IGNhY2hlIGlmIHRlbXBsYXRlIGlzIG5vdCBuYW1lZCBhbmQgbWFya3VwIGxlbmd0aCA8IC4uLixcbi8vYW5kIHRoZXJlIGFyZSBubyBiaW5kaW5ncyBvciBzdWJ0ZW1wbGF0ZXM/PyBDb25zaWRlciBzdGFuZGFyZCBvcHRpbWl6YXRpb24gZm9yIGRhdGEtbGluaz1cImEuYi5jXCJcbi8vXHRcdGlmIChyZXN1bHQpIHtcbi8vXHRcdFx0dG1wbC5mbiA9IHJlc3VsdDtcbi8vXHRcdH0gZWxzZSB7XG5cbi8vXHRcdHJlc3VsdCA9IG1hcmt1cDtcblx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRpZiAoY29udmVydEJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bWFya3VwID0gbWFya3VwLnNsaWNlKDAsIC1jb252ZXJ0QmFjay5sZW5ndGggLSAyKSArIGRlbGltQ2xvc2VDaGFyMDtcblx0XHR9XG5cdFx0bWFya3VwID0gZGVsaW1PcGVuQ2hhcjAgKyBtYXJrdXAgKyBkZWxpbUNsb3NlQ2hhcjE7XG5cdH1cblxuXHRibG9ja1RhZ0NoZWNrKHN0YWNrWzBdICYmIHN0YWNrWzBdWzJdLnBvcCgpWzBdKTtcblx0Ly8gQnVpbGQgdGhlIEFTVCAoYWJzdHJhY3Qgc3ludGF4IHRyZWUpIHVuZGVyIGFzdFRvcFxuXHRtYXJrdXAucmVwbGFjZShyVGFnLCBwYXJzZVRhZyk7XG5cblx0cHVzaHByZWNlZGluZ0NvbnRlbnQobWFya3VwLmxlbmd0aCk7XG5cblx0aWYgKGxvYyA9IGFzdFRvcFthc3RUb3AubGVuZ3RoIC0gMV0pIHtcblx0XHRibG9ja1RhZ0NoZWNrKFwiXCIgKyBsb2MgIT09IGxvYyAmJiAoK2xvY1s4XSA9PT0gbG9jWzhdKSAmJiBsb2NbMF0pO1xuXHR9XG4vL1x0XHRcdHJlc3VsdCA9IHRtcGxGbnNDYWNoZVttYXJrdXBdID0gYnVpbGRDb2RlKGFzdFRvcCwgdG1wbCk7XG4vL1x0XHR9XG5cblx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRyZXN1bHQgPSBidWlsZENvZGUoYXN0VG9wLCBtYXJrdXAsIGlzTGlua0V4cHIpO1xuXHRcdGJpbmRpbmdzID0gW107XG5cdFx0aSA9IGFzdFRvcC5sZW5ndGg7XG5cdFx0d2hpbGUgKGktLSkge1xuXHRcdFx0YmluZGluZ3MudW5zaGlmdChhc3RUb3BbaV1bN10pOyAgLy8gV2l0aCBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIHBhdGhCaW5kaW5ncyBhcnJheSBmb3IgdGFnQ3R4W2ldIGlzIGFzdFRvcFtpXVs3XVxuXHRcdH1cblx0XHRzZXRQYXRocyhyZXN1bHQsIGJpbmRpbmdzKTtcblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSBidWlsZENvZGUoYXN0VG9wLCB0bXBsKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzZXRQYXRocyhmbiwgcGF0aHNBcnIpIHtcblx0dmFyIGtleSwgcGF0aHMsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IHBhdGhzQXJyLmxlbmd0aDtcblx0Zm4uZGVwcyA9IFtdO1xuXHRmb3IgKDsgaSA8IGw7IGkrKykge1xuXHRcdHBhdGhzID0gcGF0aHNBcnJbaV07XG5cdFx0Zm9yIChrZXkgaW4gcGF0aHMpIHtcblx0XHRcdGlmIChrZXkgIT09IFwiX2pzdnRvXCIgJiYgcGF0aHMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBwYXRoc1trZXldLmxlbmd0aCkge1xuXHRcdFx0XHRmbi5kZXBzID0gZm4uZGVwcy5jb25jYXQocGF0aHNba2V5XSk7IC8vIGRlcHMgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHBhdGhzIGFycmF5cyBmb3IgdGhlIGRpZmZlcmVudCBiaW5kaW5nc1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRmbi5wYXRocyA9IHBhdGhzOyAvLyBUaGUgYXJyYXkgb2YgcGF0aHMgYXJyYXlzIGZvciB0aGUgZGlmZmVyZW50IGJpbmRpbmdzXG59XG5cbmZ1bmN0aW9uIHBhcnNlZFBhcmFtKGFyZ3MsIHByb3BzLCBjdHgpIHtcblx0cmV0dXJuIFthcmdzLnNsaWNlKDAsIC0xKSwgcHJvcHMuc2xpY2UoMCwgLTEpLCBjdHguc2xpY2UoMCwgLTEpXTtcbn1cblxuZnVuY3Rpb24gcGFyYW1TdHJ1Y3R1cmUocGFydHMsIHR5cGUpIHtcblx0cmV0dXJuICdcXG5cXHQnXG5cdFx0KyAodHlwZVxuXHRcdFx0PyB0eXBlICsgJzp7J1xuXHRcdFx0OiAnJylcblx0XHQrICdhcmdzOlsnICsgcGFydHNbMF0gKyAnXSdcblx0XHQrIChwYXJ0c1sxXSB8fCAhdHlwZVxuXHRcdFx0PyAnLFxcblxcdHByb3BzOnsnICsgcGFydHNbMV0gKyAnfSdcblx0XHRcdDogXCJcIilcblx0XHQrIChwYXJ0c1syXSA/ICcsXFxuXFx0Y3R4OnsnICsgcGFydHNbMl0gKyAnfScgOiBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJhbXMocGFyYW1zLCBwYXRoQmluZGluZ3MsIHRtcGwpIHtcblxuXHRmdW5jdGlvbiBwYXJzZVRva2VucyhhbGwsIGxmdFBybjAsIGxmdFBybiwgYm91bmQsIHBhdGgsIG9wZXJhdG9yLCBlcnIsIGVxLCBwYXRoMiwgcHJuLCBjb21tYSwgbGZ0UHJuMiwgYXBvcywgcXVvdCwgcnRQcm4sIHJ0UHJuRG90LCBwcm4yLCBzcGFjZSwgaW5kZXgsIGZ1bGwpIHtcblx0Ly8gLyhcXCgpKD89XFxzKlxcKCl8KD86KFsoW10pXFxzKik/KD86KFxcXj8pKCEqP1sjfl0/W1xcdyQuXl0rKT9cXHMqKChcXCtcXCt8LS0pfFxcK3wtfCYmfFxcfFxcfHw9PT18IT09fD09fCE9fDw9fD49fFs8PiUqOj9cXC9dfCg9KSlcXHMqfCghKj9bI35dP1tcXHckLl5dKykoWyhbXSk/KXwoLFxccyopfChcXCg/KVxcXFw/KD86KCcpfChcIikpfCg/OlxccyooKFspXFxdXSkoPz1cXHMqWy5eXXxcXHMqJHxbXihbXSl8WylcXF1dKShbKFtdPykpfChcXHMrKS9nLFxuXHQvLyAgIGxmdFBybjAgICAgICAgIGxmdFBybiAgICAgICAgYm91bmQgICAgICAgICAgICBwYXRoICAgIG9wZXJhdG9yIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxICAgICAgICAgICAgIHBhdGgyICAgICAgIHBybiAgICBjb21tYSAgIGxmdFBybjIgICBhcG9zIHF1b3QgICAgICBydFBybiBydFBybkRvdCAgICAgICAgICAgICAgICAgICAgICAgIHBybjIgIHNwYWNlXG5cdFx0Ly8gKGxlZnQgcGFyZW4/IGZvbGxvd2VkIGJ5IChwYXRoPyBmb2xsb3dlZCBieSBvcGVyYXRvcikgb3IgKHBhdGggZm9sbG93ZWQgYnkgcGFyZW4/KSkgb3IgY29tbWEgb3IgYXBvcyBvciBxdW90IG9yIHJpZ2h0IHBhcmVuIG9yIHNwYWNlXG5cdFx0ZnVuY3Rpb24gcGFyc2VQYXRoKGFsbFBhdGgsIG5vdCwgb2JqZWN0LCBoZWxwZXIsIHZpZXcsIHZpZXdQcm9wZXJ0eSwgcGF0aFRva2VucywgbGVhZlRva2VuKSB7XG5cdFx0XHQvL3JQYXRoID0gL14oISo/KSg/Om51bGx8dHJ1ZXxmYWxzZXxcXGRbXFxkLl0qfChbXFx3JF0rfFxcLnx+KFtcXHckXSspfCModmlld3woW1xcdyRdKykpPykoW1xcdyQuXl0qPykoPzpbLlteXShbXFx3JF0rKVxcXT8pPykkL2csXG5cdFx0XHQvLyAgICAgICAgICBub3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ICAgICBoZWxwZXIgICAgdmlldyAgdmlld1Byb3BlcnR5IHBhdGhUb2tlbnMgICAgICBsZWFmVG9rZW5cblx0XHRcdHZhciBzdWJQYXRoID0gb2JqZWN0ID09PSBcIi5cIjtcblx0XHRcdGlmIChvYmplY3QpIHtcblx0XHRcdFx0cGF0aCA9IHBhdGguc2xpY2Uobm90Lmxlbmd0aCk7XG5cdFx0XHRcdGlmICgvXlxcLj9jb25zdHJ1Y3RvciQvLnRlc3QobGVhZlRva2VufHxwYXRoKSkge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKGFsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghc3ViUGF0aCkge1xuXHRcdFx0XHRcdGFsbFBhdGggPSAoaGVscGVyXG5cdFx0XHRcdFx0XHRcdD8gJ3ZpZXcuaGxwKFwiJyArIGhlbHBlciArICdcIiknXG5cdFx0XHRcdFx0XHRcdDogdmlld1xuXHRcdFx0XHRcdFx0XHRcdD8gXCJ2aWV3XCJcblx0XHRcdFx0XHRcdFx0XHQ6IFwiZGF0YVwiKVxuXHRcdFx0XHRcdFx0KyAobGVhZlRva2VuXG5cdFx0XHRcdFx0XHRcdD8gKHZpZXdQcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdD8gXCIuXCIgKyB2aWV3UHJvcGVydHlcblx0XHRcdFx0XHRcdFx0XHQ6IGhlbHBlclxuXHRcdFx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ6ICh2aWV3ID8gXCJcIiA6IFwiLlwiICsgb2JqZWN0KVxuXHRcdFx0XHRcdFx0XHRcdCkgKyAocGF0aFRva2VucyB8fCBcIlwiKVxuXHRcdFx0XHRcdFx0XHQ6IChsZWFmVG9rZW4gPSBoZWxwZXIgPyBcIlwiIDogdmlldyA/IHZpZXdQcm9wZXJ0eSB8fCBcIlwiIDogb2JqZWN0LCBcIlwiKSk7XG5cblx0XHRcdFx0XHRhbGxQYXRoID0gYWxsUGF0aCArIChsZWFmVG9rZW4gPyBcIi5cIiArIGxlYWZUb2tlbiA6IFwiXCIpO1xuXG5cdFx0XHRcdFx0YWxsUGF0aCA9IG5vdCArIChhbGxQYXRoLnNsaWNlKDAsIDkpID09PSBcInZpZXcuZGF0YVwiXG5cdFx0XHRcdFx0XHQ/IGFsbFBhdGguc2xpY2UoNSkgLy8gY29udmVydCAjdmlldy5kYXRhLi4uIHRvIGRhdGEuLi5cblx0XHRcdFx0XHRcdDogYWxsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0YmluZHMgPSBuYW1lZCA9PT0gXCJsaW5rVG9cIiA/IChiaW5kdG8gPSBwYXRoQmluZGluZ3MuX2pzdnRvID0gcGF0aEJpbmRpbmdzLl9qc3Z0byB8fCBbXSkgOiBibmRDdHguYmQ7XG5cdFx0XHRcdFx0aWYgKHRoZU9iID0gc3ViUGF0aCAmJiBiaW5kc1tiaW5kcy5sZW5ndGgtMV0pIHtcblx0XHRcdFx0XHRcdGlmICh0aGVPYi5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICh0aGVPYi5zYikge1xuXHRcdFx0XHRcdFx0XHRcdHRoZU9iID0gdGhlT2Iuc2I7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHRoZU9iLmJuZCkge1xuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBcIl5cIiArIHBhdGguc2xpY2UoMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhlT2Iuc2IgPSBwYXRoO1xuXHRcdFx0XHRcdFx0XHR0aGVPYi5ibmQgPSB0aGVPYi5ibmQgfHwgcGF0aC5jaGFyQXQoMCkgPT09IFwiXlwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRiaW5kcy5wdXNoKHBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXRoU3RhcnRbcGFyZW5EZXB0aF0gPSBpbmRleCArIChzdWJQYXRoID8gMSA6IDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYWxsUGF0aDtcblx0XHR9XG5cblx0XHQvL2JvdW5kID0gYmluZGluZ3MgJiYgYm91bmQ7XG5cdFx0aWYgKGJvdW5kICYmICFlcSkge1xuXHRcdFx0cGF0aCA9IGJvdW5kICsgcGF0aDsgLy8gZS5nLiBzb21lLmZuKC4uLilec29tZS5wYXRoIC0gc28gaGVyZSBwYXRoIGlzIFwiXnNvbWUucGF0aFwiXG5cdFx0fVxuXHRcdG9wZXJhdG9yID0gb3BlcmF0b3IgfHwgXCJcIjtcblx0XHRsZnRQcm4gPSBsZnRQcm4gfHwgbGZ0UHJuMCB8fCBsZnRQcm4yO1xuXHRcdHBhdGggPSBwYXRoIHx8IHBhdGgyO1xuXHRcdC8vIENvdWxkIGRvIHRoaXMgLSBidXQgbm90IHdvcnRoIHBlcmYgY29zdD8/IDotXG5cdFx0Ly8gaWYgKCFwYXRoLmxhc3RJbmRleE9mKFwiI2RhdGEuXCIsIDApKSB7IHBhdGggPSBwYXRoLnNsaWNlKDYpOyB9IC8vIElmIHBhdGggc3RhcnRzIHdpdGggXCIjZGF0YS5cIiwgcmVtb3ZlIHRoYXQuXG5cdFx0cHJuID0gcHJuIHx8IHBybjIgfHwgXCJcIjtcblxuXHRcdHZhciBleHByLCBleHByRm4sIGJpbmRzLCB0aGVPYiwgbmV3T2IsXG5cdFx0XHRydFNxID0gXCIpXCI7XG5cblx0XHRpZiAocHJuID09PSBcIltcIikge1xuXHRcdFx0cHJuICA9XCJbai5fc3EoXCI7XG5cdFx0XHRydFNxID0gXCIpXVwiO1xuXHRcdH1cblxuXHRcdGlmIChlcnIgJiYgIWFwb3NlZCAmJiAhcXVvdGVkKSB7XG5cdFx0XHRzeW50YXhFcnJvcihwYXJhbXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYmluZGluZ3MgJiYgcnRQcm5Eb3QgJiYgIWFwb3NlZCAmJiAhcXVvdGVkKSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSBiaW5kaW5nIHRvIGEgcGF0aCBpbiB3aGljaCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgYnkgYSBoZWxwZXIvZGF0YSBmdW5jdGlvbi9leHByZXNzaW9uLCBlLmcuIGZvbygpXngueSBvciAoYT9iOmMpXngueVxuXHRcdFx0XHQvLyBXZSBjcmVhdGUgYSBjb21waWxlZCBmdW5jdGlvbiB0byBnZXQgdGhlIG9iamVjdCBpbnN0YW5jZSAod2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZGVwZW5kZW50IGRhdGEgb2YgdGhlIHN1YmV4cHJlc3Npb24gY2hhbmdlcywgdG8gcmV0dXJuIHRoZSBuZXcgb2JqZWN0LCBhbmQgdHJpZ2dlciByZS1iaW5kaW5nIG9mIHRoZSBzdWJzZXF1ZW50IHBhdGgpXG5cdFx0XHRcdGlmICghbmFtZWQgfHwgYm91bmROYW1lIHx8IGJpbmR0bykge1xuXHRcdFx0XHRcdGV4cHIgPSBwYXRoU3RhcnRbcGFyZW5EZXB0aCAtIDFdO1xuXHRcdFx0XHRcdGlmIChmdWxsLmxlbmd0aCAtIDEgPiBpbmRleCAtIChleHByIHx8IDApKSB7IC8vIFdlIG5lZWQgdG8gY29tcGlsZSBhIHN1YmV4cHJlc3Npb25cblx0XHRcdFx0XHRcdGV4cHIgPSBmdWxsLnNsaWNlKGV4cHIsIGluZGV4ICsgYWxsLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRpZiAoZXhwckZuICE9PSB0cnVlKSB7IC8vIElmIG5vdCByZWVudHJhbnQgY2FsbCBkdXJpbmcgY29tcGlsYXRpb25cblx0XHRcdFx0XHRcdFx0YmluZHMgPSBiaW5kdG8gfHwgYm5kU3RhY2tbcGFyZW5EZXB0aC0xXS5iZDtcblx0XHRcdFx0XHRcdFx0Ly8gSW5zZXJ0IGV4cHJPYiBvYmplY3QsIHRvIGJlIHVzZWQgZHVyaW5nIGJpbmRpbmcgdG8gcmV0dXJuIHRoZSBjb21wdXRlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0dGhlT2IgPSBiaW5kc1tiaW5kcy5sZW5ndGgtMV07XG5cdFx0XHRcdFx0XHRcdGlmICh0aGVPYiAmJiB0aGVPYi5wcm0pIHtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAodGhlT2Iuc2IgJiYgdGhlT2Iuc2IucHJtKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVPYiA9IHRoZU9iLnNiO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRuZXdPYiA9IHRoZU9iLnNiID0ge3BhdGg6IHRoZU9iLnNiLCBibmQ6IHRoZU9iLmJuZH07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0YmluZHMucHVzaChuZXdPYiA9IHtwYXRoOiBiaW5kcy5wb3AoKX0pOyAvLyBJbnNlcnQgZXhwck9iIG9iamVjdCwgdG8gYmUgdXNlZCBkdXJpbmcgYmluZGluZyB0byByZXR1cm4gdGhlIGNvbXB1dGVkIG9iamVjdFxuXHRcdFx0XHRcdFx0XHR9XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAvLyAoZS5nLiBcInNvbWUub2JqZWN0KClcIiBpbiBcInNvbWUub2JqZWN0KCkuYS5iXCIgLSB0byBiZSB1c2VkIGFzIGNvbnRleHQgZm9yIGJpbmRpbmcgdGhlIGZvbGxvd2luZyB0b2tlbnMgXCJhLmJcIilcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJ0UHJuRG90ID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGV4cHIgLy8gVGhlIHBhcmFtZXRlciBvciBmdW5jdGlvbiBzdWJleHByZXNzaW9uXG5cdFx0XHRcdFx0XHRcdCsgXCIgb25lcnJvcj0nJ1wiIC8vIHNldCBvbmVycm9yPScnIGluIG9yZGVyIHRvIHdyYXAgZ2VuZXJhdGVkIGNvZGUgd2l0aCBhIHRyeSBjYXRjaCAtIHJldHVybmluZyAnJyBhcyBvYmplY3QgaW5zdGFuY2UgaWYgdGhlcmUgaXMgYW4gZXJyb3IvbWlzc2luZyBwYXJlbnRcblx0XHRcdFx0XHRcdFx0KyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0XHRcdFx0XHRleHByRm4gPSB0bXBsTGlua3NbcnRQcm5Eb3RdO1xuXHRcdFx0XHRcdFx0aWYgKCFleHByRm4pIHtcblx0XHRcdFx0XHRcdFx0dG1wbExpbmtzW3J0UHJuRG90XSA9IHRydWU7IC8vIEZsYWcgdGhhdCB0aGlzIGV4cHJGbiAoZm9yIHJ0UHJuRG90KSBpcyBiZWluZyBjb21waWxlZFxuXHRcdFx0XHRcdFx0XHR0bXBsTGlua3NbcnRQcm5Eb3RdID0gZXhwckZuID0gdG1wbEZuKHJ0UHJuRG90LCB0bXBsLCB0cnVlKTsgLy8gQ29tcGlsZSB0aGUgZXhwcmVzc2lvbiAob3IgdXNlIGNhY2hlZCBjb3B5IGFscmVhZHkgaW4gdG1wbC5saW5rcylcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChleHByRm4gIT09IHRydWUgJiYgbmV3T2IpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgbm90IHJlZW50cmFudCBjYWxsIGR1cmluZyBjb21waWxhdGlvblxuXHRcdFx0XHRcdFx0XHRuZXdPYi5fanN2ID0gZXhwckZuO1xuXHRcdFx0XHRcdFx0XHRuZXdPYi5wcm0gPSBibmRDdHguYmQ7XG5cdFx0XHRcdFx0XHRcdG5ld09iLmJuZCA9IG5ld09iLmJuZCB8fCBuZXdPYi5wYXRoICYmIG5ld09iLnBhdGguaW5kZXhPZihcIl5cIikgPj0gMDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiAoYXBvc2VkXG5cdFx0XHRcdC8vIHdpdGhpbiBzaW5nbGUtcXVvdGVkIHN0cmluZ1xuXHRcdFx0XHQ/IChhcG9zZWQgPSAhYXBvcywgKGFwb3NlZCA/IGFsbCA6IGxmdFBybjIgKyAnXCInKSlcblx0XHRcdFx0OiBxdW90ZWRcblx0XHRcdFx0Ly8gd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5nXG5cdFx0XHRcdFx0PyAocXVvdGVkID0gIXF1b3QsIChxdW90ZWQgPyBhbGwgOiBsZnRQcm4yICsgJ1wiJykpXG5cdFx0XHRcdFx0OlxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0KGxmdFByblxuXHRcdFx0XHRcdFx0PyAocGF0aFN0YXJ0W3BhcmVuRGVwdGhdID0gaW5kZXgrKywgYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSA9IHtiZDogW119LCBsZnRQcm4pXG5cdFx0XHRcdFx0XHQ6IFwiXCIpXG5cdFx0XHRcdFx0KyAoc3BhY2Vcblx0XHRcdFx0XHRcdD8gKHBhcmVuRGVwdGhcblx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdC8vIE5ldyBhcmcgb3IgcHJvcCAtIHNvIGluc2VydCBiYWNrc3BhY2UgXFxiIChcXHgwOCkgYXMgc2VwYXJhdG9yIGZvciBuYW1lZCBwYXJhbXMsIHVzZWQgc3Vic2VxdWVudGx5IGJ5IHJCdWlsZEhhc2gsIGFuZCBwcmVwYXJlIG5ldyBiaW5kaW5ncyBhcnJheVxuXHRcdFx0XHRcdFx0XHQ6IChwYXJhbUluZGV4ID0gZnVsbC5zbGljZShwYXJhbUluZGV4LCBpbmRleCksIG5hbWVkXG5cdFx0XHRcdFx0XHRcdFx0PyAobmFtZWQgPSBib3VuZE5hbWUgPSBiaW5kdG8gPSBmYWxzZSwgXCJcXGJcIilcblx0XHRcdFx0XHRcdFx0XHQ6IFwiXFxiLFwiKSArIHBhcmFtSW5kZXggKyAocGFyYW1JbmRleCA9IGluZGV4ICsgYWxsLmxlbmd0aCwgYmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzLnB1c2goYm5kQ3R4LmJkID0gW10pLCBcIlxcYlwiKVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0OiBlcVxuXHRcdFx0XHQvLyBuYW1lZCBwYXJhbS4gUmVtb3ZlIGJpbmRpbmdzIGZvciBhcmcgYW5kIGNyZWF0ZSBpbnN0ZWFkIGJpbmRpbmdzIGFycmF5IGZvciBwcm9wXG5cdFx0XHRcdFx0XHRcdD8gKHBhcmVuRGVwdGggJiYgc3ludGF4RXJyb3IocGFyYW1zKSwgYmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzLnBvcCgpLCBuYW1lZCA9IHBhdGgsIGJvdW5kTmFtZSA9IGJvdW5kLCBwYXJhbUluZGV4ID0gaW5kZXggKyBhbGwubGVuZ3RoLCBib3VuZCAmJiAoYmluZGluZ3MgPSBibmRDdHguYmQgPSBwYXRoQmluZGluZ3NbbmFtZWRdID0gW10pLCBwYXRoICsgJzonKVxuXHRcdFx0XHRcdFx0XHQ6IHBhdGhcblx0XHRcdFx0Ly8gcGF0aFxuXHRcdFx0XHRcdFx0XHRcdD8gKHBhdGguc3BsaXQoXCJeXCIpLmpvaW4oXCIuXCIpLnJlcGxhY2UoclBhdGgsIHBhcnNlUGF0aClcblx0XHRcdFx0XHRcdFx0XHRcdCsgKHByblxuXHRcdFx0XHQvLyBzb21lLmZuY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSA9IHtiZDogW119LCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBydFNxLCBwcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3IpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3Jcblx0XHRcdFx0Ly8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdD8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdDogcnRQcm5cblx0XHRcdFx0Ly8gZnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoKHJ0UHJuID0gZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHJ0UHJuLCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBmYWxzZSwgYm5kQ3R4ID0gYm5kU3RhY2tbLS1wYXJlbkRlcHRoXSwgcnRQcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAocHJuIC8vIHJ0UHJuIGFuZCBwcm4sIGUuZyApKCBpbiAoYSkoKSBvciBhKCkoKSwgb3IgKVsgaW4gYSgpW11cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0sIGZuQ2FsbFtwYXJlbkRlcHRoXSA9IHJ0U3EsIHBybilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGNvbW1hXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHN5bnRheEVycm9yKHBhcmFtcyksIFwiLFwiKSAvLyBXZSBkb24ndCBhbGxvdyB0b3AtbGV2ZWwgbGl0ZXJhbCBhcnJheXMgb3Igb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogbGZ0UHJuMFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IChhcG9zZWQgPSBhcG9zLCBxdW90ZWQgPSBxdW90LCAnXCInKVxuXHRcdFx0XHQpKVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgbmFtZWQsIGJpbmR0bywgYm91bmROYW1lLFxuXHRcdHF1b3RlZCwgLy8gYm9vbGVhbiBmb3Igc3RyaW5nIGNvbnRlbnQgaW4gZG91YmxlIHF1b3Rlc1xuXHRcdGFwb3NlZCwgLy8gb3IgaW4gc2luZ2xlIHF1b3Rlc1xuXHRcdGJpbmRpbmdzID0gcGF0aEJpbmRpbmdzICYmIHBhdGhCaW5kaW5nc1swXSwgLy8gYmluZGluZ3MgYXJyYXkgZm9yIHRoZSBmaXJzdCBhcmdcblx0XHRibmRDdHggPSB7YmQ6IGJpbmRpbmdzfSxcblx0XHRibmRTdGFjayA9IHswOiBibmRDdHh9LFxuXHRcdHBhcmFtSW5kZXggPSAwLCAvLyBsaXN0LFxuXHRcdHRtcGxMaW5rcyA9ICh0bXBsID8gdG1wbC5saW5rcyA6IGJpbmRpbmdzICYmIChiaW5kaW5ncy5saW5rcyA9IGJpbmRpbmdzLmxpbmtzIHx8IHt9KSkgfHwgdG9wVmlldy50bXBsLmxpbmtzLFxuXHRcdC8vIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIHRyYWNraW5nIHBhdGggcGFyc2luZyBpbmNsdWRpbmcgbmVzdGVkIHBhdGhzLCBzdWNoIGFzIFwiYS5iKGNeZCArIChlKSleZlwiLCBhbmQgY2hhaW5lZCBjb21wdXRlZCBwYXRocyBzdWNoIGFzXG5cdFx0Ly8gXCJhLmIoKS5jXmQoKS5lLmYoKS5nXCIgLSB3aGljaCBoYXMgZm91ciBjaGFpbmVkIHBhdGhzLCBcImEuYigpXCIsIFwiXmMuZCgpXCIsIFwiLmUuZigpXCIgYW5kIFwiLmdcIlxuXHRcdHBhcmVuRGVwdGggPSAwLFxuXHRcdGZuQ2FsbCA9IHt9LCAvLyBXZSBhcmUgaW4gYSBmdW5jdGlvbiBjYWxsXG5cdFx0cGF0aFN0YXJ0ID0ge30sIC8vIHRyYWNrcyB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGF0aCBzdWNoIGFzIGNeZCgpIGluIHRoZSBhYm92ZSBleGFtcGxlXG5cdFx0cmVzdWx0ID0gKHBhcmFtcyArICh0bXBsID8gXCIgXCIgOiBcIlwiKSkucmVwbGFjZShyUGFyYW1zLCBwYXJzZVRva2Vucyk7XG5cblx0cmV0dXJuICFwYXJlbkRlcHRoICYmIHJlc3VsdCB8fCBzeW50YXhFcnJvcihwYXJhbXMpOyAvLyBTeW50YXggZXJyb3IgaWYgdW5iYWxhbmNlZCBwYXJlbnMgaW4gcGFyYW1zIGV4cHJlc3Npb25cbn1cblxuZnVuY3Rpb24gYnVpbGRDb2RlKGFzdCwgdG1wbCwgaXNMaW5rRXhwcikge1xuXHQvLyBCdWlsZCB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBBU1Qgbm9kZXMsIGFuZCBzZXQgYXMgcHJvcGVydHkgb24gdGhlIHBhc3NlZC1pbiB0ZW1wbGF0ZSBvYmplY3Rcblx0Ly8gVXNlZCBmb3IgY29tcGlsaW5nIHRlbXBsYXRlcywgYW5kIGFsc28gYnkgSnNWaWV3cyB0byBidWlsZCBmdW5jdGlvbnMgZm9yIGRhdGEgbGluayBleHByZXNzaW9uc1xuXHR2YXIgaSwgbm9kZSwgdGFnTmFtZSwgY29udmVydGVyLCB0YWdDdHgsIGhhc1RhZywgaGFzRW5jb2RlciwgZ2V0c1ZhbCwgaGFzQ252dCwgdXNlQ252dCwgdG1wbEJpbmRpbmdzLCBwYXRoQmluZGluZ3MsIHBhcmFtcywgYm91bmRPbkVyclN0YXJ0LCBib3VuZE9uRXJyRW5kLFxuXHRcdHRhZ1JlbmRlciwgbmVzdGVkVG1wbHMsIHRtcGxOYW1lLCBuZXN0ZWRUbXBsLCB0YWdBbmRFbHNlcywgY29udGVudCwgbWFya3VwLCBuZXh0SXNFbHNlLCBvbGRDb2RlLCBpc0Vsc2UsIGlzR2V0VmFsLCB0YWdDdHhGbiwgb25FcnJvciwgdGFnU3RhcnQsIHRyaWdnZXIsXG5cdFx0dG1wbEJpbmRpbmdLZXkgPSAwLFxuXHRcdHVzZVZpZXdzID0gJHN1YlNldHRpbmdzQWR2YW5jZWQudXNlVmlld3MgfHwgdG1wbC51c2VWaWV3cyB8fCB0bXBsLnRhZ3MgfHwgdG1wbC50ZW1wbGF0ZXMgfHwgdG1wbC5oZWxwZXJzIHx8IHRtcGwuY29udmVydGVycyxcblx0XHRjb2RlID0gXCJcIixcblx0XHR0bXBsT3B0aW9ucyA9IHt9LFxuXHRcdGwgPSBhc3QubGVuZ3RoO1xuXG5cdGlmIChcIlwiICsgdG1wbCA9PT0gdG1wbCkge1xuXHRcdHRtcGxOYW1lID0gaXNMaW5rRXhwciA/ICdkYXRhLWxpbms9XCInICsgdG1wbC5yZXBsYWNlKHJOZXdMaW5lLCBcIiBcIikuc2xpY2UoMSwgLTEpICsgJ1wiJyA6IHRtcGw7XG5cdFx0dG1wbCA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0dG1wbE5hbWUgPSB0bXBsLnRtcGxOYW1lIHx8IFwidW5uYW1lZFwiO1xuXHRcdGlmICh0bXBsLmFsbG93Q29kZSkge1xuXHRcdFx0dG1wbE9wdGlvbnMuYWxsb3dDb2RlID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHRtcGwuZGVidWcpIHtcblx0XHRcdHRtcGxPcHRpb25zLmRlYnVnID0gdHJ1ZTtcblx0XHR9XG5cdFx0dG1wbEJpbmRpbmdzID0gdG1wbC5ibmRzO1xuXHRcdG5lc3RlZFRtcGxzID0gdG1wbC50bXBscztcblx0fVxuXHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0Ly8gQVNUIG5vZGVzOiBbMDogdGFnTmFtZSwgMTogY29udmVydGVyLCAyOiBjb250ZW50LCAzOiBwYXJhbXMsIDQ6IGNvZGUsIDU6IG9uRXJyb3IsIDY6IHRyaWdnZXIsIDc6cGF0aEJpbmRpbmdzLCA4OiBjb250ZW50TWFya3VwXVxuXHRcdG5vZGUgPSBhc3RbaV07XG5cblx0XHQvLyBBZGQgbmV3bGluZSBmb3IgZWFjaCBjYWxsb3V0IHRvIHQoKSBjKCkgZXRjLiBhbmQgZWFjaCBtYXJrdXAgc3RyaW5nXG5cdFx0aWYgKFwiXCIgKyBub2RlID09PSBub2RlKSB7XG5cdFx0XHQvLyBhIG1hcmt1cCBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWRcblx0XHRcdGNvZGUgKz0gJ1xcbitcIicgKyBub2RlICsgJ1wiJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYSBjb21waWxlZCB0YWcgZXhwcmVzc2lvbiB0byBiZSBpbnNlcnRlZFxuXHRcdFx0dGFnTmFtZSA9IG5vZGVbMF07XG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCIqXCIpIHtcblx0XHRcdFx0Ly8gQ29kZSB0YWc6IHt7KiB9fVxuXHRcdFx0XHRjb2RlICs9IFwiO1xcblwiICsgbm9kZVsxXSArIFwiXFxucmV0PXJldFwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29udmVydGVyID0gbm9kZVsxXTtcblx0XHRcdFx0Y29udGVudCA9ICFpc0xpbmtFeHByICYmIG5vZGVbMl07XG5cdFx0XHRcdHRhZ0N0eCA9IHBhcmFtU3RydWN0dXJlKG5vZGVbM10sICdwYXJhbXMnKSArICd9LCcgKyBwYXJhbVN0cnVjdHVyZShwYXJhbXMgPSBub2RlWzRdKTtcblx0XHRcdFx0b25FcnJvciA9IG5vZGVbNV07XG5cdFx0XHRcdHRyaWdnZXIgPSBub2RlWzZdO1xuXHRcdFx0XHRtYXJrdXAgPSBub2RlWzhdICYmIG5vZGVbOF0ucmVwbGFjZShyVW5lc2NhcGVRdW90ZXMsIFwiJDFcIik7XG5cdFx0XHRcdGlmIChpc0Vsc2UgPSB0YWdOYW1lID09PSBcImVsc2VcIikge1xuXHRcdFx0XHRcdGlmIChwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdHBhdGhCaW5kaW5ncy5wdXNoKG5vZGVbN10pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0bXBsQmluZGluZ0tleSA9IDA7XG5cdFx0XHRcdFx0aWYgKHRtcGxCaW5kaW5ncyAmJiAocGF0aEJpbmRpbmdzID0gbm9kZVs3XSkpIHsgLy8gQXJyYXkgb2YgcGF0aHMsIG9yIGZhbHNlIGlmIG5vdCBkYXRhLWJvdW5kXG5cdFx0XHRcdFx0XHRwYXRoQmluZGluZ3MgPSBbcGF0aEJpbmRpbmdzXTtcblx0XHRcdFx0XHRcdHRtcGxCaW5kaW5nS2V5ID0gdG1wbEJpbmRpbmdzLnB1c2goMSk7IC8vIEFkZCBwbGFjZWhvbGRlciBpbiB0bXBsQmluZGluZ3MgZm9yIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHVzZVZpZXdzID0gdXNlVmlld3MgfHwgcGFyYW1zWzFdIHx8IHBhcmFtc1syXSB8fCBwYXRoQmluZGluZ3MgfHwgL3ZpZXcuKD8haW5kZXgpLy50ZXN0KHBhcmFtc1swXSk7XG5cdFx0XHRcdC8vIHVzZVZpZXdzIGlzIGZvciBwZXJmIG9wdGltaXphdGlvbi4gRm9yIHJlbmRlcigpIHdlIG9ubHkgdXNlIHZpZXdzIGlmIG5lY2Vzc2FyeSAtIGZvciB0aGUgbW9yZSBhZHZhbmNlZCBzY2VuYXJpb3MuXG5cdFx0XHRcdC8vIFdlIHVzZSB2aWV3cyBpZiB0aGVyZSBhcmUgcHJvcHMsIGNvbnRleHR1YWwgcHJvcGVydGllcyBvciBhcmdzIHdpdGggIy4uLiAob3RoZXIgdGhhbiAjaW5kZXgpIC0gYnV0IHlvdSBjYW4gZm9yY2Vcblx0XHRcdFx0Ly8gdXNpbmcgdGhlIGZ1bGwgdmlldyBpbmZyYXN0cnVjdHVyZSwgKGFuZCBwYXkgYSBwZXJmIHByaWNlKSBieSBvcHRpbmcgaW46IFNldCB1c2VWaWV3czogdHJ1ZSBvbiB0aGUgdGVtcGxhdGUsIG1hbnVhbGx5Li4uXG5cdFx0XHRcdGlmIChpc0dldFZhbCA9IHRhZ05hbWUgPT09IFwiOlwiKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnZlcnRlcikge1xuXHRcdFx0XHRcdFx0dGFnTmFtZSA9IGNvbnZlcnRlciA9PT0gSFRNTCA/IFwiPlwiIDogY29udmVydGVyICsgdGFnTmFtZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRlbnQpIHsgLy8gVE9ETyBvcHRpbWl6ZSAtIGlmIGNvbnRlbnQubGVuZ3RoID09PSAwIG9yIGlmIHRoZXJlIGlzIGEgdG1wbD1cIi4uLlwiIHNwZWNpZmllZCAtIHNldCBjb250ZW50IHRvIG51bGwgLyBkb24ndCBydW4gdGhpcyBjb21waWxhdGlvbiBjb2RlIC0gc2luY2UgY29udGVudCB3b24ndCBnZXQgdXNlZCEhXG5cdFx0XHRcdFx0XHQvLyBDcmVhdGUgdGVtcGxhdGUgb2JqZWN0IGZvciBuZXN0ZWQgdGVtcGxhdGVcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwgPSB0bXBsT2JqZWN0KG1hcmt1cCwgdG1wbE9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbC50bXBsTmFtZSA9IHRtcGxOYW1lICsgXCIvXCIgKyB0YWdOYW1lO1xuXHRcdFx0XHRcdFx0Ly8gQ29tcGlsZSB0byBBU1QgYW5kIHRoZW4gdG8gY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwudXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzIHx8IHVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0YnVpbGRDb2RlKGNvbnRlbnQsIG5lc3RlZFRtcGwpO1xuXHRcdFx0XHRcdFx0dXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbHMucHVzaChuZXN0ZWRUbXBsKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIWlzRWxzZSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBub3QgYW4gZWxzZSB0YWcuXG5cdFx0XHRcdFx0XHR0YWdBbmRFbHNlcyA9IHRhZ05hbWU7XG5cdFx0XHRcdFx0XHR1c2VWaWV3cyA9IHVzZVZpZXdzIHx8IHRhZ05hbWUgJiYgKCEkdGFnc1t0YWdOYW1lXSB8fCAhJHRhZ3NbdGFnTmFtZV0uZmxvdyk7XG5cdFx0XHRcdFx0XHQvLyBTd2l0Y2ggdG8gYSBuZXcgY29kZSBzdHJpbmcgZm9yIHRoaXMgYm91bmQgdGFnIChhbmQgaXRzIGVsc2VzLCBpZiBpdCBoYXMgYW55KSAtIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRcdG9sZENvZGUgPSBjb2RlO1xuXHRcdFx0XHRcdFx0Y29kZSA9IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBhc3RbaSArIDFdO1xuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBuZXh0SXNFbHNlICYmIG5leHRJc0Vsc2VbMF0gPT09IFwiZWxzZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZ1N0YXJ0ID0gb25FcnJvciA/IFwiO1xcbnRyeXtcXG5yZXQrPVwiIDogXCJcXG4rXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IFwiXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChpc0dldFZhbCAmJiAocGF0aEJpbmRpbmdzIHx8IHRyaWdnZXIgfHwgY29udmVydGVyICYmIGNvbnZlcnRlciAhPT0gSFRNTCkpIHtcblx0XHRcdFx0XHQvLyBGb3IgY29udmVydFZhbCB3ZSBuZWVkIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBuZXcgdGFnQ3R4KHMpXG5cdFx0XHRcdFx0dGFnQ3R4Rm4gPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIFwiIC8vIFwiICsgdG1wbE5hbWUgKyBcIiBcIiArIHRtcGxCaW5kaW5nS2V5ICsgXCIgXCIgKyB0YWdOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgXCJcXG5yZXR1cm4ge1wiICsgdGFnQ3R4ICsgXCJ9O1wiKTtcblx0XHRcdFx0XHR0YWdDdHhGbi5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdHRhZ0N0eEZuLl90YWcgPSB0YWdOYW1lO1xuXG5cdFx0XHRcdFx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0YWdDdHhGbjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzZXRQYXRocyh0YWdDdHhGbiwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHR0YWdSZW5kZXIgPSAnYyhcIicgKyBjb252ZXJ0ZXIgKyAnXCIsdmlldywnO1xuXHRcdFx0XHRcdHVzZUNudnQgPSB0cnVlO1xuXHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsXCI7XG5cdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGUgKz0gKGlzR2V0VmFsXG5cdFx0XHRcdFx0PyAoaXNMaW5rRXhwciA/IChvbkVycm9yID8gXCJ0cnl7XFxuXCIgOiBcIlwiKSArIFwicmV0dXJuIFwiIDogdGFnU3RhcnQpICsgKHVzZUNudnQgLy8gQ2FsbCBfY252dCBpZiB0aGVyZSBpcyBhIGNvbnZlcnRlcjoge3tjbnZ0OiAuLi4gfX0gb3Ige157Y252dDogLi4uIH19XG5cdFx0XHRcdFx0XHQ/ICh1c2VDbnZ0ID0gdW5kZWZpbmVkLCB1c2VWaWV3cyA9IGhhc0NudnQgPSB0cnVlLCB0YWdSZW5kZXIgKyAocGF0aEJpbmRpbmdzXG5cdFx0XHRcdFx0XHRcdD8gKCh0bXBsQmluZGluZ3NbdG1wbEJpbmRpbmdLZXkgLSAxXSA9IHRhZ0N0eEZuKSwgdG1wbEJpbmRpbmdLZXkpIC8vIFN0b3JlIHRoZSBjb21waWxlZCB0YWdDdHhGbiBpbiB0bXBsLmJuZHMsIGFuZCBwYXNzIHRoZSBrZXkgdG8gY29udmVydFZhbCgpXG5cdFx0XHRcdFx0XHRcdDogXCJ7XCIgKyB0YWdDdHggKyBcIn1cIikgKyBcIilcIilcblx0XHRcdFx0XHRcdDogdGFnTmFtZSA9PT0gXCI+XCJcblx0XHRcdFx0XHRcdFx0PyAoaGFzRW5jb2RlciA9IHRydWUsIFwiaChcIiArIHBhcmFtc1swXSArIFwiKVwiKVxuXHRcdFx0XHRcdFx0XHQ6IChnZXRzVmFsID0gdHJ1ZSwgXCIoKHY9XCIgKyBwYXJhbXNbMF0gKyAnKSE9bnVsbD92OicgKyAoaXNMaW5rRXhwciA/ICdudWxsKScgOiAnXCJcIiknKSlcblx0XHRcdFx0XHRcdFx0Ly8gTm9uIHN0cmljdCBlcXVhbGl0eSBzbyBkYXRhLWxpbms9XCJ0aXRsZXs6ZXhwcn1cIiB3aXRoIGV4cHI9bnVsbC91bmRlZmluZWQgcmVtb3ZlcyB0aXRsZSBhdHRyaWJ1dGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0OiAoaGFzVGFnID0gdHJ1ZSwgXCJcXG57dmlldzp2aWV3LHRtcGw6XCIgLy8gQWRkIHRoaXMgdGFnQ3R4IHRvIHRoZSBjb21waWxlZCBjb2RlIGZvciB0aGUgdGFnQ3R4cyB0byBiZSBwYXNzZWQgdG8gcmVuZGVyVGFnKClcblx0XHRcdFx0XHRcdCsgKGNvbnRlbnQgPyBuZXN0ZWRUbXBscy5sZW5ndGggOiBcIjBcIikgKyBcIixcIiAvLyBGb3IgYmxvY2sgdGFncywgcGFzcyBpbiB0aGUga2V5IChuZXN0ZWRUbXBscy5sZW5ndGgpIHRvIHRoZSBuZXN0ZWQgY29udGVudCB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0KyB0YWdDdHggKyBcIn0sXCIpKTtcblxuXHRcdFx0XHRpZiAodGFnQW5kRWxzZXMgJiYgIW5leHRJc0Vsc2UpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgYW4gaW5saW5lIHRhZyB3aXRob3V0IGFueSBlbHNlcywgb3IgdGhlIGxhc3Qge3tlbHNlfX0gb2YgYW4gaW5saW5lIHRhZ1xuXHRcdFx0XHRcdC8vIFdlIGNvbXBsZXRlIHRoZSBjb2RlIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRjb2RlID0gXCJbXCIgKyBjb2RlLnNsaWNlKDAsIC0xKSArIFwiXVwiO1xuXHRcdFx0XHRcdHRhZ1JlbmRlciA9ICd0KFwiJyArIHRhZ0FuZEVsc2VzICsgJ1wiLHZpZXcsdGhpcywnO1xuXHRcdFx0XHRcdGlmIChpc0xpbmtFeHByIHx8IHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGJvdW5kIHRhZyAoZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgaW5saW5lIGJvdW5kIHRhZyB7Xnt0YWcgLi4ufX0pIHNvIHdlIHN0b3JlIGEgY29tcGlsZWQgdGFnQ3R4cyBmdW5jdGlvbiBpbiB0bXAuYm5kc1xuXHRcdFx0XHRcdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgXCIgLy8gXCIgKyB0bXBsTmFtZSArIFwiIFwiICsgdG1wbEJpbmRpbmdLZXkgKyBcIiBcIiArIHRhZ0FuZEVsc2VzICsgXCJcXG5yZXR1cm4gXCIgKyBjb2RlICsgXCI7XCIpO1xuXHRcdFx0XHRcdFx0Y29kZS5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdFx0Y29kZS5fdGFnID0gdGFnQW5kRWxzZXM7XG5cdFx0XHRcdFx0XHRpZiAocGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRcdHNldFBhdGhzKHRtcGxCaW5kaW5nc1t0bXBsQmluZGluZ0tleSAtIDFdID0gY29kZSwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb2RlOyAvLyBGb3IgYSBkYXRhLWxpbmsgZXhwcmVzc2lvbiB3ZSByZXR1cm4gdGhlIGNvbXBpbGVkIHRhZ0N0eHMgZnVuY3Rpb25cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsdW5kZWZpbmVkLFwiO1xuXHRcdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgdGhlIGxhc3Qge3tlbHNlfX0gZm9yIGFuIGlubGluZSB0YWcuXG5cdFx0XHRcdFx0Ly8gRm9yIGEgYm91bmQgdGFnLCBwYXNzIHRoZSB0YWdDdHhzIGZuIGxvb2t1cCBrZXkgdG8gcmVuZGVyVGFnLlxuXHRcdFx0XHRcdC8vIEZvciBhbiB1bmJvdW5kIHRhZywgaW5jbHVkZSB0aGUgY29kZSBkaXJlY3RseSBmb3IgZXZhbHVhdGluZyB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0Y29kZSA9IG9sZENvZGUgKyB0YWdTdGFydCArIHRhZ1JlbmRlciArICh0bXBsQmluZGluZ0tleSB8fCBjb2RlKSArIFwiKVwiO1xuXHRcdFx0XHRcdHBhdGhCaW5kaW5ncyA9IDA7XG5cdFx0XHRcdFx0dGFnQW5kRWxzZXMgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvbkVycm9yKSB7XG5cdFx0XHRcdFx0dXNlVmlld3MgPSB0cnVlO1xuXHRcdFx0XHRcdGNvZGUgKz0gJztcXG59Y2F0Y2goZSl7cmV0JyArIChpc0xpbmtFeHByID8gXCJ1cm4gXCIgOiBcIis9XCIpICsgYm91bmRPbkVyclN0YXJ0ICsgJ2ouX2VycihlLHZpZXcsJyArIG9uRXJyb3IgKyAnKScgKyBib3VuZE9uRXJyRW5kICsgJzt9JyArIChpc0xpbmtFeHByID8gXCJcIiA6ICdyZXQ9cmV0Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gSW5jbHVkZSBvbmx5IHRoZSB2YXIgcmVmZXJlbmNlcyB0aGF0IGFyZSBuZWVkZWQgaW4gdGhlIGNvZGVcblx0Y29kZSA9IFwiLy8gXCIgKyB0bXBsTmFtZVxuXG5cdFx0KyBcIlxcbnZhciB2XCJcblx0XHQrIChoYXNUYWcgPyBcIix0PWouX3RhZ1wiIDogXCJcIikgICAgICAgICAgICAgICAgLy8gaGFzIHRhZ1xuXHRcdCsgKGhhc0NudnQgPyBcIixjPWouX2NudnRcIiA6IFwiXCIpICAgICAgICAgICAgICAvLyBjb252ZXJ0ZXJcblx0XHQrIChoYXNFbmNvZGVyID8gXCIsaD1qLl9odG1sXCIgOiBcIlwiKSAgICAgICAgICAgLy8gaHRtbCBjb252ZXJ0ZXJcblx0XHQrIChpc0xpbmtFeHByID8gXCI7XFxuXCIgOiAnLHJldD1cIlwiXFxuJylcblx0XHQrICh0bXBsT3B0aW9ucy5kZWJ1ZyA/IFwiZGVidWdnZXI7XCIgOiBcIlwiKVxuXHRcdCsgY29kZVxuXHRcdCsgKGlzTGlua0V4cHIgPyBcIlxcblwiIDogXCI7XFxucmV0dXJuIHJldDtcIik7XG5cblx0aWYgKCRzdWJTZXR0aW5ncy5kZWJ1Z01vZGUgIT09IGZhbHNlKSB7XG5cdFx0Y29kZSA9IFwidHJ5IHtcXG5cIiArIGNvZGUgKyBcIlxcbn1jYXRjaChlKXtcXG5yZXR1cm4gai5fZXJyKGUsIHZpZXcpO1xcbn1cIjtcblx0fVxuXG5cdHRyeSB7XG5cdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgY29kZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRzeW50YXhFcnJvcihcIkNvbXBpbGVkIHRlbXBsYXRlIGNvZGU6XFxuXFxuXCIgKyBjb2RlICsgJ1xcbjogXCInICsgZS5tZXNzYWdlICsgJ1wiJyk7XG5cdH1cblx0aWYgKHRtcGwpIHtcblx0XHR0bXBsLmZuID0gY29kZTtcblx0XHR0bXBsLnVzZVZpZXdzID0gISF1c2VWaWV3cztcblx0fVxuXHRyZXR1cm4gY29kZTtcbn1cblxuLy89PT09PT09PT09XG4vLyBVdGlsaXRpZXNcbi8vPT09PT09PT09PVxuXG4vLyBNZXJnZSBvYmplY3RzLCBpbiBwYXJ0aWN1bGFyIGNvbnRleHRzIHdoaWNoIGluaGVyaXQgZnJvbSBwYXJlbnQgY29udGV4dHNcbmZ1bmN0aW9uIGV4dGVuZEN0eChjb250ZXh0LCBwYXJlbnRDb250ZXh0KSB7XG5cdC8vIFJldHVybiBjb3B5IG9mIHBhcmVudENvbnRleHQsIHVubGVzcyBjb250ZXh0IGlzIGRlZmluZWQgYW5kIGlzIGRpZmZlcmVudCwgaW4gd2hpY2ggY2FzZSByZXR1cm4gYSBuZXcgbWVyZ2VkIGNvbnRleHRcblx0Ly8gSWYgbmVpdGhlciBjb250ZXh0IG5vciBwYXJlbnRDb250ZXh0IGFyZSBkZWZpbmVkLCByZXR1cm4gdW5kZWZpbmVkXG5cdHJldHVybiBjb250ZXh0ICYmIGNvbnRleHQgIT09IHBhcmVudENvbnRleHRcblx0XHQ/IChwYXJlbnRDb250ZXh0XG5cdFx0XHQ/ICRleHRlbmQoJGV4dGVuZCh7fSwgcGFyZW50Q29udGV4dCksIGNvbnRleHQpXG5cdFx0XHQ6IGNvbnRleHQpXG5cdFx0OiBwYXJlbnRDb250ZXh0ICYmICRleHRlbmQoe30sIHBhcmVudENvbnRleHQpO1xufVxuXG4vLyBHZXQgY2hhcmFjdGVyIGVudGl0eSBmb3IgSFRNTCBhbmQgQXR0cmlidXRlIGVuY29kaW5nXG5mdW5jdGlvbiBnZXRDaGFyRW50aXR5KGNoKSB7XG5cdHJldHVybiBjaGFyRW50aXRpZXNbY2hdIHx8IChjaGFyRW50aXRpZXNbY2hdID0gXCImI1wiICsgY2guY2hhckNvZGVBdCgwKSArIFwiO1wiKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0UHJvcHMoc291cmNlKSB7XG5cdC8vIHRoaXMgcG9pbnRlciBpcyB0aGVNYXAgLSB3aGljaCBoYXMgdGFnQ3R4LnByb3BzIHRvb1xuXHQvLyBhcmd1bWVudHM6IHRhZ0N0eC5hcmdzLlxuXHR2YXIga2V5LCBwcm9wLFxuXHRcdHByb3BzID0gW107XG5cblx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IE9CSkVDVCkge1xuXHRcdGZvciAoa2V5IGluIHNvdXJjZSkge1xuXHRcdFx0cHJvcCA9IHNvdXJjZVtrZXldO1xuXHRcdFx0aWYgKGtleSAhPT0gJGV4cGFuZG8gJiYgc291cmNlLmhhc093blByb3BlcnR5KGtleSkgJiYgISRpc0Z1bmN0aW9uKHByb3ApKSB7XG5cdFx0XHRcdHByb3BzLnB1c2goe2tleToga2V5LCBwcm9wOiBwcm9wfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wcztcbn1cblxuZnVuY3Rpb24gJGZuUmVuZGVyKGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKSB7XG5cdHZhciB0bXBsRWxlbSA9IHRoaXMuanF1ZXJ5ICYmICh0aGlzWzBdIHx8IGVycm9yKCdVbmtub3duIHRlbXBsYXRlOiBcIicgKyB0aGlzLnNlbGVjdG9yICsgJ1wiJykpLFxuXHRcdHRtcGwgPSB0bXBsRWxlbS5nZXRBdHRyaWJ1dGUodG1wbEF0dHIpO1xuXG5cdHJldHVybiByZW5kZXJDb250ZW50LmNhbGwodG1wbCA/ICQuZGF0YSh0bXBsRWxlbSlbanN2VG1wbF0gOiAkdGVtcGxhdGVzKHRtcGxFbGVtKSwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24pO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZ2lzdGVyIGNvbnZlcnRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gaHRtbEVuY29kZSh0ZXh0KSB7XG5cdC8vIEhUTUwgZW5jb2RlOiBSZXBsYWNlIDwgPiAmICcgYW5kIFwiIGJ5IGNvcnJlc3BvbmRpbmcgZW50aXRpZXMuXG5cdHJldHVybiB0ZXh0ICE9IHVuZGVmaW5lZCA/IHJJc0h0bWwudGVzdCh0ZXh0KSAmJiAoXCJcIiArIHRleHQpLnJlcGxhY2Uockh0bWxFbmNvZGUsIGdldENoYXJFbnRpdHkpIHx8IHRleHQgOiBcIlwiO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJHN1YiA9ICR2aWV3cy5zdWI7XG4kdmlld3NTZXR0aW5ncyA9ICR2aWV3cy5zZXR0aW5ncztcblxuaWYgKCEoanNyIHx8ICQgJiYgJC5yZW5kZXIpKSB7XG5cdC8vIEpzUmVuZGVyIG5vdCBhbHJlYWR5IGxvYWRlZCwgb3IgbG9hZGVkIHdpdGhvdXQgalF1ZXJ5LCBhbmQgd2UgYXJlIG5vdyBtb3ZpbmcgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVwYWNlXG5cdGZvciAoanN2U3RvcmVOYW1lIGluIGpzdlN0b3Jlcykge1xuXHRcdHJlZ2lzdGVyU3RvcmUoanN2U3RvcmVOYW1lLCBqc3ZTdG9yZXNbanN2U3RvcmVOYW1lXSk7XG5cdH1cblxuXHQkY29udmVydGVycyA9ICR2aWV3cy5jb252ZXJ0ZXJzO1xuXHQkaGVscGVycyA9ICR2aWV3cy5oZWxwZXJzO1xuXHQkdGFncyA9ICR2aWV3cy50YWdzO1xuXG5cdCRzdWIuX3RnLnByb3RvdHlwZSA9IHtcblx0XHRiYXNlQXBwbHk6IGJhc2VBcHBseSxcblx0XHRjdnRBcmdzOiBjb252ZXJ0QXJnc1xuXHR9O1xuXG5cdHRvcFZpZXcgPSAkc3ViLnRvcFZpZXcgPSBuZXcgVmlldygpO1xuXG5cdC8vQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdGlmICgkKSB7XG5cblx0XHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBqUXVlcnkgKD0gJCkgaXMgbG9hZGVkXG5cblx0XHQkLmZuLnJlbmRlciA9ICRmblJlbmRlcjtcblx0XHQkZXhwYW5kbyA9ICQuZXhwYW5kbztcblx0XHRpZiAoJC5vYnNlcnZhYmxlKSB7XG5cdFx0XHQkZXh0ZW5kKCRzdWIsICQudmlld3Muc3ViKTsgLy8ganF1ZXJ5Lm9ic2VydmFibGUuanMgd2FzIGxvYWRlZCBiZWZvcmUganNyZW5kZXIuanNcblx0XHRcdCR2aWV3cy5tYXAgPSAkLnZpZXdzLm1hcDtcblx0XHR9XG5cblx0fSBlbHNlIHtcblx0XHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBqUXVlcnkgaXMgbm90IGxvYWRlZC5cblxuXHRcdCQgPSB7fTtcblxuXHRcdGlmIChzZXRHbG9iYWxzKSB7XG5cdFx0XHRnbG9iYWwuanNyZW5kZXIgPSAkOyAvLyBXZSBhcmUgbG9hZGluZyBqc3JlbmRlci5qcyBmcm9tIGEgc2NyaXB0IGVsZW1lbnQsIG5vdCBBTUQgb3IgQ29tbW9uSlMsIHNvIHNldCBnbG9iYWxcblx0XHR9XG5cblx0XHQvLyBFcnJvciB3YXJuaW5nIGlmIGpzcmVuZGVyLmpzIGlzIHVzZWQgYXMgdGVtcGxhdGUgZW5naW5lIG9uIE5vZGUuanMgKGUuZy4gRXhwcmVzcyBvciBIYXBpLi4uKVxuXHRcdC8vIFVzZSBqc3JlbmRlci1ub2RlLmpzIGluc3RlYWQuLi5cblx0XHQkLnJlbmRlckZpbGUgPSAkLl9fZXhwcmVzcyA9ICQuY29tcGlsZSA9IGZ1bmN0aW9uKCkgeyB0aHJvdyBcIk5vZGUuanM6IHVzZSBucG0ganNyZW5kZXIsIG9yIGpzcmVuZGVyLW5vZGUuanNcIjsgfTtcblxuXHRcdC8vRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdCQuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKG9iKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIG9iID09PSBcImZ1bmN0aW9uXCI7XG5cdFx0fTtcblxuXHRcdCQuaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7XG5cdFx0XHRyZXR1cm4gKHt9LnRvU3RyaW5nKS5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIjtcblx0XHR9O1xuXG5cdFx0JHN1Yi5fanEgPSBmdW5jdGlvbihqcSkgeyAvLyBwcml2YXRlIG1ldGhvZCB0byBtb3ZlIGZyb20gSnNSZW5kZXIgQVBJcyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXNwYWNlXG5cdFx0XHRpZiAoanEgIT09ICQpIHtcblx0XHRcdFx0JGV4dGVuZChqcSwgJCk7IC8vIG1hcCBvdmVyIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lc3BhY2Vcblx0XHRcdFx0JCA9IGpxO1xuXHRcdFx0XHQkLmZuLnJlbmRlciA9ICRmblJlbmRlcjtcblx0XHRcdFx0ZGVsZXRlICQuanNyZW5kZXI7XG5cdFx0XHRcdCRleHBhbmRvID0gJC5leHBhbmRvO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQkLmpzcmVuZGVyID0gdmVyc2lvbk51bWJlcjtcblx0fVxuXHQkc3ViU2V0dGluZ3MgPSAkc3ViLnNldHRpbmdzO1xuXHQkc3ViU2V0dGluZ3MuYWxsb3dDb2RlID0gZmFsc2U7XG5cdCRpc0Z1bmN0aW9uID0gJC5pc0Z1bmN0aW9uO1xuXHQkLnJlbmRlciA9ICRyZW5kZXI7XG5cdCQudmlld3MgPSAkdmlld3M7XG5cdCQudGVtcGxhdGVzID0gJHRlbXBsYXRlcyA9ICR2aWV3cy50ZW1wbGF0ZXM7XG5cblx0Zm9yIChzZXR0aW5nIGluICRzdWJTZXR0aW5ncykge1xuXHRcdGFkZFNldHRpbmcoc2V0dGluZyk7XG5cdH1cblxuXHQoJHZpZXdzU2V0dGluZ3MuZGVidWdNb2RlID0gZnVuY3Rpb24oZGVidWdNb2RlKSB7XG5cdFx0cmV0dXJuIGRlYnVnTW9kZSA9PT0gdW5kZWZpbmVkXG5cdFx0XHQ/ICRzdWJTZXR0aW5ncy5kZWJ1Z01vZGVcblx0XHRcdDogKFxuXHRcdFx0XHQkc3ViU2V0dGluZ3MuZGVidWdNb2RlID0gZGVidWdNb2RlLFxuXHRcdFx0XHQkc3ViU2V0dGluZ3Mub25FcnJvciA9IGRlYnVnTW9kZSArIFwiXCIgPT09IGRlYnVnTW9kZVxuXHRcdFx0XHRcdD8gbmV3IEZ1bmN0aW9uKFwiXCIsIFwicmV0dXJuICdcIiArIGRlYnVnTW9kZSArIFwiJztcIiApXG5cdFx0XHRcdFx0OiAkaXNGdW5jdGlvbihkZWJ1Z01vZGUpXG5cdFx0XHRcdFx0XHQ/IGRlYnVnTW9kZVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRcdCR2aWV3c1NldHRpbmdzKTtcblx0fSkoZmFsc2UpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuXHQkc3ViU2V0dGluZ3NBZHZhbmNlZCA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZCA9IHtcblx0XHR1c2VWaWV3czogZmFsc2UsXG5cdFx0X2pzdjogZmFsc2UgLy8gRm9yIGdsb2JhbCBhY2Nlc3MgdG8gSnNWaWV3cyBzdG9yZVxuXHR9O1xuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVnaXN0ZXIgdGFncyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCR0YWdzKHtcblx0XHRcImlmXCI6IHtcblx0XHRcdHJlbmRlcjogZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIHt7aWZ9fSBhbmQgb25jZSBmb3IgZWFjaCB7e2Vsc2V9fS5cblx0XHRcdFx0Ly8gV2Ugd2lsbCB1c2UgdGhlIHRhZy5yZW5kZXJpbmcgb2JqZWN0IGZvciBjYXJyeWluZyByZW5kZXJpbmcgc3RhdGUgYWNyb3NzIHRoZSBjYWxscy5cblx0XHRcdFx0Ly8gSWYgbm90IGRvbmUgKGEgcHJldmlvdXMgYmxvY2sgaGFzIG5vdCBiZWVuIHJlbmRlcmVkKSwgbG9vayBhdCBleHByZXNzaW9uIGZvciB0aGlzIGJsb2NrIGFuZCByZW5kZXIgdGhlIGJsb2NrIGlmIGV4cHJlc3Npb24gaXMgdHJ1dGh5XG5cdFx0XHRcdC8vIE90aGVyd2lzZSByZXR1cm4gXCJcIlxuXHRcdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdFx0dGFnQ3R4ID0gc2VsZi50YWdDdHgsXG5cdFx0XHRcdFx0cmV0ID0gKHNlbGYucmVuZGVyaW5nLmRvbmUgfHwgIXZhbCAmJiAoYXJndW1lbnRzLmxlbmd0aCB8fCAhdGFnQ3R4LmluZGV4KSlcblx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0OiAoc2VsZi5yZW5kZXJpbmcuZG9uZSA9IHRydWUsIHNlbGYuc2VsZWN0ZWQgPSB0YWdDdHguaW5kZXgsXG5cdFx0XHRcdFx0XHRcdC8vIFRlc3QgaXMgc2F0aXNmaWVkLCBzbyByZW5kZXIgY29udGVudCBvbiBjdXJyZW50IGNvbnRleHQuIFdlIGNhbGwgdGFnQ3R4LnJlbmRlcigpIHJhdGhlciB0aGFuIHJldHVybiB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0Ly8gKHdoaWNoIHdvdWxkIGFsc28gcmVuZGVyIHRoZSB0bXBsL2NvbnRlbnQgb24gdGhlIGN1cnJlbnQgY29udGV4dCBidXQgd291bGQgaXRlcmF0ZSBpZiBpdCBpcyBhbiBhcnJheSlcblx0XHRcdFx0XHRcdFx0dGFnQ3R4LnJlbmRlcih0YWdDdHgudmlldywgdHJ1ZSkpOyAvLyBubyBhcmcsIHNvIHJlbmRlcnMgYWdhaW5zdCBwYXJlbnRWaWV3LmRhdGFcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH0sXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcImZvclwiOiB7XG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHQvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciB7e2Zvcn19IGFuZCBvbmNlIGZvciBlYWNoIHt7ZWxzZX19LlxuXHRcdFx0XHQvLyBXZSB3aWxsIHVzZSB0aGUgdGFnLnJlbmRlcmluZyBvYmplY3QgZm9yIGNhcnJ5aW5nIHJlbmRlcmluZyBzdGF0ZSBhY3Jvc3MgdGhlIGNhbGxzLlxuXHRcdFx0XHR2YXIgZmluYWxFbHNlID0gIWFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdFx0dGFnQ3R4ID0gc2VsZi50YWdDdHgsXG5cdFx0XHRcdFx0cmVzdWx0ID0gXCJcIixcblx0XHRcdFx0XHRkb25lID0gMDtcblxuXHRcdFx0XHRpZiAoIXNlbGYucmVuZGVyaW5nLmRvbmUpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGZpbmFsRWxzZSA/IHRhZ0N0eC52aWV3LmRhdGEgOiB2YWw7IC8vIEZvciB0aGUgZmluYWwgZWxzZSwgZGVmYXVsdHMgdG8gY3VycmVudCBkYXRhIHdpdGhvdXQgaXRlcmF0aW9uLlxuXHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gdGFnQ3R4LnJlbmRlcih2YWx1ZSwgZmluYWxFbHNlKTsgLy8gSXRlcmF0ZXMgZXhjZXB0IG9uIGZpbmFsIGVsc2UsIGlmIGRhdGEgaXMgYW4gYXJyYXkuIChVc2Uge3tpbmNsdWRlfX0gdG8gY29tcG9zZSB0ZW1wbGF0ZXMgd2l0aG91dCBhcnJheSBpdGVyYXRpb24pXG5cdFx0XHRcdFx0XHRkb25lICs9ICRpc0FycmF5KHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA6IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChzZWxmLnJlbmRlcmluZy5kb25lID0gZG9uZSkge1xuXHRcdFx0XHRcdFx0c2VsZi5zZWxlY3RlZCA9IHRhZ0N0eC5pbmRleDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gSWYgbm90aGluZyB3YXMgcmVuZGVyZWQgd2Ugd2lsbCBsb29rIGF0IHRoZSBuZXh0IHt7ZWxzZX19LiBPdGhlcndpc2UsIHdlIGFyZSBkb25lLlxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0cHJvcHM6IHtcblx0XHRcdGJhc2VUYWc6IFwiZm9yXCIsXG5cdFx0XHRkYXRhTWFwOiBkYXRhTWFwKGdldFRhcmdldFByb3BzKSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdGluY2x1ZGU6IHtcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiKlwiOiB7XG5cdFx0XHQvLyB7eyogY29kZS4uLiB9fSAtIElnbm9yZWQgaWYgdGVtcGxhdGUuYWxsb3dDb2RlIGFuZCAkLnZpZXdzLnNldHRpbmdzLmFsbG93Q29kZSBhcmUgZmFsc2UuIE90aGVyd2lzZSBpbmNsdWRlIGNvZGUgaW4gY29tcGlsZWQgdGVtcGxhdGVcblx0XHRcdHJlbmRlcjogcmV0VmFsLFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCI6KlwiOiB7XG5cdFx0XHQvLyB7ezoqIHJldHVybmVkRXhwcmVzc2lvbiB9fSAtIElnbm9yZWQgaWYgdGVtcGxhdGUuYWxsb3dDb2RlIGFuZCAkLnZpZXdzLnNldHRpbmdzLmFsbG93Q29kZSBhcmUgZmFsc2UuIE90aGVyd2lzZSBpbmNsdWRlIGNvZGUgaW4gY29tcGlsZWQgdGVtcGxhdGVcblx0XHRcdHJlbmRlcjogcmV0VmFsLFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0ZGJnOiAkaGVscGVycy5kYmcgPSAkY29udmVydGVycy5kYmcgPSBkYmdCcmVhayAvLyBSZWdpc3RlciB7e2RiZy99fSwge3tkYmc6Li4ufX0gYW5kIH5kYmcoKSB0byB0aHJvdyBhbmQgY2F0Y2gsIGFzIGJyZWFrcG9pbnRzIGZvciBkZWJ1Z2dpbmcuXG5cdH0pO1xuXG5cdCRjb252ZXJ0ZXJzKHtcblx0XHRodG1sOiBodG1sRW5jb2RlLFxuXHRcdGF0dHI6IGh0bWxFbmNvZGUsIC8vIEluY2x1ZGVzID4gZW5jb2Rpbmcgc2luY2UgckNvbnZlcnRNYXJrZXJzIGluIEpzVmlld3MgZG9lcyBub3Qgc2tpcCA+IGNoYXJhY3RlcnMgaW4gYXR0cmlidXRlIHN0cmluZ3Ncblx0XHR1cmw6IGZ1bmN0aW9uKHRleHQpIHtcblx0XHRcdC8vIFVSTCBlbmNvZGluZyBoZWxwZXIuXG5cdFx0XHRyZXR1cm4gdGV4dCAhPSB1bmRlZmluZWQgPyBlbmNvZGVVUkkoXCJcIiArIHRleHQpIDogdGV4dCA9PT0gbnVsbCA/IHRleHQgOiBcIlwiOyAvLyBudWxsIHJldHVybnMgbnVsbCwgZS5nLiB0byByZW1vdmUgYXR0cmlidXRlLiB1bmRlZmluZWQgcmV0dXJucyBcIlwiXG5cdFx0fVxuXHR9KTtcbn1cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gRGVmaW5lIGRlZmF1bHQgZGVsaW1pdGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuJHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcbiRpc0FycmF5ID0gKCR8fGpzcikuaXNBcnJheTtcbiR2aWV3c1NldHRpbmdzLmRlbGltaXRlcnMoXCJ7e1wiLCBcIn19XCIsIFwiXlwiKTtcblxuaWYgKGpzclRvSnEpIHsgLy8gTW92aW5nIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lcGFjZSAtIGNvcHkgb3ZlciB0aGUgc3RvcmVkIGl0ZW1zICh0ZW1wbGF0ZXMsIGNvbnZlcnRlcnMsIGhlbHBlcnMuLi4pXG5cdGpzci52aWV3cy5zdWIuX2pxKCQpO1xufVxucmV0dXJuICQgfHwganNyO1xufSwgd2luZG93KSk7XG4iLCIvKmdsb2JhbCBRVW5pdCwgdGVzdCwgZXF1YWwsIG9rKi9cbihmdW5jdGlvbih1bmRlZmluZWQpIHtcblwidXNlIHN0cmljdFwiO1xuXG5icm93c2VyaWZ5LmRvbmUuZWxldmVuID0gdHJ1ZTtcblxuUVVuaXQubW9kdWxlKFwiQnJvd3NlcmlmeSAtIGNsaWVudCBjb2RlXCIpO1xuXG52YXIgaXNJRTggPSB3aW5kb3cuYXR0YWNoRXZlbnQgJiYgIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyO1xuXG5pZiAoIWlzSUU4KSB7XG5cbnRlc3QoJ01vcmUgRXJyb3JzIGZvciByZXF1aXJlKCkgZm9yIEpzUmVuZGVyLCBKc1ZpZXdzLCBKc09ic2VydmFibGUsIEpzUmVuZGVyIHRlbXBsYXRlcycsIGZ1bmN0aW9uKCkge1xuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEhpZGUgUVVuaXQgZ2xvYmFsIGpRdWVyeSBhbmQgYW55IHByZXZpb3VzIGdsb2JhbCBqc3JlbmRlci4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXHR2YXIgalF1ZXJ5ID0gZ2xvYmFsLmpRdWVyeSwganNyID0gZ2xvYmFsLmpzcmVuZGVyO1xuXHRnbG9iYWwualF1ZXJ5ID0gZ2xvYmFsLmpzcmVuZGVyID0gdW5kZWZpbmVkO1xuXG5cdHZhciAkanEsICRqc3IsIHRtcGwsIHJlc3VsdDtcblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBY3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG5cdCRqc3IgPSByZXF1aXJlKFwianNyZW5kZXJcIikocmVxdWlyZShcImpRdWVyeVwiKSk7XG5cdFxuXHR0cnkge1xuXHRcdCRqc3IgPSByZXF1aXJlKCcuLi8uLi9qcXVlcnkudmlld3MnKSgkanNyKTsgLy8gU2hvdWxkIHByb3ZpZGUgalF1ZXJ5IHdpdGggSnNSZW5kZXIsIEpzT2JzZXJ2YWJsZVxuXHR9XG5cdGNhdGNoKGUpIHtcblx0XHRyZXN1bHQgPSBlO1xuXHR9XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBc3NlcnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdGVxdWFsKHJlc3VsdCwgXCJKc1ZpZXdzIHJlcXVpcmVzIEpzT2JzZXJ2YWJsZVwiLCAncmVxdWlyZShcImpxdWVyeS52aWV3c1wiKSgkanNyKSB0aHJvd3MgXCJKc1ZpZXdzIHJlcXVpcmVzIEpzT2JzZXJ2YWJsZVwiJyk7XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gQWN0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblxuXHQkanNyID0gcmVxdWlyZShcImpzcmVuZGVyXCIpKHJlcXVpcmUoXCJqUXVlcnlcIikpO1xuXHRcblx0dHJ5IHtcblx0XHQkanNyID0gcmVxdWlyZSgnLi4vLi4vJykoKTsgLy8gU2hvdWxkIHByb3ZpZGUgalF1ZXJ5XG5cdH1cblx0Y2F0Y2goZSkge1xuXHRcdHJlc3VsdCA9IGU7XG5cdH1cblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEFzc2VydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0ZXF1YWwocmVzdWx0LCBcIkpzVmlld3MgcmVxdWlyZXMgalF1ZXJ5XCIsICdyZXF1aXJlKFwianN2aWV3c1wiKSgkKSB0aHJvd3MgXCJKc1ZpZXdzIHJlcXVpcmVzIGpRdWVyeVwiJyk7XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gQWN0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblxuXHR0cnkge1xuXHRcdCRqc3IgPSByZXF1aXJlKCcuLi8uLi8nKShcImFcIik7IC8vIFNob3VsZCBwcm92aWRlIGpRdWVyeVxuXHR9XG5cdGNhdGNoKGUpIHtcblx0XHRyZXN1bHQgPSBlO1xuXHR9XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBc3NlcnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdGVxdWFsKHJlc3VsdCwgXCJKc1ZpZXdzIHJlcXVpcmVzIGpRdWVyeVwiLCAncmVxdWlyZShcImpzdmlld3NcIikoXCJhXCIpIHRocm93cyBcIkpzVmlld3MgcmVxdWlyZXMgalF1ZXJ5XCInKTtcblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBY3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG5cdCRqc3IgPSByZXF1aXJlKFwianNyZW5kZXJcIik7XG5cdFxuXHR0cnkge1xuXHRcdCRqc3IgPSByZXF1aXJlKCcuLi8uLi8nKSgkanNyKTsgLy8gU2hvdWxkIHByb3ZpZGUgalF1ZXJ5XG5cdH1cblx0Y2F0Y2goZSkge1xuXHRcdHJlc3VsdCA9IGU7XG5cdH1cblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEFzc2VydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0ZXF1YWwocmVzdWx0LCBcIkpzVmlld3MgcmVxdWlyZXMgalF1ZXJ5XCIsICdyZXF1aXJlKFwianN2aWV3c1wiKShqUXVlcnkpIHRocm93cyBcIkpzVmlld3MgcmVxdWlyZXMgalF1ZXJ5XCInKTtcblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFJlc2V0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXHRnbG9iYWwualF1ZXJ5ID0galF1ZXJ5OyAvLyBSZXBsYWNlIFFVbml0IGdsb2JhbCBqUXVlcnlcblx0Z2xvYmFsLmpzcmVuZGVyID0ganNyOyAvLyBSZXBsYWNlIGFueSBwcmV2aW91cyBnbG9iYWwganNyZW5kZXJcbn0pO1xufVxufSkoKTtcbiJdfQ== +//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqcXVlcnkudmlld3MuanMiLCJqc3ZpZXdzLmpzIiwibm9kZV9tb2R1bGVzL2pRdWVyeS9kaXN0L2pxdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9qc3JlbmRlci9qc3JlbmRlci5qcyIsInRlc3QvYnJvd3NlcmlmeS8xMS1lcnJvcnMtdW5pdC10ZXN0cy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM29HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4NU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzEvUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDOXlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qISBqcXVlcnkudmlld3MuanMgdjAuOS44MyAoQmV0YSk6IGh0dHA6Ly9qc3ZpZXdzLmNvbS8gKi9cbi8qXG4gKiBJbnRlcmFjdGl2ZSBkYXRhLWRyaXZlbiB2aWV3cyB1c2luZyBKc1JlbmRlciB0ZW1wbGF0ZXMuXG4gKiBTdWJjb21wb25lbnQgb2YgSnNWaWV3c1xuICogUmVxdWlyZXMgalF1ZXJ5IGFuZCBqc3JlbmRlci5qcyAoQmVzdC1vZi1icmVlZCB0ZW1wbGF0aW5nIGluIGJyb3dzZXIgb3Igb24gTm9kZS5qcylcbiAqICAgU2VlIEpzUmVuZGVyIGF0IGh0dHA6Ly9qc3ZpZXdzLmNvbS8jZG93bmxvYWQgYW5kIGh0dHA6Ly9naXRodWIuY29tL0JvcmlzTW9vcmUvanNyZW5kZXJcbiAqIEFsc28gcmVxdWlyZXMganF1ZXJ5Lm9ic2VydmFibGUuanNcbiAqICAgU2VlIEpzT2JzZXJ2YWJsZSBhdCBodHRwOi8vanN2aWV3cy5jb20vI2Rvd25sb2FkIGFuZCBodHRwOi8vZ2l0aHViLmNvbS9Cb3Jpc01vb3JlL2pzdmlld3NcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNiwgQm9yaXMgTW9vcmVcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4vL2pzaGludCAtVzAxOCwgLVcwNDFcblxuKGZ1bmN0aW9uKGZhY3RvcnksIGdsb2JhbCkge1xuXHQvLyBnbG9iYWwgdmFyIGlzIHRoZSB0aGlzIG9iamVjdCwgd2hpY2ggaXMgd2luZG93IHdoZW4gcnVubmluZyBpbiB0aGUgdXN1YWwgYnJvd3NlciBlbnZpcm9ubWVudFxuXHR2YXIgJCA9IGdsb2JhbC5qUXVlcnk7XG5cblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7IC8vIENvbW1vbkpTIGUuZy4gQnJvd3NlcmlmeVxuXHRcdG1vZHVsZS5leHBvcnRzID0gJFxuXHRcdFx0PyBmYWN0b3J5KGdsb2JhbCwgJClcblx0XHRcdDogZnVuY3Rpb24oJCkgeyAvLyBJZiBubyBnbG9iYWwgalF1ZXJ5LCB0YWtlIGpRdWVyeSBwYXNzZWQgYXMgcGFyYW1ldGVyICh3aXRoIEpzUmVuZGVyIGFuZCBKc09ic2VydmFibGUpOiByZXF1aXJlKFwianF1ZXJ5LnZpZXdzXCIpKGpRdWVyeSlcblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoZ2xvYmFsLCAkKTtcblx0XHRcdH07XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHsgLy8gQU1EIHNjcmlwdCBsb2FkZXIsIGUuZy4gUmVxdWlyZUpTXG5cdFx0ZGVmaW5lKFtcImpxdWVyeVwiLCBcIi4vanNyZW5kZXJcIiwgXCIuL2pxdWVyeS5vYnNlcnZhYmxlXCJdLCBmdW5jdGlvbigkLCBqc3IsIGpzbykge1xuXHRcdFx0cmV0dXJuIGZhY3RvcnkoZ2xvYmFsLCAkLCBqc3IsIGpzbyk7XG5cdFx0fSk7IC8vIFJlcXVpcmUgalF1ZXJ5LCBKc1JlbmRlciwgSnNPYnNlcnZhYmxlXG5cdH0gZWxzZSB7IC8vIEJyb3dzZXIgdXNpbmcgcGxhaW4gPHNjcmlwdD4gdGFnXG5cdFx0ZmFjdG9yeShnbG9iYWwsIGZhbHNlKTtcblx0fVxufSAoXG5cbi8vIGZhY3RvcnkgKGZvciBqcXVlcnkudmlld3MuanMpXG5mdW5jdGlvbihnbG9iYWwsICQsIGpzciwganNvKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgdmFycyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBnbG9iYWwgdmFyIGlzIHRoZSB0aGlzIG9iamVjdCwgd2hpY2ggaXMgd2luZG93IHdoZW4gcnVubmluZyBpbiB0aGUgdXN1YWwgYnJvd3NlciBlbnZpcm9ubWVudFxudmFyIHNldEdsb2JhbHMgPSAkID09PSBmYWxzZTsgLy8gT25seSBzZXQgZ2xvYmFscyBpZiBzY3JpcHQgYmxvY2sgaW4gYnJvd3NlciAobm90IEFNRCBhbmQgbm90IENvbW1vbkpTKVxuXG5qc3IgPSBqc3IgfHwgc2V0R2xvYmFscyAmJiBnbG9iYWwuanNyZW5kZXI7XG4kID0gJCB8fCBnbG9iYWwualF1ZXJ5O1xuXG52YXIgdmVyc2lvbk51bWJlciA9IFwidjAuOS44M1wiLFxuXHRyZXF1aXJlc1N0ciA9IFwiSnNWaWV3cyByZXF1aXJlcyBcIjtcblxuaWYgKCEkIHx8ICEkLmZuKSB7XG5cdC8vIGpRdWVyeSBpcyBub3QgbG9hZGVkLlxuXHR0aHJvdyByZXF1aXJlc1N0ciArIFwialF1ZXJ5XCI7IC8vIFdlIHJlcXVpcmUgalF1ZXJ5XG59XG5cbmlmIChqc3IgJiYgIWpzci5mbikge1xuXHRqc3Iudmlld3Muc3ViLl9qcSgkKTsgLy8gbWFwIG92ZXIgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVzcGFjZVxufVxuXG52YXIgJG9ic2VydmUsICRvYnNlcnZhYmxlLFxuXHQkaXNBcnJheSA9ICQuaXNBcnJheSxcblx0JHZpZXdzID0gJC52aWV3cztcblxuaWYgKCEkdmlld3MgfHwgISR2aWV3cy5tYXApIHtcblx0XHQvLyBKc1JlbmRlciBpcyBub3QgbG9hZGVkLlxuXHR0aHJvdyByZXF1aXJlc1N0ciArIFwiSnNSZW5kZXJcIjsgLy8ganNyZW5kZXIuanMgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIEpzVmlld3MgYW5kIGFmdGVyIGpRdWVyeVxufVxuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQsXG5cdCR2aWV3c1NldHRpbmdzID0gJHZpZXdzLnNldHRpbmdzLFxuXHQkc3ViID0gJHZpZXdzLnN1Yixcblx0JHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncyxcblx0JGV4dGVuZCA9ICRzdWIuZXh0ZW5kLFxuXHQkaXNGdW5jdGlvbiA9ICQuaXNGdW5jdGlvbixcblx0JGV4cGFuZG8gPSAkLmV4cGFuZG8sXG5cdCRjb252ZXJ0ZXJzID0gJHZpZXdzLmNvbnZlcnRlcnMsXG5cdCR0YWdzID0gJHZpZXdzLnRhZ3MsXG5cdCRzdWJTZXR0aW5nc0FkdmFuY2VkID0gJHN1YlNldHRpbmdzLmFkdmFuY2VkLFxuXG5cdC8vIFRoZXNlIHR3byBzZXR0aW5ncyBjYW4gYmUgb3ZlcnJpZGRlbiBvbiBzZXR0aW5ncyBhZnRlciBsb2FkaW5nIGpzUmVuZGVyLCBhbmQgcHJpb3IgdG8gbG9hZGluZyBqcXVlcnkub2JzZXJ2YWJsZS5qcyBhbmQvb3IgSnNWaWV3c1xuXHRwcm9wZXJ0eUNoYW5nZVN0ciA9ICRzdWIucHJvcENobmcgPSAkc3ViLnByb3BDaG5nIHx8IFwicHJvcGVydHlDaGFuZ2VcIixcblx0YXJyYXlDaGFuZ2VTdHIgPSAkc3ViLmFyckNobmcgPSAkc3ViLmFyckNobmcgfHwgXCJhcnJheUNoYW5nZVwiLFxuXG5cdEhUTUwgPSBcImh0bWxcIixcblx0c3ludGF4RXJyb3IgPSAkc3ViLnN5bnRheEVycixcblx0ckZpcnN0RWxlbSA9IC88KD8hc2NyaXB0KShcXHcrKVs+XFxzXS8sXG5cdGVycm9yID0gJHN1Yi5fZXIsXG5cdG9uUmVuZGVyRXJyb3IgPSAkc3ViLl9lcnIsXG5cdGRlbGltT3BlbkNoYXIwLCBkZWxpbU9wZW5DaGFyMSwgZGVsaW1DbG9zZUNoYXIwLCBkZWxpbUNsb3NlQ2hhcjEsIGxpbmtDaGFyLCB0b3BWaWV3LFxuXHRyRXNjYXBlUXVvdGVzID0gL1snXCJcXFxcXS9nOyAvLyBFc2NhcGUgcXVvdGVzIGFuZCBcXCBjaGFyYWN0ZXJcbmlmICgkLmxpbmspIHsgcmV0dXJuICQ7IH0gLy8gSnNWaWV3cyBpcyBhbHJlYWR5IGxvYWRlZFxuXG4kc3ViU2V0dGluZ3MudHJpZ2dlciA9IHRydWU7XG52YXIgYWN0aXZlQm9keSwgclRhZ0RhdGFsaW5rLCAkdmlldywgJHZpZXdzTGlua0F0dHIsIGxpbmtWaWV3c1NlbCwgd3JhcE1hcCwgdmlld1N0b3JlLCBvbGRBZHZTZXQsXG5cdGpzdkF0dHJTdHIgPSBcImRhdGEtanN2XCIsXG5cdGVsZW1lbnRDaGFuZ2VTdHIgPSBcImNoYW5nZS5qc3ZcIixcblx0b25CZWZvcmVDaGFuZ2VTdHIgPSBcIm9uQmVmb3JlQ2hhbmdlXCIsXG5cdG9uQWZ0ZXJDaGFuZ2VTdHIgPSBcIm9uQWZ0ZXJDaGFuZ2VcIixcblx0b25BZnRlckNyZWF0ZVN0ciA9IFwib25BZnRlckNyZWF0ZVwiLFxuXHRDSEVDS0VEID0gXCJjaGVja2VkXCIsXG5cdENIRUNLQk9YID0gXCJjaGVja2JveFwiLFxuXHRSQURJTyA9IFwicmFkaW9cIixcblx0Tk9ORSA9IFwibm9uZVwiLFxuXHRTQ1JJUFQgPSBcIlNDUklQVFwiLFxuXHRUUlVFID0gXCJ0cnVlXCIsXG5cdGNsb3NlU2NyaXB0ID0gJ1wiPjwvc2NyaXB0PicsXG5cdG9wZW5TY3JpcHQgPSAnPHNjcmlwdCB0eXBlPVwianN2Jyxcblx0ZGVmZXJBdHRyID0ganN2QXR0clN0ciArIFwiLWRmXCIsXG5cdGJpbmRFbHNTZWwgPSBcInNjcmlwdCxbXCIgKyBqc3ZBdHRyU3RyICsgXCJdXCIsXG5cdGZuU2V0dGVycyA9IHtcblx0XHR2YWx1ZTogXCJ2YWxcIixcblx0XHRpbnB1dDogXCJ2YWxcIixcblx0XHRodG1sOiBIVE1MLFxuXHRcdHRleHQ6IFwidGV4dFwiXG5cdH0sXG5cdHZhbHVlQmluZGluZyA9IHtmcm9tOiBcInZhbHVlXCIsIHRvOiBcInZhbHVlXCJ9LFxuXHRpc0NsZWFuQ2FsbCA9IDAsXG5cdG9sZENsZWFuRGF0YSA9ICQuY2xlYW5EYXRhLFxuXHRvbGRKc3ZEZWxpbWl0ZXJzID0gJHZpZXdzU2V0dGluZ3MuZGVsaW1pdGVycyxcblx0c2FmZUZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRxc2EgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yLFxuXG5cdC8vIGVsQ29udGVudCBtYXBzIHRhZ05hbWVzIHdoaWNoIGhhdmUgb25seSBlbGVtZW50IGNvbnRlbnQsIHNvIG1heSBub3Qgc3VwcG9ydCBzY3JpcHQgbm9kZXMuXG5cdGVsQ29udGVudCA9IHtvbDogMSwgdWw6IDEsIHRhYmxlOiAxLCB0Ym9keTogMSwgdGhlYWQ6IDEsIHRmb290OiAxLCB0cjogMSwgY29sZ3JvdXA6IDEsIGRsOiAxLCBzZWxlY3Q6IDEsIG9wdGdyb3VwOiAxLCBzdmc6IDEsIHN2Z19uczogMX0sXG5cdGJhZFBhcmVudCA9IHt0cjogXCJ0YWJsZVwifSxcblx0dm9pZEVsZW1zID0ge2JyOiAxLCBpbWc6IDEsIGlucHV0OiAxLCBocjogMSwgYXJlYTogMSwgYmFzZTogMSwgY29sOiAxLCBsaW5rOiAxLCBtZXRhOiAxLFxuXHRcdGNvbW1hbmQ6IDEsIGVtYmVkOiAxLCBrZXlnZW46IDEsIHBhcmFtOiAxLCBzb3VyY2U6IDEsIHRyYWNrOiAxLCB3YnI6IDF9LFxuXHRkaXNwbGF5U3R5bGVzID0ge30sXG5cdGJpbmRpbmdTdG9yZSA9IHt9LFxuXHRiaW5kaW5nS2V5ID0gMSxcblx0clZpZXdQYXRoID0gL14jKHZpZXdcXC4/KT8vLFxuXHRyQ29udmVydE1hcmtlcnMgPSAvKChcXC8+KXw8XFwvKFxcdyspPnwpKFxccyopKFsjXFwvXVxcZCsoPzpffChcXF4pKSlgKFxccyopKDxcXHcrKD89W1xcc1xcLz5dKSk/fFxccyooPzooPFxcdysoPz1bXFxzXFwvPl0pKXw8XFwvKFxcdyspPihcXHMqKXwoXFwvPilcXHMqfCg+KXwkKS9nLFxuXHRyT3BlblZpZXdNYXJrZXJzID0gLygjKSgpKFxcZCspKF8pL2csXG5cdHJPcGVuTWFya2VycyA9IC8oIykoKShcXGQrKShbX15dKS9nLFxuXHRyVmlld01hcmtlcnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShfKS9nLFxuXHRyT3BlblRhZ01hcmtlcnMgPSAvKCMpKCkoXFxkKykoXFxeKS9nLFxuXHRyTWFya2VyVG9rZW5zID0gLyg/OigjKXwoXFwvKSkoXFxkKykoW19eXSkoWy0rQFxcZF0rKT8vZyxcblx0clNwbGl0QmluZGluZ3MgPSAvJihcXGQrKVxcKz8vZyxcblx0Z2V0Q29tcHV0ZWRTdHlsZSA9IGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlO1xuXG4kb2JzZXJ2YWJsZSA9ICQub2JzZXJ2YWJsZTtcblxuaWYgKCEkb2JzZXJ2YWJsZSkge1xuXHQvLyBKc09ic2VydmFibGUgaXMgbm90IGxvYWRlZC5cblx0dGhyb3cgcmVxdWlyZXNTdHIgKyBcIkpzT2JzZXJ2YWJsZVwiOyAvLyBqcXVlcnkub2JzZXJ2YWJsZS5qcyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgSnNWaWV3c1xufVxuXG4kb2JzZXJ2ZSA9ICRvYnNlcnZhYmxlLm9ic2VydmU7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gRXZlbnQgaGFuZGxlcnNcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGVsZW1DaGFuZ2VIYW5kbGVyKGV2LCBwYXJhbXMsIHNvdXJjZVZhbHVlKSB7XG5cdHZhciBzZXR0ZXIsIGNhbmNlbCwgZnJvbUF0dHIsIGxpbmtDdHgsIGN2dEJhY2ssIGNudnROYW1lLCB0YXJnZXQsICRzb3VyY2UsIHZpZXcsIGJpbmRpbmcsXG5cdFx0b2xkTGlua0N0eCwgb25CZWZvcmVDaGFuZ2UsIG9uQWZ0ZXJDaGFuZ2UsIHRhZywgdG8sIGV2ZW50QXJncywgZXhwck9iLCBjb250ZXh0Q2IsXG5cdFx0c291cmNlID0gZXYudGFyZ2V0LFxuXHRcdGJpbmRpbmdzID0gc291cmNlLl9qc3ZCbmQ7XG5cblx0Ly8gX2pzdkJuZCBpcyBhIHN0cmluZyB3aXRoIHRoZSBzeW50YXg6IFwiJmJpbmRpbmdJZDEmYmluZGluZ0lkMlwiXG5cdHdoaWxlIChiaW5kaW5nID0gclNwbGl0QmluZGluZ3MuZXhlYyhiaW5kaW5ncykpIHtcblx0XHRpZiAoYmluZGluZyA9IGJpbmRpbmdTdG9yZVtiaW5kaW5nWzFdXSkge1xuXHRcdFx0aWYgKHRvID0gYmluZGluZy50bykge1xuXHRcdFx0XHQvLyBUaGUgYmluZGluZyBoYXMgYSAndG8nIGZpZWxkLCB3aGljaCBpcyBvZiB0aGUgZm9ybSBbW3RhcmdldE9iamVjdCwgdG9QYXRoXSwgY3Z0QmFja11cblx0XHRcdFx0bGlua0N0eCA9IGJpbmRpbmcubGlua0N0eDtcblx0XHRcdFx0dmlldyA9IGxpbmtDdHgudmlldztcblx0XHRcdFx0dGFnID0gbGlua0N0eC50YWcgfHwgdmlldy50YWc7XG5cdFx0XHRcdCRzb3VyY2UgPSAkKHNvdXJjZSk7XG5cdFx0XHRcdG9uQmVmb3JlQ2hhbmdlID0gdmlldy5obHAob25CZWZvcmVDaGFuZ2VTdHIpOyAvLyBUT0RPIENhbiB3ZSBvcHRpbWl6ZSB0aGlzIGFuZCBvdGhlciBpbnN0YW5jZXMgb2Ygc2FtZT9cblx0XHRcdFx0b25BZnRlckNoYW5nZSA9IHZpZXcuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpOyAvLyBUT0RPIENhbiB3ZSBvcHRpbWl6ZSB0aGlzIGFuZCBvdGhlciBpbnN0YW5jZXMgb2Ygc2FtZVxuXHRcdFx0XHRmcm9tQXR0ciA9IGRlZmF1bHRBdHRyKHNvdXJjZSk7XG5cdFx0XHRcdHNldHRlciA9IGZuU2V0dGVyc1tmcm9tQXR0cl07XG5cdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0c291cmNlVmFsdWUgPSAkaXNGdW5jdGlvbihmcm9tQXR0cilcblx0XHRcdFx0XHRcdD8gZnJvbUF0dHIoc291cmNlKVxuXHRcdFx0XHRcdFx0OiBzZXR0ZXJcblx0XHRcdFx0XHRcdFx0PyAkc291cmNlW3NldHRlcl0oKVxuXHRcdFx0XHRcdFx0XHQ6ICRzb3VyY2UuYXR0cihmcm9tQXR0cik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y252dE5hbWUgPSB0b1sxXTtcblx0XHRcdFx0dG8gPSB0b1swXTsgLy8gW29iamVjdCwgcGF0aF1cblx0XHRcdFx0dG8gPSB0byArIFwiXCIgPT09IHRvID8gW2xpbmtDdHguZGF0YSwgdG9dIDogdG87XG5cdFx0XHRcdGlmIChjbnZ0TmFtZSkge1xuXHRcdFx0XHRcdGlmICgkaXNGdW5jdGlvbihjbnZ0TmFtZSkpIHtcblx0XHRcdFx0XHRcdGN2dEJhY2sgPSBjbnZ0TmFtZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y3Z0QmFjayA9IHZpZXcuZ2V0UnNjKFwiY29udmVydGVyc1wiLCBjbnZ0TmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChsaW5rQ3R4LmVsZW0ubm9kZU5hbWUgPT09IFwiU0VMRUNUXCIpIHtcblx0XHRcdFx0XHRsaW5rQ3R4LmVsZW0uX2pzdlNlbCA9IHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWUgfHwgKGxpbmtDdHguZWxlbS5tdWx0aXBsZSA/IFtdIDogc291cmNlVmFsdWUpO1xuXHRcdFx0XHRcdC8vIGRhdGEtbGluayA8c2VsZWN0PiB0byBzdHJpbmcgb3IgKG11bHRpc2VsZWN0KSBhcnJheSBvZiBzdHJpbmdzXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGN2dEJhY2spIHtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGN2dEJhY2suY2FsbCh0YWcsIHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHRcdFx0XHRvbGRMaW5rQ3R4ID0gdmlldy5saW5rQ3R4O1xuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0XHRldmVudEFyZ3MgPSB7XG5cdFx0XHRcdFx0Y2hhbmdlOiBcImNoYW5nZVwiLFxuXHRcdFx0XHRcdG9sZFZhbHVlOiBsaW5rQ3R4Ll92YWwsXG5cdFx0XHRcdFx0dmFsdWU6IHNvdXJjZVZhbHVlXG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmICgoIW9uQmVmb3JlQ2hhbmdlIHx8ICEoY2FuY2VsID0gb25CZWZvcmVDaGFuZ2UuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKSAmJlxuXHRcdFx0XHRcdFx0KCF0YWcgfHwgIXRhZy5vbkJlZm9yZUNoYW5nZSB8fCAhKGNhbmNlbCA9IHRhZy5vbkJlZm9yZUNoYW5nZShldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKSAmJlxuXHRcdFx0XHRcdFx0c291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRhcmdldCA9IHRvWzBdOyAvLyBbb2JqZWN0LCBwYXRoXVxuXHRcdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCkge1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHRDYiA9IGxpbmtDdHguX2N0eENiOyAvLyBUaGlzIGlzIGEgY29tcHV0ZWQgdmFsdWVcblx0XHRcdFx0XHRcdFx0ZXhwck9iID0gdGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQgPSBsaW5rQ3R4LmRhdGE7XG5cdFx0XHRcdFx0XHRcdGlmIChleHByT2IuX2NwQ3R4KSB7IC8vIENvbXB1dGVkIHZhbHVlIGZvciBhIGNvbnRleHR1YWwgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gZXhwck9iLmRhdGE7IC8vIFRoZSBkYXRhIGZvciB0aGUgY29udGV4dHVhbCB2aWV3ICh3aGVyZSBjb250ZXh0dWFsIHBhcmFtIGV4cHJlc3Npb24gZXZhbHVhdGVkL2Fzc2lnbmVkKVxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRDYiA9IGV4cHJPYi5fY3BDdHg7IC8vIENvbnRleHQgY2FsbGJhY2sgZm9yIGNvbnRleHR1YWwgdmlld1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHdoaWxlIChleHByT2IgJiYgZXhwck9iLnNiKSB7IC8vIFN0ZXAgdGhyb3VnaCBjaGFpbmVkIGNvbXB1dGVkIHZhbHVlcyB0byBsZWFmIG9uZS4uLlxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldCA9IGNvbnRleHRDYihleHByT2IsIHRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwck9iID0gZXhwck9iLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5fLmNoZ2luZyA9IHRydWU7IC8vIG1hcmtlciB0byBwcmV2ZW50IHRhZyBjaGFuZ2UgZXZlbnQgdHJpZ2dlcmluZyBpdHMgb3duIHJlZnJlc2hcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldCkuc2V0UHJvcGVydHkodG9bMV0sIHNvdXJjZVZhbHVlKTsgLy8gMndheSBiaW5kaW5nIGNoYW5nZSBldmVudCAtIG9ic2VydmFibHkgdXBkYXRpbmcgYm91bmQgb2JqZWN0XG5cdFx0XHRcdFx0XHRpZiAob25BZnRlckNoYW5nZSkge1xuXHRcdFx0XHRcdFx0XHRvbkFmdGVyQ2hhbmdlLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0YWcub25BZnRlckNoYW5nZSkge1xuXHRcdFx0XHRcdFx0XHRcdHRhZy5vbkFmdGVyQ2hhbmdlKGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRhZy5fLmNoZ2luZyA9IHVuZGVmaW5lZDsgLy8gY2xlYXIgdGhlIG1hcmtlclxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bGlua0N0eC5fdmFsID0gc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q2hhbmdlSGFuZGxlcihldiwgZXZlbnRBcmdzLCBsaW5rRm4pIHtcblx0dmFyIGF0dHIsIHNvdXJjZVZhbHVlLCBub1VwZGF0ZSwgZm9yY2VVcGRhdGUsIGhhc0Vycm9yLCBvbkVycm9yLFxuXHRcdGxpbmtDdHggPSB0aGlzLFxuXHRcdHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdHNvdXJjZSA9IGxpbmtDdHguZGF0YSxcblx0XHR0YXJnZXQgPSBsaW5rQ3R4LmVsZW0sXG5cdFx0Y3Z0ID0gbGlua0N0eC5jb252ZXJ0LFxuXHRcdHBhcmVudEVsZW0gPSB0YXJnZXQucGFyZW50Tm9kZSxcblx0XHR2aWV3ID0gbGlua0N0eC52aWV3LFxuXHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHgsXG5cdFx0b25FdmVudCA9IHZpZXcuaGxwKG9uQmVmb3JlQ2hhbmdlU3RyKTtcblxuXHQvLyBTZXQgbGlua0N0eCBvbiB2aWV3LCBkeW5hbWljYWxseSwganVzdCBkdXJpbmcgdGhpcyBoYW5kbGVyIGNhbGxcblx0dmlldy5saW5rQ3R4ID0gbGlua0N0eDtcblxuXHRpZiAocGFyZW50RWxlbSAmJiAoIW9uRXZlbnQgfHwgIShldmVudEFyZ3MgJiYgb25FdmVudC5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpID09PSBmYWxzZSkpXG5cdFx0XHQvLyBJZiBkYXRhIGNoYW5nZWQsIHRoZSBldi5kYXRhIGlzIHNldCB0byBiZSB0aGUgcGF0aC4gVXNlIHRoYXQgdG8gZmlsdGVyIHRoZSBoYW5kbGVyIGFjdGlvbi4uLlxuXHRcdFx0JiYgIShldmVudEFyZ3MgJiYgZXYuZGF0YS5wcm9wICE9PSBcIipcIiAmJiBldi5kYXRhLnByb3AgIT09IGV2ZW50QXJncy5wYXRoKSkge1xuXG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0bGlua0N0eC5ldmVudEFyZ3MgPSBldmVudEFyZ3M7XG5cdFx0fVxuXHRcdGlmIChldmVudEFyZ3MgfHwgbGlua0N0eC5fdG9Maykge1xuXHRcdFx0Ly8gSWYgZXZlbnRBcmdzIGFyZSBkZWZpbmVkLCB0aGlzIGlzIGEgZGF0YSB1cGRhdGVcblx0XHRcdC8vIE90aGVyd2lzZSB0aGlzIGlzIHRoZSBpbml0aWFsIGRhdGEtbGluayByZW5kZXJpbmcgY2FsbC4gQmluZCBvbiB0aGlzIHRoZSBmaXJzdCB0aW1lIGl0IGdldCBjYWxsZWRcblx0XHRcdGxpbmtDdHguX3RvTGsgPSAwOyAvLyBSZW1vdmUgZmxhZyB0byBza2lwIHVubmVjY2Vzc2FyeSByZWJpbmRpbmcgbmV4dCB0aW1lXG5cdFx0XHRpZiAobGlua0ZuLl9lcikge1xuXHRcdFx0XHQvLyBkYXRhLWxpbms9XCJleHByVXNpbmdUYWdPckN2dCB3aXRoIG9uZXJyb3I9Li4uXCIgLSBlLmcuIHt0YWcgLi4uIHtjdnQ6Li4uIHs6Li4uIGNvbnZlcnQ9J2N2dCdcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGxpbmtGbihzb3VyY2UsIHZpZXcpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0aGFzRXJyb3IgPSBsaW5rRm4uX2VyO1xuXHRcdFx0XHRcdG9uRXJyb3IgPSBvblJlbmRlckVycm9yKGUsdmlldywobmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3XCIsIFwicmV0dXJuIFwiICsgaGFzRXJyb3IgKyBcIjtcIikpKHNvdXJjZSwgdmlldykpO1xuXHRcdFx0XHRcdHNvdXJjZVZhbHVlID0gW3twcm9wczoge30sIGFyZ3M6IFtvbkVycm9yXX1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGxpbmtGbihzb3VyY2UsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQ29tcGlsZWQgbGluayBleHByZXNzaW9uIGZvciBsaW5rVGFnOiByZXR1cm4gdmFsdWUgZm9yIGRhdGEtbGluaz1cIns6eHh4fVwiIHdpdGggbm8gY3Z0IG9yIGN2dEJrLCBvdGhlcndpc2UgdGFnQ3R4IG9yIHRhZ0N0eHNcblxuXHRcdFx0YXR0ciA9IGdldFRhcmdldFZhbChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgdGFnID0gbGlua0N0eC50YWcsXG5cdFx0XHRcdFx0bGlua0N0eC5hdHRyIHx8IGRlZmF1bHRBdHRyKHRhcmdldCwgdHJ1ZSwgY3Z0ICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdCk7XG5cblx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0Ly8gRXhpc3RpbmcgdGFnIGluc3RhbmNlXG5cdFx0XHRcdGZvcmNlVXBkYXRlID0gaGFzRXJyb3IgfHwgdGFnLl9lcjtcblx0XHRcdFx0Ly8gSWYgdGhlIG5ldyB0YWdDdHhzIGhhc0Vycm9yIG9yIHRoZSBwcmV2aW91cyB0YWdDdHhzIGhhZCBlcnJvciwgdGhlbiBmb3JjZSB1cGRhdGVcblx0XHRcdFx0c291cmNlVmFsdWUgPSBzb3VyY2VWYWx1ZVswXSA/IHNvdXJjZVZhbHVlIDogW3NvdXJjZVZhbHVlXTtcblx0XHRcdFx0bm9VcGRhdGUgPSAhZm9yY2VVcGRhdGUgJiYgZXZlbnRBcmdzICYmIHRhZy5vblVwZGF0ZSAmJiB0YWcub25VcGRhdGUoZXYsIGV2ZW50QXJncywgc291cmNlVmFsdWUpID09PSBmYWxzZTtcblxuXHRcdFx0XHRtZXJnZUN0eHModGFnLCBzb3VyY2VWYWx1ZSwgZm9yY2VVcGRhdGUpO1xuXG5cdFx0XHRcdGlmIChub1VwZGF0ZSB8fCBhdHRyID09PSBOT05FKSB7XG5cdFx0XHRcdFx0Ly8gb25VcGRhdGUgcmV0dXJuZWQgZmFsc2UsIG9yIGF0dHIgPT09IFwibm9uZVwiLCBvciB0aGlzIGlzIGFuIHVwZGF0ZSBjb21pbmcgZnJvbSB0aGUgdGFnJ3Mgb3duIGNoYW5nZSBldmVudFxuXHRcdFx0XHRcdC8vIC0gc28gZG9uJ3QgcmVmcmVzaCB0aGUgdGFnOiB3ZSBqdXN0IHVzZSB0aGUgbmV3IHRhZ0N0eHMgbWVyZ2VkIGZyb20gdGhlIHNvdXJjZVZhbHVlLFxuXHRcdFx0XHRcdC8vICh3aGljaCBtYXkgb3B0aW9uYWxseSBoYXZlIGJlZW4gbW9kaWZlZCBpbiBvblVwZGF0ZSgpLi4uKSBhbmQgdGhlbiBiaW5kLCBhbmQgd2UgYXJlIGRvbmVcblx0XHRcdFx0XHRjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0b2JzZXJ2ZUFuZEJpbmQobGlua0N0eCwgc291cmNlLCB0YXJnZXQpO1xuXHRcdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0YWcuXy5jaGdpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c291cmNlVmFsdWUgPSB0YWcudGFnTmFtZSA9PT0gXCI6XCIgLy8gQ2FsbCBjb252ZXJ0VmFsIGlmIGl0IGlzIGEge3tjdnQ6Li4ufX0gLSBvdGhlcndpc2UgY2FsbCByZW5kZXJUYWdcblx0XHRcdFx0XHQ/ICRzdWIuX2NudnQodGFnLmN2dCwgdmlldywgc291cmNlVmFsdWVbMF0pXG5cdFx0XHRcdFx0OiAkc3ViLl90YWcodGFnLCB2aWV3LCB2aWV3LnRtcGwsIHNvdXJjZVZhbHVlLCB0cnVlLCBvbkVycm9yKTtcblx0XHRcdH0gZWxzZSBpZiAobGlua0ZuLl90YWcpIHtcblx0XHRcdFx0Ly8gRm9yIHt7OiAuLi59fSB3aXRob3V0IGEgY29udmVydCBvciBjb252ZXJ0QmFjaywgd2UgYWxyZWFkeSBoYXZlIHRoZSBzb3VyY2VWYWx1ZSwgYW5kIHdlIGFyZSBkb25lXG5cdFx0XHRcdC8vIEZvciB7ezogLi4ufX0gd2l0aCBlaXRoZXIgY3Z0IG9yIGN2dEJhY2sgd2UgY2FsbCBjb252ZXJ0VmFsIHRvIGdldCB0aGUgc291cmNlVmFsdWUgYW5kIGluc3RhbnRpYXRlIHRoZSB0YWdcblx0XHRcdFx0Ly8gSWYgY3Z0IGlzIHVuZGVmaW5lZCB0aGVuIHRoaXMgaXMgYSB0YWcsIGFuZCB3ZSBjYWxsIHJlbmRlclRhZyB0byBnZXQgdGhlIHJlbmRlcmVkIGNvbnRlbnQgYW5kIGluc3RhbnRpYXRlIHRoZSB0YWdcblx0XHRcdFx0Y3Z0ID0gY3Z0ID09PSBcIlwiID8gVFJVRSA6IGN2dDsgLy8gSWYgdGhlcmUgaXMgYSBjdnRCYWNrIGJ1dCBubyBjdnQsIHNldCBjdnQgdG8gXCJ0cnVlXCJcblx0XHRcdFx0c291cmNlVmFsdWUgPSBjdnQgLy8gQ2FsbCBjb252ZXJ0VmFsIGlmIGl0IGlzIGEge3tjdnQ6Li4ufX0gLSBvdGhlcndpc2UgY2FsbCByZW5kZXJUYWdcblx0XHRcdFx0XHQ/ICRzdWIuX2NudnQoY3Z0LCB2aWV3LCBzb3VyY2VWYWx1ZVswXSB8fCBzb3VyY2VWYWx1ZSkgLy8gY29udmVydFZhbFxuXHRcdFx0XHRcdDogJHN1Yi5fdGFnKGxpbmtGbi5fdGFnLCB2aWV3LCB2aWV3LnRtcGwsIHNvdXJjZVZhbHVlLCB0cnVlLCBvbkVycm9yKTsgLy8gcmVuZGVyVGFnXG5cblx0XHRcdFx0YWRkTGlua01ldGhvZHModGFnID0gbGlua0N0eC50YWcsIHRydWUpOyAvLyBJbiBib3RoIGNvbnZlcnRWYWwgYW5kIHJlbmRlclRhZyB3ZSBoYXZlIGluc3RhbnRpYXRlZCBhIHRhZ1xuXHRcdFx0XHRhdHRyID0gbGlua0N0eC5hdHRyIHx8IGF0dHI7IC8vIGxpbmtDdHguYXR0ciBtYXkgaGF2ZSBiZWVuIHNldCB0byB0YWcuYXR0ciBkdXJpbmcgdGFnIGluc3RhbnRpYXRpb24gaW4gcmVuZGVyVGFnXG5cdFx0XHR9XG5cblx0XHRcdGlmICh1cGRhdGVDb250ZW50KHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCBhdHRyLCB0YWcpXG5cdFx0XHRcdFx0JiYgZXZlbnRBcmdzXG5cdFx0XHRcdFx0JiYgKG9uRXZlbnQgPSB2aWV3LmhscChvbkFmdGVyQ2hhbmdlU3RyKSkpIHtcblx0XHRcdFx0b25FdmVudC5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eC5fbm9VcGQgPSAwOyAvLyBGb3IgZGF0YS1saW5rPVwiXnsuLi59XCIgcmVtb3ZlIF9ub1VwZCBmbGFnIHNvIHVwZGF0ZXMgb24gc3Vic2VxdWVudCBjYWxsc1xuXG5cdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdHRhZy5fZXIgPSBoYXNFcnJvcjtcblx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KTtcblxuXHRcdC8vIFJlbW92ZSBkeW5hbWljYWxseSBhZGRlZCBsaW5rQ3R4IGZyb20gdmlld1xuXHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0VmFsKHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCB0YWcsIGF0dHIpIHtcblx0dmFyIGN1cnJlbnRWYWx1ZSwgc2V0dGVyLCBjc3MsICR0YXJnZXQsXG5cdFx0dGFyZ2V0ID0gdGFnICYmIHRhZy5wYXJlbnRFbGVtIHx8IGxpbmtDdHguZWxlbTtcblxuXHRpZiAoc291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdCR0YXJnZXQgPSAkKHRhcmdldCk7XG5cdFx0YXR0ciA9IHRhZyAmJiB0YWcuYXR0ciB8fCBhdHRyO1xuXHRcdGlmICgkaXNGdW5jdGlvbihzb3VyY2VWYWx1ZSkpIHtcblx0XHRcdGVycm9yKGxpbmtDdHguZXhwciArIFwiOiBtaXNzaW5nIHBhcmVuc1wiKTtcblx0XHR9XG5cblx0XHRpZiAoY3NzID0gL15jc3MtLy50ZXN0KGF0dHIpICYmIGF0dHIuc2xpY2UoNCkpIHtcblx0XHRcdGN1cnJlbnRWYWx1ZSA9ICQuc3R5bGUodGFyZ2V0LCBjc3MpO1xuXHRcdFx0aWYgKCtzb3VyY2VWYWx1ZSA9PT0gc291cmNlVmFsdWUpIHtcblx0XHRcdFx0Ly8gT3B0aW1pemF0aW9uIGZvciBwZXJmIG9uIGludGVnZXIgdmFsdWVzIC0gZS5nLiBjc3Mtd2lkdGh7OndpZHRoKydweCd9XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHBhcnNlSW50KGN1cnJlbnRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChhdHRyICE9PSBcImxpbmtcIikgeyAvLyBhdHRyID09PSBcImxpbmtcIiBpcyBmb3IgdGFnIGNvbnRyb2xzIHdoaWNoIGRvIGRhdGEgYmluZGluZyBidXQgaGF2ZSBubyByZW5kZXJlZCBvdXRwdXQgb3IgdGFyZ2V0XG5cdFx0XHRpZiAoYXR0ciA9PT0gXCJ2YWx1ZVwiKSB7XG5cdFx0XHRcdGlmICh0YXJnZXQudHlwZSA9PT0gQ0hFQ0tCT1gpIHtcblx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSAkdGFyZ2V0LnByb3AoYXR0ciA9IENIRUNLRUQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFJBRElPKSB7XG5cdFx0XHRcdGlmICh0YXJnZXQudmFsdWUgPT09IChcIlwiICsgc291cmNlVmFsdWUpKSB7XG5cdFx0XHRcdFx0Y3VycmVudFZhbHVlID0gJHRhcmdldC5wcm9wKENIRUNLRUQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBhdHRyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRzZXR0ZXIgPSBmblNldHRlcnNbYXR0cl07XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHNldHRlciA/ICR0YXJnZXRbc2V0dGVyXSgpIDogJHRhcmdldC5hdHRyKGF0dHIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsaW5rQ3R4Ll92YWwgPSBjdXJyZW50VmFsdWU7XG5cdH1cblx0cmV0dXJuIGF0dHI7XG59XG5cbmZ1bmN0aW9uIHNldERlZmVyKGVsZW0sIHZhbHVlKSB7XG5cdGVsZW0uX2RmID0gdmFsdWU7IC8vIFVzZSBib3RoIGFuIGV4cGFuZG8gYW5kIGFuIGF0dHJpYnV0ZSB0byB0cmFjayBkZWZlcmVkIHRva2Vucy4gQXR0cmlidXRlIGlzIG5lZWRlZCBmb3IgcXVlcnlTZWxlY3RvckFsbCBmb3IgZ2V0Vmlld0luZm9zIChjaGlsZFRhZ3MpXG5cdGVsZW1bKHZhbHVlID8gXCJzZXRcIiA6IFwicmVtb3ZlXCIpICsgXCJBdHRyaWJ1dGVcIl0oZGVmZXJBdHRyLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29udGVudChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgYXR0ciwgdGFnKSB7XG5cdC8vIFdoZW4gY2FsbGVkIGZvciBhIHRhZywgZWl0aGVyIGluIHRhZy5yZWZyZXNoKCkgb3IgcHJvcGVydHlDaGFuZ2VIYW5kbGVyKCksIHJldHVybnMgYSBwcm9taXNlIChhbmQgc3VwcG9ydHMgYXN5bmMpXG5cdC8vIFdoZW4gY2FsbGVkIChpbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIpIGZvciB0YXJnZXQgSFRNTCByZXR1cm5zIHRydWVcblx0Ly8gV2hlbiBjYWxsZWQgKGluIHByb3BlcnR5Q2hhbmdlSGFuZGxlcikgZm9yIG90aGVyIHRhcmdldHMgcmV0dXJucyBib29sZWFuIGZvciBcImNoYW5nZWRcIlxuXHR2YXIgc2V0dGVyLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHByb21pc2UsIG5vZGVzVG9SZW1vdmUsIHVzZVByb3AsIHRva2VucywgaWQsIG9wZW5JbmRleCwgY2xvc2VJbmRleCwgdGVzdEVsZW0sIG5vZGVOYW1lLCBjU3R5bGUsIGpzdlNlbCxcblx0XHRyZW5kZXJzID0gYXR0ciAhPT0gTk9ORSAmJiBzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFsaW5rQ3R4Ll9ub1VwZCwgLy8gRm9yIGRhdGEtbGluaz1cIl57Li4ufVwiLCBkb24ndCB1cGRhdGUgdGhlIGZpcnN0IHRpbWUgKG5vIGluaXRpYWwgcmVuZGVyKSAtIGUuZy4gdG8gbGVhdmUgc2VydmVyIHJlbmRlcmVkIHZhbHVlcy5cblx0XHRzb3VyY2UgPSBsaW5rQ3R4LmRhdGEsXG5cdFx0dGFyZ2V0ID0gdGFnICYmIHRhZy5wYXJlbnRFbGVtIHx8IGxpbmtDdHguZWxlbSxcblx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZSxcblx0XHQkdGFyZ2V0ID0gJCh0YXJnZXQpLFxuXHRcdHZpZXcgPSBsaW5rQ3R4LnZpZXcsXG5cdFx0dGFyZ2V0VmFsID0gbGlua0N0eC5fdmFsLFxuXHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHgsXG5cdFx0Ly8gSWYgbm90IGEgdGFnIHdlIGNhbiB1c2UgdGhlIC5fdmFsIG9idGFpbmVkIGZyb20gZ2V0VGFyZ2V0VmFsKClcblx0XHQvLyBhbmQgb25seSB1cGRhdGUgd2hlbiB0aGUgbmV3IHZhbHVlIChzb3VyY2VWYWx1ZSkgaGFzIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgb25lXG5cdFx0Y2hhbmdlID0gdGFnO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBJbml0aWFsaXplIHRoZSB0YWcgd2l0aCBlbGVtZW50IHJlZmVyZW5jZXNcblx0XHR0YWcuXy51bmxpbmtlZCA9IHRydWU7IC8vIFNldCB0byB1bmxpbmtlZCwgc28gaW5pdGlhbGl6YXRpb24gaXMgdHJpZ2dlcmVkIGFmdGVyIHJlLXJlbmRlcmluZywgZS5nLiBmb3Igc2V0dGluZyBsaW5rZWRFbGVtLCBhbmQgY2FsbGluZyBvbkJpbmRcblx0XHR0YWcucGFyZW50RWxlbSA9IHRhZy5wYXJlbnRFbGVtIHx8IChsaW5rQ3R4LmV4cHIgfHwgdGFnLl9lbENudCkgPyB0YXJnZXQgOiB0YXJnZXRQYXJlbnQ7XG5cdFx0cHJldk5vZGUgPSB0YWcuX3Bydjtcblx0XHRuZXh0Tm9kZSA9IHRhZy5fbnh0O1xuXHR9XG5cdGlmICghcmVuZGVycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmIChhdHRyID09PSBcInZpc2libGVcIikge1xuXHRcdGF0dHIgPSBcImNzcy1kaXNwbGF5XCI7XG5cdH1cblx0aWYgKC9eY3NzLS8udGVzdChhdHRyKSkge1xuXHRcdGlmIChsaW5rQ3R4LmF0dHIgPT09IFwidmlzaWJsZVwiKSB7XG5cdFx0XHQvLyBHZXQgdGhlIGN1cnJlbnQgZGlzcGxheSBzdHlsZVxuXHRcdFx0Y1N0eWxlID0gKHRhcmdldC5jdXJyZW50U3R5bGUgfHwgZ2V0Q29tcHV0ZWRTdHlsZS5jYWxsKGdsb2JhbCwgdGFyZ2V0LCBcIlwiKSkuZGlzcGxheTtcblxuXHRcdFx0aWYgKHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBzaG93aW5nIHRoZSBlbGVtZW50LlxuXHRcdFx0XHQvLyBHZXQgdGhlIGNhY2hlZCAndmlzaWJsZScgZGlzcGxheSB2YWx1ZSBmcm9tIHRoZSAtanN2ZCBleHBhbmRvXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gdGFyZ2V0Ll9qc3ZkXG5cdFx0XHRcdFx0Ly8gT3IsIGlmIG5vdCB5ZXQgY2FjaGVkLCBnZXQgdGhlIGN1cnJlbnQgZGlzcGxheSB2YWx1ZVxuXHRcdFx0XHRcdHx8IGNTdHlsZTtcblx0XHRcdFx0aWYgKHNvdXJjZVZhbHVlID09PSBOT05FICYmICEoc291cmNlVmFsdWUgPSBkaXNwbGF5U3R5bGVzW25vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lXSkpIHtcblx0XHRcdFx0XHQvLyBDdXJyZW50bHkgZGlzcGxheSB2YWx1ZSBpcyAnbm9uZScsIGFuZCB0aGUgJ3Zpc2libGUnIHN0eWxlIGhhcyBub3QgYmVlbiBjYWNoZWQuXG5cdFx0XHRcdFx0Ly8gV2UgY3JlYXRlIGFuIGVsZW1lbnQgdG8gZmluZCB0aGUgY29ycmVjdCAndmlzaWJsZScgZGlzcGxheSBzdHlsZSBmb3IgdGhpcyBub2RlTmFtZVxuXHRcdFx0XHRcdHRlc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXN0RWxlbSk7XG5cblx0XHRcdFx0XHQvLyBHZXQgdGhlIGRlZmF1bHQgc3R5bGUgZm9yIHRoaXMgSFRNTCB0YWcgdG8gdXNlIGFzICd2aXNpYmxlJyBzdHlsZVxuXHRcdFx0XHRcdHNvdXJjZVZhbHVlXG5cdFx0XHRcdFx0XHQvLyBhbmQgY2FjaGUgaXQgYXMgYSBoYXNoIGFnYWluc3Qgbm9kZU5hbWVcblx0XHRcdFx0XHRcdD0gZGlzcGxheVN0eWxlc1tub2RlTmFtZV1cblx0XHRcdFx0XHRcdD0gKHRlc3RFbGVtLmN1cnJlbnRTdHlsZSB8fCBnZXRDb21wdXRlZFN0eWxlLmNhbGwoZ2xvYmFsLCB0ZXN0RWxlbSwgXCJcIikpLmRpc3BsYXk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXN0RWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBoaWRpbmcgdGhlIGVsZW1lbnQuXG5cdFx0XHRcdC8vIENhY2hlIHRoZSBjdXJyZW50IGRpc3BsYXkgdmFsdWUgYXMgJ3Zpc2libGUnIHN0eWxlLCBvbiBfanN2ZCBleHBhbmRvLCBmb3Igd2hlbiB3ZSBzaG93IHRoZSBlbGVtZW50IGFnYWluXG5cdFx0XHRcdHRhcmdldC5fanN2ZCA9IGNTdHlsZTtcblx0XHRcdFx0c291cmNlVmFsdWUgPSBOT05FOyAvLyBIaWRlIHRoZSBlbGVtZW50XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjaGFuZ2UgPSBjaGFuZ2UgfHwgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0JC5zdHlsZSh0YXJnZXQsIGF0dHIuc2xpY2UoNCksIHNvdXJjZVZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoYXR0ciAhPT0gXCJsaW5rXCIpIHsgLy8gYXR0ciA9PT0gXCJsaW5rXCIgaXMgZm9yIHRhZyBjb250cm9scyB3aGljaCBkbyBkYXRhIGJpbmRpbmcgYnV0IGhhdmUgbm8gcmVuZGVyZWQgb3V0cHV0IG9yIHRhcmdldFxuXHRcdGlmICgvXmRhdGEtLy50ZXN0KGF0dHIpKSB7XG5cdFx0XHQkLmRhdGEodGFyZ2V0LCBhdHRyLnNsaWNlKDUpLCBzb3VyY2VWYWx1ZSk7IC8vIFN1cHBvcnQgZm9yIGJpbmRpbmcgdG8gZGF0YSBhdHRyaWJ1dGVzOiBkYXRhLWZvb3s6ZXhwcn06IGRhdGEtZm9vIGF0dHJpYnV0ZSB3aWxsIGJlXG5cdFx0XHQvLyBleHByLnRvU3RyaW5nKCksIGJ1dCAkLmRhdGEoZWxlbWVudCwgXCJmb29cIikgYW5kICQoZWxlbWVudCkuZGF0YShcImZvb1wiKSB3aWxsIGFjdHVhbGx5IHJldHVybiB2YWx1ZSBvZiBleHByLCBldmVuIGlmIG9mIHR5cGUgb2JqZWN0XG5cdFx0fVxuXHRcdGlmIChhdHRyID09PSBDSEVDS0VEKSB7XG5cdFx0XHR1c2VQcm9wID0gdHJ1ZTtcblx0XHRcdHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWUgJiYgc291cmNlVmFsdWUgIT09IFwiZmFsc2VcIjtcblx0XHRcdC8vIFRoZSBzdHJpbmcgdmFsdWUgXCJmYWxzZVwiIGNhbiBvY2N1ciB3aXRoIGRhdGEtbGluaz1cImNoZWNrZWR7YXR0cjpleHByfVwiIC0gYXMgYSByZXN1bHQgb2YgYXR0ciwgYW5kIGhlbmNlIHVzaW5nIGNvbnZlcnRWYWwoKVxuXHRcdFx0Ly8gV2Ugd2lsbCBzZXQgdGhlIFwiY2hlY2tlZFwiIHByb3BlcnR5XG5cdFx0XHQvLyBXZSB3aWxsIGNvbXBhcmUgdGhpcyB3aXRoIHRoZSBjdXJyZW50IHZhbHVlXG5cdFx0fSBlbHNlIGlmIChhdHRyID09PSBSQURJTykge1xuXHRcdFx0Ly8gVGhpcyBpcyBhIHNwZWNpYWwgYmluZGluZyBhdHRyaWJ1dGUgZm9yIHJhZGlvIGJ1dHRvbnMsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBkZWZhdWx0ICd0bycgYmluZGluZy5cblx0XHRcdC8vIFRoaXMgYWxsb3dzIGJpbmRpbmcgYm90aCB0byB2YWx1ZSAoZm9yIGVhY2ggaW5wdXQpIGFuZCB0byB0aGUgZGVmYXVsdCBjaGVja2VkIHJhZGlvIGJ1dHRvbiAoZm9yIGVhY2ggaW5wdXQgaW4gbmFtZWQgZ3JvdXAsXG5cdFx0XHQvLyBlLmcuIGJpbmRpbmcgdG8gcGFyZW50IGRhdGEpLlxuXHRcdFx0Ly8gUGxhY2UgdmFsdWUgYmluZGluZyBmaXJzdDogPGlucHV0IHR5cGU9XCJyYWRpb1wiIGRhdGEtbGluaz1cInZhbHVlezpuYW1lfSB7OiNnZXQoJ2RhdGEnKS5kYXRhLmN1cnJlbmN5On0gXCIgLi4uLz5cblx0XHRcdC8vIG9yIChhbGxvd2luZyBhbnkgb3JkZXIgZm9yIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zKTpcblx0XHRcdC8vIDxpbnB1dCB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cInt7Om5hbWV9fVwiIGRhdGEtbGluaz1cIns6I2dldCgnZGF0YScpLmRhdGEuY3VycmVuY3k6fSB2YWx1ZV57Om5hbWV9XCIgLi4uLz5cblx0XHRcdHVzZVByb3AgPSB0cnVlO1xuXHRcdFx0YXR0ciA9IENIRUNLRUQ7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IHRhcmdldC52YWx1ZSA9PT0gKFwiXCIgKyBzb3VyY2VWYWx1ZSk7XG5cdFx0XHQvLyBJZiB0aGUgZGF0YSB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIHRoaXMgcmFkaW8gYnV0dG9uIGlucHV0LCBzZXQgdGhlIGNoZWNrZWQgcHJvcGVydHkgdG8gdHJ1ZVxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHNldCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSB0byBmYWxzZVxuXHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gXCJzZWxlY3RlZFwiIHx8IGF0dHIgPT09IFwiZGlzYWJsZWRcIiB8fCBhdHRyID09PSBcIm11bHRpcGxlXCIgfHwgYXR0ciA9PT0gXCJyZWFkb25seVwiKSB7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IChzb3VyY2VWYWx1ZSAmJiBzb3VyY2VWYWx1ZSAhPT0gXCJmYWxzZVwiKSA/IGF0dHIgOiBudWxsO1xuXHRcdFx0Ly8gVXNlIGF0dHIsIG5vdCBwcm9wLCBzbyB3aGVuIHRoZSBvcHRpb25zIChmb3IgZXhhbXBsZSkgYXJlIGNoYW5nZWQgZHluYW1pY2FsbHksIGJ1dCBpbmNsdWRlIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHZhbHVlLFxuXHRcdFx0Ly8gdGhleSB3aWxsIHN0aWxsIGJlIHNlbGVjdGVkIGFmdGVyIHRoZSBjaGFuZ2Vcblx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFwidmFsdWVcIiAmJiB0YXJnZXQubm9kZU5hbWUgPT09IFwiU0VMRUNUXCIpIHtcblx0XHRcdHRhcmdldC5fanN2U2VsID0gJGlzQXJyYXkoc291cmNlVmFsdWUpXG5cdFx0XHRcdD8gc291cmNlVmFsdWVcblx0XHRcdFx0OiBcIlwiICsgc291cmNlVmFsdWU7IC8vIElmIG5vdCBhcnJheSwgY29lcmNlIHRvIHN0cmluZ1xuXHRcdH1cblxuXHRcdGlmIChzZXR0ZXIgPSBmblNldHRlcnNbYXR0cl0pIHtcblx0XHRcdGlmIChhdHRyID09PSBIVE1MKSB7XG5cdFx0XHRcdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0XHRpZiAodGFnICYmIHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHRcdG5vZGVzVG9SZW1vdmUgPSB0YWcubm9kZXModHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHRhZy5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZSAhPT0gbmV4dE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBwcmV2Tm9kZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB0cmFuc2ZlciB0aGUgdmlldyB0b2tlbnMgb24gcHJldk5vZGUgdG8gbmV4dE5vZGUgb2YgdGhpcyAndmlld1RvUmVmcmVzaCdcblx0XHRcdFx0XHRcdFx0dHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgdGFyZ2V0LCB0YWcuX3RnSWQsIFwiXlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodG9rZW5zID0gdGFyZ2V0Ll9kZikgeyAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIG5leHROb2RlLCBhbmQgc28gdGhlIHRhcmdldC5fZGYgbWF5IGluY2x1ZGUgdG9rZW5zIHJlZmVyZW5jaW5nXG5cdFx0XHRcdFx0XHRcdC8vIHZpZXcgYW5kIHRhZyBiaW5kaW5ncyBjb250YWluZWQgd2l0aGluIHRoZSBvcGVuIGFuZCBjbG9zZSB0b2tlbnMgb2YgdGhlIHVwZGF0ZWQgdGFnIGNvbnRyb2wuIFRoZXkgbmVlZCB0byBiZSBwcm9jZXNzZWQgKGRpc3Bvc2VkKVxuXHRcdFx0XHRcdFx0XHRpZCA9IHRhZy5fdGdJZCArIFwiXlwiO1xuXHRcdFx0XHRcdFx0XHRvcGVuSW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIiNcIiArIGlkKSArIDE7XG5cdFx0XHRcdFx0XHRcdGNsb3NlSW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIi9cIiArIGlkKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAob3BlbkluZGV4ICYmIGNsb3NlSW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0b3BlbkluZGV4ICs9IGlkLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2xvc2VJbmRleCA+IG9wZW5JbmRleCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0LCB0b2tlbnMuc2xpY2UoMCwgb3BlbkluZGV4KSArIHRva2Vucy5zbGljZShjbG9zZUluZGV4KSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRkaXNwb3NlVG9rZW5zKHRva2Vucy5zbGljZShvcGVuSW5kZXgsIGNsb3NlSW5kZXgpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVcblx0XHRcdFx0XHRcdFx0PyBwcmV2Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHRcdFx0OiBuZXh0Tm9kZVxuXHRcdFx0XHRcdFx0XHRcdD8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdFx0XHRcdFx0OiB0YXJnZXQubGFzdENoaWxkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBSZW1vdmUgSFRNTCBub2Rlc1xuXHRcdFx0XHRcdCQobm9kZXNUb1JlbW92ZSkucmVtb3ZlKCk7IC8vIE5vdGUgaWYgIXRhZy5fZWxDbnQgcmVtb3ZpbmcgdGhlIG5vZGVzVG9SZW1vdmUgd2lsbCBwcm9jZXNzIGFuZCBkaXNwb3NlIHZpZXcgYW5kIHRhZyBiaW5kaW5ncyBjb250YWluZWQgd2l0aGluIHRoZSB1cGRhdGVkIHRhZyBjb250cm9sXG5cblx0XHRcdFx0XHQvLyBJbnNlcnQgYW5kIGxpbmsgbmV3IGNvbnRlbnRcblx0XHRcdFx0XHRwcm9taXNlID0gdmlldy5saW5rKHZpZXcuZGF0YSwgdGFyZ2V0LCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHNvdXJjZVZhbHVlLCB0YWcgJiYge3RhZzogdGFnLl90Z0lkLCBsYXp5TGluazogdGFnLnRhZ0N0eC5wcm9wcy5sYXp5TGlua30pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGRhdGEtbGlua2VkIHZhbHVlIHRhcmdldGluZyBpbm5lckhUTUw6IGRhdGEtbGluaz1cImh0bWx7OmV4cHJ9XCIgb3IgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXG5cdFx0XHRcdFx0cmVuZGVycyA9IHJlbmRlcnMgJiYgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRpZiAocmVuZGVycykge1xuXHRcdFx0XHRcdFx0JHRhcmdldC5lbXB0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocmVuZGVycykge1xuXHRcdFx0XHRcdFx0cHJvbWlzZSA9IHZpZXcubGluayhzb3VyY2UsIHRhcmdldCwgcHJldk5vZGUsIG5leHROb2RlLCBzb3VyY2VWYWx1ZSwgdGFnICYmIHt0YWc6IHRhZy5fdGdJZH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBSZW1vdmUgZHluYW1pY2FsbHkgYWRkZWQgbGlua0N0eCBhbmQgY3R4IGZyb20gdmlld1xuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBvbGRMaW5rQ3R4O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKGF0dHIgPT09IFwidGV4dFwiICYmIHRhcmdldC5jaGlsZHJlbiAmJiAhdGFyZ2V0LmNoaWxkcmVuWzBdKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGNvZGUgaXMgZmFzdGVyIHRoZW4gJHRhcmdldC50ZXh0KClcblx0XHRcdFx0XHRcdGlmICh0YXJnZXQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQudGV4dENvbnRlbnQgPSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldC5pbm5lclRleHQgPSBzb3VyY2VWYWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JHRhcmdldFtzZXR0ZXJdKHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKChqc3ZTZWwgPSB0YXJnZXRQYXJlbnQuX2pzdlNlbClcblx0XHRcdFx0XHQvLyBTZXR0aW5nIHZhbHVlIG9mIDxvcHRpb24+IGVsZW1lbnRcblx0XHRcdFx0XHQmJiAoYXR0ciA9PT0gXCJ2YWx1ZVwiIHx8ICEkdGFyZ2V0LmF0dHIoXCJ2YWx1ZVwiKSkpIHsgLy8gU2V0dGluZyB2YWx1ZSBhdHRyaWJ1dGUsIG9yIHNldHRpbmcgdGV4dENvbnRlbnQgaWYgYXR0cmlidXRlIGlzIG51bGxcblx0XHRcdFx0XHQvLyBTZXQvdW5zZWxlY3Qgc2VsZWN0aW9uIGJhc2VkIG9uIHZhbHVlIHNldCBvbiBwYXJlbnQgPHNlbGVjdD4uIFdvcmtzIGZvciBtdWx0aXNlbGVjdCB0b29cblx0XHRcdFx0XHR0YXJnZXQuc2VsZWN0ZWQgPSAkLmluQXJyYXkoXCJcIiArIHNvdXJjZVZhbHVlLCAkaXNBcnJheShqc3ZTZWwpID8ganN2U2VsIDogW2pzdlNlbF0pID4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHQvLyBTZXR0aW5nIGFuIGF0dHJpYnV0ZSB0byB1bmRlZmluZWQgc2hvdWxkIHJlbW92ZSB0aGUgYXR0cmlidXRlXG5cdFx0XHQkdGFyZ2V0W3VzZVByb3AgPyBcInByb3BcIiA6IFwiYXR0clwiXShhdHRyLCBzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICF1c2VQcm9wID8gbnVsbCA6IHNvdXJjZVZhbHVlKTtcblx0XHR9XG5cdFx0bGlua0N0eC5fdmFsID0gc291cmNlVmFsdWU7XG5cdH1cblx0cmV0dXJuIHByb21pc2UgfHwgY2hhbmdlO1xufVxuXG5mdW5jdGlvbiBhcnJheUNoYW5nZUhhbmRsZXIoZXYsIGV2ZW50QXJncykge1xuXHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0b25CZWZvcmVDaGFuZ2UgPSBzZWxmLmhscChvbkJlZm9yZUNoYW5nZVN0ciksXG5cdFx0b25BZnRlckNoYW5nZSA9IHNlbGYuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpO1xuXHRpZiAoIW9uQmVmb3JlQ2hhbmdlIHx8IG9uQmVmb3JlQ2hhbmdlLmNhbGwodGhpcywgZXYsIGV2ZW50QXJncykgIT09IGZhbHNlKSB7XG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0Ly8gVGhpcyBpcyBhbiBvYnNlcnZhYmxlIGFjdGlvbiAobm90IGEgdHJpZ2dlci9oYW5kbGVyIGNhbGwgZnJvbSBwdXNoVmFsdWVzLCBvciBzaW1pbGFyLCBmb3Igd2hpY2ggZXZlbnRBcmdzIHdpbGwgYmUgbnVsbClcblx0XHRcdHZhciBhY3Rpb24gPSBldmVudEFyZ3MuY2hhbmdlLFxuXHRcdFx0XHRpbmRleCA9IGV2ZW50QXJncy5pbmRleCxcblx0XHRcdFx0aXRlbXMgPSBldmVudEFyZ3MuaXRlbXM7XG5cdFx0XHRzZWxmLl8uc3J0ID0gZXZlbnRBcmdzLnJlZnJlc2g7IC8vIHRydWUgaWYgcGFydCBvZiBhICdzb3J0JyBvbiByZWZyZXNoXG5cdFx0XHRzd2l0Y2ggKGFjdGlvbikge1xuXHRcdFx0XHRjYXNlIFwiaW5zZXJ0XCI6XG5cdFx0XHRcdFx0c2VsZi5hZGRWaWV3cyhpbmRleCwgaXRlbXMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmVtb3ZlXCI6XG5cdFx0XHRcdFx0c2VsZi5yZW1vdmVWaWV3cyhpbmRleCwgaXRlbXMubGVuZ3RoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIm1vdmVcIjpcblx0XHRcdFx0XHRzZWxmLnJlbW92ZVZpZXdzKGV2ZW50QXJncy5vbGRJbmRleCwgaXRlbXMubGVuZ3RoLCB1bmRlZmluZWQsIHRydWUpOyAvLyByZW1vdmVcblx0XHRcdFx0XHRzZWxmLmFkZFZpZXdzKGluZGV4LCBpdGVtcyk7IC8vIHJlLWluc2VydFxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmVmcmVzaFwiOlxuXHRcdFx0XHRcdHNlbGYuXy5zcnQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0c2VsZi5maXhJbmRleCgwKTtcblx0XHRcdFx0XHQvLyBPdGhlciBjYXNlczogKGUuZy51bmRlZmluZWQsIGZvciBzZXRQcm9wZXJ0eSBvbiBvYnNlcnZhYmxlIG9iamVjdCkgZXRjLiBkbyBub3RoaW5nXG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvbkFmdGVyQ2hhbmdlKSB7XG5cdFx0XHRvbkFmdGVyQ2hhbmdlLmNhbGwodGhpcywgZXYsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFV0aWxpdGllcyBmb3IgZXZlbnQgaGFuZGxlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gc2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXcpIHtcblx0Ly8gQWRkL3JlbW92ZSBhcnJheUNoYW5nZSBoYW5kbGVyIG9uIHZpZXdcblx0dmFyIGhhbmRsZXIsIGFycmF5QmluZGluZyxcblx0XHR0eXBlID0gdmlldy50eXBlLCAvLyB1bmRlZmluZWQgaWYgdmlldyBpcyBiZWluZyByZW1vdmVkXG5cdFx0ZGF0YSA9IHZpZXcuZGF0YSxcblx0XHRib3VuZCA9IHZpZXcuXy5ibmQ7IC8vIHRydWUgZm9yIHRvcC1sZXZlbCBsaW5rKCkgb3IgZGF0YS1saW5rPVwie2Zvcn1cIiwgb3IgdGhlIGZvciB0YWcgaW5zdGFuY2UgZm9yIHtee2Zvcn19IChvciBmb3IgYW55IGN1c3RvbSB0YWcgdGhhdCBoYXMgYW4gb25BcnJheUNoYW5nZSBoYW5kbGVyKVxuXG5cdGlmICghdmlldy5fLnVzZUtleSAmJiBib3VuZCkge1xuXHRcdC8vIFRoaXMgaXMgYW4gYXJyYXkgdmlldy4gKHZpZXcuXy51c2VLZXkgbm90IGRlZmluZWQgPT4gZGF0YSBpcyBhcnJheSksIGFuZCBpcyBkYXRhLWJvdW5kIHRvIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50c1xuXG5cdFx0aWYgKGFycmF5QmluZGluZyA9IHZpZXcuXy5ibmRBcnIpIHtcblx0XHRcdC8vIEZpcnN0IHJlbW92ZSB0aGUgY3VycmVudCBoYW5kbGVyIGlmIHRoZXJlIGlzIG9uZVxuXHRcdFx0JChbYXJyYXlCaW5kaW5nWzFdXSkub2ZmKGFycmF5Q2hhbmdlU3RyLCBhcnJheUJpbmRpbmdbMF0pO1xuXHRcdFx0dmlldy5fLmJuZEFyciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKGJvdW5kICE9PSAhIWJvdW5kKSB7XG5cdFx0XHQvLyBib3VuZCBpcyBub3QgYSBib29sZWFuLCBzbyBpdCBpcyB0aGUgZGF0YS1saW5rZWQgdGFnIHRoYXQgJ293bnMnIHRoaXMgYXJyYXkgYmluZGluZyAtIGUuZy4ge157Zm9yLi4ufX1cblx0XHRcdGlmICh0eXBlKSB7XG5cdFx0XHRcdGJvdW5kLl8uYXJyVndzW3ZpZXcuXy5pZF0gPSB2aWV3O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIGJvdW5kLl8uYXJyVndzW3ZpZXcuXy5pZF07IC8vIGlmIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSAmJiBkYXRhKSB7XG5cdFx0XHQvLyBJZiB0aGlzIHZpZXcgaXMgbm90IGJlaW5nIHJlbW92ZWQsIGJ1dCB0aGUgZGF0YSBhcnJheSBoYXMgYmVlbiByZXBsYWNlZCwgdGhlbiBiaW5kIHRvIHRoZSBuZXcgZGF0YSBhcnJheVxuXHRcdFx0aGFuZGxlciA9IGZ1bmN0aW9uKGV2KSB7XG5cdFx0XHRcdGlmICghKGV2LmRhdGEgJiYgZXYuZGF0YS5vZmYpKSB7XG5cdFx0XHRcdFx0Ly8gU2tpcCBpZiAhIWV2LmRhdGEub2ZmOiAtIGEgaGFuZGxlciB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCAobWF5YmUgd2FzIG9uIGhhbmRsZXIgY29sbGVjdGlvbiBhdCBjYWxsIHRpbWUgLSB0aGVuIHJlbW92ZWQgYnkgYW5vdGhlciBoYW5kbGVyKVxuXHRcdFx0XHRcdC8vIElmIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIGRvIG5vdGhpbmcuIChDb3JyZXNwb25kcyB0byBjYXNlIHdoZXJlIHRoZXJlIGlzIGFub3RoZXIgaGFuZGxlciBvbiB0aGUgc2FtZSBkYXRhIHdob3NlXG5cdFx0XHRcdFx0Ly8gZWZmZWN0IHdhcyB0byByZW1vdmUgdGhpcyB2aWV3LCBhbmQgd2hpY2ggaGFwcGVuZWQgdG8gcHJlY2VkZSB0aGlzIGV2ZW50IGluIHRoZSB0cmlnZ2VyIHNlcXVlbmNlLiBTbyBhbHRob3VnaCB0aGlzXG5cdFx0XHRcdFx0Ly8gZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBub3csIGl0IGlzIHN0aWxsIGNhbGxlZCBzaW5jZSBhbHJlYWR5IG9uIHRoZSB0cmlnZ2VyIHNlcXVlbmNlKVxuXHRcdFx0XHRcdGFycmF5Q2hhbmdlSGFuZGxlci5hcHBseSh2aWV3LCBhcmd1bWVudHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0JChbZGF0YV0pLm9uKGFycmF5Q2hhbmdlU3RyLCBoYW5kbGVyKTtcblx0XHRcdHZpZXcuXy5ibmRBcnIgPSBbaGFuZGxlciwgZGF0YV07XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBdHRyKGVsZW0sIHRvLCBsaW5rR2V0VmFsKSB7XG5cdC8vIHRvOiB0cnVlIC0gZGVmYXVsdCBhdHRyaWJ1dGUgZm9yIHNldHRpbmcgZGF0YSB2YWx1ZSBvbiBIVE1MIGVsZW1lbnQ7IGZhbHNlOiBkZWZhdWx0IGF0dHJpYnV0ZSBmb3IgZ2V0dGluZyB2YWx1ZSBmcm9tIEhUTUwgZWxlbWVudFxuXHQvLyBNZXJnZSBpbiB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgYmluZGluZ3MgZm9yIHRoaXMgdGFyZ2V0IGVsZW1lbnRcblx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdGF0dHIgPVxuXHRcdFx0JHN1YlNldHRpbmdzQWR2YW5jZWQuX2ZlW25vZGVOYW1lXSAvLyBnZXQgZm9ybSBlbGVtZW50IGJpbmRpbmcgc2V0dGluZ3MgZm9yIGlucHV0IHRleHRhcmVhIHNlbGVjdCBvciBvcHRncm91cFxuXHRcdFx0fHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09IFRSVUUgJiYge3RvOiBIVE1MLCBmcm9tOiBIVE1MfTsgLy8gT3IgaWYgY29udGVudEVkaXRhYmxlIHNldCB0byBcInRydWVcIiBzZXQgYXR0ciB0byBcImh0bWxcIlxuXHRyZXR1cm4gYXR0clxuXHRcdD8gKHRvXG5cdFx0XHQ/ICgobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFJBRElPKSAvLyBGb3IgcmFkaW8gYnV0dG9ucywgYmluZCBmcm9tIHZhbHVlLCBidXQgYmluZCB0byAncmFkaW8nIC0gc3BlY2lhbCB2YWx1ZS5cblx0XHRcdFx0PyBSQURJT1xuXHRcdFx0XHQ6IGF0dHIudG8pXG5cdFx0XHQ6IGF0dHIuZnJvbSlcblx0XHQ6IHRvXG5cdFx0XHQ/IGxpbmtHZXRWYWwgPyBcInRleHRcIiA6IEhUTUwgLy8gRGVmYXVsdCBpbm5lclRleHQgZm9yIGRhdGEtbGluaz1cImEuYi5jXCIgb3IgZGF0YS1saW5rPVwiezphLmIuY31cIiAod2l0aCBvciB3aXRob3V0IGNvbnZlcnRlcnMpLSBvdGhlcndpc2UgaW5uZXJIVE1MXG5cdFx0XHQ6IFwiXCI7IC8vIERlZmF1bHQgaXMgbm90IHRvIGJpbmQgZnJvbVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVuZGVyaW5nIGFuZCBET00gaW5zZXJ0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZW5kZXJBbmRMaW5rKHZpZXcsIGluZGV4LCB0bXBsLCB2aWV3cywgZGF0YSwgY29udGV4dCwgcmVmcmVzaCkge1xuXHR2YXIgaHRtbCwgbGlua1RvTm9kZSwgcHJldlZpZXcsIG5vZGVzVG9SZW1vdmUsIGJpbmRJZCxcblx0XHRwYXJlbnROb2RlID0gdmlldy5wYXJlbnRFbGVtLFxuXHRcdHByZXZOb2RlID0gdmlldy5fcHJ2LFxuXHRcdG5leHROb2RlID0gdmlldy5fbnh0LFxuXHRcdGVsQ250ID0gdmlldy5fZWxDbnQ7XG5cblx0aWYgKHByZXZOb2RlICYmIHByZXZOb2RlLnBhcmVudE5vZGUgIT09IHBhcmVudE5vZGUpIHtcblx0XHRlcnJvcihcIk1pc3NpbmcgcGFyZW50Tm9kZVwiKTtcblx0XHQvLyBBYmFuZG9uLCBzaW5jZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgb3Igd3JhcHBlciBlbGVtZW50IGhhcyBiZWVuIGluc2VydGVkIGJldHdlZW4gcHJldk5vZGUgYW5kIHBhcmVudE5vZGVcblx0fVxuXG5cdGlmIChyZWZyZXNoKSB7XG5cdFx0bm9kZXNUb1JlbW92ZSA9IHZpZXcubm9kZXMoKTtcblx0XHRpZiAoZWxDbnQgJiYgcHJldk5vZGUgJiYgcHJldk5vZGUgIT09IG5leHROb2RlKSB7XG5cdFx0XHQvLyBUaGlzIHByZXZOb2RlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRyYW5zZmVyIHRoZSB2aWV3IHRva2VucyBvbiBwcmV2Tm9kZSB0byBuZXh0Tm9kZSBvZiB0aGlzICd2aWV3VG9SZWZyZXNoJ1xuXHRcdFx0dHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgcGFyZW50Tm9kZSwgdmlldy5fLmlkLCBcIl9cIiwgdHJ1ZSk7XG5cdFx0fVxuXHRcdC8vIFJlbW92ZSBjaGlsZCB2aWV3c1xuXHRcdHZpZXcucmVtb3ZlVmlld3ModW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdGxpbmtUb05vZGUgPSBuZXh0Tm9kZTtcblxuXHRcdGlmIChlbENudCkge1xuXHRcdFx0cHJldk5vZGUgPSBwcmV2Tm9kZVxuXHRcdFx0XHQ/IHByZXZOb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHQ6IG5leHROb2RlXG5cdFx0XHRcdFx0PyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHQ6IHBhcmVudE5vZGUubGFzdENoaWxkO1xuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBIVE1MIG5vZGVzXG5cdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblxuXHRcdGZvciAoYmluZElkIGluIHZpZXcuXy5ibmRzKSB7XG5cdFx0XHQvLyBUaGUgdmlldyBiaW5kaW5ncyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBhYm92ZSBpbjogJChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblx0XHRcdC8vIElmIG5vdCwgcmVtb3ZlIHRoZW0gaGVyZTpcblx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIGFkZFZpZXdzLiBPbmx5IGNhbGxlZCBpZiB2aWV3IGlzIG9mIHR5cGUgXCJhcnJheVwiXG5cdFx0aWYgKGluZGV4KSB7XG5cdFx0XHQvLyBpbmRleCBpcyBhIG51bWJlciwgc28gaW5kZXhlZCB2aWV3IGluIHZpZXcgYXJyYXlcblx0XHRcdHByZXZWaWV3ID0gdmlld3NbaW5kZXggLSAxXTtcblx0XHRcdGlmICghcHJldlZpZXcpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBJZiBzdWJ2aWV3IGZvciBwcm92aWRlZCBpbmRleCBkb2VzIG5vdCBleGlzdCwgZG8gbm90aGluZ1xuXHRcdFx0fVxuXHRcdFx0cHJldk5vZGUgPSBwcmV2Vmlldy5fbnh0O1xuXHRcdH1cblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdGxpbmtUb05vZGUgPSBwcmV2Tm9kZTtcblx0XHRcdHByZXZOb2RlID0gbGlua1RvTm9kZVxuXHRcdFx0XHQ/IGxpbmtUb05vZGUucHJldmlvdXNTaWJsaW5nICAgICAgICAgLy8gVGhlcmUgaXMgYSBsaW5rVG9Ob2RlLCBzbyBpbnNlcnQgYWZ0ZXIgcHJldmlvdXNTaWJsaW5nLCBvciBhdCB0aGUgYmVnaW5uaW5nXG5cdFx0XHRcdDogcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7ICAgICAgICAgICAgICAvLyBJZiBubyBwcmV2VmlldyBhbmQgbm8gcHJldk5vZGUsIGluZGV4IGlzIDAgYW5kIHRoZSBjb250YWluZXIgaXMgZW1wdHksXG5cdFx0XHRcdC8vIHNvIHByZXZOb2RlID0gbGlua1RvTm9kZSA9IG51bGwuIEJ1dCBpZiBwcmV2Vmlldy5fbnh0IGlzIG51bGwgdGhlbiB3ZSBzZXQgcHJldk5vZGUgdG8gcGFyZW50Tm9kZS5sYXN0Q2hpbGRcblx0XHRcdFx0Ly8gKHdoaWNoIG11c3QgYmUgYmVmb3JlIHRoZSBwcmV2Vmlldykgc28gd2UgaW5zZXJ0IGFmdGVyIHRoYXQgbm9kZSAtIGFuZCBvbmx5IGxpbmsgdGhlIGluc2VydGVkIG5vZGVzXG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpbmtUb05vZGUgPSBwcmV2Tm9kZS5uZXh0U2libGluZztcblx0XHR9XG5cdH1cblx0aHRtbCA9IHRtcGwucmVuZGVyKGRhdGEsIGNvbnRleHQsIHZpZXcuXy51c2VLZXkgJiYgcmVmcmVzaCwgdmlldywgcmVmcmVzaCB8fCBpbmRleCwgdHJ1ZSk7XG5cdC8vIFBhc3MgaW4gdmlldy5fLnVzZUtleSBhcyB0ZXN0IGZvciBub0l0ZXJhdGlvbiAod2hpY2ggY29ycmVzcG9uZHMgdG8gd2hlbiBzZWxmLl8udXNlS2V5ID4gMCBhbmQgc2VsZi5kYXRhIGlzIGFuIGFycmF5KVxuXG5cdC8vIExpbmsgdGhlIG5ldyBIVE1MIG5vZGVzIHRvIHRoZSBkYXRhXG5cdHZpZXcubGluayhkYXRhLCBwYXJlbnROb2RlLCBwcmV2Tm9kZSwgbGlua1RvTm9kZSwgaHRtbCwgcHJldlZpZXcpO1xuLy99LCAwKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT1cbi8vIGFkZEJpbmRpbmdNYXJrZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBhZGRCaW5kaW5nTWFya2Vycyh2YWx1ZSwgdmlldywgdGFnKSB7XG5cdC8vIEluc2VydCBiaW5kaW5nIG1hcmtlcnMgaW50byB0aGUgcmVuZGVyZWQgdGVtcGxhdGUgb3V0cHV0LCB3aGljaCB3aWxsIGdldCBjb252ZXJ0ZWQgdG8gYXBwcm9wcmlhdGVcblx0Ly8gZGF0YS1qc3YgYXR0cmlidXRlcyAoZWxlbWVudC1vbmx5IGNvbnRlbnQpIG9yIHNjcmlwdCBtYXJrZXIgbm9kZXMgKHBocmFzaW5nIG9yIGZsb3cgY29udGVudCksIGluIGNvbnZlcnRNYXJrZXJzLFxuXHQvLyB3aXRoaW4gdmlldy5saW5rLCBwcmlvciB0byBpbnNlcnRpbmcgaW50byB0aGUgRE9NLiBMaW5raW5nIHdpbGwgdGhlbiBiaW5kIGJhc2VkIG9uIHRoZXNlIG1hcmtlcnMgaW4gdGhlIERPTS5cblx0Ly8gQWRkZWQgdmlldyBtYXJrZXJzOiAjbV8uLi5WSUVXLi4uL21fXG5cdC8vIEFkZGVkIHRhZyBtYXJrZXJzOiAjbV4uLi5UQUcuLi4uL21eXG5cdHZhciBpZCwgZW5kO1xuXHRpZiAodGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGJpbmRpbmcgbWFya2VyIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fVxuXHRcdGVuZCA9IFwiXmBcIjtcblx0XHRhZGRMaW5rTWV0aG9kcyh0YWcsIHRydWUpOyAvLyBUaGlzIGlzIHteez4uLi59fSBvciB7Xnt0YWcgLi4ufX0sIHt7Y3Z0Oi4uLn0gb3Ige157Oi4uLn19LCBhbmQgdGFnIHdhcyBkZWZpbmVkIGluIGNvbnZlcnRWYWwgb3IgcmVuZGVyVGFnXG5cdFx0aWQgPSB0YWcuX3RnSWQ7XG5cdFx0aWYgKCFpZCkge1xuXHRcdFx0YmluZGluZ1N0b3JlW2lkID0gYmluZGluZ0tleSsrXSA9IHRhZzsgLy8gU3RvcmUgdGhlIHRhZyB0ZW1wb3JhcmlseSwgcmVhZHkgZm9yIGRhdGFiaW5kaW5nLlxuXHRcdFx0Ly8gRHVyaW5nIGxpbmtpbmcsIGluIGFkZERhdGFCaW5kaW5nLCB0aGUgdGFnIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGxpbmtDdHgsXG5cdFx0XHQvLyBhbmQgdGhlbiBpbiBvYnNlcnZlQW5kQmluZCwgYmluZGluZ1N0b3JlW2JpbmRJZF0gd2lsbCBiZSByZXBsYWNlZCBieSBiaW5kaW5nIGluZm8uXG5cdFx0XHR0YWcuX3RnSWQgPSBcIlwiICsgaWQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSBiaW5kaW5nIG1hcmtlciBmb3IgYSB2aWV3XG5cdFx0Ly8gQWRkIHRoZSB2aWV3IHRvIHRoZSBzdG9yZSBvZiBjdXJyZW50IGxpbmtlZCB2aWV3c1xuXHRcdGVuZCA9IFwiX2BcIjtcblx0XHRhZGRMaW5rTWV0aG9kcyh2aWV3U3RvcmVbaWQgPSB2aWV3Ll8uaWRdID0gdmlldyk7XG5cdH1cblx0Ly8gRXhhbXBsZTogXCIjMjNeVGhlVmFsdWUvMjNeXCJcblx0cmV0dXJuIFwiI1wiICsgaWQgKyBlbmRcblx0XHQrICh2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IFwiXCIpIC8vIEZvciB7Xns6bmFtZX19IHRoaXMgZ2l2ZXMgdGhlIGVxdWl2YWxlbnQgc2VtYW50aWNzIHRvIGNvbXBpbGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gKHY9ZGF0YS5uYW1lKSE9bnVsbD92OlwiXCI7IHVzZWQgaW4ge3s6bmFtZX19IG9yIGRhdGEtbGluaz1cIm5hbWVcIlxuXHRcdCsgXCIvXCIgKyBpZCArIGVuZDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERhdGEtbGlua2luZyBhbmQgZGF0YSBiaW5kaW5nXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLy0tLS0tLS0tLS0tLS0tLVxuLy8gb2JzZXJ2ZUFuZEJpbmRcbi8vLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KSB7XG5cdHZhciBiaW5kaW5nLCBsLCBrLCBsaW5rZWRFbGVtLCBleHByRm5EZXBzLCBleHByT2IsIHByb3AsIHByb3BEZXBzLFxuXHRcdHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdGN2dEJrID0gbGlua0N0eC5jb252ZXJ0QmFjayxcblx0XHRkZXBlbmRzID0gW10sXG5cdFx0YmluZElkID0gbGlua0N0eC5fYm5kSWQgfHwgXCJcIiArIGJpbmRpbmdLZXkrKyxcblx0XHRoYW5kbGVyID0gbGlua0N0eC5faGRsO1xuXG5cdGxpbmtDdHguX2JuZElkID0gdW5kZWZpbmVkO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBVc2UgdGhlICdkZXBlbmRzJyBwYXRocyBzZXQgb24gbGlua0N0eC50YWcgLSB3aGljaCBtYXkgaGF2ZSBiZWVuIHNldCBvbiBkZWNsYXJhdGlvblxuXHRcdC8vIG9yIGluIGV2ZW50czogaW5pdCwgcmVuZGVyLCBvbkFmdGVyTGluayBldGMuXG5cdFx0ZGVwZW5kcyA9IHRhZy5kZXBlbmRzIHx8IGRlcGVuZHM7XG5cdFx0ZGVwZW5kcyA9ICRpc0Z1bmN0aW9uKGRlcGVuZHMpID8gdGFnLmRlcGVuZHModGFnKSA6IGRlcGVuZHM7XG5cdFx0bGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtO1xuXHR9XG5cdGlmICghbGlua0N0eC5fZGVwZW5kcyB8fCAoXCJcIiArIGxpbmtDdHguX2RlcGVuZHMgIT09IFwiXCIgKyBkZXBlbmRzKSkge1xuXHRcdC8vIE9ubHkgYmluZCB0aGUgZmlyc3QgdGltZSwgb3IgaWYgdGhlIG5ldyBkZXBlbmRzICh0b1N0cmluZykgaGFzIGNoYW5nZWQgZnJvbSB3aGVuIGxhc3QgYm91bmRcblx0XHRpZiAobGlua0N0eC5fZGVwZW5kcykge1xuXHRcdFx0Ly8gVW5vYnNlcnZlIHByZXZpb3VzIGJpbmRpbmdcblx0XHRcdCRvYnNlcnZhYmxlLl9hcHBseShmYWxzZSwgW3NvdXJjZV0sIGxpbmtDdHguX2RlcGVuZHMsIGhhbmRsZXIsIHRydWUpO1xuXHRcdH1cblxuXHRcdGV4cHJGbkRlcHMgPSBsaW5rQ3R4LmZuLmRlcHMuc2xpY2UoKTsgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGRlcGVuZGVuY3kgcGF0aHMgZm9yIHRoZSBjb21waWxlZCBsaW5rQ3R4IGV4cHJlc3Npb24gLSB0byBwYXNzIHRvIG9ic2VydmUoKS4gSW4gZ2V0SW5uZXJDYigpLFxuXHRcdC8vIChhbmQgd2hlbmV2ZXIgdGhlIG9iamVjdCBpcyB1cGRhdGVkLCBpbiBpbm5lckNiKSwgd2Ugd2lsbCBzZXQgZXhwck9iLm9iIHRvIHRoZSBjdXJyZW50IG9iamVjdCByZXR1cm5lZCBieSB0aGF0IGNvbXB1dGVkIGV4cHJlc3Npb24sIGZvciB0aGlzIHZpZXcuXG5cblx0XHRpZiAodGFnICYmIHRhZy5ib3VuZFByb3BzKSB7XG5cdFx0XHQvLyBBZGQgZGVwZW5kZW5jeSBwYXRocyBmb3IgZGVjbGFyZWQgYm91bmRQcm9wcyAoc28gbm8gbmVlZCB0byB3cml0aCBebXlwcm9wPS4uLiB0byBnZXQgYmluZGluZykgYW5kIGZvciBsaW5rZWRQcm9wIHRvbyBpZiB0aGVyZSBpcyBvbmVcblx0XHRcdGwgPSB0YWcuYm91bmRQcm9wcy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdHByb3AgPSB0YWcuYm91bmRQcm9wc1tsXTtcblx0XHRcdFx0ayA9IHRhZy5fLmJuZC5wYXRocy5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlIChrLS0pIHtcblx0XHRcdFx0XHRwcm9wRGVwcyA9IHRhZy5fLmJuZC5wYXRoc1trXVtwcm9wXTtcblx0XHRcdFx0XHRpZiAocHJvcERlcHMgJiYgcHJvcERlcHMuc2twKSB7IC8vIE5vdCBhbHJlYWR5IGEgYm91bmQgcHJvcCBecHJvcD1leHByZXNzaW9uO1xuXHRcdFx0XHRcdFx0ZXhwckZuRGVwcyA9IGV4cHJGbkRlcHMuY29uY2F0KHByb3BEZXBzKTsgLy8gQWRkIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBwcm9wIGV4cHJlc3Npb25cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsID0gZXhwckZuRGVwcy5sZW5ndGg7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0ZXhwck9iID0gZXhwckZuRGVwc1tsXTtcblx0XHRcdGlmIChleHByT2IuX2pzdikge1xuXHRcdFx0XHQvLyBUaGlzIHBhdGggaXMgYW4gJ2V4cHJPYicsIGNvcnJlc3BvbmRpbmcgdG8gYSBjb21wdXRlZCwgcmV0dXJuaW5nIGFuIG9iamVjdC4gV2UgcmVwbGFjZSB0aGUgZXhwck9iIGJ5XG5cdFx0XHRcdC8vIGEgdmlldy1iaW5kaW5nLXNwZWNpZmljIGV4cHJPYiBpbnN0YW5jZS4gVGhlIGN1cnJlbnQgb2JqZWN0IHdpbGwgYmUgc3RvcmVkIGFzIGV4cHJPYi5vYi5cblx0XHRcdFx0ZXhwckZuRGVwc1tsXSA9ICRleHRlbmQoe30sIGV4cHJPYik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YmluZGluZyA9ICRvYnNlcnZhYmxlLl9hcHBseShcblx0XHRcdGZhbHNlLFxuXHRcdFx0W3NvdXJjZV0sXG5cdFx0XHRleHByRm5EZXBzLCAvLyBmbGF0dGVuIHRoZSBwYXRocyAtIHRvIGdhdGhlciBhbGwgdGhlIGRlcGVuZGVuY2llcyBhY3Jvc3MgYXJncyBhbmQgYm91bmQgcGFyYW1zXG5cdFx0XHRkZXBlbmRzLFxuXHRcdFx0aGFuZGxlcixcblx0XHRcdGxpbmtDdHguX2N0eENiKTtcblx0XHQvLyBUaGUgYmluZGluZyByZXR1cm5lZCBieSAkb2JzZXJ2ZSBoYXMgYSBibmQgYXJyYXkgd2l0aCB0aGUgc291cmNlIG9iamVjdHMgb2YgdGhlIGluZGl2aWR1YWwgYmluZGluZ3MuXG5cblx0XHRiaW5kaW5nLmVsZW0gPSB0YXJnZXQ7IC8vIFRoZSB0YXJnZXQgb2YgYWxsIHRoZSBpbmRpdmlkdWFsIGJpbmRpbmdzXG5cdFx0YmluZGluZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRiaW5kaW5nLl90Z0lkID0gYmluZElkO1xuXG5cdFx0Ly8gQWRkIHRvIHRoZSBfanN2Qm5kIG9uIHRoZSB0YXJnZXQgdGhlIHZpZXcgaWQgYW5kIGJpbmRpbmcgaWQgLSBmb3IgdW5iaW5kaW5nIHdoZW4gdGhlIHRhcmdldCBlbGVtZW50IGlzIHJlbW92ZWRcblx0XHR0YXJnZXQuX2pzdkJuZCA9IHRhcmdldC5fanN2Qm5kIHx8IFwiXCI7XG5cdFx0dGFyZ2V0Ll9qc3ZCbmQgKz0gXCImXCIgKyBiaW5kSWQ7XG5cdFx0bGlua0N0eC5fZGVwZW5kcyA9IGRlcGVuZHM7XG5cdFx0Ly8gU3RvcmUgdGhlIGJpbmRpbmcga2V5IG9uIHRoZSB2aWV3LCBmb3IgZGlzcG9zYWwgd2hlbiB0aGUgdmlldyBpcyByZW1vdmVkXG5cdFx0bGlua0N0eC52aWV3Ll8uYm5kc1tiaW5kSWRdID0gYmluZElkO1xuXHRcdC8vIFN0b3JlIHRoZSBiaW5kaW5nLlxuXHRcdGJpbmRpbmdTdG9yZVtiaW5kSWRdID0gYmluZGluZzsgLy8gTm90ZTogSWYgdGhpcyBjb3JyZXNwb25kcyB0byBhIGRhdGEtbGlua2VkIHRhZywgd2UgYXJlIHJlcGxhY2luZyB0aGVcblx0XHQvLyB0ZW1wb3JhcmlseSBzdG9yZWQgdGFnIGJ5IHRoZSBzdG9yZWQgYmluZGluZy4gVGhlIHRhZyB3aWxsIG5vdyBiZSBhdCBiaW5kaW5nLmxpbmtDdHgudGFnXG5cblx0XHRpZiAobGlua2VkRWxlbSkge1xuXHRcdFx0bCA9IGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRsaW5rZWRFbGVtW2xdLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCBsaW5rZWRFbGVtW2xdKTtcblx0XHRcdFx0bGlua2VkRWxlbVtsXS5fanN2Qm5kID0gXCImXCIgKyBiaW5kaW5nLl90Z0lkICsgXCIrXCI7IC8vIEFkZCBhIFwiK1wiIGZvciBjbG9uZWQgYmluZGluZyAtIHNvIHJlbW92aW5nXG5cdFx0XHRcdC8vIGVsZW1zIHdpdGggY2xvbmVkIGJpbmRpbmdzIHdpbGwgbm90IHJlbW92ZSB0aGUgJ3BhcmVudCcgYmluZGluZyBmcm9tIHRoZSBiaW5kaW5nU3RvcmUuXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjdnRCayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCB0YXJnZXQsIGN2dEJrKTtcblx0XHR9XG5cblx0XHRpZiAodGFnKSB7XG5cdFx0XHRpZiAoIXRhZy5mbG93ICYmICF0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0dGFyZ2V0LnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCAodGFyZ2V0LmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKXx8XCJcIikgKyBcIiNcIiArIGJpbmRJZCArIFwiXi9cIiArIGJpbmRJZCArIFwiXlwiKTtcblx0XHRcdFx0dGFnLl90Z0lkID0gXCJcIiArIGJpbmRJZDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLy8tLS0tLS0tXG4vLyAkLmxpbmtcbi8vLS0tLS0tLVxuXG5mdW5jdGlvbiB0bXBsTGluayh0bywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRyZXR1cm4gJGxpbmsodGhpcywgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpO1xufVxuXG5mdW5jdGlvbiAkbGluayh0bXBsT3JMaW5rRXhwciwgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0Ly8gV2hlbiBsaW5raW5nIGZyb20gYSB0ZW1wbGF0ZSwgcHJldk5vZGUgYW5kIG5leHROb2RlIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWRcblx0aWYgKGNvbnRleHQgPT09IHRydWUpIHtcblx0XHRub0l0ZXJhdGlvbiA9IGNvbnRleHQ7IC8vIHBhc3NpbmcgYm9vbGVhbiBhcyB0aGlyZCBwYXJhbSAtIG5vSXRlcmF0aW9uXG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICh0eXBlb2YgY29udGV4dCAhPT0gXCJvYmplY3RcIikge1xuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7IC8vIGNvbnRleHQgbXVzdCBiZSBhIGJvb2xlYW4gKG5vSXRlcmF0aW9uKSBvciBhIHBsYWluIG9iamVjdFxuXHR9IGVsc2Uge1xuXHRcdGNvbnRleHQgPSAkZXh0ZW5kKHt9LCBjb250ZXh0KTtcblx0fVxuXHRpZiAodG1wbE9yTGlua0V4cHIgJiYgdG8pIHtcblx0XHR0byA9IHRvLmpxdWVyeSA/IHRvIDogJCh0byk7IC8vIHRvIGlzIGEganF1ZXJ5IG9iamVjdCBvciBhbiBlbGVtZW50IG9yIHNlbGVjdG9yXG5cblx0XHRpZiAoIWFjdGl2ZUJvZHkpIHtcblx0XHRcdGFjdGl2ZUJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHRcdFx0JChhY3RpdmVCb2R5KVxuXHRcdFx0XHQub24oZWxlbWVudENoYW5nZVN0ciwgZWxlbUNoYW5nZUhhbmRsZXIpXG5cdFx0XHRcdC5vbignYmx1cicsICdbY29udGVudGVkaXRhYmxlXScsIGVsZW1DaGFuZ2VIYW5kbGVyKTtcblx0XHR9XG5cblx0XHR2YXIgaSwgaywgaHRtbCwgdndJbmZvcywgdmlldywgcGxhY2Vob2xkZXJQYXJlbnQsIHRhcmdldEVsLCByZWZyZXNoLCB0b3BMZXZlbENhbGwsXG5cdFx0XHRvblJlbmRlciA9IGFkZEJpbmRpbmdNYXJrZXJzLFxuXHRcdFx0cmVwbGFjZU1vZGUgPSBjb250ZXh0ICYmIGNvbnRleHQudGFyZ2V0ID09PSBcInJlcGxhY2VcIixcblx0XHRcdGwgPSB0by5sZW5ndGg7XG5cblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHR0YXJnZXRFbCA9IHRvW2xdO1xuXG5cdFx0XHRwYXJlbnRWaWV3ID0gcGFyZW50VmlldyB8fCAkdmlldyh0YXJnZXRFbCk7XG5cblx0XHRcdGlmICh0b3BMZXZlbENhbGwgPSBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdHRvcFZpZXcuZGF0YSA9ICh0b3BWaWV3LmN0eCA9IGNvbnRleHQgfHwge30pLnJvb3QgPSBmcm9tO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFwiXCIgKyB0bXBsT3JMaW5rRXhwciA9PT0gdG1wbE9yTGlua0V4cHIpIHtcblx0XHRcdFx0Ly8gdG1wbE9yTGlua0V4cHIgaXMgYSBzdHJpbmc6IHRyZWF0IGFzIGRhdGEtbGluayBleHByZXNzaW9uLlxuXHRcdFx0XHRhZGREYXRhQmluZGluZyh0bXBsT3JMaW5rRXhwciwgdGFyZ2V0RWwsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdHJ1ZSwgZnJvbSwgY29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodG1wbE9yTGlua0V4cHIubWFya3VwICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKClcblx0XHRcdFx0XHRpZiAocmVwbGFjZU1vZGUpIHtcblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyUGFyZW50ID0gdGFyZ2V0RWwucGFyZW50Tm9kZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRodG1sID0gdG1wbE9yTGlua0V4cHIucmVuZGVyKGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCB1bmRlZmluZWQsIG9uUmVuZGVyKTtcblx0XHRcdFx0XHQvLyBUT0RPIENvbnNpZGVyIGZpbmRpbmcgYSB3YXkgdG8gYmluZCBkYXRhIChsaW5rKSB3aXRoaW4gdGVtcGxhdGUgd2l0aG91dCBodG1sIGJlaW5nIGRpZmZlcmVudCBmb3IgZWFjaCB2aWV3LCB0aGUgSFRNTCBjYW5cblx0XHRcdFx0XHQvLyBiZSBldmFsdWF0ZWQgb25jZSBvdXRzaWRlIHRoZSB3aGlsZSAobC0tKSwgYW5kIHB1c2hlZCBpbnRvIGEgZG9jdW1lbnQgZnJhZ21lbnQsIHRoZW4gY2xvbmVkIGFuZCBpbnNlcnRlZCBhdCBlYWNoIHRhcmdldC5cblxuXHRcdFx0XHRcdGlmIChwbGFjZWhvbGRlclBhcmVudCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyB0YXJnZXQ9XCJyZXBsYWNlXCIgbW9kZVxuXHRcdFx0XHRcdFx0cHJldk5vZGUgPSB0YXJnZXRFbC5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHRcdFx0XHRuZXh0Tm9kZSA9IHRhcmdldEVsLm5leHRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0JC5jbGVhbkRhdGEoW3RhcmdldEVsXSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRwbGFjZWhvbGRlclBhcmVudC5yZW1vdmVDaGlsZCh0YXJnZXRFbCk7XG5cblx0XHRcdFx0XHRcdHRhcmdldEVsID0gcGxhY2Vob2xkZXJQYXJlbnQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHByZXZOb2RlID0gbmV4dE5vZGUgPSB1bmRlZmluZWQ7IC8vIFdoZW4gbGlua2luZyBmcm9tIGEgdGVtcGxhdGUsIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkXG5cdFx0XHRcdFx0XHQkKHRhcmdldEVsKS5lbXB0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0bXBsT3JMaW5rRXhwciA9PT0gdHJ1ZSAmJiBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdFx0Ly8gJC5saW5rKHRydWUsIHNlbGVjdG9yLCBkYXRhLCBjdHgpIC0gd2hlcmUgc2VsZWN0b3IgcG9pbnRzIHRvIGVsZW0gaW4gdG9wLWxldmVsIGNvbnRlbnQuIChJZiBub3QgdG9wLWxldmVsIGNvbnRlbnQsIG5vLW9wKVxuXHRcdFx0XHRcdHJlZnJlc2ggPSB7bG5rOiAxfTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG4vLyBUT0RPIENvbnNpZGVyIGRlZmVycmVkIGxpbmtpbmcgQVBJIGZlYXR1cmUgb24gcGVyLXRlbXBsYXRlIGJhc2lzIC0ge0B7IGluc3RlYWQgb2Yge157IHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIHJlbmRlcmVkIGNvbnRlbnRcbi8vIGJlZm9yZSB0aGF0IGNvbnRlbnQgaXMgbGlua2VkLCB3aXRoIGJldHRlciBwZXJjZWl2ZWQgcGVyZi4gSGF2ZSB2aWV3LmxpbmsgcmV0dXJuIGEgZGVmZXJyZWQsIGFuZCBwYXNzIHRoYXQgdG8gb25BZnRlckxpbmsuLi5cbi8vIG9yIHNvbWV0aGluZyBhbG9uZyB0aG9zZSBsaW5lcy5cbi8vIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0aWYgKHRhcmdldEVsLl9kZiAmJiAhbmV4dE5vZGUpIHtcblx0XHRcdFx0XHQvLyBXZSBhcmUgaW5zZXJ0aW5nIG5ldyBjb250ZW50IGFuZCB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzIHNvbWUgZGVmZXJyZWQgYmluZGluZyBhbm5vdGF0aW9ucyxhbmQgdGhlcmUgaXMgbm8gbmV4dE5vZGUuXG5cdFx0XHRcdFx0Ly8gVGhvc2Ugdmlld3MgbWF5IGJlIHN0YWxlIHZpZXdzICh0aGF0IHdpbGwgYmUgcmVjcmVhdGVkIGluIHRoaXMgbmV3IGxpbmtpbmcgYWN0aW9uKSBzbyB3ZSB3aWxsIGZpcnN0IHJlbW92ZSB0aGVtXG5cdFx0XHRcdFx0Ly8gKGlmIG5vdCBhbHJlYWR5IHJlbW92ZWQpLlxuXHRcdFx0XHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3ModGFyZ2V0RWwuX2RmLCB0cnVlLCByT3BlblZpZXdNYXJrZXJzKTtcblxuXHRcdFx0XHRcdGZvciAoaSA9IDAsIGsgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGs7IGkrKykge1xuXHRcdFx0XHRcdFx0dmlldyA9IHZ3SW5mb3NbaV07XG5cdFx0XHRcdFx0XHRpZiAoKHZpZXcgPSB2aWV3U3RvcmVbdmlldy5pZF0pICYmIHZpZXcuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoaXMgaXMgdGhlIF9wcnYgKHByZXZOb2RlKSBmb3IgYSB2aWV3LCByZW1vdmUgdGhlIHZpZXdcblx0XHRcdFx0XHRcdFx0Ly8gLSB1bmxlc3Mgdmlldy5kYXRhIGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHRcdFx0dmlldy5wYXJlbnQucmVtb3ZlVmlld3Modmlldy5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0RWwpOyAvLyByZW1vdmUgZGVmZXIgdG9rZW5zXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMaW5rIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50LCBzaW5jZSB0aGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKCksIG9yIHRvICQoZWwpLmxpbmsodHJ1ZSwgLi4uKSxcblx0XHRcdFx0cGFyZW50Vmlldy5saW5rKGZyb20sIHRhcmdldEVsLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIGh0bWwsIHJlZnJlc2gsIGNvbnRleHQpO1xuLy99LCAwKTtcblx0XHRcdH1cblx0XHRcdGlmICh0b3BMZXZlbENhbGwpIHtcblx0XHRcdFx0dG9wVmlldy5kYXRhID0gdG9wVmlldy5jdHggPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0bzsgLy8gQWxsb3cgY2hhaW5pbmcsIHRvIGF0dGFjaCBldmVudCBoYW5kbGVycywgZXRjLlxufVxuXG4vLy0tLS0tLS0tLS1cbi8vIHZpZXcubGlua1xuLy8tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHZpZXdMaW5rKG91dGVyRGF0YSwgcGFyZW50Tm9kZSwgcHJldk5vZGUsIG5leHROb2RlLCBodG1sLCByZWZyZXNoLCBjb250ZXh0LCB2YWxpZGF0ZU9ubHkpIHtcblx0Ly8gT3B0aW9uYWxseSBpbnNlcnQgSFRNTCBpbnRvIERPTSB1c2luZyBkb2N1bWVudEZyYWdtZW50cyAoYW5kIHdyYXBwaW5nIEhUTUwgYXBwcm9wcmlhdGVseSkuXG5cdC8vIERhdGEtbGluayBleGlzdGluZyBjb250ZW50cyBvZiBwYXJlbnROb2RlLCBvciB0aGUgaW5zZXJ0ZWQgSFRNTCwgaWYgcHJvdmlkZWRcblxuXHQvLyBEZXBlbmRpbmcgb24gdGhlIGNvbnRlbnQgbW9kZWwgZm9yIHRoZSBIVE1MIGVsZW1lbnRzLCB0aGUgc3RhbmRhcmQgZGF0YS1saW5raW5nIG1hcmtlcnMgaW5zZXJ0ZWQgaW4gdGhlIEhUTUwgYnkgYWRkQmluZGluZ01hcmtlcnMgZHVyaW5nXG5cdC8vIHRlbXBsYXRlIHJlbmRlcmluZyB3aWxsIGJlIGNvbnZlcnRlZCBlaXRoZXIgdG8gc2NyaXB0IG1hcmtlciBub2RlcyBvciwgZm9yIGVsZW1lbnQtb25seSBjb250ZW50IHNlY3Rpb25zLCB0byBkYXRhLWpzdiBlbGVtZW50IGFubm90YXRpb25zLlxuXG5cdC8vIERhdGEtbGlua2luZyB3aWxsIHRoZW4gYWRkIF9wcnYgYW5kIF9ueHQgdG8gdmlld3MsIHdoZXJlOlxuXHQvLyAgICAgX3BydjogUmVmZXJlbmNlcyB0aGUgcHJldmlvdXMgbm9kZSAoc2NyaXB0IGVsZW1lbnQgb2YgdHlwZSBcImpzdjEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIGZpcnN0IGVsZW1lbnQgbm9kZSBpbiB0aGUgdmlldyAob3IgaWYgbm9uZSwgc2V0IF9wcnYgPSBfbnh0KVxuXHQvLyAgICAgX254dDogUmVmZXJlbmNlcyB0aGUgbGFzdCBub2RlIChzY3JpcHQgZWxlbWVudCBvZiB0eXBlIFwianN2LzEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIG5leHQgZWxlbWVudCBub2RlIGFmdGVyIHRoZSB2aWV3LlxuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gY29udmVydE1hcmtlcnMoYWxsLCBwcmVjZWRpbmcsIHNlbGZDbG9zZSwgY2xvc2VUYWcsIHNwYWNlQmVmb3JlLCBpZCwgYm91bmRJZCwgc3BhY2VBZnRlciwgdGFnMSwgdGFnMiwgY2xvc2VUYWcyLCBzcGFjZUFmdGVyQ2xvc2UsIHNlbGZDbG9zZTIsIGVuZE9wZW5UYWcpIHtcblx0XHQvLyByQ29udmVydE1hcmtlcnMgPSAvKF58KFxcLz4pfDxcXC8oXFx3Kyk+fCkoXFxzKikoWyNcXC9dXFxkKyg/Ol98KFxcXikpKWAoXFxzKikoPFxcdysoPz1bXFxzXFwvPl0pKT98XFxzKig/Oig8XFx3Kyg/PVtcXHNcXC8+XSkpfDxcXC8oXFx3Kyk+KFxccyopfChcXC8+KVxccyp8KD4pKS9nLFxuXHRcdC8vICAgICAgICAgICAgICAgICBwcmVjLCBzbGZDbCwgY2xzVGFnLCAgc3BCZWZvcmUsIGlkLCAgICAgIGJuZElkICBzcEFmdGVyLHRhZzEsICAgICAgICAgICAgICAgICAgIHRhZzIsICAgICAgICAgICAgICAgY2xUYWcyLHNhYyAgc2xmQ2wyLCBlbmRPcGVuVGFnXG5cdFx0Ly8gQ29udmVydCB0aGUgbWFya2VycyB0aGF0IHdlcmUgaW5jbHVkZWQgYnkgYWRkQmluZGluZ01hcmtlcnMgaW4gdGVtcGxhdGUgb3V0cHV0LCB0byBhcHByb3ByaWF0ZSBET00gYW5ub3RhdGlvbnM6XG5cdFx0Ly8gZGF0YS1qc3YgYXR0cmlidXRlcyAoZm9yIGVsZW1lbnQtb25seSBjb250ZW50KSBvciBzY3JpcHQgbWFya2VyIG5vZGVzICh3aXRoaW4gcGhyYXNpbmcgb3IgZmxvdyBjb250ZW50KS5cblxuLy8gVE9ETyBjb25zaWRlciBkZXRlY3RpbmcgJ3F1b3RlZCcgY29udGV4dHMgKGF0dHJpYnV0ZSBzdHJpbmdzKSBzbyB0aGF0IGF0dHJpYnV0ZSBlbmNvZGluZyBkb2VzIG5vdCBuZWVkIHRvIGVuY29kZSA+XG4vLyBDdXJyZW50bHkgckF0dHJFbmNvZGUgPSAvWz48XCInJl0vZyBpbmNsdWRlcyAnPicgZW5jb2RpbmcgaW4gb3JkZXIgdG8gYXZvaWQgZXJyb25lb3VzIHBhcnNpbmcgb2YgPHNwYW4gdGl0bGU9XCImbHQ7YS8+XCI+PC9zcGFuPlwiPlxuXHRcdHZhciBlcnJvck1zZywgYm5kSWQsXG5cdFx0XHRlbmRPZkVsQ250ID0gXCJcIjtcblx0XHRpZiAoZW5kT3BlblRhZykge1xuXHRcdFx0aW5UYWcgPSAwO1xuXHRcdFx0cmV0dXJuIGFsbDtcblx0XHR9XG5cdFx0dGFnID0gdGFnMSB8fCB0YWcyIHx8IFwiXCI7XG5cdFx0Y2xvc2VUYWcgPSBjbG9zZVRhZyB8fCBjbG9zZVRhZzI7XG5cdFx0c2VsZkNsb3NlID0gc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTI7XG5cdFx0aWYgKGlzVm9pZCAmJiAhc2VsZkNsb3NlICYmICggIWFsbCB8fCBjbG9zZVRhZyB8fCB0YWcgfHwgaWQgJiYgIWluVGFnKSkgeyAvLyAhYWxsID0gZW5kIG9mIHN0cmluZ1xuXHRcdFx0aXNWb2lkID0gdW5kZWZpbmVkO1xuXHRcdFx0cGFyZW50VGFnID0gdGFnU3RhY2suc2hpZnQoKTsgLy8gcHJlY2VkaW5nIHRhZyB3YXMgYSB2b2lkIGVsZW1lbnQsIHdpdGggbm8gY2xvc2luZyBzbGFzaCwgc3VjaCBhcyA8YnI+LlxuXHRcdH1cblx0XHRjbG9zZVRhZyA9IGNsb3NlVGFnIHx8IHNlbGZDbG9zZTtcblx0XHRpZiAoY2xvc2VUYWcpIHtcblx0XHRcdGluVGFnID0gMDtcblx0XHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRcdC8vIFRPRE86IHNtYXJ0IGluc2VydGlvbiBvZiA8dGJvZHk+IC0gdG8gYmUgY29tcGxldGVkIGZvciByb2J1c3QgaW5zZXJ0aW9uIG9mIGRlZmVycmVkIGJpbmRpbmdzIGV0Yy5cblx0XHRcdC8vaWYgKGNsb3NlVGFnID09PSBcInRhYmxlXCIgJiYgcGFyZW50VGFnID09PSBcInRib2R5XCIpIHtcblx0XHRcdC8vXHRwcmVjZWRpbmcgPSBcIjwvdGJvZHk+XCIgKyBwcmVjZWRpbmc7XG5cdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0YWJsZVwiO1xuXHRcdFx0Ly9cdHRhZ1N0YWNrLnNoaWZ0KCk7XG5cdFx0XHQvL31cblx0XHRcdGlmICh2YWxpZGF0ZSkge1xuXHRcdFx0XHRpZiAoc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTIpIHtcblx0XHRcdFx0XHRpZiAoIXZvaWRFbGVtc1twYXJlbnRUYWddICYmICEvO3N2Zzt8O21hdGg7Ly50ZXN0KFwiO1wiICsgdGFnU3RhY2suam9pbihcIjtcIikgKyBcIjtcIikpIHtcblx0XHRcdFx0XHRcdC8vIE9ubHkgc2VsZi1jbG9zaW5nIGVsZW1lbnRzIG11c3QgYmUgbGVnaXRpbWF0ZSB2b2lkIGVsZW1lbnRzLCBzdWNoIGFzIDxici8+LCBwZXIgSFRNTCBzY2hlbWEsXG5cdFx0XHRcdFx0XHQvLyBvciB1bmRlciBzdmcgb3IgbWF0aCBmb3JlaWduIG5hbWVzcGFjZSBlbGVtZW50cy5cblx0XHRcdFx0XHRcdGVycm9yTXNnID0gXCInPFwiICsgcGFyZW50VGFnICsgXCIuLi4vXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZvaWRFbGVtc1tjbG9zZVRhZ10pIHtcblx0XHRcdFx0XHRlcnJvck1zZyA9IFwiJzwvXCIgKyBjbG9zZVRhZzsgLy8gY2xvc2luZyB0YWcgc3VjaCBhcyA8L2lucHV0PlxuXHRcdFx0XHR9IGVsc2UgaWYgKCF0YWdTdGFjay5sZW5ndGggfHwgY2xvc2VUYWcgIT09IHBhcmVudFRhZykge1xuXHRcdFx0XHRcdGVycm9yTXNnID0gXCJNaXNtYXRjaDogJzwvXCIgKyBjbG9zZVRhZztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyb3JNc2cpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihlcnJvck1zZyArIFwiPicgaW46XFxuXCIgKyBodG1sKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJldkVsQ250ID0gZWxDbnQ7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWdTdGFjay5zaGlmdCgpO1xuXHRcdFx0ZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXTtcblx0XHRcdGNsb3NlVGFnMiA9IGNsb3NlVGFnMiA/IChcIjwvXCIgKyBjbG9zZVRhZzIgKyBcIj5cIikgOiBcIlwiO1xuXHRcdFx0aWYgKHByZXZFbENudCkge1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHRcdGRlZmVyICs9IGlkcztcblx0XHRcdFx0aWRzID0gXCJcIjtcblx0XHRcdFx0aWYgKCFlbENudCkge1xuXHRcdFx0XHRcdGVuZE9mRWxDbnQgPSBjbG9zZVRhZzIgKyBvcGVuU2NyaXB0ICsgXCJAXCIgKyBkZWZlciArIGNsb3NlU2NyaXB0ICsgKHNwYWNlQWZ0ZXJDbG9zZSB8fCBcIlwiKTtcblx0XHRcdFx0XHRkZWZlciA9IGRlZmVyU3RhY2suc2hpZnQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlciArPSBcIi1cIjsgLy8gV2lsbCBiZSB1c2VkIGZvciBzdGVwcGluZyBiYWNrIHRocm91Z2ggZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHQvLyBlbENvbnRlbnQgbWFwcyB0YWdOYW1lcyB3aGljaCBoYXZlIG9ubHkgZWxlbWVudCBjb250ZW50LCBzbyBtYXkgbm90IHN1cHBvcnQgc2NyaXB0IG5vZGVzLlxuXHRcdFx0Ly8gV2UgYXJlIGluIGVsZW1lbnQtb25seSBjb250ZW50LCBjYW4gcmVtb3ZlIHdoaXRlIHNwYWNlLCBhbmQgdXNlIGRhdGEtanN2IGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgYXMgbWFya2Vyc1xuXHRcdFx0Ly8gRXhhbXBsZTogPHRyIGRhdGEtanN2PVwiLzJfIzZfXCI+IC0gY2xvc2UgbWFya2VyIGZvciB2aWV3IDIgYW5kIG9wZW4gbWFya2VyIGZvciB2aWV3IDZcblxuXHRcdFx0aWYgKGlkKSB7XG5cdFx0XHRcdC8vIGFwcGVuZCBtYXJrZXIgZm9yIHRoaXMgaWQsIHRvIGlkcyBzdHJpbmdcblx0XHRcdFx0aWRzICs9IGlkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJlY2VkaW5nID0gKGNsb3NlVGFnMiB8fCBzZWxmQ2xvc2UyIHx8IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHQvLyBUT0RPOiBzbWFydCBpbnNlcnRpb24gb2YgPHRib2R5PiAtIHRvIGJlIGNvbXBsZXRlZCBmb3Igcm9idXN0IGluc2VydGlvbiBvZiBkZWZlcnJlZCBiaW5kaW5ncyBldGMuXG5cdFx0XHRcdC8vaWYgKHRhZyA9PT0gXCI8dHJcIiAmJiBwYXJlbnRUYWcgPT09IFwidGFibGVcIikge1xuXHRcdFx0XHQvL1x0dGFnU3RhY2sudW5zaGlmdChwYXJlbnRUYWcpO1xuXHRcdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0Ym9keVwiO1xuXHRcdFx0XHQvL1x0cHJlY2VkaW5nICs9IFwiPFwiICsgcGFyZW50VGFnICsgXCI+XCI7XG5cdFx0XHRcdC8vXHRpZiAoZGVmZXIpIHtcblx0XHRcdFx0Ly9cdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0XHQvL1x0fVxuXHRcdFx0XHQvL1x0Ly8gVE9ETzogbW92ZSB0aGlzIHRvIGRlc2lnbi10aW1lIHZhbGlkYXRpb24gY2hlY2tcblx0XHRcdFx0Ly9cdC8vXHRlcnJvcignXCInICsgcGFyZW50VGFnICsgJ1wiIGhhcyBpbmNvcnJlY3QgcGFyZW50IHRhZycpO1xuXHRcdFx0XHQvL31cblx0XHRcdFx0cHJlY2VkaW5nICs9IHRhZztcblx0XHRcdFx0aWYgKGlkcykge1xuXHRcdFx0XHRcdHByZWNlZGluZyArPSAnICcgKyBqc3ZBdHRyU3RyICsgJz1cIicgKyBpZHMgKyAnXCInO1xuXHRcdFx0XHRcdGlkcyA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgYXJlIGluIHBocmFzaW5nIG9yIGZsb3cgY29udGVudCwgc28gdXNlIHNjcmlwdCBtYXJrZXIgbm9kZXNcblx0XHRcdC8vIEV4YW1wbGU6IDxzY3JpcHQgdHlwZT1cImpzdjMvXCI+PC9zY3JpcHQ+IC0gZGF0YS1saW5rZWQgdGFnLCBjbG9zZSBtYXJrZXJcblx0XHRcdC8vIFdlIHZhbGlkYXRlIHdpdGggaW5UYWcgc28gbm8gc2NyaXB0IG1hcmtlcnMgYXJlIGluc2VydGVkIGluIGF0dHJpYnV0ZSBjb250ZXh0IGUuZy4gZm9yOlxuXHRcdFx0Ly8gXCI8dGFibGUge3tpZiAuLi59fS4uLnt7L2lmfX0uLi4gPlwiIG9yIFwiPHRhYmxlIHt7aWYgLi4ufX0uLi4+IC4uLnt7L2lmfX0uLi5cIlxuXHRcdFx0cHJlY2VkaW5nID0gaWRcblx0XHRcdFx0PyAocHJlY2VkaW5nICsgZW5kT2ZFbENudCArIHNwYWNlQmVmb3JlICsgKGluVGFnID8gXCJcIiA6IG9wZW5TY3JpcHQgKyBpZCArIGNsb3NlU2NyaXB0KSsgc3BhY2VBZnRlciArIHRhZylcblx0XHRcdFx0OiBlbmRPZkVsQ250IHx8IGFsbDtcblx0XHR9XG5cblx0XHRpZiAodmFsaWRhdGUgJiYgYm91bmRJZCkge1xuXHRcdFx0aWYgKGluVGFnKSB7XG5cdFx0XHRcdC8vIEpzVmlld3MgZGF0YS1saW5raW5nIHRhZ3MgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbiBlbGVtZW50IG1hcmt1cC5cblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzMwM1xuXHRcdFx0XHRzeW50YXhFcnJvcigne157IHdpdGhpbiBlbGVtIG1hcmt1cCAoJyArIGluVGFnICsgJyApLiBVc2UgZGF0YS1saW5rPVwiLi4uXCInKTtcblx0XHRcdH1cblx0XHRcdGlmIChpZC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdHRhZ1N0YWNrLnVuc2hpZnQoaWQuc2xpY2UoMSkpO1xuXHRcdFx0fSBlbHNlIGlmIChpZC5zbGljZSgxKSAhPT0gKGJuZElkID0gdGFnU3RhY2suc2hpZnQoKSkpIHtcblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzIxM1xuXHRcdFx0XHRzeW50YXhFcnJvcignQ2xvc2luZyB0YWcgZm9yIHteey4uLn19IHVuZGVyIGRpZmZlcmVudCBlbGVtOiA8JyArIGJuZElkICsgJz4nKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRhZykge1xuXHRcdFx0aW5UYWcgPSB0YWc7XG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHR0YWdTdGFjay51bnNoaWZ0KHBhcmVudFRhZyk7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWcuc2xpY2UoMSk7XG5cdFx0XHRpZiAodmFsaWRhdGUgJiYgdGFnU3RhY2tbMF0gJiYgdGFnU3RhY2tbMF0gPT09IGJhZFBhcmVudFtwYXJlbnRUYWddKSB7XG5cdFx0XHRcdC8vIE1pc3NpbmcgPHRib2R5PlxuXHRcdFx0XHQvLyBUT0RPOiByZXBsYWNlIHRoaXMgYnkgc21hcnQgaW5zZXJ0aW9uIG9mIDx0Ym9keT4gdGFnc1xuXHRcdFx0XHRlcnJvcignUGFyZW50IG9mIDx0cj4gbXVzdCBiZSA8dGJvZHk+Jyk7XG5cdFx0XHR9XG5cdFx0XHRpc1ZvaWQgPSB2b2lkRWxlbXNbcGFyZW50VGFnXTtcblx0XHRcdGlmICgoZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXSkgJiYgIXByZXZFbENudCkge1xuXHRcdFx0XHRkZWZlclN0YWNrLnVuc2hpZnQoZGVmZXIpO1xuXHRcdFx0XHRkZWZlciA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRwcmV2RWxDbnQgPSBlbENudDtcbi8vVE9ETyBDb25zaWRlciBwcm92aWRpbmcgdmFsaWRhdGlvbiB3aGljaCB0aHJvd3MgaWYgeW91IHBsYWNlIDxzcGFuPiBhcyBjaGlsZCBvZiA8dHI+LCBldGMuIC0gc2luY2UgaWYgbm90IGNhdWdodCxcbi8vdGhpcyBjYW4gY2F1c2UgZXJyb3JzIHN1YnNlcXVlbnRseSB3aGljaCBhcmUgZGlmZmljdWx0IHRvIGRlYnVnLlxuLy9cdFx0XHRcdGlmIChlbENvbnRlbnRbdGFnU3RhY2tbMF1dPjIgJiYgIWVsQ250KSB7XG4vL1x0XHRcdFx0XHRlcnJvcihwYXJlbnRUYWcgKyBcIiBpbiBcIiArIHRhZ1N0YWNrWzBdKTtcbi8vXHRcdFx0XHR9XG5cdFx0XHRpZiAoZGVmZXIgJiYgZWxDbnQpIHtcblx0XHRcdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcHJlY2VkaW5nO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJvY2Vzc1ZpZXdJbmZvcyh2d0luZm9zLCB0YXJnZXRQYXJlbnQpIHtcblx0XHQvLyBJZiB0YXJnZXRQYXJlbnQsIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyAod2hpY2ggbWF5IGluY2x1ZGUgbmF2aWdhdGlvbiB0aHJvdWdoICcrLScgcGF0aHMpIGFuZCBob29raW5nIHVwIHRvIHRoZSByaWdodCBwYXJlbnRFbGVtIGV0Yy5cblx0XHQvLyAoYW5kIGVsZW0gbWF5IGFsc28gYmUgZGVmaW5lZCAtIHRoZSBuZXh0IG5vZGUpXG5cdFx0Ly8gSWYgbm8gdGFyZ2V0UGFyZW50LCB0aGVuIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyBvbiBuZXdseSBpbnNlcnRlZCBjb250ZW50XG5cdFx0dmFyIGRlZmVyUGF0aCwgZGVmZXJDaGFyLCBiaW5kQ2hhciwgcGFyZW50RWxlbSwgaWQsIG9uQWZ0Q3IsIGRlZXAsXG5cdFx0XHRhZGRlZEJpbmRFbHMgPSBbXTtcblxuXHRcdC8vIEluIGVsQ250IGNvbnRleHQgKGVsZW1lbnQtb25seSBjb250ZW50IG1vZGVsKSwgcHJldk5vZGUgaXMgdGhlIGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIG9wZW4sIG5leHROb2RlIGlzIHRoZSBmaXJzdCBub2RlIGFmdGVyIHRoZSBjbG9zZS5cblx0XHQvLyBJZiBib3RoIGFyZSBudWxsL3VuZGVmaW5lZCwgdGhlbiBvcGVuIGFuZCBjbG9zZSBhcmUgYXQgZW5kIG9mIHBhcmVudCBjb250ZW50LCBzbyB0aGUgdmlldyBpcyBlbXB0eSwgYW5kIGl0cyBwbGFjZWhvbGRlciBpcyB0aGVcblx0XHQvLyAnbGFzdENoaWxkJyBvZiB0aGUgcGFyZW50Tm9kZS4gSWYgdGhlcmUgaXMgYSBwcmV2Tm9kZSwgdGhlbiBpdCBpcyBlaXRoZXIgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXcsIG9yIHRoZSB2aWV3IGlzIGVtcHR5IGFuZFxuXHRcdC8vIGl0cyBwbGFjZWhvbGRlciBpcyB0aGUgJ3ByZXZpb3VzU2libGluZycgb2YgdGhlIHByZXZOb2RlLCB3aGljaCBpcyBhbHNvIHRoZSBuZXh0Tm9kZS5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0aWYgKHZ3SW5mb3MuX3RrbnMuY2hhckF0KDApID09PSBcIkBcIikge1xuXHRcdFx0XHQvLyBXZSBhcmUgcHJvY2Vzc2luZyBuZXdseSBpbnNlcnRlZCBjb250ZW50LiBUaGlzIGlzIGEgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkIGluIGNvbnZlcnRNYXJrZXJzKCkgdG8gcHJvY2VzcyBkZWZlcnJlZCBiaW5kaW5ncyxcblx0XHRcdFx0Ly8gYW5kIGluc2VydGVkIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHBhcmVudCBlbGVtZW50IC0gYmVjYXVzZSBubyBlbGVtZW50IHRhZ3MgKG91dHNpZGUgZWxDbnQpIHdlcmUgZW5jb3VudGVyZWQgdG8gY2FycnkgdGhvc2UgYmluZGluZyB0b2tlbnMuXG5cdFx0XHRcdC8vIFdlIHdpbGwgc3RlcCBiYWNrIGZyb20gdGhlIHByZWNlZGluZyBzaWJsaW5nIG9mIHRoaXMgZWxlbWVudCwgbG9va2luZyBhdCB0YXJnZXRQYXJlbnQgZWxlbWVudHMgdW50aWwgd2UgZmluZCB0aGUgb25lIHRoYXQgdGhlIGN1cnJlbnQgYmluZGluZ1xuXHRcdFx0XHQvLyB0b2tlbiBiZWxvbmdzIHRvLiBTZXQgZWxlbSB0byBudWxsICh0aGUgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCksIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgRE9NLlxuXHRcdFx0XHR0YXJnZXRQYXJlbnQgPSBlbGVtLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW0pO1xuXHRcdFx0XHRlbGVtID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tsZW5dO1xuLy9pZiAocHJldklkcy5pbmRleE9mKHZ3SW5mby50b2tlbikgPCAwKSB7IC8vIFRoaXMgdG9rZW4gaXMgYSBuZXdseSBjcmVhdGVkIHZpZXcgb3IgdGFnIGJpbmRpbmdcblx0XHRcdFx0YmluZENoYXIgPSB2d0luZm8uY2g7XG5cdFx0XHRcdGlmIChkZWZlclBhdGggPSB2d0luZm8ucGF0aCkge1xuXHRcdFx0XHRcdC8vIFdlIGhhdmUgYSAnZGVmZXJyZWQgcGF0aCdcblx0XHRcdFx0XHRqID0gZGVmZXJQYXRoLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0d2hpbGUgKGRlZmVyQ2hhciA9IGRlZmVyUGF0aC5jaGFyQXQoai0tKSkge1xuXHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBcIitcIiBhbmRcIi1cIiBjaGFyYWN0ZXJzIHRvIG5hdmlnYXRlIHRoZSBwYXRoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBhcmVudCBub2RlIHdoZXJlIHRoZSBkZWZlcnJlZCBiaW5kaW5ncyBvY3VycmVkXG5cdFx0XHRcdFx0XHRpZiAoZGVmZXJDaGFyID09PSBcIitcIikge1xuXHRcdFx0XHRcdFx0XHRpZiAoZGVmZXJQYXRoLmNoYXJBdChqKSA9PT0gXCItXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRqLS07XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50LnByZXZpb3VzU2libGluZztcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50Lmxhc3RDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIE5vdGU6IENhbiB1c2UgcHJldmlvdXNTaWJsaW5nIGFuZCBsYXN0Q2hpbGQsIG5vdCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFuZCBsYXN0RWxlbWVudENoaWxkLFxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgaGF2ZSByZW1vdmVkIHdoaXRlIHNwYWNlIHdpdGhpbiBlbENudC4gSGVuY2Ugc3VwcG9ydCBJRSA8IDlcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJpbmRDaGFyID09PSBcIl5cIikge1xuXHRcdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgYmluZGluZyBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQsIGZvciBleGFtcGxlIGluIGEgZGlmZmVyZW50IGhhbmRsZXIgdG8gYW4gYXJyYXkgY29sbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHRhZyBiaW5kaW5nXG5cdFx0XHRcdFx0XHRkZWVwID0gdGFyZ2V0UGFyZW50ICYmICghZWxlbSB8fCBlbGVtLnBhcmVudE5vZGUgIT09IHRhcmdldFBhcmVudCk7IC8vIFdlIGFyZSBzdGVwcGluZyBiYWNrIGxvb2tpbmcgZm9yIHRoZSByaWdodCB0YXJnZXRQYXJlbnQsXG5cdFx0XHRcdFx0XHQvLyBvciB3ZSBhcmUgbGlua2luZyBleGlzdGluZyBjb250ZW50IGFuZCB0aGlzIGVsZW1lbnQgaXMgaW4gZWxDbnQsIG5vdCBhbiBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIHRhcmdldFBhcmVudC5cblx0XHRcdFx0XHRcdGlmICghZWxlbSB8fCBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHZ3SW5mby5lbENudCAmJiBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdpdGggZWxlbWVudCBvbmx5IGNvbnRlbnQsIGlmIHRoZXJlIGlzIG5vIGZvbGxvd2luZyBlbGVtZW50LCBvciBpZiB0aGUgYmluZGluZyBpcyBkZWVwZXIgdGhhbiB0aGUgZm9sbG93aW5nIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0Ly8gdGhlbiB3ZSBuZWVkIHRvIHNldCB0aGUgb3BlbiBvciBjbG9zZSB0b2tlbiBhcyBhIGRlZmVycmVkIGJpbmRpbmcgYW5ub3RhdGlvbiBvbiB0aGUgcGFyZW50XG5cdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldFBhcmVudCwgKHZ3SW5mby5vcGVuID8gXCIjXCIgOiBcIi9cIikgKyBpZCArIGJpbmRDaGFyICsgKHRhcmdldFBhcmVudC5fZGYgfHwgXCJcIikpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG9yIGNsb3NlIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0uIEFkZCBpdCB0byBiaW5kRWxzLlxuXHRcdFx0XHRcdFx0YWRkZWRCaW5kRWxzLnB1c2goW2RlZXAgPyBudWxsIDogZWxlbSwgdndJbmZvXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZpZXcgPSB2aWV3U3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHZpZXcgbWF5IGhhdmUgYmVlbiBkZWxldGVkLCBmb3IgZXhhbXBsZSBpbiBhIGRpZmZlcmVudCBoYW5kbGVyIHRvIGFuIGFycmF5IGNvbGxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdFx0XHRpZiAoIXZpZXcucGFyZW50RWxlbSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdmlldyBpcyBub3QgYWxyZWFkeSBleHRlbmRlZCBmb3IgSnNWaWV3cywgZXh0ZW5kIGFuZCBpbml0aWFsaXplIHRoZSB2aWV3IG9iamVjdCBjcmVhdGVkIGluIEpzUmVuZGVyLCBhcyBhIEpzVmlld3Mgdmlld1xuXHRcdFx0XHRcdFx0dmlldy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50IHx8IGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlIHx8IHBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHR2aWV3Ll8ub25SZW5kZXIgPSBhZGRCaW5kaW5nTWFya2Vycztcblx0XHRcdFx0XHRcdHZpZXcuXy5vbkFycmF5Q2hhbmdlID0gYXJyYXlDaGFuZ2VIYW5kbGVyO1xuXHRcdFx0XHRcdFx0c2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXJlbnRFbGVtID0gdmlldy5wYXJlbnRFbGVtO1xuXHRcdFx0XHRcdGlmICh2d0luZm8ub3Blbikge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiAnb3BlbiB2aWV3JyBub2RlIChwcmVjZWRpbmcgc2NyaXB0IG1hcmtlciBub2RlLFxuXHRcdFx0XHRcdFx0Ly8gb3IgaWYgZWxDbnQsIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSB2aWV3LCB3aXRoIGEgZGF0YS1qc3YgYW5ub3RhdGlvbikgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdHZpZXcuX2VsQ250ID0gdndJbmZvLmVsQ250O1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFBhcmVudCAmJiAhZWxlbSkge1xuXHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRQYXJlbnQsIFwiI1wiICsgaWQgKyBiaW5kQ2hhciArICh0YXJnZXRQYXJlbnQuX2RmIHx8IFwiXCIpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIE5vIHRhcmdldFBhcmVudCwgc28gdGhlcmUgaXMgYSAuX254dCBlbGVtIChhbmQgdGhpcyBpcyBwcm9jZXNzaW5nIHRva2VucyBvbiB0aGUgZWxlbSlcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9wcnYpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiI1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSAnY2xvc2UgdmlldycgbWFya2VyIG5vZGUgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdGlmICh0YXJnZXRQYXJlbnQgJiYgKCFlbGVtIHx8IGVsZW0ucGFyZW50Tm9kZSAhPT0gdGFyZ2V0UGFyZW50KSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGVyZSBpcyBubyAuX254dCBzbyBhZGQgdG9rZW4gdG8gX2RmLiBJdCBpcyBkZWZlcnJlZC5cblx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0UGFyZW50LCBcIi9cIiArIGlkICsgYmluZENoYXIgKyAodGFyZ2V0UGFyZW50Ll9kZiB8fCBcIlwiKSk7XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZWxlbSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIHZpZXcgZGlkIG5vdCBoYXZlIGEgLl9ueHQsIGJ1dCBoYXMgb25lIG5vdywgc28gdG9rZW4gbWF5IGJlIGluIF9kZiwgYW5kIG11c3QgYmUgcmVtb3ZlZC4gKE5vIGxvbmdlciBkZWZlcnJlZClcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9ueHQpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiL1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob25BZnRDciA9IHZpZXcuY3R4ICYmIHZpZXcuY3R4W29uQWZ0ZXJDcmVhdGVTdHJdIHx8IG9uQWZ0ZXJDcmVhdGUpIHtcblx0XHRcdFx0XHRcdFx0b25BZnRDci5jYWxsKHZpZXcuY3R4LnRhZywgdmlldyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuLy99XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxlbiA9IGFkZGVkQmluZEVscy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0Ly8gVGhlc2Ugd2VyZSBhZGRlZCBpbiByZXZlcnNlIG9yZGVyIHRvIGFkZGVkQmluZEVscy4gV2UgcHVzaCB0aGVtIGluIEJpbmRFbHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG5cdFx0XHRcdGJpbmRFbHMucHVzaChhZGRlZEJpbmRFbHNbbGVuXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAhdndJbmZvcyB8fCB2d0luZm9zLmVsQ250O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Vmlld0luZm9zKHZ3SW5mb3MpIHtcblx0XHQvLyBVc2VkIGJ5IHZpZXcuY2hpbGRUYWdzKCkgYW5kIHRhZy5jaGlsZFRhZ3MoKVxuXHRcdC8vIFNpbWlsYXIgdG8gcHJvY2Vzc1ZpZXdJbmZvcyBpbiBob3cgaXQgc3RlcHMgdGhyb3VnaCBiaW5kaW5ncyB0byBmaW5kIHRhZ3MuIE9ubHkgZmluZHMgZGF0YS1saW5rZWQgdGFncy5cblx0XHR2YXIgbGV2ZWwsIHBhcmVudFRhZywgbmFtZWQ7XG5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tqXTtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0sIHdpdGhpbiB0aGUgY29udGVudCBvZiB0aGUgdGFnIHdob3NlIGlkIGlzIGdldC5pZC4gQWRkIGl0IHRvIGJpbmRFbHMuXG5cdFx0XHRcdC8vIE5vdGUgLSBpZiBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5faXMgPT09IFwidGFnXCIgdGhlbiBnZXRWaWV3SW5mb3MgaXMgYmVpbmcgY2FsbGVkIHRvbyBzb29uIC0gZHVyaW5nIGZpcnN0IGxpbmtpbmcgcGFzc1xuXHRcdFx0XHRwYXJlbnRUYWcgPSB0YWcgPSBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5saW5rQ3R4LnRhZztcblx0XHRcdFx0bmFtZWQgPSB0YWcudGFnTmFtZSA9PT0gdGFnTmFtZTtcblx0XHRcdFx0aWYgKCF0YWcuZmxvdyB8fCBuYW1lZCkge1xuXHRcdFx0XHRcdGlmICghZGVlcCkge1xuXHRcdFx0XHRcdFx0bGV2ZWwgPSAxO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHBhcmVudFRhZyA9IHBhcmVudFRhZy5wYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0bGV2ZWwrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRhZ0RlcHRoID0gdGFnRGVwdGggfHwgbGV2ZWw7IC8vIFRoZSBsZXZlbCBvZiB0aGUgZmlyc3QgdGFnIGVuY291bnRlcmVkLlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoKGRlZXAgfHwgbGV2ZWwgPT09IHRhZ0RlcHRoKSAmJiAoIXRhZ05hbWUgfHwgbmFtZWQpKSB7XG5cdFx0XHRcdFx0XHQvLyBGaWx0ZXIgb24gdG9wLWxldmVsIG9yIHRhZ05hbWUgYXMgYXBwcm9wcmlhdGVcblx0XHRcdFx0XHRcdHRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGRhdGFMaW5rKCkge1xuXHRcdC8vPT09PT09PT09PT09PT09PSBEYXRhLWxpbmsgYW5kIGZpeHVwIG9mIGRhdGEtanN2IGFubm90YXRpb25zID09PT09PT09PT09PT09PT1cblx0XHR2YXIgaiwgaW5kZXgsXG5cdFx0XHR0b2tlbnMgPSBcIlwiLFxuXHRcdFx0d3JhcCA9IHt9LFxuXHRcdFx0c2VsZWN0b3IgPSBsaW5rVmlld3NTZWwgKyAoZ2V0ID8gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgOiBcIlwiKTtcblx0XHRcdC8vIElmIGEgY2hpbGRUYWdzKCkgY2FsbCwgZ2V0ID0gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgLSBzaW5jZSB3ZSBuZWVkIHRvIGluY2x1ZGUgZWxlbWVudHMgdGhhdCBoYXZlIGEgLl9kZiBleHBhbmRvIGZvciBkZWZlcnJlZCB0b2tlbnNcblxuXHRcdGVsZW1zID0gcXNhID8gcGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHBhcmVudE5vZGUpLmdldCgpO1xuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0XHQvLyBUaGUgcHJldk5vZGUgd2lsbCBiZSBpbiB0aGUgcmV0dXJuZWQgcXVlcnksIHNpbmNlIHdlIGNhbGxlZCBtYXJrUHJldk9yTmV4dE5vZGUoKSBvbiBpdC5cblx0XHQvLyBCdXQgaXQgbWF5IGhhdmUgY29udGFpbmVkIG5vZGVzIHRoYXQgc2F0aXNmeSB0aGUgc2VsZWN0b3IgYWxzby5cblx0XHRpZiAocHJldk5vZGUgJiYgcHJldk5vZGUuaW5uZXJIVE1MKSB7XG5cdFx0XHQvLyBGaW5kIHRoZSBsYXN0IGNvbnRhaW5lZCBub2RlIG9mIHByZXZOb2RlLCB0byB1c2UgYXMgdGhlIHByZXZOb2RlIC0gc28gd2Ugb25seSBsaW5rIHN1YnNlcXVlbnQgZWxlbXMgaW4gdGhlIHF1ZXJ5XG5cdFx0XHRwcmV2Tm9kZXMgPSBxc2EgPyBwcmV2Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHByZXZOb2RlKS5nZXQoKTtcblx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVzLmxlbmd0aCA/IHByZXZOb2Rlc1twcmV2Tm9kZXMubGVuZ3RoIC0gMV0gOiBwcmV2Tm9kZTtcblx0XHR9XG5cblx0XHR0YWdEZXB0aCA9IDA7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0ZWxlbSA9IGVsZW1zW2ldO1xuXHRcdFx0aWYgKHByZXZOb2RlICYmICFmb3VuZCkge1xuXHRcdFx0XHQvLyBJZiBwcmV2Tm9kZSBpcyBzZXQsIG5vdCBmYWxzZSwgc2tpcCBsaW5raW5nLiBJZiB0aGlzIGVsZW1lbnQgaXMgdGhlIHByZXZOb2RlLCBzZXQgdG8gZmFsc2Ugc28gc3Vic2VxdWVudCBlbGVtZW50cyB3aWxsIGxpbmsuXG5cdFx0XHRcdGZvdW5kID0gKGVsZW0gPT09IHByZXZOb2RlKTtcblx0XHRcdH0gZWxzZSBpZiAobmV4dE5vZGUgJiYgZWxlbSA9PT0gbmV4dE5vZGUpIHtcblx0XHRcdFx0Ly8gSWYgbmV4dE5vZGUgaXMgc2V0IHRoZW4gYnJlYWsgd2hlbiB3ZSBnZXQgdG8gbmV4dE5vZGVcblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSBpZiAoZWxlbS5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdC8vIGVsZW0gaGFzIG5vdCBiZWVuIHJlbW92ZWQgZnJvbSBET01cblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0XHRpZiAoZWxlbS5fZGYpIHtcblx0XHRcdFx0XHRcdGogPSBpICsgMTtcblx0XHRcdFx0XHRcdHdoaWxlIChqIDwgbCAmJiBlbGVtLmNvbnRhaW5zKGVsZW1zW2pdKSkge1xuXHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBBZGQgZGVmZXJlZCB0b2tlbnMgYWZ0ZXIgYW55IHRva2VucyBvbiBkZXNjZW5kYW50IGVsZW1lbnRzIG9mIHRoaXMgb25lXG5cdFx0XHRcdFx0XHR3cmFwW2otMV0gPSBlbGVtLl9kZjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHdyYXBbaV0pIHtcblx0XHRcdFx0XHRcdHRva2VucyArPSB3cmFwW2ldIHx8IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChpc0xpbmsgJiYgKHZ3SW5mbyA9IHZpZXdJbmZvcyhlbGVtLCB1bmRlZmluZWQsIHJWaWV3TWFya2VycykpICYmICh2d0luZm8gPSB2d0luZm9bMF0pKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIGEgbGluayh0cnVlT3JTdHJpbmcgLi4uKSBjYWxsIHdlIHdpbGwgYXZvaWQgcmUtYmluZGluZyB0byBlbGVtcyB0aGF0IGFyZSB3aXRoaW4gdGVtcGxhdGUtcmVuZGVyZWQgdmlld3Ncblx0XHRcdFx0XHRcdHNraXAgPSBza2lwID8gKHZ3SW5mby5pZCAhPT0gc2tpcCAmJiBza2lwKSA6IHZ3SW5mby5vcGVuICYmIHZ3SW5mby5pZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFza2lwICYmIHByb2Nlc3NJbmZvcyh2aWV3SW5mb3MoZWxlbSkpXG5cdFx0XHRcdFx0XHQvLyBJZiBhIGxpbmsoKSBjYWxsLCBwcm9jZXNzVmlld0luZm9zKCkgYWRkcyBiaW5kaW5ncyB0byBiaW5kRWxzLCBhbmQgcmV0dXJucyB0cnVlIGZvciBub24tc2NyaXB0IG5vZGVzLCBmb3IgYWRkaW5nIGRhdGEtbGluayBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBjaGlsZFRhZ3MoKSBjYWxsLCBnZXRWaWV3SW5mb3MgcmV0dXJucyBhcnJheSBvZiB0YWcgYmluZGluZ3MuXG5cdFx0XHRcdFx0XHRcdCYmIGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0XHRcdFx0YmluZEVscy5wdXNoKFtlbGVtXSk7IC8vIEEgZGF0YS1saW5rZWQgZWxlbWVudCBzbyBhZGQgdG8gYmluZEVscyB0b29cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0KSB7XG5cdFx0XHR0b2tlbnMgKz0gcGFyZW50Tm9kZS5fZGYgfHwgXCJcIjtcblx0XHRcdGlmIChpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiI1wiICsgZ2V0LmlkKSArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gc3RhcnQgYWZ0ZXIgdGhlIG9wZW4gdG9rZW4gb2YgdGhlIHBhcmVudCB2aWV3IG9yIHRhZy5cblx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKGluZGV4ICsgZ2V0LmlkLmxlbmd0aCk7XG5cdFx0XHR9XG5cdFx0XHRpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiL1wiICsgZ2V0LmlkKTtcblx0XHRcdGlmIChpbmRleCArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gZG9uJ3QgbG9vayBiZXlvbmQgdGhlIGNsb3NlIHRva2VuIG9mIHRoZSBwYXJlbnQgdmlldyBvciB0YWcuXG5cdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZSgwLCBpbmRleCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBDYWxsIGdldFZpZXdJbmZvcyB0byBhZGQgdGhlIGZvdW5kIGNoaWxkVGFncyB0byB0aGUgdGFncyBhcnJheVxuXHRcdFx0Z2V0Vmlld0luZm9zKHZpZXdJbmZvcyh0b2tlbnMsIHVuZGVmaW5lZCwgck9wZW5UYWdNYXJrZXJzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKGh0bWwgPT09IHVuZGVmaW5lZCAmJiBwYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikpIHtcblx0XHRcdGJpbmRFbHMucHVzaChbcGFyZW50Tm9kZV0pOyAvLyBTdXBwb3J0IGRhdGEtbGlua2luZyB0b3AtbGV2ZWwgZWxlbWVudCBkaXJlY3RseSAobm90IHdpdGhpbiBhIGRhdGEtbGlua2VkIGNvbnRhaW5lcilcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGVtcG9yYXJ5IG1hcmtlciBzY3JpcHQgbm9kZXMgdGhleSB3ZXJlIGFkZGVkIGJ5IG1hcmtQcmV2T3JOZXh0Tm9kZVxuXHRcdHVubWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdFx0dW5tYXJrUHJldk9yTmV4dE5vZGUobmV4dE5vZGUsIGVsQ250KTtcblxuXHRcdGlmIChnZXQpIHtcblx0XHRcdGlmIChsYXp5TGluaykge1xuXHRcdFx0XHRsYXp5TGluay5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47IC8vIFdlIGhhdmUgYWRkZWQgY2hpbGRUYWdzIHRvIHRoZSB0YWdzIGFycmF5LCBzbyB3ZSBhcmUgZG9uZVxuXHRcdH1cblxuXHRcdGlmIChlbENudCAmJiBkZWZlciArIGlkcykge1xuXHRcdFx0Ly8gVGhlcmUgYXJlIHNvbWUgdmlld3Mgd2l0aCBlbENudCwgZm9yIHdoaWNoIHRoZSBvcGVuIG9yIGNsb3NlIGRpZCBub3QgcHJlY2VkZSBhbnkgSFRNTCB0YWcgLSBzbyB0aGV5IGhhdmUgbm90IGJlZW4gcHJvY2Vzc2VkIHlldFxuXHRcdFx0ZWxlbSA9IG5leHROb2RlO1xuXHRcdFx0aWYgKGRlZmVyKSB7XG5cdFx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHRcdHByb2Nlc3NWaWV3SW5mb3Modmlld0luZm9zKGRlZmVyICsgXCIrXCIsIHRydWUpLCBuZXh0Tm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoZGVmZXIsIHRydWUpLCBwYXJlbnROb2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoaWRzLCB0cnVlKSwgcGFyZW50Tm9kZSk7XG5cdFx0XHQvLyBJZiB0aGVyZSB3ZXJlIGFueSB0b2tlbnMgb24gbmV4dE5vZGUgd2hpY2ggaGF2ZSBub3cgYmVlbiBhc3NvY2lhdGVkIHdpdGggaW5zZXJ0ZWQgSFRNTCB0YWdzLCByZW1vdmUgdGhlbSBmcm9tIG5leHROb2RlXG5cdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0dG9rZW5zID0gbmV4dE5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpO1xuXHRcdFx0XHRpZiAobCA9IHRva2Vucy5pbmRleE9mKHByZXZJZHMpICsgMSkge1xuXHRcdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZShsICsgcHJldklkcy5sZW5ndGggLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRuZXh0Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgaWRzICsgdG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLz09PT09PT09PT09PT09PT0gQmluZCB0aGUgZGF0YS1saW5rZWQgZWxlbWVudHMgYW5kIHRhZ3MgPT09PT09PT09PT09PT09PVxuXHRcdGwgPSBiaW5kRWxzLmxlbmd0aDtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRlbGVtID0gYmluZEVsc1tpXTtcblx0XHRcdGxpbmtJbmZvID0gZWxlbVsxXTtcblx0XHRcdGVsZW0gPSBlbGVtWzBdO1xuXHRcdFx0aWYgKGxpbmtJbmZvKSB7XG5cdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbbGlua0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtDdHggPSB0YWcubGlua0N0eCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHRhZyBtYXkgaGF2ZSBiZWVuIHN0b3JlZCB0ZW1wb3JhcmlseSBvbiB0aGUgYmluZGluZ1N0b3JlIC0gb3IgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBhY3R1YWwgYmluZGluZ1xuXHRcdFx0XHRcdFx0dGFnID0gbGlua0N0eC50YWc7XG5cdFx0XHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsaW5rSW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuICdvcGVuIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRcdFx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHR0YWcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0YWcuX2VsQ250ID0gbGlua0luZm8uZWxDbnQ7XG5cdFx0XHRcdFx0XHQvLyBXZSBkYXRhLWxpbmsgZGVwdGgtZmlyc3QgKFwib24gdGhlIHdheSBpblwiKSwgd2hpY2ggaXMgYmV0dGVyIGZvciBwZXJmIC0gYW5kIGFsbG93cyBzZXR0aW5nIHBhcmVudCB0YWdzIGV0Yy5cblx0XHRcdFx0XHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXc7XG5cdFx0XHRcdFx0XHRhZGREYXRhQmluZGluZyh1bmRlZmluZWQsIHRhZy5fcHJ2LCB2aWV3LCBsaW5rSW5mby5pZCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRhZy5fbnh0ID0gZWxlbTtcblx0XHRcdFx0XHRcdGlmICh0YWcuXy51bmxpbmtlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgJ2Nsb3NlIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHQvLyBBZGQgZGF0YSBiaW5kaW5nXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eCA9IHRhZy50YWdDdHg7XG5cdFx0XHRcdFx0XHRcdHZpZXcgPSB0YWdDdHgudmlldztcblx0XHRcdFx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQWRkIGRhdGEgYmluZGluZyBmb3IgYSBkYXRhLWxpbmtlZCBlbGVtZW50ICh3aXRoIGRhdGEtbGluayBhdHRyaWJ1dGUpXG5cdFx0XHRcdGFkZERhdGFCaW5kaW5nKGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSwgZWxlbSwgJHZpZXcoZWxlbSksIHVuZGVmaW5lZCwgaXNMaW5rLCBvdXRlckRhdGEsIGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobGF6eUxpbmspIHtcblx0XHRcdGxhenlMaW5rLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblx0Ly89PT09IC9lbmQgb2YgbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cblx0dmFyIGluVGFnLCBsaW5rQ3R4LCB0YWcsIGksIGwsIGosIGxlbiwgZWxlbXMsIGVsZW0sIHZpZXcsIHZ3SW5mbywgbGlua0luZm8sIHByZXZOb2RlcywgdG9rZW4sIHByZXZWaWV3LCBuZXh0Vmlldyxcblx0XHRub2RlLCB0YWdzLCBkZWVwLCB0YWdOYW1lLCB0YWdDdHgsIHZhbGlkYXRlLCB0YWdEZXB0aCwgZGVwdGgsIGZyYWdtZW50LCBjb3BpZWROb2RlLCBmaXJzdFRhZywgcGFyZW50VGFnLFxuXHRcdGlzVm9pZCwgd3JhcHBlciwgZGl2LCB0b2tlbnMsIGVsQ250LCBwcmV2RWxDbnQsIGh0bWxUYWcsIGlkcywgcHJldklkcywgZm91bmQsIHNraXAsIGxhenlMaW5rLCBpc0xpbmssIGdldCxcblx0XHRzZWxmID0gdGhpcyxcblx0XHR0aGlzSWQgPSBzZWxmLl8uaWQgKyBcIl9cIixcblx0XHRkZWZlciA9IFwiXCIsXG5cdFx0Ly8gVGhlIG1hcmtlciBpZHMgZm9yIHdoaWNoIG5vIHRhZyB3YXMgZW5jb3VudGVyZWQgKGVtcHR5IHZpZXdzIG9yIGZpbmFsIGNsb3NpbmcgbWFya2Vycykgd2hpY2ggd2UgY2Fycnkgb3ZlciB0byBjb250YWluZXIgdGFnXG5cdFx0YmluZEVscyA9IFtdLFxuXHRcdHRhZ1N0YWNrID0gW10sXG5cdFx0ZGVmZXJTdGFjayA9IFtdLFxuXHRcdG9uQWZ0ZXJDcmVhdGUgPSBzZWxmLmhscChvbkFmdGVyQ3JlYXRlU3RyKSxcblx0XHRwcm9jZXNzSW5mb3MgPSBwcm9jZXNzVmlld0luZm9zO1xuXG5cdGlmIChyZWZyZXNoKSB7XG5cdFx0bGF6eUxpbmsgPSByZWZyZXNoLmxhenlMaW5rICYmICQuRGVmZXJyZWQoKTtcblx0XHRpZiAocmVmcmVzaC50bXBsKSB7XG5cdFx0XHQvLyByZWZyZXNoIGlzIHRoZSBwcmV2VmlldywgcGFzc2VkIGluIGZyb20gYWRkVmlld3MoKVxuXHRcdFx0cHJldlZpZXcgPSBcIi9cIiArIHJlZnJlc2guXy5pZCArIFwiX1wiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpc0xpbmsgPSByZWZyZXNoLmxuazsgLy8gVG9wLWxldmVsIGxpbmtpbmdcblx0XHRcdGlmIChyZWZyZXNoLnRhZykge1xuXHRcdFx0XHR0aGlzSWQgPSByZWZyZXNoLnRhZyArIFwiXlwiO1xuXHRcdFx0XHRyZWZyZXNoID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChnZXQgPSByZWZyZXNoLmdldCkge1xuXHRcdFx0XHRwcm9jZXNzSW5mb3MgPSBnZXRWaWV3SW5mb3M7XG5cdFx0XHRcdHRhZ3MgPSBnZXQudGFncztcblx0XHRcdFx0ZGVlcCA9IGdldC5kZWVwO1xuXHRcdFx0XHR0YWdOYW1lID0gZ2V0Lm5hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlZnJlc2ggPSByZWZyZXNoID09PSB0cnVlO1xuXHR9XG5cblx0cGFyZW50Tm9kZSA9IHBhcmVudE5vZGVcblx0XHQ/IChcIlwiICsgcGFyZW50Tm9kZSA9PT0gcGFyZW50Tm9kZVxuXHRcdFx0PyAkKHBhcmVudE5vZGUpWzBdICAvLyBJdCBpcyBhIHN0cmluZywgc28gdHJlYXQgYXMgc2VsZWN0b3Jcblx0XHRcdDogcGFyZW50Tm9kZS5qcXVlcnlcblx0XHRcdFx0PyBwYXJlbnROb2RlWzBdIC8vIEEgalF1ZXJ5IG9iamVjdCAtIHRha2UgZmlyc3QgZWxlbWVudC5cblx0XHRcdFx0OiBwYXJlbnROb2RlKVxuXHRcdDogKHNlbGYucGFyZW50RWxlbSAgICAgIC8vIHZpZXcubGluaygpXG5cdFx0XHR8fCBkb2N1bWVudC5ib2R5KTsgIC8vIGxpbmsobnVsbCwgZGF0YSkgdG8gbGluayB0aGUgd2hvbGUgZG9jdW1lbnRcblxuXHR2YWxpZGF0ZSA9ICEkc3ViU2V0dGluZ3NBZHZhbmNlZC5ub1ZhbGlkYXRlICYmIHBhcmVudE5vZGUuY29udGVudEVkaXRhYmxlICE9PSBUUlVFO1xuXHRwYXJlbnRUYWcgPSBwYXJlbnROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblx0ZWxDbnQgPSAhIWVsQ29udGVudFtwYXJlbnRUYWddO1xuXG5cdHByZXZOb2RlID0gcHJldk5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdG5leHROb2RlID0gbmV4dE5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKG5leHROb2RlLCBlbENudCkgfHwgbnVsbDtcblxuXHRpZiAoaHRtbCAhPSB1bmRlZmluZWQpIHtcblx0XHQvLz09PT09PT09PT09PT09PT0gSW5zZXJ0IGh0bWwgaW50byBET00gdXNpbmcgZG9jdW1lbnRGcmFnbWVudHMgKGFuZCB3cmFwcGluZyBIVE1MIGFwcHJvcHJpYXRlbHkpLiA9PT09PT09PT09PT09PT09XG5cdFx0Ly8gQWxzbyBjb252ZXJ0IG1hcmtlcnMgdG8gRE9NIGFubm90YXRpb25zLCBiYXNlZCBvbiBjb250ZW50IG1vZGVsLlxuXHRcdC8vIENvcnJlc3BvbmRzIHRvIG5leHROb2RlID8gJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIDogJChwYXJlbnROb2RlKS5odG1sKGh0bWwpO1xuXHRcdC8vIGJ1dCBhbGxvd3MgaW5zZXJ0aW9uIHRvIHdyYXAgY29ycmVjdGx5IGV2ZW4gd2l0aCBpbnNlcnRlZCBzY3JpcHQgbm9kZXMuIGpRdWVyeSB2ZXJzaW9uIHdpbGwgZmFpbCBlLmcuIHVuZGVyIHRib2R5IG9yIHNlbGVjdC5cblx0XHQvLyBUaGlzIHZlcnNpb24gc2hvdWxkIGFsc28gYmUgc2xpZ2h0bHkgZmFzdGVyXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR3cmFwcGVyID0gZGl2O1xuXHRcdHByZXZJZHMgPSBpZHMgPSBcIlwiO1xuXHRcdGh0bWxUYWcgPSBwYXJlbnROb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiID8gXCJzdmdfbnNcIiA6IChmaXJzdFRhZyA9IHJGaXJzdEVsZW0uZXhlYyhodG1sKSkgJiYgZmlyc3RUYWdbMV0gfHwgXCJcIjtcblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdC8vIE5vdyBsb29rIGZvciBmb2xsb3dpbmcgdmlldywgYW5kIGZpbmQgaXRzIHRva2Vucywgb3IgaWYgbm90IGZvdW5kLCBnZXQgdGhlIHBhcmVudE5vZGUuX2RmIHRva2Vuc1xuXHRcdFx0bm9kZSA9IG5leHROb2RlO1xuXHRcdFx0d2hpbGUgKG5vZGUgJiYgIShuZXh0VmlldyA9IHZpZXdJbmZvcyhub2RlKSkpIHtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAodG9rZW5zID0gbmV4dFZpZXcgPyBuZXh0Vmlldy5fdGtucyA6IHBhcmVudE5vZGUuX2RmKSB7XG5cdFx0XHRcdHRva2VuID0gcHJldlZpZXcgfHwgXCJcIjtcblx0XHRcdFx0aWYgKHJlZnJlc2ggfHwgIXByZXZWaWV3KSB7XG5cdFx0XHRcdFx0dG9rZW4gKz0gXCIjXCIgKyB0aGlzSWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aiA9IHRva2Vucy5pbmRleE9mKHRva2VuKTtcblx0XHRcdFx0aWYgKGogKyAxKSB7XG5cdFx0XHRcdFx0aiArPSB0b2tlbi5sZW5ndGg7XG5cdFx0XHRcdFx0Ly8gVHJhbnNmZXIgdGhlIGluaXRpYWwgdG9rZW5zIHRvIGluc2VydGVkIG5vZGVzLCBieSBzZXR0aW5nIHRoZW0gYXMgdGhlIGlkcyB2YXJpYWJsZSwgcGlja2VkIHVwIGluIGNvbnZlcnRNYXJrZXJzXG5cdFx0XHRcdFx0cHJldklkcyA9IGlkcyA9IHRva2Vucy5zbGljZSgwLCBqKTtcblx0XHRcdFx0XHR0b2tlbnMgPSB0b2tlbnMuc2xpY2Uoaik7XG5cdFx0XHRcdFx0aWYgKG5leHRWaWV3KSB7XG5cdFx0XHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnROb2RlLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vPT09PT09PT09PT09PT09PSBDb252ZXJ0IHRoZSBtYXJrZXJzIHRvIERPTSBhbm5vdGF0aW9ucywgYmFzZWQgb24gY29udGVudCBtb2RlbC4gPT09PT09PT09PT09PT09PVxuLy9cdFx0XHRvbGRFbENudCA9IGVsQ250O1xuXHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRodG1sID0gKFwiXCIgKyBodG1sKS5yZXBsYWNlKHJDb252ZXJ0TWFya2VycywgY29udmVydE1hcmtlcnMpO1xuLy9cdFx0XHRpZiAoISFvbGRFbENudCAhPT0gISFlbENudCkge1xuLy9cdFx0XHRcdGVycm9yKFwiUGFyc2U6IFwiICsgaHRtbCk7IC8vIFBhcnNlIGVycm9yLiBDb250ZW50IG5vdCB3ZWxsLWZvcm1lZD9cbi8vXHRcdFx0fVxuXHRcdGlmICh2YWxpZGF0ZSAmJiB0YWdTdGFjay5sZW5ndGgpIHtcblx0XHRcdHN5bnRheEVycm9yKFwiTWlzbWF0Y2hlZCAnPFwiICsgcGFyZW50VGFnICsgXCIuLi4+JyBpbjpcXG5cIiArIGh0bWwpOyAvLyBVbm1hdGNoZWQgdGFnXG5cdFx0fVxuXHRcdGlmICh2YWxpZGF0ZU9ubHkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gQXBwZW5kIHdyYXBwZXIgZWxlbWVudCB0byBkb2MgZnJhZ21lbnRcblx0XHRzYWZlRnJhZ21lbnQuYXBwZW5kQ2hpbGQoZGl2KTtcblxuXHRcdC8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnNcblx0XHQvLyBDb3JyZXNwb25kcyB0byBqUXVlcnkgJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIG9yICQocGFyZW50Tm9kZSkuaHRtbChodG1sKTtcblx0XHQvLyBidXQgc3VwcG9ydHMgc3ZnIGVsZW1lbnRzLCBhbmQgb3RoZXIgZmVhdHVyZXMgbWlzc2luZyBmcm9tIGpRdWVyeSB2ZXJzaW9uIChhbmQgdGhpcyB2ZXJzaW9uIHNob3VsZCBhbHNvIGJlIHNsaWdodGx5IGZhc3Rlcilcblx0XHRodG1sVGFnID0gd3JhcE1hcFtodG1sVGFnXSB8fCB3cmFwTWFwLmRpdjtcblx0XHRkZXB0aCA9IGh0bWxUYWdbMF07XG5cdFx0d3JhcHBlci5pbm5lckhUTUwgPSBodG1sVGFnWzFdICsgaHRtbCArIGh0bWxUYWdbMl07XG5cdFx0d2hpbGUgKGRlcHRoLS0pIHtcblx0XHRcdHdyYXBwZXIgPSB3cmFwcGVyLmxhc3RDaGlsZDtcblx0XHR9XG5cdFx0c2FmZUZyYWdtZW50LnJlbW92ZUNoaWxkKGRpdik7XG5cdFx0ZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0d2hpbGUgKGNvcGllZE5vZGUgPSB3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcblx0XHRcdGZyYWdtZW50LmFwcGVuZENoaWxkKGNvcGllZE5vZGUpO1xuXHRcdH1cblx0XHQvLyBJbnNlcnQgaW50byB0aGUgRE9NXG5cdFx0cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIG5leHROb2RlKTtcblx0fVxuXG5cdGlmIChsYXp5TGluaykge1xuXHRcdHNldFRpbWVvdXQoZGF0YUxpbmssIDApO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGFMaW5rKCk7XG5cdH1cblxuXHRyZXR1cm4gbGF6eUxpbmsgJiYgbGF6eUxpbmsucHJvbWlzZSgpO1xufVxuXG5mdW5jdGlvbiBhZGREYXRhQmluZGluZyhsaW5rTWFya3VwLCBub2RlLCBjdXJyZW50VmlldywgYm91bmRUYWdJZCwgaXNMaW5rLCBkYXRhLCBjb250ZXh0KSB7XG5cdC8vIEFkZCBkYXRhIGJpbmRpbmcgZm9yIGRhdGEtbGlua2VkIGVsZW1lbnRzIG9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZ3Ncblx0dmFyIHRtcGwsIHRva2VucywgYXR0ciwgY29udmVydEJhY2ssIHRhZ0V4cHIsIGxpbmtGbiwgbGlua0N0eCwgdGFnLCByVGFnSW5kZXgsIGhhc0Vsc2UsIGxhc3RJbmRleCxcblx0XHRsaW5rRXhwcmVzc2lvbnMgPSBbXTtcblxuXHRpZiAoYm91bmRUYWdJZCkge1xuXHRcdC8vIGJvdW5kVGFnSWQgaXMgYSBzdHJpbmcgZm9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZy4gU28gb25seSBvbmUgbGlua1RhZyBpbiBsaW5rTWFya3VwXG5cdFx0Ly8gZGF0YSBhbmQgY29udGV4dCBwYXJhbWV0ZXJzIGFyZSB1bmRlZmluZWRcblx0XHR0YWcgPSBiaW5kaW5nU3RvcmVbYm91bmRUYWdJZF07XG5cdFx0dGFnID0gdGFnLmxpbmtDdHggPyB0YWcubGlua0N0eC50YWcgOiB0YWc7XG5cblx0XHRsaW5rQ3R4ID0gdGFnLmxpbmtDdHggfHwge1xuXHRcdFx0dHlwZTogXCJpbmxpbmVcIixcblx0XHRcdGRhdGE6IGN1cnJlbnRWaWV3LmRhdGEsICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZVxuXHRcdFx0ZWxlbTogdGFnLl9lbENudCA/IHRhZy5wYXJlbnRFbGVtIDogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHR2aWV3OiBjdXJyZW50Vmlldyxcblx0XHRcdGN0eDogY3VycmVudFZpZXcuY3R4LFxuXHRcdFx0YXR0cjogSFRNTCwgLy8gU2NyaXB0IG1hcmtlciBub2RlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHteeyBhbmQgYWx3YXlzIHRhcmdldCBIVE1MLlxuXHRcdFx0Zm46IHRhZy5fLmJuZCxcblx0XHRcdHRhZzogdGFnLFxuXHRcdFx0Ly8gUGFzcyB0aGUgYm91bmRUYWdJZCBpbiB0aGUgbGlua0N0eCwgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGluIG9ic2VydmVBbmRCaW5kXG5cdFx0XHRfYm5kSWQ6IGJvdW5kVGFnSWRcblx0XHR9O1xuXHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rQ3R4LmZuKTtcblx0fSBlbHNlIGlmIChsaW5rTWFya3VwICYmIG5vZGUpIHtcblx0XHQvLyBJZiBpc0xpbmsgdGhlbiB0aGlzIGlzIGEgdG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb24sIHRhcmdldCwgZGF0YSwgLi4uLikgb3Jcblx0XHQvLyAubGluayh0cnVlLCB0YXJnZXQsIGRhdGEsIC4uLi4pIHNjZW5hcmlvIC0gYW5kIGRhdGEgYW5kIGNvbnRleHQgYXJlIHBhc3NlZCBpbiBzZXBhcmF0ZWx5IGZyb20gdGhlIHZpZXdcblx0XHRkYXRhID0gaXNMaW5rID8gZGF0YSA6IGN1cnJlbnRWaWV3LmRhdGE7XG5cblx0XHQvLyBDb21waWxlZCBsaW5rRm4gZXhwcmVzc2lvbnMgY291bGQgYmUgc3RvcmVkIGluIHRoZSB0bXBsLmxpbmtzIGFycmF5IG9mIHRoZSB0ZW1wbGF0ZVxuXHRcdC8vIFRPRE8gLSBjb25zaWRlciBhbHNvIGNhY2hpbmcgZ2xvYmFsbHkgc28gdGhhdCBpZiB7ezpmb299fSBvciBkYXRhLWxpbms9XCJmb29cIiBvY2N1cnMgaW4gZGlmZmVyZW50IHBsYWNlcyxcblx0XHQvLyB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZm9yIHRoaXMgaXMgY2FjaGVkIGFuZCBvbmx5IGNvbXBpbGVkIG9uY2UuLi5cblx0XHQvL2xpbmtzID0gY3VycmVudFZpZXcubGlua3MgfHwgY3VycmVudFZpZXcudG1wbC5saW5rcztcblxuXHRcdHRtcGwgPSBjdXJyZW50Vmlldy50bXBsO1xuXG4vL1x0XHRcdGlmICghKGxpbmtUYWdzID0gbGlua3NbbGlua01hcmt1cF0pKSB7XG5cdFx0Ly8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGlzIHZpZXcgdGVtcGxhdGUgaGFzIGJlZW4gbGlua2VkLCBzbyB3ZSBjb21waWxlIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSB0ZW1wbGF0ZS5cblxuXHRcdGxpbmtNYXJrdXAgPSBub3JtYWxpemVMaW5rVGFnKGxpbmtNYXJrdXAsIGRlZmF1bHRBdHRyKG5vZGUpKTtcblx0XHRsYXN0SW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4ID0gMDtcblx0XHR3aGlsZSAodG9rZW5zID0gclRhZ0RhdGFsaW5rLmV4ZWMobGlua01hcmt1cCkpIHsgLy8gVE9ETyByZXF1aXJlIH0gdG8gYmUgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAkLCBhbmQgcmVtb3ZlIHRoZSBcXH0oIVxcfSkgb3B0aW9uLlxuXHRcdFx0bGlua0V4cHJlc3Npb25zLnB1c2godG9rZW5zKTtcblx0XHRcdGxhc3RJbmRleCA9IHJUYWdEYXRhbGluay5sYXN0SW5kZXg7XG5cdFx0fVxuXHRcdGlmIChsYXN0SW5kZXggPCBsaW5rTWFya3VwLmxlbmd0aCkge1xuXHRcdFx0c3ludGF4RXJyb3IobGlua01hcmt1cCk7XG5cdFx0fVxuXHRcdHdoaWxlICh0b2tlbnMgPSBsaW5rRXhwcmVzc2lvbnMuc2hpZnQoKSkge1xuXHRcdFx0Ly8gSXRlcmF0ZSBvdmVyIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGZvciBkaWZmZXJlbnQgdGFyZ2V0IGF0dHJzLFxuXHRcdFx0Ly8gZS5nLiA8aW5wdXQgZGF0YS1saW5rPVwiezpmaXJzdE5hbWU6fSB0aXRsZXs+fmRlc2NyaXB0aW9uKGZpcnN0TmFtZSwgbGFzdE5hbWUpfVwiXG5cdFx0XHQvLyB0b2tlbnM6IFthbGwsIGF0dHIsIGJpbmRPbmx5LCB0YWdFeHByLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIGNvbG9uLCBodG1sLCBjb21tZW50LCBjb2RlLCBwYXJhbXNdXG5cdFx0XHRyVGFnSW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4O1xuXHRcdFx0YXR0ciA9IHRva2Vuc1sxXTtcblx0XHRcdHRhZ0V4cHIgPSB0b2tlbnNbM107XG5cdFx0XHR3aGlsZSAobGlua0V4cHJlc3Npb25zWzBdICYmIGxpbmtFeHByZXNzaW9uc1swXVs0XSA9PT0gXCJlbHNlXCIpIHsgLy8gSWYgdGhpcyBpcyB7c29tZVRhZy4uLn0gYW5kIGlzIGZvbGxvd2VkIGJ5IGFuIHtlbHNlLi4ufSBhZGQgdG8gdGFnRXhwclxuXHRcdFx0XHR0YWdFeHByICs9IGRlbGltQ2xvc2VDaGFyMSArIGRlbGltT3BlbkNoYXIwICsgbGlua0V4cHJlc3Npb25zLnNoaWZ0KClbM107XG5cdFx0XHRcdGhhc0Vsc2UgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGhhc0Vsc2UpIHsgLy8gSWYgYW4ge2Vsc2V9IGhhcyBiZWVuIGFkZGVkLCBuZWVkIGFsc28gdG8gYWRkIGNsb3Npbmcge3svc29tZVRhZ319XG5cdFx0XHRcdHRhZ0V4cHIgKz0gZGVsaW1DbG9zZUNoYXIxICsgZGVsaW1PcGVuQ2hhcjAgKyBkZWxpbU9wZW5DaGFyMSArIFwiL1wiICsgdG9rZW5zWzRdICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eCA9IHtcblx0XHRcdFx0dHlwZTogaXNMaW5rID8gXCJ0b3BcIiA6IFwibGlua1wiLFxuXHRcdFx0XHRkYXRhOiBkYXRhLCAvLyBzb3VyY2Vcblx0XHRcdFx0ZWxlbTogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHRcdHZpZXc6IGN1cnJlbnRWaWV3LFxuXHRcdFx0XHRjdHg6IGNvbnRleHQsXG5cdFx0XHRcdGF0dHI6IGF0dHIsXG5cdFx0XHRcdGlzTGs6IGlzTGluaywgLy8gdG9wLWxldmVsIGxpbmtpbmc/XG5cdFx0XHRcdF90b0xrIDogMSwgLy8gRmxhZyB0byBkYXRhLWxpbmsgb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCByZW5kZXJpbmcgY2FsbFxuXHRcdFx0XHRfbm9VcGQgOiB0b2tlbnNbMl0gLy8gRmxhZyBmb3IgZGF0YS1saW5rPVwiXnsuLi59XCIgc28gb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCB3aWxsIGJpbmQsIGJ1dCBub3QgcmVuZGVyKVxuXHRcdFx0fTtcblxuXHRcdFx0Y29udmVydEJhY2sgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodG9rZW5zWzZdKSB7XG5cdFx0XHRcdGNvbnZlcnRCYWNrID0gdG9rZW5zWzEwXSB8fCB1bmRlZmluZWQ7XG5cdFx0XHRcdGxpbmtDdHguY29udmVydCA9IHRva2Vuc1s1XSB8fCBcIlwiO1xuXHRcdFx0XHRpZiAoIWF0dHIgJiYgY29udmVydEJhY2sgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0QXR0cihub2RlKSkge1xuXHRcdFx0XHRcdC8vIERlZmF1bHQgdGFyZ2V0LCBzbyBhbGxvdyAyIHdheSBiaW5kaW5nXG5cdFx0XHRcdFx0bGlua0N0eC5jb252ZXJ0QmFjayA9IGNvbnZlcnRCYWNrID0gY29udmVydEJhY2suc2xpY2UoMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIENvbXBpbGUgdGhlIGxpbmtGbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyBhbmQgYmluZHMgYSBkYXRhLWxpbmsgZXhwcmVzc2lvblxuXHRcdFx0Ly8gVE9ETyAtIG9wdGltaXplIGZvciB0aGUgY2FzZSBvZiBzaW1wbGUgZGF0YSBwYXRoIHdpdGggbm8gY29udmVyc2lvbiwgaGVscGVycywgZXRjLjpcblx0XHRcdC8vICAgICBpLmUuIGRhdGEtbGluaz1cImEuYi5jXCIuIEF2b2lkIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgb2YgRnVuY3Rpb24gZXZlcnkgdGltZS4gQ2FuIHVzZSBhIGRlZmF1bHQgZnVuY3Rpb24gZm9yIGFsbCBvZiB0aGVzZS4uLlxuXG5cdFx0XHRsaW5rQ3R4LmV4cHIgPSBhdHRyICsgdGFnRXhwcjtcblx0XHRcdGxpbmtGbiA9IHRtcGwubGlua3NbdGFnRXhwcl07XG5cdFx0XHRpZiAoIWxpbmtGbikge1xuXHRcdFx0XHR0bXBsLmxpbmtzW3RhZ0V4cHJdID0gbGlua0ZuID0gJHN1Yi50bXBsRm4odGFnRXhwciwgdG1wbCwgdHJ1ZSwgY29udmVydEJhY2ssIGhhc0Vsc2UpO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eC5mbiA9IGxpbmtGbjtcblx0XHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pO1xuXHRcdFx0Ly8gV2Ugc3RvcmUgclRhZ0luZGV4IGluIGxvY2FsIHNjb3BlLCBzaW5jZSB0aGlzIGFkZERhdGFCaW5kaW5nIG1ldGhvZCBjYW4gc29tZXRpbWVzIGJlIGNhbGxlZCByZWN1cnNpdmVseSxcblx0XHRcdC8vIGFuZCBlYWNoIGlzIHVzaW5nIHRoZSBzYW1lIHJUYWdEYXRhbGluayBpbnN0YW5jZS5cblx0XHRcdHJUYWdEYXRhbGluay5sYXN0SW5kZXggPSByVGFnSW5kZXg7XG5cdFx0fVxuLy9cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pIHtcblx0Ly8gQWRkIGRhdGEgbGluayBiaW5kaW5ncyBmb3IgYSBsaW5rIGV4cHJlc3Npb24gaW4gZGF0YS1saW5rIGF0dHJpYnV0ZSBtYXJrdXBcblx0ZnVuY3Rpb24gaGFuZGxlcihldiwgZXZlbnRBcmdzKSB7XG5cdFx0cHJvcGVydHlDaGFuZ2VIYW5kbGVyLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncywgbGlua0ZuKTtcblx0XHQvLyBJZiB0aGUgbGluayBleHByZXNzaW9uIHVzZXMgYSBjdXN0b20gdGFnLCB0aGUgcHJvcGVydHlDaGFuZ2VIYW5kbGVyIGNhbGwgd2lsbCBjYWxsIHJlbmRlclRhZywgd2hpY2ggd2lsbCBzZXQgdGFnQ3R4IG9uIGxpbmtDdHhcblx0fVxuXHRoYW5kbGVyLm5vQXJyYXkgPSB0cnVlO1xuXHRpZiAobGlua0N0eC5pc0xrKSB7XG5cdFx0Ly8gVG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb25PclRydWUsIGRhdGEsIGNvbnRleHQpIC0gc28gd2UgbmVlZCB0byBjcmVhdGUgYSB2aWV3IGZvciB0aGUgbGlua2luZywgd2l0aCB0aGUgZGF0YSBhbmQgY3R4XG5cdFx0Ly8gd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIHRhcmdldC4gTm90ZSB0aGF0IHRoaXMgdmlldyBpcyBub3QgYSBzdGFuZGFyZCBkYXRhLWxpbmtlZCB2aWV3LCBzbyBpdCB3aWxsXG5cdFx0Ly8gYmUgZGlzcG9zZWQgb25seSB3aGVuIGl0cyBwYXJlbnQgdmlldyBpcyBkaXNwb3NlZC5cblx0XHRhZGRMaW5rTWV0aG9kcyhsaW5rQ3R4LnZpZXcgPSBuZXcgJHN1Yi5WaWV3KFxuXHRcdFx0JHN1Yi5leHRlbmRDdHgobGlua0N0eC5jdHgsIGxpbmtDdHgudmlldy5jdHgpLFxuXHRcdFx0XCJsaW5rXCIsIGxpbmtDdHgudmlldywgbGlua0N0eC5kYXRhLCBsaW5rQ3R4LmV4cHIsIHVuZGVmaW5lZCwgYWRkQmluZGluZ01hcmtlcnMpKTtcblx0fVxuXHRsaW5rQ3R4Ll9jdHhDYiA9ICRzdWIuX2djY2IobGlua0N0eC52aWV3KTsgLy8gZ2V0Q29udGV4dENhbGxiYWNrOiBfY3R4Q2IsIGZvciBmaWx0ZXJpbmcvYXBwZW5kaW5nIHRvIGRlcGVuZGVuY3kgcGF0aHM6IGZ1bmN0aW9uKHBhdGgsIG9iamVjdCkgeyByZXR1cm4gWyhvYmplY3R8cGF0aCkqXX1cblx0bGlua0N0eC5faGRsID0gaGFuZGxlcjtcblx0Ly8gaGFuZGxlci5fY3R4ID0gbGlua0N0eDsgQ291bGQgcGFzcyBsaW5rQ3R4IGZvciB1c2UgaW4gYSBkZXBlbmRzID0gZnVuY3Rpb24oKSB7fSBjYWxsLCBzbyBkZXBlbmRzIGlzIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGxpbmtDdHgnc1xuXHRoYW5kbGVyKHRydWUpO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PVxuLy8gRGF0YS1saW5raW5nIGhlbHBlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlbW92ZVN1YlN0cihzdHIsIHN1YnN0cikge1xuXHR2YXIgaztcblx0cmV0dXJuIHN0clxuXHRcdD8gKGsgPSBzdHIuaW5kZXhPZihzdWJzdHIpLFxuXHRcdFx0KGsgKyAxXG5cdFx0XHRcdD8gc3RyLnNsaWNlKDAsIGspICsgc3RyLnNsaWNlKGsgKyBzdWJzdHIubGVuZ3RoKVxuXHRcdFx0XHQ6IHN0cikpXG5cdFx0OiBcIlwiO1xufVxuXG5mdW5jdGlvbiBtYXJrZXJOb2RlSW5mbyhub2RlKSB7XG5cdHJldHVybiBub2RlICYmXG5cdFx0KFwiXCIgKyBub2RlID09PSBub2RlXG5cdFx0XHQ/IG5vZGVcblx0XHRcdDogbm9kZS50YWdOYW1lID09PSBTQ1JJUFRcblx0XHRcdFx0PyBub2RlLnR5cGUuc2xpY2UoMylcblx0XHRcdFx0OiBub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpIHx8IFwiXCIpO1xufVxuXG5mdW5jdGlvbiB2aWV3SW5mb3Mobm9kZSwgaXNWYWwsIHJCaW5kaW5nKSB7XG5cdC8vIFRlc3Qgd2hldGhlciBub2RlIGlzIGEgc2NyaXB0IG1hcmtlciBub2RlLCBhbmQgaWYgc28sIHJldHVybiBtZXRhZGF0YVxuXHRmdW5jdGlvbiBnZXRJbmZvcyhhbGwsIG9wZW4sIGNsb3NlLCBpZCwgY2gsIGVsUGF0aCkge1xuXHRcdGluZm9zLnB1c2goe1xuXHRcdFx0ZWxDbnQ6IGVsQ250LFxuXHRcdFx0aWQ6IGlkLFxuXHRcdFx0Y2g6IGNoLFxuXHRcdFx0b3Blbjogb3Blbixcblx0XHRcdGNsb3NlOiBjbG9zZSxcblx0XHRcdHBhdGg6IGVsUGF0aCxcblx0XHRcdHRva2VuOiBhbGxcblx0XHR9KTtcblx0fVxuXHR2YXIgZWxDbnQsIHRva2Vucyxcblx0XHRpbmZvcyA9IFtdO1xuXHRpZiAodG9rZW5zID0gaXNWYWwgPyBub2RlIDogbWFya2VyTm9kZUluZm8obm9kZSkpIHtcblx0XHRlbENudCA9IGluZm9zLmVsQ250ID0gbm9kZS50YWdOYW1lICE9PSBTQ1JJUFQ7XG5cdFx0ZWxDbnQgPSB0b2tlbnMuY2hhckF0KDApID09PSBcIkBcIiB8fCBlbENudDtcblx0XHRpbmZvcy5fdGtucyA9IHRva2Vucztcblx0XHQvLyByTWFya2VyVG9rZW5zID0gLyg/OigjKXwoXFwvKSkoXFxkKykoW19eXSkoWy0rQFxcZF0rKT8vZztcblx0XHR0b2tlbnMucmVwbGFjZShyQmluZGluZyB8fCByTWFya2VyVG9rZW5zLCBnZXRJbmZvcyk7XG5cdFx0cmV0dXJuIGluZm9zO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVubWFya1ByZXZPck5leHROb2RlKG5vZGUsIGVsQ250KSB7XG5cdGlmIChub2RlKSB7XG5cdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJqc3ZcIikge1xuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdH0gZWxzZSBpZiAoZWxDbnQgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpID09PSBcIlwiKSB7XG5cdFx0XHRub2RlLnJlbW92ZUF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cik7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIG1hcmtQcmV2T3JOZXh0Tm9kZShub2RlLCBlbENudCkge1xuXHR2YXIgbWFya2VyID0gbm9kZTtcblx0d2hpbGUgKGVsQ250ICYmIG1hcmtlciAmJiBtYXJrZXIubm9kZVR5cGUgIT09IDEpIHtcblx0XHRtYXJrZXIgPSBtYXJrZXIucHJldmlvdXNTaWJsaW5nO1xuXHR9XG5cdGlmIChtYXJrZXIpIHtcblx0XHRpZiAobWFya2VyLm5vZGVUeXBlICE9PSAxKSB7XG5cdFx0XHQvLyBGb3IgdGV4dCBub2Rlcywgd2Ugd2lsbCBhZGQgYSBzY3JpcHQgbm9kZSBiZWZvcmVcblx0XHRcdG1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoU0NSSVBUKTtcblx0XHRcdG1hcmtlci50eXBlID0gXCJqc3ZcIjtcblx0XHRcdG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFya2VyLCBub2RlKTtcblx0XHR9IGVsc2UgaWYgKCFtYXJrZXJOb2RlSW5mbyhtYXJrZXIpICYmICFtYXJrZXIuZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0Ly8gRm9yIGVsZW1lbnQgbm9kZXMsIHdlIHdpbGwgYWRkIGEgZGF0YS1saW5rIGF0dHJpYnV0ZSAodW5sZXNzIHRoZXJlIGlzIGFscmVhZHkgb25lKVxuXHRcdFx0Ly8gc28gdGhhdCB0aGlzIG5vZGUgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgbm9kZSBsaW5raW5nIHByb2Nlc3MuXG5cdFx0XHRtYXJrZXIuc2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyLCBcIlwiKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1hcmtlcjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGlua1RhZyhsaW5rTWFya3VwLCB0d293YXkpIHtcblx0bGlua01hcmt1cCA9ICQudHJpbShsaW5rTWFya3VwKS5yZXBsYWNlKHJFc2NhcGVRdW90ZXMsIFwiXFxcXCQmXCIpO1xuXHRyZXR1cm4gbGlua01hcmt1cC5zbGljZSgtMSkgIT09IGRlbGltQ2xvc2VDaGFyMFxuXHQvLyBJZiBzaW1wbGlmaWVkIHN5bnRheCBpcyB1c2VkOiBkYXRhLWxpbms9XCJleHByZXNzaW9uXCIsIGNvbnZlcnQgdG8gZGF0YS1saW5rPVwiezpleHByZXNzaW9ufVwiLFxuXHQvLyBvciBmb3IgaW5wdXRzLCBkYXRhLWxpbms9XCJ7OmV4cHJlc3Npb246fVwiIGZvciAoZGVmYXVsdCkgdHdvLXdheSBiaW5kaW5nXG5cdFx0PyBsaW5rTWFya3VwID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGxpbmtNYXJrdXAgKyAodHdvd2F5ID8gXCI6XCIgOiBcIlwiKSArIGRlbGltQ2xvc2VDaGFyMFxuXHRcdDogbGlua01hcmt1cDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1ldGhvZHMgZm9yIHZpZXdzIGFuZCB0YWdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncykge1xuXHR2YXIgbGlua2VkRWxlbSwgZGlzcGxheUVsZW0sIGxpbmtlZEVsLCB2YWwsIGwsIGxpbmtlZFRhZywgb2xkVHJpZywgbmV3VHJpZywgdGFnUHJvcHMsIHByb3BzRXhwciwgbGlua2VkRWxlbVZpZXcsIHByb3AsIHByb3BEZWYsXG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eCxcblx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0cHJvcHMgPSB0YWdDdHgucHJvcHMsXG5cdFx0bGlua0N0eCA9IHRhZy5saW5rQ3R4O1xuXG5cdGlmICh0YWcuXy51bmxpbmtlZCkgeyAvLyBGaXJzdCBjYWxsIHRvIG9uQWZ0ZXJMaW5rLCBvciBmaXJzdCBjYWxsIGFmdGVyIG9uVXBkYXRlOiB1cGRhdGVDb250ZW50LiBJbml0aWFsaXplIGFuZCBjYWxsIG9uQmluZCBhbmQgc2V0IHByb3BlcnRpZXNcblx0XHRpZiAodGFnLmxpbmtlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gbGlua2VkRWxlbWVudDogLSBzZWxlY3RvciBmb3IgaWRlbnRpZnlpbmcgbGlua2VkIGVsZW1lbnQgaW4gdGVtcGxhdGUvcmVuZGVyZWQgY29udGVudFxuXHRcdFx0dGFnLmxpbmtlZEVsZW0gPSB0YWcuXy5pbmxpbmUgPyB0YWcuY29udGVudHModHJ1ZSwgdGFnLmxpbmtlZEVsZW1lbnQgfHwgXCIqXCIpLmZpcnN0KCkgOiAkKGxpbmtDdHguZWxlbSk7XG5cdFx0fVxuXHRcdGlmICh0YWcub25CaW5kKSB7XG5cdFx0XHR0YWcub25CaW5kKHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHRhZy5vbkFmdGVyTGluaykge1xuXHRcdHRhZy5vbkFmdGVyTGluayh0YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIGV2LCBldmVudEFyZ3MpO1xuXHR9XG5cblx0bGlua2VkRWxlbSA9IHRhZy50YXJnZXRUYWcgPyB0YWcudGFyZ2V0VGFnLmxpbmtlZEVsZW0gOiB0YWcubGlua2VkRWxlbTtcblx0ZGlzcGxheUVsZW0gPSB0YWcuZGlzcGxheUVsZW0gfHwgbGlua2VkRWxlbTtcblxuXHRpZiAobGlua2VkRWxlbSAmJiBsaW5rZWRFbGVtWzBdKSB7XG5cdFx0dmFsID0gdGFnLmN2dEFyZ3MoKVswXTtcblx0XHRpZiAodmFsICE9PSB1bmRlZmluZWQgJiYgIXRhZy5fLmNoZ2luZykge1xuXHRcdFx0bCA9IGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRsaW5rZWRFbCA9IGxpbmtlZEVsZW1bbF07XG5cdFx0XHRcdGlmICh0YWcuXy51bmxpbmtlZCAmJiBsaW5rZWRFbCAhPT0gbGlua0N0eC5lbGVtKSB7XG5cdFx0XHRcdFx0bGlua2VkVGFnID0gbGlua2VkRWwuX2pzdkxrRWw7XG5cdFx0XHRcdFx0aWYgKHRhZy5fLmlubGluZSAmJiAoIWxpbmtlZFRhZyB8fCBsaW5rZWRUYWcgIT09IHRhZyAmJiBsaW5rZWRUYWcudGFyZ2V0VGFnICE9PSB0YWcpKSB7XG5cdFx0XHRcdFx0XHQvLyBGb3IgZGF0YS1saW5rZWQgdGFncywgaWRlbnRpZnkgdGhlIGxpbmtlZEVsIHdpdGggdGhlIHRhZywgZm9yIFwidG9cIiBiaW5kaW5nXG5cdFx0XHRcdFx0XHQvLyAoRm9yIGRhdGEtbGlua2VkIGVsZW1lbnRzLCBpZiBub3QgeWV0IGJvdW5kLCB3ZSBpZGVudGlmeSBsYXRlciB3aGVuIHRoZSBsaW5rQ3R4LmVsZW0gaXMgYm91bmQpXG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5fanN2TGtFbCA9IHRhZztcblx0XHRcdFx0XHRcdGJpbmRUbyhiaW5kaW5nU3RvcmVbdGFnLl90Z0lkXSwgdGFnLCBsaW5rZWRFbCk7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5fanN2Qm5kID0gXCImXCIgKyB0YWcuX3RnSWQgKyBcIitcIjsgLy8gQWRkIGEgXCIrXCIgZm9yIGNsb25lZCBiaW5kaW5nIC0gc28gcmVtb3Zpbmdcblx0XHRcdFx0XHRcdC8vIGVsZW1zIHdpdGggY2xvbmVkIGJpbmRpbmdzIHdpbGwgbm90IHJlbW92ZSB0aGUgJ3BhcmVudCcgYmluZGluZyBmcm9tIHRoZSBiaW5kaW5nU3RvcmUuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChsaW5rZWRFbC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRpZiAobGlua2VkRWwudHlwZSA9PT0gQ0hFQ0tCT1gpIHtcblx0XHRcdFx0XHRcdFx0bGlua2VkRWxbQ0hFQ0tFRF0gPSB2YWwgJiYgdmFsICE9PSBcImZhbHNlXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpbmtlZEVsLnR5cGUgPT09IFJBRElPKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVsW0NIRUNLRURdID0gKGxpbmtlZEVsLnZhbHVlID09PSB2YWwpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0JChsaW5rZWRFbCkudmFsKHZhbCk7IC8vIFVzZSBqUXVlcnkgZm9yIGF0dHJIb29rcyAtIGNhbid0IGp1c3Qgc2V0IHZhbHVlIChvbiBzZWxlY3QsIGZvciBleGFtcGxlKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAobGlua2VkRWwuY29udGVudEVkaXRhYmxlID09PSBUUlVFKSB7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5pbm5lckhUTUwgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxpbmtDdHguX3ZhbCA9IHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvcHMubmFtZSkge1xuXHRcdFx0XHRcdGxpbmtlZEVsLm5hbWUgPSBsaW5rZWRFbC5uYW1lIHx8IHByb3BzLm5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRhZy5zZXRTaXplKSB7XG5cdFx0XHRpZiAocHJvcHMuaGVpZ2h0KSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLmhlaWdodChwcm9wcy5oZWlnaHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BzLndpZHRoKSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLndpZHRoKHByb3BzLndpZHRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHByb3BzLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGRpc3BsYXlFbGVtLmF0dHIoXCJ0aXRsZVwiLCBwcm9wcy50aXRsZSk7XG5cdFx0fVxuXHRcdGlmIChwcm9wc1tcImNsYXNzXCJdKSB7XG5cdFx0XHQvLyBUaGlzIGNvZGUgc3VwcG9ydHMgZHluYW1pYyBiaW5kaW5nIHRvIGNsYXNzIC0gd2hlcmUgaXQgYWRkcyB0aGUgY2xhc3MgaWYgYWJzZW50LCBhbmQgcmVtb3Zlcy9hZGRzIGlmIGEgcHJldmlvdXMgdmFsdWUgaXMgcHJlc2VudFxuXHRcdFx0aWYgKGV2ZW50QXJncyAmJiBkaXNwbGF5RWxlbS5oYXNDbGFzcyhldmVudEFyZ3Mub2xkVmFsdWUpKSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLnJlbW92ZUNsYXNzKGV2ZW50QXJncy5vbGRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRkaXNwbGF5RWxlbS5hZGRDbGFzcyhwcm9wc1tcImNsYXNzXCJdKTtcblx0XHR9XG5cdFx0aWYgKHByb3BzLmlkKSB7XG5cdFx0XHRsaW5rZWRFbGVtWzBdLmlkID0gcHJvcHMuaWQ7XG5cdFx0fVxuXHR9XG5cdHRhZy5fLnVubGlua2VkID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc3luY0VsZW1DaGFuZ2VIYW5kbGVyKGV2KSB7XG5cdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0ZWxlbUNoYW5nZUhhbmRsZXIoZXYpO1xuXHR9LCAwKTtcbn1cblxuZnVuY3Rpb24gYmluZEVsQ2hhbmdlKCRlbGVtLCB0cmlnLCBvbm9mZikge1xuXHRpZiAodHJpZykge1xuXHRcdHRyaWcgPSBcIlwiICsgdHJpZyA9PT0gdHJpZyA/IHRyaWcgOiBcImtleWRvd25cIjsgLy8gU2V0IHRyaWdnZXIgdG8gKHRydWUgfHwgdHJ1ZXkgbm9uLXN0cmluZyAoZS5nLiAxKSB8fCAna2V5ZG93bicpOiBHZXQgJ2tleWRvd24nIHdpdGggYXN5bmNcblx0XHQkZWxlbVtvbm9mZl0odHJpZywgdHJpZyA9PT0gXCJrZXlkb3duXCIgPyBhc3luY0VsZW1DaGFuZ2VIYW5kbGVyIDogZWxlbUNoYW5nZUhhbmRsZXIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGJpbmRUbyhiaW5kaW5nLCB0YWcsIGxpbmtlZEVsZW0sIGN2dEJrKSB7XG5cdC8vIFR3by13YXkgYmluZGluZy5cblx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nLnRvWzFdIHRvIGJlIHRoZSBjdnRCYWNrLCBhbmQgYmluZGluZy50b1swXSB0byBiZSBlaXRoZXIgdGhlIHBhdGggdG8gdGhlIHRhcmdldCwgb3IgW29iamVjdCwgcGF0aF0gd2hlcmUgdGhlIHRhcmdldCBpcyB0aGUgcGF0aCBvbiB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuXHQvLyBTbyBmb3IgYSBjb21wdXRlZCBwYXRoIHdpdGggYW4gb2JqZWN0IGNhbGw6IGEuYi5nZXRPYmplY3QoKS5kLmUsIHRoZW4gd2Ugc2V0IHRvWzBdIHRvIGJlIFtleHByT2IsIFwiZC5lXCJdLCBhbmQgd2UgYmluZCB0byB0aGUgcGF0aCBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LCBleHByT2Iub2IsIGFzIHRhcmdldFxuXHQvLyBPdGhlcndpc2Ugb3VyIHRhcmdldCBpcyB0aGUgZmlyc3QgcGF0aCwgcGF0aHNbMF0sIHdoaWNoIHdlIHdpbGwgY29udmVydCB3aXRoIGNvbnRleHRDYigpIGZvciBwYXRocyBsaWtlIH5hLmIuYyBvciAjeC55LnpcblxuXHR2YXIgYmluZHRvLCBwYXRoSW5kZXgsIHBhdGgsIGxhc3RQYXRoLCBiaW5kdG9PYiwgJGxpbmtlZEVsZW0sIG5ld1RyaWcsIG9sZFRyaWcsIHRvLCBsLFxuXHRcdGxpbmtDdHggPSBiaW5kaW5nLmxpbmtDdHgsXG5cdFx0Y29udGV4dENiID0gbGlua0N0eC5fY3R4Q2IsXG5cdFx0c291cmNlID0gbGlua0N0eC5kYXRhLFxuXHRcdHBhdGhzID0gbGlua0N0eC5mbi5wYXRoc1swXTtcblxuXHR0YWcgPSB0YWcgfHwgbGlua2VkRWxlbS5fanN2TGtFbDtcblxuXHRpZiAoYmluZGluZyAmJiBwYXRocyAmJiAhYmluZGluZy50bykge1xuXHRcdG9sZFRyaWcgPSBsaW5rZWRFbGVtLl9qc3ZUciB8fCBmYWxzZTtcblx0XHRpZiAodGFnKSB7XG5cdFx0XHRjdnRCayA9IHRhZy5jb252ZXJ0QmFjayB8fCBjdnRCaztcblx0XHRcdG5ld1RyaWcgPSB0YWcudGFnQ3R4LnByb3BzLnRyaWdnZXI7XG5cdFx0fVxuXHRcdG5ld1RyaWcgPSBuZXdUcmlnID09PSB1bmRlZmluZWQgPyAkc3ViU2V0dGluZ3MudHJpZ2dlciA6IG5ld1RyaWc7XG5cdFx0Ly8gVHJpZ2dlciBpcyBub29wIGV4Y2VwdCBmb3IgdGV4dCBib3gsIHRleHRhcmVhLCBjb250ZW50ZWRpdGFibGUuLi5cblx0XHRuZXdUcmlnID0gbmV3VHJpZyAmJiAobGlua2VkRWxlbS50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgbGlua2VkRWxlbS50eXBlICE9PSBDSEVDS0JPWCAmJiBsaW5rZWRFbGVtLnR5cGUgIT09IFJBRElPIHx8IGxpbmtlZEVsZW0udHlwZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IGxpbmtlZEVsZW0uY29udGVudEVkaXRhYmxlID09PSBUUlVFKSAmJiBuZXdUcmlnIHx8IGZhbHNlO1xuXG5cdFx0aWYgKG9sZFRyaWcgIT09IG5ld1RyaWcpIHtcblx0XHRcdCRsaW5rZWRFbGVtID0gJChsaW5rZWRFbGVtKTtcblx0XHRcdGJpbmRFbENoYW5nZSgkbGlua2VkRWxlbSwgb2xkVHJpZywgXCJvZmZcIik7XG5cdFx0XHRiaW5kRWxDaGFuZ2UoXG5cdFx0XHRcdCRsaW5rZWRFbGVtLFxuXHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZUciA9IG5ld1RyaWcsXG5cdFx0XHRcdFwib25cIlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRwYXRocyA9IChiaW5kdG8gPSBwYXRocy5fanN2dG8pIHx8IHBhdGhzWzBdO1xuXHRcdGlmIChwYXRoSW5kZXggPSBwYXRocyAmJiBwYXRocy5sZW5ndGgpIHtcblx0XHRcdGxhc3RQYXRoID0gcGF0aHNbcGF0aEluZGV4IC0gMV07XG5cdFx0XHRpZiAobGFzdFBhdGguX2pzdikge1xuXHRcdFx0XHRiaW5kdG9PYiA9IGxhc3RQYXRoO1xuXHRcdFx0XHR3aGlsZSAobGFzdFBhdGguc2IgJiYgbGFzdFBhdGguc2IuX2pzdikge1xuXHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aCA9IGxhc3RQYXRoLnNiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGggPSBsYXN0UGF0aC5zYiB8fCBwYXRoICYmIHBhdGgucGF0aDtcblx0XHRcdFx0bGFzdFBhdGggPSBwYXRoID8gcGF0aC5zbGljZSgxKSA6IGJpbmR0b09iLnBhdGg7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHR0byA9IFtcblx0XHRcdFx0XHRcdGJpbmR0b09iLCAvLyAnZXhwck9iJyBmb3IgdGhpcyBleHByZXNzaW9uIGFuZCB2aWV3LWJpbmRpbmcuIFNvIGJpbmR0b09iLm9iIGlzIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IGV4cHJlc3Npb24uXG5cdFx0XHRcdFx0XHRsYXN0UGF0aFxuXHRcdFx0XHRcdF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoKHRvID0gY29udGV4dENiKHBhdGggPSBsYXN0UGF0aC5zcGxpdChcIl5cIikuam9pbihcIi5cIiksIHNvdXJjZSkpICYmIChsID0gdG8ubGVuZ3RoKSkge1xuXHRcdFx0XHRcdC8vIFJlY3Vyc2l2ZWx5IGRlcmVmZXJlbmNlIGFueSB+Zm9vIG9yICNiYXIgdG9rZW5zIGluIHRoZSBwYXRoLiAoUmVjdXJzaXZlIGJlY2F1c2UgfmZvbyBtYXkgYmUgYSBjb250ZXh0dWFsIHBhcmFtIHdoaWNoIGhhc1xuXHRcdFx0XHRcdC8vIGl0cyBvd24gZGVwZW5kZW5jaWVzIG9uIG90aGVyIH5mb28gI2JhciBjb21wb25lbnRzKVxuXHRcdFx0XHRcdGlmICh0b1swXS5fY3ApIHsgLy8gVHdvLXdheSBiaW5kaW5nIHRvIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIgcmVmZXJlbmNlLCB+Zm9vIChkZWNsYXJlZCBhcyB+Zm9vPWV4cHIgb24gYSBwYXJlbnQgdGFnKVxuXHRcdFx0XHRcdFx0dG8gPSB0b1swXTsgICAgLy8gc28gJ3RvJyBpcyB0aGUgW3ZpZXcsIGV4cHJlc3Npb24vZGVwZW5kZW5jaWVzXSBmb3IgdGhlIGNvbnRleHR1YWwgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRjb250ZXh0Q2IgPSAkc3ViLl9nY2NiKHRvWzBdKTsgLy8gZ2V0Q29udGV4dENhbGxiYWNrOiBNb3ZlIGNvbnRleHRDYiB1cCB0byB2aWV3IHdoZXJlIGNvbnRleHR1YWwgcGFyYW1ldGVyIHdhcyBhc3NpZ25lZFxuXHRcdFx0XHRcdFx0bGFzdFBhdGggPSB0b1sxXTtcblx0XHRcdFx0XHRcdHRvID0gW3RvWzBdLmRhdGEsIHRvWzFdXTtcblx0XHRcdFx0XHRcdGlmIChsYXN0UGF0aC5fanN2KSB7IC8vIGNvbXB1dGVkIHZhbHVlXG5cdFx0XHRcdFx0XHRcdGJpbmR0b09iID0gbGFzdFBhdGg7XG5cdFx0XHRcdFx0XHRcdGJpbmR0b09iLmRhdGEgPSB0b1swXTtcblx0XHRcdFx0XHRcdFx0YmluZHRvT2IuX2NwQ3R4ID0gY29udGV4dENiO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAobGFzdFBhdGguc2IgJiYgbGFzdFBhdGguc2IuX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aCA9IGxhc3RQYXRoLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aC5zYiB8fCBwYXRoICYmIHBhdGgucGF0aDtcblx0XHRcdFx0XHRcdFx0bGFzdFBhdGggPSBwYXRoID8gcGF0aC5zbGljZSgxKSA6IGJpbmR0b09iLnBhdGg7XG5cdFx0XHRcdFx0XHRcdHRvID0gW1xuXHRcdFx0XHRcdFx0XHRcdGJpbmR0b09iLCAvLyAnZXhwck9iJyBmb3IgdGhpcyBleHByZXNzaW9uIGFuZCB2aWV3LWJpbmRpbmcuIFNvIGJpbmR0b09iLm9iIGlzIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IGV4cHJlc3Npb24uXG5cdFx0XHRcdFx0XHRcdFx0bGFzdFBhdGhcblx0XHRcdFx0XHRcdFx0XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgeyAvLyBUd28td2F5IGJpbmRpbmcgdG8gYSBoZWxwZXIgLSBlLmcuIH5hZGRyZXNzLnN0cmVldCwgb3IgY29tcHV0ZWQsIGUuZy4gfmZ1bGxOYW1lKCksIG9yIHZpZXcgcHJvcGVydHkgZS5nLiAjZGF0YS5mb29cblx0XHRcdFx0XHRcdHRvID0gbD4yXG5cdFx0XHRcdFx0XHRcdD8gW3RvW2wtM10sIHRvW2wtMl1dIC8vIFdpdGggcGF0aDogW29iamVjdCwgcGF0aF1cblx0XHRcdFx0XHRcdFx0OiBbdG9bbC0yXV07ICAgICAgICAgLy8gTm8gcGF0aCwgKGUuZy4gW2Z1bmN0aW9uXSBmb3IgY29tcHV0ZWQgd2l0aCBzZXR0ZXIpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNvdXJjZSA9IHRvWzBdO1xuXHRcdFx0XHRcdGxhc3RQYXRoID0gdG9bMV07XG5cdFx0XHRcdH1cblx0XHRcdFx0dG8gPSB0byB8fCBbc291cmNlLCBwYXRoXTsgLy8gVHdvIHdheSBiaW5kaW5nIHRvIGFuIG9iamVjdCAobmVpdGhlciB+Zm9vIG5vciAjYmFyKVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0byA9IFtdO1xuXHRcdH1cblx0XHRiaW5kaW5nLnRvID0gW1xuXHRcdFx0dG8sXG5cdFx0XHRjdnRCa1xuXHRcdF07XG5cdH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VDdHhzKHRhZywgbmV3Q3R4cywgcmVwbGFjZSkgeyAvLyBNZXJnZSB1cGRhdGVkIHRhZ0N0eHMgaW50byB0YWcudGFnQ3R4c1xuXHR2YXIgdGFnQ3R4LCBuZXdUYWdDdHgsXG5cdFx0dmlldyA9IHRhZy50YWdDdHgudmlldyxcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMgfHwgW3RhZy50YWdDdHhdLFxuXHRcdGwgPSB0YWdDdHhzLmxlbmd0aCxcblx0XHRyZWZyZXNoID0gIW5ld0N0eHM7XG5cblx0bmV3Q3R4cyA9IG5ld0N0eHMgfHwgdGFnLl8uYm5kLmNhbGwodmlldy50bXBsLCAodGFnLmxpbmtDdHggfHwgdmlldykuZGF0YSwgdmlldywgJHN1Yik7XG5cblx0aWYgKHJlcGxhY2UpIHtcblx0XHQvLyBSZXBsYWNlIHByZXZpb3VzIHRhZ0N0eHMgYnkgbmV3IG9uZXMsIHJhdGhlciB0aGFuIG1lcmdpbmdcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMgPSBuZXdDdHhzO1xuXHRcdHRhZy50YWdDdHggPSB0YWdDdHhzWzBdO1xuXHR9IGVsc2Uge1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdHRhZ0N0eCA9IHRhZ0N0eHNbbF07XG5cdFx0XHRuZXdUYWdDdHggPSBuZXdDdHhzW2xdO1xuXHRcdFx0JG9ic2VydmFibGUodGFnQ3R4LnByb3BzKS5zZXRQcm9wZXJ0eShuZXdUYWdDdHgucHJvcHMpO1xuXHRcdFx0JGV4dGVuZCh0YWdDdHguY3R4LCBuZXdUYWdDdHguY3R4KTsgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBjdHggdmFyaWFibGVzLCB+Zm9vLCBvYnNlcnZhYmx5LCB0byBuZXN0ZWQgdmlld3MuIFNvIGV4dGVuZCwgbm90IHNldFByb3BlcnR5Li4uXG5cdFx0XHR0YWdDdHguYXJncyA9IG5ld1RhZ0N0eC5hcmdzO1xuXHRcdFx0aWYgKHJlZnJlc2gpIHtcblx0XHRcdFx0dGFnQ3R4LnRtcGwgPSBuZXdUYWdDdHgudG1wbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0JHN1Yi5fdGhzKHRhZywgdGFnQ3R4c1swXSk7IC8vIHRhZ0hhbmRsZXJzRnJvbVByb3BzXG5cdHJldHVybiB0YWdDdHhzO1xufVxuXG4vLz09PT09PT09PVxuLy8gRGlzcG9zYWxcbi8vPT09PT09PT09XG5cbmZ1bmN0aW9uIGNsZWFuKGVsZW1zKSB7XG5cdC8vIFJlbW92ZSBkYXRhLWxpbmsgYmluZGluZ3MsIG9yIGNvbnRhaW5lZCB2aWV3c1xuXHR2YXIgbCwgZWxlbSwgYmluZGluZ3MsXG5cdFx0ZWxlbUFycmF5ID0gW10sXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGkgPSBsZW47XG5cdHdoaWxlIChpLS0pIHtcblx0XHQvLyBDb3B5IGludG8gYW4gYXJyYXksIHNvIHRoYXQgZGVsZXRpb24gb2Ygbm9kZXMgZnJvbSBET00gd2lsbCBub3QgY2F1c2Ugb3VyICdpJyBjb3VudGVyIHRvIGdldCBzaGlmdGVkXG5cdFx0Ly8gKE5vdGU6IFRoaXMgc2VlbXMgYXMgZmFzdCBvciBmYXN0ZXIgdGhhbiBlbGVtQXJyYXkgPSBbXS5zbGljZS5jYWxsKGVsZW1zKTsgLi4uKVxuXHRcdGVsZW1BcnJheS5wdXNoKGVsZW1zW2ldKTtcblx0fVxuXHRpID0gbGVuO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0ZWxlbSA9IGVsZW1BcnJheVtpXTtcblx0XHRpZiAoZWxlbS5wYXJlbnROb2RlKSB7XG5cdFx0XHQvLyBIYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTVxuXHRcdFx0aWYgKGJpbmRpbmdzID0gZWxlbS5fanN2Qm5kKSB7XG5cdFx0XHRcdC8vIEdldCBwcm9wZXJ0eUNoYW5nZSBiaW5kaW5ncyBmb3IgdGhpcyBlbGVtZW50XG5cdFx0XHRcdC8vIFRoaXMgbWF5IGJlIGFuIGVsZW1lbnQgd2l0aCBkYXRhLWxpbmssIG9yIHRoZSBvcGVuaW5nIHNjcmlwdCBtYXJrZXIgbm9kZSBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRcdFx0Ly8gYmluZGluZ3MgaXMgYSBzdHJpbmcgd2l0aCB0aGUgc3ludGF4OiBcIigmYmluZGluZ0lkKSpcIlxuXHRcdFx0XHRiaW5kaW5ncyA9IGJpbmRpbmdzLnNsaWNlKDEpLnNwbGl0KFwiJlwiKTtcblx0XHRcdFx0ZWxlbS5fanN2Qm5kID0gXCJcIjtcblx0XHRcdFx0bCA9IGJpbmRpbmdzLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdC8vIFJlbW92ZSBhc3NvY2lhdGVkIGJpbmRpbmdzXG5cdFx0XHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcoYmluZGluZ3NbbF0sIGVsZW0uX2pzdkxrRWwsIGVsZW0pOyAvLyB1bmJpbmQgYmluZGluZ3Mgd2l0aCB0aGlzIGJpbmRpbmdJZCBvbiB0aGlzIHZpZXdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGlzcG9zZVRva2VucyhtYXJrZXJOb2RlSW5mbyhlbGVtKSArIChlbGVtLl9kZiB8fCBcIlwiKSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCwgbGlua2VkRWxlbVRhZywgZWxlbSkge1xuXHQvLyBVbmJpbmRcblx0dmFyIG9iaklkLCBsaW5rQ3R4LCB0YWcsIG9iamVjdCwgb2JzSWQsIHRhZ0N0eHMsIGwsIG1hcCwgJGxpbmtlZEVsZW0sIGxpbmtlZEVsZW0sIHRyaWdnZXIsIHZpZXcsIHRhcmdldFRhZyxcblx0XHRiaW5kaW5nID0gYmluZGluZ1N0b3JlW2JpbmRJZF07XG5cblx0aWYgKGxpbmtlZEVsZW1UYWcpIHtcblx0XHRsaW5rZWRFbGVtVGFnID0gbGlua2VkRWxlbVRhZy50YXJnZXRUYWcgfHwgbGlua2VkRWxlbVRhZztcblx0XHRlbGVtLl9qc3ZMa0VsID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGJpbmRpbmcpIHtcblx0XHRkZWxldGUgYmluZGluZ1N0b3JlW2JpbmRJZF07IC8vIERlbGV0ZSBhbHJlYWR5LCBzbyBjYWxsIHRvIG9uRGlzcG9zZSBoYW5kbGVyIGJlbG93IGNhbm5vdCB0cmlnZ2VyIHJlY3Vyc2l2ZSBkZWxldGlvbiAodGhyb3VnaCByZWN1cnNpdmUgY2FsbCB0byBqUXVlcnkgY2xlYW5EYXRhKVxuXHRcdGZvciAob2JqSWQgaW4gYmluZGluZy5ibmQpIHtcblx0XHRcdG9iamVjdCA9IGJpbmRpbmcuYm5kW29iaklkXTtcblx0XHRcdG9ic0lkID0gYmluZGluZy5jYklkO1xuXHRcdFx0aWYgKCRpc0FycmF5KG9iamVjdCkpIHtcblx0XHRcdFx0JChbb2JqZWN0XSkub2ZmKGFycmF5Q2hhbmdlU3RyICsgb2JzSWQpLm9mZihwcm9wZXJ0eUNoYW5nZVN0ciArIG9ic0lkKTsgLy8gVGhlcmUgbWF5IGJlIGVpdGhlciBvciBib3RoIG9mIGFycmF5Q2hhbmdlIGFuZCBwcm9wZXJ0eUNoYW5nZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JChvYmplY3QpLm9mZihwcm9wZXJ0eUNoYW5nZVN0ciArIG9ic0lkKTtcblx0XHRcdH1cblx0XHRcdGRlbGV0ZSBiaW5kaW5nLmJuZFtvYmpJZF07XG5cdFx0fVxuXG5cdFx0aWYgKGxpbmtDdHggPSBiaW5kaW5nLmxpbmtDdHgpIHtcblx0XHRcdGlmICh0YWcgPSBsaW5rQ3R4LnRhZykge1xuXHRcdFx0XHRpZiAodGFnQ3R4cyA9IHRhZy50YWdDdHhzKSB7XG5cdFx0XHRcdFx0bCA9IHRhZ0N0eHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdGlmIChtYXAgPSB0YWdDdHhzW2xdLm1hcCkge1xuXHRcdFx0XHRcdFx0XHRtYXAudW5tYXAoKTsgLy91bm9ic2VydmVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0JGxpbmtlZEVsZW0gPSB0YWcubGlua2VkRWxlbTtcblxuXHRcdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0YWcub25EaXNwb3NlKSB7XG5cdFx0XHRcdFx0dGFnLm9uRGlzcG9zZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0YWcuX2VsQ250KSB7XG5cdFx0XHRcdFx0aWYgKHRhZy5fcHJ2KSB7XG5cdFx0XHRcdFx0XHR0YWcuX3Bydi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZy5fcHJ2KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRhZy5fbnh0KSB7XG5cdFx0XHRcdFx0XHR0YWcuX254dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZy5fbnh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxpbmtlZEVsZW0gPSAkbGlua2VkRWxlbSAmJiAkbGlua2VkRWxlbVswXSB8fCBsaW5rQ3R4LmVsZW07XG5cblx0XHRcdGlmICh0cmlnZ2VyID0gbGlua2VkRWxlbSAmJiBsaW5rZWRFbGVtLl9qc3ZUcikge1xuXHRcdFx0XHRiaW5kRWxDaGFuZ2UoJGxpbmtlZEVsZW0gfHwgJChsaW5rZWRFbGVtKSwgdHJpZ2dlciwgXCJvZmZcIik7XG5cdFx0XHRcdGxpbmtlZEVsZW0uX2pzdlRyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0dmlldyA9IGxpbmtDdHgudmlldztcblx0XHRcdGlmICh2aWV3LnR5cGUgPT09IFwibGlua1wiKSB7XG5cdFx0XHRcdHZpZXcucGFyZW50LnJlbW92ZVZpZXdzKHZpZXcuXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIEEgXCJsaW5rXCIgdmlldyBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmRpbmcsIHNvIHNob3VsZCBiZSBkaXNwb3NlZCB3aXRoIGJpbmRpbmcuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgdmlldy5fLmJuZHNbYmluZElkXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZGVsZXRlIGJpbmRpbmcuc1tiaW5kaW5nLmNiSWRdO1xuXHR9XG59XG5cbmZ1bmN0aW9uICR1bmxpbmsodG8pIHtcblx0aWYgKHRvKSB7XG5cdFx0dG8gPSB0by5qcXVlcnkgPyB0byA6ICQodG8pO1xuXHRcdHRvLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5uZXJWaWV3O1xuXHRcdFx0Ly9UT0RPIGZpeCB0aGlzIGZvciBiZXR0ZXIgcGVyZi4gUmF0aGVyIHRoYXQgY2FsbGluZyBpbm5lciB2aWV3IG11bHRpcGxlIHRpbWVzIHdoaWNoIGRvZXMgcXVlcnlTZWxlY3RvckFsbCBlYWNoIHRpbWUsIGNvbnNpZGVyIGEgc2luZ2xlIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdC8vIG9yIHNpbXBseSBjYWxsIHZpZXcucmVtb3ZlVmlld3MoKSBvbiB0aGUgdG9wLWxldmVsIHZpZXdzIHVuZGVyIHRoZSB0YXJnZXQgJ3RvJyBub2RlLCB0aGVuIGNsZWFuKC4uLilcblx0XHRcdHdoaWxlICgoaW5uZXJWaWV3ID0gJHZpZXcodGhpcywgdHJ1ZSkpICYmIGlubmVyVmlldy5wYXJlbnQpIHtcblx0XHRcdFx0aW5uZXJWaWV3LnBhcmVudC5yZW1vdmVWaWV3cyhpbm5lclZpZXcuXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRjbGVhbih0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSk7XG5cdFx0fSk7XG5cdFx0Y2xlYW4odG8pO1xuXHR9IGVsc2Uge1xuXHRcdC8vIENhbGwgdG8gJC51bmxpbmsoKSBpcyBlcXVpdmFsZW50IHRvICQudW5saW5rKHRydWUsIFwiYm9keVwiKVxuXHRcdGlmIChhY3RpdmVCb2R5KSB7XG5cdFx0XHQkKGFjdGl2ZUJvZHkpXG5cdFx0XHRcdC5vZmYoZWxlbWVudENoYW5nZVN0ciwgZWxlbUNoYW5nZUhhbmRsZXIpXG5cdFx0XHRcdC5vZmYoJ2JsdXInLCAnW2NvbnRlbnRlZGl0YWJsZV0nLCBlbGVtQ2hhbmdlSGFuZGxlcik7XG5cdFx0XHRhY3RpdmVCb2R5ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0b3BWaWV3LnJlbW92ZVZpZXdzKCk7XG5cdFx0Y2xlYW4oZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikpO1xuXHR9XG59XG5cbi8vPT09PT09PT1cbi8vIEhlbHBlcnNcbi8vPT09PT09PT1cblxuZnVuY3Rpb24gaW5wdXRBdHRyaWIoZWxlbSkge1xuXHRyZXR1cm4gZWxlbS50eXBlID09PSBDSEVDS0JPWCA/IGVsZW1bQ0hFQ0tFRF0gOiBlbGVtLnZhbHVlO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy89PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzUmVuZGVyIGludGVncmF0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PVxuXG4kc3ViLm9uU3RvcmUudGVtcGxhdGUgPSBmdW5jdGlvbihuYW1lLCBpdGVtKSB7XG5cdGl0ZW0ubGluayA9IHRtcGxMaW5rO1xuXHRpZiAobmFtZSkge1xuXHRcdCQubGlua1tuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRtcGxMaW5rLmFwcGx5KGl0ZW0sIGFyZ3VtZW50cyk7XG5cdFx0fTtcblx0fVxufTtcblxuJHN1Yi52aWV3SW5mb3MgPSB2aWV3SW5mb3M7IC8vIEV4cG9zZSB2aWV3SW5mb3MoKSBhcyBwdWJsaWMgaGVscGVyIG1ldGhvZFxuXG4vLyBEZWZpbmUgSnNWaWV3cyB2ZXJzaW9uIG9mIGRlbGltaXRlcnMoKSwgYW5kIGluaXRpYWxpemVcbigkdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzID0gZnVuY3Rpb24oKSB7XG5cdC8vIFJ1biBkZWxpbWl0ZXJzIGluaXRpYWxpemF0aW9uIGluIGNvbnRleHQgb2YganNyZW5kZXIuanNcblx0dmFyIHJldCA9IG9sZEpzdkRlbGltaXRlcnMuYXBwbHkoMCwgYXJndW1lbnRzKSxcblx0XHQvLyBOb3cgc2V0IGFsc28gZGVsaW1PcGVuQ2hhcjAgZXRjLiBpbiBjb250ZXh0IG9mIGpxdWVyeS52aWV3cy5qcy4uLlxuXHRcdGRlbGltQ2hhcnMgPSAkc3ViU2V0dGluZ3MuZGVsaW1pdGVycztcblxuXHRkZWxpbU9wZW5DaGFyMCA9IGRlbGltQ2hhcnNbMF0uY2hhckF0KDApO1xuXHRkZWxpbU9wZW5DaGFyMSA9IGRlbGltQ2hhcnNbMF0uY2hhckF0KDEpO1xuXHRkZWxpbUNsb3NlQ2hhcjAgPSBkZWxpbUNoYXJzWzFdLmNoYXJBdCgwKTtcblx0ZGVsaW1DbG9zZUNoYXIxID0gZGVsaW1DaGFyc1sxXS5jaGFyQXQoMSk7XG5cdGxpbmtDaGFyID0gZGVsaW1DaGFyc1syXTtcblxuXHQvLyBEYXRhLWxpbmtpbmcgbXVzdCB1c2UgbmV3IGRlbGltaXRlcnNcblx0clRhZ0RhdGFsaW5rID0gbmV3IFJlZ0V4cChcIig/Ol58XFxcXHMqKShbXFxcXHctXSopKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpPyhcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMSArICRzdWIuclRhZyArIFwiKDpcXFxcdyopP1xcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiKVwiLCBcImdcIik7XG5cdHJldHVybiByZXQ7XG59KSgpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuJHN1Yi5hZGRTZXR0aW5nKFwidHJpZ2dlclwiKTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFkZGl0aW9uYWwgbWVtYmVycyBmb3IgbGlua2VkIHZpZXdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiB0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnRFbGVtLCBpZCwgdmlld09yVGFnQ2hhciwgcmVmcmVzaCkge1xuXHQvLyBUcmFuc2ZlciB0b2tlbnMgb24gcHJldk5vZGUgb2Ygdmlld1RvUmVtb3ZlL3ZpZXdUb1JlZnJlc2ggdG8gbmV4dE5vZGUgb3IgcGFyZW50RWxlbS5fZGZcblx0dmFyIGksIGwsIHZ3SW5mb3MsIHZ3SW5mbywgdmlld09yVGFnLCB2aWV3SWQsIHRva2Vucyxcblx0XHRwcmVjZWRpbmdMZW5ndGggPSAwLFxuXHRcdGVtcHR5VmlldyA9IHByZXZOb2RlID09PSBuZXh0Tm9kZTtcblxuXHRpZiAocHJldk5vZGUpIHtcblx0XHQvLyBwcmV2Tm9kZSBpcyBlaXRoZXIgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXdPclRhZywgb3IgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHZ3SW5mb3MgdG9rZW5zIHN0cmluZ1xuXHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3MocHJldk5vZGUpIHx8IFtdO1xuXHRcdGZvciAoaSA9IDAsIGwgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gU3RlcCB0aHJvdWdoIHZpZXdzIG9yIHRhZ3Mgb24gdGhlIHByZXZOb2RlXG5cdFx0XHR2d0luZm8gPSB2d0luZm9zW2ldO1xuXHRcdFx0dmlld0lkID0gdndJbmZvLmlkO1xuXHRcdFx0aWYgKHZpZXdJZCA9PT0gaWQgJiYgdndJbmZvLmNoID09PSB2aWV3T3JUYWdDaGFyKSB7XG5cdFx0XHRcdGlmIChyZWZyZXNoKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyB2aWV3T3JUYWdUb1JlZnJlc2gsIHRoaXMgaXMgdGhlIGxhc3Qgdmlld09yVGFnIHRvIHByb2Nlc3MuLi5cblx0XHRcdFx0XHRsID0gMDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIHZpZXdPclRhZ1RvUmVtb3ZlLCBzbyB3ZSBhcmUgZG9uZS4uLlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWVtcHR5Vmlldykge1xuXHRcdFx0XHR2aWV3T3JUYWcgPSB2d0luZm8uY2ggPT09IFwiX1wiXG5cdFx0XHRcdFx0PyB2aWV3U3RvcmVbdmlld0lkXVxuXHRcdFx0XHRcdDogYmluZGluZ1N0b3JlW3ZpZXdJZF0ubGlua0N0eC50YWc7XG5cdFx0XHRcdGlmICh2d0luZm8ub3Blbikge1xuXHRcdFx0XHRcdC8vIEEgXCIjbVwiIHRva2VuXG5cdFx0XHRcdFx0dmlld09yVGFnLl9wcnYgPSBuZXh0Tm9kZTtcblx0XHRcdFx0fSBlbHNlIGlmICh2d0luZm8uY2xvc2UpIHtcblx0XHRcdFx0XHQvLyBBIFwiL21cIiB0b2tlblxuXHRcdFx0XHRcdHZpZXdPclRhZy5fbnh0ID0gbmV4dE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHByZWNlZGluZ0xlbmd0aCArPSB2aWV3SWQubGVuZ3RoICsgMjtcblx0XHR9XG5cblx0XHRpZiAocHJlY2VkaW5nTGVuZ3RoKSB7XG5cdFx0XHRwcmV2Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgcHJldk5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpLnNsaWNlKHByZWNlZGluZ0xlbmd0aCkpO1xuXHRcdH1cblx0XHR0b2tlbnMgPSBuZXh0Tm9kZSA/IG5leHROb2RlLmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKSA6IHBhcmVudEVsZW0uX2RmO1xuXHRcdGlmIChsID0gdG9rZW5zLmluZGV4T2YoXCIvXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpICsgMSkge1xuXHRcdFx0dG9rZW5zID0gdndJbmZvcy5fdGtucy5zbGljZSgwLCBwcmVjZWRpbmdMZW5ndGgpICsgdG9rZW5zLnNsaWNlKGwgKyAocmVmcmVzaCA/IC0xIDogaWQubGVuZ3RoICsgMSkpO1xuXHRcdH1cblx0XHRpZiAodG9rZW5zKSB7XG5cdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0Ly8gSWYgdmlld09yVGFnVG9SZW1vdmUgd2FzIGFuIGVtcHR5IHZpZXdPclRhZywgd2Ugd2lsbCByZW1vdmUgYm90aCAjbiBhbmQgL25cblx0XHRcdFx0Ly8gKGFuZCBhbnkgaW50ZXJ2ZW5pbmcgdG9rZW5zKSBmcm9tIHRoZSBuZXh0Tm9kZSAoPT09IHByZXZOb2RlKVxuXHRcdFx0XHQvLyBJZiB2aWV3T3JUYWdUb1JlbW92ZSB3YXMgbm90IGVtcHR5LCB3ZSB3aWxsIHRha2UgdG9rZW5zIHByZWNlZGluZyAjbiBmcm9tIHByZXZOb2RlLFxuXHRcdFx0XHQvLyBhbmQgY29uY2F0ZW5hdGUgd2l0aCB0b2tlbnMgZm9sbG93aW5nIC9uIG9uIG5leHROb2RlXG5cdFx0XHRcdG5leHROb2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCB0b2tlbnMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgdG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gIXByZXZOb2RlLCBzbyB0aGVyZSBtYXkgYmUgYSBkZWZlcnJlZCBub2RlcyB0b2tlbiBvbiB0aGUgcGFyZW50RWxlbS4gUmVtb3ZlIGl0LlxuXHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIjXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpKTtcblx0XHRpZiAoIXJlZnJlc2ggJiYgIW5leHROb2RlKSB7XG5cdFx0XHQvLyBJZiB0aGlzIHZpZXdPclRhZyBpcyBiZWluZyByZW1vdmVkLCBhbmQgdGhlcmUgd2FzIG5vIC5ueHQsIHJlbW92ZSBjbG9zaW5nIHRva2VuIGZyb20gZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiL1wiICsgaWQgKyB2aWV3T3JUYWdDaGFyKSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRpc3Bvc2VUb2tlbnModG9rZW5zKSB7XG5cdHZhciBpLCBsLCB2d0l0ZW0sIHZ3SW5mb3M7XG5cdGlmICh2d0luZm9zID0gdmlld0luZm9zKHRva2VucywgdHJ1ZSwgck9wZW5NYXJrZXJzKSkge1xuXHRcdGZvciAoaSA9IDAsIGwgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dndJdGVtID0gdndJbmZvc1tpXTtcblx0XHRcdGlmICh2d0l0ZW0uY2ggPT09IFwiX1wiKSB7XG5cdFx0XHRcdGlmICgodndJdGVtID0gdmlld1N0b3JlW3Z3SXRlbS5pZF0pICYmIHZ3SXRlbS50eXBlKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhpcyBpcyB0aGUgX3BydiAocHJldk5vZGUpIGZvciBhIHZpZXcsIHJlbW92ZSB0aGUgdmlld1xuXHRcdFx0XHRcdC8vIC0gdW5sZXNzIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgaXQgaXMgYWxyZWFkeSBiZWluZyByZW1vdmVkXG5cdFx0XHRcdFx0dndJdGVtLnBhcmVudC5yZW1vdmVWaWV3cyh2d0l0ZW0uXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKHZ3SXRlbS5pZCk7IC8vIHVuYmluZCBiaW5kaW5ncyB3aXRoIHRoaXMgYmluZGluZ0lkIG9uIHRoaXMgdmlld1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQWRkIGxpbmsgbWV0aG9kcyB0byBkYXRhLWxpbmtlZCB2aWV3IG9yIHRhZ1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIGFkZExpbmtNZXRob2RzKHRhZ09yVmlldywgaXNUYWcpIHtcblxuXHR0YWdPclZpZXcuY29udGVudHMgPSBmdW5jdGlvbihkZWVwLCBzZWxlY3QpIHtcblx0XHQvLyBGb3IgYSB2aWV3IG9yIGEgdGFnLCByZXR1cm4galF1ZXJ5IG9iamVjdCB3aXRoIHRoZSBjb250ZW50IG5vZGVzLFxuXHRcdGlmIChkZWVwICE9PSAhIWRlZXApIHtcblx0XHRcdC8vIGRlZXAgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgY29udGVudHMoc2VsZWN0b3IpXG5cdFx0XHRzZWxlY3QgPSBkZWVwO1xuXHRcdFx0ZGVlcCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dmFyIGZpbHRlcmVkLFxuXHRcdFx0bm9kZXMgPSAkKHRoaXMubm9kZXMoKSk7XG5cdFx0aWYgKG5vZGVzWzBdKSB7XG5cdFx0XHRmaWx0ZXJlZCA9IHNlbGVjdCA/IG5vZGVzLmZpbHRlcihzZWxlY3QpIDogbm9kZXM7XG5cdFx0XHRub2RlcyA9IGRlZXAgJiYgc2VsZWN0ID8gZmlsdGVyZWQuYWRkKG5vZGVzLmZpbmQoc2VsZWN0KSkgOiBmaWx0ZXJlZDtcblx0XHR9XG5cdFx0cmV0dXJuIG5vZGVzO1xuXHR9O1xuXG5cdHRhZ09yVmlldy5ub2RlcyA9IGZ1bmN0aW9uKHdpdGhNYXJrZXJzLCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0XHQvLyBGb3IgYSB2aWV3IG9yIGEgdGFnLCByZXR1cm4gdG9wLWxldmVsIG5vZGVzXG5cdFx0Ly8gRG8gbm90IHJldHVybiBhbnkgc2NyaXB0IG1hcmtlciBub2RlcywgdW5sZXNzIHdpdGhNYXJrZXJzIGlzIHRydWVcblx0XHQvLyBPcHRpb25hbGx5IGxpbWl0IHJhbmdlLCBieSBwYXNzaW5nIGluIHByZXZOb2RlIG9yIG5leHROb2RlIHBhcmFtZXRlcnNcblxuXHRcdHZhciBub2RlLFxuXHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRlbENudCA9IHNlbGYuX2VsQ250LFxuXHRcdFx0cHJldklzRmlyc3ROb2RlID0gIXByZXZOb2RlICYmIGVsQ250LFxuXHRcdFx0bm9kZXMgPSBbXTtcblxuXHRcdHByZXZOb2RlID0gcHJldk5vZGUgfHwgc2VsZi5fcHJ2O1xuXHRcdG5leHROb2RlID0gbmV4dE5vZGUgfHwgc2VsZi5fbnh0O1xuXG5cdFx0bm9kZSA9IHByZXZJc0ZpcnN0Tm9kZVxuXHRcdFx0PyAocHJldk5vZGUgPT09IHNlbGYuX254dFxuXHRcdFx0XHQ/IHNlbGYucGFyZW50RWxlbS5sYXN0U2libGluZ1xuXHRcdFx0XHQ6IHByZXZOb2RlKVxuXHRcdFx0OiAoc2VsZi5fLmlubGluZSA9PT0gZmFsc2Vcblx0XHRcdFx0PyBwcmV2Tm9kZSB8fCBzZWxmLmxpbmtDdHguZWxlbS5maXJzdENoaWxkXG5cdFx0XHRcdDogcHJldk5vZGUgJiYgcHJldk5vZGUubmV4dFNpYmxpbmcpO1xuXG5cdFx0d2hpbGUgKG5vZGUgJiYgKCFuZXh0Tm9kZSB8fCBub2RlICE9PSBuZXh0Tm9kZSkpIHtcblx0XHRcdGlmICh3aXRoTWFya2VycyB8fCBlbENudCB8fCBub2RlLnRhZ05hbWUgIT09IFNDUklQVCkge1xuXHRcdFx0XHQvLyBBbGwgdGhlIHRvcC1sZXZlbCBub2RlcyBpbiB0aGUgdmlld1xuXHRcdFx0XHQvLyAoZXhjZXB0IHNjcmlwdCBtYXJrZXIgbm9kZXMsIHVubGVzcyB3aXRoTWFya2VycyA9IHRydWUpXG5cdFx0XHRcdC8vIChOb3RlOiBJZiBhIHNjcmlwdCBtYXJrZXIgbm9kZSwgdmlld0luZm8uZWxDbnQgdW5kZWZpbmVkKVxuXHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHRcdHJldHVybiBub2Rlcztcblx0fTtcblxuXHR0YWdPclZpZXcuY2hpbGRUYWdzID0gZnVuY3Rpb24oZGVlcCwgdGFnTmFtZSkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiBjaGlsZCB0YWdzIC0gYXQgYW55IGRlcHRoLCBvciBhcyBpbW1lZGlhdGUgY2hpbGRyZW4gb25seS5cblx0XHRpZiAoZGVlcCAhPT0gISFkZWVwKSB7XG5cdFx0XHQvLyBkZWVwIG5vdCBib29sZWFuLCBzbyB0aGlzIGlzIGNoaWxkVGFncyh0YWdOYW1lKSAtIHdoaWNoIGxvb2tzIGZvciB0b3AtbGV2ZWwgdGFncyBvZiBnaXZlbiB0YWdOYW1lXG5cdFx0XHR0YWdOYW1lID0gZGVlcDtcblx0XHRcdGRlZXAgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0dmlldyA9IHNlbGYubGluayA/IHNlbGYgOiBzZWxmLnRhZ0N0eC52aWV3LCAvLyB0aGlzIG1heSBiZSBhIHZpZXcgb3IgYSB0YWcuIElmIGEgdGFnLCBnZXQgdGhlIHZpZXcgZnJvbSB0YWcudmlldy50YWdDdHhcblx0XHRcdHByZXZOb2RlID0gc2VsZi5fcHJ2LFxuXHRcdFx0ZWxDbnQgPSBzZWxmLl9lbENudCxcblx0XHRcdHRhZ3MgPSBbXTtcblxuXHRcdHZpZXcubGluayhcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHNlbGYucGFyZW50RWxlbSxcblx0XHRcdGVsQ250ID8gcHJldk5vZGUgJiYgcHJldk5vZGUucHJldmlvdXNTaWJsaW5nIDogcHJldk5vZGUsXG5cdFx0XHRzZWxmLl9ueHQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR7Z2V0Ontcblx0XHRcdFx0dGFnczogdGFncyxcblx0XHRcdFx0ZGVlcDogZGVlcCxcblx0XHRcdFx0bmFtZTogdGFnTmFtZSxcblx0XHRcdFx0aWQ6IHNlbGYubGluayA/IHNlbGYuXy5pZCArIFwiX1wiIDogc2VsZi5fdGdJZCArIFwiXlwiXG5cdFx0XHR9fVxuXHRcdCk7XG5cdFx0cmV0dXJuIHRhZ3M7XG5cdH07XG5cblx0dGFnT3JWaWV3LnJlZnJlc2ggPSBmdW5jdGlvbihzb3VyY2VWYWx1ZSkge1xuXHRcdHZhciBwcm9taXNlLCBhdHRyLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGxpbmtDdHggPSB0YWcubGlua0N0eCxcblx0XHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXc7XG5cblx0XHRpZiAodGFnLmRpc3Bvc2VkKSB7IGVycm9yKFwiUmVtb3ZlZCB0YWdcIik7IH1cblx0XHRpZiAoc291cmNlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c291cmNlVmFsdWUgPSAkc3ViLl90YWcodGFnLCB2aWV3LCB2aWV3LnRtcGwsIG1lcmdlQ3R4cyh0YWcpLCB0cnVlKTsgLy8gR2V0IHJlbmRlcmVkIEhUTUwgZm9yIHRhZywgYmFzZWQgb24gcmVmcmVzaGVkIHRhZ0N0eHNcblx0XHR9XG5cdFx0aWYgKHNvdXJjZVZhbHVlICsgXCJcIiA9PT0gc291cmNlVmFsdWUpIHtcblx0XHRcdC8vIElmIG5vIHJlbmRlcmVkIGNvbnRlbnQsIHNvdXJjZVZhbHVlIHdpbGwgbm90IGJlIGEgc3RyaW5nIChjYW4gYmUgMCBvciB1bmRlZmluZWQpXG5cdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdHRhZy5vblVuYmluZCh0YWcudGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4KTtcblx0XHRcdH1cblx0XHRcdGF0dHIgPSB0YWcuXy5pbmxpbmUgPyBIVE1MIDogKGxpbmtDdHguYXR0ciB8fCBkZWZhdWx0QXR0cih0YWcucGFyZW50RWxlbSwgdHJ1ZSkpO1xuXHRcdFx0cHJvbWlzZSA9IHVwZGF0ZUNvbnRlbnQoc291cmNlVmFsdWUsIGxpbmtDdHgsIGF0dHIsIHRhZyk7XG5cdFx0fVxuXG5cdFx0Y2FsbEFmdGVyTGluayh0YWcpO1xuXHRcdHJldHVybiBwcm9taXNlIHx8IHRhZztcblx0fTtcblxuXHR0YWdPclZpZXcudXBkYXRlID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHR2YXIgbGlua2VkRWxlbSA9IHRoaXMubGlua2VkRWxlbTtcblx0XHRpZiAobGlua2VkRWxlbSkge1xuXHRcdFx0ZWxlbUNoYW5nZUhhbmRsZXIoe1xuXHRcdFx0XHR0YXJnZXQ6IGxpbmtlZEVsZW1bMF1cblx0XHRcdH0sIHVuZGVmaW5lZCwgdmFsdWUpO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoaXNUYWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgVEFHXG5cdFx0dGFnT3JWaWV3LmRvbUNoYW5nZSA9IGZ1bmN0aW9uKCkgeyAvLyBkb21DaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnRcblx0XHRcdHZhciBlbGVtID0gdGhpcy5wYXJlbnRFbGVtLFxuXHRcdFx0XHRoYXNMaXN0ZW5lciA9ICQuaGFzRGF0YShlbGVtKSAmJiAkLl9kYXRhKGVsZW0pLmV2ZW50cyxcblx0XHRcdFx0ZG9tQ2hhbmdlTm90aWZpY2F0aW9uID0gXCJqc3YtZG9tY2hhbmdlXCI7XG5cblx0XHRcdGlmIChoYXNMaXN0ZW5lciAmJiBoYXNMaXN0ZW5lcltkb21DaGFuZ2VOb3RpZmljYXRpb25dKSB7XG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciBoYW5kbGVyIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBsaXN0ZW5pbmcgZm9yIHRoaXMgZXZlbnQuIChOb3RlIHVzaW5nIHRyaWdnZXJIYW5kbGVyIC0gc28gbm8gZXZlbnQgYnViYmxpbmcuKVxuXHRcdFx0XHQkKGVsZW0pLnRyaWdnZXJIYW5kbGVyKGRvbUNoYW5nZU5vdGlmaWNhdGlvbiwgYXJndW1lbnRzKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSBWSUVXXG5cdFx0Ly8gTm90ZTogYSBsaW5rZWQgdmlldyB3aWxsIGFsc28sIGFmdGVyIGxpbmtpbmcgaGF2ZSBub2Rlc1tdLCBfcHJ2IChwcmV2Tm9kZSksIF9ueHQgKG5leHROb2RlKSAuLi5cblx0XHR0YWdPclZpZXcuYWRkVmlld3MgPSBmdW5jdGlvbihpbmRleCwgZGF0YUl0ZW1zKSB7XG5cdFx0XHQvLyBpZiB2aWV3IGlzIG5vdCBhbiBhcnJheSB2aWV3LCBkbyBub3RoaW5nXG5cdFx0XHR2YXIgaSwgdmlld3NDb3VudCxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdGl0ZW1zQ291bnQgPSBkYXRhSXRlbXMubGVuZ3RoLFxuXHRcdFx0XHR2aWV3cyA9IHNlbGYudmlld3M7XG5cblx0XHRcdGlmICghc2VsZi5fLnVzZUtleSAmJiBpdGVtc0NvdW50KSB7XG5cdFx0XHRcdC8vIHZpZXcgaXMgb2YgdHlwZSBcImFycmF5XCJcblx0XHRcdFx0dmlld3NDb3VudCA9IHZpZXdzLmxlbmd0aCArIGl0ZW1zQ291bnQ7XG5cblx0XHRcdFx0aWYgKHZpZXdzQ291bnQgPT09IHNlbGYuZGF0YS5sZW5ndGggLy8gSWYgdmlld3Mgbm90IGFscmVhZHkgc3luY2VkIHRvIGFycmF5IChlLmcuIHRyaWdnZXJlZCBieSBhcnJheS5sZW5ndGggcHJvcGVydHlDaGFuZ2UgLSBqc3ZpZXdzL2lzc3Vlcy8zMDEpXG5cdFx0XHRcdFx0XHQmJiByZW5kZXJBbmRMaW5rKHNlbGYsIGluZGV4LCBzZWxmLnRtcGwsIHZpZXdzLCBkYXRhSXRlbXMsIHNlbGYuY3R4KSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRpZiAoIXNlbGYuXy5zcnQpIHsgLy8gTm90IHBhcnQgb2YgYSAnc29ydCcgb24gcmVmcmVzaFxuXHRcdFx0XHRcdFx0c2VsZi5maXhJbmRleChpbmRleCArIGl0ZW1zQ291bnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0YWdPclZpZXcucmVtb3ZlVmlld3MgPSBmdW5jdGlvbihpbmRleCwgaXRlbXNDb3VudCwga2VlcE5vZGVzLCBpc01vdmUpIHtcblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoKSByZW1vdmVzIGFsbCB0aGUgY2hpbGQgdmlld3Ncblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoaW5kZXgpIHJlbW92ZXMgdGhlIGNoaWxkIHZpZXcgd2l0aCBzcGVjaWZpZWQgaW5kZXggb3Iga2V5XG5cdFx0XHQvLyB2aWV3LnJlbW92ZVZpZXdzKGluZGV4LCBjb3VudCkgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG51bW1iZXIgb2YgY2hpbGQgdmlld3MsIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleFxuXHRcdFx0ZnVuY3Rpb24gcmVtb3ZlVmlldyhpbmRleCkge1xuXHRcdFx0XHR2YXIgaWQsIGJpbmRJZCwgcGFyZW50RWxlbSwgcHJldk5vZGUsIG5leHROb2RlLCBub2Rlc1RvUmVtb3ZlLFxuXHRcdFx0XHRcdHZpZXdUb1JlbW92ZSA9IHZpZXdzW2luZGV4XTtcblxuXHRcdFx0XHRpZiAodmlld1RvUmVtb3ZlICYmIHZpZXdUb1JlbW92ZS5saW5rKSB7XG5cdFx0XHRcdFx0aWQgPSB2aWV3VG9SZW1vdmUuXy5pZDtcblx0XHRcdFx0XHRpZiAoIWtlZXBOb2Rlcykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBIVE1MIG5vZGVzIGZyb20gdGhlIERPTSwgdW5sZXNzIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgaW5jbHVkaW5nIG5vZGVzIG9mIGNoaWxkIHZpZXdzXG5cdFx0XHRcdFx0XHRub2Rlc1RvUmVtb3ZlID0gdmlld1RvUmVtb3ZlLm5vZGVzKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXdzLCB3aXRob3V0IHJlbW92aW5nIG5vZGVzXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlLnJlbW92ZVZpZXdzKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcblxuXHRcdFx0XHRcdHZpZXdUb1JlbW92ZS50eXBlID0gdW5kZWZpbmVkOyAvLyBTZXQgdHlwZSB0byB1bmRlZmluZWQ6IHVzZWQgYXMgYSBmbGFnIHRoYXQgdGhpcyB2aWV3IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHRwcmV2Tm9kZSA9IHZpZXdUb1JlbW92ZS5fcHJ2O1xuXHRcdFx0XHRcdG5leHROb2RlID0gdmlld1RvUmVtb3ZlLl9ueHQ7XG5cdFx0XHRcdFx0cGFyZW50RWxlbSA9IHZpZXdUb1JlbW92ZS5wYXJlbnRFbGVtO1xuXHRcdFx0XHRcdC8vIElmIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBhcmUgdGhlIHNhbWUsIHRoZSB2aWV3IGlzIGVtcHR5XG5cdFx0XHRcdFx0aWYgKCFrZWVwTm9kZXMpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgSFRNTCBub2RlcyBmcm9tIHRoZSBET00sIHVubGVzcyB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIGluY2x1ZGluZyBub2RlcyBvZiBjaGlsZCB2aWV3c1xuXHRcdFx0XHRcdFx0aWYgKHZpZXdUb1JlbW92ZS5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaWYga2VlcE5vZGVzIGlzIGZhbHNlIChhbmQgdHJhbnNmZXJyaW5nIG9mIHRva2VucyBoYXMgbm90IGFscmVhZHkgYmVlbiBkb25lIGF0IGEgaGlnaGVyIGxldmVsKVxuXHRcdFx0XHRcdFx0XHQvLyB0aGVuIHRyYW5zZmVyIHRva2VucyBmcm9tIHByZXZOb2RlIHdoaWNoIGlzIGJlaW5nIHJlbW92ZWQsIHRvIG5leHROb2RlLlxuXHRcdFx0XHRcdFx0XHR0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnRFbGVtLCBpZCwgXCJfXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCF2aWV3VG9SZW1vdmUuX2VsQ250KSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRwcmV2Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHByZXZOb2RlKTsgLy8gKHByZXZOb2RlLnBhcmVudE5vZGUgaXMgcGFyZW50RWxlbSwgZXhjZXB0IGlmIGpRdWVyeSBNb2JpbGUgb3Igc2ltaWxhciBoYXMgaW5zZXJ0ZWQgYW4gaW50ZXJtZWRpYXRlIHdyYXBwZXJcblx0XHRcdFx0XHRcdFx0bmV4dE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsodmlld1RvUmVtb3ZlKTtcblx0XHRcdFx0XHRmb3IgKGJpbmRJZCBpbiB2aWV3VG9SZW1vdmUuXy5ibmRzKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3QmluZGluZyhiaW5kSWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkZWxldGUgdmlld1N0b3JlW2lkXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY3VycmVudCwgdmlldywgdmlld3NDb3VudCxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdGlzQXJyYXkgPSAhc2VsZi5fLnVzZUtleSxcblx0XHRcdFx0dmlld3MgPSBzZWxmLnZpZXdzO1xuXG5cdFx0XHRpZiAoaXNBcnJheSkge1xuXHRcdFx0XHR2aWV3c0NvdW50ID0gdmlld3MubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIGFsbCBjaGlsZCB2aWV3c1xuXHRcdFx0XHRpZiAoaXNBcnJheSkge1xuXHRcdFx0XHRcdC8vIHZpZXdzIGFuZCBkYXRhIGFyZSBhcnJheXNcblx0XHRcdFx0XHRjdXJyZW50ID0gdmlld3NDb3VudDtcblx0XHRcdFx0XHR3aGlsZSAoY3VycmVudC0tKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGN1cnJlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZWxmLnZpZXdzID0gW107XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdmlld3MgYW5kIGRhdGEgYXJlIG9iamVjdHNcblx0XHRcdFx0XHRmb3IgKHZpZXcgaW4gdmlld3MpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBieSBrZXlcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXcodmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGYudmlld3MgPSB7fTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGl0ZW1zQ291bnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgcGFyZW50VmlldyBpcyBkYXRhIGFycmF5IHZpZXcuXG5cdFx0XHRcdFx0XHQvLyBTZXQgaXRlbXNDb3VudCB0byAxLCB0byByZW1vdmUgdGhpcyBpdGVtXG5cdFx0XHRcdFx0XHRpdGVtc0NvdW50ID0gMTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXcgd2l0aCBrZXkgJ2luZGV4J1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyhpbmRleCk7XG5cdFx0XHRcdFx0XHRkZWxldGUgdmlld3NbaW5kZXhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaXNBcnJheSAmJiBpdGVtc0NvdW50XG5cdFx0XHRcdFx0JiYgKGlzTW92ZSB8fCB2aWV3c0NvdW50IC0gaXRlbXNDb3VudCA9PT0gc2VsZi5kYXRhLmxlbmd0aCkpIHsgLy8gSWYgdmlld3Mgbm90IGFscmVhZHkgc3luY2VkIHRvIGFycmF5IChlLmcuIHRyaWdnZXJlZCBieSBhcnJheS5sZW5ndGggcHJvcGVydHlDaGFuZ2UgLSBqc3ZpZXdzL2lzc3Vlcy8zMDEpXG5cdFx0XHRcdFx0Y3VycmVudCA9IGluZGV4ICsgaXRlbXNDb3VudDtcblx0XHRcdFx0XHQvLyBSZW1vdmUgaW5kZXhlZCBpdGVtcyAocGFyZW50VmlldyBpcyBkYXRhIGFycmF5IHZpZXcpO1xuXHRcdFx0XHRcdHdoaWxlIChjdXJyZW50LS0gPiBpbmRleCkge1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyhjdXJyZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmlld3Muc3BsaWNlKGluZGV4LCBpdGVtc0NvdW50KTtcblx0XHRcdFx0XHRpZiAoIXNlbGYuXy5zb3J0KSB7XG5cdFx0XHRcdFx0XHRzZWxmLmZpeEluZGV4KGluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0cGFyZW50ID0gc2VsZi5wYXJlbnQ7XG5cblx0XHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdFx0cmVuZGVyQW5kTGluayhzZWxmLCBzZWxmLmluZGV4LCBzZWxmLnRtcGwsIHBhcmVudC52aWV3cywgc2VsZi5kYXRhLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsoc2VsZik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5maXhJbmRleCA9IGZ1bmN0aW9uKGZyb21JbmRleCkge1xuXHRcdFx0Ly8gRml4dXAgaW5kZXggb24gZm9sbG93aW5nIHZpZXcgaXRlbXMuLi5cblx0XHRcdHZhciB2aWV3cyA9IHRoaXMudmlld3MsXG5cdFx0XHRcdGluZGV4ID0gdmlld3MubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGZyb21JbmRleCA8IGluZGV4LS0pIHtcblx0XHRcdFx0aWYgKHZpZXdzW2luZGV4XS5pbmRleCAhPT0gaW5kZXgpIHtcblx0XHRcdFx0XHQkb2JzZXJ2YWJsZSh2aWV3c1tpbmRleF0pLnNldFByb3BlcnR5KFwiaW5kZXhcIiwgaW5kZXgpO1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgZml4aW5nIHVwIGluZGV4LCBidXQgbm90IGtleSwgYW5kIG5vdCBpbmRleCBvbiBjaGlsZCB2aWV3cy4gRnJvbSBjaGlsZCB2aWV3cywgdXNlIHZpZXcuZ2V0SW5kZXgoKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5saW5rID0gdmlld0xpbms7XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzVmlld3Mtc3BlY2lmaWMgY29udmVydGVyc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT1cblxuJGNvbnZlcnRlcnMubWVyZ2UgPSBmdW5jdGlvbih2YWwpIHtcblx0Ly8gU3BlY2lhbCBjb252ZXJ0ZXIgdXNlZCBpbiBkYXRhLWxpbmtpbmcgdG8gc3BhY2Utc2VwYXJhdGVkIGxpc3RzLCBzdWNoIGFzIGNsYXNzTmFtZTpcblx0Ly8gQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdG9nZ2xlIHNlbWFudGljcyAtIGFuZCBoYXMgbm8gZWZmZWN0IGlmIHRvZ2dsZSBzdHJpbmcgaXMgbm90IHNwZWNpZmllZFxuXHQvLyBkYXRhLWxpbms9XCJjbGFzc3ttZXJnZTpib29sRXhwciB0b2dnbGU9Y2xhc3NOYW1lfVwiXG5cdHZhciByZWd1bGFyRXhwcmVzc2lvbixcblx0XHRjdXJyZW50VmFsdWUgPSB0aGlzLmxpbmtDdHguX3ZhbCB8fCBcIlwiLFxuXHRcdHRvZ2dsZSA9IHRoaXMudGFnQ3R4LnByb3BzLnRvZ2dsZTtcblxuXHRpZiAodG9nZ2xlKSB7XG5cdFx0Ly8gV2UgYXJlIHRvZ2dsaW5nIHRoZSBjbGFzcyBzcGVjaWZpZWQgYnkgdGhlIHRvZ2dsZSBwcm9wZXJ0eSxcblx0XHQvLyBhbmQgdGhlIGJvb2xlYW4gdmFsIGJpbmRpbmcgaXMgZHJpdmluZyB0aGUgaW5zZXJ0L3JlbW92ZSB0b2dnbGVcblxuXHRcdHJlZ3VsYXJFeHByZXNzaW9uID0gdG9nZ2xlLnJlcGxhY2UoL1tcXFxcXiQufD8qKygpW3tdL2csIFwiXFxcXCQmXCIpO1xuXHRcdC8vIEVzY2FwZSBhbnkgcmVndWxhciBleHByZXNzaW9uIHNwZWNpYWwgY2hhcmFjdGVycyAobWV0YWNoYXJhY3RlcnMpIHdpdGhpbiB0aGUgdG9nZ2xlIHN0cmluZ1xuXHRcdHJlZ3VsYXJFeHByZXNzaW9uID0gXCIoXFxcXHMoPz1cIiArIHJlZ3VsYXJFeHByZXNzaW9uICsgXCIkKXwoXFxcXHMpfF4pKFwiICsgcmVndWxhckV4cHJlc3Npb24gKyBcIihcXFxcc3wkKSlcIjtcblx0XHQvLyBFeGFtcGxlOiAvKFxccyg/PW15Y2xhc3MkKXwoXFxzKXxeKT8obXljbGFzcyhcXHN8JCkpLyAtIHNvIG1hdGNoZXMgKFwiIG15Y2xhc3NcIiBvciBcIiBcIiBvciBeICkgZm9sbG93ZWQgYnkgKFwibXljbGFzcyBcIiBvciBcIm15Y2xhc3MkXCIpIHdoZXJlIF4vJCBhcmUgYmVnaW5uaW5nL2VuZCBvZiBzdHJpbmdcblx0XHRjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKHJlZ3VsYXJFeHByZXNzaW9uKSwgXCIkMlwiKTtcblx0XHR2YWwgPSBjdXJyZW50VmFsdWUgKyAodmFsID8gKGN1cnJlbnRWYWx1ZSAmJiBcIiBcIikgKyB0b2dnbGUgOiBcIlwiKTtcblx0fVxuXHRyZXR1cm4gdmFsO1xufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzVmlld3Mtc3BlY2lmaWMgdGFnc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24ga2VlcFBhcmVudERhdGFDdHgodmFsKSB7XG5cdHJldHVybiB0aGlzLnRhZ0N0eC52aWV3OyAvLyBSZXR1cm4gdGhlIHBhcmVudCB2aWV3IGFzIGRhdGEgY29udGV4dCBmb3IgcmVuZGVyaW5nIGJsb2NrIGNvbnRlbnRcbn1cblxuJHRhZ3Moe1xuXHRvbjoge1xuXHRcdGF0dHI6IE5PTkUsXG5cdFx0aW5pdDogZnVuY3Rpb24odGFnQ3R4KSB7XG5cdFx0XHR2YXIgY29udGVudCxcblx0XHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGFyZ3MgPSB0YWdDdHguYXJncywgLy8gW2V2ZW50cyxdIFtzZWxlY3RvcixdIGhhbmRsZXJcblx0XHRcdFx0bCA9IGFyZ3MubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKDsgaTxsICYmICEkaXNGdW5jdGlvbihhcmdzW2ldKTsgaSsrKTsgLy8gSGFuZGxlciBpcyBmaXJzdCBhcmcgb2YgdHlwZSBmdW5jdGlvblxuXHRcdFx0dGFnLl9oaSA9IGw+aSAmJiBpKzE7IC8vIGhhbmRsZXIgaW5kZXhcblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0aWYgKCEkc3ViLnJUbXBsLmV4ZWMoY29udGVudCA9IHRhZ0N0eC50bXBsLm1hcmt1cCkpIHtcblx0XHRcdFx0XHQvLyBJbmxpbmUge157b259fSB0YWcgd2l0aCBubyBjb250ZW50IChvciBleHRlcm5hbCB0ZW1wbGF0ZSBjb250ZW50KSBvciB3aXRoIGNvbnRlbnQgY29udGFpbmluZ1xuXHRcdFx0XHRcdC8vIG5vIEhUTUwgb3IgSnNSZW5kZXIgdGFnczogV2Ugd2lsbCB3cmFwIHRoZSAodGV4dCkgY29udGVudCwgb3IgdGhlIG9wZXJhdGlvbiBuYW1lIGluIGEgPGJ1dHRvbj4gZWxlbWVudFxuXHRcdFx0XHRcdC8vIChPdGhlcndpc2Ugd2Ugd2lsbCBhdHRhY2ggdGhlIGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQgY29udGVudCBhZnRlciBkYXRhLWxpbmtpbmcpXG5cdFx0XHRcdFx0dGFnLnRlbXBsYXRlID0gXCI8YnV0dG9uPlwiICsgKCQudHJpbShjb250ZW50KSB8fCB0YWdDdHgucGFyYW1zLmFyZ3NbaV0gfHwgXCJub29wXCIpICsgXCI8L2J1dHRvbj5cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YWcuYXR0ciA9IEhUTUw7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbkFmdGVyTGluazogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0XHR2YXIgaGFuZGxlciwgcGFyYW1zLCBmaW5kLCBhY3RpdmVFbGVtLFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHRpID0gdGFnLl9oaSxcblx0XHRcdFx0YXJncyA9IHRhZ0N0eC5hcmdzLCAvLyBbZXZlbnRzLF0gW3NlbGVjdG9yLF0gaGFuZGxlclxuXHRcdFx0XHRsID0gYXJncy5sZW5ndGgsXG5cdFx0XHRcdHByb3BzID0gdGFnQ3R4LnByb3BzLFxuXHRcdFx0XHRkYXRhID0gcHJvcHMuZGF0YSxcblx0XHRcdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdFx0XHRjb250ZXh0T2IgPSBwcm9wcy5jb250ZXh0OyAvLyBDb250ZXh0ICgndGhpcycgcG9pbnRlcikgZm9yIGF0dGFjaGVkIGhhbmRsZXJcblxuXHRcdFx0aWYgKGkpIHsgLy8gVGhlcmUgaXMgYSBoYW5kbGVyXG5cdFx0XHRcdGhhbmRsZXIgPSBhcmdzW2ktMV07XG5cdFx0XHRcdHBhcmFtcyA9IGFyZ3Muc2xpY2UoaSk7IC8vIFN1YnNlcXVlbnQgYXJncyBhcmUgcGFyYW1zXG5cdFx0XHRcdGFyZ3MgPSBhcmdzLnNsaWNlKDAsIGktMSk7IC8vIFByZWNlZGluZyBhcmdzIChpZiBhbnkpIGFyZSBldmVudHMgYW5kIHNlbGVjdG9yXG5cdFx0XHRcdHRhZy5fc2VsID0gYXJnc1sxXTsgLy8gU2VsZWN0b3IgZm9yIGRlc2NlbmRhbnQgZWxlbWVudHMgLSBmb3IgZGVsZWdhdGVkIGV2ZW50cyBvbiB0aG9zZSBlbGVtZW50cywgZGVsZWdhdGluZyB0byB0aGUgYWN0aXZlRWxlbVxuXG5cdFx0XHRcdGFjdGl2ZUVsZW0gPSB0YWcuYWN0aXZlRWxlbSA9IHRhZy5hY3RpdmVFbGVtIHx8ICQodGFnLl8uaW5saW5lXG5cdFx0XHRcdFx0PyAodGFnLl9zZWwgPSBhcmdzWzFdIHx8IFwiKlwiLCB0YWcucGFyZW50RWxlbSlcblx0XHRcdFx0XHQvLyBJZiBpbmxpbmUsIGF0dGFjaCB0byBjaGlsZCBlbGVtZW50cyBvZiB0YWcgcGFyZW50IGVsZW1lbnQgKGZpbHRlcmVkIGJ5IHNlbGVjdG9yIGFyZ3VtZW50IGlmIHByb3ZpZGVkLlxuXHRcdFx0XHRcdC8vIChJbiBoYW5kbGVyIHdlJ2xsIGZpbHRlciBvdXQgZXZlbnRzIGZyb20gc2libGluZyBlbGVtZW50cyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRhZy4pXG5cdFx0XHRcdFx0Ly8gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSBkZWxlZ2F0ZWQgcGF0dGVybiB3aGVyZSB0aGUgYXR0YWNoZWQgZXZlbnQgd29ya3MgZXZlbiBmb3IgYWRkZWQgZWxlbWVudHMgc2F0aXNmeWluZyB0aGUgc2VsZWN0b3Jcblx0XHRcdFx0XHQ6IGxpbmtDdHguZWxlbSk7XG5cblx0XHRcdFx0aWYgKCFjb250ZXh0T2IpIHtcblx0XHRcdFx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBwcmVjZWRpbmcgb2JqZWN0IChjb250ZXh0IG9iamVjdCkgb2YgaGFuZGxlciAod2hpY2ggaXMgdGhlIGxhc3QgYXJnKSwgY29tcGlsZSBmdW5jdGlvblxuXHRcdFx0XHRcdC8vIHRvIHJldHVybiB0aGF0IGNvbnRleHQgb2JqZWN0LCBhbmQgcnVuIGNvbXBpbGVkIGZ1bmN0aW9uIGFnYWluc3QgZGF0YVxuXHRcdFx0XHRcdGNvbnRleHRPYiA9IC9eKC4qKVtcXC5eXVtcXHckXSskLy5leGVjKHRhZ0N0eC5wYXJhbXMuYXJncy5zbGljZSgtcGFyYW1zLmxlbmd0aCAtIDEpWzBdKTtcblx0XHRcdFx0XHRjb250ZXh0T2IgPSBjb250ZXh0T2IgJiYgJHN1Yi50bXBsRm4oZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGNvbnRleHRPYlsxXSArIGRlbGltQ2xvc2VDaGFyMCwgdmlldy50bXBsLCB0cnVlKShsaW5rQ3R4LmRhdGEsIHZpZXcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRhZy5fZXZzKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY3RpdmVFbGVtLm9uKFxuXHRcdFx0XHRcdHRhZy5fZXZzID0gYXJnc1swXSB8fCBcImNsaWNrXCIsIC8vIGV2ZW50cyBkZWZhdWx0cyB0byBcImNsaWNrXCJcblx0XHRcdFx0XHR0YWcuX3NlbCxcblx0XHRcdFx0XHRkYXRhID09IHVuZGVmaW5lZCA/IG51bGwgOiBkYXRhLFxuXHRcdFx0XHRcdHRhZy5faGxyID0gZnVuY3Rpb24gaG5kbHIoZXYpIHtcblx0XHRcdFx0XHRcdHZhciBub2RlcywgbGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRmb3VuZCA9ICF0YWcuXy5pbmxpbmU7XG5cblx0XHRcdFx0XHRcdGlmICghZm91bmQpIHsgLy8gSWYgaW5saW5lLCBmaWx0ZXIgb3V0IGV2ZW50cyBmcm9tIHNpYmxpbmcgZWxlbWVudHMgcHJlY2VkaW5nIG9yIGZvbGxvd2luZyB0YWcuXG5cdFx0XHRcdFx0XHRcdG5vZGVzID0gdGFnLmNvbnRlbnRzKFwiKlwiKTtcblx0XHRcdFx0XHRcdFx0bCA9IG5vZGVzLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCFmb3VuZCAmJiBsLS0pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobm9kZXNbbF0uY29udGFpbnMoZXYudGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGZvdW5kKSB7IC8vIHRhcmdldCBlbGVtIGlzIGluZGVlZCB3aXRoaW4gdGhlIHRhZywgc28gY2FsbCB0aGUge29ufSBoYW5kbGVyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBoYW5kbGVyLmFwcGx5KGNvbnRleHRPYiB8fCBsaW5rQ3R4LmRhdGEsIFtdLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0XHRwYXJhbXMsIC8vIGUuZy4gcGFyMSwgcGFyMlxuXHRcdFx0XHRcdFx0XHRcdGV2LFxuXHRcdFx0XHRcdFx0XHRcdHtjaGFuZ2U6IGV2LnR5cGUsIHZpZXc6IHZpZXcsIGxpbmtDdHg6IGxpbmtDdHh9LFxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgLy8gSWYgdHJpZ2dlcmluZyBldmVudCAoZS5nLiBqc3YtZG9tY2hhbmdlKSBoYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgZXYsIHBhc3MgdGhlbSB0b29cblx0XHRcdFx0XHRcdFx0KSk7XG5cdFx0XHRcdFx0XHRcdC8vIGZvciB7b24gJ2NsaWNrJyBoYW5kbGVyIHBhcjEgcGFyMn0gdXNlIGhhbmRsZXIocGFyMSwgcGFyMiwgZXYsIGRvbWNoYW5nZUV2ZW50QXJncylcblx0XHRcdFx0XHRcdFx0Ly8gZm9yIHtvbiAnanN2LWRvbWNoYW5nZScgaGFuZGxlciBwYXIxIHBhcjJ9IHVzZSBoYW5kbGVyKHBhcjEsIHBhcjIsIGV2LCBkb21jaGFuZ2VFdmVudEFyZ3MsIHRhZ0N0eCwgbGlua0N0eCwgb2JzZXJ2YWJsZUV2ZW50QXJncylcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblVwZGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRvblVuYmluZDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHRpZiAoc2VsZi5hY3RpdmVFbGVtKSB7XG5cdFx0XHRcdHNlbGYuYWN0aXZlRWxlbS5vZmYoc2VsZi5fZXZzLCBzZWxmLl9zZWwsIHNlbGYuX2hscik7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRmbG93OiB0cnVlLFxuXHRcdGNvbnRlbnRDdHg6IGtlZXBQYXJlbnREYXRhQ3R4LFxuXHRcdGRhdGFCb3VuZE9ubHk6IHRydWVcblx0fSxcblx0cmFkaW9ncm91cDoge1xuXHRcdGluaXQ6IGZ1bmN0aW9uKHRhZ0N0eCkge1xuXHRcdFx0dGhpcy5uYW1lID0gdGFnQ3R4LnByb3BzLm5hbWUgfHwgKFwianN2XCIgKyBNYXRoLnJhbmRvbSgpKTtcblx0XHR9LFxuXHRcdG9uQmluZDogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0XHR2YXIgZG9tQ2huZ0NudG5yLFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHQkbGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtID0gKHRhZy5fLmlubGluZSA/IHRhZy5jb250ZW50cyh0cnVlLCBcImlucHV0W3R5cGU9cmFkaW9dXCIpIDogJChsaW5rQ3R4LmVsZW0pLmZpbmQoXCJpbnB1dFt0eXBlPXJhZGlvXVwiKSksXG5cdFx0XHRcdGwgPSAkbGlua2VkRWxlbS5sZW5ndGg7XG5cblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgb3duZWQgYnkgKHJlbmRlcmVkIGJ5KSB0aGlzIHRhZyAobm90IGJ5IGEgY2hpbGRUYWcgc3VjaCBhcyB7Xntmb3J9fSlcblx0XHRcdFx0Ly8gdXNlIGl0IGFzIGNvbnRhaW5lciBmb3IgZGV0ZWN0aW5nIGRvbSBjaGFuZ2VzXG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IHRhZy5jb250ZW50cyhcIipcIilbMF07XG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IGRvbUNobmdDbnRuciAmJiAkLnZpZXcoZG9tQ2huZ0NudG5yKS5jdHgudGFnID09PSB0YWcucGFyZW50ID8gZG9tQ2huZ0NudG5yIDogdGFnLnBhcmVudEVsZW07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkb21DaG5nQ250bnIgPSBsaW5rQ3R4LmVsZW07XG5cdFx0XHR9XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdC8vIENvbmZpZ3VyZSB0aGUgbmFtZSBmb3IgZWFjaCByYWRpbyBpbnB1dCBlbGVtZW50XG5cdFx0XHRcdCRsaW5rZWRFbGVtW2xdLm5hbWUgPSAkbGlua2VkRWxlbVtsXS5uYW1lIHx8IHRhZy5uYW1lO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRXN0YWJsaXNoIGEgZG9tY2hhbmdlIGxpc3RlbmVyIGluIGNhc2UgdGhpcyByYWRpb2dyb3VwIHdyYXBzIGEge157Zm9yfX0gb3Ige157aWZ9fSBvciBzaW1pbGFyIHdoaWNoIG1pZ2h0IGR5bmFtaWNhbGx5IGluc2VydCBuZXcgcmFkaW8gaW5wdXQgZWxlbWVudHNcblx0XHRcdCQoZG9tQ2huZ0NudG5yKS5vbihcImpzdi1kb21jaGFuZ2VcIiwgZnVuY3Rpb24oZXYsIGZvck9ySWZUYWdDdHgpIHtcblx0XHRcdFx0dmFyIGxpbmtlZEVsZW0sXG5cdFx0XHRcdFx0cGFyZW50VGFncyA9IGZvck9ySWZUYWdDdHguY3R4LnBhcmVudFRhZ3M7XG5cdFx0XHRcdGlmICghdGFnLl8uaW5saW5lIHx8IGRvbUNobmdDbnRuciAhPT0gdGFnLnBhcmVudEVsZW0gLy8gVGhlIGRvbUNobmdDbnRuciBpcyBzcGVjaWZpYyB0byB0aGlzIHRhZ1xuXHRcdFx0XHRcdC8vIFRoZSBkb21DaG5nQ250bnIgaXMgdGhlIHBhcmVudEVsZW0gb2YgdGhpcyB0YWcsIHNvIG5lZWQgdG8gbWFrZSBzdXJlIGRvbSBjaGFuZ2UgZXZlbnQgaXMgZm9yXG5cdFx0XHRcdFx0Ly8gYSBjb250ZW50IGNoYW5nZSB3aXRoaW4gdGhpcyB0YWcsIG5vdCBvdXRzaWRlIGl0LlxuXHRcdFx0XHRcdHx8IHBhcmVudFRhZ3MgJiYgcGFyZW50VGFnc1t0YWcudGFnTmFtZV0gPT09IHRhZykge1xuXHRcdFx0XHRcdC8vIENvbnRlbnRzIGhhdmUgY2hhbmdlZCBzbyByZWNyZWF0ZSAkbGlua2VkRWxlbSBmb3IgdGhlIHJhZGlvIGlucHV0IGVsZW1lbnRzIChpbmNsdWRpbmcgcG9zc2libGUgbmV3IG9uZSBqdXN0IGluc2VydGVkKVxuXHRcdFx0XHRcdCRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW0gPSB0YWcuY29udGVudHModHJ1ZSwgXCJpbnB1dFt0eXBlPXJhZGlvXVwiKTtcblx0XHRcdFx0XHRsID0gJGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdC8vIENvbmZpZ3VyZSBiaW5kaW5nICBhbmQgbmFtZSBmb3IgZWFjaCByYWRpbyBpbnB1dCBlbGVtZW50XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtID0gJGxpbmtlZEVsZW1bbF07XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5uYW1lID0gbGlua2VkRWxlbS5uYW1lIHx8IHRhZy5uYW1lO1xuXHRcdFx0XHRcdFx0YmluZFRvKGJpbmRpbmdTdG9yZVt0YWcuX3RnSWRdLCB0YWcsIGxpbmtlZEVsZW0pO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5fanN2Qm5kID0gXCImXCIgKyB0YWcuX3RnSWQgKyBcIitcIjtcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0uY2hlY2tlZCA9IHRhZy5jdnRBcmdzKClbMF0gPT09IGxpbmtlZEVsZW0udmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdG9uVXBkYXRlOiBmdW5jdGlvbihldiwgZXZlbnRBcmdzLCB0YWdDdHhzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHJlcmVuZGVyXG5cdFx0fSxcblx0XHRjb250ZW50Q3R4OiBrZWVwUGFyZW50RGF0YUN0eCxcblx0XHRkYXRhQm91bmRPbmx5OiB0cnVlXG5cdH1cbn0pO1xuXG4kZXh0ZW5kKCR0YWdzW1wiZm9yXCJdLCB7XG5cdC8vb25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIG5ld1RhZ0N0eHMpIHtcblx0XHQvL0NvbnNpZGVyIGFkZGluZyBmaWx0ZXJpbmcgZm9yIHBlcmYgb3B0aW1pemF0aW9uLiBIb3dldmVyIHRoZSBiZWxvdyBwcmV2ZW50cyB1cGRhdGUgb24gc29tZSBzY2VuYXJpb3Mgd2hpY2ggX3Nob3VsZF8gdXBkYXRlIC0gbmFtZWx5IHdoZW4gdGhlcmUgaXMgYW5vdGhlciBhcnJheSBvbiB3aGljaCBmb3IgYWxzbyBkZXBlbmRzLlxuXHRcdC8vdmFyIGksIGwsIHRjaSwgcHJldkFyZztcblx0XHQvL2ZvciAodGNpID0gMDsgKHByZXZBcmcgPSB0aGlzLnRhZ0N0eHNbdGNpXSkgJiYgcHJldkFyZy5hcmdzLmxlbmd0aDsgdGNpKyspIHtcblx0XHQvL1x0aWYgKHByZXZBcmcuYXJnc1swXSAhPT0gbmV3VGFnQ3R4c1t0Y2ldLmFyZ3NbMF0pIHtcblx0XHQvL1x0XHRyZXR1cm4gdHJ1ZTtcblx0XHQvL1x0fVxuXHRcdC8vfVxuXHRcdC8vcmV0dXJuIGZhbHNlO1xuXHQvL30sXG5cdG9uQXJyYXlDaGFuZ2U6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIHRhZ0N0eCwgbGlua0N0eCkge1xuXHRcdHZhciBhcnJheVZpZXcsXG5cdFx0XHR0YXJnZXQgPSBldi50YXJnZXQsXG5cdFx0XHR0YXJnZXRMZW5ndGggPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGNoYW5nZSA9IGV2ZW50QXJncy5jaGFuZ2U7XG5cdFx0aWYgKHRhZy5fLm5vVndzIC8vIENoaWxkIHZpZXdzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0YXJnZXQgaXMgbm90IGh0bWwgLSBlLmcuIGRhdGEtbGluaz1cInRpdGxle2ZvciAuLi59XCJcblx0XHRcdHx8IHRhZy50YWdDdHhzWzFdICYmICggLy8gVGhlcmUgaXMgYW4ge3tlbHNlfX1cblx0XHRcdFx0Y2hhbmdlID09PSBcImluc2VydFwiICYmIHRhcmdldExlbmd0aCA9PT0gZXZlbnRBcmdzLml0ZW1zLmxlbmd0aCAvLyBpbnNlcnRpbmcsIGFuZCBuZXcgbGVuZ3RoIGlzIHNhbWUgYXMgaW5zZXJ0ZWQgbGVuZ3RoLCBzbyBnb2luZyBmcm9tIDAgdG8gblxuXHRcdFx0XHR8fCBjaGFuZ2UgPT09IFwicmVtb3ZlXCIgJiYgIXRhcmdldExlbmd0aCAvLyByZW1vdmluZyAsIGFuZCBuZXcgbGVuZ3RoIDAsIHNvIGdvaW5nIGZyb20gbiB0byAwXG5cdFx0XHQpKSB7XG5cdFx0XHR0YWcucmVmcmVzaCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGFycmF5VmlldyBpbiB0YWcuXy5hcnJWd3MpIHtcblx0XHRcdFx0YXJyYXlWaWV3ID0gdGFnLl8uYXJyVndzW2FycmF5Vmlld107XG5cdFx0XHRcdGlmIChhcnJheVZpZXcuZGF0YSA9PT0gdGFyZ2V0KSB7XG5cdFx0XHRcdFx0YXJyYXlWaWV3Ll8ub25BcnJheUNoYW5nZS5hcHBseShhcnJheVZpZXcsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGFnLmRvbUNoYW5nZSh0YWdDdHgsIGxpbmtDdHgsIGV2ZW50QXJncyk7XG5cdFx0ZXYuZG9uZSA9IHRydWU7XG5cdH0sXG5cdG9uQWZ0ZXJMaW5rOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHR2YXIgaSwgYXJySGFuZGxlciwgYXJyQmluZGluZywgZGF0YSxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRhcnJheUJpbmRpbmdzID0gdGFnLl9hcnMgfHwge30sXG5cdFx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMsXG5cdFx0XHRsID0gdGFnQ3R4cy5sZW5ndGgsXG5cdFx0XHRzZWxlY3RlZCA9IHRhZy5zZWxlY3RlZCB8fCAwO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8PSBzZWxlY3RlZDsgaSsrKSB7XG5cdFx0XHR0YWdDdHggPSB0YWdDdHhzW2ldOyAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRhZ0N0eHMgdXAgdG8gc2VsZWN0ZWRcblx0XHRcdGRhdGEgPSB0YWdDdHgubWFwXG5cdFx0XHRcdD8gdGFnQ3R4Lm1hcC50Z3QgICAgICAgIC8vICdkYXRhJyBpcyBtYXBwZWQgZGF0YVxuXHRcdFx0XHQ6IHRhZ0N0eC5hcmdzLmxlbmd0aFxuXHRcdFx0XHRcdD8gdGFnQ3R4LmFyZ3NbMF0gICAgLy8gb3IgYXJnc1swXVxuXHRcdFx0XHRcdDogdGFnQ3R4LnZpZXcuZGF0YTsgLy8gb3IgZGVmYXVsdHMgdG8gY3VycmVudCBkYXRhLlxuXG5cdFx0XHRpZiAoKGFyckJpbmRpbmcgPSBhcnJheUJpbmRpbmdzW2ldKSAmJiBkYXRhICE9PSBhcnJCaW5kaW5nWzBdKSB7IC8vIElzIHRoZXJlIHByZXZpb3VzIGFycmF5IGRhdGEgb24gdGhpcyB0YWdDdHgsIGRpZmZlcmVudCBmcm9tIG5ldyBkYXRhXG5cdFx0XHRcdCRvYnNlcnZlKGFyckJpbmRpbmdbMF0sIGFyckJpbmRpbmdbMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZSBwcmV2aW91cyBhcnJheVxuXHRcdFx0XHRkZWxldGUgYXJyYXlCaW5kaW5nc1tpXTtcblx0XHRcdH1cblx0XHRcdGlmICghYXJyYXlCaW5kaW5nc1tpXSAmJiAkaXNBcnJheShkYXRhKSkge1xuXHRcdFx0XHQkb2JzZXJ2ZShkYXRhLCBhcnJIYW5kbGVyID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdHZhciB0YWdDdCA9IHRhZ0N0eDtcblx0XHRcdFx0XHR0YWcub25BcnJheUNoYW5nZShldiwgZXZlbnRBcmdzLCB0YWdDdCwgbGlua0N0eCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhcnJheUJpbmRpbmdzW2ldID0gW2RhdGEsIGFyckhhbmRsZXJdOyAvLyBTdG9yZSBhcnJheSBkYXRhIGFuZCBhcnJheUNoYW5nZUhhbmRsZXIgb24gdGFnLl9hcnNbaV1cblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChpID0gc2VsZWN0ZWQgKyAxOyBpIDwgbDsgaSsrKSB7IC8vIElmIHRoZXJlIHdlcmUgcHJldmlvdXMgYmluZGluZ3Mgb24gbGF0ZXIgdGFnQ3R4cywgcmVtb3ZlIHRoZW1cblx0XHRcdGlmIChhcnJCaW5kaW5nID0gYXJyYXlCaW5kaW5nc1tpXSkge1xuXHRcdFx0XHQkb2JzZXJ2ZShhcnJCaW5kaW5nWzBdLCBhcnJCaW5kaW5nWzFdLCB0cnVlKTsgLy91bm9ic2VydmUgcHJldmlvdXMgYmluZGluZ1xuXHRcdFx0XHRkZWxldGUgYXJyYXlCaW5kaW5nc1tpXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGFnLl9hcnMgPSBhcnJheUJpbmRpbmdzO1xuXHR9LFxuXHRvbkRpc3Bvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsLCB0YWcgPSB0aGlzO1xuXHRcdGZvciAobCBpbiB0YWcuX2Fycykge1xuXHRcdFx0JG9ic2VydmUodGFnLl9hcnNbbF1bMF0sIHRhZy5fYXJzW2xdWzFdLCB0cnVlKTsgLy91bm9ic2VydmVcblx0XHR9XG5cdH1cbn0pO1xuXG4kZXh0ZW5kKCR0YWdzW1wiaWZcIl0sIHtcblx0b25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIG5ld1RhZ0N0eHMpIHtcblx0XHR2YXIgdGNpLCBwcmV2QXJnLCBkaWZmZXJlbnQ7XG5cdFx0Zm9yICh0Y2kgPSAwOyAocHJldkFyZyA9IHRoaXMudGFnQ3R4c1t0Y2ldKTsgdGNpKyspIHtcblx0XHRcdGRpZmZlcmVudCA9IHByZXZBcmcucHJvcHMudG1wbCAhPT0gbmV3VGFnQ3R4c1t0Y2ldLnByb3BzLnRtcGwgfHwgcHJldkFyZy5hcmdzLmxlbmd0aCAmJiAhKHByZXZBcmcgPSBwcmV2QXJnLmFyZ3NbMF0pICE9PSAhbmV3VGFnQ3R4c1t0Y2ldLmFyZ3NbMF07XG5cdFx0XHRpZiAoKCF0aGlzLmNvbnZlcnQgJiYgISFwcmV2QXJnKSB8fCBkaWZmZXJlbnQpIHtcblx0XHRcdFx0cmV0dXJuIGRpZmZlcmVudDtcblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgbm90IGEgY2hhbmdlIG9mIHRlbXBsYXRlLCBhbmQgdGhlcmUgaXMgbm8gY29udmVydGVyLCBhbmQgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBib3RoIHRydXRoeSwgcmV0dXJuIGZhbHNlIHRvIGNhbmNlbCB1cGRhdGUuXG5cdFx0XHRcdC8vIChFdmVuIGlmIHZhbHVlcyBvbiBsYXRlciBlbHNlcyBhcmUgZGlmZmVyZW50LCB3ZSBzdGlsbCBkb24ndCB3YW50IHRvIHVwZGF0ZSwgc2luY2UgcmVuZGVyZWQgb3V0cHV0IHdvdWxkIGJlIHVuY2hhbmdlZClcblx0XHRcdFx0Ly8gSWYgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBkaWZmZXJlbnQsIHJldHVybiB0cnVlLCB0byB1cGRhdGVcblx0XHRcdFx0Ly8gSWYgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBib3RoIGZhbHNleSwgbW92ZSB0byB0aGUgbmV4dCB7e2Vsc2UgLi4ufX1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gQm9vbGVhbiB2YWx1ZSBvZiBhbGwgYXJncyBhcmUgdW5jaGFuZ2VkIChmYWxzZXkpLCBzbyByZXR1cm4gZmFsc2UgdG8gY2FuY2VsIHVwZGF0ZVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0b25BZnRlckxpbms6IGZ1bmN0aW9uKHRhZ0N0eCwgbGlua0N0eCwgY3R4LCBldiwgZXZlbnRBcmdzKSB7XG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0dGhpcy5kb21DaGFuZ2UodGFnQ3R4LCBsaW5rQ3R4LCBldmVudEFyZ3MpO1xuXHRcdH1cblx0fVxufSk7XG5cbmZ1bmN0aW9uIG9ic2VydmVQcm9wcyhtYXAsIGV2LCBldmVudEFyZ3MpIHtcblx0aWYgKGV2ZW50QXJncy5jaGFuZ2UgPT09IFwic2V0XCIpIHtcblx0XHR2YXIgdGFyZ2V0ID0gbWFwLnRndCxcblx0XHRcdGwgPSB0YXJnZXQubGVuZ3RoO1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdGlmICh0YXJnZXRbbF0ua2V5ID09PSBldmVudEFyZ3MucGF0aCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGwgPT09IC0xKSB7XG5cdFx0XHRpZiAoZXZlbnRBcmdzLnBhdGggJiYgIWV2ZW50QXJncy5yZW1vdmUpIHtcblx0XHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5pbnNlcnQoe2tleTogZXZlbnRBcmdzLnBhdGgsIHByb3A6IGV2ZW50QXJncy52YWx1ZX0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZXZlbnRBcmdzLnJlbW92ZSkge1xuXHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5yZW1vdmUobCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldFtsXSkuc2V0UHJvcGVydHkoXCJwcm9wXCIsIGV2ZW50QXJncy52YWx1ZSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIG9ic2VydmVNYXBwZWRQcm9wcyhtYXAsIGV2LCBldmVudEFyZ3MpIHtcblx0dmFyIGl0ZW0sXG5cdFx0c291cmNlID0gbWFwLnNyYyxcblx0XHRjaGFuZ2UgPSBldmVudEFyZ3MuY2hhbmdlO1xuXG5cdGlmIChjaGFuZ2UgPT09IFwic2V0XCIpIHtcblx0XHRpZiAoZXZlbnRBcmdzLnBhdGggPT09IFwicHJvcFwiKSB7XG5cdFx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnNldFByb3BlcnR5KGV2LnRhcmdldC5rZXksIGV2ZW50QXJncy52YWx1ZSk7XG5cdFx0fSBlbHNlIHsgLy8gcGF0aCA9PT0gXCJrZXlcIlxuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5yZW1vdmVQcm9wZXJ0eShldmVudEFyZ3Mub2xkVmFsdWUpOyAvLyBXaGVuIGtleSBpcyBtb2RpZmllZCBvYnNlcnZhYmx5LCByZW1vdmUgb2xkIG9uZSBhbmQgc2V0IG5ldyBvbmVcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoZXZlbnRBcmdzLnZhbHVlLCBldi50YXJnZXQucHJvcCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGNoYW5nZSA9PT0gXCJyZW1vdmVcIikge1xuXHRcdGl0ZW0gPSBldmVudEFyZ3MuaXRlbXNbMF07XG5cdFx0JG9ic2VydmFibGUoc291cmNlKS5yZW1vdmVQcm9wZXJ0eShpdGVtLmtleSk7XG5cdFx0ZGVsZXRlIHNvdXJjZVtpdGVtLmtleV07XG5cdH0gZWxzZSBpZiAoY2hhbmdlID09PSBcImluc2VydFwiKSB7XG5cdFx0aXRlbSA9IGV2ZW50QXJncy5pdGVtc1swXTtcblx0XHRpZiAoaXRlbS5rZXkpIHtcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoaXRlbS5rZXksIGl0ZW0ucHJvcCk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHNoYWxsb3dBcnJheUZpbHRlcihhbGxQYXRoIC8qLCBvYmplY3QsIHBhcmVudE9icyovKSB7IC8vIEZpbHRlciB1c2VkIGJ5IHt7cHJvcHN9fSBmb3IgdGhlIG1hcHBlZFByb3BzIHRhcmdldCBhcnJheVxuXHRyZXR1cm4gYWxsUGF0aC5pbmRleE9mKFwiLlwiKSA8IDA7XG59XG5cbiR0YWdzKFwicHJvcHNcIiwge1xuXHRiYXNlVGFnOiBcImZvclwiLFxuXHRkYXRhTWFwOiAkdmlld3MubWFwKHtcblx0XHRnZXRUZ3Q6ICR0YWdzLnByb3BzLmRhdGFNYXAuZ2V0VGd0LFxuXHRcdG9ic1NyYzogb2JzZXJ2ZVByb3BzLFxuXHRcdG9ic1RndDogb2JzZXJ2ZU1hcHBlZFByb3BzLFxuXHRcdHRndEZsdDogc2hhbGxvd0FycmF5RmlsdGVyXG5cdH0pLFxuXHRmbG93OiB0cnVlXG59KTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCBqUXVlcnkgbmFtZXNwYWNlXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kZXh0ZW5kKCQsIHtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09XG5cdC8vIGpRdWVyeSAkLnZpZXcoKSBwbHVnaW5cblx0Ly89PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHZpZXc6ICR2aWV3ID0gZnVuY3Rpb24obm9kZSwgaW5uZXIsIHR5cGUpIHtcblx0XHQvLyAkLnZpZXcoKSByZXR1cm5zIHRvcCB2aWV3XG5cdFx0Ly8gJC52aWV3KG5vZGUpIHJldHVybnMgdmlldyB0aGF0IGNvbnRhaW5zIG5vZGVcblx0XHQvLyAkLnZpZXcoc2VsZWN0b3IpIHJldHVybnMgdmlldyB0aGF0IGNvbnRhaW5zIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnRcblx0XHQvLyAkLnZpZXcobm9kZU9yU2VsZWN0b3IsIHR5cGUpIHJldHVybnMgbmVhcmVzdCBjb250YWluaW5nIHZpZXcgb2YgZ2l2ZW4gdHlwZVxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgXCJyb290XCIpIHJldHVybnMgcm9vdCBjb250YWluaW5nIHZpZXcgKGNoaWxkIG9mIHRvcCB2aWV3KVxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgdHJ1ZSwgdHlwZSkgcmV0dXJucyBuZWFyZXN0IGlubmVyIChjb250YWluZWQpIHZpZXcgb2YgZ2l2ZW4gdHlwZVxuXG5cdFx0ZnVuY3Rpb24gZ2V0SW5uZXJWaWV3KG5kLCBpc1ZsKSB7XG5cdFx0XHRpZiAobmQpIHtcblx0XHRcdFx0dndJbmZvcyA9IHZpZXdJbmZvcyhuZCwgaXNWbCwgck9wZW5WaWV3TWFya2Vycyk7XG5cdFx0XHRcdGZvciAoaiA9IDAsIGsgPSB2d0luZm9zLmxlbmd0aDsgaiA8IGs7IGorKykge1xuXHRcdFx0XHRcdGlmICgodmlldyA9IHZpZXdTdG9yZVt2d0luZm9zW2pdLmlkXSkgJiYgKHZpZXcgPSB2aWV3ICYmIHR5cGUgPyB2aWV3LmdldCh0cnVlLCB0eXBlKSA6IHZpZXcpKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5uZXIgIT09ICEhaW5uZXIpIHtcblx0XHRcdC8vIGlubmVyIG5vdCBib29sZWFuLCBzbyB0aGlzIGlzIHZpZXcobm9kZU9yU2VsZWN0b3IsIHR5cGUpXG5cdFx0XHR0eXBlID0gaW5uZXI7XG5cdFx0XHRpbm5lciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dmFyIHZpZXcsIHZ3SW5mb3MsIGksIGosIGssIGwsIGVsZW1zLFxuXHRcdFx0bGV2ZWwgPSAwLFxuXHRcdFx0Ym9keSA9IGRvY3VtZW50LmJvZHk7XG5cblx0XHRpZiAobm9kZSAmJiBub2RlICE9PSBib2R5ICYmIHRvcFZpZXcuXy51c2VLZXkgPiAxKSB7XG5cdFx0XHQvLyBQZXJmIG9wdGltaXphdGlvbiBmb3IgY29tbW9uIGNhc2VzXG5cblx0XHRcdG5vZGUgPSBcIlwiICsgbm9kZSA9PT0gbm9kZVxuXHRcdFx0XHQ/ICQobm9kZSlbMF1cblx0XHRcdFx0OiBub2RlLmpxdWVyeVxuXHRcdFx0XHRcdD8gbm9kZVswXVxuXHRcdFx0XHRcdDogbm9kZTtcblxuXHRcdFx0aWYgKG5vZGUpIHtcblx0XHRcdFx0aWYgKGlubmVyKSB7XG5cdFx0XHRcdFx0Z2V0SW5uZXJWaWV3KG5vZGUuX2RmLCB0cnVlKTtcblx0XHRcdFx0XHRpZiAoIXZpZXcpIHtcblx0XHRcdFx0XHRcdC8vIFRyZWF0IHN1cHBsaWVkIG5vZGUgYXMgYSBjb250YWluZXIgZWxlbWVudCBhbmQgcmV0dXJuIHRoZSBmaXJzdCB2aWV3IGVuY291bnRlcmVkLlxuXHRcdFx0XHRcdFx0ZWxlbXMgPSBxc2EgPyBub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoYmluZEVsc1NlbCkgOiAkKGJpbmRFbHNTZWwsIG5vZGUpLmdldCgpO1xuXHRcdFx0XHRcdFx0bCA9IGVsZW1zLmxlbmd0aDtcblx0XHRcdFx0XHRcdGZvciAoaSA9IDA7ICF2aWV3ICYmIGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0Z2V0SW5uZXJWaWV3KGVsZW1zW2ldKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZpZXc7XG5cdFx0XHRcdH1cblx0XHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0XHQvLyBNb3ZlIGJhY2sgdGhyb3VnaCBzaWJsaW5ncyBhbmQgdXAgdGhyb3VnaCBwYXJlbnRzIHRvIGZpbmQgcHJlY2VkaW5nIG5vZGUgd2hpY2ggaXMgYSBfcHJ2IChwcmV2Tm9kZSlcblx0XHRcdFx0XHQvLyBzY3JpcHQgbWFya2VyIG5vZGUgZm9yIGEgbm9uLWVsZW1lbnQtY29udGVudCB2aWV3LCBvciBhIF9wcnYgKGZpcnN0IG5vZGUpIGZvciBhbiBlbENudCB2aWV3XG5cdFx0XHRcdFx0aWYgKHZ3SW5mb3MgPSB2aWV3SW5mb3Mobm9kZSwgdW5kZWZpbmVkLCByVmlld01hcmtlcnMpKSB7XG5cdFx0XHRcdFx0XHRsID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdFx0XHRcdHZpZXcgPSB2d0luZm9zW2xdO1xuXHRcdFx0XHRcdFx0XHRpZiAodmlldy5vcGVuKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGxldmVsIDwgMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmlldyA9IHZpZXdTdG9yZVt2aWV3LmlkXTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB2aWV3ICYmIHR5cGUgPyB2aWV3LmdldCh0eXBlKSA6IHZpZXcgfHwgdG9wVmlldztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bGV2ZWwtLTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBsZXZlbCBzdGFydHMgYXQgemVyby4gSWYgd2UgaGl0IGEgdmlldy5jbG9zZSwgdGhlbiB3ZSBtb3ZlIGxldmVsIHRvIDEsIGFuZCB3ZSBkb24ndCByZXR1cm4gYSB2aWV3IHVudGlsXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgYXJlIGJhY2sgYXQgbGV2ZWwgemVybyAob3IgYSBwYXJlbnQgdmlldyB3aXRoIGxldmVsIDwgMClcblx0XHRcdFx0XHRcdFx0XHRsZXZlbCsrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZyB8fCBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRvcFZpZXc7XG5cdH0sXG5cblx0bGluazogJGxpbmssXG5cdHVubGluazogJHVubGluayxcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PVxuXHQvLyBvdmVycmlkZSAkLmNsZWFuRGF0YVxuXHQvLz09PT09PT09PT09PT09PT09PT09PVxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKGVsZW1zKSB7XG5cdFx0aWYgKGVsZW1zLmxlbmd0aCAmJiBpc0NsZWFuQ2FsbCkge1xuXHRcdFx0Ly8gUmVtb3ZlIEpzVmlld3MgYmluZGluZ3MuIEFsc28sIHJlbW92ZSBmcm9tIHRoZSBET00gYW55IGNvcnJlc3BvbmRpbmcgc2NyaXB0IG1hcmtlciBub2Rlc1xuXHRcdFx0Y2xlYW4oZWxlbXMpO1xuXHRcdH1cblx0XHRvbGRDbGVhbkRhdGEuYXBwbHkoJCwgYXJndW1lbnRzKTtcblx0fVxufSk7XG5cbi8vIFBvc3NpYmxlIGZ1dHVyZSBhZGRpdGlvbiAtIGUuZy4gZm9yIGNrZWRpdG9yIHRhZyBjb250cm9sXG4vLyR2aWV3cy51dGlsaXR5ID0ge1xuLy9cdHZhbGlkYXRlOiBmdW5jdGlvbihodG1sKSB7XG4vL1x0XHR0cnkge1xuLy9cdFx0XHR0b3BWaWV3LmxpbmsodW5kZWZpbmVkLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaHRtbCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIDEpO1xuLy9cdFx0fVxuLy9cdFx0Y2F0Y2ggKGUpIHtcbi8vXHRcdFx0cmV0dXJuIGUubWVzc2FnZTtcbi8vXHRcdH1cbi8vXHR9XG4vL307XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIGpRdWVyeSBpbnN0YW5jZSBwbHVnaW5zXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJGV4dGVuZCgkLmZuLCB7XG5cdGxpbms6IGZ1bmN0aW9uKGV4cHIsIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0XHRyZXR1cm4gJGxpbmsoZXhwciwgdGhpcywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSk7XG5cdH0sXG5cdHVubGluazogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICR1bmxpbmsodGhpcyk7XG5cdH0sXG5cdHZpZXc6IGZ1bmN0aW9uKGlubmVyLCB0eXBlKSB7XG5cdFx0cmV0dXJuICR2aWV3KHRoaXNbMF0sIGlubmVyLCB0eXBlKTtcblx0fVxufSk7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPdmVycmlkZSBqUXVlcnkgbWV0aG9kcyB0aGF0IGNhbGwgb3VyIG92ZXJyaWRkZW4gY2xlYW5EYXRhLCBmb3IgZGlzcG9zYWwgZXRjLlxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJC5lYWNoKFtIVE1MLCBcInJlcGxhY2VXaXRoXCIsIFwiZW1wdHlcIiwgXCJyZW1vdmVcIl0sIGZ1bmN0aW9uKGksIG5hbWUpIHtcblx0dmFyIG9sZEZuID0gJC5mbltuYW1lXTtcblx0JC5mbltuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciByZXN1bHQ7XG5cdFx0aXNDbGVhbkNhbGwgPSAxOyAvLyBNYWtlIHN1cmUgY2xlYW5EYXRhIGRvZXMgZGlzcG9zYWwgb25seSB3aGVuIGNvbWluZyBmcm9tIHRoZXNlIGNhbGxzLlxuXHRcdHRyeSB7XG5cdFx0XHRyZXN1bHQgPSBvbGRGbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdH1cblx0XHRmaW5hbGx5IHtcblx0XHRcdGlzQ2xlYW5DYWxsID0gMDtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcbn0pO1xuXG4vLz09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIHRvcFZpZXdcbi8vPT09PT09PT09PT09PT09XG5cbmFkZExpbmtNZXRob2RzKCRleHRlbmQodG9wVmlldyA9ICRzdWIudG9wVmlldywge3RtcGw6IHtsaW5rczoge319fSkpO1xuXG52aWV3U3RvcmUgPSB7MDogdG9wVmlld307IC8vIFRvcC1sZXZlbCB2aWV3XG4vLz09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kICQudmlld3Ncbi8vPT09PT09PT09PT09PT09XG5cbiR2aWV3cy5nZXRDdHggPSBmdW5jdGlvbihwYXJhbSkgeyAvLyBSZXR1cm4gdmFsdWUgb2YgY3R4LmZvbywgaW5jbHVkaW5nIGZvciBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMsIH5mb289ZXhwclxuXHRpZiAocGFyYW0gJiYgcGFyYW0uX2NwKSB7IC8vIElmIHRoaXMgaGVscGVyIHJlc291cmNlIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIsIH5mb289ZXhwclxuXHRcdHBhcmFtID0gIHBhcmFtWzFdKHBhcmFtWzBdLmRhdGEsIHBhcmFtWzBdLCAkc3ViKTtcblx0fVxuXHRyZXR1cm4gcGFyYW07XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCAkLnZpZXdzLnN1YlxuLy89PT09PT09PT09PT09PT09PT09XG5cbiRzdWIuX2NwID0gZnVuY3Rpb24ocGFyYW1WYWwsIHBhcmFtcywgdmlldykgeyAvLyBHZXQgY29tcGlsZWQgY29udGV4dHVhbCBwYXJhbWV0ZXJzIChvciBwcm9wZXJ0aWVzKSB+Zm9vPWV4cHIuXG5cdGlmICh2aWV3LmxpbmtlZCkgeyAvLyBJbiBKc1ZpZXdzLCByZXR1cm5zIFt2aWV3LCBsaW5rRm5dIHdoZXJlIGxpbmtGbiBpcyBjb21waWxlZCBmdW5jdGlvbiBmb3IgZXhwcmVzc2lvblxuXHRcdHBhcmFtcyA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBwYXJhbXMgKyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0dmFyIHRtcGwgPSB2aWV3LnRtcGwsXG5cdFx0XHRsaW5rcyA9IHRvcFZpZXcudG1wbC5saW5rcywgLy8gVXNlIHRvcFZpZXcgbGlua3MsIGFzIGZvciBjb21waWxlZCB0b3AtbGV2ZWwgbGlua2luZyBleHByZXNzaW9ucy4gVG8gZG8gLSBzaG91bGQgdGhpcyBldmVyIGdldCBkaXNwb3NlZD9cblx0XHRcdGxpbmtGbiA9IGxpbmtzW3BhcmFtc107XG5cdFx0aWYgKCFsaW5rRm4pIHtcblx0XHRcdGxpbmtzW3BhcmFtc10gPSBsaW5rRm4gPSAkc3ViLnRtcGxGbihwYXJhbXMsIHRtcGwsIHRydWUpO1xuXHRcdH1cblx0XHRwYXJhbVZhbCA9IFt2aWV3LCBsaW5rRm5dO1xuXHRcdHBhcmFtVmFsLl9jcCA9IHRydWU7IC8vIEZsYWcgdGhhdCB0aGlzIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXJcblx0fVxuXHRyZXR1cm4gcGFyYW1WYWw7IC8vIEluIEpzUmVuZGVyIHJldHVybnMgZXZhbHVhdGVkIGV4cHJlc3Npb25cbn07XG5cbiRzdWIuX2NlbyA9IGZ1bmN0aW9uIGNsb25lRXhwck9iamVjdHMob2JzKSB7ICAvLyBDbG9uZSBleHByT2JzIHNvIHRoYXQgZWFjaCByZWZlcmVuY2VkIGNvbnRleHR1YWwgcGFyYW1ldGVyIH5mb28gdXNlcyBpdHMgb3duIGV4cHJPYiBpbnN0YW5jZXNcblx0dmFyIG9iLFxuXHRcdGNsb25lcyA9IG9icyxcblx0XHRsID0gb2JzLmxlbmd0aDtcblx0aWYgKGwpIHtcblx0XHRjbG9uZXMgPSBbXTtcblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRvYiA9IG9ic1tsXTtcblx0XHRcdGlmIChvYi5fanN2KSB7XG5cdFx0XHRcdG9iID0gJGV4dGVuZCh7fSwgb2IpOyAgICAgICAgICAgICAgLy8gSWYgYW4gZXhwck9iLCBjbG9uZSBpdC4gSWYgYSBzdHJpbmcsIGtlZXAgYXMgaXNcblx0XHRcdFx0b2IucHJtID0gY2xvbmVFeHByT2JqZWN0cyhvYi5wcm0pOyAvLyBSZWN1cnNpdmVseSBjbG9uZSBleHByT2JzIGluIHBhcmFtZXRlcnMsIHRvb1xuXHRcdFx0fVxuXHRcdFx0Y2xvbmVzLnVuc2hpZnQob2IpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY2xvbmVzO1xufTtcblxuJHN1Yi5fZ2NjYiA9IGZ1bmN0aW9uKHZpZXcpIHsgLy8gUmV0dXJuIGEgY2FsbGJhY2sgZm9yIGFjY2Vzc2luZyB0aGUgY29udGV4dCBvZiBhIHRlbXBsYXRlL2RhdGEtbGluayBleHByZXNzaW9uIC0gYW5kIGNvbnZlcnRpbmcgfmZvbywgI2ZvbyBldGMuXG5cdC8vIFRPRE8gQ29uc2lkZXIgZXhwb3Npbmcgb3IgYWxsb3dpbmcgb3ZlcnJpZGUsIGFzIHB1YmxpYyBBUElcblx0cmV0dXJuIGZ1bmN0aW9uKHBhdGgsIG9iamVjdCwgZGVwdGgpIHtcblx0XHQvLyBUT0RPIGNvbnNpZGVyIG9ubHkgY2FsbGluZyB0aGUgY29udGV4dENiIG9uIHRoZSBpbml0aWFsIHRva2VuIGluIHBhdGggJ35hLmIuYycgYW5kIG5vdCBjYWxsaW5nIGFnYWluIG9uXG5cdFx0Ly8gdGhlIGluZGl2aWR1YWwgdG9rZW5zLCAnYScsICdiJywgJ2MnLi4uIEN1cnJlbnRseSBpdCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXNcblx0XHR2YXIgdG9rZW5zLCB0YWcsIGl0ZW1zLCBoZWxwZXIsIGxhc3QsIG5leHRQYXRoLCBsO1xuXHRcdGlmICh2aWV3ICYmIHBhdGgpIHtcblx0XHRcdGlmIChwYXRoLl9qc3YpIHtcblx0XHRcdFx0cmV0dXJuIHBhdGguX2pzdi5jYWxsKHZpZXcudG1wbCwgb2JqZWN0LCB2aWV3LCAkc3ViKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gXCJ+XCIpIHtcblx0XHRcdFx0Ly8gV2UgcmV0dXJuIG5ldyBpdGVtcyB0byBpbnNlcnQgaW50byB0aGUgc2VxdWVuY2UsIHJlcGxhY2luZyB0aGUgXCJ+YS5iLmNcIiBzdHJpbmc6XG5cdFx0XHRcdC8vIFtoZWxwZXJPYmplY3QgJ2EnLCBcImEuYi5jXCIgY3VycmVudERhdGFJdGVtXSBzbyBjdXJyZW50RGF0YUl0ZW0gYmVjb21lcyB0aGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50IHBhdGhzLlxuXHRcdFx0XHRpZiAocGF0aC5zbGljZSgwLCA0KSA9PT0gXCJ+dGFnXCIpIHtcblx0XHRcdFx0XHR0YWcgPSB2aWV3LmN0eDtcblx0XHRcdFx0XHRpZiAocGF0aC5jaGFyQXQoNCkgPT09IFwiLlwiKSB7XG5cdFx0XHRcdFx0XHQvLyBcIn50YWcueHh4XCJcblx0XHRcdFx0XHRcdHRva2VucyA9IHBhdGguc2xpY2UoNSkuc3BsaXQoXCIuXCIpO1xuXHRcdFx0XHRcdFx0dGFnID0gdGFnLnRhZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRva2Vucykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRhZyA/IFt0YWcsIHRva2Vucy5qb2luKFwiLlwiKSwgb2JqZWN0XSA6IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRwYXRoID0gcGF0aC5zbGljZSgxKS5zcGxpdChcIi5cIik7XG5cdFx0XHRcdGlmIChoZWxwZXIgPSB2aWV3LmhscChsYXN0ID0gcGF0aC5zaGlmdCgpLCB0cnVlKSkge1xuXHRcdFx0XHRcdGlmIChoZWxwZXIuX2NwKSB7ICAvLyBoZWxwZXIgZm9yIChjb250ZXh0dWFsIHBhcmFtZXRlciB+Zm9vPS4uLikgaXMgYW4gYXJyYXkgLSBbdmlldywgY3R4UHJtRGVwZW5kZW5jaWVzIC4uLl1cblx0XHRcdFx0XHRcdGlmIChwYXRoLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRuZXh0UGF0aCA9IFwiLlwiICsgcGF0aC5qb2luKFwiLlwiKTtcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGhlbHBlcltsID0gaGVscGVyLmxlbmd0aC0xXTtcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3QuX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdGxhc3Quc2IgPSBuZXh0UGF0aDtcblx0XHRcdFx0XHRcdFx0XHRsYXN0LmJuZCA9ICEhZGVwdGg7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0aGVscGVyW2xdID0gKGxhc3QgKyBuZXh0UGF0aCkucmVwbGFjZShcIiNkYXRhLlwiLCBcIlwiKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobGFzdC5zbGljZSgwLCA1KSA9PT0gXCIjdmlld1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRoZWxwZXJbbF0gPSBoZWxwZXJbbF0uc2xpY2UoNik7XG5cdFx0XHRcdFx0XHRcdFx0XHRoZWxwZXIuc3BsaWNlKGwsIDAsIHZpZXcpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aXRlbXMgPSBbaGVscGVyXTsgLy8gQ29udGV4dHVhbCBwYXJhbWV0ZXJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhdGgubGVuZ3RoIHx8ICRpc0Z1bmN0aW9uKGhlbHBlcikpIHtcblx0XHRcdFx0XHRcdGl0ZW1zID0gW2hlbHBlciwgcGF0aC5qb2luKFwiLlwiKSwgb2JqZWN0XTsgLy8gMndheSBiaW5kbmcgb24gfmZvby5oZWxwZXJMZWFmUHJvcGVydHkgb3IgfmNvbXB1dGVkKCkgb3IgfmNvbnRleHR1YWxQYXJhbVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaXRlbXMgfHwgW107XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdC8vIFdlIHJldHVybiBuZXcgaXRlbXMgdG8gaW5zZXJ0IGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIFwiI2EuYi5jXCIgc3RyaW5nOiBbdmlldywgXCJhLmIuY1wiIGN1cnJlbnREYXRhSXRlbV1cblx0XHRcdFx0Ly8gc28gY3VycmVudERhdGFJdGVtIGJlY29tZXMgdGhlIG9iamVjdCBmb3Igc3Vic2VxdWVudCBwYXRocy4gVGhlICd0cnVlJyBmbGFnIG1ha2VzIHRoZSBwYXRocyBiaW5kIG9ubHkgdG8gbGVhZiBjaGFuZ2VzLlxuXHRcdFx0XHRyZXR1cm4gcGF0aCA9PT0gXCIjZGF0YVwiID8gW10gOiBbdmlldywgcGF0aC5yZXBsYWNlKHJWaWV3UGF0aCwgXCJcIiksIG9iamVjdF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgJC52aWV3cy5zZXR0aW5nc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09XG5cbm9sZEFkdlNldCA9ICRzdWIuYWR2U2V0O1xuXG4kc3ViLmFkdlNldCA9IGZ1bmN0aW9uKCkgeyAvLyByZWZyZXNoIGFkdmFuY2VkIHNldHRpbmdzXG5cdG9sZEFkdlNldC5jYWxsKCRzdWIpO1xuXHRnbG9iYWwuX2pzdiA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl9qc3Zcblx0XHQ/ICRleHRlbmQoZ2xvYmFsLl9qc3YgfHwge30sIHsgLy8gY3JlYXRlIGdsb2JhbCBfanN2LCBmb3IgYWNjZXNzaW5nIHZpZXdzLCBldGNcblx0XHRcdFx0dmlld3M6IHZpZXdTdG9yZSxcblx0XHRcdFx0YmluZGluZ3M6IGJpbmRpbmdTdG9yZVxuXHRcdFx0fSlcblx0XHQ6IHVuZGVmaW5lZDsgLy8gSW4gSUU4IGNhbm5vdCBkbyBkZWxldGUgZ2xvYmFsLl9qc3Zcblx0JHZpZXdzTGlua0F0dHIgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5saW5rQXR0cjtcblx0bGlua1ZpZXdzU2VsID0gYmluZEVsc1NlbCArIFwiLFtcIiArICR2aWV3c0xpbmtBdHRyICsgXCJdXCI7XG5cdHdyYXBNYXAgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5fd207XG5cdHdyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjtcblx0d3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcblx0d3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG59O1xuXG4kdmlld3NTZXR0aW5ncy5hZHZhbmNlZCh7XG5cdGxpbmtBdHRyOiBcImRhdGEtbGlua1wiLFxuXHR1c2VWaWV3czogZmFsc2UsXG5cdG5vVmFsaWRhdGU6IGZhbHNlLFxuXHQvLyB3cmFwTWFwIHByb3ZpZGUgYXBwcm9wcmlhdGUgd3JhcHBlcnMgZm9yIGluc2VydGluZyBpbm5lckhUTUwsIHVzZWQgaW4gaW5zZXJ0QmVmb3JlXG5cdC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApXG5cdC8vIFRPRE8gaW52ZXN0aWdhdGUgd2hldGhlciBtb3JlIHJlY2VudCBqUXVlcnkgaW1wbGVtZW50YXRpb24gdXNpbmcgd3JhcE1hcCBpbiBkb21NYW5pcC8kKCkuaHRtbCgpIGV0Yy4gaXMgYmV0dGVyIG9wdGltaXplZCBub3cuLi5cblx0X3dtOiB7XG5cdFx0b3B0aW9uOiBbMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCJdLFxuXHRcdGxlZ2VuZDogWzEsIFwiPGZpZWxkc2V0PlwiLCBcIjwvZmllbGRzZXQ+XCJdLFxuXHRcdGFyZWE6IFsxLCBcIjxtYXA+XCIsIFwiPC9tYXA+XCJdLFxuXHRcdHBhcmFtOiBbMSwgXCI8b2JqZWN0PlwiLCBcIjwvb2JqZWN0PlwiXSxcblx0XHR0aGVhZDogWzEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCJdLFxuXHRcdHRyOiBbMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIl0sXG5cdFx0dGQ6IFszLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiXSxcblx0XHRjb2w6IFsyLCBcIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiXSxcblx0XHRzdmdfbnM6IFsxLCBcIjxzdmc+XCIsIFwiPC9zdmc+XCJdLFxuXHRcdC8vIElFNi04IGNhbid0IHNlcmlhbGl6ZSBsaW5rLCBzY3JpcHQsIHN0eWxlLCBvciBhbnkgaHRtbDUgKE5vU2NvcGUpIHRhZ3MsXG5cdFx0Ly8gdW5sZXNzIHdyYXBwZWQgaW4gYSBkaXYgd2l0aCBub24tYnJlYWtpbmcgY2hhcmFjdGVycyBpbiBmcm9udCBvZiBpdC5cblx0XHRkaXY6ICQuc3VwcG9ydC5odG1sU2VyaWFsaXplID8gWzAsIFwiXCIsIFwiXCJdIDogWzEsIFwiWDxkaXY+XCIsIFwiPC9kaXY+XCJdXG5cdH0sXG5cdF9mZToge1xuXHRcdGlucHV0OiB7XG5cdFx0XHRmcm9tOiBpbnB1dEF0dHJpYiwgdG86IFwidmFsdWVcIlxuXHRcdH0sXG5cdFx0dGV4dGFyZWE6IHZhbHVlQmluZGluZyxcblx0XHRzZWxlY3Q6IHZhbHVlQmluZGluZyxcblx0XHRvcHRncm91cDoge1xuXHRcdFx0dG86IFwibGFiZWxcIlxuXHRcdH1cblx0fVxufSk7XG5cblx0cmV0dXJuICQ7XG59LCB3aW5kb3cpKTtcbiIsIi8qISBqc3ZpZXdzLmpzIHYwLjkuODMgKEJldGEpIHNpbmdsZS1maWxlIHZlcnNpb246IGh0dHA6Ly9qc3ZpZXdzLmNvbS8gKi9cbi8qISBpbmNsdWRlcyBKc1JlbmRlciwgSnNPYnNlcnZhYmxlIGFuZCBKc1ZpZXdzIC0gc2VlOiBodHRwOi8vanN2aWV3cy5jb20vI2Rvd25sb2FkICovXG5cbi8qIEludGVyYWN0aXZlIGRhdGEtZHJpdmVuIHZpZXdzIHVzaW5nIEpzUmVuZGVyIHRlbXBsYXRlcyAqL1xuXG4vLzw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCBKc1JlbmRlciA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbi8qIEpzUmVuZGVyOlxuICogU2VlIGh0dHA6Ly9qc3ZpZXdzLmNvbS8janNyZW5kZXIgYW5kIGh0dHA6Ly9naXRodWIuY29tL0JvcmlzTW9vcmUvanNyZW5kZXJcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vanNoaW50IC1XMDE4LCAtVzA0MVxuXG4oZnVuY3Rpb24oZmFjdG9yeSwgZ2xvYmFsKSB7XG5cdC8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG5cdHZhciAkID0gZ2xvYmFsLmpRdWVyeTtcblxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHsgLy8gQ29tbW9uSlMgZS5nLiBCcm93c2VyaWZ5XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSAkXG5cdFx0XHQ/IGZhY3RvcnkoZ2xvYmFsLCAkKVxuXHRcdFx0OiBmdW5jdGlvbigkKSB7IC8vIElmIG5vIGdsb2JhbCBqUXVlcnksIHRha2UgalF1ZXJ5IHBhc3NlZCBhcyBwYXJhbWV0ZXI6IHJlcXVpcmUoXCJqc3ZpZXdzXCIpKGpRdWVyeSlcblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoZ2xvYmFsLCAkKTtcblx0XHRcdH07XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHsgLy8gQU1EIHNjcmlwdCBsb2FkZXIsIGUuZy4gUmVxdWlyZUpTXG5cdFx0ZGVmaW5lKFtcImpxdWVyeVwiXSwgZnVuY3Rpb24oJCkge1xuXHRcdFx0cmV0dXJuIGZhY3RvcnkoZ2xvYmFsLCAkKTtcblx0XHR9KTsgLy8gUmVxdWlyZSBqUXVlcnlcblx0fSBlbHNlIHsgLy8gQnJvd3NlciB1c2luZyBwbGFpbiA8c2NyaXB0PiB0YWdcblx0XHRmYWN0b3J5KGdsb2JhbCwgZmFsc2UpO1xuXHR9XG59IChcblxuLy8gZmFjdG9yeSAoZm9yIGpzdmlld3MuanMpXG5mdW5jdGlvbihnbG9iYWwsICQpIHtcblwidXNlIHN0cmljdFwiO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCB2YXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG52YXIgc2V0R2xvYmFscyA9ICQgPT09IGZhbHNlOyAvLyBPbmx5IHNldCBnbG9iYWxzIGlmIHNjcmlwdCBibG9jayBpbiBicm93c2VyIChub3QgQU1EIGFuZCBub3QgQ29tbW9uSlMpXG5cbiQgPSAkIHx8IGdsb2JhbC5qUXVlcnk7IC8vICQgaXMgalF1ZXJ5IHBhc3NlZCBpbiBieSBDb21tb25KUyBsb2FkZXIgKEJyb3dzZXJpZnkpLCBvciBnbG9iYWwgalF1ZXJ5LlxuXG5pZiAoISQgfHwgISQuZm4pIHtcblx0Ly8galF1ZXJ5IGlzIG5vdCBsb2FkZWQuXG5cdHRocm93IFwiSnNWaWV3cyByZXF1aXJlcyBqUXVlcnlcIjsgLy8gV2UgcmVxdWlyZSBqUXVlcnlcbn1cblxudmFyIHZlcnNpb25OdW1iZXIgPSBcInYwLjkuODNcIixcblxuXHRqc3ZTdG9yZU5hbWUsIHJUYWcsIHJUbXBsU3RyaW5nLCB0b3BWaWV3LCAkdmlld3MsICRvYnNlcnZlLCAkb2JzZXJ2YWJsZSwgJGV4cGFuZG8sXG5cbi8vVE9ET1x0dG1wbEZuc0NhY2hlID0ge30sXG5cdCRpc0Z1bmN0aW9uLCAkaXNBcnJheSwgJHRlbXBsYXRlcywgJGNvbnZlcnRlcnMsICRoZWxwZXJzLCAkdGFncywgJHN1YiwgJHN1YlNldHRpbmdzLCAkc3ViU2V0dGluZ3NBZHZhbmNlZCwgJHZpZXdzU2V0dGluZ3MsIGRlbGltT3BlbkNoYXIwLCBkZWxpbU9wZW5DaGFyMSwgZGVsaW1DbG9zZUNoYXIwLCBkZWxpbUNsb3NlQ2hhcjEsIGxpbmtDaGFyLCBzZXR0aW5nLCBiYXNlT25FcnJvcixcblxuXHRyUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHQvLyAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cblx0clBhcmFtcyA9IC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICAgICAgICAgbGZ0UHJuMCAgICAgICAgbGZ0UHJuICAgICAgICBib3VuZCAgICAgICAgICAgIHBhdGggICAgb3BlcmF0b3IgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgICAgICAgICAgICAgcGF0aDIgICAgICAgcHJuICAgIGNvbW1hICAgbGZ0UHJuMiAgIGFwb3MgcXVvdCAgICAgIHJ0UHJuIHJ0UHJuRG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuMiAgc3BhY2Vcblx0Ly8gKGxlZnQgcGFyZW4/IGZvbGxvd2VkIGJ5IChwYXRoPyBmb2xsb3dlZCBieSBvcGVyYXRvcikgb3IgKHBhdGggZm9sbG93ZWQgYnkgbGVmdCBwYXJlbj8pKSBvciBjb21tYSBvciBhcG9zIG9yIHF1b3Qgb3IgcmlnaHQgcGFyZW4gb3Igc3BhY2VcblxuXHRpc1JlbmRlckNhbGwsXG5cdHJOZXdMaW5lID0gL1sgXFx0XSooXFxyXFxufFxcbnxcXHIpL2csXG5cdHJVbmVzY2FwZVF1b3RlcyA9IC9cXFxcKFsnXCJdKS9nLFxuXHRyRXNjYXBlUXVvdGVzID0gL1snXCJcXFxcXS9nLCAvLyBFc2NhcGUgcXVvdGVzIGFuZCBcXCBjaGFyYWN0ZXJcblx0ckJ1aWxkSGFzaCA9IC8oPzpcXHgwOHxeKShvbmVycm9yOik/KD86KH4/KSgoW1xcdyRfXFwuXSspOik/KFteXFx4MDhdKykpXFx4MDgoLCk/KFteXFx4MDhdKykvZ2ksXG5cdHJUZXN0RWxzZUlmID0gL15pZlxccy8sXG5cdHJGaXJzdEVsZW0gPSAvPChcXHcrKVs+XFxzXS8sXG5cdHJBdHRyRW5jb2RlID0gL1tcXHgwMGA+PFwiJyY9XS9nLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdHJJc0h0bWwgPSAvW1xceDAwYD48XFxcIicmPV0vLFxuXHRySGFzSGFuZGxlcnMgPSAvXm9uW0EtWl18XmNvbnZlcnQoQmFjayk/JC8sXG5cdHJXcmFwcGVkSW5WaWV3TWFya2VyID0gL15cXCNcXGQrX2BbXFxzXFxTXSpcXC9cXGQrX2AkLyxcblx0ckh0bWxFbmNvZGUgPSByQXR0ckVuY29kZSxcblx0dmlld0lkID0gMCxcblx0Y2hhckVudGl0aWVzID0ge1xuXHRcdFwiJlwiOiBcIiZhbXA7XCIsXG5cdFx0XCI8XCI6IFwiJmx0O1wiLFxuXHRcdFwiPlwiOiBcIiZndDtcIixcblx0XHRcIlxceDAwXCI6IFwiJiMwO1wiLFxuXHRcdFwiJ1wiOiBcIiYjMzk7XCIsXG5cdFx0J1wiJzogXCImIzM0O1wiLFxuXHRcdFwiYFwiOiBcIiYjOTY7XCIsXG5cdFx0XCI9XCI6IFwiJiM2MTtcIlxuXHR9LFxuXHRIVE1MID0gXCJodG1sXCIsXG5cdE9CSkVDVCA9IFwib2JqZWN0XCIsXG5cdHRtcGxBdHRyID0gXCJkYXRhLWpzdi10bXBsXCIsXG5cdGpzdlRtcGwgPSBcImpzdlRtcGxcIixcblx0aW5kZXhTdHIgPSBcIkZvciAjaW5kZXggaW4gbmVzdGVkIGJsb2NrIHVzZSAjZ2V0SW5kZXgoKS5cIixcblx0JHJlbmRlciA9IHt9LFxuXG5cdGpzciA9IGdsb2JhbC5qc3JlbmRlcixcblx0anNyVG9KcSA9IGpzciAmJiAkICYmICEkLnJlbmRlciwgLy8gSnNSZW5kZXIgYWxyZWFkeSBsb2FkZWQsIHdpdGhvdXQgalF1ZXJ5LiBidXQgd2Ugd2lsbCByZS1sb2FkIGl0IG5vdyB0byBhdHRhY2ggdG8galF1ZXJ5XG5cblx0anN2U3RvcmVzID0ge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVG1wbFxuXHRcdH0sXG5cdFx0dGFnOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVGFnXG5cdFx0fSxcblx0XHR2aWV3TW9kZWw6IHtcblx0XHRcdGNvbXBpbGU6IGNvbXBpbGVWaWV3TW9kZWxcblx0XHR9LFxuXHRcdGhlbHBlcjoge30sXG5cdFx0Y29udmVydGVyOiB7fVxuXHR9O1xuXG5cdC8vIHZpZXdzIG9iamVjdCAoJC52aWV3cyBpZiBqUXVlcnkgaXMgbG9hZGVkLCBqc3JlbmRlci52aWV3cyBpZiBubyBqUXVlcnksIGUuZy4gaW4gTm9kZS5qcylcblx0JHZpZXdzID0ge1xuXHRcdGpzdmlld3M6IHZlcnNpb25OdW1iZXIsXG5cdFx0c3ViOiB7XG5cdFx0XHQvLyBzdWJzY3JpcHRpb24sIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0VmlldzogVmlldyxcblx0XHRcdEVycjogSnNWaWV3c0Vycm9yLFxuXHRcdFx0dG1wbEZuOiB0bXBsRm4sXG5cdFx0XHRwYXJzZTogcGFyc2VQYXJhbXMsXG5cdFx0XHRleHRlbmQ6ICRleHRlbmQsXG5cdFx0XHRleHRlbmRDdHg6IGV4dGVuZEN0eCxcblx0XHRcdHN5bnRheEVycjogc3ludGF4RXJyb3IsXG5cdFx0XHRvblN0b3JlOiB7fSxcblx0XHRcdGFkZFNldHRpbmc6IGFkZFNldHRpbmcsXG5cdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRhbGxvd0NvZGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0YWR2U2V0OiBub29wLCAvLyBVcGRhdGUgYWR2YW5jZWQgc2V0dGluZ3Ncblx0XHRcdF90aHM6IHRhZ0hhbmRsZXJzRnJvbVByb3BzLFxuXHRcdFx0X3RnOiBmdW5jdGlvbigpIHt9LCAvLyBDb25zdHJ1Y3RvciBmb3IgdGFnRGVmXG5cdFx0XHRfY252dDogY29udmVydFZhbCxcblx0XHRcdF90YWc6IHJlbmRlclRhZyxcblx0XHRcdF9lcjogZXJyb3IsXG5cdFx0XHRfZXJyOiBvblJlbmRlckVycm9yLFxuXHRcdFx0X2h0bWw6IGh0bWxFbmNvZGUsXG5cdFx0XHRfY3A6IHJldFZhbCwgLy8gR2V0IGNvbXBpbGVkIGNvbnRleHR1YWwgcGFyYW1ldGVycyAob3IgcHJvcGVydGllcykgfmZvbz1leHByLiBJbiBKc1JlbmRlciwgc2ltcGx5IHJldHVybnMgdmFsLlxuXHRcdFx0X3NxOiBmdW5jdGlvbih0b2tlbikge1xuXHRcdFx0XHRpZiAodG9rZW4gPT09IFwiY29uc3RydWN0b3JcIikge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0b2tlbjtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNldHRpbmdzOiB7XG5cdFx0XHRkZWxpbWl0ZXJzOiAkdmlld3NEZWxpbWl0ZXJzLFxuXHRcdFx0YWR2YW5jZWQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZVxuXHRcdFx0XHRcdD8gKFxuXHRcdFx0XHRcdFx0XHQkZXh0ZW5kKCRzdWJTZXR0aW5nc0FkdmFuY2VkLCB2YWx1ZSksXG5cdFx0XHRcdFx0XHRcdCRzdWIuYWR2U2V0KCksXG5cdFx0XHRcdFx0XHRcdCR2aWV3c1NldHRpbmdzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6ICRzdWJTZXR0aW5nc0FkdmFuY2VkO1xuXHRcdFx0XHR9XG5cdFx0fSxcblx0XHRnZXRDdHg6IHJldFZhbCwgLy8gR2V0IGN0eC5mb28gdmFsdWUuIEluIEpzUmVuZGVyLCBzaW1wbHkgcmV0dXJucyB2YWwuXG5cdFx0bWFwOiBkYXRhTWFwICAgIC8vIElmIGpzT2JzZXJ2YWJsZSBsb2FkZWQgZmlyc3QsIHVzZSB0aGF0IGRlZmluaXRpb24gb2YgZGF0YU1hcFxuXHR9O1xuXG5mdW5jdGlvbiBnZXREZXJpdmVkTWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJldCxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRwcmV2QmFzZSA9IHRhZy5iYXNlO1xuXG5cdFx0dGFnLmJhc2UgPSBiYXNlTWV0aG9kOyAvLyBXaXRoaW4gbWV0aG9kIGNhbGwsIGNhbGxpbmcgdGhpcy5iYXNlIHdpbGwgY2FsbCB0aGUgYmFzZSBtZXRob2Rcblx0XHRyZXQgPSBtZXRob2QuYXBwbHkodGFnLCBhcmd1bWVudHMpOyAvLyBDYWxsIHRoZSBtZXRob2Rcblx0XHR0YWcuYmFzZSA9IHByZXZCYXNlOyAvLyBSZXBsYWNlIHRoaXMuYmFzZSB0byBiZSB0aGUgYmFzZSBtZXRob2Qgb2YgdGhlIHByZXZpb3VzIGNhbGwsIGZvciBjaGFpbmVkIGNhbGxzXG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0TWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHQvLyBGb3IgZGVyaXZlZCBtZXRob2RzIChvciBoYW5kbGVycyBkZWNsYXJlZCBkZWNsYXJhdGl2ZWx5IGFzIGluIHt7OmZvbyBvbkNoYW5nZT1+Zm9vQ2hhbmdlZH19IHJlcGxhY2UgYnkgYSBkZXJpdmVkIG1ldGhvZCwgdG8gYWxsb3cgdXNpbmcgdGhpcy5iYXNlKC4uLilcblx0Ly8gb3IgdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSB0byBjYWxsIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLiAoRXF1aXZhbGVudCB0byB0aGlzLl9zdXBlciguLi4pIGFuZCB0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cykgaW4galF1ZXJ5IFVJKVxuXHRpZiAoJGlzRnVuY3Rpb24obWV0aG9kKSkge1xuXHRcdG1ldGhvZCA9IGdldERlcml2ZWRNZXRob2QoXG5cdFx0XHRcdCFiYXNlTWV0aG9kXG5cdFx0XHRcdFx0PyBub29wIC8vIG5vIGJhc2UgbWV0aG9kIGltcGxlbWVudGF0aW9uLCBzbyB1c2Ugbm9vcCBhcyBiYXNlIG1ldGhvZFxuXHRcdFx0XHRcdDogYmFzZU1ldGhvZC5fZFxuXHRcdFx0XHRcdFx0PyBiYXNlTWV0aG9kIC8vIGJhc2VNZXRob2QgaXMgYSBkZXJpdmVkIG1ldGhvZCwgc28gdXMgaXRcblx0XHRcdFx0XHRcdDogZ2V0RGVyaXZlZE1ldGhvZChub29wLCBiYXNlTWV0aG9kKSwgLy8gYmFzZU1ldGhvZCBpcyBub3QgZGVyaXZlZCBzbyBtYWtlIGl0cyBiYXNlIG1ldGhvZCBiZSB0aGUgbm9vcCBtZXRob2Rcblx0XHRcdFx0bWV0aG9kXG5cdFx0XHQpO1xuXHRcdG1ldGhvZC5fZCA9IDE7IC8vIEFkZCBmbGFnIHRoYXQgdGhpcyBpcyBhIGRlcml2ZWQgbWV0aG9kXG5cdH1cblx0cmV0dXJuIG1ldGhvZDtcbn1cblxuZnVuY3Rpb24gdGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHgpIHtcblx0Zm9yICh2YXIgcHJvcCBpbiB0YWdDdHgucHJvcHMpIHtcblx0XHRpZiAockhhc0hhbmRsZXJzLnRlc3QocHJvcCkpIHtcblx0XHRcdHRhZ1twcm9wXSA9IGdldE1ldGhvZCh0YWdbcHJvcF0sIHRhZ0N0eC5wcm9wc1twcm9wXSk7XG5cdFx0XHQvLyBDb3B5IG92ZXIgdGhlIG9uRm9vIHByb3BzLCBjb252ZXJ0IGFuZCBjb252ZXJ0QmFjayBmcm9tIHRhZ0N0eC5wcm9wcyB0byB0YWcgKG92ZXJyaWRlcyB2YWx1ZXMgaW4gdGFnRGVmKS5cblx0XHRcdC8vIE5vdGU6IHVuc3VwcG9ydGVkIHNjZW5hcmlvOiBpZiBoYW5kbGVycyBhcmUgZHluYW1pY2FsbHkgYWRkZWQgXm9uRm9vPWV4cHJlc3Npb24gdGhpcyB3aWxsIHdvcmssIGJ1dCBkeW5hbWljYWxseSByZW1vdmluZyB3aWxsIG5vdCB3b3JrLlxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiByZXRWYWwodmFsKSB7XG5cdHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7XG5cdHJldHVybiBcIlwiO1xufVxuXG5mdW5jdGlvbiBkYmdCcmVhayh2YWwpIHtcblx0Ly8gVXNhZ2UgZXhhbXBsZXM6IHt7ZGJnOi4uLn19LCB7ezp+ZGJnKC4uLil9fSwge3tkYmcgLi4uL319LCB7Xntmb3IgLi4uIG9uQWZ0ZXJMaW5rPX5kYmd9fSBldGMuXG5cdHRyeSB7XG5cdFx0Y29uc29sZS5sb2coXCJKc1JlbmRlciBkYmcgYnJlYWtwb2ludDogXCIgKyB2YWwpO1xuXHRcdHRocm93IFwiZGJnIGJyZWFrcG9pbnRcIjsgLy8gVG8gYnJlYWsgaGVyZSwgc3RvcCBvbiBjYXVnaHQgZXhjZXB0aW9ucy5cblx0fVxuXHRjYXRjaCAoZSkge31cblx0cmV0dXJuIHRoaXMuYmFzZSA/IHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgOiB2YWw7XG59XG5cbmZ1bmN0aW9uIEpzVmlld3NFcnJvcihtZXNzYWdlKSB7XG5cdC8vIEVycm9yIGV4Y2VwdGlvbiB0eXBlIGZvciBKc1ZpZXdzL0pzUmVuZGVyXG5cdC8vIE92ZXJyaWRlIG9mICQudmlld3Muc3ViLkVycm9yIGlzIHBvc3NpYmxlXG5cdHRoaXMubmFtZSA9ICgkLmxpbmsgPyBcIkpzVmlld3NcIiA6IFwiSnNSZW5kZXJcIikgKyBcIiBFcnJvclwiO1xuXHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IHRoaXMubmFtZTtcbn1cblxuZnVuY3Rpb24gJGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuXHRmb3IgKHZhciBuYW1lIGluIHNvdXJjZSkge1xuXHRcdHRhcmdldFtuYW1lXSA9IHNvdXJjZVtuYW1lXTtcblx0fVxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4oSnNWaWV3c0Vycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpKS5jb25zdHJ1Y3RvciA9IEpzVmlld3NFcnJvcjtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vPT09PT09PT09PT09PT09PT09PVxuLy8gdmlld3MuZGVsaW1pdGVyc1xuLy89PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uICR2aWV3c0RlbGltaXRlcnMob3BlbkNoYXJzLCBjbG9zZUNoYXJzLCBsaW5rKSB7XG5cdC8vIFNldCB0aGUgdGFnIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyBhbmQgJ2xpbmsnIGNoYXJhY3Rlci4gRGVmYXVsdCBpcyBcInt7XCIsIFwifX1cIiBhbmQgXCJeXCJcblx0Ly8gb3BlbkNoYXJzLCBjbG9zZUNoYXJzOiBvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MsIGVhY2ggd2l0aCB0d28gY2hhcmFjdGVyc1xuXHRpZiAoIW9wZW5DaGFycykge1xuXHRcdHJldHVybiAkc3ViU2V0dGluZ3MuZGVsaW1pdGVycztcblx0fVxuXHRpZiAoJGlzQXJyYXkob3BlbkNoYXJzKSkge1xuXHRcdHJldHVybiAkdmlld3NEZWxpbWl0ZXJzLmFwcGx5KCR2aWV3cywgb3BlbkNoYXJzKTtcblx0fVxuXG5cdCRzdWJTZXR0aW5ncy5kZWxpbWl0ZXJzID0gW29wZW5DaGFycywgY2xvc2VDaGFycywgbGlua0NoYXIgPSBsaW5rID8gbGluay5jaGFyQXQoMCkgOiBsaW5rQ2hhcl07XG5cblx0ZGVsaW1PcGVuQ2hhcjAgPSBvcGVuQ2hhcnMuY2hhckF0KDApOyAvLyBFc2NhcGUgdGhlIGNoYXJhY3RlcnMgLSBzaW5jZSB0aGV5IGNvdWxkIGJlIHJlZ2V4IHNwZWNpYWwgY2hhcmFjdGVyc1xuXHRkZWxpbU9wZW5DaGFyMSA9IG9wZW5DaGFycy5jaGFyQXQoMSk7XG5cdGRlbGltQ2xvc2VDaGFyMCA9IGNsb3NlQ2hhcnMuY2hhckF0KDApO1xuXHRkZWxpbUNsb3NlQ2hhcjEgPSBjbG9zZUNoYXJzLmNoYXJBdCgxKTtcblx0b3BlbkNoYXJzID0gXCJcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxOyAvLyBEZWZhdWx0IGlzIFwie157XCJcblx0Y2xvc2VDaGFycyA9IFwiXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCJcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjE7ICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgXCJ9fVwiXG5cdC8vIEJ1aWxkIHJlZ2V4IHdpdGggbmV3IGRlbGltaXRlcnNcblx0Ly8gICAgICAgICAgW3RhZyAgICAoZm9sbG93ZWQgYnkgLyBzcGFjZSBvciB9KSAgb3IgY3Z0citjb2xvbiBvciBodG1sIG9yIGNvZGVdIGZvbGxvd2VkIGJ5IHNwYWNlK3BhcmFtcyB0aGVuIGNvbnZlcnRCYWNrP1xuXHRyVGFnID0gXCIoPzooXFxcXHcrKD89W1xcXFwvXFxcXHNcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl0pKXwoXFxcXHcrKT8oOil8KD4pfChcXFxcKikpXFxcXHMqKCg/OlteXFxcXFwiXG5cdFx0KyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl18XFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCIoPyFcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjEgKyBcIikpKj8pXCI7XG5cblx0Ly8gTWFrZSByVGFnIGF2YWlsYWJsZSB0byBKc1ZpZXdzIChvciBvdGhlciBjb21wb25lbnRzKSBmb3IgcGFyc2luZyBiaW5kaW5nIGV4cHJlc3Npb25zXG5cdCRzdWIuclRhZyA9IFwiKD86XCIgKyByVGFnICsgXCIpXCI7XG5cdC8vICAgICAgICAgICAgICAgICAgICAgICAgeyBePyB7ICAgdGFnK3BhcmFtcyBzbGFzaD8gIG9yIGNsb3NpbmdUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBjb21tZW50XG5cdHJUYWcgPSBuZXcgUmVnRXhwKFwiKD86XCIgKyBvcGVuQ2hhcnMgKyByVGFnICsgXCIoXFxcXC8pP3xcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxICsgXCIoPzooPzpcXFxcLyhcXFxcdyspKVxcXFxzKnwhLS1bXFxcXHNcXFxcU10qPy0tKSlcIiArIGNsb3NlQ2hhcnMsIFwiZ1wiKTtcblxuXHQvLyBEZWZhdWx0OiAgYmluZCAgICAgdGFnTmFtZSAgICAgICAgIGN2dCAgIGNsbiBodG1sIGNvZGUgICAgcGFyYW1zICAgICAgICAgICAgc2xhc2ggICBiaW5kMiAgICAgICAgIGNsb3NlQmxrICBjb21tZW50XG5cdC8vICAgICAgLyg/OnsoXFxeKT97KD86KFxcdysoPz1bXFwvXFxzfV0pKXwoXFx3Kyk/KDopfCg+KXwoXFwqKSlcXHMqKCg/OltefV18fSg/IX0pKSo/KShcXC8pP3x7KFxcXik/eyg/Oig/OlxcLyhcXHcrKSlcXHMqfCEtLVtcXHNcXFNdKj8tLSkpfX1cblxuXHQkc3ViLnJUbXBsID0gbmV3IFJlZ0V4cChcIjwuKj58KFteXFxcXFxcXFxdfF4pW3t9XXxcIiArIG9wZW5DaGFycyArIFwiLipcIiArIGNsb3NlQ2hhcnMpO1xuXHQvLyAkc3ViLnJUbXBsIGxvb2tzIGZvciBodG1sIHRhZ3Mgb3IgeyBvciB9IGNoYXIgbm90IHByZWNlZGVkIGJ5IFxcXFwsIG9yIEpzUmVuZGVyIHRhZ3Mge3t4eHh9fS4gRWFjaCBvZiB0aGVzZSBzdHJpbmdzIGFyZSBjb25zaWRlcmVkXG5cdC8vIE5PVCB0byBiZSBqUXVlcnkgc2VsZWN0b3JzXG5cdHJldHVybiAkdmlld3NTZXR0aW5ncztcbn1cblxuLy89PT09PT09PT1cbi8vIFZpZXcuZ2V0XG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRWaWV3KGlubmVyLCB0eXBlKSB7IC8vdmlldy5nZXQoaW5uZXIsIHR5cGUpXG5cdGlmICghdHlwZSAmJiBpbm5lciAhPT0gdHJ1ZSkge1xuXHRcdC8vIHZpZXcuZ2V0KHR5cGUpXG5cdFx0dHlwZSA9IGlubmVyO1xuXHRcdGlubmVyID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dmFyIHZpZXdzLCBpLCBsLCBmb3VuZCxcblx0XHR2aWV3ID0gdGhpcyxcblx0XHRyb290ID0gIXR5cGUgfHwgdHlwZSA9PT0gXCJyb290XCI7XG5cdFx0Ly8gSWYgdHlwZSBpcyB1bmRlZmluZWQsIHJldHVybnMgcm9vdCB2aWV3ICh2aWV3IHVuZGVyIHRvcCB2aWV3KS5cblxuXHRpZiAoaW5uZXIpIHtcblx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgbmVzdGVkIG9uZXMsIGRlcHRoLWZpcnN0IC0gYW5kIHJldHVybiBmaXJzdCBvbmUgd2l0aCBnaXZlbiB0eXBlLlxuXHRcdC8vIElmIHR5cGUgaXMgdW5kZWZpbmVkLCBpLmUuIHZpZXcuZ2V0KHRydWUpLCByZXR1cm4gZmlyc3QgY2hpbGQgdmlldy5cblx0XHRmb3VuZCA9IHR5cGUgJiYgdmlldy50eXBlID09PSB0eXBlICYmIHZpZXc7XG5cdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0dmlld3MgPSB2aWV3LnZpZXdzO1xuXHRcdFx0aWYgKHZpZXcuXy51c2VLZXkpIHtcblx0XHRcdFx0Zm9yIChpIGluIHZpZXdzKSB7XG5cdFx0XHRcdFx0aWYgKGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGkgPSAwLCBsID0gdmlld3MubGVuZ3RoOyAhZm91bmQgJiYgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChyb290KSB7XG5cdFx0Ly8gRmluZCByb290IHZpZXcuICh2aWV3IHdob3NlIHBhcmVudCBpcyB0b3Agdmlldylcblx0XHR3aGlsZSAodmlldy5wYXJlbnQpIHtcblx0XHRcdGZvdW5kID0gdmlldztcblx0XHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0d2hpbGUgKHZpZXcgJiYgIWZvdW5kKSB7XG5cdFx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgcGFyZW50IG9uZXMgLSBhbmQgcmV0dXJuIGZpcnN0IG9uZSB3aXRoIGdpdmVuIHR5cGUuXG5cdFx0XHRmb3VuZCA9IHZpZXcudHlwZSA9PT0gdHlwZSA/IHZpZXcgOiB1bmRlZmluZWQ7XG5cdFx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkSW5kZXgoKSB7XG5cdHZhciB2aWV3ID0gdGhpcy5nZXQoXCJpdGVtXCIpO1xuXHRyZXR1cm4gdmlldyA/IHZpZXcuaW5kZXggOiB1bmRlZmluZWQ7XG59XG5cbmdldE5lc3RlZEluZGV4LmRlcGVuZHMgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIFt0aGlzLmdldChcIml0ZW1cIiksIFwiaW5kZXhcIl07XG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleCgpIHtcblx0cmV0dXJuIHRoaXMuaW5kZXg7XG59XG5cbmdldEluZGV4LmRlcGVuZHMgPSBcImluZGV4XCI7XG5cbi8vPT09PT09PT09PVxuLy8gVmlldy5obHBcbi8vPT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRIZWxwZXIoaGVscGVyLCBpc0NvbnRleHRDYikge1xuXHQvLyBIZWxwZXIgbWV0aG9kIGNhbGxlZCBhcyB2aWV3LmhscChrZXkpIGZyb20gY29tcGlsZWQgdGVtcGxhdGUsIGZvciBoZWxwZXJzIG9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgfmZvb1xuXHR2YXIgd3JhcHBlZCwgZGVwcyxcblx0dmlldyA9IHRoaXMsXG5cdHJlcyA9IHZpZXcuY3R4O1xuXG5cdGlmIChyZXMpIHtcblx0XHRyZXMgPSByZXNbaGVscGVyXTtcblx0fVxuXHRpZiAocmVzID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXMgPSAkaGVscGVyc1toZWxwZXJdO1xuXHR9XG5cdGlmIChyZXMgJiYgcmVzLl9jcCkgeyAvLyBJZiB0aGlzIGhlbHBlciByZXNvdXJjZSBpcyBhIGNvbnRleHR1YWwgcGFyYW1ldGVyLCB+Zm9vPWV4cHJcblx0XHRpZiAoaXNDb250ZXh0Q2IpIHsgIC8vIEluIGEgY29udGV4dCBjYWxsYmFjayBmb3IgYSBjb250ZXh0dWFsIHBhcmFtLCByZXR1cm4gdGhlIFt2aWV3LCBkZXBlbmRlbmNpZXMuLi5dIGFycmF5IC0gbmVlZGVkIGZvciBvYnNlcnZlIGNhbGxcblx0XHRcdGRlcHMgPSAkc3ViLl9jZW8ocmVzWzFdLmRlcHMpOyAgLy8gZm4gZGVwcywgd2l0aCBhbnkgZXhwck9icyBjbG9uZWRcblx0XHRcdGRlcHMudW5zaGlmdChyZXNbMF0pOyAgICAgICAgICAgLy8gdmlld1xuXHRcdFx0ZGVwcy5fY3AgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIGRlcHM7XG5cdFx0fVxuXHRcdHJlcyA9ICR2aWV3cy5nZXRDdHgocmVzKTsgLy8gSWYgYSBjb250ZXh0dWFsIHBhcmFtLCBidXQgbm90IGEgY29udGV4dCBjYWxsYmFjaywgcmV0dXJuIGV2YWx1YXRlZCBwYXJhbSAtIGZuKGRhdGEsIHZpZXcsIGopXG5cdH1cblxuXHRpZiAocmVzKSB7XG5cdFx0aWYgKCRpc0Z1bmN0aW9uKHJlcykgJiYgIXJlcy5fd3JwKSB7XG5cdFx0XHQvLyBJZiBpdCBpcyBvZiB0eXBlIGZ1bmN0aW9uLCBhbmQgbm90IGFscmVhZHkgd3JhcHBlZCwgd2Ugd2lsbCB3cmFwIGl0LCBzbyBpZiBjYWxsZWQgd2l0aCBubyB0aGlzIHBvaW50ZXIgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcblx0XHRcdC8vIHZpZXcgYXMgJ3RoaXMnIGNvbnRleHQuIElmIHRoZSBoZWxwZXIgfmZvbygpIHdhcyBpbiBhIGRhdGEtbGluayBleHByZXNzaW9uLCB0aGUgdmlldyB3aWxsIGhhdmUgYSAndGVtcG9yYXJ5JyBsaW5rQ3R4IHByb3BlcnR5IHRvby5cblx0XHRcdC8vIE5vdGUgdGhhdCBoZWxwZXIgZnVuY3Rpb25zIG9uIGRlZXBlciBwYXRocyB3aWxsIGhhdmUgc3BlY2lmaWMgdGhpcyBwb2ludGVycywgZnJvbSB0aGUgcHJlY2VkaW5nIHBhdGguXG5cdFx0XHQvLyBGb3IgZXhhbXBsZSwgfnV0aWwuZm9vKCkgd2lsbCBoYXZlIHRoZSB+dXRpbCBvYmplY3QgYXMgJ3RoaXMnIHBvaW50ZXJcblx0XHRcdHdyYXBwZWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHJlcy5hcHBseSgoIXRoaXMgfHwgdGhpcyA9PT0gZ2xvYmFsKSA/IHZpZXcgOiB0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcblx0XHRcdHdyYXBwZWQuX3dycCA9IHZpZXc7XG5cdFx0XHQkZXh0ZW5kKHdyYXBwZWQsIHJlcyk7IC8vIEF0dGFjaCBzYW1lIGV4cGFuZG9zIChpZiBhbnkpIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uXG5cdFx0fVxuXHR9XG5cdHJldHVybiB3cmFwcGVkIHx8IHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0VGVtcGxhdGUodG1wbCkge1xuXHRyZXR1cm4gdG1wbCAmJiAodG1wbC5mblxuXHRcdD8gdG1wbFxuXHRcdDogdGhpcy5nZXRSc2MoXCJ0ZW1wbGF0ZXNcIiwgdG1wbCkgfHwgJHRlbXBsYXRlcyh0bXBsKSk7IC8vIG5vdCB5ZXQgY29tcGlsZWRcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gdmlld3MuX2NudnRcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29udmVydFZhbChjb252ZXJ0ZXIsIHZpZXcsIHRhZ0N0eCwgb25FcnJvcikge1xuXHQvLyBzZWxmIGlzIHRlbXBsYXRlIG9iamVjdCBvciBsaW5rQ3R4IG9iamVjdFxuXHR2YXIgdGFnLCB2YWx1ZSxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhcblx0XHRib3VuZFRhZyA9IHR5cGVvZiB0YWdDdHggPT09IFwibnVtYmVyXCIgJiYgdmlldy50bXBsLmJuZHNbdGFnQ3R4LTFdLFxuXHRcdGxpbmtDdHggPSB2aWV3LmxpbmtDdHg7IC8vIEZvciBkYXRhLWxpbms9XCJ7Y3Z0Oi4uLn1cIi4uLlxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YWdDdHggPSBvbkVycm9yID0ge3Byb3BzOiB7fSwgYXJnczogW29uRXJyb3JdfTtcblx0fSBlbHNlIGlmIChib3VuZFRhZykge1xuXHRcdHRhZ0N0eCA9IGJvdW5kVGFnKHZpZXcuZGF0YSwgdmlldywgJHN1Yik7XG5cdH1cblxuXHR2YWx1ZSA9IHRhZ0N0eC5hcmdzWzBdO1xuXHRpZiAoY29udmVydGVyIHx8IGJvdW5kVGFnKSB7XG5cdFx0dGFnID0gbGlua0N0eCAmJiBsaW5rQ3R4LnRhZztcblx0XHRpZiAoIXRhZykge1xuXHRcdFx0dGFnID0gJGV4dGVuZChuZXcgJHN1Yi5fdGcoKSwge1xuXHRcdFx0XHRfOiB7XG5cdFx0XHRcdFx0aW5saW5lOiAhbGlua0N0eCxcblx0XHRcdFx0XHRibmQ6IGJvdW5kVGFnLFxuXHRcdFx0XHRcdHVubGlua2VkOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRhZ05hbWU6IFwiOlwiLFxuXHRcdFx0XHRjdnQ6IGNvbnZlcnRlcixcblx0XHRcdFx0ZmxvdzogdHJ1ZSxcblx0XHRcdFx0dGFnQ3R4OiB0YWdDdHhcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0bGlua0N0eC50YWcgPSB0YWc7XG5cdFx0XHRcdHRhZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdH1cblx0XHRcdHRhZ0N0eC5jdHggPSBleHRlbmRDdHgodGFnQ3R4LmN0eCwgKGxpbmtDdHggPyBsaW5rQ3R4LnZpZXcgOiB2aWV3KS5jdHgpO1xuXHRcdH1cblx0XHR0YWcuX2VyID0gb25FcnJvciAmJiB2YWx1ZTtcblx0XHR0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eCk7XG5cblx0XHR0YWdDdHgudmlldyA9IHZpZXc7XG5cblx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eCB8fCB0YWcuY3R4IHx8IHt9O1xuXHRcdHRhZ0N0eC5jdHggPSB1bmRlZmluZWQ7XG5cblx0XHR2YWx1ZSA9IHRhZy5jdnRBcmdzKGNvbnZlcnRlciAhPT0gXCJ0cnVlXCIgJiYgY29udmVydGVyKVswXTsgLy8gSWYgdGhlcmUgaXMgYSBjb252ZXJ0QmFjayBidXQgbm8gY29udmVydCwgY29udmVydGVyIHdpbGwgYmUgXCJ0cnVlXCJcblxuXHRcdC8vIENhbGwgb25SZW5kZXIgKHVzZWQgYnkgSnNWaWV3cyBpZiBwcmVzZW50LCB0byBhZGQgYmluZGluZyBhbm5vdGF0aW9ucyBhcm91bmQgcmVuZGVyZWQgY29udGVudClcblx0XHR2YWx1ZSA9IGJvdW5kVGFnICYmIHZpZXcuXy5vblJlbmRlclxuXHRcdFx0PyB2aWV3Ll8ub25SZW5kZXIodmFsdWUsIHZpZXcsIHRhZylcblx0XHRcdDogdmFsdWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9IHVuZGVmaW5lZCA/IHZhbHVlIDogXCJcIjtcbn1cblxuZnVuY3Rpb24gY29udmVydEFyZ3MoY29udmVydGVyKSB7XG5cdHZhciB0YWcgPSB0aGlzLFxuXHRcdHRhZ0N0eCA9IHRhZy50YWdDdHgsXG5cdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdGFyZ3MgPSB0YWdDdHguYXJncztcblxuXHRjb252ZXJ0ZXIgPSBjb252ZXJ0ZXIgfHwgdGFnLmNvbnZlcnQ7XG5cdGNvbnZlcnRlciA9IGNvbnZlcnRlciAmJiAoXCJcIiArIGNvbnZlcnRlciA9PT0gY29udmVydGVyXG5cdFx0PyAodmlldy5nZXRSc2MoXCJjb252ZXJ0ZXJzXCIsIGNvbnZlcnRlcikgfHwgZXJyb3IoXCJVbmtub3duIGNvbnZlcnRlcjogJ1wiICsgY29udmVydGVyICsgXCInXCIpKVxuXHRcdDogY29udmVydGVyKTtcblxuXHRhcmdzID0gIWFyZ3MubGVuZ3RoICYmICF0YWdDdHguaW5kZXggLy8gT24gdGhlIG9wZW5pbmcgdGFnIHdpdGggbm8gYXJncywgYmluZCB0byB0aGUgY3VycmVudCBkYXRhIGNvbnRleHRcblx0XHQ/IFt2aWV3LmRhdGFdXG5cdFx0OiBjb252ZXJ0ZXJcblx0XHRcdD8gYXJncy5zbGljZSgpIC8vIElmIHRoZXJlIGlzIGEgY29udmVydGVyLCB1c2UgYSBjb3B5IG9mIHRoZSB0YWdDdHguYXJncyBhcnJheSBmb3IgcmVuZGVyaW5nLCBhbmQgcmVwbGFjZSB0aGUgYXJnc1swXSBpblxuXHRcdFx0Ly8gdGhlIGNvcGllZCBhcnJheSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUuIEJ1dCB3ZSBkbyBub3QgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0YWcudGFnQ3R4LmFyZ3NbMF0gKHRoZSBvcmlnaW5hbCBhcmdzIGFycmF5KVxuXHRcdFx0OiBhcmdzOyAvLyBJZiBubyBjb252ZXJ0ZXIsIGdldCB0aGUgb3JpZ2luYWwgdGFnQ3R4LmFyZ3NcblxuXHRpZiAoY29udmVydGVyKSB7XG5cdFx0aWYgKGNvbnZlcnRlci5kZXBlbmRzKSB7XG5cdFx0XHR0YWcuZGVwZW5kcyA9ICRzdWIuZ2V0RGVwcyh0YWcuZGVwZW5kcywgdGFnLCBjb252ZXJ0ZXIuZGVwZW5kcywgY29udmVydGVyKTtcblx0XHR9XG5cdFx0YXJnc1swXSA9IGNvbnZlcnRlci5hcHBseSh0YWcsIGFyZ3MpO1xuXHR9XG5cdHJldHVybiBhcmdzO1xufVxuXG4vLz09PT09PT09PT09PT1cbi8vIHZpZXdzLl90YWdcbi8vPT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZVR5cGUsIGl0ZW1OYW1lKSB7XG5cdHZhciByZXMsIHN0b3JlLFxuXHRcdHZpZXcgPSB0aGlzO1xuXHR3aGlsZSAoKHJlcyA9PT0gdW5kZWZpbmVkKSAmJiB2aWV3KSB7XG5cdFx0c3RvcmUgPSB2aWV3LnRtcGwgJiYgdmlldy50bXBsW3Jlc291cmNlVHlwZV07XG5cdFx0cmVzID0gc3RvcmUgJiYgc3RvcmVbaXRlbU5hbWVdO1xuXHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0fVxuXHRyZXR1cm4gcmVzIHx8ICR2aWV3c1tyZXNvdXJjZVR5cGVdW2l0ZW1OYW1lXTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyVGFnKHRhZ05hbWUsIHBhcmVudFZpZXcsIHRtcGwsIHRhZ0N0eHMsIGlzVXBkYXRlLCBvbkVycm9yKSB7XG5cdHBhcmVudFZpZXcgPSBwYXJlbnRWaWV3IHx8IHRvcFZpZXc7XG5cdHZhciB0YWcsIHRhZ18sIHRhZ0RlZiwgdGVtcGxhdGUsIHRhZ3MsIGF0dHIsIHBhcmVudFRhZywgaSwgbCwgaXRlbVJldCwgdGFnQ3R4LCB0YWdDdHhDdHgsXG5cdFx0Y29udGVudCwgY2FsbEluaXQsIG1hcERlZiwgdGhpc01hcCwgYXJncywgcHJvcHMsIGluaXRpYWxUbXBsLCB0YWdEYXRhTWFwLCBjb250ZW50Q3R4LFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0bGlua0N0eCA9IHBhcmVudFZpZXcubGlua0N0eCB8fCAwLFxuXHRcdGN0eCA9IHBhcmVudFZpZXcuY3R4LFxuXHRcdHBhcmVudFRtcGwgPSB0bXBsIHx8IHBhcmVudFZpZXcudG1wbCxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhzXG5cdFx0Ym91bmRUYWcgPSB0eXBlb2YgdGFnQ3R4cyA9PT0gXCJudW1iZXJcIiAmJiBwYXJlbnRWaWV3LnRtcGwuYm5kc1t0YWdDdHhzLTFdO1xuXG5cdGlmICh0YWdOYW1lLl9pcyA9PT0gXCJ0YWdcIikge1xuXHRcdHRhZyA9IHRhZ05hbWU7XG5cdFx0dGFnTmFtZSA9IHRhZy50YWdOYW1lO1xuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cztcblx0XHR0ZW1wbGF0ZSA9IHRhZy50ZW1wbGF0ZTtcblx0fSBlbHNlIHtcblx0XHR0YWdEZWYgPSBwYXJlbnRWaWV3LmdldFJzYyhcInRhZ3NcIiwgdGFnTmFtZSkgfHwgZXJyb3IoXCJVbmtub3duIHRhZzoge3tcIiArIHRhZ05hbWUgKyBcIn19IFwiKTtcblx0XHR0ZW1wbGF0ZSA9IHRhZ0RlZi50ZW1wbGF0ZTtcblx0fVxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXQgKz0gb25FcnJvcjtcblx0XHR0YWdDdHhzID0gb25FcnJvciA9IFt7cHJvcHM6IHt9LCBhcmdzOiBbXX1dO1xuXHR9IGVsc2UgaWYgKGJvdW5kVGFnKSB7XG5cdFx0dGFnQ3R4cyA9IGJvdW5kVGFnKHBhcmVudFZpZXcuZGF0YSwgcGFyZW50VmlldywgJHN1Yik7XG5cdH1cblxuXHRsID0gdGFnQ3R4cy5sZW5ndGg7XG5cdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHR0YWdDdHggPSB0YWdDdHhzW2ldO1xuXHRcdGlmICghbGlua0N0eCB8fCAhbGlua0N0eC50YWcgfHwgaSAmJiAhbGlua0N0eC50YWcuXy5pbmxpbmUgfHwgdGFnLl9lcikge1xuXHRcdFx0Ly8gSW5pdGlhbGl6ZSB0YWdDdHhcblx0XHRcdC8vIEZvciBibG9jayB0YWdzLCB0YWdDdHgudG1wbCBpcyBhbiBpbnRlZ2VyID4gMFxuXHRcdFx0aWYgKGNvbnRlbnQgPSBwYXJlbnRUbXBsLnRtcGxzICYmIHRhZ0N0eC50bXBsKSB7XG5cdFx0XHRcdGNvbnRlbnQgPSB0YWdDdHguY29udGVudCA9IHBhcmVudFRtcGwudG1wbHNbY29udGVudCAtIDFdO1xuXHRcdFx0fVxuXHRcdFx0dGFnQ3R4LmluZGV4ID0gaTtcblx0XHRcdHRhZ0N0eC50bXBsID0gY29udGVudDsgLy8gU2V0IHRoZSB0bXBsIHByb3BlcnR5IHRvIHRoZSBjb250ZW50IG9mIHRoZSBibG9jayB0YWdcblx0XHRcdHRhZ0N0eC5yZW5kZXIgPSByZW5kZXJDb250ZW50O1xuXHRcdFx0dGFnQ3R4LnZpZXcgPSBwYXJlbnRWaWV3O1xuXHRcdFx0dGFnQ3R4LmN0eCA9IGV4dGVuZEN0eCh0YWdDdHguY3R4LCBjdHgpOyAvLyBDbG9uZSBhbmQgZXh0ZW5kIHBhcmVudFZpZXcuY3R4XG5cdFx0fVxuXHRcdGlmICh0bXBsID0gdGFnQ3R4LnByb3BzLnRtcGwpIHtcblx0XHRcdC8vIElmIHRoZSB0bXBsIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4sIHNldCB0aGUgdmFsdWUgKHdoZW4gaW5pdGlhbGl6aW5nLCBvciwgaW4gY2FzZSBvZiBiaW5kaW5nOiBedG1wbD0uLi4sIHdoZW4gdXBkYXRpbmcpXG5cdFx0XHR0YWdDdHgudG1wbCA9IHBhcmVudFZpZXcuZ2V0VG1wbCh0bXBsKTtcblx0XHR9XG5cblx0XHRpZiAoIXRhZykge1xuXHRcdFx0Ly8gVGhpcyB3aWxsIG9ubHkgYmUgaGl0IGZvciBpbml0aWFsIHRhZ0N0eCAobm90IGZvciB7e2Vsc2V9fSkgLSBpZiB0aGUgdGFnIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0IHlldFxuXHRcdFx0Ly8gSW5zdGFudGlhdGUgdGFnIGlmIGl0IGRvZXMgbm90IHlldCBleGlzdFxuXHRcdFx0Ly8gSWYgdGhlIHRhZyBoYXMgbm90IGFscmVhZHkgYmVlbiBpbnN0YW50aWF0ZWQsIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGluc3RhbmNlLlxuXHRcdFx0Ly8gfnRhZyB3aWxsIGFjY2VzcyB0aGUgdGFnLCBldmVuIHdpdGhpbiB0aGUgcmVuZGVyaW5nIG9mIHRoZSB0ZW1wbGF0ZSBjb250ZW50IG9mIHRoaXMgdGFnLlxuXHRcdFx0Ly8gRnJvbSBjaGlsZC9kZXNjZW5kYW50IHRhZ3MsIGNhbiBhY2Nlc3MgdXNpbmcgfnRhZy5wYXJlbnQsIG9yIH5wYXJlbnRUYWdzLnRhZ05hbWVcblx0XHRcdHRhZyA9IG5ldyB0YWdEZWYuX2N0cigpO1xuXHRcdFx0Y2FsbEluaXQgPSAhIXRhZy5pbml0O1xuXG5cdFx0XHR0YWcucGFyZW50ID0gcGFyZW50VGFnID0gY3R4ICYmIGN0eC50YWc7XG5cdFx0XHR0YWcudGFnQ3R4cyA9IHRhZ0N0eHM7XG5cdFx0XHR0YWdEYXRhTWFwID0gdGFnLmRhdGFNYXA7XG5cblx0XHRcdGlmIChsaW5rQ3R4KSB7XG5cdFx0XHRcdHRhZy5fLmlubGluZSA9IGZhbHNlO1xuXHRcdFx0XHRsaW5rQ3R4LnRhZyA9IHRhZztcblx0XHRcdFx0dGFnLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZy5fLmJuZCA9IGJvdW5kVGFnIHx8IGxpbmtDdHguZm4pIHtcblx0XHRcdFx0Ly8gQm91bmQgaWYge157dGFnLi4ufX0gb3IgZGF0YS1saW5rPVwie3RhZy4uLn1cIlxuXHRcdFx0XHR0YWcuXy5hcnJWd3MgPSB7fTtcblx0XHRcdH0gZWxzZSBpZiAodGFnLmRhdGFCb3VuZE9ubHkpIHtcblx0XHRcdFx0ZXJyb3IoXCJ7XntcIiArIHRhZ05hbWUgKyBcIn19IHRhZyBtdXN0IGJlIGRhdGEtYm91bmRcIik7XG5cdFx0XHR9XG5cdFx0XHQvL1RPRE8gYmV0dGVyIHBlcmYgZm9yIGNoaWxkVGFncygpIC0ga2VlcCBjaGlsZCB0YWcudGFncyBhcnJheSwgKGFuZCByZW1vdmUgY2hpbGQsIHdoZW4gZGlzcG9zZWQpXG5cdFx0XHQvLyB0YWcudGFncyA9IFtdO1xuXHRcdH1cblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHM7XG5cdFx0dGFnRGF0YU1hcCA9IHRhZy5kYXRhTWFwO1xuXG5cdFx0dGFnQ3R4LnRhZyA9IHRhZztcblx0XHRpZiAodGFnRGF0YU1hcCAmJiB0YWdDdHhzKSB7XG5cdFx0XHR0YWdDdHgubWFwID0gdGFnQ3R4c1tpXS5tYXA7IC8vIENvcHkgb3ZlciB0aGUgY29tcGlsZWQgbWFwIGluc3RhbmNlIGZyb20gdGhlIHByZXZpb3VzIHRhZ0N0eHMgdG8gdGhlIHJlZnJlc2hlZCBvbmVzXG5cdFx0fVxuXHRcdGlmICghdGFnLmZsb3cpIHtcblx0XHRcdHRhZ0N0eEN0eCA9IHRhZ0N0eC5jdHggPSB0YWdDdHguY3R4IHx8IHt9O1xuXG5cdFx0XHQvLyB0YWdzIGhhc2g6IHRhZy5jdHgudGFncywgbWVyZ2VkIHdpdGggcGFyZW50Vmlldy5jdHgudGFncyxcblx0XHRcdHRhZ3MgPSB0YWcucGFyZW50cyA9IHRhZ0N0eEN0eC5wYXJlbnRUYWdzID0gY3R4ICYmIGV4dGVuZEN0eCh0YWdDdHhDdHgucGFyZW50VGFncywgY3R4LnBhcmVudFRhZ3MpIHx8IHt9O1xuXHRcdFx0aWYgKHBhcmVudFRhZykge1xuXHRcdFx0XHR0YWdzW3BhcmVudFRhZy50YWdOYW1lXSA9IHBhcmVudFRhZztcblx0XHRcdFx0Ly9UT0RPIGJldHRlciBwZXJmIGZvciBjaGlsZFRhZ3M6IHBhcmVudFRhZy50YWdzLnB1c2godGFnKTtcblx0XHRcdH1cblx0XHRcdHRhZ3NbdGFnLnRhZ05hbWVdID0gdGFnQ3R4Q3R4LnRhZyA9IHRhZztcblx0XHR9XG5cdH1cblx0aWYgKCEodGFnLl9lciA9IG9uRXJyb3IpKSB7XG5cdFx0dGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHhzWzBdKTtcblx0XHR0YWcucmVuZGVyaW5nID0ge307IC8vIFByb3ZpZGUgb2JqZWN0IGZvciBzdGF0ZSBkdXJpbmcgcmVuZGVyIGNhbGxzIHRvIHRhZyBhbmQgZWxzZXMuIChVc2VkIGJ5IHt7aWZ9fSBhbmQge3tmb3J9fS4uLilcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR0YWdDdHggPSB0YWcudGFnQ3R4ID0gdGFnQ3R4c1tpXTtcblx0XHRcdHByb3BzID0gdGFnQ3R4LnByb3BzO1xuXHRcdFx0YXJncyA9IHRhZy5jdnRBcmdzKCk7XG5cblx0XHRcdGlmIChtYXBEZWYgPSBwcm9wcy5kYXRhTWFwIHx8IHRhZ0RhdGFNYXApIHtcblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoIHx8IHByb3BzLmRhdGFNYXApIHtcblx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcDtcblx0XHRcdFx0XHRpZiAoIXRoaXNNYXAgfHwgdGhpc01hcC5zcmMgIT09IGFyZ3NbMF0gfHwgaXNVcGRhdGUpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzTWFwICYmIHRoaXNNYXAuc3JjKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXNNYXAudW5tYXAoKTsgLy8gb25seSBjYWxsZWQgaWYgb2JzZXJ2YWJsZSBtYXAgLSBub3Qgd2hlbiBvbmx5IHVzZWQgaW4gSnNSZW5kZXIsIGUuZy4gYnkge3twcm9wc319XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcCA9IG1hcERlZi5tYXAoYXJnc1swXSwgcHJvcHMsIHVuZGVmaW5lZCwgIXRhZy5fLmJuZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFyZ3MgPSBbdGhpc01hcC50Z3RdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eDtcblxuXHRcdFx0aWYgKCFpKSB7XG5cdFx0XHRcdGlmIChjYWxsSW5pdCkge1xuXHRcdFx0XHRcdGluaXRpYWxUbXBsID0gdGFnLnRlbXBsYXRlO1xuXHRcdFx0XHRcdHRhZy5pbml0KHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCk7XG5cdFx0XHRcdFx0Y2FsbEluaXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0XHQvLyBTZXQgYXR0ciBvbiBsaW5rQ3R4IHRvIGVuc3VyZSBvdXRwdXR0aW5nIHRvIHRoZSBjb3JyZWN0IHRhcmdldCBhdHRyaWJ1dGUuXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyBlaXRoZXIgbGlua0N0eC5hdHRyIG9yIHRoaXMuYXR0ciBpbiB0aGUgaW5pdCgpIGFsbG93cyBwZXItaW5zdGFuY2UgY2hvaWNlIG9mIHRhcmdldCBhdHRyaWIuXG5cdFx0XHRcdFx0bGlua0N0eC5hdHRyID0gdGFnLmF0dHIgPSBsaW5rQ3R4LmF0dHIgfHwgdGFnLmF0dHI7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXR0ciA9IHRhZy5hdHRyO1xuXHRcdFx0XHR0YWcuXy5ub1Z3cyA9IGF0dHIgJiYgYXR0ciAhPT0gSFRNTDtcblx0XHRcdH1cblxuXHRcdFx0aXRlbVJldCA9IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0YWcucmVuZGVyKSB7XG5cdFx0XHRcdGl0ZW1SZXQgPSB0YWcucmVuZGVyLmFwcGx5KHRhZywgYXJncyk7XG5cdFx0XHRcdGlmIChwYXJlbnRWaWV3LmxpbmtlZCAmJiBpdGVtUmV0ICYmIHRhZy5saW5rZWRFbGVtICYmICFyV3JhcHBlZEluVmlld01hcmtlci50ZXN0KGl0ZW1SZXQpKSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBhIHRhZyByZW5kZXJzIGNvbnRlbnQgZnJvbSB0aGUgcmVuZGVyIG1ldGhvZCwgd2l0aCBkYXRhIGxpbmtpbmcsIGFuZCBoYXMgYSBsaW5rZWRFbGVtIGJpbmRpbmcsIHRoZW4gd2UgbmVlZCB0byB3cmFwIHdpdGhcblx0XHRcdFx0XHQvLyB2aWV3IG1hcmtlcnMsIGlmIGFic2VudCwgc28gdGhlIGNvbnRlbnQgaXMgYSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFnLCB3aGljaCB3aWxsIGNvcnJlY3RseSBkaXNwb3NlIGJpbmRpbmdzIGlmIGRlbGV0ZWQuXG5cdFx0XHRcdFx0aXRlbVJldCA9IHJlbmRlcldpdGhWaWV3cygkLnRlbXBsYXRlcyhpdGVtUmV0KSwgYXJnc1swXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0YWcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWFyZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdGFyZ3MgPSBbcGFyZW50Vmlld107IC8vIG5vIGFyZ3VtZW50cyAtIChlLmcuIHt7ZWxzZX19KSBnZXQgZGF0YSBjb250ZXh0IGZyb20gdmlldy5cblx0XHRcdH1cblx0XHRcdGlmIChpdGVtUmV0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGVudEN0eCA9IGFyZ3NbMF07IC8vIERlZmF1bHQgZGF0YSBjb250ZXh0IGZvciB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBEZWZpbmVkIHRhZy5jb250ZW50Q3R4IGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoaXMuXG5cdFx0XHRcdGlmICh0YWcuY29udGVudEN0eCkge1xuXHRcdFx0XHRcdGNvbnRlbnRDdHggPSB0YWcuY29udGVudEN0eChjb250ZW50Q3R4KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpdGVtUmV0ID0gdGFnQ3R4LnJlbmRlcihjb250ZW50Q3R4LCB0cnVlKSB8fCAoaXNVcGRhdGUgPyB1bmRlZmluZWQgOiBcIlwiKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vIHJldHVybiB2YWx1ZSBmcm9tIHJlbmRlciwgYW5kIG5vIHRlbXBsYXRlL2NvbnRlbnQgdGFnQ3R4LnJlbmRlciguLi4pLCBzbyByZXR1cm4gdW5kZWZpbmVkXG5cdFx0XHRyZXQgPSByZXQgPyByZXQgKyAoaXRlbVJldCB8fCBcIlwiKSA6IGl0ZW1SZXQ7IC8vIElmIG5vIHJlbmRlcmVkIGNvbnRlbnQsIHRoaXMgd2lsbCBiZSB1bmRlZmluZWRcblx0XHR9XG5cdFx0dGFnLnJlbmRlcmluZyA9IHVuZGVmaW5lZDtcblx0fVxuXHR0YWcudGFnQ3R4ID0gdGFnQ3R4c1swXTtcblx0dGFnLmN0eCA9IHRhZy50YWdDdHguY3R4O1xuXG5cdGlmICh0YWcuXy5ub1Z3cykge1xuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0Ly8gaW5saW5lIHRhZyB3aXRoIGF0dHIgc2V0IHRvIFwidGV4dFwiIHdpbGwgaW5zZXJ0IEhUTUwtZW5jb2RlZCBjb250ZW50IC0gYXMgaWYgaXQgd2FzIGVsZW1lbnQtYmFzZWQgaW5uZXJUZXh0XG5cdFx0XHRyZXQgPSBhdHRyID09PSBcInRleHRcIlxuXHRcdFx0XHQ/ICRjb252ZXJ0ZXJzLmh0bWwocmV0KVxuXHRcdFx0XHQ6IFwiXCI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBib3VuZFRhZyAmJiBwYXJlbnRWaWV3Ll8ub25SZW5kZXJcblx0XHQvLyBDYWxsIG9uUmVuZGVyICh1c2VkIGJ5IEpzVmlld3MgaWYgcHJlc2VudCwgdG8gYWRkIGJpbmRpbmcgYW5ub3RhdGlvbnMgYXJvdW5kIHJlbmRlcmVkIGNvbnRlbnQpXG5cdFx0PyBwYXJlbnRWaWV3Ll8ub25SZW5kZXIocmV0LCBwYXJlbnRWaWV3LCB0YWcpXG5cdFx0OiByZXQ7XG59XG5cbi8vPT09PT09PT09PT09PT09PT1cbi8vIFZpZXcgY29uc3RydWN0b3Jcbi8vPT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gVmlldyhjb250ZXh0LCB0eXBlLCBwYXJlbnRWaWV3LCBkYXRhLCB0ZW1wbGF0ZSwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpIHtcblx0Ly8gQ29uc3RydWN0b3IgZm9yIHZpZXcgb2JqZWN0IGluIHZpZXcgaGllcmFyY2h5LiAoQXVnbWVudGVkIGJ5IEpzVmlld3MgaWYgSnNWaWV3cyBpcyBsb2FkZWQpXG5cdHZhciB2aWV3cywgcGFyZW50Vmlld18sIHRhZywgc2VsZl8sXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0aXNBcnJheSA9IHR5cGUgPT09IFwiYXJyYXlcIjtcblxuXHRzZWxmLmNvbnRlbnQgPSBjb250ZW50VG1wbDtcblx0c2VsZi52aWV3cyA9IGlzQXJyYXkgPyBbXSA6IHt9O1xuXHRzZWxmLnBhcmVudCA9IHBhcmVudFZpZXc7XG5cdHNlbGYudHlwZSA9IHR5cGUgfHwgXCJ0b3BcIjtcblx0c2VsZi5kYXRhID0gZGF0YTtcblx0c2VsZi50bXBsID0gdGVtcGxhdGU7XG5cdC8vIElmIHRoZSBkYXRhIGlzIGFuIGFycmF5LCB0aGlzIGlzIGFuICdhcnJheSB2aWV3JyB3aXRoIGEgdmlld3MgYXJyYXkgZm9yIGVhY2ggY2hpbGQgJ2l0ZW0gdmlldydcblx0Ly8gSWYgdGhlIGRhdGEgaXMgbm90IGFuIGFycmF5LCB0aGlzIGlzIGFuICdpdGVtIHZpZXcnIHdpdGggYSB2aWV3cyAnaGFzaCcgb2JqZWN0IGZvciBhbnkgY2hpbGQgbmVzdGVkIHZpZXdzXG5cdC8vIC5fLnVzZUtleSBpcyBub24gemVybyBpZiBpcyBub3QgYW4gJ2FycmF5IHZpZXcnIChvd25pbmcgYSBkYXRhIGFycmF5KS4gVXNlIHRoaXMgYXMgbmV4dCBrZXkgZm9yIGFkZGluZyB0byBjaGlsZCB2aWV3cyBoYXNoXG5cdHNlbGZfID0gc2VsZi5fID0ge1xuXHRcdGtleTogMCxcblx0XHR1c2VLZXk6IGlzQXJyYXkgPyAwIDogMSxcblx0XHRpZDogXCJcIiArIHZpZXdJZCsrLFxuXHRcdG9uUmVuZGVyOiBvblJlbmRlcixcblx0XHRibmRzOiB7fVxuXHR9O1xuXHRzZWxmLmxpbmtlZCA9ICEhb25SZW5kZXI7XG5cdGlmIChwYXJlbnRWaWV3KSB7XG5cdFx0dmlld3MgPSBwYXJlbnRWaWV3LnZpZXdzO1xuXHRcdHBhcmVudFZpZXdfID0gcGFyZW50Vmlldy5fO1xuXHRcdGlmIChwYXJlbnRWaWV3Xy51c2VLZXkpIHtcblx0XHRcdC8vIFBhcmVudCBpcyBub3QgYW4gJ2FycmF5IHZpZXcnLiBBZGQgdGhpcyB2aWV3IHRvIGl0cyB2aWV3cyBvYmplY3Rcblx0XHRcdC8vIHNlbGYuX2tleSA9IGlzIHRoZSBrZXkgaW4gdGhlIHBhcmVudCB2aWV3IGhhc2hcblx0XHRcdHZpZXdzW3NlbGZfLmtleSA9IFwiX1wiICsgcGFyZW50Vmlld18udXNlS2V5KytdID0gc2VsZjtcblx0XHRcdHNlbGYuaW5kZXggPSBpbmRleFN0cjtcblx0XHRcdHNlbGYuZ2V0SW5kZXggPSBnZXROZXN0ZWRJbmRleDtcblx0XHR9IGVsc2UgaWYgKHZpZXdzLmxlbmd0aCA9PT0gKHNlbGZfLmtleSA9IHNlbGYuaW5kZXggPSBrZXkpKSB7IC8vIFBhcmVudCBpcyBhbiAnYXJyYXkgdmlldycuIEFkZCB0aGlzIHZpZXcgdG8gaXRzIHZpZXdzIGFycmF5XG5cdFx0XHR2aWV3cy5wdXNoKHNlbGYpOyAvLyBBZGRpbmcgdG8gZW5kIG9mIHZpZXdzIGFycmF5LiAoVXNpbmcgcHVzaCB3aGVuIHBvc3NpYmxlIC0gYmV0dGVyIHBlcmYgdGhhbiBzcGxpY2UpXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZpZXdzLnNwbGljZShrZXksIDAsIHNlbGYpOyAvLyBJbnNlcnRpbmcgaW4gdmlld3MgYXJyYXlcblx0XHR9XG5cdFx0Ly8gSWYgbm8gY29udGV4dCB3YXMgcGFzc2VkIGluLCB1c2UgcGFyZW50IGNvbnRleHRcblx0XHQvLyBJZiBjb250ZXh0IHdhcyBwYXNzZWQgaW4sIGl0IHNob3VsZCBoYXZlIGJlZW4gbWVyZ2VkIGFscmVhZHkgd2l0aCBwYXJlbnQgY29udGV4dFxuXHRcdHNlbGYuY3R4ID0gY29udGV4dCB8fCBwYXJlbnRWaWV3LmN0eDtcblx0fSBlbHNlIHtcblx0XHRzZWxmLmN0eCA9IGNvbnRleHQ7XG5cdH1cbn1cblxuVmlldy5wcm90b3R5cGUgPSB7XG5cdGdldDogZ2V0Vmlldyxcblx0Z2V0SW5kZXg6IGdldEluZGV4LFxuXHRnZXRSc2M6IGdldFJlc291cmNlLFxuXHRnZXRUbXBsOiBnZXRUZW1wbGF0ZSxcblx0aGxwOiBnZXRIZWxwZXIsXG5cdF9pczogXCJ2aWV3XCJcbn07XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVnaXN0cmF0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZUNoaWxkUmVzb3VyY2VzKHBhcmVudFRtcGwpIHtcblx0dmFyIHN0b3JlTmFtZSwgc3RvcmVOYW1lcywgcmVzb3VyY2VzO1xuXHRmb3IgKHN0b3JlTmFtZSBpbiBqc3ZTdG9yZXMpIHtcblx0XHRzdG9yZU5hbWVzID0gc3RvcmVOYW1lICsgXCJzXCI7XG5cdFx0aWYgKHBhcmVudFRtcGxbc3RvcmVOYW1lc10pIHtcblx0XHRcdHJlc291cmNlcyA9IHBhcmVudFRtcGxbc3RvcmVOYW1lc107ICAgIC8vIFJlc291cmNlcyBub3QgeWV0IGNvbXBpbGVkXG5cdFx0XHRwYXJlbnRUbXBsW3N0b3JlTmFtZXNdID0ge307ICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHVuY29tcGlsZWQgcmVzb3VyY2VzXG5cdFx0XHQkdmlld3Nbc3RvcmVOYW1lc10ocmVzb3VyY2VzLCBwYXJlbnRUbXBsKTsgLy8gQWRkIGJhY2sgaW4gdGhlIGNvbXBpbGVkIHJlc291cmNlc1xuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVRhZ1xuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZVRhZyhuYW1lLCB0YWdEZWYsIHBhcmVudFRtcGwpIHtcblx0dmFyIHRtcGwsIGJhc2VUYWcsIHByb3AsXG5cdFx0Y29tcGlsZWREZWYgPSBuZXcgJHN1Yi5fdGcoKTtcblxuXHRmdW5jdGlvbiBUYWcoKSB7XG5cdFx0dmFyIHRhZyA9IHRoaXM7XG5cdFx0dGFnLl8gPSB7XG5cdFx0XHRpbmxpbmU6IHRydWUsXG5cdFx0XHR1bmxpbmtlZDogdHJ1ZVxuXHRcdH07XG5cblx0XHR0YWcudGFnTmFtZSA9IG5hbWU7XG5cdH1cblxuXHRpZiAoJGlzRnVuY3Rpb24odGFnRGVmKSkge1xuXHRcdC8vIFNpbXBsZSB0YWcgZGVjbGFyZWQgYXMgZnVuY3Rpb24uIE5vIHByZXNlbnRlciBpbnN0YW50YXRpb24uXG5cdFx0dGFnRGVmID0ge1xuXHRcdFx0ZGVwZW5kczogdGFnRGVmLmRlcGVuZHMsXG5cdFx0XHRyZW5kZXI6IHRhZ0RlZlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoXCJcIiArIHRhZ0RlZiA9PT0gdGFnRGVmKSB7XG5cdFx0dGFnRGVmID0ge3RlbXBsYXRlOiB0YWdEZWZ9O1xuXHR9XG5cdGlmIChiYXNlVGFnID0gdGFnRGVmLmJhc2VUYWcpIHtcblx0XHR0YWdEZWYuZmxvdyA9ICEhdGFnRGVmLmZsb3c7IC8vIFNldCBmbG93IHByb3BlcnR5LCBzbyBkZWZhdWx0cyB0byBmYWxzZSBldmVuIGlmIGJhc2VUYWcgaGFzIGZsb3c9dHJ1ZVxuXHRcdHRhZ0RlZi5iYXNlVGFnID0gYmFzZVRhZyA9IFwiXCIgKyBiYXNlVGFnID09PSBiYXNlVGFnXG5cdFx0XHQ/IChwYXJlbnRUbXBsICYmIHBhcmVudFRtcGwudGFnc1tiYXNlVGFnXSB8fCAkdGFnc1tiYXNlVGFnXSlcblx0XHRcdDogYmFzZVRhZztcblxuXHRcdGNvbXBpbGVkRGVmID0gJGV4dGVuZChjb21waWxlZERlZiwgYmFzZVRhZyk7XG5cblx0XHRmb3IgKHByb3AgaW4gdGFnRGVmKSB7XG5cdFx0XHRjb21waWxlZERlZltwcm9wXSA9IGdldE1ldGhvZChiYXNlVGFnW3Byb3BdLCB0YWdEZWZbcHJvcF0pO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb21waWxlZERlZiA9ICRleHRlbmQoY29tcGlsZWREZWYsIHRhZ0RlZik7XG5cdH1cblxuXHQvLyBUYWcgZGVjbGFyZWQgYXMgb2JqZWN0LCB1c2VkIGFzIHRoZSBwcm90b3R5cGUgZm9yIHRhZyBpbnN0YW50aWF0aW9uIChjb250cm9sL3ByZXNlbnRlcilcblx0aWYgKCh0bXBsID0gY29tcGlsZWREZWYudGVtcGxhdGUpICE9PSB1bmRlZmluZWQpIHtcblx0XHRjb21waWxlZERlZi50ZW1wbGF0ZSA9IFwiXCIgKyB0bXBsID09PSB0bXBsID8gKCR0ZW1wbGF0ZXNbdG1wbF0gfHwgJHRlbXBsYXRlcyh0bXBsKSkgOiB0bXBsO1xuXHR9XG5cdGlmIChjb21waWxlZERlZi5pbml0ICE9PSBmYWxzZSkge1xuXHRcdC8vIFNldCBpbml0OiBmYWxzZSBvbiB0YWdEZWYgaWYgeW91IHdhbnQgdG8gcHJvdmlkZSBqdXN0IGEgcmVuZGVyIG1ldGhvZCwgb3IgcmVuZGVyIGFuZCB0ZW1wbGF0ZSwgYnV0IG5vIGNvbnN0cnVjdG9yIG9yIHByb3RvdHlwZS5cblx0XHQvLyBzbyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGFnIHRvIHJlbmRlciBmdW5jdGlvbiwgZXhjZXB0IHlvdSBjYW4gYWxzbyBwcm92aWRlIGEgdGVtcGxhdGUuXG5cdFx0KFRhZy5wcm90b3R5cGUgPSBjb21waWxlZERlZikuY29uc3RydWN0b3IgPSBjb21waWxlZERlZi5fY3RyID0gVGFnO1xuXHR9XG5cblx0aWYgKHBhcmVudFRtcGwpIHtcblx0XHRjb21waWxlZERlZi5fcGFyZW50VG1wbCA9IHBhcmVudFRtcGw7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVkRGVmO1xufVxuXG5mdW5jdGlvbiBiYXNlQXBwbHkoYXJncykge1xuXHQvLyBJbiBkZXJpdmVkIG1ldGhvZCAob3IgaGFuZGxlciBkZWNsYXJlZCBkZWNsYXJhdGl2ZWx5IGFzIGluIHt7OmZvbyBvbkNoYW5nZT1+Zm9vQ2hhbmdlZH19IGNhbiBjYWxsIGJhc2UgbWV0aG9kLFxuXHQvLyB1c2luZyB0aGlzLmJhc2VBcHBseShhcmd1bWVudHMpIChFcXVpdmFsZW50IHRvIHRoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSBpbiBqUXVlcnkgVUkpXG5cdHJldHVybiB0aGlzLmJhc2UuYXBwbHkodGhpcywgYXJncyk7XG59XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBjb21waWxlVG1wbFxuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZVRtcGwobmFtZSwgdG1wbCwgcGFyZW50VG1wbCwgb3B0aW9ucykge1xuXHQvLyB0bXBsIGlzIGVpdGhlciBhIHRlbXBsYXRlIG9iamVjdCwgYSBzZWxlY3RvciBmb3IgYSB0ZW1wbGF0ZSBzY3JpcHQgYmxvY2ssIHRoZSBuYW1lIG9mIGEgY29tcGlsZWQgdGVtcGxhdGUsIG9yIGEgdGVtcGxhdGUgb2JqZWN0XG5cblx0Ly89PT09IG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXHRmdW5jdGlvbiBsb29rdXBUZW1wbGF0ZSh2YWx1ZSkge1xuXHRcdC8vIElmIHZhbHVlIGlzIG9mIHR5cGUgc3RyaW5nIC0gdHJlYXQgYXMgc2VsZWN0b3IsIG9yIG5hbWUgb2YgY29tcGlsZWQgdGVtcGxhdGVcblx0XHQvLyBSZXR1cm4gdGhlIHRlbXBsYXRlIG9iamVjdCwgaWYgYWxyZWFkeSBjb21waWxlZCwgb3IgdGhlIG1hcmt1cCBzdHJpbmdcblx0XHR2YXIgY3VycmVudE5hbWUsIHRtcGw7XG5cdFx0aWYgKChcIlwiICsgdmFsdWUgPT09IHZhbHVlKSB8fCB2YWx1ZS5ub2RlVHlwZSA+IDAgJiYgKGVsZW0gPSB2YWx1ZSkpIHtcblx0XHRcdGlmICghZWxlbSkge1xuXHRcdFx0XHRpZiAoL15cXC5cXC9bXlxcXFw6Kj9cIjw+XSokLy50ZXN0KHZhbHVlKSkge1xuXHRcdFx0XHRcdC8vIHRtcGw9XCIuL3NvbWUvZmlsZS5odG1sXCJcblx0XHRcdFx0XHQvLyBJZiB0aGUgdGVtcGxhdGUgaXMgbm90IG5hbWVkLCB1c2UgXCIuL3NvbWUvZmlsZS5odG1sXCIgYXMgbmFtZS5cblx0XHRcdFx0XHRpZiAodG1wbCA9ICR0ZW1wbGF0ZXNbbmFtZSA9IG5hbWUgfHwgdmFsdWVdKSB7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHRtcGw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIEJST1dTRVItU1BFQ0lGSUMgQ09ERSAobm90IG9uIE5vZGUuanMpOlxuXHRcdFx0XHRcdFx0Ly8gTG9vayBmb3Igc2VydmVyLWdlbmVyYXRlZCBzY3JpcHQgYmxvY2sgd2l0aCBpZCBcIi4vc29tZS9maWxlLmh0bWxcIlxuXHRcdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoJC5mbiAmJiAhJHN1Yi5yVG1wbC50ZXN0KHZhbHVlKSkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gJChkb2N1bWVudCkuZmluZCh2YWx1ZSlbMF07IC8vIGlmIGpRdWVyeSBpcyBsb2FkZWQsIHRlc3QgZm9yIHNlbGVjdG9yIHJldHVybmluZyBlbGVtZW50cywgYW5kIGdldCBmaXJzdCBlbGVtZW50XG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHRcdFx0fS8vIEVORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdH0gLy9CUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdC8vIEdlbmVyYWxseSB0aGlzIGlzIGEgc2NyaXB0IGVsZW1lbnQuXG5cdFx0XHRcdC8vIEhvd2V2ZXIgd2UgYWxsb3cgaXQgdG8gYmUgYW55IGVsZW1lbnQsIHNvIHlvdSBjYW4gZm9yIGV4YW1wbGUgdGFrZSB0aGUgY29udGVudCBvZiBhIGRpdixcblx0XHRcdFx0Ly8gdXNlIGl0IGFzIGEgdGVtcGxhdGUsIGFuZCByZXBsYWNlIGl0IGJ5IHRoZSBzYW1lIGNvbnRlbnQgcmVuZGVyZWQgYWdhaW5zdCBkYXRhLlxuXHRcdFx0XHQvLyBlLmcuIGZvciBsaW5raW5nIHRoZSBjb250ZW50IG9mIGEgZGl2IHRvIGEgY29udGFpbmVyLCBhbmQgdXNpbmcgdGhlIGluaXRpYWwgY29udGVudCBhcyB0ZW1wbGF0ZTpcblx0XHRcdFx0Ly8gJC5saW5rKFwiI2NvbnRlbnRcIiwgbW9kZWwsIHt0bXBsOiBcIiNjb250ZW50XCJ9KTtcblx0XHRcdFx0aWYgKG9wdGlvbnMpIHtcblx0XHRcdFx0XHQvLyBXZSB3aWxsIGNvbXBpbGUgYSBuZXcgdGVtcGxhdGUgdXNpbmcgdGhlIG1hcmt1cCBpbiB0aGUgc2NyaXB0IGVsZW1lbnRcblx0XHRcdFx0XHR2YWx1ZSA9IGVsZW0uaW5uZXJIVE1MO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFdlIHdpbGwgY2FjaGUgYSBzaW5nbGUgY29weSBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUsIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbmFtZVxuXHRcdFx0XHRcdC8vIChyZW5hbWluZyBmcm9tIGEgcHJldmlvdXMgbmFtZSBpZiB0aGVyZSB3YXMgb25lKS5cblx0XHRcdFx0XHRjdXJyZW50TmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKHRtcGxBdHRyKTtcblx0XHRcdFx0XHRpZiAoY3VycmVudE5hbWUpIHtcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50TmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9ICR0ZW1wbGF0ZXNbY3VycmVudE5hbWVdO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgJHRlbXBsYXRlc1tjdXJyZW50TmFtZV07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCQuZm4pIHtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSAkLmRhdGEoZWxlbSlbanN2VG1wbF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG5hbWUgPSBuYW1lIHx8ICgkLmZuID8ganN2VG1wbCA6IHZhbHVlKTtcblx0XHRcdFx0XHRcdHZhbHVlID0gY29tcGlsZVRtcGwobmFtZSwgZWxlbS5pbm5lckhUTUwsIHBhcmVudFRtcGwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YWx1ZS50bXBsTmFtZSA9IG5hbWUgPSBuYW1lIHx8IGN1cnJlbnROYW1lO1xuXHRcdFx0XHRcdGlmIChuYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHRcdFx0XHQkdGVtcGxhdGVzW25hbWVdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKHRtcGxBdHRyLCBuYW1lKTtcblx0XHRcdFx0XHRpZiAoJC5mbikge1xuXHRcdFx0XHRcdFx0JC5kYXRhKGVsZW0sIGpzdlRtcGwsIHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gLy8gRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0ZWxlbSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKCF2YWx1ZS5mbikge1xuXHRcdFx0dmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuIEhUTUwgZWxlbWVudCwgb3IgY29tcGlsZWQgdGVtcGxhdGUsIHJldHVybiB1bmRlZmluZWRcblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0dmFyIGVsZW0sIGNvbXBpbGVkVG1wbCxcblx0XHR0bXBsT3JNYXJrdXAgPSB0bXBsID0gdG1wbCB8fCBcIlwiO1xuXG5cdC8vPT09PSBDb21waWxlIHRoZSB0ZW1wbGF0ZSA9PT09XG5cdGlmIChvcHRpb25zID09PSAwKSB7XG5cdFx0b3B0aW9ucyA9IHVuZGVmaW5lZDtcblx0XHR0bXBsT3JNYXJrdXAgPSBsb29rdXBUZW1wbGF0ZSh0bXBsT3JNYXJrdXApOyAvLyBUb3AtbGV2ZWwgY29tcGlsZSBzbyBkbyBhIHRlbXBsYXRlIGxvb2t1cFxuXHR9XG5cblx0Ly8gSWYgb3B0aW9ucywgdGhlbiB0aGlzIHdhcyBhbHJlYWR5IGNvbXBpbGVkIGZyb20gYSAoc2NyaXB0KSBlbGVtZW50IHRlbXBsYXRlIGRlY2xhcmF0aW9uLlxuXHQvLyBJZiBub3QsIHRoZW4gaWYgdG1wbCBpcyBhIHRlbXBsYXRlIG9iamVjdCwgdXNlIGl0IGZvciBvcHRpb25zXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8ICh0bXBsLm1hcmt1cCA/IHRtcGwgOiB7fSk7XG5cdG9wdGlvbnMudG1wbE5hbWUgPSBuYW1lO1xuXHRpZiAocGFyZW50VG1wbCkge1xuXHRcdG9wdGlvbnMuX3BhcmVudFRtcGwgPSBwYXJlbnRUbXBsO1xuXHR9XG5cdC8vIElmIHRtcGwgaXMgbm90IGEgbWFya3VwIHN0cmluZyBvciBhIHNlbGVjdG9yIHN0cmluZywgdGhlbiBpdCBtdXN0IGJlIGEgdGVtcGxhdGUgb2JqZWN0XG5cdC8vIEluIHRoYXQgY2FzZSwgZ2V0IGl0IGZyb20gdGhlIG1hcmt1cCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG5cdGlmICghdG1wbE9yTWFya3VwICYmIHRtcGwubWFya3VwICYmICh0bXBsT3JNYXJrdXAgPSBsb29rdXBUZW1wbGF0ZSh0bXBsLm1hcmt1cCkpKSB7XG5cdFx0aWYgKHRtcGxPck1hcmt1cC5mbikge1xuXHRcdFx0Ly8gSWYgdGhlIHN0cmluZyByZWZlcmVuY2VzIGEgY29tcGlsZWQgdGVtcGxhdGUgb2JqZWN0LCBuZWVkIHRvIHJlY29tcGlsZSB0byBtZXJnZSBhbnkgbW9kaWZpZWQgb3B0aW9uc1xuXHRcdFx0dG1wbE9yTWFya3VwID0gdG1wbE9yTWFya3VwLm1hcmt1cDtcblx0XHR9XG5cdH1cblx0aWYgKHRtcGxPck1hcmt1cCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYgKHRtcGxPck1hcmt1cC5mbiB8fCB0bXBsLmZuKSB7XG5cdFx0XHQvLyB0bXBsIGlzIGFscmVhZHkgY29tcGlsZWQsIHNvIHVzZSBpdFxuXHRcdFx0aWYgKHRtcGxPck1hcmt1cC5mbikge1xuXHRcdFx0XHRjb21waWxlZFRtcGwgPSB0bXBsT3JNYXJrdXA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRtcGxPck1hcmt1cCBpcyBhIG1hcmt1cCBzdHJpbmcsIG5vdCBhIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHQvLyBDcmVhdGUgdGVtcGxhdGUgb2JqZWN0XG5cdFx0XHR0bXBsID0gdG1wbE9iamVjdCh0bXBsT3JNYXJrdXAsIG9wdGlvbnMpO1xuXHRcdFx0Ly8gQ29tcGlsZSB0byBBU1QgYW5kIHRoZW4gdG8gY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdHRtcGxGbih0bXBsT3JNYXJrdXAucmVwbGFjZShyRXNjYXBlUXVvdGVzLCBcIlxcXFwkJlwiKSwgdG1wbCk7XG5cdFx0fVxuXHRcdGlmICghY29tcGlsZWRUbXBsKSB7XG5cdFx0XHRjb21waWxlZFRtcGwgPSAkZXh0ZW5kKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gY29tcGlsZWRUbXBsLnJlbmRlci5hcHBseShjb21waWxlZFRtcGwsIGFyZ3VtZW50cyk7XG5cdFx0XHR9LCB0bXBsKTtcblxuXHRcdFx0Y29tcGlsZUNoaWxkUmVzb3VyY2VzKGNvbXBpbGVkVG1wbCk7XG5cdFx0fVxuXHRcdGlmIChuYW1lICYmICFwYXJlbnRUbXBsICYmIG5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdCRyZW5kZXJbbmFtZV0gPSBjb21waWxlZFRtcGw7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlZFRtcGw7XG5cdH1cbn1cblxuLy89PT09IC9lbmQgb2YgZnVuY3Rpb24gY29tcGlsZVRtcGwgPT09PVxuXG4vLz09PT09PT09PT09PT09PT09XG4vLyBjb21waWxlVmlld01vZGVsXG4vLz09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRWYWwoZGVmYXVsdFZhbCwgZGF0YSkge1xuXHRyZXR1cm4gJC5pc0Z1bmN0aW9uKGRlZmF1bHRWYWwpXG5cdFx0PyBkZWZhdWx0VmFsLmNhbGwoZGF0YSlcblx0XHQ6IGRlZmF1bHRWYWw7XG59XG5cbmZ1bmN0aW9uIHVubWFwQXJyYXkobW9kZWxBcnIpIHtcblx0XHR2YXIgaSwgYXJyID0gW10sXG5cdFx0XHRsID0gbW9kZWxBcnIubGVuZ3RoO1xuXHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0YXJyLnB1c2gobW9kZWxBcnJbaV0udW5tYXAoKSk7XG5cdFx0fVxuXHRcdHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVWaWV3TW9kZWwobmFtZSwgdHlwZSkge1xuXHR2YXIgaSwgY29uc3RydWN0b3IsXG5cdFx0dmlld01vZGVscyA9IHRoaXMsXG5cdFx0Z2V0dGVycyA9IHR5cGUuZ2V0dGVycyxcblx0XHRleHRlbmQgPSB0eXBlLmV4dGVuZCxcblx0XHRpZCA9IHR5cGUuaWQsXG5cdFx0cHJvdG8gPSAkLmV4dGVuZCh7XG5cdFx0XHRfaXM6IG5hbWUgfHwgXCJ1bm5hbWVkXCIsXG5cdFx0XHR1bm1hcDogdW5tYXAsXG5cdFx0XHRtZXJnZTogbWVyZ2Vcblx0XHR9LCBleHRlbmQpLFxuXHRcdGFyZ3MgPSBcIlwiLFxuXHRcdGJvZHkgPSBcIlwiLFxuXHRcdGwgPSBnZXR0ZXJzID8gZ2V0dGVycy5sZW5ndGggOiAwLFxuXHRcdCRvYnNlcnZhYmxlID0gJC5vYnNlcnZhYmxlLFxuXHRcdGdldHRlck5hbWVzID0ge307XG5cblx0ZnVuY3Rpb24gR2V0TmV3KGFyZ3MpIHtcblx0XHRjb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmdzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHZtKCkge1xuXHRcdHJldHVybiBuZXcgR2V0TmV3KGFyZ3VtZW50cyk7XG5cdH1cblxuXHRmdW5jdGlvbiBpdGVyYXRlKGRhdGEsIGFjdGlvbikge1xuXHRcdHZhciBqLCBnZXR0ZXJUeXBlLCBkZWZhdWx0VmFsLCBwcm9wLCBvYixcblx0XHRcdG0gPSBnZXR0ZXJzLmxlbmd0aDtcblx0XHRmb3IgKGo9MDsgajxtOyBqKyspIHtcblx0XHRcdHByb3AgPSBnZXR0ZXJzW2pdO1xuXHRcdFx0Z2V0dGVyVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGlmIChwcm9wICsgXCJcIiAhPT0gcHJvcCkge1xuXHRcdFx0XHRnZXR0ZXJUeXBlID0gcHJvcDtcblx0XHRcdFx0cHJvcCA9IGdldHRlclR5cGUuZ2V0dGVyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKChvYiA9IGRhdGFbcHJvcF0pID09PSB1bmRlZmluZWQgJiYgZ2V0dGVyVHlwZSAmJiAoZGVmYXVsdFZhbCA9IGdldHRlclR5cGUuZGVmYXVsdFZhbCkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvYiA9IGdldERlZmF1bHRWYWwoZGVmYXVsdFZhbCwgZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRhY3Rpb24ob2IsIGdldHRlclR5cGUgJiYgdmlld01vZGVsc1tnZXR0ZXJUeXBlLnR5cGVdLCBwcm9wKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBtYXAoZGF0YSkge1xuXHRcdGRhdGEgPSBkYXRhICsgXCJcIiA9PT0gZGF0YVxuXHRcdFx0PyBKU09OLnBhcnNlKGRhdGEpIC8vIEFjY2VwdCBKU09OIHN0cmluZ1xuXHRcdFx0OiBkYXRhOyAgICAgICAgICAgIC8vIG9yIG9iamVjdC9hcnJheVxuXHRcdHZhciBpLCBqLCAgbCwgbSwgcHJvcCxcblx0XHRcdG9iID0gZGF0YSxcblx0XHRcdGFyciA9IFtdO1xuXG5cdFx0aWYgKCRpc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRkYXRhID0gZGF0YSB8fCBbXTtcblx0XHRcdGwgPSBkYXRhLmxlbmd0aDtcblx0XHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0XHRhcnIucHVzaCh0aGlzLm1hcChkYXRhW2ldKSk7XG5cdFx0XHR9XG5cdFx0XHRhcnIuX2lzID0gbmFtZTtcblx0XHRcdGFyci51bm1hcCA9IHVubWFwO1xuXHRcdFx0YXJyLm1lcmdlID0gbWVyZ2U7XG5cdFx0XHRyZXR1cm4gYXJyO1xuXHRcdH1cblxuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRpdGVyYXRlKGRhdGEsIGZ1bmN0aW9uKG9iLCB2aWV3TW9kZWwpIHtcblx0XHRcdFx0aWYgKHZpZXdNb2RlbCkgeyAvLyBJdGVyYXRlIHRvIGJ1aWxkIGdldHRlcnMgYXJnIGFycmF5ICh2YWx1ZSwgb3IgbWFwcGVkIHZhbHVlKVxuXHRcdFx0XHRcdG9iID0gdmlld01vZGVsLm1hcChvYik7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXJyLnB1c2gob2IpO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9iID0gdGhpcy5hcHBseSh0aGlzLCBhcnIpOyAvLyBJbnNhbnRpYXRlIHRoaXMgVmlldyBNb2RlbCwgcGFzc2luZyBnZXR0ZXJzIGFyZ3MgYXJyYXkgdG8gY29uc3RydWN0b3Jcblx0XHRcdGZvciAocHJvcCBpbiBkYXRhKSB7IC8vIENvcHkgb3ZlciBhbnkgb3RoZXIgcHJvcGVydGllcy4gdGhhdCBhcmUgbm90IGdldC9zZXQgcHJvcGVydGllc1xuXHRcdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8gICYmICFnZXR0ZXJOYW1lc1twcm9wXSkge1xuXHRcdFx0XHRcdG9iW3Byb3BdID0gZGF0YVtwcm9wXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb2I7XG5cdH1cblxuXHRmdW5jdGlvbiBtZXJnZShkYXRhKSB7XG5cdFx0ZGF0YSA9IGRhdGEgKyBcIlwiID09PSBkYXRhXG5cdFx0XHQ/IEpTT04ucGFyc2UoZGF0YSkgLy8gQWNjZXB0IEpTT04gc3RyaW5nXG5cdFx0XHQ6IGRhdGE7ICAgICAgICAgICAgLy8gb3Igb2JqZWN0L2FycmF5XG5cdFx0dmFyIGksIGosIGwsIG0sIHByb3AsIG1vZCwgZm91bmQsIGFzc2lnbmVkLCBvYiwgbmV3TW9kQXJyLFxuXHRcdFx0bW9kZWwgPSB0aGlzO1xuXG5cdFx0aWYgKCRpc0FycmF5KG1vZGVsKSkge1xuXHRcdFx0YXNzaWduZWQgPSB7fTtcblx0XHRcdG5ld01vZEFyciA9IFtdO1xuXHRcdFx0bCA9IGRhdGEubGVuZ3RoO1xuXHRcdFx0bSA9IG1vZGVsLmxlbmd0aDtcblx0XHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0XHRvYiA9IGRhdGFbaV07XG5cdFx0XHRcdGZvdW5kID0gZmFsc2U7XG5cdFx0XHRcdGZvciAoaj0wOyBqPG0gJiYgIWZvdW5kOyBqKyspIHtcblx0XHRcdFx0XHRpZiAoYXNzaWduZWRbal0pIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2QgPSBtb2RlbFtqXTtcblxuXHRcdFx0XHRcdGlmIChpZCkge1xuXHRcdFx0XHRcdFx0YXNzaWduZWRbal0gPSBmb3VuZCA9IGlkICsgXCJcIiA9PT0gaWRcblx0XHRcdFx0XHRcdD8gKG9iW2lkXSAmJiAoZ2V0dGVyTmFtZXNbaWRdID8gbW9kW2lkXSgpIDogbW9kW2lkXSkgPT09IG9iW2lkXSlcblx0XHRcdFx0XHRcdDogaWQobW9kLCBvYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChmb3VuZCkge1xuXHRcdFx0XHRcdG1vZC5tZXJnZShvYik7XG5cdFx0XHRcdFx0bmV3TW9kQXJyLnB1c2gobW9kKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuZXdNb2RBcnIucHVzaCh2bS5tYXAob2IpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdCRvYnNlcnZhYmxlKG1vZGVsKS5yZWZyZXNoKG5ld01vZEFyciwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb2RlbC5zcGxpY2UuYXBwbHkobW9kZWwsIFswLCBtb2RlbC5sZW5ndGhdLmNvbmNhdChuZXdNb2RBcnIpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aXRlcmF0ZShkYXRhLCBmdW5jdGlvbihvYiwgdmlld01vZGVsLCBnZXR0ZXIpIHtcblx0XHRcdGlmICh2aWV3TW9kZWwpIHtcblx0XHRcdFx0bW9kZWxbZ2V0dGVyXSgpLm1lcmdlKG9iKTsgLy8gVXBkYXRlIHR5cGVkIHByb3BlcnR5XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb2RlbFtnZXR0ZXJdKG9iKTsgLy8gVXBkYXRlIG5vbi10eXBlZCBwcm9wZXJ0eVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGZvciAocHJvcCBpbiBkYXRhKSB7XG5cdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8gJiYgIWdldHRlck5hbWVzW3Byb3BdKSB7XG5cdFx0XHRcdG1vZGVsW3Byb3BdID0gZGF0YVtwcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiB1bm1hcCgpIHtcblx0XHR2YXIgb2IsIHByb3AsIGksIGwsIGdldHRlclR5cGUsIGFyciwgdmFsdWUsXG5cdFx0XHRtb2RlbCA9IHRoaXM7XG5cblx0XHRpZiAoJGlzQXJyYXkobW9kZWwpKSB7XG5cdFx0XHRyZXR1cm4gdW5tYXBBcnJheShtb2RlbCk7XG5cdFx0fVxuXHRcdG9iID0ge307XG5cdFx0bCA9IGdldHRlcnMubGVuZ3RoO1xuXHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0cHJvcCA9IGdldHRlcnNbaV07XG5cdFx0XHRnZXR0ZXJUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHByb3AgKyBcIlwiICE9PSBwcm9wKSB7XG5cdFx0XHRcdGdldHRlclR5cGUgPSBwcm9wO1xuXHRcdFx0XHRwcm9wID0gZ2V0dGVyVHlwZS5nZXR0ZXI7XG5cdFx0XHR9XG5cdFx0XHR2YWx1ZSA9IG1vZGVsW3Byb3BdKCk7XG5cdFx0XHRvYltwcm9wXSA9IGdldHRlclR5cGUgJiYgdmFsdWUgJiYgdmlld01vZGVsc1tnZXR0ZXJUeXBlLnR5cGVdXG5cdFx0XHRcdD8gJGlzQXJyYXkodmFsdWUpXG5cdFx0XHRcdFx0PyB1bm1hcEFycmF5KHZhbHVlKVxuXHRcdFx0XHRcdDogdmFsdWUudW5tYXAoKVxuXHRcdFx0XHQ6IHZhbHVlO1xuXHRcdH1cblx0XHRmb3IgKHByb3AgaW4gbW9kZWwpIHtcblx0XHRcdGlmIChwcm9wICE9PSBcIl9pc1wiICYmICFnZXR0ZXJOYW1lc1twcm9wXSAmJiBwcm9wICE9PSAkZXhwYW5kbyAgJiYgKHByb3AuY2hhckF0KDApICE9PSBcIl9cIiB8fCAhZ2V0dGVyTmFtZXNbcHJvcC5zbGljZSgxKV0pICYmICEkLmlzRnVuY3Rpb24obW9kZWxbcHJvcF0pKSB7XG5cdFx0XHRcdG9iW3Byb3BdID0gbW9kZWxbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvYjtcblx0fVxuXG5cdEdldE5ldy5wcm90b3R5cGUgPSBwcm90bztcblxuXHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHQoZnVuY3Rpb24oZ2V0dGVyKSB7XG5cdFx0XHRnZXR0ZXIgPSBnZXR0ZXIuZ2V0dGVyIHx8IGdldHRlcjtcblx0XHRcdGdldHRlck5hbWVzW2dldHRlcl0gPSBpKzE7XG5cdFx0XHR2YXIgcHJpdkZpZWxkID0gXCJfXCIgKyBnZXR0ZXI7XG5cblx0XHRcdGFyZ3MgKz0gKGFyZ3MgPyBcIixcIiA6IFwiXCIpICsgZ2V0dGVyO1xuXHRcdFx0Ym9keSArPSBcInRoaXMuXCIgKyBwcml2RmllbGQgKyBcIiA9IFwiICsgZ2V0dGVyICsgXCI7XFxuXCI7XG5cdFx0XHRwcm90b1tnZXR0ZXJdID0gcHJvdG9bZ2V0dGVyXSB8fCBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXNbcHJpdkZpZWxkXTsgLy8gSWYgdGhlcmUgaXMgbm8gYXJndW1lbnQsIHVzZSBhcyBhIGdldHRlclxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHRcdCRvYnNlcnZhYmxlKHRoaXMpLnNldFByb3BlcnR5KGdldHRlciwgdmFsKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzW3ByaXZGaWVsZF0gPSB2YWw7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHRwcm90b1tnZXR0ZXJdLnNldCA9IHByb3RvW2dldHRlcl0uc2V0IHx8IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHRcdHRoaXNbcHJpdkZpZWxkXSA9IHZhbDsgLy8gU2V0dGVyIGNhbGxlZCBieSBvYnNlcnZhYmxlIHByb3BlcnR5IGNoYW5nZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pKGdldHRlcnNbaV0pO1xuXHR9XG5cblx0Y29uc3RydWN0b3IgPSBuZXcgRnVuY3Rpb24oYXJncywgYm9keS5zbGljZSgwLCAtMSkpO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBwcm90bztcblx0cHJvdG8uY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjtcblxuXHR2bS5tYXAgPSBtYXA7XG5cdHZtLmdldHRlcnMgPSBnZXR0ZXJzO1xuXHR2bS5leHRlbmQgPSBleHRlbmQ7XG5cdHZtLmlkID0gaWQ7XG5cdHJldHVybiB2bTtcbn1cblxuZnVuY3Rpb24gdG1wbE9iamVjdChtYXJrdXAsIG9wdGlvbnMpIHtcblx0Ly8gVGVtcGxhdGUgb2JqZWN0IGNvbnN0cnVjdG9yXG5cdHZhciBodG1sVGFnLFxuXHRcdHdyYXBNYXAgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5fd20gfHwge30sIC8vIE9ubHkgdXNlZCBpbiBKc1ZpZXdzLiBPdGhlcndpc2UgZW1wdHk6IHt9XG5cdFx0dG1wbCA9ICRleHRlbmQoXG5cdFx0XHR7XG5cdFx0XHRcdHRtcGxzOiBbXSxcblx0XHRcdFx0bGlua3M6IHt9LCAvLyBDb21waWxlZCBmdW5jdGlvbnMgZm9yIGxpbmsgZXhwcmVzc2lvbnNcblx0XHRcdFx0Ym5kczogW10sXG5cdFx0XHRcdF9pczogXCJ0ZW1wbGF0ZVwiLFxuXHRcdFx0XHRyZW5kZXI6IHJlbmRlckNvbnRlbnRcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zXG5cdFx0KTtcblxuXHR0bXBsLm1hcmt1cCA9IG1hcmt1cDtcblx0aWYgKCFvcHRpb25zLmh0bWxUYWcpIHtcblx0XHQvLyBTZXQgdG1wbC50YWcgdG8gdGhlIHRvcC1sZXZlbCBIVE1MIHRhZyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSwgaWYgYW55Li4uXG5cdFx0aHRtbFRhZyA9IHJGaXJzdEVsZW0uZXhlYyhtYXJrdXApO1xuXHRcdHRtcGwuaHRtbFRhZyA9IGh0bWxUYWcgPyBodG1sVGFnWzFdLnRvTG93ZXJDYXNlKCkgOiBcIlwiO1xuXHR9XG5cdGh0bWxUYWcgPSB3cmFwTWFwW3RtcGwuaHRtbFRhZ107XG5cdGlmIChodG1sVGFnICYmIGh0bWxUYWcgIT09IHdyYXBNYXAuZGl2KSB7XG5cdFx0Ly8gV2hlbiB1c2luZyBKc1ZpZXdzLCB3ZSB0cmltIHRlbXBsYXRlcyB3aGljaCBhcmUgaW5zZXJ0ZWQgaW50byBIVE1MIGNvbnRleHRzIHdoZXJlIHRleHQgbm9kZXMgYXJlIG5vdCByZW5kZXJlZCAoaS5lLiBub3QgJ1BocmFzaW5nIENvbnRlbnQnKS5cblx0XHQvLyBDdXJyZW50bHkgbm90IHRyaW1tZWQgZm9yIDxsaT4gdGFnLiAoTm90IHdvcnRoIGFkZGluZyBwZXJmIGNvc3QpXG5cdFx0dG1wbC5tYXJrdXAgPSAkLnRyaW0odG1wbC5tYXJrdXApO1xuXHR9XG5cblx0cmV0dXJuIHRtcGw7XG59XG5cbi8vPT09PT09PT09PT09PT1cbi8vIHJlZ2lzdGVyU3RvcmVcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVnaXN0ZXJTdG9yZShzdG9yZU5hbWUsIHN0b3JlU2V0dGluZ3MpIHtcblxuXHRmdW5jdGlvbiB0aGVTdG9yZShuYW1lLCBpdGVtLCBwYXJlbnRUbXBsKSB7XG5cdFx0Ly8gVGhlIHN0b3JlIGlzIGFsc28gdGhlIGZ1bmN0aW9uIHVzZWQgdG8gYWRkIGl0ZW1zIHRvIHRoZSBzdG9yZS4gZS5nLiAkLnRlbXBsYXRlcywgb3IgJC52aWV3cy50YWdzXG5cblx0XHQvLyBGb3Igc3RvcmUgb2YgbmFtZSAndGhpbmcnLCBDYWxsIGFzOlxuXHRcdC8vICAgICQudmlld3MudGhpbmdzKGl0ZW1zWywgcGFyZW50VG1wbF0pLFxuXHRcdC8vIG9yICQudmlld3MudGhpbmdzKG5hbWUsIGl0ZW1bLCBwYXJlbnRUbXBsXSlcblxuXHRcdHZhciBvblN0b3JlLCBjb21waWxlLCBpdGVtTmFtZSwgdGhpc1N0b3JlO1xuXHRcdGlmIChuYW1lICYmIHR5cGVvZiBuYW1lID09PSBPQkpFQ1QgJiYgIW5hbWUubm9kZVR5cGUgJiYgIW5hbWUubWFya3VwICYmICFuYW1lLmdldFRndCAmJiAhKHN0b3JlTmFtZSA9PT0gXCJ2aWV3TW9kZWxcIiAmJiBuYW1lLmdldHRlcnMgfHwgbmFtZS5leHRlbmQpKSB7XG5cdFx0XHQvLyBDYWxsIHRvICQudmlld3MudGhpbmdzKGl0ZW1zWywgcGFyZW50VG1wbF0pLFxuXG5cdFx0XHQvLyBBZGRpbmcgaXRlbXMgdG8gdGhlIHN0b3JlXG5cdFx0XHQvLyBJZiBuYW1lIGlzIGEgaGFzaCwgdGhlbiBpdGVtIGlzIHBhcmVudFRtcGwuIEl0ZXJhdGUgb3ZlciBoYXNoIGFuZCBjYWxsIHN0b3JlIGZvciBrZXkuXG5cdFx0XHRmb3IgKGl0ZW1OYW1lIGluIG5hbWUpIHtcblx0XHRcdFx0dGhlU3RvcmUoaXRlbU5hbWUsIG5hbWVbaXRlbU5hbWVdLCBpdGVtKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpdGVtIHx8ICR2aWV3cztcblx0XHR9XG5cdFx0Ly8gQWRkaW5nIGEgc2luZ2xlIHVubmFtZWQgaXRlbSB0byB0aGUgc3RvcmVcblx0XHRpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpdGVtID0gbmFtZTtcblx0XHRcdG5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmIChuYW1lICYmIFwiXCIgKyBuYW1lICE9PSBuYW1lKSB7IC8vIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xuXHRcdFx0cGFyZW50VG1wbCA9IGl0ZW07XG5cdFx0XHRpdGVtID0gbmFtZTtcblx0XHRcdG5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHRoaXNTdG9yZSA9IHBhcmVudFRtcGxcblx0XHRcdD8gc3RvcmVOYW1lID09PSBcInZpZXdNb2RlbFwiXG5cdFx0XHRcdD8gcGFyZW50VG1wbFxuXHRcdFx0XHQ6IChwYXJlbnRUbXBsW3N0b3JlTmFtZXNdID0gcGFyZW50VG1wbFtzdG9yZU5hbWVzXSB8fCB7fSlcblx0XHRcdDogdGhlU3RvcmU7XG5cdFx0Y29tcGlsZSA9IHN0b3JlU2V0dGluZ3MuY29tcGlsZTtcblx0XHRpZiAoaXRlbSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gSWYgaXRlbSBpcyBudWxsLCBkZWxldGUgdGhpcyBlbnRyeVxuXHRcdFx0aWYgKG5hbWUpIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXNTdG9yZVtuYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aXRlbSA9IGNvbXBpbGUgPyBjb21waWxlLmNhbGwodGhpc1N0b3JlLCBuYW1lLCBpdGVtLCBwYXJlbnRUbXBsLCAwKSA6IGl0ZW07XG5cdFx0XHRpZiAobmFtZSkge1xuXHRcdFx0XHR0aGlzU3RvcmVbbmFtZV0gPSBpdGVtO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoY29tcGlsZSAmJiBpdGVtKSB7XG5cdFx0XHRpdGVtLl9pcyA9IHN0b3JlTmFtZTsgLy8gT25seSBkbyB0aGlzIGZvciBjb21waWxlZCBvYmplY3RzICh0YWdzLCB0ZW1wbGF0ZXMuLi4pXG5cdFx0fVxuXHRcdGlmIChpdGVtICYmIChvblN0b3JlID0gJHN1Yi5vblN0b3JlW3N0b3JlTmFtZV0pKSB7XG5cdFx0XHQvLyBlLmcuIEpzVmlld3MgaW50ZWdyYXRpb25cblx0XHRcdG9uU3RvcmUobmFtZSwgaXRlbSwgY29tcGlsZSk7XG5cdFx0fVxuXHRcdHJldHVybiBpdGVtO1xuXHR9XG5cblx0dmFyIHN0b3JlTmFtZXMgPSBzdG9yZU5hbWUgKyBcInNcIjtcblxuXHQkdmlld3Nbc3RvcmVOYW1lc10gPSB0aGVTdG9yZTtcbn1cblxuZnVuY3Rpb24gYWRkU2V0dGluZyhzdCkge1xuXHQkdmlld3NTZXR0aW5nc1tzdF0gPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG5cdFx0XHQ/ICgkc3ViU2V0dGluZ3Nbc3RdID0gdmFsdWUsICR2aWV3c1NldHRpbmdzKVxuXHRcdFx0OiAkc3ViU2V0dGluZ3Nbc3RdO1xuXHR9O1xufVxuXG4vLz09PT09PT09PVxuLy8gZGF0YU1hcFxuLy89PT09PT09PT1cblxuZnVuY3Rpb24gZGF0YU1hcChtYXBEZWYpIHtcblx0ZnVuY3Rpb24gTWFwKHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdHRoaXMudGd0ID0gbWFwRGVmLmdldFRndChzb3VyY2UsIG9wdGlvbnMpO1xuXHR9XG5cblx0aWYgKCRpc0Z1bmN0aW9uKG1hcERlZikpIHtcblx0XHQvLyBTaW1wbGUgbWFwIGRlY2xhcmVkIGFzIGZ1bmN0aW9uXG5cdFx0bWFwRGVmID0ge1xuXHRcdFx0Z2V0VGd0OiBtYXBEZWZcblx0XHR9O1xuXHR9XG5cblx0aWYgKG1hcERlZi5iYXNlTWFwKSB7XG5cdFx0bWFwRGVmID0gJGV4dGVuZCgkZXh0ZW5kKHt9LCBtYXBEZWYuYmFzZU1hcCksIG1hcERlZik7XG5cdH1cblxuXHRtYXBEZWYubWFwID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zKSB7XG5cdFx0cmV0dXJuIG5ldyBNYXAoc291cmNlLCBvcHRpb25zKTtcblx0fTtcblx0cmV0dXJuIG1hcERlZjtcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gcmVuZGVyQ29udGVudFxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZW5kZXJDb250ZW50KGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBrZXksIG9uUmVuZGVyKSB7XG5cdHZhciBpLCBsLCB0YWcsIHRtcGwsIHRhZ0N0eCwgaXNUb3BSZW5kZXJDYWxsLCBwcmV2RGF0YSwgcHJldkluZGV4LFxuXHRcdHZpZXcgPSBwYXJlbnRWaWV3LFxuXHRcdHJlc3VsdCA9IFwiXCI7XG5cblx0aWYgKGNvbnRleHQgPT09IHRydWUpIHtcblx0XHRub0l0ZXJhdGlvbiA9IGNvbnRleHQ7IC8vIHBhc3NpbmcgYm9vbGVhbiBhcyBzZWNvbmQgcGFyYW0gLSBub0l0ZXJhdGlvblxuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHQgIT09IE9CSkVDVCkge1xuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7IC8vIGNvbnRleHQgbXVzdCBiZSBhIGJvb2xlYW4gKG5vSXRlcmF0aW9uKSBvciBhIHBsYWluIG9iamVjdFxuXHR9XG5cblx0aWYgKHRhZyA9IHRoaXMudGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGNhbGwgZnJvbSByZW5kZXJUYWcgb3IgdGFnQ3R4LnJlbmRlciguLi4pXG5cdFx0dGFnQ3R4ID0gdGhpcztcblx0XHR2aWV3ID0gdmlldyB8fCB0YWdDdHgudmlldztcblx0XHR0bXBsID0gdmlldy5nZXRUbXBsKHRhZy50ZW1wbGF0ZSB8fCB0YWdDdHgudG1wbCk7XG5cdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRkYXRhID0gdmlldztcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyBhIHRlbXBsYXRlLnJlbmRlciguLi4pIGNhbGxcblx0XHR0bXBsID0gdGhpcztcblx0fVxuXG5cdGlmICh0bXBsKSB7XG5cdFx0aWYgKCFwYXJlbnRWaWV3ICYmIGRhdGEgJiYgZGF0YS5faXMgPT09IFwidmlld1wiKSB7XG5cdFx0XHR2aWV3ID0gZGF0YTsgLy8gV2hlbiBwYXNzaW5nIGluIGEgdmlldyB0byByZW5kZXIgb3IgbGluayAoYW5kIG5vdCBwYXNzaW5nIGluIGEgcGFyZW50IHZpZXcpIHVzZSB0aGUgcGFzc2VkLWluIHZpZXcgYXMgcGFyZW50Vmlld1xuXHRcdH1cblxuXHRcdGlmICh2aWV3KSB7XG5cdFx0XHRpZiAoZGF0YSA9PT0gdmlldykge1xuXHRcdFx0XHQvLyBJbmhlcml0IHRoZSBkYXRhIGZyb20gdGhlIHBhcmVudCB2aWV3LlxuXHRcdFx0XHQvLyBUaGlzIG1heSBiZSB0aGUgY29udGVudHMgb2YgYW4ge3tpZn19IGJsb2NrXG5cdFx0XHRcdGRhdGEgPSB2aWV3LmRhdGE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aXNUb3BSZW5kZXJDYWxsID0gIXZpZXc7XG5cdFx0aXNSZW5kZXJDYWxsID0gaXNSZW5kZXJDYWxsIHx8IGlzVG9wUmVuZGVyQ2FsbDtcblx0XHRpZiAoIXZpZXcpIHtcblx0XHRcdChjb250ZXh0ID0gY29udGV4dCB8fCB7fSkucm9vdCA9IGRhdGE7IC8vIFByb3ZpZGUgfnJvb3QgYXMgc2hvcnRjdXQgdG8gdG9wLWxldmVsIGRhdGEuXG5cdFx0fVxuXHRcdGlmICghaXNSZW5kZXJDYWxsIHx8ICRzdWJTZXR0aW5nc0FkdmFuY2VkLnVzZVZpZXdzIHx8IHRtcGwudXNlVmlld3MgfHwgdmlldyAmJiB2aWV3ICE9PSB0b3BWaWV3KSB7XG5cdFx0XHRyZXN1bHQgPSByZW5kZXJXaXRoVmlld3ModG1wbCwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHZpZXcsIGtleSwgb25SZW5kZXIsIHRhZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh2aWV3KSB7IC8vIEluIGEgYmxvY2tcblx0XHRcdFx0cHJldkRhdGEgPSB2aWV3LmRhdGE7XG5cdFx0XHRcdHByZXZJbmRleCA9IHZpZXcuaW5kZXg7XG5cdFx0XHRcdHZpZXcuaW5kZXggPSBpbmRleFN0cjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZpZXcgPSB0b3BWaWV3O1xuXHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhO1xuXHRcdFx0XHR2aWV3LmN0eCA9IGNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGlzQXJyYXkoZGF0YSkgJiYgIW5vSXRlcmF0aW9uKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHRoZSBhcnJheSwgd2hvc2UgY2hpbGQgdmlld3MgY29ycmVzcG9uZCB0byBlYWNoIGRhdGEgaXRlbS4gKE5vdGU6IGlmIGtleSBhbmQgcGFyZW50VmlldyBhcmUgcGFzc2VkIGluXG5cdFx0XHRcdC8vIGFsb25nIHdpdGggcGFyZW50IHZpZXcsIHRyZWF0IGFzIGluc2VydCAtZS5nLiBmcm9tIHZpZXcuYWRkVmlld3MgLSBzbyBwYXJlbnRWaWV3IGlzIGFscmVhZHkgdGhlIHZpZXcgaXRlbSBmb3IgYXJyYXkpXG5cdFx0XHRcdGZvciAoaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHZpZXcuaW5kZXggPSBpO1xuXHRcdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGFbaV07XG5cdFx0XHRcdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YVtpXSwgdmlldywgJHN1Yik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGE7XG5cdFx0XHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGEsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0dmlldy5kYXRhID0gcHJldkRhdGE7XG5cdFx0XHR2aWV3LmluZGV4ID0gcHJldkluZGV4O1xuXHRcdH1cblx0XHRpZiAoaXNUb3BSZW5kZXJDYWxsKSB7XG5cdFx0XHRpc1JlbmRlckNhbGwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcldpdGhWaWV3cyh0bXBsLCBkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgdmlldywga2V5LCBvblJlbmRlciwgdGFnKSB7XG5cdGZ1bmN0aW9uIHNldEl0ZW1WYXIoaXRlbSkge1xuXHRcdC8vIFdoZW4gaXRlbVZhciBpcyBzcGVjaWZpZWQsIHNldCBtb2RpZmllZCBjdHggd2l0aCB1c2VyLW5hbWVkIH5pdGVtXG5cdFx0bmV3Q3R4ID0gJGV4dGVuZCh7fSwgY29udGV4dCk7XG5cdFx0bmV3Q3R4W2l0ZW1WYXJdID0gaXRlbTtcblx0fVxuXG5cdC8vIFJlbmRlciB0ZW1wbGF0ZSBhZ2FpbnN0IGRhdGEgYXMgYSB0cmVlIG9mIHN1YnZpZXdzIChuZXN0ZWQgcmVuZGVyZWQgdGVtcGxhdGUgaW5zdGFuY2VzKSwgb3IgYXMgYSBzdHJpbmcgKHRvcC1sZXZlbCB0ZW1wbGF0ZSkuXG5cdC8vIElmIHRoZSBkYXRhIGlzIHRoZSBwYXJlbnQgdmlldywgdHJlYXQgYXMgbm9JdGVyYXRpb24sIHJlLXJlbmRlciB3aXRoIHRoZSBzYW1lIGRhdGEgY29udGV4dC5cblx0dmFyIGksIGwsIG5ld1ZpZXcsIGNoaWxkVmlldywgaXRlbVJlc3VsdCwgc3dhcENvbnRlbnQsIGNvbnRlbnRUbXBsLCBvdXRlck9uUmVuZGVyLCB0bXBsTmFtZSwgaXRlbVZhciwgbmV3Q3R4LCB0YWdDdHgsXG5cdFx0cmVzdWx0ID0gXCJcIjtcblxuXHRpZiAodGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGNhbGwgZnJvbSByZW5kZXJUYWcgb3IgdGFnQ3R4LnJlbmRlciguLi4pXG5cdFx0dG1wbE5hbWUgPSB0YWcudGFnTmFtZTtcblx0XHR0YWdDdHggPSB0YWcudGFnQ3R4O1xuXHRcdGNvbnRleHQgPSBjb250ZXh0ID8gZXh0ZW5kQ3R4KGNvbnRleHQsIHRhZy5jdHgpIDogdGFnLmN0eDtcblxuXHRcdGlmICh0bXBsID09PSB2aWV3LmNvbnRlbnQpIHsgLy8ge3t4eHggdG1wbD0jY29udGVudH19XG5cdFx0XHRjb250ZW50VG1wbCA9IHRtcGwgIT09IHZpZXcuY3R4Ll93cnAgLy8gV2UgYXJlIHJlbmRlcmluZyB0aGUgI2NvbnRlbnRcblx0XHRcdFx0PyB2aWV3LmN0eC5fd3JwIC8vICNjb250ZW50IHdhcyB0aGUgdGFnQ3R4LnByb3BzLnRtcGwgd3JhcHBlciBvZiB0aGUgYmxvY2sgY29udGVudCAtIHNvIHdpdGhpbiB0aGlzIHZpZXcsICNjb250ZW50IHdpbGwgbm93IGJlIHRoZSB2aWV3LmN0eC5fd3JwIGJsb2NrIGNvbnRlbnRcblx0XHRcdFx0OiB1bmRlZmluZWQ7IC8vICNjb250ZW50IHdhcyB0aGUgdmlldy5jdHguX3dycCBibG9jayBjb250ZW50IC0gc28gd2l0aGluIHRoaXMgdmlldywgdGhlcmUgaXMgbm8gbG9uZ2VyIGFueSAjY29udGVudCB0byB3cmFwLlxuXHRcdH0gZWxzZSBpZiAodG1wbCAhPT0gdGFnQ3R4LmNvbnRlbnQpIHtcblx0XHRcdGlmICh0bXBsID09PSB0YWcudGVtcGxhdGUpIHsgLy8gUmVuZGVyaW5nIHt7dGFnfX0gdGFnLnRlbXBsYXRlLCByZXBsYWNpbmcgYmxvY2sgY29udGVudC5cblx0XHRcdFx0Y29udGVudFRtcGwgPSB0YWdDdHgudG1wbDsgLy8gU2V0ICNjb250ZW50IHRvIGJsb2NrIGNvbnRlbnQgKG9yIHdyYXBwZWQgYmxvY2sgY29udGVudCBpZiB0YWdDdHgucHJvcHMudG1wbCBpcyBzZXQpXG5cdFx0XHRcdGNvbnRleHQuX3dycCA9IHRhZ0N0eC5jb250ZW50OyAvLyBQYXNzIHdyYXBwZWQgYmxvY2sgY29udGVudCB0byBuZXN0ZWQgdmlld3Ncblx0XHRcdH0gZWxzZSB7IC8vIFJlbmRlcmluZyB0YWdDdHgucHJvcHMudG1wbCB3cmFwcGVyXG5cdFx0XHRcdGNvbnRlbnRUbXBsID0gdGFnQ3R4LmNvbnRlbnQgfHwgdmlldy5jb250ZW50OyAvLyBTZXQgI2NvbnRlbnQgdG8gd3JhcHBlZCBibG9jayBjb250ZW50XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRlbnRUbXBsID0gdmlldy5jb250ZW50OyAvLyBOZXN0ZWQgdmlld3MgaW5oZXJpdCBzYW1lIHdyYXBwZWQgI2NvbnRlbnQgcHJvcGVydHlcblx0XHR9XG5cblx0XHRpZiAodGFnQ3R4LnByb3BzLmxpbmsgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBsaW5rPWZhbHNlIHNldHRpbmcgb24gYmxvY2sgdGFnXG5cdFx0XHQvLyBXZSB3aWxsIG92ZXJyaWRlIGluaGVyaXRlZCB2YWx1ZSBvZiBsaW5rIGJ5IHRoZSBleHBsaWNpdCBzZXR0aW5nIGxpbms9ZmFsc2UgdGFrZW4gZnJvbSBwcm9wc1xuXHRcdFx0Ly8gVGhlIGNoaWxkIHZpZXdzIG9mIGFuIHVubGlua2VkIHZpZXcgYXJlIGFsc28gdW5saW5rZWQuIFNvIHNldHRpbmcgY2hpbGQgYmFjayB0byB0cnVlIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdC5cblx0XHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xuXHRcdFx0Y29udGV4dC5saW5rID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1WYXIgPSB0YWdDdHgucHJvcHMuaXRlbVZhcikge1xuXHRcdFx0aWYgKGl0ZW1WYXIuY2hhckF0KDApICE9PSBcIn5cIikge1xuXHRcdFx0XHRzeW50YXhFcnJvcihcIlVzZSBpdGVtVmFyPSd+bXlJdGVtJ1wiKTtcblx0XHRcdH1cblx0XHRcdGl0ZW1WYXIgPSBpdGVtVmFyLnNsaWNlKDEpO1xuXHRcdH1cblx0fVxuXG5cdGlmICh2aWV3KSB7XG5cdFx0b25SZW5kZXIgPSBvblJlbmRlciB8fCB2aWV3Ll8ub25SZW5kZXI7XG5cdFx0Y29udGV4dCA9IGV4dGVuZEN0eChjb250ZXh0LCB2aWV3LmN0eCk7XG5cdH1cblxuXHRpZiAoa2V5ID09PSB0cnVlKSB7XG5cdFx0c3dhcENvbnRlbnQgPSB0cnVlO1xuXHRcdGtleSA9IDA7XG5cdH1cblxuXHQvLyBJZiBsaW5rPT09ZmFsc2UsIGRvIG5vdCBjYWxsIG9uUmVuZGVyLCBzbyBubyBkYXRhLWxpbmtpbmcgbWFya2VyIG5vZGVzXG5cdGlmIChvblJlbmRlciAmJiAoY29udGV4dCAmJiBjb250ZXh0LmxpbmsgPT09IGZhbHNlIHx8IHRhZyAmJiB0YWcuXy5ub1Z3cykpIHtcblx0XHRvblJlbmRlciA9IHVuZGVmaW5lZDtcblx0fVxuXHRvdXRlck9uUmVuZGVyID0gb25SZW5kZXI7XG5cdGlmIChvblJlbmRlciA9PT0gdHJ1ZSkge1xuXHRcdC8vIFVzZWQgYnkgdmlldy5yZWZyZXNoKCkuIERvbid0IGNyZWF0ZSBhIG5ldyB3cmFwcGVyIHZpZXcuXG5cdFx0b3V0ZXJPblJlbmRlciA9IHVuZGVmaW5lZDtcblx0XHRvblJlbmRlciA9IHZpZXcuXy5vblJlbmRlcjtcblx0fVxuXHQvLyBTZXQgYWRkaXRpb25hbCBjb250ZXh0IG9uIHZpZXdzIGNyZWF0ZWQgaGVyZSwgKGFzIG1vZGlmaWVkIGNvbnRleHQgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCwgYW5kIHRvIGJlIGluaGVyaXRlZCBieSBjaGlsZCB2aWV3cylcblx0Y29udGV4dCA9IHRtcGwuaGVscGVyc1xuXHRcdD8gZXh0ZW5kQ3R4KHRtcGwuaGVscGVycywgY29udGV4dClcblx0XHQ6IGNvbnRleHQ7XG5cblx0bmV3Q3R4ID0gY29udGV4dDtcblx0aWYgKCRpc0FycmF5KGRhdGEpICYmICFub0l0ZXJhdGlvbikge1xuXHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHRoZSBhcnJheSwgd2hvc2UgY2hpbGQgdmlld3MgY29ycmVzcG9uZCB0byBlYWNoIGRhdGEgaXRlbS4gKE5vdGU6IGlmIGtleSBhbmQgdmlldyBhcmUgcGFzc2VkIGluXG5cdFx0Ly8gYWxvbmcgd2l0aCBwYXJlbnQgdmlldywgdHJlYXQgYXMgaW5zZXJ0IC1lLmcuIGZyb20gdmlldy5hZGRWaWV3cyAtIHNvIHZpZXcgaXMgYWxyZWFkeSB0aGUgdmlldyBpdGVtIGZvciBhcnJheSlcblx0XHRuZXdWaWV3ID0gc3dhcENvbnRlbnRcblx0XHRcdD8gdmlld1xuXHRcdFx0OiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdmlldylcblx0XHRcdFx0fHwgbmV3IFZpZXcoY29udGV4dCwgXCJhcnJheVwiLCB2aWV3LCBkYXRhLCB0bXBsLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCk7XG5cdFx0aWYgKHZpZXcgJiYgdmlldy5fLnVzZUtleSkge1xuXHRcdFx0Ly8gUGFyZW50IGlzIG5vdCBhbiAnYXJyYXkgdmlldydcblx0XHRcdG5ld1ZpZXcuXy5ibmQgPSAhdGFnIHx8IHRhZy5fLmJuZCAmJiB0YWc7IC8vIEZvciBhcnJheSB2aWV3cyB0aGF0IGFyZSBkYXRhIGJvdW5kIGZvciBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHMsIHNldCB0aGVcblx0XHRcdC8vIHZpZXcuXy5ibmQgcHJvcGVydHkgdG8gdHJ1ZSBmb3IgdG9wLWxldmVsIGxpbmsoKSBvciBkYXRhLWxpbms9XCJ7Zm9yfVwiLCBvciB0byB0aGUgdGFnIGluc3RhbmNlIGZvciBhIGRhdGEtYm91bmQgdGFnLCBlLmcuIHtee2ZvciAuLi59fVxuXHRcdH1cblx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0bmV3Vmlldy5pdCA9IGl0ZW1WYXI7XG5cdFx0fVxuXHRcdGl0ZW1WYXIgPSBuZXdWaWV3Lml0O1xuXHRcdGZvciAoaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgZWFjaCBkYXRhIGl0ZW0uXG5cdFx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0XHRzZXRJdGVtVmFyKGRhdGFbaV0pOyAvLyB1c2UgbW9kaWZpZWQgY3R4IHdpdGggdXNlci1uYW1lZCB+aXRlbVxuXHRcdFx0fVxuXHRcdFx0Y2hpbGRWaWV3ID0gbmV3IFZpZXcobmV3Q3R4LCBcIml0ZW1cIiwgbmV3VmlldywgZGF0YVtpXSwgdG1wbCwgKGtleSB8fCAwKSArIGksIG9uUmVuZGVyLCBuZXdWaWV3LmNvbnRlbnQpO1xuXG5cdFx0XHRpdGVtUmVzdWx0ID0gdG1wbC5mbihkYXRhW2ldLCBjaGlsZFZpZXcsICRzdWIpO1xuXHRcdFx0cmVzdWx0ICs9IG5ld1ZpZXcuXy5vblJlbmRlciA/IG5ld1ZpZXcuXy5vblJlbmRlcihpdGVtUmVzdWx0LCBjaGlsZFZpZXcpIDogaXRlbVJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3Igc2luZ2xldG9uIGRhdGEgb2JqZWN0LiBUaGUgdHlwZSBvZiB0aGUgdmlldyB3aWxsIGJlIHRoZSB0YWcgbmFtZSwgZS5nLiBcImlmXCIgb3IgXCJteVRhZ1wiIGV4Y2VwdCBmb3Jcblx0XHQvLyBcIml0ZW1cIiwgXCJhcnJheVwiIGFuZCBcImRhdGFcIiB2aWV3cy4gQSBcImRhdGFcIiB2aWV3IGlzIGZyb20gcHJvZ3JhbW1hdGljIHJlbmRlcihvYmplY3QpIGFnYWluc3QgYSAnc2luZ2xldG9uJy5cblx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0c2V0SXRlbVZhcihkYXRhKTtcblx0XHR9XG5cdFx0bmV3VmlldyA9IHN3YXBDb250ZW50ID8gdmlldyA6IG5ldyBWaWV3KG5ld0N0eCwgdG1wbE5hbWUgfHwgXCJkYXRhXCIsIHZpZXcsIGRhdGEsIHRtcGwsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKTtcblx0XHRpZiAodGFnICYmICF0YWcuZmxvdykge1xuXHRcdFx0bmV3Vmlldy50YWcgPSB0YWc7XG5cdFx0XHR0YWcudmlldyA9IG5ld1ZpZXc7XG5cdFx0fVxuXHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGEsIG5ld1ZpZXcsICRzdWIpO1xuXHR9XG5cdHJldHVybiBvdXRlck9uUmVuZGVyID8gb3V0ZXJPblJlbmRlcihyZXN1bHQsIG5ld1ZpZXcpIDogcmVzdWx0O1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbGQgYW5kIGNvbXBpbGUgdGVtcGxhdGVcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIEdlbmVyYXRlIGEgcmV1c2FibGUgZnVuY3Rpb24gdGhhdCB3aWxsIHNlcnZlIHRvIHJlbmRlciBhIHRlbXBsYXRlIGFnYWluc3QgZGF0YVxuLy8gKENvbXBpbGUgQVNUIHRoZW4gYnVpbGQgdGVtcGxhdGUgZnVuY3Rpb24pXG5cbmZ1bmN0aW9uIG9uUmVuZGVyRXJyb3IoZSwgdmlldywgZmFsbGJhY2spIHtcblx0dmFyIG1lc3NhZ2UgPSBmYWxsYmFjayAhPT0gdW5kZWZpbmVkXG5cdFx0PyAkaXNGdW5jdGlvbihmYWxsYmFjaylcblx0XHRcdD8gZmFsbGJhY2suY2FsbCh2aWV3LmRhdGEsIGUsIHZpZXcpXG5cdFx0XHQ6IGZhbGxiYWNrIHx8IFwiXCJcblx0XHQ6IFwie0Vycm9yOiBcIiArIGUubWVzc2FnZSArIFwifVwiO1xuXG5cdGlmICgkc3ViU2V0dGluZ3Mub25FcnJvciAmJiAoZmFsbGJhY2sgPSAkc3ViU2V0dGluZ3Mub25FcnJvci5jYWxsKHZpZXcuZGF0YSwgZSwgZmFsbGJhY2sgJiYgbWVzc2FnZSwgdmlldykpICE9PSB1bmRlZmluZWQpIHtcblx0XHRtZXNzYWdlID0gZmFsbGJhY2s7IC8vIFRoZXJlIGlzIGEgc2V0dGluZ3MuZGVidWdNb2RlKGhhbmRsZXIpIG9uRXJyb3Igb3ZlcnJpZGUuIENhbGwgaXQsIGFuZCB1c2UgcmV0dXJuIHZhbHVlIChpZiBhbnkpIHRvIHJlcGxhY2UgbWVzc2FnZVxuXHR9XG5cblx0cmV0dXJuIHZpZXcgJiYgIXZpZXcubGlua0N0eCA/ICRjb252ZXJ0ZXJzLmh0bWwobWVzc2FnZSkgOiBtZXNzYWdlO1xufVxuXG5mdW5jdGlvbiBlcnJvcihtZXNzYWdlKSB7XG5cdHRocm93IG5ldyAkc3ViLkVycihtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gc3ludGF4RXJyb3IobWVzc2FnZSkge1xuXHRlcnJvcihcIlN5bnRheCBlcnJvclxcblwiICsgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHRtcGxGbihtYXJrdXAsIHRtcGwsIGlzTGlua0V4cHIsIGNvbnZlcnRCYWNrLCBoYXNFbHNlKSB7XG5cdC8vIENvbXBpbGUgbWFya3VwIHRvIEFTVCAoYWJ0cmFjdCBzeW50YXggdHJlZSkgdGhlbiBidWlsZCB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBBU1Qgbm9kZXNcblx0Ly8gVXNlZCBmb3IgY29tcGlsaW5nIHRlbXBsYXRlcywgYW5kIGFsc28gYnkgSnNWaWV3cyB0byBidWlsZCBmdW5jdGlvbnMgZm9yIGRhdGEgbGluayBleHByZXNzaW9uc1xuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gcHVzaHByZWNlZGluZ0NvbnRlbnQoc2hpZnQpIHtcblx0XHRzaGlmdCAtPSBsb2M7XG5cdFx0aWYgKHNoaWZ0KSB7XG5cdFx0XHRjb250ZW50LnB1c2gobWFya3VwLnN1YnN0cihsb2MsIHNoaWZ0KS5yZXBsYWNlKHJOZXdMaW5lLCBcIlxcXFxuXCIpKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBibG9ja1RhZ0NoZWNrKHRhZ05hbWUsIGJsb2NrKSB7XG5cdFx0aWYgKHRhZ05hbWUpIHtcblx0XHRcdHRhZ05hbWUgKz0gJ319Jztcblx0XHRcdC8vXHRcdFx0J3t7aW5jbHVkZX19IGJsb2NrIGhhcyB7ey9mb3J9fSB3aXRoIG5vIG9wZW4ge3tmb3J9fSdcblx0XHRcdHN5bnRheEVycm9yKChcblx0XHRcdFx0YmxvY2tcblx0XHRcdFx0XHQ/ICd7eycgKyBibG9jayArICd9fSBibG9jayBoYXMge3svJyArIHRhZ05hbWUgKyAnIHdpdGhvdXQge3snICsgdGFnTmFtZVxuXHRcdFx0XHRcdDogJ1VubWF0Y2hlZCBvciBtaXNzaW5nIHt7LycgKyB0YWdOYW1lKSArICcsIGluIHRlbXBsYXRlOlxcbicgKyBtYXJrdXApO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlVGFnKGFsbCwgYmluZCwgdGFnTmFtZSwgY29udmVydGVyLCBjb2xvbiwgaHRtbCwgY29kZVRhZywgcGFyYW1zLCBzbGFzaCwgYmluZDIsIGNsb3NlQmxvY2ssIGluZGV4KSB7XG4vKlxuXG4gICAgIGJpbmQgICAgIHRhZ05hbWUgICAgICAgICBjdnQgICBjbG4gaHRtbCBjb2RlICAgIHBhcmFtcyAgICAgICAgICAgIHNsYXNoICAgYmluZDIgICAgICAgICBjbG9zZUJsayAgY29tbWVudFxuLyg/OnsoXFxeKT97KD86KFxcdysoPz1bXFwvXFxzfV0pKXwoXFx3Kyk/KDopfCg+KXwoXFwqKSlcXHMqKCg/OltefV18fSg/IX0pKSo/KShcXC8pP3x7KFxcXik/eyg/Oig/OlxcLyhcXHcrKSlcXHMqfCEtLVtcXHNcXFNdKj8tLSkpfX0vZ1xuXG4oPzpcbiAgeyhcXF4pP3sgICAgICAgICAgICBiaW5kXG4gICg/OlxuICAgIChcXHcrICAgICAgICAgICAgIHRhZ05hbWVcbiAgICAgICg/PVtcXC9cXHN9XSlcbiAgICApXG4gICAgfFxuICAgIChcXHcrKT8oOikgICAgICAgIGNvbnZlcnRlciBjb2xvblxuICAgIHxcbiAgICAoPikgICAgICAgICAgICAgIGh0bWxcbiAgICB8XG4gICAgKFxcKikgICAgICAgICAgICAgY29kZVRhZ1xuICApXG4gIFxccypcbiAgKCAgICAgICAgICAgICAgICAgIHBhcmFtc1xuICAgICg/OltefV18fSg/IX0pKSo/XG4gIClcbiAgKFxcLyk/ICAgICAgICAgICAgICBzbGFzaFxuICB8XG4gIHsoXFxeKT97ICAgICAgICAgICAgYmluZDJcbiAgKD86XG4gICAgKD86XFwvKFxcdyspKVxccyogICBjbG9zZUJsb2NrXG4gICAgfFxuICAgICEtLVtcXHNcXFNdKj8tLSAgICBjb21tZW50XG4gIClcbilcbn19L2dcblxuKi9cblx0XHRpZiAoY29kZVRhZyAmJiBiaW5kIHx8IHNsYXNoICYmICF0YWdOYW1lIHx8IHBhcmFtcyAmJiBwYXJhbXMuc2xpY2UoLTEpID09PSBcIjpcIiB8fCBiaW5kMikge1xuXHRcdFx0c3ludGF4RXJyb3IoYWxsKTtcblx0XHR9XG5cblx0XHQvLyBCdWlsZCBhYnN0cmFjdCBzeW50YXggdHJlZSAoQVNUKTogW3RhZ05hbWUsIGNvbnZlcnRlciwgcGFyYW1zLCBjb250ZW50LCBoYXNoLCBiaW5kaW5ncywgY29udGVudE1hcmt1cF1cblx0XHRpZiAoaHRtbCkge1xuXHRcdFx0Y29sb24gPSBcIjpcIjtcblx0XHRcdGNvbnZlcnRlciA9IEhUTUw7XG5cdFx0fVxuXHRcdHNsYXNoID0gc2xhc2ggfHwgaXNMaW5rRXhwciAmJiAhaGFzRWxzZTtcblxuXHRcdHZhciBwYXRoQmluZGluZ3MgPSAoYmluZCB8fCBpc0xpbmtFeHByKSAmJiBbW11dLFxuXHRcdFx0cHJvcHMgPSBcIlwiLFxuXHRcdFx0YXJncyA9IFwiXCIsXG5cdFx0XHRjdHhQcm9wcyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNBcmdzID0gXCJcIixcblx0XHRcdHBhcmFtc1Byb3BzID0gXCJcIixcblx0XHRcdHBhcmFtc0N0eFByb3BzID0gXCJcIixcblx0XHRcdG9uRXJyb3IgPSBcIlwiLFxuXHRcdFx0dXNlVHJpZ2dlciA9IFwiXCIsXG5cdFx0XHQvLyBCbG9jayB0YWcgaWYgbm90IHNlbGYtY2xvc2luZyBhbmQgbm90IHt7On19IG9yIHt7Pn19IChzcGVjaWFsIGNhc2UpIGFuZCBub3QgYSBkYXRhLWxpbmsgZXhwcmVzc2lvblxuXHRcdFx0YmxvY2sgPSAhc2xhc2ggJiYgIWNvbG9uO1xuXG5cdFx0Ly89PT09IG5lc3RlZCBoZWxwZXIgZnVuY3Rpb24gPT09PVxuXHRcdHRhZ05hbWUgPSB0YWdOYW1lIHx8IChwYXJhbXMgPSBwYXJhbXMgfHwgXCIjZGF0YVwiLCBjb2xvbik7IC8vIHt7On19IGlzIGVxdWl2YWxlbnQgdG8ge3s6I2RhdGF9fVxuXHRcdHB1c2hwcmVjZWRpbmdDb250ZW50KGluZGV4KTtcblx0XHRsb2MgPSBpbmRleCArIGFsbC5sZW5ndGg7IC8vIGxvY2F0aW9uIG1hcmtlciAtIHBhcnNlZCB1cCB0byBoZXJlXG5cdFx0aWYgKGNvZGVUYWcpIHtcblx0XHRcdGlmIChhbGxvd0NvZGUpIHtcblx0XHRcdFx0Y29udGVudC5wdXNoKFtcIipcIiwgXCJcXG5cIiArIHBhcmFtcy5yZXBsYWNlKC9eOi8sIFwicmV0Kz0gXCIpLnJlcGxhY2UoclVuZXNjYXBlUXVvdGVzLCBcIiQxXCIpICsgXCI7XFxuXCJdKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRhZ05hbWUpIHtcblx0XHRcdGlmICh0YWdOYW1lID09PSBcImVsc2VcIikge1xuXHRcdFx0XHRpZiAoclRlc3RFbHNlSWYudGVzdChwYXJhbXMpKSB7XG5cdFx0XHRcdFx0c3ludGF4RXJyb3IoJ2ZvciBcInt7ZWxzZSBpZiBleHByfX1cIiB1c2UgXCJ7e2Vsc2UgZXhwcn19XCInKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYXRoQmluZGluZ3MgPSBjdXJyZW50WzddICYmIFtbXV07XG5cdFx0XHRcdGN1cnJlbnRbOF0gPSBtYXJrdXAuc3Vic3RyaW5nKGN1cnJlbnRbOF0sIGluZGV4KTsgLy8gY29udGVudE1hcmt1cCBmb3IgYmxvY2sgdGFnXG5cdFx0XHRcdGN1cnJlbnQgPSBzdGFjay5wb3AoKTtcblx0XHRcdFx0Y29udGVudCA9IGN1cnJlbnRbMl07XG5cdFx0XHRcdGJsb2NrID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIG5ld2xpbmVzIGZyb20gdGhlIHBhcmFtcyBzdHJpbmcsIHRvIGF2b2lkIGNvbXBpbGVkIGNvZGUgZXJyb3JzIGZvciB1bnRlcm1pbmF0ZWQgc3RyaW5nc1xuXHRcdFx0XHRwYXJzZVBhcmFtcyhwYXJhbXMucmVwbGFjZShyTmV3TGluZSwgXCIgXCIpLCBwYXRoQmluZGluZ3MsIHRtcGwpXG5cdFx0XHRcdFx0LnJlcGxhY2UockJ1aWxkSGFzaCwgZnVuY3Rpb24oYWxsLCBvbmVycm9yLCBpc0N0eCwga2V5LCBrZXlUb2tlbiwga2V5VmFsdWUsIGFyZywgcGFyYW0pIHtcblx0XHRcdFx0XHRcdGtleSA9IFwiJ1wiICsga2V5VG9rZW4gKyBcIic6XCI7XG5cdFx0XHRcdFx0XHRpZiAoYXJnKSB7XG5cdFx0XHRcdFx0XHRcdGFyZ3MgKz0ga2V5VmFsdWUgKyBcIixcIjtcblx0XHRcdFx0XHRcdFx0cGFyYW1zQXJncyArPSBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpc0N0eCkge1xuXHRcdFx0XHRcdFx0XHRjdHhQcm9wcyArPSBrZXkgKyAnai5fY3AoJyArIGtleVZhbHVlICsgJyxcIicgKyBwYXJhbSArICdcIix2aWV3KSwnO1xuXHRcdFx0XHRcdFx0XHQvLyBDb21waWxlZCBjb2RlIGZvciBldmFsdWF0aW5nIHRhZ0N0eCBvbiBhIHRhZyB3aWxsIGhhdmU6IGN0eDp7J2Zvbyc6ai5fY3AoY29tcGlsZWRFeHByLCBcImV4cHJcIiwgdmlldyl9XG5cdFx0XHRcdFx0XHRcdHBhcmFtc0N0eFByb3BzICs9IGtleSArIFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9uZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0b25FcnJvciArPSBrZXlWYWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmIChrZXlUb2tlbiA9PT0gXCJ0cmlnZ2VyXCIpIHtcblx0XHRcdFx0XHRcdFx0XHR1c2VUcmlnZ2VyICs9IGtleVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHByb3BzICs9IGtleSArIGtleVZhbHVlICsgXCIsXCI7XG5cdFx0XHRcdFx0XHRcdHBhcmFtc1Byb3BzICs9IGtleSArIFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHRcdGhhc0hhbmRsZXJzID0gaGFzSGFuZGxlcnMgfHwgckhhc0hhbmRsZXJzLnRlc3Qoa2V5VG9rZW4pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0XHRcdFx0fSkuc2xpY2UoMCwgLTEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGF0aEJpbmRpbmdzICYmIHBhdGhCaW5kaW5nc1swXSkge1xuXHRcdFx0XHRwYXRoQmluZGluZ3MucG9wKCk7IC8vIFJlbW92ZSB0aGUgYmluZGluZ3MgdGhhdCB3YXMgcHJlcGFyZWQgZm9yIG5leHQgYXJnLiAoVGhlcmUgaXMgYWx3YXlzIGFuIGV4dHJhIG9uZSByZWFkeSkuXG5cdFx0XHR9XG5cblx0XHRcdG5ld05vZGUgPSBbXG5cdFx0XHRcdFx0dGFnTmFtZSxcblx0XHRcdFx0XHRjb252ZXJ0ZXIgfHwgISFjb252ZXJ0QmFjayB8fCBoYXNIYW5kbGVycyB8fCBcIlwiLFxuXHRcdFx0XHRcdGJsb2NrICYmIFtdLFxuXHRcdFx0XHRcdHBhcnNlZFBhcmFtKHBhcmFtc0FyZ3MgfHwgKHRhZ05hbWUgPT09IFwiOlwiID8gXCInI2RhdGEnLFwiIDogXCJcIiksIHBhcmFtc1Byb3BzLCBwYXJhbXNDdHhQcm9wcyksIC8vIHt7On19IGVxdWl2YWxlbnQgdG8ge3s6I2RhdGF9fVxuXHRcdFx0XHRcdHBhcnNlZFBhcmFtKGFyZ3MgfHwgKHRhZ05hbWUgPT09IFwiOlwiID8gXCJkYXRhLFwiIDogXCJcIiksIHByb3BzLCBjdHhQcm9wcyksXG5cdFx0XHRcdFx0b25FcnJvcixcblx0XHRcdFx0XHR1c2VUcmlnZ2VyLFxuXHRcdFx0XHRcdHBhdGhCaW5kaW5ncyB8fCAwXG5cdFx0XHRcdF07XG5cdFx0XHRjb250ZW50LnB1c2gobmV3Tm9kZSk7XG5cdFx0XHRpZiAoYmxvY2spIHtcblx0XHRcdFx0c3RhY2sucHVzaChjdXJyZW50KTtcblx0XHRcdFx0Y3VycmVudCA9IG5ld05vZGU7XG5cdFx0XHRcdGN1cnJlbnRbOF0gPSBsb2M7IC8vIFN0b3JlIGN1cnJlbnQgbG9jYXRpb24gb2Ygb3BlbiB0YWcsIHRvIGJlIGFibGUgdG8gYWRkIGNvbnRlbnRNYXJrdXAgd2hlbiB3ZSByZWFjaCBjbG9zaW5nIHRhZ1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2xvc2VCbG9jaykge1xuXHRcdFx0YmxvY2tUYWdDaGVjayhjbG9zZUJsb2NrICE9PSBjdXJyZW50WzBdICYmIGN1cnJlbnRbMF0gIT09IFwiZWxzZVwiICYmIGNsb3NlQmxvY2ssIGN1cnJlbnRbMF0pO1xuXHRcdFx0Y3VycmVudFs4XSA9IG1hcmt1cC5zdWJzdHJpbmcoY3VycmVudFs4XSwgaW5kZXgpOyAvLyBjb250ZW50TWFya3VwIGZvciBibG9jayB0YWdcblx0XHRcdGN1cnJlbnQgPSBzdGFjay5wb3AoKTtcblx0XHR9XG5cdFx0YmxvY2tUYWdDaGVjayghY3VycmVudCAmJiBjbG9zZUJsb2NrKTtcblx0XHRjb250ZW50ID0gY3VycmVudFsyXTtcblx0fVxuXHQvLz09PT0gL2VuZCBvZiBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblxuXHR2YXIgaSwgcmVzdWx0LCBuZXdOb2RlLCBoYXNIYW5kbGVycywgYmluZGluZ3MsXG5cdFx0YWxsb3dDb2RlID0gJHN1YlNldHRpbmdzLmFsbG93Q29kZSB8fCB0bXBsICYmIHRtcGwuYWxsb3dDb2RlXG5cdFx0XHR8fCAkdmlld3NTZXR0aW5ncy5hbGxvd0NvZGUgPT09IHRydWUsIC8vIGluY2x1ZGUgZGlyZWN0IHNldHRpbmcgb2Ygc2V0dGluZ3MuYWxsb3dDb2RlIHRydWUgZm9yIGJhY2t3YXJkIGNvbXBhdCBvbmx5XG5cdFx0YXN0VG9wID0gW10sXG5cdFx0bG9jID0gMCxcblx0XHRzdGFjayA9IFtdLFxuXHRcdGNvbnRlbnQgPSBhc3RUb3AsXG5cdFx0Y3VycmVudCA9IFssLGFzdFRvcF07XG5cblx0aWYgKGFsbG93Q29kZSAmJiB0bXBsLl9pcykge1xuXHRcdHRtcGwuYWxsb3dDb2RlID0gYWxsb3dDb2RlO1xuXHR9XG5cbi8vVE9ET1x0cmVzdWx0ID0gdG1wbEZuc0NhY2hlW21hcmt1cF07IC8vIE9ubHkgY2FjaGUgaWYgdGVtcGxhdGUgaXMgbm90IG5hbWVkIGFuZCBtYXJrdXAgbGVuZ3RoIDwgLi4uLFxuLy9hbmQgdGhlcmUgYXJlIG5vIGJpbmRpbmdzIG9yIHN1YnRlbXBsYXRlcz8/IENvbnNpZGVyIHN0YW5kYXJkIG9wdGltaXphdGlvbiBmb3IgZGF0YS1saW5rPVwiYS5iLmNcIlxuLy9cdFx0aWYgKHJlc3VsdCkge1xuLy9cdFx0XHR0bXBsLmZuID0gcmVzdWx0O1xuLy9cdFx0fSBlbHNlIHtcblxuLy9cdFx0cmVzdWx0ID0gbWFya3VwO1xuXHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdGlmIChjb252ZXJ0QmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtYXJrdXAgPSBtYXJrdXAuc2xpY2UoMCwgLWNvbnZlcnRCYWNrLmxlbmd0aCAtIDIpICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdH1cblx0XHRtYXJrdXAgPSBkZWxpbU9wZW5DaGFyMCArIG1hcmt1cCArIGRlbGltQ2xvc2VDaGFyMTtcblx0fVxuXG5cdGJsb2NrVGFnQ2hlY2soc3RhY2tbMF0gJiYgc3RhY2tbMF1bMl0ucG9wKClbMF0pO1xuXHQvLyBCdWlsZCB0aGUgQVNUIChhYnN0cmFjdCBzeW50YXggdHJlZSkgdW5kZXIgYXN0VG9wXG5cdG1hcmt1cC5yZXBsYWNlKHJUYWcsIHBhcnNlVGFnKTtcblxuXHRwdXNocHJlY2VkaW5nQ29udGVudChtYXJrdXAubGVuZ3RoKTtcblxuXHRpZiAobG9jID0gYXN0VG9wW2FzdFRvcC5sZW5ndGggLSAxXSkge1xuXHRcdGJsb2NrVGFnQ2hlY2soXCJcIiArIGxvYyAhPT0gbG9jICYmICgrbG9jWzhdID09PSBsb2NbOF0pICYmIGxvY1swXSk7XG5cdH1cbi8vXHRcdFx0cmVzdWx0ID0gdG1wbEZuc0NhY2hlW21hcmt1cF0gPSBidWlsZENvZGUoYXN0VG9wLCB0bXBsKTtcbi8vXHRcdH1cblxuXHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdHJlc3VsdCA9IGJ1aWxkQ29kZShhc3RUb3AsIG1hcmt1cCwgaXNMaW5rRXhwcik7XG5cdFx0YmluZGluZ3MgPSBbXTtcblx0XHRpID0gYXN0VG9wLmxlbmd0aDtcblx0XHR3aGlsZSAoaS0tKSB7XG5cdFx0XHRiaW5kaW5ncy51bnNoaWZ0KGFzdFRvcFtpXVs3XSk7ICAvLyBXaXRoIGRhdGEtbGluayBleHByZXNzaW9ucywgcGF0aEJpbmRpbmdzIGFycmF5IGZvciB0YWdDdHhbaV0gaXMgYXN0VG9wW2ldWzddXG5cdFx0fVxuXHRcdHNldFBhdGhzKHJlc3VsdCwgYmluZGluZ3MpO1xuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9IGJ1aWxkQ29kZShhc3RUb3AsIHRtcGwpO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNldFBhdGhzKGZuLCBwYXRoc0Fycikge1xuXHR2YXIga2V5LCBwYXRocyxcblx0XHRpID0gMCxcblx0XHRsID0gcGF0aHNBcnIubGVuZ3RoO1xuXHRmbi5kZXBzID0gW107XG5cdGZuLnBhdGhzID0gW107IC8vIFRoZSBhcnJheSBvZiBwYXRoIGJpbmRpbmcgKGFycmF5L2RpY3Rpb25hcnkpcyBmb3IgZWFjaCB0YWcvZWxzZSBibG9jaydzIGFyZ3MgYW5kIHByb3BzXG5cdGZvciAoOyBpIDwgbDsgaSsrKSB7XG5cdFx0Zm4ucGF0aHMucHVzaChwYXRocyA9IHBhdGhzQXJyW2ldKTtcblx0XHRmb3IgKGtleSBpbiBwYXRocykge1xuXHRcdFx0aWYgKGtleSAhPT0gXCJfanN2dG9cIiAmJiBwYXRocy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHBhdGhzW2tleV0ubGVuZ3RoICYmICFwYXRoc1trZXldLnNrcCkge1xuXHRcdFx0XHRmbi5kZXBzID0gZm4uZGVwcy5jb25jYXQocGF0aHNba2V5XSk7IC8vIGRlcHMgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHBhdGhzIGFycmF5cyBmb3IgdGhlIGRpZmZlcmVudCBiaW5kaW5nc1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwYXJzZWRQYXJhbShhcmdzLCBwcm9wcywgY3R4KSB7XG5cdHJldHVybiBbYXJncy5zbGljZSgwLCAtMSksIHByb3BzLnNsaWNlKDAsIC0xKSwgY3R4LnNsaWNlKDAsIC0xKV07XG59XG5cbmZ1bmN0aW9uIHBhcmFtU3RydWN0dXJlKHBhcnRzLCB0eXBlKSB7XG5cdHJldHVybiAnXFxuXFx0J1xuXHRcdCsgKHR5cGVcblx0XHRcdD8gdHlwZSArICc6eydcblx0XHRcdDogJycpXG5cdFx0KyAnYXJnczpbJyArIHBhcnRzWzBdICsgJ10nXG5cdFx0KyAocGFydHNbMV0gfHwgIXR5cGVcblx0XHRcdD8gJyxcXG5cXHRwcm9wczp7JyArIHBhcnRzWzFdICsgJ30nXG5cdFx0XHQ6IFwiXCIpXG5cdFx0KyAocGFydHNbMl0gPyAnLFxcblxcdGN0eDp7JyArIHBhcnRzWzJdICsgJ30nIDogXCJcIik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zKHBhcmFtcywgcGF0aEJpbmRpbmdzLCB0bXBsKSB7XG5cblx0ZnVuY3Rpb24gcGFyc2VUb2tlbnMoYWxsLCBsZnRQcm4wLCBsZnRQcm4sIGJvdW5kLCBwYXRoLCBvcGVyYXRvciwgZXJyLCBlcSwgcGF0aDIsIHBybiwgY29tbWEsIGxmdFBybjIsIGFwb3MsIHF1b3QsIHJ0UHJuLCBydFBybkRvdCwgcHJuMiwgc3BhY2UsIGluZGV4LCBmdWxsKSB7XG5cdC8vIC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICBsZnRQcm4wICAgICAgICBsZnRQcm4gICAgICAgIGJvdW5kICAgICAgICAgICAgcGF0aCAgICBvcGVyYXRvciBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcSAgICAgICAgICAgICBwYXRoMiAgICAgICBwcm4gICAgY29tbWEgICBsZnRQcm4yICAgYXBvcyBxdW90ICAgICAgcnRQcm4gcnRQcm5Eb3QgICAgICAgICAgICAgICAgICAgICAgICBwcm4yICBzcGFjZVxuXHRcdC8vIChsZWZ0IHBhcmVuPyBmb2xsb3dlZCBieSAocGF0aD8gZm9sbG93ZWQgYnkgb3BlcmF0b3IpIG9yIChwYXRoIGZvbGxvd2VkIGJ5IHBhcmVuPykpIG9yIGNvbW1hIG9yIGFwb3Mgb3IgcXVvdCBvciByaWdodCBwYXJlbiBvciBzcGFjZVxuXHRcdGZ1bmN0aW9uIHBhcnNlUGF0aChhbGxQYXRoLCBub3QsIG9iamVjdCwgaGVscGVyLCB2aWV3LCB2aWV3UHJvcGVydHksIHBhdGhUb2tlbnMsIGxlYWZUb2tlbikge1xuXHRcdFx0Ly9yUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHRcdFx0Ly8gICAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cdFx0XHR2YXIgc3ViUGF0aCA9IG9iamVjdCA9PT0gXCIuXCI7XG5cdFx0XHRpZiAob2JqZWN0KSB7XG5cdFx0XHRcdHBhdGggPSBwYXRoLnNsaWNlKG5vdC5sZW5ndGgpO1xuXHRcdFx0XHRpZiAoL15cXC4/Y29uc3RydWN0b3IkLy50ZXN0KGxlYWZUb2tlbnx8cGF0aCkpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihhbGxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXN1YlBhdGgpIHtcblx0XHRcdFx0XHRhbGxQYXRoID0gKGhlbHBlclxuXHRcdFx0XHRcdFx0XHQ/ICd2aWV3LmhscChcIicgKyBoZWxwZXIgKyAnXCIpJ1xuXHRcdFx0XHRcdFx0XHQ6IHZpZXdcblx0XHRcdFx0XHRcdFx0XHQ/IFwidmlld1wiXG5cdFx0XHRcdFx0XHRcdFx0OiBcImRhdGFcIilcblx0XHRcdFx0XHRcdCsgKGxlYWZUb2tlblxuXHRcdFx0XHRcdFx0XHQ/ICh2aWV3UHJvcGVydHlcblx0XHRcdFx0XHRcdFx0XHQ/IFwiLlwiICsgdmlld1Byb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0OiBoZWxwZXJcblx0XHRcdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0OiAodmlldyA/IFwiXCIgOiBcIi5cIiArIG9iamVjdClcblx0XHRcdFx0XHRcdFx0XHQpICsgKHBhdGhUb2tlbnMgfHwgXCJcIilcblx0XHRcdFx0XHRcdFx0OiAobGVhZlRva2VuID0gaGVscGVyID8gXCJcIiA6IHZpZXcgPyB2aWV3UHJvcGVydHkgfHwgXCJcIiA6IG9iamVjdCwgXCJcIikpO1xuXG5cdFx0XHRcdFx0YWxsUGF0aCA9IGFsbFBhdGggKyAobGVhZlRva2VuID8gXCIuXCIgKyBsZWFmVG9rZW4gOiBcIlwiKTtcblxuXHRcdFx0XHRcdGFsbFBhdGggPSBub3QgKyAoYWxsUGF0aC5zbGljZSgwLCA5KSA9PT0gXCJ2aWV3LmRhdGFcIlxuXHRcdFx0XHRcdFx0PyBhbGxQYXRoLnNsaWNlKDUpIC8vIGNvbnZlcnQgI3ZpZXcuZGF0YS4uLiB0byBkYXRhLi4uXG5cdFx0XHRcdFx0XHQ6IGFsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChiaW5kaW5ncykge1xuXHRcdFx0XHRcdGJpbmRzID0gbmFtZWQgPT09IFwibGlua1RvXCIgPyAoYmluZHRvID0gcGF0aEJpbmRpbmdzLl9qc3Z0byA9IHBhdGhCaW5kaW5ncy5fanN2dG8gfHwgW10pIDogYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdGlmICh0aGVPYiA9IHN1YlBhdGggJiYgYmluZHNbYmluZHMubGVuZ3RoLTFdKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhlT2IuX2pzdikge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAodGhlT2Iuc2IpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGVPYiA9IHRoZU9iLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0aGVPYi5ibmQpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoID0gXCJeXCIgKyBwYXRoLnNsaWNlKDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoZU9iLnNiID0gcGF0aDtcblx0XHRcdFx0XHRcdFx0dGhlT2IuYm5kID0gdGhlT2IuYm5kIHx8IHBhdGguY2hhckF0KDApID09PSBcIl5cIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YmluZHMucHVzaChwYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGF0aFN0YXJ0W3BhcmVuRGVwdGhdID0gaW5kZXggKyAoc3ViUGF0aCA/IDEgOiAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFsbFBhdGg7XG5cdFx0fVxuXG5cdFx0Ly9ib3VuZCA9IGJpbmRpbmdzICYmIGJvdW5kO1xuXHRcdGlmIChib3VuZCAmJiAhZXEpIHtcblx0XHRcdHBhdGggPSBib3VuZCArIHBhdGg7IC8vIGUuZy4gc29tZS5mbiguLi4pXnNvbWUucGF0aCAtIHNvIGhlcmUgcGF0aCBpcyBcIl5zb21lLnBhdGhcIlxuXHRcdH1cblx0XHRvcGVyYXRvciA9IG9wZXJhdG9yIHx8IFwiXCI7XG5cdFx0bGZ0UHJuID0gbGZ0UHJuIHx8IGxmdFBybjAgfHwgbGZ0UHJuMjtcblx0XHRwYXRoID0gcGF0aCB8fCBwYXRoMjtcblx0XHQvLyBDb3VsZCBkbyB0aGlzIC0gYnV0IG5vdCB3b3J0aCBwZXJmIGNvc3Q/PyA6LVxuXHRcdC8vIGlmICghcGF0aC5sYXN0SW5kZXhPZihcIiNkYXRhLlwiLCAwKSkgeyBwYXRoID0gcGF0aC5zbGljZSg2KTsgfSAvLyBJZiBwYXRoIHN0YXJ0cyB3aXRoIFwiI2RhdGEuXCIsIHJlbW92ZSB0aGF0LlxuXHRcdHBybiA9IHBybiB8fCBwcm4yIHx8IFwiXCI7XG5cblx0XHR2YXIgZXhwciwgZXhwckZuLCBiaW5kcywgdGhlT2IsIG5ld09iLFxuXHRcdFx0cnRTcSA9IFwiKVwiO1xuXG5cdFx0aWYgKHBybiA9PT0gXCJbXCIpIHtcblx0XHRcdHBybiAgPVwiW2ouX3NxKFwiO1xuXHRcdFx0cnRTcSA9IFwiKV1cIjtcblx0XHR9XG5cblx0XHRpZiAoZXJyICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0c3ludGF4RXJyb3IocGFyYW1zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGJpbmRpbmdzICYmIHJ0UHJuRG90ICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgYmluZGluZyB0byBhIHBhdGggaW4gd2hpY2ggYW4gb2JqZWN0IGlzIHJldHVybmVkIGJ5IGEgaGVscGVyL2RhdGEgZnVuY3Rpb24vZXhwcmVzc2lvbiwgZS5nLiBmb28oKV54Lnkgb3IgKGE/YjpjKV54Lnlcblx0XHRcdFx0Ly8gV2UgY3JlYXRlIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gZ2V0IHRoZSBvYmplY3QgaW5zdGFuY2UgKHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGRlcGVuZGVudCBkYXRhIG9mIHRoZSBzdWJleHByZXNzaW9uIGNoYW5nZXMsIHRvIHJldHVybiB0aGUgbmV3IG9iamVjdCwgYW5kIHRyaWdnZXIgcmUtYmluZGluZyBvZiB0aGUgc3Vic2VxdWVudCBwYXRoKVxuXHRcdFx0XHRpZiAoIW5hbWVkIHx8IGJvdW5kTmFtZSB8fCBiaW5kdG8pIHtcblx0XHRcdFx0XHRleHByID0gcGF0aFN0YXJ0W3BhcmVuRGVwdGggLSAxXTtcblx0XHRcdFx0XHRpZiAoZnVsbC5sZW5ndGggLSAxID4gaW5kZXggLSAoZXhwciB8fCAwKSkgeyAvLyBXZSBuZWVkIHRvIGNvbXBpbGUgYSBzdWJleHByZXNzaW9uXG5cdFx0XHRcdFx0XHRleHByID0gZnVsbC5zbGljZShleHByLCBpbmRleCArIGFsbC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0aWYgKGV4cHJGbiAhPT0gdHJ1ZSkgeyAvLyBJZiBub3QgcmVlbnRyYW50IGNhbGwgZHVyaW5nIGNvbXBpbGF0aW9uXG5cdFx0XHRcdFx0XHRcdGJpbmRzID0gYmluZHRvIHx8IGJuZFN0YWNrW3BhcmVuRGVwdGgtMV0uYmQ7XG5cdFx0XHRcdFx0XHRcdC8vIEluc2VydCBleHByT2Igb2JqZWN0LCB0byBiZSB1c2VkIGR1cmluZyBiaW5kaW5nIHRvIHJldHVybiB0aGUgY29tcHV0ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdHRoZU9iID0gYmluZHNbYmluZHMubGVuZ3RoLTFdO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhlT2IgJiYgdGhlT2IucHJtKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKHRoZU9iLnNiICYmIHRoZU9iLnNiLnBybSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhlT2IgPSB0aGVPYi5zYjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bmV3T2IgPSB0aGVPYi5zYiA9IHtwYXRoOiB0aGVPYi5zYiwgYm5kOiB0aGVPYi5ibmR9O1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGJpbmRzLnB1c2gobmV3T2IgPSB7cGF0aDogYmluZHMucG9wKCl9KTsgLy8gSW5zZXJ0IGV4cHJPYiBvYmplY3QsIHRvIGJlIHVzZWQgZHVyaW5nIGJpbmRpbmcgdG8gcmV0dXJuIHRoZSBjb21wdXRlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgLy8gKGUuZy4gXCJzb21lLm9iamVjdCgpXCIgaW4gXCJzb21lLm9iamVjdCgpLmEuYlwiIC0gdG8gYmUgdXNlZCBhcyBjb250ZXh0IGZvciBiaW5kaW5nIHRoZSBmb2xsb3dpbmcgdG9rZW5zIFwiYS5iXCIpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRydFBybkRvdCA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBleHByIC8vIFRoZSBwYXJhbWV0ZXIgb3IgZnVuY3Rpb24gc3ViZXhwcmVzc2lvblxuXHRcdFx0XHRcdFx0XHQrIFwiIG9uZXJyb3I9JydcIiAvLyBzZXQgb25lcnJvcj0nJyBpbiBvcmRlciB0byB3cmFwIGdlbmVyYXRlZCBjb2RlIHdpdGggYSB0cnkgY2F0Y2ggLSByZXR1cm5pbmcgJycgYXMgb2JqZWN0IGluc3RhbmNlIGlmIHRoZXJlIGlzIGFuIGVycm9yL21pc3NpbmcgcGFyZW50XG5cdFx0XHRcdFx0XHRcdCsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0XHRcdFx0ZXhwckZuID0gdG1wbExpbmtzW3J0UHJuRG90XTtcblx0XHRcdFx0XHRcdGlmICghZXhwckZuKSB7XG5cdFx0XHRcdFx0XHRcdHRtcGxMaW5rc1tydFBybkRvdF0gPSB0cnVlOyAvLyBGbGFnIHRoYXQgdGhpcyBleHByRm4gKGZvciBydFBybkRvdCkgaXMgYmVpbmcgY29tcGlsZWRcblx0XHRcdFx0XHRcdFx0dG1wbExpbmtzW3J0UHJuRG90XSA9IGV4cHJGbiA9IHRtcGxGbihydFBybkRvdCwgdG1wbCwgdHJ1ZSk7IC8vIENvbXBpbGUgdGhlIGV4cHJlc3Npb24gKG9yIHVzZSBjYWNoZWQgY29weSBhbHJlYWR5IGluIHRtcGwubGlua3MpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoZXhwckZuICE9PSB0cnVlICYmIG5ld09iKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIG5vdCByZWVudHJhbnQgY2FsbCBkdXJpbmcgY29tcGlsYXRpb25cblx0XHRcdFx0XHRcdFx0bmV3T2IuX2pzdiA9IGV4cHJGbjtcblx0XHRcdFx0XHRcdFx0bmV3T2IucHJtID0gYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdFx0XHRuZXdPYi5ibmQgPSBuZXdPYi5ibmQgfHwgbmV3T2IucGF0aCAmJiBuZXdPYi5wYXRoLmluZGV4T2YoXCJeXCIpID49IDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKGFwb3NlZFxuXHRcdFx0XHQvLyB3aXRoaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmdcblx0XHRcdFx0PyAoYXBvc2VkID0gIWFwb3MsIChhcG9zZWQgPyBhbGwgOiBsZnRQcm4yICsgJ1wiJykpXG5cdFx0XHRcdDogcXVvdGVkXG5cdFx0XHRcdC8vIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ1xuXHRcdFx0XHRcdD8gKHF1b3RlZCA9ICFxdW90LCAocXVvdGVkID8gYWxsIDogbGZ0UHJuMiArICdcIicpKVxuXHRcdFx0XHRcdDpcblx0XHRcdFx0KFxuXHRcdFx0XHRcdChsZnRQcm5cblx0XHRcdFx0XHRcdD8gKHBhdGhTdGFydFtwYXJlbkRlcHRoXSA9IGluZGV4KyssIGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0gPSB7YmQ6IFtdfSwgbGZ0UHJuKVxuXHRcdFx0XHRcdFx0OiBcIlwiKVxuXHRcdFx0XHRcdCsgKHNwYWNlXG5cdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoXG5cdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHQvLyBOZXcgYXJnIG9yIHByb3AgLSBzbyBpbnNlcnQgYmFja3NwYWNlIFxcYiAoXFx4MDgpIGFzIHNlcGFyYXRvciBmb3IgbmFtZWQgcGFyYW1zLCB1c2VkIHN1YnNlcXVlbnRseSBieSByQnVpbGRIYXNoLCBhbmQgcHJlcGFyZSBuZXcgYmluZGluZ3MgYXJyYXlcblx0XHRcdFx0XHRcdFx0OiAocGFyYW1JbmRleCA9IGZ1bGwuc2xpY2UocGFyYW1JbmRleCwgaW5kZXgpLCBuYW1lZFxuXHRcdFx0XHRcdFx0XHRcdD8gKG5hbWVkID0gYm91bmROYW1lID0gYmluZHRvID0gZmFsc2UsIFwiXFxiXCIpXG5cdFx0XHRcdFx0XHRcdFx0OiBcIlxcYixcIikgKyBwYXJhbUluZGV4ICsgKHBhcmFtSW5kZXggPSBpbmRleCArIGFsbC5sZW5ndGgsIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wdXNoKGJuZEN0eC5iZCA9IFtdKSwgXCJcXGJcIilcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogZXFcblx0XHRcdFx0Ly8gbmFtZWQgcGFyYW0uIFJlbW92ZSBiaW5kaW5ncyBmb3IgYXJnIGFuZCBjcmVhdGUgaW5zdGVhZCBiaW5kaW5ncyBhcnJheSBmb3IgcHJvcFxuXHRcdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoICYmIHN5bnRheEVycm9yKHBhcmFtcyksIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wb3AoKSwgbmFtZWQgPSBwYXRoLCBib3VuZE5hbWUgPSBib3VuZCwgcGFyYW1JbmRleCA9IGluZGV4ICsgYWxsLmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdGJpbmRpbmdzICYmICgoYmluZGluZ3MgPSBibmRDdHguYmQgPSBwYXRoQmluZGluZ3NbbmFtZWRdID0gW10pLCBiaW5kaW5ncy5za3AgPSAhYm91bmQpLCBwYXRoICsgJzonKVxuXHRcdFx0XHRcdFx0XHQ6IHBhdGhcblx0XHRcdFx0Ly8gcGF0aFxuXHRcdFx0XHRcdFx0XHRcdD8gKHBhdGguc3BsaXQoXCJeXCIpLmpvaW4oXCIuXCIpLnJlcGxhY2UoclBhdGgsIHBhcnNlUGF0aClcblx0XHRcdFx0XHRcdFx0XHRcdCsgKHByblxuXHRcdFx0XHQvLyBzb21lLmZuY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSA9IHtiZDogW119LCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBydFNxLCBwcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3IpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3Jcblx0XHRcdFx0Ly8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdD8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdDogcnRQcm5cblx0XHRcdFx0Ly8gZnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoKHJ0UHJuID0gZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHJ0UHJuLCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBmYWxzZSwgYm5kQ3R4ID0gYm5kU3RhY2tbLS1wYXJlbkRlcHRoXSwgcnRQcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAocHJuIC8vIHJ0UHJuIGFuZCBwcm4sIGUuZyApKCBpbiAoYSkoKSBvciBhKCkoKSwgb3IgKVsgaW4gYSgpW11cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0sIGZuQ2FsbFtwYXJlbkRlcHRoXSA9IHJ0U3EsIHBybilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGNvbW1hXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHN5bnRheEVycm9yKHBhcmFtcyksIFwiLFwiKSAvLyBXZSBkb24ndCBhbGxvdyB0b3AtbGV2ZWwgbGl0ZXJhbCBhcnJheXMgb3Igb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogbGZ0UHJuMFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IChhcG9zZWQgPSBhcG9zLCBxdW90ZWQgPSBxdW90LCAnXCInKVxuXHRcdFx0XHQpKVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgbmFtZWQsIGJpbmR0bywgYm91bmROYW1lLFxuXHRcdHF1b3RlZCwgLy8gYm9vbGVhbiBmb3Igc3RyaW5nIGNvbnRlbnQgaW4gZG91YmxlIHF1b3Rlc1xuXHRcdGFwb3NlZCwgLy8gb3IgaW4gc2luZ2xlIHF1b3Rlc1xuXHRcdGJpbmRpbmdzID0gcGF0aEJpbmRpbmdzICYmIHBhdGhCaW5kaW5nc1swXSwgLy8gYmluZGluZ3MgYXJyYXkgZm9yIHRoZSBmaXJzdCBhcmdcblx0XHRibmRDdHggPSB7YmQ6IGJpbmRpbmdzfSxcblx0XHRibmRTdGFjayA9IHswOiBibmRDdHh9LFxuXHRcdHBhcmFtSW5kZXggPSAwLCAvLyBsaXN0LFxuXHRcdHRtcGxMaW5rcyA9ICh0bXBsID8gdG1wbC5saW5rcyA6IGJpbmRpbmdzICYmIChiaW5kaW5ncy5saW5rcyA9IGJpbmRpbmdzLmxpbmtzIHx8IHt9KSkgfHwgdG9wVmlldy50bXBsLmxpbmtzLFxuXHRcdC8vIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIHRyYWNraW5nIHBhdGggcGFyc2luZyBpbmNsdWRpbmcgbmVzdGVkIHBhdGhzLCBzdWNoIGFzIFwiYS5iKGNeZCArIChlKSleZlwiLCBhbmQgY2hhaW5lZCBjb21wdXRlZCBwYXRocyBzdWNoIGFzXG5cdFx0Ly8gXCJhLmIoKS5jXmQoKS5lLmYoKS5nXCIgLSB3aGljaCBoYXMgZm91ciBjaGFpbmVkIHBhdGhzLCBcImEuYigpXCIsIFwiXmMuZCgpXCIsIFwiLmUuZigpXCIgYW5kIFwiLmdcIlxuXHRcdHBhcmVuRGVwdGggPSAwLFxuXHRcdGZuQ2FsbCA9IHt9LCAvLyBXZSBhcmUgaW4gYSBmdW5jdGlvbiBjYWxsXG5cdFx0cGF0aFN0YXJ0ID0ge30sIC8vIHRyYWNrcyB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGF0aCBzdWNoIGFzIGNeZCgpIGluIHRoZSBhYm92ZSBleGFtcGxlXG5cdFx0cmVzdWx0ID0gKHBhcmFtcyArICh0bXBsID8gXCIgXCIgOiBcIlwiKSkucmVwbGFjZShyUGFyYW1zLCBwYXJzZVRva2Vucyk7XG5cblx0cmV0dXJuICFwYXJlbkRlcHRoICYmIHJlc3VsdCB8fCBzeW50YXhFcnJvcihwYXJhbXMpOyAvLyBTeW50YXggZXJyb3IgaWYgdW5iYWxhbmNlZCBwYXJlbnMgaW4gcGFyYW1zIGV4cHJlc3Npb25cbn1cblxuZnVuY3Rpb24gYnVpbGRDb2RlKGFzdCwgdG1wbCwgaXNMaW5rRXhwcikge1xuXHQvLyBCdWlsZCB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBBU1Qgbm9kZXMsIGFuZCBzZXQgYXMgcHJvcGVydHkgb24gdGhlIHBhc3NlZC1pbiB0ZW1wbGF0ZSBvYmplY3Rcblx0Ly8gVXNlZCBmb3IgY29tcGlsaW5nIHRlbXBsYXRlcywgYW5kIGFsc28gYnkgSnNWaWV3cyB0byBidWlsZCBmdW5jdGlvbnMgZm9yIGRhdGEgbGluayBleHByZXNzaW9uc1xuXHR2YXIgaSwgbm9kZSwgdGFnTmFtZSwgY29udmVydGVyLCB0YWdDdHgsIGhhc1RhZywgaGFzRW5jb2RlciwgZ2V0c1ZhbCwgaGFzQ252dCwgdXNlQ252dCwgdG1wbEJpbmRpbmdzLCBwYXRoQmluZGluZ3MsIHBhcmFtcywgYm91bmRPbkVyclN0YXJ0LCBib3VuZE9uRXJyRW5kLFxuXHRcdHRhZ1JlbmRlciwgbmVzdGVkVG1wbHMsIHRtcGxOYW1lLCBuZXN0ZWRUbXBsLCB0YWdBbmRFbHNlcywgY29udGVudCwgbWFya3VwLCBuZXh0SXNFbHNlLCBvbGRDb2RlLCBpc0Vsc2UsIGlzR2V0VmFsLCB0YWdDdHhGbiwgb25FcnJvciwgdGFnU3RhcnQsIHRyaWdnZXIsXG5cdFx0dG1wbEJpbmRpbmdLZXkgPSAwLFxuXHRcdHVzZVZpZXdzID0gJHN1YlNldHRpbmdzQWR2YW5jZWQudXNlVmlld3MgfHwgdG1wbC51c2VWaWV3cyB8fCB0bXBsLnRhZ3MgfHwgdG1wbC50ZW1wbGF0ZXMgfHwgdG1wbC5oZWxwZXJzIHx8IHRtcGwuY29udmVydGVycyxcblx0XHRjb2RlID0gXCJcIixcblx0XHR0bXBsT3B0aW9ucyA9IHt9LFxuXHRcdGwgPSBhc3QubGVuZ3RoO1xuXG5cdGlmIChcIlwiICsgdG1wbCA9PT0gdG1wbCkge1xuXHRcdHRtcGxOYW1lID0gaXNMaW5rRXhwciA/ICdkYXRhLWxpbms9XCInICsgdG1wbC5yZXBsYWNlKHJOZXdMaW5lLCBcIiBcIikuc2xpY2UoMSwgLTEpICsgJ1wiJyA6IHRtcGw7XG5cdFx0dG1wbCA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0dG1wbE5hbWUgPSB0bXBsLnRtcGxOYW1lIHx8IFwidW5uYW1lZFwiO1xuXHRcdGlmICh0bXBsLmFsbG93Q29kZSkge1xuXHRcdFx0dG1wbE9wdGlvbnMuYWxsb3dDb2RlID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHRtcGwuZGVidWcpIHtcblx0XHRcdHRtcGxPcHRpb25zLmRlYnVnID0gdHJ1ZTtcblx0XHR9XG5cdFx0dG1wbEJpbmRpbmdzID0gdG1wbC5ibmRzO1xuXHRcdG5lc3RlZFRtcGxzID0gdG1wbC50bXBscztcblx0fVxuXHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0Ly8gQVNUIG5vZGVzOiBbMDogdGFnTmFtZSwgMTogY29udmVydGVyLCAyOiBjb250ZW50LCAzOiBwYXJhbXMsIDQ6IGNvZGUsIDU6IG9uRXJyb3IsIDY6IHRyaWdnZXIsIDc6cGF0aEJpbmRpbmdzLCA4OiBjb250ZW50TWFya3VwXVxuXHRcdG5vZGUgPSBhc3RbaV07XG5cblx0XHQvLyBBZGQgbmV3bGluZSBmb3IgZWFjaCBjYWxsb3V0IHRvIHQoKSBjKCkgZXRjLiBhbmQgZWFjaCBtYXJrdXAgc3RyaW5nXG5cdFx0aWYgKFwiXCIgKyBub2RlID09PSBub2RlKSB7XG5cdFx0XHQvLyBhIG1hcmt1cCBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWRcblx0XHRcdGNvZGUgKz0gJ1xcbitcIicgKyBub2RlICsgJ1wiJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYSBjb21waWxlZCB0YWcgZXhwcmVzc2lvbiB0byBiZSBpbnNlcnRlZFxuXHRcdFx0dGFnTmFtZSA9IG5vZGVbMF07XG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCIqXCIpIHtcblx0XHRcdFx0Ly8gQ29kZSB0YWc6IHt7KiB9fVxuXHRcdFx0XHRjb2RlICs9IFwiO1xcblwiICsgbm9kZVsxXSArIFwiXFxucmV0PXJldFwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29udmVydGVyID0gbm9kZVsxXTtcblx0XHRcdFx0Y29udGVudCA9ICFpc0xpbmtFeHByICYmIG5vZGVbMl07XG5cdFx0XHRcdHRhZ0N0eCA9IHBhcmFtU3RydWN0dXJlKG5vZGVbM10sICdwYXJhbXMnKSArICd9LCcgKyBwYXJhbVN0cnVjdHVyZShwYXJhbXMgPSBub2RlWzRdKTtcblx0XHRcdFx0b25FcnJvciA9IG5vZGVbNV07XG5cdFx0XHRcdHRyaWdnZXIgPSBub2RlWzZdO1xuXHRcdFx0XHRtYXJrdXAgPSBub2RlWzhdICYmIG5vZGVbOF0ucmVwbGFjZShyVW5lc2NhcGVRdW90ZXMsIFwiJDFcIik7XG5cdFx0XHRcdGlmIChpc0Vsc2UgPSB0YWdOYW1lID09PSBcImVsc2VcIikge1xuXHRcdFx0XHRcdGlmIChwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdHBhdGhCaW5kaW5ncy5wdXNoKG5vZGVbN10pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0bXBsQmluZGluZ0tleSA9IDA7XG5cdFx0XHRcdFx0aWYgKHRtcGxCaW5kaW5ncyAmJiAocGF0aEJpbmRpbmdzID0gbm9kZVs3XSkpIHsgLy8gQXJyYXkgb2YgcGF0aHMsIG9yIGZhbHNlIGlmIG5vdCBkYXRhLWJvdW5kXG5cdFx0XHRcdFx0XHRwYXRoQmluZGluZ3MgPSBbcGF0aEJpbmRpbmdzXTtcblx0XHRcdFx0XHRcdHRtcGxCaW5kaW5nS2V5ID0gdG1wbEJpbmRpbmdzLnB1c2goMSk7IC8vIEFkZCBwbGFjZWhvbGRlciBpbiB0bXBsQmluZGluZ3MgZm9yIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHVzZVZpZXdzID0gdXNlVmlld3MgfHwgcGFyYW1zWzFdIHx8IHBhcmFtc1syXSB8fCBwYXRoQmluZGluZ3MgfHwgL3ZpZXcuKD8haW5kZXgpLy50ZXN0KHBhcmFtc1swXSk7XG5cdFx0XHRcdC8vIHVzZVZpZXdzIGlzIGZvciBwZXJmIG9wdGltaXphdGlvbi4gRm9yIHJlbmRlcigpIHdlIG9ubHkgdXNlIHZpZXdzIGlmIG5lY2Vzc2FyeSAtIGZvciB0aGUgbW9yZSBhZHZhbmNlZCBzY2VuYXJpb3MuXG5cdFx0XHRcdC8vIFdlIHVzZSB2aWV3cyBpZiB0aGVyZSBhcmUgcHJvcHMsIGNvbnRleHR1YWwgcHJvcGVydGllcyBvciBhcmdzIHdpdGggIy4uLiAob3RoZXIgdGhhbiAjaW5kZXgpIC0gYnV0IHlvdSBjYW4gZm9yY2Vcblx0XHRcdFx0Ly8gdXNpbmcgdGhlIGZ1bGwgdmlldyBpbmZyYXN0cnVjdHVyZSwgKGFuZCBwYXkgYSBwZXJmIHByaWNlKSBieSBvcHRpbmcgaW46IFNldCB1c2VWaWV3czogdHJ1ZSBvbiB0aGUgdGVtcGxhdGUsIG1hbnVhbGx5Li4uXG5cdFx0XHRcdGlmIChpc0dldFZhbCA9IHRhZ05hbWUgPT09IFwiOlwiKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnZlcnRlcikge1xuXHRcdFx0XHRcdFx0dGFnTmFtZSA9IGNvbnZlcnRlciA9PT0gSFRNTCA/IFwiPlwiIDogY29udmVydGVyICsgdGFnTmFtZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRlbnQpIHsgLy8gVE9ETyBvcHRpbWl6ZSAtIGlmIGNvbnRlbnQubGVuZ3RoID09PSAwIG9yIGlmIHRoZXJlIGlzIGEgdG1wbD1cIi4uLlwiIHNwZWNpZmllZCAtIHNldCBjb250ZW50IHRvIG51bGwgLyBkb24ndCBydW4gdGhpcyBjb21waWxhdGlvbiBjb2RlIC0gc2luY2UgY29udGVudCB3b24ndCBnZXQgdXNlZCEhXG5cdFx0XHRcdFx0XHQvLyBDcmVhdGUgdGVtcGxhdGUgb2JqZWN0IGZvciBuZXN0ZWQgdGVtcGxhdGVcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwgPSB0bXBsT2JqZWN0KG1hcmt1cCwgdG1wbE9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbC50bXBsTmFtZSA9IHRtcGxOYW1lICsgXCIvXCIgKyB0YWdOYW1lO1xuXHRcdFx0XHRcdFx0Ly8gQ29tcGlsZSB0byBBU1QgYW5kIHRoZW4gdG8gY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwudXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzIHx8IHVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0YnVpbGRDb2RlKGNvbnRlbnQsIG5lc3RlZFRtcGwpO1xuXHRcdFx0XHRcdFx0dXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbHMucHVzaChuZXN0ZWRUbXBsKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIWlzRWxzZSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBub3QgYW4gZWxzZSB0YWcuXG5cdFx0XHRcdFx0XHR0YWdBbmRFbHNlcyA9IHRhZ05hbWU7XG5cdFx0XHRcdFx0XHR1c2VWaWV3cyA9IHVzZVZpZXdzIHx8IHRhZ05hbWUgJiYgKCEkdGFnc1t0YWdOYW1lXSB8fCAhJHRhZ3NbdGFnTmFtZV0uZmxvdyk7XG5cdFx0XHRcdFx0XHQvLyBTd2l0Y2ggdG8gYSBuZXcgY29kZSBzdHJpbmcgZm9yIHRoaXMgYm91bmQgdGFnIChhbmQgaXRzIGVsc2VzLCBpZiBpdCBoYXMgYW55KSAtIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRcdG9sZENvZGUgPSBjb2RlO1xuXHRcdFx0XHRcdFx0Y29kZSA9IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBhc3RbaSArIDFdO1xuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBuZXh0SXNFbHNlICYmIG5leHRJc0Vsc2VbMF0gPT09IFwiZWxzZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZ1N0YXJ0ID0gb25FcnJvciA/IFwiO1xcbnRyeXtcXG5yZXQrPVwiIDogXCJcXG4rXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IFwiXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChpc0dldFZhbCAmJiAocGF0aEJpbmRpbmdzIHx8IHRyaWdnZXIgfHwgY29udmVydGVyICYmIGNvbnZlcnRlciAhPT0gSFRNTCkpIHtcblx0XHRcdFx0XHQvLyBGb3IgY29udmVydFZhbCB3ZSBuZWVkIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBuZXcgdGFnQ3R4KHMpXG5cdFx0XHRcdFx0dGFnQ3R4Rm4gPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIFwiIC8vIFwiICsgdG1wbE5hbWUgKyBcIiBcIiArIHRtcGxCaW5kaW5nS2V5ICsgXCIgXCIgKyB0YWdOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgXCJcXG5yZXR1cm4ge1wiICsgdGFnQ3R4ICsgXCJ9O1wiKTtcblx0XHRcdFx0XHR0YWdDdHhGbi5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdHRhZ0N0eEZuLl90YWcgPSB0YWdOYW1lO1xuXG5cdFx0XHRcdFx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0YWdDdHhGbjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzZXRQYXRocyh0YWdDdHhGbiwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHR0YWdSZW5kZXIgPSAnYyhcIicgKyBjb252ZXJ0ZXIgKyAnXCIsdmlldywnO1xuXHRcdFx0XHRcdHVzZUNudnQgPSB0cnVlO1xuXHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsXCI7XG5cdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGUgKz0gKGlzR2V0VmFsXG5cdFx0XHRcdFx0PyAoaXNMaW5rRXhwciA/IChvbkVycm9yID8gXCJ0cnl7XFxuXCIgOiBcIlwiKSArIFwicmV0dXJuIFwiIDogdGFnU3RhcnQpICsgKHVzZUNudnQgLy8gQ2FsbCBfY252dCBpZiB0aGVyZSBpcyBhIGNvbnZlcnRlcjoge3tjbnZ0OiAuLi4gfX0gb3Ige157Y252dDogLi4uIH19XG5cdFx0XHRcdFx0XHQ/ICh1c2VDbnZ0ID0gdW5kZWZpbmVkLCB1c2VWaWV3cyA9IGhhc0NudnQgPSB0cnVlLCB0YWdSZW5kZXIgKyAocGF0aEJpbmRpbmdzXG5cdFx0XHRcdFx0XHRcdD8gKCh0bXBsQmluZGluZ3NbdG1wbEJpbmRpbmdLZXkgLSAxXSA9IHRhZ0N0eEZuKSwgdG1wbEJpbmRpbmdLZXkpIC8vIFN0b3JlIHRoZSBjb21waWxlZCB0YWdDdHhGbiBpbiB0bXBsLmJuZHMsIGFuZCBwYXNzIHRoZSBrZXkgdG8gY29udmVydFZhbCgpXG5cdFx0XHRcdFx0XHRcdDogXCJ7XCIgKyB0YWdDdHggKyBcIn1cIikgKyBcIilcIilcblx0XHRcdFx0XHRcdDogdGFnTmFtZSA9PT0gXCI+XCJcblx0XHRcdFx0XHRcdFx0PyAoaGFzRW5jb2RlciA9IHRydWUsIFwiaChcIiArIHBhcmFtc1swXSArIFwiKVwiKVxuXHRcdFx0XHRcdFx0XHQ6IChnZXRzVmFsID0gdHJ1ZSwgXCIoKHY9XCIgKyBwYXJhbXNbMF0gKyAnKSE9bnVsbD92OicgKyAoaXNMaW5rRXhwciA/ICdudWxsKScgOiAnXCJcIiknKSlcblx0XHRcdFx0XHRcdFx0Ly8gTm9uIHN0cmljdCBlcXVhbGl0eSBzbyBkYXRhLWxpbms9XCJ0aXRsZXs6ZXhwcn1cIiB3aXRoIGV4cHI9bnVsbC91bmRlZmluZWQgcmVtb3ZlcyB0aXRsZSBhdHRyaWJ1dGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0OiAoaGFzVGFnID0gdHJ1ZSwgXCJcXG57dmlldzp2aWV3LHRtcGw6XCIgLy8gQWRkIHRoaXMgdGFnQ3R4IHRvIHRoZSBjb21waWxlZCBjb2RlIGZvciB0aGUgdGFnQ3R4cyB0byBiZSBwYXNzZWQgdG8gcmVuZGVyVGFnKClcblx0XHRcdFx0XHRcdCsgKGNvbnRlbnQgPyBuZXN0ZWRUbXBscy5sZW5ndGggOiBcIjBcIikgKyBcIixcIiAvLyBGb3IgYmxvY2sgdGFncywgcGFzcyBpbiB0aGUga2V5IChuZXN0ZWRUbXBscy5sZW5ndGgpIHRvIHRoZSBuZXN0ZWQgY29udGVudCB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0KyB0YWdDdHggKyBcIn0sXCIpKTtcblxuXHRcdFx0XHRpZiAodGFnQW5kRWxzZXMgJiYgIW5leHRJc0Vsc2UpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgYW4gaW5saW5lIHRhZyB3aXRob3V0IGFueSBlbHNlcywgb3IgdGhlIGxhc3Qge3tlbHNlfX0gb2YgYW4gaW5saW5lIHRhZ1xuXHRcdFx0XHRcdC8vIFdlIGNvbXBsZXRlIHRoZSBjb2RlIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRjb2RlID0gXCJbXCIgKyBjb2RlLnNsaWNlKDAsIC0xKSArIFwiXVwiO1xuXHRcdFx0XHRcdHRhZ1JlbmRlciA9ICd0KFwiJyArIHRhZ0FuZEVsc2VzICsgJ1wiLHZpZXcsdGhpcywnO1xuXHRcdFx0XHRcdGlmIChpc0xpbmtFeHByIHx8IHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGJvdW5kIHRhZyAoZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgaW5saW5lIGJvdW5kIHRhZyB7Xnt0YWcgLi4ufX0pIHNvIHdlIHN0b3JlIGEgY29tcGlsZWQgdGFnQ3R4cyBmdW5jdGlvbiBpbiB0bXAuYm5kc1xuXHRcdFx0XHRcdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgXCIgLy8gXCIgKyB0bXBsTmFtZSArIFwiIFwiICsgdG1wbEJpbmRpbmdLZXkgKyBcIiBcIiArIHRhZ0FuZEVsc2VzICsgXCJcXG5yZXR1cm4gXCIgKyBjb2RlICsgXCI7XCIpO1xuXHRcdFx0XHRcdFx0Y29kZS5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdFx0Y29kZS5fdGFnID0gdGFnQW5kRWxzZXM7XG5cdFx0XHRcdFx0XHRpZiAocGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRcdHNldFBhdGhzKHRtcGxCaW5kaW5nc1t0bXBsQmluZGluZ0tleSAtIDFdID0gY29kZSwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb2RlOyAvLyBGb3IgYSBkYXRhLWxpbmsgZXhwcmVzc2lvbiB3ZSByZXR1cm4gdGhlIGNvbXBpbGVkIHRhZ0N0eHMgZnVuY3Rpb25cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsdW5kZWZpbmVkLFwiO1xuXHRcdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgdGhlIGxhc3Qge3tlbHNlfX0gZm9yIGFuIGlubGluZSB0YWcuXG5cdFx0XHRcdFx0Ly8gRm9yIGEgYm91bmQgdGFnLCBwYXNzIHRoZSB0YWdDdHhzIGZuIGxvb2t1cCBrZXkgdG8gcmVuZGVyVGFnLlxuXHRcdFx0XHRcdC8vIEZvciBhbiB1bmJvdW5kIHRhZywgaW5jbHVkZSB0aGUgY29kZSBkaXJlY3RseSBmb3IgZXZhbHVhdGluZyB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0Y29kZSA9IG9sZENvZGUgKyB0YWdTdGFydCArIHRhZ1JlbmRlciArICh0bXBsQmluZGluZ0tleSB8fCBjb2RlKSArIFwiKVwiO1xuXHRcdFx0XHRcdHBhdGhCaW5kaW5ncyA9IDA7XG5cdFx0XHRcdFx0dGFnQW5kRWxzZXMgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvbkVycm9yKSB7XG5cdFx0XHRcdFx0dXNlVmlld3MgPSB0cnVlO1xuXHRcdFx0XHRcdGNvZGUgKz0gJztcXG59Y2F0Y2goZSl7cmV0JyArIChpc0xpbmtFeHByID8gXCJ1cm4gXCIgOiBcIis9XCIpICsgYm91bmRPbkVyclN0YXJ0ICsgJ2ouX2VycihlLHZpZXcsJyArIG9uRXJyb3IgKyAnKScgKyBib3VuZE9uRXJyRW5kICsgJzt9JyArIChpc0xpbmtFeHByID8gXCJcIiA6ICdyZXQ9cmV0Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gSW5jbHVkZSBvbmx5IHRoZSB2YXIgcmVmZXJlbmNlcyB0aGF0IGFyZSBuZWVkZWQgaW4gdGhlIGNvZGVcblx0Y29kZSA9IFwiLy8gXCIgKyB0bXBsTmFtZVxuXG5cdFx0KyBcIlxcbnZhciB2XCJcblx0XHQrIChoYXNUYWcgPyBcIix0PWouX3RhZ1wiIDogXCJcIikgICAgICAgICAgICAgICAgLy8gaGFzIHRhZ1xuXHRcdCsgKGhhc0NudnQgPyBcIixjPWouX2NudnRcIiA6IFwiXCIpICAgICAgICAgICAgICAvLyBjb252ZXJ0ZXJcblx0XHQrIChoYXNFbmNvZGVyID8gXCIsaD1qLl9odG1sXCIgOiBcIlwiKSAgICAgICAgICAgLy8gaHRtbCBjb252ZXJ0ZXJcblx0XHQrIChpc0xpbmtFeHByID8gXCI7XFxuXCIgOiAnLHJldD1cIlwiXFxuJylcblx0XHQrICh0bXBsT3B0aW9ucy5kZWJ1ZyA/IFwiZGVidWdnZXI7XCIgOiBcIlwiKVxuXHRcdCsgY29kZVxuXHRcdCsgKGlzTGlua0V4cHIgPyBcIlxcblwiIDogXCI7XFxucmV0dXJuIHJldDtcIik7XG5cblx0aWYgKCRzdWJTZXR0aW5ncy5kZWJ1Z01vZGUgIT09IGZhbHNlKSB7XG5cdFx0Y29kZSA9IFwidHJ5IHtcXG5cIiArIGNvZGUgKyBcIlxcbn1jYXRjaChlKXtcXG5yZXR1cm4gai5fZXJyKGUsIHZpZXcpO1xcbn1cIjtcblx0fVxuXG5cdHRyeSB7XG5cdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgY29kZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRzeW50YXhFcnJvcihcIkNvbXBpbGVkIHRlbXBsYXRlIGNvZGU6XFxuXFxuXCIgKyBjb2RlICsgJ1xcbjogXCInICsgZS5tZXNzYWdlICsgJ1wiJyk7XG5cdH1cblx0aWYgKHRtcGwpIHtcblx0XHR0bXBsLmZuID0gY29kZTtcblx0XHR0bXBsLnVzZVZpZXdzID0gISF1c2VWaWV3cztcblx0fVxuXHRyZXR1cm4gY29kZTtcbn1cblxuLy89PT09PT09PT09XG4vLyBVdGlsaXRpZXNcbi8vPT09PT09PT09PVxuXG4vLyBNZXJnZSBvYmplY3RzLCBpbiBwYXJ0aWN1bGFyIGNvbnRleHRzIHdoaWNoIGluaGVyaXQgZnJvbSBwYXJlbnQgY29udGV4dHNcbmZ1bmN0aW9uIGV4dGVuZEN0eChjb250ZXh0LCBwYXJlbnRDb250ZXh0KSB7XG5cdC8vIFJldHVybiBjb3B5IG9mIHBhcmVudENvbnRleHQsIHVubGVzcyBjb250ZXh0IGlzIGRlZmluZWQgYW5kIGlzIGRpZmZlcmVudCwgaW4gd2hpY2ggY2FzZSByZXR1cm4gYSBuZXcgbWVyZ2VkIGNvbnRleHRcblx0Ly8gSWYgbmVpdGhlciBjb250ZXh0IG5vciBwYXJlbnRDb250ZXh0IGFyZSBkZWZpbmVkLCByZXR1cm4gdW5kZWZpbmVkXG5cdHJldHVybiBjb250ZXh0ICYmIGNvbnRleHQgIT09IHBhcmVudENvbnRleHRcblx0XHQ/IChwYXJlbnRDb250ZXh0XG5cdFx0XHQ/ICRleHRlbmQoJGV4dGVuZCh7fSwgcGFyZW50Q29udGV4dCksIGNvbnRleHQpXG5cdFx0XHQ6IGNvbnRleHQpXG5cdFx0OiBwYXJlbnRDb250ZXh0ICYmICRleHRlbmQoe30sIHBhcmVudENvbnRleHQpO1xufVxuXG4vLyBHZXQgY2hhcmFjdGVyIGVudGl0eSBmb3IgSFRNTCBhbmQgQXR0cmlidXRlIGVuY29kaW5nXG5mdW5jdGlvbiBnZXRDaGFyRW50aXR5KGNoKSB7XG5cdHJldHVybiBjaGFyRW50aXRpZXNbY2hdIHx8IChjaGFyRW50aXRpZXNbY2hdID0gXCImI1wiICsgY2guY2hhckNvZGVBdCgwKSArIFwiO1wiKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0UHJvcHMoc291cmNlKSB7XG5cdC8vIHRoaXMgcG9pbnRlciBpcyB0aGVNYXAgLSB3aGljaCBoYXMgdGFnQ3R4LnByb3BzIHRvb1xuXHQvLyBhcmd1bWVudHM6IHRhZ0N0eC5hcmdzLlxuXHR2YXIga2V5LCBwcm9wLFxuXHRcdHByb3BzID0gW107XG5cblx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IE9CSkVDVCkge1xuXHRcdGZvciAoa2V5IGluIHNvdXJjZSkge1xuXHRcdFx0cHJvcCA9IHNvdXJjZVtrZXldO1xuXHRcdFx0aWYgKGtleSAhPT0gJGV4cGFuZG8gJiYgc291cmNlLmhhc093blByb3BlcnR5KGtleSkgJiYgISRpc0Z1bmN0aW9uKHByb3ApKSB7XG5cdFx0XHRcdHByb3BzLnB1c2goe2tleToga2V5LCBwcm9wOiBwcm9wfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wcztcbn1cblxuZnVuY3Rpb24gJGZuUmVuZGVyKGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKSB7XG5cdHZhciB0bXBsRWxlbSA9IHRoaXMuanF1ZXJ5ICYmICh0aGlzWzBdIHx8IGVycm9yKCdVbmtub3duIHRlbXBsYXRlJykpLCAvLyBUYXJnZXRlZCBlbGVtZW50IG5vdCBmb3VuZCBmb3IgalF1ZXJ5IHRlbXBsYXRlIHNlbGVjdG9yIHN1Y2ggYXMgXCIjbXlUbXBsXCJcblx0XHR0bXBsID0gdG1wbEVsZW0uZ2V0QXR0cmlidXRlKHRtcGxBdHRyKTtcblxuXHRyZXR1cm4gcmVuZGVyQ29udGVudC5jYWxsKHRtcGwgPyAkLmRhdGEodG1wbEVsZW0pW2pzdlRtcGxdIDogJHRlbXBsYXRlcyh0bXBsRWxlbSksIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWdpc3RlciBjb252ZXJ0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGh0bWxFbmNvZGUodGV4dCkge1xuXHQvLyBIVE1MIGVuY29kZTogUmVwbGFjZSA8ID4gJiAnIGFuZCBcIiBieSBjb3JyZXNwb25kaW5nIGVudGl0aWVzLlxuXHRyZXR1cm4gdGV4dCAhPSB1bmRlZmluZWQgPyBySXNIdG1sLnRlc3QodGV4dCkgJiYgKFwiXCIgKyB0ZXh0KS5yZXBsYWNlKHJIdG1sRW5jb2RlLCBnZXRDaGFyRW50aXR5KSB8fCB0ZXh0IDogXCJcIjtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRzdWIgPSAkdmlld3Muc3ViO1xuJHZpZXdzU2V0dGluZ3MgPSAkdmlld3Muc2V0dGluZ3M7XG5cbmlmICghKGpzciB8fCAkICYmICQucmVuZGVyKSkge1xuXHQvLyBKc1JlbmRlciBub3QgYWxyZWFkeSBsb2FkZWQsIG9yIGxvYWRlZCB3aXRob3V0IGpRdWVyeSwgYW5kIHdlIGFyZSBub3cgbW92aW5nIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lcGFjZVxuXHRmb3IgKGpzdlN0b3JlTmFtZSBpbiBqc3ZTdG9yZXMpIHtcblx0XHRyZWdpc3RlclN0b3JlKGpzdlN0b3JlTmFtZSwganN2U3RvcmVzW2pzdlN0b3JlTmFtZV0pO1xuXHR9XG5cblx0JGNvbnZlcnRlcnMgPSAkdmlld3MuY29udmVydGVycztcblx0JGhlbHBlcnMgPSAkdmlld3MuaGVscGVycztcblx0JHRhZ3MgPSAkdmlld3MudGFncztcblxuXHQkc3ViLl90Zy5wcm90b3R5cGUgPSB7XG5cdFx0YmFzZUFwcGx5OiBiYXNlQXBwbHksXG5cdFx0Y3Z0QXJnczogY29udmVydEFyZ3Ncblx0fTtcblxuXHR0b3BWaWV3ID0gJHN1Yi50b3BWaWV3ID0gbmV3IFZpZXcoKTtcblxuXHQvL0JST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRpZiAoJCkge1xuXG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5ICg9ICQpIGlzIGxvYWRlZFxuXG5cdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0JGV4cGFuZG8gPSAkLmV4cGFuZG87XG5cdFx0aWYgKCQub2JzZXJ2YWJsZSkge1xuXHRcdFx0JGV4dGVuZCgkc3ViLCAkLnZpZXdzLnN1Yik7IC8vIGpxdWVyeS5vYnNlcnZhYmxlLmpzIHdhcyBsb2FkZWQgYmVmb3JlIGpzcmVuZGVyLmpzXG5cdFx0XHQkdmlld3MubWFwID0gJC52aWV3cy5tYXA7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5IGlzIG5vdCBsb2FkZWQuXG5cblx0XHQkID0ge307XG5cblx0XHRpZiAoc2V0R2xvYmFscykge1xuXHRcdFx0Z2xvYmFsLmpzcmVuZGVyID0gJDsgLy8gV2UgYXJlIGxvYWRpbmcganNyZW5kZXIuanMgZnJvbSBhIHNjcmlwdCBlbGVtZW50LCBub3QgQU1EIG9yIENvbW1vbkpTLCBzbyBzZXQgZ2xvYmFsXG5cdFx0fVxuXG5cdFx0Ly8gRXJyb3Igd2FybmluZyBpZiBqc3JlbmRlci5qcyBpcyB1c2VkIGFzIHRlbXBsYXRlIGVuZ2luZSBvbiBOb2RlLmpzIChlLmcuIEV4cHJlc3Mgb3IgSGFwaS4uLilcblx0XHQvLyBVc2UganNyZW5kZXItbm9kZS5qcyBpbnN0ZWFkLi4uXG5cdFx0JC5yZW5kZXJGaWxlID0gJC5fX2V4cHJlc3MgPSAkLmNvbXBpbGUgPSBmdW5jdGlvbigpIHsgdGhyb3cgXCJOb2RlLmpzOiB1c2UgbnBtIGpzcmVuZGVyLCBvciBqc3JlbmRlci1ub2RlLmpzXCI7IH07XG5cblx0XHQvL0VORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHQkLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihvYikge1xuXHRcdFx0cmV0dXJuIHR5cGVvZiBvYiA9PT0gXCJmdW5jdGlvblwiO1xuXHRcdH07XG5cblx0XHQkLmlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0cmV0dXJuICh7fS50b1N0cmluZykuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCI7XG5cdFx0fTtcblxuXHRcdCRzdWIuX2pxID0gZnVuY3Rpb24oanEpIHsgLy8gcHJpdmF0ZSBtZXRob2QgdG8gbW92ZSBmcm9tIEpzUmVuZGVyIEFQSXMgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVzcGFjZVxuXHRcdFx0aWYgKGpxICE9PSAkKSB7XG5cdFx0XHRcdCRleHRlbmQoanEsICQpOyAvLyBtYXAgb3ZlciBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXNwYWNlXG5cdFx0XHRcdCQgPSBqcTtcblx0XHRcdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0XHRcdGRlbGV0ZSAkLmpzcmVuZGVyO1xuXHRcdFx0XHQkZXhwYW5kbyA9ICQuZXhwYW5kbztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0JC5qc3JlbmRlciA9IHZlcnNpb25OdW1iZXI7XG5cdH1cblx0JHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcblx0JHN1YlNldHRpbmdzLmFsbG93Q29kZSA9IGZhbHNlO1xuXHQkaXNGdW5jdGlvbiA9ICQuaXNGdW5jdGlvbjtcblx0JC5yZW5kZXIgPSAkcmVuZGVyO1xuXHQkLnZpZXdzID0gJHZpZXdzO1xuXHQkLnRlbXBsYXRlcyA9ICR0ZW1wbGF0ZXMgPSAkdmlld3MudGVtcGxhdGVzO1xuXG5cdGZvciAoc2V0dGluZyBpbiAkc3ViU2V0dGluZ3MpIHtcblx0XHRhZGRTZXR0aW5nKHNldHRpbmcpO1xuXHR9XG5cblx0KCR2aWV3c1NldHRpbmdzLmRlYnVnTW9kZSA9IGZ1bmN0aW9uKGRlYnVnTW9kZSkge1xuXHRcdHJldHVybiBkZWJ1Z01vZGUgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyAkc3ViU2V0dGluZ3MuZGVidWdNb2RlXG5cdFx0XHQ6IChcblx0XHRcdFx0JHN1YlNldHRpbmdzLmRlYnVnTW9kZSA9IGRlYnVnTW9kZSxcblx0XHRcdFx0JHN1YlNldHRpbmdzLm9uRXJyb3IgPSBkZWJ1Z01vZGUgKyBcIlwiID09PSBkZWJ1Z01vZGVcblx0XHRcdFx0XHQ/IG5ldyBGdW5jdGlvbihcIlwiLCBcInJldHVybiAnXCIgKyBkZWJ1Z01vZGUgKyBcIic7XCIgKVxuXHRcdFx0XHRcdDogJGlzRnVuY3Rpb24oZGVidWdNb2RlKVxuXHRcdFx0XHRcdFx0PyBkZWJ1Z01vZGVcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0XHQkdmlld3NTZXR0aW5ncyk7XG5cdH0pKGZhbHNlKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cblx0JHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQgPSB7XG5cdFx0dXNlVmlld3M6IGZhbHNlLFxuXHRcdF9qc3Y6IGZhbHNlIC8vIEZvciBnbG9iYWwgYWNjZXNzIHRvIEpzVmlld3Mgc3RvcmVcblx0fTtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZ2lzdGVyIHRhZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQkdGFncyh7XG5cdFx0XCJpZlwiOiB7XG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHQvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciB7e2lmfX0gYW5kIG9uY2UgZm9yIGVhY2gge3tlbHNlfX0uXG5cdFx0XHRcdC8vIFdlIHdpbGwgdXNlIHRoZSB0YWcucmVuZGVyaW5nIG9iamVjdCBmb3IgY2FycnlpbmcgcmVuZGVyaW5nIHN0YXRlIGFjcm9zcyB0aGUgY2FsbHMuXG5cdFx0XHRcdC8vIElmIG5vdCBkb25lIChhIHByZXZpb3VzIGJsb2NrIGhhcyBub3QgYmVlbiByZW5kZXJlZCksIGxvb2sgYXQgZXhwcmVzc2lvbiBmb3IgdGhpcyBibG9jayBhbmQgcmVuZGVyIHRoZSBibG9jayBpZiBleHByZXNzaW9uIGlzIHRydXRoeVxuXHRcdFx0XHQvLyBPdGhlcndpc2UgcmV0dXJuIFwiXCJcblx0XHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJldCA9IChzZWxmLnJlbmRlcmluZy5kb25lIHx8ICF2YWwgJiYgKGFyZ3VtZW50cy5sZW5ndGggfHwgIXRhZ0N0eC5pbmRleCkpXG5cdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0XHRcdDogKHNlbGYucmVuZGVyaW5nLmRvbmUgPSB0cnVlLCBzZWxmLnNlbGVjdGVkID0gdGFnQ3R4LmluZGV4LFxuXHRcdFx0XHRcdFx0XHQvLyBUZXN0IGlzIHNhdGlzZmllZCwgc28gcmVuZGVyIGNvbnRlbnQgb24gY3VycmVudCBjb250ZXh0LiBXZSBjYWxsIHRhZ0N0eC5yZW5kZXIoKSByYXRoZXIgdGhhbiByZXR1cm4gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdC8vICh3aGljaCB3b3VsZCBhbHNvIHJlbmRlciB0aGUgdG1wbC9jb250ZW50IG9uIHRoZSBjdXJyZW50IGNvbnRleHQgYnV0IHdvdWxkIGl0ZXJhdGUgaWYgaXQgaXMgYW4gYXJyYXkpXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eC5yZW5kZXIodGFnQ3R4LnZpZXcsIHRydWUpKTsgLy8gbm8gYXJnLCBzbyByZW5kZXJzIGFnYWluc3QgcGFyZW50Vmlldy5kYXRhXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9LFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCJmb3JcIjoge1xuXHRcdFx0cmVuZGVyOiBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0Ly8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3Ige3tmb3J9fSBhbmQgb25jZSBmb3IgZWFjaCB7e2Vsc2V9fS5cblx0XHRcdFx0Ly8gV2Ugd2lsbCB1c2UgdGhlIHRhZy5yZW5kZXJpbmcgb2JqZWN0IGZvciBjYXJyeWluZyByZW5kZXJpbmcgc3RhdGUgYWNyb3NzIHRoZSBjYWxscy5cblx0XHRcdFx0dmFyIGZpbmFsRWxzZSA9ICFhcmd1bWVudHMubGVuZ3RoLFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJlc3VsdCA9IFwiXCIsXG5cdFx0XHRcdFx0ZG9uZSA9IDA7XG5cblx0XHRcdFx0aWYgKCFzZWxmLnJlbmRlcmluZy5kb25lKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBmaW5hbEVsc2UgPyB0YWdDdHgudmlldy5kYXRhIDogdmFsOyAvLyBGb3IgdGhlIGZpbmFsIGVsc2UsIGRlZmF1bHRzIHRvIGN1cnJlbnQgZGF0YSB3aXRob3V0IGl0ZXJhdGlvbi5cblx0XHRcdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IHRhZ0N0eC5yZW5kZXIodmFsdWUsIGZpbmFsRWxzZSk7IC8vIEl0ZXJhdGVzIGV4Y2VwdCBvbiBmaW5hbCBlbHNlLCBpZiBkYXRhIGlzIGFuIGFycmF5LiAoVXNlIHt7aW5jbHVkZX19IHRvIGNvbXBvc2UgdGVtcGxhdGVzIHdpdGhvdXQgYXJyYXkgaXRlcmF0aW9uKVxuXHRcdFx0XHRcdFx0ZG9uZSArPSAkaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc2VsZi5yZW5kZXJpbmcuZG9uZSA9IGRvbmUpIHtcblx0XHRcdFx0XHRcdHNlbGYuc2VsZWN0ZWQgPSB0YWdDdHguaW5kZXg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIElmIG5vdGhpbmcgd2FzIHJlbmRlcmVkIHdlIHdpbGwgbG9vayBhdCB0aGUgbmV4dCB7e2Vsc2V9fS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZG9uZS5cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdHByb3BzOiB7XG5cdFx0XHRiYXNlVGFnOiBcImZvclwiLFxuXHRcdFx0ZGF0YU1hcDogZGF0YU1hcChnZXRUYXJnZXRQcm9wcyksXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRpbmNsdWRlOiB7XG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcIipcIjoge1xuXHRcdFx0Ly8ge3sqIGNvZGUuLi4gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiOipcIjoge1xuXHRcdFx0Ly8ge3s6KiByZXR1cm5lZEV4cHJlc3Npb24gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdGRiZzogJGhlbHBlcnMuZGJnID0gJGNvbnZlcnRlcnMuZGJnID0gZGJnQnJlYWsgLy8gUmVnaXN0ZXIge3tkYmcvfX0sIHt7ZGJnOi4uLn19IGFuZCB+ZGJnKCkgdG8gdGhyb3cgYW5kIGNhdGNoLCBhcyBicmVha3BvaW50cyBmb3IgZGVidWdnaW5nLlxuXHR9KTtcblxuXHQkY29udmVydGVycyh7XG5cdFx0aHRtbDogaHRtbEVuY29kZSxcblx0XHRhdHRyOiBodG1sRW5jb2RlLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdFx0dXJsOiBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0XHQvLyBVUkwgZW5jb2RpbmcgaGVscGVyLlxuXHRcdFx0cmV0dXJuIHRleHQgIT0gdW5kZWZpbmVkID8gZW5jb2RlVVJJKFwiXCIgKyB0ZXh0KSA6IHRleHQgPT09IG51bGwgPyB0ZXh0IDogXCJcIjsgLy8gbnVsbCByZXR1cm5zIG51bGwsIGUuZy4gdG8gcmVtb3ZlIGF0dHJpYnV0ZS4gdW5kZWZpbmVkIHJldHVybnMgXCJcIlxuXHRcdH1cblx0fSk7XG59XG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IERlZmluZSBkZWZhdWx0IGRlbGltaXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiRzdWJTZXR0aW5ncyA9ICRzdWIuc2V0dGluZ3M7XG4kaXNBcnJheSA9ICgkfHxqc3IpLmlzQXJyYXk7XG4kdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzKFwie3tcIiwgXCJ9fVwiLCBcIl5cIik7XG5cbmlmIChqc3JUb0pxKSB7IC8vIE1vdmluZyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXBhY2UgLSBjb3B5IG92ZXIgdGhlIHN0b3JlZCBpdGVtcyAodGVtcGxhdGVzLCBjb252ZXJ0ZXJzLCBoZWxwZXJzLi4uKVxuXHRqc3Iudmlld3Muc3ViLl9qcSgkKTtcbn1cblxuLy88PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwgSnNPYnNlcnZhYmxlID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuLyogSnNPYnNlcnZhYmxlOlxuICogU2VlIGh0dHA6Ly93d3cuanN2aWV3cy5jb20vI2pzb2JzZXJ2YWJsZSBhbmQgaHR0cDovL2dpdGh1Yi5jb20vYm9yaXNtb29yZS9qc3ZpZXdzXG4gKiBDb3B5cmlnaHQgMjAxNiwgQm9yaXMgTW9vcmVcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCB2YXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiR2aWV3cyA9ICQudmlld3M7XG4kc3ViID0gJHZpZXdzLnN1YjtcbiRpc0Z1bmN0aW9uID0gJC5pc0Z1bmN0aW9uO1xuJGlzQXJyYXkgPSAkLmlzQXJyYXk7XG4kZXhwYW5kbyA9ICQuZXhwYW5kbztcbmlmICghJC5vYnNlcnZlKSB7XG5cblx0dmFyICRldmVudFNwZWNpYWwgPSAkLmV2ZW50LnNwZWNpYWwsXG5cdFx0c2xpY2UgPSBbXS5zbGljZSxcblx0XHRzcGxpY2UgPSBbXS5zcGxpY2UsXG5cdFx0Y29uY2F0ID0gW10uY29uY2F0LFxuXHRcdFBBUlNFSU5UID0gcGFyc2VJbnQsXG5cdFx0ck5vdFdoaXRlID0gL1xcUysvZyxcblx0XHRwcm9wZXJ0eUNoYW5nZVN0ciA9ICRzdWIucHJvcENobmcgPSAkc3ViLnByb3BDaG5nIHx8IFwicHJvcGVydHlDaGFuZ2VcIiwvLyBUaGVzZSB0d28gc2V0dGluZ3MgY2FuIGJlIG92ZXJyaWRkZW4gb24gc2V0dGluZ3MgYWZ0ZXIgbG9hZGluZ1xuXHRcdGFycmF5Q2hhbmdlU3RyID0gJHN1Yi5hcnJDaG5nID0gJHN1Yi5hcnJDaG5nIHx8IFwiYXJyYXlDaGFuZ2VcIiwgICAgICAgIC8vIGpzUmVuZGVyLCBhbmQgcHJpb3IgdG8gbG9hZGluZyBqcXVlcnkub2JzZXJ2YWJsZS5qcyBhbmQvb3IgSnNWaWV3c1xuXHRcdGNiQmluZGluZ3NTdG9yZSA9IHt9LFxuXHRcdG9ic2VydmVTdHIgPSBwcm9wZXJ0eUNoYW5nZVN0ciArIFwiLm9ic2VydmVcIixcblx0XHRvYnNlcnZlT2JqS2V5ID0gMSxcblx0XHRvYnNlcnZlQ2JLZXkgPSAxLFxuXHRcdG9ic2VydmVJbm5lckNiS2V5ID0gMSxcblx0XHQkaGFzRGF0YSA9ICQuaGFzRGF0YSxcblx0XHQkZGF0YSA9ICQuZGF0YSxcblx0XHRyZW1vdmUgPSB7fSwgLy8gZmxhZyBmb3IgcmVtb3ZlUHJvcGVydHlcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRnZXRDYktleSA9IGZ1bmN0aW9uKGNiKSB7XG5cdFx0cmV0dXJuIGNiLl9jSWQgPSBjYi5fY0lkIHx8IChcIi5vYnNcIiArIG9ic2VydmVDYktleSsrKTtcblx0fSxcblxuXHRPYmplY3RPYnNlcnZhYmxlID0gZnVuY3Rpb24obnMsIGRhdGEpIHtcblx0XHR0aGlzLl9kYXRhID0gZGF0YTtcblx0XHR0aGlzLl9ucyA9IG5zO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdEFycmF5T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKG5zLCBkYXRhKSB7XG5cdFx0dGhpcy5fZGF0YSA9IGRhdGE7XG5cdFx0dGhpcy5fbnMgPSBucztcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwQXJyYXkgPSBmdW5jdGlvbihkYXRhKSB7XG5cdFx0cmV0dXJuICRpc0FycmF5KGRhdGEpXG5cdFx0XHQ/IFtkYXRhXVxuXHRcdFx0OiBkYXRhO1xuXHR9LFxuXG5cdHJlc29sdmVQYXRoT2JqZWN0cyA9IGZ1bmN0aW9uKHBhdGhzLCByb290LCBjYWxsYmFjaykge1xuXHRcdHBhdGhzID0gcGF0aHNcblx0XHRcdD8gJGlzQXJyYXkocGF0aHMpXG5cdFx0XHRcdD8gcGF0aHNcblx0XHRcdFx0OiBbcGF0aHNdXG5cdFx0XHQ6IFtdO1xuXG5cdFx0dmFyIGksIHBhdGgsXG5cdFx0XHRvYmplY3QgPSByb290LFxuXHRcdFx0bmV4dE9iaiA9IG9iamVjdCxcblx0XHRcdGwgPSBwYXRocyAmJiBwYXRocy5sZW5ndGgsXG5cdFx0XHRvdXQgPSBbXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdHBhdGggPSBwYXRoc1tpXTtcblx0XHRcdGlmICgkaXNGdW5jdGlvbihwYXRoKSkge1xuXHRcdFx0XHRvdXQgPSBvdXQuY29uY2F0KHJlc29sdmVQYXRoT2JqZWN0cyhwYXRoLmNhbGwocm9vdCwgcm9vdCwgY2FsbGJhY2spLCByb290KSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIGlmIChcIlwiICsgcGF0aCAhPT0gcGF0aCkge1xuXHRcdFx0XHRyb290ID0gbmV4dE9iaiA9IHBhdGg7XG5cdFx0XHRcdGlmIChuZXh0T2JqICE9PSBvYmplY3QpIHtcblx0XHRcdFx0XHRvdXQucHVzaChvYmplY3QgPSBuZXh0T2JqKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChuZXh0T2JqICE9PSBvYmplY3QpIHtcblx0XHRcdFx0b3V0LnB1c2gob2JqZWN0ID0gbmV4dE9iaik7XG5cdFx0XHR9XG5cdFx0XHRvdXQucHVzaChwYXRoKTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dDtcblx0fSxcblxuXHRyZW1vdmVDYkJpbmRpbmdzID0gZnVuY3Rpb24oY2JCaW5kaW5ncywgY2JCaW5kaW5nc0lkKSB7XG5cdFx0Ly8gSWYgdGhlIGNiQmluZGluZ3MgY29sbGVjdGlvbiBpcyBlbXB0eSB3ZSB3aWxsIHJlbW92ZSBpdCBmcm9tIHRoZSBjYkJpbmRpbmdzU3RvcmVcblx0XHRmb3IgKHZhciBjYiBpbiBjYkJpbmRpbmdzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGRlbGV0ZSBjYkJpbmRpbmdzU3RvcmVbY2JCaW5kaW5nc0lkXTsgLy8gVGhpcyBiaW5kaW5nIGNvbGxlY3Rpb24gaXMgZW1wdHksIHNvIHJlbW92ZSBmcm9tIHN0b3JlXG5cdH0sXG5cblx0b25PYnNlcnZhYmxlQ2hhbmdlID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdGZ1bmN0aW9uIGlzT2IodmFsKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIHZhbCA9PT0gT0JKRUNUICYmIChwYXRoc1swXSB8fCBhbGxvd0FycmF5ICYmICRpc0FycmF5KHZhbCkpO1xuXHRcdH1cblxuXHRcdGlmICghKGV2LmRhdGEgJiYgZXYuZGF0YS5vZmYpKSB7XG5cdFx0XHQvLyBTa2lwIGlmICEhZXYuZGF0YS5vZmY6IC0gYSBoYW5kbGVyIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIChtYXliZSB3YXMgb24gaGFuZGxlciBjb2xsZWN0aW9uIGF0IGNhbGwgdGltZSAtIHRoZW4gcmVtb3ZlZCBieSBhbm90aGVyIGhhbmRsZXIpXG5cdFx0XHR2YXIgYWxsUGF0aCwgZmlsdGVyLCBwYXJlbnRPYnMsXG5cdFx0XHRcdG9sZFZhbHVlID0gZXZlbnRBcmdzLm9sZFZhbHVlLFxuXHRcdFx0XHR2YWx1ZSA9IGV2ZW50QXJncy52YWx1ZSxcblx0XHRcdFx0Y3R4ID0gZXYuZGF0YSxcblx0XHRcdFx0b2JzZXJ2ZUFsbCA9IGN0eC5vYnNlcnZlQWxsLFxuXHRcdFx0XHRjYiA9IGN0eC5jYixcblx0XHRcdFx0YWxsb3dBcnJheSA9ICFjYi5ub0FycmF5LFxuXHRcdFx0XHRwYXRocyA9IGN0eC5wYXRocyxcblx0XHRcdFx0bnMgPSBjdHgubnM7XG5cblx0XHRcdGlmIChldi50eXBlID09PSBhcnJheUNoYW5nZVN0cikge1xuXHRcdFx0XHQoY2IuYXJyYXkgfHwgY2IpLmNhbGwoY3R4LCBldiwgZXZlbnRBcmdzKTsgLy8gSWYgdGhlcmUgaXMgYW4gYXJyYXlIYW5kbGVyIGV4cGFuZG8gb24gdGhlIHJlZ3VsYXIgaGFuZGxlciwgdXNlIGl0LCBvdGhlcndpc2UgdXNlIHRoZSByZWd1bGFyIGhhbmRsZXIgZm9yIGFycmF5Q2hhbmdlIGV2ZW50cyBhbHNvIC0gZm9yIGV4YW1wbGU6ICQub2JzZXJ2ZShhcnJheSwgaGFuZGxlcilcblx0XHRcdFx0Ly8gb3Igb2JzZXJ2ZUFsbCgpIHdpdGggYW4gYXJyYXkgaW4gdGhlIGdyYXBoLiBOb3RlIHRoYXQgb24gZGF0YS1saW5rIGJpbmRpbmdzIHdlIGVuc3VyZSBhbHdheXMgdG8gaGF2ZSBhbiBhcnJheSBoYW5kbGVyIC0gJC5ub29wIGlmIG5vbmUgaXMgc3BlY2lmaWVkIGUuZy4gb24gdGhlIGRhdGEtbGlua2VkIHRhZy5cblx0XHRcdH0gZWxzZSBpZiAoY3R4LnByb3AgPT09IGV2ZW50QXJncy5wYXRoIHx8IGN0eC5wcm9wID09PSBcIipcIikge1xuXHRcdFx0XHRpZiAob2JzZXJ2ZUFsbCkge1xuXHRcdFx0XHRcdGFsbFBhdGggPSBvYnNlcnZlQWxsLl9wYXRoICsgXCIuXCIgKyBldmVudEFyZ3MucGF0aDtcblx0XHRcdFx0XHRmaWx0ZXIgPSBvYnNlcnZlQWxsLmZpbHRlcjtcblx0XHRcdFx0XHRwYXJlbnRPYnMgPSBbZXYudGFyZ2V0XS5jb25jYXQob2JzZXJ2ZUFsbC5wYXJlbnRzKCkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzT2Iob2xkVmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRvYnNlcnZlX2FwcGx5KGFsbG93QXJyYXksIG5zLCBbb2xkVmFsdWVdLCBwYXRocywgY2IsIHRydWUsIGZpbHRlciwgW3BhcmVudE9ic10sIGFsbFBhdGgpOyAvLyB1bm9ic2VydmVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGlzT2IodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRvYnNlcnZlX2FwcGx5KGFsbG93QXJyYXksIG5zLCBbdmFsdWVdLCBwYXRocywgY2IsIHVuZGVmaW5lZCwgZmlsdGVyLCBbcGFyZW50T2JzXSwgYWxsUGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChpc09iKG9sZFZhbHVlKSkgeyAvLyBvbGRWYWx1ZSBpcyBhbiBvYmplY3QsIHNvIHVub2JzZXJ2ZVxuXHRcdFx0XHRcdFx0b2JzZXJ2ZV9hcHBseShhbGxvd0FycmF5LCBucywgW29sZFZhbHVlXSwgcGF0aHMsIGNiLCB0cnVlKTsgLy8gdW5vYnNlcnZlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpc09iKHZhbHVlKSkgeyAvLyB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvIG9ic2VydmVcblx0XHRcdFx0XHRcdG9ic2VydmVfYXBwbHkoYWxsb3dBcnJheSwgbnMsIFt2YWx1ZV0sIHBhdGhzLCBjYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGN0eC5jYihldiwgZXZlbnRBcmdzKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0b2JzZXJ2ZV9hcHBseSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vICQub2JzZXJ2ZSgpLCBidXQgYWxsb3dpbmcgeW91IHRvIGluY2x1ZGUgYXJyYXlzIHdpdGhpbiB0aGUgYXJndW1lbnRzIC0gd2hpY2ggeW91IHdhbnQgZmxhdHRlbmVkLlxuXHRcdHZhciBhcmdzID0gY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpOyAvLyBGbGF0dGVuIHRoZSBhcmd1bWVudHNcblx0XHRyZXR1cm4gJG9ic2VydmUuYXBwbHkoYXJncy5zaGlmdCgpLCBhcmdzKTtcblx0fSxcblxuXHQkb2JzZXJ2ZUFsbCA9IGZ1bmN0aW9uKGNiLCBmaWx0ZXIsIHVub2JzZXJ2ZSkge1xuXHRcdG9ic2VydmVBbGwodGhpcy5fbnMsIHRoaXMuX2RhdGEsIGNiLCBmaWx0ZXIsIFtdLCBcInJvb3RcIiwgdW5vYnNlcnZlKTtcblx0fSxcblxuXHQkdW5vYnNlcnZlQWxsID0gZnVuY3Rpb24oY2IsIGZpbHRlcikge1xuXHRcdCRvYnNlcnZlQWxsLmNhbGwodGhpcywgY2IsIGZpbHRlciwgdHJ1ZSk7XG5cdH0sXG5cblx0b2JzZXJ2ZUFsbCA9IGZ1bmN0aW9uKG5hbWVzcGFjZSwgb2JqZWN0LCBjYiwgZmlsdGVyLCBwYXJlbnRPYnMsIGFsbFBhdGgsIHVub2JzZXJ2ZSwgb2JqTWFwKSB7XG5cdFx0ZnVuY3Rpb24gb2JzZXJ2ZUFycmF5SXRlbXMoYXJyLCB1bm9icykge1xuXHRcdFx0bCA9IGFyci5sZW5ndGg7XG5cdFx0XHRuZXdBbGxQYXRoID0gYWxsUGF0aCArIFwiW11cIjtcblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChhcnIsIGwsIHVub2JzLCAxKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmaWx0ZXJBbmRPYnNlcnZlQWxsKG9iaiwgcHJvcCwgdW5vYnMsIG5lc3RlZEFycmF5KSB7XG5cdFx0XHR2YXIgbmV3T2JqZWN0LCBuZXdQYXJlbnRPYnM7XG5cdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8pIHtcblx0XHRcdFx0aWYgKG5ld09iamVjdCA9ICRvYnNlcnZhYmxlLl9mbHRyKG5ld0FsbFBhdGgsIG9ialtwcm9wXSwgbmV4dFBhcmVudE9icywgZmlsdGVyKSkge1xuXHRcdFx0XHRcdG5ld1BhcmVudE9icyA9IG5leHRQYXJlbnRPYnMuc2xpY2UoKTtcblx0XHRcdFx0XHRpZiAobmVzdGVkQXJyYXkgJiYgdXBkYXRlZFRndCAmJiBuZXdQYXJlbnRPYnNbMF0gIT09IHVwZGF0ZWRUZ3QpIHtcblx0XHRcdFx0XHRcdG5ld1BhcmVudE9icy51bnNoaWZ0KHVwZGF0ZWRUZ3QpOyAvLyBGb3IgYXJyYXkgY2hhbmdlIGV2ZW50cyB3aGVuIG9ic2VydmluZyBhbiBhcnJheSB3aGljaCBpcyBub3QgdGhlIHJvb3QsIG5lZWQgdG8gYWRkIHVwZGF0ZWQgYXJyYXkgdG8gcGFyZW50T2JzXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9ic2VydmVBbGwobmFtZXNwYWNlLCBuZXdPYmplY3QsIGNiLCBmaWx0ZXIgfHwgKG5lc3RlZEFycmF5ID8gdW5kZWZpbmVkIDogMCksIG5ld1BhcmVudE9icywgbmV3QWxsUGF0aCwgdW5vYnMsIG9iak1hcCk7XG5cdFx0XHRcdFx0Ly8gSWYgbmVzdGVkIGFycmF5LCBuZWVkIHRvIG9ic2VydmUgdGhlIGFycmF5IHRvbyAtIHNvIHNldCBmaWx0ZXIgdG8gdW5kZWZpbmVkXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiB3cmFwcGVkQ2IoZXYsIGV2ZW50QXJncykge1xuXHRcdFx0Ly8gVGhpcyBvYmplY3QgaXMgY2hhbmdpbmcuXG5cdFx0XHRhbGxQYXRoID0gZXYuZGF0YS5vYnNlcnZlQWxsLl9wYXRoO1xuXHRcdFx0dXBkYXRlZFRndCA9IGV2LnRhcmdldDtcblx0XHRcdHN3aXRjaCAoZXZlbnRBcmdzLmNoYW5nZSkgeyAvLyBvYnNlcnZlQWxsL3Vub2JzZXJ2ZUFsbCBvbiBhZGRlZCBvciByZW1vdmVkIG9iamVjdHNcblx0XHRcdFx0Y2FzZSBcImluc2VydFwiOlxuXHRcdFx0XHRcdG9ic2VydmVBcnJheUl0ZW1zKGV2ZW50QXJncy5pdGVtcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJyZW1vdmVcIjpcblx0XHRcdFx0XHRvYnNlcnZlQXJyYXlJdGVtcyhldmVudEFyZ3MuaXRlbXMsIHRydWUpOyAvLyB1bm9ic2VydmVBbGwgb24gcmVtb3ZlZCBpdGVtc1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwic2V0XCI6XG5cdFx0XHRcdFx0bmV3QWxsUGF0aCA9IGFsbFBhdGggKyBcIi5cIiArIGV2ZW50QXJncy5wYXRoO1xuXHRcdFx0XHRcdGZpbHRlckFuZE9ic2VydmVBbGwoZXZlbnRBcmdzLCBcIm9sZFZhbHVlXCIsIHRydWUpOyAvLyB1bm9ic2VydmUgb2xkIHZhbHVlXG5cdFx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChldmVudEFyZ3MsIFwidmFsdWVcIik7IC8vIG9ic2VydmUgbmV3IHZhbHVlXG5cdFx0XHR9XG5cdFx0XHR1cGRhdGVkVGd0ID0gdW5kZWZpbmVkO1xuXHRcdFx0Y2IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gT2JzZXJ2ZSB0aGlzIG9iamVjdCAoaW52b2tlIHRoZSBjYWxsYmFjaylcblx0XHR9XG5cblx0XHR2YXIgbCwgaXNPYmplY3QsIG5ld0FsbFBhdGgsIG5leHRQYXJlbnRPYnMsIHVwZGF0ZWRUZ3QsIG9iSWQsXG5cdFx0XHRub3RSZW1vdmluZyA9ICFvYmpNYXAgfHwgb2JqTWFwLnVuIHx8ICF1bm9ic2VydmU7IC8vIHRydWUgdW5sZXNzIGl0IGlzIGFuIG9ic2VydmVBbGwgY2FsbCAobm90IHVub2JzZXJ2ZUFsbCkgYW5kIHdlIGFyZSByZW1vdmluZyBhIGxpc3RlbmVyIChub3QgYWRkaW5nIG9uZSlcblxuXHRcdGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gT0JKRUNUKSB7XG5cdFx0XHRuZXh0UGFyZW50T2JzID0gW29iamVjdF0uY29uY2F0KHBhcmVudE9icyk7IC8vIFRoZSBwYXJlbnRPYnMgY2hhaW4gZm9yIHRoZSBuZXh0IGRlcHRoIG9mIG9ic2VydmVBbGxcblx0XHRcdGlzT2JqZWN0ID0gJGlzQXJyYXkob2JqZWN0KSA/IFwiXCIgOiBcIipcIjtcblx0XHRcdGlmIChvYmpNYXAgJiYgbm90UmVtb3ZpbmcgJiYgJGhhc0RhdGEob2JqZWN0KSAmJiBvYmpNYXBbb2JJZCA9ICRkYXRhKG9iamVjdCkub2JJZF0pIHtcblx0XHRcdFx0b2JqTWFwW29iSWRdKys7XG5cdFx0XHRcdHJldHVybjsgLy8gVGhpcyBvYmplY3QgaGFzIGFscmVhZHkgYmVpbmcgb2JzZXJ2ZWQvdW5vYnNlcnZlZCBieSB0aGlzIG9ic2VydmVBbGwvdW5vYnNlcnZlQWxsIGNhbGwgKG11c3QgYmUgYSBjeWNsaWMgb2JqZWN0IGdyYXBoKSBzbyBza2lwLCB0byBhdm9pZFxuXHRcdFx0XHQvLyBzdGFjayBvdmVyZmxvdy9tdWx0aXBsZSBpbnN0YW5jZXMgb2YgbGlzdGVuZXIuIFNlZSBqc3ZpZXdzL3B1bGwvMzA1XG5cdFx0XHRcdC8vIE5PVEUgLSBXRSBETyBOT1Qgc3VwcG9ydCBPYnNlcnZlQWxsIG9uIGRhdGEgd2l0aCBjeWNsaWMgZ3JhcGhzIHdoaWNoIGluY2x1ZGUgRFVQTElDQVRFIFJFRkVSRU5DRVMgVE8gQVJSQVkgUFJPUEVSVElFUyAtIHN1Y2ggYXMgZGF0YS5jaGlsZHJlbiA9IGRhdGEuZGVzY2VuZGFudHMgPSBbXVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFvYmpNYXApIHtcblx0XHRcdFx0b2JqTWFwID0ge3VuOiB1bm9ic2VydmV9OyAvLyBNYXAgb2JqZWN0IHRvIHJlZ2lzdGVyIG9ic2VydmVkIG9iamVjdHMgZm9yIHRoaXMgb2JzZXJ2ZUFsbFxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2IpIHtcblx0XHRcdFx0Ly8gT2JzZXJ2ZSB0aGlzIG9iamVjdCBvciBhcnJheSAtIGFuZCBhbHNvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byBvYmplY3QgZ3JhcGgsIHRvIGFkZCBvciByZW1vdmUgb2JzZXJ2ZXJzIGZyb20gdGhlIG1vZGlmaWVkIG9iamVjdCBncmFwaFxuXHRcdFx0XHRpZiAoaXNPYmplY3QgfHwgZmlsdGVyICE9PSAwKSB7XG5cdFx0XHRcdFx0Ly8gSWYgYW4gb2JqZWN0LCBvYnNlcnZlIHRoZSBvYmplY3QuIElmIGFuIGFycmF5LCBvbmx5IGFkZCBhcnJheUNoYW5nZSBiaW5kaW5nIGlmIGhhcyBmaWx0ZXIgb3IgaWYgZmlsdGVyIGlzIHVuZGVmaW5lZCAoIT09IDApIC0gd2hpY2hcblx0XHRcdFx0XHQvLyBpcyB0aGUgY2FzZSBmb3IgdG9wLWxldmVsIGNhbGxzIG9yIGZvciBuZXN0ZWQgYXJyYXkgKGFycmF5IGl0ZW0gb2YgYW4gYXJyYXkgLSBlLmcuIG1lbWJlciBvZiAyLWRpbWVuc2lvbmFsIGFycmF5KS5cblx0XHRcdFx0XHQvLyBGb3IgYXJyYXkgcHJvcGVydGllcyBsb3dlciBpbiB0aGUgdHJlZSwgd2l0aCBubyBmaWx0ZXIsIGZpbHRlciBpcyBzZXQgdG8gMCBpbiBmaWx0ZXJBbmRPYnNlcnZlQWxsLCBzbyBubyBhcnJheUNoYW5nZSBiaW5kaW5nIGhlcmUsXG5cdFx0XHRcdFx0Ly8gc2luY2UgdGhleSBnZXQgYXJyYXlDaGFuZ2UgYmluZGluZyBhZGRlZCBkdXJpbmcgcmVndWxhciAkLm9ic2VydmUoYXJyYXkgLi4uKSBiaW5kaW5nLlxuXHRcdFx0XHRcdHdyYXBwZWRDYi5fY0lkID0gZ2V0Q2JLZXkoY2IpOyAvLyBJZGVudGlmeSB3cmFwcGVkIGNhbGxiYWNrIHdpdGggdW53cmFwcGVkIGNhbGxiYWNrLCBzbyB1bm9ic2VydmVBbGwgd2lsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgcHJldmlvdXMgb2JzZXJ2ZUFsbCB3cmFwcGVkIGNhbGxiYWNrLCBpZiBpbm5lciBjYWxsYmFjayB3YXMgdGhlIHNhbWU7XG5cdFx0XHRcdFx0aWYgKG5vdFJlbW92aW5nKSB7XG5cdFx0XHRcdFx0XHQkb2JzZXJ2ZShuYW1lc3BhY2UsIG9iamVjdCwgaXNPYmplY3QsIHdyYXBwZWRDYiwgdW5vYnNlcnZlLCBmaWx0ZXIsIG5leHRQYXJlbnRPYnMsIGFsbFBhdGgpO1xuXHRcdFx0XHRcdFx0b2JJZCA9ICRkYXRhKG9iamVjdCkub2JJZDtcblx0XHRcdFx0XHRcdG9iak1hcFtvYklkXSA9IChvYmpNYXBbb2JJZF0gfHwgMCkgKyAxOyAvLyBSZWdpc3RlciBvbiBtYXAgb2Ygb2JqZWN0cyBvYnNlcnZlZC91bm9ic2VydmVkIGJ5IHRoaXMgb2JzZXJ2ZUFsbC91bm9ic2VydmVBbGwgY2FsbFxuXHRcdFx0XHRcdFx0XHQvLy0gb3IgcmVtb3ZlIGZyb20gbWFwIGlmIHdlIGFyZSByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIG9ic2VydmVBbGwgY2FsbC4gKEF2b2lkIGR1cHMsIGZvciBjeWNsaWMgZ3JhcGhzKVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoLS1vYmpNYXBbJGRhdGEob2JqZWN0KS5vYklkXSkge1xuXHRcdFx0XHRcdFx0XHQvLyBSZWdpc3RlciBvbiBtYXAgb2Ygb2JqZWN0cyBvYnNlcnZlZC91bm9ic2VydmVkIGJ5IHRoaXMgb2JzZXJ2ZUFsbC91bm9ic2VydmVBbGwgY2FsbFxuXHRcdFx0XHRcdFx0XHQvLy0gb3IgcmVtb3ZlIGZyb20gbWFwIGlmIHdlIGFyZSByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIG9ic2VydmVBbGwgY2FsbC4gKEF2b2lkIGR1cHMsIGZvciBjeWNsaWMgZ3JhcGhzKVxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQkb2JzZXJ2ZShuYW1lc3BhY2UsIG9iamVjdCwgaXNPYmplY3QsIHdyYXBwZWRDYiwgdW5vYnNlcnZlLCBmaWx0ZXIsIG5leHRQYXJlbnRPYnMsIGFsbFBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gTm8gY2FsbGJhY2suIEp1c3QgdW5vYnNlcnZlIGlmIHVub2JzZXJ2ZSA9PT0gdHJ1ZS5cblx0XHRcdFx0aWYgKG9iak1hcCkge1xuXHRcdFx0XHRcdG9iak1hcFskZGF0YShvYmplY3QpLm9iSWRdID0gMTsgLy8gUmVnaXN0ZXIgb24gbWFwIG9mIG9iamVjdHMgdW5vYnNlcnZlZCBieSB0aGlzIHVub2JzZXJ2ZUFsbCBjYWxsLiAoQXZvaWQgZHVwcywgZm9yIGN5Y2xpYyBncmFwaHMpXG5cdFx0XHRcdH1cblx0XHRcdFx0JG9ic2VydmUobmFtZXNwYWNlLCBvYmplY3QsIGlzT2JqZWN0LCB1bmRlZmluZWQsIHVub2JzZXJ2ZSwgZmlsdGVyLCBuZXh0UGFyZW50T2JzLCBhbGxQYXRoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzT2JqZWN0KSB7XG5cdFx0XHRcdC8vIENvbnRpbnVlIHN0ZXBwaW5nIHRocm91Z2ggb2JqZWN0IGdyYXBoLCBvYnNlcnZpbmcgb2JqZWN0IGFuZCBhcnJheXNcblx0XHRcdFx0Ly8gVG8gb3ZlcnJpZGUgZmlsdGVyaW5nLCBwYXNzIGluIGZpbHRlciBmdW5jdGlvbiwgb3IgcmVwbGFjZSAkLm9ic2VydmFibGUuX2ZsdHJcblx0XHRcdFx0Zm9yIChsIGluIG9iamVjdCkge1xuXHRcdFx0XHRcdG5ld0FsbFBhdGggPSBhbGxQYXRoICsgXCIuXCIgKyBsO1xuXHRcdFx0XHRcdGZpbHRlckFuZE9ic2VydmVBbGwob2JqZWN0LCBsLCB1bm9ic2VydmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgeyAvLyBPYnNlcnZlIGl0ZW1zIGluIEFycmF5XG5cdFx0XHRcdG9ic2VydmVBcnJheUl0ZW1zKG9iamVjdCwgdW5vYnNlcnZlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0c2hhbGxvd0ZpbHRlciA9IGZ1bmN0aW9uKGFsbFBhdGggLyosIG9iamVjdCwgcGFyZW50T2JzKi8pIHtcblx0XHRyZXR1cm4gYWxsUGF0aC5pbmRleE9mKFwiLlwiKSA8IDAgJiYgYWxsUGF0aC5pbmRleE9mKFwiW1wiKSA8IDA7XG5cdH0sXG5cblx0JHVub2JzZXJ2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFtdLnB1c2guY2FsbChhcmd1bWVudHMsIHRydWUpOyAvLyBBZGQgdHJ1ZSBhcyBhZGRpdGlvbmFsIGZpbmFsIGFyZ3VtZW50XG5cdFx0cmV0dXJuICRvYnNlcnZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdH07XG5cblx0JG9ic2VydmUgPSBmdW5jdGlvbigpIHtcblx0XHQvLyAkLm9ic2VydmUoW25hbWVzcGFjZSwgXXJvb3QsIFsxIG9yIG1vcmUgb2JqZWN0cywgcGF0aCBvciBwYXRoIEFycmF5IHBhcmFtcy4uLl0sIGNhbGxiYWNrWywgY29udGV4dENhbGxiYWNrXVssIHVub2JzZXJ2ZV0pXG5cblx0XHRmdW5jdGlvbiBpbm5lck9ic2VydmUoKSB7XG5cblx0XHRcdGZ1bmN0aW9uIG9ic2VydmVPbk9mZihuYW1lc3BhY2UsIHBhdGhTdHIsIGlzQXJyYXlCaW5kaW5nLCBvZmYpIHtcblx0XHRcdFx0dmFyIGosIGV2RGF0YSxcblx0XHRcdFx0XHRvYklkRXhwYW5kbyA9ICRoYXNEYXRhKG9iamVjdCksXG5cdFx0XHRcdFx0Ym91bmRPYk9yQXJyID0gd3JhcEFycmF5KG9iamVjdCksXG5cdFx0XHRcdFx0cHJudE9icyA9IHBhcmVudE9icyxcblx0XHRcdFx0XHRhbGxQdGggPSBhbGxQYXRoO1xuXG5cdFx0XHRcdG5hbWVzcGFjZSA9IGluaXRpYWxOcyA/IG5hbWVzcGFjZSArIFwiLlwiICsgaW5pdGlhbE5zIDogbmFtZXNwYWNlO1xuXG5cdFx0XHRcdGlmICghdW5vYnNlcnZlICYmIChvZmYgfHwgaXNBcnJheUJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0ZXZlbnRzID0gb2JJZEV4cGFuZG8gJiYgJC5fZGF0YShvYmplY3QpO1xuXHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cyAmJiBldmVudHMuZXZlbnRzO1xuXHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cyAmJiBldmVudHNbaXNBcnJheUJpbmRpbmcgPyBhcnJheUNoYW5nZVN0ciA6IHByb3BlcnR5Q2hhbmdlU3RyXTtcblx0XHRcdFx0XHRlbCA9IGV2ZW50cyAmJiBldmVudHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChlbC0tKSB7IC8vIFNraXAgZHVwbGljYXRlc1xuXHRcdFx0XHRcdFx0ZGF0YSA9IGV2ZW50c1tlbF0gJiYgZXZlbnRzW2VsXS5kYXRhO1xuXHRcdFx0XHRcdFx0aWYgKGRhdGEgJiYgKG9mZiAmJiBkYXRhLm5zICE9PSBpbml0aWFsTnNcblx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBvYnNlcnZpbmcsIGRvbid0IHVuYmluZCBkdXBzIHVubGVzcyB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlXG5cdFx0XHRcdFx0XHRcdHx8ICFvZmYgJiYgZGF0YS5ucyA9PT0gaW5pdGlhbE5zICYmIGRhdGEuY2IgJiYgZGF0YS5jYi5fY0lkID09PSBjYWxsYmFjay5fY0lkKSlcblx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBvYnNlcnZpbmcgYW5kIGRvaW5nIGFycmF5IGJpbmRpbmcsIGRvbid0IGJpbmQgZHVwcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlIChEdXBzIGNhbiBoYXBwZW4gZS5nLiB3aXRoIHtee2ZvciBwZW9wbGUgfmZvbz1wZW9wbGV9fSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodW5vYnNlcnZlIHx8IG9mZikge1xuXHRcdFx0XHRcdCQoYm91bmRPYk9yQXJyKS5vZmYobmFtZXNwYWNlLCBvbk9ic2VydmFibGVDaGFuZ2UpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGV2RGF0YSA9IGlzQXJyYXlCaW5kaW5nID8ge31cblx0XHRcdFx0XHRcdDoge1xuXHRcdFx0XHRcdFx0XHRmdWxsUGF0aDogcGF0aCxcblx0XHRcdFx0XHRcdFx0cGF0aHM6IHBhdGhTdHIgPyBbcGF0aFN0cl0gOiBbXSxcblx0XHRcdFx0XHRcdFx0cHJvcDogcHJvcFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRldkRhdGEubnMgPSBpbml0aWFsTnM7XG5cdFx0XHRcdFx0ZXZEYXRhLmNiID0gY2FsbGJhY2s7XG5cblx0XHRcdFx0XHRpZiAoYWxsUGF0aCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvYnNlcnZlQWxsIGNhbGxcblx0XHRcdFx0XHRcdGV2RGF0YS5vYnNlcnZlQWxsID0ge1xuXHRcdFx0XHRcdFx0XHRfcGF0aDogYWxsUHRoLFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBmdW5jdGlvbigpIHsgLy8gU3RlcCB0aHJvdWdoIHBhdGggYW5kIHBhcmVudE9icyBwYXJlbnQgY2hhaW4sIHJlcGxhY2luZyAnW10nIGJ5ICdbbl0nIGJhc2VkIG9uIGN1cnJlbnQgaW5kZXggb2Ygb2JqZWN0cyBpbiBwYXJlbnQgYXJyYXlzLlxuXHRcdFx0XHRcdFx0XHRcdGogPSBwcm50T2JzLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYWxsUHRoLnJlcGxhY2UoL1tbLl0vZywgZnVuY3Rpb24oYWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRqLS07XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYWxsID09PSBcIltcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/IFwiW1wiICsgJC5pbkFycmF5KHBybnRPYnNbaiAtIDFdLCBwcm50T2JzW2pdKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IFwiLlwiO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJudE9iczsgLy8gVGhlIGNoYWluIG9mIHBhcmVudHMgYmV0d2VlbiB0aGUgbW9kaWZpZWQgb2JqZWN0IGFuZCB0aGUgcm9vdCBvYmplY3QgdXNlZCBpbiB0aGUgb2JzZXJ2ZUFsbCgpIGNhbGxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0ZmlsdGVyOiBmaWx0ZXJcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCQoYm91bmRPYk9yQXJyKS5vbihuYW1lc3BhY2UsIG51bGwsIGV2RGF0YSwgb25PYnNlcnZhYmxlQ2hhbmdlKTtcblx0XHRcdFx0XHRpZiAoY2JCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Ly8gQWRkIG9iamVjdCB0byBjYkJpbmRpbmdzXG5cdFx0XHRcdFx0XHRjYkJpbmRpbmdzWyRkYXRhKG9iamVjdCkub2JJZCB8fCAkZGF0YShvYmplY3QsIFwib2JJZFwiLCBvYnNlcnZlT2JqS2V5KyspXSA9IG9iamVjdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gZ2V0SW5uZXJDYihleHByT2IpIHtcblx0XHRcdFx0Ly8gUmV0dXJucyB0aGUgaW5uZXJDYiB1c2VkIGZvciB1cGRhdGluZyBhIGNvbXB1dGVkIGluIGEgY29tcGlsZWQgZXhwcmVzc2lvbiAoc2V0dGluZyB0aGUgbmV3IGluc3RhbmNlIGFzIGV4cHJPYi5vYiwgdW5vYnNlcnZpbmcgdGhlIHByZXZpb3VzIG9iamVjdCxcblx0XHRcdFx0Ly8gYW5kIG9ic2VydmluZyB0aGUgbmV3IG9uZSksIHRoZW4gY2FsbGluZyB0aGUgb3V0ZXJDQiAtIGkuZS4gdGhlIGhhbmRsZXIgZm9yIHRoZSB3aG9sZSBjb21waWxlZCBleHByZXNzaW9uLlxuXHRcdFx0XHQvLyBJbml0aWFsaXplZCBleHByT2Iub2IgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LlxuXHRcdFx0XHQvLyBVc2VzIHRoZSBjb250ZXh0Q2IgY2FsbGJhY2sgdG8gZXhlY3V0ZSB0aGUgY29tcGlsZWQgZXhwck9iIHRlbXBsYXRlIGluIHRoZSBjb250ZXh0IG9mIHRoZSB2aWV3L2RhdGEgZXRjLiB0byBnZXQgdGhlIHJldHVybmVkIHZhbHVlLCB0eXBpY2FsbHkgYW4gb2JqZWN0IG9yIGFycmF5LlxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhbiBhcnJheSwgcmVnaXN0ZXJzIGFycmF5IGJpbmRpbmdcblx0XHRcdFx0dmFyIG9yaWdSdCA9IHJvb3Q7XG5cdFx0XHRcdC8vIE5vdGU6IEZvciBqc3ZpZXdzL2lzc3Vlcy8yOTIgY3R4Q2Igd2lsbCBuZWVkIHZhciBjdHhDYiA9IGNvbnRleHRDYiB8fCBmdW5jdGlvbihleHByT2IsIG9yaWdSdCkge3JldHVybiBleHByT2IuX2pzdihvcmlnUnQpO307XG5cblx0XHRcdFx0ZXhwck9iLm9iID0gY29udGV4dENiKGV4cHJPYiwgb3JpZ1J0KTsgLy8gSW5pdGlhbGl6ZSBvYmplY3RcblxuXHRcdFx0XHRyZXR1cm4gZXhwck9iLmNiID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdHZhciBvYmogPSBleHByT2Iub2IsIC8vIFRoZSBvbGQgb2JqZWN0XG5cdFx0XHRcdFx0XHRzdWIgPSBleHByT2Iuc2IsXG5cdFx0XHRcdFx0XHRuZXdPYmogPSBjb250ZXh0Q2IoZXhwck9iLCBvcmlnUnQpO1xuXG5cdFx0XHRcdFx0aWYgKG5ld09iaiAhPT0gb2JqKSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iaiA9PT0gT0JKRUNUKSB7XG5cdFx0XHRcdFx0XHRcdGJpbmRBcnJheShvYmosIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3ViIHx8IGFsbG93QXJyYXkgJiYgJGlzQXJyYXkob2JqKSkge1xuXHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbb2JqXSwgc3ViLCBjYWxsYmFjaywgY29udGV4dENiLCB0cnVlKTsgLy8gdW5vYnNlcnZlIG9uIHRoZSBvbGQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGV4cHJPYi5vYiA9IG5ld09iajtcblx0XHRcdFx0XHRcdC8vIFB1dCB0aGUgdXBkYXRlZCBvYmplY3QgaW5zdGFuY2Ugb250byB0aGUgZXhwck9iIGluIHRoZSBwYXRocyBhcnJheSwgc28gc3Vic2VxdWVudCBzdHJpbmcgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgb2JqZWN0XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG5ld09iaiA9PT0gT0JKRUNUKSB7XG5cdFx0XHRcdFx0XHRcdGJpbmRBcnJheShuZXdPYmopO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3ViIHx8IGFsbG93QXJyYXkgJiYgJGlzQXJyYXkobmV3T2JqKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIGFycmF5IGJpbmRpbmdcblx0XHRcdFx0XHRcdFx0XHRpbm5lck9ic2VydmUoW25ld09ial0sIHN1YiwgY2FsbGJhY2ssIGNvbnRleHRDYik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQ2FsbCB0aGUgb3V0ZXJDYiAtIHRvIGV4ZWN1dGUgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb24gdGhhdCB0aGlzIGNvbXB1dGVkIGlzIHBhcnQgb2Zcblx0XHRcdFx0XHRjYWxsYmFjayhldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gYmluZEFycmF5KGFyciwgdW5iaW5kLCBpc0FycmF5LCByZWxQYXRoKSB7XG5cdFx0XHRcdGlmIChhbGxvd0FycmF5KSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGNhbGwgdG8gb2JzZXJ2ZSB0aGF0IGRvZXMgbm90IGNvbWUgZnJvbSBvYnNlcnZlQW5kQmluZCAodGFnIGJpbmRpbmcpLCBzbyB3ZSBhbGxvdyBhcnJheUNoYW5nZSBiaW5kaW5nXG5cdFx0XHRcdFx0dmFyIHByZXZPYmogPSBvYmplY3QsXG5cdFx0XHRcdFx0XHRwcmV2QWxsUGF0aCA9IGFsbFBhdGg7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBhcnI7XG5cdFx0XHRcdFx0aWYgKHJlbFBhdGgpIHtcblx0XHRcdFx0XHRcdG9iamVjdCA9IGFycltyZWxQYXRoXTtcblx0XHRcdFx0XHRcdGFsbFBhdGggKz0gXCIuXCIgKyByZWxQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoZmlsdGVyICYmIG9iamVjdCkge1xuXHRcdFx0XHRcdFx0b2JqZWN0ID0gJG9ic2VydmFibGUuX2ZsdHIoYWxsUGF0aCwgb2JqZWN0LCByZWxQYXRoID8gW2Fycl0uY29uY2F0KHBhcmVudE9icykgOiBwYXJlbnRPYnMsIGZpbHRlcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvYmplY3QgJiYgKGlzQXJyYXkgfHwgJGlzQXJyYXkob2JqZWN0KSkpIHtcblx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihhcnJheUNoYW5nZVN0ciArIFwiLm9ic2VydmVcIiArIChjYWxsYmFjayA/IGdldENiS2V5KGNhbGxiYWNrKSA6IFwiXCIpLCB1bmRlZmluZWQsIHRydWUsIHVuYmluZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9iamVjdCA9IHByZXZPYmo7XG5cdFx0XHRcdFx0YWxsUGF0aCA9IHByZXZBbGxQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpLCBwLCBza2lwLCBwYXJ0cywgcHJvcCwgcGF0aCwgZGVwLCB1bm9ic2VydmUsIGNhbGxiYWNrLCBjYklkLCBpbklkLCBlbCwgZGF0YSwgZXZlbnRzLCBjb250ZXh0Q2IsIGlubmVyQ29udGV4dENiLFxuXHRcdFx0XHRpdGVtcywgY2JCaW5kaW5ncywgZGVwdGgsIGlubmVyQ2IsIHBhcmVudE9icywgYWxsUGF0aCwgZmlsdGVyLCBpbml0TnNBcnIsIGluaXROc0Fyckxlbixcblx0XHRcdFx0bnMgPSBvYnNlcnZlU3RyLFxuXHRcdFx0XHRwYXRocyA9IHRoaXMgIT0gMSAvLyBVc2luZyAhPSBmb3IgSUU8MTAgYnVnLSBzZWUganN2aWV3cy9pc3N1ZXMvMjM3XG5cdFx0XHRcdFx0PyBjb25jYXQuYXBwbHkoW10sIGFyZ3VtZW50cykgLy8gRmxhdHRlbiB0aGUgYXJndW1lbnRzIC0gdGhpcyBpcyBhICdyZWN1cnNpdmUgY2FsbCcgd2l0aCBwYXJhbXMgdXNpbmcgdGhlICd3cmFwcGVkIGFycmF5J1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBzdHlsZSAtIHN1Y2ggYXMgaW5uZXJPYnNlcnZlKFtvYmplY3RdLCBwYXRoLnBhdGgsIFtvcmlnUm9vdF0sIHBhdGgucHJtLCBpbm5lckNiLCAuLi4pO1xuXHRcdFx0XHRcdDogc2xpY2UuY2FsbChhcmd1bWVudHMpLCAvLyBEb24ndCBmbGF0dGVuIC0gdGhpcyBpcyB0aGUgZmlyc3QgJ3RvcC1sZXZlbCBjYWxsLCB0byBpbm5lck9ic2VydmUuYXBwbHkoMSwgcGF0aHMpXG5cdFx0XHRcdGxhc3RBcmcgPSBwYXRocy5wb3AoKSB8fCBmYWxzZSxcblx0XHRcdFx0cm9vdCA9IHBhdGhzLnNoaWZ0KCksXG5cdFx0XHRcdG9iamVjdCA9IHJvb3QsXG5cdFx0XHRcdGwgPSBwYXRocy5sZW5ndGg7XG5cblx0XHRcdGlmIChsYXN0QXJnICsgXCJcIiA9PT0gbGFzdEFyZykgeyAvLyBJZiBsYXN0IGFyZyBpcyBhIHN0cmluZyB0aGVuIHRoaXMgb2JzZXJ2ZSBjYWxsIGlzIHBhcnQgb2YgYW4gb2JzZXJ2ZUFsbCBjYWxsLFxuXHRcdFx0XHRhbGxQYXRoID0gbGFzdEFyZzsgICAgICAgICAgLy8gYW5kIHRoZSBsYXN0IHRocmVlIGFyZ3MgYXJlIHRoZSBwYXJlbnRPYnMgYXJyYXksIHRoZSBmaWx0ZXIsIGFuZCB0aGUgYWxsUGF0aCBzdHJpbmcuXG5cdFx0XHRcdHBhcmVudE9icyA9IHBhdGhzLnBvcCgpO1xuXHRcdFx0XHRmaWx0ZXIgPSBwYXRocy5wb3AoKTtcblx0XHRcdFx0bGFzdEFyZyA9ICEhcGF0aHMucG9wKCk7IC8vIHVub2JzZXJ2ZVxuXHRcdFx0XHRsIC09IDM7XG5cdFx0XHR9XG5cdFx0XHRpZiAobGFzdEFyZyA9PT0gISFsYXN0QXJnKSB7XG5cdFx0XHRcdHVub2JzZXJ2ZSA9IGxhc3RBcmc7XG5cdFx0XHRcdGxhc3RBcmcgPSBwYXRoc1tsLTFdO1xuXHRcdFx0XHRsYXN0QXJnID0gbCAmJiBsYXN0QXJnICsgXCJcIiAhPT0gbGFzdEFyZyAmJiAoIWxhc3RBcmcgfHwgJGlzRnVuY3Rpb24obGFzdEFyZykpID8gKGwtLSwgcGF0aHMucG9wKCkpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAodW5vYnNlcnZlICYmICFsICYmICRpc0Z1bmN0aW9uKHJvb3QpKSB7XG5cdFx0XHRcdFx0bGFzdEFyZyA9IHJvb3Q7XG5cdFx0XHRcdFx0cm9vdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y2FsbGJhY2sgPSBsYXN0QXJnO1xuXHRcdFx0aWYgKGwgJiYgJGlzRnVuY3Rpb24ocGF0aHNbbCAtIDFdKSkge1xuXHRcdFx0XHRpbm5lckNvbnRleHRDYiA9IGNvbnRleHRDYiA9IGNhbGxiYWNrO1xuXHRcdFx0XHRjYWxsYmFjayA9IHBhdGhzLnBvcCgpO1xuXHRcdFx0XHRsLS07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh1bm9ic2VydmUgJiYgY2FsbGJhY2sgJiYgIWNhbGxiYWNrLl9jSWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVc2UgYSB1bmlxdWUgbmFtZXNwYWNlIChlLmcuIG9iczcpIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9ic2VydmUoKSBjYWxsYmFjayB0byBhbGxvdyB1bm9ic2VydmUgdG8gcmVtb3ZlIGhhbmRsZXJzXG5cdFx0XHRucyArPSBjYWxsYmFja1xuXHRcdFx0XHQ/ICgoaW5JZCA9IGNhbGxiYWNrLl9pbklkIHx8IFwiXCIpLCB1bm9ic2VydmUpXG5cdFx0XHRcdFx0PyBjYWxsYmFjay5fY0lkICsgaW5JZFxuXHRcdFx0XHRcdDogKGNiSWQgPSBnZXRDYktleShjYWxsYmFjaykpICsgaW5JZFxuXHRcdFx0XHQ6IFwiXCI7XG5cblx0XHRcdGlmIChjYklkICYmICF1bm9ic2VydmUpIHtcblx0XHRcdFx0Y2JCaW5kaW5ncyA9IGNiQmluZGluZ3NTdG9yZVtjYklkXSA9IGNiQmluZGluZ3NTdG9yZVtjYklkXSB8fCB7fTtcblx0XHRcdH1cblxuXHRcdFx0aW5pdE5zQXJyID0gaW5pdGlhbE5zICYmIGluaXRpYWxOcy5tYXRjaChyTm90V2hpdGUpIHx8IFtcIlwiXTtcblx0XHRcdGluaXROc0FyckxlbiA9IGluaXROc0Fyci5sZW5ndGg7XG5cblx0XHRcdHdoaWxlIChpbml0TnNBcnJMZW4tLSkge1xuXHRcdFx0XHRpbml0aWFsTnMgPSBpbml0TnNBcnJbaW5pdE5zQXJyTGVuXTtcblx0XHRcdFx0aWYgKHJvb3QgJiYgKHBhdGggPSBwYXRoc1swXSwgIXBhdGggfHwgcGF0aCArIFwiXCIgIT09IHBhdGgpKSB7XG5cdFx0XHRcdFx0aWYgKCRpc0FycmF5KHJvb3QpKSB7XG5cdFx0XHRcdFx0XHRiaW5kQXJyYXkocm9vdCwgdW5vYnNlcnZlLCB0cnVlKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHVub2JzZXJ2ZSkge1xuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIG9uT2JzZXJ2YWJsZUNoYW5nZSBoYW5kbGVycyB0aGF0IHdyYXAgdGhhdCBjYWxsYmFja1xuXHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zLCBcIlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHVub2JzZXJ2ZSAmJiAhbCAmJiAhcm9vdCkgeyAvLyB1bm9ic2VydmUoKSAtIHVub2JzZXJ2ZXMgYWxsXG5cdFx0XHRcdFx0Zm9yIChwIGluIGNiQmluZGluZ3NTdG9yZSkge1xuXHRcdFx0XHRcdFx0cCA9IGNiQmluZGluZ3NTdG9yZVtwXTtcblx0XHRcdFx0XHRcdGZvciAoZGF0YSBpbiBwKSB7XG5cdFx0XHRcdFx0XHRcdG9iamVjdCA9IHBbZGF0YV07XG5cdFx0XHRcdFx0XHRcdGlmICgkaXNBcnJheShvYmplY3QpKSB7XG5cdFx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG9iamVjdCwgdW5vYnNlcnZlLCB1bm9ic2VydmUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBvbk9ic2VydmFibGVDaGFuZ2UgaGFuZGxlcnMgdGhhdCB3cmFwIHRoYXQgY2FsbGJhY2tcblx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGRlcHRoID0gMDtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHBhdGggPSBwYXRoc1tpXTtcblx0XHRcdFx0XHRpZiAocGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwYXRoICYmIHBhdGguX2NwKSB7IC8vIENvbnRleHR1YWwgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRjb250ZXh0Q2IgPSAkc3ViLl9nY2NiKHBhdGhbMF0pOyAgIC8vIGdldENvbnRleHRDYjogR2V0IGNvbnRleHQgY2FsbGJhY2sgZm9yIHRoZSBjb250ZXh0dWFsIHZpZXcgKHdoZXJlIGNvbnRleHR1YWwgcGFyYW0gZXZhbHVhdGVkL2Fzc2lnbmVkKVxuXHRcdFx0XHRcdFx0b3JpZ1Jvb3QgPSByb290ID0gcGF0aFswXS5kYXRhOyAgICAvLyBDb250ZXh0dWFsIGRhdGFcblx0XHRcdFx0XHRcdHBhdGggPSBwYXRoWzFdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvYmplY3QgPSByb290O1xuXHRcdFx0XHRcdGlmIChcIlwiICsgcGF0aCA9PT0gcGF0aCkge1xuXHRcdFx0XHRcdFx0Ly8gQ29uc2lkZXIgc3VwcG9ydCBmb3IgY29tcHV0ZWQgcGF0aHM6IGpzdmlld3MvaXNzdWVzLzI5MlxuXHRcdFx0XHRcdFx0Ly9pZiAoL1tcXChcXFtcXCtdLy50ZXN0KHBhdGgpKSB7XG5cdFx0XHRcdFx0XHQvL1x0dmFyIGI9e2xpbmtzOnt9fSwgdCA9ICRzdWIudG1wbEZuKFwiezpcIitwYXRoK1wifVwiLCBiLCB0cnVlKSwgaXRlbXMgPSB0LnBhdGhzWzBdO1xuXHRcdFx0XHRcdFx0Ly9cdGwgKz0gaXRlbXMubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdC8vXHRzcGxpY2UuYXBwbHkocGF0aHMsIFtpLS0sIDFdLmNvbmNhdChpdGVtcykpO1xuXHRcdFx0XHRcdFx0Ly9cdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0Ly99XG5cdFx0XHRcdFx0XHRwYXJ0cyA9IHBhdGguc3BsaXQoXCJeXCIpO1xuXHRcdFx0XHRcdFx0aWYgKHBhcnRzWzFdKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdlIGJpbmQgdGhlIGxlYWYsIHBsdXMgYWRkaXRpb25hbCBub2RlcyBiYXNlZCBvbiBkZXB0aC5cblx0XHRcdFx0XHRcdFx0Ly8gXCJhLmIuY15kLmVcIiBpcyBkZXB0aCAyLCBzbyBsaXN0ZW5zIHRvIGNoYW5nZXMgb2YgZSwgcGx1cyBjaGFuZ2VzIG9mIGQgYW5kIG9mIGNcblx0XHRcdFx0XHRcdFx0ZGVwdGggPSBwYXJ0c1swXS5zcGxpdChcIi5cIikubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gcGFydHMuam9pbihcIi5cIik7XG5cdFx0XHRcdFx0XHRcdGRlcHRoID0gcGF0aC5zcGxpdChcIi5cIikubGVuZ3RoIC0gZGVwdGg7XG5cdFx0XHRcdFx0XHRcdC8vIGlmIG1vcmUgdGhhbiBvbmUgXiBpbiB0aGUgcGF0aCwgdGhlIGZpcnN0IG9uZSBkZXRlcm1pbmVzIGRlcHRoXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoY29udGV4dENiKSB7XG5cdFx0XHRcdFx0XHRcdGl0ZW1zID0gY29udGV4dENiKHBhdGgsIHJvb3QsIGRlcHRoKTtcblx0XHRcdFx0XHRcdFx0Y29udGV4dENiID0gaW5uZXJDb250ZXh0Q2I7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoaXRlbXMpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFycmF5IG9mIG9iamVjdHMgYW5kIHBhdGhzIHJldHVybmVkIGJ5IGNvbnRleHRDYiBpcyBub24gZW1wdHksIGluc2VydCB0aGVtXG5cdFx0XHRcdFx0XHRcdC8vIGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIGN1cnJlbnQgaXRlbSAocGF0aCkuIE90aGVyd2lzZSBzaW1wbHkgcmVtb3ZlIGN1cnJlbnQgaXRlbSAocGF0aClcblx0XHRcdFx0XHRcdFx0bCArPSBpdGVtcy5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0XHRzcGxpY2UuYXBwbHkocGF0aHMsIFtpLS0sIDFdLmNvbmNhdChpdGVtcykpO1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICghJGlzRnVuY3Rpb24ocGF0aCkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGNvbXBpbGVkIGZ1bmN0aW9uIGZvciBiaW5kaW5nIHRvIGFuIG9iamVjdCByZXR1cm5lZCBieSBhIGhlbHBlci9kYXRhIGZ1bmN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdC8vIFNldCBjdXJyZW50IG9iamVjdCBvbiBleHByT2Iub2IsIGFuZCBnZXQgaW5uZXJDYiBmb3IgdXBkYXRpbmcgdGhlIG9iamVjdFxuXHRcdFx0XHRcdFx0XHRcdGlubmVyQ2IgPSB1bm9ic2VydmUgPyBwYXRoLmNiIDogZ2V0SW5uZXJDYihwYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRpbm5lckNiLm5vQXJyYXkgPSAhYWxsb3dBcnJheTtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbm5lckNiLl9jdHggPSBjYWxsYmFjay5fY3R4OyBDb3VsZCBwYXNzIGNvbnRleHQgKGUuZy4gbGlua0N0eCkgZm9yIHVzZSBpbiBhIGRlcGVuZHMgPSBmdW5jdGlvbigpIHt9IGNhbGwsIHNvIGRlcGVuZHMgaXMgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgbGlua0N0eCdzXG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJDYi5fY0lkID0gY2FsbGJhY2suX2NJZDtcblx0XHRcdFx0XHRcdFx0XHQvLyBTZXQgdGhlIHNhbWUgY2JCaW5kaW5nc1N0b3JlIGtleSBhcyBmb3IgY2FsbGJhY2ssIHNvIHdoZW4gY2FsbGJhY2sgaXMgZGlzcG9zZWQsIGRpc3Bvc2FsIG9mIGlubmVyQ2IgaGFwcGVucyB0b28uXG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJDYi5faW5JZCA9IGlubmVyQ2IuX2luSWQgfHwgXCIub2JJblwiICsgb2JzZXJ2ZUlubmVyQ2JLZXkrKztcblx0XHRcdFx0XHRcdFx0XHRpZiAocGF0aC5ibmQgfHwgcGF0aC5wcm0gJiYgcGF0aC5wcm0ubGVuZ3RoIHx8ICFwYXRoLnNiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgZXhwck9iIGlzIGJvdW5kIGUuZy4gZm9vKClec3ViLnBhdGgsIG9yIGhhcyBwYXJhbWV0ZXJzIGUuZy4gZm9vKGJhcikgb3IgaXMgYSBsZWFmIG9iamVjdCAoc28gbm8gc3ViIHBhdGgpIGUuZy4gZm9vKClcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoZW4gb2JzZXJ2ZSBjaGFuZ2VzIG9uIHRoZSBvYmplY3QsIG9yIGl0cyBwYXJhbWV0ZXJzIGFuZCBzdWItcGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtvYmplY3RdLCBwYXRoLnBhdGgsIFtvcmlnUm9vdF0sIHBhdGgucHJtLCBpbm5lckNiLCBjb250ZXh0Q2IsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXRoLnNiKSB7IC8vIHN1YlBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbcGF0aC5vYl0sIHBhdGguc2IsIGNhbGxiYWNrLCBjb250ZXh0Q2IsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBvcmlnUm9vdDtcblx0XHRcdFx0XHRcdFx0XHRvYmplY3QgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gcGF0aDsgLy8gRm9yIHRvcC1sZXZlbCBjYWxscywgb2JqZWN0cyBpbiB0aGUgcGF0aHMgYXJyYXkgYmVjb21lIHRoZSBvcmlnUm9vdCBmb3Igc3Vic2VxdWVudCBwYXRocy5cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cGFydHMgPSBbcm9vdCA9IHBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR3aGlsZSAob2JqZWN0ICYmIChwcm9wID0gcGFydHMuc2hpZnQoKSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3QgPT09IE9CSkVDVCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoXCJcIiArIHByb3AgPT09IHByb3ApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAocHJvcCA9PT0gXCJcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmICgocGFydHMubGVuZ3RoIDwgZGVwdGggKyAxKSAmJiAhb2JqZWN0Lm5vZGVUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBBZGQgb2JzZXJ2ZXIgZm9yIGVhY2ggdG9rZW4gaW4gcGF0aCBzdGFydGluZyBhdCBkZXB0aCwgYW5kIG9uIHRvIHRoZSBsZWFmXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXVub2JzZXJ2ZSAmJiAoZXZlbnRzID0gJGhhc0RhdGEob2JqZWN0KSAmJiAkLl9kYXRhKG9iamVjdCkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cy5ldmVudHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cyAmJiBldmVudHNbcHJvcGVydHlDaGFuZ2VTdHJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbCA9IGV2ZW50cyAmJiBldmVudHMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRza2lwID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGVsLS0pIHsgLy8gU2tpcCBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IGV2ZW50c1tlbF0uZGF0YTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZGF0YVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JiYgZGF0YS5ucyA9PT0gaW5pdGlhbE5zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQmJiBkYXRhLmNiLl9jSWQgPT09IGNhbGxiYWNrLl9jSWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCYmIGRhdGEuY2IuX2luSWQgPT09IGNhbGxiYWNrLl9pbklkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQmJiAoZGF0YS5wcm9wID09PSBwcm9wIHx8IGRhdGEucHJvcCA9PT0gXCIqXCIgfHwgZGF0YS5wcm9wID09PSBcIioqXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocCA9IHBhcnRzLmpvaW4oXCIuXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGEucGF0aHMucHVzaChwKTsgLy8gV2Ugd2lsbCBza2lwIHRoaXMgYmluZGluZywgYnV0IGlmIGl0IGlzIG5vdCBhIGxlYWYgYmluZGluZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gbmVlZCB0byBrZWVwIGJpbmRpbmdzIGZvciByZXN0IG9mIHBhdGgsIHJlYWR5IGZvciBpZiB0aGUgb2JqZWN0IGdldHMgc3dhcHBlZC5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNraXArKztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNraXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEdXBsaWNhdGUgYmluZGluZyhzKSBmb3VuZCwgc28gbW92ZSBvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdCA9IG9iamVjdFtwcm9wXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHByb3AgPT09IFwiKlwiIHx8IHByb3AgPT09IFwiKipcIikgeyAvLyBcIipcIiA9PiBhbGwgcHJvcGVydGllcy4gXCIqKlwiID0+IGFsbCBwcm9wZXJ0aWVzIGFuZCBzdWItcHJvcGVydGllcyAoaS5lLiBkZWVwIG9ic2VydmVBbGwgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghdW5vYnNlcnZlICYmIGV2ZW50cyAmJiBldmVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIGJpbmRpbmdzLCBzaW5jZSB0aGV5IHdpbGwgYmUgZHVwbGljYXRlcyB3aXRoIFwiKlwiIG9yIFwiKipcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIiwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wID09PSBcIipcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIik7IC8vIG9ic2VydmUgdGhlIG9iamVjdCBmb3IgYW55IHByb3BlcnR5IGNoYW5nZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAocCBpbiBvYmplY3QpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIG9ic2VydmluZyBcIipcIjogU28gKGluIGFkZGl0aW9uIHRvIGxpc3RlbmluZyB0byBwcm9wIGNoYW5nZSwgYWJvdmUpIGxpc3RlbiB0byBhcnJheWNoYW5nZSBvbiBwcm9wcyBvZiB0eXBlIGFycmF5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocCAhPT0gJGV4cGFuZG8pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG9iamVjdCwgdW5vYnNlcnZlLCB1bmRlZmluZWQsIHApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkLm9ic2VydmFibGUoaW5pdGlhbE5zLCBvYmplY3QpWyh1bm9ic2VydmUgPyBcInVuXCIgOiBcIlwiKSArIFwib2JzZXJ2ZUFsbFwiXShjYWxsYmFjayk7IC8vIG9ic2VydmUgb3IgdW5vYnNlcnZlIHRoZSBvYmplY3QgZm9yIGFueSBwcm9wZXJ0eSBjaGFuZ2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJvcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMgKyBcIi5wX1wiICsgcHJvcCwgcGFydHMuam9pbihcIl5cIikpOyAvLyBCeSB1c2luZyBcIl5cIiByYXRoZXIgdGhhbiBcIi5cIiB3ZSBlbnN1cmUgdGhhdCBkZWVwIGJpbmRpbmcgd2lsbCBiZSB1c2VkIG9uIG5ld2x5IGluc2VydGVkIG9iamVjdCBncmFwaHNcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFsbFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFsbFBhdGggKz0gXCIuXCIgKyBwcm9wO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wID0gb2JqZWN0W3Byb3BdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICgkaXNGdW5jdGlvbihwcm9wKSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChkZXAgPSBwcm9wLmRlcGVuZHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBjb21wdXRlZCBvYnNlcnZhYmxlLiBXZSB3aWxsIG9ic2VydmUgYW55IGRlY2xhcmVkIGRlcGVuZGVuY2llc1xuXHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtvYmplY3RdLCByZXNvbHZlUGF0aE9iamVjdHMoZGVwLCBvYmplY3QsIGNhbGxiYWNrKSwgY2FsbGJhY2ssIGNvbnRleHRDYiwgdW5vYnNlcnZlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gcHJvcDtcblx0XHRcdFx0XHRcdFx0aWYgKHVub2JzZXJ2ZSAmJiBvYmplY3QgPT09IHJvb3QgJiYgKGk+bC0yIHx8IHBhdGhzW2krMV0gKyBcIlwiICE9PSBwYXRoc1tpKzFdKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIHVub2JzZXJ2ZSBhbGwgaGFuZGxlcnMgb2Ygb2JqZWN0LCBpZiBub3QgZm9sbG93ZWQgYnkgc3RyaW5nIHBhdGguXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZS5nLiQudW5vYnNlcnZlKG9iamVjdDEsIG9iamVjdDIsIFwicGF0aFwiLCBvYmplY3QzKSB3aWxsIHVub2JzZXJ2ZSBhbGwgZnJvbSBvYmplY3QxIGFuZCBvYmplY3QzLCBhbmQganVzdCBcInBhdGhcIiBsaXN0ZW5lciBmcm9tIG9iamVjdDJcblx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJpbmRBcnJheShvYmplY3QsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChjYklkKSB7XG5cdFx0XHRcdHJlbW92ZUNiQmluZGluZ3MoY2JCaW5kaW5ncywgY2JJZCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiB0aGUgY2JCaW5kaW5ncyB0byB0aGUgdG9wLWxldmVsIGNhbGxlciwgYWxvbmcgd2l0aCB0aGUgY2JJZFxuXHRcdFx0cmV0dXJuIHtjYklkOiBjYklkLCBibmQ6IGNiQmluZGluZ3N9O1xuXHRcdH1cblxuXHRcdHZhciBpbml0aWFsTnMsXG5cdFx0XHRhbGxvd0FycmF5ID0gdGhpcyAhPSBmYWxzZSwgLy8gSWYgdGhpcyA9PT0gZmFsc2UsIHRoaXMgaXMgYSBjYWxsIGZyb20gb2JzZXJ2ZUFuZEJpbmQgLSBkb2luZyBiaW5kaW5nIG9mIGRhdGFsaW5rIGV4cHJlc3Npb25zLiBXZSBkb24ndCBiaW5kXG5cdFx0XHQvLyBhcnJheUNoYW5nZSBldmVudHMgaW4gdGhpcyBzY2VuYXJpby4gSW5zdGVhZCwge157Zm9yfX0gYW5kIHNpbWlsYXIgZG8gc3BlY2lmaWMgYXJyYXlDaGFuZ2UgYmluZGluZyB0byB0aGUgdGFnQ3R4LmFyZ3NbMF0gdmFsdWUsIGluIG9uQWZ0ZXJMaW5rLlxuXHRcdFx0Ly8gTm90ZSBkZWxpYmVyYXRlbHkgdXNpbmcgdGhpcyAhPSBmYWxzZSwgcmF0aGVyIHRoYW4gdGhpcyAhPT0gZmFsc2UgYmVjYXVzZSBvZiBJRTwxMCBidWctIHNlZSBqc3ZpZXdzL2lzc3Vlcy8yMzdcblx0XHRcdHBhdGhzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLFxuXHRcdFx0b3JpZ1Jvb3QgPSBwYXRoc1swXTtcblxuXHRcdGlmIChvcmlnUm9vdCArIFwiXCIgPT09IG9yaWdSb290ICYmIGFsbG93QXJyYXkpIHtcblx0XHRcdGluaXRpYWxOcyA9IG9yaWdSb290OyAvLyBUaGUgZmlyc3QgYXJnIGlzIGEgbmFtZXNwYWNlLCBzaW5jZSBpdCBpcyBhIHN0cmluZywgYW5kIHRoaXMgY2FsbCBpcyBub3QgZnJvbSBvYnNlcnZlQW5kQmluZFxuXHRcdFx0cGF0aHMuc2hpZnQoKTtcblx0XHRcdG9yaWdSb290ID0gcGF0aHNbMF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGlubmVyT2JzZXJ2ZS5hcHBseSgxLCBwYXRocyk7XG5cdH07XG5cblx0JG9ic2VydmFibGUgPSBmdW5jdGlvbihucywgZGF0YSkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRkYXRhID0gbnM7XG5cdFx0XHRucyA9IFwiXCI7XG5cdFx0fVxuXHRcdHJldHVybiAkaXNBcnJheShkYXRhKVxuXHRcdFx0PyBuZXcgQXJyYXlPYnNlcnZhYmxlKG5zLCBkYXRhKVxuXHRcdFx0OiBuZXcgT2JqZWN0T2JzZXJ2YWJsZShucywgZGF0YSk7XG5cdH07XG5cblx0Ly89PT09PT09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0JHN1Yi5nZXREZXBzID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGFyZywgZGVwLFxuXHRcdFx0XHRkZXBzID0gW10sXG5cdFx0XHRcdGwgPSBhcmdzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0YXJnID0gYXJnc1tsLS1dO1xuXHRcdFx0XHRkZXAgPSBhcmdzW2xdO1xuXHRcdFx0XHRpZiAoZGVwKSB7XG5cdFx0XHRcdFx0ZGVwcyA9IGRlcHMuY29uY2F0KCRpc0Z1bmN0aW9uKGRlcCkgPyBkZXAoYXJnLCBhcmcpIDogZGVwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGRlcHM7XG5cdFx0fTtcblx0fTtcblxuXHQkLm9ic2VydmFibGUgPSAkb2JzZXJ2YWJsZTtcblx0JG9ic2VydmFibGUuX2ZsdHIgPSBmdW5jdGlvbihhbGxQYXRoLCBvYmplY3QsIHBhcmVudE9icywgZmlsdGVyKSB7XG5cdFx0aWYgKGZpbHRlciAmJiAkaXNGdW5jdGlvbihmaWx0ZXIpXG5cdFx0XHQ/IGZpbHRlcihhbGxQYXRoLCBvYmplY3QsIHBhcmVudE9icylcblx0XHRcdDogdHJ1ZSAvLyBUT0RPIENvbnNpZGVyIHN1cHBvcnRpbmcgZmlsdGVyIGJlaW5nIGEgc3RyaW5nIG9yIHN0cmluZ3MgdG8gZG8gUmVnRXggZmlsdGVyaW5nIGJhc2VkIG9uIGtleSBhbmQvb3IgYWxsUGF0aFxuXHRcdCkge1xuXHRcdFx0b2JqZWN0ID0gJGlzRnVuY3Rpb24ob2JqZWN0KVxuXHRcdFx0XHQ/IG9iamVjdC5zZXQgJiYgb2JqZWN0LmNhbGwocGFyZW50T2JzWzBdKSAvLyBJdCBpcyBhIGdldHRlci9zZXR0ZXJcblx0XHRcdFx0OiBvYmplY3Q7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gT0JKRUNUICYmIG9iamVjdDtcblx0XHR9XG5cdH07XG5cblx0JG9ic2VydmFibGUuT2JqZWN0ID0gT2JqZWN0T2JzZXJ2YWJsZTtcblx0JG9ic2VydmFibGUuQXJyYXkgPSBBcnJheU9ic2VydmFibGU7XG5cdCQub2JzZXJ2ZSA9ICRvYnNlcnZhYmxlLm9ic2VydmUgPSAkb2JzZXJ2ZTtcblx0JC51bm9ic2VydmUgPSAkb2JzZXJ2YWJsZS51bm9ic2VydmUgPSAkdW5vYnNlcnZlO1xuXHQkb2JzZXJ2YWJsZS5fYXBwbHkgPSBvYnNlcnZlX2FwcGx5O1xuXG5cdE9iamVjdE9ic2VydmFibGUucHJvdG90eXBlID0ge1xuXHRcdF9kYXRhOiBudWxsLFxuXG5cdFx0b2JzZXJ2ZUFsbDogJG9ic2VydmVBbGwsXG5cdFx0dW5vYnNlcnZlQWxsOiAkdW5vYnNlcnZlQWxsLFxuXG5cdFx0ZGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZGF0YTtcblx0XHR9LFxuXG5cdFx0c2V0UHJvcGVydHk6IGZ1bmN0aW9uKHBhdGgsIHZhbHVlLCBub25TdHJpY3QpIHtcblx0XHRcdHBhdGggPSBwYXRoIHx8IFwiXCI7XG5cdFx0XHR2YXIga2V5LCBwYWlyLCBwYXJ0cyxcblx0XHRcdFx0bXVsdGkgPSBwYXRoICsgXCJcIiAhPT0gcGF0aCxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdG9iamVjdCA9IHNlbGYuX2RhdGE7XG5cblx0XHRcdGlmIChvYmplY3QpIHtcblx0XHRcdFx0aWYgKG11bHRpKSB7XG5cdFx0XHRcdFx0bm9uU3RyaWN0ID0gdmFsdWU7XG5cdFx0XHRcdFx0aWYgKCRpc0FycmF5KHBhdGgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIHRoZSBhcnJheSBmb3JtYXQgZ2VuZXJhdGVkIGJ5IHNlcmlhbGl6ZUFycmF5LiBIb3dldmVyLCB0aGlzIGhhcyB0aGUgcHJvYmxlbSB0aGF0IGl0IGNvZXJjZXMgdHlwZXMgdG8gc3RyaW5nLFxuXHRcdFx0XHRcdFx0Ly8gYW5kIGRvZXMgbm90IHByb3ZpZGUgc2ltcGxlIHN1cHBvcnQgb2YgY29udmVydFRvIGFuZCBjb252ZXJ0RnJvbSBmdW5jdGlvbnMuXG5cdFx0XHRcdFx0XHRrZXkgPSBwYXRoLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlIChrZXktLSkge1xuXHRcdFx0XHRcdFx0XHRwYWlyID0gcGF0aFtrZXldO1xuXHRcdFx0XHRcdFx0XHRzZWxmLnNldFByb3BlcnR5KHBhaXIubmFtZSwgcGFpci52YWx1ZSwgbm9uU3RyaWN0ID09PSB1bmRlZmluZWQgfHwgbm9uU3RyaWN0KTsgLy9JZiBub25TdHJpY3Qgbm90IHNwZWNpZmllZCwgZGVmYXVsdCB0byB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBPYmplY3QgcmVwcmVzZW50YXRpb24gd2hlcmUgcHJvcGVydHkgbmFtZSBpcyBwYXRoIGFuZCBwcm9wZXJ0eSB2YWx1ZSBpcyB2YWx1ZS5cblx0XHRcdFx0XHRcdGZvciAoa2V5IGluIHBhdGgpIHtcblx0XHRcdFx0XHRcdFx0c2VsZi5zZXRQcm9wZXJ0eShrZXksIHBhdGhba2V5XSwgbm9uU3RyaWN0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocGF0aCAhPT0gJGV4cGFuZG8pIHtcblx0XHRcdFx0XHQvLyBTaW1wbGUgc2luZ2xlIHByb3BlcnR5IGNhc2UuXG5cdFx0XHRcdFx0cGFydHMgPSBwYXRoLnNwbGl0KC9bLl5dLyk7XG5cdFx0XHRcdFx0d2hpbGUgKG9iamVjdCAmJiBwYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRvYmplY3QgPSBvYmplY3RbcGFydHMuc2hpZnQoKV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvYmplY3QpIHtcblx0XHRcdFx0XHRcdHNlbGYuX3NldFByb3BlcnR5KG9iamVjdCwgcGFydHNbMF0sIHZhbHVlLCBub25TdHJpY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNlbGY7XG5cdFx0fSxcblxuXHRcdHJlbW92ZVByb3BlcnR5OiBmdW5jdGlvbihwYXRoKSB7XG5cdFx0XHR0aGlzLnNldFByb3BlcnR5KHBhdGgsIHJlbW92ZSk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X3NldFByb3BlcnR5OiBmdW5jdGlvbihsZWFmLCBwYXRoLCB2YWx1ZSwgbm9uU3RyaWN0KSB7XG5cdFx0XHR2YXIgc2V0dGVyLCBnZXR0ZXIsIHJlbW92ZVByb3AsXG5cdFx0XHRcdHByb3BlcnR5ID0gcGF0aCA/IGxlYWZbcGF0aF0gOiBsZWFmO1xuXG5cdFx0XHRpZiAoJGlzRnVuY3Rpb24ocHJvcGVydHkpKSB7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eS5zZXQpIHtcblx0XHRcdFx0XHQvLyBDYXNlIG9mIHByb3BlcnR5IHNldHRlci9nZXR0ZXIgLSB3aXRoIGNvbnZlbnRpb24gdGhhdCBwcm9wZXJ0eSBpcyBnZXR0ZXIgYW5kIHByb3BlcnR5LnNldCBpcyBzZXR0ZXJcblx0XHRcdFx0XHRsZWFmID0gbGVhZi5fd3JwICAvLyBDYXNlIG9mIEpzVmlld3MgMi13YXkgZGF0YS1saW5raW5nIHRvIGEgaGVscGVyIGZ1bmN0aW9uIGFzIGdldHRlciwgd2l0aCBhIHNldHRlci5cblx0XHRcdFx0XHRcdC8vIFRoZSB2aWV3IHdpbGwgYmUgdGhlIHRoaXMgcG9pbnRlciBmb3IgZ2V0dGVyIGFuZCBzZXR0ZXIuIE5vdGU6IHRoaXMgaXMgdGhlIG9uZSBzY2VuYXJpbyB3aGVyZSBwYXRoIGlzIFwiXCIuXG5cdFx0XHRcdFx0XHR8fCBsZWFmO1xuXHRcdFx0XHRcdGdldHRlciA9IHByb3BlcnR5O1xuXHRcdFx0XHRcdHNldHRlciA9IGdldHRlci5zZXQgPT09IHRydWUgPyBnZXR0ZXIgOiBnZXR0ZXIuc2V0O1xuXHRcdFx0XHRcdHByb3BlcnR5ID0gZ2V0dGVyLmNhbGwobGVhZik7IC8vIGdldCAtIG9ubHkgdHJlYXRlZCBhcyBnZXR0ZXIgaWYgYWxzbyBhIHNldHRlci4gT3RoZXJ3aXNlIGl0IGlzIHNpbXBseSBhIHByb3BlcnR5IG9mIHR5cGUgZnVuY3Rpb24uIFNlZSB1bml0IHRlc3RzICdDYW4gb2JzZXJ2ZSBwcm9wZXJ0aWVzIG9mIHR5cGUgZnVuY3Rpb24nLlxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcm9wZXJ0eSAhPT0gdmFsdWUgfHwgbm9uU3RyaWN0ICYmIHByb3BlcnR5ICE9IHZhbHVlKSB7IC8vIE9wdGlvbmFsIG5vbi1zdHJpY3QgZXF1YWxpdHksIHNpbmNlIHNlcmlhbGl6ZUFycmF5LCBhbmQgZm9ybS1iYXNlZCBlZGl0b3JzIGNhbiBtYXAgbnVtYmVycyB0byBzdHJpbmdzLCBldGMuXG5cdFx0XHRcdC8vIERhdGUgb2JqZWN0cyBkb24ndCBzdXBwb3J0ICE9IGNvbXBhcmlzb24uIFRyZWF0IGFzIHNwZWNpYWwgY2FzZS5cblx0XHRcdFx0aWYgKCEocHJvcGVydHkgaW5zdGFuY2VvZiBEYXRlKSB8fCBwcm9wZXJ0eSA+IHZhbHVlIHx8IHByb3BlcnR5IDwgdmFsdWUpIHtcblx0XHRcdFx0XHRpZiAoc2V0dGVyKSB7XG5cdFx0XHRcdFx0XHRzZXR0ZXIuY2FsbChsZWFmLCB2YWx1ZSk7ICAgLy9zZXRcblx0XHRcdFx0XHRcdHZhbHVlID0gZ2V0dGVyLmNhbGwobGVhZik7ICAvL2dldCB1cGRhdGVkIHZhbHVlXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChyZW1vdmVQcm9wID0gdmFsdWUgPT09IHJlbW92ZSkge1xuXHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGxlYWZbcGF0aF07XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cGF0aCA9IHVuZGVmaW5lZDsgLy8gSWYgdmFsdWUgd2FzIGFscmVhZHkgdW5kZWZpbmVkLCBkb24ndCB0cmlnZ2VyIGhhbmRsZXIgZm9yIHJlbW92ZVByb3Bcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhdGgpIHtcblx0XHRcdFx0XHRcdGxlYWZbcGF0aF0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHBhdGgpIHtcblx0XHRcdFx0XHRcdHRoaXMuX3RyaWdnZXIobGVhZiwge2NoYW5nZTogXCJzZXRcIiwgcGF0aDogcGF0aCwgdmFsdWU6IHZhbHVlLCBvbGRWYWx1ZTogcHJvcGVydHksIHJlbW92ZTogcmVtb3ZlUHJvcH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRfdHJpZ2dlcjogZnVuY3Rpb24odGFyZ2V0LCBldmVudEFyZ3MpIHtcblx0XHRcdCQodGFyZ2V0KS50cmlnZ2VySGFuZGxlcihwcm9wZXJ0eUNoYW5nZVN0ciArICh0aGlzLl9ucyA/IFwiLlwiICsgL15cXFMrLy5leGVjKHRoaXMuX25zKVswXSA6IFwiXCIpLCBldmVudEFyZ3MpOyAvLyBJZiB3aGl0ZS1zcGFjZSBzZXBhcmF0ZWQgbmFtZXNwYWNlcywgdXNlIGZpcnN0IG9uZSBvbmx5XG5cdFx0fVxuXHR9O1xuXG5cdEFycmF5T2JzZXJ2YWJsZS5wcm90b3R5cGUgPSB7XG5cdFx0X2RhdGE6IG51bGwsXG5cblx0XHRvYnNlcnZlQWxsOiAkb2JzZXJ2ZUFsbCxcblx0XHR1bm9ic2VydmVBbGw6ICR1bm9ic2VydmVBbGwsXG5cblx0XHRkYXRhOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9kYXRhO1xuXHRcdH0sXG5cblx0XHRpbnNlcnQ6IGZ1bmN0aW9uKGluZGV4LCBkYXRhKSB7XG5cdFx0XHR2YXIgX2RhdGEgPSB0aGlzLl9kYXRhO1xuXHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0ZGF0YSA9IGluZGV4O1xuXHRcdFx0XHRpbmRleCA9IF9kYXRhLmxlbmd0aDtcblx0XHRcdH1cblx0XHRcdGluZGV4ID0gUEFSU0VJTlQoaW5kZXgpO1xuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0ZGF0YSA9ICRpc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXTtcblx0XHRcdFx0Ly8gZGF0YSBjYW4gYmUgYSBzaW5nbGUgaXRlbSAoaW5jbHVkaW5nIGEgbnVsbC91bmRlZmluZWQgdmFsdWUpIG9yIGFuIGFycmF5IG9mIGl0ZW1zLlxuXHRcdFx0XHQvLyBOb3RlIHRoZSBwcm92aWRlZCBpdGVtcyBhcmUgaW5zZXJ0ZWQgd2l0aG91dCBiZWluZyBjbG9uZWQsIGFzIGRpcmVjdCByZWZlcmVuY2VzIHRvIHRoZSBwcm92aWRlZCBvYmplY3RzXG5cblx0XHRcdFx0aWYgKGRhdGEubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGhpcy5faW5zZXJ0KGluZGV4LCBkYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblxuXHRcdF9pbnNlcnQ6IGZ1bmN0aW9uKGluZGV4LCBkYXRhKSB7XG5cdFx0XHR2YXIgX2RhdGEgPSB0aGlzLl9kYXRhLFxuXHRcdFx0XHRvbGRMZW5ndGggPSBfZGF0YS5sZW5ndGg7XG5cdFx0XHRpZiAoaW5kZXggPiBvbGRMZW5ndGgpIHtcblx0XHRcdFx0aW5kZXggPSBvbGRMZW5ndGg7XG5cdFx0XHR9XG5cdFx0XHRzcGxpY2UuYXBwbHkoX2RhdGEsIFtpbmRleCwgMF0uY29uY2F0KGRhdGEpKTtcblx0XHRcdHRoaXMuX3RyaWdnZXIoe2NoYW5nZTogXCJpbnNlcnRcIiwgaW5kZXg6IGluZGV4LCBpdGVtczogZGF0YX0sIG9sZExlbmd0aCk7XG5cdFx0fSxcblxuXHRcdHJlbW92ZTogZnVuY3Rpb24oaW5kZXgsIG51bVRvUmVtb3ZlKSB7XG5cdFx0XHR2YXIgaXRlbXMsXG5cdFx0XHRcdF9kYXRhID0gdGhpcy5fZGF0YTtcblxuXHRcdFx0aWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aW5kZXggPSBfZGF0YS5sZW5ndGggLSAxO1xuXHRcdFx0fVxuXG5cdFx0XHRpbmRleCA9IFBBUlNFSU5UKGluZGV4KTtcblx0XHRcdG51bVRvUmVtb3ZlID0gbnVtVG9SZW1vdmUgPyBQQVJTRUlOVChudW1Ub1JlbW92ZSkgOiBudW1Ub1JlbW92ZSA9PT0gMCA/IDAgOiAxOyAvLyBpZiBudWxsIG9yIHVuZGVmaW5lZDogcmVtb3ZlIDFcblx0XHRcdGlmIChudW1Ub1JlbW92ZSA+IDAgJiYgaW5kZXggPiAtMSkge1xuXHRcdFx0XHRpdGVtcyA9IF9kYXRhLnNsaWNlKGluZGV4LCBpbmRleCArIG51bVRvUmVtb3ZlKTtcblx0XHRcdFx0aWYgKG51bVRvUmVtb3ZlID0gaXRlbXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlKGluZGV4LCBudW1Ub1JlbW92ZSwgaXRlbXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X3JlbW92ZTogZnVuY3Rpb24oaW5kZXgsIG51bVRvUmVtb3ZlLCBpdGVtcykge1xuXHRcdFx0dmFyIF9kYXRhID0gdGhpcy5fZGF0YSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gX2RhdGEubGVuZ3RoO1xuXG5cdFx0XHRfZGF0YS5zcGxpY2UoaW5kZXgsIG51bVRvUmVtb3ZlKTtcblx0XHRcdHRoaXMuX3RyaWdnZXIoe2NoYW5nZTogXCJyZW1vdmVcIiwgaW5kZXg6IGluZGV4LCBpdGVtczogaXRlbXN9LCBvbGRMZW5ndGgpO1xuXHRcdH0sXG5cblx0XHRtb3ZlOiBmdW5jdGlvbihvbGRJbmRleCwgbmV3SW5kZXgsIG51bVRvTW92ZSkge1xuXHRcdFx0bnVtVG9Nb3ZlID0gbnVtVG9Nb3ZlID8gUEFSU0VJTlQobnVtVG9Nb3ZlKSA6IG51bVRvTW92ZSA9PT0gMCA/IDAgOiAxOyAvLyBpZiBudWxsIG9yIHVuZGVmaW5lZDogbW92ZSAxXG5cdFx0XHRvbGRJbmRleCA9IFBBUlNFSU5UKG9sZEluZGV4KTtcblx0XHRcdG5ld0luZGV4ID0gUEFSU0VJTlQobmV3SW5kZXgpO1xuXG5cdFx0XHRpZiAobnVtVG9Nb3ZlID4gMCAmJiBvbGRJbmRleCA+IC0xICYmIG5ld0luZGV4ID4gLTEgJiYgb2xkSW5kZXggIT09IG5ld0luZGV4KSB7XG5cdFx0XHRcdHRoaXMuX21vdmUob2xkSW5kZXgsIG5ld0luZGV4LCBudW1Ub01vdmUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblxuXHRcdF9tb3ZlOiBmdW5jdGlvbihvbGRJbmRleCwgbmV3SW5kZXgsIG51bVRvTW92ZSkge1xuXHRcdFx0dmFyIGl0ZW1zLFxuXHRcdFx0XHRfZGF0YSA9IHRoaXMuX2RhdGEsXG5cdFx0XHRcdG9sZExlbmd0aCA9IF9kYXRhLmxlbmd0aCxcblx0XHRcdFx0ZXhjZXNzID0gb2xkSW5kZXggKyBudW1Ub01vdmUgLSBvbGRMZW5ndGg7XG5cdFx0XHRpZiAoZXhjZXNzID4gMCkge1xuXHRcdFx0XHRudW1Ub01vdmUgLT0gZXhjZXNzO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG51bVRvTW92ZSkge1xuXHRcdFx0XHRpdGVtcyA9IF9kYXRhLnNwbGljZShvbGRJbmRleCwgbnVtVG9Nb3ZlKTsgLy8gcmVtb3ZlXG5cdFx0XHRcdGlmIChuZXdJbmRleCA+IF9kYXRhLmxlbmd0aCkge1xuXHRcdFx0XHRcdG5ld0luZGV4ID0gX2RhdGEubGVuZ3RoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNwbGljZS5hcHBseShfZGF0YSwgW25ld0luZGV4LCAwXS5jb25jYXQoaXRlbXMpKTsgLy9yZS1pbnNlcnRcblx0XHRcdFx0dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiBcIm1vdmVcIiwgb2xkSW5kZXg6IG9sZEluZGV4LCBpbmRleDogbmV3SW5kZXgsIGl0ZW1zOiBpdGVtc30sIG9sZExlbmd0aCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHJlZnJlc2g6IGZ1bmN0aW9uKG5ld0l0ZW1zLCBzb3J0KSB7XG5cdFx0XHRmdW5jdGlvbiBpbnNlcnRBZGRlZCgpIHtcblx0XHRcdFx0aWYgKGspIHtcblx0XHRcdFx0XHRzZWxmLmluc2VydChqLWssIGFkZGVkSXRlbXMpOyAvLyBOb3QgZm91bmQgaW4gb3JpZ2luYWwgYXJyYXkgLSBzbyBpbnNlcnRcblx0XHRcdFx0XHRkYXRhTGVuZ3RoICs9IGs7XG5cdFx0XHRcdFx0aSArPSBrO1xuXHRcdFx0XHRcdGsgPSAwO1xuXHRcdFx0XHRcdGFkZGVkSXRlbXMgPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgcmVmcmVzaCBvcGVyYXRpb24gd2UgaXRlcmF0aXZlbHkgc3RlcCB0aHJvdWdoIHRoZSB0YXJnZXQgYXJyYXkgYW5kIHNvcnQgYnkgbW92ZS9hZGQvcmVtb3ZlIG9wZXJhdGlvbnMgb24gdGhlIHNvdXJjZSBhcnJheSB1bnRpbCB0aGV5IG1hdGNoXG5cdFx0XHR2YXIgaSwgaiwgaywgbmV3SXRlbSwgbnVtLFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0YWRkZWRJdGVtcyA9IFtdLFxuXHRcdFx0XHRkYXRhID0gc2VsZi5fZGF0YSxcblx0XHRcdFx0b2xkSXRlbXMgPSBkYXRhLnNsaWNlKCksXG5cdFx0XHRcdG9sZExlbmd0aCA9IGRhdGEubGVuZ3RoLFxuXHRcdFx0XHRkYXRhTGVuZ3RoID0gb2xkTGVuZ3RoLFxuXHRcdFx0XHRuZXdMZW5ndGggPSBuZXdJdGVtcy5sZW5ndGg7XG5cdFx0XHRzZWxmLl9zcnQgPSB0cnVlOyAvLyBGbGFnIGZvciBzb3J0aW5nIGR1cmluZyByZWZyZXNoXG5cdFx0XHRmb3IgKGo9az0wOyBqPG5ld0xlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGlmICgobmV3SXRlbSA9IG5ld0l0ZW1zW2pdKSA9PT0gZGF0YVtqLWtdKSB7XG5cdFx0XHRcdFx0XHRpbnNlcnRBZGRlZCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoaT1qLWs7IGk8ZGF0YUxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRpZiAobmV3SXRlbSA9PT0gZGF0YVtpXSkge1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGk8ZGF0YUxlbmd0aCkge1xuXHRcdFx0XHRcdFx0aW5zZXJ0QWRkZWQoKTtcblx0XHRcdFx0XHRcdG51bSA9IDA7XG5cdFx0XHRcdFx0XHR3aGlsZSAobnVtKysgPCBuZXdMZW5ndGgtaSAmJiBuZXdJdGVtc1tqK251bV0gPT09IGRhdGFbaStudW1dKTtcblx0XHRcdFx0XHRcdHNlbGYubW92ZShpLCBqLCBudW0pOyAvLyBGb3VuZCBuZXdJdGVtIGluIG9yaWdpbmFsIGFycmF5IC0gc28gbW92ZSBpdCB0byBuZXcgcG9zaXRpb25cblx0XHRcdFx0XHRcdGogKz0gbnVtIC0gMTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aysrO1xuXHRcdFx0XHRcdFx0YWRkZWRJdGVtcy5wdXNoKG5ld0l0ZW0pOyAvLyBOb3QgZm91bmQgaW4gb3JpZ2luYWwgYXJyYXkgLSBzbyBpbnNlcnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGluc2VydEFkZGVkKCk7XG5cdFx0XHRpZiAoZGF0YUxlbmd0aCA+IGopIHtcblx0XHRcdFx0c2VsZi5yZW1vdmUoaiwgZGF0YUxlbmd0aCAtIGopO1xuXHRcdFx0fVxuXHRcdFx0c2VsZi5fc3J0ID0gdW5kZWZpbmVkOyAvLyBXZSBoYXZlIGZpbmlzaGVkIHNvcnQgb3BlcmF0aW9ucyBkdXJpbmcgcmVmcmVzaFxuXHRcdFx0c2VsZi5fdHJpZ2dlcih7Y2hhbmdlOiBcInJlZnJlc2hcIiwgb2xkSXRlbXM6IG9sZEl0ZW1zfSwgb2xkTGVuZ3RoKTtcblx0XHRcdHJldHVybiBzZWxmO1xuXHRcdH0sXG5cblx0XHRfdHJpZ2dlcjogZnVuY3Rpb24oZXZlbnRBcmdzLCBvbGRMZW5ndGgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0X2RhdGEgPSBzZWxmLl9kYXRhLFxuXHRcdFx0XHRsZW5ndGggPSBfZGF0YS5sZW5ndGgsXG5cdFx0XHRcdCRfZGF0YSA9ICQoW19kYXRhXSk7XG5cdFx0XHRpZiAoc2VsZi5fc3J0KSB7XG5cdFx0XHRcdGV2ZW50QXJncy5yZWZyZXNoID0gdHJ1ZTsgLy8gV2UgYXJlIHNvcnRpbmcgZHVyaW5nIHJlZnJlc2hcblx0XHRcdH0gZWxzZSBpZiAobGVuZ3RoICE9PSBvbGRMZW5ndGgpIHsgIC8vIFdlIGhhdmUgZmluaXNoZWQgc29ydCBvcGVyYXRpb25zIGR1cmluZyByZWZyZXNoXG5cdFx0XHRcdCRfZGF0YS50cmlnZ2VySGFuZGxlcihwcm9wZXJ0eUNoYW5nZVN0ciwge2NoYW5nZTogXCJzZXRcIiwgcGF0aDogXCJsZW5ndGhcIiwgdmFsdWU6IGxlbmd0aCwgb2xkVmFsdWU6IG9sZExlbmd0aH0pO1xuXHRcdFx0fVxuXHRcdFx0JF9kYXRhLnRyaWdnZXJIYW5kbGVyKGFycmF5Q2hhbmdlU3RyICsgKHNlbGYuX25zID8gXCIuXCIgKyAvXlxcUysvLmV4ZWMoc2VsZi5fbnMpWzBdIDogXCJcIiksIGV2ZW50QXJncyk7IC8vIElmIHdoaXRlLXNwYWNlIHNlcGFyYXRlZCBuYW1lc3BhY2VzLCB1c2UgZmlyc3Qgb25lIG9ubHlcblx0XHR9XG5cdH07XG5cblx0JGV2ZW50U3BlY2lhbFtwcm9wZXJ0eUNoYW5nZVN0cl0gPSAkZXZlbnRTcGVjaWFsW2FycmF5Q2hhbmdlU3RyXSA9IHtcblx0XHQvLyBSZWdpc3RlciBhIGpRdWVyeSBzcGVjaWFsICdyZW1vdmUnIGV2ZW50LCB0byBhY2Nlc3MgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGhhbmRsZXJzIGJlaW5nIHJlbW92ZWQgYnkgalF1ZXJ5Lm9mZigpLlxuXHRcdC8vIFdlIGdldCBkYXRhLmNiLl9jSWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlT2JqIGFuZCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgY2JCaW5kaW5ncyBoYXNoIGZyb20gdGhlIGNiQmluZGluZ3NTdG9yZSxcblx0XHQvLyB0aGVuIHJlbW92ZSB0aGlzIG9iamVjdCBmcm9tIHRoYXQgYmluZGluZ3MgaGFzaCAtIGlmIHRoZSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgaGFuZGxlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lIGNhbGxiYWNrLlxuXHRcdHJlbW92ZTogZnVuY3Rpb24gKGhhbmRsZU9iaikge1xuXHRcdFx0dmFyIGNiQmluZGluZ3MsIGZvdW5kLCBldmVudHMsIGwsIGRhdGEsXG5cdFx0XHRcdGV2RGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXHRcdFx0aWYgKChldkRhdGEpICYmIChldkRhdGEub2ZmID0gdHJ1ZSwgZXZEYXRhID0gZXZEYXRhLmNiKSkgeyAvL1NldCBvZmYgPSB0cnVlIGFzIG1hcmtlciBmb3IgZGlzcG9zZWQgZXZlbnRcblx0XHRcdFx0Ly8gR2V0IHRoZSBjYi5fY0lkIGZyb20gaGFuZGxlT2JqLmRhdGEuY2IuX2NJZFxuXHRcdFx0XHRpZiAoY2JCaW5kaW5ncyA9IGNiQmluZGluZ3NTdG9yZVtldkRhdGEuX2NJZF0pIHtcblx0XHRcdFx0XHQvLyBUaGVyZSB3ZXJlIGJpbmRpbmdzIGZvciB0aGlzIGNhbGxiYWNrLiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBvbmUsIHdlJ2xsIHJlbW92ZSBpdC5cblx0XHRcdFx0XHRldmVudHMgPSAkLl9kYXRhKHRoaXMpLmV2ZW50c1toYW5kbGVPYmoudHlwZV07XG5cdFx0XHRcdFx0bCA9IGV2ZW50cy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKGwtLSAmJiAhZm91bmQpIHtcblx0XHRcdFx0XHRcdGZvdW5kID0gKGRhdGEgPSBldmVudHNbbF0uZGF0YSkgJiYgZGF0YS5jYiAmJiBkYXRhLmNiLl9jSWQgPT09IGV2RGF0YS5fY0lkO1xuXHRcdFx0XHRcdFx0Ly8gRm91bmQgYW5vdGhlciBvbmUgd2l0aCBzYW1lIGNhbGxiYWNrICh0aG91Z2ggbWF5IGJlIGEgZGlmZmVyZW50IGlubmVyQ2FsbGJhY2spXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghZm91bmQpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgd2FzIHRoZSBsYXN0IGhhbmRsZXIgZm9yIHRoaXMgY2FsbGJhY2sgYW5kIG9iamVjdCwgc28gcmVtb3ZlIHRoZSBiaW5kaW5nIGVudHJ5XG5cdFx0XHRcdFx0XHRkZWxldGUgY2JCaW5kaW5nc1skZGF0YSh0aGlzKS5vYklkXTtcblx0XHRcdFx0XHRcdHJlbW92ZUNiQmluZGluZ3MoY2JCaW5kaW5ncywgZXZEYXRhLl9jSWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHQkdmlld3MubWFwID0gZnVuY3Rpb24obWFwRGVmKSB7XG5cdFx0ZnVuY3Rpb24gTWFwKHNvdXJjZSwgb3B0aW9ucywgdGFyZ2V0LCB1bmJvdW5kKSB7XG5cdFx0XHR2YXIgY2hhbmdpbmcsXG5cdFx0XHRcdG1hcCA9IHRoaXM7XG5cdFx0XHRpZiAodGhpcy5zcmMpIHtcblx0XHRcdFx0dGhpcy51bm1hcCgpOyAvLyBXZSBhcmUgcmUtbWFwcGluZyBhIG5ldyBzb3VyY2Vcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBPQkpFQ1QpIHtcblx0XHRcdFx0bWFwLnNyYyA9IHNvdXJjZTtcblx0XHRcdFx0bWFwLnRndCA9IHRhcmdldCB8fCBtYXAudGd0IHx8IFtdO1xuXHRcdFx0XHRtYXAub3B0aW9ucyA9IG9wdGlvbnMgfHwgbWFwLm9wdGlvbnM7XG5cdFx0XHRcdG1hcC51cGRhdGUoKTtcblx0XHRcdFx0aWYgKCF1bmJvdW5kKSB7XG5cdFx0XHRcdFx0aWYgKG1hcERlZi5vYnNTcmMpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC5zcmMpLm9ic2VydmVBbGwobWFwLm9icyA9IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MpIHtcblx0XHRcdFx0XHRcdFx0aWYgKCFjaGFuZ2luZykge1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5naW5nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRtYXBEZWYub2JzU3JjKG1hcCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sIG1hcC5zcmNGbHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobWFwRGVmLm9ic1RndCApIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC50Z3QpLm9ic2VydmVBbGwobWFwLm9idCA9IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MpIHtcblx0XHRcdFx0XHRcdGlmICghY2hhbmdpbmcpIHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRtYXBEZWYub2JzVGd0KG1hcCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0XHRcdGNoYW5naW5nID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgbWFwLnRndEZsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCRpc0Z1bmN0aW9uKG1hcERlZikpIHtcblx0XHRcdC8vIFNpbXBsZSBtYXAgZGVjbGFyZWQgYXMgZnVuY3Rpb25cblx0XHRcdG1hcERlZiA9IHtcblx0XHRcdFx0Z2V0VGd0OiBtYXBEZWZcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKG1hcERlZi5iYXNlTWFwKSB7XG5cdFx0XHRtYXBEZWYgPSAkLmV4dGVuZCh7fSwgbWFwRGVmLmJhc2VNYXAsIG1hcERlZik7XG5cdFx0fVxuXG5cdFx0bWFwRGVmLm1hcCA9IGZ1bmN0aW9uKHNvdXJjZSwgb3B0aW9ucywgdGFyZ2V0LCB1bmJvdW5kKSB7XG5cdFx0XHRyZXR1cm4gbmV3IE1hcChzb3VyY2UsIG9wdGlvbnMsIHRhcmdldCwgdW5ib3VuZCk7XG5cdFx0fTtcblxuXHRcdChNYXAucHJvdG90eXBlID0ge1xuXHRcdFx0c3JjRmx0OiBtYXBEZWYuc3JjRmx0IHx8IHNoYWxsb3dGaWx0ZXIsIC8vIGRlZmF1bHQgdG8gc2hhbGxvd0ZpbHRlclxuXHRcdFx0dGd0Rmx0OiBtYXBEZWYudGd0Rmx0IHx8IHNoYWxsb3dGaWx0ZXIsXG5cdFx0XHR1cGRhdGU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIG1hcCA9IHRoaXM7XG5cdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC50Z3QpLnJlZnJlc2gobWFwRGVmLmdldFRndChtYXAuc3JjLCBtYXAub3B0aW9ucyA9IG9wdGlvbnMgfHwgbWFwLm9wdGlvbnMpKTtcblx0XHRcdH0sXG5cdFx0XHR1bm1hcDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBtYXAgPSB0aGlzO1xuXHRcdFx0XHRpZiAobWFwLnNyYykge1xuXHRcdFx0XHRcdGlmIChtYXAub2JzKSB7XG5cdFx0XHRcdFx0XHQkb2JzZXJ2YWJsZShtYXAuc3JjKS51bm9ic2VydmVBbGwobWFwLm9icywgbWFwLnNyY0ZsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChtYXAub2J0KSB7XG5cdFx0XHRcdFx0XHQkb2JzZXJ2YWJsZShtYXAudGd0KS51bm9ic2VydmVBbGwobWFwLm9idCwgbWFwLnRndEZsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1hcC5zcmMgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRtYXA6IE1hcCxcblx0XHRcdF9kZWY6IG1hcERlZlxuXHRcdH0pLmNvbnN0cnVjdG9yID0gTWFwO1xuXG5cdFx0cmV0dXJuIG1hcERlZjtcblx0fTtcblxuXHQkc3ViLmFkdlNldCA9IGZ1bmN0aW9uKCkgeyAvLyByZWZyZXNoIGFkdmFuY2VkIHNldHRpbmdzXG5cdFx0JHN1Yi5fZ2NjYiA9IHRoaXMuX2djY2I7IC8vIGdldENvbnRleHRDYWxsYmFjayBtZXRob2Rcblx0XHRnbG9iYWwuX2pzdiA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZC5fanN2XG5cdFx0XHQ/IHsgLy8gY3JlYXRlIGdsb2JhbCBfanN2LCBmb3IgYWNjZXNzaW5nIHZpZXdzLCBldGNcblx0XHRcdFx0XHRjYkJpbmRpbmdzOiBjYkJpbmRpbmdzU3RvcmVcblx0XHRcdFx0fVxuXHRcdFx0OiB1bmRlZmluZWQ7IC8vIEluIElFOCBjYW5ub3QgZG8gZGVsZXRlIGdsb2JhbC5fanN2XG5cdH07XG59XG5cbi8vPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IEpzVmlld3MgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4vKiBKc1ZpZXdzOlxuICogSW50ZXJhY3RpdmUgZGF0YS1kcml2ZW4gdmlld3MgdXNpbmcgdGVtcGxhdGVzIGFuZCBkYXRhLWxpbmtpbmcuXG4gKiBTZWUgaHR0cDovL3d3dy5qc3ZpZXdzLmNvbS8janN2aWV3cyBhbmQgaHR0cDovL2dpdGh1Yi5jb20vQm9yaXNNb29yZS9qc3ZpZXdzXG4gKiBDb3B5cmlnaHQgMjAxNiwgQm9yaXMgTW9vcmVcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCB2YXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiR2aWV3c1NldHRpbmdzID0gJHZpZXdzLnNldHRpbmdzO1xuJHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcbiRzdWJTZXR0aW5nc0FkdmFuY2VkID0gJHN1YlNldHRpbmdzLmFkdmFuY2VkO1xuJGNvbnZlcnRlcnMgPSAkdmlld3MuY29udmVydGVycztcbiQudGVtcGxhdGVzID0gJHRlbXBsYXRlcyA9ICR2aWV3cy50ZW1wbGF0ZXM7XG4kdGFncyA9ICR2aWV3cy50YWdzO1xuckZpcnN0RWxlbSA9IC88KD8hc2NyaXB0KShcXHcrKVs+XFxzXS87XG5cbmlmICgkLmxpbmspIHsgcmV0dXJuICQ7IH0gLy8gSnNWaWV3cyBpcyBhbHJlYWR5IGxvYWRlZFxuXG4kc3ViU2V0dGluZ3MudHJpZ2dlciA9IHRydWU7XG52YXIgYWN0aXZlQm9keSwgclRhZ0RhdGFsaW5rLCAkdmlldywgJHZpZXdzTGlua0F0dHIsIGxpbmtWaWV3c1NlbCwgd3JhcE1hcCwgdmlld1N0b3JlLCBvbGRBZHZTZXQsXG5cdGpzdkF0dHJTdHIgPSBcImRhdGEtanN2XCIsXG5cdGVsZW1lbnRDaGFuZ2VTdHIgPSBcImNoYW5nZS5qc3ZcIixcblx0b25CZWZvcmVDaGFuZ2VTdHIgPSBcIm9uQmVmb3JlQ2hhbmdlXCIsXG5cdG9uQWZ0ZXJDaGFuZ2VTdHIgPSBcIm9uQWZ0ZXJDaGFuZ2VcIixcblx0b25BZnRlckNyZWF0ZVN0ciA9IFwib25BZnRlckNyZWF0ZVwiLFxuXHRDSEVDS0VEID0gXCJjaGVja2VkXCIsXG5cdENIRUNLQk9YID0gXCJjaGVja2JveFwiLFxuXHRSQURJTyA9IFwicmFkaW9cIixcblx0Tk9ORSA9IFwibm9uZVwiLFxuXHRTQ1JJUFQgPSBcIlNDUklQVFwiLFxuXHRUUlVFID0gXCJ0cnVlXCIsXG5cdGNsb3NlU2NyaXB0ID0gJ1wiPjwvc2NyaXB0PicsXG5cdG9wZW5TY3JpcHQgPSAnPHNjcmlwdCB0eXBlPVwianN2Jyxcblx0ZGVmZXJBdHRyID0ganN2QXR0clN0ciArIFwiLWRmXCIsXG5cdGJpbmRFbHNTZWwgPSBcInNjcmlwdCxbXCIgKyBqc3ZBdHRyU3RyICsgXCJdXCIsXG5cdGZuU2V0dGVycyA9IHtcblx0XHR2YWx1ZTogXCJ2YWxcIixcblx0XHRpbnB1dDogXCJ2YWxcIixcblx0XHRodG1sOiBIVE1MLFxuXHRcdHRleHQ6IFwidGV4dFwiXG5cdH0sXG5cdHZhbHVlQmluZGluZyA9IHtmcm9tOiBcInZhbHVlXCIsIHRvOiBcInZhbHVlXCJ9LFxuXHRpc0NsZWFuQ2FsbCA9IDAsXG5cdG9sZENsZWFuRGF0YSA9ICQuY2xlYW5EYXRhLFxuXHRvbGRKc3ZEZWxpbWl0ZXJzID0gJHZpZXdzU2V0dGluZ3MuZGVsaW1pdGVycyxcblx0c2FmZUZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRxc2EgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yLFxuXG5cdC8vIGVsQ29udGVudCBtYXBzIHRhZ05hbWVzIHdoaWNoIGhhdmUgb25seSBlbGVtZW50IGNvbnRlbnQsIHNvIG1heSBub3Qgc3VwcG9ydCBzY3JpcHQgbm9kZXMuXG5cdGVsQ29udGVudCA9IHtvbDogMSwgdWw6IDEsIHRhYmxlOiAxLCB0Ym9keTogMSwgdGhlYWQ6IDEsIHRmb290OiAxLCB0cjogMSwgY29sZ3JvdXA6IDEsIGRsOiAxLCBzZWxlY3Q6IDEsIG9wdGdyb3VwOiAxLCBzdmc6IDEsIHN2Z19uczogMX0sXG5cdGJhZFBhcmVudCA9IHt0cjogXCJ0YWJsZVwifSxcblx0dm9pZEVsZW1zID0ge2JyOiAxLCBpbWc6IDEsIGlucHV0OiAxLCBocjogMSwgYXJlYTogMSwgYmFzZTogMSwgY29sOiAxLCBsaW5rOiAxLCBtZXRhOiAxLFxuXHRcdGNvbW1hbmQ6IDEsIGVtYmVkOiAxLCBrZXlnZW46IDEsIHBhcmFtOiAxLCBzb3VyY2U6IDEsIHRyYWNrOiAxLCB3YnI6IDF9LFxuXHRkaXNwbGF5U3R5bGVzID0ge30sXG5cdGJpbmRpbmdTdG9yZSA9IHt9LFxuXHRiaW5kaW5nS2V5ID0gMSxcblx0clZpZXdQYXRoID0gL14jKHZpZXdcXC4/KT8vLFxuXHRyQ29udmVydE1hcmtlcnMgPSAvKChcXC8+KXw8XFwvKFxcdyspPnwpKFxccyopKFsjXFwvXVxcZCsoPzpffChcXF4pKSlgKFxccyopKDxcXHcrKD89W1xcc1xcLz5dKSk/fFxccyooPzooPFxcdysoPz1bXFxzXFwvPl0pKXw8XFwvKFxcdyspPihcXHMqKXwoXFwvPilcXHMqfCg+KXwkKS9nLFxuXHRyT3BlblZpZXdNYXJrZXJzID0gLygjKSgpKFxcZCspKF8pL2csXG5cdHJPcGVuTWFya2VycyA9IC8oIykoKShcXGQrKShbX15dKS9nLFxuXHRyVmlld01hcmtlcnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShfKS9nLFxuXHRyT3BlblRhZ01hcmtlcnMgPSAvKCMpKCkoXFxkKykoXFxeKS9nLFxuXHRyTWFya2VyVG9rZW5zID0gLyg/OigjKXwoXFwvKSkoXFxkKykoW19eXSkoWy0rQFxcZF0rKT8vZyxcblx0clNwbGl0QmluZGluZ3MgPSAvJihcXGQrKVxcKz8vZyxcblx0Z2V0Q29tcHV0ZWRTdHlsZSA9IGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlO1xuXG4kb2JzZXJ2YWJsZSA9ICQub2JzZXJ2YWJsZTtcblxuaWYgKCEkb2JzZXJ2YWJsZSkge1xuXHQvLyBKc09ic2VydmFibGUgaXMgbm90IGxvYWRlZC5cblx0dGhyb3cgcmVxdWlyZXNTdHIgKyBcIkpzT2JzZXJ2YWJsZVwiOyAvLyBqcXVlcnkub2JzZXJ2YWJsZS5qcyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgSnNWaWV3c1xufVxuXG4kb2JzZXJ2ZSA9ICRvYnNlcnZhYmxlLm9ic2VydmU7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gRXZlbnQgaGFuZGxlcnNcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGVsZW1DaGFuZ2VIYW5kbGVyKGV2LCBwYXJhbXMsIHNvdXJjZVZhbHVlKSB7XG5cdHZhciBzZXR0ZXIsIGNhbmNlbCwgZnJvbUF0dHIsIGxpbmtDdHgsIGN2dEJhY2ssIGNudnROYW1lLCB0YXJnZXQsICRzb3VyY2UsIHZpZXcsIGJpbmRpbmcsXG5cdFx0b2xkTGlua0N0eCwgb25CZWZvcmVDaGFuZ2UsIG9uQWZ0ZXJDaGFuZ2UsIHRhZywgdG8sIGV2ZW50QXJncywgZXhwck9iLCBjb250ZXh0Q2IsXG5cdFx0c291cmNlID0gZXYudGFyZ2V0LFxuXHRcdGJpbmRpbmdzID0gc291cmNlLl9qc3ZCbmQ7XG5cblx0Ly8gX2pzdkJuZCBpcyBhIHN0cmluZyB3aXRoIHRoZSBzeW50YXg6IFwiJmJpbmRpbmdJZDEmYmluZGluZ0lkMlwiXG5cdHdoaWxlIChiaW5kaW5nID0gclNwbGl0QmluZGluZ3MuZXhlYyhiaW5kaW5ncykpIHtcblx0XHRpZiAoYmluZGluZyA9IGJpbmRpbmdTdG9yZVtiaW5kaW5nWzFdXSkge1xuXHRcdFx0aWYgKHRvID0gYmluZGluZy50bykge1xuXHRcdFx0XHQvLyBUaGUgYmluZGluZyBoYXMgYSAndG8nIGZpZWxkLCB3aGljaCBpcyBvZiB0aGUgZm9ybSBbW3RhcmdldE9iamVjdCwgdG9QYXRoXSwgY3Z0QmFja11cblx0XHRcdFx0bGlua0N0eCA9IGJpbmRpbmcubGlua0N0eDtcblx0XHRcdFx0dmlldyA9IGxpbmtDdHgudmlldztcblx0XHRcdFx0dGFnID0gbGlua0N0eC50YWcgfHwgdmlldy50YWc7XG5cdFx0XHRcdCRzb3VyY2UgPSAkKHNvdXJjZSk7XG5cdFx0XHRcdG9uQmVmb3JlQ2hhbmdlID0gdmlldy5obHAob25CZWZvcmVDaGFuZ2VTdHIpOyAvLyBUT0RPIENhbiB3ZSBvcHRpbWl6ZSB0aGlzIGFuZCBvdGhlciBpbnN0YW5jZXMgb2Ygc2FtZT9cblx0XHRcdFx0b25BZnRlckNoYW5nZSA9IHZpZXcuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpOyAvLyBUT0RPIENhbiB3ZSBvcHRpbWl6ZSB0aGlzIGFuZCBvdGhlciBpbnN0YW5jZXMgb2Ygc2FtZVxuXHRcdFx0XHRmcm9tQXR0ciA9IGRlZmF1bHRBdHRyKHNvdXJjZSk7XG5cdFx0XHRcdHNldHRlciA9IGZuU2V0dGVyc1tmcm9tQXR0cl07XG5cdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0c291cmNlVmFsdWUgPSAkaXNGdW5jdGlvbihmcm9tQXR0cilcblx0XHRcdFx0XHRcdD8gZnJvbUF0dHIoc291cmNlKVxuXHRcdFx0XHRcdFx0OiBzZXR0ZXJcblx0XHRcdFx0XHRcdFx0PyAkc291cmNlW3NldHRlcl0oKVxuXHRcdFx0XHRcdFx0XHQ6ICRzb3VyY2UuYXR0cihmcm9tQXR0cik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y252dE5hbWUgPSB0b1sxXTtcblx0XHRcdFx0dG8gPSB0b1swXTsgLy8gW29iamVjdCwgcGF0aF1cblx0XHRcdFx0dG8gPSB0byArIFwiXCIgPT09IHRvID8gW2xpbmtDdHguZGF0YSwgdG9dIDogdG87XG5cdFx0XHRcdGlmIChjbnZ0TmFtZSkge1xuXHRcdFx0XHRcdGlmICgkaXNGdW5jdGlvbihjbnZ0TmFtZSkpIHtcblx0XHRcdFx0XHRcdGN2dEJhY2sgPSBjbnZ0TmFtZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y3Z0QmFjayA9IHZpZXcuZ2V0UnNjKFwiY29udmVydGVyc1wiLCBjbnZ0TmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChsaW5rQ3R4LmVsZW0ubm9kZU5hbWUgPT09IFwiU0VMRUNUXCIpIHtcblx0XHRcdFx0XHRsaW5rQ3R4LmVsZW0uX2pzdlNlbCA9IHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWUgfHwgKGxpbmtDdHguZWxlbS5tdWx0aXBsZSA/IFtdIDogc291cmNlVmFsdWUpO1xuXHRcdFx0XHRcdC8vIGRhdGEtbGluayA8c2VsZWN0PiB0byBzdHJpbmcgb3IgKG11bHRpc2VsZWN0KSBhcnJheSBvZiBzdHJpbmdzXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGN2dEJhY2spIHtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGN2dEJhY2suY2FsbCh0YWcsIHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHRcdFx0XHRvbGRMaW5rQ3R4ID0gdmlldy5saW5rQ3R4O1xuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0XHRldmVudEFyZ3MgPSB7XG5cdFx0XHRcdFx0Y2hhbmdlOiBcImNoYW5nZVwiLFxuXHRcdFx0XHRcdG9sZFZhbHVlOiBsaW5rQ3R4Ll92YWwsXG5cdFx0XHRcdFx0dmFsdWU6IHNvdXJjZVZhbHVlXG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmICgoIW9uQmVmb3JlQ2hhbmdlIHx8ICEoY2FuY2VsID0gb25CZWZvcmVDaGFuZ2UuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKSAmJlxuXHRcdFx0XHRcdFx0KCF0YWcgfHwgIXRhZy5vbkJlZm9yZUNoYW5nZSB8fCAhKGNhbmNlbCA9IHRhZy5vbkJlZm9yZUNoYW5nZShldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKSAmJlxuXHRcdFx0XHRcdFx0c291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRhcmdldCA9IHRvWzBdOyAvLyBbb2JqZWN0LCBwYXRoXVxuXHRcdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCkge1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHRDYiA9IGxpbmtDdHguX2N0eENiOyAvLyBUaGlzIGlzIGEgY29tcHV0ZWQgdmFsdWVcblx0XHRcdFx0XHRcdFx0ZXhwck9iID0gdGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQgPSBsaW5rQ3R4LmRhdGE7XG5cdFx0XHRcdFx0XHRcdGlmIChleHByT2IuX2NwQ3R4KSB7IC8vIENvbXB1dGVkIHZhbHVlIGZvciBhIGNvbnRleHR1YWwgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gZXhwck9iLmRhdGE7IC8vIFRoZSBkYXRhIGZvciB0aGUgY29udGV4dHVhbCB2aWV3ICh3aGVyZSBjb250ZXh0dWFsIHBhcmFtIGV4cHJlc3Npb24gZXZhbHVhdGVkL2Fzc2lnbmVkKVxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRDYiA9IGV4cHJPYi5fY3BDdHg7IC8vIENvbnRleHQgY2FsbGJhY2sgZm9yIGNvbnRleHR1YWwgdmlld1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHdoaWxlIChleHByT2IgJiYgZXhwck9iLnNiKSB7IC8vIFN0ZXAgdGhyb3VnaCBjaGFpbmVkIGNvbXB1dGVkIHZhbHVlcyB0byBsZWFmIG9uZS4uLlxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldCA9IGNvbnRleHRDYihleHByT2IsIHRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwck9iID0gZXhwck9iLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5fLmNoZ2luZyA9IHRydWU7IC8vIG1hcmtlciB0byBwcmV2ZW50IHRhZyBjaGFuZ2UgZXZlbnQgdHJpZ2dlcmluZyBpdHMgb3duIHJlZnJlc2hcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldCkuc2V0UHJvcGVydHkodG9bMV0sIHNvdXJjZVZhbHVlKTsgLy8gMndheSBiaW5kaW5nIGNoYW5nZSBldmVudCAtIG9ic2VydmFibHkgdXBkYXRpbmcgYm91bmQgb2JqZWN0XG5cdFx0XHRcdFx0XHRpZiAob25BZnRlckNoYW5nZSkge1xuXHRcdFx0XHRcdFx0XHRvbkFmdGVyQ2hhbmdlLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0YWcub25BZnRlckNoYW5nZSkge1xuXHRcdFx0XHRcdFx0XHRcdHRhZy5vbkFmdGVyQ2hhbmdlKGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRhZy5fLmNoZ2luZyA9IHVuZGVmaW5lZDsgLy8gY2xlYXIgdGhlIG1hcmtlclxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bGlua0N0eC5fdmFsID0gc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q2hhbmdlSGFuZGxlcihldiwgZXZlbnRBcmdzLCBsaW5rRm4pIHtcblx0dmFyIGF0dHIsIHNvdXJjZVZhbHVlLCBub1VwZGF0ZSwgZm9yY2VVcGRhdGUsIGhhc0Vycm9yLCBvbkVycm9yLFxuXHRcdGxpbmtDdHggPSB0aGlzLFxuXHRcdHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdHNvdXJjZSA9IGxpbmtDdHguZGF0YSxcblx0XHR0YXJnZXQgPSBsaW5rQ3R4LmVsZW0sXG5cdFx0Y3Z0ID0gbGlua0N0eC5jb252ZXJ0LFxuXHRcdHBhcmVudEVsZW0gPSB0YXJnZXQucGFyZW50Tm9kZSxcblx0XHR2aWV3ID0gbGlua0N0eC52aWV3LFxuXHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHgsXG5cdFx0b25FdmVudCA9IHZpZXcuaGxwKG9uQmVmb3JlQ2hhbmdlU3RyKTtcblxuXHQvLyBTZXQgbGlua0N0eCBvbiB2aWV3LCBkeW5hbWljYWxseSwganVzdCBkdXJpbmcgdGhpcyBoYW5kbGVyIGNhbGxcblx0dmlldy5saW5rQ3R4ID0gbGlua0N0eDtcblxuXHRpZiAocGFyZW50RWxlbSAmJiAoIW9uRXZlbnQgfHwgIShldmVudEFyZ3MgJiYgb25FdmVudC5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpID09PSBmYWxzZSkpXG5cdFx0XHQvLyBJZiBkYXRhIGNoYW5nZWQsIHRoZSBldi5kYXRhIGlzIHNldCB0byBiZSB0aGUgcGF0aC4gVXNlIHRoYXQgdG8gZmlsdGVyIHRoZSBoYW5kbGVyIGFjdGlvbi4uLlxuXHRcdFx0JiYgIShldmVudEFyZ3MgJiYgZXYuZGF0YS5wcm9wICE9PSBcIipcIiAmJiBldi5kYXRhLnByb3AgIT09IGV2ZW50QXJncy5wYXRoKSkge1xuXG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0bGlua0N0eC5ldmVudEFyZ3MgPSBldmVudEFyZ3M7XG5cdFx0fVxuXHRcdGlmIChldmVudEFyZ3MgfHwgbGlua0N0eC5fdG9Maykge1xuXHRcdFx0Ly8gSWYgZXZlbnRBcmdzIGFyZSBkZWZpbmVkLCB0aGlzIGlzIGEgZGF0YSB1cGRhdGVcblx0XHRcdC8vIE90aGVyd2lzZSB0aGlzIGlzIHRoZSBpbml0aWFsIGRhdGEtbGluayByZW5kZXJpbmcgY2FsbC4gQmluZCBvbiB0aGlzIHRoZSBmaXJzdCB0aW1lIGl0IGdldCBjYWxsZWRcblx0XHRcdGxpbmtDdHguX3RvTGsgPSAwOyAvLyBSZW1vdmUgZmxhZyB0byBza2lwIHVubmVjY2Vzc2FyeSByZWJpbmRpbmcgbmV4dCB0aW1lXG5cdFx0XHRpZiAobGlua0ZuLl9lcikge1xuXHRcdFx0XHQvLyBkYXRhLWxpbms9XCJleHByVXNpbmdUYWdPckN2dCB3aXRoIG9uZXJyb3I9Li4uXCIgLSBlLmcuIHt0YWcgLi4uIHtjdnQ6Li4uIHs6Li4uIGNvbnZlcnQ9J2N2dCdcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGxpbmtGbihzb3VyY2UsIHZpZXcpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0aGFzRXJyb3IgPSBsaW5rRm4uX2VyO1xuXHRcdFx0XHRcdG9uRXJyb3IgPSBvblJlbmRlckVycm9yKGUsdmlldywobmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3XCIsIFwicmV0dXJuIFwiICsgaGFzRXJyb3IgKyBcIjtcIikpKHNvdXJjZSwgdmlldykpO1xuXHRcdFx0XHRcdHNvdXJjZVZhbHVlID0gW3twcm9wczoge30sIGFyZ3M6IFtvbkVycm9yXX1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGxpbmtGbihzb3VyY2UsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQ29tcGlsZWQgbGluayBleHByZXNzaW9uIGZvciBsaW5rVGFnOiByZXR1cm4gdmFsdWUgZm9yIGRhdGEtbGluaz1cIns6eHh4fVwiIHdpdGggbm8gY3Z0IG9yIGN2dEJrLCBvdGhlcndpc2UgdGFnQ3R4IG9yIHRhZ0N0eHNcblxuXHRcdFx0YXR0ciA9IGdldFRhcmdldFZhbChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgdGFnID0gbGlua0N0eC50YWcsXG5cdFx0XHRcdFx0bGlua0N0eC5hdHRyIHx8IGRlZmF1bHRBdHRyKHRhcmdldCwgdHJ1ZSwgY3Z0ICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdCk7XG5cblx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0Ly8gRXhpc3RpbmcgdGFnIGluc3RhbmNlXG5cdFx0XHRcdGZvcmNlVXBkYXRlID0gaGFzRXJyb3IgfHwgdGFnLl9lcjtcblx0XHRcdFx0Ly8gSWYgdGhlIG5ldyB0YWdDdHhzIGhhc0Vycm9yIG9yIHRoZSBwcmV2aW91cyB0YWdDdHhzIGhhZCBlcnJvciwgdGhlbiBmb3JjZSB1cGRhdGVcblx0XHRcdFx0c291cmNlVmFsdWUgPSBzb3VyY2VWYWx1ZVswXSA/IHNvdXJjZVZhbHVlIDogW3NvdXJjZVZhbHVlXTtcblx0XHRcdFx0bm9VcGRhdGUgPSAhZm9yY2VVcGRhdGUgJiYgZXZlbnRBcmdzICYmIHRhZy5vblVwZGF0ZSAmJiB0YWcub25VcGRhdGUoZXYsIGV2ZW50QXJncywgc291cmNlVmFsdWUpID09PSBmYWxzZTtcblxuXHRcdFx0XHRtZXJnZUN0eHModGFnLCBzb3VyY2VWYWx1ZSwgZm9yY2VVcGRhdGUpO1xuXG5cdFx0XHRcdGlmIChub1VwZGF0ZSB8fCBhdHRyID09PSBOT05FKSB7XG5cdFx0XHRcdFx0Ly8gb25VcGRhdGUgcmV0dXJuZWQgZmFsc2UsIG9yIGF0dHIgPT09IFwibm9uZVwiLCBvciB0aGlzIGlzIGFuIHVwZGF0ZSBjb21pbmcgZnJvbSB0aGUgdGFnJ3Mgb3duIGNoYW5nZSBldmVudFxuXHRcdFx0XHRcdC8vIC0gc28gZG9uJ3QgcmVmcmVzaCB0aGUgdGFnOiB3ZSBqdXN0IHVzZSB0aGUgbmV3IHRhZ0N0eHMgbWVyZ2VkIGZyb20gdGhlIHNvdXJjZVZhbHVlLFxuXHRcdFx0XHRcdC8vICh3aGljaCBtYXkgb3B0aW9uYWxseSBoYXZlIGJlZW4gbW9kaWZlZCBpbiBvblVwZGF0ZSgpLi4uKSBhbmQgdGhlbiBiaW5kLCBhbmQgd2UgYXJlIGRvbmVcblx0XHRcdFx0XHRjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0b2JzZXJ2ZUFuZEJpbmQobGlua0N0eCwgc291cmNlLCB0YXJnZXQpO1xuXHRcdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0YWcuXy5jaGdpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c291cmNlVmFsdWUgPSB0YWcudGFnTmFtZSA9PT0gXCI6XCIgLy8gQ2FsbCBjb252ZXJ0VmFsIGlmIGl0IGlzIGEge3tjdnQ6Li4ufX0gLSBvdGhlcndpc2UgY2FsbCByZW5kZXJUYWdcblx0XHRcdFx0XHQ/ICRzdWIuX2NudnQodGFnLmN2dCwgdmlldywgc291cmNlVmFsdWVbMF0pXG5cdFx0XHRcdFx0OiAkc3ViLl90YWcodGFnLCB2aWV3LCB2aWV3LnRtcGwsIHNvdXJjZVZhbHVlLCB0cnVlLCBvbkVycm9yKTtcblx0XHRcdH0gZWxzZSBpZiAobGlua0ZuLl90YWcpIHtcblx0XHRcdFx0Ly8gRm9yIHt7OiAuLi59fSB3aXRob3V0IGEgY29udmVydCBvciBjb252ZXJ0QmFjaywgd2UgYWxyZWFkeSBoYXZlIHRoZSBzb3VyY2VWYWx1ZSwgYW5kIHdlIGFyZSBkb25lXG5cdFx0XHRcdC8vIEZvciB7ezogLi4ufX0gd2l0aCBlaXRoZXIgY3Z0IG9yIGN2dEJhY2sgd2UgY2FsbCBjb252ZXJ0VmFsIHRvIGdldCB0aGUgc291cmNlVmFsdWUgYW5kIGluc3RhbnRpYXRlIHRoZSB0YWdcblx0XHRcdFx0Ly8gSWYgY3Z0IGlzIHVuZGVmaW5lZCB0aGVuIHRoaXMgaXMgYSB0YWcsIGFuZCB3ZSBjYWxsIHJlbmRlclRhZyB0byBnZXQgdGhlIHJlbmRlcmVkIGNvbnRlbnQgYW5kIGluc3RhbnRpYXRlIHRoZSB0YWdcblx0XHRcdFx0Y3Z0ID0gY3Z0ID09PSBcIlwiID8gVFJVRSA6IGN2dDsgLy8gSWYgdGhlcmUgaXMgYSBjdnRCYWNrIGJ1dCBubyBjdnQsIHNldCBjdnQgdG8gXCJ0cnVlXCJcblx0XHRcdFx0c291cmNlVmFsdWUgPSBjdnQgLy8gQ2FsbCBjb252ZXJ0VmFsIGlmIGl0IGlzIGEge3tjdnQ6Li4ufX0gLSBvdGhlcndpc2UgY2FsbCByZW5kZXJUYWdcblx0XHRcdFx0XHQ/ICRzdWIuX2NudnQoY3Z0LCB2aWV3LCBzb3VyY2VWYWx1ZVswXSB8fCBzb3VyY2VWYWx1ZSkgLy8gY29udmVydFZhbFxuXHRcdFx0XHRcdDogJHN1Yi5fdGFnKGxpbmtGbi5fdGFnLCB2aWV3LCB2aWV3LnRtcGwsIHNvdXJjZVZhbHVlLCB0cnVlLCBvbkVycm9yKTsgLy8gcmVuZGVyVGFnXG5cblx0XHRcdFx0YWRkTGlua01ldGhvZHModGFnID0gbGlua0N0eC50YWcsIHRydWUpOyAvLyBJbiBib3RoIGNvbnZlcnRWYWwgYW5kIHJlbmRlclRhZyB3ZSBoYXZlIGluc3RhbnRpYXRlZCBhIHRhZ1xuXHRcdFx0XHRhdHRyID0gbGlua0N0eC5hdHRyIHx8IGF0dHI7IC8vIGxpbmtDdHguYXR0ciBtYXkgaGF2ZSBiZWVuIHNldCB0byB0YWcuYXR0ciBkdXJpbmcgdGFnIGluc3RhbnRpYXRpb24gaW4gcmVuZGVyVGFnXG5cdFx0XHR9XG5cblx0XHRcdGlmICh1cGRhdGVDb250ZW50KHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCBhdHRyLCB0YWcpXG5cdFx0XHRcdFx0JiYgZXZlbnRBcmdzXG5cdFx0XHRcdFx0JiYgKG9uRXZlbnQgPSB2aWV3LmhscChvbkFmdGVyQ2hhbmdlU3RyKSkpIHtcblx0XHRcdFx0b25FdmVudC5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eC5fbm9VcGQgPSAwOyAvLyBGb3IgZGF0YS1saW5rPVwiXnsuLi59XCIgcmVtb3ZlIF9ub1VwZCBmbGFnIHNvIHVwZGF0ZXMgb24gc3Vic2VxdWVudCBjYWxsc1xuXG5cdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdHRhZy5fZXIgPSBoYXNFcnJvcjtcblx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KTtcblxuXHRcdC8vIFJlbW92ZSBkeW5hbWljYWxseSBhZGRlZCBsaW5rQ3R4IGZyb20gdmlld1xuXHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0VmFsKHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCB0YWcsIGF0dHIpIHtcblx0dmFyIGN1cnJlbnRWYWx1ZSwgc2V0dGVyLCBjc3MsICR0YXJnZXQsXG5cdFx0dGFyZ2V0ID0gdGFnICYmIHRhZy5wYXJlbnRFbGVtIHx8IGxpbmtDdHguZWxlbTtcblxuXHRpZiAoc291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdCR0YXJnZXQgPSAkKHRhcmdldCk7XG5cdFx0YXR0ciA9IHRhZyAmJiB0YWcuYXR0ciB8fCBhdHRyO1xuXHRcdGlmICgkaXNGdW5jdGlvbihzb3VyY2VWYWx1ZSkpIHtcblx0XHRcdGVycm9yKGxpbmtDdHguZXhwciArIFwiOiBtaXNzaW5nIHBhcmVuc1wiKTtcblx0XHR9XG5cblx0XHRpZiAoY3NzID0gL15jc3MtLy50ZXN0KGF0dHIpICYmIGF0dHIuc2xpY2UoNCkpIHtcblx0XHRcdGN1cnJlbnRWYWx1ZSA9ICQuc3R5bGUodGFyZ2V0LCBjc3MpO1xuXHRcdFx0aWYgKCtzb3VyY2VWYWx1ZSA9PT0gc291cmNlVmFsdWUpIHtcblx0XHRcdFx0Ly8gT3B0aW1pemF0aW9uIGZvciBwZXJmIG9uIGludGVnZXIgdmFsdWVzIC0gZS5nLiBjc3Mtd2lkdGh7OndpZHRoKydweCd9XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHBhcnNlSW50KGN1cnJlbnRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChhdHRyICE9PSBcImxpbmtcIikgeyAvLyBhdHRyID09PSBcImxpbmtcIiBpcyBmb3IgdGFnIGNvbnRyb2xzIHdoaWNoIGRvIGRhdGEgYmluZGluZyBidXQgaGF2ZSBubyByZW5kZXJlZCBvdXRwdXQgb3IgdGFyZ2V0XG5cdFx0XHRpZiAoYXR0ciA9PT0gXCJ2YWx1ZVwiKSB7XG5cdFx0XHRcdGlmICh0YXJnZXQudHlwZSA9PT0gQ0hFQ0tCT1gpIHtcblx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSAkdGFyZ2V0LnByb3AoYXR0ciA9IENIRUNLRUQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFJBRElPKSB7XG5cdFx0XHRcdGlmICh0YXJnZXQudmFsdWUgPT09IChcIlwiICsgc291cmNlVmFsdWUpKSB7XG5cdFx0XHRcdFx0Y3VycmVudFZhbHVlID0gJHRhcmdldC5wcm9wKENIRUNLRUQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBhdHRyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRzZXR0ZXIgPSBmblNldHRlcnNbYXR0cl07XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHNldHRlciA/ICR0YXJnZXRbc2V0dGVyXSgpIDogJHRhcmdldC5hdHRyKGF0dHIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsaW5rQ3R4Ll92YWwgPSBjdXJyZW50VmFsdWU7XG5cdH1cblx0cmV0dXJuIGF0dHI7XG59XG5cbmZ1bmN0aW9uIHNldERlZmVyKGVsZW0sIHZhbHVlKSB7XG5cdGVsZW0uX2RmID0gdmFsdWU7IC8vIFVzZSBib3RoIGFuIGV4cGFuZG8gYW5kIGFuIGF0dHJpYnV0ZSB0byB0cmFjayBkZWZlcmVkIHRva2Vucy4gQXR0cmlidXRlIGlzIG5lZWRlZCBmb3IgcXVlcnlTZWxlY3RvckFsbCBmb3IgZ2V0Vmlld0luZm9zIChjaGlsZFRhZ3MpXG5cdGVsZW1bKHZhbHVlID8gXCJzZXRcIiA6IFwicmVtb3ZlXCIpICsgXCJBdHRyaWJ1dGVcIl0oZGVmZXJBdHRyLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29udGVudChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgYXR0ciwgdGFnKSB7XG5cdC8vIFdoZW4gY2FsbGVkIGZvciBhIHRhZywgZWl0aGVyIGluIHRhZy5yZWZyZXNoKCkgb3IgcHJvcGVydHlDaGFuZ2VIYW5kbGVyKCksIHJldHVybnMgYSBwcm9taXNlIChhbmQgc3VwcG9ydHMgYXN5bmMpXG5cdC8vIFdoZW4gY2FsbGVkIChpbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIpIGZvciB0YXJnZXQgSFRNTCByZXR1cm5zIHRydWVcblx0Ly8gV2hlbiBjYWxsZWQgKGluIHByb3BlcnR5Q2hhbmdlSGFuZGxlcikgZm9yIG90aGVyIHRhcmdldHMgcmV0dXJucyBib29sZWFuIGZvciBcImNoYW5nZWRcIlxuXHR2YXIgc2V0dGVyLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHByb21pc2UsIG5vZGVzVG9SZW1vdmUsIHVzZVByb3AsIHRva2VucywgaWQsIG9wZW5JbmRleCwgY2xvc2VJbmRleCwgdGVzdEVsZW0sIG5vZGVOYW1lLCBjU3R5bGUsIGpzdlNlbCxcblx0XHRyZW5kZXJzID0gYXR0ciAhPT0gTk9ORSAmJiBzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFsaW5rQ3R4Ll9ub1VwZCwgLy8gRm9yIGRhdGEtbGluaz1cIl57Li4ufVwiLCBkb24ndCB1cGRhdGUgdGhlIGZpcnN0IHRpbWUgKG5vIGluaXRpYWwgcmVuZGVyKSAtIGUuZy4gdG8gbGVhdmUgc2VydmVyIHJlbmRlcmVkIHZhbHVlcy5cblx0XHRzb3VyY2UgPSBsaW5rQ3R4LmRhdGEsXG5cdFx0dGFyZ2V0ID0gdGFnICYmIHRhZy5wYXJlbnRFbGVtIHx8IGxpbmtDdHguZWxlbSxcblx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZSxcblx0XHQkdGFyZ2V0ID0gJCh0YXJnZXQpLFxuXHRcdHZpZXcgPSBsaW5rQ3R4LnZpZXcsXG5cdFx0dGFyZ2V0VmFsID0gbGlua0N0eC5fdmFsLFxuXHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHgsXG5cdFx0Ly8gSWYgbm90IGEgdGFnIHdlIGNhbiB1c2UgdGhlIC5fdmFsIG9idGFpbmVkIGZyb20gZ2V0VGFyZ2V0VmFsKClcblx0XHQvLyBhbmQgb25seSB1cGRhdGUgd2hlbiB0aGUgbmV3IHZhbHVlIChzb3VyY2VWYWx1ZSkgaGFzIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgb25lXG5cdFx0Y2hhbmdlID0gdGFnO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBJbml0aWFsaXplIHRoZSB0YWcgd2l0aCBlbGVtZW50IHJlZmVyZW5jZXNcblx0XHR0YWcuXy51bmxpbmtlZCA9IHRydWU7IC8vIFNldCB0byB1bmxpbmtlZCwgc28gaW5pdGlhbGl6YXRpb24gaXMgdHJpZ2dlcmVkIGFmdGVyIHJlLXJlbmRlcmluZywgZS5nLiBmb3Igc2V0dGluZyBsaW5rZWRFbGVtLCBhbmQgY2FsbGluZyBvbkJpbmRcblx0XHR0YWcucGFyZW50RWxlbSA9IHRhZy5wYXJlbnRFbGVtIHx8IChsaW5rQ3R4LmV4cHIgfHwgdGFnLl9lbENudCkgPyB0YXJnZXQgOiB0YXJnZXRQYXJlbnQ7XG5cdFx0cHJldk5vZGUgPSB0YWcuX3Bydjtcblx0XHRuZXh0Tm9kZSA9IHRhZy5fbnh0O1xuXHR9XG5cdGlmICghcmVuZGVycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmIChhdHRyID09PSBcInZpc2libGVcIikge1xuXHRcdGF0dHIgPSBcImNzcy1kaXNwbGF5XCI7XG5cdH1cblx0aWYgKC9eY3NzLS8udGVzdChhdHRyKSkge1xuXHRcdGlmIChsaW5rQ3R4LmF0dHIgPT09IFwidmlzaWJsZVwiKSB7XG5cdFx0XHQvLyBHZXQgdGhlIGN1cnJlbnQgZGlzcGxheSBzdHlsZVxuXHRcdFx0Y1N0eWxlID0gKHRhcmdldC5jdXJyZW50U3R5bGUgfHwgZ2V0Q29tcHV0ZWRTdHlsZS5jYWxsKGdsb2JhbCwgdGFyZ2V0LCBcIlwiKSkuZGlzcGxheTtcblxuXHRcdFx0aWYgKHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBzaG93aW5nIHRoZSBlbGVtZW50LlxuXHRcdFx0XHQvLyBHZXQgdGhlIGNhY2hlZCAndmlzaWJsZScgZGlzcGxheSB2YWx1ZSBmcm9tIHRoZSAtanN2ZCBleHBhbmRvXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gdGFyZ2V0Ll9qc3ZkXG5cdFx0XHRcdFx0Ly8gT3IsIGlmIG5vdCB5ZXQgY2FjaGVkLCBnZXQgdGhlIGN1cnJlbnQgZGlzcGxheSB2YWx1ZVxuXHRcdFx0XHRcdHx8IGNTdHlsZTtcblx0XHRcdFx0aWYgKHNvdXJjZVZhbHVlID09PSBOT05FICYmICEoc291cmNlVmFsdWUgPSBkaXNwbGF5U3R5bGVzW25vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lXSkpIHtcblx0XHRcdFx0XHQvLyBDdXJyZW50bHkgZGlzcGxheSB2YWx1ZSBpcyAnbm9uZScsIGFuZCB0aGUgJ3Zpc2libGUnIHN0eWxlIGhhcyBub3QgYmVlbiBjYWNoZWQuXG5cdFx0XHRcdFx0Ly8gV2UgY3JlYXRlIGFuIGVsZW1lbnQgdG8gZmluZCB0aGUgY29ycmVjdCAndmlzaWJsZScgZGlzcGxheSBzdHlsZSBmb3IgdGhpcyBub2RlTmFtZVxuXHRcdFx0XHRcdHRlc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXN0RWxlbSk7XG5cblx0XHRcdFx0XHQvLyBHZXQgdGhlIGRlZmF1bHQgc3R5bGUgZm9yIHRoaXMgSFRNTCB0YWcgdG8gdXNlIGFzICd2aXNpYmxlJyBzdHlsZVxuXHRcdFx0XHRcdHNvdXJjZVZhbHVlXG5cdFx0XHRcdFx0XHQvLyBhbmQgY2FjaGUgaXQgYXMgYSBoYXNoIGFnYWluc3Qgbm9kZU5hbWVcblx0XHRcdFx0XHRcdD0gZGlzcGxheVN0eWxlc1tub2RlTmFtZV1cblx0XHRcdFx0XHRcdD0gKHRlc3RFbGVtLmN1cnJlbnRTdHlsZSB8fCBnZXRDb21wdXRlZFN0eWxlLmNhbGwoZ2xvYmFsLCB0ZXN0RWxlbSwgXCJcIikpLmRpc3BsYXk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXN0RWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBoaWRpbmcgdGhlIGVsZW1lbnQuXG5cdFx0XHRcdC8vIENhY2hlIHRoZSBjdXJyZW50IGRpc3BsYXkgdmFsdWUgYXMgJ3Zpc2libGUnIHN0eWxlLCBvbiBfanN2ZCBleHBhbmRvLCBmb3Igd2hlbiB3ZSBzaG93IHRoZSBlbGVtZW50IGFnYWluXG5cdFx0XHRcdHRhcmdldC5fanN2ZCA9IGNTdHlsZTtcblx0XHRcdFx0c291cmNlVmFsdWUgPSBOT05FOyAvLyBIaWRlIHRoZSBlbGVtZW50XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjaGFuZ2UgPSBjaGFuZ2UgfHwgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0JC5zdHlsZSh0YXJnZXQsIGF0dHIuc2xpY2UoNCksIHNvdXJjZVZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoYXR0ciAhPT0gXCJsaW5rXCIpIHsgLy8gYXR0ciA9PT0gXCJsaW5rXCIgaXMgZm9yIHRhZyBjb250cm9scyB3aGljaCBkbyBkYXRhIGJpbmRpbmcgYnV0IGhhdmUgbm8gcmVuZGVyZWQgb3V0cHV0IG9yIHRhcmdldFxuXHRcdGlmICgvXmRhdGEtLy50ZXN0KGF0dHIpKSB7XG5cdFx0XHQkLmRhdGEodGFyZ2V0LCBhdHRyLnNsaWNlKDUpLCBzb3VyY2VWYWx1ZSk7IC8vIFN1cHBvcnQgZm9yIGJpbmRpbmcgdG8gZGF0YSBhdHRyaWJ1dGVzOiBkYXRhLWZvb3s6ZXhwcn06IGRhdGEtZm9vIGF0dHJpYnV0ZSB3aWxsIGJlXG5cdFx0XHQvLyBleHByLnRvU3RyaW5nKCksIGJ1dCAkLmRhdGEoZWxlbWVudCwgXCJmb29cIikgYW5kICQoZWxlbWVudCkuZGF0YShcImZvb1wiKSB3aWxsIGFjdHVhbGx5IHJldHVybiB2YWx1ZSBvZiBleHByLCBldmVuIGlmIG9mIHR5cGUgb2JqZWN0XG5cdFx0fVxuXHRcdGlmIChhdHRyID09PSBDSEVDS0VEKSB7XG5cdFx0XHR1c2VQcm9wID0gdHJ1ZTtcblx0XHRcdHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWUgJiYgc291cmNlVmFsdWUgIT09IFwiZmFsc2VcIjtcblx0XHRcdC8vIFRoZSBzdHJpbmcgdmFsdWUgXCJmYWxzZVwiIGNhbiBvY2N1ciB3aXRoIGRhdGEtbGluaz1cImNoZWNrZWR7YXR0cjpleHByfVwiIC0gYXMgYSByZXN1bHQgb2YgYXR0ciwgYW5kIGhlbmNlIHVzaW5nIGNvbnZlcnRWYWwoKVxuXHRcdFx0Ly8gV2Ugd2lsbCBzZXQgdGhlIFwiY2hlY2tlZFwiIHByb3BlcnR5XG5cdFx0XHQvLyBXZSB3aWxsIGNvbXBhcmUgdGhpcyB3aXRoIHRoZSBjdXJyZW50IHZhbHVlXG5cdFx0fSBlbHNlIGlmIChhdHRyID09PSBSQURJTykge1xuXHRcdFx0Ly8gVGhpcyBpcyBhIHNwZWNpYWwgYmluZGluZyBhdHRyaWJ1dGUgZm9yIHJhZGlvIGJ1dHRvbnMsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBkZWZhdWx0ICd0bycgYmluZGluZy5cblx0XHRcdC8vIFRoaXMgYWxsb3dzIGJpbmRpbmcgYm90aCB0byB2YWx1ZSAoZm9yIGVhY2ggaW5wdXQpIGFuZCB0byB0aGUgZGVmYXVsdCBjaGVja2VkIHJhZGlvIGJ1dHRvbiAoZm9yIGVhY2ggaW5wdXQgaW4gbmFtZWQgZ3JvdXAsXG5cdFx0XHQvLyBlLmcuIGJpbmRpbmcgdG8gcGFyZW50IGRhdGEpLlxuXHRcdFx0Ly8gUGxhY2UgdmFsdWUgYmluZGluZyBmaXJzdDogPGlucHV0IHR5cGU9XCJyYWRpb1wiIGRhdGEtbGluaz1cInZhbHVlezpuYW1lfSB7OiNnZXQoJ2RhdGEnKS5kYXRhLmN1cnJlbmN5On0gXCIgLi4uLz5cblx0XHRcdC8vIG9yIChhbGxvd2luZyBhbnkgb3JkZXIgZm9yIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zKTpcblx0XHRcdC8vIDxpbnB1dCB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cInt7Om5hbWV9fVwiIGRhdGEtbGluaz1cIns6I2dldCgnZGF0YScpLmRhdGEuY3VycmVuY3k6fSB2YWx1ZV57Om5hbWV9XCIgLi4uLz5cblx0XHRcdHVzZVByb3AgPSB0cnVlO1xuXHRcdFx0YXR0ciA9IENIRUNLRUQ7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IHRhcmdldC52YWx1ZSA9PT0gKFwiXCIgKyBzb3VyY2VWYWx1ZSk7XG5cdFx0XHQvLyBJZiB0aGUgZGF0YSB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIHRoaXMgcmFkaW8gYnV0dG9uIGlucHV0LCBzZXQgdGhlIGNoZWNrZWQgcHJvcGVydHkgdG8gdHJ1ZVxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHNldCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSB0byBmYWxzZVxuXHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gXCJzZWxlY3RlZFwiIHx8IGF0dHIgPT09IFwiZGlzYWJsZWRcIiB8fCBhdHRyID09PSBcIm11bHRpcGxlXCIgfHwgYXR0ciA9PT0gXCJyZWFkb25seVwiKSB7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IChzb3VyY2VWYWx1ZSAmJiBzb3VyY2VWYWx1ZSAhPT0gXCJmYWxzZVwiKSA/IGF0dHIgOiBudWxsO1xuXHRcdFx0Ly8gVXNlIGF0dHIsIG5vdCBwcm9wLCBzbyB3aGVuIHRoZSBvcHRpb25zIChmb3IgZXhhbXBsZSkgYXJlIGNoYW5nZWQgZHluYW1pY2FsbHksIGJ1dCBpbmNsdWRlIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHZhbHVlLFxuXHRcdFx0Ly8gdGhleSB3aWxsIHN0aWxsIGJlIHNlbGVjdGVkIGFmdGVyIHRoZSBjaGFuZ2Vcblx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFwidmFsdWVcIiAmJiB0YXJnZXQubm9kZU5hbWUgPT09IFwiU0VMRUNUXCIpIHtcblx0XHRcdHRhcmdldC5fanN2U2VsID0gJGlzQXJyYXkoc291cmNlVmFsdWUpXG5cdFx0XHRcdD8gc291cmNlVmFsdWVcblx0XHRcdFx0OiBcIlwiICsgc291cmNlVmFsdWU7IC8vIElmIG5vdCBhcnJheSwgY29lcmNlIHRvIHN0cmluZ1xuXHRcdH1cblxuXHRcdGlmIChzZXR0ZXIgPSBmblNldHRlcnNbYXR0cl0pIHtcblx0XHRcdGlmIChhdHRyID09PSBIVE1MKSB7XG5cdFx0XHRcdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0XHRpZiAodGFnICYmIHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHRcdG5vZGVzVG9SZW1vdmUgPSB0YWcubm9kZXModHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHRhZy5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZSAhPT0gbmV4dE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBwcmV2Tm9kZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB0cmFuc2ZlciB0aGUgdmlldyB0b2tlbnMgb24gcHJldk5vZGUgdG8gbmV4dE5vZGUgb2YgdGhpcyAndmlld1RvUmVmcmVzaCdcblx0XHRcdFx0XHRcdFx0dHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgdGFyZ2V0LCB0YWcuX3RnSWQsIFwiXlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodG9rZW5zID0gdGFyZ2V0Ll9kZikgeyAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIG5leHROb2RlLCBhbmQgc28gdGhlIHRhcmdldC5fZGYgbWF5IGluY2x1ZGUgdG9rZW5zIHJlZmVyZW5jaW5nXG5cdFx0XHRcdFx0XHRcdC8vIHZpZXcgYW5kIHRhZyBiaW5kaW5ncyBjb250YWluZWQgd2l0aGluIHRoZSBvcGVuIGFuZCBjbG9zZSB0b2tlbnMgb2YgdGhlIHVwZGF0ZWQgdGFnIGNvbnRyb2wuIFRoZXkgbmVlZCB0byBiZSBwcm9jZXNzZWQgKGRpc3Bvc2VkKVxuXHRcdFx0XHRcdFx0XHRpZCA9IHRhZy5fdGdJZCArIFwiXlwiO1xuXHRcdFx0XHRcdFx0XHRvcGVuSW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIiNcIiArIGlkKSArIDE7XG5cdFx0XHRcdFx0XHRcdGNsb3NlSW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIi9cIiArIGlkKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAob3BlbkluZGV4ICYmIGNsb3NlSW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0b3BlbkluZGV4ICs9IGlkLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2xvc2VJbmRleCA+IG9wZW5JbmRleCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0LCB0b2tlbnMuc2xpY2UoMCwgb3BlbkluZGV4KSArIHRva2Vucy5zbGljZShjbG9zZUluZGV4KSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRkaXNwb3NlVG9rZW5zKHRva2Vucy5zbGljZShvcGVuSW5kZXgsIGNsb3NlSW5kZXgpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVcblx0XHRcdFx0XHRcdFx0PyBwcmV2Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHRcdFx0OiBuZXh0Tm9kZVxuXHRcdFx0XHRcdFx0XHRcdD8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdFx0XHRcdFx0OiB0YXJnZXQubGFzdENoaWxkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBSZW1vdmUgSFRNTCBub2Rlc1xuXHRcdFx0XHRcdCQobm9kZXNUb1JlbW92ZSkucmVtb3ZlKCk7IC8vIE5vdGUgaWYgIXRhZy5fZWxDbnQgcmVtb3ZpbmcgdGhlIG5vZGVzVG9SZW1vdmUgd2lsbCBwcm9jZXNzIGFuZCBkaXNwb3NlIHZpZXcgYW5kIHRhZyBiaW5kaW5ncyBjb250YWluZWQgd2l0aGluIHRoZSB1cGRhdGVkIHRhZyBjb250cm9sXG5cblx0XHRcdFx0XHQvLyBJbnNlcnQgYW5kIGxpbmsgbmV3IGNvbnRlbnRcblx0XHRcdFx0XHRwcm9taXNlID0gdmlldy5saW5rKHZpZXcuZGF0YSwgdGFyZ2V0LCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHNvdXJjZVZhbHVlLCB0YWcgJiYge3RhZzogdGFnLl90Z0lkLCBsYXp5TGluazogdGFnLnRhZ0N0eC5wcm9wcy5sYXp5TGlua30pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGRhdGEtbGlua2VkIHZhbHVlIHRhcmdldGluZyBpbm5lckhUTUw6IGRhdGEtbGluaz1cImh0bWx7OmV4cHJ9XCIgb3IgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXG5cdFx0XHRcdFx0cmVuZGVycyA9IHJlbmRlcnMgJiYgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRpZiAocmVuZGVycykge1xuXHRcdFx0XHRcdFx0JHRhcmdldC5lbXB0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocmVuZGVycykge1xuXHRcdFx0XHRcdFx0cHJvbWlzZSA9IHZpZXcubGluayhzb3VyY2UsIHRhcmdldCwgcHJldk5vZGUsIG5leHROb2RlLCBzb3VyY2VWYWx1ZSwgdGFnICYmIHt0YWc6IHRhZy5fdGdJZH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBSZW1vdmUgZHluYW1pY2FsbHkgYWRkZWQgbGlua0N0eCBhbmQgY3R4IGZyb20gdmlld1xuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBvbGRMaW5rQ3R4O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKGF0dHIgPT09IFwidGV4dFwiICYmIHRhcmdldC5jaGlsZHJlbiAmJiAhdGFyZ2V0LmNoaWxkcmVuWzBdKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGNvZGUgaXMgZmFzdGVyIHRoZW4gJHRhcmdldC50ZXh0KClcblx0XHRcdFx0XHRcdGlmICh0YXJnZXQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQudGV4dENvbnRlbnQgPSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldC5pbm5lclRleHQgPSBzb3VyY2VWYWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JHRhcmdldFtzZXR0ZXJdKHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKChqc3ZTZWwgPSB0YXJnZXRQYXJlbnQuX2pzdlNlbClcblx0XHRcdFx0XHQvLyBTZXR0aW5nIHZhbHVlIG9mIDxvcHRpb24+IGVsZW1lbnRcblx0XHRcdFx0XHQmJiAoYXR0ciA9PT0gXCJ2YWx1ZVwiIHx8ICEkdGFyZ2V0LmF0dHIoXCJ2YWx1ZVwiKSkpIHsgLy8gU2V0dGluZyB2YWx1ZSBhdHRyaWJ1dGUsIG9yIHNldHRpbmcgdGV4dENvbnRlbnQgaWYgYXR0cmlidXRlIGlzIG51bGxcblx0XHRcdFx0XHQvLyBTZXQvdW5zZWxlY3Qgc2VsZWN0aW9uIGJhc2VkIG9uIHZhbHVlIHNldCBvbiBwYXJlbnQgPHNlbGVjdD4uIFdvcmtzIGZvciBtdWx0aXNlbGVjdCB0b29cblx0XHRcdFx0XHR0YXJnZXQuc2VsZWN0ZWQgPSAkLmluQXJyYXkoXCJcIiArIHNvdXJjZVZhbHVlLCAkaXNBcnJheShqc3ZTZWwpID8ganN2U2VsIDogW2pzdlNlbF0pID4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHQvLyBTZXR0aW5nIGFuIGF0dHJpYnV0ZSB0byB1bmRlZmluZWQgc2hvdWxkIHJlbW92ZSB0aGUgYXR0cmlidXRlXG5cdFx0XHQkdGFyZ2V0W3VzZVByb3AgPyBcInByb3BcIiA6IFwiYXR0clwiXShhdHRyLCBzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICF1c2VQcm9wID8gbnVsbCA6IHNvdXJjZVZhbHVlKTtcblx0XHR9XG5cdFx0bGlua0N0eC5fdmFsID0gc291cmNlVmFsdWU7XG5cdH1cblx0cmV0dXJuIHByb21pc2UgfHwgY2hhbmdlO1xufVxuXG5mdW5jdGlvbiBhcnJheUNoYW5nZUhhbmRsZXIoZXYsIGV2ZW50QXJncykge1xuXHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0b25CZWZvcmVDaGFuZ2UgPSBzZWxmLmhscChvbkJlZm9yZUNoYW5nZVN0ciksXG5cdFx0b25BZnRlckNoYW5nZSA9IHNlbGYuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpO1xuXHRpZiAoIW9uQmVmb3JlQ2hhbmdlIHx8IG9uQmVmb3JlQ2hhbmdlLmNhbGwodGhpcywgZXYsIGV2ZW50QXJncykgIT09IGZhbHNlKSB7XG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0Ly8gVGhpcyBpcyBhbiBvYnNlcnZhYmxlIGFjdGlvbiAobm90IGEgdHJpZ2dlci9oYW5kbGVyIGNhbGwgZnJvbSBwdXNoVmFsdWVzLCBvciBzaW1pbGFyLCBmb3Igd2hpY2ggZXZlbnRBcmdzIHdpbGwgYmUgbnVsbClcblx0XHRcdHZhciBhY3Rpb24gPSBldmVudEFyZ3MuY2hhbmdlLFxuXHRcdFx0XHRpbmRleCA9IGV2ZW50QXJncy5pbmRleCxcblx0XHRcdFx0aXRlbXMgPSBldmVudEFyZ3MuaXRlbXM7XG5cdFx0XHRzZWxmLl8uc3J0ID0gZXZlbnRBcmdzLnJlZnJlc2g7IC8vIHRydWUgaWYgcGFydCBvZiBhICdzb3J0JyBvbiByZWZyZXNoXG5cdFx0XHRzd2l0Y2ggKGFjdGlvbikge1xuXHRcdFx0XHRjYXNlIFwiaW5zZXJ0XCI6XG5cdFx0XHRcdFx0c2VsZi5hZGRWaWV3cyhpbmRleCwgaXRlbXMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmVtb3ZlXCI6XG5cdFx0XHRcdFx0c2VsZi5yZW1vdmVWaWV3cyhpbmRleCwgaXRlbXMubGVuZ3RoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIm1vdmVcIjpcblx0XHRcdFx0XHRzZWxmLnJlbW92ZVZpZXdzKGV2ZW50QXJncy5vbGRJbmRleCwgaXRlbXMubGVuZ3RoLCB1bmRlZmluZWQsIHRydWUpOyAvLyByZW1vdmVcblx0XHRcdFx0XHRzZWxmLmFkZFZpZXdzKGluZGV4LCBpdGVtcyk7IC8vIHJlLWluc2VydFxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmVmcmVzaFwiOlxuXHRcdFx0XHRcdHNlbGYuXy5zcnQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0c2VsZi5maXhJbmRleCgwKTtcblx0XHRcdFx0XHQvLyBPdGhlciBjYXNlczogKGUuZy51bmRlZmluZWQsIGZvciBzZXRQcm9wZXJ0eSBvbiBvYnNlcnZhYmxlIG9iamVjdCkgZXRjLiBkbyBub3RoaW5nXG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvbkFmdGVyQ2hhbmdlKSB7XG5cdFx0XHRvbkFmdGVyQ2hhbmdlLmNhbGwodGhpcywgZXYsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFV0aWxpdGllcyBmb3IgZXZlbnQgaGFuZGxlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gc2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXcpIHtcblx0Ly8gQWRkL3JlbW92ZSBhcnJheUNoYW5nZSBoYW5kbGVyIG9uIHZpZXdcblx0dmFyIGhhbmRsZXIsIGFycmF5QmluZGluZyxcblx0XHR0eXBlID0gdmlldy50eXBlLCAvLyB1bmRlZmluZWQgaWYgdmlldyBpcyBiZWluZyByZW1vdmVkXG5cdFx0ZGF0YSA9IHZpZXcuZGF0YSxcblx0XHRib3VuZCA9IHZpZXcuXy5ibmQ7IC8vIHRydWUgZm9yIHRvcC1sZXZlbCBsaW5rKCkgb3IgZGF0YS1saW5rPVwie2Zvcn1cIiwgb3IgdGhlIGZvciB0YWcgaW5zdGFuY2UgZm9yIHtee2Zvcn19IChvciBmb3IgYW55IGN1c3RvbSB0YWcgdGhhdCBoYXMgYW4gb25BcnJheUNoYW5nZSBoYW5kbGVyKVxuXG5cdGlmICghdmlldy5fLnVzZUtleSAmJiBib3VuZCkge1xuXHRcdC8vIFRoaXMgaXMgYW4gYXJyYXkgdmlldy4gKHZpZXcuXy51c2VLZXkgbm90IGRlZmluZWQgPT4gZGF0YSBpcyBhcnJheSksIGFuZCBpcyBkYXRhLWJvdW5kIHRvIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50c1xuXG5cdFx0aWYgKGFycmF5QmluZGluZyA9IHZpZXcuXy5ibmRBcnIpIHtcblx0XHRcdC8vIEZpcnN0IHJlbW92ZSB0aGUgY3VycmVudCBoYW5kbGVyIGlmIHRoZXJlIGlzIG9uZVxuXHRcdFx0JChbYXJyYXlCaW5kaW5nWzFdXSkub2ZmKGFycmF5Q2hhbmdlU3RyLCBhcnJheUJpbmRpbmdbMF0pO1xuXHRcdFx0dmlldy5fLmJuZEFyciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKGJvdW5kICE9PSAhIWJvdW5kKSB7XG5cdFx0XHQvLyBib3VuZCBpcyBub3QgYSBib29sZWFuLCBzbyBpdCBpcyB0aGUgZGF0YS1saW5rZWQgdGFnIHRoYXQgJ293bnMnIHRoaXMgYXJyYXkgYmluZGluZyAtIGUuZy4ge157Zm9yLi4ufX1cblx0XHRcdGlmICh0eXBlKSB7XG5cdFx0XHRcdGJvdW5kLl8uYXJyVndzW3ZpZXcuXy5pZF0gPSB2aWV3O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIGJvdW5kLl8uYXJyVndzW3ZpZXcuXy5pZF07IC8vIGlmIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSAmJiBkYXRhKSB7XG5cdFx0XHQvLyBJZiB0aGlzIHZpZXcgaXMgbm90IGJlaW5nIHJlbW92ZWQsIGJ1dCB0aGUgZGF0YSBhcnJheSBoYXMgYmVlbiByZXBsYWNlZCwgdGhlbiBiaW5kIHRvIHRoZSBuZXcgZGF0YSBhcnJheVxuXHRcdFx0aGFuZGxlciA9IGZ1bmN0aW9uKGV2KSB7XG5cdFx0XHRcdGlmICghKGV2LmRhdGEgJiYgZXYuZGF0YS5vZmYpKSB7XG5cdFx0XHRcdFx0Ly8gU2tpcCBpZiAhIWV2LmRhdGEub2ZmOiAtIGEgaGFuZGxlciB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCAobWF5YmUgd2FzIG9uIGhhbmRsZXIgY29sbGVjdGlvbiBhdCBjYWxsIHRpbWUgLSB0aGVuIHJlbW92ZWQgYnkgYW5vdGhlciBoYW5kbGVyKVxuXHRcdFx0XHRcdC8vIElmIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIGRvIG5vdGhpbmcuIChDb3JyZXNwb25kcyB0byBjYXNlIHdoZXJlIHRoZXJlIGlzIGFub3RoZXIgaGFuZGxlciBvbiB0aGUgc2FtZSBkYXRhIHdob3NlXG5cdFx0XHRcdFx0Ly8gZWZmZWN0IHdhcyB0byByZW1vdmUgdGhpcyB2aWV3LCBhbmQgd2hpY2ggaGFwcGVuZWQgdG8gcHJlY2VkZSB0aGlzIGV2ZW50IGluIHRoZSB0cmlnZ2VyIHNlcXVlbmNlLiBTbyBhbHRob3VnaCB0aGlzXG5cdFx0XHRcdFx0Ly8gZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBub3csIGl0IGlzIHN0aWxsIGNhbGxlZCBzaW5jZSBhbHJlYWR5IG9uIHRoZSB0cmlnZ2VyIHNlcXVlbmNlKVxuXHRcdFx0XHRcdGFycmF5Q2hhbmdlSGFuZGxlci5hcHBseSh2aWV3LCBhcmd1bWVudHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0JChbZGF0YV0pLm9uKGFycmF5Q2hhbmdlU3RyLCBoYW5kbGVyKTtcblx0XHRcdHZpZXcuXy5ibmRBcnIgPSBbaGFuZGxlciwgZGF0YV07XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBdHRyKGVsZW0sIHRvLCBsaW5rR2V0VmFsKSB7XG5cdC8vIHRvOiB0cnVlIC0gZGVmYXVsdCBhdHRyaWJ1dGUgZm9yIHNldHRpbmcgZGF0YSB2YWx1ZSBvbiBIVE1MIGVsZW1lbnQ7IGZhbHNlOiBkZWZhdWx0IGF0dHJpYnV0ZSBmb3IgZ2V0dGluZyB2YWx1ZSBmcm9tIEhUTUwgZWxlbWVudFxuXHQvLyBNZXJnZSBpbiB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgYmluZGluZ3MgZm9yIHRoaXMgdGFyZ2V0IGVsZW1lbnRcblx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdGF0dHIgPVxuXHRcdFx0JHN1YlNldHRpbmdzQWR2YW5jZWQuX2ZlW25vZGVOYW1lXSAvLyBnZXQgZm9ybSBlbGVtZW50IGJpbmRpbmcgc2V0dGluZ3MgZm9yIGlucHV0IHRleHRhcmVhIHNlbGVjdCBvciBvcHRncm91cFxuXHRcdFx0fHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09IFRSVUUgJiYge3RvOiBIVE1MLCBmcm9tOiBIVE1MfTsgLy8gT3IgaWYgY29udGVudEVkaXRhYmxlIHNldCB0byBcInRydWVcIiBzZXQgYXR0ciB0byBcImh0bWxcIlxuXHRyZXR1cm4gYXR0clxuXHRcdD8gKHRvXG5cdFx0XHQ/ICgobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFJBRElPKSAvLyBGb3IgcmFkaW8gYnV0dG9ucywgYmluZCBmcm9tIHZhbHVlLCBidXQgYmluZCB0byAncmFkaW8nIC0gc3BlY2lhbCB2YWx1ZS5cblx0XHRcdFx0PyBSQURJT1xuXHRcdFx0XHQ6IGF0dHIudG8pXG5cdFx0XHQ6IGF0dHIuZnJvbSlcblx0XHQ6IHRvXG5cdFx0XHQ/IGxpbmtHZXRWYWwgPyBcInRleHRcIiA6IEhUTUwgLy8gRGVmYXVsdCBpbm5lclRleHQgZm9yIGRhdGEtbGluaz1cImEuYi5jXCIgb3IgZGF0YS1saW5rPVwiezphLmIuY31cIiAod2l0aCBvciB3aXRob3V0IGNvbnZlcnRlcnMpLSBvdGhlcndpc2UgaW5uZXJIVE1MXG5cdFx0XHQ6IFwiXCI7IC8vIERlZmF1bHQgaXMgbm90IHRvIGJpbmQgZnJvbVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVuZGVyaW5nIGFuZCBET00gaW5zZXJ0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZW5kZXJBbmRMaW5rKHZpZXcsIGluZGV4LCB0bXBsLCB2aWV3cywgZGF0YSwgY29udGV4dCwgcmVmcmVzaCkge1xuXHR2YXIgaHRtbCwgbGlua1RvTm9kZSwgcHJldlZpZXcsIG5vZGVzVG9SZW1vdmUsIGJpbmRJZCxcblx0XHRwYXJlbnROb2RlID0gdmlldy5wYXJlbnRFbGVtLFxuXHRcdHByZXZOb2RlID0gdmlldy5fcHJ2LFxuXHRcdG5leHROb2RlID0gdmlldy5fbnh0LFxuXHRcdGVsQ250ID0gdmlldy5fZWxDbnQ7XG5cblx0aWYgKHByZXZOb2RlICYmIHByZXZOb2RlLnBhcmVudE5vZGUgIT09IHBhcmVudE5vZGUpIHtcblx0XHRlcnJvcihcIk1pc3NpbmcgcGFyZW50Tm9kZVwiKTtcblx0XHQvLyBBYmFuZG9uLCBzaW5jZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgb3Igd3JhcHBlciBlbGVtZW50IGhhcyBiZWVuIGluc2VydGVkIGJldHdlZW4gcHJldk5vZGUgYW5kIHBhcmVudE5vZGVcblx0fVxuXG5cdGlmIChyZWZyZXNoKSB7XG5cdFx0bm9kZXNUb1JlbW92ZSA9IHZpZXcubm9kZXMoKTtcblx0XHRpZiAoZWxDbnQgJiYgcHJldk5vZGUgJiYgcHJldk5vZGUgIT09IG5leHROb2RlKSB7XG5cdFx0XHQvLyBUaGlzIHByZXZOb2RlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRyYW5zZmVyIHRoZSB2aWV3IHRva2VucyBvbiBwcmV2Tm9kZSB0byBuZXh0Tm9kZSBvZiB0aGlzICd2aWV3VG9SZWZyZXNoJ1xuXHRcdFx0dHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgcGFyZW50Tm9kZSwgdmlldy5fLmlkLCBcIl9cIiwgdHJ1ZSk7XG5cdFx0fVxuXHRcdC8vIFJlbW92ZSBjaGlsZCB2aWV3c1xuXHRcdHZpZXcucmVtb3ZlVmlld3ModW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdGxpbmtUb05vZGUgPSBuZXh0Tm9kZTtcblxuXHRcdGlmIChlbENudCkge1xuXHRcdFx0cHJldk5vZGUgPSBwcmV2Tm9kZVxuXHRcdFx0XHQ/IHByZXZOb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHQ6IG5leHROb2RlXG5cdFx0XHRcdFx0PyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHQ6IHBhcmVudE5vZGUubGFzdENoaWxkO1xuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBIVE1MIG5vZGVzXG5cdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblxuXHRcdGZvciAoYmluZElkIGluIHZpZXcuXy5ibmRzKSB7XG5cdFx0XHQvLyBUaGUgdmlldyBiaW5kaW5ncyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBhYm92ZSBpbjogJChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblx0XHRcdC8vIElmIG5vdCwgcmVtb3ZlIHRoZW0gaGVyZTpcblx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIGFkZFZpZXdzLiBPbmx5IGNhbGxlZCBpZiB2aWV3IGlzIG9mIHR5cGUgXCJhcnJheVwiXG5cdFx0aWYgKGluZGV4KSB7XG5cdFx0XHQvLyBpbmRleCBpcyBhIG51bWJlciwgc28gaW5kZXhlZCB2aWV3IGluIHZpZXcgYXJyYXlcblx0XHRcdHByZXZWaWV3ID0gdmlld3NbaW5kZXggLSAxXTtcblx0XHRcdGlmICghcHJldlZpZXcpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBJZiBzdWJ2aWV3IGZvciBwcm92aWRlZCBpbmRleCBkb2VzIG5vdCBleGlzdCwgZG8gbm90aGluZ1xuXHRcdFx0fVxuXHRcdFx0cHJldk5vZGUgPSBwcmV2Vmlldy5fbnh0O1xuXHRcdH1cblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdGxpbmtUb05vZGUgPSBwcmV2Tm9kZTtcblx0XHRcdHByZXZOb2RlID0gbGlua1RvTm9kZVxuXHRcdFx0XHQ/IGxpbmtUb05vZGUucHJldmlvdXNTaWJsaW5nICAgICAgICAgLy8gVGhlcmUgaXMgYSBsaW5rVG9Ob2RlLCBzbyBpbnNlcnQgYWZ0ZXIgcHJldmlvdXNTaWJsaW5nLCBvciBhdCB0aGUgYmVnaW5uaW5nXG5cdFx0XHRcdDogcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7ICAgICAgICAgICAgICAvLyBJZiBubyBwcmV2VmlldyBhbmQgbm8gcHJldk5vZGUsIGluZGV4IGlzIDAgYW5kIHRoZSBjb250YWluZXIgaXMgZW1wdHksXG5cdFx0XHRcdC8vIHNvIHByZXZOb2RlID0gbGlua1RvTm9kZSA9IG51bGwuIEJ1dCBpZiBwcmV2Vmlldy5fbnh0IGlzIG51bGwgdGhlbiB3ZSBzZXQgcHJldk5vZGUgdG8gcGFyZW50Tm9kZS5sYXN0Q2hpbGRcblx0XHRcdFx0Ly8gKHdoaWNoIG11c3QgYmUgYmVmb3JlIHRoZSBwcmV2Vmlldykgc28gd2UgaW5zZXJ0IGFmdGVyIHRoYXQgbm9kZSAtIGFuZCBvbmx5IGxpbmsgdGhlIGluc2VydGVkIG5vZGVzXG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpbmtUb05vZGUgPSBwcmV2Tm9kZS5uZXh0U2libGluZztcblx0XHR9XG5cdH1cblx0aHRtbCA9IHRtcGwucmVuZGVyKGRhdGEsIGNvbnRleHQsIHZpZXcuXy51c2VLZXkgJiYgcmVmcmVzaCwgdmlldywgcmVmcmVzaCB8fCBpbmRleCwgdHJ1ZSk7XG5cdC8vIFBhc3MgaW4gdmlldy5fLnVzZUtleSBhcyB0ZXN0IGZvciBub0l0ZXJhdGlvbiAod2hpY2ggY29ycmVzcG9uZHMgdG8gd2hlbiBzZWxmLl8udXNlS2V5ID4gMCBhbmQgc2VsZi5kYXRhIGlzIGFuIGFycmF5KVxuXG5cdC8vIExpbmsgdGhlIG5ldyBIVE1MIG5vZGVzIHRvIHRoZSBkYXRhXG5cdHZpZXcubGluayhkYXRhLCBwYXJlbnROb2RlLCBwcmV2Tm9kZSwgbGlua1RvTm9kZSwgaHRtbCwgcHJldlZpZXcpO1xuLy99LCAwKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT1cbi8vIGFkZEJpbmRpbmdNYXJrZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBhZGRCaW5kaW5nTWFya2Vycyh2YWx1ZSwgdmlldywgdGFnKSB7XG5cdC8vIEluc2VydCBiaW5kaW5nIG1hcmtlcnMgaW50byB0aGUgcmVuZGVyZWQgdGVtcGxhdGUgb3V0cHV0LCB3aGljaCB3aWxsIGdldCBjb252ZXJ0ZWQgdG8gYXBwcm9wcmlhdGVcblx0Ly8gZGF0YS1qc3YgYXR0cmlidXRlcyAoZWxlbWVudC1vbmx5IGNvbnRlbnQpIG9yIHNjcmlwdCBtYXJrZXIgbm9kZXMgKHBocmFzaW5nIG9yIGZsb3cgY29udGVudCksIGluIGNvbnZlcnRNYXJrZXJzLFxuXHQvLyB3aXRoaW4gdmlldy5saW5rLCBwcmlvciB0byBpbnNlcnRpbmcgaW50byB0aGUgRE9NLiBMaW5raW5nIHdpbGwgdGhlbiBiaW5kIGJhc2VkIG9uIHRoZXNlIG1hcmtlcnMgaW4gdGhlIERPTS5cblx0Ly8gQWRkZWQgdmlldyBtYXJrZXJzOiAjbV8uLi5WSUVXLi4uL21fXG5cdC8vIEFkZGVkIHRhZyBtYXJrZXJzOiAjbV4uLi5UQUcuLi4uL21eXG5cdHZhciBpZCwgZW5kO1xuXHRpZiAodGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGJpbmRpbmcgbWFya2VyIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fVxuXHRcdGVuZCA9IFwiXmBcIjtcblx0XHRhZGRMaW5rTWV0aG9kcyh0YWcsIHRydWUpOyAvLyBUaGlzIGlzIHteez4uLi59fSBvciB7Xnt0YWcgLi4ufX0sIHt7Y3Z0Oi4uLn0gb3Ige157Oi4uLn19LCBhbmQgdGFnIHdhcyBkZWZpbmVkIGluIGNvbnZlcnRWYWwgb3IgcmVuZGVyVGFnXG5cdFx0aWQgPSB0YWcuX3RnSWQ7XG5cdFx0aWYgKCFpZCkge1xuXHRcdFx0YmluZGluZ1N0b3JlW2lkID0gYmluZGluZ0tleSsrXSA9IHRhZzsgLy8gU3RvcmUgdGhlIHRhZyB0ZW1wb3JhcmlseSwgcmVhZHkgZm9yIGRhdGFiaW5kaW5nLlxuXHRcdFx0Ly8gRHVyaW5nIGxpbmtpbmcsIGluIGFkZERhdGFCaW5kaW5nLCB0aGUgdGFnIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGxpbmtDdHgsXG5cdFx0XHQvLyBhbmQgdGhlbiBpbiBvYnNlcnZlQW5kQmluZCwgYmluZGluZ1N0b3JlW2JpbmRJZF0gd2lsbCBiZSByZXBsYWNlZCBieSBiaW5kaW5nIGluZm8uXG5cdFx0XHR0YWcuX3RnSWQgPSBcIlwiICsgaWQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSBiaW5kaW5nIG1hcmtlciBmb3IgYSB2aWV3XG5cdFx0Ly8gQWRkIHRoZSB2aWV3IHRvIHRoZSBzdG9yZSBvZiBjdXJyZW50IGxpbmtlZCB2aWV3c1xuXHRcdGVuZCA9IFwiX2BcIjtcblx0XHRhZGRMaW5rTWV0aG9kcyh2aWV3U3RvcmVbaWQgPSB2aWV3Ll8uaWRdID0gdmlldyk7XG5cdH1cblx0Ly8gRXhhbXBsZTogXCIjMjNeVGhlVmFsdWUvMjNeXCJcblx0cmV0dXJuIFwiI1wiICsgaWQgKyBlbmRcblx0XHQrICh2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IFwiXCIpIC8vIEZvciB7Xns6bmFtZX19IHRoaXMgZ2l2ZXMgdGhlIGVxdWl2YWxlbnQgc2VtYW50aWNzIHRvIGNvbXBpbGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gKHY9ZGF0YS5uYW1lKSE9bnVsbD92OlwiXCI7IHVzZWQgaW4ge3s6bmFtZX19IG9yIGRhdGEtbGluaz1cIm5hbWVcIlxuXHRcdCsgXCIvXCIgKyBpZCArIGVuZDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERhdGEtbGlua2luZyBhbmQgZGF0YSBiaW5kaW5nXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLy0tLS0tLS0tLS0tLS0tLVxuLy8gb2JzZXJ2ZUFuZEJpbmRcbi8vLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KSB7XG5cdHZhciBiaW5kaW5nLCBsLCBrLCBsaW5rZWRFbGVtLCBleHByRm5EZXBzLCBleHByT2IsIHByb3AsIHByb3BEZXBzLFxuXHRcdHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdGN2dEJrID0gbGlua0N0eC5jb252ZXJ0QmFjayxcblx0XHRkZXBlbmRzID0gW10sXG5cdFx0YmluZElkID0gbGlua0N0eC5fYm5kSWQgfHwgXCJcIiArIGJpbmRpbmdLZXkrKyxcblx0XHRoYW5kbGVyID0gbGlua0N0eC5faGRsO1xuXG5cdGxpbmtDdHguX2JuZElkID0gdW5kZWZpbmVkO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBVc2UgdGhlICdkZXBlbmRzJyBwYXRocyBzZXQgb24gbGlua0N0eC50YWcgLSB3aGljaCBtYXkgaGF2ZSBiZWVuIHNldCBvbiBkZWNsYXJhdGlvblxuXHRcdC8vIG9yIGluIGV2ZW50czogaW5pdCwgcmVuZGVyLCBvbkFmdGVyTGluayBldGMuXG5cdFx0ZGVwZW5kcyA9IHRhZy5kZXBlbmRzIHx8IGRlcGVuZHM7XG5cdFx0ZGVwZW5kcyA9ICRpc0Z1bmN0aW9uKGRlcGVuZHMpID8gdGFnLmRlcGVuZHModGFnKSA6IGRlcGVuZHM7XG5cdFx0bGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtO1xuXHR9XG5cdGlmICghbGlua0N0eC5fZGVwZW5kcyB8fCAoXCJcIiArIGxpbmtDdHguX2RlcGVuZHMgIT09IFwiXCIgKyBkZXBlbmRzKSkge1xuXHRcdC8vIE9ubHkgYmluZCB0aGUgZmlyc3QgdGltZSwgb3IgaWYgdGhlIG5ldyBkZXBlbmRzICh0b1N0cmluZykgaGFzIGNoYW5nZWQgZnJvbSB3aGVuIGxhc3QgYm91bmRcblx0XHRpZiAobGlua0N0eC5fZGVwZW5kcykge1xuXHRcdFx0Ly8gVW5vYnNlcnZlIHByZXZpb3VzIGJpbmRpbmdcblx0XHRcdCRvYnNlcnZhYmxlLl9hcHBseShmYWxzZSwgW3NvdXJjZV0sIGxpbmtDdHguX2RlcGVuZHMsIGhhbmRsZXIsIHRydWUpO1xuXHRcdH1cblxuXHRcdGV4cHJGbkRlcHMgPSBsaW5rQ3R4LmZuLmRlcHMuc2xpY2UoKTsgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGRlcGVuZGVuY3kgcGF0aHMgZm9yIHRoZSBjb21waWxlZCBsaW5rQ3R4IGV4cHJlc3Npb24gLSB0byBwYXNzIHRvIG9ic2VydmUoKS4gSW4gZ2V0SW5uZXJDYigpLFxuXHRcdC8vIChhbmQgd2hlbmV2ZXIgdGhlIG9iamVjdCBpcyB1cGRhdGVkLCBpbiBpbm5lckNiKSwgd2Ugd2lsbCBzZXQgZXhwck9iLm9iIHRvIHRoZSBjdXJyZW50IG9iamVjdCByZXR1cm5lZCBieSB0aGF0IGNvbXB1dGVkIGV4cHJlc3Npb24sIGZvciB0aGlzIHZpZXcuXG5cblx0XHRpZiAodGFnICYmIHRhZy5ib3VuZFByb3BzKSB7XG5cdFx0XHQvLyBBZGQgZGVwZW5kZW5jeSBwYXRocyBmb3IgZGVjbGFyZWQgYm91bmRQcm9wcyAoc28gbm8gbmVlZCB0byB3cml0aCBebXlwcm9wPS4uLiB0byBnZXQgYmluZGluZykgYW5kIGZvciBsaW5rZWRQcm9wIHRvbyBpZiB0aGVyZSBpcyBvbmVcblx0XHRcdGwgPSB0YWcuYm91bmRQcm9wcy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdHByb3AgPSB0YWcuYm91bmRQcm9wc1tsXTtcblx0XHRcdFx0ayA9IHRhZy5fLmJuZC5wYXRocy5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlIChrLS0pIHtcblx0XHRcdFx0XHRwcm9wRGVwcyA9IHRhZy5fLmJuZC5wYXRoc1trXVtwcm9wXTtcblx0XHRcdFx0XHRpZiAocHJvcERlcHMgJiYgcHJvcERlcHMuc2twKSB7IC8vIE5vdCBhbHJlYWR5IGEgYm91bmQgcHJvcCBecHJvcD1leHByZXNzaW9uO1xuXHRcdFx0XHRcdFx0ZXhwckZuRGVwcyA9IGV4cHJGbkRlcHMuY29uY2F0KHByb3BEZXBzKTsgLy8gQWRkIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBwcm9wIGV4cHJlc3Npb25cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsID0gZXhwckZuRGVwcy5sZW5ndGg7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0ZXhwck9iID0gZXhwckZuRGVwc1tsXTtcblx0XHRcdGlmIChleHByT2IuX2pzdikge1xuXHRcdFx0XHQvLyBUaGlzIHBhdGggaXMgYW4gJ2V4cHJPYicsIGNvcnJlc3BvbmRpbmcgdG8gYSBjb21wdXRlZCwgcmV0dXJuaW5nIGFuIG9iamVjdC4gV2UgcmVwbGFjZSB0aGUgZXhwck9iIGJ5XG5cdFx0XHRcdC8vIGEgdmlldy1iaW5kaW5nLXNwZWNpZmljIGV4cHJPYiBpbnN0YW5jZS4gVGhlIGN1cnJlbnQgb2JqZWN0IHdpbGwgYmUgc3RvcmVkIGFzIGV4cHJPYi5vYi5cblx0XHRcdFx0ZXhwckZuRGVwc1tsXSA9ICRleHRlbmQoe30sIGV4cHJPYik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YmluZGluZyA9ICRvYnNlcnZhYmxlLl9hcHBseShcblx0XHRcdGZhbHNlLFxuXHRcdFx0W3NvdXJjZV0sXG5cdFx0XHRleHByRm5EZXBzLCAvLyBmbGF0dGVuIHRoZSBwYXRocyAtIHRvIGdhdGhlciBhbGwgdGhlIGRlcGVuZGVuY2llcyBhY3Jvc3MgYXJncyBhbmQgYm91bmQgcGFyYW1zXG5cdFx0XHRkZXBlbmRzLFxuXHRcdFx0aGFuZGxlcixcblx0XHRcdGxpbmtDdHguX2N0eENiKTtcblx0XHQvLyBUaGUgYmluZGluZyByZXR1cm5lZCBieSAkb2JzZXJ2ZSBoYXMgYSBibmQgYXJyYXkgd2l0aCB0aGUgc291cmNlIG9iamVjdHMgb2YgdGhlIGluZGl2aWR1YWwgYmluZGluZ3MuXG5cblx0XHRiaW5kaW5nLmVsZW0gPSB0YXJnZXQ7IC8vIFRoZSB0YXJnZXQgb2YgYWxsIHRoZSBpbmRpdmlkdWFsIGJpbmRpbmdzXG5cdFx0YmluZGluZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRiaW5kaW5nLl90Z0lkID0gYmluZElkO1xuXG5cdFx0Ly8gQWRkIHRvIHRoZSBfanN2Qm5kIG9uIHRoZSB0YXJnZXQgdGhlIHZpZXcgaWQgYW5kIGJpbmRpbmcgaWQgLSBmb3IgdW5iaW5kaW5nIHdoZW4gdGhlIHRhcmdldCBlbGVtZW50IGlzIHJlbW92ZWRcblx0XHR0YXJnZXQuX2pzdkJuZCA9IHRhcmdldC5fanN2Qm5kIHx8IFwiXCI7XG5cdFx0dGFyZ2V0Ll9qc3ZCbmQgKz0gXCImXCIgKyBiaW5kSWQ7XG5cdFx0bGlua0N0eC5fZGVwZW5kcyA9IGRlcGVuZHM7XG5cdFx0Ly8gU3RvcmUgdGhlIGJpbmRpbmcga2V5IG9uIHRoZSB2aWV3LCBmb3IgZGlzcG9zYWwgd2hlbiB0aGUgdmlldyBpcyByZW1vdmVkXG5cdFx0bGlua0N0eC52aWV3Ll8uYm5kc1tiaW5kSWRdID0gYmluZElkO1xuXHRcdC8vIFN0b3JlIHRoZSBiaW5kaW5nLlxuXHRcdGJpbmRpbmdTdG9yZVtiaW5kSWRdID0gYmluZGluZzsgLy8gTm90ZTogSWYgdGhpcyBjb3JyZXNwb25kcyB0byBhIGRhdGEtbGlua2VkIHRhZywgd2UgYXJlIHJlcGxhY2luZyB0aGVcblx0XHQvLyB0ZW1wb3JhcmlseSBzdG9yZWQgdGFnIGJ5IHRoZSBzdG9yZWQgYmluZGluZy4gVGhlIHRhZyB3aWxsIG5vdyBiZSBhdCBiaW5kaW5nLmxpbmtDdHgudGFnXG5cblx0XHRpZiAobGlua2VkRWxlbSkge1xuXHRcdFx0bCA9IGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRsaW5rZWRFbGVtW2xdLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCBsaW5rZWRFbGVtW2xdKTtcblx0XHRcdFx0bGlua2VkRWxlbVtsXS5fanN2Qm5kID0gXCImXCIgKyBiaW5kaW5nLl90Z0lkICsgXCIrXCI7IC8vIEFkZCBhIFwiK1wiIGZvciBjbG9uZWQgYmluZGluZyAtIHNvIHJlbW92aW5nXG5cdFx0XHRcdC8vIGVsZW1zIHdpdGggY2xvbmVkIGJpbmRpbmdzIHdpbGwgbm90IHJlbW92ZSB0aGUgJ3BhcmVudCcgYmluZGluZyBmcm9tIHRoZSBiaW5kaW5nU3RvcmUuXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjdnRCayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCB0YXJnZXQsIGN2dEJrKTtcblx0XHR9XG5cblx0XHRpZiAodGFnKSB7XG5cdFx0XHRpZiAoIXRhZy5mbG93ICYmICF0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0dGFyZ2V0LnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCAodGFyZ2V0LmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKXx8XCJcIikgKyBcIiNcIiArIGJpbmRJZCArIFwiXi9cIiArIGJpbmRJZCArIFwiXlwiKTtcblx0XHRcdFx0dGFnLl90Z0lkID0gXCJcIiArIGJpbmRJZDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLy8tLS0tLS0tXG4vLyAkLmxpbmtcbi8vLS0tLS0tLVxuXG5mdW5jdGlvbiB0bXBsTGluayh0bywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRyZXR1cm4gJGxpbmsodGhpcywgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpO1xufVxuXG5mdW5jdGlvbiAkbGluayh0bXBsT3JMaW5rRXhwciwgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0Ly8gV2hlbiBsaW5raW5nIGZyb20gYSB0ZW1wbGF0ZSwgcHJldk5vZGUgYW5kIG5leHROb2RlIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWRcblx0aWYgKGNvbnRleHQgPT09IHRydWUpIHtcblx0XHRub0l0ZXJhdGlvbiA9IGNvbnRleHQ7IC8vIHBhc3NpbmcgYm9vbGVhbiBhcyB0aGlyZCBwYXJhbSAtIG5vSXRlcmF0aW9uXG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICh0eXBlb2YgY29udGV4dCAhPT0gXCJvYmplY3RcIikge1xuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7IC8vIGNvbnRleHQgbXVzdCBiZSBhIGJvb2xlYW4gKG5vSXRlcmF0aW9uKSBvciBhIHBsYWluIG9iamVjdFxuXHR9IGVsc2Uge1xuXHRcdGNvbnRleHQgPSAkZXh0ZW5kKHt9LCBjb250ZXh0KTtcblx0fVxuXHRpZiAodG1wbE9yTGlua0V4cHIgJiYgdG8pIHtcblx0XHR0byA9IHRvLmpxdWVyeSA/IHRvIDogJCh0byk7IC8vIHRvIGlzIGEganF1ZXJ5IG9iamVjdCBvciBhbiBlbGVtZW50IG9yIHNlbGVjdG9yXG5cblx0XHRpZiAoIWFjdGl2ZUJvZHkpIHtcblx0XHRcdGFjdGl2ZUJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHRcdFx0JChhY3RpdmVCb2R5KVxuXHRcdFx0XHQub24oZWxlbWVudENoYW5nZVN0ciwgZWxlbUNoYW5nZUhhbmRsZXIpXG5cdFx0XHRcdC5vbignYmx1cicsICdbY29udGVudGVkaXRhYmxlXScsIGVsZW1DaGFuZ2VIYW5kbGVyKTtcblx0XHR9XG5cblx0XHR2YXIgaSwgaywgaHRtbCwgdndJbmZvcywgdmlldywgcGxhY2Vob2xkZXJQYXJlbnQsIHRhcmdldEVsLCByZWZyZXNoLCB0b3BMZXZlbENhbGwsXG5cdFx0XHRvblJlbmRlciA9IGFkZEJpbmRpbmdNYXJrZXJzLFxuXHRcdFx0cmVwbGFjZU1vZGUgPSBjb250ZXh0ICYmIGNvbnRleHQudGFyZ2V0ID09PSBcInJlcGxhY2VcIixcblx0XHRcdGwgPSB0by5sZW5ndGg7XG5cblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHR0YXJnZXRFbCA9IHRvW2xdO1xuXG5cdFx0XHRwYXJlbnRWaWV3ID0gcGFyZW50VmlldyB8fCAkdmlldyh0YXJnZXRFbCk7XG5cblx0XHRcdGlmICh0b3BMZXZlbENhbGwgPSBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdHRvcFZpZXcuZGF0YSA9ICh0b3BWaWV3LmN0eCA9IGNvbnRleHQgfHwge30pLnJvb3QgPSBmcm9tO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFwiXCIgKyB0bXBsT3JMaW5rRXhwciA9PT0gdG1wbE9yTGlua0V4cHIpIHtcblx0XHRcdFx0Ly8gdG1wbE9yTGlua0V4cHIgaXMgYSBzdHJpbmc6IHRyZWF0IGFzIGRhdGEtbGluayBleHByZXNzaW9uLlxuXHRcdFx0XHRhZGREYXRhQmluZGluZyh0bXBsT3JMaW5rRXhwciwgdGFyZ2V0RWwsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdHJ1ZSwgZnJvbSwgY29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodG1wbE9yTGlua0V4cHIubWFya3VwICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKClcblx0XHRcdFx0XHRpZiAocmVwbGFjZU1vZGUpIHtcblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyUGFyZW50ID0gdGFyZ2V0RWwucGFyZW50Tm9kZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRodG1sID0gdG1wbE9yTGlua0V4cHIucmVuZGVyKGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCB1bmRlZmluZWQsIG9uUmVuZGVyKTtcblx0XHRcdFx0XHQvLyBUT0RPIENvbnNpZGVyIGZpbmRpbmcgYSB3YXkgdG8gYmluZCBkYXRhIChsaW5rKSB3aXRoaW4gdGVtcGxhdGUgd2l0aG91dCBodG1sIGJlaW5nIGRpZmZlcmVudCBmb3IgZWFjaCB2aWV3LCB0aGUgSFRNTCBjYW5cblx0XHRcdFx0XHQvLyBiZSBldmFsdWF0ZWQgb25jZSBvdXRzaWRlIHRoZSB3aGlsZSAobC0tKSwgYW5kIHB1c2hlZCBpbnRvIGEgZG9jdW1lbnQgZnJhZ21lbnQsIHRoZW4gY2xvbmVkIGFuZCBpbnNlcnRlZCBhdCBlYWNoIHRhcmdldC5cblxuXHRcdFx0XHRcdGlmIChwbGFjZWhvbGRlclBhcmVudCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyB0YXJnZXQ9XCJyZXBsYWNlXCIgbW9kZVxuXHRcdFx0XHRcdFx0cHJldk5vZGUgPSB0YXJnZXRFbC5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHRcdFx0XHRuZXh0Tm9kZSA9IHRhcmdldEVsLm5leHRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0JC5jbGVhbkRhdGEoW3RhcmdldEVsXSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRwbGFjZWhvbGRlclBhcmVudC5yZW1vdmVDaGlsZCh0YXJnZXRFbCk7XG5cblx0XHRcdFx0XHRcdHRhcmdldEVsID0gcGxhY2Vob2xkZXJQYXJlbnQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHByZXZOb2RlID0gbmV4dE5vZGUgPSB1bmRlZmluZWQ7IC8vIFdoZW4gbGlua2luZyBmcm9tIGEgdGVtcGxhdGUsIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkXG5cdFx0XHRcdFx0XHQkKHRhcmdldEVsKS5lbXB0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0bXBsT3JMaW5rRXhwciA9PT0gdHJ1ZSAmJiBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdFx0Ly8gJC5saW5rKHRydWUsIHNlbGVjdG9yLCBkYXRhLCBjdHgpIC0gd2hlcmUgc2VsZWN0b3IgcG9pbnRzIHRvIGVsZW0gaW4gdG9wLWxldmVsIGNvbnRlbnQuIChJZiBub3QgdG9wLWxldmVsIGNvbnRlbnQsIG5vLW9wKVxuXHRcdFx0XHRcdHJlZnJlc2ggPSB7bG5rOiAxfTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG4vLyBUT0RPIENvbnNpZGVyIGRlZmVycmVkIGxpbmtpbmcgQVBJIGZlYXR1cmUgb24gcGVyLXRlbXBsYXRlIGJhc2lzIC0ge0B7IGluc3RlYWQgb2Yge157IHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIHJlbmRlcmVkIGNvbnRlbnRcbi8vIGJlZm9yZSB0aGF0IGNvbnRlbnQgaXMgbGlua2VkLCB3aXRoIGJldHRlciBwZXJjZWl2ZWQgcGVyZi4gSGF2ZSB2aWV3LmxpbmsgcmV0dXJuIGEgZGVmZXJyZWQsIGFuZCBwYXNzIHRoYXQgdG8gb25BZnRlckxpbmsuLi5cbi8vIG9yIHNvbWV0aGluZyBhbG9uZyB0aG9zZSBsaW5lcy5cbi8vIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0aWYgKHRhcmdldEVsLl9kZiAmJiAhbmV4dE5vZGUpIHtcblx0XHRcdFx0XHQvLyBXZSBhcmUgaW5zZXJ0aW5nIG5ldyBjb250ZW50IGFuZCB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzIHNvbWUgZGVmZXJyZWQgYmluZGluZyBhbm5vdGF0aW9ucyxhbmQgdGhlcmUgaXMgbm8gbmV4dE5vZGUuXG5cdFx0XHRcdFx0Ly8gVGhvc2Ugdmlld3MgbWF5IGJlIHN0YWxlIHZpZXdzICh0aGF0IHdpbGwgYmUgcmVjcmVhdGVkIGluIHRoaXMgbmV3IGxpbmtpbmcgYWN0aW9uKSBzbyB3ZSB3aWxsIGZpcnN0IHJlbW92ZSB0aGVtXG5cdFx0XHRcdFx0Ly8gKGlmIG5vdCBhbHJlYWR5IHJlbW92ZWQpLlxuXHRcdFx0XHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3ModGFyZ2V0RWwuX2RmLCB0cnVlLCByT3BlblZpZXdNYXJrZXJzKTtcblxuXHRcdFx0XHRcdGZvciAoaSA9IDAsIGsgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGs7IGkrKykge1xuXHRcdFx0XHRcdFx0dmlldyA9IHZ3SW5mb3NbaV07XG5cdFx0XHRcdFx0XHRpZiAoKHZpZXcgPSB2aWV3U3RvcmVbdmlldy5pZF0pICYmIHZpZXcuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoaXMgaXMgdGhlIF9wcnYgKHByZXZOb2RlKSBmb3IgYSB2aWV3LCByZW1vdmUgdGhlIHZpZXdcblx0XHRcdFx0XHRcdFx0Ly8gLSB1bmxlc3Mgdmlldy5kYXRhIGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHRcdFx0dmlldy5wYXJlbnQucmVtb3ZlVmlld3Modmlldy5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0RWwpOyAvLyByZW1vdmUgZGVmZXIgdG9rZW5zXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMaW5rIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50LCBzaW5jZSB0aGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKCksIG9yIHRvICQoZWwpLmxpbmsodHJ1ZSwgLi4uKSxcblx0XHRcdFx0cGFyZW50Vmlldy5saW5rKGZyb20sIHRhcmdldEVsLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIGh0bWwsIHJlZnJlc2gsIGNvbnRleHQpO1xuLy99LCAwKTtcblx0XHRcdH1cblx0XHRcdGlmICh0b3BMZXZlbENhbGwpIHtcblx0XHRcdFx0dG9wVmlldy5kYXRhID0gdG9wVmlldy5jdHggPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0bzsgLy8gQWxsb3cgY2hhaW5pbmcsIHRvIGF0dGFjaCBldmVudCBoYW5kbGVycywgZXRjLlxufVxuXG4vLy0tLS0tLS0tLS1cbi8vIHZpZXcubGlua1xuLy8tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHZpZXdMaW5rKG91dGVyRGF0YSwgcGFyZW50Tm9kZSwgcHJldk5vZGUsIG5leHROb2RlLCBodG1sLCByZWZyZXNoLCBjb250ZXh0LCB2YWxpZGF0ZU9ubHkpIHtcblx0Ly8gT3B0aW9uYWxseSBpbnNlcnQgSFRNTCBpbnRvIERPTSB1c2luZyBkb2N1bWVudEZyYWdtZW50cyAoYW5kIHdyYXBwaW5nIEhUTUwgYXBwcm9wcmlhdGVseSkuXG5cdC8vIERhdGEtbGluayBleGlzdGluZyBjb250ZW50cyBvZiBwYXJlbnROb2RlLCBvciB0aGUgaW5zZXJ0ZWQgSFRNTCwgaWYgcHJvdmlkZWRcblxuXHQvLyBEZXBlbmRpbmcgb24gdGhlIGNvbnRlbnQgbW9kZWwgZm9yIHRoZSBIVE1MIGVsZW1lbnRzLCB0aGUgc3RhbmRhcmQgZGF0YS1saW5raW5nIG1hcmtlcnMgaW5zZXJ0ZWQgaW4gdGhlIEhUTUwgYnkgYWRkQmluZGluZ01hcmtlcnMgZHVyaW5nXG5cdC8vIHRlbXBsYXRlIHJlbmRlcmluZyB3aWxsIGJlIGNvbnZlcnRlZCBlaXRoZXIgdG8gc2NyaXB0IG1hcmtlciBub2RlcyBvciwgZm9yIGVsZW1lbnQtb25seSBjb250ZW50IHNlY3Rpb25zLCB0byBkYXRhLWpzdiBlbGVtZW50IGFubm90YXRpb25zLlxuXG5cdC8vIERhdGEtbGlua2luZyB3aWxsIHRoZW4gYWRkIF9wcnYgYW5kIF9ueHQgdG8gdmlld3MsIHdoZXJlOlxuXHQvLyAgICAgX3BydjogUmVmZXJlbmNlcyB0aGUgcHJldmlvdXMgbm9kZSAoc2NyaXB0IGVsZW1lbnQgb2YgdHlwZSBcImpzdjEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIGZpcnN0IGVsZW1lbnQgbm9kZSBpbiB0aGUgdmlldyAob3IgaWYgbm9uZSwgc2V0IF9wcnYgPSBfbnh0KVxuXHQvLyAgICAgX254dDogUmVmZXJlbmNlcyB0aGUgbGFzdCBub2RlIChzY3JpcHQgZWxlbWVudCBvZiB0eXBlIFwianN2LzEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIG5leHQgZWxlbWVudCBub2RlIGFmdGVyIHRoZSB2aWV3LlxuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gY29udmVydE1hcmtlcnMoYWxsLCBwcmVjZWRpbmcsIHNlbGZDbG9zZSwgY2xvc2VUYWcsIHNwYWNlQmVmb3JlLCBpZCwgYm91bmRJZCwgc3BhY2VBZnRlciwgdGFnMSwgdGFnMiwgY2xvc2VUYWcyLCBzcGFjZUFmdGVyQ2xvc2UsIHNlbGZDbG9zZTIsIGVuZE9wZW5UYWcpIHtcblx0XHQvLyByQ29udmVydE1hcmtlcnMgPSAvKF58KFxcLz4pfDxcXC8oXFx3Kyk+fCkoXFxzKikoWyNcXC9dXFxkKyg/Ol98KFxcXikpKWAoXFxzKikoPFxcdysoPz1bXFxzXFwvPl0pKT98XFxzKig/Oig8XFx3Kyg/PVtcXHNcXC8+XSkpfDxcXC8oXFx3Kyk+KFxccyopfChcXC8+KVxccyp8KD4pKS9nLFxuXHRcdC8vICAgICAgICAgICAgICAgICBwcmVjLCBzbGZDbCwgY2xzVGFnLCAgc3BCZWZvcmUsIGlkLCAgICAgIGJuZElkICBzcEFmdGVyLHRhZzEsICAgICAgICAgICAgICAgICAgIHRhZzIsICAgICAgICAgICAgICAgY2xUYWcyLHNhYyAgc2xmQ2wyLCBlbmRPcGVuVGFnXG5cdFx0Ly8gQ29udmVydCB0aGUgbWFya2VycyB0aGF0IHdlcmUgaW5jbHVkZWQgYnkgYWRkQmluZGluZ01hcmtlcnMgaW4gdGVtcGxhdGUgb3V0cHV0LCB0byBhcHByb3ByaWF0ZSBET00gYW5ub3RhdGlvbnM6XG5cdFx0Ly8gZGF0YS1qc3YgYXR0cmlidXRlcyAoZm9yIGVsZW1lbnQtb25seSBjb250ZW50KSBvciBzY3JpcHQgbWFya2VyIG5vZGVzICh3aXRoaW4gcGhyYXNpbmcgb3IgZmxvdyBjb250ZW50KS5cblxuLy8gVE9ETyBjb25zaWRlciBkZXRlY3RpbmcgJ3F1b3RlZCcgY29udGV4dHMgKGF0dHJpYnV0ZSBzdHJpbmdzKSBzbyB0aGF0IGF0dHJpYnV0ZSBlbmNvZGluZyBkb2VzIG5vdCBuZWVkIHRvIGVuY29kZSA+XG4vLyBDdXJyZW50bHkgckF0dHJFbmNvZGUgPSAvWz48XCInJl0vZyBpbmNsdWRlcyAnPicgZW5jb2RpbmcgaW4gb3JkZXIgdG8gYXZvaWQgZXJyb25lb3VzIHBhcnNpbmcgb2YgPHNwYW4gdGl0bGU9XCImbHQ7YS8+XCI+PC9zcGFuPlwiPlxuXHRcdHZhciBlcnJvck1zZywgYm5kSWQsXG5cdFx0XHRlbmRPZkVsQ250ID0gXCJcIjtcblx0XHRpZiAoZW5kT3BlblRhZykge1xuXHRcdFx0aW5UYWcgPSAwO1xuXHRcdFx0cmV0dXJuIGFsbDtcblx0XHR9XG5cdFx0dGFnID0gdGFnMSB8fCB0YWcyIHx8IFwiXCI7XG5cdFx0Y2xvc2VUYWcgPSBjbG9zZVRhZyB8fCBjbG9zZVRhZzI7XG5cdFx0c2VsZkNsb3NlID0gc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTI7XG5cdFx0aWYgKGlzVm9pZCAmJiAhc2VsZkNsb3NlICYmICggIWFsbCB8fCBjbG9zZVRhZyB8fCB0YWcgfHwgaWQgJiYgIWluVGFnKSkgeyAvLyAhYWxsID0gZW5kIG9mIHN0cmluZ1xuXHRcdFx0aXNWb2lkID0gdW5kZWZpbmVkO1xuXHRcdFx0cGFyZW50VGFnID0gdGFnU3RhY2suc2hpZnQoKTsgLy8gcHJlY2VkaW5nIHRhZyB3YXMgYSB2b2lkIGVsZW1lbnQsIHdpdGggbm8gY2xvc2luZyBzbGFzaCwgc3VjaCBhcyA8YnI+LlxuXHRcdH1cblx0XHRjbG9zZVRhZyA9IGNsb3NlVGFnIHx8IHNlbGZDbG9zZTtcblx0XHRpZiAoY2xvc2VUYWcpIHtcblx0XHRcdGluVGFnID0gMDtcblx0XHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRcdC8vIFRPRE86IHNtYXJ0IGluc2VydGlvbiBvZiA8dGJvZHk+IC0gdG8gYmUgY29tcGxldGVkIGZvciByb2J1c3QgaW5zZXJ0aW9uIG9mIGRlZmVycmVkIGJpbmRpbmdzIGV0Yy5cblx0XHRcdC8vaWYgKGNsb3NlVGFnID09PSBcInRhYmxlXCIgJiYgcGFyZW50VGFnID09PSBcInRib2R5XCIpIHtcblx0XHRcdC8vXHRwcmVjZWRpbmcgPSBcIjwvdGJvZHk+XCIgKyBwcmVjZWRpbmc7XG5cdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0YWJsZVwiO1xuXHRcdFx0Ly9cdHRhZ1N0YWNrLnNoaWZ0KCk7XG5cdFx0XHQvL31cblx0XHRcdGlmICh2YWxpZGF0ZSkge1xuXHRcdFx0XHRpZiAoc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTIpIHtcblx0XHRcdFx0XHRpZiAoIXZvaWRFbGVtc1twYXJlbnRUYWddICYmICEvO3N2Zzt8O21hdGg7Ly50ZXN0KFwiO1wiICsgdGFnU3RhY2suam9pbihcIjtcIikgKyBcIjtcIikpIHtcblx0XHRcdFx0XHRcdC8vIE9ubHkgc2VsZi1jbG9zaW5nIGVsZW1lbnRzIG11c3QgYmUgbGVnaXRpbWF0ZSB2b2lkIGVsZW1lbnRzLCBzdWNoIGFzIDxici8+LCBwZXIgSFRNTCBzY2hlbWEsXG5cdFx0XHRcdFx0XHQvLyBvciB1bmRlciBzdmcgb3IgbWF0aCBmb3JlaWduIG5hbWVzcGFjZSBlbGVtZW50cy5cblx0XHRcdFx0XHRcdGVycm9yTXNnID0gXCInPFwiICsgcGFyZW50VGFnICsgXCIuLi4vXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZvaWRFbGVtc1tjbG9zZVRhZ10pIHtcblx0XHRcdFx0XHRlcnJvck1zZyA9IFwiJzwvXCIgKyBjbG9zZVRhZzsgLy8gY2xvc2luZyB0YWcgc3VjaCBhcyA8L2lucHV0PlxuXHRcdFx0XHR9IGVsc2UgaWYgKCF0YWdTdGFjay5sZW5ndGggfHwgY2xvc2VUYWcgIT09IHBhcmVudFRhZykge1xuXHRcdFx0XHRcdGVycm9yTXNnID0gXCJNaXNtYXRjaDogJzwvXCIgKyBjbG9zZVRhZztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyb3JNc2cpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihlcnJvck1zZyArIFwiPicgaW46XFxuXCIgKyBodG1sKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJldkVsQ250ID0gZWxDbnQ7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWdTdGFjay5zaGlmdCgpO1xuXHRcdFx0ZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXTtcblx0XHRcdGNsb3NlVGFnMiA9IGNsb3NlVGFnMiA/IChcIjwvXCIgKyBjbG9zZVRhZzIgKyBcIj5cIikgOiBcIlwiO1xuXHRcdFx0aWYgKHByZXZFbENudCkge1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHRcdGRlZmVyICs9IGlkcztcblx0XHRcdFx0aWRzID0gXCJcIjtcblx0XHRcdFx0aWYgKCFlbENudCkge1xuXHRcdFx0XHRcdGVuZE9mRWxDbnQgPSBjbG9zZVRhZzIgKyBvcGVuU2NyaXB0ICsgXCJAXCIgKyBkZWZlciArIGNsb3NlU2NyaXB0ICsgKHNwYWNlQWZ0ZXJDbG9zZSB8fCBcIlwiKTtcblx0XHRcdFx0XHRkZWZlciA9IGRlZmVyU3RhY2suc2hpZnQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlciArPSBcIi1cIjsgLy8gV2lsbCBiZSB1c2VkIGZvciBzdGVwcGluZyBiYWNrIHRocm91Z2ggZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHQvLyBlbENvbnRlbnQgbWFwcyB0YWdOYW1lcyB3aGljaCBoYXZlIG9ubHkgZWxlbWVudCBjb250ZW50LCBzbyBtYXkgbm90IHN1cHBvcnQgc2NyaXB0IG5vZGVzLlxuXHRcdFx0Ly8gV2UgYXJlIGluIGVsZW1lbnQtb25seSBjb250ZW50LCBjYW4gcmVtb3ZlIHdoaXRlIHNwYWNlLCBhbmQgdXNlIGRhdGEtanN2IGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgYXMgbWFya2Vyc1xuXHRcdFx0Ly8gRXhhbXBsZTogPHRyIGRhdGEtanN2PVwiLzJfIzZfXCI+IC0gY2xvc2UgbWFya2VyIGZvciB2aWV3IDIgYW5kIG9wZW4gbWFya2VyIGZvciB2aWV3IDZcblxuXHRcdFx0aWYgKGlkKSB7XG5cdFx0XHRcdC8vIGFwcGVuZCBtYXJrZXIgZm9yIHRoaXMgaWQsIHRvIGlkcyBzdHJpbmdcblx0XHRcdFx0aWRzICs9IGlkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJlY2VkaW5nID0gKGNsb3NlVGFnMiB8fCBzZWxmQ2xvc2UyIHx8IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHQvLyBUT0RPOiBzbWFydCBpbnNlcnRpb24gb2YgPHRib2R5PiAtIHRvIGJlIGNvbXBsZXRlZCBmb3Igcm9idXN0IGluc2VydGlvbiBvZiBkZWZlcnJlZCBiaW5kaW5ncyBldGMuXG5cdFx0XHRcdC8vaWYgKHRhZyA9PT0gXCI8dHJcIiAmJiBwYXJlbnRUYWcgPT09IFwidGFibGVcIikge1xuXHRcdFx0XHQvL1x0dGFnU3RhY2sudW5zaGlmdChwYXJlbnRUYWcpO1xuXHRcdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0Ym9keVwiO1xuXHRcdFx0XHQvL1x0cHJlY2VkaW5nICs9IFwiPFwiICsgcGFyZW50VGFnICsgXCI+XCI7XG5cdFx0XHRcdC8vXHRpZiAoZGVmZXIpIHtcblx0XHRcdFx0Ly9cdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0XHQvL1x0fVxuXHRcdFx0XHQvL1x0Ly8gVE9ETzogbW92ZSB0aGlzIHRvIGRlc2lnbi10aW1lIHZhbGlkYXRpb24gY2hlY2tcblx0XHRcdFx0Ly9cdC8vXHRlcnJvcignXCInICsgcGFyZW50VGFnICsgJ1wiIGhhcyBpbmNvcnJlY3QgcGFyZW50IHRhZycpO1xuXHRcdFx0XHQvL31cblx0XHRcdFx0cHJlY2VkaW5nICs9IHRhZztcblx0XHRcdFx0aWYgKGlkcykge1xuXHRcdFx0XHRcdHByZWNlZGluZyArPSAnICcgKyBqc3ZBdHRyU3RyICsgJz1cIicgKyBpZHMgKyAnXCInO1xuXHRcdFx0XHRcdGlkcyA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgYXJlIGluIHBocmFzaW5nIG9yIGZsb3cgY29udGVudCwgc28gdXNlIHNjcmlwdCBtYXJrZXIgbm9kZXNcblx0XHRcdC8vIEV4YW1wbGU6IDxzY3JpcHQgdHlwZT1cImpzdjMvXCI+PC9zY3JpcHQ+IC0gZGF0YS1saW5rZWQgdGFnLCBjbG9zZSBtYXJrZXJcblx0XHRcdC8vIFdlIHZhbGlkYXRlIHdpdGggaW5UYWcgc28gbm8gc2NyaXB0IG1hcmtlcnMgYXJlIGluc2VydGVkIGluIGF0dHJpYnV0ZSBjb250ZXh0IGUuZy4gZm9yOlxuXHRcdFx0Ly8gXCI8dGFibGUge3tpZiAuLi59fS4uLnt7L2lmfX0uLi4gPlwiIG9yIFwiPHRhYmxlIHt7aWYgLi4ufX0uLi4+IC4uLnt7L2lmfX0uLi5cIlxuXHRcdFx0cHJlY2VkaW5nID0gaWRcblx0XHRcdFx0PyAocHJlY2VkaW5nICsgZW5kT2ZFbENudCArIHNwYWNlQmVmb3JlICsgKGluVGFnID8gXCJcIiA6IG9wZW5TY3JpcHQgKyBpZCArIGNsb3NlU2NyaXB0KSsgc3BhY2VBZnRlciArIHRhZylcblx0XHRcdFx0OiBlbmRPZkVsQ250IHx8IGFsbDtcblx0XHR9XG5cblx0XHRpZiAodmFsaWRhdGUgJiYgYm91bmRJZCkge1xuXHRcdFx0aWYgKGluVGFnKSB7XG5cdFx0XHRcdC8vIEpzVmlld3MgZGF0YS1saW5raW5nIHRhZ3MgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbiBlbGVtZW50IG1hcmt1cC5cblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzMwM1xuXHRcdFx0XHRzeW50YXhFcnJvcigne157IHdpdGhpbiBlbGVtIG1hcmt1cCAoJyArIGluVGFnICsgJyApLiBVc2UgZGF0YS1saW5rPVwiLi4uXCInKTtcblx0XHRcdH1cblx0XHRcdGlmIChpZC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdHRhZ1N0YWNrLnVuc2hpZnQoaWQuc2xpY2UoMSkpO1xuXHRcdFx0fSBlbHNlIGlmIChpZC5zbGljZSgxKSAhPT0gKGJuZElkID0gdGFnU3RhY2suc2hpZnQoKSkpIHtcblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzIxM1xuXHRcdFx0XHRzeW50YXhFcnJvcignQ2xvc2luZyB0YWcgZm9yIHteey4uLn19IHVuZGVyIGRpZmZlcmVudCBlbGVtOiA8JyArIGJuZElkICsgJz4nKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRhZykge1xuXHRcdFx0aW5UYWcgPSB0YWc7XG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHR0YWdTdGFjay51bnNoaWZ0KHBhcmVudFRhZyk7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWcuc2xpY2UoMSk7XG5cdFx0XHRpZiAodmFsaWRhdGUgJiYgdGFnU3RhY2tbMF0gJiYgdGFnU3RhY2tbMF0gPT09IGJhZFBhcmVudFtwYXJlbnRUYWddKSB7XG5cdFx0XHRcdC8vIE1pc3NpbmcgPHRib2R5PlxuXHRcdFx0XHQvLyBUT0RPOiByZXBsYWNlIHRoaXMgYnkgc21hcnQgaW5zZXJ0aW9uIG9mIDx0Ym9keT4gdGFnc1xuXHRcdFx0XHRlcnJvcignUGFyZW50IG9mIDx0cj4gbXVzdCBiZSA8dGJvZHk+Jyk7XG5cdFx0XHR9XG5cdFx0XHRpc1ZvaWQgPSB2b2lkRWxlbXNbcGFyZW50VGFnXTtcblx0XHRcdGlmICgoZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXSkgJiYgIXByZXZFbENudCkge1xuXHRcdFx0XHRkZWZlclN0YWNrLnVuc2hpZnQoZGVmZXIpO1xuXHRcdFx0XHRkZWZlciA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRwcmV2RWxDbnQgPSBlbENudDtcbi8vVE9ETyBDb25zaWRlciBwcm92aWRpbmcgdmFsaWRhdGlvbiB3aGljaCB0aHJvd3MgaWYgeW91IHBsYWNlIDxzcGFuPiBhcyBjaGlsZCBvZiA8dHI+LCBldGMuIC0gc2luY2UgaWYgbm90IGNhdWdodCxcbi8vdGhpcyBjYW4gY2F1c2UgZXJyb3JzIHN1YnNlcXVlbnRseSB3aGljaCBhcmUgZGlmZmljdWx0IHRvIGRlYnVnLlxuLy9cdFx0XHRcdGlmIChlbENvbnRlbnRbdGFnU3RhY2tbMF1dPjIgJiYgIWVsQ250KSB7XG4vL1x0XHRcdFx0XHRlcnJvcihwYXJlbnRUYWcgKyBcIiBpbiBcIiArIHRhZ1N0YWNrWzBdKTtcbi8vXHRcdFx0XHR9XG5cdFx0XHRpZiAoZGVmZXIgJiYgZWxDbnQpIHtcblx0XHRcdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcHJlY2VkaW5nO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJvY2Vzc1ZpZXdJbmZvcyh2d0luZm9zLCB0YXJnZXRQYXJlbnQpIHtcblx0XHQvLyBJZiB0YXJnZXRQYXJlbnQsIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyAod2hpY2ggbWF5IGluY2x1ZGUgbmF2aWdhdGlvbiB0aHJvdWdoICcrLScgcGF0aHMpIGFuZCBob29raW5nIHVwIHRvIHRoZSByaWdodCBwYXJlbnRFbGVtIGV0Yy5cblx0XHQvLyAoYW5kIGVsZW0gbWF5IGFsc28gYmUgZGVmaW5lZCAtIHRoZSBuZXh0IG5vZGUpXG5cdFx0Ly8gSWYgbm8gdGFyZ2V0UGFyZW50LCB0aGVuIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyBvbiBuZXdseSBpbnNlcnRlZCBjb250ZW50XG5cdFx0dmFyIGRlZmVyUGF0aCwgZGVmZXJDaGFyLCBiaW5kQ2hhciwgcGFyZW50RWxlbSwgaWQsIG9uQWZ0Q3IsIGRlZXAsXG5cdFx0XHRhZGRlZEJpbmRFbHMgPSBbXTtcblxuXHRcdC8vIEluIGVsQ250IGNvbnRleHQgKGVsZW1lbnQtb25seSBjb250ZW50IG1vZGVsKSwgcHJldk5vZGUgaXMgdGhlIGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIG9wZW4sIG5leHROb2RlIGlzIHRoZSBmaXJzdCBub2RlIGFmdGVyIHRoZSBjbG9zZS5cblx0XHQvLyBJZiBib3RoIGFyZSBudWxsL3VuZGVmaW5lZCwgdGhlbiBvcGVuIGFuZCBjbG9zZSBhcmUgYXQgZW5kIG9mIHBhcmVudCBjb250ZW50LCBzbyB0aGUgdmlldyBpcyBlbXB0eSwgYW5kIGl0cyBwbGFjZWhvbGRlciBpcyB0aGVcblx0XHQvLyAnbGFzdENoaWxkJyBvZiB0aGUgcGFyZW50Tm9kZS4gSWYgdGhlcmUgaXMgYSBwcmV2Tm9kZSwgdGhlbiBpdCBpcyBlaXRoZXIgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXcsIG9yIHRoZSB2aWV3IGlzIGVtcHR5IGFuZFxuXHRcdC8vIGl0cyBwbGFjZWhvbGRlciBpcyB0aGUgJ3ByZXZpb3VzU2libGluZycgb2YgdGhlIHByZXZOb2RlLCB3aGljaCBpcyBhbHNvIHRoZSBuZXh0Tm9kZS5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0aWYgKHZ3SW5mb3MuX3RrbnMuY2hhckF0KDApID09PSBcIkBcIikge1xuXHRcdFx0XHQvLyBXZSBhcmUgcHJvY2Vzc2luZyBuZXdseSBpbnNlcnRlZCBjb250ZW50LiBUaGlzIGlzIGEgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkIGluIGNvbnZlcnRNYXJrZXJzKCkgdG8gcHJvY2VzcyBkZWZlcnJlZCBiaW5kaW5ncyxcblx0XHRcdFx0Ly8gYW5kIGluc2VydGVkIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHBhcmVudCBlbGVtZW50IC0gYmVjYXVzZSBubyBlbGVtZW50IHRhZ3MgKG91dHNpZGUgZWxDbnQpIHdlcmUgZW5jb3VudGVyZWQgdG8gY2FycnkgdGhvc2UgYmluZGluZyB0b2tlbnMuXG5cdFx0XHRcdC8vIFdlIHdpbGwgc3RlcCBiYWNrIGZyb20gdGhlIHByZWNlZGluZyBzaWJsaW5nIG9mIHRoaXMgZWxlbWVudCwgbG9va2luZyBhdCB0YXJnZXRQYXJlbnQgZWxlbWVudHMgdW50aWwgd2UgZmluZCB0aGUgb25lIHRoYXQgdGhlIGN1cnJlbnQgYmluZGluZ1xuXHRcdFx0XHQvLyB0b2tlbiBiZWxvbmdzIHRvLiBTZXQgZWxlbSB0byBudWxsICh0aGUgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCksIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgRE9NLlxuXHRcdFx0XHR0YXJnZXRQYXJlbnQgPSBlbGVtLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW0pO1xuXHRcdFx0XHRlbGVtID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tsZW5dO1xuLy9pZiAocHJldklkcy5pbmRleE9mKHZ3SW5mby50b2tlbikgPCAwKSB7IC8vIFRoaXMgdG9rZW4gaXMgYSBuZXdseSBjcmVhdGVkIHZpZXcgb3IgdGFnIGJpbmRpbmdcblx0XHRcdFx0YmluZENoYXIgPSB2d0luZm8uY2g7XG5cdFx0XHRcdGlmIChkZWZlclBhdGggPSB2d0luZm8ucGF0aCkge1xuXHRcdFx0XHRcdC8vIFdlIGhhdmUgYSAnZGVmZXJyZWQgcGF0aCdcblx0XHRcdFx0XHRqID0gZGVmZXJQYXRoLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0d2hpbGUgKGRlZmVyQ2hhciA9IGRlZmVyUGF0aC5jaGFyQXQoai0tKSkge1xuXHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBcIitcIiBhbmRcIi1cIiBjaGFyYWN0ZXJzIHRvIG5hdmlnYXRlIHRoZSBwYXRoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBhcmVudCBub2RlIHdoZXJlIHRoZSBkZWZlcnJlZCBiaW5kaW5ncyBvY3VycmVkXG5cdFx0XHRcdFx0XHRpZiAoZGVmZXJDaGFyID09PSBcIitcIikge1xuXHRcdFx0XHRcdFx0XHRpZiAoZGVmZXJQYXRoLmNoYXJBdChqKSA9PT0gXCItXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRqLS07XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50LnByZXZpb3VzU2libGluZztcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50Lmxhc3RDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIE5vdGU6IENhbiB1c2UgcHJldmlvdXNTaWJsaW5nIGFuZCBsYXN0Q2hpbGQsIG5vdCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFuZCBsYXN0RWxlbWVudENoaWxkLFxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgaGF2ZSByZW1vdmVkIHdoaXRlIHNwYWNlIHdpdGhpbiBlbENudC4gSGVuY2Ugc3VwcG9ydCBJRSA8IDlcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJpbmRDaGFyID09PSBcIl5cIikge1xuXHRcdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgYmluZGluZyBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQsIGZvciBleGFtcGxlIGluIGEgZGlmZmVyZW50IGhhbmRsZXIgdG8gYW4gYXJyYXkgY29sbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHRhZyBiaW5kaW5nXG5cdFx0XHRcdFx0XHRkZWVwID0gdGFyZ2V0UGFyZW50ICYmICghZWxlbSB8fCBlbGVtLnBhcmVudE5vZGUgIT09IHRhcmdldFBhcmVudCk7IC8vIFdlIGFyZSBzdGVwcGluZyBiYWNrIGxvb2tpbmcgZm9yIHRoZSByaWdodCB0YXJnZXRQYXJlbnQsXG5cdFx0XHRcdFx0XHQvLyBvciB3ZSBhcmUgbGlua2luZyBleGlzdGluZyBjb250ZW50IGFuZCB0aGlzIGVsZW1lbnQgaXMgaW4gZWxDbnQsIG5vdCBhbiBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIHRhcmdldFBhcmVudC5cblx0XHRcdFx0XHRcdGlmICghZWxlbSB8fCBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHZ3SW5mby5lbENudCAmJiBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdpdGggZWxlbWVudCBvbmx5IGNvbnRlbnQsIGlmIHRoZXJlIGlzIG5vIGZvbGxvd2luZyBlbGVtZW50LCBvciBpZiB0aGUgYmluZGluZyBpcyBkZWVwZXIgdGhhbiB0aGUgZm9sbG93aW5nIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0Ly8gdGhlbiB3ZSBuZWVkIHRvIHNldCB0aGUgb3BlbiBvciBjbG9zZSB0b2tlbiBhcyBhIGRlZmVycmVkIGJpbmRpbmcgYW5ub3RhdGlvbiBvbiB0aGUgcGFyZW50XG5cdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldFBhcmVudCwgKHZ3SW5mby5vcGVuID8gXCIjXCIgOiBcIi9cIikgKyBpZCArIGJpbmRDaGFyICsgKHRhcmdldFBhcmVudC5fZGYgfHwgXCJcIikpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG9yIGNsb3NlIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0uIEFkZCBpdCB0byBiaW5kRWxzLlxuXHRcdFx0XHRcdFx0YWRkZWRCaW5kRWxzLnB1c2goW2RlZXAgPyBudWxsIDogZWxlbSwgdndJbmZvXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZpZXcgPSB2aWV3U3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHZpZXcgbWF5IGhhdmUgYmVlbiBkZWxldGVkLCBmb3IgZXhhbXBsZSBpbiBhIGRpZmZlcmVudCBoYW5kbGVyIHRvIGFuIGFycmF5IGNvbGxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdFx0XHRpZiAoIXZpZXcucGFyZW50RWxlbSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdmlldyBpcyBub3QgYWxyZWFkeSBleHRlbmRlZCBmb3IgSnNWaWV3cywgZXh0ZW5kIGFuZCBpbml0aWFsaXplIHRoZSB2aWV3IG9iamVjdCBjcmVhdGVkIGluIEpzUmVuZGVyLCBhcyBhIEpzVmlld3Mgdmlld1xuXHRcdFx0XHRcdFx0dmlldy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50IHx8IGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlIHx8IHBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHR2aWV3Ll8ub25SZW5kZXIgPSBhZGRCaW5kaW5nTWFya2Vycztcblx0XHRcdFx0XHRcdHZpZXcuXy5vbkFycmF5Q2hhbmdlID0gYXJyYXlDaGFuZ2VIYW5kbGVyO1xuXHRcdFx0XHRcdFx0c2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXJlbnRFbGVtID0gdmlldy5wYXJlbnRFbGVtO1xuXHRcdFx0XHRcdGlmICh2d0luZm8ub3Blbikge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiAnb3BlbiB2aWV3JyBub2RlIChwcmVjZWRpbmcgc2NyaXB0IG1hcmtlciBub2RlLFxuXHRcdFx0XHRcdFx0Ly8gb3IgaWYgZWxDbnQsIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSB2aWV3LCB3aXRoIGEgZGF0YS1qc3YgYW5ub3RhdGlvbikgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdHZpZXcuX2VsQ250ID0gdndJbmZvLmVsQ250O1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFBhcmVudCAmJiAhZWxlbSkge1xuXHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRQYXJlbnQsIFwiI1wiICsgaWQgKyBiaW5kQ2hhciArICh0YXJnZXRQYXJlbnQuX2RmIHx8IFwiXCIpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIE5vIHRhcmdldFBhcmVudCwgc28gdGhlcmUgaXMgYSAuX254dCBlbGVtIChhbmQgdGhpcyBpcyBwcm9jZXNzaW5nIHRva2VucyBvbiB0aGUgZWxlbSlcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9wcnYpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiI1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSAnY2xvc2UgdmlldycgbWFya2VyIG5vZGUgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdGlmICh0YXJnZXRQYXJlbnQgJiYgKCFlbGVtIHx8IGVsZW0ucGFyZW50Tm9kZSAhPT0gdGFyZ2V0UGFyZW50KSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGVyZSBpcyBubyAuX254dCBzbyBhZGQgdG9rZW4gdG8gX2RmLiBJdCBpcyBkZWZlcnJlZC5cblx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0UGFyZW50LCBcIi9cIiArIGlkICsgYmluZENoYXIgKyAodGFyZ2V0UGFyZW50Ll9kZiB8fCBcIlwiKSk7XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZWxlbSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIHZpZXcgZGlkIG5vdCBoYXZlIGEgLl9ueHQsIGJ1dCBoYXMgb25lIG5vdywgc28gdG9rZW4gbWF5IGJlIGluIF9kZiwgYW5kIG11c3QgYmUgcmVtb3ZlZC4gKE5vIGxvbmdlciBkZWZlcnJlZClcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9ueHQpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiL1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob25BZnRDciA9IHZpZXcuY3R4ICYmIHZpZXcuY3R4W29uQWZ0ZXJDcmVhdGVTdHJdIHx8IG9uQWZ0ZXJDcmVhdGUpIHtcblx0XHRcdFx0XHRcdFx0b25BZnRDci5jYWxsKHZpZXcuY3R4LnRhZywgdmlldyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuLy99XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxlbiA9IGFkZGVkQmluZEVscy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0Ly8gVGhlc2Ugd2VyZSBhZGRlZCBpbiByZXZlcnNlIG9yZGVyIHRvIGFkZGVkQmluZEVscy4gV2UgcHVzaCB0aGVtIGluIEJpbmRFbHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG5cdFx0XHRcdGJpbmRFbHMucHVzaChhZGRlZEJpbmRFbHNbbGVuXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAhdndJbmZvcyB8fCB2d0luZm9zLmVsQ250O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Vmlld0luZm9zKHZ3SW5mb3MpIHtcblx0XHQvLyBVc2VkIGJ5IHZpZXcuY2hpbGRUYWdzKCkgYW5kIHRhZy5jaGlsZFRhZ3MoKVxuXHRcdC8vIFNpbWlsYXIgdG8gcHJvY2Vzc1ZpZXdJbmZvcyBpbiBob3cgaXQgc3RlcHMgdGhyb3VnaCBiaW5kaW5ncyB0byBmaW5kIHRhZ3MuIE9ubHkgZmluZHMgZGF0YS1saW5rZWQgdGFncy5cblx0XHR2YXIgbGV2ZWwsIHBhcmVudFRhZywgbmFtZWQ7XG5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tqXTtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0sIHdpdGhpbiB0aGUgY29udGVudCBvZiB0aGUgdGFnIHdob3NlIGlkIGlzIGdldC5pZC4gQWRkIGl0IHRvIGJpbmRFbHMuXG5cdFx0XHRcdC8vIE5vdGUgLSBpZiBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5faXMgPT09IFwidGFnXCIgdGhlbiBnZXRWaWV3SW5mb3MgaXMgYmVpbmcgY2FsbGVkIHRvbyBzb29uIC0gZHVyaW5nIGZpcnN0IGxpbmtpbmcgcGFzc1xuXHRcdFx0XHRwYXJlbnRUYWcgPSB0YWcgPSBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5saW5rQ3R4LnRhZztcblx0XHRcdFx0bmFtZWQgPSB0YWcudGFnTmFtZSA9PT0gdGFnTmFtZTtcblx0XHRcdFx0aWYgKCF0YWcuZmxvdyB8fCBuYW1lZCkge1xuXHRcdFx0XHRcdGlmICghZGVlcCkge1xuXHRcdFx0XHRcdFx0bGV2ZWwgPSAxO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHBhcmVudFRhZyA9IHBhcmVudFRhZy5wYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0bGV2ZWwrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRhZ0RlcHRoID0gdGFnRGVwdGggfHwgbGV2ZWw7IC8vIFRoZSBsZXZlbCBvZiB0aGUgZmlyc3QgdGFnIGVuY291bnRlcmVkLlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoKGRlZXAgfHwgbGV2ZWwgPT09IHRhZ0RlcHRoKSAmJiAoIXRhZ05hbWUgfHwgbmFtZWQpKSB7XG5cdFx0XHRcdFx0XHQvLyBGaWx0ZXIgb24gdG9wLWxldmVsIG9yIHRhZ05hbWUgYXMgYXBwcm9wcmlhdGVcblx0XHRcdFx0XHRcdHRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGRhdGFMaW5rKCkge1xuXHRcdC8vPT09PT09PT09PT09PT09PSBEYXRhLWxpbmsgYW5kIGZpeHVwIG9mIGRhdGEtanN2IGFubm90YXRpb25zID09PT09PT09PT09PT09PT1cblx0XHR2YXIgaiwgaW5kZXgsXG5cdFx0XHR0b2tlbnMgPSBcIlwiLFxuXHRcdFx0d3JhcCA9IHt9LFxuXHRcdFx0c2VsZWN0b3IgPSBsaW5rVmlld3NTZWwgKyAoZ2V0ID8gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgOiBcIlwiKTtcblx0XHRcdC8vIElmIGEgY2hpbGRUYWdzKCkgY2FsbCwgZ2V0ID0gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgLSBzaW5jZSB3ZSBuZWVkIHRvIGluY2x1ZGUgZWxlbWVudHMgdGhhdCBoYXZlIGEgLl9kZiBleHBhbmRvIGZvciBkZWZlcnJlZCB0b2tlbnNcblxuXHRcdGVsZW1zID0gcXNhID8gcGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHBhcmVudE5vZGUpLmdldCgpO1xuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0XHQvLyBUaGUgcHJldk5vZGUgd2lsbCBiZSBpbiB0aGUgcmV0dXJuZWQgcXVlcnksIHNpbmNlIHdlIGNhbGxlZCBtYXJrUHJldk9yTmV4dE5vZGUoKSBvbiBpdC5cblx0XHQvLyBCdXQgaXQgbWF5IGhhdmUgY29udGFpbmVkIG5vZGVzIHRoYXQgc2F0aXNmeSB0aGUgc2VsZWN0b3IgYWxzby5cblx0XHRpZiAocHJldk5vZGUgJiYgcHJldk5vZGUuaW5uZXJIVE1MKSB7XG5cdFx0XHQvLyBGaW5kIHRoZSBsYXN0IGNvbnRhaW5lZCBub2RlIG9mIHByZXZOb2RlLCB0byB1c2UgYXMgdGhlIHByZXZOb2RlIC0gc28gd2Ugb25seSBsaW5rIHN1YnNlcXVlbnQgZWxlbXMgaW4gdGhlIHF1ZXJ5XG5cdFx0XHRwcmV2Tm9kZXMgPSBxc2EgPyBwcmV2Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHByZXZOb2RlKS5nZXQoKTtcblx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVzLmxlbmd0aCA/IHByZXZOb2Rlc1twcmV2Tm9kZXMubGVuZ3RoIC0gMV0gOiBwcmV2Tm9kZTtcblx0XHR9XG5cblx0XHR0YWdEZXB0aCA9IDA7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0ZWxlbSA9IGVsZW1zW2ldO1xuXHRcdFx0aWYgKHByZXZOb2RlICYmICFmb3VuZCkge1xuXHRcdFx0XHQvLyBJZiBwcmV2Tm9kZSBpcyBzZXQsIG5vdCBmYWxzZSwgc2tpcCBsaW5raW5nLiBJZiB0aGlzIGVsZW1lbnQgaXMgdGhlIHByZXZOb2RlLCBzZXQgdG8gZmFsc2Ugc28gc3Vic2VxdWVudCBlbGVtZW50cyB3aWxsIGxpbmsuXG5cdFx0XHRcdGZvdW5kID0gKGVsZW0gPT09IHByZXZOb2RlKTtcblx0XHRcdH0gZWxzZSBpZiAobmV4dE5vZGUgJiYgZWxlbSA9PT0gbmV4dE5vZGUpIHtcblx0XHRcdFx0Ly8gSWYgbmV4dE5vZGUgaXMgc2V0IHRoZW4gYnJlYWsgd2hlbiB3ZSBnZXQgdG8gbmV4dE5vZGVcblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSBpZiAoZWxlbS5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdC8vIGVsZW0gaGFzIG5vdCBiZWVuIHJlbW92ZWQgZnJvbSBET01cblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0XHRpZiAoZWxlbS5fZGYpIHtcblx0XHRcdFx0XHRcdGogPSBpICsgMTtcblx0XHRcdFx0XHRcdHdoaWxlIChqIDwgbCAmJiBlbGVtLmNvbnRhaW5zKGVsZW1zW2pdKSkge1xuXHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBBZGQgZGVmZXJlZCB0b2tlbnMgYWZ0ZXIgYW55IHRva2VucyBvbiBkZXNjZW5kYW50IGVsZW1lbnRzIG9mIHRoaXMgb25lXG5cdFx0XHRcdFx0XHR3cmFwW2otMV0gPSBlbGVtLl9kZjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHdyYXBbaV0pIHtcblx0XHRcdFx0XHRcdHRva2VucyArPSB3cmFwW2ldIHx8IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChpc0xpbmsgJiYgKHZ3SW5mbyA9IHZpZXdJbmZvcyhlbGVtLCB1bmRlZmluZWQsIHJWaWV3TWFya2VycykpICYmICh2d0luZm8gPSB2d0luZm9bMF0pKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIGEgbGluayh0cnVlT3JTdHJpbmcgLi4uKSBjYWxsIHdlIHdpbGwgYXZvaWQgcmUtYmluZGluZyB0byBlbGVtcyB0aGF0IGFyZSB3aXRoaW4gdGVtcGxhdGUtcmVuZGVyZWQgdmlld3Ncblx0XHRcdFx0XHRcdHNraXAgPSBza2lwID8gKHZ3SW5mby5pZCAhPT0gc2tpcCAmJiBza2lwKSA6IHZ3SW5mby5vcGVuICYmIHZ3SW5mby5pZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFza2lwICYmIHByb2Nlc3NJbmZvcyh2aWV3SW5mb3MoZWxlbSkpXG5cdFx0XHRcdFx0XHQvLyBJZiBhIGxpbmsoKSBjYWxsLCBwcm9jZXNzVmlld0luZm9zKCkgYWRkcyBiaW5kaW5ncyB0byBiaW5kRWxzLCBhbmQgcmV0dXJucyB0cnVlIGZvciBub24tc2NyaXB0IG5vZGVzLCBmb3IgYWRkaW5nIGRhdGEtbGluayBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBjaGlsZFRhZ3MoKSBjYWxsLCBnZXRWaWV3SW5mb3MgcmV0dXJucyBhcnJheSBvZiB0YWcgYmluZGluZ3MuXG5cdFx0XHRcdFx0XHRcdCYmIGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0XHRcdFx0YmluZEVscy5wdXNoKFtlbGVtXSk7IC8vIEEgZGF0YS1saW5rZWQgZWxlbWVudCBzbyBhZGQgdG8gYmluZEVscyB0b29cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0KSB7XG5cdFx0XHR0b2tlbnMgKz0gcGFyZW50Tm9kZS5fZGYgfHwgXCJcIjtcblx0XHRcdGlmIChpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiI1wiICsgZ2V0LmlkKSArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gc3RhcnQgYWZ0ZXIgdGhlIG9wZW4gdG9rZW4gb2YgdGhlIHBhcmVudCB2aWV3IG9yIHRhZy5cblx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKGluZGV4ICsgZ2V0LmlkLmxlbmd0aCk7XG5cdFx0XHR9XG5cdFx0XHRpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiL1wiICsgZ2V0LmlkKTtcblx0XHRcdGlmIChpbmRleCArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gZG9uJ3QgbG9vayBiZXlvbmQgdGhlIGNsb3NlIHRva2VuIG9mIHRoZSBwYXJlbnQgdmlldyBvciB0YWcuXG5cdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZSgwLCBpbmRleCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBDYWxsIGdldFZpZXdJbmZvcyB0byBhZGQgdGhlIGZvdW5kIGNoaWxkVGFncyB0byB0aGUgdGFncyBhcnJheVxuXHRcdFx0Z2V0Vmlld0luZm9zKHZpZXdJbmZvcyh0b2tlbnMsIHVuZGVmaW5lZCwgck9wZW5UYWdNYXJrZXJzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKGh0bWwgPT09IHVuZGVmaW5lZCAmJiBwYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikpIHtcblx0XHRcdGJpbmRFbHMucHVzaChbcGFyZW50Tm9kZV0pOyAvLyBTdXBwb3J0IGRhdGEtbGlua2luZyB0b3AtbGV2ZWwgZWxlbWVudCBkaXJlY3RseSAobm90IHdpdGhpbiBhIGRhdGEtbGlua2VkIGNvbnRhaW5lcilcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGVtcG9yYXJ5IG1hcmtlciBzY3JpcHQgbm9kZXMgdGhleSB3ZXJlIGFkZGVkIGJ5IG1hcmtQcmV2T3JOZXh0Tm9kZVxuXHRcdHVubWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdFx0dW5tYXJrUHJldk9yTmV4dE5vZGUobmV4dE5vZGUsIGVsQ250KTtcblxuXHRcdGlmIChnZXQpIHtcblx0XHRcdGlmIChsYXp5TGluaykge1xuXHRcdFx0XHRsYXp5TGluay5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47IC8vIFdlIGhhdmUgYWRkZWQgY2hpbGRUYWdzIHRvIHRoZSB0YWdzIGFycmF5LCBzbyB3ZSBhcmUgZG9uZVxuXHRcdH1cblxuXHRcdGlmIChlbENudCAmJiBkZWZlciArIGlkcykge1xuXHRcdFx0Ly8gVGhlcmUgYXJlIHNvbWUgdmlld3Mgd2l0aCBlbENudCwgZm9yIHdoaWNoIHRoZSBvcGVuIG9yIGNsb3NlIGRpZCBub3QgcHJlY2VkZSBhbnkgSFRNTCB0YWcgLSBzbyB0aGV5IGhhdmUgbm90IGJlZW4gcHJvY2Vzc2VkIHlldFxuXHRcdFx0ZWxlbSA9IG5leHROb2RlO1xuXHRcdFx0aWYgKGRlZmVyKSB7XG5cdFx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHRcdHByb2Nlc3NWaWV3SW5mb3Modmlld0luZm9zKGRlZmVyICsgXCIrXCIsIHRydWUpLCBuZXh0Tm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoZGVmZXIsIHRydWUpLCBwYXJlbnROb2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoaWRzLCB0cnVlKSwgcGFyZW50Tm9kZSk7XG5cdFx0XHQvLyBJZiB0aGVyZSB3ZXJlIGFueSB0b2tlbnMgb24gbmV4dE5vZGUgd2hpY2ggaGF2ZSBub3cgYmVlbiBhc3NvY2lhdGVkIHdpdGggaW5zZXJ0ZWQgSFRNTCB0YWdzLCByZW1vdmUgdGhlbSBmcm9tIG5leHROb2RlXG5cdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0dG9rZW5zID0gbmV4dE5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpO1xuXHRcdFx0XHRpZiAobCA9IHRva2Vucy5pbmRleE9mKHByZXZJZHMpICsgMSkge1xuXHRcdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZShsICsgcHJldklkcy5sZW5ndGggLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRuZXh0Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgaWRzICsgdG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLz09PT09PT09PT09PT09PT0gQmluZCB0aGUgZGF0YS1saW5rZWQgZWxlbWVudHMgYW5kIHRhZ3MgPT09PT09PT09PT09PT09PVxuXHRcdGwgPSBiaW5kRWxzLmxlbmd0aDtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRlbGVtID0gYmluZEVsc1tpXTtcblx0XHRcdGxpbmtJbmZvID0gZWxlbVsxXTtcblx0XHRcdGVsZW0gPSBlbGVtWzBdO1xuXHRcdFx0aWYgKGxpbmtJbmZvKSB7XG5cdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbbGlua0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtDdHggPSB0YWcubGlua0N0eCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHRhZyBtYXkgaGF2ZSBiZWVuIHN0b3JlZCB0ZW1wb3JhcmlseSBvbiB0aGUgYmluZGluZ1N0b3JlIC0gb3IgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBhY3R1YWwgYmluZGluZ1xuXHRcdFx0XHRcdFx0dGFnID0gbGlua0N0eC50YWc7XG5cdFx0XHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsaW5rSW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuICdvcGVuIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRcdFx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHR0YWcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0YWcuX2VsQ250ID0gbGlua0luZm8uZWxDbnQ7XG5cdFx0XHRcdFx0XHQvLyBXZSBkYXRhLWxpbmsgZGVwdGgtZmlyc3QgKFwib24gdGhlIHdheSBpblwiKSwgd2hpY2ggaXMgYmV0dGVyIGZvciBwZXJmIC0gYW5kIGFsbG93cyBzZXR0aW5nIHBhcmVudCB0YWdzIGV0Yy5cblx0XHRcdFx0XHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXc7XG5cdFx0XHRcdFx0XHRhZGREYXRhQmluZGluZyh1bmRlZmluZWQsIHRhZy5fcHJ2LCB2aWV3LCBsaW5rSW5mby5pZCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRhZy5fbnh0ID0gZWxlbTtcblx0XHRcdFx0XHRcdGlmICh0YWcuXy51bmxpbmtlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgJ2Nsb3NlIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHQvLyBBZGQgZGF0YSBiaW5kaW5nXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eCA9IHRhZy50YWdDdHg7XG5cdFx0XHRcdFx0XHRcdHZpZXcgPSB0YWdDdHgudmlldztcblx0XHRcdFx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQWRkIGRhdGEgYmluZGluZyBmb3IgYSBkYXRhLWxpbmtlZCBlbGVtZW50ICh3aXRoIGRhdGEtbGluayBhdHRyaWJ1dGUpXG5cdFx0XHRcdGFkZERhdGFCaW5kaW5nKGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSwgZWxlbSwgJHZpZXcoZWxlbSksIHVuZGVmaW5lZCwgaXNMaW5rLCBvdXRlckRhdGEsIGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobGF6eUxpbmspIHtcblx0XHRcdGxhenlMaW5rLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblx0Ly89PT09IC9lbmQgb2YgbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cblx0dmFyIGluVGFnLCBsaW5rQ3R4LCB0YWcsIGksIGwsIGosIGxlbiwgZWxlbXMsIGVsZW0sIHZpZXcsIHZ3SW5mbywgbGlua0luZm8sIHByZXZOb2RlcywgdG9rZW4sIHByZXZWaWV3LCBuZXh0Vmlldyxcblx0XHRub2RlLCB0YWdzLCBkZWVwLCB0YWdOYW1lLCB0YWdDdHgsIHZhbGlkYXRlLCB0YWdEZXB0aCwgZGVwdGgsIGZyYWdtZW50LCBjb3BpZWROb2RlLCBmaXJzdFRhZywgcGFyZW50VGFnLFxuXHRcdGlzVm9pZCwgd3JhcHBlciwgZGl2LCB0b2tlbnMsIGVsQ250LCBwcmV2RWxDbnQsIGh0bWxUYWcsIGlkcywgcHJldklkcywgZm91bmQsIHNraXAsIGxhenlMaW5rLCBpc0xpbmssIGdldCxcblx0XHRzZWxmID0gdGhpcyxcblx0XHR0aGlzSWQgPSBzZWxmLl8uaWQgKyBcIl9cIixcblx0XHRkZWZlciA9IFwiXCIsXG5cdFx0Ly8gVGhlIG1hcmtlciBpZHMgZm9yIHdoaWNoIG5vIHRhZyB3YXMgZW5jb3VudGVyZWQgKGVtcHR5IHZpZXdzIG9yIGZpbmFsIGNsb3NpbmcgbWFya2Vycykgd2hpY2ggd2UgY2Fycnkgb3ZlciB0byBjb250YWluZXIgdGFnXG5cdFx0YmluZEVscyA9IFtdLFxuXHRcdHRhZ1N0YWNrID0gW10sXG5cdFx0ZGVmZXJTdGFjayA9IFtdLFxuXHRcdG9uQWZ0ZXJDcmVhdGUgPSBzZWxmLmhscChvbkFmdGVyQ3JlYXRlU3RyKSxcblx0XHRwcm9jZXNzSW5mb3MgPSBwcm9jZXNzVmlld0luZm9zO1xuXG5cdGlmIChyZWZyZXNoKSB7XG5cdFx0bGF6eUxpbmsgPSByZWZyZXNoLmxhenlMaW5rICYmICQuRGVmZXJyZWQoKTtcblx0XHRpZiAocmVmcmVzaC50bXBsKSB7XG5cdFx0XHQvLyByZWZyZXNoIGlzIHRoZSBwcmV2VmlldywgcGFzc2VkIGluIGZyb20gYWRkVmlld3MoKVxuXHRcdFx0cHJldlZpZXcgPSBcIi9cIiArIHJlZnJlc2guXy5pZCArIFwiX1wiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpc0xpbmsgPSByZWZyZXNoLmxuazsgLy8gVG9wLWxldmVsIGxpbmtpbmdcblx0XHRcdGlmIChyZWZyZXNoLnRhZykge1xuXHRcdFx0XHR0aGlzSWQgPSByZWZyZXNoLnRhZyArIFwiXlwiO1xuXHRcdFx0XHRyZWZyZXNoID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChnZXQgPSByZWZyZXNoLmdldCkge1xuXHRcdFx0XHRwcm9jZXNzSW5mb3MgPSBnZXRWaWV3SW5mb3M7XG5cdFx0XHRcdHRhZ3MgPSBnZXQudGFncztcblx0XHRcdFx0ZGVlcCA9IGdldC5kZWVwO1xuXHRcdFx0XHR0YWdOYW1lID0gZ2V0Lm5hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlZnJlc2ggPSByZWZyZXNoID09PSB0cnVlO1xuXHR9XG5cblx0cGFyZW50Tm9kZSA9IHBhcmVudE5vZGVcblx0XHQ/IChcIlwiICsgcGFyZW50Tm9kZSA9PT0gcGFyZW50Tm9kZVxuXHRcdFx0PyAkKHBhcmVudE5vZGUpWzBdICAvLyBJdCBpcyBhIHN0cmluZywgc28gdHJlYXQgYXMgc2VsZWN0b3Jcblx0XHRcdDogcGFyZW50Tm9kZS5qcXVlcnlcblx0XHRcdFx0PyBwYXJlbnROb2RlWzBdIC8vIEEgalF1ZXJ5IG9iamVjdCAtIHRha2UgZmlyc3QgZWxlbWVudC5cblx0XHRcdFx0OiBwYXJlbnROb2RlKVxuXHRcdDogKHNlbGYucGFyZW50RWxlbSAgICAgIC8vIHZpZXcubGluaygpXG5cdFx0XHR8fCBkb2N1bWVudC5ib2R5KTsgIC8vIGxpbmsobnVsbCwgZGF0YSkgdG8gbGluayB0aGUgd2hvbGUgZG9jdW1lbnRcblxuXHR2YWxpZGF0ZSA9ICEkc3ViU2V0dGluZ3NBZHZhbmNlZC5ub1ZhbGlkYXRlICYmIHBhcmVudE5vZGUuY29udGVudEVkaXRhYmxlICE9PSBUUlVFO1xuXHRwYXJlbnRUYWcgPSBwYXJlbnROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblx0ZWxDbnQgPSAhIWVsQ29udGVudFtwYXJlbnRUYWddO1xuXG5cdHByZXZOb2RlID0gcHJldk5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdG5leHROb2RlID0gbmV4dE5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKG5leHROb2RlLCBlbENudCkgfHwgbnVsbDtcblxuXHRpZiAoaHRtbCAhPSB1bmRlZmluZWQpIHtcblx0XHQvLz09PT09PT09PT09PT09PT0gSW5zZXJ0IGh0bWwgaW50byBET00gdXNpbmcgZG9jdW1lbnRGcmFnbWVudHMgKGFuZCB3cmFwcGluZyBIVE1MIGFwcHJvcHJpYXRlbHkpLiA9PT09PT09PT09PT09PT09XG5cdFx0Ly8gQWxzbyBjb252ZXJ0IG1hcmtlcnMgdG8gRE9NIGFubm90YXRpb25zLCBiYXNlZCBvbiBjb250ZW50IG1vZGVsLlxuXHRcdC8vIENvcnJlc3BvbmRzIHRvIG5leHROb2RlID8gJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIDogJChwYXJlbnROb2RlKS5odG1sKGh0bWwpO1xuXHRcdC8vIGJ1dCBhbGxvd3MgaW5zZXJ0aW9uIHRvIHdyYXAgY29ycmVjdGx5IGV2ZW4gd2l0aCBpbnNlcnRlZCBzY3JpcHQgbm9kZXMuIGpRdWVyeSB2ZXJzaW9uIHdpbGwgZmFpbCBlLmcuIHVuZGVyIHRib2R5IG9yIHNlbGVjdC5cblx0XHQvLyBUaGlzIHZlcnNpb24gc2hvdWxkIGFsc28gYmUgc2xpZ2h0bHkgZmFzdGVyXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR3cmFwcGVyID0gZGl2O1xuXHRcdHByZXZJZHMgPSBpZHMgPSBcIlwiO1xuXHRcdGh0bWxUYWcgPSBwYXJlbnROb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiID8gXCJzdmdfbnNcIiA6IChmaXJzdFRhZyA9IHJGaXJzdEVsZW0uZXhlYyhodG1sKSkgJiYgZmlyc3RUYWdbMV0gfHwgXCJcIjtcblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdC8vIE5vdyBsb29rIGZvciBmb2xsb3dpbmcgdmlldywgYW5kIGZpbmQgaXRzIHRva2Vucywgb3IgaWYgbm90IGZvdW5kLCBnZXQgdGhlIHBhcmVudE5vZGUuX2RmIHRva2Vuc1xuXHRcdFx0bm9kZSA9IG5leHROb2RlO1xuXHRcdFx0d2hpbGUgKG5vZGUgJiYgIShuZXh0VmlldyA9IHZpZXdJbmZvcyhub2RlKSkpIHtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAodG9rZW5zID0gbmV4dFZpZXcgPyBuZXh0Vmlldy5fdGtucyA6IHBhcmVudE5vZGUuX2RmKSB7XG5cdFx0XHRcdHRva2VuID0gcHJldlZpZXcgfHwgXCJcIjtcblx0XHRcdFx0aWYgKHJlZnJlc2ggfHwgIXByZXZWaWV3KSB7XG5cdFx0XHRcdFx0dG9rZW4gKz0gXCIjXCIgKyB0aGlzSWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aiA9IHRva2Vucy5pbmRleE9mKHRva2VuKTtcblx0XHRcdFx0aWYgKGogKyAxKSB7XG5cdFx0XHRcdFx0aiArPSB0b2tlbi5sZW5ndGg7XG5cdFx0XHRcdFx0Ly8gVHJhbnNmZXIgdGhlIGluaXRpYWwgdG9rZW5zIHRvIGluc2VydGVkIG5vZGVzLCBieSBzZXR0aW5nIHRoZW0gYXMgdGhlIGlkcyB2YXJpYWJsZSwgcGlja2VkIHVwIGluIGNvbnZlcnRNYXJrZXJzXG5cdFx0XHRcdFx0cHJldklkcyA9IGlkcyA9IHRva2Vucy5zbGljZSgwLCBqKTtcblx0XHRcdFx0XHR0b2tlbnMgPSB0b2tlbnMuc2xpY2Uoaik7XG5cdFx0XHRcdFx0aWYgKG5leHRWaWV3KSB7XG5cdFx0XHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnROb2RlLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vPT09PT09PT09PT09PT09PSBDb252ZXJ0IHRoZSBtYXJrZXJzIHRvIERPTSBhbm5vdGF0aW9ucywgYmFzZWQgb24gY29udGVudCBtb2RlbC4gPT09PT09PT09PT09PT09PVxuLy9cdFx0XHRvbGRFbENudCA9IGVsQ250O1xuXHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRodG1sID0gKFwiXCIgKyBodG1sKS5yZXBsYWNlKHJDb252ZXJ0TWFya2VycywgY29udmVydE1hcmtlcnMpO1xuLy9cdFx0XHRpZiAoISFvbGRFbENudCAhPT0gISFlbENudCkge1xuLy9cdFx0XHRcdGVycm9yKFwiUGFyc2U6IFwiICsgaHRtbCk7IC8vIFBhcnNlIGVycm9yLiBDb250ZW50IG5vdCB3ZWxsLWZvcm1lZD9cbi8vXHRcdFx0fVxuXHRcdGlmICh2YWxpZGF0ZSAmJiB0YWdTdGFjay5sZW5ndGgpIHtcblx0XHRcdHN5bnRheEVycm9yKFwiTWlzbWF0Y2hlZCAnPFwiICsgcGFyZW50VGFnICsgXCIuLi4+JyBpbjpcXG5cIiArIGh0bWwpOyAvLyBVbm1hdGNoZWQgdGFnXG5cdFx0fVxuXHRcdGlmICh2YWxpZGF0ZU9ubHkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gQXBwZW5kIHdyYXBwZXIgZWxlbWVudCB0byBkb2MgZnJhZ21lbnRcblx0XHRzYWZlRnJhZ21lbnQuYXBwZW5kQ2hpbGQoZGl2KTtcblxuXHRcdC8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnNcblx0XHQvLyBDb3JyZXNwb25kcyB0byBqUXVlcnkgJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIG9yICQocGFyZW50Tm9kZSkuaHRtbChodG1sKTtcblx0XHQvLyBidXQgc3VwcG9ydHMgc3ZnIGVsZW1lbnRzLCBhbmQgb3RoZXIgZmVhdHVyZXMgbWlzc2luZyBmcm9tIGpRdWVyeSB2ZXJzaW9uIChhbmQgdGhpcyB2ZXJzaW9uIHNob3VsZCBhbHNvIGJlIHNsaWdodGx5IGZhc3Rlcilcblx0XHRodG1sVGFnID0gd3JhcE1hcFtodG1sVGFnXSB8fCB3cmFwTWFwLmRpdjtcblx0XHRkZXB0aCA9IGh0bWxUYWdbMF07XG5cdFx0d3JhcHBlci5pbm5lckhUTUwgPSBodG1sVGFnWzFdICsgaHRtbCArIGh0bWxUYWdbMl07XG5cdFx0d2hpbGUgKGRlcHRoLS0pIHtcblx0XHRcdHdyYXBwZXIgPSB3cmFwcGVyLmxhc3RDaGlsZDtcblx0XHR9XG5cdFx0c2FmZUZyYWdtZW50LnJlbW92ZUNoaWxkKGRpdik7XG5cdFx0ZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0d2hpbGUgKGNvcGllZE5vZGUgPSB3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcblx0XHRcdGZyYWdtZW50LmFwcGVuZENoaWxkKGNvcGllZE5vZGUpO1xuXHRcdH1cblx0XHQvLyBJbnNlcnQgaW50byB0aGUgRE9NXG5cdFx0cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIG5leHROb2RlKTtcblx0fVxuXG5cdGlmIChsYXp5TGluaykge1xuXHRcdHNldFRpbWVvdXQoZGF0YUxpbmssIDApO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGFMaW5rKCk7XG5cdH1cblxuXHRyZXR1cm4gbGF6eUxpbmsgJiYgbGF6eUxpbmsucHJvbWlzZSgpO1xufVxuXG5mdW5jdGlvbiBhZGREYXRhQmluZGluZyhsaW5rTWFya3VwLCBub2RlLCBjdXJyZW50VmlldywgYm91bmRUYWdJZCwgaXNMaW5rLCBkYXRhLCBjb250ZXh0KSB7XG5cdC8vIEFkZCBkYXRhIGJpbmRpbmcgZm9yIGRhdGEtbGlua2VkIGVsZW1lbnRzIG9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZ3Ncblx0dmFyIHRtcGwsIHRva2VucywgYXR0ciwgY29udmVydEJhY2ssIHRhZ0V4cHIsIGxpbmtGbiwgbGlua0N0eCwgdGFnLCByVGFnSW5kZXgsIGhhc0Vsc2UsIGxhc3RJbmRleCxcblx0XHRsaW5rRXhwcmVzc2lvbnMgPSBbXTtcblxuXHRpZiAoYm91bmRUYWdJZCkge1xuXHRcdC8vIGJvdW5kVGFnSWQgaXMgYSBzdHJpbmcgZm9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZy4gU28gb25seSBvbmUgbGlua1RhZyBpbiBsaW5rTWFya3VwXG5cdFx0Ly8gZGF0YSBhbmQgY29udGV4dCBwYXJhbWV0ZXJzIGFyZSB1bmRlZmluZWRcblx0XHR0YWcgPSBiaW5kaW5nU3RvcmVbYm91bmRUYWdJZF07XG5cdFx0dGFnID0gdGFnLmxpbmtDdHggPyB0YWcubGlua0N0eC50YWcgOiB0YWc7XG5cblx0XHRsaW5rQ3R4ID0gdGFnLmxpbmtDdHggfHwge1xuXHRcdFx0dHlwZTogXCJpbmxpbmVcIixcblx0XHRcdGRhdGE6IGN1cnJlbnRWaWV3LmRhdGEsICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZVxuXHRcdFx0ZWxlbTogdGFnLl9lbENudCA/IHRhZy5wYXJlbnRFbGVtIDogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHR2aWV3OiBjdXJyZW50Vmlldyxcblx0XHRcdGN0eDogY3VycmVudFZpZXcuY3R4LFxuXHRcdFx0YXR0cjogSFRNTCwgLy8gU2NyaXB0IG1hcmtlciBub2RlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHteeyBhbmQgYWx3YXlzIHRhcmdldCBIVE1MLlxuXHRcdFx0Zm46IHRhZy5fLmJuZCxcblx0XHRcdHRhZzogdGFnLFxuXHRcdFx0Ly8gUGFzcyB0aGUgYm91bmRUYWdJZCBpbiB0aGUgbGlua0N0eCwgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGluIG9ic2VydmVBbmRCaW5kXG5cdFx0XHRfYm5kSWQ6IGJvdW5kVGFnSWRcblx0XHR9O1xuXHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rQ3R4LmZuKTtcblx0fSBlbHNlIGlmIChsaW5rTWFya3VwICYmIG5vZGUpIHtcblx0XHQvLyBJZiBpc0xpbmsgdGhlbiB0aGlzIGlzIGEgdG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb24sIHRhcmdldCwgZGF0YSwgLi4uLikgb3Jcblx0XHQvLyAubGluayh0cnVlLCB0YXJnZXQsIGRhdGEsIC4uLi4pIHNjZW5hcmlvIC0gYW5kIGRhdGEgYW5kIGNvbnRleHQgYXJlIHBhc3NlZCBpbiBzZXBhcmF0ZWx5IGZyb20gdGhlIHZpZXdcblx0XHRkYXRhID0gaXNMaW5rID8gZGF0YSA6IGN1cnJlbnRWaWV3LmRhdGE7XG5cblx0XHQvLyBDb21waWxlZCBsaW5rRm4gZXhwcmVzc2lvbnMgY291bGQgYmUgc3RvcmVkIGluIHRoZSB0bXBsLmxpbmtzIGFycmF5IG9mIHRoZSB0ZW1wbGF0ZVxuXHRcdC8vIFRPRE8gLSBjb25zaWRlciBhbHNvIGNhY2hpbmcgZ2xvYmFsbHkgc28gdGhhdCBpZiB7ezpmb299fSBvciBkYXRhLWxpbms9XCJmb29cIiBvY2N1cnMgaW4gZGlmZmVyZW50IHBsYWNlcyxcblx0XHQvLyB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZm9yIHRoaXMgaXMgY2FjaGVkIGFuZCBvbmx5IGNvbXBpbGVkIG9uY2UuLi5cblx0XHQvL2xpbmtzID0gY3VycmVudFZpZXcubGlua3MgfHwgY3VycmVudFZpZXcudG1wbC5saW5rcztcblxuXHRcdHRtcGwgPSBjdXJyZW50Vmlldy50bXBsO1xuXG4vL1x0XHRcdGlmICghKGxpbmtUYWdzID0gbGlua3NbbGlua01hcmt1cF0pKSB7XG5cdFx0Ly8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGlzIHZpZXcgdGVtcGxhdGUgaGFzIGJlZW4gbGlua2VkLCBzbyB3ZSBjb21waWxlIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSB0ZW1wbGF0ZS5cblxuXHRcdGxpbmtNYXJrdXAgPSBub3JtYWxpemVMaW5rVGFnKGxpbmtNYXJrdXAsIGRlZmF1bHRBdHRyKG5vZGUpKTtcblx0XHRsYXN0SW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4ID0gMDtcblx0XHR3aGlsZSAodG9rZW5zID0gclRhZ0RhdGFsaW5rLmV4ZWMobGlua01hcmt1cCkpIHsgLy8gVE9ETyByZXF1aXJlIH0gdG8gYmUgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAkLCBhbmQgcmVtb3ZlIHRoZSBcXH0oIVxcfSkgb3B0aW9uLlxuXHRcdFx0bGlua0V4cHJlc3Npb25zLnB1c2godG9rZW5zKTtcblx0XHRcdGxhc3RJbmRleCA9IHJUYWdEYXRhbGluay5sYXN0SW5kZXg7XG5cdFx0fVxuXHRcdGlmIChsYXN0SW5kZXggPCBsaW5rTWFya3VwLmxlbmd0aCkge1xuXHRcdFx0c3ludGF4RXJyb3IobGlua01hcmt1cCk7XG5cdFx0fVxuXHRcdHdoaWxlICh0b2tlbnMgPSBsaW5rRXhwcmVzc2lvbnMuc2hpZnQoKSkge1xuXHRcdFx0Ly8gSXRlcmF0ZSBvdmVyIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGZvciBkaWZmZXJlbnQgdGFyZ2V0IGF0dHJzLFxuXHRcdFx0Ly8gZS5nLiA8aW5wdXQgZGF0YS1saW5rPVwiezpmaXJzdE5hbWU6fSB0aXRsZXs+fmRlc2NyaXB0aW9uKGZpcnN0TmFtZSwgbGFzdE5hbWUpfVwiXG5cdFx0XHQvLyB0b2tlbnM6IFthbGwsIGF0dHIsIGJpbmRPbmx5LCB0YWdFeHByLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIGNvbG9uLCBodG1sLCBjb21tZW50LCBjb2RlLCBwYXJhbXNdXG5cdFx0XHRyVGFnSW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4O1xuXHRcdFx0YXR0ciA9IHRva2Vuc1sxXTtcblx0XHRcdHRhZ0V4cHIgPSB0b2tlbnNbM107XG5cdFx0XHR3aGlsZSAobGlua0V4cHJlc3Npb25zWzBdICYmIGxpbmtFeHByZXNzaW9uc1swXVs0XSA9PT0gXCJlbHNlXCIpIHsgLy8gSWYgdGhpcyBpcyB7c29tZVRhZy4uLn0gYW5kIGlzIGZvbGxvd2VkIGJ5IGFuIHtlbHNlLi4ufSBhZGQgdG8gdGFnRXhwclxuXHRcdFx0XHR0YWdFeHByICs9IGRlbGltQ2xvc2VDaGFyMSArIGRlbGltT3BlbkNoYXIwICsgbGlua0V4cHJlc3Npb25zLnNoaWZ0KClbM107XG5cdFx0XHRcdGhhc0Vsc2UgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGhhc0Vsc2UpIHsgLy8gSWYgYW4ge2Vsc2V9IGhhcyBiZWVuIGFkZGVkLCBuZWVkIGFsc28gdG8gYWRkIGNsb3Npbmcge3svc29tZVRhZ319XG5cdFx0XHRcdHRhZ0V4cHIgKz0gZGVsaW1DbG9zZUNoYXIxICsgZGVsaW1PcGVuQ2hhcjAgKyBkZWxpbU9wZW5DaGFyMSArIFwiL1wiICsgdG9rZW5zWzRdICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eCA9IHtcblx0XHRcdFx0dHlwZTogaXNMaW5rID8gXCJ0b3BcIiA6IFwibGlua1wiLFxuXHRcdFx0XHRkYXRhOiBkYXRhLCAvLyBzb3VyY2Vcblx0XHRcdFx0ZWxlbTogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHRcdHZpZXc6IGN1cnJlbnRWaWV3LFxuXHRcdFx0XHRjdHg6IGNvbnRleHQsXG5cdFx0XHRcdGF0dHI6IGF0dHIsXG5cdFx0XHRcdGlzTGs6IGlzTGluaywgLy8gdG9wLWxldmVsIGxpbmtpbmc/XG5cdFx0XHRcdF90b0xrIDogMSwgLy8gRmxhZyB0byBkYXRhLWxpbmsgb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCByZW5kZXJpbmcgY2FsbFxuXHRcdFx0XHRfbm9VcGQgOiB0b2tlbnNbMl0gLy8gRmxhZyBmb3IgZGF0YS1saW5rPVwiXnsuLi59XCIgc28gb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCB3aWxsIGJpbmQsIGJ1dCBub3QgcmVuZGVyKVxuXHRcdFx0fTtcblxuXHRcdFx0Y29udmVydEJhY2sgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodG9rZW5zWzZdKSB7XG5cdFx0XHRcdGNvbnZlcnRCYWNrID0gdG9rZW5zWzEwXSB8fCB1bmRlZmluZWQ7XG5cdFx0XHRcdGxpbmtDdHguY29udmVydCA9IHRva2Vuc1s1XSB8fCBcIlwiO1xuXHRcdFx0XHRpZiAoIWF0dHIgJiYgY29udmVydEJhY2sgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0QXR0cihub2RlKSkge1xuXHRcdFx0XHRcdC8vIERlZmF1bHQgdGFyZ2V0LCBzbyBhbGxvdyAyIHdheSBiaW5kaW5nXG5cdFx0XHRcdFx0bGlua0N0eC5jb252ZXJ0QmFjayA9IGNvbnZlcnRCYWNrID0gY29udmVydEJhY2suc2xpY2UoMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIENvbXBpbGUgdGhlIGxpbmtGbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyBhbmQgYmluZHMgYSBkYXRhLWxpbmsgZXhwcmVzc2lvblxuXHRcdFx0Ly8gVE9ETyAtIG9wdGltaXplIGZvciB0aGUgY2FzZSBvZiBzaW1wbGUgZGF0YSBwYXRoIHdpdGggbm8gY29udmVyc2lvbiwgaGVscGVycywgZXRjLjpcblx0XHRcdC8vICAgICBpLmUuIGRhdGEtbGluaz1cImEuYi5jXCIuIEF2b2lkIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgb2YgRnVuY3Rpb24gZXZlcnkgdGltZS4gQ2FuIHVzZSBhIGRlZmF1bHQgZnVuY3Rpb24gZm9yIGFsbCBvZiB0aGVzZS4uLlxuXG5cdFx0XHRsaW5rQ3R4LmV4cHIgPSBhdHRyICsgdGFnRXhwcjtcblx0XHRcdGxpbmtGbiA9IHRtcGwubGlua3NbdGFnRXhwcl07XG5cdFx0XHRpZiAoIWxpbmtGbikge1xuXHRcdFx0XHR0bXBsLmxpbmtzW3RhZ0V4cHJdID0gbGlua0ZuID0gJHN1Yi50bXBsRm4odGFnRXhwciwgdG1wbCwgdHJ1ZSwgY29udmVydEJhY2ssIGhhc0Vsc2UpO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eC5mbiA9IGxpbmtGbjtcblx0XHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pO1xuXHRcdFx0Ly8gV2Ugc3RvcmUgclRhZ0luZGV4IGluIGxvY2FsIHNjb3BlLCBzaW5jZSB0aGlzIGFkZERhdGFCaW5kaW5nIG1ldGhvZCBjYW4gc29tZXRpbWVzIGJlIGNhbGxlZCByZWN1cnNpdmVseSxcblx0XHRcdC8vIGFuZCBlYWNoIGlzIHVzaW5nIHRoZSBzYW1lIHJUYWdEYXRhbGluayBpbnN0YW5jZS5cblx0XHRcdHJUYWdEYXRhbGluay5sYXN0SW5kZXggPSByVGFnSW5kZXg7XG5cdFx0fVxuLy9cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pIHtcblx0Ly8gQWRkIGRhdGEgbGluayBiaW5kaW5ncyBmb3IgYSBsaW5rIGV4cHJlc3Npb24gaW4gZGF0YS1saW5rIGF0dHJpYnV0ZSBtYXJrdXBcblx0ZnVuY3Rpb24gaGFuZGxlcihldiwgZXZlbnRBcmdzKSB7XG5cdFx0cHJvcGVydHlDaGFuZ2VIYW5kbGVyLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncywgbGlua0ZuKTtcblx0XHQvLyBJZiB0aGUgbGluayBleHByZXNzaW9uIHVzZXMgYSBjdXN0b20gdGFnLCB0aGUgcHJvcGVydHlDaGFuZ2VIYW5kbGVyIGNhbGwgd2lsbCBjYWxsIHJlbmRlclRhZywgd2hpY2ggd2lsbCBzZXQgdGFnQ3R4IG9uIGxpbmtDdHhcblx0fVxuXHRoYW5kbGVyLm5vQXJyYXkgPSB0cnVlO1xuXHRpZiAobGlua0N0eC5pc0xrKSB7XG5cdFx0Ly8gVG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb25PclRydWUsIGRhdGEsIGNvbnRleHQpIC0gc28gd2UgbmVlZCB0byBjcmVhdGUgYSB2aWV3IGZvciB0aGUgbGlua2luZywgd2l0aCB0aGUgZGF0YSBhbmQgY3R4XG5cdFx0Ly8gd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIHRhcmdldC4gTm90ZSB0aGF0IHRoaXMgdmlldyBpcyBub3QgYSBzdGFuZGFyZCBkYXRhLWxpbmtlZCB2aWV3LCBzbyBpdCB3aWxsXG5cdFx0Ly8gYmUgZGlzcG9zZWQgb25seSB3aGVuIGl0cyBwYXJlbnQgdmlldyBpcyBkaXNwb3NlZC5cblx0XHRhZGRMaW5rTWV0aG9kcyhsaW5rQ3R4LnZpZXcgPSBuZXcgJHN1Yi5WaWV3KFxuXHRcdFx0JHN1Yi5leHRlbmRDdHgobGlua0N0eC5jdHgsIGxpbmtDdHgudmlldy5jdHgpLFxuXHRcdFx0XCJsaW5rXCIsIGxpbmtDdHgudmlldywgbGlua0N0eC5kYXRhLCBsaW5rQ3R4LmV4cHIsIHVuZGVmaW5lZCwgYWRkQmluZGluZ01hcmtlcnMpKTtcblx0fVxuXHRsaW5rQ3R4Ll9jdHhDYiA9ICRzdWIuX2djY2IobGlua0N0eC52aWV3KTsgLy8gZ2V0Q29udGV4dENhbGxiYWNrOiBfY3R4Q2IsIGZvciBmaWx0ZXJpbmcvYXBwZW5kaW5nIHRvIGRlcGVuZGVuY3kgcGF0aHM6IGZ1bmN0aW9uKHBhdGgsIG9iamVjdCkgeyByZXR1cm4gWyhvYmplY3R8cGF0aCkqXX1cblx0bGlua0N0eC5faGRsID0gaGFuZGxlcjtcblx0Ly8gaGFuZGxlci5fY3R4ID0gbGlua0N0eDsgQ291bGQgcGFzcyBsaW5rQ3R4IGZvciB1c2UgaW4gYSBkZXBlbmRzID0gZnVuY3Rpb24oKSB7fSBjYWxsLCBzbyBkZXBlbmRzIGlzIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGxpbmtDdHgnc1xuXHRoYW5kbGVyKHRydWUpO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PVxuLy8gRGF0YS1saW5raW5nIGhlbHBlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlbW92ZVN1YlN0cihzdHIsIHN1YnN0cikge1xuXHR2YXIgaztcblx0cmV0dXJuIHN0clxuXHRcdD8gKGsgPSBzdHIuaW5kZXhPZihzdWJzdHIpLFxuXHRcdFx0KGsgKyAxXG5cdFx0XHRcdD8gc3RyLnNsaWNlKDAsIGspICsgc3RyLnNsaWNlKGsgKyBzdWJzdHIubGVuZ3RoKVxuXHRcdFx0XHQ6IHN0cikpXG5cdFx0OiBcIlwiO1xufVxuXG5mdW5jdGlvbiBtYXJrZXJOb2RlSW5mbyhub2RlKSB7XG5cdHJldHVybiBub2RlICYmXG5cdFx0KFwiXCIgKyBub2RlID09PSBub2RlXG5cdFx0XHQ/IG5vZGVcblx0XHRcdDogbm9kZS50YWdOYW1lID09PSBTQ1JJUFRcblx0XHRcdFx0PyBub2RlLnR5cGUuc2xpY2UoMylcblx0XHRcdFx0OiBub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpIHx8IFwiXCIpO1xufVxuXG5mdW5jdGlvbiB2aWV3SW5mb3Mobm9kZSwgaXNWYWwsIHJCaW5kaW5nKSB7XG5cdC8vIFRlc3Qgd2hldGhlciBub2RlIGlzIGEgc2NyaXB0IG1hcmtlciBub2RlLCBhbmQgaWYgc28sIHJldHVybiBtZXRhZGF0YVxuXHRmdW5jdGlvbiBnZXRJbmZvcyhhbGwsIG9wZW4sIGNsb3NlLCBpZCwgY2gsIGVsUGF0aCkge1xuXHRcdGluZm9zLnB1c2goe1xuXHRcdFx0ZWxDbnQ6IGVsQ250LFxuXHRcdFx0aWQ6IGlkLFxuXHRcdFx0Y2g6IGNoLFxuXHRcdFx0b3Blbjogb3Blbixcblx0XHRcdGNsb3NlOiBjbG9zZSxcblx0XHRcdHBhdGg6IGVsUGF0aCxcblx0XHRcdHRva2VuOiBhbGxcblx0XHR9KTtcblx0fVxuXHR2YXIgZWxDbnQsIHRva2Vucyxcblx0XHRpbmZvcyA9IFtdO1xuXHRpZiAodG9rZW5zID0gaXNWYWwgPyBub2RlIDogbWFya2VyTm9kZUluZm8obm9kZSkpIHtcblx0XHRlbENudCA9IGluZm9zLmVsQ250ID0gbm9kZS50YWdOYW1lICE9PSBTQ1JJUFQ7XG5cdFx0ZWxDbnQgPSB0b2tlbnMuY2hhckF0KDApID09PSBcIkBcIiB8fCBlbENudDtcblx0XHRpbmZvcy5fdGtucyA9IHRva2Vucztcblx0XHQvLyByTWFya2VyVG9rZW5zID0gLyg/OigjKXwoXFwvKSkoXFxkKykoW19eXSkoWy0rQFxcZF0rKT8vZztcblx0XHR0b2tlbnMucmVwbGFjZShyQmluZGluZyB8fCByTWFya2VyVG9rZW5zLCBnZXRJbmZvcyk7XG5cdFx0cmV0dXJuIGluZm9zO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVubWFya1ByZXZPck5leHROb2RlKG5vZGUsIGVsQ250KSB7XG5cdGlmIChub2RlKSB7XG5cdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJqc3ZcIikge1xuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdH0gZWxzZSBpZiAoZWxDbnQgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpID09PSBcIlwiKSB7XG5cdFx0XHRub2RlLnJlbW92ZUF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cik7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIG1hcmtQcmV2T3JOZXh0Tm9kZShub2RlLCBlbENudCkge1xuXHR2YXIgbWFya2VyID0gbm9kZTtcblx0d2hpbGUgKGVsQ250ICYmIG1hcmtlciAmJiBtYXJrZXIubm9kZVR5cGUgIT09IDEpIHtcblx0XHRtYXJrZXIgPSBtYXJrZXIucHJldmlvdXNTaWJsaW5nO1xuXHR9XG5cdGlmIChtYXJrZXIpIHtcblx0XHRpZiAobWFya2VyLm5vZGVUeXBlICE9PSAxKSB7XG5cdFx0XHQvLyBGb3IgdGV4dCBub2Rlcywgd2Ugd2lsbCBhZGQgYSBzY3JpcHQgbm9kZSBiZWZvcmVcblx0XHRcdG1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoU0NSSVBUKTtcblx0XHRcdG1hcmtlci50eXBlID0gXCJqc3ZcIjtcblx0XHRcdG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFya2VyLCBub2RlKTtcblx0XHR9IGVsc2UgaWYgKCFtYXJrZXJOb2RlSW5mbyhtYXJrZXIpICYmICFtYXJrZXIuZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0Ly8gRm9yIGVsZW1lbnQgbm9kZXMsIHdlIHdpbGwgYWRkIGEgZGF0YS1saW5rIGF0dHJpYnV0ZSAodW5sZXNzIHRoZXJlIGlzIGFscmVhZHkgb25lKVxuXHRcdFx0Ly8gc28gdGhhdCB0aGlzIG5vZGUgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgbm9kZSBsaW5raW5nIHByb2Nlc3MuXG5cdFx0XHRtYXJrZXIuc2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyLCBcIlwiKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1hcmtlcjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGlua1RhZyhsaW5rTWFya3VwLCB0d293YXkpIHtcblx0bGlua01hcmt1cCA9ICQudHJpbShsaW5rTWFya3VwKS5yZXBsYWNlKHJFc2NhcGVRdW90ZXMsIFwiXFxcXCQmXCIpO1xuXHRyZXR1cm4gbGlua01hcmt1cC5zbGljZSgtMSkgIT09IGRlbGltQ2xvc2VDaGFyMFxuXHQvLyBJZiBzaW1wbGlmaWVkIHN5bnRheCBpcyB1c2VkOiBkYXRhLWxpbms9XCJleHByZXNzaW9uXCIsIGNvbnZlcnQgdG8gZGF0YS1saW5rPVwiezpleHByZXNzaW9ufVwiLFxuXHQvLyBvciBmb3IgaW5wdXRzLCBkYXRhLWxpbms9XCJ7OmV4cHJlc3Npb246fVwiIGZvciAoZGVmYXVsdCkgdHdvLXdheSBiaW5kaW5nXG5cdFx0PyBsaW5rTWFya3VwID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGxpbmtNYXJrdXAgKyAodHdvd2F5ID8gXCI6XCIgOiBcIlwiKSArIGRlbGltQ2xvc2VDaGFyMFxuXHRcdDogbGlua01hcmt1cDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1ldGhvZHMgZm9yIHZpZXdzIGFuZCB0YWdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncykge1xuXHR2YXIgbGlua2VkRWxlbSwgZGlzcGxheUVsZW0sIGxpbmtlZEVsLCB2YWwsIGwsIGxpbmtlZFRhZywgb2xkVHJpZywgbmV3VHJpZywgdGFnUHJvcHMsIHByb3BzRXhwciwgbGlua2VkRWxlbVZpZXcsIHByb3AsIHByb3BEZWYsXG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eCxcblx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0cHJvcHMgPSB0YWdDdHgucHJvcHMsXG5cdFx0bGlua0N0eCA9IHRhZy5saW5rQ3R4O1xuXG5cdGlmICh0YWcuXy51bmxpbmtlZCkgeyAvLyBGaXJzdCBjYWxsIHRvIG9uQWZ0ZXJMaW5rLCBvciBmaXJzdCBjYWxsIGFmdGVyIG9uVXBkYXRlOiB1cGRhdGVDb250ZW50LiBJbml0aWFsaXplIGFuZCBjYWxsIG9uQmluZCBhbmQgc2V0IHByb3BlcnRpZXNcblx0XHRpZiAodGFnLmxpbmtlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gbGlua2VkRWxlbWVudDogLSBzZWxlY3RvciBmb3IgaWRlbnRpZnlpbmcgbGlua2VkIGVsZW1lbnQgaW4gdGVtcGxhdGUvcmVuZGVyZWQgY29udGVudFxuXHRcdFx0dGFnLmxpbmtlZEVsZW0gPSB0YWcuXy5pbmxpbmUgPyB0YWcuY29udGVudHModHJ1ZSwgdGFnLmxpbmtlZEVsZW1lbnQgfHwgXCIqXCIpLmZpcnN0KCkgOiAkKGxpbmtDdHguZWxlbSk7XG5cdFx0fVxuXHRcdGlmICh0YWcub25CaW5kKSB7XG5cdFx0XHR0YWcub25CaW5kKHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHRhZy5vbkFmdGVyTGluaykge1xuXHRcdHRhZy5vbkFmdGVyTGluayh0YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIGV2LCBldmVudEFyZ3MpO1xuXHR9XG5cblx0bGlua2VkRWxlbSA9IHRhZy50YXJnZXRUYWcgPyB0YWcudGFyZ2V0VGFnLmxpbmtlZEVsZW0gOiB0YWcubGlua2VkRWxlbTtcblx0ZGlzcGxheUVsZW0gPSB0YWcuZGlzcGxheUVsZW0gfHwgbGlua2VkRWxlbTtcblxuXHRpZiAobGlua2VkRWxlbSAmJiBsaW5rZWRFbGVtWzBdKSB7XG5cdFx0dmFsID0gdGFnLmN2dEFyZ3MoKVswXTtcblx0XHRpZiAodmFsICE9PSB1bmRlZmluZWQgJiYgIXRhZy5fLmNoZ2luZykge1xuXHRcdFx0bCA9IGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRsaW5rZWRFbCA9IGxpbmtlZEVsZW1bbF07XG5cdFx0XHRcdGlmICh0YWcuXy51bmxpbmtlZCAmJiBsaW5rZWRFbCAhPT0gbGlua0N0eC5lbGVtKSB7XG5cdFx0XHRcdFx0bGlua2VkVGFnID0gbGlua2VkRWwuX2pzdkxrRWw7XG5cdFx0XHRcdFx0aWYgKHRhZy5fLmlubGluZSAmJiAoIWxpbmtlZFRhZyB8fCBsaW5rZWRUYWcgIT09IHRhZyAmJiBsaW5rZWRUYWcudGFyZ2V0VGFnICE9PSB0YWcpKSB7XG5cdFx0XHRcdFx0XHQvLyBGb3IgZGF0YS1saW5rZWQgdGFncywgaWRlbnRpZnkgdGhlIGxpbmtlZEVsIHdpdGggdGhlIHRhZywgZm9yIFwidG9cIiBiaW5kaW5nXG5cdFx0XHRcdFx0XHQvLyAoRm9yIGRhdGEtbGlua2VkIGVsZW1lbnRzLCBpZiBub3QgeWV0IGJvdW5kLCB3ZSBpZGVudGlmeSBsYXRlciB3aGVuIHRoZSBsaW5rQ3R4LmVsZW0gaXMgYm91bmQpXG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5fanN2TGtFbCA9IHRhZztcblx0XHRcdFx0XHRcdGJpbmRUbyhiaW5kaW5nU3RvcmVbdGFnLl90Z0lkXSwgdGFnLCBsaW5rZWRFbCk7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5fanN2Qm5kID0gXCImXCIgKyB0YWcuX3RnSWQgKyBcIitcIjsgLy8gQWRkIGEgXCIrXCIgZm9yIGNsb25lZCBiaW5kaW5nIC0gc28gcmVtb3Zpbmdcblx0XHRcdFx0XHRcdC8vIGVsZW1zIHdpdGggY2xvbmVkIGJpbmRpbmdzIHdpbGwgbm90IHJlbW92ZSB0aGUgJ3BhcmVudCcgYmluZGluZyBmcm9tIHRoZSBiaW5kaW5nU3RvcmUuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChsaW5rZWRFbC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRpZiAobGlua2VkRWwudHlwZSA9PT0gQ0hFQ0tCT1gpIHtcblx0XHRcdFx0XHRcdFx0bGlua2VkRWxbQ0hFQ0tFRF0gPSB2YWwgJiYgdmFsICE9PSBcImZhbHNlXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpbmtlZEVsLnR5cGUgPT09IFJBRElPKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVsW0NIRUNLRURdID0gKGxpbmtlZEVsLnZhbHVlID09PSB2YWwpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0JChsaW5rZWRFbCkudmFsKHZhbCk7IC8vIFVzZSBqUXVlcnkgZm9yIGF0dHJIb29rcyAtIGNhbid0IGp1c3Qgc2V0IHZhbHVlIChvbiBzZWxlY3QsIGZvciBleGFtcGxlKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAobGlua2VkRWwuY29udGVudEVkaXRhYmxlID09PSBUUlVFKSB7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5pbm5lckhUTUwgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxpbmtDdHguX3ZhbCA9IHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvcHMubmFtZSkge1xuXHRcdFx0XHRcdGxpbmtlZEVsLm5hbWUgPSBsaW5rZWRFbC5uYW1lIHx8IHByb3BzLm5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRhZy5zZXRTaXplKSB7XG5cdFx0XHRpZiAocHJvcHMuaGVpZ2h0KSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLmhlaWdodChwcm9wcy5oZWlnaHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BzLndpZHRoKSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLndpZHRoKHByb3BzLndpZHRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHByb3BzLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGRpc3BsYXlFbGVtLmF0dHIoXCJ0aXRsZVwiLCBwcm9wcy50aXRsZSk7XG5cdFx0fVxuXHRcdGlmIChwcm9wc1tcImNsYXNzXCJdKSB7XG5cdFx0XHQvLyBUaGlzIGNvZGUgc3VwcG9ydHMgZHluYW1pYyBiaW5kaW5nIHRvIGNsYXNzIC0gd2hlcmUgaXQgYWRkcyB0aGUgY2xhc3MgaWYgYWJzZW50LCBhbmQgcmVtb3Zlcy9hZGRzIGlmIGEgcHJldmlvdXMgdmFsdWUgaXMgcHJlc2VudFxuXHRcdFx0aWYgKGV2ZW50QXJncyAmJiBkaXNwbGF5RWxlbS5oYXNDbGFzcyhldmVudEFyZ3Mub2xkVmFsdWUpKSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLnJlbW92ZUNsYXNzKGV2ZW50QXJncy5vbGRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRkaXNwbGF5RWxlbS5hZGRDbGFzcyhwcm9wc1tcImNsYXNzXCJdKTtcblx0XHR9XG5cdFx0aWYgKHByb3BzLmlkKSB7XG5cdFx0XHRsaW5rZWRFbGVtWzBdLmlkID0gcHJvcHMuaWQ7XG5cdFx0fVxuXHR9XG5cdHRhZy5fLnVubGlua2VkID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc3luY0VsZW1DaGFuZ2VIYW5kbGVyKGV2KSB7XG5cdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0ZWxlbUNoYW5nZUhhbmRsZXIoZXYpO1xuXHR9LCAwKTtcbn1cblxuZnVuY3Rpb24gYmluZEVsQ2hhbmdlKCRlbGVtLCB0cmlnLCBvbm9mZikge1xuXHRpZiAodHJpZykge1xuXHRcdHRyaWcgPSBcIlwiICsgdHJpZyA9PT0gdHJpZyA/IHRyaWcgOiBcImtleWRvd25cIjsgLy8gU2V0IHRyaWdnZXIgdG8gKHRydWUgfHwgdHJ1ZXkgbm9uLXN0cmluZyAoZS5nLiAxKSB8fCAna2V5ZG93bicpOiBHZXQgJ2tleWRvd24nIHdpdGggYXN5bmNcblx0XHQkZWxlbVtvbm9mZl0odHJpZywgdHJpZyA9PT0gXCJrZXlkb3duXCIgPyBhc3luY0VsZW1DaGFuZ2VIYW5kbGVyIDogZWxlbUNoYW5nZUhhbmRsZXIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGJpbmRUbyhiaW5kaW5nLCB0YWcsIGxpbmtlZEVsZW0sIGN2dEJrKSB7XG5cdC8vIFR3by13YXkgYmluZGluZy5cblx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nLnRvWzFdIHRvIGJlIHRoZSBjdnRCYWNrLCBhbmQgYmluZGluZy50b1swXSB0byBiZSBlaXRoZXIgdGhlIHBhdGggdG8gdGhlIHRhcmdldCwgb3IgW29iamVjdCwgcGF0aF0gd2hlcmUgdGhlIHRhcmdldCBpcyB0aGUgcGF0aCBvbiB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuXHQvLyBTbyBmb3IgYSBjb21wdXRlZCBwYXRoIHdpdGggYW4gb2JqZWN0IGNhbGw6IGEuYi5nZXRPYmplY3QoKS5kLmUsIHRoZW4gd2Ugc2V0IHRvWzBdIHRvIGJlIFtleHByT2IsIFwiZC5lXCJdLCBhbmQgd2UgYmluZCB0byB0aGUgcGF0aCBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LCBleHByT2Iub2IsIGFzIHRhcmdldFxuXHQvLyBPdGhlcndpc2Ugb3VyIHRhcmdldCBpcyB0aGUgZmlyc3QgcGF0aCwgcGF0aHNbMF0sIHdoaWNoIHdlIHdpbGwgY29udmVydCB3aXRoIGNvbnRleHRDYigpIGZvciBwYXRocyBsaWtlIH5hLmIuYyBvciAjeC55LnpcblxuXHR2YXIgYmluZHRvLCBwYXRoSW5kZXgsIHBhdGgsIGxhc3RQYXRoLCBiaW5kdG9PYiwgJGxpbmtlZEVsZW0sIG5ld1RyaWcsIG9sZFRyaWcsIHRvLCBsLFxuXHRcdGxpbmtDdHggPSBiaW5kaW5nLmxpbmtDdHgsXG5cdFx0Y29udGV4dENiID0gbGlua0N0eC5fY3R4Q2IsXG5cdFx0c291cmNlID0gbGlua0N0eC5kYXRhLFxuXHRcdHBhdGhzID0gbGlua0N0eC5mbi5wYXRoc1swXTtcblxuXHR0YWcgPSB0YWcgfHwgbGlua2VkRWxlbS5fanN2TGtFbDtcblxuXHRpZiAoYmluZGluZyAmJiBwYXRocyAmJiAhYmluZGluZy50bykge1xuXHRcdG9sZFRyaWcgPSBsaW5rZWRFbGVtLl9qc3ZUciB8fCBmYWxzZTtcblx0XHRpZiAodGFnKSB7XG5cdFx0XHRjdnRCayA9IHRhZy5jb252ZXJ0QmFjayB8fCBjdnRCaztcblx0XHRcdG5ld1RyaWcgPSB0YWcudGFnQ3R4LnByb3BzLnRyaWdnZXI7XG5cdFx0fVxuXHRcdG5ld1RyaWcgPSBuZXdUcmlnID09PSB1bmRlZmluZWQgPyAkc3ViU2V0dGluZ3MudHJpZ2dlciA6IG5ld1RyaWc7XG5cdFx0Ly8gVHJpZ2dlciBpcyBub29wIGV4Y2VwdCBmb3IgdGV4dCBib3gsIHRleHRhcmVhLCBjb250ZW50ZWRpdGFibGUuLi5cblx0XHRuZXdUcmlnID0gbmV3VHJpZyAmJiAobGlua2VkRWxlbS50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgbGlua2VkRWxlbS50eXBlICE9PSBDSEVDS0JPWCAmJiBsaW5rZWRFbGVtLnR5cGUgIT09IFJBRElPIHx8IGxpbmtlZEVsZW0udHlwZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IGxpbmtlZEVsZW0uY29udGVudEVkaXRhYmxlID09PSBUUlVFKSAmJiBuZXdUcmlnIHx8IGZhbHNlO1xuXG5cdFx0aWYgKG9sZFRyaWcgIT09IG5ld1RyaWcpIHtcblx0XHRcdCRsaW5rZWRFbGVtID0gJChsaW5rZWRFbGVtKTtcblx0XHRcdGJpbmRFbENoYW5nZSgkbGlua2VkRWxlbSwgb2xkVHJpZywgXCJvZmZcIik7XG5cdFx0XHRiaW5kRWxDaGFuZ2UoXG5cdFx0XHRcdCRsaW5rZWRFbGVtLFxuXHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZUciA9IG5ld1RyaWcsXG5cdFx0XHRcdFwib25cIlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRwYXRocyA9IChiaW5kdG8gPSBwYXRocy5fanN2dG8pIHx8IHBhdGhzWzBdO1xuXHRcdGlmIChwYXRoSW5kZXggPSBwYXRocyAmJiBwYXRocy5sZW5ndGgpIHtcblx0XHRcdGxhc3RQYXRoID0gcGF0aHNbcGF0aEluZGV4IC0gMV07XG5cdFx0XHRpZiAobGFzdFBhdGguX2pzdikge1xuXHRcdFx0XHRiaW5kdG9PYiA9IGxhc3RQYXRoO1xuXHRcdFx0XHR3aGlsZSAobGFzdFBhdGguc2IgJiYgbGFzdFBhdGguc2IuX2pzdikge1xuXHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aCA9IGxhc3RQYXRoLnNiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGggPSBsYXN0UGF0aC5zYiB8fCBwYXRoICYmIHBhdGgucGF0aDtcblx0XHRcdFx0bGFzdFBhdGggPSBwYXRoID8gcGF0aC5zbGljZSgxKSA6IGJpbmR0b09iLnBhdGg7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHR0byA9IFtcblx0XHRcdFx0XHRcdGJpbmR0b09iLCAvLyAnZXhwck9iJyBmb3IgdGhpcyBleHByZXNzaW9uIGFuZCB2aWV3LWJpbmRpbmcuIFNvIGJpbmR0b09iLm9iIGlzIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IGV4cHJlc3Npb24uXG5cdFx0XHRcdFx0XHRsYXN0UGF0aFxuXHRcdFx0XHRcdF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoKHRvID0gY29udGV4dENiKHBhdGggPSBsYXN0UGF0aC5zcGxpdChcIl5cIikuam9pbihcIi5cIiksIHNvdXJjZSkpICYmIChsID0gdG8ubGVuZ3RoKSkge1xuXHRcdFx0XHRcdC8vIFJlY3Vyc2l2ZWx5IGRlcmVmZXJlbmNlIGFueSB+Zm9vIG9yICNiYXIgdG9rZW5zIGluIHRoZSBwYXRoLiAoUmVjdXJzaXZlIGJlY2F1c2UgfmZvbyBtYXkgYmUgYSBjb250ZXh0dWFsIHBhcmFtIHdoaWNoIGhhc1xuXHRcdFx0XHRcdC8vIGl0cyBvd24gZGVwZW5kZW5jaWVzIG9uIG90aGVyIH5mb28gI2JhciBjb21wb25lbnRzKVxuXHRcdFx0XHRcdGlmICh0b1swXS5fY3ApIHsgLy8gVHdvLXdheSBiaW5kaW5nIHRvIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIgcmVmZXJlbmNlLCB+Zm9vIChkZWNsYXJlZCBhcyB+Zm9vPWV4cHIgb24gYSBwYXJlbnQgdGFnKVxuXHRcdFx0XHRcdFx0dG8gPSB0b1swXTsgICAgLy8gc28gJ3RvJyBpcyB0aGUgW3ZpZXcsIGV4cHJlc3Npb24vZGVwZW5kZW5jaWVzXSBmb3IgdGhlIGNvbnRleHR1YWwgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRjb250ZXh0Q2IgPSAkc3ViLl9nY2NiKHRvWzBdKTsgLy8gZ2V0Q29udGV4dENhbGxiYWNrOiBNb3ZlIGNvbnRleHRDYiB1cCB0byB2aWV3IHdoZXJlIGNvbnRleHR1YWwgcGFyYW1ldGVyIHdhcyBhc3NpZ25lZFxuXHRcdFx0XHRcdFx0bGFzdFBhdGggPSB0b1sxXTtcblx0XHRcdFx0XHRcdHRvID0gW3RvWzBdLmRhdGEsIHRvWzFdXTtcblx0XHRcdFx0XHRcdGlmIChsYXN0UGF0aC5fanN2KSB7IC8vIGNvbXB1dGVkIHZhbHVlXG5cdFx0XHRcdFx0XHRcdGJpbmR0b09iID0gbGFzdFBhdGg7XG5cdFx0XHRcdFx0XHRcdGJpbmR0b09iLmRhdGEgPSB0b1swXTtcblx0XHRcdFx0XHRcdFx0YmluZHRvT2IuX2NwQ3R4ID0gY29udGV4dENiO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAobGFzdFBhdGguc2IgJiYgbGFzdFBhdGguc2IuX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aCA9IGxhc3RQYXRoLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aC5zYiB8fCBwYXRoICYmIHBhdGgucGF0aDtcblx0XHRcdFx0XHRcdFx0bGFzdFBhdGggPSBwYXRoID8gcGF0aC5zbGljZSgxKSA6IGJpbmR0b09iLnBhdGg7XG5cdFx0XHRcdFx0XHRcdHRvID0gW1xuXHRcdFx0XHRcdFx0XHRcdGJpbmR0b09iLCAvLyAnZXhwck9iJyBmb3IgdGhpcyBleHByZXNzaW9uIGFuZCB2aWV3LWJpbmRpbmcuIFNvIGJpbmR0b09iLm9iIGlzIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IGV4cHJlc3Npb24uXG5cdFx0XHRcdFx0XHRcdFx0bGFzdFBhdGhcblx0XHRcdFx0XHRcdFx0XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgeyAvLyBUd28td2F5IGJpbmRpbmcgdG8gYSBoZWxwZXIgLSBlLmcuIH5hZGRyZXNzLnN0cmVldCwgb3IgY29tcHV0ZWQsIGUuZy4gfmZ1bGxOYW1lKCksIG9yIHZpZXcgcHJvcGVydHkgZS5nLiAjZGF0YS5mb29cblx0XHRcdFx0XHRcdHRvID0gbD4yXG5cdFx0XHRcdFx0XHRcdD8gW3RvW2wtM10sIHRvW2wtMl1dIC8vIFdpdGggcGF0aDogW29iamVjdCwgcGF0aF1cblx0XHRcdFx0XHRcdFx0OiBbdG9bbC0yXV07ICAgICAgICAgLy8gTm8gcGF0aCwgKGUuZy4gW2Z1bmN0aW9uXSBmb3IgY29tcHV0ZWQgd2l0aCBzZXR0ZXIpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNvdXJjZSA9IHRvWzBdO1xuXHRcdFx0XHRcdGxhc3RQYXRoID0gdG9bMV07XG5cdFx0XHRcdH1cblx0XHRcdFx0dG8gPSB0byB8fCBbc291cmNlLCBwYXRoXTsgLy8gVHdvIHdheSBiaW5kaW5nIHRvIGFuIG9iamVjdCAobmVpdGhlciB+Zm9vIG5vciAjYmFyKVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0byA9IFtdO1xuXHRcdH1cblx0XHRiaW5kaW5nLnRvID0gW1xuXHRcdFx0dG8sXG5cdFx0XHRjdnRCa1xuXHRcdF07XG5cdH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VDdHhzKHRhZywgbmV3Q3R4cywgcmVwbGFjZSkgeyAvLyBNZXJnZSB1cGRhdGVkIHRhZ0N0eHMgaW50byB0YWcudGFnQ3R4c1xuXHR2YXIgdGFnQ3R4LCBuZXdUYWdDdHgsXG5cdFx0dmlldyA9IHRhZy50YWdDdHgudmlldyxcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMgfHwgW3RhZy50YWdDdHhdLFxuXHRcdGwgPSB0YWdDdHhzLmxlbmd0aCxcblx0XHRyZWZyZXNoID0gIW5ld0N0eHM7XG5cblx0bmV3Q3R4cyA9IG5ld0N0eHMgfHwgdGFnLl8uYm5kLmNhbGwodmlldy50bXBsLCAodGFnLmxpbmtDdHggfHwgdmlldykuZGF0YSwgdmlldywgJHN1Yik7XG5cblx0aWYgKHJlcGxhY2UpIHtcblx0XHQvLyBSZXBsYWNlIHByZXZpb3VzIHRhZ0N0eHMgYnkgbmV3IG9uZXMsIHJhdGhlciB0aGFuIG1lcmdpbmdcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMgPSBuZXdDdHhzO1xuXHRcdHRhZy50YWdDdHggPSB0YWdDdHhzWzBdO1xuXHR9IGVsc2Uge1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdHRhZ0N0eCA9IHRhZ0N0eHNbbF07XG5cdFx0XHRuZXdUYWdDdHggPSBuZXdDdHhzW2xdO1xuXHRcdFx0JG9ic2VydmFibGUodGFnQ3R4LnByb3BzKS5zZXRQcm9wZXJ0eShuZXdUYWdDdHgucHJvcHMpO1xuXHRcdFx0JGV4dGVuZCh0YWdDdHguY3R4LCBuZXdUYWdDdHguY3R4KTsgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBjdHggdmFyaWFibGVzLCB+Zm9vLCBvYnNlcnZhYmx5LCB0byBuZXN0ZWQgdmlld3MuIFNvIGV4dGVuZCwgbm90IHNldFByb3BlcnR5Li4uXG5cdFx0XHR0YWdDdHguYXJncyA9IG5ld1RhZ0N0eC5hcmdzO1xuXHRcdFx0aWYgKHJlZnJlc2gpIHtcblx0XHRcdFx0dGFnQ3R4LnRtcGwgPSBuZXdUYWdDdHgudG1wbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0JHN1Yi5fdGhzKHRhZywgdGFnQ3R4c1swXSk7IC8vIHRhZ0hhbmRsZXJzRnJvbVByb3BzXG5cdHJldHVybiB0YWdDdHhzO1xufVxuXG4vLz09PT09PT09PVxuLy8gRGlzcG9zYWxcbi8vPT09PT09PT09XG5cbmZ1bmN0aW9uIGNsZWFuKGVsZW1zKSB7XG5cdC8vIFJlbW92ZSBkYXRhLWxpbmsgYmluZGluZ3MsIG9yIGNvbnRhaW5lZCB2aWV3c1xuXHR2YXIgbCwgZWxlbSwgYmluZGluZ3MsXG5cdFx0ZWxlbUFycmF5ID0gW10sXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGkgPSBsZW47XG5cdHdoaWxlIChpLS0pIHtcblx0XHQvLyBDb3B5IGludG8gYW4gYXJyYXksIHNvIHRoYXQgZGVsZXRpb24gb2Ygbm9kZXMgZnJvbSBET00gd2lsbCBub3QgY2F1c2Ugb3VyICdpJyBjb3VudGVyIHRvIGdldCBzaGlmdGVkXG5cdFx0Ly8gKE5vdGU6IFRoaXMgc2VlbXMgYXMgZmFzdCBvciBmYXN0ZXIgdGhhbiBlbGVtQXJyYXkgPSBbXS5zbGljZS5jYWxsKGVsZW1zKTsgLi4uKVxuXHRcdGVsZW1BcnJheS5wdXNoKGVsZW1zW2ldKTtcblx0fVxuXHRpID0gbGVuO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0ZWxlbSA9IGVsZW1BcnJheVtpXTtcblx0XHRpZiAoZWxlbS5wYXJlbnROb2RlKSB7XG5cdFx0XHQvLyBIYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTVxuXHRcdFx0aWYgKGJpbmRpbmdzID0gZWxlbS5fanN2Qm5kKSB7XG5cdFx0XHRcdC8vIEdldCBwcm9wZXJ0eUNoYW5nZSBiaW5kaW5ncyBmb3IgdGhpcyBlbGVtZW50XG5cdFx0XHRcdC8vIFRoaXMgbWF5IGJlIGFuIGVsZW1lbnQgd2l0aCBkYXRhLWxpbmssIG9yIHRoZSBvcGVuaW5nIHNjcmlwdCBtYXJrZXIgbm9kZSBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRcdFx0Ly8gYmluZGluZ3MgaXMgYSBzdHJpbmcgd2l0aCB0aGUgc3ludGF4OiBcIigmYmluZGluZ0lkKSpcIlxuXHRcdFx0XHRiaW5kaW5ncyA9IGJpbmRpbmdzLnNsaWNlKDEpLnNwbGl0KFwiJlwiKTtcblx0XHRcdFx0ZWxlbS5fanN2Qm5kID0gXCJcIjtcblx0XHRcdFx0bCA9IGJpbmRpbmdzLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdC8vIFJlbW92ZSBhc3NvY2lhdGVkIGJpbmRpbmdzXG5cdFx0XHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcoYmluZGluZ3NbbF0sIGVsZW0uX2pzdkxrRWwsIGVsZW0pOyAvLyB1bmJpbmQgYmluZGluZ3Mgd2l0aCB0aGlzIGJpbmRpbmdJZCBvbiB0aGlzIHZpZXdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGlzcG9zZVRva2VucyhtYXJrZXJOb2RlSW5mbyhlbGVtKSArIChlbGVtLl9kZiB8fCBcIlwiKSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCwgbGlua2VkRWxlbVRhZywgZWxlbSkge1xuXHQvLyBVbmJpbmRcblx0dmFyIG9iaklkLCBsaW5rQ3R4LCB0YWcsIG9iamVjdCwgb2JzSWQsIHRhZ0N0eHMsIGwsIG1hcCwgJGxpbmtlZEVsZW0sIGxpbmtlZEVsZW0sIHRyaWdnZXIsIHZpZXcsIHRhcmdldFRhZyxcblx0XHRiaW5kaW5nID0gYmluZGluZ1N0b3JlW2JpbmRJZF07XG5cblx0aWYgKGxpbmtlZEVsZW1UYWcpIHtcblx0XHRsaW5rZWRFbGVtVGFnID0gbGlua2VkRWxlbVRhZy50YXJnZXRUYWcgfHwgbGlua2VkRWxlbVRhZztcblx0XHRlbGVtLl9qc3ZMa0VsID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGJpbmRpbmcpIHtcblx0XHRkZWxldGUgYmluZGluZ1N0b3JlW2JpbmRJZF07IC8vIERlbGV0ZSBhbHJlYWR5LCBzbyBjYWxsIHRvIG9uRGlzcG9zZSBoYW5kbGVyIGJlbG93IGNhbm5vdCB0cmlnZ2VyIHJlY3Vyc2l2ZSBkZWxldGlvbiAodGhyb3VnaCByZWN1cnNpdmUgY2FsbCB0byBqUXVlcnkgY2xlYW5EYXRhKVxuXHRcdGZvciAob2JqSWQgaW4gYmluZGluZy5ibmQpIHtcblx0XHRcdG9iamVjdCA9IGJpbmRpbmcuYm5kW29iaklkXTtcblx0XHRcdG9ic0lkID0gYmluZGluZy5jYklkO1xuXHRcdFx0aWYgKCRpc0FycmF5KG9iamVjdCkpIHtcblx0XHRcdFx0JChbb2JqZWN0XSkub2ZmKGFycmF5Q2hhbmdlU3RyICsgb2JzSWQpLm9mZihwcm9wZXJ0eUNoYW5nZVN0ciArIG9ic0lkKTsgLy8gVGhlcmUgbWF5IGJlIGVpdGhlciBvciBib3RoIG9mIGFycmF5Q2hhbmdlIGFuZCBwcm9wZXJ0eUNoYW5nZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JChvYmplY3QpLm9mZihwcm9wZXJ0eUNoYW5nZVN0ciArIG9ic0lkKTtcblx0XHRcdH1cblx0XHRcdGRlbGV0ZSBiaW5kaW5nLmJuZFtvYmpJZF07XG5cdFx0fVxuXG5cdFx0aWYgKGxpbmtDdHggPSBiaW5kaW5nLmxpbmtDdHgpIHtcblx0XHRcdGlmICh0YWcgPSBsaW5rQ3R4LnRhZykge1xuXHRcdFx0XHRpZiAodGFnQ3R4cyA9IHRhZy50YWdDdHhzKSB7XG5cdFx0XHRcdFx0bCA9IHRhZ0N0eHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdGlmIChtYXAgPSB0YWdDdHhzW2xdLm1hcCkge1xuXHRcdFx0XHRcdFx0XHRtYXAudW5tYXAoKTsgLy91bm9ic2VydmVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0JGxpbmtlZEVsZW0gPSB0YWcubGlua2VkRWxlbTtcblxuXHRcdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0YWcub25EaXNwb3NlKSB7XG5cdFx0XHRcdFx0dGFnLm9uRGlzcG9zZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0YWcuX2VsQ250KSB7XG5cdFx0XHRcdFx0aWYgKHRhZy5fcHJ2KSB7XG5cdFx0XHRcdFx0XHR0YWcuX3Bydi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZy5fcHJ2KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRhZy5fbnh0KSB7XG5cdFx0XHRcdFx0XHR0YWcuX254dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZy5fbnh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxpbmtlZEVsZW0gPSAkbGlua2VkRWxlbSAmJiAkbGlua2VkRWxlbVswXSB8fCBsaW5rQ3R4LmVsZW07XG5cblx0XHRcdGlmICh0cmlnZ2VyID0gbGlua2VkRWxlbSAmJiBsaW5rZWRFbGVtLl9qc3ZUcikge1xuXHRcdFx0XHRiaW5kRWxDaGFuZ2UoJGxpbmtlZEVsZW0gfHwgJChsaW5rZWRFbGVtKSwgdHJpZ2dlciwgXCJvZmZcIik7XG5cdFx0XHRcdGxpbmtlZEVsZW0uX2pzdlRyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0dmlldyA9IGxpbmtDdHgudmlldztcblx0XHRcdGlmICh2aWV3LnR5cGUgPT09IFwibGlua1wiKSB7XG5cdFx0XHRcdHZpZXcucGFyZW50LnJlbW92ZVZpZXdzKHZpZXcuXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIEEgXCJsaW5rXCIgdmlldyBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmRpbmcsIHNvIHNob3VsZCBiZSBkaXNwb3NlZCB3aXRoIGJpbmRpbmcuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgdmlldy5fLmJuZHNbYmluZElkXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZGVsZXRlIGNiQmluZGluZ3NTdG9yZVtiaW5kaW5nLmNiSWRdO1xuXHR9XG59XG5cbmZ1bmN0aW9uICR1bmxpbmsodG8pIHtcblx0aWYgKHRvKSB7XG5cdFx0dG8gPSB0by5qcXVlcnkgPyB0byA6ICQodG8pO1xuXHRcdHRvLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5uZXJWaWV3O1xuXHRcdFx0Ly9UT0RPIGZpeCB0aGlzIGZvciBiZXR0ZXIgcGVyZi4gUmF0aGVyIHRoYXQgY2FsbGluZyBpbm5lciB2aWV3IG11bHRpcGxlIHRpbWVzIHdoaWNoIGRvZXMgcXVlcnlTZWxlY3RvckFsbCBlYWNoIHRpbWUsIGNvbnNpZGVyIGEgc2luZ2xlIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdC8vIG9yIHNpbXBseSBjYWxsIHZpZXcucmVtb3ZlVmlld3MoKSBvbiB0aGUgdG9wLWxldmVsIHZpZXdzIHVuZGVyIHRoZSB0YXJnZXQgJ3RvJyBub2RlLCB0aGVuIGNsZWFuKC4uLilcblx0XHRcdHdoaWxlICgoaW5uZXJWaWV3ID0gJHZpZXcodGhpcywgdHJ1ZSkpICYmIGlubmVyVmlldy5wYXJlbnQpIHtcblx0XHRcdFx0aW5uZXJWaWV3LnBhcmVudC5yZW1vdmVWaWV3cyhpbm5lclZpZXcuXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRjbGVhbih0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSk7XG5cdFx0fSk7XG5cdFx0Y2xlYW4odG8pO1xuXHR9IGVsc2Uge1xuXHRcdC8vIENhbGwgdG8gJC51bmxpbmsoKSBpcyBlcXVpdmFsZW50IHRvICQudW5saW5rKHRydWUsIFwiYm9keVwiKVxuXHRcdGlmIChhY3RpdmVCb2R5KSB7XG5cdFx0XHQkKGFjdGl2ZUJvZHkpXG5cdFx0XHRcdC5vZmYoZWxlbWVudENoYW5nZVN0ciwgZWxlbUNoYW5nZUhhbmRsZXIpXG5cdFx0XHRcdC5vZmYoJ2JsdXInLCAnW2NvbnRlbnRlZGl0YWJsZV0nLCBlbGVtQ2hhbmdlSGFuZGxlcik7XG5cdFx0XHRhY3RpdmVCb2R5ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0b3BWaWV3LnJlbW92ZVZpZXdzKCk7XG5cdFx0Y2xlYW4oZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikpO1xuXHR9XG59XG5cbi8vPT09PT09PT1cbi8vIEhlbHBlcnNcbi8vPT09PT09PT1cblxuZnVuY3Rpb24gaW5wdXRBdHRyaWIoZWxlbSkge1xuXHRyZXR1cm4gZWxlbS50eXBlID09PSBDSEVDS0JPWCA/IGVsZW1bQ0hFQ0tFRF0gOiBlbGVtLnZhbHVlO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy89PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzUmVuZGVyIGludGVncmF0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PVxuXG4kc3ViLm9uU3RvcmUudGVtcGxhdGUgPSBmdW5jdGlvbihuYW1lLCBpdGVtKSB7XG5cdGl0ZW0ubGluayA9IHRtcGxMaW5rO1xuXHRpZiAobmFtZSkge1xuXHRcdCQubGlua1tuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRtcGxMaW5rLmFwcGx5KGl0ZW0sIGFyZ3VtZW50cyk7XG5cdFx0fTtcblx0fVxufTtcblxuJHN1Yi52aWV3SW5mb3MgPSB2aWV3SW5mb3M7IC8vIEV4cG9zZSB2aWV3SW5mb3MoKSBhcyBwdWJsaWMgaGVscGVyIG1ldGhvZFxuXG4vLyBEZWZpbmUgSnNWaWV3cyB2ZXJzaW9uIG9mIGRlbGltaXRlcnMoKSwgYW5kIGluaXRpYWxpemVcbigkdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzID0gZnVuY3Rpb24oKSB7XG5cdC8vIFJ1biBkZWxpbWl0ZXJzIGluaXRpYWxpemF0aW9uIGluIGNvbnRleHQgb2YganNyZW5kZXIuanNcblx0dmFyIHJldCA9IG9sZEpzdkRlbGltaXRlcnMuYXBwbHkoMCwgYXJndW1lbnRzKTtcblxuXHRpZiAob2xkSnN2RGVsaW1pdGVycyAhPT0gJHZpZXdzRGVsaW1pdGVycykge1xuXHRcdC8vIElmIEpzUmVuZGVyIHdhcyBsb2FkZWQgYmVmb3JlIEpzVmlld3MsIHRoZW4gbmVlZCBhbHNvIHRvIGluaXRpYWxpemUgYW5kIHNldCBnbG9iYWxzIGluIHRoYXQgSnNSZW5kZXIgaW5zdGFuY2Vcblx0XHRyZXQgPSAkdmlld3NEZWxpbWl0ZXJzLmFwcGx5KDAsIGFyZ3VtZW50cyk7XG5cdH1cblxuXHQvLyBEYXRhLWxpbmtpbmcgbXVzdCB1c2UgbmV3IGRlbGltaXRlcnNcblx0clRhZ0RhdGFsaW5rID0gbmV3IFJlZ0V4cChcIig/Ol58XFxcXHMqKShbXFxcXHctXSopKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpPyhcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMSArICRzdWIuclRhZyArIFwiKDpcXFxcdyopP1xcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiKVwiLCBcImdcIik7XG5cdHJldHVybiByZXQ7XG59KSgpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuJHN1Yi5hZGRTZXR0aW5nKFwidHJpZ2dlclwiKTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFkZGl0aW9uYWwgbWVtYmVycyBmb3IgbGlua2VkIHZpZXdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiB0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnRFbGVtLCBpZCwgdmlld09yVGFnQ2hhciwgcmVmcmVzaCkge1xuXHQvLyBUcmFuc2ZlciB0b2tlbnMgb24gcHJldk5vZGUgb2Ygdmlld1RvUmVtb3ZlL3ZpZXdUb1JlZnJlc2ggdG8gbmV4dE5vZGUgb3IgcGFyZW50RWxlbS5fZGZcblx0dmFyIGksIGwsIHZ3SW5mb3MsIHZ3SW5mbywgdmlld09yVGFnLCB2aWV3SWQsIHRva2Vucyxcblx0XHRwcmVjZWRpbmdMZW5ndGggPSAwLFxuXHRcdGVtcHR5VmlldyA9IHByZXZOb2RlID09PSBuZXh0Tm9kZTtcblxuXHRpZiAocHJldk5vZGUpIHtcblx0XHQvLyBwcmV2Tm9kZSBpcyBlaXRoZXIgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXdPclRhZywgb3IgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHZ3SW5mb3MgdG9rZW5zIHN0cmluZ1xuXHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3MocHJldk5vZGUpIHx8IFtdO1xuXHRcdGZvciAoaSA9IDAsIGwgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gU3RlcCB0aHJvdWdoIHZpZXdzIG9yIHRhZ3Mgb24gdGhlIHByZXZOb2RlXG5cdFx0XHR2d0luZm8gPSB2d0luZm9zW2ldO1xuXHRcdFx0dmlld0lkID0gdndJbmZvLmlkO1xuXHRcdFx0aWYgKHZpZXdJZCA9PT0gaWQgJiYgdndJbmZvLmNoID09PSB2aWV3T3JUYWdDaGFyKSB7XG5cdFx0XHRcdGlmIChyZWZyZXNoKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyB2aWV3T3JUYWdUb1JlZnJlc2gsIHRoaXMgaXMgdGhlIGxhc3Qgdmlld09yVGFnIHRvIHByb2Nlc3MuLi5cblx0XHRcdFx0XHRsID0gMDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIHZpZXdPclRhZ1RvUmVtb3ZlLCBzbyB3ZSBhcmUgZG9uZS4uLlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWVtcHR5Vmlldykge1xuXHRcdFx0XHR2aWV3T3JUYWcgPSB2d0luZm8uY2ggPT09IFwiX1wiXG5cdFx0XHRcdFx0PyB2aWV3U3RvcmVbdmlld0lkXVxuXHRcdFx0XHRcdDogYmluZGluZ1N0b3JlW3ZpZXdJZF0ubGlua0N0eC50YWc7XG5cdFx0XHRcdGlmICh2d0luZm8ub3Blbikge1xuXHRcdFx0XHRcdC8vIEEgXCIjbVwiIHRva2VuXG5cdFx0XHRcdFx0dmlld09yVGFnLl9wcnYgPSBuZXh0Tm9kZTtcblx0XHRcdFx0fSBlbHNlIGlmICh2d0luZm8uY2xvc2UpIHtcblx0XHRcdFx0XHQvLyBBIFwiL21cIiB0b2tlblxuXHRcdFx0XHRcdHZpZXdPclRhZy5fbnh0ID0gbmV4dE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHByZWNlZGluZ0xlbmd0aCArPSB2aWV3SWQubGVuZ3RoICsgMjtcblx0XHR9XG5cblx0XHRpZiAocHJlY2VkaW5nTGVuZ3RoKSB7XG5cdFx0XHRwcmV2Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgcHJldk5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpLnNsaWNlKHByZWNlZGluZ0xlbmd0aCkpO1xuXHRcdH1cblx0XHR0b2tlbnMgPSBuZXh0Tm9kZSA/IG5leHROb2RlLmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKSA6IHBhcmVudEVsZW0uX2RmO1xuXHRcdGlmIChsID0gdG9rZW5zLmluZGV4T2YoXCIvXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpICsgMSkge1xuXHRcdFx0dG9rZW5zID0gdndJbmZvcy5fdGtucy5zbGljZSgwLCBwcmVjZWRpbmdMZW5ndGgpICsgdG9rZW5zLnNsaWNlKGwgKyAocmVmcmVzaCA/IC0xIDogaWQubGVuZ3RoICsgMSkpO1xuXHRcdH1cblx0XHRpZiAodG9rZW5zKSB7XG5cdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0Ly8gSWYgdmlld09yVGFnVG9SZW1vdmUgd2FzIGFuIGVtcHR5IHZpZXdPclRhZywgd2Ugd2lsbCByZW1vdmUgYm90aCAjbiBhbmQgL25cblx0XHRcdFx0Ly8gKGFuZCBhbnkgaW50ZXJ2ZW5pbmcgdG9rZW5zKSBmcm9tIHRoZSBuZXh0Tm9kZSAoPT09IHByZXZOb2RlKVxuXHRcdFx0XHQvLyBJZiB2aWV3T3JUYWdUb1JlbW92ZSB3YXMgbm90IGVtcHR5LCB3ZSB3aWxsIHRha2UgdG9rZW5zIHByZWNlZGluZyAjbiBmcm9tIHByZXZOb2RlLFxuXHRcdFx0XHQvLyBhbmQgY29uY2F0ZW5hdGUgd2l0aCB0b2tlbnMgZm9sbG93aW5nIC9uIG9uIG5leHROb2RlXG5cdFx0XHRcdG5leHROb2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCB0b2tlbnMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgdG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gIXByZXZOb2RlLCBzbyB0aGVyZSBtYXkgYmUgYSBkZWZlcnJlZCBub2RlcyB0b2tlbiBvbiB0aGUgcGFyZW50RWxlbS4gUmVtb3ZlIGl0LlxuXHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIjXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpKTtcblx0XHRpZiAoIXJlZnJlc2ggJiYgIW5leHROb2RlKSB7XG5cdFx0XHQvLyBJZiB0aGlzIHZpZXdPclRhZyBpcyBiZWluZyByZW1vdmVkLCBhbmQgdGhlcmUgd2FzIG5vIC5ueHQsIHJlbW92ZSBjbG9zaW5nIHRva2VuIGZyb20gZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiL1wiICsgaWQgKyB2aWV3T3JUYWdDaGFyKSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRpc3Bvc2VUb2tlbnModG9rZW5zKSB7XG5cdHZhciBpLCBsLCB2d0l0ZW0sIHZ3SW5mb3M7XG5cdGlmICh2d0luZm9zID0gdmlld0luZm9zKHRva2VucywgdHJ1ZSwgck9wZW5NYXJrZXJzKSkge1xuXHRcdGZvciAoaSA9IDAsIGwgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dndJdGVtID0gdndJbmZvc1tpXTtcblx0XHRcdGlmICh2d0l0ZW0uY2ggPT09IFwiX1wiKSB7XG5cdFx0XHRcdGlmICgodndJdGVtID0gdmlld1N0b3JlW3Z3SXRlbS5pZF0pICYmIHZ3SXRlbS50eXBlKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhpcyBpcyB0aGUgX3BydiAocHJldk5vZGUpIGZvciBhIHZpZXcsIHJlbW92ZSB0aGUgdmlld1xuXHRcdFx0XHRcdC8vIC0gdW5sZXNzIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgaXQgaXMgYWxyZWFkeSBiZWluZyByZW1vdmVkXG5cdFx0XHRcdFx0dndJdGVtLnBhcmVudC5yZW1vdmVWaWV3cyh2d0l0ZW0uXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKHZ3SXRlbS5pZCk7IC8vIHVuYmluZCBiaW5kaW5ncyB3aXRoIHRoaXMgYmluZGluZ0lkIG9uIHRoaXMgdmlld1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQWRkIGxpbmsgbWV0aG9kcyB0byBkYXRhLWxpbmtlZCB2aWV3IG9yIHRhZ1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIGFkZExpbmtNZXRob2RzKHRhZ09yVmlldywgaXNUYWcpIHtcblxuXHR0YWdPclZpZXcuY29udGVudHMgPSBmdW5jdGlvbihkZWVwLCBzZWxlY3QpIHtcblx0XHQvLyBGb3IgYSB2aWV3IG9yIGEgdGFnLCByZXR1cm4galF1ZXJ5IG9iamVjdCB3aXRoIHRoZSBjb250ZW50IG5vZGVzLFxuXHRcdGlmIChkZWVwICE9PSAhIWRlZXApIHtcblx0XHRcdC8vIGRlZXAgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgY29udGVudHMoc2VsZWN0b3IpXG5cdFx0XHRzZWxlY3QgPSBkZWVwO1xuXHRcdFx0ZGVlcCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dmFyIGZpbHRlcmVkLFxuXHRcdFx0bm9kZXMgPSAkKHRoaXMubm9kZXMoKSk7XG5cdFx0aWYgKG5vZGVzWzBdKSB7XG5cdFx0XHRmaWx0ZXJlZCA9IHNlbGVjdCA/IG5vZGVzLmZpbHRlcihzZWxlY3QpIDogbm9kZXM7XG5cdFx0XHRub2RlcyA9IGRlZXAgJiYgc2VsZWN0ID8gZmlsdGVyZWQuYWRkKG5vZGVzLmZpbmQoc2VsZWN0KSkgOiBmaWx0ZXJlZDtcblx0XHR9XG5cdFx0cmV0dXJuIG5vZGVzO1xuXHR9O1xuXG5cdHRhZ09yVmlldy5ub2RlcyA9IGZ1bmN0aW9uKHdpdGhNYXJrZXJzLCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0XHQvLyBGb3IgYSB2aWV3IG9yIGEgdGFnLCByZXR1cm4gdG9wLWxldmVsIG5vZGVzXG5cdFx0Ly8gRG8gbm90IHJldHVybiBhbnkgc2NyaXB0IG1hcmtlciBub2RlcywgdW5sZXNzIHdpdGhNYXJrZXJzIGlzIHRydWVcblx0XHQvLyBPcHRpb25hbGx5IGxpbWl0IHJhbmdlLCBieSBwYXNzaW5nIGluIHByZXZOb2RlIG9yIG5leHROb2RlIHBhcmFtZXRlcnNcblxuXHRcdHZhciBub2RlLFxuXHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRlbENudCA9IHNlbGYuX2VsQ250LFxuXHRcdFx0cHJldklzRmlyc3ROb2RlID0gIXByZXZOb2RlICYmIGVsQ250LFxuXHRcdFx0bm9kZXMgPSBbXTtcblxuXHRcdHByZXZOb2RlID0gcHJldk5vZGUgfHwgc2VsZi5fcHJ2O1xuXHRcdG5leHROb2RlID0gbmV4dE5vZGUgfHwgc2VsZi5fbnh0O1xuXG5cdFx0bm9kZSA9IHByZXZJc0ZpcnN0Tm9kZVxuXHRcdFx0PyAocHJldk5vZGUgPT09IHNlbGYuX254dFxuXHRcdFx0XHQ/IHNlbGYucGFyZW50RWxlbS5sYXN0U2libGluZ1xuXHRcdFx0XHQ6IHByZXZOb2RlKVxuXHRcdFx0OiAoc2VsZi5fLmlubGluZSA9PT0gZmFsc2Vcblx0XHRcdFx0PyBwcmV2Tm9kZSB8fCBzZWxmLmxpbmtDdHguZWxlbS5maXJzdENoaWxkXG5cdFx0XHRcdDogcHJldk5vZGUgJiYgcHJldk5vZGUubmV4dFNpYmxpbmcpO1xuXG5cdFx0d2hpbGUgKG5vZGUgJiYgKCFuZXh0Tm9kZSB8fCBub2RlICE9PSBuZXh0Tm9kZSkpIHtcblx0XHRcdGlmICh3aXRoTWFya2VycyB8fCBlbENudCB8fCBub2RlLnRhZ05hbWUgIT09IFNDUklQVCkge1xuXHRcdFx0XHQvLyBBbGwgdGhlIHRvcC1sZXZlbCBub2RlcyBpbiB0aGUgdmlld1xuXHRcdFx0XHQvLyAoZXhjZXB0IHNjcmlwdCBtYXJrZXIgbm9kZXMsIHVubGVzcyB3aXRoTWFya2VycyA9IHRydWUpXG5cdFx0XHRcdC8vIChOb3RlOiBJZiBhIHNjcmlwdCBtYXJrZXIgbm9kZSwgdmlld0luZm8uZWxDbnQgdW5kZWZpbmVkKVxuXHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHRcdHJldHVybiBub2Rlcztcblx0fTtcblxuXHR0YWdPclZpZXcuY2hpbGRUYWdzID0gZnVuY3Rpb24oZGVlcCwgdGFnTmFtZSkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiBjaGlsZCB0YWdzIC0gYXQgYW55IGRlcHRoLCBvciBhcyBpbW1lZGlhdGUgY2hpbGRyZW4gb25seS5cblx0XHRpZiAoZGVlcCAhPT0gISFkZWVwKSB7XG5cdFx0XHQvLyBkZWVwIG5vdCBib29sZWFuLCBzbyB0aGlzIGlzIGNoaWxkVGFncyh0YWdOYW1lKSAtIHdoaWNoIGxvb2tzIGZvciB0b3AtbGV2ZWwgdGFncyBvZiBnaXZlbiB0YWdOYW1lXG5cdFx0XHR0YWdOYW1lID0gZGVlcDtcblx0XHRcdGRlZXAgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0dmlldyA9IHNlbGYubGluayA/IHNlbGYgOiBzZWxmLnRhZ0N0eC52aWV3LCAvLyB0aGlzIG1heSBiZSBhIHZpZXcgb3IgYSB0YWcuIElmIGEgdGFnLCBnZXQgdGhlIHZpZXcgZnJvbSB0YWcudmlldy50YWdDdHhcblx0XHRcdHByZXZOb2RlID0gc2VsZi5fcHJ2LFxuXHRcdFx0ZWxDbnQgPSBzZWxmLl9lbENudCxcblx0XHRcdHRhZ3MgPSBbXTtcblxuXHRcdHZpZXcubGluayhcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHNlbGYucGFyZW50RWxlbSxcblx0XHRcdGVsQ250ID8gcHJldk5vZGUgJiYgcHJldk5vZGUucHJldmlvdXNTaWJsaW5nIDogcHJldk5vZGUsXG5cdFx0XHRzZWxmLl9ueHQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR7Z2V0Ontcblx0XHRcdFx0dGFnczogdGFncyxcblx0XHRcdFx0ZGVlcDogZGVlcCxcblx0XHRcdFx0bmFtZTogdGFnTmFtZSxcblx0XHRcdFx0aWQ6IHNlbGYubGluayA/IHNlbGYuXy5pZCArIFwiX1wiIDogc2VsZi5fdGdJZCArIFwiXlwiXG5cdFx0XHR9fVxuXHRcdCk7XG5cdFx0cmV0dXJuIHRhZ3M7XG5cdH07XG5cblx0dGFnT3JWaWV3LnJlZnJlc2ggPSBmdW5jdGlvbihzb3VyY2VWYWx1ZSkge1xuXHRcdHZhciBwcm9taXNlLCBhdHRyLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGxpbmtDdHggPSB0YWcubGlua0N0eCxcblx0XHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXc7XG5cblx0XHRpZiAodGFnLmRpc3Bvc2VkKSB7IGVycm9yKFwiUmVtb3ZlZCB0YWdcIik7IH1cblx0XHRpZiAoc291cmNlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c291cmNlVmFsdWUgPSAkc3ViLl90YWcodGFnLCB2aWV3LCB2aWV3LnRtcGwsIG1lcmdlQ3R4cyh0YWcpLCB0cnVlKTsgLy8gR2V0IHJlbmRlcmVkIEhUTUwgZm9yIHRhZywgYmFzZWQgb24gcmVmcmVzaGVkIHRhZ0N0eHNcblx0XHR9XG5cdFx0aWYgKHNvdXJjZVZhbHVlICsgXCJcIiA9PT0gc291cmNlVmFsdWUpIHtcblx0XHRcdC8vIElmIG5vIHJlbmRlcmVkIGNvbnRlbnQsIHNvdXJjZVZhbHVlIHdpbGwgbm90IGJlIGEgc3RyaW5nIChjYW4gYmUgMCBvciB1bmRlZmluZWQpXG5cdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdHRhZy5vblVuYmluZCh0YWcudGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4KTtcblx0XHRcdH1cblx0XHRcdGF0dHIgPSB0YWcuXy5pbmxpbmUgPyBIVE1MIDogKGxpbmtDdHguYXR0ciB8fCBkZWZhdWx0QXR0cih0YWcucGFyZW50RWxlbSwgdHJ1ZSkpO1xuXHRcdFx0cHJvbWlzZSA9IHVwZGF0ZUNvbnRlbnQoc291cmNlVmFsdWUsIGxpbmtDdHgsIGF0dHIsIHRhZyk7XG5cdFx0fVxuXG5cdFx0Y2FsbEFmdGVyTGluayh0YWcpO1xuXHRcdHJldHVybiBwcm9taXNlIHx8IHRhZztcblx0fTtcblxuXHR0YWdPclZpZXcudXBkYXRlID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHR2YXIgbGlua2VkRWxlbSA9IHRoaXMubGlua2VkRWxlbTtcblx0XHRpZiAobGlua2VkRWxlbSkge1xuXHRcdFx0ZWxlbUNoYW5nZUhhbmRsZXIoe1xuXHRcdFx0XHR0YXJnZXQ6IGxpbmtlZEVsZW1bMF1cblx0XHRcdH0sIHVuZGVmaW5lZCwgdmFsdWUpO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoaXNUYWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgVEFHXG5cdFx0dGFnT3JWaWV3LmRvbUNoYW5nZSA9IGZ1bmN0aW9uKCkgeyAvLyBkb21DaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnRcblx0XHRcdHZhciBlbGVtID0gdGhpcy5wYXJlbnRFbGVtLFxuXHRcdFx0XHRoYXNMaXN0ZW5lciA9ICQuaGFzRGF0YShlbGVtKSAmJiAkLl9kYXRhKGVsZW0pLmV2ZW50cyxcblx0XHRcdFx0ZG9tQ2hhbmdlTm90aWZpY2F0aW9uID0gXCJqc3YtZG9tY2hhbmdlXCI7XG5cblx0XHRcdGlmIChoYXNMaXN0ZW5lciAmJiBoYXNMaXN0ZW5lcltkb21DaGFuZ2VOb3RpZmljYXRpb25dKSB7XG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciBoYW5kbGVyIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBsaXN0ZW5pbmcgZm9yIHRoaXMgZXZlbnQuIChOb3RlIHVzaW5nIHRyaWdnZXJIYW5kbGVyIC0gc28gbm8gZXZlbnQgYnViYmxpbmcuKVxuXHRcdFx0XHQkKGVsZW0pLnRyaWdnZXJIYW5kbGVyKGRvbUNoYW5nZU5vdGlmaWNhdGlvbiwgYXJndW1lbnRzKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSBWSUVXXG5cdFx0Ly8gTm90ZTogYSBsaW5rZWQgdmlldyB3aWxsIGFsc28sIGFmdGVyIGxpbmtpbmcgaGF2ZSBub2Rlc1tdLCBfcHJ2IChwcmV2Tm9kZSksIF9ueHQgKG5leHROb2RlKSAuLi5cblx0XHR0YWdPclZpZXcuYWRkVmlld3MgPSBmdW5jdGlvbihpbmRleCwgZGF0YUl0ZW1zKSB7XG5cdFx0XHQvLyBpZiB2aWV3IGlzIG5vdCBhbiBhcnJheSB2aWV3LCBkbyBub3RoaW5nXG5cdFx0XHR2YXIgaSwgdmlld3NDb3VudCxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdGl0ZW1zQ291bnQgPSBkYXRhSXRlbXMubGVuZ3RoLFxuXHRcdFx0XHR2aWV3cyA9IHNlbGYudmlld3M7XG5cblx0XHRcdGlmICghc2VsZi5fLnVzZUtleSAmJiBpdGVtc0NvdW50KSB7XG5cdFx0XHRcdC8vIHZpZXcgaXMgb2YgdHlwZSBcImFycmF5XCJcblx0XHRcdFx0dmlld3NDb3VudCA9IHZpZXdzLmxlbmd0aCArIGl0ZW1zQ291bnQ7XG5cblx0XHRcdFx0aWYgKHZpZXdzQ291bnQgPT09IHNlbGYuZGF0YS5sZW5ndGggLy8gSWYgdmlld3Mgbm90IGFscmVhZHkgc3luY2VkIHRvIGFycmF5IChlLmcuIHRyaWdnZXJlZCBieSBhcnJheS5sZW5ndGggcHJvcGVydHlDaGFuZ2UgLSBqc3ZpZXdzL2lzc3Vlcy8zMDEpXG5cdFx0XHRcdFx0XHQmJiByZW5kZXJBbmRMaW5rKHNlbGYsIGluZGV4LCBzZWxmLnRtcGwsIHZpZXdzLCBkYXRhSXRlbXMsIHNlbGYuY3R4KSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRpZiAoIXNlbGYuXy5zcnQpIHsgLy8gTm90IHBhcnQgb2YgYSAnc29ydCcgb24gcmVmcmVzaFxuXHRcdFx0XHRcdFx0c2VsZi5maXhJbmRleChpbmRleCArIGl0ZW1zQ291bnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0YWdPclZpZXcucmVtb3ZlVmlld3MgPSBmdW5jdGlvbihpbmRleCwgaXRlbXNDb3VudCwga2VlcE5vZGVzLCBpc01vdmUpIHtcblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoKSByZW1vdmVzIGFsbCB0aGUgY2hpbGQgdmlld3Ncblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoaW5kZXgpIHJlbW92ZXMgdGhlIGNoaWxkIHZpZXcgd2l0aCBzcGVjaWZpZWQgaW5kZXggb3Iga2V5XG5cdFx0XHQvLyB2aWV3LnJlbW92ZVZpZXdzKGluZGV4LCBjb3VudCkgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG51bW1iZXIgb2YgY2hpbGQgdmlld3MsIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleFxuXHRcdFx0ZnVuY3Rpb24gcmVtb3ZlVmlldyhpbmRleCkge1xuXHRcdFx0XHR2YXIgaWQsIGJpbmRJZCwgcGFyZW50RWxlbSwgcHJldk5vZGUsIG5leHROb2RlLCBub2Rlc1RvUmVtb3ZlLFxuXHRcdFx0XHRcdHZpZXdUb1JlbW92ZSA9IHZpZXdzW2luZGV4XTtcblxuXHRcdFx0XHRpZiAodmlld1RvUmVtb3ZlICYmIHZpZXdUb1JlbW92ZS5saW5rKSB7XG5cdFx0XHRcdFx0aWQgPSB2aWV3VG9SZW1vdmUuXy5pZDtcblx0XHRcdFx0XHRpZiAoIWtlZXBOb2Rlcykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBIVE1MIG5vZGVzIGZyb20gdGhlIERPTSwgdW5sZXNzIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgaW5jbHVkaW5nIG5vZGVzIG9mIGNoaWxkIHZpZXdzXG5cdFx0XHRcdFx0XHRub2Rlc1RvUmVtb3ZlID0gdmlld1RvUmVtb3ZlLm5vZGVzKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXdzLCB3aXRob3V0IHJlbW92aW5nIG5vZGVzXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlLnJlbW92ZVZpZXdzKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcblxuXHRcdFx0XHRcdHZpZXdUb1JlbW92ZS50eXBlID0gdW5kZWZpbmVkOyAvLyBTZXQgdHlwZSB0byB1bmRlZmluZWQ6IHVzZWQgYXMgYSBmbGFnIHRoYXQgdGhpcyB2aWV3IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHRwcmV2Tm9kZSA9IHZpZXdUb1JlbW92ZS5fcHJ2O1xuXHRcdFx0XHRcdG5leHROb2RlID0gdmlld1RvUmVtb3ZlLl9ueHQ7XG5cdFx0XHRcdFx0cGFyZW50RWxlbSA9IHZpZXdUb1JlbW92ZS5wYXJlbnRFbGVtO1xuXHRcdFx0XHRcdC8vIElmIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBhcmUgdGhlIHNhbWUsIHRoZSB2aWV3IGlzIGVtcHR5XG5cdFx0XHRcdFx0aWYgKCFrZWVwTm9kZXMpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgSFRNTCBub2RlcyBmcm9tIHRoZSBET00sIHVubGVzcyB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIGluY2x1ZGluZyBub2RlcyBvZiBjaGlsZCB2aWV3c1xuXHRcdFx0XHRcdFx0aWYgKHZpZXdUb1JlbW92ZS5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaWYga2VlcE5vZGVzIGlzIGZhbHNlIChhbmQgdHJhbnNmZXJyaW5nIG9mIHRva2VucyBoYXMgbm90IGFscmVhZHkgYmVlbiBkb25lIGF0IGEgaGlnaGVyIGxldmVsKVxuXHRcdFx0XHRcdFx0XHQvLyB0aGVuIHRyYW5zZmVyIHRva2VucyBmcm9tIHByZXZOb2RlIHdoaWNoIGlzIGJlaW5nIHJlbW92ZWQsIHRvIG5leHROb2RlLlxuXHRcdFx0XHRcdFx0XHR0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnRFbGVtLCBpZCwgXCJfXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCF2aWV3VG9SZW1vdmUuX2VsQ250KSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRwcmV2Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHByZXZOb2RlKTsgLy8gKHByZXZOb2RlLnBhcmVudE5vZGUgaXMgcGFyZW50RWxlbSwgZXhjZXB0IGlmIGpRdWVyeSBNb2JpbGUgb3Igc2ltaWxhciBoYXMgaW5zZXJ0ZWQgYW4gaW50ZXJtZWRpYXRlIHdyYXBwZXJcblx0XHRcdFx0XHRcdFx0bmV4dE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsodmlld1RvUmVtb3ZlKTtcblx0XHRcdFx0XHRmb3IgKGJpbmRJZCBpbiB2aWV3VG9SZW1vdmUuXy5ibmRzKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3QmluZGluZyhiaW5kSWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkZWxldGUgdmlld1N0b3JlW2lkXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY3VycmVudCwgdmlldywgdmlld3NDb3VudCxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdGlzQXJyYXkgPSAhc2VsZi5fLnVzZUtleSxcblx0XHRcdFx0dmlld3MgPSBzZWxmLnZpZXdzO1xuXG5cdFx0XHRpZiAoaXNBcnJheSkge1xuXHRcdFx0XHR2aWV3c0NvdW50ID0gdmlld3MubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIGFsbCBjaGlsZCB2aWV3c1xuXHRcdFx0XHRpZiAoaXNBcnJheSkge1xuXHRcdFx0XHRcdC8vIHZpZXdzIGFuZCBkYXRhIGFyZSBhcnJheXNcblx0XHRcdFx0XHRjdXJyZW50ID0gdmlld3NDb3VudDtcblx0XHRcdFx0XHR3aGlsZSAoY3VycmVudC0tKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGN1cnJlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZWxmLnZpZXdzID0gW107XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdmlld3MgYW5kIGRhdGEgYXJlIG9iamVjdHNcblx0XHRcdFx0XHRmb3IgKHZpZXcgaW4gdmlld3MpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBieSBrZXlcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXcodmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGYudmlld3MgPSB7fTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGl0ZW1zQ291bnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgcGFyZW50VmlldyBpcyBkYXRhIGFycmF5IHZpZXcuXG5cdFx0XHRcdFx0XHQvLyBTZXQgaXRlbXNDb3VudCB0byAxLCB0byByZW1vdmUgdGhpcyBpdGVtXG5cdFx0XHRcdFx0XHRpdGVtc0NvdW50ID0gMTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXcgd2l0aCBrZXkgJ2luZGV4J1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyhpbmRleCk7XG5cdFx0XHRcdFx0XHRkZWxldGUgdmlld3NbaW5kZXhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaXNBcnJheSAmJiBpdGVtc0NvdW50XG5cdFx0XHRcdFx0JiYgKGlzTW92ZSB8fCB2aWV3c0NvdW50IC0gaXRlbXNDb3VudCA9PT0gc2VsZi5kYXRhLmxlbmd0aCkpIHsgLy8gSWYgdmlld3Mgbm90IGFscmVhZHkgc3luY2VkIHRvIGFycmF5IChlLmcuIHRyaWdnZXJlZCBieSBhcnJheS5sZW5ndGggcHJvcGVydHlDaGFuZ2UgLSBqc3ZpZXdzL2lzc3Vlcy8zMDEpXG5cdFx0XHRcdFx0Y3VycmVudCA9IGluZGV4ICsgaXRlbXNDb3VudDtcblx0XHRcdFx0XHQvLyBSZW1vdmUgaW5kZXhlZCBpdGVtcyAocGFyZW50VmlldyBpcyBkYXRhIGFycmF5IHZpZXcpO1xuXHRcdFx0XHRcdHdoaWxlIChjdXJyZW50LS0gPiBpbmRleCkge1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyhjdXJyZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmlld3Muc3BsaWNlKGluZGV4LCBpdGVtc0NvdW50KTtcblx0XHRcdFx0XHRpZiAoIXNlbGYuXy5zb3J0KSB7XG5cdFx0XHRcdFx0XHRzZWxmLmZpeEluZGV4KGluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0cGFyZW50ID0gc2VsZi5wYXJlbnQ7XG5cblx0XHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdFx0cmVuZGVyQW5kTGluayhzZWxmLCBzZWxmLmluZGV4LCBzZWxmLnRtcGwsIHBhcmVudC52aWV3cywgc2VsZi5kYXRhLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsoc2VsZik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5maXhJbmRleCA9IGZ1bmN0aW9uKGZyb21JbmRleCkge1xuXHRcdFx0Ly8gRml4dXAgaW5kZXggb24gZm9sbG93aW5nIHZpZXcgaXRlbXMuLi5cblx0XHRcdHZhciB2aWV3cyA9IHRoaXMudmlld3MsXG5cdFx0XHRcdGluZGV4ID0gdmlld3MubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGZyb21JbmRleCA8IGluZGV4LS0pIHtcblx0XHRcdFx0aWYgKHZpZXdzW2luZGV4XS5pbmRleCAhPT0gaW5kZXgpIHtcblx0XHRcdFx0XHQkb2JzZXJ2YWJsZSh2aWV3c1tpbmRleF0pLnNldFByb3BlcnR5KFwiaW5kZXhcIiwgaW5kZXgpO1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgZml4aW5nIHVwIGluZGV4LCBidXQgbm90IGtleSwgYW5kIG5vdCBpbmRleCBvbiBjaGlsZCB2aWV3cy4gRnJvbSBjaGlsZCB2aWV3cywgdXNlIHZpZXcuZ2V0SW5kZXgoKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5saW5rID0gdmlld0xpbms7XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzVmlld3Mtc3BlY2lmaWMgY29udmVydGVyc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT1cblxuJGNvbnZlcnRlcnMubWVyZ2UgPSBmdW5jdGlvbih2YWwpIHtcblx0Ly8gU3BlY2lhbCBjb252ZXJ0ZXIgdXNlZCBpbiBkYXRhLWxpbmtpbmcgdG8gc3BhY2Utc2VwYXJhdGVkIGxpc3RzLCBzdWNoIGFzIGNsYXNzTmFtZTpcblx0Ly8gQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdG9nZ2xlIHNlbWFudGljcyAtIGFuZCBoYXMgbm8gZWZmZWN0IGlmIHRvZ2dsZSBzdHJpbmcgaXMgbm90IHNwZWNpZmllZFxuXHQvLyBkYXRhLWxpbms9XCJjbGFzc3ttZXJnZTpib29sRXhwciB0b2dnbGU9Y2xhc3NOYW1lfVwiXG5cdHZhciByZWd1bGFyRXhwcmVzc2lvbixcblx0XHRjdXJyZW50VmFsdWUgPSB0aGlzLmxpbmtDdHguX3ZhbCB8fCBcIlwiLFxuXHRcdHRvZ2dsZSA9IHRoaXMudGFnQ3R4LnByb3BzLnRvZ2dsZTtcblxuXHRpZiAodG9nZ2xlKSB7XG5cdFx0Ly8gV2UgYXJlIHRvZ2dsaW5nIHRoZSBjbGFzcyBzcGVjaWZpZWQgYnkgdGhlIHRvZ2dsZSBwcm9wZXJ0eSxcblx0XHQvLyBhbmQgdGhlIGJvb2xlYW4gdmFsIGJpbmRpbmcgaXMgZHJpdmluZyB0aGUgaW5zZXJ0L3JlbW92ZSB0b2dnbGVcblxuXHRcdHJlZ3VsYXJFeHByZXNzaW9uID0gdG9nZ2xlLnJlcGxhY2UoL1tcXFxcXiQufD8qKygpW3tdL2csIFwiXFxcXCQmXCIpO1xuXHRcdC8vIEVzY2FwZSBhbnkgcmVndWxhciBleHByZXNzaW9uIHNwZWNpYWwgY2hhcmFjdGVycyAobWV0YWNoYXJhY3RlcnMpIHdpdGhpbiB0aGUgdG9nZ2xlIHN0cmluZ1xuXHRcdHJlZ3VsYXJFeHByZXNzaW9uID0gXCIoXFxcXHMoPz1cIiArIHJlZ3VsYXJFeHByZXNzaW9uICsgXCIkKXwoXFxcXHMpfF4pKFwiICsgcmVndWxhckV4cHJlc3Npb24gKyBcIihcXFxcc3wkKSlcIjtcblx0XHQvLyBFeGFtcGxlOiAvKFxccyg/PW15Y2xhc3MkKXwoXFxzKXxeKT8obXljbGFzcyhcXHN8JCkpLyAtIHNvIG1hdGNoZXMgKFwiIG15Y2xhc3NcIiBvciBcIiBcIiBvciBeICkgZm9sbG93ZWQgYnkgKFwibXljbGFzcyBcIiBvciBcIm15Y2xhc3MkXCIpIHdoZXJlIF4vJCBhcmUgYmVnaW5uaW5nL2VuZCBvZiBzdHJpbmdcblx0XHRjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKHJlZ3VsYXJFeHByZXNzaW9uKSwgXCIkMlwiKTtcblx0XHR2YWwgPSBjdXJyZW50VmFsdWUgKyAodmFsID8gKGN1cnJlbnRWYWx1ZSAmJiBcIiBcIikgKyB0b2dnbGUgOiBcIlwiKTtcblx0fVxuXHRyZXR1cm4gdmFsO1xufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzVmlld3Mtc3BlY2lmaWMgdGFnc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24ga2VlcFBhcmVudERhdGFDdHgodmFsKSB7XG5cdHJldHVybiB0aGlzLnRhZ0N0eC52aWV3OyAvLyBSZXR1cm4gdGhlIHBhcmVudCB2aWV3IGFzIGRhdGEgY29udGV4dCBmb3IgcmVuZGVyaW5nIGJsb2NrIGNvbnRlbnRcbn1cblxuJHRhZ3Moe1xuXHRvbjoge1xuXHRcdGF0dHI6IE5PTkUsXG5cdFx0aW5pdDogZnVuY3Rpb24odGFnQ3R4KSB7XG5cdFx0XHR2YXIgY29udGVudCxcblx0XHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGFyZ3MgPSB0YWdDdHguYXJncywgLy8gW2V2ZW50cyxdIFtzZWxlY3RvcixdIGhhbmRsZXJcblx0XHRcdFx0bCA9IGFyZ3MubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKDsgaTxsICYmICEkaXNGdW5jdGlvbihhcmdzW2ldKTsgaSsrKTsgLy8gSGFuZGxlciBpcyBmaXJzdCBhcmcgb2YgdHlwZSBmdW5jdGlvblxuXHRcdFx0dGFnLl9oaSA9IGw+aSAmJiBpKzE7IC8vIGhhbmRsZXIgaW5kZXhcblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0aWYgKCEkc3ViLnJUbXBsLmV4ZWMoY29udGVudCA9IHRhZ0N0eC50bXBsLm1hcmt1cCkpIHtcblx0XHRcdFx0XHQvLyBJbmxpbmUge157b259fSB0YWcgd2l0aCBubyBjb250ZW50IChvciBleHRlcm5hbCB0ZW1wbGF0ZSBjb250ZW50KSBvciB3aXRoIGNvbnRlbnQgY29udGFpbmluZ1xuXHRcdFx0XHRcdC8vIG5vIEhUTUwgb3IgSnNSZW5kZXIgdGFnczogV2Ugd2lsbCB3cmFwIHRoZSAodGV4dCkgY29udGVudCwgb3IgdGhlIG9wZXJhdGlvbiBuYW1lIGluIGEgPGJ1dHRvbj4gZWxlbWVudFxuXHRcdFx0XHRcdC8vIChPdGhlcndpc2Ugd2Ugd2lsbCBhdHRhY2ggdGhlIGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQgY29udGVudCBhZnRlciBkYXRhLWxpbmtpbmcpXG5cdFx0XHRcdFx0dGFnLnRlbXBsYXRlID0gXCI8YnV0dG9uPlwiICsgKCQudHJpbShjb250ZW50KSB8fCB0YWdDdHgucGFyYW1zLmFyZ3NbaV0gfHwgXCJub29wXCIpICsgXCI8L2J1dHRvbj5cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YWcuYXR0ciA9IEhUTUw7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbkFmdGVyTGluazogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0XHR2YXIgaGFuZGxlciwgcGFyYW1zLCBmaW5kLCBhY3RpdmVFbGVtLFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHRpID0gdGFnLl9oaSxcblx0XHRcdFx0YXJncyA9IHRhZ0N0eC5hcmdzLCAvLyBbZXZlbnRzLF0gW3NlbGVjdG9yLF0gaGFuZGxlclxuXHRcdFx0XHRsID0gYXJncy5sZW5ndGgsXG5cdFx0XHRcdHByb3BzID0gdGFnQ3R4LnByb3BzLFxuXHRcdFx0XHRkYXRhID0gcHJvcHMuZGF0YSxcblx0XHRcdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdFx0XHRjb250ZXh0T2IgPSBwcm9wcy5jb250ZXh0OyAvLyBDb250ZXh0ICgndGhpcycgcG9pbnRlcikgZm9yIGF0dGFjaGVkIGhhbmRsZXJcblxuXHRcdFx0aWYgKGkpIHsgLy8gVGhlcmUgaXMgYSBoYW5kbGVyXG5cdFx0XHRcdGhhbmRsZXIgPSBhcmdzW2ktMV07XG5cdFx0XHRcdHBhcmFtcyA9IGFyZ3Muc2xpY2UoaSk7IC8vIFN1YnNlcXVlbnQgYXJncyBhcmUgcGFyYW1zXG5cdFx0XHRcdGFyZ3MgPSBhcmdzLnNsaWNlKDAsIGktMSk7IC8vIFByZWNlZGluZyBhcmdzIChpZiBhbnkpIGFyZSBldmVudHMgYW5kIHNlbGVjdG9yXG5cdFx0XHRcdHRhZy5fc2VsID0gYXJnc1sxXTsgLy8gU2VsZWN0b3IgZm9yIGRlc2NlbmRhbnQgZWxlbWVudHMgLSBmb3IgZGVsZWdhdGVkIGV2ZW50cyBvbiB0aG9zZSBlbGVtZW50cywgZGVsZWdhdGluZyB0byB0aGUgYWN0aXZlRWxlbVxuXG5cdFx0XHRcdGFjdGl2ZUVsZW0gPSB0YWcuYWN0aXZlRWxlbSA9IHRhZy5hY3RpdmVFbGVtIHx8ICQodGFnLl8uaW5saW5lXG5cdFx0XHRcdFx0PyAodGFnLl9zZWwgPSBhcmdzWzFdIHx8IFwiKlwiLCB0YWcucGFyZW50RWxlbSlcblx0XHRcdFx0XHQvLyBJZiBpbmxpbmUsIGF0dGFjaCB0byBjaGlsZCBlbGVtZW50cyBvZiB0YWcgcGFyZW50IGVsZW1lbnQgKGZpbHRlcmVkIGJ5IHNlbGVjdG9yIGFyZ3VtZW50IGlmIHByb3ZpZGVkLlxuXHRcdFx0XHRcdC8vIChJbiBoYW5kbGVyIHdlJ2xsIGZpbHRlciBvdXQgZXZlbnRzIGZyb20gc2libGluZyBlbGVtZW50cyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRhZy4pXG5cdFx0XHRcdFx0Ly8gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSBkZWxlZ2F0ZWQgcGF0dGVybiB3aGVyZSB0aGUgYXR0YWNoZWQgZXZlbnQgd29ya3MgZXZlbiBmb3IgYWRkZWQgZWxlbWVudHMgc2F0aXNmeWluZyB0aGUgc2VsZWN0b3Jcblx0XHRcdFx0XHQ6IGxpbmtDdHguZWxlbSk7XG5cblx0XHRcdFx0aWYgKCFjb250ZXh0T2IpIHtcblx0XHRcdFx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBwcmVjZWRpbmcgb2JqZWN0IChjb250ZXh0IG9iamVjdCkgb2YgaGFuZGxlciAod2hpY2ggaXMgdGhlIGxhc3QgYXJnKSwgY29tcGlsZSBmdW5jdGlvblxuXHRcdFx0XHRcdC8vIHRvIHJldHVybiB0aGF0IGNvbnRleHQgb2JqZWN0LCBhbmQgcnVuIGNvbXBpbGVkIGZ1bmN0aW9uIGFnYWluc3QgZGF0YVxuXHRcdFx0XHRcdGNvbnRleHRPYiA9IC9eKC4qKVtcXC5eXVtcXHckXSskLy5leGVjKHRhZ0N0eC5wYXJhbXMuYXJncy5zbGljZSgtcGFyYW1zLmxlbmd0aCAtIDEpWzBdKTtcblx0XHRcdFx0XHRjb250ZXh0T2IgPSBjb250ZXh0T2IgJiYgJHN1Yi50bXBsRm4oZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGNvbnRleHRPYlsxXSArIGRlbGltQ2xvc2VDaGFyMCwgdmlldy50bXBsLCB0cnVlKShsaW5rQ3R4LmRhdGEsIHZpZXcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRhZy5fZXZzKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY3RpdmVFbGVtLm9uKFxuXHRcdFx0XHRcdHRhZy5fZXZzID0gYXJnc1swXSB8fCBcImNsaWNrXCIsIC8vIGV2ZW50cyBkZWZhdWx0cyB0byBcImNsaWNrXCJcblx0XHRcdFx0XHR0YWcuX3NlbCxcblx0XHRcdFx0XHRkYXRhID09IHVuZGVmaW5lZCA/IG51bGwgOiBkYXRhLFxuXHRcdFx0XHRcdHRhZy5faGxyID0gZnVuY3Rpb24gaG5kbHIoZXYpIHtcblx0XHRcdFx0XHRcdHZhciBub2RlcywgbGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRmb3VuZCA9ICF0YWcuXy5pbmxpbmU7XG5cblx0XHRcdFx0XHRcdGlmICghZm91bmQpIHsgLy8gSWYgaW5saW5lLCBmaWx0ZXIgb3V0IGV2ZW50cyBmcm9tIHNpYmxpbmcgZWxlbWVudHMgcHJlY2VkaW5nIG9yIGZvbGxvd2luZyB0YWcuXG5cdFx0XHRcdFx0XHRcdG5vZGVzID0gdGFnLmNvbnRlbnRzKFwiKlwiKTtcblx0XHRcdFx0XHRcdFx0bCA9IG5vZGVzLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCFmb3VuZCAmJiBsLS0pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobm9kZXNbbF0uY29udGFpbnMoZXYudGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGZvdW5kKSB7IC8vIHRhcmdldCBlbGVtIGlzIGluZGVlZCB3aXRoaW4gdGhlIHRhZywgc28gY2FsbCB0aGUge29ufSBoYW5kbGVyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBoYW5kbGVyLmFwcGx5KGNvbnRleHRPYiB8fCBsaW5rQ3R4LmRhdGEsIFtdLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0XHRwYXJhbXMsIC8vIGUuZy4gcGFyMSwgcGFyMlxuXHRcdFx0XHRcdFx0XHRcdGV2LFxuXHRcdFx0XHRcdFx0XHRcdHtjaGFuZ2U6IGV2LnR5cGUsIHZpZXc6IHZpZXcsIGxpbmtDdHg6IGxpbmtDdHh9LFxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgLy8gSWYgdHJpZ2dlcmluZyBldmVudCAoZS5nLiBqc3YtZG9tY2hhbmdlKSBoYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgZXYsIHBhc3MgdGhlbSB0b29cblx0XHRcdFx0XHRcdFx0KSk7XG5cdFx0XHRcdFx0XHRcdC8vIGZvciB7b24gJ2NsaWNrJyBoYW5kbGVyIHBhcjEgcGFyMn0gdXNlIGhhbmRsZXIocGFyMSwgcGFyMiwgZXYsIGRvbWNoYW5nZUV2ZW50QXJncylcblx0XHRcdFx0XHRcdFx0Ly8gZm9yIHtvbiAnanN2LWRvbWNoYW5nZScgaGFuZGxlciBwYXIxIHBhcjJ9IHVzZSBoYW5kbGVyKHBhcjEsIHBhcjIsIGV2LCBkb21jaGFuZ2VFdmVudEFyZ3MsIHRhZ0N0eCwgbGlua0N0eCwgb2JzZXJ2YWJsZUV2ZW50QXJncylcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblVwZGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRvblVuYmluZDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHRpZiAoc2VsZi5hY3RpdmVFbGVtKSB7XG5cdFx0XHRcdHNlbGYuYWN0aXZlRWxlbS5vZmYoc2VsZi5fZXZzLCBzZWxmLl9zZWwsIHNlbGYuX2hscik7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRmbG93OiB0cnVlLFxuXHRcdGNvbnRlbnRDdHg6IGtlZXBQYXJlbnREYXRhQ3R4LFxuXHRcdGRhdGFCb3VuZE9ubHk6IHRydWVcblx0fSxcblx0cmFkaW9ncm91cDoge1xuXHRcdGluaXQ6IGZ1bmN0aW9uKHRhZ0N0eCkge1xuXHRcdFx0dGhpcy5uYW1lID0gdGFnQ3R4LnByb3BzLm5hbWUgfHwgKFwianN2XCIgKyBNYXRoLnJhbmRvbSgpKTtcblx0XHR9LFxuXHRcdG9uQmluZDogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0XHR2YXIgZG9tQ2huZ0NudG5yLFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHQkbGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtID0gKHRhZy5fLmlubGluZSA/IHRhZy5jb250ZW50cyh0cnVlLCBcImlucHV0W3R5cGU9cmFkaW9dXCIpIDogJChsaW5rQ3R4LmVsZW0pLmZpbmQoXCJpbnB1dFt0eXBlPXJhZGlvXVwiKSksXG5cdFx0XHRcdGwgPSAkbGlua2VkRWxlbS5sZW5ndGg7XG5cblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgb3duZWQgYnkgKHJlbmRlcmVkIGJ5KSB0aGlzIHRhZyAobm90IGJ5IGEgY2hpbGRUYWcgc3VjaCBhcyB7Xntmb3J9fSlcblx0XHRcdFx0Ly8gdXNlIGl0IGFzIGNvbnRhaW5lciBmb3IgZGV0ZWN0aW5nIGRvbSBjaGFuZ2VzXG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IHRhZy5jb250ZW50cyhcIipcIilbMF07XG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IGRvbUNobmdDbnRuciAmJiAkLnZpZXcoZG9tQ2huZ0NudG5yKS5jdHgudGFnID09PSB0YWcucGFyZW50ID8gZG9tQ2huZ0NudG5yIDogdGFnLnBhcmVudEVsZW07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkb21DaG5nQ250bnIgPSBsaW5rQ3R4LmVsZW07XG5cdFx0XHR9XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdC8vIENvbmZpZ3VyZSB0aGUgbmFtZSBmb3IgZWFjaCByYWRpbyBpbnB1dCBlbGVtZW50XG5cdFx0XHRcdCRsaW5rZWRFbGVtW2xdLm5hbWUgPSAkbGlua2VkRWxlbVtsXS5uYW1lIHx8IHRhZy5uYW1lO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRXN0YWJsaXNoIGEgZG9tY2hhbmdlIGxpc3RlbmVyIGluIGNhc2UgdGhpcyByYWRpb2dyb3VwIHdyYXBzIGEge157Zm9yfX0gb3Ige157aWZ9fSBvciBzaW1pbGFyIHdoaWNoIG1pZ2h0IGR5bmFtaWNhbGx5IGluc2VydCBuZXcgcmFkaW8gaW5wdXQgZWxlbWVudHNcblx0XHRcdCQoZG9tQ2huZ0NudG5yKS5vbihcImpzdi1kb21jaGFuZ2VcIiwgZnVuY3Rpb24oZXYsIGZvck9ySWZUYWdDdHgpIHtcblx0XHRcdFx0dmFyIGxpbmtlZEVsZW0sXG5cdFx0XHRcdFx0cGFyZW50VGFncyA9IGZvck9ySWZUYWdDdHguY3R4LnBhcmVudFRhZ3M7XG5cdFx0XHRcdGlmICghdGFnLl8uaW5saW5lIHx8IGRvbUNobmdDbnRuciAhPT0gdGFnLnBhcmVudEVsZW0gLy8gVGhlIGRvbUNobmdDbnRuciBpcyBzcGVjaWZpYyB0byB0aGlzIHRhZ1xuXHRcdFx0XHRcdC8vIFRoZSBkb21DaG5nQ250bnIgaXMgdGhlIHBhcmVudEVsZW0gb2YgdGhpcyB0YWcsIHNvIG5lZWQgdG8gbWFrZSBzdXJlIGRvbSBjaGFuZ2UgZXZlbnQgaXMgZm9yXG5cdFx0XHRcdFx0Ly8gYSBjb250ZW50IGNoYW5nZSB3aXRoaW4gdGhpcyB0YWcsIG5vdCBvdXRzaWRlIGl0LlxuXHRcdFx0XHRcdHx8IHBhcmVudFRhZ3MgJiYgcGFyZW50VGFnc1t0YWcudGFnTmFtZV0gPT09IHRhZykge1xuXHRcdFx0XHRcdC8vIENvbnRlbnRzIGhhdmUgY2hhbmdlZCBzbyByZWNyZWF0ZSAkbGlua2VkRWxlbSBmb3IgdGhlIHJhZGlvIGlucHV0IGVsZW1lbnRzIChpbmNsdWRpbmcgcG9zc2libGUgbmV3IG9uZSBqdXN0IGluc2VydGVkKVxuXHRcdFx0XHRcdCRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW0gPSB0YWcuY29udGVudHModHJ1ZSwgXCJpbnB1dFt0eXBlPXJhZGlvXVwiKTtcblx0XHRcdFx0XHRsID0gJGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdC8vIENvbmZpZ3VyZSBiaW5kaW5nICBhbmQgbmFtZSBmb3IgZWFjaCByYWRpbyBpbnB1dCBlbGVtZW50XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtID0gJGxpbmtlZEVsZW1bbF07XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5uYW1lID0gbGlua2VkRWxlbS5uYW1lIHx8IHRhZy5uYW1lO1xuXHRcdFx0XHRcdFx0YmluZFRvKGJpbmRpbmdTdG9yZVt0YWcuX3RnSWRdLCB0YWcsIGxpbmtlZEVsZW0pO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5fanN2Qm5kID0gXCImXCIgKyB0YWcuX3RnSWQgKyBcIitcIjtcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0uY2hlY2tlZCA9IHRhZy5jdnRBcmdzKClbMF0gPT09IGxpbmtlZEVsZW0udmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdG9uVXBkYXRlOiBmdW5jdGlvbihldiwgZXZlbnRBcmdzLCB0YWdDdHhzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHJlcmVuZGVyXG5cdFx0fSxcblx0XHRjb250ZW50Q3R4OiBrZWVwUGFyZW50RGF0YUN0eCxcblx0XHRkYXRhQm91bmRPbmx5OiB0cnVlXG5cdH1cbn0pO1xuXG4kZXh0ZW5kKCR0YWdzW1wiZm9yXCJdLCB7XG5cdC8vb25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIG5ld1RhZ0N0eHMpIHtcblx0XHQvL0NvbnNpZGVyIGFkZGluZyBmaWx0ZXJpbmcgZm9yIHBlcmYgb3B0aW1pemF0aW9uLiBIb3dldmVyIHRoZSBiZWxvdyBwcmV2ZW50cyB1cGRhdGUgb24gc29tZSBzY2VuYXJpb3Mgd2hpY2ggX3Nob3VsZF8gdXBkYXRlIC0gbmFtZWx5IHdoZW4gdGhlcmUgaXMgYW5vdGhlciBhcnJheSBvbiB3aGljaCBmb3IgYWxzbyBkZXBlbmRzLlxuXHRcdC8vdmFyIGksIGwsIHRjaSwgcHJldkFyZztcblx0XHQvL2ZvciAodGNpID0gMDsgKHByZXZBcmcgPSB0aGlzLnRhZ0N0eHNbdGNpXSkgJiYgcHJldkFyZy5hcmdzLmxlbmd0aDsgdGNpKyspIHtcblx0XHQvL1x0aWYgKHByZXZBcmcuYXJnc1swXSAhPT0gbmV3VGFnQ3R4c1t0Y2ldLmFyZ3NbMF0pIHtcblx0XHQvL1x0XHRyZXR1cm4gdHJ1ZTtcblx0XHQvL1x0fVxuXHRcdC8vfVxuXHRcdC8vcmV0dXJuIGZhbHNlO1xuXHQvL30sXG5cdG9uQXJyYXlDaGFuZ2U6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIHRhZ0N0eCwgbGlua0N0eCkge1xuXHRcdHZhciBhcnJheVZpZXcsXG5cdFx0XHR0YXJnZXQgPSBldi50YXJnZXQsXG5cdFx0XHR0YXJnZXRMZW5ndGggPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGNoYW5nZSA9IGV2ZW50QXJncy5jaGFuZ2U7XG5cdFx0aWYgKHRhZy5fLm5vVndzIC8vIENoaWxkIHZpZXdzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0YXJnZXQgaXMgbm90IGh0bWwgLSBlLmcuIGRhdGEtbGluaz1cInRpdGxle2ZvciAuLi59XCJcblx0XHRcdHx8IHRhZy50YWdDdHhzWzFdICYmICggLy8gVGhlcmUgaXMgYW4ge3tlbHNlfX1cblx0XHRcdFx0Y2hhbmdlID09PSBcImluc2VydFwiICYmIHRhcmdldExlbmd0aCA9PT0gZXZlbnRBcmdzLml0ZW1zLmxlbmd0aCAvLyBpbnNlcnRpbmcsIGFuZCBuZXcgbGVuZ3RoIGlzIHNhbWUgYXMgaW5zZXJ0ZWQgbGVuZ3RoLCBzbyBnb2luZyBmcm9tIDAgdG8gblxuXHRcdFx0XHR8fCBjaGFuZ2UgPT09IFwicmVtb3ZlXCIgJiYgIXRhcmdldExlbmd0aCAvLyByZW1vdmluZyAsIGFuZCBuZXcgbGVuZ3RoIDAsIHNvIGdvaW5nIGZyb20gbiB0byAwXG5cdFx0XHQpKSB7XG5cdFx0XHR0YWcucmVmcmVzaCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGFycmF5VmlldyBpbiB0YWcuXy5hcnJWd3MpIHtcblx0XHRcdFx0YXJyYXlWaWV3ID0gdGFnLl8uYXJyVndzW2FycmF5Vmlld107XG5cdFx0XHRcdGlmIChhcnJheVZpZXcuZGF0YSA9PT0gdGFyZ2V0KSB7XG5cdFx0XHRcdFx0YXJyYXlWaWV3Ll8ub25BcnJheUNoYW5nZS5hcHBseShhcnJheVZpZXcsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGFnLmRvbUNoYW5nZSh0YWdDdHgsIGxpbmtDdHgsIGV2ZW50QXJncyk7XG5cdFx0ZXYuZG9uZSA9IHRydWU7XG5cdH0sXG5cdG9uQWZ0ZXJMaW5rOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHR2YXIgaSwgYXJySGFuZGxlciwgYXJyQmluZGluZywgZGF0YSxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRhcnJheUJpbmRpbmdzID0gdGFnLl9hcnMgfHwge30sXG5cdFx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMsXG5cdFx0XHRsID0gdGFnQ3R4cy5sZW5ndGgsXG5cdFx0XHRzZWxlY3RlZCA9IHRhZy5zZWxlY3RlZCB8fCAwO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8PSBzZWxlY3RlZDsgaSsrKSB7XG5cdFx0XHR0YWdDdHggPSB0YWdDdHhzW2ldOyAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRhZ0N0eHMgdXAgdG8gc2VsZWN0ZWRcblx0XHRcdGRhdGEgPSB0YWdDdHgubWFwXG5cdFx0XHRcdD8gdGFnQ3R4Lm1hcC50Z3QgICAgICAgIC8vICdkYXRhJyBpcyBtYXBwZWQgZGF0YVxuXHRcdFx0XHQ6IHRhZ0N0eC5hcmdzLmxlbmd0aFxuXHRcdFx0XHRcdD8gdGFnQ3R4LmFyZ3NbMF0gICAgLy8gb3IgYXJnc1swXVxuXHRcdFx0XHRcdDogdGFnQ3R4LnZpZXcuZGF0YTsgLy8gb3IgZGVmYXVsdHMgdG8gY3VycmVudCBkYXRhLlxuXG5cdFx0XHRpZiAoKGFyckJpbmRpbmcgPSBhcnJheUJpbmRpbmdzW2ldKSAmJiBkYXRhICE9PSBhcnJCaW5kaW5nWzBdKSB7IC8vIElzIHRoZXJlIHByZXZpb3VzIGFycmF5IGRhdGEgb24gdGhpcyB0YWdDdHgsIGRpZmZlcmVudCBmcm9tIG5ldyBkYXRhXG5cdFx0XHRcdCRvYnNlcnZlKGFyckJpbmRpbmdbMF0sIGFyckJpbmRpbmdbMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZSBwcmV2aW91cyBhcnJheVxuXHRcdFx0XHRkZWxldGUgYXJyYXlCaW5kaW5nc1tpXTtcblx0XHRcdH1cblx0XHRcdGlmICghYXJyYXlCaW5kaW5nc1tpXSAmJiAkaXNBcnJheShkYXRhKSkge1xuXHRcdFx0XHQkb2JzZXJ2ZShkYXRhLCBhcnJIYW5kbGVyID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdHZhciB0YWdDdCA9IHRhZ0N0eDtcblx0XHRcdFx0XHR0YWcub25BcnJheUNoYW5nZShldiwgZXZlbnRBcmdzLCB0YWdDdCwgbGlua0N0eCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhcnJheUJpbmRpbmdzW2ldID0gW2RhdGEsIGFyckhhbmRsZXJdOyAvLyBTdG9yZSBhcnJheSBkYXRhIGFuZCBhcnJheUNoYW5nZUhhbmRsZXIgb24gdGFnLl9hcnNbaV1cblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChpID0gc2VsZWN0ZWQgKyAxOyBpIDwgbDsgaSsrKSB7IC8vIElmIHRoZXJlIHdlcmUgcHJldmlvdXMgYmluZGluZ3Mgb24gbGF0ZXIgdGFnQ3R4cywgcmVtb3ZlIHRoZW1cblx0XHRcdGlmIChhcnJCaW5kaW5nID0gYXJyYXlCaW5kaW5nc1tpXSkge1xuXHRcdFx0XHQkb2JzZXJ2ZShhcnJCaW5kaW5nWzBdLCBhcnJCaW5kaW5nWzFdLCB0cnVlKTsgLy91bm9ic2VydmUgcHJldmlvdXMgYmluZGluZ1xuXHRcdFx0XHRkZWxldGUgYXJyYXlCaW5kaW5nc1tpXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGFnLl9hcnMgPSBhcnJheUJpbmRpbmdzO1xuXHR9LFxuXHRvbkRpc3Bvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsLCB0YWcgPSB0aGlzO1xuXHRcdGZvciAobCBpbiB0YWcuX2Fycykge1xuXHRcdFx0JG9ic2VydmUodGFnLl9hcnNbbF1bMF0sIHRhZy5fYXJzW2xdWzFdLCB0cnVlKTsgLy91bm9ic2VydmVcblx0XHR9XG5cdH1cbn0pO1xuXG4kZXh0ZW5kKCR0YWdzW1wiaWZcIl0sIHtcblx0b25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIG5ld1RhZ0N0eHMpIHtcblx0XHR2YXIgdGNpLCBwcmV2QXJnLCBkaWZmZXJlbnQ7XG5cdFx0Zm9yICh0Y2kgPSAwOyAocHJldkFyZyA9IHRoaXMudGFnQ3R4c1t0Y2ldKTsgdGNpKyspIHtcblx0XHRcdGRpZmZlcmVudCA9IHByZXZBcmcucHJvcHMudG1wbCAhPT0gbmV3VGFnQ3R4c1t0Y2ldLnByb3BzLnRtcGwgfHwgcHJldkFyZy5hcmdzLmxlbmd0aCAmJiAhKHByZXZBcmcgPSBwcmV2QXJnLmFyZ3NbMF0pICE9PSAhbmV3VGFnQ3R4c1t0Y2ldLmFyZ3NbMF07XG5cdFx0XHRpZiAoKCF0aGlzLmNvbnZlcnQgJiYgISFwcmV2QXJnKSB8fCBkaWZmZXJlbnQpIHtcblx0XHRcdFx0cmV0dXJuIGRpZmZlcmVudDtcblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgbm90IGEgY2hhbmdlIG9mIHRlbXBsYXRlLCBhbmQgdGhlcmUgaXMgbm8gY29udmVydGVyLCBhbmQgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBib3RoIHRydXRoeSwgcmV0dXJuIGZhbHNlIHRvIGNhbmNlbCB1cGRhdGUuXG5cdFx0XHRcdC8vIChFdmVuIGlmIHZhbHVlcyBvbiBsYXRlciBlbHNlcyBhcmUgZGlmZmVyZW50LCB3ZSBzdGlsbCBkb24ndCB3YW50IHRvIHVwZGF0ZSwgc2luY2UgcmVuZGVyZWQgb3V0cHV0IHdvdWxkIGJlIHVuY2hhbmdlZClcblx0XHRcdFx0Ly8gSWYgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBkaWZmZXJlbnQsIHJldHVybiB0cnVlLCB0byB1cGRhdGVcblx0XHRcdFx0Ly8gSWYgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBib3RoIGZhbHNleSwgbW92ZSB0byB0aGUgbmV4dCB7e2Vsc2UgLi4ufX1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gQm9vbGVhbiB2YWx1ZSBvZiBhbGwgYXJncyBhcmUgdW5jaGFuZ2VkIChmYWxzZXkpLCBzbyByZXR1cm4gZmFsc2UgdG8gY2FuY2VsIHVwZGF0ZVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0b25BZnRlckxpbms6IGZ1bmN0aW9uKHRhZ0N0eCwgbGlua0N0eCwgY3R4LCBldiwgZXZlbnRBcmdzKSB7XG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0dGhpcy5kb21DaGFuZ2UodGFnQ3R4LCBsaW5rQ3R4LCBldmVudEFyZ3MpO1xuXHRcdH1cblx0fVxufSk7XG5cbmZ1bmN0aW9uIG9ic2VydmVQcm9wcyhtYXAsIGV2LCBldmVudEFyZ3MpIHtcblx0aWYgKGV2ZW50QXJncy5jaGFuZ2UgPT09IFwic2V0XCIpIHtcblx0XHR2YXIgdGFyZ2V0ID0gbWFwLnRndCxcblx0XHRcdGwgPSB0YXJnZXQubGVuZ3RoO1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdGlmICh0YXJnZXRbbF0ua2V5ID09PSBldmVudEFyZ3MucGF0aCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGwgPT09IC0xKSB7XG5cdFx0XHRpZiAoZXZlbnRBcmdzLnBhdGggJiYgIWV2ZW50QXJncy5yZW1vdmUpIHtcblx0XHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5pbnNlcnQoe2tleTogZXZlbnRBcmdzLnBhdGgsIHByb3A6IGV2ZW50QXJncy52YWx1ZX0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZXZlbnRBcmdzLnJlbW92ZSkge1xuXHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5yZW1vdmUobCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldFtsXSkuc2V0UHJvcGVydHkoXCJwcm9wXCIsIGV2ZW50QXJncy52YWx1ZSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIG9ic2VydmVNYXBwZWRQcm9wcyhtYXAsIGV2LCBldmVudEFyZ3MpIHtcblx0dmFyIGl0ZW0sXG5cdFx0c291cmNlID0gbWFwLnNyYyxcblx0XHRjaGFuZ2UgPSBldmVudEFyZ3MuY2hhbmdlO1xuXG5cdGlmIChjaGFuZ2UgPT09IFwic2V0XCIpIHtcblx0XHRpZiAoZXZlbnRBcmdzLnBhdGggPT09IFwicHJvcFwiKSB7XG5cdFx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnNldFByb3BlcnR5KGV2LnRhcmdldC5rZXksIGV2ZW50QXJncy52YWx1ZSk7XG5cdFx0fSBlbHNlIHsgLy8gcGF0aCA9PT0gXCJrZXlcIlxuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5yZW1vdmVQcm9wZXJ0eShldmVudEFyZ3Mub2xkVmFsdWUpOyAvLyBXaGVuIGtleSBpcyBtb2RpZmllZCBvYnNlcnZhYmx5LCByZW1vdmUgb2xkIG9uZSBhbmQgc2V0IG5ldyBvbmVcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoZXZlbnRBcmdzLnZhbHVlLCBldi50YXJnZXQucHJvcCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGNoYW5nZSA9PT0gXCJyZW1vdmVcIikge1xuXHRcdGl0ZW0gPSBldmVudEFyZ3MuaXRlbXNbMF07XG5cdFx0JG9ic2VydmFibGUoc291cmNlKS5yZW1vdmVQcm9wZXJ0eShpdGVtLmtleSk7XG5cdFx0ZGVsZXRlIHNvdXJjZVtpdGVtLmtleV07XG5cdH0gZWxzZSBpZiAoY2hhbmdlID09PSBcImluc2VydFwiKSB7XG5cdFx0aXRlbSA9IGV2ZW50QXJncy5pdGVtc1swXTtcblx0XHRpZiAoaXRlbS5rZXkpIHtcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoaXRlbS5rZXksIGl0ZW0ucHJvcCk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHNoYWxsb3dBcnJheUZpbHRlcihhbGxQYXRoIC8qLCBvYmplY3QsIHBhcmVudE9icyovKSB7IC8vIEZpbHRlciB1c2VkIGJ5IHt7cHJvcHN9fSBmb3IgdGhlIG1hcHBlZFByb3BzIHRhcmdldCBhcnJheVxuXHRyZXR1cm4gYWxsUGF0aC5pbmRleE9mKFwiLlwiKSA8IDA7XG59XG5cbiR0YWdzKFwicHJvcHNcIiwge1xuXHRiYXNlVGFnOiBcImZvclwiLFxuXHRkYXRhTWFwOiAkdmlld3MubWFwKHtcblx0XHRnZXRUZ3Q6ICR0YWdzLnByb3BzLmRhdGFNYXAuZ2V0VGd0LFxuXHRcdG9ic1NyYzogb2JzZXJ2ZVByb3BzLFxuXHRcdG9ic1RndDogb2JzZXJ2ZU1hcHBlZFByb3BzLFxuXHRcdHRndEZsdDogc2hhbGxvd0FycmF5RmlsdGVyXG5cdH0pLFxuXHRmbG93OiB0cnVlXG59KTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCBqUXVlcnkgbmFtZXNwYWNlXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kZXh0ZW5kKCQsIHtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09XG5cdC8vIGpRdWVyeSAkLnZpZXcoKSBwbHVnaW5cblx0Ly89PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHZpZXc6ICR2aWV3ID0gZnVuY3Rpb24obm9kZSwgaW5uZXIsIHR5cGUpIHtcblx0XHQvLyAkLnZpZXcoKSByZXR1cm5zIHRvcCB2aWV3XG5cdFx0Ly8gJC52aWV3KG5vZGUpIHJldHVybnMgdmlldyB0aGF0IGNvbnRhaW5zIG5vZGVcblx0XHQvLyAkLnZpZXcoc2VsZWN0b3IpIHJldHVybnMgdmlldyB0aGF0IGNvbnRhaW5zIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnRcblx0XHQvLyAkLnZpZXcobm9kZU9yU2VsZWN0b3IsIHR5cGUpIHJldHVybnMgbmVhcmVzdCBjb250YWluaW5nIHZpZXcgb2YgZ2l2ZW4gdHlwZVxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgXCJyb290XCIpIHJldHVybnMgcm9vdCBjb250YWluaW5nIHZpZXcgKGNoaWxkIG9mIHRvcCB2aWV3KVxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgdHJ1ZSwgdHlwZSkgcmV0dXJucyBuZWFyZXN0IGlubmVyIChjb250YWluZWQpIHZpZXcgb2YgZ2l2ZW4gdHlwZVxuXG5cdFx0ZnVuY3Rpb24gZ2V0SW5uZXJWaWV3KG5kLCBpc1ZsKSB7XG5cdFx0XHRpZiAobmQpIHtcblx0XHRcdFx0dndJbmZvcyA9IHZpZXdJbmZvcyhuZCwgaXNWbCwgck9wZW5WaWV3TWFya2Vycyk7XG5cdFx0XHRcdGZvciAoaiA9IDAsIGsgPSB2d0luZm9zLmxlbmd0aDsgaiA8IGs7IGorKykge1xuXHRcdFx0XHRcdGlmICgodmlldyA9IHZpZXdTdG9yZVt2d0luZm9zW2pdLmlkXSkgJiYgKHZpZXcgPSB2aWV3ICYmIHR5cGUgPyB2aWV3LmdldCh0cnVlLCB0eXBlKSA6IHZpZXcpKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5uZXIgIT09ICEhaW5uZXIpIHtcblx0XHRcdC8vIGlubmVyIG5vdCBib29sZWFuLCBzbyB0aGlzIGlzIHZpZXcobm9kZU9yU2VsZWN0b3IsIHR5cGUpXG5cdFx0XHR0eXBlID0gaW5uZXI7XG5cdFx0XHRpbm5lciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dmFyIHZpZXcsIHZ3SW5mb3MsIGksIGosIGssIGwsIGVsZW1zLFxuXHRcdFx0bGV2ZWwgPSAwLFxuXHRcdFx0Ym9keSA9IGRvY3VtZW50LmJvZHk7XG5cblx0XHRpZiAobm9kZSAmJiBub2RlICE9PSBib2R5ICYmIHRvcFZpZXcuXy51c2VLZXkgPiAxKSB7XG5cdFx0XHQvLyBQZXJmIG9wdGltaXphdGlvbiBmb3IgY29tbW9uIGNhc2VzXG5cblx0XHRcdG5vZGUgPSBcIlwiICsgbm9kZSA9PT0gbm9kZVxuXHRcdFx0XHQ/ICQobm9kZSlbMF1cblx0XHRcdFx0OiBub2RlLmpxdWVyeVxuXHRcdFx0XHRcdD8gbm9kZVswXVxuXHRcdFx0XHRcdDogbm9kZTtcblxuXHRcdFx0aWYgKG5vZGUpIHtcblx0XHRcdFx0aWYgKGlubmVyKSB7XG5cdFx0XHRcdFx0Z2V0SW5uZXJWaWV3KG5vZGUuX2RmLCB0cnVlKTtcblx0XHRcdFx0XHRpZiAoIXZpZXcpIHtcblx0XHRcdFx0XHRcdC8vIFRyZWF0IHN1cHBsaWVkIG5vZGUgYXMgYSBjb250YWluZXIgZWxlbWVudCBhbmQgcmV0dXJuIHRoZSBmaXJzdCB2aWV3IGVuY291bnRlcmVkLlxuXHRcdFx0XHRcdFx0ZWxlbXMgPSBxc2EgPyBub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoYmluZEVsc1NlbCkgOiAkKGJpbmRFbHNTZWwsIG5vZGUpLmdldCgpO1xuXHRcdFx0XHRcdFx0bCA9IGVsZW1zLmxlbmd0aDtcblx0XHRcdFx0XHRcdGZvciAoaSA9IDA7ICF2aWV3ICYmIGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0Z2V0SW5uZXJWaWV3KGVsZW1zW2ldKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZpZXc7XG5cdFx0XHRcdH1cblx0XHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0XHQvLyBNb3ZlIGJhY2sgdGhyb3VnaCBzaWJsaW5ncyBhbmQgdXAgdGhyb3VnaCBwYXJlbnRzIHRvIGZpbmQgcHJlY2VkaW5nIG5vZGUgd2hpY2ggaXMgYSBfcHJ2IChwcmV2Tm9kZSlcblx0XHRcdFx0XHQvLyBzY3JpcHQgbWFya2VyIG5vZGUgZm9yIGEgbm9uLWVsZW1lbnQtY29udGVudCB2aWV3LCBvciBhIF9wcnYgKGZpcnN0IG5vZGUpIGZvciBhbiBlbENudCB2aWV3XG5cdFx0XHRcdFx0aWYgKHZ3SW5mb3MgPSB2aWV3SW5mb3Mobm9kZSwgdW5kZWZpbmVkLCByVmlld01hcmtlcnMpKSB7XG5cdFx0XHRcdFx0XHRsID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdFx0XHRcdHZpZXcgPSB2d0luZm9zW2xdO1xuXHRcdFx0XHRcdFx0XHRpZiAodmlldy5vcGVuKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGxldmVsIDwgMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmlldyA9IHZpZXdTdG9yZVt2aWV3LmlkXTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB2aWV3ICYmIHR5cGUgPyB2aWV3LmdldCh0eXBlKSA6IHZpZXcgfHwgdG9wVmlldztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bGV2ZWwtLTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBsZXZlbCBzdGFydHMgYXQgemVyby4gSWYgd2UgaGl0IGEgdmlldy5jbG9zZSwgdGhlbiB3ZSBtb3ZlIGxldmVsIHRvIDEsIGFuZCB3ZSBkb24ndCByZXR1cm4gYSB2aWV3IHVudGlsXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgYXJlIGJhY2sgYXQgbGV2ZWwgemVybyAob3IgYSBwYXJlbnQgdmlldyB3aXRoIGxldmVsIDwgMClcblx0XHRcdFx0XHRcdFx0XHRsZXZlbCsrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZyB8fCBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRvcFZpZXc7XG5cdH0sXG5cblx0bGluazogJGxpbmssXG5cdHVubGluazogJHVubGluayxcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PVxuXHQvLyBvdmVycmlkZSAkLmNsZWFuRGF0YVxuXHQvLz09PT09PT09PT09PT09PT09PT09PVxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKGVsZW1zKSB7XG5cdFx0aWYgKGVsZW1zLmxlbmd0aCAmJiBpc0NsZWFuQ2FsbCkge1xuXHRcdFx0Ly8gUmVtb3ZlIEpzVmlld3MgYmluZGluZ3MuIEFsc28sIHJlbW92ZSBmcm9tIHRoZSBET00gYW55IGNvcnJlc3BvbmRpbmcgc2NyaXB0IG1hcmtlciBub2Rlc1xuXHRcdFx0Y2xlYW4oZWxlbXMpO1xuXHRcdH1cblx0XHRvbGRDbGVhbkRhdGEuYXBwbHkoJCwgYXJndW1lbnRzKTtcblx0fVxufSk7XG5cbi8vIFBvc3NpYmxlIGZ1dHVyZSBhZGRpdGlvbiAtIGUuZy4gZm9yIGNrZWRpdG9yIHRhZyBjb250cm9sXG4vLyR2aWV3cy51dGlsaXR5ID0ge1xuLy9cdHZhbGlkYXRlOiBmdW5jdGlvbihodG1sKSB7XG4vL1x0XHR0cnkge1xuLy9cdFx0XHR0b3BWaWV3LmxpbmsodW5kZWZpbmVkLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaHRtbCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIDEpO1xuLy9cdFx0fVxuLy9cdFx0Y2F0Y2ggKGUpIHtcbi8vXHRcdFx0cmV0dXJuIGUubWVzc2FnZTtcbi8vXHRcdH1cbi8vXHR9XG4vL307XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIGpRdWVyeSBpbnN0YW5jZSBwbHVnaW5zXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJGV4dGVuZCgkLmZuLCB7XG5cdGxpbms6IGZ1bmN0aW9uKGV4cHIsIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0XHRyZXR1cm4gJGxpbmsoZXhwciwgdGhpcywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSk7XG5cdH0sXG5cdHVubGluazogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICR1bmxpbmsodGhpcyk7XG5cdH0sXG5cdHZpZXc6IGZ1bmN0aW9uKGlubmVyLCB0eXBlKSB7XG5cdFx0cmV0dXJuICR2aWV3KHRoaXNbMF0sIGlubmVyLCB0eXBlKTtcblx0fVxufSk7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPdmVycmlkZSBqUXVlcnkgbWV0aG9kcyB0aGF0IGNhbGwgb3VyIG92ZXJyaWRkZW4gY2xlYW5EYXRhLCBmb3IgZGlzcG9zYWwgZXRjLlxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJC5lYWNoKFtIVE1MLCBcInJlcGxhY2VXaXRoXCIsIFwiZW1wdHlcIiwgXCJyZW1vdmVcIl0sIGZ1bmN0aW9uKGksIG5hbWUpIHtcblx0dmFyIG9sZEZuID0gJC5mbltuYW1lXTtcblx0JC5mbltuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciByZXN1bHQ7XG5cdFx0aXNDbGVhbkNhbGwgPSAxOyAvLyBNYWtlIHN1cmUgY2xlYW5EYXRhIGRvZXMgZGlzcG9zYWwgb25seSB3aGVuIGNvbWluZyBmcm9tIHRoZXNlIGNhbGxzLlxuXHRcdHRyeSB7XG5cdFx0XHRyZXN1bHQgPSBvbGRGbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdH1cblx0XHRmaW5hbGx5IHtcblx0XHRcdGlzQ2xlYW5DYWxsID0gMDtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcbn0pO1xuXG4vLz09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIHRvcFZpZXdcbi8vPT09PT09PT09PT09PT09XG5cbmFkZExpbmtNZXRob2RzKCRleHRlbmQodG9wVmlldyA9ICRzdWIudG9wVmlldywge3RtcGw6IHtsaW5rczoge319fSkpO1xuXG52aWV3U3RvcmUgPSB7MDogdG9wVmlld307IC8vIFRvcC1sZXZlbCB2aWV3XG4vLz09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kICQudmlld3Ncbi8vPT09PT09PT09PT09PT09XG5cbiR2aWV3cy5nZXRDdHggPSBmdW5jdGlvbihwYXJhbSkgeyAvLyBSZXR1cm4gdmFsdWUgb2YgY3R4LmZvbywgaW5jbHVkaW5nIGZvciBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMsIH5mb289ZXhwclxuXHRpZiAocGFyYW0gJiYgcGFyYW0uX2NwKSB7IC8vIElmIHRoaXMgaGVscGVyIHJlc291cmNlIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIsIH5mb289ZXhwclxuXHRcdHBhcmFtID0gIHBhcmFtWzFdKHBhcmFtWzBdLmRhdGEsIHBhcmFtWzBdLCAkc3ViKTtcblx0fVxuXHRyZXR1cm4gcGFyYW07XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCAkLnZpZXdzLnN1YlxuLy89PT09PT09PT09PT09PT09PT09XG5cbiRzdWIuX2NwID0gZnVuY3Rpb24ocGFyYW1WYWwsIHBhcmFtcywgdmlldykgeyAvLyBHZXQgY29tcGlsZWQgY29udGV4dHVhbCBwYXJhbWV0ZXJzIChvciBwcm9wZXJ0aWVzKSB+Zm9vPWV4cHIuXG5cdGlmICh2aWV3LmxpbmtlZCkgeyAvLyBJbiBKc1ZpZXdzLCByZXR1cm5zIFt2aWV3LCBsaW5rRm5dIHdoZXJlIGxpbmtGbiBpcyBjb21waWxlZCBmdW5jdGlvbiBmb3IgZXhwcmVzc2lvblxuXHRcdHBhcmFtcyA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBwYXJhbXMgKyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0dmFyIHRtcGwgPSB2aWV3LnRtcGwsXG5cdFx0XHRsaW5rcyA9IHRvcFZpZXcudG1wbC5saW5rcywgLy8gVXNlIHRvcFZpZXcgbGlua3MsIGFzIGZvciBjb21waWxlZCB0b3AtbGV2ZWwgbGlua2luZyBleHByZXNzaW9ucy4gVG8gZG8gLSBzaG91bGQgdGhpcyBldmVyIGdldCBkaXNwb3NlZD9cblx0XHRcdGxpbmtGbiA9IGxpbmtzW3BhcmFtc107XG5cdFx0aWYgKCFsaW5rRm4pIHtcblx0XHRcdGxpbmtzW3BhcmFtc10gPSBsaW5rRm4gPSAkc3ViLnRtcGxGbihwYXJhbXMsIHRtcGwsIHRydWUpO1xuXHRcdH1cblx0XHRwYXJhbVZhbCA9IFt2aWV3LCBsaW5rRm5dO1xuXHRcdHBhcmFtVmFsLl9jcCA9IHRydWU7IC8vIEZsYWcgdGhhdCB0aGlzIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXJcblx0fVxuXHRyZXR1cm4gcGFyYW1WYWw7IC8vIEluIEpzUmVuZGVyIHJldHVybnMgZXZhbHVhdGVkIGV4cHJlc3Npb25cbn07XG5cbiRzdWIuX2NlbyA9IGZ1bmN0aW9uIGNsb25lRXhwck9iamVjdHMob2JzKSB7ICAvLyBDbG9uZSBleHByT2JzIHNvIHRoYXQgZWFjaCByZWZlcmVuY2VkIGNvbnRleHR1YWwgcGFyYW1ldGVyIH5mb28gdXNlcyBpdHMgb3duIGV4cHJPYiBpbnN0YW5jZXNcblx0dmFyIG9iLFxuXHRcdGNsb25lcyA9IG9icyxcblx0XHRsID0gb2JzLmxlbmd0aDtcblx0aWYgKGwpIHtcblx0XHRjbG9uZXMgPSBbXTtcblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRvYiA9IG9ic1tsXTtcblx0XHRcdGlmIChvYi5fanN2KSB7XG5cdFx0XHRcdG9iID0gJGV4dGVuZCh7fSwgb2IpOyAgICAgICAgICAgICAgLy8gSWYgYW4gZXhwck9iLCBjbG9uZSBpdC4gSWYgYSBzdHJpbmcsIGtlZXAgYXMgaXNcblx0XHRcdFx0b2IucHJtID0gY2xvbmVFeHByT2JqZWN0cyhvYi5wcm0pOyAvLyBSZWN1cnNpdmVseSBjbG9uZSBleHByT2JzIGluIHBhcmFtZXRlcnMsIHRvb1xuXHRcdFx0fVxuXHRcdFx0Y2xvbmVzLnVuc2hpZnQob2IpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY2xvbmVzO1xufTtcblxuJHN1Yi5fZ2NjYiA9IGZ1bmN0aW9uKHZpZXcpIHsgLy8gUmV0dXJuIGEgY2FsbGJhY2sgZm9yIGFjY2Vzc2luZyB0aGUgY29udGV4dCBvZiBhIHRlbXBsYXRlL2RhdGEtbGluayBleHByZXNzaW9uIC0gYW5kIGNvbnZlcnRpbmcgfmZvbywgI2ZvbyBldGMuXG5cdC8vIFRPRE8gQ29uc2lkZXIgZXhwb3Npbmcgb3IgYWxsb3dpbmcgb3ZlcnJpZGUsIGFzIHB1YmxpYyBBUElcblx0cmV0dXJuIGZ1bmN0aW9uKHBhdGgsIG9iamVjdCwgZGVwdGgpIHtcblx0XHQvLyBUT0RPIGNvbnNpZGVyIG9ubHkgY2FsbGluZyB0aGUgY29udGV4dENiIG9uIHRoZSBpbml0aWFsIHRva2VuIGluIHBhdGggJ35hLmIuYycgYW5kIG5vdCBjYWxsaW5nIGFnYWluIG9uXG5cdFx0Ly8gdGhlIGluZGl2aWR1YWwgdG9rZW5zLCAnYScsICdiJywgJ2MnLi4uIEN1cnJlbnRseSBpdCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXNcblx0XHR2YXIgdG9rZW5zLCB0YWcsIGl0ZW1zLCBoZWxwZXIsIGxhc3QsIG5leHRQYXRoLCBsO1xuXHRcdGlmICh2aWV3ICYmIHBhdGgpIHtcblx0XHRcdGlmIChwYXRoLl9qc3YpIHtcblx0XHRcdFx0cmV0dXJuIHBhdGguX2pzdi5jYWxsKHZpZXcudG1wbCwgb2JqZWN0LCB2aWV3LCAkc3ViKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gXCJ+XCIpIHtcblx0XHRcdFx0Ly8gV2UgcmV0dXJuIG5ldyBpdGVtcyB0byBpbnNlcnQgaW50byB0aGUgc2VxdWVuY2UsIHJlcGxhY2luZyB0aGUgXCJ+YS5iLmNcIiBzdHJpbmc6XG5cdFx0XHRcdC8vIFtoZWxwZXJPYmplY3QgJ2EnLCBcImEuYi5jXCIgY3VycmVudERhdGFJdGVtXSBzbyBjdXJyZW50RGF0YUl0ZW0gYmVjb21lcyB0aGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50IHBhdGhzLlxuXHRcdFx0XHRpZiAocGF0aC5zbGljZSgwLCA0KSA9PT0gXCJ+dGFnXCIpIHtcblx0XHRcdFx0XHR0YWcgPSB2aWV3LmN0eDtcblx0XHRcdFx0XHRpZiAocGF0aC5jaGFyQXQoNCkgPT09IFwiLlwiKSB7XG5cdFx0XHRcdFx0XHQvLyBcIn50YWcueHh4XCJcblx0XHRcdFx0XHRcdHRva2VucyA9IHBhdGguc2xpY2UoNSkuc3BsaXQoXCIuXCIpO1xuXHRcdFx0XHRcdFx0dGFnID0gdGFnLnRhZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRva2Vucykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRhZyA/IFt0YWcsIHRva2Vucy5qb2luKFwiLlwiKSwgb2JqZWN0XSA6IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRwYXRoID0gcGF0aC5zbGljZSgxKS5zcGxpdChcIi5cIik7XG5cdFx0XHRcdGlmIChoZWxwZXIgPSB2aWV3LmhscChsYXN0ID0gcGF0aC5zaGlmdCgpLCB0cnVlKSkge1xuXHRcdFx0XHRcdGlmIChoZWxwZXIuX2NwKSB7ICAvLyBoZWxwZXIgZm9yIChjb250ZXh0dWFsIHBhcmFtZXRlciB+Zm9vPS4uLikgaXMgYW4gYXJyYXkgLSBbdmlldywgY3R4UHJtRGVwZW5kZW5jaWVzIC4uLl1cblx0XHRcdFx0XHRcdGlmIChwYXRoLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRuZXh0UGF0aCA9IFwiLlwiICsgcGF0aC5qb2luKFwiLlwiKTtcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGhlbHBlcltsID0gaGVscGVyLmxlbmd0aC0xXTtcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3QuX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdGxhc3Quc2IgPSBuZXh0UGF0aDtcblx0XHRcdFx0XHRcdFx0XHRsYXN0LmJuZCA9ICEhZGVwdGg7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0aGVscGVyW2xdID0gKGxhc3QgKyBuZXh0UGF0aCkucmVwbGFjZShcIiNkYXRhLlwiLCBcIlwiKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobGFzdC5zbGljZSgwLCA1KSA9PT0gXCIjdmlld1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRoZWxwZXJbbF0gPSBoZWxwZXJbbF0uc2xpY2UoNik7XG5cdFx0XHRcdFx0XHRcdFx0XHRoZWxwZXIuc3BsaWNlKGwsIDAsIHZpZXcpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aXRlbXMgPSBbaGVscGVyXTsgLy8gQ29udGV4dHVhbCBwYXJhbWV0ZXJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhdGgubGVuZ3RoIHx8ICRpc0Z1bmN0aW9uKGhlbHBlcikpIHtcblx0XHRcdFx0XHRcdGl0ZW1zID0gW2hlbHBlciwgcGF0aC5qb2luKFwiLlwiKSwgb2JqZWN0XTsgLy8gMndheSBiaW5kbmcgb24gfmZvby5oZWxwZXJMZWFmUHJvcGVydHkgb3IgfmNvbXB1dGVkKCkgb3IgfmNvbnRleHR1YWxQYXJhbVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaXRlbXMgfHwgW107XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdC8vIFdlIHJldHVybiBuZXcgaXRlbXMgdG8gaW5zZXJ0IGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIFwiI2EuYi5jXCIgc3RyaW5nOiBbdmlldywgXCJhLmIuY1wiIGN1cnJlbnREYXRhSXRlbV1cblx0XHRcdFx0Ly8gc28gY3VycmVudERhdGFJdGVtIGJlY29tZXMgdGhlIG9iamVjdCBmb3Igc3Vic2VxdWVudCBwYXRocy4gVGhlICd0cnVlJyBmbGFnIG1ha2VzIHRoZSBwYXRocyBiaW5kIG9ubHkgdG8gbGVhZiBjaGFuZ2VzLlxuXHRcdFx0XHRyZXR1cm4gcGF0aCA9PT0gXCIjZGF0YVwiID8gW10gOiBbdmlldywgcGF0aC5yZXBsYWNlKHJWaWV3UGF0aCwgXCJcIiksIG9iamVjdF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgJC52aWV3cy5zZXR0aW5nc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09XG5cbm9sZEFkdlNldCA9ICRzdWIuYWR2U2V0O1xuXG4kc3ViLmFkdlNldCA9IGZ1bmN0aW9uKCkgeyAvLyByZWZyZXNoIGFkdmFuY2VkIHNldHRpbmdzXG5cdG9sZEFkdlNldC5jYWxsKCRzdWIpO1xuXHRnbG9iYWwuX2pzdiA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl9qc3Zcblx0XHQ/ICRleHRlbmQoZ2xvYmFsLl9qc3YgfHwge30sIHsgLy8gY3JlYXRlIGdsb2JhbCBfanN2LCBmb3IgYWNjZXNzaW5nIHZpZXdzLCBldGNcblx0XHRcdFx0dmlld3M6IHZpZXdTdG9yZSxcblx0XHRcdFx0YmluZGluZ3M6IGJpbmRpbmdTdG9yZVxuXHRcdFx0fSlcblx0XHQ6IHVuZGVmaW5lZDsgLy8gSW4gSUU4IGNhbm5vdCBkbyBkZWxldGUgZ2xvYmFsLl9qc3Zcblx0JHZpZXdzTGlua0F0dHIgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5saW5rQXR0cjtcblx0bGlua1ZpZXdzU2VsID0gYmluZEVsc1NlbCArIFwiLFtcIiArICR2aWV3c0xpbmtBdHRyICsgXCJdXCI7XG5cdHdyYXBNYXAgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5fd207XG5cdHdyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjtcblx0d3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcblx0d3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG59O1xuXG4kdmlld3NTZXR0aW5ncy5hZHZhbmNlZCh7XG5cdGxpbmtBdHRyOiBcImRhdGEtbGlua1wiLFxuXHR1c2VWaWV3czogZmFsc2UsXG5cdG5vVmFsaWRhdGU6IGZhbHNlLFxuXHQvLyB3cmFwTWFwIHByb3ZpZGUgYXBwcm9wcmlhdGUgd3JhcHBlcnMgZm9yIGluc2VydGluZyBpbm5lckhUTUwsIHVzZWQgaW4gaW5zZXJ0QmVmb3JlXG5cdC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApXG5cdC8vIFRPRE8gaW52ZXN0aWdhdGUgd2hldGhlciBtb3JlIHJlY2VudCBqUXVlcnkgaW1wbGVtZW50YXRpb24gdXNpbmcgd3JhcE1hcCBpbiBkb21NYW5pcC8kKCkuaHRtbCgpIGV0Yy4gaXMgYmV0dGVyIG9wdGltaXplZCBub3cuLi5cblx0X3dtOiB7XG5cdFx0b3B0aW9uOiBbMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCJdLFxuXHRcdGxlZ2VuZDogWzEsIFwiPGZpZWxkc2V0PlwiLCBcIjwvZmllbGRzZXQ+XCJdLFxuXHRcdGFyZWE6IFsxLCBcIjxtYXA+XCIsIFwiPC9tYXA+XCJdLFxuXHRcdHBhcmFtOiBbMSwgXCI8b2JqZWN0PlwiLCBcIjwvb2JqZWN0PlwiXSxcblx0XHR0aGVhZDogWzEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCJdLFxuXHRcdHRyOiBbMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIl0sXG5cdFx0dGQ6IFszLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiXSxcblx0XHRjb2w6IFsyLCBcIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiXSxcblx0XHRzdmdfbnM6IFsxLCBcIjxzdmc+XCIsIFwiPC9zdmc+XCJdLFxuXHRcdC8vIElFNi04IGNhbid0IHNlcmlhbGl6ZSBsaW5rLCBzY3JpcHQsIHN0eWxlLCBvciBhbnkgaHRtbDUgKE5vU2NvcGUpIHRhZ3MsXG5cdFx0Ly8gdW5sZXNzIHdyYXBwZWQgaW4gYSBkaXYgd2l0aCBub24tYnJlYWtpbmcgY2hhcmFjdGVycyBpbiBmcm9udCBvZiBpdC5cblx0XHRkaXY6ICQuc3VwcG9ydC5odG1sU2VyaWFsaXplID8gWzAsIFwiXCIsIFwiXCJdIDogWzEsIFwiWDxkaXY+XCIsIFwiPC9kaXY+XCJdXG5cdH0sXG5cdF9mZToge1xuXHRcdGlucHV0OiB7XG5cdFx0XHRmcm9tOiBpbnB1dEF0dHJpYiwgdG86IFwidmFsdWVcIlxuXHRcdH0sXG5cdFx0dGV4dGFyZWE6IHZhbHVlQmluZGluZyxcblx0XHRzZWxlY3Q6IHZhbHVlQmluZGluZyxcblx0XHRvcHRncm91cDoge1xuXHRcdFx0dG86IFwibGFiZWxcIlxuXHRcdH1cblx0fVxufSk7XG5cbnJldHVybiAkO1xufSwgd2luZG93KSk7XG4iLCIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjIuMS40XG4gKiBodHRwOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IDIwMDUsIDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNS0wNC0yOFQxNjowMVpcbiAqL1xuXG4oZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcblxuXHRpZiAoIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiICkge1xuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0odHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBTdXBwb3J0OiBGaXJlZm94IDE4K1xuLy8gQ2FuJ3QgYmUgaW4gc3RyaWN0IG1vZGUsIHNldmVyYWwgbGlicyBpbmNsdWRpbmcgQVNQLk5FVCB0cmFjZVxuLy8gdGhlIHN0YWNrIHZpYSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmXG4vLyB5b3UgdHJ5IHRvIHRyYWNlIHRocm91Z2ggXCJ1c2Ugc3RyaWN0XCIgY2FsbCBjaGFpbnMuICgjMTMzMzUpXG4vL1xuXG52YXIgYXJyID0gW107XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgc3VwcG9ydCA9IHt9O1xuXG5cblxudmFyXG5cdC8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveClcblx0ZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQsXG5cblx0dmVyc2lvbiA9IFwiMi4xLjRcIixcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xXG5cdC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUFxuXHRydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZyxcblxuXHQvLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmdcblx0cm1zUHJlZml4ID0gL14tbXMtLyxcblx0cmRhc2hBbHBoYSA9IC8tKFtcXGRhLXpdKS9naSxcblxuXHQvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5cdGZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7XG5cdFx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuXHR9O1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3Jcblx0c2VsZWN0b3I6IFwiXCIsXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXHRcdHJldHVybiBudW0gIT0gbnVsbCA/XG5cblx0XHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRcdCggbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXSApIDpcblxuXHRcdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdFx0c2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2tcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXG5cdHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkge1xuXG5cdFx0Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXRcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XG5cblx0XHQvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKVxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcblx0XHRyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuXHRcdC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LlxuXHQvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpc1xuXHQvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9KSk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTtcblx0fSxcblxuXHRlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkge1xuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNBcnJheShzcmMpID8gc3JjIDogW107XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09IFwiZnVuY3Rpb25cIjtcblx0fSxcblxuXHRpc0FycmF5OiBBcnJheS5pc0FycmF5LFxuXG5cdGlzV2luZG93OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH0sXG5cblx0aXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChudWxsfHRydWV8ZmFsc2V8XCJcIilcblx0XHQvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzIChcIjB4Li4uXCIpXG5cdFx0Ly8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOXG5cdFx0Ly8gYWRkaW5nIDEgY29ycmVjdHMgbG9zcyBvZiBwcmVjaXNpb24gZnJvbSBwYXJzZUZsb2F0ICgjMTUxMDApXG5cdFx0cmV0dXJuICFqUXVlcnkuaXNBcnJheSggb2JqICkgJiYgKG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApICsgMSkgPj0gMDtcblx0fSxcblxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdC8vIE5vdCBwbGFpbiBvYmplY3RzOlxuXHRcdC8vIC0gQW55IG9iamVjdCBvciB2YWx1ZSB3aG9zZSBpbnRlcm5hbCBbW0NsYXNzXV0gcHJvcGVydHkgaXMgbm90IFwiW29iamVjdCBPYmplY3RdXCJcblx0XHQvLyAtIERPTSBub2Rlc1xuXHRcdC8vIC0gd2luZG93XG5cdFx0aWYgKCBqUXVlcnkudHlwZSggb2JqICkgIT09IFwib2JqZWN0XCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCBvYmouY29uc3RydWN0b3IgJiZcblx0XHRcdFx0IWhhc093bi5jYWxsKCBvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCBcImlzUHJvdG90eXBlT2ZcIiApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBmdW5jdGlvbiBoYXNuJ3QgcmV0dXJuZWQgYWxyZWFkeSwgd2UncmUgY29uZmlkZW50IHRoYXRcblx0XHQvLyB8b2JqfCBpcyBhIHBsYWluIG9iamVjdCwgY3JlYXRlZCBieSB7fSBvciBjb25zdHJ1Y3RlZCB3aXRoIG5ldyBPYmplY3Rcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0XHR9XG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjAsIGlPUzw2IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdFx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRcdGNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdFx0dHlwZW9mIG9iajtcblx0fSxcblxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dFxuXHRnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHtcblx0XHR2YXIgc2NyaXB0LFxuXHRcdFx0aW5kaXJlY3QgPSBldmFsO1xuXG5cdFx0Y29kZSA9IGpRdWVyeS50cmltKCBjb2RlICk7XG5cblx0XHRpZiAoIGNvZGUgKSB7XG5cdFx0XHQvLyBJZiB0aGUgY29kZSBpbmNsdWRlcyBhIHZhbGlkLCBwcm9sb2d1ZSBwb3NpdGlvblxuXHRcdFx0Ly8gc3RyaWN0IG1vZGUgcHJhZ21hLCBleGVjdXRlIGNvZGUgYnkgaW5qZWN0aW5nIGFcblx0XHRcdC8vIHNjcmlwdCB0YWcgaW50byB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpZiAoIGNvZGUuaW5kZXhPZihcInVzZSBzdHJpY3RcIikgPT09IDEgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBhdm9pZCB0aGUgRE9NIG5vZGUgY3JlYXRpb24sIGluc2VydGlvblxuXHRcdFx0Ly8gYW5kIHJlbW92YWwgYnkgdXNpbmcgYW4gaW5kaXJlY3QgZ2xvYmFsIGV2YWxcblx0XHRcdFx0aW5kaXJlY3QoIGNvZGUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3Milcblx0Y2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkge1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xuXHR9LFxuXG5cdG5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0fSxcblxuXHQvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrLCBhcmdzICkge1xuXHRcdHZhciB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aCxcblx0XHRcdGlzQXJyYXkgPSBpc0FycmF5bGlrZSggb2JqICk7XG5cblx0XHRpZiAoIGFyZ3MgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXkgKSB7XG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2suYXBwbHkoIG9ialsgaSBdLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGlzQXJyYXkgKSB7XG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7XG5cblx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMVxuXHR0cmltOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cblx0XHRcdFwiXCIgOlxuXHRcdFx0KCB0ZXh0ICsgXCJcIiApLnJlcGxhY2UoIHJ0cmltLCBcIlwiICk7XG5cdH0sXG5cblx0Ly8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XG5cdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XG5cblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBpc0FycmF5bGlrZSggT2JqZWN0KGFycikgKSApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsXG5cdFx0XHRcdFx0dHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkge1xuXHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcblx0XHRcdGogPSAwLFxuXHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07XG5cdFx0fVxuXG5cdFx0Zmlyc3QubGVuZ3RoID0gaTtcblxuXHRcdHJldHVybiBmaXJzdDtcblx0fSxcblxuXHRncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7XG5cdFx0dmFyIGNhbGxiYWNrSW52ZXJzZSxcblx0XHRcdG1hdGNoZXMgPSBbXSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0Y2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0O1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xuXHRcdC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG5cdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRjYWxsYmFja0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTtcblx0XHRcdGlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHtcblx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBlbGVtc1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkge1xuXHRcdHZhciB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0aXNBcnJheSA9IGlzQXJyYXlsaWtlKCBlbGVtcyApLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsXG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gZWxlbXMgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0XHRyZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7XG5cdH0sXG5cblx0Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzXG5cdGd1aWQ6IDEsXG5cblx0Ly8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55XG5cdC8vIGFyZ3VtZW50cy5cblx0cHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcblx0XHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRcdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0bXAgPSBmblsgY29udGV4dCBdO1xuXHRcdFx0Y29udGV4dCA9IGZuO1xuXHRcdFx0Zm4gPSB0bXA7XG5cdFx0fVxuXG5cdFx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0XHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBTaW11bGF0ZWQgYmluZFxuXHRcdGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTtcblx0XHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdFx0fTtcblxuXHRcdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRcdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9LFxuXG5cdG5vdzogRGF0ZS5ub3csXG5cblx0Ly8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyXG5cdC8vIHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuXG5cdHN1cHBvcnQ6IHN1cHBvcnRcbn0pO1xuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvclwiLnNwbGl0KFwiIFwiKSwgZnVuY3Rpb24oaSwgbmFtZSkge1xuXHRjbGFzczJ0eXBlWyBcIltvYmplY3QgXCIgKyBuYW1lICsgXCJdXCIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbn0pO1xuXG5mdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IGlPUyA4LjIgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cblx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoIG9iai5ub2RlVHlwZSA9PT0gMSAmJiBsZW5ndGggKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMi4wLXByZVxuICogaHR0cDovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE0LTEyLTE2XG4gKi9cbihmdW5jdGlvbiggd2luZG93ICkge1xuXG52YXIgaSxcblx0c3VwcG9ydCxcblx0RXhwcixcblx0Z2V0VGV4dCxcblx0aXNYTUwsXG5cdHRva2VuaXplLFxuXHRjb21waWxlLFxuXHRzZWxlY3QsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXG5cdC8vIExvY2FsIGRvY3VtZW50IHZhcnNcblx0c2V0RG9jdW1lbnQsXG5cdGRvY3VtZW50LFxuXHRkb2NFbGVtLFxuXHRkb2N1bWVudElzSFRNTCxcblx0cmJ1Z2d5UVNBLFxuXHRyYnVnZ3lNYXRjaGVzLFxuXHRtYXRjaGVzLFxuXHRjb250YWlucyxcblxuXHQvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhXG5cdGV4cGFuZG8gPSBcInNpenpsZVwiICsgMSAqIG5ldyBEYXRlKCksXG5cdHByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCxcblx0ZGlycnVucyA9IDAsXG5cdGRvbmUgPSAwLFxuXHRjbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0dG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fSxcblxuXHQvLyBHZW5lcmFsLXB1cnBvc2UgY29uc3RhbnRzXG5cdE1BWF9ORUdBVElWRSA9IDEgPDwgMzEsXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHA6Ly9qc3BlcmYuY29tL3Rob3ItaW5kZXhvZi12cy1mb3IvNVxuXHRpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7XG5cdFx0dmFyIGkgPSAwLFxuXHRcdFx0bGVuID0gbGlzdC5sZW5ndGg7XG5cdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRpZiAoIGxpc3RbaV0gPT09IGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gLTE7XG5cdH0sXG5cblx0Ym9vbGVhbnMgPSBcImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkXCIsXG5cblx0Ly8gUmVndWxhciBleHByZXNzaW9uc1xuXG5cdC8vIFdoaXRlc3BhY2UgY2hhcmFjdGVycyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXN5bnRheC8jY2hhcmFjdGVyc1xuXHRjaGFyYWN0ZXJFbmNvZGluZyA9IFwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFxcXHgwMC1cXFxceGEwXSkrXCIsXG5cblx0Ly8gTG9vc2VseSBtb2RlbGVkIG9uIENTUyBpZGVudGlmaWVyIGNoYXJhY3RlcnNcblx0Ly8gQW4gdW5xdW90ZWQgdmFsdWUgc2hvdWxkIGJlIGEgQ1NTIGlkZW50aWZpZXIgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0Ly8gUHJvcGVyIHN5bnRheDogaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI3ZhbHVlLWRlZi1pZGVudGlmaWVyXG5cdGlkZW50aWZpZXIgPSBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCBcIndcIiwgXCJ3I1wiICksXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKSg/OlxcXFwoKFwiICtcblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXHRcdC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2KVxuXHRcdFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiICsgYXR0cmlidXRlcyArIFwiKSopfFwiICtcblx0XHQvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpXG5cdFx0XCIuKlwiICtcblx0XHRcIilcXFxcKXwpXCIsXG5cblx0Ly8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlclxuXHRyd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcIitcIiwgXCJnXCIgKSxcblx0cnRyaW0gPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblxuXHRyYXR0cmlidXRlUXVvdGVzID0gbmV3IFJlZ0V4cCggXCI9XCIgKyB3aGl0ZXNwYWNlICsgXCIqKFteXFxcXF0nXFxcIl0qPylcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcXVwiLCBcImdcIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0XCJJRFwiOiBuZXcgUmVnRXhwKCBcIl4jKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggXCJ3XCIsIFwidypcIiApICsgXCIpXCIgKSxcblx0XHRcIkFUVFJcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBhdHRyaWJ1dGVzICksXG5cdFx0XCJQU0VVRE9cIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBwc2V1ZG9zICksXG5cdFx0XCJDSElMRFwiOiBuZXcgUmVnRXhwKCBcIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcXFwoXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooXFxcXGQrKXwpKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfClcIiwgXCJpXCIgKSxcblx0XHRcImJvb2xcIjogbmV3IFJlZ0V4cCggXCJeKD86XCIgKyBib29sZWFucyArIFwiKSRcIiwgXCJpXCIgKSxcblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdHJuYXRpdmUgPSAvXltee10rXFx7XFxzKlxcW25hdGl2ZSBcXHcvLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cdHJlc2NhcGUgPSAvJ3xcXFxcL2csXG5cblx0Ly8gQ1NTIGVzY2FwZXMgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVyc1xuXHRydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCBcIlxcXFxcXFxcKFtcXFxcZGEtZl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3woXCIgKyB3aGl0ZXNwYWNlICsgXCIpfC4pXCIsIFwiaWdcIiApLFxuXHRmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7XG5cdFx0dmFyIGhpZ2ggPSBcIjB4XCIgKyBlc2NhcGVkIC0gMHgxMDAwMDtcblx0XHQvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludFxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjRcblx0XHQvLyBXb3JrYXJvdW5kIGVycm9uZW91cyBudW1lcmljIGludGVycHJldGF0aW9uIG9mICtcIjB4XCJcblx0XHRyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/XG5cdFx0XHRlc2NhcGVkIDpcblx0XHRcdGhpZ2ggPCAwID9cblx0XHRcdFx0Ly8gQk1QIGNvZGVwb2ludFxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFx0Ly8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpXG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXNcblx0Ly8gU2VlIHNldERvY3VtZW50KClcblx0Ly8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgXCJQZXJtaXNzaW9uIERlbmllZFwiXG5cdC8vIGVycm9yIGluIElFXG5cdHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblx0XHRzZXREb2N1bWVudCgpO1xuXHR9O1xuXG4vLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxpc3QgKVxudHJ5IHtcblx0cHVzaC5hcHBseShcblx0XHQoYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7IGFwcGx5OiBhcnIubGVuZ3RoID9cblxuXHRcdC8vIExldmVyYWdlIHNsaWNlIGlmIHBvc3NpYmxlXG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0cHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHQvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGhcblx0XHRcdHdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge31cblx0XHRcdHRhcmdldC5sZW5ndGggPSBqIC0gMTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBtYXRjaCwgZWxlbSwgbSwgbm9kZVR5cGUsXG5cdFx0Ly8gUVNBIHZhcnNcblx0XHRpLCBncm91cHMsIG9sZCwgbmlkLCBuZXdDb250ZXh0LCBuZXdTZWxlY3RvcjtcblxuXHRpZiAoICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblxuXHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cdG5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZTtcblxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdGlmICggIXNlZWQgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cblx0XHQvLyBUcnkgdG8gc2hvcnRjdXQgZmluZCBvcGVyYXRpb25zIHdoZW4gcG9zc2libGUgKGUuZy4sIG5vdCB1bmRlciBEb2N1bWVudEZyYWdtZW50KVxuXHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiI0lEXCIpXG5cdFx0XHRpZiAoIChtID0gbWF0Y2hbMV0pICkge1xuXHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnNcblx0XHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50IChqUXVlcnkgIzY5NjMpXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSwgT3BlcmEsIGFuZCBXZWJraXQgcmV0dXJuIGl0ZW1zXG5cdFx0XHRcdFx0XHQvLyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ29udGV4dCBpcyBub3QgYSBkb2N1bWVudFxuXHRcdFx0XHRcdGlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0gY29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRjb250YWlucyggY29udGV4dCwgZWxlbSApICYmIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiVEFHXCIpXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsyXSApIHtcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gU3BlZWQtdXA6IFNpenpsZShcIi5DTEFTU1wiKVxuXHRcdFx0fSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkgJiYgc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBRU0EgcGF0aFxuXHRcdGlmICggc3VwcG9ydC5xc2EgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHtcblx0XHRcdG5pZCA9IG9sZCA9IGV4cGFuZG87XG5cdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdG5ld1NlbGVjdG9yID0gbm9kZVR5cGUgIT09IDEgJiYgc2VsZWN0b3I7XG5cblx0XHRcdC8vIHFTQSB3b3JrcyBzdHJhbmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmllc1xuXHRcdFx0Ly8gV2UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgYnkgc3BlY2lmeWluZyBhbiBleHRyYSBJRCBvbiB0aGUgcm9vdFxuXHRcdFx0Ly8gYW5kIHdvcmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpXG5cdFx0XHQvLyBJRSA4IGRvZXNuJ3Qgd29yayBvbiBvYmplY3QgZWxlbWVudHNcblx0XHRcdGlmICggbm9kZVR5cGUgPT09IDEgJiYgY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXHRcdFx0XHRncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblxuXHRcdFx0XHRpZiAoIChvbGQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpKSApIHtcblx0XHRcdFx0XHRuaWQgPSBvbGQucmVwbGFjZSggcmVzY2FwZSwgXCJcXFxcJCZcIiApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRleHQuc2V0QXR0cmlidXRlKCBcImlkXCIsIG5pZCApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5pZCA9IFwiW2lkPSdcIiArIG5pZCArIFwiJ10gXCI7XG5cblx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdGdyb3Vwc1tpXSA9IG5pZCArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0O1xuXHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKFwiLFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBuZXdTZWxlY3RvciApIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaChxc2FFcnJvcikge1xuXHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdGlmICggIW9sZCApIHtcblx0XHRcdFx0XHRcdGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtGdW5jdGlvbihzdHJpbmcsIE9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1bHRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KCBmbiApIHtcblx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gISFmbiggZGl2ICk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cdFx0Ly8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0XG5cdFx0aWYgKCBkaXYucGFyZW50Tm9kZSApIHtcblx0XHRcdGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBkaXYgKTtcblx0XHR9XG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRkaXYgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGF0dHJzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3NcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGJcbiAqL1xuZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkge1xuXHR2YXIgY3VyID0gYiAmJiBhLFxuXHRcdGRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHQoIH5iLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApIC1cblx0XHRcdCggfmEuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICk7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkge1xuXHRcdGFyZ3VtZW50ID0gK2FyZ3VtZW50O1xuXHRcdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7XG5cdHJldHVybiBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnRleHQ7XG59XG5cbi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlXG5zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTtcblxuLyoqXG4gKiBEZXRlY3RzIFhNTCBub2Rlc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGVcbiAqL1xuaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0Ly8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdFxuXHQvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMylcblx0dmFyIGRvY3VtZW50RWxlbWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1lbnQ7XG5cdHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09IFwiSFRNTFwiIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqL1xuc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHtcblx0dmFyIGhhc0NvbXBhcmUsIHBhcmVudCxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gSWYgbm8gZG9jdW1lbnQgYW5kIGRvY3VtZW50RWxlbWVudCBpcyBhdmFpbGFibGUsIHJldHVyblxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFNldCBvdXIgZG9jdW1lbnRcblx0ZG9jdW1lbnQgPSBkb2M7XG5cdGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRwYXJlbnQgPSBkb2MuZGVmYXVsdFZpZXc7XG5cblx0Ly8gU3VwcG9ydDogSUU+OFxuXHQvLyBJZiBpZnJhbWUgZG9jdW1lbnQgaXMgYXNzaWduZWQgdG8gXCJkb2N1bWVudFwiIHZhcmlhYmxlIGFuZCBpZiBpZnJhbWUgaGFzIGJlZW4gcmVsb2FkZWQsXG5cdC8vIElFIHdpbGwgdGhyb3cgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gYWNjZXNzaW5nIFwiZG9jdW1lbnRcIiB2YXJpYWJsZSwgc2VlIGpRdWVyeSAjMTM5MzZcblx0Ly8gSUU2LTggZG8gbm90IHN1cHBvcnQgdGhlIGRlZmF1bHRWaWV3IHByb3BlcnR5IHNvIHBhcmVudCB3aWxsIGJlIHVuZGVmaW5lZFxuXHRpZiAoIHBhcmVudCAmJiBwYXJlbnQgIT09IHBhcmVudC50b3AgKSB7XG5cdFx0Ly8gSUUxMSBkb2VzIG5vdCBoYXZlIGF0dGFjaEV2ZW50LCBzbyBhbGwgbXVzdCBzdWZmZXJcblx0XHRpZiAoIHBhcmVudC5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0cGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7XG5cdFx0fSBlbHNlIGlmICggcGFyZW50LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0cGFyZW50LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBTdXBwb3J0IHRlc3RzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvYyApO1xuXG5cdC8qIEF0dHJpYnV0ZXNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFN1cHBvcnQ6IElFPDhcblx0Ly8gVmVyaWZ5IHRoYXQgZ2V0QXR0cmlidXRlIHJlYWxseSByZXR1cm5zIGF0dHJpYnV0ZXMgYW5kIG5vdCBwcm9wZXJ0aWVzXG5cdC8vIChleGNlcHRpbmcgSUU4IGJvb2xlYW5zKVxuXHRzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkaXYuY2xhc3NOYW1lID0gXCJpXCI7XG5cdFx0cmV0dXJuICFkaXYuZ2V0QXR0cmlidXRlKFwiY2xhc3NOYW1lXCIpO1xuXHR9KTtcblxuXHQvKiBnZXRFbGVtZW50KHMpQnkqXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzXG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkaXYuYXBwZW5kQ2hpbGQoIGRvYy5jcmVhdGVDb21tZW50KFwiXCIpICk7XG5cdFx0cmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8MTBcblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lXG5cdC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pZCA9IGV4cGFuZG87XG5cdFx0cmV0dXJuICFkb2MuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvYy5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gSUQgZmluZCBhbmQgZmlsdGVyXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHQvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJuc1xuXHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzXG5cdFx0XHRcdHJldHVybiBtICYmIG0ucGFyZW50Tm9kZSA/IFsgbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gU3VwcG9ydDogSUU2Lzdcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0ZGVsZXRlIEV4cHIuZmluZFtcIklEXCJdO1xuXG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShcImlkXCIpO1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH1cblxuXHQvLyBUYWdcblx0RXhwci5maW5kW1wiVEFHXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA/XG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROXG5cdFx0XHR9IGVsc2UgaWYgKCBzdXBwb3J0LnFzYSApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdHRtcCA9IFtdLFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0Ly8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvb1xuXHRcdFx0XHRyZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHNcblx0XHRcdGlmICggdGFnID09PSBcIipcIiApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0dG1wLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdG1wO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0fTtcblxuXHQvLyBDbGFzc1xuXHRFeHByLmZpbmRbXCJDTEFTU1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkge1xuXHRcdGlmICggZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTMzNzhcblx0cmJ1Z2d5UVNBID0gW107XG5cblx0aWYgKCAoc3VwcG9ydC5xc2EgPSBybmF0aXZlLnRlc3QoIGRvYy5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcZl0nIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW3NlbGVjdGVkXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86dmFsdWV8XCIgKyBib29sZWFucyArIFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjIrLCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuNytcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCBcIltpZH49XCIgKyBleHBhbmRvICsgXCItXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIn49XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCI6Y2hlY2tlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCtcblx0XHRcdC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzY4NTFcblx0XHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlsc1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiYSNcIiArIGV4cGFuZG8gKyBcIisqXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiLiMuK1srfl1cIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdFx0Ly8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25tZW50XG5cdFx0XHR2YXIgaW5wdXQgPSBkb2MuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9mIG5hbWUgYXR0cmlidXRlXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW25hbWU9ZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJuYW1lXCIgKyB3aGl0ZXNwYWNlICsgXCIqWypeJHwhfl0/PVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0c1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZW5hYmxlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3Ncblx0XHRcdGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiKiw6eFwiKTtcblx0XHRcdHJidWdneVFTQS5wdXNoKFwiLC4qOlwiKTtcblx0XHR9KTtcblx0fVxuXG5cdGlmICggKHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gcm5hdGl2ZS50ZXN0KCAobWF0Y2hlcyA9IGRvY0VsZW0ubWF0Y2hlcyB8fFxuXHRcdGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yKSApKSApIHtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZGl2LCBcImRpdlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZGl2LCBcIltzIT0nJ106eFwiICk7XG5cdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIFwiIT1cIiwgcHNldWRvcyApO1xuXHRcdH0pO1xuXHR9XG5cblx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbihcInxcIikgKTtcblx0cmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbihcInxcIikgKTtcblxuXHQvKiBDb250YWluc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cdGhhc0NvbXBhcmUgPSBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24gKTtcblxuXHQvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcblx0Ly8gUHVycG9zZWZ1bGx5IGRvZXMgbm90IGltcGxlbWVudCBpbmNsdXNpdmUgZGVzY2VuZGVudFxuXHQvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxuXHRjb250YWlucyA9IGhhc0NvbXBhcmUgfHwgcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgP1xuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSxcblx0XHRcdFx0YnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG5cdFx0XHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0YWRvd24uY29udGFpbnMgP1xuXHRcdFx0XHRcdGFkb3duLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2XG5cdFx0XHQpKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdGlmICggYiApIHtcblx0XHRcdFx0d2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBiID09PSBhICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHQvKiBTb3J0aW5nXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nXG5cdHNvcnRPcmRlciA9IGhhc0NvbXBhcmUgP1xuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugd2Uga25vdyB0aGV5IGFyZSBkaXNjb25uZWN0ZWRcblx0XHRcdDE7XG5cblx0XHQvLyBEaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRpZiAoIGNvbXBhcmUgJiAxIHx8XG5cdFx0XHQoIXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0aWYgKCBhID09PSBkb2MgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2MgfHwgYi5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBiKSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyXG5cdFx0XHRyZXR1cm4gc29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fSA6XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxuXHRcdFx0YnVwID0gYi5wYXJlbnROb2RlLFxuXHRcdFx0YXAgPSBbIGEgXSxcblx0XHRcdGJwID0gWyBiIF07XG5cblx0XHQvLyBQYXJlbnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRzIG9yIGRpc2Nvbm5lY3RlZFxuXHRcdGlmICggIWF1cCB8fCAhYnVwICkge1xuXHRcdFx0cmV0dXJuIGEgPT09IGRvYyA/IC0xIDpcblx0XHRcdFx0YiA9PT0gZG9jID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jO1xufTtcblxuU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7XG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdC8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZFxuXHRleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCBcIj0nJDEnXVwiICk7XG5cblx0aWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdCggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiZcblx0XHQoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cdFx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcblx0XHRcdFx0XHQvLyBmcmFnbWVudCBpbiBJRSA5XG5cdFx0XHRcdFx0ZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7fVxuXHR9XG5cblx0cmV0dXJuIFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDtcbn07XG5cblNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7XG59O1xuXG5TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXHRcdC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID9cblx0XHR2YWwgOlxuXHRcdHN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6XG5cdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcbn07XG5cblNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdHRocm93IG5ldyBFcnJvciggXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIiArIG1zZyApO1xufTtcblxuLyoqXG4gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzXG4gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0c1xuICovXG5TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRkdXBsaWNhdGVzID0gW10sXG5cdFx0aiA9IDAsXG5cdFx0aSA9IDA7XG5cblx0Ly8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZVxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTtcblx0cmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkge1xuXHRcdFx0XHRqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0cmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNVxuXHRzb3J0SW5wdXQgPSBudWxsO1xuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtXG4gKi9cbmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9kZSxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGkgPSAwLFxuXHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRpZiAoICFub2RlVHlwZSApIHtcblx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdHdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkge1xuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcblx0XHRcdHJldCArPSBnZXRUZXh0KCBub2RlICk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xuXHRcdC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVyeSAjMTExNTMpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRyZXQgKz0gZ2V0VGV4dCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHR9XG5cdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5FeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbM10gPSAoIG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzJdID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdG1hdGNoWzNdID0gXCIgXCIgKyBtYXRjaFszXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzFdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWzNdICkge1xuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRFxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXG5cdFx0XHRcdG1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSBcImV2ZW5cIiB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApICk7XG5cdFx0XHRcdG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdHZhciBleGNlc3MsXG5cdFx0XHRcdHVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwcltcIkNISUxEXCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0bWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiZcblx0XHRcdFx0Ly8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdChleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0XHRtYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09IFwiKlwiID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQocGF0dGVybiA9IG5ldyBSZWdFeHAoIFwiKF58XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkpICYmXG5cdFx0XHRcdGNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIgKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIj1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiE9XCIgPyByZXN1bHQgIT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJePVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIio9XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIkPVwiID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ+PVwiID8gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ8PVwiID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIiA6XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7XG5cdFx0XHR2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSBcIm50aFwiLFxuXHRcdFx0XHRmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gXCJsYXN0XCIsXG5cdFx0XHRcdG9mVHlwZSA9IHdoYXQgPT09IFwib2YtdHlwZVwiO1xuXG5cdFx0XHRyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/XG5cblx0XHRcdFx0Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKVxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gOlxuXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBkaWZmLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGU7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6IG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHQvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXhcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IHBhcmVudFsgZXhwYW5kbyBdIHx8IChwYXJlbnRbIGV4cGFuZG8gXSA9IHt9KTtcblx0XHRcdFx0XHRcdFx0Y2FjaGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWzBdID09PSBkaXJydW5zICYmIGNhY2hlWzFdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMl07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVucyApIHtcblx0XHRcdFx0XHRcdFx0ZGlmZiA9IGNhY2hlWzFdO1xuXG5cdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoICggb2ZUeXBlID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmICsrZGlmZiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdChub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KSlbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZVxuXHRcdFx0XHRcdFx0ZGlmZiAtPSBsYXN0O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIHBzZXVkbzogXCIgKyBwc2V1ZG8gKTtcblxuXHRcdFx0Ly8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdFxuXHRcdFx0Ly8gYXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb25cblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcblx0XHRcdGlmICggZm5bIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0cmV0dXJuIGZuKCBhcmd1bWVudCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXNcblx0XHRcdGlmICggZm4ubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sIFwiXCIsIGFyZ3VtZW50IF07XG5cdFx0XHRcdHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdFx0XHRcdHZhciBpZHgsXG5cdFx0XHRcdFx0XHRcdG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSxcblx0XHRcdFx0XHRcdFx0aSA9IG1hdGNoZWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlkeCA9IGluZGV4T2YoIHNlZWQsIG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblx0XHQvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3Ncblx0XHRcIm5vdFwiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcblx0XHRcdC8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG5cdFx0XHQvLyBzcGFjZXMgYXMgY29tYmluYXRvcnNcblx0XHRcdHZhciBpbnB1dCA9IFtdLFxuXHRcdFx0XHRyZXN1bHRzID0gW10sXG5cdFx0XHRcdG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICkgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/XG5cdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdHNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pIDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFswXSA9IGVsZW07XG5cdFx0XHRcdFx0bWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApO1xuXHRcdFx0XHRcdC8vIERvbid0IGtlZXAgdGhlIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImNvbnRhaW5zXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gXCJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yXG5cdFx0Ly8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWVcblx0XHQvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLFxuXHRcdC8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCItXCIuXG5cdFx0Ly8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdFx0Ly8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS5cIlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRcImxhbmdcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHtcblx0XHRcdC8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJcblx0XHRcdGlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCBcIlwiKSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIGxhbmc6IFwiICsgbGFuZyApO1xuXHRcdFx0fVxuXHRcdFx0bGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgZWxlbUxhbmc7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID9cblx0XHRcdFx0XHRcdGVsZW0ubGFuZyA6XG5cdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSkgKSB7XG5cblx0XHRcdFx0XHRcdGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgXCItXCIgKSA9PT0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gTWlzY2VsbGFuZW91c1xuXHRcdFwidGFyZ2V0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdFwicm9vdFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2NFbGVtO1xuXHRcdH0sXG5cblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTtcblx0XHR9LFxuXG5cdFx0Ly8gQm9vbGVhbiBwcm9wZXJ0aWVzXG5cdFx0XCJlbmFibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlO1xuXHRcdH0sXG5cblx0XHRcImRpc2FibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdFwiY2hlY2tlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCk7XG5cdFx0fSxcblxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0XG5cdFx0XHQvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5XG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBDb250ZW50c1xuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVkb1xuXHRcdFx0Ly8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLFxuXHRcdFx0Ly8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjogNzsgZXRjLilcblx0XHRcdC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPCA2ICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3NbXCJlbXB0eVwiXSggZWxlbSApO1xuXHRcdH0sXG5cblx0XHQvLyBFbGVtZW50L2lucHV0IHR5cGVzXG5cdFx0XCJoZWFkZXJcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiaW5wdXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gXCJidXR0b25cIiB8fCBuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgYXR0cjtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRlbGVtLnR5cGUgPT09IFwidGV4dFwiICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OFxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdFwiZmlyc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9KSxcblxuXHRcdFwibGFzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHJldHVybiBbIGxlbmd0aCAtIDEgXTtcblx0XHR9KSxcblxuXHRcdFwiZXFcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0cmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJldmVuXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJvZGRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImx0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgLS1pID49IDA7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwiZ3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyArK2kgPCBsZW5ndGg7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3NbXCJudGhcIl0gPSBFeHByLnBzZXVkb3NbXCJlcVwiXTtcblxuLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3NcbmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7XG59XG5mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApO1xufVxuXG4vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnNcbmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fVxuc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XG5FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpO1xuXG50b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0aWYgKCBtYXRjaCApIHtcblx0XHRcdFx0Ly8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWRcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKHRva2VucyA9IFtdKSApO1xuXHRcdH1cblxuXHRcdG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdC8vIENvbWJpbmF0b3JzXG5cdFx0aWYgKCAobWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdC8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZVxuXHRcdFx0XHR0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKVxuXHRcdFx0fSk7XG5cdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZpbHRlcnNcblx0XHRmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkge1xuXHRcdFx0aWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fFxuXHRcdFx0XHQobWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkpKSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdG1hdGNoZXM6IG1hdGNoXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRyZXR1cm4gcGFyc2VPbmx5ID9cblx0XHRzb0Zhci5sZW5ndGggOlxuXHRcdHNvRmFyID9cblx0XHRcdFNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6XG5cdFx0XHQvLyBDYWNoZSB0aGUgdG9rZW5zXG5cdFx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn07XG5cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0c2VsZWN0b3IgPSBcIlwiO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7XG5cdH1cblx0cmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkge1xuXHR2YXIgZGlyID0gY29tYmluYXRvci5kaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgb3V0ZXJDYWNoZSxcblx0XHRcdFx0bmV3Q2FjaGUgPSBbIGRpcnJ1bnMsIGRvbmVOYW1lIF07XG5cblx0XHRcdC8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGRpciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTtcblx0XHRcdFx0XHRcdGlmICggKG9sZENhY2hlID0gb3V0ZXJDYWNoZVsgZGlyIF0pICYmXG5cdFx0XHRcdFx0XHRcdG9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0cmV0dXJuIChuZXdDYWNoZVsgMiBdID0gb2xkQ2FjaGVbIDIgXSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBSZXVzZSBuZXdjYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGVbIGRpciBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbMF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmXG5cdFx0XHRcdFx0XHQodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbdGVtcF0gPSAhKHJlc3VsdHNbdGVtcF0gPSBlbGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlW1wiIFwiXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3Rvcihcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9KVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kW1wiVEFHXCJdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIEtlZXAgYGlgIGEgc3RyaW5nIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBzbyBgbWF0Y2hlZENvdW50YCB3aWxsIGJlIFwiMDBcIiBiZWxvd1xuXHRcdFx0Ly8gU3VwcG9ydDogSUU8OSwgU2FmYXJpXG5cdFx0XHQvLyBUb2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogXCJsZW5ndGhcIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWRcblx0XHRcdGZvciAoIDsgaSAhPT0gbGVuICYmIChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoIChtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzW2orK10pICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgbm8gc2VlZCBhbmQgb25seSBvbmUgZ3JvdXBcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBUYWtlIGEgc2hvcnRjdXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdHN1cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0XHRcdEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7XG5cblx0XHRcdGNvbnRleHQgPSAoIEV4cHIuZmluZFtcIklEXCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHJbXCJuZWVkc0NvbnRleHRcIl0udGVzdCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG9rZW4gPSB0b2tlbnNbaV07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggKGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSkgKSB7XG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoIChzZWVkID0gZmluZChcblx0XHRcdFx0XHR0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHRcdFx0XHQpKSApIHtcblxuXHRcdFx0XHRcdC8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVybiBlYXJseVxuXHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoIGksIDEgKTtcblx0XHRcdFx0XHRzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApO1xuXHRcdFx0XHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDb21waWxlIGFuZCBleGVjdXRlIGEgZmlsdGVyaW5nIGZ1bmN0aW9uIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcblx0Ly8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZVxuXHQoIGNvbXBpbGVkIHx8IGNvbXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApICkoXG5cdFx0c2VlZCxcblx0XHRjb250ZXh0LFxuXHRcdCFkb2N1bWVudElzSFRNTCxcblx0XHRyZXN1bHRzLFxuXHRcdHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0KTtcblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTb3J0IHN0YWJpbGl0eVxuc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdChcIlwiKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKFwiXCIpID09PSBleHBhbmRvO1xuXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrXG4vLyBBbHdheXMgYXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uXG5zdXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSAhIWhhc0R1cGxpY2F0ZTtcblxuLy8gSW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0IGRvY3VtZW50XG5zZXREb2N1bWVudCgpO1xuXG4vLyBTdXBwb3J0OiBXZWJraXQ8NTM3LjMyIC0gU2FmYXJpIDYuMC4zL0Nocm9tZSAyNSAoZml4ZWQgaW4gQ2hyb21lIDI3KVxuLy8gRGV0YWNoZWQgbm9kZXMgY29uZm91bmRpbmdseSBmb2xsb3cgKmVhY2ggb3RoZXIqXG5zdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZGl2MSApIHtcblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpICkgJiAxO1xufSk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGEgaHJlZj0nIyc+PC9hPlwiO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGlucHV0Lz5cIjtcblx0ZGl2LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0cmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xualF1ZXJ5LmV4cHJbXCI6XCJdID0galF1ZXJ5LmV4cHIucHNldWRvcztcbmpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5cblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxudmFyIHJzaW5nbGVUYWcgPSAoL148KFxcdyspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvKTtcblxuXG5cbnZhciByaXNTaW1wbGUgPSAvXi5bXjojXFxbXFwuLF0qJC87XG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHQvKiBqc2hpbnQgLVcwMTggKi9cblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9KTtcblxuXHR9XG5cblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0pO1xuXG5cdH1cblxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0aWYgKCByaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG5cdFx0fVxuXG5cdFx0cXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyApO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+PSAwICkgIT09IG5vdDtcblx0fSk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRyZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgP1xuXHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXSA6XG5cdFx0alF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHRcdH0pKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pICk7XG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHQvLyBOZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29udGV4dCApIGJlY29tZXMgJCggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yIClcblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7XG5cdFx0cmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciA/IHRoaXMuc2VsZWN0b3IgKyBcIiBcIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSkgKTtcblx0fSxcblx0aXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gISF3aW5ub3coXG5cdFx0XHR0aGlzLFxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0XG5cdFx0XHQvLyBzbyAkKFwicDpmaXJzdFwiKS5pcyhcInA6bGFzdFwiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gXCJwXCIuXG5cdFx0XHR0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0c2VsZWN0b3IgfHwgW10sXG5cdFx0XHRmYWxzZVxuXHRcdCkubGVuZ3RoO1xuXHR9XG59KTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxuXHQvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0cnF1aWNrRXhwciA9IC9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKnwjKFtcXHctXSopKSQvLFxuXG5cdGluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHR2YXIgbWF0Y2gsIGVsZW07XG5cblx0XHQvLyBIQU5ETEU6ICQoXCJcIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSlcblx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbMF0gPT09IFwiPFwiICYmIHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmIHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXHRcdFx0XHQvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVja1xuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcblx0XHRcdGlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsxXSApIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsxXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsxXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkge1xuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsyXSApO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQmxhY2tiZXJyeSA0LjZcblx0XHRcdFx0XHQvLyBnRUJJRCByZXR1cm5zIG5vZGVzIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKCM2OTYzKVxuXHRcdFx0XHRcdGlmICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0XHQvLyBJbmplY3QgdGhlIGVsZW1lbnQgZGlyZWN0bHkgaW50byB0aGUgalF1ZXJ5IG9iamVjdFxuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdFx0dGhpc1swXSA9IGVsZW07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gdGhpc1swXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIHJvb3RqUXVlcnkucmVhZHkgIT09IFwidW5kZWZpbmVkXCIgP1xuXHRcdFx0XHRyb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0Ly8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRzZWxlY3RvciggalF1ZXJ5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yO1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXHQvLyBNZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldFxuXHRndWFyYW50ZWVkVW5pcXVlID0ge1xuXHRcdGNoaWxkcmVuOiB0cnVlLFxuXHRcdGNvbnRlbnRzOiB0cnVlLFxuXHRcdG5leHQ6IHRydWUsXG5cdFx0cHJldjogdHJ1ZVxuXHR9O1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0ZGlyOiBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbWF0Y2hlZDtcblx0fSxcblxuXHRzaWJsaW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IFtdO1xuXG5cdFx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0XHRtYXRjaGVkLnB1c2goIG4gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlZDtcblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0Y2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHtcblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRtYXRjaGVkID0gW10sXG5cdFx0XHRwb3MgPSBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApIHx8IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6XG5cdFx0XHRcdDA7XG5cblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRmb3IgKCBjdXIgPSB0aGlzW2ldOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKHBvcyA/XG5cdFx0XHRcdFx0cG9zLmluZGV4KGN1cikgPiAtMSA6XG5cblx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykpICkge1xuXG5cdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlKFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoc2VsZWN0b3IpXG5cdFx0KTtcblx0fVxufSk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHR3aGlsZSAoIChjdXIgPSBjdXJbZGlyXSkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goe1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiwgdW50aWwgKTtcblx0fSxcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWUoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59KTtcbnZhciBybm90d2hpdGUgPSAoL1xcUysvZyk7XG5cblxuXG4vLyBTdHJpbmcgdG8gT2JqZWN0IG9wdGlvbnMgZm9ybWF0IGNhY2hlXG52YXIgb3B0aW9uc0NhY2hlID0ge307XG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzIGFuZCBzdG9yZSBpbiBjYWNoZVxuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9KTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHQoIG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdIHx8IGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBMYXN0IGZpcmUgdmFsdWUgKGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMpXG5cdFx0bWVtb3J5LFxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblx0XHQvLyBGaXJzdCBjYWxsYmFjayB0byBmaXJlICh1c2VkIGludGVybmFsbHkgYnkgYWRkIGFuZCBmaXJlV2l0aClcblx0XHRmaXJpbmdTdGFydCxcblx0XHQvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmdcblx0XHRmaXJpbmdMZW5ndGgsXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgcmVtb3ZlIGlmIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCxcblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblx0XHQvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0c3RhY2sgPSAhb3B0aW9ucy5vbmNlICYmIFtdLFxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdFx0bWVtb3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0YTtcblx0XHRcdGZpcmVkID0gdHJ1ZTtcblx0XHRcdGZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwgMDtcblx0XHRcdGZpcmluZ1N0YXJ0ID0gMDtcblx0XHRcdGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0ZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgbGlzdCAmJiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0aDsgZmlyaW5nSW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBkYXRhWyAwIF0sIGRhdGFbIDEgXSApID09PSBmYWxzZSAmJiBvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZpcmluZyA9IGZhbHNlO1xuXHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRpZiAoIHN0YWNrICkge1xuXHRcdFx0XHRcdGlmICggc3RhY2subGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0ZmlyZSggc3RhY2suc2hpZnQoKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzZWxmLmRpc2FibGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXHRcdFx0Ly8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdFxuXHRcdFx0YWRkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdC8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJyZW50IGxlbmd0aFxuXHRcdFx0XHRcdHZhciBzdGFydCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdChmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0dmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJnICk7XG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goIGFyZyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSkoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdC8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlXG5cdFx0XHRcdFx0Ly8gY3VycmVudCBmaXJpbmcgYmF0Y2g/XG5cdFx0XHRcdFx0aWYgKCBmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDtcblx0XHRcdFx0XHQvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVuXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdheVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1lbW9yeSApIHtcblx0XHRcdFx0XHRcdGZpcmluZ1N0YXJ0ID0gc3RhcnQ7XG5cdFx0XHRcdFx0XHRmaXJlKCBtZW1vcnkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaW5kZXg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGZpcmluZyApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0xlbmd0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZpcmluZ0xlbmd0aC0tO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID8galF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6ICEhKCBsaXN0ICYmIGxpc3QubGVuZ3RoICk7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdGZpcmluZ0xlbmd0aCA9IDA7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlXG5cdFx0XHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHQvLyBJcyBpdCBkaXNhYmxlZD9cblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFsaXN0O1xuXHRcdFx0fSxcblx0XHRcdC8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGVcblx0XHRcdGxvY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzdGFjayA9IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICkge1xuXHRcdFx0XHRcdHNlbGYuZGlzYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIElzIGl0IGxvY2tlZD9cblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhc3RhY2s7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHtcblx0XHRcdFx0XHRhcmdzID0gYXJncyB8fCBbXTtcblx0XHRcdFx0XHRhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdO1xuXHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0c3RhY2sucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRmaXJlKCBhcmdzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5qUXVlcnkuZXh0ZW5kKHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksIFwicmVqZWN0ZWRcIiBdLFxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyhcIm1lbW9yeVwiKSBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBqUXVlcnkuaXNGdW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTtcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsxXSBdKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywgZm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0pLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07XG5cblx0XHRcdC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsxXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0Ly8gc3RhdGUgPSBbIHJlc29sdmVkIHwgcmVqZWN0ZWQgXVxuXHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cblx0XHRcdFx0Ly8gWyByZWplY3RfbGlzdCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7IHByb2dyZXNzX2xpc3QubG9ja1xuXHRcdFx0XHR9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVmZXJyZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXVxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fTtcblx0XHRcdGRlZmVycmVkWyB0dXBsZVswXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0pO1xuXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXG5cdFx0cHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApO1xuXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxuXHRcdGlmICggZnVuYyApIHtcblx0XHRcdGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGRvbmUhXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xuXHR9LFxuXG5cdC8vIERlZmVycmVkIGhlbHBlclxuXHR3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCxcblxuXHRcdFx0Ly8gdGhlIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlc1xuXHRcdFx0cmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZC4gSWYgcmVzb2x2ZVZhbHVlcyBjb25zaXN0IG9mIG9ubHkgYSBzaW5nbGUgRGVmZXJyZWQsIGp1c3QgdXNlIHRoYXQuXG5cdFx0XHRkZWZlcnJlZCA9IHJlbWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIFVwZGF0ZSBmdW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2YWx1ZXNcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4dHMsIHZhbHVlcyApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRjb250ZXh0c1sgaSBdID0gdGhpcztcblx0XHRcdFx0XHR2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoIHZhbHVlcyA9PT0gcHJvZ3Jlc3NWYWx1ZXMgKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fSxcblxuXHRcdFx0cHJvZ3Jlc3NWYWx1ZXMsIHByb2dyZXNzQ29udGV4dHMsIHJlc29sdmVDb250ZXh0cztcblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWRcblx0XHRpZiAoIGxlbmd0aCA+IDEgKSB7XG5cdFx0XHRwcm9ncmVzc1ZhbHVlcyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0LmRvbmUoIHVwZGF0ZUZ1bmMoIGksIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApIClcblx0XHRcdFx0XHRcdC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKVxuXHRcdFx0XHRcdFx0LnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9ncmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LS1yZW1haW5pbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyXG5cdFx0aWYgKCAhcmVtYWluaW5nICkge1xuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cbn0pO1xuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdDtcblxualF1ZXJ5LmZuLnJlYWR5ID0gZnVuY3Rpb24oIGZuICkge1xuXHQvLyBBZGQgdGhlIGNhbGxiYWNrXG5cdGpRdWVyeS5yZWFkeS5wcm9taXNlKCkuZG9uZSggZm4gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoe1xuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnRcblx0aG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHtcblx0XHRpZiAoIGhvbGQgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHRcdH1cblx0fSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cblx0XHQvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHNcblx0XHRpZiAoIGpRdWVyeS5mbi50cmlnZ2VySGFuZGxlciApIHtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VySGFuZGxlciggXCJyZWFkeVwiICk7XG5cdFx0XHRqUXVlcnkoIGRvY3VtZW50ICkub2ZmKCBcInJlYWR5XCIgKTtcblx0XHR9XG5cdH1cbn0pO1xuXG4vKipcbiAqIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQsIGZhbHNlICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG5qUXVlcnkucmVhZHkucHJvbWlzZSA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cdGlmICggIXJlYWR5TGlzdCApIHtcblxuXHRcdHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Ly8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG5cdFx0Ly8gV2Ugb25jZSB0cmllZCB0byB1c2UgcmVhZHlTdGF0ZSBcImludGVyYWN0aXZlXCIgaGVyZSwgYnV0IGl0IGNhdXNlZCBpc3N1ZXMgbGlrZSB0aGUgb25lXG5cdFx0Ly8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNVxuXHRcdGlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiICkge1xuXHRcdFx0Ly8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5XG5cdFx0XHRzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQsIGZhbHNlICk7XG5cblx0XHRcdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlYWR5TGlzdC5wcm9taXNlKCBvYmogKTtcbn07XG5cbi8vIEtpY2sgb2ZmIHRoZSBET00gcmVhZHkgY2hlY2sgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdFxualF1ZXJ5LnJlYWR5LnByb21pc2UoKTtcblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBqUXVlcnkuYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggalF1ZXJ5LnR5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRqUXVlcnkuYWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVtpXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApO1xuXHRcdH1cblxuXHQvLyBTZXRzIG9uZSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0Zm4oIGVsZW1zW2ldLCBrZXksIHJhdyA/IHZhbHVlIDogdmFsdWUuY2FsbCggZWxlbXNbaV0sIGksIGZuKCBlbGVtc1tpXSwga2V5ICkgKSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjaGFpbmFibGUgP1xuXHRcdGVsZW1zIDpcblxuXHRcdC8vIEdldHNcblx0XHRidWxrID9cblx0XHRcdGZuLmNhbGwoIGVsZW1zICkgOlxuXHRcdFx0bGVuID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcblxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBvYmplY3QgY2FuIGhhdmUgZGF0YVxuICovXG5qUXVlcnkuYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblx0Ly8gQWNjZXB0cyBvbmx5OlxuXHQvLyAgLSBOb2RlXG5cdC8vICAgIC0gTm9kZS5FTEVNRU5UX05PREVcblx0Ly8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREVcblx0Ly8gIC0gT2JqZWN0XG5cdC8vICAgIC0gQW55XG5cdC8qIGpzaGludCAtVzAxOCAqL1xuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cbmZ1bmN0aW9uIERhdGEoKSB7XG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NCxcblx0Ly8gT2xkIFdlYktpdCBkb2VzIG5vdCBoYXZlIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucy9mcmVlemUgbWV0aG9kLFxuXHQvLyByZXR1cm4gbmV3IGVtcHR5IG9iamVjdCBpbnN0ZWFkIHdpdGggbm8gW1tzZXRdXSBhY2Nlc3NvclxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMuY2FjaGUgPSB7fSwgMCwge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXHR9KTtcblxuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcbkRhdGEuYWNjZXB0cyA9IGpRdWVyeS5hY2NlcHREYXRhO1xuXG5EYXRhLnByb3RvdHlwZSA9IHtcblx0a2V5OiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHQvLyBBbHdheXMgcmV0dXJuIHRoZSBrZXkgZm9yIGEgZnJvemVuIG9iamVjdC5cblx0XHRpZiAoICFEYXRhLmFjY2VwdHMoIG93bmVyICkgKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgZGVzY3JpcHRvciA9IHt9LFxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIG93bmVyIG9iamVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlIGtleVxuXHRcdFx0dW5sb2NrID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0Ly8gSWYgbm90LCBjcmVhdGUgb25lXG5cdFx0aWYgKCAhdW5sb2NrICkge1xuXHRcdFx0dW5sb2NrID0gRGF0YS51aWQrKztcblxuXHRcdFx0Ly8gU2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUsIG5vbi13cml0YWJsZSBwcm9wZXJ0eVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB7IHZhbHVlOiB1bmxvY2sgfTtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIG93bmVyLCBkZXNjcmlwdG9yICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NFxuXHRcdFx0Ly8gRmFsbGJhY2sgdG8gYSBsZXNzIHNlY3VyZSBkZWZpbml0aW9uXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0ZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB1bmxvY2s7XG5cdFx0XHRcdGpRdWVyeS5leHRlbmQoIG93bmVyLCBkZXNjcmlwdG9yICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoZSBjYWNoZSBvYmplY3Rcblx0XHRpZiAoICF0aGlzLmNhY2hlWyB1bmxvY2sgXSApIHtcblx0XHRcdHRoaXMuY2FjaGVbIHVubG9jayBdID0ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVubG9jaztcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Ly8gVGhlcmUgbWF5IGJlIGFuIHVubG9jayBhc3NpZ25lZCB0byB0aGlzIG5vZGUsXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyBcIm93bmVyXCIsIGNyZWF0ZSBvbmUgaW5saW5lXG5cdFx0XHQvLyBhbmQgc2V0IHRoZSB1bmxvY2sgYXMgdGhvdWdoIGFuIG93bmVyIGVudHJ5IGhhZCBhbHdheXMgZXhpc3RlZFxuXHRcdFx0dW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGVbIHVubG9jayBdO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgZGF0YSBdID0gdmFsdWU7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIHsgcHJvcGVydGllcyB9IF0gYXJnc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBGcmVzaCBhc3NpZ25tZW50cyBieSBvYmplY3QgYXJlIHNoYWxsb3cgY29waWVkXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXHRcdFx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLmNhY2hlWyB1bmxvY2sgXSwgZGF0YSApO1xuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBjb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGNhY2hlWyBwcm9wIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdC8vIEVpdGhlciBhIHZhbGlkIGNhY2hlIGlzIGZvdW5kLCBvciB3aWxsIGJlIGNyZWF0ZWQuXG5cdFx0Ly8gTmV3IGNhY2hlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSB1bmxvY2sgcmV0dXJuZWQsXG5cdFx0Ly8gYWxsb3dpbmcgZGlyZWN0IGFjY2VzcyB0byB0aGUgbmV3bHkgY3JlYXRlZFxuXHRcdC8vIGVtcHR5IGRhdGEgb2JqZWN0LiBBIHZhbGlkIG93bmVyIG9iamVjdCBtdXN0IGJlIHByb3ZpZGVkLlxuXHRcdHZhciBjYWNoZSA9IHRoaXMuY2FjaGVbIHRoaXMua2V5KCBvd25lciApIF07XG5cblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0Y2FjaGUgOiBjYWNoZVsga2V5IF07XG5cdH0sXG5cdGFjY2VzczogZnVuY3Rpb24oIG93bmVyLCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBzdG9yZWQ7XG5cdFx0Ly8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZFxuXHRcdC8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZFxuXHRcdC8vXG5cdFx0Ly8gVGFrZSB0aGUgXCJyZWFkXCIgcGF0aCBhbmQgYWxsb3cgdGhlIGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lXG5cdFx0Ly8gd2hpY2ggdmFsdWUgdG8gcmV0dXJuLCByZXNwZWN0aXZlbHkgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBUaGUgZW50aXJlIGNhY2hlIG9iamVjdFxuXHRcdC8vICAgMi4gVGhlIGRhdGEgc3RvcmVkIGF0IHRoZSBrZXlcblx0XHQvL1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KChrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgKSB7XG5cblx0XHRcdHN0b3JlZCA9IHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cblx0XHRcdHJldHVybiBzdG9yZWQgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHN0b3JlZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVsQ2FzZShrZXkpICk7XG5cdFx0fVxuXG5cdFx0Ly8gWypdV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLCBuYW1lLCBjYW1lbCxcblx0XHRcdHVubG9jayA9IHRoaXMua2V5KCBvd25lciApLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlWyB1bmxvY2sgXTtcblxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLmNhY2hlWyB1bmxvY2sgXSA9IHt9O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCBrZXkgKSApIHtcblx0XHRcdFx0Ly8gSWYgXCJuYW1lXCIgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLlxuXHRcdFx0XHQvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoXCJrZXlcIiwgXCJ2YWxcIikgc2lnbmF0dXJlLFxuXHRcdFx0XHQvLyBrZXlzIHdpbGwgYmUgY29udmVydGVkIHRvIGNhbWVsQ2FzZS5cblx0XHRcdFx0Ly8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmVcblx0XHRcdFx0Ly8gYm90aCBwbGFpbiBrZXkgYW5kIGNhbWVsQ2FzZSBrZXkuICMxMjc4NlxuXHRcdFx0XHQvLyBUaGlzIHdpbGwgb25seSBwZW5hbGl6ZSB0aGUgYXJyYXkgYXJndW1lbnQgcGF0aC5cblx0XHRcdFx0bmFtZSA9IGtleS5jb25jYXQoIGtleS5tYXAoIGpRdWVyeS5jYW1lbENhc2UgKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2FtZWwgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblx0XHRcdFx0Ly8gVHJ5IHRoZSBzdHJpbmcgYXMgYSBrZXkgYmVmb3JlIGFueSBtYW5pcHVsYXRpb25cblx0XHRcdFx0aWYgKCBrZXkgaW4gY2FjaGUgKSB7XG5cdFx0XHRcdFx0bmFtZSA9IFsga2V5LCBjYW1lbCBdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRcdG5hbWUgPSBjYW1lbDtcblx0XHRcdFx0XHRuYW1lID0gbmFtZSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0XHRbIG5hbWUgXSA6ICggbmFtZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW10gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpID0gbmFtZS5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBuYW1lWyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHRyZXR1cm4gIWpRdWVyeS5pc0VtcHR5T2JqZWN0KFxuXHRcdFx0dGhpcy5jYWNoZVsgb3duZXJbIHRoaXMuZXhwYW5kbyBdIF0gfHwge31cblx0XHQpO1xuXHR9LFxuXHRkaXNjYXJkOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0aWYgKCBvd25lclsgdGhpcy5leHBhbmRvIF0gKSB7XG5cdFx0XHRkZWxldGUgdGhpcy5jYWNoZVsgb3duZXJbIHRoaXMuZXhwYW5kbyBdIF07XG5cdFx0fVxuXHR9XG59O1xudmFyIGRhdGFfcHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhX3VzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gLyhbQS1aXSkvZztcblxuZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHtcblx0dmFyIG5hbWU7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQxXCIgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhID09PSBcInRydWVcIiA/IHRydWUgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwiZmFsc2VcIiA/IGZhbHNlIDpcblx0XHRcdFx0XHRkYXRhID09PSBcIm51bGxcIiA/IG51bGwgOlxuXHRcdFx0XHRcdC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nXG5cdFx0XHRcdFx0K2RhdGEgKyBcIlwiID09PSBkYXRhID8gK2RhdGEgOlxuXHRcdFx0XHRcdHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOlxuXHRcdFx0XHRcdGRhdGE7XG5cdFx0XHR9IGNhdGNoKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhX3VzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YV91c2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhX3ByaXYuaGFzRGF0YSggZWxlbSApO1xuXHR9LFxuXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhX3VzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YV91c2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFfcHJpdiBtZXRob2RzLCB0aGVzZSBjYW4gYmUgZGVwcmVjYXRlZC5cblx0X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHR2YXIgaSwgbmFtZSwgZGF0YSxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdGhpcy5sZW5ndGggKSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhX3ByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMStcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoNSkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YV9wcml2LnNldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH1cblxuXHRcdC8vIFNldHMgbXVsdGlwbGUgdmFsdWVzXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YV91c2VyLnNldCggdGhpcywga2V5ICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YSxcblx0XHRcdFx0Y2FtZWxLZXkgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIHdpdGggdGhlIGtleSBhcy1pc1xuXHRcdFx0XHRkYXRhID0gZGF0YV91c2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyB3aXRoIHRoZSBrZXkgY2FtZWxpemVkXG5cdFx0XHRcdGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtLCBjYW1lbEtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gXCJkaXNjb3ZlclwiIHRoZSBkYXRhIGluXG5cdFx0XHRcdC8vIEhUTUw1IGN1c3RvbSBkYXRhLSogYXR0cnNcblx0XHRcdFx0ZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBjYW1lbEtleSwgdW5kZWZpbmVkICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQvLyBGaXJzdCwgYXR0ZW1wdCB0byBzdG9yZSBhIGNvcHkgb3IgcmVmZXJlbmNlIG9mIGFueVxuXHRcdFx0XHQvLyBkYXRhIHRoYXQgbWlnaHQndmUgYmVlbiBzdG9yZSB3aXRoIGEgY2FtZWxDYXNlZCBrZXkuXG5cdFx0XHRcdHZhciBkYXRhID0gZGF0YV91c2VyLmdldCggdGhpcywgY2FtZWxLZXkgKTtcblxuXHRcdFx0XHQvLyBGb3IgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZSBpbnRlcm9wLCB3ZSBoYXZlIHRvXG5cdFx0XHRcdC8vIHN0b3JlIHByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIGluIGEgY2FtZWxDYXNlIGZvcm0uXG5cdFx0XHRcdC8vIFRoaXMgbWlnaHQgbm90IGFwcGx5IHRvIGFsbCBwcm9wZXJ0aWVzLi4uKlxuXHRcdFx0XHRkYXRhX3VzZXIuc2V0KCB0aGlzLCBjYW1lbEtleSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyAqLi4uIEluIHRoZSBjYXNlIG9mIHByb3BlcnRpZXMgdGhhdCBtaWdodCBfYWN0dWFsbHlfXG5cdFx0XHRcdC8vIGhhdmUgZGFzaGVzLCB3ZSBuZWVkIHRvIGFsc28gc3RvcmUgYSBjb3B5IG9mIHRoYXRcblx0XHRcdFx0Ly8gdW5jaGFuZ2VkIHByb3BlcnR5LlxuXHRcdFx0XHRpZiAoIGtleS5pbmRleE9mKFwiLVwiKSAhPT0gLTEgJiYgZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGRhdGFfdXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YV91c2VyLnJlbW92ZSggdGhpcywga2V5ICk7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5cbmpRdWVyeS5leHRlbmQoe1xuXHRxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHF1ZXVlO1xuXG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0dHlwZSA9ICggdHlwZSB8fCBcImZ4XCIgKSArIFwicXVldWVcIjtcblx0XHRcdHF1ZXVlID0gZGF0YV9wcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFfcHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwge1xuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKS5hZGQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0pXG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBzZXR0ZXIgPSAyO1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGRhdGEgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IFwiZnhcIjtcblx0XHRcdHNldHRlci0tO1xuXHRcdH1cblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbMF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTtcblxuXHRcdFx0XHQvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVswXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH0sXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0pO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YV9wcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArIFwicXVldWVIb29rc1wiICk7XG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdHRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzb2x2ZSgpO1xuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcblx0fVxufSk7XG52YXIgcG51bSA9ICgvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLykuc291cmNlO1xuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblx0XHQvLyBpc0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXHRcdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcIm5vbmVcIiB8fCAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0fTtcblxudmFyIHJjaGVja2FibGVUeXBlID0gKC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pKTtcblxuXG5cbihmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IFNhZmFyaTw9NS4xXG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBTYWZhcmk8PTUuMSwgQW5kcm9pZDw0LjJcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRTw9MTErXG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG59KSgpO1xudmFyIHN0cnVuZGVmaW5lZCA9IHR5cGVvZiB1bmRlZmluZWQ7XG5cblxuXG5zdXBwb3J0LmZvY3VzaW5CdWJibGVzID0gXCJvbmZvY3VzaW5cIiBpbiB3aW5kb3c7XG5cblxudmFyXG5cdHJrZXlFdmVudCA9IC9ea2V5Lyxcblx0cm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLyxcblx0cmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpJC87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXG5cdFx0aWYgKCAhaGFuZGxlci5ndWlkICkge1xuXHRcdFx0aGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKztcblx0XHR9XG5cblx0XHQvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0XG5cdFx0aWYgKCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0aWYgKCAhKGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IHN0cnVuZGVmaW5lZCAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsxXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnNcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGVcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblxuXHRcdFx0Ly8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRoYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3JpZ1R5cGU6IG9yaWdUeXBlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyLFxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXG5cdFx0XHRcdHNlbGVjdG9yOiBzZWxlY3Rvcixcblx0XHRcdFx0bmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSxcblx0XHRcdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oXCIuXCIpXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xuXG5cdFx0XHQvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdFxuXHRcdFx0aWYgKCAhKGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFfcHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YV9wcml2LmdldCggZWxlbSApO1xuXG5cdFx0aWYgKCAhZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsxXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnRcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gfHwgW107XG5cdFx0XHR0bXAgPSB0bXBbMl0gJiYgbmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbihcIlxcXFwuKD86LipcXFxcLnwpXCIpICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIGV2ZW50c1sgdHlwZSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkXG5cdFx0aWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7XG5cdFx0XHRkZWxldGUgZWxlbURhdGEuaGFuZGxlO1xuXHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgXCJldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsXG5cdFx0XHRldmVudFBhdGggPSBbIGVsZW0gfHwgZG9jdW1lbnQgXSxcblx0XHRcdHR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwidHlwZVwiICkgPyBldmVudC50eXBlIDogZXZlbnQsXG5cdFx0XHRuYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcIm5hbWVzcGFjZVwiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoXCIuXCIpIDogW107XG5cblx0XHRjdXIgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKFwiLlwiKSA+PSAwICkge1xuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoXCIuXCIpO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoXCI6XCIpIDwgMCAmJiBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nXG5cdFx0ZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRldmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQgKTtcblxuXHRcdC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSlcblx0XHRldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMztcblx0XHRldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oXCIuXCIpO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZV9yZSA9IGV2ZW50Lm5hbWVzcGFjZSA/XG5cdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKFwiXFxcXC4oPzouKlxcXFwufClcIikgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSlcblx0XHQvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KVxuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoIChjdXIgPSBldmVudFBhdGhbaSsrXSkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFfcHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJiBkYXRhX3ByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UpICYmXG5cdFx0XHRcdGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LlxuXHRcdFx0XHQvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlbGVtWyB0eXBlIF0gKSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaixcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFfcHJpdi5nZXQoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1swXSA9IGV2ZW50O1xuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0pICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkge1xuXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xuXHRcdFx0XHRcdGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTtcblxuXHRcdFx0XHRcdHJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVyIClcblx0XHRcdFx0XHRcdFx0LmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChldmVudC5yZXN1bHQgPSByZXQpID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIG1hdGNoZXMsIHNlbCwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCxcblx0XHRcdGN1ciA9IGV2ZW50LnRhcmdldDtcblxuXHRcdC8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnNcblx0XHQvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAoIzEzMTgwKVxuXHRcdC8vIEF2b2lkIG5vbi1sZWZ0LWNsaWNrIGJ1YmJsaW5nIGluIEZpcmVmb3ggKCMzODYxKVxuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJiBjdXIubm9kZVR5cGUgJiYgKCFldmVudC5idXR0b24gfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgcHJvY2VzcyBjbGlja3Mgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2NSwgIzExMzgyLCAjMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLmRpc2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09IFwiY2xpY2tcIiApIHtcblx0XHRcdFx0XHRtYXRjaGVzID0gW107XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKVxuXHRcdFx0XHRcdFx0c2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgXCIgXCI7XG5cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID9cblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+PSAwIDpcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlcyB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50XG5cdHByb3BzOiBcImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaFwiLnNwbGl0KFwiIFwiKSxcblxuXHRmaXhIb29rczoge30sXG5cblx0a2V5SG9va3M6IHtcblx0XHRwcm9wczogXCJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlXCIuc3BsaXQoXCIgXCIpLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzXG5cdFx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50LndoaWNoID0gb3JpZ2luYWwuY2hhckNvZGUgIT0gbnVsbCA/IG9yaWdpbmFsLmNoYXJDb2RlIDogb3JpZ2luYWwua2V5Q29kZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV2ZW50O1xuXHRcdH1cblx0fSxcblxuXHRtb3VzZUhvb2tzOiB7XG5cdFx0cHJvcHM6IFwiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50XCIuc3BsaXQoXCIgXCIpLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblx0XHRcdHZhciBldmVudERvYywgZG9jLCBib2R5LFxuXHRcdFx0XHRidXR0b24gPSBvcmlnaW5hbC5idXR0b247XG5cblx0XHRcdC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGVcblx0XHRcdGlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG5cdFx0XHRcdGRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDtcblx0XHRcdFx0Ym9keSA9IGV2ZW50RG9jLmJvZHk7XG5cblx0XHRcdFx0ZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApO1xuXHRcdFx0XHRldmVudC5wYWdlWSA9IG9yaWdpbmFsLmNsaWVudFkgKyAoIGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50VG9wICB8fCBib2R5ICYmIGJvZHkuY2xpZW50VG9wICB8fCAwICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRcdC8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0XG5cdFx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7XG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzXG5cdFx0dmFyIGksIHByb3AsIGNvcHksXG5cdFx0XHR0eXBlID0gZXZlbnQudHlwZSxcblx0XHRcdG9yaWdpbmFsRXZlbnQgPSBldmVudCxcblx0XHRcdGZpeEhvb2sgPSB0aGlzLmZpeEhvb2tzWyB0eXBlIF07XG5cblx0XHRpZiAoICFmaXhIb29rICkge1xuXHRcdFx0dGhpcy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9vayA9XG5cdFx0XHRcdHJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91c2VIb29rcyA6XG5cdFx0XHRcdHJrZXlFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLmtleUhvb2tzIDpcblx0XHRcdFx0e307XG5cdFx0fVxuXHRcdGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7XG5cblx0XHRldmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcblxuXHRcdGkgPSBjb3B5Lmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHByb3AgPSBjb3B5WyBpIF07XG5cdFx0XHRldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IENvcmRvdmEgMi41IChXZWJLaXQpICgjMTMyNTUpXG5cdFx0Ly8gQWxsIGV2ZW50cyBzaG91bGQgaGF2ZSBhIHRhcmdldDsgQ29yZG92YSBkZXZpY2VyZWFkeSBkb2Vzbid0XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDYuMCssIENocm9tZTwyOFxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0aWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZml4SG9vay5maWx0ZXIgPyBmaXhIb29rLmZpbHRlciggZXZlbnQsIG9yaWdpbmFsRXZlbnQgKSA6IGV2ZW50O1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cdFx0XHQvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkXG5cdFx0XHRub0J1YmJsZTogdHJ1ZVxuXHRcdH0sXG5cdFx0Zm9jdXM6IHtcblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblx0XHRcdC8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiAmJiB0aGlzLmNsaWNrICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5jbGljaygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50LCBidWJibGUgKSB7XG5cdFx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lLlxuXHRcdC8vIEZha2Ugb3JpZ2luYWxFdmVudCB0byBhdm9pZCBkb25vcidzIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGlmIHRoZVxuXHRcdC8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLlxuXHRcdHZhciBlID0galF1ZXJ5LmV4dGVuZChcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcblx0XHRcdGV2ZW50LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZSxcblx0XHRcdFx0b3JpZ2luYWxFdmVudDoge31cblx0XHRcdH1cblx0XHQpO1xuXHRcdGlmICggYnViYmxlICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmNhbGwoIGVsZW0sIGUgKTtcblx0XHR9XG5cdFx0aWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7XG5cdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuXHRcdGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlLCBmYWxzZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHtcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gRXZlbnQgb2JqZWN0XG5cdGlmICggc3JjICYmIHNyYy50eXBlICkge1xuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcblx0XHR0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG5cdFx0Ly8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fFxuXHRcdFx0XHRzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wXG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHQvLyBFdmVudCB0eXBlXG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gc3JjO1xuXHR9XG5cblx0Ly8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3Rcblx0aWYgKCBwcm9wcyApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcblx0dGhpcy50aW1lU3RhbXAgPSBzcmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBqUXVlcnkubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnN0b3BQcm9wYWdhdGlvbiApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gU3VwcG9ydDogQ2hyb21lIDE1K1xualF1ZXJ5LmVhY2goe1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkpICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaVxuLy8gQ3JlYXRlIFwiYnViYmxpbmdcIiBmb2N1cyBhbmQgYmx1ciBldmVudHNcbmlmICggIXN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgKSB7XG5cdGpRdWVyeS5lYWNoKHsgZm9jdXM6IFwiZm9jdXNpblwiLCBibHVyOiBcImZvY3Vzb3V0XCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblxuXHRcdC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0XG5cdFx0dmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICksIHRydWUgKTtcblx0XHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7XG5cdFx0XHR9LFxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFfcHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIC8qSU5URVJOQUwqLyBvbmUgKSB7XG5cdFx0dmFyIG9yaWdGbiwgdHlwZTtcblxuXHRcdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApXG5cdFx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub24oIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cdFx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRcdG9yaWdGbiA9IGZuO1xuXHRcdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mb1xuXHRcdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0fTtcblx0XHRcdC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuXG5cdFx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdFx0fSk7XG5cdH0sXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxuXHRcdFx0aGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqO1xuXHRcdFx0alF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZihcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6IGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApXG5cdFx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0pO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWzBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSk7XG5cblxudmFyXG5cdHJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcXHc6XSspW14+XSopXFwvPi9naSxcblx0cnRhZ05hbWUgPSAvPChbXFx3Ol0rKS8sXG5cdHJodG1sID0gLzx8JiM/XFx3KzsvLFxuXHRybm9Jbm5lcmh0bWwgPSAvPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLFxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyc2NyaXB0VHlwZSA9IC9eJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksXG5cdHJzY3JpcHRUeXBlTWFza2VkID0gL150cnVlXFwvKC4qKS8sXG5cdHJjbGVhblNjcmlwdCA9IC9eXFxzKjwhKD86XFxbQ0RBVEFcXFt8LS0pfCg/OlxcXVxcXXwtLSk+XFxzKiQvZyxcblxuXHQvLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxuXHR3cmFwTWFwID0ge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0XHR0aGVhZDogWyAxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiIF0sXG5cdFx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0XHR0cjogWyAyLCBcIjx0YWJsZT48dGJvZHk+XCIsIFwiPC90Ym9keT48L3RhYmxlPlwiIF0sXG5cdFx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXG5cdFx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG5cdH07XG5cbi8vIFN1cHBvcnQ6IElFOVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cbi8vIFN1cHBvcnQ6IDEueCBjb21wYXRpYmlsaXR5XG4vLyBNYW5pcHVsYXRpbmcgdGFibGVzIHJlcXVpcmVzIGEgdGJvZHlcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0cmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRqUXVlcnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgXCJ0clwiICkgP1xuXG5cdFx0ZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRib2R5XCIpWzBdIHx8XG5cdFx0XHRlbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRib2R5XCIpICkgOlxuXHRcdGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9IChlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IG51bGwpICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0dmFyIG1hdGNoID0gcnNjcmlwdFR5cGVNYXNrZWQuZXhlYyggZWxlbS50eXBlICk7XG5cblx0aWYgKCBtYXRjaCApIHtcblx0XHRlbGVtLnR5cGUgPSBtYXRjaFsgMSBdO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKFwidHlwZVwiKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFfcHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLCBcImdsb2JhbEV2YWxcIiwgIXJlZkVsZW1lbnRzIHx8IGRhdGFfcHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFfcHJpdi5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRwZGF0YU9sZCA9IGRhdGFfcHJpdi5hY2Nlc3MoIHNyYyApO1xuXHRcdHBkYXRhQ3VyID0gZGF0YV9wcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YV91c2VyLmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHVkYXRhT2xkID0gZGF0YV91c2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFfdXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cdHZhciByZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lID8gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIHx8IFwiKlwiICkgOlxuXHRcdFx0Y29udGV4dC5xdWVyeVNlbGVjdG9yQWxsID8gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHRbXTtcblxuXHRyZXR1cm4gdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVyeS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgP1xuXHRcdGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIHJldCApIDpcblx0XHRyZXQ7XG59XG5cbi8vIEZpeCBJRSBidWdzLCBzZWUgc3VwcG9ydCB0ZXN0c1xuZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLlxuXHRpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblx0XHRkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDtcblxuXHQvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEZpeCBJRSBjbG9uaW5nIGlzc3Vlc1xuXHRcdGlmICggIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgJiYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiZcblx0XHRcdFx0IWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHA6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMlxuXHRcdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApO1xuXHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZpeElucHV0KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmVcblx0XHRpZiAoIGRhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0XHRzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApO1xuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgXCJzY3JpcHRcIiApO1xuXHRcdGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCBcInNjcmlwdFwiICkgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXRcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0sXG5cblx0YnVpbGRGcmFnbWVudDogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24gKSB7XG5cdFx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBjb250YWlucywgaixcblx0XHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0XHRub2RlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0XHRpZiAoIGpRdWVyeS50eXBlKCBlbGVtICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXQsIFBoYW50b21KU1xuXHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHRcdH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XG5cdFx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgKTtcblxuXHRcdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHR3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDtcblx0XHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgZWxlbS5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRcdGogPSB3cmFwWyAwIF07XG5cdFx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFF0V2ViS2l0LCBQaGFudG9tSlNcblx0XHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHRcdC8vIFJlbWVtYmVyIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyXG5cdFx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKCMxMjM5Milcblx0XHRcdFx0XHR0bXAudGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRcdGZyYWdtZW50LnRleHRDb250ZW50ID0gXCJcIjtcblxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKGVsZW0gPSBub2Rlc1sgaSsrIF0pICkge1xuXG5cdFx0XHQvLyAjNDA4NyAtIElmIG9yaWdpbiBhbmQgZGVzdGluYXRpb24gZWxlbWVudHMgYXJlIHRoZSBzYW1lLCBhbmQgdGhpcyBpc1xuXHRcdFx0Ly8gdGhhdCBlbGVtZW50LCBkbyBub3QgZG8gYW55dGhpbmdcblx0XHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSAhPT0gLTEgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gdG1wWyBqKysgXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZyYWdtZW50O1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLCBrZXksXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWwsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKGVsZW0gPSBlbGVtc1sgaSBdKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGtleSA9IGVsZW1bIGRhdGFfcHJpdi5leHBhbmRvIF07XG5cblx0XHRcdFx0aWYgKCBrZXkgJiYgKGRhdGEgPSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBkYXRhX3ByaXYuY2FjaGVbIGtleSBdICkge1xuXHRcdFx0XHRcdFx0Ly8gRGlzY2FyZCBhbnkgcmVtYWluaW5nIGBwcml2YXRlYCBkYXRhXG5cdFx0XHRcdFx0XHRkZWxldGUgZGF0YV9wcml2LmNhY2hlWyBrZXkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIERpc2NhcmQgYW55IHJlbWFpbmluZyBgdXNlcmAgZGF0YVxuXHRcdFx0ZGVsZXRlIGRhdGFfdXNlci5jYWNoZVsgZWxlbVsgZGF0YV91c2VyLmV4cGFuZG8gXSBdO1xuXHRcdH1cblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGFwcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRwcmVwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0YWZ0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdFx0dmFyIGVsZW0sXG5cdFx0XHRlbGVtcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKSA6IHRoaXMsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCAha2VlcERhdGEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtICkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcblx0XHR9KTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUxcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF0gfHwge307XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXJnID0gYXJndW1lbnRzWyAwIF07XG5cblx0XHQvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnRcblx0XHR0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0YXJnID0gdGhpcy5wYXJlbnROb2RlO1xuXG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApO1xuXG5cdFx0XHRpZiAoIGFyZyApIHtcblx0XHRcdFx0YXJnLnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRm9yY2UgcmVtb3ZhbCBpZiB0aGVyZSB3YXMgbm8gbmV3IGNvbnRlbnQgKGUuZy4sIGZyb20gZW1wdHkgYXJndW1lbnRzKVxuXHRcdHJldHVybiBhcmcgJiYgKGFyZy5sZW5ndGggfHwgYXJnLm5vZGVUeXBlKSA/IHRoaXMgOiB0aGlzLnJlbW92ZSgpO1xuXHR9LFxuXG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTtcblx0fSxcblxuXHRkb21NYW5pcDogZnVuY3Rpb24oIGFyZ3MsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdGFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7XG5cblx0XHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHNldCA9IHRoaXMsXG5cdFx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0XHRpZiAoIGlzRnVuY3Rpb24gfHxcblx0XHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0XHR2YXIgc2VsZiA9IHNldC5lcSggaW5kZXggKTtcblx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYuZG9tTWFuaXAoIGFyZ3MsIGNhbGxiYWNrICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIGwgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsIHRoaXMgKTtcblx0XHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdFx0ZnJhZ21lbnQgPSBmaXJzdDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBmaXJzdCApIHtcblx0XHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0XHRoYXNTY3JpcHRzID0gc2NyaXB0cy5sZW5ndGg7XG5cblx0XHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbSBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdFx0Ly8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS5cblx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRcdGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXRcblx0XHRcdFx0XHRcdFx0Ly8galF1ZXJ5Lm1lcmdlIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93c1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y2FsbGJhY2suY2FsbCggdGhpc1sgaSBdLCBub2RlLCBpICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdFx0ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDtcblxuXHRcdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0XHQvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0aW9uXG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgXCJcIiApICYmXG5cdFx0XHRcdFx0XHRcdCFkYXRhX3ByaXYuYWNjZXNzKCBub2RlLCBcImdsb2JhbEV2YWxcIiApICYmIGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudFxuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZWFjaCh7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFF0V2ViS2l0XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzXG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0pO1xuXG5cbnZhciBpZnJhbWUsXG5cdGVsZW1kaXNwbGF5ID0ge307XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5IG9mIGEgZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgRG9jdW1lbnQgb2JqZWN0XG4gKi9cbi8vIENhbGxlZCBvbmx5IGZyb20gd2l0aGluIGRlZmF1bHREaXNwbGF5XG5mdW5jdGlvbiBhY3R1YWxEaXNwbGF5KCBuYW1lLCBkb2MgKSB7XG5cdHZhciBzdHlsZSxcblx0XHRlbGVtID0galF1ZXJ5KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSApICkuYXBwZW5kVG8oIGRvYy5ib2R5ICksXG5cblx0XHQvLyBnZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSBtaWdodCBiZSByZWxpYWJseSB1c2VkIG9ubHkgb24gYXR0YWNoZWQgZWxlbWVudFxuXHRcdGRpc3BsYXkgPSB3aW5kb3cuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUgJiYgKCBzdHlsZSA9IHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSggZWxlbVsgMCBdICkgKSA/XG5cblx0XHRcdC8vIFVzZSBvZiB0aGlzIG1ldGhvZCBpcyBhIHRlbXBvcmFyeSBmaXggKG1vcmUgbGlrZSBvcHRpbWl6YXRpb24pIHVudGlsIHNvbWV0aGluZyBiZXR0ZXIgY29tZXMgYWxvbmcsXG5cdFx0XHQvLyBzaW5jZSBpdCB3YXMgcmVtb3ZlZCBmcm9tIHNwZWNpZmljYXRpb24gYW5kIHN1cHBvcnRlZCBvbmx5IGluIEZGXG5cdFx0XHRzdHlsZS5kaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbVsgMCBdLCBcImRpc3BsYXlcIiApO1xuXG5cdC8vIFdlIGRvbid0IGhhdmUgYW55IGRhdGEgc3RvcmVkIG9uIHRoZSBlbGVtZW50LFxuXHQvLyBzbyB1c2UgXCJkZXRhY2hcIiBtZXRob2QgYXMgZmFzdCB3YXkgdG8gZ2V0IHJpZCBvZiB0aGUgZWxlbWVudFxuXHRlbGVtLmRldGFjaCgpO1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG4vKipcbiAqIFRyeSB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZGlzcGxheSB2YWx1ZSBvZiBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbm9kZU5hbWVcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkge1xuXHR2YXIgZG9jID0gZG9jdW1lbnQsXG5cdFx0ZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdO1xuXG5cdGlmICggIWRpc3BsYXkgKSB7XG5cdFx0ZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTtcblxuXHRcdC8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxzLCByZWFkIGZyb20gaW5zaWRlIGFuIGlmcmFtZVxuXHRcdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgfHwgIWRpc3BsYXkgKSB7XG5cblx0XHRcdC8vIFVzZSB0aGUgYWxyZWFkeS1jcmVhdGVkIGlmcmFtZSBpZiBwb3NzaWJsZVxuXHRcdFx0aWZyYW1lID0gKGlmcmFtZSB8fCBqUXVlcnkoIFwiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPlwiICkpLmFwcGVuZFRvKCBkb2MuZG9jdW1lbnRFbGVtZW50ICk7XG5cblx0XHRcdC8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxldG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZVxuXHRcdFx0ZG9jID0gaWZyYW1lWyAwIF0uY29udGVudERvY3VtZW50O1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRVxuXHRcdFx0ZG9jLndyaXRlKCk7XG5cdFx0XHRkb2MuY2xvc2UoKTtcblxuXHRcdFx0ZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTtcblx0XHRcdGlmcmFtZS5kZXRhY2goKTtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSB0aGUgY29ycmVjdCBkZWZhdWx0IGRpc3BsYXlcblx0XHRlbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7XG5cdH1cblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cbnZhciBybWFyZ2luID0gKC9ebWFyZ2luLyk7XG5cbnZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKTtcblxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdC8vIFN1cHBvcnQ6IElFPD0xMSssIEZpcmVmb3g8PTMwKyAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0aWYgKCBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcub3BlbmVyICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFOVxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG9ubHkgbmVlZGVkIGZvciAuY3NzKCdmaWx0ZXInKSAoIzEyNTM3KVxuXHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXHR9XG5cblx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdGlmICggcmV0ID09PSBcIlwiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogaU9TIDwgNlxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBpT1MgPCA2IChhdCBsZWFzdCkgcmV0dXJucyBwZXJjZW50YWdlIGZvciBhIGxhcmdlciBzZXQgb2YgdmFsdWVzLCBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzXG5cdFx0Ly8gdGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOiBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xuXHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0c3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0O1xuXHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmV0ICE9PSB1bmRlZmluZWQgP1xuXHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAodGhpcy5nZXQgPSBob29rRm4pLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxuKGZ1bmN0aW9uKCkge1xuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsXG5cdFx0ZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gXCJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweDtcIiArXG5cdFx0XCJwb3NpdGlvbjphYnNvbHV0ZVwiO1xuXHRjb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCkge1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFuZHJvaWQgMi4zXG5cdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFwiLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7XCIgK1xuXHRcdFx0XCJib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjElO3RvcDoxJTtcIiArXG5cdFx0XHRcImJvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NHB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHR2YXIgZGl2U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICk7XG5cdFx0cGl4ZWxQb3NpdGlvblZhbCA9IGRpdlN0eWxlLnRvcCAhPT0gXCIxJVwiO1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gZGl2U3R5bGUud2lkdGggPT09IFwiNHB4XCI7XG5cblx0XHRkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IG5vZGUuanMganNkb21cblx0Ly8gRG9uJ3QgYXNzdW1lIHRoYXQgZ2V0Q29tcHV0ZWRTdHlsZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBnbG9iYWwgb2JqZWN0XG5cdGlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdFx0cGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gVGhpcyB0ZXN0IGlzIGV4ZWN1dGVkIG9ubHkgb25jZSBidXQgd2Ugc3RpbGwgZG8gbWVtb2l6aW5nXG5cdFx0XHRcdC8vIHNpbmNlIHdlIGNhbiB1c2UgdGhlIGJveFNpemluZ1JlbGlhYmxlIHByZS1jb21wdXRpbmcuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHRlc3Qgd2FzIGFscmVhZHkgcGVyZm9ybWVkLCB0aG91Z2guXG5cdFx0XHRcdGNvbXB1dGVQaXhlbFBvc2l0aW9uQW5kQm94U2l6aW5nUmVsaWFibGUoKTtcblx0XHRcdFx0cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7XG5cdFx0XHR9LFxuXHRcdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGJveFNpemluZ1JlbGlhYmxlVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdFx0Y29tcHV0ZVBpeGVsUG9zaXRpb25BbmRCb3hTaXppbmdSZWxpYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHRcdH0sXG5cdFx0XHRyZWxpYWJsZU1hcmdpblJpZ2h0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5XG5cdFx0XHRcdC8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gKCMzMzMzKVxuXHRcdFx0XHQvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHRcblx0XHRcdFx0Ly8gVGhpcyBzdXBwb3J0IGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBzbyBubyBtZW1vaXppbmcgaXMgbmVlZGVkLlxuXHRcdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHRcdG1hcmdpbkRpdiA9IGRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gUmVzZXQgQ1NTOiBib3gtc2l6aW5nOyBkaXNwbGF5OyBtYXJnaW47IGJvcmRlcjsgcGFkZGluZ1xuXHRcdFx0XHRtYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PDI5LCBBbmRyb2lkIDIuM1xuXHRcdFx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XHRcdFwiLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtcIiArXG5cdFx0XHRcdFx0XCJib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowXCI7XG5cdFx0XHRcdG1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0XHRkaXYuc3R5bGUud2lkdGggPSBcIjFweFwiO1xuXHRcdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdFx0XHRyZXQgPSAhcGFyc2VGbG9hdCggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApLm1hcmdpblJpZ2h0ICk7XG5cblx0XHRcdFx0ZG9jRWxlbS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cdFx0XHRcdGRpdi5yZW1vdmVDaGlsZCggbWFyZ2luRGl2ICk7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufSkoKTtcblxuXG4vLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zLlxualF1ZXJ5LnN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7XG5cdHZhciByZXQsIG5hbWUsXG5cdFx0b2xkID0ge307XG5cblx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XG5cdH1cblxuXHRyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApO1xuXG5cdC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufTtcblxuXG52YXJcblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZSBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cm51bXNwbGl0ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSguKikkXCIsIFwiaVwiICksXG5cdHJyZWxOdW0gPSBuZXcgUmVnRXhwKCBcIl4oWystXSk9KFwiICsgcG51bSArIFwiKVwiLCBcImlcIiApLFxuXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk9cIiwgXCJNb3pcIiwgXCJtc1wiIF07XG5cbi8vIFJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBzdHlsZSwgbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gc3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSxcblx0XHRvcmlnTmFtZSA9IG5hbWUsXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIHN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9yaWdOYW1lO1xufVxuXG5mdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXHR2YXIgbWF0Y2hlcyA9IHJudW1zcGxpdC5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMiBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkge1xuXHR2YXIgaSA9IGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgP1xuXHRcdC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvblxuXHRcdDQgOlxuXHRcdC8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXNcblx0XHRuYW1lID09PSBcIndpZHRoXCIgPyAxIDogMCxcblxuXHRcdHZhbCA9IDA7XG5cblx0Zm9yICggOyBpIDwgNDsgaSArPSAyICkge1xuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXRcblx0XHRpZiAoIGV4dHJhID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdGlmICggaXNCb3JkZXJCb3ggKSB7XG5cdFx0XHQvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnRcblx0XHRcdGlmICggZXh0cmEgPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmdcblx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3IgcGFkZGluZywgc28gYWRkIGJvcmRlclxuXHRcdFx0aWYgKCBleHRyYSAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICkge1xuXG5cdC8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBib3JkZXItYm94IHZhbHVlXG5cdHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSxcblx0XHR2YWwgPSBuYW1lID09PSBcIndpZHRoXCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQsXG5cdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0aXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdC8vIFNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZFxuXHQvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODVcblx0Ly8gTWF0aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxNjY4XG5cdGlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7XG5cdFx0Ly8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5XG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHRpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7XG5cdFx0XHR2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gQ29tcHV0ZWQgdW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi5cblx0XHRpZiAoIHJudW1ub25weC50ZXN0KHZhbCkgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzXG5cdFx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJlxuXHRcdFx0KCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTtcblxuXHRcdC8vIE5vcm1hbGl6ZSBcIlwiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmFcblx0XHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXHR9XG5cblx0Ly8gVXNlIHRoZSBhY3RpdmUgYm94LXNpemluZyBtb2RlbCB0byBhZGQvc3VidHJhY3QgaXJyZWxldmFudCBzdHlsZXNcblx0cmV0dXJuICggdmFsICtcblx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdGVsZW0sXG5cdFx0XHRuYW1lLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlc1xuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVuLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiICk7XG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cdFx0XHQvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzXG5cdFx0XHQvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90XG5cdFx0XHRpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmVcblx0XHRcdC8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzXG5cdFx0XHQvLyBmb3Igc3VjaCBhbiBlbGVtZW50XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbiggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBcIm9sZGRpc3BsYXlcIiwgZGVmYXVsdERpc3BsYXkoZWxlbS5ub2RlTmFtZSkgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTtcblxuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiB8fCAhaGlkZGVuICkge1xuXHRcdFx0XHRkYXRhX3ByaXYuc2V0KCBlbGVtLCBcIm9sZGRpc3BsYXlcIiwgaGlkZGVuID8gZGlzcGxheSA6IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcFxuXHQvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0aWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0gfHwgXCJcIiA6IFwibm9uZVwiO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cdC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eVxuXHRjc3NIb29rczoge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHlcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xuXHRcdFx0XHRcdHJldHVybiByZXQgPT09IFwiXCIgPyBcIjFcIiA6IHJldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCBcInB4XCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllc1xuXHRjc3NOdW1iZXI6IHtcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7XG5cdFx0XCJmbG9hdFwiOiBcImNzc0Zsb2F0XCJcblx0fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBvcmlnTmFtZSApICk7XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkge1xuXHRcdFx0XHR2YWx1ZSA9ICggcmV0WzFdICsgMSApICogcmV0WzJdICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7XG5cdFx0XHRcdC8vIEZpeGVzIGJ1ZyAjOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIsIGFkZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm51bWJlclwiICYmICFqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkge1xuXHRcdFx0XHR2YWx1ZSArPSBcInB4XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0XHRcdC8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXNcblx0XHRcdGlmICggIXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlICYmIHZhbHVlID09PSBcIlwiICYmIG5hbWUuaW5kZXhPZiggXCJiYWNrZ3JvdW5kXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IFwiaW5oZXJpdFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWVcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoXCJzZXRcIiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBlbGVtLnN0eWxlLCBvcmlnTmFtZSApICk7XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZWFjaChbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHQvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW1cblx0XHRcdFx0Ly8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXRcblx0XHRcdFx0cmV0dXJuIHJkaXNwbGF5c3dhcC50ZXN0KCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApICkgJiYgZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCA/XG5cdFx0XHRcdFx0alF1ZXJ5LnN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIGV4dHJhID9cblx0XHRcdFx0YXVnbWVudFdpZHRoT3JIZWlnaHQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGV4dHJhLFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCkgOiAwXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xualF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7IFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiIH0sXG5cdFx0XHRcdGN1ckNTUywgWyBlbGVtLCBcIm1hcmdpblJpZ2h0XCIgXSApO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goe1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gQXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoXCIgXCIpIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHtcblx0XHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyO1xuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZXMsIGxlbixcblx0XHRcdFx0bWFwID0ge30sXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzLCB0cnVlICk7XG5cdH0sXG5cdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcyApO1xuXHR9LFxuXHR0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHtcblx0XHRpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufSk7XG5cblxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xuXHRyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApO1xufVxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XG5cblR3ZWVuLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxuXHRpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7XG5cdFx0dGhpcy5lbGVtID0gZWxlbTtcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xuXHRcdHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8IFwic3dpbmdcIjtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdGlmICggdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiZcblx0XHRcdFx0KCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5XG5cdFx0XHQvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLlxuXHRcdFx0Ly8gU2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7XG5cdFx0XHQvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzIFwicm90YXRlKDFyYWQpXCIgYXJlIHJldHVybmVkIGFzLWlzLlxuXHRcdFx0cmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgXCJcIiApO1xuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0Ly8gVXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQuXG5cdFx0XHQvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuXG5cdFx0XHQvLyBVc2UgLnN0eWxlIGlmIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlLlxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIFN1cHBvcnQ6IElFOVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fVxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgQ29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIHRpbWVySWQsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRyZnhudW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLyxcblx0YW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXHR0d2VlbmVycyA9IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApLFxuXHRcdFx0XHR0YXJnZXQgPSB0d2Vlbi5jdXIoKSxcblx0XHRcdFx0cGFydHMgPSByZnhudW0uZXhlYyggdmFsdWUgKSxcblx0XHRcdFx0dW5pdCA9IHBhcnRzICYmIHBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICksXG5cblx0XHRcdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRcdFx0c3RhcnQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSBcInB4XCIgJiYgK3RhcmdldCApICYmXG5cdFx0XHRcdFx0cmZ4bnVtLmV4ZWMoIGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHByb3AgKSApLFxuXHRcdFx0XHRzY2FsZSA9IDEsXG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAyMDtcblxuXHRcdFx0aWYgKCBzdGFydCAmJiBzdGFydFsgMyBdICE9PSB1bml0ICkge1xuXHRcdFx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0XHRcdHVuaXQgPSB1bml0IHx8IHN0YXJ0WyAzIF07XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdFx0XHRwYXJ0cyA9IHBhcnRzIHx8IFtdO1xuXG5cdFx0XHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0XHRcdHN0YXJ0ID0gK3RhcmdldCB8fCAxO1xuXG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHQvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKi5cblx0XHRcdFx0XHQvLyBVc2Ugc3RyaW5nIGZvciBkb3VibGluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xuXHRcdFx0XHRcdHNjYWxlID0gc2NhbGUgfHwgXCIuNVwiO1xuXG5cdFx0XHRcdFx0Ly8gQWRqdXN0IGFuZCBhcHBseVxuXHRcdFx0XHRcdHN0YXJ0ID0gc3RhcnQgLyBzY2FsZTtcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0ICsgdW5pdCApO1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSBzY2FsZSwgdG9sZXJhdGluZyB6ZXJvIG9yIE5hTiBmcm9tIHR3ZWVuLmN1cigpLFxuXHRcdFx0XHQvLyBicmVhayB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdoXG5cdFx0XHRcdH0gd2hpbGUgKCBzY2FsZSAhPT0gKHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9ucyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdHdlZW4gcHJvcGVydGllc1xuXHRcdFx0aWYgKCBwYXJ0cyApIHtcblx0XHRcdFx0c3RhcnQgPSB0d2Vlbi5zdGFydCA9ICtzdGFydCB8fCArdGFyZ2V0IHx8IDA7XG5cdFx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0XHQvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb25cblx0XHRcdFx0dHdlZW4uZW5kID0gcGFydHNbIDEgXSA/XG5cdFx0XHRcdFx0c3RhcnQgKyAoIHBhcnRzWyAxIF0gKyAxICkgKiBwYXJ0c1sgMiBdIDpcblx0XHRcdFx0XHQrcGFydHNbIDIgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9O1xuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSk7XG5cdHJldHVybiAoIGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7XG59XG5cbi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xuXHR2YXIgd2hpY2gsXG5cdFx0aSA9IDAsXG5cdFx0YXR0cnMgPSB7IGhlaWdodDogdHlwZSB9O1xuXG5cdC8vIElmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcyxcblx0Ly8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92ZXIgTGVmdCBhbmQgUmlnaHRcblx0aW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7XG5cdGZvciAoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggdHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggdHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAodHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSkgKSB7XG5cblx0XHRcdC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkge1xuXHQvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCB0d2VlbiwgaG9va3MsIG9sZGZpcmUsIGRpc3BsYXksIGNoZWNrRGlzcGxheSxcblx0XHRhbmltID0gdGhpcyxcblx0XHRvcmlnID0ge30sXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlLFxuXHRcdGhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW4oIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sIFwiZnhzaG93XCIgKTtcblxuXHQvLyBIYW5kbGUgcXVldWU6IGZhbHNlIHByb21pc2VzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcblx0XHRcdFx0aG9va3MudW5xdWV1ZWQtLTtcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCBcImZ4XCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8vIEhlaWdodC93aWR0aCBvdmVyZmxvdyBwYXNzXG5cdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiaGVpZ2h0XCIgaW4gcHJvcHMgfHwgXCJ3aWR0aFwiIGluIHByb3BzICkgKSB7XG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTktMTAgZG8gbm90XG5cdFx0Ly8gY2hhbmdlIHRoZSBvdmVyZmxvdyBhdHRyaWJ1dGUgd2hlbiBvdmVyZmxvd1ggYW5kXG5cdFx0Ly8gb3ZlcmZsb3dZIGFyZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWVcblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoXG5cdFx0Ly8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZFxuXHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXG5cdFx0Ly8gVGVzdCBkZWZhdWx0IGRpc3BsYXkgaWYgZGlzcGxheSBpcyBjdXJyZW50bHkgXCJub25lXCJcblx0XHRjaGVja0Rpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/XG5cdFx0XHRkYXRhX3ByaXYuZ2V0KCBlbGVtLCBcIm9sZGRpc3BsYXlcIiApIHx8IGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgOiBkaXNwbGF5O1xuXG5cdFx0aWYgKCBjaGVja0Rpc3BsYXkgPT09IFwiaW5saW5lXCIgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJmbG9hdFwiICkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0c3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBvcHRzLm92ZXJmbG93ICkge1xuXHRcdHN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcblx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gc2hvdy9oaWRlIHBhc3Ncblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy5leGVjKCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBsZWZ0IG92ZXIgZnJvbSBhIHN0b3BwZWQgaGlkZSBvciBzaG93IGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRoIHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlblxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcInNob3dcIiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblxuXHRcdC8vIEFueSBub24tZnggdmFsdWUgc3RvcHMgdXMgZnJvbSByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWVcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlzcGxheSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRpZiAoICFqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YVNob3cgPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7fSApO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIHN0YXRlIGlmIGl0cyB0b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9nZ2xlKCkgdG8gXCJyZXZlcnNlXCJcblx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47XG5cdFx0fVxuXHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0alF1ZXJ5KCBlbGVtICkuc2hvdygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeSggZWxlbSApLmhpZGUoKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgcHJvcDtcblxuXHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdHR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7XG5cblx0XHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0XHRkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRcdHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRcdHR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gXCJ3aWR0aFwiIHx8IHByb3AgPT09IFwiaGVpZ2h0XCIgPyAxIDogMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHQvLyBJZiB0aGlzIGlzIGEgbm9vcCBsaWtlIC5oaWRlKCkuaGlkZSgpLCByZXN0b3JlIGFuIG92ZXJ3cml0dGVuIGRpc3BsYXkgdmFsdWVcblx0fSBlbHNlIGlmICggKGRpc3BsYXkgPT09IFwibm9uZVwiID8gZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXkpID09PSBcImlubGluZVwiICkge1xuXHRcdHN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5O1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkge1xuXHR2YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzO1xuXG5cdC8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzc1xuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcblx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTtcblx0XHRlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07XG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBhbmltYXRpb25QcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHRcdC8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5Nylcblx0XHRcdFx0dGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLFxuXHRcdFx0XHRwZXJjZW50ID0gMSAtIHRlbXAsXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0pO1xuXG5cdFx0XHRpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2Uoe1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdHByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLFxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgeyBzcGVjaWFsRWFzaW5nOiB7fSB9LCBvcHRpb25zICksXG5cdFx0XHRvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsXG5cdFx0XHRvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcblx0XHRcdHR3ZWVuczogW10sXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHtcblx0XHRcdFx0dmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7XG5cdFx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHRcdH0sXG5cdFx0XHRzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHtcblx0XHRcdFx0dmFyIGluZGV4ID0gMCxcblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSksXG5cdFx0cHJvcHMgPSBhbmltYXRpb24ucHJvcHM7XG5cblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7XG5cdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSlcblx0KTtcblxuXHQvLyBhdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcblx0XHQuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApXG5cdFx0LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7XG5cdFx0XHRjYWxsYmFjayA9IHByb3BzO1xuXHRcdFx0cHJvcHMgPSBbIFwiKlwiIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BzID0gcHJvcHMuc3BsaXQoXCIgXCIpO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XG5cdFx0XHR0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdHR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH0sXG5cblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XG5cdFx0aWYgKCBwcmVwZW5kICkge1xuXHRcdFx0YW5pbWF0aW9uUHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhbmltYXRpb25QcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59KTtcblxualF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkge1xuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XG5cdFx0Y29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHxcblx0XHRcdGpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09IFwibnVtYmVyXCIgPyBvcHQuZHVyYXRpb24gOlxuXHRcdG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF0gOiBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW4gKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBkYXRhX3ByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBkYXRhX3ByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiAodHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSkgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFfcHJpdi5nZXQoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZWFjaChbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0pO1xuXG4vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zXG5qUXVlcnkuZWFjaCh7XG5cdHNsaWRlRG93bjogZ2VuRngoXCJzaG93XCIpLFxuXHRzbGlkZVVwOiBnZW5GeChcImhpZGVcIiksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeChcInRvZ2dsZVwiKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59KTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBqUXVlcnkubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cdFx0Ly8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkXG5cdFx0aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7XG5cdFx0XHR0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5meC5zdG9wKCk7XG5cdH1cblx0ZnhOb3cgPSB1bmRlZmluZWQ7XG59O1xuXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XG5cdGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTtcblx0aWYgKCB0aW1lcigpICkge1xuXHRcdGpRdWVyeS5meC5zdGFydCgpO1xuXHR9IGVsc2Uge1xuXHRcdGpRdWVyeS50aW1lcnMucG9wKCk7XG5cdH1cbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xuXG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCAhdGltZXJJZCApIHtcblx0XHR0aW1lcklkID0gc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0Y2xlYXJJbnRlcnZhbCggdGltZXJJZCApO1xuXHR0aW1lcklkID0gbnVsbDtcbn07XG5cbmpRdWVyeS5meC5zcGVlZHMgPSB7XG5cdHNsb3c6IDYwMCxcblx0ZmFzdDogMjAwLFxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxuLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5L1xualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdGNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0pO1xufTtcblxuXG4oZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogaU9TPD01LjEsIEFuZHJvaWQ8PTQuMitcblx0Ly8gRGVmYXVsdCB2YWx1ZSBmb3IgYSBjaGVja2JveCBzaG91bGQgYmUgXCJvblwiXG5cdHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSBcIlwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPD0yLjNcblx0Ly8gT3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmUgaW5jb3JyZWN0bHkgbWFya2VkIGFzIGRpc2FibGVkXG5cdHNlbGVjdC5kaXNhYmxlZCA9IHRydWU7XG5cdHN1cHBvcnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSkoKTtcblxuXG52YXIgbm9kZUhvb2ssIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gc3RydW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBhdHRyaWJ1dGVzIGFyZSBsb3dlcmNhc2Vcblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogbm9kZUhvb2sgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0Ly8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWRcblx0XHRcdHJldHVybiByZXQgPT0gbnVsbCA/XG5cdFx0XHRcdHVuZGVmaW5lZCA6XG5cdFx0XHRcdHJldDtcblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLCBwcm9wTmFtZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKG5hbWUgPSBhdHRyTmFtZXNbaSsrXSkgKSB7XG5cdFx0XHRcdHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXG5cdFx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgKCMxMDg3MClcblx0XHRcdFx0aWYgKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0XHQvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZVxuXHRcdFx0XHRcdGVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSk7XG5cblxuXG5cbnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRwcm9wRml4OiB7XG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXG5cdFx0XCJjbGFzc1wiOiBcImNsYXNzTmFtZVwiXG5cdH0sXG5cblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLCBub3R4bWwsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7XG5cblx0XHRpZiAoIG5vdHhtbCApIHtcblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm4gaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0cmV0IDpcblx0XHRcdFx0KCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgP1xuXHRcdFx0XHRyZXQgOlxuXHRcdFx0XHRlbGVtWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BIb29rczoge1xuXHRcdHRhYkluZGV4OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5oYXNBdHRyaWJ1dGUoIFwidGFiaW5kZXhcIiApIHx8IHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0uaHJlZiA/XG5cdFx0XHRcdFx0ZWxlbS50YWJJbmRleCA6XG5cdFx0XHRcdFx0LTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHtcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaChbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSk7XG5cblxuXG5cbnZhciByY2xhc3MgPSAvW1xcdFxcclxcblxcZl0vZztcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRwcm9jZWVkID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9jZWVkICkge1xuXHRcdFx0Ly8gVGhlIGRpc2p1bmN0aW9uIGhlcmUgaXMgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSByZW1vdmVDbGFzcylcblx0XHRcdGNsYXNzZXMgPSAoIHZhbHVlIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgP1xuXHRcdFx0XHRcdCggXCIgXCIgKyBlbGVtLmNsYXNzTmFtZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApIDpcblx0XHRcdFx0XHRcIiBcIlxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXp6ICsgXCIgXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gb25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0galF1ZXJ5LnRyaW0oIGN1ciApO1xuXHRcdFx0XHRcdGlmICggZWxlbS5jbGFzc05hbWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmNsYXNzTmFtZSA9IGZpbmFsVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdHByb2NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGg7XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoIHByb2NlZWQgKSB7XG5cdFx0XHRjbGFzc2VzID0gKCB2YWx1ZSB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXTtcblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIGVsZW0uY2xhc3NOYW1lID9cblx0XHRcdFx0XHQoIFwiIFwiICsgZWxlbS5jbGFzc05hbWUgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKSA6XG5cdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXNcblx0XHRcdFx0XHRcdHdoaWxlICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApID49IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gdmFsdWUgPyBqUXVlcnkudHJpbSggY3VyICkgOiBcIlwiO1xuXHRcdFx0XHRcdGlmICggZWxlbS5jbGFzc05hbWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmNsYXNzTmFtZSA9IGZpbmFsVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0Ly8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcblx0XHRcdFx0dmFyIGNsYXNzTmFtZSxcblx0XHRcdFx0XHRpID0gMCxcblx0XHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdFx0Y2xhc3NOYW1lcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0XHR3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IHN0cnVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0aWYgKCB0aGlzLmNsYXNzTmFtZSApIHtcblx0XHRcdFx0XHQvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YV9wcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIHRoaXMuY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gXCJcIiA6IGRhdGFfcHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIjtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRpZiAoIHRoaXNbaV0ubm9kZVR5cGUgPT09IDEgJiYgKFwiIFwiICsgdGhpc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZShyY2xhc3MsIFwiIFwiKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+PSAwICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0pO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZztcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLFxuXHRcdFx0ZWxlbSA9IHRoaXNbMF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgXCJ2YWx1ZVwiICkpICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0cmV0dXJuIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdC8vIEhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXNcblx0XHRcdFx0XHRyZXQucmVwbGFjZShycmV0dXJuLCBcIlwiKSA6XG5cdFx0XHRcdFx0Ly8gSGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyXG5cdFx0XHRcdFx0cmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgXCJcIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ1xuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dmFsID0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsICs9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0dmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKFwic2V0XCIgaW4gaG9va3MpIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCBcInZhbHVlXCIgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdHZhbEhvb2tzOiB7XG5cdFx0b3B0aW9uOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTEwLTExK1xuXHRcdFx0XHRcdC8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OClcblx0XHRcdFx0XHRqUXVlcnkudHJpbSggalF1ZXJ5LnRleHQoIGVsZW0gKSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIgfHwgaW5kZXggPCAwLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCxcblx0XHRcdFx0XHRpID0gaW5kZXggPCAwID9cblx0XHRcdFx0XHRcdG1heCA6XG5cdFx0XHRcdFx0XHRvbmUgPyBpbmRleCA6IDA7XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBJRTYtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQoIHN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJpYnV0ZSggXCJkaXNhYmxlZFwiICkgPT09IG51bGwgKSAmJlxuXHRcdFx0XHRcdFx0XHQoICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fCAhalF1ZXJ5Lm5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggKG9wdGlvbi5zZWxlY3RlZCA9IGpRdWVyeS5pbkFycmF5KCBvcHRpb24udmFsdWUsIHZhbHVlcyApID49IDApICkge1xuXHRcdFx0XHRcdFx0b3B0aW9uU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldFxuXHRcdFx0XHRpZiAoICFvcHRpb25TZXQgKSB7XG5cdFx0XHRcdFx0ZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDAgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59KTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxuXG5cbmpRdWVyeS5lYWNoKCAoXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnVcIikuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblxuXHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHR0aGlzLnRyaWdnZXIoIG5hbWUgKTtcblx0fTtcbn0pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0aG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkge1xuXHRcdHJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApO1xuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cdFx0Ly8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKVxuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6IHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59KTtcblxuXG52YXIgbm9uY2UgPSBqUXVlcnkubm93KCk7XG5cbnZhciBycXVlcnkgPSAoL1xcPy8pO1xuXG5cblxuLy8gU3VwcG9ydDogQW5kcm9pZCAyLjNcbi8vIFdvcmthcm91bmQgZmFpbHVyZSB0byBzdHJpbmctY2FzdCBudWxsIGlucHV0XG5qUXVlcnkucGFyc2VKU09OID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHJldHVybiBKU09OLnBhcnNlKCBkYXRhICsgXCJcIiApO1xufTtcblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbCwgdG1wO1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdHRyeSB7XG5cdFx0dG1wID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdHhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHR4bWwgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKS5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIGRhdGEgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJ0cyA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblx0cnVybCA9IC9eKFtcXHcuKy1dKzopKD86XFwvXFwvKD86W15cXC8/I10qQHwpKFteXFwvPyM6XSopKD86OihcXGQrKXwpfCkvLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gRG9jdW1lbnQgbG9jYXRpb25cblx0YWpheExvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWYsXG5cblx0Ly8gU2VnbWVudCBsb2NhdGlvbiBpbnRvIHBhcnRzXG5cdGFqYXhMb2NQYXJ0cyA9IHJ1cmwuZXhlYyggYWpheExvY2F0aW9uLnRvTG93ZXJDYXNlKCkgKSB8fCBbXTtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKGRhdGFUeXBlID0gZGF0YVR5cGVzW2krK10pICkge1xuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWzBdID09PSBcIitcIiApIHtcblx0XHRcdFx0XHRkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgXCIqXCI7XG5cdFx0XHRcdFx0KHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmICFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblx0XHRcdFx0b3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7XG5cdFx0XHRcdHJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKGRlZXAgPSB7fSkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XG5cdFx0fVxuXHR9XG5cdGlmICggZGVlcCApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcbiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpXG4gKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHtcblxuXHR2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsXG5cdFx0Y29udGVudHMgPSBzLmNvbnRlbnRzLFxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzO1xuXG5cdC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzXG5cdHdoaWxlICggZGF0YVR5cGVzWyAwIF0gPT09IFwiKlwiICkge1xuXHRcdGRhdGFUeXBlcy5zaGlmdCgpO1xuXHRcdGlmICggY3QgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1swXSBdICkge1xuXHRcdFx0XHRmaW5hbERhdGFUeXBlID0gdHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICFmaXJzdERhdGFUeXBlICkge1xuXHRcdFx0XHRmaXJzdERhdGFUeXBlID0gdHlwZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0Ly8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0b1xuXHRcdFx0aWYgKCBjdXJyZW50ID09PSBcIipcIiApIHtcblxuXHRcdFx0XHRjdXJyZW50ID0gcHJldjtcblxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxuXHRcdFx0fSBlbHNlIGlmICggcHJldiAhPT0gXCIqXCIgJiYgcHJldiAhPT0gY3VycmVudCApIHtcblxuXHRcdFx0XHQvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlclxuXHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbIFwiKiBcIiArIGN1cnJlbnQgXTtcblxuXHRcdFx0XHQvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpclxuXHRcdFx0XHRpZiAoICFjb252ICkge1xuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudFxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dFxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlcnNbIFwiKiBcIiArIHRtcFsgMCBdIF07XG5cdFx0XHRcdFx0XHRcdGlmICggY29udiApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHNbIFwidGhyb3dzXCIgXSApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7IHN0YXRlOiBcInBhcnNlcmVycm9yXCIsIGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudCB9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogYWpheExvY2F0aW9uLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggYWpheExvY1BhcnRzWyAxIF0gKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC94bWwvLFxuXHRcdFx0aHRtbDogL2h0bWwvLFxuXHRcdFx0anNvbjogL2pzb24vXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IGpRdWVyeS5wYXJzZUpTT04sXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyIHRyYW5zcG9ydCxcblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblx0XHRcdC8vIENyb3NzLWRvbWFpbiBkZXRlY3Rpb24gdmFyc1xuXHRcdFx0cGFydHMsXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXHRcdFx0Ly8gTG9vcCB2YXJpYWJsZVxuXHRcdFx0aSxcblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXHRcdFx0Ly8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvblxuXHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/XG5cdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cdFx0XHQvLyBEZWZlcnJlZHNcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLFxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cdFx0XHQvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNlKVxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcblx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSxcblx0XHRcdC8vIFRoZSBqcVhIUiBzdGF0ZVxuXHRcdFx0c3RhdGUgPSAwLFxuXHRcdFx0Ly8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlXG5cdFx0XHRzdHJBYm9ydCA9IFwiY2FuY2VsZWRcIixcblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnMgPSB7fTtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdHZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2sgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXNcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkO1xuXHRcdGpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lO1xuXHRcdGpxWEhSLmVycm9yID0ganFYSFIuZmFpbDtcblxuXHRcdC8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKVxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGFqYXhMb2NhdGlvbiApICsgXCJcIiApLnJlcGxhY2UoIHJoYXNoLCBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCBycHJvdG9jb2wsIGFqYXhMb2NQYXJ0c1sgMSBdICsgXCIvL1wiICk7XG5cblx0XHQvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCAjMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0galF1ZXJ5LnRyaW0oIHMuZGF0YVR5cGUgfHwgXCIqXCIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB3ZSBoYXZlIGEgcHJvdG9jb2w6aG9zdDpwb3J0IG1pc21hdGNoXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHRwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwudG9Mb3dlckNhc2UoKSApO1xuXHRcdFx0cy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJlxuXHRcdFx0XHQoIHBhcnRzWyAxIF0gIT09IGFqYXhMb2NQYXJ0c1sgMSBdIHx8IHBhcnRzWyAyIF0gIT09IGFqYXhMb2NQYXJ0c1sgMiBdIHx8XG5cdFx0XHRcdFx0KCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gXCI4MFwiIDogXCI0NDNcIiApICkgIT09XG5cdFx0XHRcdFx0XHQoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09IFwiaHR0cDpcIiA/IFwiODBcIiA6IFwiNDQzXCIgKSApIClcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nXG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXG5cdFx0aW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxuXHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoXCJhamF4U3RhcnRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybDtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGEgKTtcblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRzLnVybCA9IHJ0cy50ZXN0KCBjYWNoZVVSTCApID9cblxuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVlXG5cdFx0XHRcdFx0Y2FjaGVVUkwucmVwbGFjZSggcnRzLCBcIiQxXz1cIiArIG5vbmNlKysgKSA6XG5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0aGUgZW5kXG5cdFx0XHRcdFx0Y2FjaGVVUkwgKyAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgbm9uY2UrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU1vZGlmaWVkLVNpbmNlXCIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTm9uZS1NYXRjaFwiLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudFxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJDb250ZW50LVR5cGVcIiwgcy5jb250ZW50VHlwZSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcblx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKFxuXHRcdFx0XCJBY2NlcHRcIixcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdICsgKCBzLmRhdGFUeXBlc1sgMCBdICE9PSBcIipcIiA/IFwiLCBcIiArIGFsbFR5cGVzICsgXCI7IHE9MC4wMVwiIDogXCJcIiApIDpcblx0XHRcdFx0cy5hY2NlcHRzWyBcIipcIiBdXG5cdFx0KTtcblxuXHRcdC8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvblxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0XG5cdFx0aWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkge1xuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHtcblx0XHRcdGpxWEhSWyBpIF0oIHNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEdldCB0cmFuc3BvcnRcblx0XHR0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydFxuXHRcdGlmICggIXRyYW5zcG9ydCApIHtcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSAxO1xuXG5cdFx0XHQvLyBTZW5kIGdsb2JhbCBldmVudFxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFNlbmRcIiwgWyBqcVhIUiwgcyBdICk7XG5cdFx0XHR9XG5cdFx0XHQvLyBUaW1lb3V0XG5cdFx0XHRpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHtcblx0XHRcdFx0dGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydChcInRpbWVvdXRcIik7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRzdGF0ZSA9IDE7XG5cdFx0XHRcdHRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBleGNlcHRpb24gYXMgZXJyb3IgaWYgbm90IGRvbmVcblx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XG5cdFx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdFx0Ly8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIENhbGxlZCBvbmNlXG5cdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXRlIGlzIFwiZG9uZVwiIG5vd1xuXHRcdFx0c3RhdGUgPSAyO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiTGFzdC1Nb2RpZmllZFwiKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiZXRhZ1wiKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoXCJhamF4U3RvcFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblx0XHQvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZFxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoe1xuXHRcdFx0dXJsOiB1cmwsXG5cdFx0XHR0eXBlOiBtZXRob2QsXG5cdFx0XHRkYXRhVHlwZTogdHlwZSxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFja1xuXHRcdH0pO1xuXHR9O1xufSk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KHtcblx0XHR1cmw6IHVybCxcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSk7XG59O1xuXG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwuY2FsbCh0aGlzLCBpKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcChmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xuXG5cdFx0XHRcdHdoaWxlICggZWxlbS5maXJzdEVsZW1lbnRDaGlsZCApIHtcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbGVtO1xuXHRcdFx0fSkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHdyYXA6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJib2R5XCIgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApO1xuXHRcdFx0fVxuXHRcdH0pLmVuZCgpO1xuXHR9XG59KTtcblxuXG5qUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMlxuXHQvLyBPcGVyYSByZXBvcnRzIG9mZnNldFdpZHRocyBhbmQgb2Zmc2V0SGVpZ2h0cyBsZXNzIHRoYW4gemVybyBvbiBzb21lIGVsZW1lbnRzXG5cdHJldHVybiBlbGVtLm9mZnNldFdpZHRoIDw9IDAgJiYgZWxlbS5vZmZzZXRIZWlnaHQgPD0gMDtcbn07XG5qUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApO1xufTtcblxuXG5cblxudmFyIHIyMCA9IC8lMjAvZyxcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggb2JqICkgKSB7XG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG5cdFx0XHRcdGFkZCggcHJlZml4LCB2ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiID8gaSA6IFwiXCIgKSArIFwiXVwiLCB2LCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0fSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyBuYW1lICsgXCJdXCIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlXG5cdFx0XHR2YWx1ZSA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApID8gdmFsdWUoKSA6ICggdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSApO1xuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTtcblx0XHR9O1xuXG5cdC8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuXG5cdGlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHR0cmFkaXRpb25hbCA9IGpRdWVyeS5hamF4U2V0dGluZ3MgJiYgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDtcblx0fVxuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9KTtcblxuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0c2VyaWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTtcblx0fSxcblx0c2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHtcblx0XHRcdC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yIFwiZWxlbWVudHNcIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHNcblx0XHRcdHZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCBcImVsZW1lbnRzXCIgKTtcblx0XHRcdHJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzO1xuXHRcdH0pXG5cdFx0LmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSlcblx0XHQubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRyZXR1cm4gdmFsID09IG51bGwgP1xuXHRcdFx0XHRudWxsIDpcblx0XHRcdFx0alF1ZXJ5LmlzQXJyYXkoIHZhbCApID9cblx0XHRcdFx0XHRqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHR7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0fSkuZ2V0KCk7XG5cdH1cbn0pO1xuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoKCBlICkge31cbn07XG5cbnZhciB4aHJJZCA9IDAsXG5cdHhockNhbGxiYWNrcyA9IHt9LFxuXHR4aHJTdWNjZXNzU3RhdHVzID0ge1xuXHRcdC8vIGZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXHRcdC8vIFN1cHBvcnQ6IElFOVxuXHRcdC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxuXHRcdDEyMjM6IDIwNFxuXHR9LFxuXHR4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpO1xuXG4vLyBTdXBwb3J0OiBJRTlcbi8vIE9wZW4gcmVxdWVzdHMgbXVzdCBiZSBtYW51YWxseSBhYm9ydGVkIG9uIHVubG9hZCAoIzUyODApXG4vLyBTZWUgaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMjg1Njc0NiBmb3IgbW9yZSBpbmZvXG5pZiAoIHdpbmRvdy5hdHRhY2hFdmVudCApIHtcblx0d2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIGZ1bmN0aW9uKCkge1xuXHRcdGZvciAoIHZhciBrZXkgaW4geGhyQ2FsbGJhY2tzICkge1xuXHRcdFx0eGhyQ2FsbGJhY2tzWyBrZXkgXSgpO1xuXHRcdH1cblx0fSk7XG59XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCksXG5cdFx0XHRcdFx0aWQgPSArK3hocklkO1xuXG5cdFx0XHRcdHhoci5vcGVuKCBvcHRpb25zLnR5cGUsIG9wdGlvbnMudXJsLCBvcHRpb25zLmFzeW5jLCBvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3JkICk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBoZWFkZXJzXG5cdFx0XHRcdGZvciAoIGkgaW4gaGVhZGVycyApIHtcblx0XHRcdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB4aHJDYWxsYmFja3NbIGlkIF07XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0geGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gZmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBBY2Nlc3NpbmcgYmluYXJ5LWRhdGEgcmVzcG9uc2VUZXh0IHRocm93cyBhbiBleGNlcHRpb25cblx0XHRcdFx0XHRcdFx0XHRcdC8vICgjMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCA9PT0gXCJzdHJpbmdcIiA/IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogeGhyLnJlc3BvbnNlVGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0fSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdHhoci5vbmVycm9yID0gY2FsbGJhY2soXCJlcnJvclwiKTtcblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0geGhyQ2FsbGJhY2tzWyBpZCBdID0gY2FsbGJhY2soXCJhYm9ydFwiKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIERvIHNlbmQgdGhlIHJlcXVlc3QgKHRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbilcblx0XHRcdFx0XHR4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8fCBudWxsICk7XG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0pO1xuXG5cblxuXG4vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZVxualF1ZXJ5LmFqYXhTZXR1cCh7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIlxuXHR9LFxuXHRjb250ZW50czoge1xuXHRcdHNjcmlwdDogLyg/OmphdmF8ZWNtYSlzY3JpcHQvXG5cdH0sXG5cdGNvbnZlcnRlcnM6IHtcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTtcblx0XHRcdHJldHVybiB0ZXh0O1xuXHRcdH1cblx0fVxufSk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59KTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHNcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeShcIjxzY3JpcHQ+XCIpLnByb3Aoe1xuXHRcdFx0XHRcdGFzeW5jOiB0cnVlLFxuXHRcdFx0XHRcdGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCxcblx0XHRcdFx0XHRzcmM6IHMudXJsXG5cdFx0XHRcdH0pLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59KTtcblxuXG5cblxudmFyIG9sZENhbGxiYWNrcyA9IFtdLFxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vO1xuXG4vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzXG5qUXVlcnkuYWpheFNldHVwKHtcblx0anNvbnA6IFwiY2FsbGJhY2tcIixcblx0anNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UrKyApICk7XG5cdFx0dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7XG5cdFx0cmV0dXJuIGNhbGxiYWNrO1xuXHR9XG59KTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiAhKCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKS5pbmRleE9mKFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpICYmIHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzW1wic2NyaXB0IGpzb25cIl0gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkge1xuXHRcdFx0XHRqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArIFwiIHdhcyBub3QgY2FsbGVkXCIgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdO1xuXHRcdH07XG5cblx0XHQvLyBmb3JjZSBqc29uIGRhdGFUeXBlXG5cdFx0cy5kYXRhVHlwZXNbIDAgXSA9IFwianNvblwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja1xuXHRcdG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTtcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50cztcblx0XHR9O1xuXG5cdFx0Ly8gQ2xlYW4tdXAgZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpXG5cdFx0anFYSFIuYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gUmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblx0XHRcdFx0Ly8gbWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBzYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkge1xuXHRcdFx0XHRvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkO1xuXHRcdH0pO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0pO1xuXG5cblxuXG4vLyBkYXRhOiBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRrZWVwU2NyaXB0cyA9IGNvbnRleHQ7XG5cdFx0Y29udGV4dCA9IGZhbHNlO1xuXHR9XG5cdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdHZhciBwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKSxcblx0XHRzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdO1xuXG5cdC8vIFNpbmdsZSB0YWdcblx0aWYgKCBwYXJzZWQgKSB7XG5cdFx0cmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbMV0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2RcbnZhciBfbG9hZCA9IGpRdWVyeS5mbi5sb2FkO1xuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHRpZiAoIHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIgJiYgX2xvYWQgKSB7XG5cdFx0cmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxuXG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoXCIgXCIpO1xuXG5cdGlmICggb2ZmID49IDAgKSB7XG5cdFx0c2VsZWN0b3IgPSBqUXVlcnkudHJpbSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XG5cblx0XHQvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xuXHRcdHBhcmFtcyA9IHVuZGVmaW5lZDtcblxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXG5cdH0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiICkge1xuXHRcdHR5cGUgPSBcIlBPU1RcIjtcblx0fVxuXG5cdC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0XG5cdGlmICggc2VsZi5sZW5ndGggPiAwICkge1xuXHRcdGpRdWVyeS5hamF4KHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBpZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkXG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSkuZG9uZShmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeShcIjxkaXY+XCIpLmFwcGVuZCggalF1ZXJ5LnBhcnNlSFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdFxuXHRcdFx0XHRyZXNwb25zZVRleHQgKTtcblxuXHRcdH0pLmNvbXBsZXRlKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggY2FsbGJhY2ssIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuXG5cblxuLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHNcbmpRdWVyeS5lYWNoKCBbIFwiYWpheFN0YXJ0XCIsIFwiYWpheFN0b3BcIiwgXCJhamF4Q29tcGxldGVcIiwgXCJhamF4RXJyb3JcIiwgXCJhamF4U3VjY2Vzc1wiLCBcImFqYXhTZW5kXCIgXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSk7XG5cblxuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTtcblx0fSkubGVuZ3RoO1xufTtcblxuXG5cblxudmFyIGRvY0VsZW0gPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4vKipcbiAqIEdldHMgYSB3aW5kb3cgZnJvbSBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kZWZhdWx0Vmlldztcbn1cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKFwiYXV0b1wiKSA+IC0xO1xuXG5cdFx0Ly8gTmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXJcblx0XHQvLyB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcblx0XHRpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkge1xuXHRcdFx0Y3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7XG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XG5cdFx0XHRjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwO1xuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7XG5cdFx0fVxuXHRcdGlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoIFwidXNpbmdcIiBpbiBvcHRpb25zICkge1xuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1ckVsZW0uY3NzKCBwcm9wcyApO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dmFyIGRvY0VsZW0sIHdpbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LFxuXHRcdFx0ZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRpZiAoICFkb2MgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHQvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGVcblx0XHRpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHtcblx0XHRcdHJldHVybiBib3g7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogQmxhY2tCZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBob25lKVxuXHRcdC8vIElmIHdlIGRvbid0IGhhdmUgZ0JDUiwganVzdCB1c2UgMCwwIHJhdGhlciB0aGFuIGVycm9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09IHN0cnVuZGVmaW5lZCApIHtcblx0XHRcdGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0fVxuXHRcdHdpbiA9IGdldFdpbmRvdyggZG9jICk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogYm94LnRvcCArIHdpbi5wYWdlWU9mZnNldCAtIGRvY0VsZW0uY2xpZW50VG9wLFxuXHRcdFx0bGVmdDogYm94LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQgLSBkb2NFbGVtLmNsaWVudExlZnRcblx0XHR9O1xuXHR9LFxuXG5cdHBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICF0aGlzWyAwIF0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIG9mZnNldFBhcmVudCwgb2Zmc2V0LFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBGaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNhdXNlIGl0IGlzIGl0cyBvbmx5IG9mZnNldCBwYXJlbnRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cdFx0XHQvLyBBc3N1bWUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlzIHRoZXJlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWRcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnRcblx0XHRcdG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7XG5cblx0XHRcdC8vIEdldCBjb3JyZWN0IG9mZnNldHNcblx0XHRcdG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7XG5cdFx0XHRpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCBcImh0bWxcIiApICkge1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVyc1xuXHRcdFx0cGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRwYXJlbnRPZmZzZXQubGVmdCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCB8fCBkb2NFbGVtO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudCwgXCJodG1sXCIgKSAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTtcblx0XHR9KTtcblx0fVxufSk7XG5cbi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIiB9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkge1xuXHR2YXIgdG9wID0gXCJwYWdlWU9mZnNldFwiID09PSBwcm9wO1xuXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcblx0XHRcdHZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTtcblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/IHdpblsgcHJvcCBdIDogZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IHdpbmRvdy5wYWdlWE9mZnNldCxcblx0XHRcdFx0XHR0b3AgPyB2YWwgOiB3aW5kb3cucGFnZVlPZmZzZXRcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGgsIG51bGwgKTtcblx0fTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmk8NyssIENocm9tZTwzNytcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTI4MFxuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXHRcdFx0XHQvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXRcblx0XHRcdFx0cmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID9cblx0XHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn0pO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXHRcdC8vIE1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aFxuXHRcdGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBtYXJnaW4sIHZhbHVlICkge1xuXHRcdFx0dmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gXCJib29sZWFuXCIgKSxcblx0XHRcdFx0ZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJnaW4gPT09IHRydWUgfHwgdmFsdWUgPT09IHRydWUgPyBcIm1hcmdpblwiIDogXCJib3JkZXJcIiApO1xuXG5cdFx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBkb2M7XG5cblx0XHRcdFx0aWYgKCBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblx0XHRcdFx0XHQvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZVxuXHRcdFx0XHRcdC8vIGlzbid0IGEgd2hvbGUgbG90IHdlIGNhbiBkby4gU2VlIHB1bGwgcmVxdWVzdCBhdCB0aGlzIFVSTCBmb3IgZGlzY3Vzc2lvbjpcblx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NFxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTtcblx0XHR9O1xuXHR9KTtcbn0pO1xuXG5cbi8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5qUXVlcnkuZm4uc2l6ZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5sZW5ndGg7XG59O1xuXG5qUXVlcnkuZm4uYW5kU2VsZiA9IGpRdWVyeS5mbi5hZGRCYWNrO1xuXG5cblxuXG4vLyBSZWdpc3RlciBhcyBhIG5hbWVkIEFNRCBtb2R1bGUsIHNpbmNlIGpRdWVyeSBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXJcbi8vIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsIGJ1dCBub3QgdmlhIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXRcbi8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdFxuLy8gd2F5IHRvIHJlZ2lzdGVyLiBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9kdWxlIG5hbWVzIGFyZVxuLy8gZGVyaXZlZCBmcm9tIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlXG4vLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHNcbi8vIHRvIGNhbGwgbm9Db25mbGljdCB0byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay5cblxuLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGRcbi8vIGRlY2xhcmUgdGhlbXNlbHZlcyBhcyBhbm9ueW1vdXMgbW9kdWxlcywgYW5kIGF2b2lkIHNldHRpbmcgYSBnbG9iYWwgaWYgYW5cbi8vIEFNRCBsb2FkZXIgaXMgcHJlc2VudC4galF1ZXJ5IGlzIGEgc3BlY2lhbCBjYXNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uXG5cbmlmICggdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgKSB7XG5cdGRlZmluZSggXCJqcXVlcnlcIiwgW10sIGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnk7XG5cdH0pO1xufVxuXG5cblxuXG52YXJcblx0Ly8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxuXG5cdC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF8kID0gd2luZG93LiQ7XG5cbmpRdWVyeS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oIGRlZXAgKSB7XG5cdGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cuJCA9IF8kO1xuXHR9XG5cblx0aWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnk7XG59O1xuXG4vLyBFeHBvc2UgalF1ZXJ5IGFuZCAkIGlkZW50aWZpZXJzLCBldmVuIGluIEFNRFxuLy8gKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KVxuaWYgKCB0eXBlb2Ygbm9HbG9iYWwgPT09IHN0cnVuZGVmaW5lZCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xuXG59KSk7XG4iLCIvKiEgSnNSZW5kZXIgdjAuOS44MyAoQmV0YSk6IGh0dHA6Ly9qc3ZpZXdzLmNvbS8janNyZW5kZXIgKi9cbi8qISAqKlZFUlNJT04gRk9SIFdFQioqIChGb3IgTk9ERS5KUyBzZWUgaHR0cDovL2pzdmlld3MuY29tL2Rvd25sb2FkL2pzcmVuZGVyLW5vZGUuanMpICovXG4vKlxuICogQmVzdC1vZi1icmVlZCB0ZW1wbGF0aW5nIGluIGJyb3dzZXIgb3Igb24gTm9kZS5qcy5cbiAqIERvZXMgbm90IHJlcXVpcmUgalF1ZXJ5LCBvciBIVE1MIERPTVxuICogSW50ZWdyYXRlcyB3aXRoIEpzVmlld3MgKGh0dHA6Ly9qc3ZpZXdzLmNvbS8janN2aWV3cylcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNiwgQm9yaXMgTW9vcmVcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4vL2pzaGludCAtVzAxOCwgLVcwNDFcblxuKGZ1bmN0aW9uKGZhY3RvcnksIGdsb2JhbCkge1xuXHQvLyBnbG9iYWwgdmFyIGlzIHRoZSB0aGlzIG9iamVjdCwgd2hpY2ggaXMgd2luZG93IHdoZW4gcnVubmluZyBpbiB0aGUgdXN1YWwgYnJvd3NlciBlbnZpcm9ubWVudFxuXHR2YXIgJCA9IGdsb2JhbC5qUXVlcnk7XG5cblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7IC8vIENvbW1vbkpTIGUuZy4gQnJvd3NlcmlmeVxuXHRcdG1vZHVsZS5leHBvcnRzID0gJFxuXHRcdFx0PyBmYWN0b3J5KGdsb2JhbCwgJClcblx0XHRcdDogZnVuY3Rpb24oJCkgeyAvLyBJZiBubyBnbG9iYWwgalF1ZXJ5LCB0YWtlIG9wdGlvbmFsIGpRdWVyeSBwYXNzZWQgYXMgcGFyYW1ldGVyOiByZXF1aXJlKCdqc3JlbmRlcicpKGpRdWVyeSlcblx0XHRcdFx0aWYgKCQgJiYgISQuZm4pIHtcblx0XHRcdFx0XHR0aHJvdyBcIlByb3ZpZGUgalF1ZXJ5IG9yIG51bGxcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdFx0fTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgeyAvLyBBTUQgc2NyaXB0IGxvYWRlciwgZS5nLiBSZXF1aXJlSlNcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwpO1xuXHRcdH0pO1xuXHR9IGVsc2UgeyAvLyBCcm93c2VyIHVzaW5nIHBsYWluIDxzY3JpcHQ+IHRhZ1xuXHRcdGZhY3RvcnkoZ2xvYmFsLCBmYWxzZSk7XG5cdH1cbn0gKFxuXG4vLyBmYWN0b3J5IChmb3IganNyZW5kZXIuanMpXG5mdW5jdGlvbihnbG9iYWwsICQpIHtcblwidXNlIHN0cmljdFwiO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCB2YXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG52YXIgc2V0R2xvYmFscyA9ICQgPT09IGZhbHNlOyAvLyBPbmx5IHNldCBnbG9iYWxzIGlmIHNjcmlwdCBibG9jayBpbiBicm93c2VyIChub3QgQU1EIGFuZCBub3QgQ29tbW9uSlMpXG5cbiQgPSAkICYmICQuZm4gPyAkIDogZ2xvYmFsLmpRdWVyeTsgLy8gJCBpcyBqUXVlcnkgcGFzc2VkIGluIGJ5IENvbW1vbkpTIGxvYWRlciAoQnJvd3NlcmlmeSksIG9yIGdsb2JhbCBqUXVlcnkuXG5cbnZhciB2ZXJzaW9uTnVtYmVyID0gXCJ2MC45LjgzXCIsXG5cdGpzdlN0b3JlTmFtZSwgclRhZywgclRtcGxTdHJpbmcsIHRvcFZpZXcsICR2aWV3cyxcdCRleHBhbmRvLFxuXG4vL1RPRE9cdHRtcGxGbnNDYWNoZSA9IHt9LFxuXHQkaXNGdW5jdGlvbiwgJGlzQXJyYXksICR0ZW1wbGF0ZXMsICRjb252ZXJ0ZXJzLCAkaGVscGVycywgJHRhZ3MsICRzdWIsICRzdWJTZXR0aW5ncywgJHN1YlNldHRpbmdzQWR2YW5jZWQsICR2aWV3c1NldHRpbmdzLCBkZWxpbU9wZW5DaGFyMCwgZGVsaW1PcGVuQ2hhcjEsIGRlbGltQ2xvc2VDaGFyMCwgZGVsaW1DbG9zZUNoYXIxLCBsaW5rQ2hhciwgc2V0dGluZywgYmFzZU9uRXJyb3IsXG5cblx0clBhdGggPSAvXighKj8pKD86bnVsbHx0cnVlfGZhbHNlfFxcZFtcXGQuXSp8KFtcXHckXSt8XFwufH4oW1xcdyRdKyl8Iyh2aWV3fChbXFx3JF0rKSk/KShbXFx3JC5eXSo/KSg/OlsuW15dKFtcXHckXSspXFxdPyk/KSQvZyxcblx0Ly8gICAgICAgIG5vdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgICAgIGhlbHBlciAgICB2aWV3ICB2aWV3UHJvcGVydHkgcGF0aFRva2VucyAgICAgIGxlYWZUb2tlblxuXG5cdHJQYXJhbXMgPSAvKFxcKCkoPz1cXHMqXFwoKXwoPzooWyhbXSlcXHMqKT8oPzooXFxePykoISo/WyN+XT9bXFx3JC5eXSspP1xccyooKFxcK1xcK3wtLSl8XFwrfC18JiZ8XFx8XFx8fD09PXwhPT18PT18IT18PD18Pj18Wzw+JSo6P1xcL118KD0pKVxccyp8KCEqP1sjfl0/W1xcdyQuXl0rKShbKFtdKT8pfCgsXFxzKil8KFxcKD8pXFxcXD8oPzooJyl8KFwiKSl8KD86XFxzKigoWylcXF1dKSg/PVxccypbLl5dfFxccyokfFteKFtdKXxbKVxcXV0pKFsoW10/KSl8KFxccyspL2csXG5cdC8vICAgICAgICAgIGxmdFBybjAgICAgICAgIGxmdFBybiAgICAgICAgYm91bmQgICAgICAgICAgICBwYXRoICAgIG9wZXJhdG9yIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxICAgICAgICAgICAgIHBhdGgyICAgICAgIHBybiAgICBjb21tYSAgIGxmdFBybjIgICBhcG9zIHF1b3QgICAgICBydFBybiBydFBybkRvdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBybjIgIHNwYWNlXG5cdC8vIChsZWZ0IHBhcmVuPyBmb2xsb3dlZCBieSAocGF0aD8gZm9sbG93ZWQgYnkgb3BlcmF0b3IpIG9yIChwYXRoIGZvbGxvd2VkIGJ5IGxlZnQgcGFyZW4/KSkgb3IgY29tbWEgb3IgYXBvcyBvciBxdW90IG9yIHJpZ2h0IHBhcmVuIG9yIHNwYWNlXG5cblx0aXNSZW5kZXJDYWxsLFxuXHRyTmV3TGluZSA9IC9bIFxcdF0qKFxcclxcbnxcXG58XFxyKS9nLFxuXHRyVW5lc2NhcGVRdW90ZXMgPSAvXFxcXChbJ1wiXSkvZyxcblx0ckVzY2FwZVF1b3RlcyA9IC9bJ1wiXFxcXF0vZywgLy8gRXNjYXBlIHF1b3RlcyBhbmQgXFwgY2hhcmFjdGVyXG5cdHJCdWlsZEhhc2ggPSAvKD86XFx4MDh8Xikob25lcnJvcjopPyg/Oih+PykoKFtcXHckX1xcLl0rKTopPyhbXlxceDA4XSspKVxceDA4KCwpPyhbXlxceDA4XSspL2dpLFxuXHRyVGVzdEVsc2VJZiA9IC9eaWZcXHMvLFxuXHRyRmlyc3RFbGVtID0gLzwoXFx3KylbPlxcc10vLFxuXHRyQXR0ckVuY29kZSA9IC9bXFx4MDBgPjxcIicmPV0vZywgLy8gSW5jbHVkZXMgPiBlbmNvZGluZyBzaW5jZSByQ29udmVydE1hcmtlcnMgaW4gSnNWaWV3cyBkb2VzIG5vdCBza2lwID4gY2hhcmFjdGVycyBpbiBhdHRyaWJ1dGUgc3RyaW5nc1xuXHRySXNIdG1sID0gL1tcXHgwMGA+PFxcXCInJj1dLyxcblx0ckhhc0hhbmRsZXJzID0gL15vbltBLVpdfF5jb252ZXJ0KEJhY2spPyQvLFxuXHRyV3JhcHBlZEluVmlld01hcmtlciA9IC9eXFwjXFxkK19gW1xcc1xcU10qXFwvXFxkK19gJC8sXG5cdHJIdG1sRW5jb2RlID0gckF0dHJFbmNvZGUsXG5cdHZpZXdJZCA9IDAsXG5cdGNoYXJFbnRpdGllcyA9IHtcblx0XHRcIiZcIjogXCImYW1wO1wiLFxuXHRcdFwiPFwiOiBcIiZsdDtcIixcblx0XHRcIj5cIjogXCImZ3Q7XCIsXG5cdFx0XCJcXHgwMFwiOiBcIiYjMDtcIixcblx0XHRcIidcIjogXCImIzM5O1wiLFxuXHRcdCdcIic6IFwiJiMzNDtcIixcblx0XHRcImBcIjogXCImIzk2O1wiLFxuXHRcdFwiPVwiOiBcIiYjNjE7XCJcblx0fSxcblx0SFRNTCA9IFwiaHRtbFwiLFxuXHRPQkpFQ1QgPSBcIm9iamVjdFwiLFxuXHR0bXBsQXR0ciA9IFwiZGF0YS1qc3YtdG1wbFwiLFxuXHRqc3ZUbXBsID0gXCJqc3ZUbXBsXCIsXG5cdGluZGV4U3RyID0gXCJGb3IgI2luZGV4IGluIG5lc3RlZCBibG9jayB1c2UgI2dldEluZGV4KCkuXCIsXG5cdCRyZW5kZXIgPSB7fSxcblxuXHRqc3IgPSBnbG9iYWwuanNyZW5kZXIsXG5cdGpzclRvSnEgPSBqc3IgJiYgJCAmJiAhJC5yZW5kZXIsIC8vIEpzUmVuZGVyIGFscmVhZHkgbG9hZGVkLCB3aXRob3V0IGpRdWVyeS4gYnV0IHdlIHdpbGwgcmUtbG9hZCBpdCBub3cgdG8gYXR0YWNoIHRvIGpRdWVyeVxuXG5cdGpzdlN0b3JlcyA9IHtcblx0XHR0ZW1wbGF0ZToge1xuXHRcdFx0Y29tcGlsZTogY29tcGlsZVRtcGxcblx0XHR9LFxuXHRcdHRhZzoge1xuXHRcdFx0Y29tcGlsZTogY29tcGlsZVRhZ1xuXHRcdH0sXG5cdFx0dmlld01vZGVsOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVmlld01vZGVsXG5cdFx0fSxcblx0XHRoZWxwZXI6IHt9LFxuXHRcdGNvbnZlcnRlcjoge31cblx0fTtcblxuXHQvLyB2aWV3cyBvYmplY3QgKCQudmlld3MgaWYgalF1ZXJ5IGlzIGxvYWRlZCwganNyZW5kZXIudmlld3MgaWYgbm8galF1ZXJ5LCBlLmcuIGluIE5vZGUuanMpXG5cdCR2aWV3cyA9IHtcblx0XHRqc3ZpZXdzOiB2ZXJzaW9uTnVtYmVyLFxuXHRcdHN1Yjoge1xuXHRcdFx0Ly8gc3Vic2NyaXB0aW9uLCBlLmcuIEpzVmlld3MgaW50ZWdyYXRpb25cblx0XHRcdFZpZXc6IFZpZXcsXG5cdFx0XHRFcnI6IEpzVmlld3NFcnJvcixcblx0XHRcdHRtcGxGbjogdG1wbEZuLFxuXHRcdFx0cGFyc2U6IHBhcnNlUGFyYW1zLFxuXHRcdFx0ZXh0ZW5kOiAkZXh0ZW5kLFxuXHRcdFx0ZXh0ZW5kQ3R4OiBleHRlbmRDdHgsXG5cdFx0XHRzeW50YXhFcnI6IHN5bnRheEVycm9yLFxuXHRcdFx0b25TdG9yZToge30sXG5cdFx0XHRhZGRTZXR0aW5nOiBhZGRTZXR0aW5nLFxuXHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0YWxsb3dDb2RlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdGFkdlNldDogbm9vcCwgLy8gVXBkYXRlIGFkdmFuY2VkIHNldHRpbmdzXG5cdFx0XHRfdGhzOiB0YWdIYW5kbGVyc0Zyb21Qcm9wcyxcblx0XHRcdF90ZzogZnVuY3Rpb24oKSB7fSwgLy8gQ29uc3RydWN0b3IgZm9yIHRhZ0RlZlxuXHRcdFx0X2NudnQ6IGNvbnZlcnRWYWwsXG5cdFx0XHRfdGFnOiByZW5kZXJUYWcsXG5cdFx0XHRfZXI6IGVycm9yLFxuXHRcdFx0X2Vycjogb25SZW5kZXJFcnJvcixcblx0XHRcdF9odG1sOiBodG1sRW5jb2RlLFxuXHRcdFx0X2NwOiByZXRWYWwsIC8vIEdldCBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMgKG9yIHByb3BlcnRpZXMpIH5mb289ZXhwci4gSW4gSnNSZW5kZXIsIHNpbXBseSByZXR1cm5zIHZhbC5cblx0XHRcdF9zcTogZnVuY3Rpb24odG9rZW4pIHtcblx0XHRcdFx0aWYgKHRva2VuID09PSBcImNvbnN0cnVjdG9yXCIpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZXR0aW5nczoge1xuXHRcdFx0ZGVsaW1pdGVyczogJHZpZXdzRGVsaW1pdGVycyxcblx0XHRcdGFkdmFuY2VkOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWVcblx0XHRcdFx0XHQ/IChcblx0XHRcdFx0XHRcdFx0JGV4dGVuZCgkc3ViU2V0dGluZ3NBZHZhbmNlZCwgdmFsdWUpLFxuXHRcdFx0XHRcdFx0XHQkc3ViLmFkdlNldCgpLFxuXHRcdFx0XHRcdFx0XHQkdmlld3NTZXR0aW5nc1xuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0OiAkc3ViU2V0dGluZ3NBZHZhbmNlZDtcblx0XHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0Q3R4OiByZXRWYWwsIC8vIEdldCBjdHguZm9vIHZhbHVlLiBJbiBKc1JlbmRlciwgc2ltcGx5IHJldHVybnMgdmFsLlxuXHRcdG1hcDogZGF0YU1hcCAgICAvLyBJZiBqc09ic2VydmFibGUgbG9hZGVkIGZpcnN0LCB1c2UgdGhhdCBkZWZpbml0aW9uIG9mIGRhdGFNYXBcblx0fTtcblxuZnVuY3Rpb24gZ2V0RGVyaXZlZE1ldGhvZChiYXNlTWV0aG9kLCBtZXRob2QpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdHZhciByZXQsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0cHJldkJhc2UgPSB0YWcuYmFzZTtcblxuXHRcdHRhZy5iYXNlID0gYmFzZU1ldGhvZDsgLy8gV2l0aGluIG1ldGhvZCBjYWxsLCBjYWxsaW5nIHRoaXMuYmFzZSB3aWxsIGNhbGwgdGhlIGJhc2UgbWV0aG9kXG5cdFx0cmV0ID0gbWV0aG9kLmFwcGx5KHRhZywgYXJndW1lbnRzKTsgLy8gQ2FsbCB0aGUgbWV0aG9kXG5cdFx0dGFnLmJhc2UgPSBwcmV2QmFzZTsgLy8gUmVwbGFjZSB0aGlzLmJhc2UgdG8gYmUgdGhlIGJhc2UgbWV0aG9kIG9mIHRoZSBwcmV2aW91cyBjYWxsLCBmb3IgY2hhaW5lZCBjYWxsc1xuXHRcdHJldHVybiByZXQ7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldE1ldGhvZChiYXNlTWV0aG9kLCBtZXRob2QpIHtcblx0Ly8gRm9yIGRlcml2ZWQgbWV0aG9kcyAob3IgaGFuZGxlcnMgZGVjbGFyZWQgZGVjbGFyYXRpdmVseSBhcyBpbiB7ezpmb28gb25DaGFuZ2U9fmZvb0NoYW5nZWR9fSByZXBsYWNlIGJ5IGEgZGVyaXZlZCBtZXRob2QsIHRvIGFsbG93IHVzaW5nIHRoaXMuYmFzZSguLi4pXG5cdC8vIG9yIHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgdG8gY2FsbCB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbi4gKEVxdWl2YWxlbnQgdG8gdGhpcy5fc3VwZXIoLi4uKSBhbmQgdGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpIGluIGpRdWVyeSBVSSlcblx0aWYgKCRpc0Z1bmN0aW9uKG1ldGhvZCkpIHtcblx0XHRtZXRob2QgPSBnZXREZXJpdmVkTWV0aG9kKFxuXHRcdFx0XHQhYmFzZU1ldGhvZFxuXHRcdFx0XHRcdD8gbm9vcCAvLyBubyBiYXNlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiwgc28gdXNlIG5vb3AgYXMgYmFzZSBtZXRob2Rcblx0XHRcdFx0XHQ6IGJhc2VNZXRob2QuX2Rcblx0XHRcdFx0XHRcdD8gYmFzZU1ldGhvZCAvLyBiYXNlTWV0aG9kIGlzIGEgZGVyaXZlZCBtZXRob2QsIHNvIHVzIGl0XG5cdFx0XHRcdFx0XHQ6IGdldERlcml2ZWRNZXRob2Qobm9vcCwgYmFzZU1ldGhvZCksIC8vIGJhc2VNZXRob2QgaXMgbm90IGRlcml2ZWQgc28gbWFrZSBpdHMgYmFzZSBtZXRob2QgYmUgdGhlIG5vb3AgbWV0aG9kXG5cdFx0XHRcdG1ldGhvZFxuXHRcdFx0KTtcblx0XHRtZXRob2QuX2QgPSAxOyAvLyBBZGQgZmxhZyB0aGF0IHRoaXMgaXMgYSBkZXJpdmVkIG1ldGhvZFxuXHR9XG5cdHJldHVybiBtZXRob2Q7XG59XG5cbmZ1bmN0aW9uIHRhZ0hhbmRsZXJzRnJvbVByb3BzKHRhZywgdGFnQ3R4KSB7XG5cdGZvciAodmFyIHByb3AgaW4gdGFnQ3R4LnByb3BzKSB7XG5cdFx0aWYgKHJIYXNIYW5kbGVycy50ZXN0KHByb3ApKSB7XG5cdFx0XHR0YWdbcHJvcF0gPSBnZXRNZXRob2QodGFnW3Byb3BdLCB0YWdDdHgucHJvcHNbcHJvcF0pO1xuXHRcdFx0Ly8gQ29weSBvdmVyIHRoZSBvbkZvbyBwcm9wcywgY29udmVydCBhbmQgY29udmVydEJhY2sgZnJvbSB0YWdDdHgucHJvcHMgdG8gdGFnIChvdmVycmlkZXMgdmFsdWVzIGluIHRhZ0RlZikuXG5cdFx0XHQvLyBOb3RlOiB1bnN1cHBvcnRlZCBzY2VuYXJpbzogaWYgaGFuZGxlcnMgYXJlIGR5bmFtaWNhbGx5IGFkZGVkIF5vbkZvbz1leHByZXNzaW9uIHRoaXMgd2lsbCB3b3JrLCBidXQgZHluYW1pY2FsbHkgcmVtb3Zpbmcgd2lsbCBub3Qgd29yay5cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcmV0VmFsKHZhbCkge1xuXHRyZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBub29wKCkge1xuXHRyZXR1cm4gXCJcIjtcbn1cblxuZnVuY3Rpb24gZGJnQnJlYWsodmFsKSB7XG5cdC8vIFVzYWdlIGV4YW1wbGVzOiB7e2RiZzouLi59fSwge3s6fmRiZyguLi4pfX0sIHt7ZGJnIC4uLi99fSwge157Zm9yIC4uLiBvbkFmdGVyTGluaz1+ZGJnfX0gZXRjLlxuXHR0cnkge1xuXHRcdGNvbnNvbGUubG9nKFwiSnNSZW5kZXIgZGJnIGJyZWFrcG9pbnQ6IFwiICsgdmFsKTtcblx0XHR0aHJvdyBcImRiZyBicmVha3BvaW50XCI7IC8vIFRvIGJyZWFrIGhlcmUsIHN0b3Agb24gY2F1Z2h0IGV4Y2VwdGlvbnMuXG5cdH1cblx0Y2F0Y2ggKGUpIHt9XG5cdHJldHVybiB0aGlzLmJhc2UgPyB0aGlzLmJhc2VBcHBseShhcmd1bWVudHMpIDogdmFsO1xufVxuXG5mdW5jdGlvbiBKc1ZpZXdzRXJyb3IobWVzc2FnZSkge1xuXHQvLyBFcnJvciBleGNlcHRpb24gdHlwZSBmb3IgSnNWaWV3cy9Kc1JlbmRlclxuXHQvLyBPdmVycmlkZSBvZiAkLnZpZXdzLnN1Yi5FcnJvciBpcyBwb3NzaWJsZVxuXHR0aGlzLm5hbWUgPSAoJC5saW5rID8gXCJKc1ZpZXdzXCIgOiBcIkpzUmVuZGVyXCIpICsgXCIgRXJyb3JcIjtcblx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCB0aGlzLm5hbWU7XG59XG5cbmZ1bmN0aW9uICRleHRlbmQodGFyZ2V0LCBzb3VyY2UpIHtcblx0Zm9yICh2YXIgbmFtZSBpbiBzb3VyY2UpIHtcblx0XHR0YXJnZXRbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG5cdH1cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuKEpzVmlld3NFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKSkuY29uc3RydWN0b3IgPSBKc1ZpZXdzRXJyb3I7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PT09PT1cbi8vIHZpZXdzLmRlbGltaXRlcnNcbi8vPT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiAkdmlld3NEZWxpbWl0ZXJzKG9wZW5DaGFycywgY2xvc2VDaGFycywgbGluaykge1xuXHQvLyBTZXQgdGhlIHRhZyBvcGVuaW5nIGFuZCBjbG9zaW5nIGRlbGltaXRlcnMgYW5kICdsaW5rJyBjaGFyYWN0ZXIuIERlZmF1bHQgaXMgXCJ7e1wiLCBcIn19XCIgYW5kIFwiXlwiXG5cdC8vIG9wZW5DaGFycywgY2xvc2VDaGFyczogb3BlbmluZyBhbmQgY2xvc2luZyBzdHJpbmdzLCBlYWNoIHdpdGggdHdvIGNoYXJhY3RlcnNcblx0aWYgKCFvcGVuQ2hhcnMpIHtcblx0XHRyZXR1cm4gJHN1YlNldHRpbmdzLmRlbGltaXRlcnM7XG5cdH1cblx0aWYgKCRpc0FycmF5KG9wZW5DaGFycykpIHtcblx0XHRyZXR1cm4gJHZpZXdzRGVsaW1pdGVycy5hcHBseSgkdmlld3MsIG9wZW5DaGFycyk7XG5cdH1cblxuXHQkc3ViU2V0dGluZ3MuZGVsaW1pdGVycyA9IFtvcGVuQ2hhcnMsIGNsb3NlQ2hhcnMsIGxpbmtDaGFyID0gbGluayA/IGxpbmsuY2hhckF0KDApIDogbGlua0NoYXJdO1xuXG5cdGRlbGltT3BlbkNoYXIwID0gb3BlbkNoYXJzLmNoYXJBdCgwKTsgLy8gRXNjYXBlIHRoZSBjaGFyYWN0ZXJzIC0gc2luY2UgdGhleSBjb3VsZCBiZSByZWdleCBzcGVjaWFsIGNoYXJhY3RlcnNcblx0ZGVsaW1PcGVuQ2hhcjEgPSBvcGVuQ2hhcnMuY2hhckF0KDEpO1xuXHRkZWxpbUNsb3NlQ2hhcjAgPSBjbG9zZUNoYXJzLmNoYXJBdCgwKTtcblx0ZGVsaW1DbG9zZUNoYXIxID0gY2xvc2VDaGFycy5jaGFyQXQoMSk7XG5cdG9wZW5DaGFycyA9IFwiXFxcXFwiICsgZGVsaW1PcGVuQ2hhcjAgKyBcIihcXFxcXCIgKyBsaW5rQ2hhciArIFwiKT9cXFxcXCIgKyBkZWxpbU9wZW5DaGFyMTsgLy8gRGVmYXVsdCBpcyBcIntee1wiXG5cdGNsb3NlQ2hhcnMgPSBcIlxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIxOyAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFwifX1cIlxuXHQvLyBCdWlsZCByZWdleCB3aXRoIG5ldyBkZWxpbWl0ZXJzXG5cdC8vICAgICAgICAgIFt0YWcgICAgKGZvbGxvd2VkIGJ5IC8gc3BhY2Ugb3IgfSkgIG9yIGN2dHIrY29sb24gb3IgaHRtbCBvciBjb2RlXSBmb2xsb3dlZCBieSBzcGFjZStwYXJhbXMgdGhlbiBjb252ZXJ0QmFjaz9cblx0clRhZyA9IFwiKD86KFxcXFx3Kyg/PVtcXFxcL1xcXFxzXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCJdKSl8KFxcXFx3Kyk/KDopfCg+KXwoXFxcXCopKVxcXFxzKigoPzpbXlxcXFxcIlxuXHRcdCsgZGVsaW1DbG9zZUNoYXIwICsgXCJdfFxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiKD8hXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIxICsgXCIpKSo/KVwiO1xuXG5cdC8vIE1ha2UgclRhZyBhdmFpbGFibGUgdG8gSnNWaWV3cyAob3Igb3RoZXIgY29tcG9uZW50cykgZm9yIHBhcnNpbmcgYmluZGluZyBleHByZXNzaW9uc1xuXHQkc3ViLnJUYWcgPSBcIig/OlwiICsgclRhZyArIFwiKVwiO1xuXHQvLyAgICAgICAgICAgICAgICAgICAgICAgIHsgXj8geyAgIHRhZytwYXJhbXMgc2xhc2g/ICBvciBjbG9zaW5nVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgY29tbWVudFxuXHRyVGFnID0gbmV3IFJlZ0V4cChcIig/OlwiICsgb3BlbkNoYXJzICsgclRhZyArIFwiKFxcXFwvKT98XFxcXFwiICsgZGVsaW1PcGVuQ2hhcjAgKyBcIihcXFxcXCIgKyBsaW5rQ2hhciArIFwiKT9cXFxcXCIgKyBkZWxpbU9wZW5DaGFyMSArIFwiKD86KD86XFxcXC8oXFxcXHcrKSlcXFxccyp8IS0tW1xcXFxzXFxcXFNdKj8tLSkpXCIgKyBjbG9zZUNoYXJzLCBcImdcIik7XG5cblx0Ly8gRGVmYXVsdDogIGJpbmQgICAgIHRhZ05hbWUgICAgICAgICBjdnQgICBjbG4gaHRtbCBjb2RlICAgIHBhcmFtcyAgICAgICAgICAgIHNsYXNoICAgYmluZDIgICAgICAgICBjbG9zZUJsayAgY29tbWVudFxuXHQvLyAgICAgIC8oPzp7KFxcXik/eyg/OihcXHcrKD89W1xcL1xcc31dKSl8KFxcdyspPyg6KXwoPil8KFxcKikpXFxzKigoPzpbXn1dfH0oPyF9KSkqPykoXFwvKT98eyhcXF4pP3soPzooPzpcXC8oXFx3KykpXFxzKnwhLS1bXFxzXFxTXSo/LS0pKX19XG5cblx0JHN1Yi5yVG1wbCA9IG5ldyBSZWdFeHAoXCI8Lio+fChbXlxcXFxcXFxcXXxeKVt7fV18XCIgKyBvcGVuQ2hhcnMgKyBcIi4qXCIgKyBjbG9zZUNoYXJzKTtcblx0Ly8gJHN1Yi5yVG1wbCBsb29rcyBmb3IgaHRtbCB0YWdzIG9yIHsgb3IgfSBjaGFyIG5vdCBwcmVjZWRlZCBieSBcXFxcLCBvciBKc1JlbmRlciB0YWdzIHt7eHh4fX0uIEVhY2ggb2YgdGhlc2Ugc3RyaW5ncyBhcmUgY29uc2lkZXJlZFxuXHQvLyBOT1QgdG8gYmUgalF1ZXJ5IHNlbGVjdG9yc1xuXHRyZXR1cm4gJHZpZXdzU2V0dGluZ3M7XG59XG5cbi8vPT09PT09PT09XG4vLyBWaWV3LmdldFxuLy89PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0Vmlldyhpbm5lciwgdHlwZSkgeyAvL3ZpZXcuZ2V0KGlubmVyLCB0eXBlKVxuXHRpZiAoIXR5cGUgJiYgaW5uZXIgIT09IHRydWUpIHtcblx0XHQvLyB2aWV3LmdldCh0eXBlKVxuXHRcdHR5cGUgPSBpbm5lcjtcblx0XHRpbm5lciA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdHZhciB2aWV3cywgaSwgbCwgZm91bmQsXG5cdFx0dmlldyA9IHRoaXMsXG5cdFx0cm9vdCA9ICF0eXBlIHx8IHR5cGUgPT09IFwicm9vdFwiO1xuXHRcdC8vIElmIHR5cGUgaXMgdW5kZWZpbmVkLCByZXR1cm5zIHJvb3QgdmlldyAodmlldyB1bmRlciB0b3AgdmlldykuXG5cblx0aWYgKGlubmVyKSB7XG5cdFx0Ly8gR28gdGhyb3VnaCB2aWV3cyAtIHRoaXMgb25lLCBhbmQgYWxsIG5lc3RlZCBvbmVzLCBkZXB0aC1maXJzdCAtIGFuZCByZXR1cm4gZmlyc3Qgb25lIHdpdGggZ2l2ZW4gdHlwZS5cblx0XHQvLyBJZiB0eXBlIGlzIHVuZGVmaW5lZCwgaS5lLiB2aWV3LmdldCh0cnVlKSwgcmV0dXJuIGZpcnN0IGNoaWxkIHZpZXcuXG5cdFx0Zm91bmQgPSB0eXBlICYmIHZpZXcudHlwZSA9PT0gdHlwZSAmJiB2aWV3O1xuXHRcdGlmICghZm91bmQpIHtcblx0XHRcdHZpZXdzID0gdmlldy52aWV3cztcblx0XHRcdGlmICh2aWV3Ll8udXNlS2V5KSB7XG5cdFx0XHRcdGZvciAoaSBpbiB2aWV3cykge1xuXHRcdFx0XHRcdGlmIChmb3VuZCA9IHR5cGUgPyB2aWV3c1tpXS5nZXQoaW5uZXIsIHR5cGUpIDogdmlld3NbaV0pIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IHZpZXdzLmxlbmd0aDsgIWZvdW5kICYmIGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRmb3VuZCA9IHR5cGUgPyB2aWV3c1tpXS5nZXQoaW5uZXIsIHR5cGUpIDogdmlld3NbaV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAocm9vdCkge1xuXHRcdC8vIEZpbmQgcm9vdCB2aWV3LiAodmlldyB3aG9zZSBwYXJlbnQgaXMgdG9wIHZpZXcpXG5cdFx0d2hpbGUgKHZpZXcucGFyZW50KSB7XG5cdFx0XHRmb3VuZCA9IHZpZXc7XG5cdFx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHdoaWxlICh2aWV3ICYmICFmb3VuZCkge1xuXHRcdFx0Ly8gR28gdGhyb3VnaCB2aWV3cyAtIHRoaXMgb25lLCBhbmQgYWxsIHBhcmVudCBvbmVzIC0gYW5kIHJldHVybiBmaXJzdCBvbmUgd2l0aCBnaXZlbiB0eXBlLlxuXHRcdFx0Zm91bmQgPSB2aWV3LnR5cGUgPT09IHR5cGUgPyB2aWV3IDogdW5kZWZpbmVkO1xuXHRcdFx0dmlldyA9IHZpZXcucGFyZW50O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZm91bmQ7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZEluZGV4KCkge1xuXHR2YXIgdmlldyA9IHRoaXMuZ2V0KFwiaXRlbVwiKTtcblx0cmV0dXJuIHZpZXcgPyB2aWV3LmluZGV4IDogdW5kZWZpbmVkO1xufVxuXG5nZXROZXN0ZWRJbmRleC5kZXBlbmRzID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBbdGhpcy5nZXQoXCJpdGVtXCIpLCBcImluZGV4XCJdO1xufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXgoKSB7XG5cdHJldHVybiB0aGlzLmluZGV4O1xufVxuXG5nZXRJbmRleC5kZXBlbmRzID0gXCJpbmRleFwiO1xuXG4vLz09PT09PT09PT1cbi8vIFZpZXcuaGxwXG4vLz09PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0SGVscGVyKGhlbHBlciwgaXNDb250ZXh0Q2IpIHtcblx0Ly8gSGVscGVyIG1ldGhvZCBjYWxsZWQgYXMgdmlldy5obHAoa2V5KSBmcm9tIGNvbXBpbGVkIHRlbXBsYXRlLCBmb3IgaGVscGVycyBvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIH5mb29cblx0dmFyIHdyYXBwZWQsIGRlcHMsXG5cdHZpZXcgPSB0aGlzLFxuXHRyZXMgPSB2aWV3LmN0eDtcblxuXHRpZiAocmVzKSB7XG5cdFx0cmVzID0gcmVzW2hlbHBlcl07XG5cdH1cblx0aWYgKHJlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmVzID0gJGhlbHBlcnNbaGVscGVyXTtcblx0fVxuXHRpZiAocmVzICYmIHJlcy5fY3ApIHsgLy8gSWYgdGhpcyBoZWxwZXIgcmVzb3VyY2UgaXMgYSBjb250ZXh0dWFsIHBhcmFtZXRlciwgfmZvbz1leHByXG5cdFx0aWYgKGlzQ29udGV4dENiKSB7ICAvLyBJbiBhIGNvbnRleHQgY2FsbGJhY2sgZm9yIGEgY29udGV4dHVhbCBwYXJhbSwgcmV0dXJuIHRoZSBbdmlldywgZGVwZW5kZW5jaWVzLi4uXSBhcnJheSAtIG5lZWRlZCBmb3Igb2JzZXJ2ZSBjYWxsXG5cdFx0XHRkZXBzID0gJHN1Yi5fY2VvKHJlc1sxXS5kZXBzKTsgIC8vIGZuIGRlcHMsIHdpdGggYW55IGV4cHJPYnMgY2xvbmVkXG5cdFx0XHRkZXBzLnVuc2hpZnQocmVzWzBdKTsgICAgICAgICAgIC8vIHZpZXdcblx0XHRcdGRlcHMuX2NwID0gdHJ1ZTtcblx0XHRcdHJldHVybiBkZXBzO1xuXHRcdH1cblx0XHRyZXMgPSAkdmlld3MuZ2V0Q3R4KHJlcyk7IC8vIElmIGEgY29udGV4dHVhbCBwYXJhbSwgYnV0IG5vdCBhIGNvbnRleHQgY2FsbGJhY2ssIHJldHVybiBldmFsdWF0ZWQgcGFyYW0gLSBmbihkYXRhLCB2aWV3LCBqKVxuXHR9XG5cblx0aWYgKHJlcykge1xuXHRcdGlmICgkaXNGdW5jdGlvbihyZXMpICYmICFyZXMuX3dycCkge1xuXHRcdFx0Ly8gSWYgaXQgaXMgb2YgdHlwZSBmdW5jdGlvbiwgYW5kIG5vdCBhbHJlYWR5IHdyYXBwZWQsIHdlIHdpbGwgd3JhcCBpdCwgc28gaWYgY2FsbGVkIHdpdGggbm8gdGhpcyBwb2ludGVyIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlXG5cdFx0XHQvLyB2aWV3IGFzICd0aGlzJyBjb250ZXh0LiBJZiB0aGUgaGVscGVyIH5mb28oKSB3YXMgaW4gYSBkYXRhLWxpbmsgZXhwcmVzc2lvbiwgdGhlIHZpZXcgd2lsbCBoYXZlIGEgJ3RlbXBvcmFyeScgbGlua0N0eCBwcm9wZXJ0eSB0b28uXG5cdFx0XHQvLyBOb3RlIHRoYXQgaGVscGVyIGZ1bmN0aW9ucyBvbiBkZWVwZXIgcGF0aHMgd2lsbCBoYXZlIHNwZWNpZmljIHRoaXMgcG9pbnRlcnMsIGZyb20gdGhlIHByZWNlZGluZyBwYXRoLlxuXHRcdFx0Ly8gRm9yIGV4YW1wbGUsIH51dGlsLmZvbygpIHdpbGwgaGF2ZSB0aGUgfnV0aWwgb2JqZWN0IGFzICd0aGlzJyBwb2ludGVyXG5cdFx0XHR3cmFwcGVkID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiByZXMuYXBwbHkoKCF0aGlzIHx8IHRoaXMgPT09IGdsb2JhbCkgPyB2aWV3IDogdGhpcywgYXJndW1lbnRzKTtcblx0XHRcdH07XG5cdFx0XHR3cmFwcGVkLl93cnAgPSB2aWV3O1xuXHRcdFx0JGV4dGVuZCh3cmFwcGVkLCByZXMpOyAvLyBBdHRhY2ggc2FtZSBleHBhbmRvcyAoaWYgYW55KSB0byB0aGUgd3JhcHBlZCBmdW5jdGlvblxuXHRcdH1cblx0fVxuXHRyZXR1cm4gd3JhcHBlZCB8fCByZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRlbXBsYXRlKHRtcGwpIHtcblx0cmV0dXJuIHRtcGwgJiYgKHRtcGwuZm5cblx0XHQ/IHRtcGxcblx0XHQ6IHRoaXMuZ2V0UnNjKFwidGVtcGxhdGVzXCIsIHRtcGwpIHx8ICR0ZW1wbGF0ZXModG1wbCkpOyAvLyBub3QgeWV0IGNvbXBpbGVkXG59XG5cbi8vPT09PT09PT09PT09PT1cbi8vIHZpZXdzLl9jbnZ0XG4vLz09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbnZlcnRWYWwoY29udmVydGVyLCB2aWV3LCB0YWdDdHgsIG9uRXJyb3IpIHtcblx0Ly8gc2VsZiBpcyB0ZW1wbGF0ZSBvYmplY3Qgb3IgbGlua0N0eCBvYmplY3Rcblx0dmFyIHRhZywgdmFsdWUsXG5cdFx0Ly8gaWYgdGFnQ3R4IGlzIGFuIGludGVnZXIsIHRoZW4gaXQgaXMgdGhlIGtleSBmb3IgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgYm91bmRUYWcgdGFnQ3R4XG5cdFx0Ym91bmRUYWcgPSB0eXBlb2YgdGFnQ3R4ID09PSBcIm51bWJlclwiICYmIHZpZXcudG1wbC5ibmRzW3RhZ0N0eC0xXSxcblx0XHRsaW5rQ3R4ID0gdmlldy5saW5rQ3R4OyAvLyBGb3IgZGF0YS1saW5rPVwie2N2dDouLi59XCIuLi5cblxuXHRpZiAob25FcnJvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dGFnQ3R4ID0gb25FcnJvciA9IHtwcm9wczoge30sIGFyZ3M6IFtvbkVycm9yXX07XG5cdH0gZWxzZSBpZiAoYm91bmRUYWcpIHtcblx0XHR0YWdDdHggPSBib3VuZFRhZyh2aWV3LmRhdGEsIHZpZXcsICRzdWIpO1xuXHR9XG5cblx0dmFsdWUgPSB0YWdDdHguYXJnc1swXTtcblx0aWYgKGNvbnZlcnRlciB8fCBib3VuZFRhZykge1xuXHRcdHRhZyA9IGxpbmtDdHggJiYgbGlua0N0eC50YWc7XG5cdFx0aWYgKCF0YWcpIHtcblx0XHRcdHRhZyA9ICRleHRlbmQobmV3ICRzdWIuX3RnKCksIHtcblx0XHRcdFx0Xzoge1xuXHRcdFx0XHRcdGlubGluZTogIWxpbmtDdHgsXG5cdFx0XHRcdFx0Ym5kOiBib3VuZFRhZyxcblx0XHRcdFx0XHR1bmxpbmtlZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0YWdOYW1lOiBcIjpcIixcblx0XHRcdFx0Y3Z0OiBjb252ZXJ0ZXIsXG5cdFx0XHRcdGZsb3c6IHRydWUsXG5cdFx0XHRcdHRhZ0N0eDogdGFnQ3R4XG5cdFx0XHR9KTtcblx0XHRcdGlmIChsaW5rQ3R4KSB7XG5cdFx0XHRcdGxpbmtDdHgudGFnID0gdGFnO1xuXHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHR9XG5cdFx0XHR0YWdDdHguY3R4ID0gZXh0ZW5kQ3R4KHRhZ0N0eC5jdHgsIChsaW5rQ3R4ID8gbGlua0N0eC52aWV3IDogdmlldykuY3R4KTtcblx0XHR9XG5cdFx0dGFnLl9lciA9IG9uRXJyb3IgJiYgdmFsdWU7XG5cdFx0dGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHgpO1xuXG5cdFx0dGFnQ3R4LnZpZXcgPSB2aWV3O1xuXG5cdFx0dGFnLmN0eCA9IHRhZ0N0eC5jdHggfHwgdGFnLmN0eCB8fCB7fTtcblx0XHR0YWdDdHguY3R4ID0gdW5kZWZpbmVkO1xuXG5cdFx0dmFsdWUgPSB0YWcuY3Z0QXJncyhjb252ZXJ0ZXIgIT09IFwidHJ1ZVwiICYmIGNvbnZlcnRlcilbMF07IC8vIElmIHRoZXJlIGlzIGEgY29udmVydEJhY2sgYnV0IG5vIGNvbnZlcnQsIGNvbnZlcnRlciB3aWxsIGJlIFwidHJ1ZVwiXG5cblx0XHQvLyBDYWxsIG9uUmVuZGVyICh1c2VkIGJ5IEpzVmlld3MgaWYgcHJlc2VudCwgdG8gYWRkIGJpbmRpbmcgYW5ub3RhdGlvbnMgYXJvdW5kIHJlbmRlcmVkIGNvbnRlbnQpXG5cdFx0dmFsdWUgPSBib3VuZFRhZyAmJiB2aWV3Ll8ub25SZW5kZXJcblx0XHRcdD8gdmlldy5fLm9uUmVuZGVyKHZhbHVlLCB2aWV3LCB0YWcpXG5cdFx0XHQ6IHZhbHVlO1xuXHR9XG5cdHJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRBcmdzKGNvbnZlcnRlcikge1xuXHR2YXIgdGFnID0gdGhpcyxcblx0XHR0YWdDdHggPSB0YWcudGFnQ3R4LFxuXHRcdHZpZXcgPSB0YWdDdHgudmlldyxcblx0XHRhcmdzID0gdGFnQ3R4LmFyZ3M7XG5cblx0Y29udmVydGVyID0gY29udmVydGVyIHx8IHRhZy5jb252ZXJ0O1xuXHRjb252ZXJ0ZXIgPSBjb252ZXJ0ZXIgJiYgKFwiXCIgKyBjb252ZXJ0ZXIgPT09IGNvbnZlcnRlclxuXHRcdD8gKHZpZXcuZ2V0UnNjKFwiY29udmVydGVyc1wiLCBjb252ZXJ0ZXIpIHx8IGVycm9yKFwiVW5rbm93biBjb252ZXJ0ZXI6ICdcIiArIGNvbnZlcnRlciArIFwiJ1wiKSlcblx0XHQ6IGNvbnZlcnRlcik7XG5cblx0YXJncyA9ICFhcmdzLmxlbmd0aCAmJiAhdGFnQ3R4LmluZGV4IC8vIE9uIHRoZSBvcGVuaW5nIHRhZyB3aXRoIG5vIGFyZ3MsIGJpbmQgdG8gdGhlIGN1cnJlbnQgZGF0YSBjb250ZXh0XG5cdFx0PyBbdmlldy5kYXRhXVxuXHRcdDogY29udmVydGVyXG5cdFx0XHQ/IGFyZ3Muc2xpY2UoKSAvLyBJZiB0aGVyZSBpcyBhIGNvbnZlcnRlciwgdXNlIGEgY29weSBvZiB0aGUgdGFnQ3R4LmFyZ3MgYXJyYXkgZm9yIHJlbmRlcmluZywgYW5kIHJlcGxhY2UgdGhlIGFyZ3NbMF0gaW5cblx0XHRcdC8vIHRoZSBjb3BpZWQgYXJyYXkgd2l0aCB0aGUgY29udmVydGVkIHZhbHVlLiBCdXQgd2UgZG8gbm90IG1vZGlmeSB0aGUgdmFsdWUgb2YgdGFnLnRhZ0N0eC5hcmdzWzBdICh0aGUgb3JpZ2luYWwgYXJncyBhcnJheSlcblx0XHRcdDogYXJnczsgLy8gSWYgbm8gY29udmVydGVyLCBnZXQgdGhlIG9yaWdpbmFsIHRhZ0N0eC5hcmdzXG5cblx0aWYgKGNvbnZlcnRlcikge1xuXHRcdGlmIChjb252ZXJ0ZXIuZGVwZW5kcykge1xuXHRcdFx0dGFnLmRlcGVuZHMgPSAkc3ViLmdldERlcHModGFnLmRlcGVuZHMsIHRhZywgY29udmVydGVyLmRlcGVuZHMsIGNvbnZlcnRlcik7XG5cdFx0fVxuXHRcdGFyZ3NbMF0gPSBjb252ZXJ0ZXIuYXBwbHkodGFnLCBhcmdzKTtcblx0fVxuXHRyZXR1cm4gYXJncztcbn1cblxuLy89PT09PT09PT09PT09XG4vLyB2aWV3cy5fdGFnXG4vLz09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0UmVzb3VyY2UocmVzb3VyY2VUeXBlLCBpdGVtTmFtZSkge1xuXHR2YXIgcmVzLCBzdG9yZSxcblx0XHR2aWV3ID0gdGhpcztcblx0d2hpbGUgKChyZXMgPT09IHVuZGVmaW5lZCkgJiYgdmlldykge1xuXHRcdHN0b3JlID0gdmlldy50bXBsICYmIHZpZXcudG1wbFtyZXNvdXJjZVR5cGVdO1xuXHRcdHJlcyA9IHN0b3JlICYmIHN0b3JlW2l0ZW1OYW1lXTtcblx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdH1cblx0cmV0dXJuIHJlcyB8fCAkdmlld3NbcmVzb3VyY2VUeXBlXVtpdGVtTmFtZV07XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRhZyh0YWdOYW1lLCBwYXJlbnRWaWV3LCB0bXBsLCB0YWdDdHhzLCBpc1VwZGF0ZSwgb25FcnJvcikge1xuXHRwYXJlbnRWaWV3ID0gcGFyZW50VmlldyB8fCB0b3BWaWV3O1xuXHR2YXIgdGFnLCB0YWdfLCB0YWdEZWYsIHRlbXBsYXRlLCB0YWdzLCBhdHRyLCBwYXJlbnRUYWcsIGksIGwsIGl0ZW1SZXQsIHRhZ0N0eCwgdGFnQ3R4Q3R4LFxuXHRcdGNvbnRlbnQsIGNhbGxJbml0LCBtYXBEZWYsIHRoaXNNYXAsIGFyZ3MsIHByb3BzLCBpbml0aWFsVG1wbCwgdGFnRGF0YU1hcCwgY29udGVudEN0eCxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGxpbmtDdHggPSBwYXJlbnRWaWV3LmxpbmtDdHggfHwgMCxcblx0XHRjdHggPSBwYXJlbnRWaWV3LmN0eCxcblx0XHRwYXJlbnRUbXBsID0gdG1wbCB8fCBwYXJlbnRWaWV3LnRtcGwsXG5cdFx0Ly8gaWYgdGFnQ3R4IGlzIGFuIGludGVnZXIsIHRoZW4gaXQgaXMgdGhlIGtleSBmb3IgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgYm91bmRUYWcgdGFnQ3R4c1xuXHRcdGJvdW5kVGFnID0gdHlwZW9mIHRhZ0N0eHMgPT09IFwibnVtYmVyXCIgJiYgcGFyZW50Vmlldy50bXBsLmJuZHNbdGFnQ3R4cy0xXTtcblxuXHRpZiAodGFnTmFtZS5faXMgPT09IFwidGFnXCIpIHtcblx0XHR0YWcgPSB0YWdOYW1lO1xuXHRcdHRhZ05hbWUgPSB0YWcudGFnTmFtZTtcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHM7XG5cdFx0dGVtcGxhdGUgPSB0YWcudGVtcGxhdGU7XG5cdH0gZWxzZSB7XG5cdFx0dGFnRGVmID0gcGFyZW50Vmlldy5nZXRSc2MoXCJ0YWdzXCIsIHRhZ05hbWUpIHx8IGVycm9yKFwiVW5rbm93biB0YWc6IHt7XCIgKyB0YWdOYW1lICsgXCJ9fSBcIik7XG5cdFx0dGVtcGxhdGUgPSB0YWdEZWYudGVtcGxhdGU7XG5cdH1cblxuXHRpZiAob25FcnJvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0ICs9IG9uRXJyb3I7XG5cdFx0dGFnQ3R4cyA9IG9uRXJyb3IgPSBbe3Byb3BzOiB7fSwgYXJnczogW119XTtcblx0fSBlbHNlIGlmIChib3VuZFRhZykge1xuXHRcdHRhZ0N0eHMgPSBib3VuZFRhZyhwYXJlbnRWaWV3LmRhdGEsIHBhcmVudFZpZXcsICRzdWIpO1xuXHR9XG5cblx0bCA9IHRhZ0N0eHMubGVuZ3RoO1xuXHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0dGFnQ3R4ID0gdGFnQ3R4c1tpXTtcblx0XHRpZiAoIWxpbmtDdHggfHwgIWxpbmtDdHgudGFnIHx8IGkgJiYgIWxpbmtDdHgudGFnLl8uaW5saW5lIHx8IHRhZy5fZXIpIHtcblx0XHRcdC8vIEluaXRpYWxpemUgdGFnQ3R4XG5cdFx0XHQvLyBGb3IgYmxvY2sgdGFncywgdGFnQ3R4LnRtcGwgaXMgYW4gaW50ZWdlciA+IDBcblx0XHRcdGlmIChjb250ZW50ID0gcGFyZW50VG1wbC50bXBscyAmJiB0YWdDdHgudG1wbCkge1xuXHRcdFx0XHRjb250ZW50ID0gdGFnQ3R4LmNvbnRlbnQgPSBwYXJlbnRUbXBsLnRtcGxzW2NvbnRlbnQgLSAxXTtcblx0XHRcdH1cblx0XHRcdHRhZ0N0eC5pbmRleCA9IGk7XG5cdFx0XHR0YWdDdHgudG1wbCA9IGNvbnRlbnQ7IC8vIFNldCB0aGUgdG1wbCBwcm9wZXJ0eSB0byB0aGUgY29udGVudCBvZiB0aGUgYmxvY2sgdGFnXG5cdFx0XHR0YWdDdHgucmVuZGVyID0gcmVuZGVyQ29udGVudDtcblx0XHRcdHRhZ0N0eC52aWV3ID0gcGFyZW50Vmlldztcblx0XHRcdHRhZ0N0eC5jdHggPSBleHRlbmRDdHgodGFnQ3R4LmN0eCwgY3R4KTsgLy8gQ2xvbmUgYW5kIGV4dGVuZCBwYXJlbnRWaWV3LmN0eFxuXHRcdH1cblx0XHRpZiAodG1wbCA9IHRhZ0N0eC5wcm9wcy50bXBsKSB7XG5cdFx0XHQvLyBJZiB0aGUgdG1wbCBwcm9wZXJ0eSBpcyBvdmVycmlkZGVuLCBzZXQgdGhlIHZhbHVlICh3aGVuIGluaXRpYWxpemluZywgb3IsIGluIGNhc2Ugb2YgYmluZGluZzogXnRtcGw9Li4uLCB3aGVuIHVwZGF0aW5nKVxuXHRcdFx0dGFnQ3R4LnRtcGwgPSBwYXJlbnRWaWV3LmdldFRtcGwodG1wbCk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0YWcpIHtcblx0XHRcdC8vIFRoaXMgd2lsbCBvbmx5IGJlIGhpdCBmb3IgaW5pdGlhbCB0YWdDdHggKG5vdCBmb3Ige3tlbHNlfX0pIC0gaWYgdGhlIHRhZyBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXRcblx0XHRcdC8vIEluc3RhbnRpYXRlIHRhZyBpZiBpdCBkb2VzIG5vdCB5ZXQgZXhpc3Rcblx0XHRcdC8vIElmIHRoZSB0YWcgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5zdGFudGlhdGVkLCB3ZSB3aWxsIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZS5cblx0XHRcdC8vIH50YWcgd2lsbCBhY2Nlc3MgdGhlIHRhZywgZXZlbiB3aXRoaW4gdGhlIHJlbmRlcmluZyBvZiB0aGUgdGVtcGxhdGUgY29udGVudCBvZiB0aGlzIHRhZy5cblx0XHRcdC8vIEZyb20gY2hpbGQvZGVzY2VuZGFudCB0YWdzLCBjYW4gYWNjZXNzIHVzaW5nIH50YWcucGFyZW50LCBvciB+cGFyZW50VGFncy50YWdOYW1lXG5cdFx0XHR0YWcgPSBuZXcgdGFnRGVmLl9jdHIoKTtcblx0XHRcdGNhbGxJbml0ID0gISF0YWcuaW5pdDtcblxuXHRcdFx0dGFnLnBhcmVudCA9IHBhcmVudFRhZyA9IGN0eCAmJiBjdHgudGFnO1xuXHRcdFx0dGFnLnRhZ0N0eHMgPSB0YWdDdHhzO1xuXHRcdFx0dGFnRGF0YU1hcCA9IHRhZy5kYXRhTWFwO1xuXG5cdFx0XHRpZiAobGlua0N0eCkge1xuXHRcdFx0XHR0YWcuXy5pbmxpbmUgPSBmYWxzZTtcblx0XHRcdFx0bGlua0N0eC50YWcgPSB0YWc7XG5cdFx0XHRcdHRhZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdH1cblx0XHRcdGlmICh0YWcuXy5ibmQgPSBib3VuZFRhZyB8fCBsaW5rQ3R4LmZuKSB7XG5cdFx0XHRcdC8vIEJvdW5kIGlmIHtee3RhZy4uLn19IG9yIGRhdGEtbGluaz1cInt0YWcuLi59XCJcblx0XHRcdFx0dGFnLl8uYXJyVndzID0ge307XG5cdFx0XHR9IGVsc2UgaWYgKHRhZy5kYXRhQm91bmRPbmx5KSB7XG5cdFx0XHRcdGVycm9yKFwie157XCIgKyB0YWdOYW1lICsgXCJ9fSB0YWcgbXVzdCBiZSBkYXRhLWJvdW5kXCIpO1xuXHRcdFx0fVxuXHRcdFx0Ly9UT0RPIGJldHRlciBwZXJmIGZvciBjaGlsZFRhZ3MoKSAtIGtlZXAgY2hpbGQgdGFnLnRhZ3MgYXJyYXksIChhbmQgcmVtb3ZlIGNoaWxkLCB3aGVuIGRpc3Bvc2VkKVxuXHRcdFx0Ly8gdGFnLnRhZ3MgPSBbXTtcblx0XHR9XG5cdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzO1xuXHRcdHRhZ0RhdGFNYXAgPSB0YWcuZGF0YU1hcDtcblxuXHRcdHRhZ0N0eC50YWcgPSB0YWc7XG5cdFx0aWYgKHRhZ0RhdGFNYXAgJiYgdGFnQ3R4cykge1xuXHRcdFx0dGFnQ3R4Lm1hcCA9IHRhZ0N0eHNbaV0ubWFwOyAvLyBDb3B5IG92ZXIgdGhlIGNvbXBpbGVkIG1hcCBpbnN0YW5jZSBmcm9tIHRoZSBwcmV2aW91cyB0YWdDdHhzIHRvIHRoZSByZWZyZXNoZWQgb25lc1xuXHRcdH1cblx0XHRpZiAoIXRhZy5mbG93KSB7XG5cdFx0XHR0YWdDdHhDdHggPSB0YWdDdHguY3R4ID0gdGFnQ3R4LmN0eCB8fCB7fTtcblxuXHRcdFx0Ly8gdGFncyBoYXNoOiB0YWcuY3R4LnRhZ3MsIG1lcmdlZCB3aXRoIHBhcmVudFZpZXcuY3R4LnRhZ3MsXG5cdFx0XHR0YWdzID0gdGFnLnBhcmVudHMgPSB0YWdDdHhDdHgucGFyZW50VGFncyA9IGN0eCAmJiBleHRlbmRDdHgodGFnQ3R4Q3R4LnBhcmVudFRhZ3MsIGN0eC5wYXJlbnRUYWdzKSB8fCB7fTtcblx0XHRcdGlmIChwYXJlbnRUYWcpIHtcblx0XHRcdFx0dGFnc1twYXJlbnRUYWcudGFnTmFtZV0gPSBwYXJlbnRUYWc7XG5cdFx0XHRcdC8vVE9ETyBiZXR0ZXIgcGVyZiBmb3IgY2hpbGRUYWdzOiBwYXJlbnRUYWcudGFncy5wdXNoKHRhZyk7XG5cdFx0XHR9XG5cdFx0XHR0YWdzW3RhZy50YWdOYW1lXSA9IHRhZ0N0eEN0eC50YWcgPSB0YWc7XG5cdFx0fVxuXHR9XG5cdGlmICghKHRhZy5fZXIgPSBvbkVycm9yKSkge1xuXHRcdHRhZ0hhbmRsZXJzRnJvbVByb3BzKHRhZywgdGFnQ3R4c1swXSk7XG5cdFx0dGFnLnJlbmRlcmluZyA9IHt9OyAvLyBQcm92aWRlIG9iamVjdCBmb3Igc3RhdGUgZHVyaW5nIHJlbmRlciBjYWxscyB0byB0YWcgYW5kIGVsc2VzLiAoVXNlZCBieSB7e2lmfX0gYW5kIHt7Zm9yfX0uLi4pXG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eCA9IHRhZ0N0eHNbaV07XG5cdFx0XHRwcm9wcyA9IHRhZ0N0eC5wcm9wcztcblx0XHRcdGFyZ3MgPSB0YWcuY3Z0QXJncygpO1xuXG5cdFx0XHRpZiAobWFwRGVmID0gcHJvcHMuZGF0YU1hcCB8fCB0YWdEYXRhTWFwKSB7XG5cdFx0XHRcdGlmIChhcmdzLmxlbmd0aCB8fCBwcm9wcy5kYXRhTWFwKSB7XG5cdFx0XHRcdFx0dGhpc01hcCA9IHRhZ0N0eC5tYXA7XG5cdFx0XHRcdFx0aWYgKCF0aGlzTWFwIHx8IHRoaXNNYXAuc3JjICE9PSBhcmdzWzBdIHx8IGlzVXBkYXRlKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpc01hcCAmJiB0aGlzTWFwLnNyYykge1xuXHRcdFx0XHRcdFx0XHR0aGlzTWFwLnVubWFwKCk7IC8vIG9ubHkgY2FsbGVkIGlmIG9ic2VydmFibGUgbWFwIC0gbm90IHdoZW4gb25seSB1c2VkIGluIEpzUmVuZGVyLCBlLmcuIGJ5IHt7cHJvcHN9fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpc01hcCA9IHRhZ0N0eC5tYXAgPSBtYXBEZWYubWFwKGFyZ3NbMF0sIHByb3BzLCB1bmRlZmluZWQsICF0YWcuXy5ibmQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhcmdzID0gW3RoaXNNYXAudGd0XTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGFnLmN0eCA9IHRhZ0N0eC5jdHg7XG5cblx0XHRcdGlmICghaSkge1xuXHRcdFx0XHRpZiAoY2FsbEluaXQpIHtcblx0XHRcdFx0XHRpbml0aWFsVG1wbCA9IHRhZy50ZW1wbGF0ZTtcblx0XHRcdFx0XHR0YWcuaW5pdCh0YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgpO1xuXHRcdFx0XHRcdGNhbGxJbml0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChsaW5rQ3R4KSB7XG5cdFx0XHRcdFx0Ly8gU2V0IGF0dHIgb24gbGlua0N0eCB0byBlbnN1cmUgb3V0cHV0dGluZyB0byB0aGUgY29ycmVjdCB0YXJnZXQgYXR0cmlidXRlLlxuXHRcdFx0XHRcdC8vIFNldHRpbmcgZWl0aGVyIGxpbmtDdHguYXR0ciBvciB0aGlzLmF0dHIgaW4gdGhlIGluaXQoKSBhbGxvd3MgcGVyLWluc3RhbmNlIGNob2ljZSBvZiB0YXJnZXQgYXR0cmliLlxuXHRcdFx0XHRcdGxpbmtDdHguYXR0ciA9IHRhZy5hdHRyID0gbGlua0N0eC5hdHRyIHx8IHRhZy5hdHRyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF0dHIgPSB0YWcuYXR0cjtcblx0XHRcdFx0dGFnLl8ubm9Wd3MgPSBhdHRyICYmIGF0dHIgIT09IEhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdGl0ZW1SZXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodGFnLnJlbmRlcikge1xuXHRcdFx0XHRpdGVtUmV0ID0gdGFnLnJlbmRlci5hcHBseSh0YWcsIGFyZ3MpO1xuXHRcdFx0XHRpZiAocGFyZW50Vmlldy5saW5rZWQgJiYgaXRlbVJldCAmJiB0YWcubGlua2VkRWxlbSAmJiAhcldyYXBwZWRJblZpZXdNYXJrZXIudGVzdChpdGVtUmV0KSkge1xuXHRcdFx0XHRcdC8vIFdoZW4gYSB0YWcgcmVuZGVycyBjb250ZW50IGZyb20gdGhlIHJlbmRlciBtZXRob2QsIHdpdGggZGF0YSBsaW5raW5nLCBhbmQgaGFzIGEgbGlua2VkRWxlbSBiaW5kaW5nLCB0aGVuIHdlIG5lZWQgdG8gd3JhcCB3aXRoXG5cdFx0XHRcdFx0Ly8gdmlldyBtYXJrZXJzLCBpZiBhYnNlbnQsIHNvIHRoZSBjb250ZW50IGlzIGEgdmlldyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhZywgd2hpY2ggd2lsbCBjb3JyZWN0bHkgZGlzcG9zZSBiaW5kaW5ncyBpZiBkZWxldGVkLlxuXHRcdFx0XHRcdGl0ZW1SZXQgPSByZW5kZXJXaXRoVmlld3MoJC50ZW1wbGF0ZXMoaXRlbVJldCksIGFyZ3NbMF0sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBwYXJlbnRWaWV3LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGFnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFhcmdzLmxlbmd0aCkge1xuXHRcdFx0XHRhcmdzID0gW3BhcmVudFZpZXddOyAvLyBubyBhcmd1bWVudHMgLSAoZS5nLiB7e2Vsc2V9fSkgZ2V0IGRhdGEgY29udGV4dCBmcm9tIHZpZXcuXG5cdFx0XHR9XG5cdFx0XHRpZiAoaXRlbVJldCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRlbnRDdHggPSBhcmdzWzBdOyAvLyBEZWZhdWx0IGRhdGEgY29udGV4dCBmb3Igd3JhcHBlZCBibG9jayBjb250ZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudC4gRGVmaW5lZCB0YWcuY29udGVudEN0eCBmdW5jdGlvbiB0byBvdmVycmlkZSB0aGlzLlxuXHRcdFx0XHRpZiAodGFnLmNvbnRlbnRDdHgpIHtcblx0XHRcdFx0XHRjb250ZW50Q3R4ID0gdGFnLmNvbnRlbnRDdHgoY29udGVudEN0eCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aXRlbVJldCA9IHRhZ0N0eC5yZW5kZXIoY29udGVudEN0eCwgdHJ1ZSkgfHwgKGlzVXBkYXRlID8gdW5kZWZpbmVkIDogXCJcIik7XG5cdFx0XHR9XG5cdFx0XHQvLyBObyByZXR1cm4gdmFsdWUgZnJvbSByZW5kZXIsIGFuZCBubyB0ZW1wbGF0ZS9jb250ZW50IHRhZ0N0eC5yZW5kZXIoLi4uKSwgc28gcmV0dXJuIHVuZGVmaW5lZFxuXHRcdFx0cmV0ID0gcmV0ID8gcmV0ICsgKGl0ZW1SZXQgfHwgXCJcIikgOiBpdGVtUmV0OyAvLyBJZiBubyByZW5kZXJlZCBjb250ZW50LCB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkXG5cdFx0fVxuXHRcdHRhZy5yZW5kZXJpbmcgPSB1bmRlZmluZWQ7XG5cdH1cblx0dGFnLnRhZ0N0eCA9IHRhZ0N0eHNbMF07XG5cdHRhZy5jdHggPSB0YWcudGFnQ3R4LmN0eDtcblxuXHRpZiAodGFnLl8ubm9Wd3MpIHtcblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdC8vIGlubGluZSB0YWcgd2l0aCBhdHRyIHNldCB0byBcInRleHRcIiB3aWxsIGluc2VydCBIVE1MLWVuY29kZWQgY29udGVudCAtIGFzIGlmIGl0IHdhcyBlbGVtZW50LWJhc2VkIGlubmVyVGV4dFxuXHRcdFx0cmV0ID0gYXR0ciA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0PyAkY29udmVydGVycy5odG1sKHJldClcblx0XHRcdFx0OiBcIlwiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYm91bmRUYWcgJiYgcGFyZW50Vmlldy5fLm9uUmVuZGVyXG5cdFx0Ly8gQ2FsbCBvblJlbmRlciAodXNlZCBieSBKc1ZpZXdzIGlmIHByZXNlbnQsIHRvIGFkZCBiaW5kaW5nIGFubm90YXRpb25zIGFyb3VuZCByZW5kZXJlZCBjb250ZW50KVxuXHRcdD8gcGFyZW50Vmlldy5fLm9uUmVuZGVyKHJldCwgcGFyZW50VmlldywgdGFnKVxuXHRcdDogcmV0O1xufVxuXG4vLz09PT09PT09PT09PT09PT09XG4vLyBWaWV3IGNvbnN0cnVjdG9yXG4vLz09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIFZpZXcoY29udGV4dCwgdHlwZSwgcGFyZW50VmlldywgZGF0YSwgdGVtcGxhdGUsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKSB7XG5cdC8vIENvbnN0cnVjdG9yIGZvciB2aWV3IG9iamVjdCBpbiB2aWV3IGhpZXJhcmNoeS4gKEF1Z21lbnRlZCBieSBKc1ZpZXdzIGlmIEpzVmlld3MgaXMgbG9hZGVkKVxuXHR2YXIgdmlld3MsIHBhcmVudFZpZXdfLCB0YWcsIHNlbGZfLFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdGlzQXJyYXkgPSB0eXBlID09PSBcImFycmF5XCI7XG5cblx0c2VsZi5jb250ZW50ID0gY29udGVudFRtcGw7XG5cdHNlbGYudmlld3MgPSBpc0FycmF5ID8gW10gOiB7fTtcblx0c2VsZi5wYXJlbnQgPSBwYXJlbnRWaWV3O1xuXHRzZWxmLnR5cGUgPSB0eXBlIHx8IFwidG9wXCI7XG5cdHNlbGYuZGF0YSA9IGRhdGE7XG5cdHNlbGYudG1wbCA9IHRlbXBsYXRlO1xuXHQvLyBJZiB0aGUgZGF0YSBpcyBhbiBhcnJheSwgdGhpcyBpcyBhbiAnYXJyYXkgdmlldycgd2l0aCBhIHZpZXdzIGFycmF5IGZvciBlYWNoIGNoaWxkICdpdGVtIHZpZXcnXG5cdC8vIElmIHRoZSBkYXRhIGlzIG5vdCBhbiBhcnJheSwgdGhpcyBpcyBhbiAnaXRlbSB2aWV3JyB3aXRoIGEgdmlld3MgJ2hhc2gnIG9iamVjdCBmb3IgYW55IGNoaWxkIG5lc3RlZCB2aWV3c1xuXHQvLyAuXy51c2VLZXkgaXMgbm9uIHplcm8gaWYgaXMgbm90IGFuICdhcnJheSB2aWV3JyAob3duaW5nIGEgZGF0YSBhcnJheSkuIFVzZSB0aGlzIGFzIG5leHQga2V5IGZvciBhZGRpbmcgdG8gY2hpbGQgdmlld3MgaGFzaFxuXHRzZWxmXyA9IHNlbGYuXyA9IHtcblx0XHRrZXk6IDAsXG5cdFx0dXNlS2V5OiBpc0FycmF5ID8gMCA6IDEsXG5cdFx0aWQ6IFwiXCIgKyB2aWV3SWQrKyxcblx0XHRvblJlbmRlcjogb25SZW5kZXIsXG5cdFx0Ym5kczoge31cblx0fTtcblx0c2VsZi5saW5rZWQgPSAhIW9uUmVuZGVyO1xuXHRpZiAocGFyZW50Vmlldykge1xuXHRcdHZpZXdzID0gcGFyZW50Vmlldy52aWV3cztcblx0XHRwYXJlbnRWaWV3XyA9IHBhcmVudFZpZXcuXztcblx0XHRpZiAocGFyZW50Vmlld18udXNlS2V5KSB7XG5cdFx0XHQvLyBQYXJlbnQgaXMgbm90IGFuICdhcnJheSB2aWV3Jy4gQWRkIHRoaXMgdmlldyB0byBpdHMgdmlld3Mgb2JqZWN0XG5cdFx0XHQvLyBzZWxmLl9rZXkgPSBpcyB0aGUga2V5IGluIHRoZSBwYXJlbnQgdmlldyBoYXNoXG5cdFx0XHR2aWV3c1tzZWxmXy5rZXkgPSBcIl9cIiArIHBhcmVudFZpZXdfLnVzZUtleSsrXSA9IHNlbGY7XG5cdFx0XHRzZWxmLmluZGV4ID0gaW5kZXhTdHI7XG5cdFx0XHRzZWxmLmdldEluZGV4ID0gZ2V0TmVzdGVkSW5kZXg7XG5cdFx0fSBlbHNlIGlmICh2aWV3cy5sZW5ndGggPT09IChzZWxmXy5rZXkgPSBzZWxmLmluZGV4ID0ga2V5KSkgeyAvLyBQYXJlbnQgaXMgYW4gJ2FycmF5IHZpZXcnLiBBZGQgdGhpcyB2aWV3IHRvIGl0cyB2aWV3cyBhcnJheVxuXHRcdFx0dmlld3MucHVzaChzZWxmKTsgLy8gQWRkaW5nIHRvIGVuZCBvZiB2aWV3cyBhcnJheS4gKFVzaW5nIHB1c2ggd2hlbiBwb3NzaWJsZSAtIGJldHRlciBwZXJmIHRoYW4gc3BsaWNlKVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2aWV3cy5zcGxpY2Uoa2V5LCAwLCBzZWxmKTsgLy8gSW5zZXJ0aW5nIGluIHZpZXdzIGFycmF5XG5cdFx0fVxuXHRcdC8vIElmIG5vIGNvbnRleHQgd2FzIHBhc3NlZCBpbiwgdXNlIHBhcmVudCBjb250ZXh0XG5cdFx0Ly8gSWYgY29udGV4dCB3YXMgcGFzc2VkIGluLCBpdCBzaG91bGQgaGF2ZSBiZWVuIG1lcmdlZCBhbHJlYWR5IHdpdGggcGFyZW50IGNvbnRleHRcblx0XHRzZWxmLmN0eCA9IGNvbnRleHQgfHwgcGFyZW50Vmlldy5jdHg7XG5cdH0gZWxzZSB7XG5cdFx0c2VsZi5jdHggPSBjb250ZXh0O1xuXHR9XG59XG5cblZpZXcucHJvdG90eXBlID0ge1xuXHRnZXQ6IGdldFZpZXcsXG5cdGdldEluZGV4OiBnZXRJbmRleCxcblx0Z2V0UnNjOiBnZXRSZXNvdXJjZSxcblx0Z2V0VG1wbDogZ2V0VGVtcGxhdGUsXG5cdGhscDogZ2V0SGVscGVyLFxuXHRfaXM6IFwidmlld1wiXG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlZ2lzdHJhdGlvblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbXBpbGVDaGlsZFJlc291cmNlcyhwYXJlbnRUbXBsKSB7XG5cdHZhciBzdG9yZU5hbWUsIHN0b3JlTmFtZXMsIHJlc291cmNlcztcblx0Zm9yIChzdG9yZU5hbWUgaW4ganN2U3RvcmVzKSB7XG5cdFx0c3RvcmVOYW1lcyA9IHN0b3JlTmFtZSArIFwic1wiO1xuXHRcdGlmIChwYXJlbnRUbXBsW3N0b3JlTmFtZXNdKSB7XG5cdFx0XHRyZXNvdXJjZXMgPSBwYXJlbnRUbXBsW3N0b3JlTmFtZXNdOyAgICAvLyBSZXNvdXJjZXMgbm90IHlldCBjb21waWxlZFxuXHRcdFx0cGFyZW50VG1wbFtzdG9yZU5hbWVzXSA9IHt9OyAgICAgICAgICAgICAgIC8vIFJlbW92ZSB1bmNvbXBpbGVkIHJlc291cmNlc1xuXHRcdFx0JHZpZXdzW3N0b3JlTmFtZXNdKHJlc291cmNlcywgcGFyZW50VG1wbCk7IC8vIEFkZCBiYWNrIGluIHRoZSBjb21waWxlZCByZXNvdXJjZXNcblx0XHR9XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT1cbi8vIGNvbXBpbGVUYWdcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbXBpbGVUYWcobmFtZSwgdGFnRGVmLCBwYXJlbnRUbXBsKSB7XG5cdHZhciB0bXBsLCBiYXNlVGFnLCBwcm9wLFxuXHRcdGNvbXBpbGVkRGVmID0gbmV3ICRzdWIuX3RnKCk7XG5cblx0ZnVuY3Rpb24gVGFnKCkge1xuXHRcdHZhciB0YWcgPSB0aGlzO1xuXHRcdHRhZy5fID0ge1xuXHRcdFx0aW5saW5lOiB0cnVlLFxuXHRcdFx0dW5saW5rZWQ6IHRydWVcblx0XHR9O1xuXG5cdFx0dGFnLnRhZ05hbWUgPSBuYW1lO1xuXHR9XG5cblx0aWYgKCRpc0Z1bmN0aW9uKHRhZ0RlZikpIHtcblx0XHQvLyBTaW1wbGUgdGFnIGRlY2xhcmVkIGFzIGZ1bmN0aW9uLiBObyBwcmVzZW50ZXIgaW5zdGFudGF0aW9uLlxuXHRcdHRhZ0RlZiA9IHtcblx0XHRcdGRlcGVuZHM6IHRhZ0RlZi5kZXBlbmRzLFxuXHRcdFx0cmVuZGVyOiB0YWdEZWZcblx0XHR9O1xuXHR9IGVsc2UgaWYgKFwiXCIgKyB0YWdEZWYgPT09IHRhZ0RlZikge1xuXHRcdHRhZ0RlZiA9IHt0ZW1wbGF0ZTogdGFnRGVmfTtcblx0fVxuXHRpZiAoYmFzZVRhZyA9IHRhZ0RlZi5iYXNlVGFnKSB7XG5cdFx0dGFnRGVmLmZsb3cgPSAhIXRhZ0RlZi5mbG93OyAvLyBTZXQgZmxvdyBwcm9wZXJ0eSwgc28gZGVmYXVsdHMgdG8gZmFsc2UgZXZlbiBpZiBiYXNlVGFnIGhhcyBmbG93PXRydWVcblx0XHR0YWdEZWYuYmFzZVRhZyA9IGJhc2VUYWcgPSBcIlwiICsgYmFzZVRhZyA9PT0gYmFzZVRhZ1xuXHRcdFx0PyAocGFyZW50VG1wbCAmJiBwYXJlbnRUbXBsLnRhZ3NbYmFzZVRhZ10gfHwgJHRhZ3NbYmFzZVRhZ10pXG5cdFx0XHQ6IGJhc2VUYWc7XG5cblx0XHRjb21waWxlZERlZiA9ICRleHRlbmQoY29tcGlsZWREZWYsIGJhc2VUYWcpO1xuXG5cdFx0Zm9yIChwcm9wIGluIHRhZ0RlZikge1xuXHRcdFx0Y29tcGlsZWREZWZbcHJvcF0gPSBnZXRNZXRob2QoYmFzZVRhZ1twcm9wXSwgdGFnRGVmW3Byb3BdKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29tcGlsZWREZWYgPSAkZXh0ZW5kKGNvbXBpbGVkRGVmLCB0YWdEZWYpO1xuXHR9XG5cblx0Ly8gVGFnIGRlY2xhcmVkIGFzIG9iamVjdCwgdXNlZCBhcyB0aGUgcHJvdG90eXBlIGZvciB0YWcgaW5zdGFudGlhdGlvbiAoY29udHJvbC9wcmVzZW50ZXIpXG5cdGlmICgodG1wbCA9IGNvbXBpbGVkRGVmLnRlbXBsYXRlKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Y29tcGlsZWREZWYudGVtcGxhdGUgPSBcIlwiICsgdG1wbCA9PT0gdG1wbCA/ICgkdGVtcGxhdGVzW3RtcGxdIHx8ICR0ZW1wbGF0ZXModG1wbCkpIDogdG1wbDtcblx0fVxuXHRpZiAoY29tcGlsZWREZWYuaW5pdCAhPT0gZmFsc2UpIHtcblx0XHQvLyBTZXQgaW5pdDogZmFsc2Ugb24gdGFnRGVmIGlmIHlvdSB3YW50IHRvIHByb3ZpZGUganVzdCBhIHJlbmRlciBtZXRob2QsIG9yIHJlbmRlciBhbmQgdGVtcGxhdGUsIGJ1dCBubyBjb25zdHJ1Y3RvciBvciBwcm90b3R5cGUuXG5cdFx0Ly8gc28gZXF1aXZhbGVudCB0byBzZXR0aW5nIHRhZyB0byByZW5kZXIgZnVuY3Rpb24sIGV4Y2VwdCB5b3UgY2FuIGFsc28gcHJvdmlkZSBhIHRlbXBsYXRlLlxuXHRcdChUYWcucHJvdG90eXBlID0gY29tcGlsZWREZWYpLmNvbnN0cnVjdG9yID0gY29tcGlsZWREZWYuX2N0ciA9IFRhZztcblx0fVxuXG5cdGlmIChwYXJlbnRUbXBsKSB7XG5cdFx0Y29tcGlsZWREZWYuX3BhcmVudFRtcGwgPSBwYXJlbnRUbXBsO1xuXHR9XG5cdHJldHVybiBjb21waWxlZERlZjtcbn1cblxuZnVuY3Rpb24gYmFzZUFwcGx5KGFyZ3MpIHtcblx0Ly8gSW4gZGVyaXZlZCBtZXRob2QgKG9yIGhhbmRsZXIgZGVjbGFyZWQgZGVjbGFyYXRpdmVseSBhcyBpbiB7ezpmb28gb25DaGFuZ2U9fmZvb0NoYW5nZWR9fSBjYW4gY2FsbCBiYXNlIG1ldGhvZCxcblx0Ly8gdXNpbmcgdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSAoRXF1aXZhbGVudCB0byB0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cykgaW4galF1ZXJ5IFVJKVxuXHRyZXR1cm4gdGhpcy5iYXNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xufVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVRtcGxcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbXBpbGVUbXBsKG5hbWUsIHRtcGwsIHBhcmVudFRtcGwsIG9wdGlvbnMpIHtcblx0Ly8gdG1wbCBpcyBlaXRoZXIgYSB0ZW1wbGF0ZSBvYmplY3QsIGEgc2VsZWN0b3IgZm9yIGEgdGVtcGxhdGUgc2NyaXB0IGJsb2NrLCB0aGUgbmFtZSBvZiBhIGNvbXBpbGVkIHRlbXBsYXRlLCBvciBhIHRlbXBsYXRlIG9iamVjdFxuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gbG9va3VwVGVtcGxhdGUodmFsdWUpIHtcblx0XHQvLyBJZiB2YWx1ZSBpcyBvZiB0eXBlIHN0cmluZyAtIHRyZWF0IGFzIHNlbGVjdG9yLCBvciBuYW1lIG9mIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0Ly8gUmV0dXJuIHRoZSB0ZW1wbGF0ZSBvYmplY3QsIGlmIGFscmVhZHkgY29tcGlsZWQsIG9yIHRoZSBtYXJrdXAgc3RyaW5nXG5cdFx0dmFyIGN1cnJlbnROYW1lLCB0bXBsO1xuXHRcdGlmICgoXCJcIiArIHZhbHVlID09PSB2YWx1ZSkgfHwgdmFsdWUubm9kZVR5cGUgPiAwICYmIChlbGVtID0gdmFsdWUpKSB7XG5cdFx0XHRpZiAoIWVsZW0pIHtcblx0XHRcdFx0aWYgKC9eXFwuXFwvW15cXFxcOio/XCI8Pl0qJC8udGVzdCh2YWx1ZSkpIHtcblx0XHRcdFx0XHQvLyB0bXBsPVwiLi9zb21lL2ZpbGUuaHRtbFwiXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHRlbXBsYXRlIGlzIG5vdCBuYW1lZCwgdXNlIFwiLi9zb21lL2ZpbGUuaHRtbFwiIGFzIG5hbWUuXG5cdFx0XHRcdFx0aWYgKHRtcGwgPSAkdGVtcGxhdGVzW25hbWUgPSBuYW1lIHx8IHZhbHVlXSkge1xuXHRcdFx0XHRcdFx0dmFsdWUgPSB0bXBsO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBCUk9XU0VSLVNQRUNJRklDIENPREUgKG5vdCBvbiBOb2RlLmpzKTpcblx0XHRcdFx0XHRcdC8vIExvb2sgZm9yIHNlcnZlci1nZW5lcmF0ZWQgc2NyaXB0IGJsb2NrIHdpdGggaWQgXCIuL3NvbWUvZmlsZS5odG1sXCJcblx0XHRcdFx0XHRcdGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCQuZm4gJiYgISRzdWIuclRtcGwudGVzdCh2YWx1ZSkpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9ICQoZG9jdW1lbnQpLmZpbmQodmFsdWUpWzBdOyAvLyBpZiBqUXVlcnkgaXMgbG9hZGVkLCB0ZXN0IGZvciBzZWxlY3RvciByZXR1cm5pbmcgZWxlbWVudHMsIGFuZCBnZXQgZmlyc3QgZWxlbWVudFxuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdH0vLyBFTkQgQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0XHR9IC8vQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0XHRpZiAoZWxlbSkge1xuXHRcdFx0XHQvLyBHZW5lcmFsbHkgdGhpcyBpcyBhIHNjcmlwdCBlbGVtZW50LlxuXHRcdFx0XHQvLyBIb3dldmVyIHdlIGFsbG93IGl0IHRvIGJlIGFueSBlbGVtZW50LCBzbyB5b3UgY2FuIGZvciBleGFtcGxlIHRha2UgdGhlIGNvbnRlbnQgb2YgYSBkaXYsXG5cdFx0XHRcdC8vIHVzZSBpdCBhcyBhIHRlbXBsYXRlLCBhbmQgcmVwbGFjZSBpdCBieSB0aGUgc2FtZSBjb250ZW50IHJlbmRlcmVkIGFnYWluc3QgZGF0YS5cblx0XHRcdFx0Ly8gZS5nLiBmb3IgbGlua2luZyB0aGUgY29udGVudCBvZiBhIGRpdiB0byBhIGNvbnRhaW5lciwgYW5kIHVzaW5nIHRoZSBpbml0aWFsIGNvbnRlbnQgYXMgdGVtcGxhdGU6XG5cdFx0XHRcdC8vICQubGluayhcIiNjb250ZW50XCIsIG1vZGVsLCB7dG1wbDogXCIjY29udGVudFwifSk7XG5cdFx0XHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHRcdFx0Ly8gV2Ugd2lsbCBjb21waWxlIGEgbmV3IHRlbXBsYXRlIHVzaW5nIHRoZSBtYXJrdXAgaW4gdGhlIHNjcmlwdCBlbGVtZW50XG5cdFx0XHRcdFx0dmFsdWUgPSBlbGVtLmlubmVySFRNTDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBXZSB3aWxsIGNhY2hlIGEgc2luZ2xlIGNvcHkgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIG5hbWVcblx0XHRcdFx0XHQvLyAocmVuYW1pbmcgZnJvbSBhIHByZXZpb3VzIG5hbWUgaWYgdGhlcmUgd2FzIG9uZSkuXG5cdFx0XHRcdFx0Y3VycmVudE5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZSh0bXBsQXR0cik7XG5cdFx0XHRcdFx0aWYgKGN1cnJlbnROYW1lKSB7XG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudE5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSAkdGVtcGxhdGVzW2N1cnJlbnROYW1lXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlICR0ZW1wbGF0ZXNbY3VycmVudE5hbWVdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICgkLmZuKSB7XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gJC5kYXRhKGVsZW0pW2pzdlRtcGxdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gbmFtZSB8fCAoJC5mbiA/IGpzdlRtcGwgOiB2YWx1ZSk7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGNvbXBpbGVUbXBsKG5hbWUsIGVsZW0uaW5uZXJIVE1MLCBwYXJlbnRUbXBsLCBvcHRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFsdWUudG1wbE5hbWUgPSBuYW1lID0gbmFtZSB8fCBjdXJyZW50TmFtZTtcblx0XHRcdFx0XHRpZiAobmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0XHRcdFx0JHRlbXBsYXRlc1tuYW1lXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSh0bXBsQXR0ciwgbmFtZSk7XG5cdFx0XHRcdFx0aWYgKCQuZm4pIHtcblx0XHRcdFx0XHRcdCQuZGF0YShlbGVtLCBqc3ZUbXBsLCB2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IC8vIEVORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdGVsZW0gPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmICghdmFsdWUuZm4pIHtcblx0XHRcdHZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgbm90IGEgc3RyaW5nLiBIVE1MIGVsZW1lbnQsIG9yIGNvbXBpbGVkIHRlbXBsYXRlLCByZXR1cm4gdW5kZWZpbmVkXG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHZhciBlbGVtLCBjb21waWxlZFRtcGwsXG5cdFx0dG1wbE9yTWFya3VwID0gdG1wbCA9IHRtcGwgfHwgXCJcIjtcblxuXHQvLz09PT0gQ29tcGlsZSB0aGUgdGVtcGxhdGUgPT09PVxuXHRpZiAob3B0aW9ucyA9PT0gMCkge1xuXHRcdG9wdGlvbnMgPSB1bmRlZmluZWQ7XG5cdFx0dG1wbE9yTWFya3VwID0gbG9va3VwVGVtcGxhdGUodG1wbE9yTWFya3VwKTsgLy8gVG9wLWxldmVsIGNvbXBpbGUgc28gZG8gYSB0ZW1wbGF0ZSBsb29rdXBcblx0fVxuXG5cdC8vIElmIG9wdGlvbnMsIHRoZW4gdGhpcyB3YXMgYWxyZWFkeSBjb21waWxlZCBmcm9tIGEgKHNjcmlwdCkgZWxlbWVudCB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi5cblx0Ly8gSWYgbm90LCB0aGVuIGlmIHRtcGwgaXMgYSB0ZW1wbGF0ZSBvYmplY3QsIHVzZSBpdCBmb3Igb3B0aW9uc1xuXHRvcHRpb25zID0gb3B0aW9ucyB8fCAodG1wbC5tYXJrdXAgPyB0bXBsIDoge30pO1xuXHRvcHRpb25zLnRtcGxOYW1lID0gbmFtZTtcblx0aWYgKHBhcmVudFRtcGwpIHtcblx0XHRvcHRpb25zLl9wYXJlbnRUbXBsID0gcGFyZW50VG1wbDtcblx0fVxuXHQvLyBJZiB0bXBsIGlzIG5vdCBhIG1hcmt1cCBzdHJpbmcgb3IgYSBzZWxlY3RvciBzdHJpbmcsIHRoZW4gaXQgbXVzdCBiZSBhIHRlbXBsYXRlIG9iamVjdFxuXHQvLyBJbiB0aGF0IGNhc2UsIGdldCBpdCBmcm9tIHRoZSBtYXJrdXAgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxuXHRpZiAoIXRtcGxPck1hcmt1cCAmJiB0bXBsLm1hcmt1cCAmJiAodG1wbE9yTWFya3VwID0gbG9va3VwVGVtcGxhdGUodG1wbC5tYXJrdXApKSkge1xuXHRcdGlmICh0bXBsT3JNYXJrdXAuZm4pIHtcblx0XHRcdC8vIElmIHRoZSBzdHJpbmcgcmVmZXJlbmNlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIG9iamVjdCwgbmVlZCB0byByZWNvbXBpbGUgdG8gbWVyZ2UgYW55IG1vZGlmaWVkIG9wdGlvbnNcblx0XHRcdHRtcGxPck1hcmt1cCA9IHRtcGxPck1hcmt1cC5tYXJrdXA7XG5cdFx0fVxuXHR9XG5cdGlmICh0bXBsT3JNYXJrdXAgIT09IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0bXBsT3JNYXJrdXAuZm4gfHwgdG1wbC5mbikge1xuXHRcdFx0Ly8gdG1wbCBpcyBhbHJlYWR5IGNvbXBpbGVkLCBzbyB1c2UgaXRcblx0XHRcdGlmICh0bXBsT3JNYXJrdXAuZm4pIHtcblx0XHRcdFx0Y29tcGlsZWRUbXBsID0gdG1wbE9yTWFya3VwO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB0bXBsT3JNYXJrdXAgaXMgYSBtYXJrdXAgc3RyaW5nLCBub3QgYSBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdFx0Ly8gQ3JlYXRlIHRlbXBsYXRlIG9iamVjdFxuXHRcdFx0dG1wbCA9IHRtcGxPYmplY3QodG1wbE9yTWFya3VwLCBvcHRpb25zKTtcblx0XHRcdC8vIENvbXBpbGUgdG8gQVNUIGFuZCB0aGVuIHRvIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHR0bXBsRm4odG1wbE9yTWFya3VwLnJlcGxhY2UockVzY2FwZVF1b3RlcywgXCJcXFxcJCZcIiksIHRtcGwpO1xuXHRcdH1cblx0XHRpZiAoIWNvbXBpbGVkVG1wbCkge1xuXHRcdFx0Y29tcGlsZWRUbXBsID0gJGV4dGVuZChmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVkVG1wbC5yZW5kZXIuYXBwbHkoY29tcGlsZWRUbXBsLCBhcmd1bWVudHMpO1xuXHRcdFx0fSwgdG1wbCk7XG5cblx0XHRcdGNvbXBpbGVDaGlsZFJlc291cmNlcyhjb21waWxlZFRtcGwpO1xuXHRcdH1cblx0XHRpZiAobmFtZSAmJiAhcGFyZW50VG1wbCAmJiBuYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHQkcmVuZGVyW25hbWVdID0gY29tcGlsZWRUbXBsO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZWRUbXBsO1xuXHR9XG59XG5cbi8vPT09PSAvZW5kIG9mIGZ1bmN0aW9uIGNvbXBpbGVUbXBsID09PT1cblxuLy89PT09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVZpZXdNb2RlbFxuLy89PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VmFsKGRlZmF1bHRWYWwsIGRhdGEpIHtcblx0cmV0dXJuICQuaXNGdW5jdGlvbihkZWZhdWx0VmFsKVxuXHRcdD8gZGVmYXVsdFZhbC5jYWxsKGRhdGEpXG5cdFx0OiBkZWZhdWx0VmFsO1xufVxuXG5mdW5jdGlvbiB1bm1hcEFycmF5KG1vZGVsQXJyKSB7XG5cdFx0dmFyIGksIGFyciA9IFtdLFxuXHRcdFx0bCA9IG1vZGVsQXJyLmxlbmd0aDtcblx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdGFyci5wdXNoKG1vZGVsQXJyW2ldLnVubWFwKCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBjb21waWxlVmlld01vZGVsKG5hbWUsIHR5cGUpIHtcblx0dmFyIGksIGNvbnN0cnVjdG9yLFxuXHRcdHZpZXdNb2RlbHMgPSB0aGlzLFxuXHRcdGdldHRlcnMgPSB0eXBlLmdldHRlcnMsXG5cdFx0ZXh0ZW5kID0gdHlwZS5leHRlbmQsXG5cdFx0aWQgPSB0eXBlLmlkLFxuXHRcdHByb3RvID0gJC5leHRlbmQoe1xuXHRcdFx0X2lzOiBuYW1lIHx8IFwidW5uYW1lZFwiLFxuXHRcdFx0dW5tYXA6IHVubWFwLFxuXHRcdFx0bWVyZ2U6IG1lcmdlXG5cdFx0fSwgZXh0ZW5kKSxcblx0XHRhcmdzID0gXCJcIixcblx0XHRib2R5ID0gXCJcIixcblx0XHRsID0gZ2V0dGVycyA/IGdldHRlcnMubGVuZ3RoIDogMCxcblx0XHQkb2JzZXJ2YWJsZSA9ICQub2JzZXJ2YWJsZSxcblx0XHRnZXR0ZXJOYW1lcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIEdldE5ldyhhcmdzKSB7XG5cdFx0Y29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJncyk7XG5cdH1cblxuXHRmdW5jdGlvbiB2bSgpIHtcblx0XHRyZXR1cm4gbmV3IEdldE5ldyhhcmd1bWVudHMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gaXRlcmF0ZShkYXRhLCBhY3Rpb24pIHtcblx0XHR2YXIgaiwgZ2V0dGVyVHlwZSwgZGVmYXVsdFZhbCwgcHJvcCwgb2IsXG5cdFx0XHRtID0gZ2V0dGVycy5sZW5ndGg7XG5cdFx0Zm9yIChqPTA7IGo8bTsgaisrKSB7XG5cdFx0XHRwcm9wID0gZ2V0dGVyc1tqXTtcblx0XHRcdGdldHRlclR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAocHJvcCArIFwiXCIgIT09IHByb3ApIHtcblx0XHRcdFx0Z2V0dGVyVHlwZSA9IHByb3A7XG5cdFx0XHRcdHByb3AgPSBnZXR0ZXJUeXBlLmdldHRlcjtcblx0XHRcdH1cblx0XHRcdGlmICgob2IgPSBkYXRhW3Byb3BdKSA9PT0gdW5kZWZpbmVkICYmIGdldHRlclR5cGUgJiYgKGRlZmF1bHRWYWwgPSBnZXR0ZXJUeXBlLmRlZmF1bHRWYWwpICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0b2IgPSBnZXREZWZhdWx0VmFsKGRlZmF1bHRWYWwsIGRhdGEpO1xuXHRcdFx0fVxuXHRcdFx0YWN0aW9uKG9iLCBnZXR0ZXJUeXBlICYmIHZpZXdNb2RlbHNbZ2V0dGVyVHlwZS50eXBlXSwgcHJvcCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gbWFwKGRhdGEpIHtcblx0XHRkYXRhID0gZGF0YSArIFwiXCIgPT09IGRhdGFcblx0XHRcdD8gSlNPTi5wYXJzZShkYXRhKSAvLyBBY2NlcHQgSlNPTiBzdHJpbmdcblx0XHRcdDogZGF0YTsgICAgICAgICAgICAvLyBvciBvYmplY3QvYXJyYXlcblx0XHR2YXIgaSwgaiwgIGwsIG0sIHByb3AsXG5cdFx0XHRvYiA9IGRhdGEsXG5cdFx0XHRhcnIgPSBbXTtcblxuXHRcdGlmICgkaXNBcnJheShkYXRhKSkge1xuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgW107XG5cdFx0XHRsID0gZGF0YS5sZW5ndGg7XG5cdFx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdFx0YXJyLnB1c2godGhpcy5tYXAoZGF0YVtpXSkpO1xuXHRcdFx0fVxuXHRcdFx0YXJyLl9pcyA9IG5hbWU7XG5cdFx0XHRhcnIudW5tYXAgPSB1bm1hcDtcblx0XHRcdGFyci5tZXJnZSA9IG1lcmdlO1xuXHRcdFx0cmV0dXJuIGFycjtcblx0XHR9XG5cblx0XHRpZiAoZGF0YSkge1xuXHRcdFx0aXRlcmF0ZShkYXRhLCBmdW5jdGlvbihvYiwgdmlld01vZGVsKSB7XG5cdFx0XHRcdGlmICh2aWV3TW9kZWwpIHsgLy8gSXRlcmF0ZSB0byBidWlsZCBnZXR0ZXJzIGFyZyBhcnJheSAodmFsdWUsIG9yIG1hcHBlZCB2YWx1ZSlcblx0XHRcdFx0XHRvYiA9IHZpZXdNb2RlbC5tYXAob2IpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFyci5wdXNoKG9iKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRvYiA9IHRoaXMuYXBwbHkodGhpcywgYXJyKTsgLy8gSW5zYW50aWF0ZSB0aGlzIFZpZXcgTW9kZWwsIHBhc3NpbmcgZ2V0dGVycyBhcmdzIGFycmF5IHRvIGNvbnN0cnVjdG9yXG5cdFx0XHRmb3IgKHByb3AgaW4gZGF0YSkgeyAvLyBDb3B5IG92ZXIgYW55IG90aGVyIHByb3BlcnRpZXMuIHRoYXQgYXJlIG5vdCBnZXQvc2V0IHByb3BlcnRpZXNcblx0XHRcdFx0aWYgKHByb3AgIT09ICRleHBhbmRvICAmJiAhZ2V0dGVyTmFtZXNbcHJvcF0pIHtcblx0XHRcdFx0XHRvYltwcm9wXSA9IGRhdGFbcHJvcF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9iO1xuXHR9XG5cblx0ZnVuY3Rpb24gbWVyZ2UoZGF0YSkge1xuXHRcdGRhdGEgPSBkYXRhICsgXCJcIiA9PT0gZGF0YVxuXHRcdFx0PyBKU09OLnBhcnNlKGRhdGEpIC8vIEFjY2VwdCBKU09OIHN0cmluZ1xuXHRcdFx0OiBkYXRhOyAgICAgICAgICAgIC8vIG9yIG9iamVjdC9hcnJheVxuXHRcdHZhciBpLCBqLCBsLCBtLCBwcm9wLCBtb2QsIGZvdW5kLCBhc3NpZ25lZCwgb2IsIG5ld01vZEFycixcblx0XHRcdG1vZGVsID0gdGhpcztcblxuXHRcdGlmICgkaXNBcnJheShtb2RlbCkpIHtcblx0XHRcdGFzc2lnbmVkID0ge307XG5cdFx0XHRuZXdNb2RBcnIgPSBbXTtcblx0XHRcdGwgPSBkYXRhLmxlbmd0aDtcblx0XHRcdG0gPSBtb2RlbC5sZW5ndGg7XG5cdFx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdFx0b2IgPSBkYXRhW2ldO1xuXHRcdFx0XHRmb3VuZCA9IGZhbHNlO1xuXHRcdFx0XHRmb3IgKGo9MDsgajxtICYmICFmb3VuZDsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKGFzc2lnbmVkW2pdKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kID0gbW9kZWxbal07XG5cblx0XHRcdFx0XHRpZiAoaWQpIHtcblx0XHRcdFx0XHRcdGFzc2lnbmVkW2pdID0gZm91bmQgPSBpZCArIFwiXCIgPT09IGlkXG5cdFx0XHRcdFx0XHQ/IChvYltpZF0gJiYgKGdldHRlck5hbWVzW2lkXSA/IG1vZFtpZF0oKSA6IG1vZFtpZF0pID09PSBvYltpZF0pXG5cdFx0XHRcdFx0XHQ6IGlkKG1vZCwgb2IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZm91bmQpIHtcblx0XHRcdFx0XHRtb2QubWVyZ2Uob2IpO1xuXHRcdFx0XHRcdG5ld01vZEFyci5wdXNoKG1vZCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bmV3TW9kQXJyLnB1c2godm0ubWFwKG9iKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHQkb2JzZXJ2YWJsZShtb2RlbCkucmVmcmVzaChuZXdNb2RBcnIsIHRydWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kZWwuc3BsaWNlLmFwcGx5KG1vZGVsLCBbMCwgbW9kZWwubGVuZ3RoXS5jb25jYXQobmV3TW9kQXJyKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGl0ZXJhdGUoZGF0YSwgZnVuY3Rpb24ob2IsIHZpZXdNb2RlbCwgZ2V0dGVyKSB7XG5cdFx0XHRpZiAodmlld01vZGVsKSB7XG5cdFx0XHRcdG1vZGVsW2dldHRlcl0oKS5tZXJnZShvYik7IC8vIFVwZGF0ZSB0eXBlZCBwcm9wZXJ0eVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kZWxbZ2V0dGVyXShvYik7IC8vIFVwZGF0ZSBub24tdHlwZWQgcHJvcGVydHlcblx0XHRcdH1cblx0XHR9KTtcblx0XHRmb3IgKHByb3AgaW4gZGF0YSkge1xuXHRcdFx0aWYgKHByb3AgIT09ICRleHBhbmRvICYmICFnZXR0ZXJOYW1lc1twcm9wXSkge1xuXHRcdFx0XHRtb2RlbFtwcm9wXSA9IGRhdGFbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gdW5tYXAoKSB7XG5cdFx0dmFyIG9iLCBwcm9wLCBpLCBsLCBnZXR0ZXJUeXBlLCBhcnIsIHZhbHVlLFxuXHRcdFx0bW9kZWwgPSB0aGlzO1xuXG5cdFx0aWYgKCRpc0FycmF5KG1vZGVsKSkge1xuXHRcdFx0cmV0dXJuIHVubWFwQXJyYXkobW9kZWwpO1xuXHRcdH1cblx0XHRvYiA9IHt9O1xuXHRcdGwgPSBnZXR0ZXJzLmxlbmd0aDtcblx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdHByb3AgPSBnZXR0ZXJzW2ldO1xuXHRcdFx0Z2V0dGVyVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGlmIChwcm9wICsgXCJcIiAhPT0gcHJvcCkge1xuXHRcdFx0XHRnZXR0ZXJUeXBlID0gcHJvcDtcblx0XHRcdFx0cHJvcCA9IGdldHRlclR5cGUuZ2V0dGVyO1xuXHRcdFx0fVxuXHRcdFx0dmFsdWUgPSBtb2RlbFtwcm9wXSgpO1xuXHRcdFx0b2JbcHJvcF0gPSBnZXR0ZXJUeXBlICYmIHZhbHVlICYmIHZpZXdNb2RlbHNbZ2V0dGVyVHlwZS50eXBlXVxuXHRcdFx0XHQ/ICRpc0FycmF5KHZhbHVlKVxuXHRcdFx0XHRcdD8gdW5tYXBBcnJheSh2YWx1ZSlcblx0XHRcdFx0XHQ6IHZhbHVlLnVubWFwKClcblx0XHRcdFx0OiB2YWx1ZTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wIGluIG1vZGVsKSB7XG5cdFx0XHRpZiAocHJvcCAhPT0gXCJfaXNcIiAmJiAhZ2V0dGVyTmFtZXNbcHJvcF0gJiYgcHJvcCAhPT0gJGV4cGFuZG8gICYmIChwcm9wLmNoYXJBdCgwKSAhPT0gXCJfXCIgfHwgIWdldHRlck5hbWVzW3Byb3Auc2xpY2UoMSldKSAmJiAhJC5pc0Z1bmN0aW9uKG1vZGVsW3Byb3BdKSkge1xuXHRcdFx0XHRvYltwcm9wXSA9IG1vZGVsW3Byb3BdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb2I7XG5cdH1cblxuXHRHZXROZXcucHJvdG90eXBlID0gcHJvdG87XG5cblx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0KGZ1bmN0aW9uKGdldHRlcikge1xuXHRcdFx0Z2V0dGVyID0gZ2V0dGVyLmdldHRlciB8fCBnZXR0ZXI7XG5cdFx0XHRnZXR0ZXJOYW1lc1tnZXR0ZXJdID0gaSsxO1xuXHRcdFx0dmFyIHByaXZGaWVsZCA9IFwiX1wiICsgZ2V0dGVyO1xuXG5cdFx0XHRhcmdzICs9IChhcmdzID8gXCIsXCIgOiBcIlwiKSArIGdldHRlcjtcblx0XHRcdGJvZHkgKz0gXCJ0aGlzLlwiICsgcHJpdkZpZWxkICsgXCIgPSBcIiArIGdldHRlciArIFwiO1xcblwiO1xuXHRcdFx0cHJvdG9bZ2V0dGVyXSA9IHByb3RvW2dldHRlcl0gfHwgZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzW3ByaXZGaWVsZF07IC8vIElmIHRoZXJlIGlzIG5vIGFyZ3VtZW50LCB1c2UgYXMgYSBnZXR0ZXJcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoJG9ic2VydmFibGUpIHtcblx0XHRcdFx0XHQkb2JzZXJ2YWJsZSh0aGlzKS5zZXRQcm9wZXJ0eShnZXR0ZXIsIHZhbCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpc1twcml2RmllbGRdID0gdmFsO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoJG9ic2VydmFibGUpIHtcblx0XHRcdFx0cHJvdG9bZ2V0dGVyXS5zZXQgPSBwcm90b1tnZXR0ZXJdLnNldCB8fCBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0XHR0aGlzW3ByaXZGaWVsZF0gPSB2YWw7IC8vIFNldHRlciBjYWxsZWQgYnkgb2JzZXJ2YWJsZSBwcm9wZXJ0eSBjaGFuZ2Vcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9KShnZXR0ZXJzW2ldKTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yID0gbmV3IEZ1bmN0aW9uKGFyZ3MsIGJvZHkuc2xpY2UoMCwgLTEpKTtcblx0Y29uc3RydWN0b3IucHJvdG90eXBlID0gcHJvdG87XG5cdHByb3RvLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG5cblx0dm0ubWFwID0gbWFwO1xuXHR2bS5nZXR0ZXJzID0gZ2V0dGVycztcblx0dm0uZXh0ZW5kID0gZXh0ZW5kO1xuXHR2bS5pZCA9IGlkO1xuXHRyZXR1cm4gdm07XG59XG5cbmZ1bmN0aW9uIHRtcGxPYmplY3QobWFya3VwLCBvcHRpb25zKSB7XG5cdC8vIFRlbXBsYXRlIG9iamVjdCBjb25zdHJ1Y3RvclxuXHR2YXIgaHRtbFRhZyxcblx0XHR3cmFwTWFwID0gJHN1YlNldHRpbmdzQWR2YW5jZWQuX3dtIHx8IHt9LCAvLyBPbmx5IHVzZWQgaW4gSnNWaWV3cy4gT3RoZXJ3aXNlIGVtcHR5OiB7fVxuXHRcdHRtcGwgPSAkZXh0ZW5kKFxuXHRcdFx0e1xuXHRcdFx0XHR0bXBsczogW10sXG5cdFx0XHRcdGxpbmtzOiB7fSwgLy8gQ29tcGlsZWQgZnVuY3Rpb25zIGZvciBsaW5rIGV4cHJlc3Npb25zXG5cdFx0XHRcdGJuZHM6IFtdLFxuXHRcdFx0XHRfaXM6IFwidGVtcGxhdGVcIixcblx0XHRcdFx0cmVuZGVyOiByZW5kZXJDb250ZW50XG5cdFx0XHR9LFxuXHRcdFx0b3B0aW9uc1xuXHRcdCk7XG5cblx0dG1wbC5tYXJrdXAgPSBtYXJrdXA7XG5cdGlmICghb3B0aW9ucy5odG1sVGFnKSB7XG5cdFx0Ly8gU2V0IHRtcGwudGFnIHRvIHRoZSB0b3AtbGV2ZWwgSFRNTCB0YWcgdXNlZCBpbiB0aGUgdGVtcGxhdGUsIGlmIGFueS4uLlxuXHRcdGh0bWxUYWcgPSByRmlyc3RFbGVtLmV4ZWMobWFya3VwKTtcblx0XHR0bXBsLmh0bWxUYWcgPSBodG1sVGFnID8gaHRtbFRhZ1sxXS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcblx0fVxuXHRodG1sVGFnID0gd3JhcE1hcFt0bXBsLmh0bWxUYWddO1xuXHRpZiAoaHRtbFRhZyAmJiBodG1sVGFnICE9PSB3cmFwTWFwLmRpdikge1xuXHRcdC8vIFdoZW4gdXNpbmcgSnNWaWV3cywgd2UgdHJpbSB0ZW1wbGF0ZXMgd2hpY2ggYXJlIGluc2VydGVkIGludG8gSFRNTCBjb250ZXh0cyB3aGVyZSB0ZXh0IG5vZGVzIGFyZSBub3QgcmVuZGVyZWQgKGkuZS4gbm90ICdQaHJhc2luZyBDb250ZW50JykuXG5cdFx0Ly8gQ3VycmVudGx5IG5vdCB0cmltbWVkIGZvciA8bGk+IHRhZy4gKE5vdCB3b3J0aCBhZGRpbmcgcGVyZiBjb3N0KVxuXHRcdHRtcGwubWFya3VwID0gJC50cmltKHRtcGwubWFya3VwKTtcblx0fVxuXG5cdHJldHVybiB0bXBsO1xufVxuXG4vLz09PT09PT09PT09PT09XG4vLyByZWdpc3RlclN0b3JlXG4vLz09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU3RvcmUoc3RvcmVOYW1lLCBzdG9yZVNldHRpbmdzKSB7XG5cblx0ZnVuY3Rpb24gdGhlU3RvcmUobmFtZSwgaXRlbSwgcGFyZW50VG1wbCkge1xuXHRcdC8vIFRoZSBzdG9yZSBpcyBhbHNvIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGFkZCBpdGVtcyB0byB0aGUgc3RvcmUuIGUuZy4gJC50ZW1wbGF0ZXMsIG9yICQudmlld3MudGFnc1xuXG5cdFx0Ly8gRm9yIHN0b3JlIG9mIG5hbWUgJ3RoaW5nJywgQ2FsbCBhczpcblx0XHQvLyAgICAkLnZpZXdzLnRoaW5ncyhpdGVtc1ssIHBhcmVudFRtcGxdKSxcblx0XHQvLyBvciAkLnZpZXdzLnRoaW5ncyhuYW1lLCBpdGVtWywgcGFyZW50VG1wbF0pXG5cblx0XHR2YXIgb25TdG9yZSwgY29tcGlsZSwgaXRlbU5hbWUsIHRoaXNTdG9yZTtcblx0XHRpZiAobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gT0JKRUNUICYmICFuYW1lLm5vZGVUeXBlICYmICFuYW1lLm1hcmt1cCAmJiAhbmFtZS5nZXRUZ3QgJiYgIShzdG9yZU5hbWUgPT09IFwidmlld01vZGVsXCIgJiYgbmFtZS5nZXR0ZXJzIHx8IG5hbWUuZXh0ZW5kKSkge1xuXHRcdFx0Ly8gQ2FsbCB0byAkLnZpZXdzLnRoaW5ncyhpdGVtc1ssIHBhcmVudFRtcGxdKSxcblxuXHRcdFx0Ly8gQWRkaW5nIGl0ZW1zIHRvIHRoZSBzdG9yZVxuXHRcdFx0Ly8gSWYgbmFtZSBpcyBhIGhhc2gsIHRoZW4gaXRlbSBpcyBwYXJlbnRUbXBsLiBJdGVyYXRlIG92ZXIgaGFzaCBhbmQgY2FsbCBzdG9yZSBmb3Iga2V5LlxuXHRcdFx0Zm9yIChpdGVtTmFtZSBpbiBuYW1lKSB7XG5cdFx0XHRcdHRoZVN0b3JlKGl0ZW1OYW1lLCBuYW1lW2l0ZW1OYW1lXSwgaXRlbSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaXRlbSB8fCAkdmlld3M7XG5cdFx0fVxuXHRcdC8vIEFkZGluZyBhIHNpbmdsZSB1bm5hbWVkIGl0ZW0gdG8gdGhlIHN0b3JlXG5cdFx0aWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aXRlbSA9IG5hbWU7XG5cdFx0XHRuYW1lID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAobmFtZSAmJiBcIlwiICsgbmFtZSAhPT0gbmFtZSkgeyAvLyBuYW1lIG11c3QgYmUgYSBzdHJpbmdcblx0XHRcdHBhcmVudFRtcGwgPSBpdGVtO1xuXHRcdFx0aXRlbSA9IG5hbWU7XG5cdFx0XHRuYW1lID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0aGlzU3RvcmUgPSBwYXJlbnRUbXBsXG5cdFx0XHQ/IHN0b3JlTmFtZSA9PT0gXCJ2aWV3TW9kZWxcIlxuXHRcdFx0XHQ/IHBhcmVudFRtcGxcblx0XHRcdFx0OiAocGFyZW50VG1wbFtzdG9yZU5hbWVzXSA9IHBhcmVudFRtcGxbc3RvcmVOYW1lc10gfHwge30pXG5cdFx0XHQ6IHRoZVN0b3JlO1xuXHRcdGNvbXBpbGUgPSBzdG9yZVNldHRpbmdzLmNvbXBpbGU7XG5cdFx0aWYgKGl0ZW0gPT09IG51bGwpIHtcblx0XHRcdC8vIElmIGl0ZW0gaXMgbnVsbCwgZGVsZXRlIHRoaXMgZW50cnlcblx0XHRcdGlmIChuYW1lKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzU3RvcmVbbmFtZV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGl0ZW0gPSBjb21waWxlID8gY29tcGlsZS5jYWxsKHRoaXNTdG9yZSwgbmFtZSwgaXRlbSwgcGFyZW50VG1wbCwgMCkgOiBpdGVtO1xuXHRcdFx0aWYgKG5hbWUpIHtcblx0XHRcdFx0dGhpc1N0b3JlW25hbWVdID0gaXRlbTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNvbXBpbGUgJiYgaXRlbSkge1xuXHRcdFx0aXRlbS5faXMgPSBzdG9yZU5hbWU7IC8vIE9ubHkgZG8gdGhpcyBmb3IgY29tcGlsZWQgb2JqZWN0cyAodGFncywgdGVtcGxhdGVzLi4uKVxuXHRcdH1cblx0XHRpZiAoaXRlbSAmJiAob25TdG9yZSA9ICRzdWIub25TdG9yZVtzdG9yZU5hbWVdKSkge1xuXHRcdFx0Ly8gZS5nLiBKc1ZpZXdzIGludGVncmF0aW9uXG5cdFx0XHRvblN0b3JlKG5hbWUsIGl0ZW0sIGNvbXBpbGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gaXRlbTtcblx0fVxuXG5cdHZhciBzdG9yZU5hbWVzID0gc3RvcmVOYW1lICsgXCJzXCI7XG5cblx0JHZpZXdzW3N0b3JlTmFtZXNdID0gdGhlU3RvcmU7XG59XG5cbmZ1bmN0aW9uIGFkZFNldHRpbmcoc3QpIHtcblx0JHZpZXdzU2V0dGluZ3Nbc3RdID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuXHRcdFx0PyAoJHN1YlNldHRpbmdzW3N0XSA9IHZhbHVlLCAkdmlld3NTZXR0aW5ncylcblx0XHRcdDogJHN1YlNldHRpbmdzW3N0XTtcblx0fTtcbn1cblxuLy89PT09PT09PT1cbi8vIGRhdGFNYXBcbi8vPT09PT09PT09XG5cbmZ1bmN0aW9uIGRhdGFNYXAobWFwRGVmKSB7XG5cdGZ1bmN0aW9uIE1hcChzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHR0aGlzLnRndCA9IG1hcERlZi5nZXRUZ3Qoc291cmNlLCBvcHRpb25zKTtcblx0fVxuXG5cdGlmICgkaXNGdW5jdGlvbihtYXBEZWYpKSB7XG5cdFx0Ly8gU2ltcGxlIG1hcCBkZWNsYXJlZCBhcyBmdW5jdGlvblxuXHRcdG1hcERlZiA9IHtcblx0XHRcdGdldFRndDogbWFwRGVmXG5cdFx0fTtcblx0fVxuXG5cdGlmIChtYXBEZWYuYmFzZU1hcCkge1xuXHRcdG1hcERlZiA9ICRleHRlbmQoJGV4dGVuZCh7fSwgbWFwRGVmLmJhc2VNYXApLCBtYXBEZWYpO1xuXHR9XG5cblx0bWFwRGVmLm1hcCA9IGZ1bmN0aW9uKHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdHJldHVybiBuZXcgTWFwKHNvdXJjZSwgb3B0aW9ucyk7XG5cdH07XG5cdHJldHVybiBtYXBEZWY7XG59XG5cbi8vPT09PT09PT09PT09PT1cbi8vIHJlbmRlckNvbnRlbnRcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVuZGVyQ29udGVudChkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50Vmlldywga2V5LCBvblJlbmRlcikge1xuXHR2YXIgaSwgbCwgdGFnLCB0bXBsLCB0YWdDdHgsIGlzVG9wUmVuZGVyQ2FsbCwgcHJldkRhdGEsIHByZXZJbmRleCxcblx0XHR2aWV3ID0gcGFyZW50Vmlldyxcblx0XHRyZXN1bHQgPSBcIlwiO1xuXG5cdGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG5cdFx0bm9JdGVyYXRpb24gPSBjb250ZXh0OyAvLyBwYXNzaW5nIGJvb2xlYW4gYXMgc2Vjb25kIHBhcmFtIC0gbm9JdGVyYXRpb25cblx0XHRjb250ZXh0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSBPQkpFQ1QpIHtcblx0XHRjb250ZXh0ID0gdW5kZWZpbmVkOyAvLyBjb250ZXh0IG11c3QgYmUgYSBib29sZWFuIChub0l0ZXJhdGlvbikgb3IgYSBwbGFpbiBvYmplY3Rcblx0fVxuXG5cdGlmICh0YWcgPSB0aGlzLnRhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBjYWxsIGZyb20gcmVuZGVyVGFnIG9yIHRhZ0N0eC5yZW5kZXIoLi4uKVxuXHRcdHRhZ0N0eCA9IHRoaXM7XG5cdFx0dmlldyA9IHZpZXcgfHwgdGFnQ3R4LnZpZXc7XG5cdFx0dG1wbCA9IHZpZXcuZ2V0VG1wbCh0YWcudGVtcGxhdGUgfHwgdGFnQ3R4LnRtcGwpO1xuXHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0ZGF0YSA9IHZpZXc7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZS5yZW5kZXIoLi4uKSBjYWxsXG5cdFx0dG1wbCA9IHRoaXM7XG5cdH1cblxuXHRpZiAodG1wbCkge1xuXHRcdGlmICghcGFyZW50VmlldyAmJiBkYXRhICYmIGRhdGEuX2lzID09PSBcInZpZXdcIikge1xuXHRcdFx0dmlldyA9IGRhdGE7IC8vIFdoZW4gcGFzc2luZyBpbiBhIHZpZXcgdG8gcmVuZGVyIG9yIGxpbmsgKGFuZCBub3QgcGFzc2luZyBpbiBhIHBhcmVudCB2aWV3KSB1c2UgdGhlIHBhc3NlZC1pbiB2aWV3IGFzIHBhcmVudFZpZXdcblx0XHR9XG5cblx0XHRpZiAodmlldykge1xuXHRcdFx0aWYgKGRhdGEgPT09IHZpZXcpIHtcblx0XHRcdFx0Ly8gSW5oZXJpdCB0aGUgZGF0YSBmcm9tIHRoZSBwYXJlbnQgdmlldy5cblx0XHRcdFx0Ly8gVGhpcyBtYXkgYmUgdGhlIGNvbnRlbnRzIG9mIGFuIHt7aWZ9fSBibG9ja1xuXHRcdFx0XHRkYXRhID0gdmlldy5kYXRhO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlzVG9wUmVuZGVyQ2FsbCA9ICF2aWV3O1xuXHRcdGlzUmVuZGVyQ2FsbCA9IGlzUmVuZGVyQ2FsbCB8fCBpc1RvcFJlbmRlckNhbGw7XG5cdFx0aWYgKCF2aWV3KSB7XG5cdFx0XHQoY29udGV4dCA9IGNvbnRleHQgfHwge30pLnJvb3QgPSBkYXRhOyAvLyBQcm92aWRlIH5yb290IGFzIHNob3J0Y3V0IHRvIHRvcC1sZXZlbCBkYXRhLlxuXHRcdH1cblx0XHRpZiAoIWlzUmVuZGVyQ2FsbCB8fCAkc3ViU2V0dGluZ3NBZHZhbmNlZC51c2VWaWV3cyB8fCB0bXBsLnVzZVZpZXdzIHx8IHZpZXcgJiYgdmlldyAhPT0gdG9wVmlldykge1xuXHRcdFx0cmVzdWx0ID0gcmVuZGVyV2l0aFZpZXdzKHRtcGwsIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCB2aWV3LCBrZXksIG9uUmVuZGVyLCB0YWcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodmlldykgeyAvLyBJbiBhIGJsb2NrXG5cdFx0XHRcdHByZXZEYXRhID0gdmlldy5kYXRhO1xuXHRcdFx0XHRwcmV2SW5kZXggPSB2aWV3LmluZGV4O1xuXHRcdFx0XHR2aWV3LmluZGV4ID0gaW5kZXhTdHI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2aWV3ID0gdG9wVmlldztcblx0XHRcdFx0dmlldy5kYXRhID0gZGF0YTtcblx0XHRcdFx0dmlldy5jdHggPSBjb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0aWYgKCRpc0FycmF5KGRhdGEpICYmICFub0l0ZXJhdGlvbikge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciB0aGUgYXJyYXksIHdob3NlIGNoaWxkIHZpZXdzIGNvcnJlc3BvbmQgdG8gZWFjaCBkYXRhIGl0ZW0uIChOb3RlOiBpZiBrZXkgYW5kIHBhcmVudFZpZXcgYXJlIHBhc3NlZCBpblxuXHRcdFx0XHQvLyBhbG9uZyB3aXRoIHBhcmVudCB2aWV3LCB0cmVhdCBhcyBpbnNlcnQgLWUuZy4gZnJvbSB2aWV3LmFkZFZpZXdzIC0gc28gcGFyZW50VmlldyBpcyBhbHJlYWR5IHRoZSB2aWV3IGl0ZW0gZm9yIGFycmF5KVxuXHRcdFx0XHRmb3IgKGkgPSAwLCBsID0gZGF0YS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHR2aWV3LmluZGV4ID0gaTtcblx0XHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhW2ldO1xuXHRcdFx0XHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGFbaV0sIHZpZXcsICRzdWIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhO1xuXHRcdFx0XHRyZXN1bHQgKz0gdG1wbC5mbihkYXRhLCB2aWV3LCAkc3ViKTtcblx0XHRcdH1cblx0XHRcdHZpZXcuZGF0YSA9IHByZXZEYXRhO1xuXHRcdFx0dmlldy5pbmRleCA9IHByZXZJbmRleDtcblx0XHR9XG5cdFx0aWYgKGlzVG9wUmVuZGVyQ2FsbCkge1xuXHRcdFx0aXNSZW5kZXJDYWxsID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoVmlld3ModG1wbCwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHZpZXcsIGtleSwgb25SZW5kZXIsIHRhZykge1xuXHRmdW5jdGlvbiBzZXRJdGVtVmFyKGl0ZW0pIHtcblx0XHQvLyBXaGVuIGl0ZW1WYXIgaXMgc3BlY2lmaWVkLCBzZXQgbW9kaWZpZWQgY3R4IHdpdGggdXNlci1uYW1lZCB+aXRlbVxuXHRcdG5ld0N0eCA9ICRleHRlbmQoe30sIGNvbnRleHQpO1xuXHRcdG5ld0N0eFtpdGVtVmFyXSA9IGl0ZW07XG5cdH1cblxuXHQvLyBSZW5kZXIgdGVtcGxhdGUgYWdhaW5zdCBkYXRhIGFzIGEgdHJlZSBvZiBzdWJ2aWV3cyAobmVzdGVkIHJlbmRlcmVkIHRlbXBsYXRlIGluc3RhbmNlcyksIG9yIGFzIGEgc3RyaW5nICh0b3AtbGV2ZWwgdGVtcGxhdGUpLlxuXHQvLyBJZiB0aGUgZGF0YSBpcyB0aGUgcGFyZW50IHZpZXcsIHRyZWF0IGFzIG5vSXRlcmF0aW9uLCByZS1yZW5kZXIgd2l0aCB0aGUgc2FtZSBkYXRhIGNvbnRleHQuXG5cdHZhciBpLCBsLCBuZXdWaWV3LCBjaGlsZFZpZXcsIGl0ZW1SZXN1bHQsIHN3YXBDb250ZW50LCBjb250ZW50VG1wbCwgb3V0ZXJPblJlbmRlciwgdG1wbE5hbWUsIGl0ZW1WYXIsIG5ld0N0eCwgdGFnQ3R4LFxuXHRcdHJlc3VsdCA9IFwiXCI7XG5cblx0aWYgKHRhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBjYWxsIGZyb20gcmVuZGVyVGFnIG9yIHRhZ0N0eC5yZW5kZXIoLi4uKVxuXHRcdHRtcGxOYW1lID0gdGFnLnRhZ05hbWU7XG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eDtcblx0XHRjb250ZXh0ID0gY29udGV4dCA/IGV4dGVuZEN0eChjb250ZXh0LCB0YWcuY3R4KSA6IHRhZy5jdHg7XG5cblx0XHRpZiAodG1wbCA9PT0gdmlldy5jb250ZW50KSB7IC8vIHt7eHh4IHRtcGw9I2NvbnRlbnR9fVxuXHRcdFx0Y29udGVudFRtcGwgPSB0bXBsICE9PSB2aWV3LmN0eC5fd3JwIC8vIFdlIGFyZSByZW5kZXJpbmcgdGhlICNjb250ZW50XG5cdFx0XHRcdD8gdmlldy5jdHguX3dycCAvLyAjY29udGVudCB3YXMgdGhlIHRhZ0N0eC5wcm9wcy50bXBsIHdyYXBwZXIgb2YgdGhlIGJsb2NrIGNvbnRlbnQgLSBzbyB3aXRoaW4gdGhpcyB2aWV3LCAjY29udGVudCB3aWxsIG5vdyBiZSB0aGUgdmlldy5jdHguX3dycCBibG9jayBjb250ZW50XG5cdFx0XHRcdDogdW5kZWZpbmVkOyAvLyAjY29udGVudCB3YXMgdGhlIHZpZXcuY3R4Ll93cnAgYmxvY2sgY29udGVudCAtIHNvIHdpdGhpbiB0aGlzIHZpZXcsIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgI2NvbnRlbnQgdG8gd3JhcC5cblx0XHR9IGVsc2UgaWYgKHRtcGwgIT09IHRhZ0N0eC5jb250ZW50KSB7XG5cdFx0XHRpZiAodG1wbCA9PT0gdGFnLnRlbXBsYXRlKSB7IC8vIFJlbmRlcmluZyB7e3RhZ319IHRhZy50ZW1wbGF0ZSwgcmVwbGFjaW5nIGJsb2NrIGNvbnRlbnQuXG5cdFx0XHRcdGNvbnRlbnRUbXBsID0gdGFnQ3R4LnRtcGw7IC8vIFNldCAjY29udGVudCB0byBibG9jayBjb250ZW50IChvciB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgaWYgdGFnQ3R4LnByb3BzLnRtcGwgaXMgc2V0KVxuXHRcdFx0XHRjb250ZXh0Ll93cnAgPSB0YWdDdHguY29udGVudDsgLy8gUGFzcyB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgdG8gbmVzdGVkIHZpZXdzXG5cdFx0XHR9IGVsc2UgeyAvLyBSZW5kZXJpbmcgdGFnQ3R4LnByb3BzLnRtcGwgd3JhcHBlclxuXHRcdFx0XHRjb250ZW50VG1wbCA9IHRhZ0N0eC5jb250ZW50IHx8IHZpZXcuY29udGVudDsgLy8gU2V0ICNjb250ZW50IHRvIHdyYXBwZWQgYmxvY2sgY29udGVudFxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250ZW50VG1wbCA9IHZpZXcuY29udGVudDsgLy8gTmVzdGVkIHZpZXdzIGluaGVyaXQgc2FtZSB3cmFwcGVkICNjb250ZW50IHByb3BlcnR5XG5cdFx0fVxuXG5cdFx0aWYgKHRhZ0N0eC5wcm9wcy5saW5rID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gbGluaz1mYWxzZSBzZXR0aW5nIG9uIGJsb2NrIHRhZ1xuXHRcdFx0Ly8gV2Ugd2lsbCBvdmVycmlkZSBpbmhlcml0ZWQgdmFsdWUgb2YgbGluayBieSB0aGUgZXhwbGljaXQgc2V0dGluZyBsaW5rPWZhbHNlIHRha2VuIGZyb20gcHJvcHNcblx0XHRcdC8vIFRoZSBjaGlsZCB2aWV3cyBvZiBhbiB1bmxpbmtlZCB2aWV3IGFyZSBhbHNvIHVubGlua2VkLiBTbyBzZXR0aW5nIGNoaWxkIGJhY2sgdG8gdHJ1ZSB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QuXG5cdFx0XHRjb250ZXh0ID0gY29udGV4dCB8fCB7fTtcblx0XHRcdGNvbnRleHQubGluayA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtVmFyID0gdGFnQ3R4LnByb3BzLml0ZW1WYXIpIHtcblx0XHRcdGlmIChpdGVtVmFyLmNoYXJBdCgwKSAhPT0gXCJ+XCIpIHtcblx0XHRcdFx0c3ludGF4RXJyb3IoXCJVc2UgaXRlbVZhcj0nfm15SXRlbSdcIik7XG5cdFx0XHR9XG5cdFx0XHRpdGVtVmFyID0gaXRlbVZhci5zbGljZSgxKTtcblx0XHR9XG5cdH1cblxuXHRpZiAodmlldykge1xuXHRcdG9uUmVuZGVyID0gb25SZW5kZXIgfHwgdmlldy5fLm9uUmVuZGVyO1xuXHRcdGNvbnRleHQgPSBleHRlbmRDdHgoY29udGV4dCwgdmlldy5jdHgpO1xuXHR9XG5cblx0aWYgKGtleSA9PT0gdHJ1ZSkge1xuXHRcdHN3YXBDb250ZW50ID0gdHJ1ZTtcblx0XHRrZXkgPSAwO1xuXHR9XG5cblx0Ly8gSWYgbGluaz09PWZhbHNlLCBkbyBub3QgY2FsbCBvblJlbmRlciwgc28gbm8gZGF0YS1saW5raW5nIG1hcmtlciBub2Rlc1xuXHRpZiAob25SZW5kZXIgJiYgKGNvbnRleHQgJiYgY29udGV4dC5saW5rID09PSBmYWxzZSB8fCB0YWcgJiYgdGFnLl8ubm9Wd3MpKSB7XG5cdFx0b25SZW5kZXIgPSB1bmRlZmluZWQ7XG5cdH1cblx0b3V0ZXJPblJlbmRlciA9IG9uUmVuZGVyO1xuXHRpZiAob25SZW5kZXIgPT09IHRydWUpIHtcblx0XHQvLyBVc2VkIGJ5IHZpZXcucmVmcmVzaCgpLiBEb24ndCBjcmVhdGUgYSBuZXcgd3JhcHBlciB2aWV3LlxuXHRcdG91dGVyT25SZW5kZXIgPSB1bmRlZmluZWQ7XG5cdFx0b25SZW5kZXIgPSB2aWV3Ll8ub25SZW5kZXI7XG5cdH1cblx0Ly8gU2V0IGFkZGl0aW9uYWwgY29udGV4dCBvbiB2aWV3cyBjcmVhdGVkIGhlcmUsIChhcyBtb2RpZmllZCBjb250ZXh0IGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQsIGFuZCB0byBiZSBpbmhlcml0ZWQgYnkgY2hpbGQgdmlld3MpXG5cdGNvbnRleHQgPSB0bXBsLmhlbHBlcnNcblx0XHQ/IGV4dGVuZEN0eCh0bXBsLmhlbHBlcnMsIGNvbnRleHQpXG5cdFx0OiBjb250ZXh0O1xuXG5cdG5ld0N0eCA9IGNvbnRleHQ7XG5cdGlmICgkaXNBcnJheShkYXRhKSAmJiAhbm9JdGVyYXRpb24pIHtcblx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciB0aGUgYXJyYXksIHdob3NlIGNoaWxkIHZpZXdzIGNvcnJlc3BvbmQgdG8gZWFjaCBkYXRhIGl0ZW0uIChOb3RlOiBpZiBrZXkgYW5kIHZpZXcgYXJlIHBhc3NlZCBpblxuXHRcdC8vIGFsb25nIHdpdGggcGFyZW50IHZpZXcsIHRyZWF0IGFzIGluc2VydCAtZS5nLiBmcm9tIHZpZXcuYWRkVmlld3MgLSBzbyB2aWV3IGlzIGFscmVhZHkgdGhlIHZpZXcgaXRlbSBmb3IgYXJyYXkpXG5cdFx0bmV3VmlldyA9IHN3YXBDb250ZW50XG5cdFx0XHQ/IHZpZXdcblx0XHRcdDogKGtleSAhPT0gdW5kZWZpbmVkICYmIHZpZXcpXG5cdFx0XHRcdHx8IG5ldyBWaWV3KGNvbnRleHQsIFwiYXJyYXlcIiwgdmlldywgZGF0YSwgdG1wbCwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpO1xuXHRcdGlmICh2aWV3ICYmIHZpZXcuXy51c2VLZXkpIHtcblx0XHRcdC8vIFBhcmVudCBpcyBub3QgYW4gJ2FycmF5IHZpZXcnXG5cdFx0XHRuZXdWaWV3Ll8uYm5kID0gIXRhZyB8fCB0YWcuXy5ibmQgJiYgdGFnOyAvLyBGb3IgYXJyYXkgdmlld3MgdGhhdCBhcmUgZGF0YSBib3VuZCBmb3IgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLCBzZXQgdGhlXG5cdFx0XHQvLyB2aWV3Ll8uYm5kIHByb3BlcnR5IHRvIHRydWUgZm9yIHRvcC1sZXZlbCBsaW5rKCkgb3IgZGF0YS1saW5rPVwie2Zvcn1cIiwgb3IgdG8gdGhlIHRhZyBpbnN0YW5jZSBmb3IgYSBkYXRhLWJvdW5kIHRhZywgZS5nLiB7Xntmb3IgLi4ufX1cblx0XHR9XG5cdFx0aWYgKGl0ZW1WYXIpIHtcblx0XHRcdG5ld1ZpZXcuaXQgPSBpdGVtVmFyO1xuXHRcdH1cblx0XHRpdGVtVmFyID0gbmV3Vmlldy5pdDtcblx0XHRmb3IgKGkgPSAwLCBsID0gZGF0YS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIGVhY2ggZGF0YSBpdGVtLlxuXHRcdFx0aWYgKGl0ZW1WYXIpIHtcblx0XHRcdFx0c2V0SXRlbVZhcihkYXRhW2ldKTsgLy8gdXNlIG1vZGlmaWVkIGN0eCB3aXRoIHVzZXItbmFtZWQgfml0ZW1cblx0XHRcdH1cblx0XHRcdGNoaWxkVmlldyA9IG5ldyBWaWV3KG5ld0N0eCwgXCJpdGVtXCIsIG5ld1ZpZXcsIGRhdGFbaV0sIHRtcGwsIChrZXkgfHwgMCkgKyBpLCBvblJlbmRlciwgbmV3Vmlldy5jb250ZW50KTtcblxuXHRcdFx0aXRlbVJlc3VsdCA9IHRtcGwuZm4oZGF0YVtpXSwgY2hpbGRWaWV3LCAkc3ViKTtcblx0XHRcdHJlc3VsdCArPSBuZXdWaWV3Ll8ub25SZW5kZXIgPyBuZXdWaWV3Ll8ub25SZW5kZXIoaXRlbVJlc3VsdCwgY2hpbGRWaWV3KSA6IGl0ZW1SZXN1bHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHNpbmdsZXRvbiBkYXRhIG9iamVjdC4gVGhlIHR5cGUgb2YgdGhlIHZpZXcgd2lsbCBiZSB0aGUgdGFnIG5hbWUsIGUuZy4gXCJpZlwiIG9yIFwibXlUYWdcIiBleGNlcHQgZm9yXG5cdFx0Ly8gXCJpdGVtXCIsIFwiYXJyYXlcIiBhbmQgXCJkYXRhXCIgdmlld3MuIEEgXCJkYXRhXCIgdmlldyBpcyBmcm9tIHByb2dyYW1tYXRpYyByZW5kZXIob2JqZWN0KSBhZ2FpbnN0IGEgJ3NpbmdsZXRvbicuXG5cdFx0aWYgKGl0ZW1WYXIpIHtcblx0XHRcdHNldEl0ZW1WYXIoZGF0YSk7XG5cdFx0fVxuXHRcdG5ld1ZpZXcgPSBzd2FwQ29udGVudCA/IHZpZXcgOiBuZXcgVmlldyhuZXdDdHgsIHRtcGxOYW1lIHx8IFwiZGF0YVwiLCB2aWV3LCBkYXRhLCB0bXBsLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCk7XG5cdFx0aWYgKHRhZyAmJiAhdGFnLmZsb3cpIHtcblx0XHRcdG5ld1ZpZXcudGFnID0gdGFnO1xuXHRcdFx0dGFnLnZpZXcgPSBuZXdWaWV3O1xuXHRcdH1cblx0XHRyZXN1bHQgKz0gdG1wbC5mbihkYXRhLCBuZXdWaWV3LCAkc3ViKTtcblx0fVxuXHRyZXR1cm4gb3V0ZXJPblJlbmRlciA/IG91dGVyT25SZW5kZXIocmVzdWx0LCBuZXdWaWV3KSA6IHJlc3VsdDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWxkIGFuZCBjb21waWxlIHRlbXBsYXRlXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBHZW5lcmF0ZSBhIHJldXNhYmxlIGZ1bmN0aW9uIHRoYXQgd2lsbCBzZXJ2ZSB0byByZW5kZXIgYSB0ZW1wbGF0ZSBhZ2FpbnN0IGRhdGFcbi8vIChDb21waWxlIEFTVCB0aGVuIGJ1aWxkIHRlbXBsYXRlIGZ1bmN0aW9uKVxuXG5mdW5jdGlvbiBvblJlbmRlckVycm9yKGUsIHZpZXcsIGZhbGxiYWNrKSB7XG5cdHZhciBtZXNzYWdlID0gZmFsbGJhY2sgIT09IHVuZGVmaW5lZFxuXHRcdD8gJGlzRnVuY3Rpb24oZmFsbGJhY2spXG5cdFx0XHQ/IGZhbGxiYWNrLmNhbGwodmlldy5kYXRhLCBlLCB2aWV3KVxuXHRcdFx0OiBmYWxsYmFjayB8fCBcIlwiXG5cdFx0OiBcIntFcnJvcjogXCIgKyBlLm1lc3NhZ2UgKyBcIn1cIjtcblxuXHRpZiAoJHN1YlNldHRpbmdzLm9uRXJyb3IgJiYgKGZhbGxiYWNrID0gJHN1YlNldHRpbmdzLm9uRXJyb3IuY2FsbCh2aWV3LmRhdGEsIGUsIGZhbGxiYWNrICYmIG1lc3NhZ2UsIHZpZXcpKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0bWVzc2FnZSA9IGZhbGxiYWNrOyAvLyBUaGVyZSBpcyBhIHNldHRpbmdzLmRlYnVnTW9kZShoYW5kbGVyKSBvbkVycm9yIG92ZXJyaWRlLiBDYWxsIGl0LCBhbmQgdXNlIHJldHVybiB2YWx1ZSAoaWYgYW55KSB0byByZXBsYWNlIG1lc3NhZ2Vcblx0fVxuXG5cdHJldHVybiB2aWV3ICYmICF2aWV3LmxpbmtDdHggPyAkY29udmVydGVycy5odG1sKG1lc3NhZ2UpIDogbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSkge1xuXHR0aHJvdyBuZXcgJHN1Yi5FcnIobWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHN5bnRheEVycm9yKG1lc3NhZ2UpIHtcblx0ZXJyb3IoXCJTeW50YXggZXJyb3JcXG5cIiArIG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiB0bXBsRm4obWFya3VwLCB0bXBsLCBpc0xpbmtFeHByLCBjb252ZXJ0QmFjaywgaGFzRWxzZSkge1xuXHQvLyBDb21waWxlIG1hcmt1cCB0byBBU1QgKGFidHJhY3Qgc3ludGF4IHRyZWUpIHRoZW4gYnVpbGQgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIGNvZGUgZnJvbSB0aGUgQVNUIG5vZGVzXG5cdC8vIFVzZWQgZm9yIGNvbXBpbGluZyB0ZW1wbGF0ZXMsIGFuZCBhbHNvIGJ5IEpzVmlld3MgdG8gYnVpbGQgZnVuY3Rpb25zIGZvciBkYXRhIGxpbmsgZXhwcmVzc2lvbnNcblxuXHQvLz09PT0gbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cdGZ1bmN0aW9uIHB1c2hwcmVjZWRpbmdDb250ZW50KHNoaWZ0KSB7XG5cdFx0c2hpZnQgLT0gbG9jO1xuXHRcdGlmIChzaGlmdCkge1xuXHRcdFx0Y29udGVudC5wdXNoKG1hcmt1cC5zdWJzdHIobG9jLCBzaGlmdCkucmVwbGFjZShyTmV3TGluZSwgXCJcXFxcblwiKSk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gYmxvY2tUYWdDaGVjayh0YWdOYW1lLCBibG9jaykge1xuXHRcdGlmICh0YWdOYW1lKSB7XG5cdFx0XHR0YWdOYW1lICs9ICd9fSc7XG5cdFx0XHQvL1x0XHRcdCd7e2luY2x1ZGV9fSBibG9jayBoYXMge3svZm9yfX0gd2l0aCBubyBvcGVuIHt7Zm9yfX0nXG5cdFx0XHRzeW50YXhFcnJvcigoXG5cdFx0XHRcdGJsb2NrXG5cdFx0XHRcdFx0PyAne3snICsgYmxvY2sgKyAnfX0gYmxvY2sgaGFzIHt7LycgKyB0YWdOYW1lICsgJyB3aXRob3V0IHt7JyArIHRhZ05hbWVcblx0XHRcdFx0XHQ6ICdVbm1hdGNoZWQgb3IgbWlzc2luZyB7ey8nICsgdGFnTmFtZSkgKyAnLCBpbiB0ZW1wbGF0ZTpcXG4nICsgbWFya3VwKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZVRhZyhhbGwsIGJpbmQsIHRhZ05hbWUsIGNvbnZlcnRlciwgY29sb24sIGh0bWwsIGNvZGVUYWcsIHBhcmFtcywgc2xhc2gsIGJpbmQyLCBjbG9zZUJsb2NrLCBpbmRleCkge1xuLypcblxuICAgICBiaW5kICAgICB0YWdOYW1lICAgICAgICAgY3Z0ICAgY2xuIGh0bWwgY29kZSAgICBwYXJhbXMgICAgICAgICAgICBzbGFzaCAgIGJpbmQyICAgICAgICAgY2xvc2VCbGsgIGNvbW1lbnRcbi8oPzp7KFxcXik/eyg/OihcXHcrKD89W1xcL1xcc31dKSl8KFxcdyspPyg6KXwoPil8KFxcKikpXFxzKigoPzpbXn1dfH0oPyF9KSkqPykoXFwvKT98eyhcXF4pP3soPzooPzpcXC8oXFx3KykpXFxzKnwhLS1bXFxzXFxTXSo/LS0pKX19L2dcblxuKD86XG4gIHsoXFxeKT97ICAgICAgICAgICAgYmluZFxuICAoPzpcbiAgICAoXFx3KyAgICAgICAgICAgICB0YWdOYW1lXG4gICAgICAoPz1bXFwvXFxzfV0pXG4gICAgKVxuICAgIHxcbiAgICAoXFx3Kyk/KDopICAgICAgICBjb252ZXJ0ZXIgY29sb25cbiAgICB8XG4gICAgKD4pICAgICAgICAgICAgICBodG1sXG4gICAgfFxuICAgIChcXCopICAgICAgICAgICAgIGNvZGVUYWdcbiAgKVxuICBcXHMqXG4gICggICAgICAgICAgICAgICAgICBwYXJhbXNcbiAgICAoPzpbXn1dfH0oPyF9KSkqP1xuICApXG4gIChcXC8pPyAgICAgICAgICAgICAgc2xhc2hcbiAgfFxuICB7KFxcXik/eyAgICAgICAgICAgIGJpbmQyXG4gICg/OlxuICAgICg/OlxcLyhcXHcrKSlcXHMqICAgY2xvc2VCbG9ja1xuICAgIHxcbiAgICAhLS1bXFxzXFxTXSo/LS0gICAgY29tbWVudFxuICApXG4pXG59fS9nXG5cbiovXG5cdFx0aWYgKGNvZGVUYWcgJiYgYmluZCB8fCBzbGFzaCAmJiAhdGFnTmFtZSB8fCBwYXJhbXMgJiYgcGFyYW1zLnNsaWNlKC0xKSA9PT0gXCI6XCIgfHwgYmluZDIpIHtcblx0XHRcdHN5bnRheEVycm9yKGFsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQnVpbGQgYWJzdHJhY3Qgc3ludGF4IHRyZWUgKEFTVCk6IFt0YWdOYW1lLCBjb252ZXJ0ZXIsIHBhcmFtcywgY29udGVudCwgaGFzaCwgYmluZGluZ3MsIGNvbnRlbnRNYXJrdXBdXG5cdFx0aWYgKGh0bWwpIHtcblx0XHRcdGNvbG9uID0gXCI6XCI7XG5cdFx0XHRjb252ZXJ0ZXIgPSBIVE1MO1xuXHRcdH1cblx0XHRzbGFzaCA9IHNsYXNoIHx8IGlzTGlua0V4cHIgJiYgIWhhc0Vsc2U7XG5cblx0XHR2YXIgcGF0aEJpbmRpbmdzID0gKGJpbmQgfHwgaXNMaW5rRXhwcikgJiYgW1tdXSxcblx0XHRcdHByb3BzID0gXCJcIixcblx0XHRcdGFyZ3MgPSBcIlwiLFxuXHRcdFx0Y3R4UHJvcHMgPSBcIlwiLFxuXHRcdFx0cGFyYW1zQXJncyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNQcm9wcyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNDdHhQcm9wcyA9IFwiXCIsXG5cdFx0XHRvbkVycm9yID0gXCJcIixcblx0XHRcdHVzZVRyaWdnZXIgPSBcIlwiLFxuXHRcdFx0Ly8gQmxvY2sgdGFnIGlmIG5vdCBzZWxmLWNsb3NpbmcgYW5kIG5vdCB7ezp9fSBvciB7ez59fSAoc3BlY2lhbCBjYXNlKSBhbmQgbm90IGEgZGF0YS1saW5rIGV4cHJlc3Npb25cblx0XHRcdGJsb2NrID0gIXNsYXNoICYmICFjb2xvbjtcblxuXHRcdC8vPT09PSBuZXN0ZWQgaGVscGVyIGZ1bmN0aW9uID09PT1cblx0XHR0YWdOYW1lID0gdGFnTmFtZSB8fCAocGFyYW1zID0gcGFyYW1zIHx8IFwiI2RhdGFcIiwgY29sb24pOyAvLyB7ezp9fSBpcyBlcXVpdmFsZW50IHRvIHt7OiNkYXRhfX1cblx0XHRwdXNocHJlY2VkaW5nQ29udGVudChpbmRleCk7XG5cdFx0bG9jID0gaW5kZXggKyBhbGwubGVuZ3RoOyAvLyBsb2NhdGlvbiBtYXJrZXIgLSBwYXJzZWQgdXAgdG8gaGVyZVxuXHRcdGlmIChjb2RlVGFnKSB7XG5cdFx0XHRpZiAoYWxsb3dDb2RlKSB7XG5cdFx0XHRcdGNvbnRlbnQucHVzaChbXCIqXCIsIFwiXFxuXCIgKyBwYXJhbXMucmVwbGFjZSgvXjovLCBcInJldCs9IFwiKS5yZXBsYWNlKHJVbmVzY2FwZVF1b3RlcywgXCIkMVwiKSArIFwiO1xcblwiXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0YWdOYW1lKSB7XG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCJlbHNlXCIpIHtcblx0XHRcdFx0aWYgKHJUZXN0RWxzZUlmLnRlc3QocGFyYW1zKSkge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKCdmb3IgXCJ7e2Vsc2UgaWYgZXhwcn19XCIgdXNlIFwie3tlbHNlIGV4cHJ9fVwiJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aEJpbmRpbmdzID0gY3VycmVudFs3XSAmJiBbW11dO1xuXHRcdFx0XHRjdXJyZW50WzhdID0gbWFya3VwLnN1YnN0cmluZyhjdXJyZW50WzhdLCBpbmRleCk7IC8vIGNvbnRlbnRNYXJrdXAgZm9yIGJsb2NrIHRhZ1xuXHRcdFx0XHRjdXJyZW50ID0gc3RhY2sucG9wKCk7XG5cdFx0XHRcdGNvbnRlbnQgPSBjdXJyZW50WzJdO1xuXHRcdFx0XHRibG9jayA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zKSB7XG5cdFx0XHRcdC8vIHJlbW92ZSBuZXdsaW5lcyBmcm9tIHRoZSBwYXJhbXMgc3RyaW5nLCB0byBhdm9pZCBjb21waWxlZCBjb2RlIGVycm9ycyBmb3IgdW50ZXJtaW5hdGVkIHN0cmluZ3Ncblx0XHRcdFx0cGFyc2VQYXJhbXMocGFyYW1zLnJlcGxhY2Uock5ld0xpbmUsIFwiIFwiKSwgcGF0aEJpbmRpbmdzLCB0bXBsKVxuXHRcdFx0XHRcdC5yZXBsYWNlKHJCdWlsZEhhc2gsIGZ1bmN0aW9uKGFsbCwgb25lcnJvciwgaXNDdHgsIGtleSwga2V5VG9rZW4sIGtleVZhbHVlLCBhcmcsIHBhcmFtKSB7XG5cdFx0XHRcdFx0XHRrZXkgPSBcIidcIiArIGtleVRva2VuICsgXCInOlwiO1xuXHRcdFx0XHRcdFx0aWYgKGFyZykge1xuXHRcdFx0XHRcdFx0XHRhcmdzICs9IGtleVZhbHVlICsgXCIsXCI7XG5cdFx0XHRcdFx0XHRcdHBhcmFtc0FyZ3MgKz0gXCInXCIgKyBwYXJhbSArIFwiJyxcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNDdHgpIHtcblx0XHRcdFx0XHRcdFx0Y3R4UHJvcHMgKz0ga2V5ICsgJ2ouX2NwKCcgKyBrZXlWYWx1ZSArICcsXCInICsgcGFyYW0gKyAnXCIsdmlldyksJztcblx0XHRcdFx0XHRcdFx0Ly8gQ29tcGlsZWQgY29kZSBmb3IgZXZhbHVhdGluZyB0YWdDdHggb24gYSB0YWcgd2lsbCBoYXZlOiBjdHg6eydmb28nOmouX2NwKGNvbXBpbGVkRXhwciwgXCJleHByXCIsIHZpZXcpfVxuXHRcdFx0XHRcdFx0XHRwYXJhbXNDdHhQcm9wcyArPSBrZXkgKyBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvbmVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdG9uRXJyb3IgKz0ga2V5VmFsdWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAoa2V5VG9rZW4gPT09IFwidHJpZ2dlclwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0dXNlVHJpZ2dlciArPSBrZXlWYWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRwcm9wcyArPSBrZXkgKyBrZXlWYWx1ZSArIFwiLFwiO1xuXHRcdFx0XHRcdFx0XHRwYXJhbXNQcm9wcyArPSBrZXkgKyBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0XHRoYXNIYW5kbGVycyA9IGhhc0hhbmRsZXJzIHx8IHJIYXNIYW5kbGVycy50ZXN0KGtleVRva2VuKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBcIlwiO1xuXHRcdFx0XHRcdH0pLnNsaWNlKDAsIC0xKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBhdGhCaW5kaW5ncyAmJiBwYXRoQmluZGluZ3NbMF0pIHtcblx0XHRcdFx0cGF0aEJpbmRpbmdzLnBvcCgpOyAvLyBSZW1vdmUgdGhlIGJpbmRpbmdzIHRoYXQgd2FzIHByZXBhcmVkIGZvciBuZXh0IGFyZy4gKFRoZXJlIGlzIGFsd2F5cyBhbiBleHRyYSBvbmUgcmVhZHkpLlxuXHRcdFx0fVxuXG5cdFx0XHRuZXdOb2RlID0gW1xuXHRcdFx0XHRcdHRhZ05hbWUsXG5cdFx0XHRcdFx0Y29udmVydGVyIHx8ICEhY29udmVydEJhY2sgfHwgaGFzSGFuZGxlcnMgfHwgXCJcIixcblx0XHRcdFx0XHRibG9jayAmJiBbXSxcblx0XHRcdFx0XHRwYXJzZWRQYXJhbShwYXJhbXNBcmdzIHx8ICh0YWdOYW1lID09PSBcIjpcIiA/IFwiJyNkYXRhJyxcIiA6IFwiXCIpLCBwYXJhbXNQcm9wcywgcGFyYW1zQ3R4UHJvcHMpLCAvLyB7ezp9fSBlcXVpdmFsZW50IHRvIHt7OiNkYXRhfX1cblx0XHRcdFx0XHRwYXJzZWRQYXJhbShhcmdzIHx8ICh0YWdOYW1lID09PSBcIjpcIiA/IFwiZGF0YSxcIiA6IFwiXCIpLCBwcm9wcywgY3R4UHJvcHMpLFxuXHRcdFx0XHRcdG9uRXJyb3IsXG5cdFx0XHRcdFx0dXNlVHJpZ2dlcixcblx0XHRcdFx0XHRwYXRoQmluZGluZ3MgfHwgMFxuXHRcdFx0XHRdO1xuXHRcdFx0Y29udGVudC5wdXNoKG5ld05vZGUpO1xuXHRcdFx0aWYgKGJsb2NrKSB7XG5cdFx0XHRcdHN0YWNrLnB1c2goY3VycmVudCk7XG5cdFx0XHRcdGN1cnJlbnQgPSBuZXdOb2RlO1xuXHRcdFx0XHRjdXJyZW50WzhdID0gbG9jOyAvLyBTdG9yZSBjdXJyZW50IGxvY2F0aW9uIG9mIG9wZW4gdGFnLCB0byBiZSBhYmxlIHRvIGFkZCBjb250ZW50TWFya3VwIHdoZW4gd2UgcmVhY2ggY2xvc2luZyB0YWdcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGNsb3NlQmxvY2spIHtcblx0XHRcdGJsb2NrVGFnQ2hlY2soY2xvc2VCbG9jayAhPT0gY3VycmVudFswXSAmJiBjdXJyZW50WzBdICE9PSBcImVsc2VcIiAmJiBjbG9zZUJsb2NrLCBjdXJyZW50WzBdKTtcblx0XHRcdGN1cnJlbnRbOF0gPSBtYXJrdXAuc3Vic3RyaW5nKGN1cnJlbnRbOF0sIGluZGV4KTsgLy8gY29udGVudE1hcmt1cCBmb3IgYmxvY2sgdGFnXG5cdFx0XHRjdXJyZW50ID0gc3RhY2sucG9wKCk7XG5cdFx0fVxuXHRcdGJsb2NrVGFnQ2hlY2soIWN1cnJlbnQgJiYgY2xvc2VCbG9jayk7XG5cdFx0Y29udGVudCA9IGN1cnJlbnRbMl07XG5cdH1cblx0Ly89PT09IC9lbmQgb2YgbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cblx0dmFyIGksIHJlc3VsdCwgbmV3Tm9kZSwgaGFzSGFuZGxlcnMsIGJpbmRpbmdzLFxuXHRcdGFsbG93Q29kZSA9ICRzdWJTZXR0aW5ncy5hbGxvd0NvZGUgfHwgdG1wbCAmJiB0bXBsLmFsbG93Q29kZVxuXHRcdFx0fHwgJHZpZXdzU2V0dGluZ3MuYWxsb3dDb2RlID09PSB0cnVlLCAvLyBpbmNsdWRlIGRpcmVjdCBzZXR0aW5nIG9mIHNldHRpbmdzLmFsbG93Q29kZSB0cnVlIGZvciBiYWNrd2FyZCBjb21wYXQgb25seVxuXHRcdGFzdFRvcCA9IFtdLFxuXHRcdGxvYyA9IDAsXG5cdFx0c3RhY2sgPSBbXSxcblx0XHRjb250ZW50ID0gYXN0VG9wLFxuXHRcdGN1cnJlbnQgPSBbLCxhc3RUb3BdO1xuXG5cdGlmIChhbGxvd0NvZGUgJiYgdG1wbC5faXMpIHtcblx0XHR0bXBsLmFsbG93Q29kZSA9IGFsbG93Q29kZTtcblx0fVxuXG4vL1RPRE9cdHJlc3VsdCA9IHRtcGxGbnNDYWNoZVttYXJrdXBdOyAvLyBPbmx5IGNhY2hlIGlmIHRlbXBsYXRlIGlzIG5vdCBuYW1lZCBhbmQgbWFya3VwIGxlbmd0aCA8IC4uLixcbi8vYW5kIHRoZXJlIGFyZSBubyBiaW5kaW5ncyBvciBzdWJ0ZW1wbGF0ZXM/PyBDb25zaWRlciBzdGFuZGFyZCBvcHRpbWl6YXRpb24gZm9yIGRhdGEtbGluaz1cImEuYi5jXCJcbi8vXHRcdGlmIChyZXN1bHQpIHtcbi8vXHRcdFx0dG1wbC5mbiA9IHJlc3VsdDtcbi8vXHRcdH0gZWxzZSB7XG5cbi8vXHRcdHJlc3VsdCA9IG1hcmt1cDtcblx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRpZiAoY29udmVydEJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bWFya3VwID0gbWFya3VwLnNsaWNlKDAsIC1jb252ZXJ0QmFjay5sZW5ndGggLSAyKSArIGRlbGltQ2xvc2VDaGFyMDtcblx0XHR9XG5cdFx0bWFya3VwID0gZGVsaW1PcGVuQ2hhcjAgKyBtYXJrdXAgKyBkZWxpbUNsb3NlQ2hhcjE7XG5cdH1cblxuXHRibG9ja1RhZ0NoZWNrKHN0YWNrWzBdICYmIHN0YWNrWzBdWzJdLnBvcCgpWzBdKTtcblx0Ly8gQnVpbGQgdGhlIEFTVCAoYWJzdHJhY3Qgc3ludGF4IHRyZWUpIHVuZGVyIGFzdFRvcFxuXHRtYXJrdXAucmVwbGFjZShyVGFnLCBwYXJzZVRhZyk7XG5cblx0cHVzaHByZWNlZGluZ0NvbnRlbnQobWFya3VwLmxlbmd0aCk7XG5cblx0aWYgKGxvYyA9IGFzdFRvcFthc3RUb3AubGVuZ3RoIC0gMV0pIHtcblx0XHRibG9ja1RhZ0NoZWNrKFwiXCIgKyBsb2MgIT09IGxvYyAmJiAoK2xvY1s4XSA9PT0gbG9jWzhdKSAmJiBsb2NbMF0pO1xuXHR9XG4vL1x0XHRcdHJlc3VsdCA9IHRtcGxGbnNDYWNoZVttYXJrdXBdID0gYnVpbGRDb2RlKGFzdFRvcCwgdG1wbCk7XG4vL1x0XHR9XG5cblx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRyZXN1bHQgPSBidWlsZENvZGUoYXN0VG9wLCBtYXJrdXAsIGlzTGlua0V4cHIpO1xuXHRcdGJpbmRpbmdzID0gW107XG5cdFx0aSA9IGFzdFRvcC5sZW5ndGg7XG5cdFx0d2hpbGUgKGktLSkge1xuXHRcdFx0YmluZGluZ3MudW5zaGlmdChhc3RUb3BbaV1bN10pOyAgLy8gV2l0aCBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIHBhdGhCaW5kaW5ncyBhcnJheSBmb3IgdGFnQ3R4W2ldIGlzIGFzdFRvcFtpXVs3XVxuXHRcdH1cblx0XHRzZXRQYXRocyhyZXN1bHQsIGJpbmRpbmdzKTtcblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSBidWlsZENvZGUoYXN0VG9wLCB0bXBsKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzZXRQYXRocyhmbiwgcGF0aHNBcnIpIHtcblx0dmFyIGtleSwgcGF0aHMsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IHBhdGhzQXJyLmxlbmd0aDtcblx0Zm4uZGVwcyA9IFtdO1xuXHRmbi5wYXRocyA9IFtdOyAvLyBUaGUgYXJyYXkgb2YgcGF0aCBiaW5kaW5nIChhcnJheS9kaWN0aW9uYXJ5KXMgZm9yIGVhY2ggdGFnL2Vsc2UgYmxvY2sncyBhcmdzIGFuZCBwcm9wc1xuXHRmb3IgKDsgaSA8IGw7IGkrKykge1xuXHRcdGZuLnBhdGhzLnB1c2gocGF0aHMgPSBwYXRoc0FycltpXSk7XG5cdFx0Zm9yIChrZXkgaW4gcGF0aHMpIHtcblx0XHRcdGlmIChrZXkgIT09IFwiX2pzdnRvXCIgJiYgcGF0aHMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBwYXRoc1trZXldLmxlbmd0aCAmJiAhcGF0aHNba2V5XS5za3ApIHtcblx0XHRcdFx0Zm4uZGVwcyA9IGZuLmRlcHMuY29uY2F0KHBhdGhzW2tleV0pOyAvLyBkZXBzIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBwYXRocyBhcnJheXMgZm9yIHRoZSBkaWZmZXJlbnQgYmluZGluZ3Ncblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcGFyc2VkUGFyYW0oYXJncywgcHJvcHMsIGN0eCkge1xuXHRyZXR1cm4gW2FyZ3Muc2xpY2UoMCwgLTEpLCBwcm9wcy5zbGljZSgwLCAtMSksIGN0eC5zbGljZSgwLCAtMSldO1xufVxuXG5mdW5jdGlvbiBwYXJhbVN0cnVjdHVyZShwYXJ0cywgdHlwZSkge1xuXHRyZXR1cm4gJ1xcblxcdCdcblx0XHQrICh0eXBlXG5cdFx0XHQ/IHR5cGUgKyAnOnsnXG5cdFx0XHQ6ICcnKVxuXHRcdCsgJ2FyZ3M6WycgKyBwYXJ0c1swXSArICddJ1xuXHRcdCsgKHBhcnRzWzFdIHx8ICF0eXBlXG5cdFx0XHQ/ICcsXFxuXFx0cHJvcHM6eycgKyBwYXJ0c1sxXSArICd9J1xuXHRcdFx0OiBcIlwiKVxuXHRcdCsgKHBhcnRzWzJdID8gJyxcXG5cXHRjdHg6eycgKyBwYXJ0c1syXSArICd9JyA6IFwiXCIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhcmFtcyhwYXJhbXMsIHBhdGhCaW5kaW5ncywgdG1wbCkge1xuXG5cdGZ1bmN0aW9uIHBhcnNlVG9rZW5zKGFsbCwgbGZ0UHJuMCwgbGZ0UHJuLCBib3VuZCwgcGF0aCwgb3BlcmF0b3IsIGVyciwgZXEsIHBhdGgyLCBwcm4sIGNvbW1hLCBsZnRQcm4yLCBhcG9zLCBxdW90LCBydFBybiwgcnRQcm5Eb3QsIHBybjIsIHNwYWNlLCBpbmRleCwgZnVsbCkge1xuXHQvLyAvKFxcKCkoPz1cXHMqXFwoKXwoPzooWyhbXSlcXHMqKT8oPzooXFxePykoISo/WyN+XT9bXFx3JC5eXSspP1xccyooKFxcK1xcK3wtLSl8XFwrfC18JiZ8XFx8XFx8fD09PXwhPT18PT18IT18PD18Pj18Wzw+JSo6P1xcL118KD0pKVxccyp8KCEqP1sjfl0/W1xcdyQuXl0rKShbKFtdKT8pfCgsXFxzKil8KFxcKD8pXFxcXD8oPzooJyl8KFwiKSl8KD86XFxzKigoWylcXF1dKSg/PVxccypbLl5dfFxccyokfFteKFtdKXxbKVxcXV0pKFsoW10/KSl8KFxccyspL2csXG5cdC8vICAgbGZ0UHJuMCAgICAgICAgbGZ0UHJuICAgICAgICBib3VuZCAgICAgICAgICAgIHBhdGggICAgb3BlcmF0b3IgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgICAgICAgICAgICAgcGF0aDIgICAgICAgcHJuICAgIGNvbW1hICAgbGZ0UHJuMiAgIGFwb3MgcXVvdCAgICAgIHJ0UHJuIHJ0UHJuRG90ICAgICAgICAgICAgICAgICAgICAgICAgcHJuMiAgc3BhY2Vcblx0XHQvLyAobGVmdCBwYXJlbj8gZm9sbG93ZWQgYnkgKHBhdGg/IGZvbGxvd2VkIGJ5IG9wZXJhdG9yKSBvciAocGF0aCBmb2xsb3dlZCBieSBwYXJlbj8pKSBvciBjb21tYSBvciBhcG9zIG9yIHF1b3Qgb3IgcmlnaHQgcGFyZW4gb3Igc3BhY2Vcblx0XHRmdW5jdGlvbiBwYXJzZVBhdGgoYWxsUGF0aCwgbm90LCBvYmplY3QsIGhlbHBlciwgdmlldywgdmlld1Byb3BlcnR5LCBwYXRoVG9rZW5zLCBsZWFmVG9rZW4pIHtcblx0XHRcdC8vclBhdGggPSAvXighKj8pKD86bnVsbHx0cnVlfGZhbHNlfFxcZFtcXGQuXSp8KFtcXHckXSt8XFwufH4oW1xcdyRdKyl8Iyh2aWV3fChbXFx3JF0rKSk/KShbXFx3JC5eXSo/KSg/OlsuW15dKFtcXHckXSspXFxdPyk/KSQvZyxcblx0XHRcdC8vICAgICAgICAgIG5vdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgICAgIGhlbHBlciAgICB2aWV3ICB2aWV3UHJvcGVydHkgcGF0aFRva2VucyAgICAgIGxlYWZUb2tlblxuXHRcdFx0dmFyIHN1YlBhdGggPSBvYmplY3QgPT09IFwiLlwiO1xuXHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRwYXRoID0gcGF0aC5zbGljZShub3QubGVuZ3RoKTtcblx0XHRcdFx0aWYgKC9eXFwuP2NvbnN0cnVjdG9yJC8udGVzdChsZWFmVG9rZW58fHBhdGgpKSB7XG5cdFx0XHRcdFx0c3ludGF4RXJyb3IoYWxsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFzdWJQYXRoKSB7XG5cdFx0XHRcdFx0YWxsUGF0aCA9IChoZWxwZXJcblx0XHRcdFx0XHRcdFx0PyAndmlldy5obHAoXCInICsgaGVscGVyICsgJ1wiKSdcblx0XHRcdFx0XHRcdFx0OiB2aWV3XG5cdFx0XHRcdFx0XHRcdFx0PyBcInZpZXdcIlxuXHRcdFx0XHRcdFx0XHRcdDogXCJkYXRhXCIpXG5cdFx0XHRcdFx0XHQrIChsZWFmVG9rZW5cblx0XHRcdFx0XHRcdFx0PyAodmlld1Byb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0PyBcIi5cIiArIHZpZXdQcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdDogaGVscGVyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0XHRcdFx0XHRcdDogKHZpZXcgPyBcIlwiIDogXCIuXCIgKyBvYmplY3QpXG5cdFx0XHRcdFx0XHRcdFx0KSArIChwYXRoVG9rZW5zIHx8IFwiXCIpXG5cdFx0XHRcdFx0XHRcdDogKGxlYWZUb2tlbiA9IGhlbHBlciA/IFwiXCIgOiB2aWV3ID8gdmlld1Byb3BlcnR5IHx8IFwiXCIgOiBvYmplY3QsIFwiXCIpKTtcblxuXHRcdFx0XHRcdGFsbFBhdGggPSBhbGxQYXRoICsgKGxlYWZUb2tlbiA/IFwiLlwiICsgbGVhZlRva2VuIDogXCJcIik7XG5cblx0XHRcdFx0XHRhbGxQYXRoID0gbm90ICsgKGFsbFBhdGguc2xpY2UoMCwgOSkgPT09IFwidmlldy5kYXRhXCJcblx0XHRcdFx0XHRcdD8gYWxsUGF0aC5zbGljZSg1KSAvLyBjb252ZXJ0ICN2aWV3LmRhdGEuLi4gdG8gZGF0YS4uLlxuXHRcdFx0XHRcdFx0OiBhbGxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYmluZGluZ3MpIHtcblx0XHRcdFx0XHRiaW5kcyA9IG5hbWVkID09PSBcImxpbmtUb1wiID8gKGJpbmR0byA9IHBhdGhCaW5kaW5ncy5fanN2dG8gPSBwYXRoQmluZGluZ3MuX2pzdnRvIHx8IFtdKSA6IGJuZEN0eC5iZDtcblx0XHRcdFx0XHRpZiAodGhlT2IgPSBzdWJQYXRoICYmIGJpbmRzW2JpbmRzLmxlbmd0aC0xXSkge1xuXHRcdFx0XHRcdFx0aWYgKHRoZU9iLl9qc3YpIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKHRoZU9iLnNiKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhlT2IgPSB0aGVPYi5zYjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAodGhlT2IuYm5kKSB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0aCA9IFwiXlwiICsgcGF0aC5zbGljZSgxKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGVPYi5zYiA9IHBhdGg7XG5cdFx0XHRcdFx0XHRcdHRoZU9iLmJuZCA9IHRoZU9iLmJuZCB8fCBwYXRoLmNoYXJBdCgwKSA9PT0gXCJeXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGJpbmRzLnB1c2gocGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBhdGhTdGFydFtwYXJlbkRlcHRoXSA9IGluZGV4ICsgKHN1YlBhdGggPyAxIDogMCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBhbGxQYXRoO1xuXHRcdH1cblxuXHRcdC8vYm91bmQgPSBiaW5kaW5ncyAmJiBib3VuZDtcblx0XHRpZiAoYm91bmQgJiYgIWVxKSB7XG5cdFx0XHRwYXRoID0gYm91bmQgKyBwYXRoOyAvLyBlLmcuIHNvbWUuZm4oLi4uKV5zb21lLnBhdGggLSBzbyBoZXJlIHBhdGggaXMgXCJec29tZS5wYXRoXCJcblx0XHR9XG5cdFx0b3BlcmF0b3IgPSBvcGVyYXRvciB8fCBcIlwiO1xuXHRcdGxmdFBybiA9IGxmdFBybiB8fCBsZnRQcm4wIHx8IGxmdFBybjI7XG5cdFx0cGF0aCA9IHBhdGggfHwgcGF0aDI7XG5cdFx0Ly8gQ291bGQgZG8gdGhpcyAtIGJ1dCBub3Qgd29ydGggcGVyZiBjb3N0Pz8gOi1cblx0XHQvLyBpZiAoIXBhdGgubGFzdEluZGV4T2YoXCIjZGF0YS5cIiwgMCkpIHsgcGF0aCA9IHBhdGguc2xpY2UoNik7IH0gLy8gSWYgcGF0aCBzdGFydHMgd2l0aCBcIiNkYXRhLlwiLCByZW1vdmUgdGhhdC5cblx0XHRwcm4gPSBwcm4gfHwgcHJuMiB8fCBcIlwiO1xuXG5cdFx0dmFyIGV4cHIsIGV4cHJGbiwgYmluZHMsIHRoZU9iLCBuZXdPYixcblx0XHRcdHJ0U3EgPSBcIilcIjtcblxuXHRcdGlmIChwcm4gPT09IFwiW1wiKSB7XG5cdFx0XHRwcm4gID1cIltqLl9zcShcIjtcblx0XHRcdHJ0U3EgPSBcIildXCI7XG5cdFx0fVxuXG5cdFx0aWYgKGVyciAmJiAhYXBvc2VkICYmICFxdW90ZWQpIHtcblx0XHRcdHN5bnRheEVycm9yKHBhcmFtcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChiaW5kaW5ncyAmJiBydFBybkRvdCAmJiAhYXBvc2VkICYmICFxdW90ZWQpIHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIGJpbmRpbmcgdG8gYSBwYXRoIGluIHdoaWNoIGFuIG9iamVjdCBpcyByZXR1cm5lZCBieSBhIGhlbHBlci9kYXRhIGZ1bmN0aW9uL2V4cHJlc3Npb24sIGUuZy4gZm9vKCleeC55IG9yIChhP2I6YyleeC55XG5cdFx0XHRcdC8vIFdlIGNyZWF0ZSBhIGNvbXBpbGVkIGZ1bmN0aW9uIHRvIGdldCB0aGUgb2JqZWN0IGluc3RhbmNlICh3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBkZXBlbmRlbnQgZGF0YSBvZiB0aGUgc3ViZXhwcmVzc2lvbiBjaGFuZ2VzLCB0byByZXR1cm4gdGhlIG5ldyBvYmplY3QsIGFuZCB0cmlnZ2VyIHJlLWJpbmRpbmcgb2YgdGhlIHN1YnNlcXVlbnQgcGF0aClcblx0XHRcdFx0aWYgKCFuYW1lZCB8fCBib3VuZE5hbWUgfHwgYmluZHRvKSB7XG5cdFx0XHRcdFx0ZXhwciA9IHBhdGhTdGFydFtwYXJlbkRlcHRoIC0gMV07XG5cdFx0XHRcdFx0aWYgKGZ1bGwubGVuZ3RoIC0gMSA+IGluZGV4IC0gKGV4cHIgfHwgMCkpIHsgLy8gV2UgbmVlZCB0byBjb21waWxlIGEgc3ViZXhwcmVzc2lvblxuXHRcdFx0XHRcdFx0ZXhwciA9IGZ1bGwuc2xpY2UoZXhwciwgaW5kZXggKyBhbGwubGVuZ3RoKTtcblx0XHRcdFx0XHRcdGlmIChleHByRm4gIT09IHRydWUpIHsgLy8gSWYgbm90IHJlZW50cmFudCBjYWxsIGR1cmluZyBjb21waWxhdGlvblxuXHRcdFx0XHRcdFx0XHRiaW5kcyA9IGJpbmR0byB8fCBibmRTdGFja1twYXJlbkRlcHRoLTFdLmJkO1xuXHRcdFx0XHRcdFx0XHQvLyBJbnNlcnQgZXhwck9iIG9iamVjdCwgdG8gYmUgdXNlZCBkdXJpbmcgYmluZGluZyB0byByZXR1cm4gdGhlIGNvbXB1dGVkIG9iamVjdFxuXHRcdFx0XHRcdFx0XHR0aGVPYiA9IGJpbmRzW2JpbmRzLmxlbmd0aC0xXTtcblx0XHRcdFx0XHRcdFx0aWYgKHRoZU9iICYmIHRoZU9iLnBybSkge1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICh0aGVPYi5zYiAmJiB0aGVPYi5zYi5wcm0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoZU9iID0gdGhlT2Iuc2I7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG5ld09iID0gdGhlT2Iuc2IgPSB7cGF0aDogdGhlT2Iuc2IsIGJuZDogdGhlT2IuYm5kfTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRiaW5kcy5wdXNoKG5ld09iID0ge3BhdGg6IGJpbmRzLnBvcCgpfSk7IC8vIEluc2VydCBleHByT2Igb2JqZWN0LCB0byBiZSB1c2VkIGR1cmluZyBiaW5kaW5nIHRvIHJldHVybiB0aGUgY29tcHV0ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IC8vIChlLmcuIFwic29tZS5vYmplY3QoKVwiIGluIFwic29tZS5vYmplY3QoKS5hLmJcIiAtIHRvIGJlIHVzZWQgYXMgY29udGV4dCBmb3IgYmluZGluZyB0aGUgZm9sbG93aW5nIHRva2VucyBcImEuYlwiKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cnRQcm5Eb3QgPSBkZWxpbU9wZW5DaGFyMSArIFwiOlwiICsgZXhwciAvLyBUaGUgcGFyYW1ldGVyIG9yIGZ1bmN0aW9uIHN1YmV4cHJlc3Npb25cblx0XHRcdFx0XHRcdFx0KyBcIiBvbmVycm9yPScnXCIgLy8gc2V0IG9uZXJyb3I9JycgaW4gb3JkZXIgdG8gd3JhcCBnZW5lcmF0ZWQgY29kZSB3aXRoIGEgdHJ5IGNhdGNoIC0gcmV0dXJuaW5nICcnIGFzIG9iamVjdCBpbnN0YW5jZSBpZiB0aGVyZSBpcyBhbiBlcnJvci9taXNzaW5nIHBhcmVudFxuXHRcdFx0XHRcdFx0XHQrIGRlbGltQ2xvc2VDaGFyMDtcblx0XHRcdFx0XHRcdGV4cHJGbiA9IHRtcGxMaW5rc1tydFBybkRvdF07XG5cdFx0XHRcdFx0XHRpZiAoIWV4cHJGbikge1xuXHRcdFx0XHRcdFx0XHR0bXBsTGlua3NbcnRQcm5Eb3RdID0gdHJ1ZTsgLy8gRmxhZyB0aGF0IHRoaXMgZXhwckZuIChmb3IgcnRQcm5Eb3QpIGlzIGJlaW5nIGNvbXBpbGVkXG5cdFx0XHRcdFx0XHRcdHRtcGxMaW5rc1tydFBybkRvdF0gPSBleHByRm4gPSB0bXBsRm4ocnRQcm5Eb3QsIHRtcGwsIHRydWUpOyAvLyBDb21waWxlIHRoZSBleHByZXNzaW9uIChvciB1c2UgY2FjaGVkIGNvcHkgYWxyZWFkeSBpbiB0bXBsLmxpbmtzKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGV4cHJGbiAhPT0gdHJ1ZSAmJiBuZXdPYikge1xuXHRcdFx0XHRcdFx0XHQvLyBJZiBub3QgcmVlbnRyYW50IGNhbGwgZHVyaW5nIGNvbXBpbGF0aW9uXG5cdFx0XHRcdFx0XHRcdG5ld09iLl9qc3YgPSBleHByRm47XG5cdFx0XHRcdFx0XHRcdG5ld09iLnBybSA9IGJuZEN0eC5iZDtcblx0XHRcdFx0XHRcdFx0bmV3T2IuYm5kID0gbmV3T2IuYm5kIHx8IG5ld09iLnBhdGggJiYgbmV3T2IucGF0aC5pbmRleE9mKFwiXlwiKSA+PSAwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIChhcG9zZWRcblx0XHRcdFx0Ly8gd2l0aGluIHNpbmdsZS1xdW90ZWQgc3RyaW5nXG5cdFx0XHRcdD8gKGFwb3NlZCA9ICFhcG9zLCAoYXBvc2VkID8gYWxsIDogbGZ0UHJuMiArICdcIicpKVxuXHRcdFx0XHQ6IHF1b3RlZFxuXHRcdFx0XHQvLyB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdcblx0XHRcdFx0XHQ/IChxdW90ZWQgPSAhcXVvdCwgKHF1b3RlZCA/IGFsbCA6IGxmdFBybjIgKyAnXCInKSlcblx0XHRcdFx0XHQ6XG5cdFx0XHRcdChcblx0XHRcdFx0XHQobGZ0UHJuXG5cdFx0XHRcdFx0XHQ/IChwYXRoU3RhcnRbcGFyZW5EZXB0aF0gPSBpbmRleCsrLCBibmRDdHggPSBibmRTdGFja1srK3BhcmVuRGVwdGhdID0ge2JkOiBbXX0sIGxmdFBybilcblx0XHRcdFx0XHRcdDogXCJcIilcblx0XHRcdFx0XHQrIChzcGFjZVxuXHRcdFx0XHRcdFx0PyAocGFyZW5EZXB0aFxuXHRcdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0Ly8gTmV3IGFyZyBvciBwcm9wIC0gc28gaW5zZXJ0IGJhY2tzcGFjZSBcXGIgKFxceDA4KSBhcyBzZXBhcmF0b3IgZm9yIG5hbWVkIHBhcmFtcywgdXNlZCBzdWJzZXF1ZW50bHkgYnkgckJ1aWxkSGFzaCwgYW5kIHByZXBhcmUgbmV3IGJpbmRpbmdzIGFycmF5XG5cdFx0XHRcdFx0XHRcdDogKHBhcmFtSW5kZXggPSBmdWxsLnNsaWNlKHBhcmFtSW5kZXgsIGluZGV4KSwgbmFtZWRcblx0XHRcdFx0XHRcdFx0XHQ/IChuYW1lZCA9IGJvdW5kTmFtZSA9IGJpbmR0byA9IGZhbHNlLCBcIlxcYlwiKVxuXHRcdFx0XHRcdFx0XHRcdDogXCJcXGIsXCIpICsgcGFyYW1JbmRleCArIChwYXJhbUluZGV4ID0gaW5kZXggKyBhbGwubGVuZ3RoLCBiaW5kaW5ncyAmJiBwYXRoQmluZGluZ3MucHVzaChibmRDdHguYmQgPSBbXSksIFwiXFxiXCIpXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6IGVxXG5cdFx0XHRcdC8vIG5hbWVkIHBhcmFtLiBSZW1vdmUgYmluZGluZ3MgZm9yIGFyZyBhbmQgY3JlYXRlIGluc3RlYWQgYmluZGluZ3MgYXJyYXkgZm9yIHByb3Bcblx0XHRcdFx0XHRcdFx0PyAocGFyZW5EZXB0aCAmJiBzeW50YXhFcnJvcihwYXJhbXMpLCBiaW5kaW5ncyAmJiBwYXRoQmluZGluZ3MucG9wKCksIG5hbWVkID0gcGF0aCwgYm91bmROYW1lID0gYm91bmQsIHBhcmFtSW5kZXggPSBpbmRleCArIGFsbC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRiaW5kaW5ncyAmJiAoKGJpbmRpbmdzID0gYm5kQ3R4LmJkID0gcGF0aEJpbmRpbmdzW25hbWVkXSA9IFtdKSwgYmluZGluZ3Muc2twID0gIWJvdW5kKSwgcGF0aCArICc6Jylcblx0XHRcdFx0XHRcdFx0OiBwYXRoXG5cdFx0XHRcdC8vIHBhdGhcblx0XHRcdFx0XHRcdFx0XHQ/IChwYXRoLnNwbGl0KFwiXlwiKS5qb2luKFwiLlwiKS5yZXBsYWNlKHJQYXRoLCBwYXJzZVBhdGgpXG5cdFx0XHRcdFx0XHRcdFx0XHQrIChwcm5cblx0XHRcdFx0Ly8gc29tZS5mbmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0gPSB7YmQ6IFtdfSwgZm5DYWxsW3BhcmVuRGVwdGhdID0gcnRTcSwgcHJuKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IG9wZXJhdG9yKVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQ6IG9wZXJhdG9yXG5cdFx0XHRcdC8vIG9wZXJhdG9yXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IG9wZXJhdG9yXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IHJ0UHJuXG5cdFx0XHRcdC8vIGZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gKChydFBybiA9IGZuQ2FsbFtwYXJlbkRlcHRoXSB8fCBydFBybiwgZm5DYWxsW3BhcmVuRGVwdGhdID0gZmFsc2UsIGJuZEN0eCA9IGJuZFN0YWNrWy0tcGFyZW5EZXB0aF0sIHJ0UHJuKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgKHBybiAvLyBydFBybiBhbmQgcHJuLCBlLmcgKSggaW4gKGEpKCkgb3IgYSgpKCksIG9yIClbIGluIGEoKVtdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChibmRDdHggPSBibmRTdGFja1srK3BhcmVuRGVwdGhdLCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBydFNxLCBwcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBjb21tYVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGZuQ2FsbFtwYXJlbkRlcHRoXSB8fCBzeW50YXhFcnJvcihwYXJhbXMpLCBcIixcIikgLy8gV2UgZG9uJ3QgYWxsb3cgdG9wLWxldmVsIGxpdGVyYWwgYXJyYXlzIG9yIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGxmdFBybjBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiAoYXBvc2VkID0gYXBvcywgcXVvdGVkID0gcXVvdCwgJ1wiJylcblx0XHRcdFx0KSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIG5hbWVkLCBiaW5kdG8sIGJvdW5kTmFtZSxcblx0XHRxdW90ZWQsIC8vIGJvb2xlYW4gZm9yIHN0cmluZyBjb250ZW50IGluIGRvdWJsZSBxdW90ZXNcblx0XHRhcG9zZWQsIC8vIG9yIGluIHNpbmdsZSBxdW90ZXNcblx0XHRiaW5kaW5ncyA9IHBhdGhCaW5kaW5ncyAmJiBwYXRoQmluZGluZ3NbMF0sIC8vIGJpbmRpbmdzIGFycmF5IGZvciB0aGUgZmlyc3QgYXJnXG5cdFx0Ym5kQ3R4ID0ge2JkOiBiaW5kaW5nc30sXG5cdFx0Ym5kU3RhY2sgPSB7MDogYm5kQ3R4fSxcblx0XHRwYXJhbUluZGV4ID0gMCwgLy8gbGlzdCxcblx0XHR0bXBsTGlua3MgPSAodG1wbCA/IHRtcGwubGlua3MgOiBiaW5kaW5ncyAmJiAoYmluZGluZ3MubGlua3MgPSBiaW5kaW5ncy5saW5rcyB8fCB7fSkpIHx8IHRvcFZpZXcudG1wbC5saW5rcyxcblx0XHQvLyBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGZvciB0cmFja2luZyBwYXRoIHBhcnNpbmcgaW5jbHVkaW5nIG5lc3RlZCBwYXRocywgc3VjaCBhcyBcImEuYihjXmQgKyAoZSkpXmZcIiwgYW5kIGNoYWluZWQgY29tcHV0ZWQgcGF0aHMgc3VjaCBhc1xuXHRcdC8vIFwiYS5iKCkuY15kKCkuZS5mKCkuZ1wiIC0gd2hpY2ggaGFzIGZvdXIgY2hhaW5lZCBwYXRocywgXCJhLmIoKVwiLCBcIl5jLmQoKVwiLCBcIi5lLmYoKVwiIGFuZCBcIi5nXCJcblx0XHRwYXJlbkRlcHRoID0gMCxcblx0XHRmbkNhbGwgPSB7fSwgLy8gV2UgYXJlIGluIGEgZnVuY3Rpb24gY2FsbFxuXHRcdHBhdGhTdGFydCA9IHt9LCAvLyB0cmFja3MgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHBhdGggc3VjaCBhcyBjXmQoKSBpbiB0aGUgYWJvdmUgZXhhbXBsZVxuXHRcdHJlc3VsdCA9IChwYXJhbXMgKyAodG1wbCA/IFwiIFwiIDogXCJcIikpLnJlcGxhY2UoclBhcmFtcywgcGFyc2VUb2tlbnMpO1xuXG5cdHJldHVybiAhcGFyZW5EZXB0aCAmJiByZXN1bHQgfHwgc3ludGF4RXJyb3IocGFyYW1zKTsgLy8gU3ludGF4IGVycm9yIGlmIHVuYmFsYW5jZWQgcGFyZW5zIGluIHBhcmFtcyBleHByZXNzaW9uXG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29kZShhc3QsIHRtcGwsIGlzTGlua0V4cHIpIHtcblx0Ly8gQnVpbGQgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIGNvZGUgZnJvbSB0aGUgQVNUIG5vZGVzLCBhbmQgc2V0IGFzIHByb3BlcnR5IG9uIHRoZSBwYXNzZWQtaW4gdGVtcGxhdGUgb2JqZWN0XG5cdC8vIFVzZWQgZm9yIGNvbXBpbGluZyB0ZW1wbGF0ZXMsIGFuZCBhbHNvIGJ5IEpzVmlld3MgdG8gYnVpbGQgZnVuY3Rpb25zIGZvciBkYXRhIGxpbmsgZXhwcmVzc2lvbnNcblx0dmFyIGksIG5vZGUsIHRhZ05hbWUsIGNvbnZlcnRlciwgdGFnQ3R4LCBoYXNUYWcsIGhhc0VuY29kZXIsIGdldHNWYWwsIGhhc0NudnQsIHVzZUNudnQsIHRtcGxCaW5kaW5ncywgcGF0aEJpbmRpbmdzLCBwYXJhbXMsIGJvdW5kT25FcnJTdGFydCwgYm91bmRPbkVyckVuZCxcblx0XHR0YWdSZW5kZXIsIG5lc3RlZFRtcGxzLCB0bXBsTmFtZSwgbmVzdGVkVG1wbCwgdGFnQW5kRWxzZXMsIGNvbnRlbnQsIG1hcmt1cCwgbmV4dElzRWxzZSwgb2xkQ29kZSwgaXNFbHNlLCBpc0dldFZhbCwgdGFnQ3R4Rm4sIG9uRXJyb3IsIHRhZ1N0YXJ0LCB0cmlnZ2VyLFxuXHRcdHRtcGxCaW5kaW5nS2V5ID0gMCxcblx0XHR1c2VWaWV3cyA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLnVzZVZpZXdzIHx8IHRtcGwudXNlVmlld3MgfHwgdG1wbC50YWdzIHx8IHRtcGwudGVtcGxhdGVzIHx8IHRtcGwuaGVscGVycyB8fCB0bXBsLmNvbnZlcnRlcnMsXG5cdFx0Y29kZSA9IFwiXCIsXG5cdFx0dG1wbE9wdGlvbnMgPSB7fSxcblx0XHRsID0gYXN0Lmxlbmd0aDtcblxuXHRpZiAoXCJcIiArIHRtcGwgPT09IHRtcGwpIHtcblx0XHR0bXBsTmFtZSA9IGlzTGlua0V4cHIgPyAnZGF0YS1saW5rPVwiJyArIHRtcGwucmVwbGFjZShyTmV3TGluZSwgXCIgXCIpLnNsaWNlKDEsIC0xKSArICdcIicgOiB0bXBsO1xuXHRcdHRtcGwgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHRtcGxOYW1lID0gdG1wbC50bXBsTmFtZSB8fCBcInVubmFtZWRcIjtcblx0XHRpZiAodG1wbC5hbGxvd0NvZGUpIHtcblx0XHRcdHRtcGxPcHRpb25zLmFsbG93Q29kZSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmICh0bXBsLmRlYnVnKSB7XG5cdFx0XHR0bXBsT3B0aW9ucy5kZWJ1ZyA9IHRydWU7XG5cdFx0fVxuXHRcdHRtcGxCaW5kaW5ncyA9IHRtcGwuYm5kcztcblx0XHRuZXN0ZWRUbXBscyA9IHRtcGwudG1wbHM7XG5cdH1cblx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdC8vIEFTVCBub2RlczogWzA6IHRhZ05hbWUsIDE6IGNvbnZlcnRlciwgMjogY29udGVudCwgMzogcGFyYW1zLCA0OiBjb2RlLCA1OiBvbkVycm9yLCA2OiB0cmlnZ2VyLCA3OnBhdGhCaW5kaW5ncywgODogY29udGVudE1hcmt1cF1cblx0XHRub2RlID0gYXN0W2ldO1xuXG5cdFx0Ly8gQWRkIG5ld2xpbmUgZm9yIGVhY2ggY2FsbG91dCB0byB0KCkgYygpIGV0Yy4gYW5kIGVhY2ggbWFya3VwIHN0cmluZ1xuXHRcdGlmIChcIlwiICsgbm9kZSA9PT0gbm9kZSkge1xuXHRcdFx0Ly8gYSBtYXJrdXAgc3RyaW5nIHRvIGJlIGluc2VydGVkXG5cdFx0XHRjb2RlICs9ICdcXG4rXCInICsgbm9kZSArICdcIic7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGEgY29tcGlsZWQgdGFnIGV4cHJlc3Npb24gdG8gYmUgaW5zZXJ0ZWRcblx0XHRcdHRhZ05hbWUgPSBub2RlWzBdO1xuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwiKlwiKSB7XG5cdFx0XHRcdC8vIENvZGUgdGFnOiB7eyogfX1cblx0XHRcdFx0Y29kZSArPSBcIjtcXG5cIiArIG5vZGVbMV0gKyBcIlxcbnJldD1yZXRcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnZlcnRlciA9IG5vZGVbMV07XG5cdFx0XHRcdGNvbnRlbnQgPSAhaXNMaW5rRXhwciAmJiBub2RlWzJdO1xuXHRcdFx0XHR0YWdDdHggPSBwYXJhbVN0cnVjdHVyZShub2RlWzNdLCAncGFyYW1zJykgKyAnfSwnICsgcGFyYW1TdHJ1Y3R1cmUocGFyYW1zID0gbm9kZVs0XSk7XG5cdFx0XHRcdG9uRXJyb3IgPSBub2RlWzVdO1xuXHRcdFx0XHR0cmlnZ2VyID0gbm9kZVs2XTtcblx0XHRcdFx0bWFya3VwID0gbm9kZVs4XSAmJiBub2RlWzhdLnJlcGxhY2UoclVuZXNjYXBlUXVvdGVzLCBcIiQxXCIpO1xuXHRcdFx0XHRpZiAoaXNFbHNlID0gdGFnTmFtZSA9PT0gXCJlbHNlXCIpIHtcblx0XHRcdFx0XHRpZiAocGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRwYXRoQmluZGluZ3MucHVzaChub2RlWzddKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dG1wbEJpbmRpbmdLZXkgPSAwO1xuXHRcdFx0XHRcdGlmICh0bXBsQmluZGluZ3MgJiYgKHBhdGhCaW5kaW5ncyA9IG5vZGVbN10pKSB7IC8vIEFycmF5IG9mIHBhdGhzLCBvciBmYWxzZSBpZiBub3QgZGF0YS1ib3VuZFxuXHRcdFx0XHRcdFx0cGF0aEJpbmRpbmdzID0gW3BhdGhCaW5kaW5nc107XG5cdFx0XHRcdFx0XHR0bXBsQmluZGluZ0tleSA9IHRtcGxCaW5kaW5ncy5wdXNoKDEpOyAvLyBBZGQgcGxhY2Vob2xkZXIgaW4gdG1wbEJpbmRpbmdzIGZvciBjb21waWxlZCBmdW5jdGlvblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR1c2VWaWV3cyA9IHVzZVZpZXdzIHx8IHBhcmFtc1sxXSB8fCBwYXJhbXNbMl0gfHwgcGF0aEJpbmRpbmdzIHx8IC92aWV3Lig/IWluZGV4KS8udGVzdChwYXJhbXNbMF0pO1xuXHRcdFx0XHQvLyB1c2VWaWV3cyBpcyBmb3IgcGVyZiBvcHRpbWl6YXRpb24uIEZvciByZW5kZXIoKSB3ZSBvbmx5IHVzZSB2aWV3cyBpZiBuZWNlc3NhcnkgLSBmb3IgdGhlIG1vcmUgYWR2YW5jZWQgc2NlbmFyaW9zLlxuXHRcdFx0XHQvLyBXZSB1c2Ugdmlld3MgaWYgdGhlcmUgYXJlIHByb3BzLCBjb250ZXh0dWFsIHByb3BlcnRpZXMgb3IgYXJncyB3aXRoICMuLi4gKG90aGVyIHRoYW4gI2luZGV4KSAtIGJ1dCB5b3UgY2FuIGZvcmNlXG5cdFx0XHRcdC8vIHVzaW5nIHRoZSBmdWxsIHZpZXcgaW5mcmFzdHJ1Y3R1cmUsIChhbmQgcGF5IGEgcGVyZiBwcmljZSkgYnkgb3B0aW5nIGluOiBTZXQgdXNlVmlld3M6IHRydWUgb24gdGhlIHRlbXBsYXRlLCBtYW51YWxseS4uLlxuXHRcdFx0XHRpZiAoaXNHZXRWYWwgPSB0YWdOYW1lID09PSBcIjpcIikge1xuXHRcdFx0XHRcdGlmIChjb252ZXJ0ZXIpIHtcblx0XHRcdFx0XHRcdHRhZ05hbWUgPSBjb252ZXJ0ZXIgPT09IEhUTUwgPyBcIj5cIiA6IGNvbnZlcnRlciArIHRhZ05hbWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChjb250ZW50KSB7IC8vIFRPRE8gb3B0aW1pemUgLSBpZiBjb250ZW50Lmxlbmd0aCA9PT0gMCBvciBpZiB0aGVyZSBpcyBhIHRtcGw9XCIuLi5cIiBzcGVjaWZpZWQgLSBzZXQgY29udGVudCB0byBudWxsIC8gZG9uJ3QgcnVuIHRoaXMgY29tcGlsYXRpb24gY29kZSAtIHNpbmNlIGNvbnRlbnQgd29uJ3QgZ2V0IHVzZWQhIVxuXHRcdFx0XHRcdFx0Ly8gQ3JlYXRlIHRlbXBsYXRlIG9iamVjdCBmb3IgbmVzdGVkIHRlbXBsYXRlXG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBsID0gdG1wbE9iamVjdChtYXJrdXAsIHRtcGxPcHRpb25zKTtcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwudG1wbE5hbWUgPSB0bXBsTmFtZSArIFwiL1wiICsgdGFnTmFtZTtcblx0XHRcdFx0XHRcdC8vIENvbXBpbGUgdG8gQVNUIGFuZCB0aGVuIHRvIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBsLnVzZVZpZXdzID0gbmVzdGVkVG1wbC51c2VWaWV3cyB8fCB1c2VWaWV3cztcblx0XHRcdFx0XHRcdGJ1aWxkQ29kZShjb250ZW50LCBuZXN0ZWRUbXBsKTtcblx0XHRcdFx0XHRcdHVzZVZpZXdzID0gbmVzdGVkVG1wbC51c2VWaWV3cztcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGxzLnB1c2gobmVzdGVkVG1wbCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFpc0Vsc2UpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgbm90IGFuIGVsc2UgdGFnLlxuXHRcdFx0XHRcdFx0dGFnQW5kRWxzZXMgPSB0YWdOYW1lO1xuXHRcdFx0XHRcdFx0dXNlVmlld3MgPSB1c2VWaWV3cyB8fCB0YWdOYW1lICYmICghJHRhZ3NbdGFnTmFtZV0gfHwgISR0YWdzW3RhZ05hbWVdLmZsb3cpO1xuXHRcdFx0XHRcdFx0Ly8gU3dpdGNoIHRvIGEgbmV3IGNvZGUgc3RyaW5nIGZvciB0aGlzIGJvdW5kIHRhZyAoYW5kIGl0cyBlbHNlcywgaWYgaXQgaGFzIGFueSkgLSBmb3IgcmV0dXJuaW5nIHRoZSB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0XHRvbGRDb2RlID0gY29kZTtcblx0XHRcdFx0XHRcdGNvZGUgPSBcIlwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXh0SXNFbHNlID0gYXN0W2kgKyAxXTtcblx0XHRcdFx0XHRuZXh0SXNFbHNlID0gbmV4dElzRWxzZSAmJiBuZXh0SXNFbHNlWzBdID09PSBcImVsc2VcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YWdTdGFydCA9IG9uRXJyb3IgPyBcIjtcXG50cnl7XFxucmV0Kz1cIiA6IFwiXFxuK1wiO1xuXHRcdFx0XHRib3VuZE9uRXJyU3RhcnQgPSBcIlwiO1xuXHRcdFx0XHRib3VuZE9uRXJyRW5kID0gXCJcIjtcblxuXHRcdFx0XHRpZiAoaXNHZXRWYWwgJiYgKHBhdGhCaW5kaW5ncyB8fCB0cmlnZ2VyIHx8IGNvbnZlcnRlciAmJiBjb252ZXJ0ZXIgIT09IEhUTUwpKSB7XG5cdFx0XHRcdFx0Ly8gRm9yIGNvbnZlcnRWYWwgd2UgbmVlZCBhIGNvbXBpbGVkIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgbmV3IHRhZ0N0eChzKVxuXHRcdFx0XHRcdHRhZ0N0eEZuID0gbmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3LGosdVwiLCBcIiAvLyBcIiArIHRtcGxOYW1lICsgXCIgXCIgKyB0bXBsQmluZGluZ0tleSArIFwiIFwiICsgdGFnTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrIFwiXFxucmV0dXJuIHtcIiArIHRhZ0N0eCArIFwifTtcIik7XG5cdFx0XHRcdFx0dGFnQ3R4Rm4uX2VyID0gb25FcnJvcjtcblx0XHRcdFx0XHR0YWdDdHhGbi5fdGFnID0gdGFnTmFtZTtcblxuXHRcdFx0XHRcdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGFnQ3R4Rm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2V0UGF0aHModGFnQ3R4Rm4sIHBhdGhCaW5kaW5ncyk7XG5cdFx0XHRcdFx0dGFnUmVuZGVyID0gJ2MoXCInICsgY29udmVydGVyICsgJ1wiLHZpZXcsJztcblx0XHRcdFx0XHR1c2VDbnZ0ID0gdHJ1ZTtcblx0XHRcdFx0XHRib3VuZE9uRXJyU3RhcnQgPSB0YWdSZW5kZXIgKyB0bXBsQmluZGluZ0tleSArIFwiLFwiO1xuXHRcdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIilcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb2RlICs9IChpc0dldFZhbFxuXHRcdFx0XHRcdD8gKGlzTGlua0V4cHIgPyAob25FcnJvciA/IFwidHJ5e1xcblwiIDogXCJcIikgKyBcInJldHVybiBcIiA6IHRhZ1N0YXJ0KSArICh1c2VDbnZ0IC8vIENhbGwgX2NudnQgaWYgdGhlcmUgaXMgYSBjb252ZXJ0ZXI6IHt7Y252dDogLi4uIH19IG9yIHtee2NudnQ6IC4uLiB9fVxuXHRcdFx0XHRcdFx0PyAodXNlQ252dCA9IHVuZGVmaW5lZCwgdXNlVmlld3MgPSBoYXNDbnZ0ID0gdHJ1ZSwgdGFnUmVuZGVyICsgKHBhdGhCaW5kaW5nc1xuXHRcdFx0XHRcdFx0XHQ/ICgodG1wbEJpbmRpbmdzW3RtcGxCaW5kaW5nS2V5IC0gMV0gPSB0YWdDdHhGbiksIHRtcGxCaW5kaW5nS2V5KSAvLyBTdG9yZSB0aGUgY29tcGlsZWQgdGFnQ3R4Rm4gaW4gdG1wbC5ibmRzLCBhbmQgcGFzcyB0aGUga2V5IHRvIGNvbnZlcnRWYWwoKVxuXHRcdFx0XHRcdFx0XHQ6IFwie1wiICsgdGFnQ3R4ICsgXCJ9XCIpICsgXCIpXCIpXG5cdFx0XHRcdFx0XHQ6IHRhZ05hbWUgPT09IFwiPlwiXG5cdFx0XHRcdFx0XHRcdD8gKGhhc0VuY29kZXIgPSB0cnVlLCBcImgoXCIgKyBwYXJhbXNbMF0gKyBcIilcIilcblx0XHRcdFx0XHRcdFx0OiAoZ2V0c1ZhbCA9IHRydWUsIFwiKCh2PVwiICsgcGFyYW1zWzBdICsgJykhPW51bGw/djonICsgKGlzTGlua0V4cHIgPyAnbnVsbCknIDogJ1wiXCIpJykpXG5cdFx0XHRcdFx0XHRcdC8vIE5vbiBzdHJpY3QgZXF1YWxpdHkgc28gZGF0YS1saW5rPVwidGl0bGV7OmV4cHJ9XCIgd2l0aCBleHByPW51bGwvdW5kZWZpbmVkIHJlbW92ZXMgdGl0bGUgYXR0cmlidXRlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdDogKGhhc1RhZyA9IHRydWUsIFwiXFxue3ZpZXc6dmlldyx0bXBsOlwiIC8vIEFkZCB0aGlzIHRhZ0N0eCB0byB0aGUgY29tcGlsZWQgY29kZSBmb3IgdGhlIHRhZ0N0eHMgdG8gYmUgcGFzc2VkIHRvIHJlbmRlclRhZygpXG5cdFx0XHRcdFx0XHQrIChjb250ZW50ID8gbmVzdGVkVG1wbHMubGVuZ3RoIDogXCIwXCIpICsgXCIsXCIgLy8gRm9yIGJsb2NrIHRhZ3MsIHBhc3MgaW4gdGhlIGtleSAobmVzdGVkVG1wbHMubGVuZ3RoKSB0byB0aGUgbmVzdGVkIGNvbnRlbnQgdGVtcGxhdGVcblx0XHRcdFx0XHRcdCsgdGFnQ3R4ICsgXCJ9LFwiKSk7XG5cblx0XHRcdFx0aWYgKHRhZ0FuZEVsc2VzICYmICFuZXh0SXNFbHNlKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGRhdGEtbGluayBleHByZXNzaW9uIG9yIGFuIGlubGluZSB0YWcgd2l0aG91dCBhbnkgZWxzZXMsIG9yIHRoZSBsYXN0IHt7ZWxzZX19IG9mIGFuIGlubGluZSB0YWdcblx0XHRcdFx0XHQvLyBXZSBjb21wbGV0ZSB0aGUgY29kZSBmb3IgcmV0dXJuaW5nIHRoZSB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0Y29kZSA9IFwiW1wiICsgY29kZS5zbGljZSgwLCAtMSkgKyBcIl1cIjtcblx0XHRcdFx0XHR0YWdSZW5kZXIgPSAndChcIicgKyB0YWdBbmRFbHNlcyArICdcIix2aWV3LHRoaXMsJztcblx0XHRcdFx0XHRpZiAoaXNMaW5rRXhwciB8fCBwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBib3VuZCB0YWcgKGRhdGEtbGluayBleHByZXNzaW9uIG9yIGlubGluZSBib3VuZCB0YWcge157dGFnIC4uLn19KSBzbyB3ZSBzdG9yZSBhIGNvbXBpbGVkIHRhZ0N0eHMgZnVuY3Rpb24gaW4gdG1wLmJuZHNcblx0XHRcdFx0XHRcdGNvZGUgPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIFwiIC8vIFwiICsgdG1wbE5hbWUgKyBcIiBcIiArIHRtcGxCaW5kaW5nS2V5ICsgXCIgXCIgKyB0YWdBbmRFbHNlcyArIFwiXFxucmV0dXJuIFwiICsgY29kZSArIFwiO1wiKTtcblx0XHRcdFx0XHRcdGNvZGUuX2VyID0gb25FcnJvcjtcblx0XHRcdFx0XHRcdGNvZGUuX3RhZyA9IHRhZ0FuZEVsc2VzO1xuXHRcdFx0XHRcdFx0aWYgKHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0XHRzZXRQYXRocyh0bXBsQmluZGluZ3NbdG1wbEJpbmRpbmdLZXkgLSAxXSA9IGNvZGUsIHBhdGhCaW5kaW5ncyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gY29kZTsgLy8gRm9yIGEgZGF0YS1saW5rIGV4cHJlc3Npb24gd2UgcmV0dXJuIHRoZSBjb21waWxlZCB0YWdDdHhzIGZ1bmN0aW9uXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRib3VuZE9uRXJyU3RhcnQgPSB0YWdSZW5kZXIgKyB0bXBsQmluZGluZ0tleSArIFwiLHVuZGVmaW5lZCxcIjtcblx0XHRcdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIilcIjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBUaGlzIGlzIHRoZSBsYXN0IHt7ZWxzZX19IGZvciBhbiBpbmxpbmUgdGFnLlxuXHRcdFx0XHRcdC8vIEZvciBhIGJvdW5kIHRhZywgcGFzcyB0aGUgdGFnQ3R4cyBmbiBsb29rdXAga2V5IHRvIHJlbmRlclRhZy5cblx0XHRcdFx0XHQvLyBGb3IgYW4gdW5ib3VuZCB0YWcsIGluY2x1ZGUgdGhlIGNvZGUgZGlyZWN0bHkgZm9yIGV2YWx1YXRpbmcgdGFnQ3R4cyBhcnJheVxuXHRcdFx0XHRcdGNvZGUgPSBvbGRDb2RlICsgdGFnU3RhcnQgKyB0YWdSZW5kZXIgKyAodG1wbEJpbmRpbmdLZXkgfHwgY29kZSkgKyBcIilcIjtcblx0XHRcdFx0XHRwYXRoQmluZGluZ3MgPSAwO1xuXHRcdFx0XHRcdHRhZ0FuZEVsc2VzID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob25FcnJvcikge1xuXHRcdFx0XHRcdHVzZVZpZXdzID0gdHJ1ZTtcblx0XHRcdFx0XHRjb2RlICs9ICc7XFxufWNhdGNoKGUpe3JldCcgKyAoaXNMaW5rRXhwciA/IFwidXJuIFwiIDogXCIrPVwiKSArIGJvdW5kT25FcnJTdGFydCArICdqLl9lcnIoZSx2aWV3LCcgKyBvbkVycm9yICsgJyknICsgYm91bmRPbkVyckVuZCArICc7fScgKyAoaXNMaW5rRXhwciA/IFwiXCIgOiAncmV0PXJldCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIEluY2x1ZGUgb25seSB0aGUgdmFyIHJlZmVyZW5jZXMgdGhhdCBhcmUgbmVlZGVkIGluIHRoZSBjb2RlXG5cdGNvZGUgPSBcIi8vIFwiICsgdG1wbE5hbWVcblxuXHRcdCsgXCJcXG52YXIgdlwiXG5cdFx0KyAoaGFzVGFnID8gXCIsdD1qLl90YWdcIiA6IFwiXCIpICAgICAgICAgICAgICAgIC8vIGhhcyB0YWdcblx0XHQrIChoYXNDbnZ0ID8gXCIsYz1qLl9jbnZ0XCIgOiBcIlwiKSAgICAgICAgICAgICAgLy8gY29udmVydGVyXG5cdFx0KyAoaGFzRW5jb2RlciA/IFwiLGg9ai5faHRtbFwiIDogXCJcIikgICAgICAgICAgIC8vIGh0bWwgY29udmVydGVyXG5cdFx0KyAoaXNMaW5rRXhwciA/IFwiO1xcblwiIDogJyxyZXQ9XCJcIlxcbicpXG5cdFx0KyAodG1wbE9wdGlvbnMuZGVidWcgPyBcImRlYnVnZ2VyO1wiIDogXCJcIilcblx0XHQrIGNvZGVcblx0XHQrIChpc0xpbmtFeHByID8gXCJcXG5cIiA6IFwiO1xcbnJldHVybiByZXQ7XCIpO1xuXG5cdGlmICgkc3ViU2V0dGluZ3MuZGVidWdNb2RlICE9PSBmYWxzZSkge1xuXHRcdGNvZGUgPSBcInRyeSB7XFxuXCIgKyBjb2RlICsgXCJcXG59Y2F0Y2goZSl7XFxucmV0dXJuIGouX2VycihlLCB2aWV3KTtcXG59XCI7XG5cdH1cblxuXHR0cnkge1xuXHRcdGNvZGUgPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIGNvZGUpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0c3ludGF4RXJyb3IoXCJDb21waWxlZCB0ZW1wbGF0ZSBjb2RlOlxcblxcblwiICsgY29kZSArICdcXG46IFwiJyArIGUubWVzc2FnZSArICdcIicpO1xuXHR9XG5cdGlmICh0bXBsKSB7XG5cdFx0dG1wbC5mbiA9IGNvZGU7XG5cdFx0dG1wbC51c2VWaWV3cyA9ICEhdXNlVmlld3M7XG5cdH1cblx0cmV0dXJuIGNvZGU7XG59XG5cbi8vPT09PT09PT09PVxuLy8gVXRpbGl0aWVzXG4vLz09PT09PT09PT1cblxuLy8gTWVyZ2Ugb2JqZWN0cywgaW4gcGFydGljdWxhciBjb250ZXh0cyB3aGljaCBpbmhlcml0IGZyb20gcGFyZW50IGNvbnRleHRzXG5mdW5jdGlvbiBleHRlbmRDdHgoY29udGV4dCwgcGFyZW50Q29udGV4dCkge1xuXHQvLyBSZXR1cm4gY29weSBvZiBwYXJlbnRDb250ZXh0LCB1bmxlc3MgY29udGV4dCBpcyBkZWZpbmVkIGFuZCBpcyBkaWZmZXJlbnQsIGluIHdoaWNoIGNhc2UgcmV0dXJuIGEgbmV3IG1lcmdlZCBjb250ZXh0XG5cdC8vIElmIG5laXRoZXIgY29udGV4dCBub3IgcGFyZW50Q29udGV4dCBhcmUgZGVmaW5lZCwgcmV0dXJuIHVuZGVmaW5lZFxuXHRyZXR1cm4gY29udGV4dCAmJiBjb250ZXh0ICE9PSBwYXJlbnRDb250ZXh0XG5cdFx0PyAocGFyZW50Q29udGV4dFxuXHRcdFx0PyAkZXh0ZW5kKCRleHRlbmQoe30sIHBhcmVudENvbnRleHQpLCBjb250ZXh0KVxuXHRcdFx0OiBjb250ZXh0KVxuXHRcdDogcGFyZW50Q29udGV4dCAmJiAkZXh0ZW5kKHt9LCBwYXJlbnRDb250ZXh0KTtcbn1cblxuLy8gR2V0IGNoYXJhY3RlciBlbnRpdHkgZm9yIEhUTUwgYW5kIEF0dHJpYnV0ZSBlbmNvZGluZ1xuZnVuY3Rpb24gZ2V0Q2hhckVudGl0eShjaCkge1xuXHRyZXR1cm4gY2hhckVudGl0aWVzW2NoXSB8fCAoY2hhckVudGl0aWVzW2NoXSA9IFwiJiNcIiArIGNoLmNoYXJDb2RlQXQoMCkgKyBcIjtcIik7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldFByb3BzKHNvdXJjZSkge1xuXHQvLyB0aGlzIHBvaW50ZXIgaXMgdGhlTWFwIC0gd2hpY2ggaGFzIHRhZ0N0eC5wcm9wcyB0b29cblx0Ly8gYXJndW1lbnRzOiB0YWdDdHguYXJncy5cblx0dmFyIGtleSwgcHJvcCxcblx0XHRwcm9wcyA9IFtdO1xuXG5cdGlmICh0eXBlb2Ygc291cmNlID09PSBPQkpFQ1QpIHtcblx0XHRmb3IgKGtleSBpbiBzb3VyY2UpIHtcblx0XHRcdHByb3AgPSBzb3VyY2Vba2V5XTtcblx0XHRcdGlmIChrZXkgIT09ICRleHBhbmRvICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICEkaXNGdW5jdGlvbihwcm9wKSkge1xuXHRcdFx0XHRwcm9wcy5wdXNoKHtrZXk6IGtleSwgcHJvcDogcHJvcH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcHM7XG59XG5cbmZ1bmN0aW9uICRmblJlbmRlcihkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbikge1xuXHR2YXIgdG1wbEVsZW0gPSB0aGlzLmpxdWVyeSAmJiAodGhpc1swXSB8fCBlcnJvcignVW5rbm93biB0ZW1wbGF0ZScpKSwgLy8gVGFyZ2V0ZWQgZWxlbWVudCBub3QgZm91bmQgZm9yIGpRdWVyeSB0ZW1wbGF0ZSBzZWxlY3RvciBzdWNoIGFzIFwiI215VG1wbFwiXG5cdFx0dG1wbCA9IHRtcGxFbGVtLmdldEF0dHJpYnV0ZSh0bXBsQXR0cik7XG5cblx0cmV0dXJuIHJlbmRlckNvbnRlbnQuY2FsbCh0bXBsID8gJC5kYXRhKHRtcGxFbGVtKVtqc3ZUbXBsXSA6ICR0ZW1wbGF0ZXModG1wbEVsZW0pLCBkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbik7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVnaXN0ZXIgY29udmVydGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBodG1sRW5jb2RlKHRleHQpIHtcblx0Ly8gSFRNTCBlbmNvZGU6IFJlcGxhY2UgPCA+ICYgJyBhbmQgXCIgYnkgY29ycmVzcG9uZGluZyBlbnRpdGllcy5cblx0cmV0dXJuIHRleHQgIT0gdW5kZWZpbmVkID8gcklzSHRtbC50ZXN0KHRleHQpICYmIChcIlwiICsgdGV4dCkucmVwbGFjZShySHRtbEVuY29kZSwgZ2V0Q2hhckVudGl0eSkgfHwgdGV4dCA6IFwiXCI7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kc3ViID0gJHZpZXdzLnN1YjtcbiR2aWV3c1NldHRpbmdzID0gJHZpZXdzLnNldHRpbmdzO1xuXG5pZiAoIShqc3IgfHwgJCAmJiAkLnJlbmRlcikpIHtcblx0Ly8gSnNSZW5kZXIgbm90IGFscmVhZHkgbG9hZGVkLCBvciBsb2FkZWQgd2l0aG91dCBqUXVlcnksIGFuZCB3ZSBhcmUgbm93IG1vdmluZyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXBhY2Vcblx0Zm9yIChqc3ZTdG9yZU5hbWUgaW4ganN2U3RvcmVzKSB7XG5cdFx0cmVnaXN0ZXJTdG9yZShqc3ZTdG9yZU5hbWUsIGpzdlN0b3Jlc1tqc3ZTdG9yZU5hbWVdKTtcblx0fVxuXG5cdCRjb252ZXJ0ZXJzID0gJHZpZXdzLmNvbnZlcnRlcnM7XG5cdCRoZWxwZXJzID0gJHZpZXdzLmhlbHBlcnM7XG5cdCR0YWdzID0gJHZpZXdzLnRhZ3M7XG5cblx0JHN1Yi5fdGcucHJvdG90eXBlID0ge1xuXHRcdGJhc2VBcHBseTogYmFzZUFwcGx5LFxuXHRcdGN2dEFyZ3M6IGNvbnZlcnRBcmdzXG5cdH07XG5cblx0dG9wVmlldyA9ICRzdWIudG9wVmlldyA9IG5ldyBWaWV3KCk7XG5cblx0Ly9CUk9XU0VSLVNQRUNJRklDIENPREVcblx0aWYgKCQpIHtcblxuXHRcdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIGpRdWVyeSAoPSAkKSBpcyBsb2FkZWRcblxuXHRcdCQuZm4ucmVuZGVyID0gJGZuUmVuZGVyO1xuXHRcdCRleHBhbmRvID0gJC5leHBhbmRvO1xuXHRcdGlmICgkLm9ic2VydmFibGUpIHtcblx0XHRcdCRleHRlbmQoJHN1YiwgJC52aWV3cy5zdWIpOyAvLyBqcXVlcnkub2JzZXJ2YWJsZS5qcyB3YXMgbG9hZGVkIGJlZm9yZSBqc3JlbmRlci5qc1xuXHRcdFx0JHZpZXdzLm1hcCA9ICQudmlld3MubWFwO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXHRcdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIGpRdWVyeSBpcyBub3QgbG9hZGVkLlxuXG5cdFx0JCA9IHt9O1xuXG5cdFx0aWYgKHNldEdsb2JhbHMpIHtcblx0XHRcdGdsb2JhbC5qc3JlbmRlciA9ICQ7IC8vIFdlIGFyZSBsb2FkaW5nIGpzcmVuZGVyLmpzIGZyb20gYSBzY3JpcHQgZWxlbWVudCwgbm90IEFNRCBvciBDb21tb25KUywgc28gc2V0IGdsb2JhbFxuXHRcdH1cblxuXHRcdC8vIEVycm9yIHdhcm5pbmcgaWYganNyZW5kZXIuanMgaXMgdXNlZCBhcyB0ZW1wbGF0ZSBlbmdpbmUgb24gTm9kZS5qcyAoZS5nLiBFeHByZXNzIG9yIEhhcGkuLi4pXG5cdFx0Ly8gVXNlIGpzcmVuZGVyLW5vZGUuanMgaW5zdGVhZC4uLlxuXHRcdCQucmVuZGVyRmlsZSA9ICQuX19leHByZXNzID0gJC5jb21waWxlID0gZnVuY3Rpb24oKSB7IHRocm93IFwiTm9kZS5qczogdXNlIG5wbSBqc3JlbmRlciwgb3IganNyZW5kZXItbm9kZS5qc1wiOyB9O1xuXG5cdFx0Ly9FTkQgQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0JC5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2IpIHtcblx0XHRcdHJldHVybiB0eXBlb2Ygb2IgPT09IFwiZnVuY3Rpb25cIjtcblx0XHR9O1xuXG5cdFx0JC5pc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcblx0XHRcdHJldHVybiAoe30udG9TdHJpbmcpLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuXHRcdH07XG5cblx0XHQkc3ViLl9qcSA9IGZ1bmN0aW9uKGpxKSB7IC8vIHByaXZhdGUgbWV0aG9kIHRvIG1vdmUgZnJvbSBKc1JlbmRlciBBUElzIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lc3BhY2Vcblx0XHRcdGlmIChqcSAhPT0gJCkge1xuXHRcdFx0XHQkZXh0ZW5kKGpxLCAkKTsgLy8gbWFwIG92ZXIgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVzcGFjZVxuXHRcdFx0XHQkID0ganE7XG5cdFx0XHRcdCQuZm4ucmVuZGVyID0gJGZuUmVuZGVyO1xuXHRcdFx0XHRkZWxldGUgJC5qc3JlbmRlcjtcblx0XHRcdFx0JGV4cGFuZG8gPSAkLmV4cGFuZG87XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdCQuanNyZW5kZXIgPSB2ZXJzaW9uTnVtYmVyO1xuXHR9XG5cdCRzdWJTZXR0aW5ncyA9ICRzdWIuc2V0dGluZ3M7XG5cdCRzdWJTZXR0aW5ncy5hbGxvd0NvZGUgPSBmYWxzZTtcblx0JGlzRnVuY3Rpb24gPSAkLmlzRnVuY3Rpb247XG5cdCQucmVuZGVyID0gJHJlbmRlcjtcblx0JC52aWV3cyA9ICR2aWV3cztcblx0JC50ZW1wbGF0ZXMgPSAkdGVtcGxhdGVzID0gJHZpZXdzLnRlbXBsYXRlcztcblxuXHRmb3IgKHNldHRpbmcgaW4gJHN1YlNldHRpbmdzKSB7XG5cdFx0YWRkU2V0dGluZyhzZXR0aW5nKTtcblx0fVxuXG5cdCgkdmlld3NTZXR0aW5ncy5kZWJ1Z01vZGUgPSBmdW5jdGlvbihkZWJ1Z01vZGUpIHtcblx0XHRyZXR1cm4gZGVidWdNb2RlID09PSB1bmRlZmluZWRcblx0XHRcdD8gJHN1YlNldHRpbmdzLmRlYnVnTW9kZVxuXHRcdFx0OiAoXG5cdFx0XHRcdCRzdWJTZXR0aW5ncy5kZWJ1Z01vZGUgPSBkZWJ1Z01vZGUsXG5cdFx0XHRcdCRzdWJTZXR0aW5ncy5vbkVycm9yID0gZGVidWdNb2RlICsgXCJcIiA9PT0gZGVidWdNb2RlXG5cdFx0XHRcdFx0PyBuZXcgRnVuY3Rpb24oXCJcIiwgXCJyZXR1cm4gJ1wiICsgZGVidWdNb2RlICsgXCInO1wiIClcblx0XHRcdFx0XHQ6ICRpc0Z1bmN0aW9uKGRlYnVnTW9kZSlcblx0XHRcdFx0XHRcdD8gZGVidWdNb2RlXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFx0JHZpZXdzU2V0dGluZ3MpO1xuXHR9KShmYWxzZSk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5cdCRzdWJTZXR0aW5nc0FkdmFuY2VkID0gJHN1YlNldHRpbmdzLmFkdmFuY2VkID0ge1xuXHRcdHVzZVZpZXdzOiBmYWxzZSxcblx0XHRfanN2OiBmYWxzZSAvLyBGb3IgZ2xvYmFsIGFjY2VzcyB0byBKc1ZpZXdzIHN0b3JlXG5cdH07XG5cblx0Ly89PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWdpc3RlciB0YWdzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0JHRhZ3Moe1xuXHRcdFwiaWZcIjoge1xuXHRcdFx0cmVuZGVyOiBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0Ly8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3Ige3tpZn19IGFuZCBvbmNlIGZvciBlYWNoIHt7ZWxzZX19LlxuXHRcdFx0XHQvLyBXZSB3aWxsIHVzZSB0aGUgdGFnLnJlbmRlcmluZyBvYmplY3QgZm9yIGNhcnJ5aW5nIHJlbmRlcmluZyBzdGF0ZSBhY3Jvc3MgdGhlIGNhbGxzLlxuXHRcdFx0XHQvLyBJZiBub3QgZG9uZSAoYSBwcmV2aW91cyBibG9jayBoYXMgbm90IGJlZW4gcmVuZGVyZWQpLCBsb29rIGF0IGV4cHJlc3Npb24gZm9yIHRoaXMgYmxvY2sgYW5kIHJlbmRlciB0aGUgYmxvY2sgaWYgZXhwcmVzc2lvbiBpcyB0cnV0aHlcblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHJldHVybiBcIlwiXG5cdFx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0XHR0YWdDdHggPSBzZWxmLnRhZ0N0eCxcblx0XHRcdFx0XHRyZXQgPSAoc2VsZi5yZW5kZXJpbmcuZG9uZSB8fCAhdmFsICYmIChhcmd1bWVudHMubGVuZ3RoIHx8ICF0YWdDdHguaW5kZXgpKVxuXHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHQ6IChzZWxmLnJlbmRlcmluZy5kb25lID0gdHJ1ZSwgc2VsZi5zZWxlY3RlZCA9IHRhZ0N0eC5pbmRleCxcblx0XHRcdFx0XHRcdFx0Ly8gVGVzdCBpcyBzYXRpc2ZpZWQsIHNvIHJlbmRlciBjb250ZW50IG9uIGN1cnJlbnQgY29udGV4dC4gV2UgY2FsbCB0YWdDdHgucmVuZGVyKCkgcmF0aGVyIHRoYW4gcmV0dXJuIHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQvLyAod2hpY2ggd291bGQgYWxzbyByZW5kZXIgdGhlIHRtcGwvY29udGVudCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGJ1dCB3b3VsZCBpdGVyYXRlIGlmIGl0IGlzIGFuIGFycmF5KVxuXHRcdFx0XHRcdFx0XHR0YWdDdHgucmVuZGVyKHRhZ0N0eC52aWV3LCB0cnVlKSk7IC8vIG5vIGFyZywgc28gcmVuZGVycyBhZ2FpbnN0IHBhcmVudFZpZXcuZGF0YVxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiZm9yXCI6IHtcblx0XHRcdHJlbmRlcjogZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIHt7Zm9yfX0gYW5kIG9uY2UgZm9yIGVhY2gge3tlbHNlfX0uXG5cdFx0XHRcdC8vIFdlIHdpbGwgdXNlIHRoZSB0YWcucmVuZGVyaW5nIG9iamVjdCBmb3IgY2FycnlpbmcgcmVuZGVyaW5nIHN0YXRlIGFjcm9zcyB0aGUgY2FsbHMuXG5cdFx0XHRcdHZhciBmaW5hbEVsc2UgPSAhYXJndW1lbnRzLmxlbmd0aCxcblx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0XHR0YWdDdHggPSBzZWxmLnRhZ0N0eCxcblx0XHRcdFx0XHRyZXN1bHQgPSBcIlwiLFxuXHRcdFx0XHRcdGRvbmUgPSAwO1xuXG5cdFx0XHRcdGlmICghc2VsZi5yZW5kZXJpbmcuZG9uZSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZmluYWxFbHNlID8gdGFnQ3R4LnZpZXcuZGF0YSA6IHZhbDsgLy8gRm9yIHRoZSBmaW5hbCBlbHNlLCBkZWZhdWx0cyB0byBjdXJyZW50IGRhdGEgd2l0aG91dCBpdGVyYXRpb24uXG5cdFx0XHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJlc3VsdCArPSB0YWdDdHgucmVuZGVyKHZhbHVlLCBmaW5hbEVsc2UpOyAvLyBJdGVyYXRlcyBleGNlcHQgb24gZmluYWwgZWxzZSwgaWYgZGF0YSBpcyBhbiBhcnJheS4gKFVzZSB7e2luY2x1ZGV9fSB0byBjb21wb3NlIHRlbXBsYXRlcyB3aXRob3V0IGFycmF5IGl0ZXJhdGlvbilcblx0XHRcdFx0XHRcdGRvbmUgKz0gJGlzQXJyYXkodmFsdWUpID8gdmFsdWUubGVuZ3RoIDogMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHNlbGYucmVuZGVyaW5nLmRvbmUgPSBkb25lKSB7XG5cdFx0XHRcdFx0XHRzZWxmLnNlbGVjdGVkID0gdGFnQ3R4LmluZGV4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBJZiBub3RoaW5nIHdhcyByZW5kZXJlZCB3ZSB3aWxsIGxvb2sgYXQgdGhlIG5leHQge3tlbHNlfX0uIE90aGVyd2lzZSwgd2UgYXJlIGRvbmUuXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRwcm9wczoge1xuXHRcdFx0YmFzZVRhZzogXCJmb3JcIixcblx0XHRcdGRhdGFNYXA6IGRhdGFNYXAoZ2V0VGFyZ2V0UHJvcHMpLFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0aW5jbHVkZToge1xuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCIqXCI6IHtcblx0XHRcdC8vIHt7KiBjb2RlLi4uIH19IC0gSWdub3JlZCBpZiB0ZW1wbGF0ZS5hbGxvd0NvZGUgYW5kICQudmlld3Muc2V0dGluZ3MuYWxsb3dDb2RlIGFyZSBmYWxzZS4gT3RoZXJ3aXNlIGluY2x1ZGUgY29kZSBpbiBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdFx0cmVuZGVyOiByZXRWYWwsXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcIjoqXCI6IHtcblx0XHRcdC8vIHt7OiogcmV0dXJuZWRFeHByZXNzaW9uIH19IC0gSWdub3JlZCBpZiB0ZW1wbGF0ZS5hbGxvd0NvZGUgYW5kICQudmlld3Muc2V0dGluZ3MuYWxsb3dDb2RlIGFyZSBmYWxzZS4gT3RoZXJ3aXNlIGluY2x1ZGUgY29kZSBpbiBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdFx0cmVuZGVyOiByZXRWYWwsXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRkYmc6ICRoZWxwZXJzLmRiZyA9ICRjb252ZXJ0ZXJzLmRiZyA9IGRiZ0JyZWFrIC8vIFJlZ2lzdGVyIHt7ZGJnL319LCB7e2RiZzouLi59fSBhbmQgfmRiZygpIHRvIHRocm93IGFuZCBjYXRjaCwgYXMgYnJlYWtwb2ludHMgZm9yIGRlYnVnZ2luZy5cblx0fSk7XG5cblx0JGNvbnZlcnRlcnMoe1xuXHRcdGh0bWw6IGh0bWxFbmNvZGUsXG5cdFx0YXR0cjogaHRtbEVuY29kZSwgLy8gSW5jbHVkZXMgPiBlbmNvZGluZyBzaW5jZSByQ29udmVydE1hcmtlcnMgaW4gSnNWaWV3cyBkb2VzIG5vdCBza2lwID4gY2hhcmFjdGVycyBpbiBhdHRyaWJ1dGUgc3RyaW5nc1xuXHRcdHVybDogZnVuY3Rpb24odGV4dCkge1xuXHRcdFx0Ly8gVVJMIGVuY29kaW5nIGhlbHBlci5cblx0XHRcdHJldHVybiB0ZXh0ICE9IHVuZGVmaW5lZCA/IGVuY29kZVVSSShcIlwiICsgdGV4dCkgOiB0ZXh0ID09PSBudWxsID8gdGV4dCA6IFwiXCI7IC8vIG51bGwgcmV0dXJucyBudWxsLCBlLmcuIHRvIHJlbW92ZSBhdHRyaWJ1dGUuIHVuZGVmaW5lZCByZXR1cm5zIFwiXCJcblx0XHR9XG5cdH0pO1xufVxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBEZWZpbmUgZGVmYXVsdCBkZWxpbWl0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG4kc3ViU2V0dGluZ3MgPSAkc3ViLnNldHRpbmdzO1xuJGlzQXJyYXkgPSAoJHx8anNyKS5pc0FycmF5O1xuJHZpZXdzU2V0dGluZ3MuZGVsaW1pdGVycyhcInt7XCIsIFwifX1cIiwgXCJeXCIpO1xuXG5pZiAoanNyVG9KcSkgeyAvLyBNb3ZpbmcgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVwYWNlIC0gY29weSBvdmVyIHRoZSBzdG9yZWQgaXRlbXMgKHRlbXBsYXRlcywgY29udmVydGVycywgaGVscGVycy4uLilcblx0anNyLnZpZXdzLnN1Yi5fanEoJCk7XG59XG5yZXR1cm4gJCB8fCBqc3I7XG59LCB3aW5kb3cpKTtcbiIsIi8qZ2xvYmFsIFFVbml0LCB0ZXN0LCBlcXVhbCwgb2sqL1xuKGZ1bmN0aW9uKHVuZGVmaW5lZCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmJyb3dzZXJpZnkuZG9uZS5lbGV2ZW4gPSB0cnVlO1xuXG5RVW5pdC5tb2R1bGUoXCJCcm93c2VyaWZ5IC0gY2xpZW50IGNvZGVcIik7XG5cbnZhciBpc0lFOCA9IHdpbmRvdy5hdHRhY2hFdmVudCAmJiAhd2luZG93LmFkZEV2ZW50TGlzdGVuZXI7XG5cbmlmICghaXNJRTgpIHtcblxudGVzdCgnTW9yZSBFcnJvcnMgZm9yIHJlcXVpcmUoKSBmb3IgSnNSZW5kZXIsIEpzVmlld3MsIEpzT2JzZXJ2YWJsZSwgSnNSZW5kZXIgdGVtcGxhdGVzJywgZnVuY3Rpb24oKSB7XG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gSGlkZSBRVW5pdCBnbG9iYWwgalF1ZXJ5IGFuZCBhbnkgcHJldmlvdXMgZ2xvYmFsIGpzcmVuZGVyLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdHZhciBqUXVlcnkgPSBnbG9iYWwualF1ZXJ5LCBqc3IgPSBnbG9iYWwuanNyZW5kZXI7XG5cdGdsb2JhbC5qUXVlcnkgPSBnbG9iYWwuanNyZW5kZXIgPSB1bmRlZmluZWQ7XG5cblx0dmFyICRqcSwgJGpzciwgdG1wbCwgcmVzdWx0O1xuXG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEFjdCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cblx0JGpzciA9IHJlcXVpcmUoXCJqc3JlbmRlclwiKShyZXF1aXJlKFwialF1ZXJ5XCIpKTtcblx0XG5cdHRyeSB7XG5cdFx0JGpzciA9IHJlcXVpcmUoJy4uLy4uL2pxdWVyeS52aWV3cycpKCRqc3IpOyAvLyBTaG91bGQgcHJvdmlkZSBqUXVlcnkgd2l0aCBKc1JlbmRlciwgSnNPYnNlcnZhYmxlXG5cdH1cblx0Y2F0Y2goZSkge1xuXHRcdHJlc3VsdCA9IGU7XG5cdH1cblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEFzc2VydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0ZXF1YWwocmVzdWx0LCBcIkpzVmlld3MgcmVxdWlyZXMgSnNPYnNlcnZhYmxlXCIsICdyZXF1aXJlKFwianF1ZXJ5LnZpZXdzXCIpKCRqc3IpIHRocm93cyBcIkpzVmlld3MgcmVxdWlyZXMgSnNPYnNlcnZhYmxlXCInKTtcblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBY3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG5cdCRqc3IgPSByZXF1aXJlKFwianNyZW5kZXJcIikocmVxdWlyZShcImpRdWVyeVwiKSk7XG5cdFxuXHR0cnkge1xuXHRcdCRqc3IgPSByZXF1aXJlKCcuLi8uLi8nKSgpOyAvLyBTaG91bGQgcHJvdmlkZSBqUXVlcnlcblx0fVxuXHRjYXRjaChlKSB7XG5cdFx0cmVzdWx0ID0gZTtcblx0fVxuXG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gQXNzZXJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXHRlcXVhbChyZXN1bHQsIFwiSnNWaWV3cyByZXF1aXJlcyBqUXVlcnlcIiwgJ3JlcXVpcmUoXCJqc3ZpZXdzXCIpKCQpIHRocm93cyBcIkpzVmlld3MgcmVxdWlyZXMgalF1ZXJ5XCInKTtcblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBY3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG5cdHRyeSB7XG5cdFx0JGpzciA9IHJlcXVpcmUoJy4uLy4uLycpKFwiYVwiKTsgLy8gU2hvdWxkIHByb3ZpZGUgalF1ZXJ5XG5cdH1cblx0Y2F0Y2goZSkge1xuXHRcdHJlc3VsdCA9IGU7XG5cdH1cblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEFzc2VydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0ZXF1YWwocmVzdWx0LCBcIkpzVmlld3MgcmVxdWlyZXMgalF1ZXJ5XCIsICdyZXF1aXJlKFwianN2aWV3c1wiKShcImFcIikgdGhyb3dzIFwiSnNWaWV3cyByZXF1aXJlcyBqUXVlcnlcIicpO1xuXG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEFjdCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cblx0JGpzciA9IHJlcXVpcmUoXCJqc3JlbmRlclwiKTtcblx0XG5cdHRyeSB7XG5cdFx0JGpzciA9IHJlcXVpcmUoJy4uLy4uLycpKCRqc3IpOyAvLyBTaG91bGQgcHJvdmlkZSBqUXVlcnlcblx0fVxuXHRjYXRjaChlKSB7XG5cdFx0cmVzdWx0ID0gZTtcblx0fVxuXG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gQXNzZXJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXHRlcXVhbChyZXN1bHQsIFwiSnNWaWV3cyByZXF1aXJlcyBqUXVlcnlcIiwgJ3JlcXVpcmUoXCJqc3ZpZXdzXCIpKGpRdWVyeSkgdGhyb3dzIFwiSnNWaWV3cyByZXF1aXJlcyBqUXVlcnlcIicpO1xuXG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gUmVzZXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdGdsb2JhbC5qUXVlcnkgPSBqUXVlcnk7IC8vIFJlcGxhY2UgUVVuaXQgZ2xvYmFsIGpRdWVyeVxuXHRnbG9iYWwuanNyZW5kZXIgPSBqc3I7IC8vIFJlcGxhY2UgYW55IHByZXZpb3VzIGdsb2JhbCBqc3JlbmRlclxufSk7XG59XG59KSgpO1xuIl19 diff --git a/test/browserify/bundles/12-nested-bundle.js b/test/browserify/bundles/12-nested-bundle.js index d884633..d716274 100644 --- a/test/browserify/bundles/12-nested-bundle.js +++ b/test/browserify/bundles/12-nested-bundle.js @@ -1,5 +1,5 @@ (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 to string or (multiselect) array of strings - } - if (cvtBack) { - sourceValue = cvtBack.call(tag, sourceValue); + while (binding = rSplitBindings.exec(bindings)) { + if (binding = bindingStore[binding[1]]) { + if (to = binding.to) { + // The binding has a 'to' field, which is of the form [[targetObject, toPath], cvtBack] + linkCtx = binding.linkCtx; + view = linkCtx.view; + tag = linkCtx.tag || view.tag; + $source = $(source); + onBeforeChange = view.hlp(onBeforeChangeStr); // TODO Can we optimize this and other instances of same? + onAfterChange = view.hlp(onAfterChangeStr); // TODO Can we optimize this and other instances of same + fromAttr = defaultAttr(source); + setter = fnSetters[fromAttr]; + if (sourceValue === undefined) { + sourceValue = $isFunction(fromAttr) + ? fromAttr(source) + : setter + ? $source[setter]() + : $source.attr(fromAttr); + } + cnvtName = to[1]; + to = to[0]; // [object, path] + to = to + "" === to ? [linkCtx.data, to] : to; + if (cnvtName) { + if ($isFunction(cnvtName)) { + cvtBack = cnvtName; + } else { + cvtBack = view.getRsc("converters", cnvtName); } + } + if (linkCtx.elem.nodeName === "SELECT") { + linkCtx.elem._jsvSel = sourceValue = sourceValue || (linkCtx.elem.multiple ? [] : sourceValue); + // data-link to string or (multiselect) array of strings + } + if (cvtBack) { + sourceValue = cvtBack.call(tag, sourceValue); + } - // Set linkCtx on view, dynamically, just during this handler call - oldLinkCtx = view.linkCtx; - view.linkCtx = linkCtx; - eventArgs = { - change: "change", - oldValue: linkCtx._val, - value: sourceValue - }; - if ((!onBeforeChange || !(cancel = onBeforeChange.call(linkCtx, ev, eventArgs) === false)) && - (!tag || !tag.onBeforeChange || !(cancel = tag.onBeforeChange(ev, eventArgs) === false)) && - sourceValue !== undefined) { - target = to[0]; // [object, path] - if (sourceValue !== undefined && target) { - if (target._jsv) { - exprOb = target; - target = linkCtx.data; - while (exprOb && exprOb.sb) { - target = linkCtx._ctxCb(exprOb, target); - exprOb = exprOb.sb; - } - } - if (tag) { - tag._.chging = true; // marker to prevent tag change event triggering its own refresh + // Set linkCtx on view, dynamically, just during this handler call + oldLinkCtx = view.linkCtx; + view.linkCtx = linkCtx; + eventArgs = { + change: "change", + oldValue: linkCtx._val, + value: sourceValue + }; + if ((!onBeforeChange || !(cancel = onBeforeChange.call(linkCtx, ev, eventArgs) === false)) && + (!tag || !tag.onBeforeChange || !(cancel = tag.onBeforeChange(ev, eventArgs) === false)) && + sourceValue !== undefined) { + target = to[0]; // [object, path] + if (sourceValue !== undefined && target) { + if (target._jsv) { + contextCb = linkCtx._ctxCb; // This is a computed value + exprOb = target; + target = linkCtx.data; + if (exprOb._cpCtx) { // Computed value for a contextual parameter + target = exprOb.data; // The data for the contextual view (where contextual param expression evaluated/assigned) + contextCb = exprOb._cpCtx; // Context callback for contextual view } - $observable(target).setProperty(to[1], sourceValue); // 2way binding change event - observably updating bound object - if (onAfterChange) { - onAfterChange.call(linkCtx, ev, eventArgs); + while (exprOb && exprOb.sb) { // Step through chained computed values to leaf one... + target = contextCb(exprOb, target); + exprOb = exprOb.sb; } - if (tag) { - if (tag.onAfterChange) { - tag.onAfterChange(ev, eventArgs); - } - tag._.chging = undefined; // clear the marker + } + if (tag) { + tag._.chging = true; // marker to prevent tag change event triggering its own refresh + } + $observable(target).setProperty(to[1], sourceValue); // 2way binding change event - observably updating bound object + if (onAfterChange) { + onAfterChange.call(linkCtx, ev, eventArgs); + } + if (tag) { + if (tag.onAfterChange) { + tag.onAfterChange(ev, eventArgs); } - linkCtx._val = sourceValue; + tag._.chging = undefined; // clear the marker } + linkCtx._val = sourceValue; } - view.linkCtx = oldLinkCtx; } + view.linkCtx = oldLinkCtx; } } } @@ -1896,8 +1910,8 @@ function addBindingMarkers(value, view, tag) { // observeAndBind //--------------- -function observeAndBind(linkCtx, source, target) { //TODO? linkFnArgs) {; - var binding, l, linkedElem, exprFnDeps, exprOb, +function observeAndBind(linkCtx, source, target) { + var binding, l, k, linkedElem, exprFnDeps, exprOb, prop, propDeps, tag = linkCtx.tag, cvtBk = linkCtx.convertBack, depends = [], @@ -1922,6 +1936,22 @@ function observeAndBind(linkCtx, source, target) { //TODO? linkFnArgs) {; exprFnDeps = linkCtx.fn.deps.slice(); // Make a copy of the dependency paths for the compiled linkCtx expression - to pass to observe(). In getInnerCb(), // (and whenever the object is updated, in innerCb), we will set exprOb.ob to the current object returned by that computed expression, for this view. + + if (tag && tag.boundProps) { + // Add dependency paths for declared boundProps (so no need to writh ^myprop=... to get binding) and for linkedProp too if there is one + l = tag.boundProps.length; + while (l--) { + prop = tag.boundProps[l]; + k = tag._.bnd.paths.length; + while (k--) { + propDeps = tag._.bnd.paths[k][prop]; + if (propDeps && propDeps.skp) { // Not already a bound prop ^prop=expression; + exprFnDeps = exprFnDeps.concat(propDeps); // Add dependencies for this prop expression + } + } + } + } + l = exprFnDeps.length; while (l--) { exprOb = exprFnDeps[l]; @@ -2790,7 +2820,7 @@ function bindDataLinkTarget(linkCtx, linkFn) { $sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx), "link", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers)); } - linkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]} + linkCtx._ctxCb = $sub._gccb(linkCtx.view); // getContextCallback: _ctxCb, for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]} linkCtx._hdl = handler; // handler._ctx = linkCtx; Could pass linkCtx for use in a depends = function() {} call, so depends is different for different linkCtx's handler(true); @@ -2911,9 +2941,9 @@ function callAfterLink(tag, ev, eventArgs) { linkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem; displayElem = tag.displayElem || linkedElem; -if (linkedElem && linkedElem[0]) { - if (!tag._.chging) { - val = tag.cvtArgs()[0]; + if (linkedElem && linkedElem[0]) { + val = tag.cvtArgs()[0]; + if (val !== undefined && !tag._.chging) { l = linkedElem.length; while (l--) { linkedEl = linkedElem[l]; @@ -2935,7 +2965,7 @@ if (linkedElem && linkedElem[0]) { } else if (linkedEl.type === RADIO) { linkedEl[CHECKED] = (linkedEl.value === val); } else { - linkedEl.value = val; + $(linkedEl).val(val); // Use jQuery for attrHooks - can't just set value (on select, for example) } } else if (linkedEl.contentEditable === TRUE) { linkedEl.innerHTML = val; @@ -2991,14 +3021,15 @@ function bindTo(binding, tag, linkedElem, cvtBk) { // So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, "d.e"], and we bind to the path on the returned object, exprOb.ob, as target // Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z - var bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, totry, + var bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, linkCtx = binding.linkCtx, + contextCb = linkCtx._ctxCb, source = linkCtx.data, - paths = linkCtx.fn.paths; + paths = linkCtx.fn.paths[0]; tag = tag || linkedElem._jsvLkEl; - if (binding && paths && !binding.to) { + if (binding && paths && !binding.to) { oldTrig = linkedElem._jsvTr || false; if (tag) { cvtBk = tag.convertBack || cvtBk; @@ -3019,8 +3050,7 @@ function bindTo(binding, tag, linkedElem, cvtBk) { } paths = (bindto = paths._jsvto) || paths[0]; - pathIndex = paths && paths.length; - if (pathIndex && (!tag || tag.tagCtx.args.length)) { + if (pathIndex = paths && paths.length) { lastPath = paths[pathIndex - 1]; if (lastPath._jsv) { bindtoOb = lastPath; @@ -3036,15 +3066,18 @@ function bindTo(binding, tag, linkedElem, cvtBk) { lastPath ]; } else { - while ((totry = linkCtx._ctxCb(path = lastPath.split("^").join("."), source)) && (l = totry.length)) { + while ((to = contextCb(path = lastPath.split("^").join("."), source)) && (l = to.length)) { // Recursively dereference any ~foo or #bar tokens in the path. (Recursive because ~foo may be a contextual param which has // its own dependencies on other ~foo #bar components) - to = totry; - if (to._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag) - to = [to[l-3], to[l-2]]; + if (to[0]._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag) + to = to[0]; // so 'to' is the [view, expression/dependencies] for the contextual parameter + contextCb = $sub._gccb(to[0]); // getContextCallback: Move contextCb up to view where contextual parameter was assigned lastPath = to[1]; - if (lastPath._jsv) { + to = [to[0].data, to[1]]; + if (lastPath._jsv) { // computed value bindtoOb = lastPath; + bindtoOb.data = to[0]; + bindtoOb._cpCtx = contextCb; while (lastPath.sb && lastPath.sb._jsv) { path = lastPath = lastPath.sb; } @@ -3237,64 +3270,6 @@ function $unlink(to) { // Helpers //======== -function getContextCb(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc. - // TODO Consider exposing or allowing override, as public API - return function(path, object, depth) { - // TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on - // the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times - var tokens, tag, items, helper, last, nextPath, l; - if (view && path) { - if (path._jsv) { - return path._jsv.call(view.tmpl, object, view, $sub); - } - if (path.charAt(0) === "~") { - // We return new items to insert into the sequence, replacing the "~a.b.c" string: - // [helperObject 'a', "a.b.c" currentDataItem] so currentDataItem becomes the object for subsequent paths. - if (path.slice(0, 4) === "~tag") { - tag = view.ctx; - if (path.charAt(4) === ".") { - // "~tag.xxx" - tokens = path.slice(5).split("."); - tag = tag.tag; - } - if (tokens) { - return tag ? [tag, tokens.join("."), object] : []; - } - } - path = path.slice(1).split("."); - if (helper = view.hlp(last = path.shift(), true)) { - if (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [data, ctxPrmDependencies ...] - if (path.length) { - nextPath = "." + path.join("."); - last = helper[l = helper.length-1]; - if (last._jsv) { - last.sb = nextPath; - last.bnd = !!depth; - } else { - helper[l] = (last + nextPath).replace("#data.", ""); - if (last.slice(0, 5) === "#view") { - helper[l] = helper[l].slice(6); - helper.splice(l, 0, view); - } - } - } - helper.push(object); - items = helper; - } else if (path.length || $isFunction(helper)) { - items = [helper, path.join("."), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam - } - } - return items || []; - } - if (path.charAt(0) === "#") { - // We return new items to insert into the sequence, replacing the "#a.b.c" string: [view, "a.b.c" currentDataItem] - // so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes. - return path === "#data" ? [] : [view, path.replace(rViewPath, ""), object]; - } - } - }; -} - function inputAttrib(elem) { return elem.type === CHECKBOX ? elem[CHECKED] : elem.value; } @@ -4252,6 +4227,63 @@ $sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each refe return clones; }; +$sub._gccb = function(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc. + // TODO Consider exposing or allowing override, as public API + return function(path, object, depth) { + // TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on + // the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times + var tokens, tag, items, helper, last, nextPath, l; + if (view && path) { + if (path._jsv) { + return path._jsv.call(view.tmpl, object, view, $sub); + } + if (path.charAt(0) === "~") { + // We return new items to insert into the sequence, replacing the "~a.b.c" string: + // [helperObject 'a', "a.b.c" currentDataItem] so currentDataItem becomes the object for subsequent paths. + if (path.slice(0, 4) === "~tag") { + tag = view.ctx; + if (path.charAt(4) === ".") { + // "~tag.xxx" + tokens = path.slice(5).split("."); + tag = tag.tag; + } + if (tokens) { + return tag ? [tag, tokens.join("."), object] : []; + } + } + path = path.slice(1).split("."); + if (helper = view.hlp(last = path.shift(), true)) { + if (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [view, ctxPrmDependencies ...] + if (path.length) { + nextPath = "." + path.join("."); + last = helper[l = helper.length-1]; + if (last._jsv) { + last.sb = nextPath; + last.bnd = !!depth; + } else { + helper[l] = (last + nextPath).replace("#data.", ""); + if (last.slice(0, 5) === "#view") { + helper[l] = helper[l].slice(6); + helper.splice(l, 0, view); + } + } + } + items = [helper]; // Contextual parameter + } else if (path.length || $isFunction(helper)) { + items = [helper, path.join("."), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam + } + } + return items || []; + } + if (path.charAt(0) === "#") { + // We return new items to insert into the sequence, replacing the "#a.b.c" string: [view, "a.b.c" currentDataItem] + // so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes. + return path === "#data" ? [] : [view, path.replace(rViewPath, ""), object]; + } + } + }; +}; + //========================= // Extend $.views.settings //========================= @@ -4259,7 +4291,7 @@ $sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each refe oldAdvSet = $sub.advSet; $sub.advSet = function() { // refresh advanced settings - oldAdvSet(); + oldAdvSet.call($sub); global._jsv = $subSettingsAdvanced._jsv ? $extend(global._jsv || {}, { // create global _jsv, for accessing views, etc views: viewStore, @@ -13523,7 +13555,7 @@ return jQuery; })); },{}],4:[function(require,module,exports){ -/*! JsRender v0.9.82 (Beta): http://jsviews.com/#jsrender */ +/*! JsRender v0.9.83 (Beta): http://jsviews.com/#jsrender */ /*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ /* * Best-of-breed templating in browser or on Node.js. @@ -13569,7 +13601,7 @@ var setGlobals = $ === false; // Only set globals if script block in browser (no $ = $ && $.fn ? $ : global.jQuery; // $ is jQuery passed in by CommonJS loader (Browserify), or global jQuery. -var versionNumber = "v0.9.82", +var versionNumber = "v0.9.83", jsvStoreName, rTag, rTmplString, topView, $views, $expando, //TODO tmplFnsCache = {}, @@ -13877,9 +13909,9 @@ function getHelper(helper, isContextCb) { res = $helpers[helper]; } if (res && res._cp) { // If this helper resource is a contextual parameter, ~foo=expr - if (isContextCb) { // In a context callback for a contextual param, return the [currentData, dependencies...] array - needed for observe call + if (isContextCb) { // In a context callback for a contextual param, return the [view, dependencies...] array - needed for observe call deps = $sub._ceo(res[1].deps); // fn deps, with any exprObs cloned - deps.unshift(res[0].data); // view.data + deps.unshift(res[0]); // view deps._cp = true; return deps; } @@ -14152,7 +14184,7 @@ function renderTag(tagName, parentView, tmpl, tagCtxs, isUpdate, onError) { if (itemRet === undefined) { contentCtx = args[0]; // Default data context for wrapped block content is the first argument. Defined tag.contentCtx function to override this. if (tag.contentCtx) { - contentCtx = tag.contentCtx(contentCtx) || contentCtx; + contentCtx = tag.contentCtx(contentCtx); } itemRet = tagCtx.render(contentCtx, true) || (isUpdate ? undefined : ""); } @@ -15238,15 +15270,15 @@ function setPaths(fn, pathsArr) { i = 0, l = pathsArr.length; fn.deps = []; + fn.paths = []; // The array of path binding (array/dictionary)s for each tag/else block's args and props for (; i < l; i++) { - paths = pathsArr[i]; + fn.paths.push(paths = pathsArr[i]); for (key in paths) { - if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length) { + if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length && !paths[key].skp) { fn.deps = fn.deps.concat(paths[key]); // deps is the concatenation of the paths arrays for the different bindings } } } - fn.paths = paths; // The array of paths arrays for the different bindings } function parsedParam(args, props, ctx) { @@ -15403,7 +15435,8 @@ function parseParams(params, pathBindings, tmpl) { ) : eq // named param. Remove bindings for arg and create instead bindings array for prop - ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, bound && (bindings = bndCtx.bd = pathBindings[named] = []), path + ':') + ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, + bindings && ((bindings = bndCtx.bd = pathBindings[named] = []), bindings.skp = !bound), path + ':') : path // path ? (path.split("^").join(".").replace(rPath, parsePath) @@ -15673,7 +15706,7 @@ function getTargetProps(source) { } function $fnRender(data, context, noIteration) { - var tmplElem = this.jquery && (this[0] || error('Unknown template: "' + this.selector + '"')), + var tmplElem = this.jquery && (this[0] || error('Unknown template')), // Targeted element not found for jQuery template selector such as "#myTmpl" tmpl = tmplElem.getAttribute(tmplAttr); return renderContent.call(tmpl ? $.data(tmplElem)[jsvTmpl] : $templates(tmplElem), data, context, noIteration); @@ -15943,4 +15976,4 @@ module.exports = $ ? $.templates("./test/templates/name-template.html", mkup) : }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}]},{},[5]) -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqcXVlcnkub2JzZXJ2YWJsZS5qcyIsImpxdWVyeS52aWV3cy5qcyIsIm5vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCJub2RlX21vZHVsZXMvanNyZW5kZXIvanNyZW5kZXIuanMiLCJ0ZXN0L2Jyb3dzZXJpZnkvNy11bml0LXRlc3RzLmpzIiwidGVzdC90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNybkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzEvUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzd5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKiEgSnNPYnNlcnZhYmxlIHYwLjkuODIgKEJldGEpOiBodHRwOi8vanN2aWV3cy5jb20vI2pzb2JzZXJ2YWJsZSAqL1xuLypcbiAqIFN1YmNvbXBvbmVudCBvZiBKc1ZpZXdzXG4gKiBEYXRhIGNoYW5nZSBldmVudHMgZm9yIGRhdGEtbGlua2luZ1xuICpcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vanNoaW50IC1XMDE4LCAtVzA0MVxuXG4oZnVuY3Rpb24oZmFjdG9yeSwgZ2xvYmFsKSB7XG5cdC8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG5cdHZhciAkID0gZ2xvYmFsLmpRdWVyeTtcblxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHsgLy8gQ29tbW9uSlMgZS5nLiBCcm93c2VyaWZ5XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSAkXG5cdFx0XHQ/IGZhY3RvcnkoZ2xvYmFsLCAkKVxuXHRcdFx0OiBmdW5jdGlvbigkKSB7IC8vIElmIG5vIGdsb2JhbCBqUXVlcnksIHRha2UgalF1ZXJ5IHBhc3NlZCBhcyBwYXJhbWV0ZXI6IHJlcXVpcmUoXCJqc29ic2VydmFibGVcIikoalF1ZXJ5KVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdFx0fTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgeyAvLyBBTUQgc2NyaXB0IGxvYWRlciwgZS5nLiBSZXF1aXJlSlNcblx0XHRkZWZpbmUoW1wianF1ZXJ5XCJdLCBmdW5jdGlvbigkKSB7XG5cdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpOyAvLyBSZXF1aXJlIGpRdWVyeVxuXHRcdH0pO1xuXHR9IGVsc2UgeyAvLyBCcm93c2VyIHVzaW5nIHBsYWluIDxzY3JpcHQ+IHRhZ1xuXHRcdGZhY3RvcnkoZ2xvYmFsLCBmYWxzZSk7XG5cdH1cbn0gKFxuXG4vLyBmYWN0b3J5IChmb3IganN2aWV3cy5qcylcbmZ1bmN0aW9uKGdsb2JhbCwgJCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcbnZhciBzZXRHbG9iYWxzID0gJCA9PT0gZmFsc2U7IC8vIE9ubHkgc2V0IGdsb2JhbHMgaWYgc2NyaXB0IGJsb2NrIGluIGJyb3dzZXIgKG5vdCBBTUQgYW5kIG5vdCBDb21tb25KUylcblxuJCA9ICQgfHwgZ2xvYmFsLmpRdWVyeTtcblxuaWYgKCEkIHx8ICEkLmZuKSB7XG5cdC8vIGpRdWVyeSBpcyBub3QgbG9hZGVkLlxuXHR0aHJvdyBcIkpzT2JzZXJ2YWJsZSByZXF1aXJlcyBqUXVlcnlcIjsgLy8gV2UgcmVxdWlyZSBqUXVlcnlcbn1cblxudmFyIHZlcnNpb25OdW1iZXIgPSBcInYwLjkuODJcIixcblx0JG9ic2VydmUsICRvYnNlcnZhYmxlLFxuXG5cdCR2aWV3cyA9ICQudmlld3MgPVxuXHRcdCQudmlld3MgfHxcblx0XHRzZXRHbG9iYWxzICYmIGdsb2JhbC5qc3JlbmRlciAmJiBqc3JlbmRlci52aWV3cyB8fCAvL2pzcmVuZGVyIHdhcyBsb2FkZWQgYmVmb3JlIGpxdWVyeS5vYnNlcnZhYmxlXG5cdFx0eyAvLyBqc3JlbmRlciBub3QgbG9hZGVkIHNvIHNldCB1cCAkLnZpZXdzIGFuZCAkLnZpZXdzLnN1YiBoZXJlLCBhbmQgbWVyZ2UgYmFjayBpbiBqc3JlbmRlciBpZiBsb2FkZWQgYWZ0ZXJ3YXJkc1xuXHRcdFx0anN2aWV3czogdmVyc2lvbk51bWJlcixcblx0XHRcdHN1Yjoge1xuXHRcdFx0XHQvLyBzdWJzY3JpcHRpb24sIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0XHRzZXR0aW5nczoge31cblx0XHRcdH0sXG5cdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRhZHZhbmNlZDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0XHQkc3ViU2V0dGluZ3NBZHZhbmNlZCA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZCA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZCB8fCB7X2pzdjogdHJ1ZX07XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdFx0XHQ/IChcblx0XHRcdFx0XHRcdFx0XCJfanN2XCIgaW4gdmFsdWUgJiYgKCRzdWJTZXR0aW5nc0FkdmFuY2VkLl9qc3YgPSB2YWx1ZS5fanN2KSxcblx0XHRcdFx0XHRcdFx0JHN1Yi5hZHZTZXQoKSxcblx0XHRcdFx0XHRcdFx0JHZpZXdzLnNldHRpbmdzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6ICRzdWJTZXR0aW5nc0FkdmFuY2VkO1xuXHRcdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHQkc3ViID0gJHZpZXdzLnN1Yixcblx0JHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncyxcblx0JHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQsXG5cdCRpc0Z1bmN0aW9uID0gJC5pc0Z1bmN0aW9uLFxuXHQkZXhwYW5kbyA9ICQuZXhwYW5kbyxcblx0JGlzQXJyYXkgPSAkLmlzQXJyYXksXG5cdE9CSkVDVCA9IFwib2JqZWN0XCI7XG5cbmlmICghJC5vYnNlcnZlKSB7XG5cblx0dmFyICRldmVudFNwZWNpYWwgPSAkLmV2ZW50LnNwZWNpYWwsXG5cdFx0c2xpY2UgPSBbXS5zbGljZSxcblx0XHRzcGxpY2UgPSBbXS5zcGxpY2UsXG5cdFx0Y29uY2F0ID0gW10uY29uY2F0LFxuXHRcdFBBUlNFSU5UID0gcGFyc2VJbnQsXG5cdFx0ck5vdFdoaXRlID0gL1xcUysvZyxcblx0XHRwcm9wZXJ0eUNoYW5nZVN0ciA9ICRzdWIucHJvcENobmcgPSAkc3ViLnByb3BDaG5nIHx8IFwicHJvcGVydHlDaGFuZ2VcIiwvLyBUaGVzZSB0d28gc2V0dGluZ3MgY2FuIGJlIG92ZXJyaWRkZW4gb24gc2V0dGluZ3MgYWZ0ZXIgbG9hZGluZ1xuXHRcdGFycmF5Q2hhbmdlU3RyID0gJHN1Yi5hcnJDaG5nID0gJHN1Yi5hcnJDaG5nIHx8IFwiYXJyYXlDaGFuZ2VcIiwgICAgICAgIC8vIGpzUmVuZGVyLCBhbmQgcHJpb3IgdG8gbG9hZGluZyBqcXVlcnkub2JzZXJ2YWJsZS5qcyBhbmQvb3IgSnNWaWV3c1xuXHRcdGNiQmluZGluZ3NTdG9yZSA9IHt9LFxuXHRcdG9ic2VydmVTdHIgPSBwcm9wZXJ0eUNoYW5nZVN0ciArIFwiLm9ic2VydmVcIixcblx0XHRvYnNlcnZlT2JqS2V5ID0gMSxcblx0XHRvYnNlcnZlQ2JLZXkgPSAxLFxuXHRcdG9ic2VydmVJbm5lckNiS2V5ID0gMSxcblx0XHQkaGFzRGF0YSA9ICQuaGFzRGF0YSxcblx0XHQkZGF0YSA9ICQuZGF0YSxcblx0XHRyZW1vdmUgPSB7fSwgLy8gZmxhZyBmb3IgcmVtb3ZlUHJvcGVydHlcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRnZXRDYktleSA9IGZ1bmN0aW9uKGNiKSB7XG5cdFx0cmV0dXJuIGNiLl9jSWQgPSBjYi5fY0lkIHx8IChcIi5vYnNcIiArIG9ic2VydmVDYktleSsrKTtcblx0fSxcblxuXHRPYmplY3RPYnNlcnZhYmxlID0gZnVuY3Rpb24obnMsIGRhdGEpIHtcblx0XHR0aGlzLl9kYXRhID0gZGF0YTtcblx0XHR0aGlzLl9ucyA9IG5zO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdEFycmF5T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKG5zLCBkYXRhKSB7XG5cdFx0dGhpcy5fZGF0YSA9IGRhdGE7XG5cdFx0dGhpcy5fbnMgPSBucztcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwQXJyYXkgPSBmdW5jdGlvbihkYXRhKSB7XG5cdFx0cmV0dXJuICRpc0FycmF5KGRhdGEpXG5cdFx0XHQ/IFtkYXRhXVxuXHRcdFx0OiBkYXRhO1xuXHR9LFxuXG5cdHJlc29sdmVQYXRoT2JqZWN0cyA9IGZ1bmN0aW9uKHBhdGhzLCByb290LCBjYWxsYmFjaykge1xuXHRcdHBhdGhzID0gcGF0aHNcblx0XHRcdD8gJGlzQXJyYXkocGF0aHMpXG5cdFx0XHRcdD8gcGF0aHNcblx0XHRcdFx0OiBbcGF0aHNdXG5cdFx0XHQ6IFtdO1xuXG5cdFx0dmFyIGksIHBhdGgsXG5cdFx0XHRvYmplY3QgPSByb290LFxuXHRcdFx0bmV4dE9iaiA9IG9iamVjdCxcblx0XHRcdGwgPSBwYXRocyAmJiBwYXRocy5sZW5ndGgsXG5cdFx0XHRvdXQgPSBbXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdHBhdGggPSBwYXRoc1tpXTtcblx0XHRcdGlmICgkaXNGdW5jdGlvbihwYXRoKSkge1xuXHRcdFx0XHRvdXQgPSBvdXQuY29uY2F0KHJlc29sdmVQYXRoT2JqZWN0cyhwYXRoLmNhbGwocm9vdCwgcm9vdCwgY2FsbGJhY2spLCByb290KSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIGlmIChcIlwiICsgcGF0aCAhPT0gcGF0aCkge1xuXHRcdFx0XHRyb290ID0gbmV4dE9iaiA9IHBhdGg7XG5cdFx0XHRcdGlmIChuZXh0T2JqICE9PSBvYmplY3QpIHtcblx0XHRcdFx0XHRvdXQucHVzaChvYmplY3QgPSBuZXh0T2JqKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChuZXh0T2JqICE9PSBvYmplY3QpIHtcblx0XHRcdFx0b3V0LnB1c2gob2JqZWN0ID0gbmV4dE9iaik7XG5cdFx0XHR9XG5cdFx0XHRvdXQucHVzaChwYXRoKTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dDtcblx0fSxcblxuXHRyZW1vdmVDYkJpbmRpbmdzID0gZnVuY3Rpb24oY2JCaW5kaW5ncywgY2JCaW5kaW5nc0lkKSB7XG5cdFx0Ly8gSWYgdGhlIGNiQmluZGluZ3MgY29sbGVjdGlvbiBpcyBlbXB0eSB3ZSB3aWxsIHJlbW92ZSBpdCBmcm9tIHRoZSBjYkJpbmRpbmdzU3RvcmVcblx0XHRmb3IgKHZhciBjYiBpbiBjYkJpbmRpbmdzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGRlbGV0ZSBjYkJpbmRpbmdzU3RvcmVbY2JCaW5kaW5nc0lkXTsgLy8gVGhpcyBiaW5kaW5nIGNvbGxlY3Rpb24gaXMgZW1wdHksIHNvIHJlbW92ZSBmcm9tIHN0b3JlXG5cdH0sXG5cblx0b25PYnNlcnZhYmxlQ2hhbmdlID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdGZ1bmN0aW9uIGlzT2IodmFsKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIHZhbCA9PT0gT0JKRUNUICYmIChwYXRoc1swXSB8fCBhbGxvd0FycmF5ICYmICRpc0FycmF5KHZhbCkpO1xuXHRcdH1cblxuXHRcdGlmICghKGV2LmRhdGEgJiYgZXYuZGF0YS5vZmYpKSB7XG5cdFx0XHQvLyBTa2lwIGlmICEhZXYuZGF0YS5vZmY6IC0gYSBoYW5kbGVyIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIChtYXliZSB3YXMgb24gaGFuZGxlciBjb2xsZWN0aW9uIGF0IGNhbGwgdGltZSAtIHRoZW4gcmVtb3ZlZCBieSBhbm90aGVyIGhhbmRsZXIpXG5cdFx0XHR2YXIgYWxsUGF0aCwgZmlsdGVyLCBwYXJlbnRPYnMsXG5cdFx0XHRcdG9sZFZhbHVlID0gZXZlbnRBcmdzLm9sZFZhbHVlLFxuXHRcdFx0XHR2YWx1ZSA9IGV2ZW50QXJncy52YWx1ZSxcblx0XHRcdFx0Y3R4ID0gZXYuZGF0YSxcblx0XHRcdFx0b2JzZXJ2ZUFsbCA9IGN0eC5vYnNlcnZlQWxsLFxuXHRcdFx0XHRjYiA9IGN0eC5jYixcblx0XHRcdFx0YWxsb3dBcnJheSA9ICFjYi5ub0FycmF5LFxuXHRcdFx0XHRwYXRocyA9IGN0eC5wYXRocyxcblx0XHRcdFx0bnMgPSBjdHgubnM7XG5cblx0XHRcdGlmIChldi50eXBlID09PSBhcnJheUNoYW5nZVN0cikge1xuXHRcdFx0XHQoY2IuYXJyYXkgfHwgY2IpLmNhbGwoY3R4LCBldiwgZXZlbnRBcmdzKTsgLy8gSWYgdGhlcmUgaXMgYW4gYXJyYXlIYW5kbGVyIGV4cGFuZG8gb24gdGhlIHJlZ3VsYXIgaGFuZGxlciwgdXNlIGl0LCBvdGhlcndpc2UgdXNlIHRoZSByZWd1bGFyIGhhbmRsZXIgZm9yIGFycmF5Q2hhbmdlIGV2ZW50cyBhbHNvIC0gZm9yIGV4YW1wbGU6ICQub2JzZXJ2ZShhcnJheSwgaGFuZGxlcilcblx0XHRcdFx0Ly8gb3Igb2JzZXJ2ZUFsbCgpIHdpdGggYW4gYXJyYXkgaW4gdGhlIGdyYXBoLiBOb3RlIHRoYXQgb24gZGF0YS1saW5rIGJpbmRpbmdzIHdlIGVuc3VyZSBhbHdheXMgdG8gaGF2ZSBhbiBhcnJheSBoYW5kbGVyIC0gJC5ub29wIGlmIG5vbmUgaXMgc3BlY2lmaWVkIGUuZy4gb24gdGhlIGRhdGEtbGlua2VkIHRhZy5cblx0XHRcdH0gZWxzZSBpZiAoY3R4LnByb3AgPT09IGV2ZW50QXJncy5wYXRoIHx8IGN0eC5wcm9wID09PSBcIipcIikge1xuXHRcdFx0XHRpZiAob2JzZXJ2ZUFsbCkge1xuXHRcdFx0XHRcdGFsbFBhdGggPSBvYnNlcnZlQWxsLl9wYXRoICsgXCIuXCIgKyBldmVudEFyZ3MucGF0aDtcblx0XHRcdFx0XHRmaWx0ZXIgPSBvYnNlcnZlQWxsLmZpbHRlcjtcblx0XHRcdFx0XHRwYXJlbnRPYnMgPSBbZXYudGFyZ2V0XS5jb25jYXQob2JzZXJ2ZUFsbC5wYXJlbnRzKCkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzT2Iob2xkVmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRvYnNlcnZlX2FwcGx5KGFsbG93QXJyYXksIG5zLCBbb2xkVmFsdWVdLCBwYXRocywgY2IsIHRydWUsIGZpbHRlciwgW3BhcmVudE9ic10sIGFsbFBhdGgpOyAvLyB1bm9ic2VydmVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGlzT2IodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRvYnNlcnZlX2FwcGx5KGFsbG93QXJyYXksIG5zLCBbdmFsdWVdLCBwYXRocywgY2IsIHVuZGVmaW5lZCwgZmlsdGVyLCBbcGFyZW50T2JzXSwgYWxsUGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChpc09iKG9sZFZhbHVlKSkgeyAvLyBvbGRWYWx1ZSBpcyBhbiBvYmplY3QsIHNvIHVub2JzZXJ2ZVxuXHRcdFx0XHRcdFx0b2JzZXJ2ZV9hcHBseShhbGxvd0FycmF5LCBucywgW29sZFZhbHVlXSwgcGF0aHMsIGNiLCB0cnVlKTsgLy8gdW5vYnNlcnZlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpc09iKHZhbHVlKSkgeyAvLyB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvIG9ic2VydmVcblx0XHRcdFx0XHRcdG9ic2VydmVfYXBwbHkoYWxsb3dBcnJheSwgbnMsIFt2YWx1ZV0sIHBhdGhzLCBjYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGN0eC5jYihldiwgZXZlbnRBcmdzKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0b2JzZXJ2ZV9hcHBseSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vICQub2JzZXJ2ZSgpLCBidXQgYWxsb3dpbmcgeW91IHRvIGluY2x1ZGUgYXJyYXlzIHdpdGhpbiB0aGUgYXJndW1lbnRzIC0gd2hpY2ggeW91IHdhbnQgZmxhdHRlbmVkLlxuXHRcdHZhciBhcmdzID0gY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpOyAvLyBGbGF0dGVuIHRoZSBhcmd1bWVudHNcblx0XHRyZXR1cm4gJG9ic2VydmUuYXBwbHkoYXJncy5zaGlmdCgpLCBhcmdzKTtcblx0fSxcblxuXHQkb2JzZXJ2ZUFsbCA9IGZ1bmN0aW9uKGNiLCBmaWx0ZXIsIHVub2JzZXJ2ZSkge1xuXHRcdG9ic2VydmVBbGwodGhpcy5fbnMsIHRoaXMuX2RhdGEsIGNiLCBmaWx0ZXIsIFtdLCBcInJvb3RcIiwgdW5vYnNlcnZlKTtcblx0fSxcblxuXHQkdW5vYnNlcnZlQWxsID0gZnVuY3Rpb24oY2IsIGZpbHRlcikge1xuXHRcdCRvYnNlcnZlQWxsLmNhbGwodGhpcywgY2IsIGZpbHRlciwgdHJ1ZSk7XG5cdH0sXG5cblx0b2JzZXJ2ZUFsbCA9IGZ1bmN0aW9uKG5hbWVzcGFjZSwgb2JqZWN0LCBjYiwgZmlsdGVyLCBwYXJlbnRPYnMsIGFsbFBhdGgsIHVub2JzZXJ2ZSwgb2JqTWFwKSB7XG5cdFx0ZnVuY3Rpb24gb2JzZXJ2ZUFycmF5SXRlbXMoYXJyLCB1bm9icykge1xuXHRcdFx0bCA9IGFyci5sZW5ndGg7XG5cdFx0XHRuZXdBbGxQYXRoID0gYWxsUGF0aCArIFwiW11cIjtcblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChhcnIsIGwsIHVub2JzLCAxKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmaWx0ZXJBbmRPYnNlcnZlQWxsKG9iaiwgcHJvcCwgdW5vYnMsIG5lc3RlZEFycmF5KSB7XG5cdFx0XHR2YXIgbmV3T2JqZWN0LCBuZXdQYXJlbnRPYnM7XG5cdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8pIHtcblx0XHRcdFx0aWYgKG5ld09iamVjdCA9ICRvYnNlcnZhYmxlLl9mbHRyKG5ld0FsbFBhdGgsIG9ialtwcm9wXSwgbmV4dFBhcmVudE9icywgZmlsdGVyKSkge1xuXHRcdFx0XHRcdG5ld1BhcmVudE9icyA9IG5leHRQYXJlbnRPYnMuc2xpY2UoKTtcblx0XHRcdFx0XHRpZiAobmVzdGVkQXJyYXkgJiYgdXBkYXRlZFRndCAmJiBuZXdQYXJlbnRPYnNbMF0gIT09IHVwZGF0ZWRUZ3QpIHtcblx0XHRcdFx0XHRcdG5ld1BhcmVudE9icy51bnNoaWZ0KHVwZGF0ZWRUZ3QpOyAvLyBGb3IgYXJyYXkgY2hhbmdlIGV2ZW50cyB3aGVuIG9ic2VydmluZyBhbiBhcnJheSB3aGljaCBpcyBub3QgdGhlIHJvb3QsIG5lZWQgdG8gYWRkIHVwZGF0ZWQgYXJyYXkgdG8gcGFyZW50T2JzXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9ic2VydmVBbGwobmFtZXNwYWNlLCBuZXdPYmplY3QsIGNiLCBmaWx0ZXIgfHwgKG5lc3RlZEFycmF5ID8gdW5kZWZpbmVkIDogMCksIG5ld1BhcmVudE9icywgbmV3QWxsUGF0aCwgdW5vYnMsIG9iak1hcCk7XG5cdFx0XHRcdFx0Ly8gSWYgbmVzdGVkIGFycmF5LCBuZWVkIHRvIG9ic2VydmUgdGhlIGFycmF5IHRvbyAtIHNvIHNldCBmaWx0ZXIgdG8gdW5kZWZpbmVkXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiB3cmFwcGVkQ2IoZXYsIGV2ZW50QXJncykge1xuXHRcdFx0Ly8gVGhpcyBvYmplY3QgaXMgY2hhbmdpbmcuXG5cdFx0XHRhbGxQYXRoID0gZXYuZGF0YS5vYnNlcnZlQWxsLl9wYXRoO1xuXHRcdFx0dXBkYXRlZFRndCA9IGV2LnRhcmdldDtcblx0XHRcdHN3aXRjaCAoZXZlbnRBcmdzLmNoYW5nZSkgeyAvLyBvYnNlcnZlQWxsL3Vub2JzZXJ2ZUFsbCBvbiBhZGRlZCBvciByZW1vdmVkIG9iamVjdHNcblx0XHRcdFx0Y2FzZSBcImluc2VydFwiOlxuXHRcdFx0XHRcdG9ic2VydmVBcnJheUl0ZW1zKGV2ZW50QXJncy5pdGVtcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJyZW1vdmVcIjpcblx0XHRcdFx0XHRvYnNlcnZlQXJyYXlJdGVtcyhldmVudEFyZ3MuaXRlbXMsIHRydWUpOyAvLyB1bm9ic2VydmVBbGwgb24gcmVtb3ZlZCBpdGVtc1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwic2V0XCI6XG5cdFx0XHRcdFx0bmV3QWxsUGF0aCA9IGFsbFBhdGggKyBcIi5cIiArIGV2ZW50QXJncy5wYXRoO1xuXHRcdFx0XHRcdGZpbHRlckFuZE9ic2VydmVBbGwoZXZlbnRBcmdzLCBcIm9sZFZhbHVlXCIsIHRydWUpOyAvLyB1bm9ic2VydmUgb2xkIHZhbHVlXG5cdFx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChldmVudEFyZ3MsIFwidmFsdWVcIik7IC8vIG9ic2VydmUgbmV3IHZhbHVlXG5cdFx0XHR9XG5cdFx0XHR1cGRhdGVkVGd0ID0gdW5kZWZpbmVkO1xuXHRcdFx0Y2IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gT2JzZXJ2ZSB0aGlzIG9iamVjdCAoaW52b2tlIHRoZSBjYWxsYmFjaylcblx0XHR9XG5cblx0XHR2YXIgbCwgaXNPYmplY3QsIG5ld0FsbFBhdGgsIG5leHRQYXJlbnRPYnMsIHVwZGF0ZWRUZ3QsIG9iSWQsXG5cdFx0XHRub3RSZW1vdmluZyA9ICFvYmpNYXAgfHwgb2JqTWFwLnVuIHx8ICF1bm9ic2VydmU7IC8vIHRydWUgdW5sZXNzIGl0IGlzIGFuIG9ic2VydmVBbGwgY2FsbCAobm90IHVub2JzZXJ2ZUFsbCkgYW5kIHdlIGFyZSByZW1vdmluZyBhIGxpc3RlbmVyIChub3QgYWRkaW5nIG9uZSlcblxuXHRcdGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gT0JKRUNUKSB7XG5cdFx0XHRuZXh0UGFyZW50T2JzID0gW29iamVjdF0uY29uY2F0KHBhcmVudE9icyk7IC8vIFRoZSBwYXJlbnRPYnMgY2hhaW4gZm9yIHRoZSBuZXh0IGRlcHRoIG9mIG9ic2VydmVBbGxcblx0XHRcdGlzT2JqZWN0ID0gJGlzQXJyYXkob2JqZWN0KSA/IFwiXCIgOiBcIipcIjtcblx0XHRcdGlmIChvYmpNYXAgJiYgbm90UmVtb3ZpbmcgJiYgJGhhc0RhdGEob2JqZWN0KSAmJiBvYmpNYXBbb2JJZCA9ICRkYXRhKG9iamVjdCkub2JJZF0pIHtcblx0XHRcdFx0b2JqTWFwW29iSWRdKys7XG5cdFx0XHRcdHJldHVybjsgLy8gVGhpcyBvYmplY3QgaGFzIGFscmVhZHkgYmVpbmcgb2JzZXJ2ZWQvdW5vYnNlcnZlZCBieSB0aGlzIG9ic2VydmVBbGwvdW5vYnNlcnZlQWxsIGNhbGwgKG11c3QgYmUgYSBjeWNsaWMgb2JqZWN0IGdyYXBoKSBzbyBza2lwLCB0byBhdm9pZFxuXHRcdFx0XHQvLyBzdGFjayBvdmVyZmxvdy9tdWx0aXBsZSBpbnN0YW5jZXMgb2YgbGlzdGVuZXIuIFNlZSBqc3ZpZXdzL3B1bGwvMzA1XG5cdFx0XHRcdC8vIE5PVEUgLSBXRSBETyBOT1Qgc3VwcG9ydCBPYnNlcnZlQWxsIG9uIGRhdGEgd2l0aCBjeWNsaWMgZ3JhcGhzIHdoaWNoIGluY2x1ZGUgRFVQTElDQVRFIFJFRkVSRU5DRVMgVE8gQVJSQVkgUFJPUEVSVElFUyAtIHN1Y2ggYXMgZGF0YS5jaGlsZHJlbiA9IGRhdGEuZGVzY2VuZGFudHMgPSBbXVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFvYmpNYXApIHtcblx0XHRcdFx0b2JqTWFwID0ge3VuOiB1bm9ic2VydmV9OyAvLyBNYXAgb2JqZWN0IHRvIHJlZ2lzdGVyIG9ic2VydmVkIG9iamVjdHMgZm9yIHRoaXMgb2JzZXJ2ZUFsbFxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2IpIHtcblx0XHRcdFx0Ly8gT2JzZXJ2ZSB0aGlzIG9iamVjdCBvciBhcnJheSAtIGFuZCBhbHNvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byBvYmplY3QgZ3JhcGgsIHRvIGFkZCBvciByZW1vdmUgb2JzZXJ2ZXJzIGZyb20gdGhlIG1vZGlmaWVkIG9iamVjdCBncmFwaFxuXHRcdFx0XHRpZiAoaXNPYmplY3QgfHwgZmlsdGVyICE9PSAwKSB7XG5cdFx0XHRcdFx0Ly8gSWYgYW4gb2JqZWN0LCBvYnNlcnZlIHRoZSBvYmplY3QuIElmIGFuIGFycmF5LCBvbmx5IGFkZCBhcnJheUNoYW5nZSBiaW5kaW5nIGlmIGhhcyBmaWx0ZXIgb3IgaWYgZmlsdGVyIGlzIHVuZGVmaW5lZCAoIT09IDApIC0gd2hpY2hcblx0XHRcdFx0XHQvLyBpcyB0aGUgY2FzZSBmb3IgdG9wLWxldmVsIGNhbGxzIG9yIGZvciBuZXN0ZWQgYXJyYXkgKGFycmF5IGl0ZW0gb2YgYW4gYXJyYXkgLSBlLmcuIG1lbWJlciBvZiAyLWRpbWVuc2lvbmFsIGFycmF5KS5cblx0XHRcdFx0XHQvLyBGb3IgYXJyYXkgcHJvcGVydGllcyBsb3dlciBpbiB0aGUgdHJlZSwgd2l0aCBubyBmaWx0ZXIsIGZpbHRlciBpcyBzZXQgdG8gMCBpbiBmaWx0ZXJBbmRPYnNlcnZlQWxsLCBzbyBubyBhcnJheUNoYW5nZSBiaW5kaW5nIGhlcmUsXG5cdFx0XHRcdFx0Ly8gc2luY2UgdGhleSBnZXQgYXJyYXlDaGFuZ2UgYmluZGluZyBhZGRlZCBkdXJpbmcgcmVndWxhciAkLm9ic2VydmUoYXJyYXkgLi4uKSBiaW5kaW5nLlxuXHRcdFx0XHRcdHdyYXBwZWRDYi5fY0lkID0gZ2V0Q2JLZXkoY2IpOyAvLyBJZGVudGlmeSB3cmFwcGVkIGNhbGxiYWNrIHdpdGggdW53cmFwcGVkIGNhbGxiYWNrLCBzbyB1bm9ic2VydmVBbGwgd2lsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgcHJldmlvdXMgb2JzZXJ2ZUFsbCB3cmFwcGVkIGNhbGxiYWNrLCBpZiBpbm5lciBjYWxsYmFjayB3YXMgdGhlIHNhbWU7XG5cdFx0XHRcdFx0aWYgKG5vdFJlbW92aW5nKSB7XG5cdFx0XHRcdFx0XHQkb2JzZXJ2ZShuYW1lc3BhY2UsIG9iamVjdCwgaXNPYmplY3QsIHdyYXBwZWRDYiwgdW5vYnNlcnZlLCBmaWx0ZXIsIG5leHRQYXJlbnRPYnMsIGFsbFBhdGgpO1xuXHRcdFx0XHRcdFx0b2JJZCA9ICRkYXRhKG9iamVjdCkub2JJZDtcblx0XHRcdFx0XHRcdG9iak1hcFtvYklkXSA9IChvYmpNYXBbb2JJZF0gfHwgMCkgKyAxOyAvLyBSZWdpc3RlciBvbiBtYXAgb2Ygb2JqZWN0cyBvYnNlcnZlZC91bm9ic2VydmVkIGJ5IHRoaXMgb2JzZXJ2ZUFsbC91bm9ic2VydmVBbGwgY2FsbFxuXHRcdFx0XHRcdFx0XHQvLy0gb3IgcmVtb3ZlIGZyb20gbWFwIGlmIHdlIGFyZSByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIG9ic2VydmVBbGwgY2FsbC4gKEF2b2lkIGR1cHMsIGZvciBjeWNsaWMgZ3JhcGhzKVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoLS1vYmpNYXBbJGRhdGEob2JqZWN0KS5vYklkXSkge1xuXHRcdFx0XHRcdFx0XHQvLyBSZWdpc3RlciBvbiBtYXAgb2Ygb2JqZWN0cyBvYnNlcnZlZC91bm9ic2VydmVkIGJ5IHRoaXMgb2JzZXJ2ZUFsbC91bm9ic2VydmVBbGwgY2FsbFxuXHRcdFx0XHRcdFx0XHQvLy0gb3IgcmVtb3ZlIGZyb20gbWFwIGlmIHdlIGFyZSByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIG9ic2VydmVBbGwgY2FsbC4gKEF2b2lkIGR1cHMsIGZvciBjeWNsaWMgZ3JhcGhzKVxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQkb2JzZXJ2ZShuYW1lc3BhY2UsIG9iamVjdCwgaXNPYmplY3QsIHdyYXBwZWRDYiwgdW5vYnNlcnZlLCBmaWx0ZXIsIG5leHRQYXJlbnRPYnMsIGFsbFBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gTm8gY2FsbGJhY2suIEp1c3QgdW5vYnNlcnZlIGlmIHVub2JzZXJ2ZSA9PT0gdHJ1ZS5cblx0XHRcdFx0aWYgKG9iak1hcCkge1xuXHRcdFx0XHRcdG9iak1hcFskZGF0YShvYmplY3QpLm9iSWRdID0gMTsgLy8gUmVnaXN0ZXIgb24gbWFwIG9mIG9iamVjdHMgdW5vYnNlcnZlZCBieSB0aGlzIHVub2JzZXJ2ZUFsbCBjYWxsLiAoQXZvaWQgZHVwcywgZm9yIGN5Y2xpYyBncmFwaHMpXG5cdFx0XHRcdH1cblx0XHRcdFx0JG9ic2VydmUobmFtZXNwYWNlLCBvYmplY3QsIGlzT2JqZWN0LCB1bmRlZmluZWQsIHVub2JzZXJ2ZSwgZmlsdGVyLCBuZXh0UGFyZW50T2JzLCBhbGxQYXRoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzT2JqZWN0KSB7XG5cdFx0XHRcdC8vIENvbnRpbnVlIHN0ZXBwaW5nIHRocm91Z2ggb2JqZWN0IGdyYXBoLCBvYnNlcnZpbmcgb2JqZWN0IGFuZCBhcnJheXNcblx0XHRcdFx0Ly8gVG8gb3ZlcnJpZGUgZmlsdGVyaW5nLCBwYXNzIGluIGZpbHRlciBmdW5jdGlvbiwgb3IgcmVwbGFjZSAkLm9ic2VydmFibGUuX2ZsdHJcblx0XHRcdFx0Zm9yIChsIGluIG9iamVjdCkge1xuXHRcdFx0XHRcdG5ld0FsbFBhdGggPSBhbGxQYXRoICsgXCIuXCIgKyBsO1xuXHRcdFx0XHRcdGZpbHRlckFuZE9ic2VydmVBbGwob2JqZWN0LCBsLCB1bm9ic2VydmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgeyAvLyBPYnNlcnZlIGl0ZW1zIGluIEFycmF5XG5cdFx0XHRcdG9ic2VydmVBcnJheUl0ZW1zKG9iamVjdCwgdW5vYnNlcnZlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0c2hhbGxvd0ZpbHRlciA9IGZ1bmN0aW9uKGFsbFBhdGggLyosIG9iamVjdCwgcGFyZW50T2JzKi8pIHtcblx0XHRyZXR1cm4gYWxsUGF0aC5pbmRleE9mKFwiLlwiKSA8IDAgJiYgYWxsUGF0aC5pbmRleE9mKFwiW1wiKSA8IDA7XG5cdH0sXG5cblx0JHVub2JzZXJ2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFtdLnB1c2guY2FsbChhcmd1bWVudHMsIHRydWUpOyAvLyBBZGQgdHJ1ZSBhcyBhZGRpdGlvbmFsIGZpbmFsIGFyZ3VtZW50XG5cdFx0cmV0dXJuICRvYnNlcnZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdH07XG5cblx0JG9ic2VydmUgPSBmdW5jdGlvbigpIHtcblx0XHQvLyAkLm9ic2VydmUoW25hbWVzcGFjZSwgXXJvb3QsIFsxIG9yIG1vcmUgb2JqZWN0cywgcGF0aCBvciBwYXRoIEFycmF5IHBhcmFtcy4uLl0sIGNhbGxiYWNrWywgY29udGV4dENhbGxiYWNrXVssIHVub2JzZXJ2ZV0pXG5cblx0XHRmdW5jdGlvbiBpbm5lck9ic2VydmUoKSB7XG5cblx0XHRcdGZ1bmN0aW9uIG9ic2VydmVPbk9mZihuYW1lc3BhY2UsIHBhdGhTdHIsIGlzQXJyYXlCaW5kaW5nLCBvZmYpIHtcblx0XHRcdFx0dmFyIGosIGV2RGF0YSxcblx0XHRcdFx0XHRvYklkRXhwYW5kbyA9ICRoYXNEYXRhKG9iamVjdCksXG5cdFx0XHRcdFx0Ym91bmRPYk9yQXJyID0gd3JhcEFycmF5KG9iamVjdCksXG5cdFx0XHRcdFx0cHJudE9icyA9IHBhcmVudE9icyxcblx0XHRcdFx0XHRhbGxQdGggPSBhbGxQYXRoO1xuXG5cdFx0XHRcdG5hbWVzcGFjZSA9IGluaXRpYWxOcyA/IG5hbWVzcGFjZSArIFwiLlwiICsgaW5pdGlhbE5zIDogbmFtZXNwYWNlO1xuXG5cdFx0XHRcdGlmICghdW5vYnNlcnZlICYmIChvZmYgfHwgaXNBcnJheUJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0ZXZlbnRzID0gb2JJZEV4cGFuZG8gJiYgJC5fZGF0YShvYmplY3QpO1xuXHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cyAmJiBldmVudHMuZXZlbnRzO1xuXHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cyAmJiBldmVudHNbaXNBcnJheUJpbmRpbmcgPyBhcnJheUNoYW5nZVN0ciA6IHByb3BlcnR5Q2hhbmdlU3RyXTtcblx0XHRcdFx0XHRlbCA9IGV2ZW50cyAmJiBldmVudHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChlbC0tKSB7IC8vIFNraXAgZHVwbGljYXRlc1xuXHRcdFx0XHRcdFx0ZGF0YSA9IGV2ZW50c1tlbF0gJiYgZXZlbnRzW2VsXS5kYXRhO1xuXHRcdFx0XHRcdFx0aWYgKGRhdGEgJiYgKG9mZiAmJiBkYXRhLm5zICE9PSBpbml0aWFsTnNcblx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBvYnNlcnZpbmcsIGRvbid0IHVuYmluZCBkdXBzIHVubGVzcyB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlXG5cdFx0XHRcdFx0XHRcdHx8ICFvZmYgJiYgZGF0YS5ucyA9PT0gaW5pdGlhbE5zICYmIGRhdGEuY2IgJiYgZGF0YS5jYi5fY0lkID09PSBjYWxsYmFjay5fY0lkKSlcblx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBvYnNlcnZpbmcgYW5kIGRvaW5nIGFycmF5IGJpbmRpbmcsIGRvbid0IGJpbmQgZHVwcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlIChEdXBzIGNhbiBoYXBwZW4gZS5nLiB3aXRoIHtee2ZvciBwZW9wbGUgfmZvbz1wZW9wbGV9fSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodW5vYnNlcnZlIHx8IG9mZikge1xuXHRcdFx0XHRcdCQoYm91bmRPYk9yQXJyKS5vZmYobmFtZXNwYWNlLCBvbk9ic2VydmFibGVDaGFuZ2UpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGV2RGF0YSA9IGlzQXJyYXlCaW5kaW5nID8ge31cblx0XHRcdFx0XHRcdDoge1xuXHRcdFx0XHRcdFx0XHRmdWxsUGF0aDogcGF0aCxcblx0XHRcdFx0XHRcdFx0cGF0aHM6IHBhdGhTdHIgPyBbcGF0aFN0cl0gOiBbXSxcblx0XHRcdFx0XHRcdFx0cHJvcDogcHJvcFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRldkRhdGEubnMgPSBpbml0aWFsTnM7XG5cdFx0XHRcdFx0ZXZEYXRhLmNiID0gY2FsbGJhY2s7XG5cblx0XHRcdFx0XHRpZiAoYWxsUGF0aCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvYnNlcnZlQWxsIGNhbGxcblx0XHRcdFx0XHRcdGV2RGF0YS5vYnNlcnZlQWxsID0ge1xuXHRcdFx0XHRcdFx0XHRfcGF0aDogYWxsUHRoLFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBmdW5jdGlvbigpIHsgLy8gU3RlcCB0aHJvdWdoIHBhdGggYW5kIHBhcmVudE9icyBwYXJlbnQgY2hhaW4sIHJlcGxhY2luZyAnW10nIGJ5ICdbbl0nIGJhc2VkIG9uIGN1cnJlbnQgaW5kZXggb2Ygb2JqZWN0cyBpbiBwYXJlbnQgYXJyYXlzLlxuXHRcdFx0XHRcdFx0XHRcdGogPSBwcm50T2JzLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYWxsUHRoLnJlcGxhY2UoL1tbLl0vZywgZnVuY3Rpb24oYWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRqLS07XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYWxsID09PSBcIltcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/IFwiW1wiICsgJC5pbkFycmF5KHBybnRPYnNbaiAtIDFdLCBwcm50T2JzW2pdKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IFwiLlwiO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJudE9iczsgLy8gVGhlIGNoYWluIG9mIHBhcmVudHMgYmV0d2VlbiB0aGUgbW9kaWZpZWQgb2JqZWN0IGFuZCB0aGUgcm9vdCBvYmplY3QgdXNlZCBpbiB0aGUgb2JzZXJ2ZUFsbCgpIGNhbGxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0ZmlsdGVyOiBmaWx0ZXJcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCQoYm91bmRPYk9yQXJyKS5vbihuYW1lc3BhY2UsIG51bGwsIGV2RGF0YSwgb25PYnNlcnZhYmxlQ2hhbmdlKTtcblx0XHRcdFx0XHRpZiAoY2JCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Ly8gQWRkIG9iamVjdCB0byBjYkJpbmRpbmdzXG5cdFx0XHRcdFx0XHRjYkJpbmRpbmdzWyRkYXRhKG9iamVjdCkub2JJZCB8fCAkZGF0YShvYmplY3QsIFwib2JJZFwiLCBvYnNlcnZlT2JqS2V5KyspXSA9IG9iamVjdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gZ2V0SW5uZXJDYihleHByT2IpIHtcblx0XHRcdFx0Ly8gUmV0dXJucyB0aGUgaW5uZXJDYiB1c2VkIGZvciB1cGRhdGluZyBhIGNvbXB1dGVkIGluIGEgY29tcGlsZWQgZXhwcmVzc2lvbiAoc2V0dGluZyB0aGUgbmV3IGluc3RhbmNlIGFzIGV4cHJPYi5vYiwgdW5vYnNlcnZpbmcgdGhlIHByZXZpb3VzIG9iamVjdCxcblx0XHRcdFx0Ly8gYW5kIG9ic2VydmluZyB0aGUgbmV3IG9uZSksIHRoZW4gY2FsbGluZyB0aGUgb3V0ZXJDQiAtIGkuZS4gdGhlIGhhbmRsZXIgZm9yIHRoZSB3aG9sZSBjb21waWxlZCBleHByZXNzaW9uLlxuXHRcdFx0XHQvLyBJbml0aWFsaXplZCBleHByT2Iub2IgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LlxuXHRcdFx0XHQvLyBVc2VzIHRoZSBjb250ZXh0Q2IgY2FsbGJhY2sgdG8gZXhlY3V0ZSB0aGUgY29tcGlsZWQgZXhwck9iIHRlbXBsYXRlIGluIHRoZSBjb250ZXh0IG9mIHRoZSB2aWV3L2RhdGEgZXRjLiB0byBnZXQgdGhlIHJldHVybmVkIHZhbHVlLCB0eXBpY2FsbHkgYW4gb2JqZWN0IG9yIGFycmF5LlxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhbiBhcnJheSwgcmVnaXN0ZXJzIGFycmF5IGJpbmRpbmdcblx0XHRcdFx0dmFyIG9yaWdSdCA9IHJvb3Q7XG5cdFx0XHRcdC8vIE5vdGU6IEZvciBqc3ZpZXdzL2lzc3Vlcy8yOTIgY3R4Q2Igd2lsbCBuZWVkIHZhciBjdHhDYiA9IGNvbnRleHRDYiB8fCBmdW5jdGlvbihleHByT2IsIG9yaWdSdCkge3JldHVybiBleHByT2IuX2pzdihvcmlnUnQpO307XG5cblx0XHRcdFx0ZXhwck9iLm9iID0gY29udGV4dENiKGV4cHJPYiwgb3JpZ1J0KTsgLy8gSW5pdGlhbGl6ZSBvYmplY3RcblxuXHRcdFx0XHRyZXR1cm4gZXhwck9iLmNiID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdHZhciBvYmogPSBleHByT2Iub2IsIC8vIFRoZSBvbGQgb2JqZWN0XG5cdFx0XHRcdFx0XHRzdWIgPSBleHByT2Iuc2IsXG5cdFx0XHRcdFx0XHRuZXdPYmogPSBjb250ZXh0Q2IoZXhwck9iLCBvcmlnUnQpO1xuXG5cdFx0XHRcdFx0aWYgKG5ld09iaiAhPT0gb2JqKSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iaiA9PT0gT0JKRUNUKSB7XG5cdFx0XHRcdFx0XHRcdGJpbmRBcnJheShvYmosIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3ViIHx8IGFsbG93QXJyYXkgJiYgJGlzQXJyYXkob2JqKSkge1xuXHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbb2JqXSwgc3ViLCBjYWxsYmFjaywgY29udGV4dENiLCB0cnVlKTsgLy8gdW5vYnNlcnZlIG9uIHRoZSBvbGQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGV4cHJPYi5vYiA9IG5ld09iajtcblx0XHRcdFx0XHRcdC8vIFB1dCB0aGUgdXBkYXRlZCBvYmplY3QgaW5zdGFuY2Ugb250byB0aGUgZXhwck9iIGluIHRoZSBwYXRocyBhcnJheSwgc28gc3Vic2VxdWVudCBzdHJpbmcgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgb2JqZWN0XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG5ld09iaiA9PT0gT0JKRUNUKSB7XG5cdFx0XHRcdFx0XHRcdGJpbmRBcnJheShuZXdPYmopO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3ViIHx8IGFsbG93QXJyYXkgJiYgJGlzQXJyYXkobmV3T2JqKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIGFycmF5IGJpbmRpbmdcblx0XHRcdFx0XHRcdFx0XHRpbm5lck9ic2VydmUoW25ld09ial0sIHN1YiwgY2FsbGJhY2ssIGNvbnRleHRDYik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQ2FsbCB0aGUgb3V0ZXJDYiAtIHRvIGV4ZWN1dGUgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb24gdGhhdCB0aGlzIGNvbXB1dGVkIGlzIHBhcnQgb2Zcblx0XHRcdFx0XHRjYWxsYmFjayhldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gYmluZEFycmF5KGFyciwgdW5iaW5kLCBpc0FycmF5LCByZWxQYXRoKSB7XG5cdFx0XHRcdGlmIChhbGxvd0FycmF5KSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGNhbGwgdG8gb2JzZXJ2ZSB0aGF0IGRvZXMgbm90IGNvbWUgZnJvbSBvYnNlcnZlQW5kQmluZCAodGFnIGJpbmRpbmcpLCBzbyB3ZSBhbGxvdyBhcnJheUNoYW5nZSBiaW5kaW5nXG5cdFx0XHRcdFx0dmFyIHByZXZPYmogPSBvYmplY3QsXG5cdFx0XHRcdFx0XHRwcmV2QWxsUGF0aCA9IGFsbFBhdGg7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBhcnI7XG5cdFx0XHRcdFx0aWYgKHJlbFBhdGgpIHtcblx0XHRcdFx0XHRcdG9iamVjdCA9IGFycltyZWxQYXRoXTtcblx0XHRcdFx0XHRcdGFsbFBhdGggKz0gXCIuXCIgKyByZWxQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoZmlsdGVyICYmIG9iamVjdCkge1xuXHRcdFx0XHRcdFx0b2JqZWN0ID0gJG9ic2VydmFibGUuX2ZsdHIoYWxsUGF0aCwgb2JqZWN0LCByZWxQYXRoID8gW2Fycl0uY29uY2F0KHBhcmVudE9icykgOiBwYXJlbnRPYnMsIGZpbHRlcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvYmplY3QgJiYgKGlzQXJyYXkgfHwgJGlzQXJyYXkob2JqZWN0KSkpIHtcblx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihhcnJheUNoYW5nZVN0ciArIFwiLm9ic2VydmVcIiArIChjYWxsYmFjayA/IGdldENiS2V5KGNhbGxiYWNrKSA6IFwiXCIpLCB1bmRlZmluZWQsIHRydWUsIHVuYmluZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9iamVjdCA9IHByZXZPYmo7XG5cdFx0XHRcdFx0YWxsUGF0aCA9IHByZXZBbGxQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpLCBwLCBza2lwLCBwYXJ0cywgcHJvcCwgcGF0aCwgZGVwLCB1bm9ic2VydmUsIGNhbGxiYWNrLCBjYklkLCBpbklkLCBlbCwgZGF0YSwgZXZlbnRzLCBjb250ZXh0Q2IsIGl0ZW1zLCBjYkJpbmRpbmdzLFxuXHRcdFx0XHRkZXB0aCwgaW5uZXJDYiwgcGFyZW50T2JzLCBhbGxQYXRoLCBmaWx0ZXIsIGluaXROc0FyciwgaW5pdE5zQXJyTGVuLFxuXHRcdFx0XHRucyA9IG9ic2VydmVTdHIsXG5cdFx0XHRcdHBhdGhzID0gdGhpcyAhPSAxIC8vIFVzaW5nICE9IGZvciBJRTwxMCBidWctIHNlZSBqc3ZpZXdzL2lzc3Vlcy8yMzdcblx0XHRcdFx0XHQ/IGNvbmNhdC5hcHBseShbXSwgYXJndW1lbnRzKSAvLyBGbGF0dGVuIHRoZSBhcmd1bWVudHMgLSB0aGlzIGlzIGEgJ3JlY3Vyc2l2ZSBjYWxsJyB3aXRoIHBhcmFtcyB1c2luZyB0aGUgJ3dyYXBwZWQgYXJyYXknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHN0eWxlIC0gc3VjaCBhcyBpbm5lck9ic2VydmUoW29iamVjdF0sIHBhdGgucGF0aCwgW29yaWdSb290XSwgcGF0aC5wcm0sIGlubmVyQ2IsIC4uLik7XG5cdFx0XHRcdFx0OiBzbGljZS5jYWxsKGFyZ3VtZW50cyksIC8vIERvbid0IGZsYXR0ZW4gLSB0aGlzIGlzIHRoZSBmaXJzdCAndG9wLWxldmVsIGNhbGwsIHRvIGlubmVyT2JzZXJ2ZS5hcHBseSgxLCBwYXRocylcblx0XHRcdFx0bGFzdEFyZyA9IHBhdGhzLnBvcCgpIHx8IGZhbHNlLFxuXHRcdFx0XHRyb290ID0gcGF0aHMuc2hpZnQoKSxcblx0XHRcdFx0b2JqZWN0ID0gcm9vdCxcblx0XHRcdFx0bCA9IHBhdGhzLmxlbmd0aDtcblxuXHRcdFx0aWYgKGxhc3RBcmcgKyBcIlwiID09PSBsYXN0QXJnKSB7IC8vIElmIGxhc3QgYXJnIGlzIGEgc3RyaW5nIHRoZW4gdGhpcyBvYnNlcnZlIGNhbGwgaXMgcGFydCBvZiBhbiBvYnNlcnZlQWxsIGNhbGwsXG5cdFx0XHRcdGFsbFBhdGggPSBsYXN0QXJnOyAgICAgICAgICAvLyBhbmQgdGhlIGxhc3QgdGhyZWUgYXJncyBhcmUgdGhlIHBhcmVudE9icyBhcnJheSwgdGhlIGZpbHRlciwgYW5kIHRoZSBhbGxQYXRoIHN0cmluZy5cblx0XHRcdFx0cGFyZW50T2JzID0gcGF0aHMucG9wKCk7XG5cdFx0XHRcdGZpbHRlciA9IHBhdGhzLnBvcCgpO1xuXHRcdFx0XHRsYXN0QXJnID0gISFwYXRocy5wb3AoKTsgLy8gdW5vYnNlcnZlXG5cdFx0XHRcdGwgLT0gMztcblx0XHRcdH1cblx0XHRcdGlmIChsYXN0QXJnID09PSAhIWxhc3RBcmcpIHtcblx0XHRcdFx0dW5vYnNlcnZlID0gbGFzdEFyZztcblx0XHRcdFx0bGFzdEFyZyA9IHBhdGhzW2wtMV07XG5cdFx0XHRcdGxhc3RBcmcgPSBsICYmIGxhc3RBcmcgKyBcIlwiICE9PSBsYXN0QXJnICYmICghbGFzdEFyZyB8fCAkaXNGdW5jdGlvbihsYXN0QXJnKSkgPyAobC0tLCBwYXRocy5wb3AoKSkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICh1bm9ic2VydmUgJiYgIWwgJiYgJGlzRnVuY3Rpb24ocm9vdCkpIHtcblx0XHRcdFx0XHRsYXN0QXJnID0gcm9vdDtcblx0XHRcdFx0XHRyb290ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjYWxsYmFjayA9IGxhc3RBcmc7XG5cdFx0XHRpZiAobCAmJiAkaXNGdW5jdGlvbihwYXRoc1tsIC0gMV0pKSB7XG5cdFx0XHRcdGNvbnRleHRDYiA9IGNhbGxiYWNrO1xuXHRcdFx0XHRjYWxsYmFjayA9IHBhdGhzLnBvcCgpO1xuXHRcdFx0XHRsLS07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh1bm9ic2VydmUgJiYgY2FsbGJhY2sgJiYgIWNhbGxiYWNrLl9jSWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVc2UgYSB1bmlxdWUgbmFtZXNwYWNlIChlLmcuIG9iczcpIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9ic2VydmUoKSBjYWxsYmFjayB0byBhbGxvdyB1bm9ic2VydmUgdG8gcmVtb3ZlIGhhbmRsZXJzXG5cdFx0XHRucyArPSBjYWxsYmFja1xuXHRcdFx0XHQ/ICgoaW5JZCA9IGNhbGxiYWNrLl9pbklkIHx8IFwiXCIpLCB1bm9ic2VydmUpXG5cdFx0XHRcdFx0PyBjYWxsYmFjay5fY0lkICsgaW5JZFxuXHRcdFx0XHRcdDogKGNiSWQgPSBnZXRDYktleShjYWxsYmFjaykpICsgaW5JZFxuXHRcdFx0XHQ6IFwiXCI7XG5cblx0XHRcdGlmIChjYklkICYmICF1bm9ic2VydmUpIHtcblx0XHRcdFx0Y2JCaW5kaW5ncyA9IGNiQmluZGluZ3NTdG9yZVtjYklkXSA9IGNiQmluZGluZ3NTdG9yZVtjYklkXSB8fCB7fTtcblx0XHRcdH1cblxuXHRcdFx0aW5pdE5zQXJyID0gaW5pdGlhbE5zICYmIGluaXRpYWxOcy5tYXRjaChyTm90V2hpdGUpIHx8IFtcIlwiXTtcblx0XHRcdGluaXROc0FyckxlbiA9IGluaXROc0Fyci5sZW5ndGg7XG5cblx0XHRcdHdoaWxlIChpbml0TnNBcnJMZW4tLSkge1xuXHRcdFx0XHRpbml0aWFsTnMgPSBpbml0TnNBcnJbaW5pdE5zQXJyTGVuXTtcblx0XHRcdFx0aWYgKHJvb3QgJiYgKHBhdGggPSBwYXRoc1swXSwgIXBhdGggfHwgcGF0aCArIFwiXCIgIT09IHBhdGgpKSB7XG5cdFx0XHRcdFx0aWYgKCRpc0FycmF5KHJvb3QpKSB7XG5cdFx0XHRcdFx0XHRiaW5kQXJyYXkocm9vdCwgdW5vYnNlcnZlLCB0cnVlKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHVub2JzZXJ2ZSkge1xuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIG9uT2JzZXJ2YWJsZUNoYW5nZSBoYW5kbGVycyB0aGF0IHdyYXAgdGhhdCBjYWxsYmFja1xuXHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zLCBcIlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHVub2JzZXJ2ZSAmJiAhbCAmJiAhcm9vdCkgeyAvLyB1bm9ic2VydmUoKSAtIHVub2JzZXJ2ZXMgYWxsXG5cdFx0XHRcdFx0Zm9yIChwIGluIGNiQmluZGluZ3NTdG9yZSkge1xuXHRcdFx0XHRcdFx0cCA9IGNiQmluZGluZ3NTdG9yZVtwXTtcblx0XHRcdFx0XHRcdGZvciAoZGF0YSBpbiBwKSB7XG5cdFx0XHRcdFx0XHRcdG9iamVjdCA9IHBbZGF0YV07XG5cdFx0XHRcdFx0XHRcdGlmICgkaXNBcnJheShvYmplY3QpKSB7XG5cdFx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG9iamVjdCwgdW5vYnNlcnZlLCB1bm9ic2VydmUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBvbk9ic2VydmFibGVDaGFuZ2UgaGFuZGxlcnMgdGhhdCB3cmFwIHRoYXQgY2FsbGJhY2tcblx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGRlcHRoID0gMDtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHBhdGggPSBwYXRoc1tpXTtcblx0XHRcdFx0XHRpZiAocGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9iamVjdCA9IHJvb3Q7XG5cdFx0XHRcdFx0aWYgKFwiXCIgKyBwYXRoID09PSBwYXRoKSB7XG5cdFx0XHRcdFx0XHQvLyBDb25zaWRlciBzdXBwb3J0IGZvciBjb21wdXRlZCBwYXRoczoganN2aWV3cy9pc3N1ZXMvMjkyXG5cdFx0XHRcdFx0XHQvL2lmICgvW1xcKFxcW1xcK10vLnRlc3QocGF0aCkpIHtcblx0XHRcdFx0XHRcdC8vXHR2YXIgYj17bGlua3M6e319LCB0ID0gJHN1Yi50bXBsRm4oXCJ7OlwiK3BhdGgrXCJ9XCIsIGIsIHRydWUpLCBpdGVtcyA9IHQucGF0aHNbMF07XG5cdFx0XHRcdFx0XHQvL1x0bCArPSBpdGVtcy5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0Ly9cdHNwbGljZS5hcHBseShwYXRocywgW2ktLSwgMV0uY29uY2F0KGl0ZW1zKSk7XG5cdFx0XHRcdFx0XHQvL1x0Y29udGludWU7XG5cdFx0XHRcdFx0XHQvL31cblx0XHRcdFx0XHRcdHBhcnRzID0gcGF0aC5zcGxpdChcIl5cIik7XG5cdFx0XHRcdFx0XHRpZiAocGFydHNbMV0pIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgYmluZCB0aGUgbGVhZiwgcGx1cyBhZGRpdGlvbmFsIG5vZGVzIGJhc2VkIG9uIGRlcHRoLlxuXHRcdFx0XHRcdFx0XHQvLyBcImEuYi5jXmQuZVwiIGlzIGRlcHRoIDIsIHNvIGxpc3RlbnMgdG8gY2hhbmdlcyBvZiBlLCBwbHVzIGNoYW5nZXMgb2YgZCBhbmQgb2YgY1xuXHRcdFx0XHRcdFx0XHRkZXB0aCA9IHBhcnRzWzBdLnNwbGl0KFwiLlwiKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdHBhdGggPSBwYXJ0cy5qb2luKFwiLlwiKTtcblx0XHRcdFx0XHRcdFx0ZGVwdGggPSBwYXRoLnNwbGl0KFwiLlwiKS5sZW5ndGggLSBkZXB0aDtcblx0XHRcdFx0XHRcdFx0Ly8gaWYgbW9yZSB0aGFuIG9uZSBeIGluIHRoZSBwYXRoLCB0aGUgZmlyc3Qgb25lIGRldGVybWluZXMgZGVwdGhcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChjb250ZXh0Q2IgJiYgKGl0ZW1zID0gY29udGV4dENiKHBhdGgsIHJvb3QsIGRlcHRoKSkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFycmF5IG9mIG9iamVjdHMgYW5kIHBhdGhzIHJldHVybmVkIGJ5IGNvbnRleHRDYiBpcyBub24gZW1wdHksIGluc2VydCB0aGVtXG5cdFx0XHRcdFx0XHRcdC8vIGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIGN1cnJlbnQgaXRlbSAocGF0aCkuIE90aGVyd2lzZSBzaW1wbHkgcmVtb3ZlIGN1cnJlbnQgaXRlbSAocGF0aClcblx0XHRcdFx0XHRcdFx0bCArPSBpdGVtcy5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0XHRzcGxpY2UuYXBwbHkocGF0aHMsIFtpLS0sIDFdLmNvbmNhdChpdGVtcykpO1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICghJGlzRnVuY3Rpb24ocGF0aCkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGNvbXBpbGVkIGZ1bmN0aW9uIGZvciBiaW5kaW5nIHRvIGFuIG9iamVjdCByZXR1cm5lZCBieSBhIGhlbHBlci9kYXRhIGZ1bmN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdC8vIFNldCBjdXJyZW50IG9iamVjdCBvbiBleHByT2Iub2IsIGFuZCBnZXQgaW5uZXJDYiBmb3IgdXBkYXRpbmcgdGhlIG9iamVjdFxuXHRcdFx0XHRcdFx0XHRcdGlubmVyQ2IgPSB1bm9ic2VydmUgPyBwYXRoLmNiIDogZ2V0SW5uZXJDYihwYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRpbm5lckNiLm5vQXJyYXkgPSAhYWxsb3dBcnJheTtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbm5lckNiLl9jdHggPSBjYWxsYmFjay5fY3R4OyBDb3VsZCBwYXNzIGNvbnRleHQgKGUuZy4gbGlua0N0eCkgZm9yIHVzZSBpbiBhIGRlcGVuZHMgPSBmdW5jdGlvbigpIHt9IGNhbGwsIHNvIGRlcGVuZHMgaXMgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgbGlua0N0eCdzXG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJDYi5fY0lkID0gY2FsbGJhY2suX2NJZDtcblx0XHRcdFx0XHRcdFx0XHQvLyBTZXQgdGhlIHNhbWUgY2JCaW5kaW5nc1N0b3JlIGtleSBhcyBmb3IgY2FsbGJhY2ssIHNvIHdoZW4gY2FsbGJhY2sgaXMgZGlzcG9zZWQsIGRpc3Bvc2FsIG9mIGlubmVyQ2IgaGFwcGVucyB0b28uXG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJDYi5faW5JZCA9IGlubmVyQ2IuX2luSWQgfHwgXCIub2JJblwiICsgb2JzZXJ2ZUlubmVyQ2JLZXkrKztcblx0XHRcdFx0XHRcdFx0XHRpZiAocGF0aC5ibmQgfHwgcGF0aC5wcm0gJiYgcGF0aC5wcm0ubGVuZ3RoIHx8ICFwYXRoLnNiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgZXhwck9iIGlzIGJvdW5kIGUuZy4gZm9vKClec3ViLnBhdGgsIG9yIGhhcyBwYXJhbWV0ZXJzIGUuZy4gZm9vKGJhcikgb3IgaXMgYSBsZWFmIG9iamVjdCAoc28gbm8gc3ViIHBhdGgpIGUuZy4gZm9vKClcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoZW4gb2JzZXJ2ZSBjaGFuZ2VzIG9uIHRoZSBvYmplY3QsIG9yIGl0cyBwYXJhbWV0ZXJzIGFuZCBzdWItcGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtvYmplY3RdLCBwYXRoLnBhdGgsIFtvcmlnUm9vdF0sIHBhdGgucHJtLCBpbm5lckNiLCBjb250ZXh0Q2IsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXRoLnNiKSB7IC8vIHN1YlBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbcGF0aC5vYl0sIHBhdGguc2IsIGNhbGxiYWNrLCBjb250ZXh0Q2IsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBvcmlnUm9vdDtcblx0XHRcdFx0XHRcdFx0XHRvYmplY3QgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gcGF0aDsgLy8gRm9yIHRvcC1sZXZlbCBjYWxscywgb2JqZWN0cyBpbiB0aGUgcGF0aHMgYXJyYXkgYmVjb21lIHRoZSBvcmlnUm9vdCBmb3Igc3Vic2VxdWVudCBwYXRocy5cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cGFydHMgPSBbcm9vdCA9IHBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR3aGlsZSAob2JqZWN0ICYmIChwcm9wID0gcGFydHMuc2hpZnQoKSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3QgPT09IE9CSkVDVCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoXCJcIiArIHByb3AgPT09IHByb3ApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAocHJvcCA9PT0gXCJcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmICgocGFydHMubGVuZ3RoIDwgZGVwdGggKyAxKSAmJiAhb2JqZWN0Lm5vZGVUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBBZGQgb2JzZXJ2ZXIgZm9yIGVhY2ggdG9rZW4gaW4gcGF0aCBzdGFydGluZyBhdCBkZXB0aCwgYW5kIG9uIHRvIHRoZSBsZWFmXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXVub2JzZXJ2ZSAmJiAoZXZlbnRzID0gJGhhc0RhdGEob2JqZWN0KSAmJiAkLl9kYXRhKG9iamVjdCkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cy5ldmVudHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cyAmJiBldmVudHNbcHJvcGVydHlDaGFuZ2VTdHJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbCA9IGV2ZW50cyAmJiBldmVudHMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRza2lwID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGVsLS0pIHsgLy8gU2tpcCBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IGV2ZW50c1tlbF0uZGF0YTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZGF0YVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JiYgZGF0YS5ucyA9PT0gaW5pdGlhbE5zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQmJiBkYXRhLmNiLl9jSWQgPT09IGNhbGxiYWNrLl9jSWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCYmIGRhdGEuY2IuX2luSWQgPT09IGNhbGxiYWNrLl9pbklkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQmJiAoZGF0YS5wcm9wID09PSBwcm9wIHx8IGRhdGEucHJvcCA9PT0gXCIqXCIgfHwgZGF0YS5wcm9wID09PSBcIioqXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocCA9IHBhcnRzLmpvaW4oXCIuXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGEucGF0aHMucHVzaChwKTsgLy8gV2Ugd2lsbCBza2lwIHRoaXMgYmluZGluZywgYnV0IGlmIGl0IGlzIG5vdCBhIGxlYWYgYmluZGluZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gbmVlZCB0byBrZWVwIGJpbmRpbmdzIGZvciByZXN0IG9mIHBhdGgsIHJlYWR5IGZvciBpZiB0aGUgb2JqZWN0IGdldHMgc3dhcHBlZC5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNraXArKztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNraXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEdXBsaWNhdGUgYmluZGluZyhzKSBmb3VuZCwgc28gbW92ZSBvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdCA9IG9iamVjdFtwcm9wXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHByb3AgPT09IFwiKlwiIHx8IHByb3AgPT09IFwiKipcIikgeyAvLyBcIipcIiA9PiBhbGwgcHJvcGVydGllcy4gXCIqKlwiID0+IGFsbCBwcm9wZXJ0aWVzIGFuZCBzdWItcHJvcGVydGllcyAoaS5lLiBkZWVwIG9ic2VydmVBbGwgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghdW5vYnNlcnZlICYmIGV2ZW50cyAmJiBldmVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIGJpbmRpbmdzLCBzaW5jZSB0aGV5IHdpbGwgYmUgZHVwbGljYXRlcyB3aXRoIFwiKlwiIG9yIFwiKipcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIiwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wID09PSBcIipcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIik7IC8vIG9ic2VydmUgdGhlIG9iamVjdCBmb3IgYW55IHByb3BlcnR5IGNoYW5nZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAocCBpbiBvYmplY3QpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIG9ic2VydmluZyBcIipcIjogU28gKGluIGFkZGl0aW9uIHRvIGxpc3RlbmluZyB0byBwcm9wIGNoYW5nZSwgYWJvdmUpIGxpc3RlbiB0byBhcnJheWNoYW5nZSBvbiBwcm9wcyBvZiB0eXBlIGFycmF5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocCAhPT0gJGV4cGFuZG8pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG9iamVjdCwgdW5vYnNlcnZlLCB1bmRlZmluZWQsIHApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkLm9ic2VydmFibGUoaW5pdGlhbE5zLCBvYmplY3QpWyh1bm9ic2VydmUgPyBcInVuXCIgOiBcIlwiKSArIFwib2JzZXJ2ZUFsbFwiXShjYWxsYmFjayk7IC8vIG9ic2VydmUgb3IgdW5vYnNlcnZlIHRoZSBvYmplY3QgZm9yIGFueSBwcm9wZXJ0eSBjaGFuZ2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJvcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMgKyBcIi5wX1wiICsgcHJvcCwgcGFydHMuam9pbihcIl5cIikpOyAvLyBCeSB1c2luZyBcIl5cIiByYXRoZXIgdGhhbiBcIi5cIiB3ZSBlbnN1cmUgdGhhdCBkZWVwIGJpbmRpbmcgd2lsbCBiZSB1c2VkIG9uIG5ld2x5IGluc2VydGVkIG9iamVjdCBncmFwaHNcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFsbFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFsbFBhdGggKz0gXCIuXCIgKyBwcm9wO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wID0gb2JqZWN0W3Byb3BdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICgkaXNGdW5jdGlvbihwcm9wKSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChkZXAgPSBwcm9wLmRlcGVuZHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBjb21wdXRlZCBvYnNlcnZhYmxlLiBXZSB3aWxsIG9ic2VydmUgYW55IGRlY2xhcmVkIGRlcGVuZGVuY2llc1xuXHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtvYmplY3RdLCByZXNvbHZlUGF0aE9iamVjdHMoZGVwLCBvYmplY3QsIGNhbGxiYWNrKSwgY2FsbGJhY2ssIGNvbnRleHRDYiwgdW5vYnNlcnZlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gcHJvcDtcblx0XHRcdFx0XHRcdFx0aWYgKHVub2JzZXJ2ZSAmJiBvYmplY3QgPT09IHJvb3QgJiYgKGk+bC0yIHx8IHBhdGhzW2krMV0gKyBcIlwiICE9PSBwYXRoc1tpKzFdKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIHVub2JzZXJ2ZSBhbGwgaGFuZGxlcnMgb2Ygb2JqZWN0LCBpZiBub3QgZm9sbG93ZWQgYnkgc3RyaW5nIHBhdGguXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZS5nLiQudW5vYnNlcnZlKG9iamVjdDEsIG9iamVjdDIsIFwicGF0aFwiLCBvYmplY3QzKSB3aWxsIHVub2JzZXJ2ZSBhbGwgZnJvbSBvYmplY3QxIGFuZCBvYmplY3QzLCBhbmQganVzdCBcInBhdGhcIiBsaXN0ZW5lciBmcm9tIG9iamVjdDJcblx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJpbmRBcnJheShvYmplY3QsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChjYklkKSB7XG5cdFx0XHRcdHJlbW92ZUNiQmluZGluZ3MoY2JCaW5kaW5ncywgY2JJZCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiB0aGUgY2JCaW5kaW5ncyB0byB0aGUgdG9wLWxldmVsIGNhbGxlciwgYWxvbmcgd2l0aCB0aGUgY2JJZFxuXHRcdFx0cmV0dXJuIHtjYklkOiBjYklkLCBibmQ6IGNiQmluZGluZ3MsIHM6IGNiQmluZGluZ3NTdG9yZX07XG5cdFx0fVxuXG5cdFx0dmFyIGluaXRpYWxOcyxcblx0XHRcdGFsbG93QXJyYXkgPSB0aGlzICE9IGZhbHNlLCAvLyBJZiB0aGlzID09PSBmYWxzZSwgdGhpcyBpcyBhIGNhbGwgZnJvbSBvYnNlcnZlQW5kQmluZCAtIGRvaW5nIGJpbmRpbmcgb2YgZGF0YWxpbmsgZXhwcmVzc2lvbnMuIFdlIGRvbid0IGJpbmRcblx0XHRcdC8vIGFycmF5Q2hhbmdlIGV2ZW50cyBpbiB0aGlzIHNjZW5hcmlvLiBJbnN0ZWFkLCB7Xntmb3J9fSBhbmQgc2ltaWxhciBkbyBzcGVjaWZpYyBhcnJheUNoYW5nZSBiaW5kaW5nIHRvIHRoZSB0YWdDdHguYXJnc1swXSB2YWx1ZSwgaW4gb25BZnRlckxpbmsuXG5cdFx0XHQvLyBOb3RlIGRlbGliZXJhdGVseSB1c2luZyB0aGlzICE9IGZhbHNlLCByYXRoZXIgdGhhbiB0aGlzICE9PSBmYWxzZSBiZWNhdXNlIG9mIElFPDEwIGJ1Zy0gc2VlIGpzdmlld3MvaXNzdWVzLzIzN1xuXHRcdFx0cGF0aHMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyksXG5cdFx0XHRvcmlnUm9vdCA9IHBhdGhzWzBdO1xuXG5cdFx0aWYgKG9yaWdSb290ICsgXCJcIiA9PT0gb3JpZ1Jvb3QgJiYgYWxsb3dBcnJheSkge1xuXHRcdFx0aW5pdGlhbE5zID0gb3JpZ1Jvb3Q7IC8vIFRoZSBmaXJzdCBhcmcgaXMgYSBuYW1lc3BhY2UsIHNpbmNlIGl0IGlzIGEgc3RyaW5nLCBhbmQgdGhpcyBjYWxsIGlzIG5vdCBmcm9tIG9ic2VydmVBbmRCaW5kXG5cdFx0XHRwYXRocy5zaGlmdCgpO1xuXHRcdFx0b3JpZ1Jvb3QgPSBwYXRoc1swXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaW5uZXJPYnNlcnZlLmFwcGx5KDEsIHBhdGhzKTtcblx0fTtcblxuXHQkb2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKG5zLCBkYXRhKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGRhdGEgPSBucztcblx0XHRcdG5zID0gXCJcIjtcblx0XHR9XG5cdFx0cmV0dXJuICRpc0FycmF5KGRhdGEpXG5cdFx0XHQ/IG5ldyBBcnJheU9ic2VydmFibGUobnMsIGRhdGEpXG5cdFx0XHQ6IG5ldyBPYmplY3RPYnNlcnZhYmxlKG5zLCBkYXRhKTtcblx0fTtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQkc3ViLmdldERlcHMgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXJncyA9IGFyZ3VtZW50cztcblx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgYXJnLCBkZXAsXG5cdFx0XHRcdGRlcHMgPSBbXSxcblx0XHRcdFx0bCA9IGFyZ3MubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRhcmcgPSBhcmdzW2wtLV07XG5cdFx0XHRcdGRlcCA9IGFyZ3NbbF07XG5cdFx0XHRcdGlmIChkZXApIHtcblx0XHRcdFx0XHRkZXBzID0gZGVwcy5jb25jYXQoJGlzRnVuY3Rpb24oZGVwKSA/IGRlcChhcmcsIGFyZykgOiBkZXApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZGVwcztcblx0XHR9O1xuXHR9O1xuXG5cdCQub2JzZXJ2YWJsZSA9ICRvYnNlcnZhYmxlO1xuXHQkb2JzZXJ2YWJsZS5fZmx0ciA9IGZ1bmN0aW9uKGFsbFBhdGgsIG9iamVjdCwgcGFyZW50T2JzLCBmaWx0ZXIpIHtcblx0XHRpZiAoZmlsdGVyICYmICRpc0Z1bmN0aW9uKGZpbHRlcilcblx0XHRcdD8gZmlsdGVyKGFsbFBhdGgsIG9iamVjdCwgcGFyZW50T2JzKVxuXHRcdFx0OiB0cnVlIC8vIFRPRE8gQ29uc2lkZXIgc3VwcG9ydGluZyBmaWx0ZXIgYmVpbmcgYSBzdHJpbmcgb3Igc3RyaW5ncyB0byBkbyBSZWdFeCBmaWx0ZXJpbmcgYmFzZWQgb24ga2V5IGFuZC9vciBhbGxQYXRoXG5cdFx0KSB7XG5cdFx0XHRvYmplY3QgPSAkaXNGdW5jdGlvbihvYmplY3QpXG5cdFx0XHRcdD8gb2JqZWN0LnNldCAmJiBvYmplY3QuY2FsbChwYXJlbnRPYnNbMF0pIC8vIEl0IGlzIGEgZ2V0dGVyL3NldHRlclxuXHRcdFx0XHQ6IG9iamVjdDtcblx0XHRcdHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSBPQkpFQ1QgJiYgb2JqZWN0O1xuXHRcdH1cblx0fTtcblxuXHQkb2JzZXJ2YWJsZS5PYmplY3QgPSBPYmplY3RPYnNlcnZhYmxlO1xuXHQkb2JzZXJ2YWJsZS5BcnJheSA9IEFycmF5T2JzZXJ2YWJsZTtcblx0JC5vYnNlcnZlID0gJG9ic2VydmFibGUub2JzZXJ2ZSA9ICRvYnNlcnZlO1xuXHQkLnVub2JzZXJ2ZSA9ICRvYnNlcnZhYmxlLnVub2JzZXJ2ZSA9ICR1bm9ic2VydmU7XG5cdCRvYnNlcnZhYmxlLl9hcHBseSA9IG9ic2VydmVfYXBwbHk7XG5cblx0T2JqZWN0T2JzZXJ2YWJsZS5wcm90b3R5cGUgPSB7XG5cdFx0X2RhdGE6IG51bGwsXG5cblx0XHRvYnNlcnZlQWxsOiAkb2JzZXJ2ZUFsbCxcblx0XHR1bm9ic2VydmVBbGw6ICR1bm9ic2VydmVBbGwsXG5cblx0XHRkYXRhOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9kYXRhO1xuXHRcdH0sXG5cblx0XHRzZXRQcm9wZXJ0eTogZnVuY3Rpb24ocGF0aCwgdmFsdWUsIG5vblN0cmljdCkge1xuXHRcdFx0cGF0aCA9IHBhdGggfHwgXCJcIjtcblx0XHRcdHZhciBrZXksIHBhaXIsIHBhcnRzLFxuXHRcdFx0XHRtdWx0aSA9IHBhdGggKyBcIlwiICE9PSBwYXRoLFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0b2JqZWN0ID0gc2VsZi5fZGF0YTtcblxuXHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRpZiAobXVsdGkpIHtcblx0XHRcdFx0XHRub25TdHJpY3QgPSB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoJGlzQXJyYXkocGF0aCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgdGhlIGFycmF5IGZvcm1hdCBnZW5lcmF0ZWQgYnkgc2VyaWFsaXplQXJyYXkuIEhvd2V2ZXIsIHRoaXMgaGFzIHRoZSBwcm9ibGVtIHRoYXQgaXQgY29lcmNlcyB0eXBlcyB0byBzdHJpbmcsXG5cdFx0XHRcdFx0XHQvLyBhbmQgZG9lcyBub3QgcHJvdmlkZSBzaW1wbGUgc3VwcG9ydCBvZiBjb252ZXJ0VG8gYW5kIGNvbnZlcnRGcm9tIGZ1bmN0aW9ucy5cblx0XHRcdFx0XHRcdGtleSA9IHBhdGgubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGtleS0tKSB7XG5cdFx0XHRcdFx0XHRcdHBhaXIgPSBwYXRoW2tleV07XG5cdFx0XHRcdFx0XHRcdHNlbGYuc2V0UHJvcGVydHkocGFpci5uYW1lLCBwYWlyLnZhbHVlLCBub25TdHJpY3QgPT09IHVuZGVmaW5lZCB8fCBub25TdHJpY3QpOyAvL0lmIG5vblN0cmljdCBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0IHRvIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIE9iamVjdCByZXByZXNlbnRhdGlvbiB3aGVyZSBwcm9wZXJ0eSBuYW1lIGlzIHBhdGggYW5kIHByb3BlcnR5IHZhbHVlIGlzIHZhbHVlLlxuXHRcdFx0XHRcdFx0Zm9yIChrZXkgaW4gcGF0aCkge1xuXHRcdFx0XHRcdFx0XHRzZWxmLnNldFByb3BlcnR5KGtleSwgcGF0aFtrZXldLCBub25TdHJpY3QpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwYXRoICE9PSAkZXhwYW5kbykge1xuXHRcdFx0XHRcdC8vIFNpbXBsZSBzaW5nbGUgcHJvcGVydHkgY2FzZS5cblx0XHRcdFx0XHRwYXJ0cyA9IHBhdGguc3BsaXQoL1suXl0vKTtcblx0XHRcdFx0XHR3aGlsZSAob2JqZWN0ICYmIHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdG9iamVjdCA9IG9iamVjdFtwYXJ0cy5zaGlmdCgpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRcdFx0c2VsZi5fc2V0UHJvcGVydHkob2JqZWN0LCBwYXJ0c1swXSwgdmFsdWUsIG5vblN0cmljdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc2VsZjtcblx0XHR9LFxuXG5cdFx0cmVtb3ZlUHJvcGVydHk6IGZ1bmN0aW9uKHBhdGgpIHtcblx0XHRcdHRoaXMuc2V0UHJvcGVydHkocGF0aCwgcmVtb3ZlKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfc2V0UHJvcGVydHk6IGZ1bmN0aW9uKGxlYWYsIHBhdGgsIHZhbHVlLCBub25TdHJpY3QpIHtcblx0XHRcdHZhciBzZXR0ZXIsIGdldHRlciwgcmVtb3ZlUHJvcCxcblx0XHRcdFx0cHJvcGVydHkgPSBwYXRoID8gbGVhZltwYXRoXSA6IGxlYWY7XG5cblx0XHRcdGlmICgkaXNGdW5jdGlvbihwcm9wZXJ0eSkpIHtcblx0XHRcdFx0aWYgKHByb3BlcnR5LnNldCkge1xuXHRcdFx0XHRcdC8vIENhc2Ugb2YgcHJvcGVydHkgc2V0dGVyL2dldHRlciAtIHdpdGggY29udmVudGlvbiB0aGF0IHByb3BlcnR5IGlzIGdldHRlciBhbmQgcHJvcGVydHkuc2V0IGlzIHNldHRlclxuXHRcdFx0XHRcdGxlYWYgPSBsZWFmLl93cnAgIC8vIENhc2Ugb2YgSnNWaWV3cyAyLXdheSBkYXRhLWxpbmtpbmcgdG8gYSBoZWxwZXIgZnVuY3Rpb24gYXMgZ2V0dGVyLCB3aXRoIGEgc2V0dGVyLlxuXHRcdFx0XHRcdFx0Ly8gVGhlIHZpZXcgd2lsbCBiZSB0aGUgdGhpcyBwb2ludGVyIGZvciBnZXR0ZXIgYW5kIHNldHRlci4gTm90ZTogdGhpcyBpcyB0aGUgb25lIHNjZW5hcmlvIHdoZXJlIHBhdGggaXMgXCJcIi5cblx0XHRcdFx0XHRcdHx8IGxlYWY7XG5cdFx0XHRcdFx0Z2V0dGVyID0gcHJvcGVydHk7XG5cdFx0XHRcdFx0c2V0dGVyID0gZ2V0dGVyLnNldCA9PT0gdHJ1ZSA/IGdldHRlciA6IGdldHRlci5zZXQ7XG5cdFx0XHRcdFx0cHJvcGVydHkgPSBnZXR0ZXIuY2FsbChsZWFmKTsgLy8gZ2V0IC0gb25seSB0cmVhdGVkIGFzIGdldHRlciBpZiBhbHNvIGEgc2V0dGVyLiBPdGhlcndpc2UgaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgb2YgdHlwZSBmdW5jdGlvbi4gU2VlIHVuaXQgdGVzdHMgJ0NhbiBvYnNlcnZlIHByb3BlcnRpZXMgb2YgdHlwZSBmdW5jdGlvbicuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BlcnR5ICE9PSB2YWx1ZSB8fCBub25TdHJpY3QgJiYgcHJvcGVydHkgIT0gdmFsdWUpIHsgLy8gT3B0aW9uYWwgbm9uLXN0cmljdCBlcXVhbGl0eSwgc2luY2Ugc2VyaWFsaXplQXJyYXksIGFuZCBmb3JtLWJhc2VkIGVkaXRvcnMgY2FuIG1hcCBudW1iZXJzIHRvIHN0cmluZ3MsIGV0Yy5cblx0XHRcdFx0Ly8gRGF0ZSBvYmplY3RzIGRvbid0IHN1cHBvcnQgIT0gY29tcGFyaXNvbi4gVHJlYXQgYXMgc3BlY2lhbCBjYXNlLlxuXHRcdFx0XHRpZiAoIShwcm9wZXJ0eSBpbnN0YW5jZW9mIERhdGUpIHx8IHByb3BlcnR5ID4gdmFsdWUgfHwgcHJvcGVydHkgPCB2YWx1ZSkge1xuXHRcdFx0XHRcdGlmIChzZXR0ZXIpIHtcblx0XHRcdFx0XHRcdHNldHRlci5jYWxsKGxlYWYsIHZhbHVlKTsgICAvL3NldFxuXHRcdFx0XHRcdFx0dmFsdWUgPSBnZXR0ZXIuY2FsbChsZWFmKTsgIC8vZ2V0IHVwZGF0ZWQgdmFsdWVcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHJlbW92ZVByb3AgPSB2YWx1ZSA9PT0gcmVtb3ZlKSB7XG5cdFx0XHRcdFx0XHRpZiAocHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgbGVhZltwYXRoXTtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gdW5kZWZpbmVkOyAvLyBJZiB2YWx1ZSB3YXMgYWxyZWFkeSB1bmRlZmluZWQsIGRvbid0IHRyaWdnZXIgaGFuZGxlciBmb3IgcmVtb3ZlUHJvcFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0bGVhZltwYXRoXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fdHJpZ2dlcihsZWFmLCB7Y2hhbmdlOiBcInNldFwiLCBwYXRoOiBwYXRoLCB2YWx1ZTogdmFsdWUsIG9sZFZhbHVlOiBwcm9wZXJ0eSwgcmVtb3ZlOiByZW1vdmVQcm9wfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdF90cmlnZ2VyOiBmdW5jdGlvbih0YXJnZXQsIGV2ZW50QXJncykge1xuXHRcdFx0JCh0YXJnZXQpLnRyaWdnZXJIYW5kbGVyKHByb3BlcnR5Q2hhbmdlU3RyICsgKHRoaXMuX25zID8gXCIuXCIgKyAvXlxcUysvLmV4ZWModGhpcy5fbnMpWzBdIDogXCJcIiksIGV2ZW50QXJncyk7IC8vIElmIHdoaXRlLXNwYWNlIHNlcGFyYXRlZCBuYW1lc3BhY2VzLCB1c2UgZmlyc3Qgb25lIG9ubHlcblx0XHR9XG5cdH07XG5cblx0QXJyYXlPYnNlcnZhYmxlLnByb3RvdHlwZSA9IHtcblx0XHRfZGF0YTogbnVsbCxcblxuXHRcdG9ic2VydmVBbGw6ICRvYnNlcnZlQWxsLFxuXHRcdHVub2JzZXJ2ZUFsbDogJHVub2JzZXJ2ZUFsbCxcblxuXHRcdGRhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2RhdGE7XG5cdFx0fSxcblxuXHRcdGluc2VydDogZnVuY3Rpb24oaW5kZXgsIGRhdGEpIHtcblx0XHRcdHZhciBfZGF0YSA9IHRoaXMuX2RhdGE7XG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRkYXRhID0gaW5kZXg7XG5cdFx0XHRcdGluZGV4ID0gX2RhdGEubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0aW5kZXggPSBQQVJTRUlOVChpbmRleCk7XG5cdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHRkYXRhID0gJGlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdO1xuXHRcdFx0XHQvLyBkYXRhIGNhbiBiZSBhIHNpbmdsZSBpdGVtIChpbmNsdWRpbmcgYSBudWxsL3VuZGVmaW5lZCB2YWx1ZSkgb3IgYW4gYXJyYXkgb2YgaXRlbXMuXG5cdFx0XHRcdC8vIE5vdGUgdGhlIHByb3ZpZGVkIGl0ZW1zIGFyZSBpbnNlcnRlZCB3aXRob3V0IGJlaW5nIGNsb25lZCwgYXMgZGlyZWN0IHJlZmVyZW5jZXMgdG8gdGhlIHByb3ZpZGVkIG9iamVjdHNcblxuXHRcdFx0XHRpZiAoZGF0YS5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9pbnNlcnQoaW5kZXgsIGRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X2luc2VydDogZnVuY3Rpb24oaW5kZXgsIGRhdGEpIHtcblx0XHRcdHZhciBfZGF0YSA9IHRoaXMuX2RhdGEsXG5cdFx0XHRcdG9sZExlbmd0aCA9IF9kYXRhLmxlbmd0aDtcblx0XHRcdGlmIChpbmRleCA+IG9sZExlbmd0aCkge1xuXHRcdFx0XHRpbmRleCA9IG9sZExlbmd0aDtcblx0XHRcdH1cblx0XHRcdHNwbGljZS5hcHBseShfZGF0YSwgW2luZGV4LCAwXS5jb25jYXQoZGF0YSkpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiBcImluc2VydFwiLCBpbmRleDogaW5kZXgsIGl0ZW1zOiBkYXRhfSwgb2xkTGVuZ3RoKTtcblx0XHR9LFxuXG5cdFx0cmVtb3ZlOiBmdW5jdGlvbihpbmRleCwgbnVtVG9SZW1vdmUpIHtcblx0XHRcdHZhciBpdGVtcyxcblx0XHRcdFx0X2RhdGEgPSB0aGlzLl9kYXRhO1xuXG5cdFx0XHRpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpbmRleCA9IF9kYXRhLmxlbmd0aCAtIDE7XG5cdFx0XHR9XG5cblx0XHRcdGluZGV4ID0gUEFSU0VJTlQoaW5kZXgpO1xuXHRcdFx0bnVtVG9SZW1vdmUgPSBudW1Ub1JlbW92ZSA/IFBBUlNFSU5UKG51bVRvUmVtb3ZlKSA6IG51bVRvUmVtb3ZlID09PSAwID8gMCA6IDE7IC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkOiByZW1vdmUgMVxuXHRcdFx0aWYgKG51bVRvUmVtb3ZlID4gMCAmJiBpbmRleCA+IC0xKSB7XG5cdFx0XHRcdGl0ZW1zID0gX2RhdGEuc2xpY2UoaW5kZXgsIGluZGV4ICsgbnVtVG9SZW1vdmUpO1xuXHRcdFx0XHRpZiAobnVtVG9SZW1vdmUgPSBpdGVtcy5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmUoaW5kZXgsIG51bVRvUmVtb3ZlLCBpdGVtcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfcmVtb3ZlOiBmdW5jdGlvbihpbmRleCwgbnVtVG9SZW1vdmUsIGl0ZW1zKSB7XG5cdFx0XHR2YXIgX2RhdGEgPSB0aGlzLl9kYXRhLFxuXHRcdFx0XHRvbGRMZW5ndGggPSBfZGF0YS5sZW5ndGg7XG5cblx0XHRcdF9kYXRhLnNwbGljZShpbmRleCwgbnVtVG9SZW1vdmUpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiBcInJlbW92ZVwiLCBpbmRleDogaW5kZXgsIGl0ZW1zOiBpdGVtc30sIG9sZExlbmd0aCk7XG5cdFx0fSxcblxuXHRcdG1vdmU6IGZ1bmN0aW9uKG9sZEluZGV4LCBuZXdJbmRleCwgbnVtVG9Nb3ZlKSB7XG5cdFx0XHRudW1Ub01vdmUgPSBudW1Ub01vdmUgPyBQQVJTRUlOVChudW1Ub01vdmUpIDogbnVtVG9Nb3ZlID09PSAwID8gMCA6IDE7IC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkOiBtb3ZlIDFcblx0XHRcdG9sZEluZGV4ID0gUEFSU0VJTlQob2xkSW5kZXgpO1xuXHRcdFx0bmV3SW5kZXggPSBQQVJTRUlOVChuZXdJbmRleCk7XG5cblx0XHRcdGlmIChudW1Ub01vdmUgPiAwICYmIG9sZEluZGV4ID4gLTEgJiYgbmV3SW5kZXggPiAtMSAmJiBvbGRJbmRleCAhPT0gbmV3SW5kZXgpIHtcblx0XHRcdFx0dGhpcy5fbW92ZShvbGRJbmRleCwgbmV3SW5kZXgsIG51bVRvTW92ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X21vdmU6IGZ1bmN0aW9uKG9sZEluZGV4LCBuZXdJbmRleCwgbnVtVG9Nb3ZlKSB7XG5cdFx0XHR2YXIgaXRlbXMsXG5cdFx0XHRcdF9kYXRhID0gdGhpcy5fZGF0YSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gX2RhdGEubGVuZ3RoLFxuXHRcdFx0XHRleGNlc3MgPSBvbGRJbmRleCArIG51bVRvTW92ZSAtIG9sZExlbmd0aDtcblx0XHRcdGlmIChleGNlc3MgPiAwKSB7XG5cdFx0XHRcdG51bVRvTW92ZSAtPSBleGNlc3M7XG5cdFx0XHR9XG5cdFx0XHRpZiAobnVtVG9Nb3ZlKSB7XG5cdFx0XHRcdGl0ZW1zID0gX2RhdGEuc3BsaWNlKG9sZEluZGV4LCBudW1Ub01vdmUpOyAvLyByZW1vdmVcblx0XHRcdFx0aWYgKG5ld0luZGV4ID4gX2RhdGEubGVuZ3RoKSB7XG5cdFx0XHRcdFx0bmV3SW5kZXggPSBfZGF0YS5sZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3BsaWNlLmFwcGx5KF9kYXRhLCBbbmV3SW5kZXgsIDBdLmNvbmNhdChpdGVtcykpOyAvL3JlLWluc2VydFxuXHRcdFx0XHR0aGlzLl90cmlnZ2VyKHtjaGFuZ2U6IFwibW92ZVwiLCBvbGRJbmRleDogb2xkSW5kZXgsIGluZGV4OiBuZXdJbmRleCwgaXRlbXM6IGl0ZW1zfSwgb2xkTGVuZ3RoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0cmVmcmVzaDogZnVuY3Rpb24obmV3SXRlbXMsIHNvcnQpIHtcblx0XHRcdGZ1bmN0aW9uIGluc2VydEFkZGVkKCkge1xuXHRcdFx0XHRpZiAoaykge1xuXHRcdFx0XHRcdHNlbGYuaW5zZXJ0KGotaywgYWRkZWRJdGVtcyk7IC8vIE5vdCBmb3VuZCBpbiBvcmlnaW5hbCBhcnJheSAtIHNvIGluc2VydFxuXHRcdFx0XHRcdGRhdGFMZW5ndGggKz0gaztcblx0XHRcdFx0XHRpICs9IGs7XG5cdFx0XHRcdFx0ayA9IDA7XG5cdFx0XHRcdFx0YWRkZWRJdGVtcyA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciByZWZyZXNoIG9wZXJhdGlvbiB3ZSBpdGVyYXRpdmVseSBzdGVwIHRocm91Z2ggdGhlIHRhcmdldCBhcnJheSBhbmQgc29ydCBieSBtb3ZlL2FkZC9yZW1vdmUgb3BlcmF0aW9ucyBvbiB0aGUgc291cmNlIGFycmF5IHVudGlsIHRoZXkgbWF0Y2hcblx0XHRcdHZhciBpLCBqLCBrLCBuZXdJdGVtLCBudW0sXG5cdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRhZGRlZEl0ZW1zID0gW10sXG5cdFx0XHRcdGRhdGEgPSBzZWxmLl9kYXRhLFxuXHRcdFx0XHRvbGRJdGVtcyA9IGRhdGEuc2xpY2UoKSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG5cdFx0XHRcdGRhdGFMZW5ndGggPSBvbGRMZW5ndGgsXG5cdFx0XHRcdG5ld0xlbmd0aCA9IG5ld0l0ZW1zLmxlbmd0aDtcblx0XHRcdHNlbGYuX3NydCA9IHRydWU7IC8vIEZsYWcgZm9yIHNvcnRpbmcgZHVyaW5nIHJlZnJlc2hcblx0XHRcdGZvciAoaj1rPTA7IGo8bmV3TGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0aWYgKChuZXdJdGVtID0gbmV3SXRlbXNbal0pID09PSBkYXRhW2ota10pIHtcblx0XHRcdFx0XHRcdGluc2VydEFkZGVkKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9yIChpPWotazsgaTxkYXRhTGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGlmIChuZXdJdGVtID09PSBkYXRhW2ldKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaTxkYXRhTGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRpbnNlcnRBZGRlZCgpO1xuXHRcdFx0XHRcdFx0bnVtID0gMDtcblx0XHRcdFx0XHRcdHdoaWxlIChudW0rKyA8IG5ld0xlbmd0aC1pICYmIG5ld0l0ZW1zW2orbnVtXSA9PT0gZGF0YVtpK251bV0pO1xuXHRcdFx0XHRcdFx0c2VsZi5tb3ZlKGksIGosIG51bSk7IC8vIEZvdW5kIG5ld0l0ZW0gaW4gb3JpZ2luYWwgYXJyYXkgLSBzbyBtb3ZlIGl0IHRvIG5ldyBwb3NpdGlvblxuXHRcdFx0XHRcdFx0aiArPSBudW0gLSAxO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRrKys7XG5cdFx0XHRcdFx0XHRhZGRlZEl0ZW1zLnB1c2gobmV3SXRlbSk7IC8vIE5vdCBmb3VuZCBpbiBvcmlnaW5hbCBhcnJheSAtIHNvIGluc2VydFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aW5zZXJ0QWRkZWQoKTtcblx0XHRcdGlmIChkYXRhTGVuZ3RoID4gaikge1xuXHRcdFx0XHRzZWxmLnJlbW92ZShqLCBkYXRhTGVuZ3RoIC0gaik7XG5cdFx0XHR9XG5cdFx0XHRzZWxmLl9zcnQgPSB1bmRlZmluZWQ7IC8vIFdlIGhhdmUgZmluaXNoZWQgc29ydCBvcGVyYXRpb25zIGR1cmluZyByZWZyZXNoXG5cdFx0XHRzZWxmLl90cmlnZ2VyKHtjaGFuZ2U6IFwicmVmcmVzaFwiLCBvbGRJdGVtczogb2xkSXRlbXN9LCBvbGRMZW5ndGgpO1xuXHRcdFx0cmV0dXJuIHNlbGY7XG5cdFx0fSxcblxuXHRcdF90cmlnZ2VyOiBmdW5jdGlvbihldmVudEFyZ3MsIG9sZExlbmd0aCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRfZGF0YSA9IHNlbGYuX2RhdGEsXG5cdFx0XHRcdGxlbmd0aCA9IF9kYXRhLmxlbmd0aCxcblx0XHRcdFx0JF9kYXRhID0gJChbX2RhdGFdKTtcblx0XHRcdGlmIChzZWxmLl9zcnQpIHtcblx0XHRcdFx0ZXZlbnRBcmdzLnJlZnJlc2ggPSB0cnVlOyAvLyBXZSBhcmUgc29ydGluZyBkdXJpbmcgcmVmcmVzaFxuXHRcdFx0fSBlbHNlIGlmIChsZW5ndGggIT09IG9sZExlbmd0aCkgeyAgLy8gV2UgaGF2ZSBmaW5pc2hlZCBzb3J0IG9wZXJhdGlvbnMgZHVyaW5nIHJlZnJlc2hcblx0XHRcdFx0JF9kYXRhLnRyaWdnZXJIYW5kbGVyKHByb3BlcnR5Q2hhbmdlU3RyLCB7Y2hhbmdlOiBcInNldFwiLCBwYXRoOiBcImxlbmd0aFwiLCB2YWx1ZTogbGVuZ3RoLCBvbGRWYWx1ZTogb2xkTGVuZ3RofSk7XG5cdFx0XHR9XG5cdFx0XHQkX2RhdGEudHJpZ2dlckhhbmRsZXIoYXJyYXlDaGFuZ2VTdHIgKyAoc2VsZi5fbnMgPyBcIi5cIiArIC9eXFxTKy8uZXhlYyhzZWxmLl9ucylbMF0gOiBcIlwiKSwgZXZlbnRBcmdzKTsgLy8gSWYgd2hpdGUtc3BhY2Ugc2VwYXJhdGVkIG5hbWVzcGFjZXMsIHVzZSBmaXJzdCBvbmUgb25seVxuXHRcdH1cblx0fTtcblxuXHQkZXZlbnRTcGVjaWFsW3Byb3BlcnR5Q2hhbmdlU3RyXSA9ICRldmVudFNwZWNpYWxbYXJyYXlDaGFuZ2VTdHJdID0ge1xuXHRcdC8vIFJlZ2lzdGVyIGEgalF1ZXJ5IHNwZWNpYWwgJ3JlbW92ZScgZXZlbnQsIHRvIGFjY2VzcyB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggaGFuZGxlcnMgYmVpbmcgcmVtb3ZlZCBieSBqUXVlcnkub2ZmKCkuXG5cdFx0Ly8gV2UgZ2V0IGRhdGEuY2IuX2NJZCBmcm9tIHRoZSBldmVudCBoYW5kbGVPYmogYW5kIGdldCB0aGUgY29ycmVzcG9uZGluZyBjYkJpbmRpbmdzIGhhc2ggZnJvbSB0aGUgY2JCaW5kaW5nc1N0b3JlLFxuXHRcdC8vIHRoZW4gcmVtb3ZlIHRoaXMgb2JqZWN0IGZyb20gdGhhdCBiaW5kaW5ncyBoYXNoIC0gaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBoYW5kbGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgY2FsbGJhY2suXG5cdFx0cmVtb3ZlOiBmdW5jdGlvbiAoaGFuZGxlT2JqKSB7XG5cdFx0XHR2YXIgY2JCaW5kaW5ncywgZm91bmQsIGV2ZW50cywgbCwgZGF0YSxcblx0XHRcdFx0ZXZEYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cdFx0XHRpZiAoKGV2RGF0YSkgJiYgKGV2RGF0YS5vZmYgPSB0cnVlLCBldkRhdGEgPSBldkRhdGEuY2IpKSB7IC8vU2V0IG9mZiA9IHRydWUgYXMgbWFya2VyIGZvciBkaXNwb3NlZCBldmVudFxuXHRcdFx0XHQvLyBHZXQgdGhlIGNiLl9jSWQgZnJvbSBoYW5kbGVPYmouZGF0YS5jYi5fY0lkXG5cdFx0XHRcdGlmIChjYkJpbmRpbmdzID0gY2JCaW5kaW5nc1N0b3JlW2V2RGF0YS5fY0lkXSkge1xuXHRcdFx0XHRcdC8vIFRoZXJlIHdlcmUgYmluZGluZ3MgZm9yIHRoaXMgY2FsbGJhY2suIElmIHRoaXMgd2FzIHRoZSBsYXN0IG9uZSwgd2UnbGwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEodGhpcykuZXZlbnRzW2hhbmRsZU9iai50eXBlXTtcblx0XHRcdFx0XHRsID0gZXZlbnRzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAobC0tICYmICFmb3VuZCkge1xuXHRcdFx0XHRcdFx0Zm91bmQgPSAoZGF0YSA9IGV2ZW50c1tsXS5kYXRhKSAmJiBkYXRhLmNiICYmIGRhdGEuY2IuX2NJZCA9PT0gZXZEYXRhLl9jSWQ7XG5cdFx0XHRcdFx0XHQvLyBGb3VuZCBhbm90aGVyIG9uZSB3aXRoIHNhbWUgY2FsbGJhY2sgKHRob3VnaCBtYXkgYmUgYSBkaWZmZXJlbnQgaW5uZXJDYWxsYmFjaylcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyB3YXMgdGhlIGxhc3QgaGFuZGxlciBmb3IgdGhpcyBjYWxsYmFjayBhbmQgb2JqZWN0LCBzbyByZW1vdmUgdGhlIGJpbmRpbmcgZW50cnlcblx0XHRcdFx0XHRcdGRlbGV0ZSBjYkJpbmRpbmdzWyRkYXRhKHRoaXMpLm9iSWRdO1xuXHRcdFx0XHRcdFx0cmVtb3ZlQ2JCaW5kaW5ncyhjYkJpbmRpbmdzLCBldkRhdGEuX2NJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdCR2aWV3cy5tYXAgPSBmdW5jdGlvbihtYXBEZWYpIHtcblx0XHRmdW5jdGlvbiBNYXAoc291cmNlLCBvcHRpb25zLCB0YXJnZXQsIHVuYm91bmQpIHtcblx0XHRcdHZhciBjaGFuZ2luZyxcblx0XHRcdFx0bWFwID0gdGhpcztcblx0XHRcdGlmICh0aGlzLnNyYykge1xuXHRcdFx0XHR0aGlzLnVubWFwKCk7IC8vIFdlIGFyZSByZS1tYXBwaW5nIGEgbmV3IHNvdXJjZVxuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IE9CSkVDVCkge1xuXHRcdFx0XHRtYXAuc3JjID0gc291cmNlO1xuXHRcdFx0XHRtYXAudGd0ID0gdGFyZ2V0IHx8IG1hcC50Z3QgfHwgW107XG5cdFx0XHRcdG1hcC5vcHRpb25zID0gb3B0aW9ucyB8fCBtYXAub3B0aW9ucztcblx0XHRcdFx0bWFwLnVwZGF0ZSgpO1xuXHRcdFx0XHRpZiAoIXVuYm91bmQpIHtcblx0XHRcdFx0XHRpZiAobWFwRGVmLm9ic1NyYykge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnNyYykub2JzZXJ2ZUFsbChtYXAub2JzID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdFx0XHRpZiAoIWNoYW5naW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdG1hcERlZi5vYnNTcmMobWFwLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgbWFwLnNyY0ZsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChtYXBEZWYub2JzVGd0ICkge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnRndCkub2JzZXJ2ZUFsbChtYXAub2J0ID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdFx0aWYgKCFjaGFuZ2luZykge1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG1hcERlZi5vYnNUZ3QobWFwLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LCBtYXAudGd0Rmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoJGlzRnVuY3Rpb24obWFwRGVmKSkge1xuXHRcdFx0Ly8gU2ltcGxlIG1hcCBkZWNsYXJlZCBhcyBmdW5jdGlvblxuXHRcdFx0bWFwRGVmID0ge1xuXHRcdFx0XHRnZXRUZ3Q6IG1hcERlZlxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAobWFwRGVmLmJhc2VNYXApIHtcblx0XHRcdG1hcERlZiA9ICQuZXh0ZW5kKHt9LCBtYXBEZWYuYmFzZU1hcCwgbWFwRGVmKTtcblx0XHR9XG5cblx0XHRtYXBEZWYubWFwID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zLCB0YXJnZXQsIHVuYm91bmQpIHtcblx0XHRcdHJldHVybiBuZXcgTWFwKHNvdXJjZSwgb3B0aW9ucywgdGFyZ2V0LCB1bmJvdW5kKTtcblx0XHR9O1xuXG5cdFx0KE1hcC5wcm90b3R5cGUgPSB7XG5cdFx0XHRzcmNGbHQ6IG1hcERlZi5zcmNGbHQgfHwgc2hhbGxvd0ZpbHRlciwgLy8gZGVmYXVsdCB0byBzaGFsbG93RmlsdGVyXG5cdFx0XHR0Z3RGbHQ6IG1hcERlZi50Z3RGbHQgfHwgc2hhbGxvd0ZpbHRlcixcblx0XHRcdHVwZGF0ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdFx0XHR2YXIgbWFwID0gdGhpcztcblx0XHRcdFx0JG9ic2VydmFibGUobWFwLnRndCkucmVmcmVzaChtYXBEZWYuZ2V0VGd0KG1hcC5zcmMsIG1hcC5vcHRpb25zID0gb3B0aW9ucyB8fCBtYXAub3B0aW9ucykpO1xuXHRcdFx0fSxcblx0XHRcdHVubWFwOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG1hcCA9IHRoaXM7XG5cdFx0XHRcdGlmIChtYXAuc3JjKSB7XG5cdFx0XHRcdFx0aWYgKG1hcC5vYnMpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC5zcmMpLnVub2JzZXJ2ZUFsbChtYXAub2JzLCBtYXAuc3JjRmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG1hcC5vYnQpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC50Z3QpLnVub2JzZXJ2ZUFsbChtYXAub2J0LCBtYXAudGd0Rmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bWFwLnNyYyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG1hcDogTWFwLFxuXHRcdFx0X2RlZjogbWFwRGVmXG5cdFx0fSkuY29uc3RydWN0b3IgPSBNYXA7XG5cblx0XHRyZXR1cm4gbWFwRGVmO1xuXHR9O1xuXG5cdCRzdWIuYWR2U2V0ID0gZnVuY3Rpb24oKSB7IC8vIHJlZnJlc2ggYWR2YW5jZWQgc2V0dGluZ3Ncblx0XHRnbG9iYWwuX2pzdiA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZC5fanN2XG5cdFx0XHQ/IHsgLy8gY3JlYXRlIGdsb2JhbCBfanN2LCBmb3IgYWNjZXNzaW5nIHZpZXdzLCBldGNcblx0XHRcdFx0XHRjYkJpbmRpbmdzOiBjYkJpbmRpbmdzU3RvcmVcblx0XHRcdFx0fVxuXHRcdFx0OiB1bmRlZmluZWQ7IC8vIEluIElFOCBjYW5ub3QgZG8gZGVsZXRlIGdsb2JhbC5fanN2XG5cdH07XG59XG5cbnJldHVybiAkO1xufSwgd2luZG93KSk7XG4iLCIvKiEganF1ZXJ5LnZpZXdzLmpzIHYwLjkuODIgKEJldGEpOiBodHRwOi8vanN2aWV3cy5jb20vICovXG4vKlxuICogSW50ZXJhY3RpdmUgZGF0YS1kcml2ZW4gdmlld3MgdXNpbmcgSnNSZW5kZXIgdGVtcGxhdGVzLlxuICogU3ViY29tcG9uZW50IG9mIEpzVmlld3NcbiAqIFJlcXVpcmVzIGpRdWVyeSBhbmQganNyZW5kZXIuanMgKEJlc3Qtb2YtYnJlZWQgdGVtcGxhdGluZyBpbiBicm93c2VyIG9yIG9uIE5vZGUuanMpXG4gKiAgIFNlZSBKc1JlbmRlciBhdCBodHRwOi8vanN2aWV3cy5jb20vI2Rvd25sb2FkIGFuZCBodHRwOi8vZ2l0aHViLmNvbS9Cb3Jpc01vb3JlL2pzcmVuZGVyXG4gKiBBbHNvIHJlcXVpcmVzIGpxdWVyeS5vYnNlcnZhYmxlLmpzXG4gKiAgIFNlZSBKc09ic2VydmFibGUgYXQgaHR0cDovL2pzdmlld3MuY29tLyNkb3dubG9hZCBhbmQgaHR0cDovL2dpdGh1Yi5jb20vQm9yaXNNb29yZS9qc3ZpZXdzXG4gKlxuICogQ29weXJpZ2h0IDIwMTYsIEJvcmlzIE1vb3JlXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuLy9qc2hpbnQgLVcwMTgsIC1XMDQxXG5cbihmdW5jdGlvbihmYWN0b3J5LCBnbG9iYWwpIHtcblx0Ly8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcblx0dmFyICQgPSBnbG9iYWwualF1ZXJ5O1xuXG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikgeyAvLyBDb21tb25KUyBlLmcuIEJyb3dzZXJpZnlcblx0XHRtb2R1bGUuZXhwb3J0cyA9ICRcblx0XHRcdD8gZmFjdG9yeShnbG9iYWwsICQpXG5cdFx0XHQ6IGZ1bmN0aW9uKCQpIHsgLy8gSWYgbm8gZ2xvYmFsIGpRdWVyeSwgdGFrZSBqUXVlcnkgcGFzc2VkIGFzIHBhcmFtZXRlciAod2l0aCBKc1JlbmRlciBhbmQgSnNPYnNlcnZhYmxlKTogcmVxdWlyZShcImpxdWVyeS52aWV3c1wiKShqUXVlcnkpXG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KGdsb2JhbCwgJCk7XG5cdFx0XHR9O1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRCBzY3JpcHQgbG9hZGVyLCBlLmcuIFJlcXVpcmVKU1xuXHRcdGRlZmluZShbXCJqcXVlcnlcIiwgXCIuL2pzcmVuZGVyXCIsIFwiLi9qcXVlcnkub2JzZXJ2YWJsZVwiXSwgZnVuY3Rpb24oJCwganNyLCBqc28pIHtcblx0XHRcdHJldHVybiBmYWN0b3J5KGdsb2JhbCwgJCwganNyLCBqc28pO1xuXHRcdH0pOyAvLyBSZXF1aXJlIGpRdWVyeSwgSnNSZW5kZXIsIEpzT2JzZXJ2YWJsZVxuXHR9IGVsc2UgeyAvLyBCcm93c2VyIHVzaW5nIHBsYWluIDxzY3JpcHQ+IHRhZ1xuXHRcdGZhY3RvcnkoZ2xvYmFsLCBmYWxzZSk7XG5cdH1cbn0gKFxuXG4vLyBmYWN0b3J5IChmb3IganF1ZXJ5LnZpZXdzLmpzKVxuZnVuY3Rpb24oZ2xvYmFsLCAkLCBqc3IsIGpzbykge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcbnZhciBzZXRHbG9iYWxzID0gJCA9PT0gZmFsc2U7IC8vIE9ubHkgc2V0IGdsb2JhbHMgaWYgc2NyaXB0IGJsb2NrIGluIGJyb3dzZXIgKG5vdCBBTUQgYW5kIG5vdCBDb21tb25KUylcblxuanNyID0ganNyIHx8IHNldEdsb2JhbHMgJiYgZ2xvYmFsLmpzcmVuZGVyO1xuJCA9ICQgfHwgZ2xvYmFsLmpRdWVyeTtcblxudmFyIHZlcnNpb25OdW1iZXIgPSBcInYwLjkuODJcIixcblx0cmVxdWlyZXNTdHIgPSBcIkpzVmlld3MgcmVxdWlyZXMgXCI7XG5cbmlmICghJCB8fCAhJC5mbikge1xuXHQvLyBqUXVlcnkgaXMgbm90IGxvYWRlZC5cblx0dGhyb3cgcmVxdWlyZXNTdHIgKyBcImpRdWVyeVwiOyAvLyBXZSByZXF1aXJlIGpRdWVyeVxufVxuXG5pZiAoanNyICYmICFqc3IuZm4pIHtcblx0anNyLnZpZXdzLnN1Yi5fanEoJCk7IC8vIG1hcCBvdmVyIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lc3BhY2Vcbn1cblxudmFyICRvYnNlcnZlLCAkb2JzZXJ2YWJsZSxcblx0JGlzQXJyYXkgPSAkLmlzQXJyYXksXG5cdCR2aWV3cyA9ICQudmlld3M7XG5cbmlmICghJHZpZXdzIHx8ICEkdmlld3MubWFwKSB7XG5cdFx0Ly8gSnNSZW5kZXIgaXMgbm90IGxvYWRlZC5cblx0dGhyb3cgcmVxdWlyZXNTdHIgKyBcIkpzUmVuZGVyXCI7IC8vIGpzcmVuZGVyLmpzIG11c3QgYmUgbG9hZGVkIGJlZm9yZSBKc1ZpZXdzIGFuZCBhZnRlciBqUXVlcnlcbn1cblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50LFxuXHQkdmlld3NTZXR0aW5ncyA9ICR2aWV3cy5zZXR0aW5ncyxcblx0JHN1YiA9ICR2aWV3cy5zdWIsXG5cdCRzdWJTZXR0aW5ncyA9ICRzdWIuc2V0dGluZ3MsXG5cdCRleHRlbmQgPSAkc3ViLmV4dGVuZCxcblx0JGlzRnVuY3Rpb24gPSAkLmlzRnVuY3Rpb24sXG5cdCRleHBhbmRvID0gJC5leHBhbmRvLFxuXHQkY29udmVydGVycyA9ICR2aWV3cy5jb252ZXJ0ZXJzLFxuXHQkdGFncyA9ICR2aWV3cy50YWdzLFxuXHQkc3ViU2V0dGluZ3NBZHZhbmNlZCA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZCxcblxuXHQvLyBUaGVzZSB0d28gc2V0dGluZ3MgY2FuIGJlIG92ZXJyaWRkZW4gb24gc2V0dGluZ3MgYWZ0ZXIgbG9hZGluZyBqc1JlbmRlciwgYW5kIHByaW9yIHRvIGxvYWRpbmcganF1ZXJ5Lm9ic2VydmFibGUuanMgYW5kL29yIEpzVmlld3Ncblx0cHJvcGVydHlDaGFuZ2VTdHIgPSAkc3ViLnByb3BDaG5nID0gJHN1Yi5wcm9wQ2huZyB8fCBcInByb3BlcnR5Q2hhbmdlXCIsXG5cdGFycmF5Q2hhbmdlU3RyID0gJHN1Yi5hcnJDaG5nID0gJHN1Yi5hcnJDaG5nIHx8IFwiYXJyYXlDaGFuZ2VcIixcblxuXHRIVE1MID0gXCJodG1sXCIsXG5cdHN5bnRheEVycm9yID0gJHN1Yi5zeW50YXhFcnIsXG5cdHJGaXJzdEVsZW0gPSAvPCg/IXNjcmlwdCkoXFx3KylbPlxcc10vLFxuXHRlcnJvciA9ICRzdWIuX2VyLFxuXHRvblJlbmRlckVycm9yID0gJHN1Yi5fZXJyLFxuXHRkZWxpbU9wZW5DaGFyMCwgZGVsaW1PcGVuQ2hhcjEsIGRlbGltQ2xvc2VDaGFyMCwgZGVsaW1DbG9zZUNoYXIxLCBsaW5rQ2hhciwgdG9wVmlldyxcblx0ckVzY2FwZVF1b3RlcyA9IC9bJ1wiXFxcXF0vZzsgLy8gRXNjYXBlIHF1b3RlcyBhbmQgXFwgY2hhcmFjdGVyXG5pZiAoJC5saW5rKSB7IHJldHVybiAkOyB9IC8vIEpzVmlld3MgaXMgYWxyZWFkeSBsb2FkZWRcblxuJHN1YlNldHRpbmdzLnRyaWdnZXIgPSB0cnVlO1xudmFyIGFjdGl2ZUJvZHksIHJUYWdEYXRhbGluaywgJHZpZXcsICR2aWV3c0xpbmtBdHRyLCBsaW5rVmlld3NTZWwsIHdyYXBNYXAsIHZpZXdTdG9yZSwgb2xkQWR2U2V0LFxuXHRqc3ZBdHRyU3RyID0gXCJkYXRhLWpzdlwiLFxuXHRlbGVtZW50Q2hhbmdlU3RyID0gXCJjaGFuZ2UuanN2XCIsXG5cdG9uQmVmb3JlQ2hhbmdlU3RyID0gXCJvbkJlZm9yZUNoYW5nZVwiLFxuXHRvbkFmdGVyQ2hhbmdlU3RyID0gXCJvbkFmdGVyQ2hhbmdlXCIsXG5cdG9uQWZ0ZXJDcmVhdGVTdHIgPSBcIm9uQWZ0ZXJDcmVhdGVcIixcblx0Q0hFQ0tFRCA9IFwiY2hlY2tlZFwiLFxuXHRDSEVDS0JPWCA9IFwiY2hlY2tib3hcIixcblx0UkFESU8gPSBcInJhZGlvXCIsXG5cdE5PTkUgPSBcIm5vbmVcIixcblx0U0NSSVBUID0gXCJTQ1JJUFRcIixcblx0VFJVRSA9IFwidHJ1ZVwiLFxuXHRjbG9zZVNjcmlwdCA9ICdcIj48L3NjcmlwdD4nLFxuXHRvcGVuU2NyaXB0ID0gJzxzY3JpcHQgdHlwZT1cImpzdicsXG5cdGRlZmVyQXR0ciA9IGpzdkF0dHJTdHIgKyBcIi1kZlwiLFxuXHRiaW5kRWxzU2VsID0gXCJzY3JpcHQsW1wiICsganN2QXR0clN0ciArIFwiXVwiLFxuXHRmblNldHRlcnMgPSB7XG5cdFx0dmFsdWU6IFwidmFsXCIsXG5cdFx0aW5wdXQ6IFwidmFsXCIsXG5cdFx0aHRtbDogSFRNTCxcblx0XHR0ZXh0OiBcInRleHRcIlxuXHR9LFxuXHR2YWx1ZUJpbmRpbmcgPSB7ZnJvbTogXCJ2YWx1ZVwiLCB0bzogXCJ2YWx1ZVwifSxcblx0aXNDbGVhbkNhbGwgPSAwLFxuXHRvbGRDbGVhbkRhdGEgPSAkLmNsZWFuRGF0YSxcblx0b2xkSnN2RGVsaW1pdGVycyA9ICR2aWV3c1NldHRpbmdzLmRlbGltaXRlcnMsXG5cdHNhZmVGcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0cXNhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcixcblxuXHQvLyBlbENvbnRlbnQgbWFwcyB0YWdOYW1lcyB3aGljaCBoYXZlIG9ubHkgZWxlbWVudCBjb250ZW50LCBzbyBtYXkgbm90IHN1cHBvcnQgc2NyaXB0IG5vZGVzLlxuXHRlbENvbnRlbnQgPSB7b2w6IDEsIHVsOiAxLCB0YWJsZTogMSwgdGJvZHk6IDEsIHRoZWFkOiAxLCB0Zm9vdDogMSwgdHI6IDEsIGNvbGdyb3VwOiAxLCBkbDogMSwgc2VsZWN0OiAxLCBvcHRncm91cDogMSwgc3ZnOiAxLCBzdmdfbnM6IDF9LFxuXHRiYWRQYXJlbnQgPSB7dHI6IFwidGFibGVcIn0sXG5cdHZvaWRFbGVtcyA9IHticjogMSwgaW1nOiAxLCBpbnB1dDogMSwgaHI6IDEsIGFyZWE6IDEsIGJhc2U6IDEsIGNvbDogMSwgbGluazogMSwgbWV0YTogMSxcblx0XHRjb21tYW5kOiAxLCBlbWJlZDogMSwga2V5Z2VuOiAxLCBwYXJhbTogMSwgc291cmNlOiAxLCB0cmFjazogMSwgd2JyOiAxfSxcblx0ZGlzcGxheVN0eWxlcyA9IHt9LFxuXHRiaW5kaW5nU3RvcmUgPSB7fSxcblx0YmluZGluZ0tleSA9IDEsXG5cdHJWaWV3UGF0aCA9IC9eIyh2aWV3XFwuPyk/Lyxcblx0ckNvbnZlcnRNYXJrZXJzID0gLygoXFwvPil8PFxcLyhcXHcrKT58KShcXHMqKShbI1xcL11cXGQrKD86X3woXFxeKSkpYChcXHMqKSg8XFx3Kyg/PVtcXHNcXC8+XSkpP3xcXHMqKD86KDxcXHcrKD89W1xcc1xcLz5dKSl8PFxcLyhcXHcrKT4oXFxzKil8KFxcLz4pXFxzKnwoPil8JCkvZyxcblx0ck9wZW5WaWV3TWFya2VycyA9IC8oIykoKShcXGQrKShfKS9nLFxuXHRyT3Blbk1hcmtlcnMgPSAvKCMpKCkoXFxkKykoW19eXSkvZyxcblx0clZpZXdNYXJrZXJzID0gLyg/OigjKXwoXFwvKSkoXFxkKykoXykvZyxcblx0ck9wZW5UYWdNYXJrZXJzID0gLygjKSgpKFxcZCspKFxcXikvZyxcblx0ck1hcmtlclRva2VucyA9IC8oPzooIyl8KFxcLykpKFxcZCspKFtfXl0pKFstK0BcXGRdKyk/L2csXG5cdHJTcGxpdEJpbmRpbmdzID0gLyYoXFxkKylcXCs/L2csXG5cdGdldENvbXB1dGVkU3R5bGUgPSBnbG9iYWwuZ2V0Q29tcHV0ZWRTdHlsZTtcblxuJG9ic2VydmFibGUgPSAkLm9ic2VydmFibGU7XG5cbmlmICghJG9ic2VydmFibGUpIHtcblx0Ly8gSnNPYnNlcnZhYmxlIGlzIG5vdCBsb2FkZWQuXG5cdHRocm93IHJlcXVpcmVzU3RyICsgXCJKc09ic2VydmFibGVcIjsgLy8ganF1ZXJ5Lm9ic2VydmFibGUuanMgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIEpzVmlld3Ncbn1cblxuJG9ic2VydmUgPSAkb2JzZXJ2YWJsZS5vYnNlcnZlO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy89PT09PT09PT09PT09PT1cbi8vIEV2ZW50IGhhbmRsZXJzXG4vLz09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBlbGVtQ2hhbmdlSGFuZGxlcihldiwgcGFyYW1zLCBzb3VyY2VWYWx1ZSkge1xuXHR2YXIgc2V0dGVyLCBjYW5jZWwsIGZyb21BdHRyLCBsaW5rQ3R4LCBjdnRCYWNrLCBjbnZ0TmFtZSwgdGFyZ2V0LCAkc291cmNlLCB2aWV3LCBiaW5kaW5nLCBvbGRMaW5rQ3R4LCBvbkJlZm9yZUNoYW5nZSwgb25BZnRlckNoYW5nZSwgdGFnLCB0bywgZXZlbnRBcmdzLCBleHByT2IsXG5cdFx0c291cmNlID0gZXYudGFyZ2V0LFxuXHRcdGJpbmRpbmdzID0gc291cmNlLl9qc3ZCbmQ7XG5cblx0Ly8gX2pzdkJuZCBpcyBhIHN0cmluZyB3aXRoIHRoZSBzeW50YXg6IFwiJmJpbmRpbmdJZDEmYmluZGluZ0lkMlwiXG5cdGlmIChiaW5kaW5ncyAmJiBldi5jaGFyIT09XCJcIikge1xuXHRcdHdoaWxlIChiaW5kaW5nID0gclNwbGl0QmluZGluZ3MuZXhlYyhiaW5kaW5ncykpIHtcblx0XHRcdGlmIChiaW5kaW5nID0gYmluZGluZ1N0b3JlW2JpbmRpbmdbMV1dKSB7XG5cdFx0XHRcdGlmICh0byA9IGJpbmRpbmcudG8pIHtcblx0XHRcdFx0XHQvLyBUaGUgYmluZGluZyBoYXMgYSAndG8nIGZpZWxkLCB3aGljaCBpcyBvZiB0aGUgZm9ybSBbW3RhcmdldE9iamVjdCwgdG9QYXRoXSwgY3Z0QmFja11cblx0XHRcdFx0XHRsaW5rQ3R4ID0gYmluZGluZy5saW5rQ3R4O1xuXHRcdFx0XHRcdHZpZXcgPSBsaW5rQ3R4LnZpZXc7XG5cdFx0XHRcdFx0dGFnID0gbGlua0N0eC50YWcgfHwgdmlldy50YWc7XG5cdFx0XHRcdFx0JHNvdXJjZSA9ICQoc291cmNlKTtcblx0XHRcdFx0XHRvbkJlZm9yZUNoYW5nZSA9IHZpZXcuaGxwKG9uQmVmb3JlQ2hhbmdlU3RyKTsgLy8gVE9ETyBDYW4gd2Ugb3B0aW1pemUgdGhpcyBhbmQgb3RoZXIgaW5zdGFuY2VzIG9mIHNhbWU/XG5cdFx0XHRcdFx0b25BZnRlckNoYW5nZSA9IHZpZXcuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpOyAvLyBUT0RPIENhbiB3ZSBvcHRpbWl6ZSB0aGlzIGFuZCBvdGhlciBpbnN0YW5jZXMgb2Ygc2FtZVxuXHRcdFx0XHRcdGZyb21BdHRyID0gZGVmYXVsdEF0dHIoc291cmNlKTtcblx0XHRcdFx0XHRzZXR0ZXIgPSBmblNldHRlcnNbZnJvbUF0dHJdO1xuXHRcdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9ICRpc0Z1bmN0aW9uKGZyb21BdHRyKVxuXHRcdFx0XHRcdFx0XHQ/IGZyb21BdHRyKHNvdXJjZSlcblx0XHRcdFx0XHRcdFx0OiBzZXR0ZXJcblx0XHRcdFx0XHRcdFx0XHQ/ICRzb3VyY2Vbc2V0dGVyXSgpXG5cdFx0XHRcdFx0XHRcdFx0OiAkc291cmNlLmF0dHIoZnJvbUF0dHIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjbnZ0TmFtZSA9IHRvWzFdO1xuXHRcdFx0XHRcdHRvID0gdG9bMF07IC8vIFtvYmplY3QsIHBhdGhdXG5cdFx0XHRcdFx0dG8gPSB0byArIFwiXCIgPT09IHRvID8gW2xpbmtDdHguZGF0YSwgdG9dIDogdG87XG5cdFx0XHRcdFx0aWYgKGNudnROYW1lKSB7XG5cdFx0XHRcdFx0XHRpZiAoJGlzRnVuY3Rpb24oY252dE5hbWUpKSB7XG5cdFx0XHRcdFx0XHRcdGN2dEJhY2sgPSBjbnZ0TmFtZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGN2dEJhY2sgPSB2aWV3LmdldFJzYyhcImNvbnZlcnRlcnNcIiwgY252dE5hbWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobGlua0N0eC5lbGVtLm5vZGVOYW1lID09PSBcIlNFTEVDVFwiKSB7XG5cdFx0XHRcdFx0XHRsaW5rQ3R4LmVsZW0uX2pzdlNlbCA9IHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWUgfHwgKGxpbmtDdHguZWxlbS5tdWx0aXBsZSA/IFtdIDogc291cmNlVmFsdWUpO1xuXHRcdFx0XHRcdFx0Ly8gZGF0YS1saW5rIDxzZWxlY3Q+IHRvIHN0cmluZyBvciAobXVsdGlzZWxlY3QpIGFycmF5IG9mIHN0cmluZ3Ncblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGN2dEJhY2spIHtcblx0XHRcdFx0XHRcdHNvdXJjZVZhbHVlID0gY3Z0QmFjay5jYWxsKHRhZywgc291cmNlVmFsdWUpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHRcdFx0XHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHg7XG5cdFx0XHRcdFx0dmlldy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdFx0XHRldmVudEFyZ3MgPSB7XG5cdFx0XHRcdFx0XHRjaGFuZ2U6IFwiY2hhbmdlXCIsXG5cdFx0XHRcdFx0XHRvbGRWYWx1ZTogbGlua0N0eC5fdmFsLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHNvdXJjZVZhbHVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRpZiAoKCFvbkJlZm9yZUNoYW5nZSB8fCAhKGNhbmNlbCA9IG9uQmVmb3JlQ2hhbmdlLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncykgPT09IGZhbHNlKSkgJiZcblx0XHRcdFx0XHRcdFx0KCF0YWcgfHwgIXRhZy5vbkJlZm9yZUNoYW5nZSB8fCAhKGNhbmNlbCA9IHRhZy5vbkJlZm9yZUNoYW5nZShldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKSAmJlxuXHRcdFx0XHRcdFx0XHRzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0YXJnZXQgPSB0b1swXTsgLy8gW29iamVjdCwgcGF0aF1cblx0XHRcdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCkge1xuXHRcdFx0XHRcdFx0XHRpZiAodGFyZ2V0Ll9qc3YpIHtcblx0XHRcdFx0XHRcdFx0XHRleHByT2IgPSB0YXJnZXQ7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gbGlua0N0eC5kYXRhO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlIChleHByT2IgJiYgZXhwck9iLnNiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YXJnZXQgPSBsaW5rQ3R4Ll9jdHhDYihleHByT2IsIHRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRleHByT2IgPSBleHByT2Iuc2I7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0XHRcdFx0XHR0YWcuXy5jaGdpbmcgPSB0cnVlOyAvLyBtYXJrZXIgdG8gcHJldmVudCB0YWcgY2hhbmdlIGV2ZW50IHRyaWdnZXJpbmcgaXRzIG93biByZWZyZXNoXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5zZXRQcm9wZXJ0eSh0b1sxXSwgc291cmNlVmFsdWUpOyAvLyAyd2F5IGJpbmRpbmcgY2hhbmdlIGV2ZW50IC0gb2JzZXJ2YWJseSB1cGRhdGluZyBib3VuZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0aWYgKG9uQWZ0ZXJDaGFuZ2UpIHtcblx0XHRcdFx0XHRcdFx0XHRvbkFmdGVyQ2hhbmdlLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0YWcub25BZnRlckNoYW5nZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGFnLm9uQWZ0ZXJDaGFuZ2UoZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRhZy5fLmNoZ2luZyA9IHVuZGVmaW5lZDsgLy8gY2xlYXIgdGhlIG1hcmtlclxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGxpbmtDdHguX3ZhbCA9IHNvdXJjZVZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2aWV3LmxpbmtDdHggPSBvbGRMaW5rQ3R4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q2hhbmdlSGFuZGxlcihldiwgZXZlbnRBcmdzLCBsaW5rRm4pIHtcblx0dmFyIGF0dHIsIHNvdXJjZVZhbHVlLCBub1VwZGF0ZSwgZm9yY2VVcGRhdGUsIGhhc0Vycm9yLCBvbkVycm9yLFxuXHRcdGxpbmtDdHggPSB0aGlzLFxuXHRcdHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdHNvdXJjZSA9IGxpbmtDdHguZGF0YSxcblx0XHR0YXJnZXQgPSBsaW5rQ3R4LmVsZW0sXG5cdFx0Y3Z0ID0gbGlua0N0eC5jb252ZXJ0LFxuXHRcdHBhcmVudEVsZW0gPSB0YXJnZXQucGFyZW50Tm9kZSxcblx0XHR2aWV3ID0gbGlua0N0eC52aWV3LFxuXHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHgsXG5cdFx0b25FdmVudCA9IHZpZXcuaGxwKG9uQmVmb3JlQ2hhbmdlU3RyKTtcblxuXHQvLyBTZXQgbGlua0N0eCBvbiB2aWV3LCBkeW5hbWljYWxseSwganVzdCBkdXJpbmcgdGhpcyBoYW5kbGVyIGNhbGxcblx0dmlldy5saW5rQ3R4ID0gbGlua0N0eDtcblxuXHRpZiAocGFyZW50RWxlbSAmJiAoIW9uRXZlbnQgfHwgIShldmVudEFyZ3MgJiYgb25FdmVudC5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpID09PSBmYWxzZSkpXG5cdFx0XHQvLyBJZiBkYXRhIGNoYW5nZWQsIHRoZSBldi5kYXRhIGlzIHNldCB0byBiZSB0aGUgcGF0aC4gVXNlIHRoYXQgdG8gZmlsdGVyIHRoZSBoYW5kbGVyIGFjdGlvbi4uLlxuXHRcdFx0JiYgIShldmVudEFyZ3MgJiYgZXYuZGF0YS5wcm9wICE9PSBcIipcIiAmJiBldi5kYXRhLnByb3AgIT09IGV2ZW50QXJncy5wYXRoKSkge1xuXG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0bGlua0N0eC5ldmVudEFyZ3MgPSBldmVudEFyZ3M7XG5cdFx0fVxuXHRcdGlmIChldmVudEFyZ3MgfHwgbGlua0N0eC5fdG9Maykge1xuXHRcdFx0Ly8gSWYgZXZlbnRBcmdzIGFyZSBkZWZpbmVkLCB0aGlzIGlzIGEgZGF0YSB1cGRhdGVcblx0XHRcdC8vIE90aGVyd2lzZSB0aGlzIGlzIHRoZSBpbml0aWFsIGRhdGEtbGluayByZW5kZXJpbmcgY2FsbC4gQmluZCBvbiB0aGlzIHRoZSBmaXJzdCB0aW1lIGl0IGdldCBjYWxsZWRcblx0XHRcdGxpbmtDdHguX3RvTGsgPSAwOyAvLyBSZW1vdmUgZmxhZyB0byBza2lwIHVubmVjY2Vzc2FyeSByZWJpbmRpbmcgbmV4dCB0aW1lXG5cdFx0XHRpZiAobGlua0ZuLl9lcikge1xuXHRcdFx0XHQvLyBkYXRhLWxpbms9XCJleHByVXNpbmdUYWdPckN2dCB3aXRoIG9uZXJyb3I9Li4uXCIgLSBlLmcuIHt0YWcgLi4uIHtjdnQ6Li4uIHs6Li4uIGNvbnZlcnQ9J2N2dCdcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGxpbmtGbihzb3VyY2UsIHZpZXcpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0aGFzRXJyb3IgPSBsaW5rRm4uX2VyO1xuXHRcdFx0XHRcdG9uRXJyb3IgPSBvblJlbmRlckVycm9yKGUsdmlldywobmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3XCIsIFwicmV0dXJuIFwiICsgaGFzRXJyb3IgKyBcIjtcIikpKHNvdXJjZSwgdmlldykpO1xuXHRcdFx0XHRcdHNvdXJjZVZhbHVlID0gW3twcm9wczoge30sIGFyZ3M6IFtvbkVycm9yXX1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGxpbmtGbihzb3VyY2UsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQ29tcGlsZWQgbGluayBleHByZXNzaW9uIGZvciBsaW5rVGFnOiByZXR1cm4gdmFsdWUgZm9yIGRhdGEtbGluaz1cIns6eHh4fVwiIHdpdGggbm8gY3Z0IG9yIGN2dEJrLCBvdGhlcndpc2UgdGFnQ3R4IG9yIHRhZ0N0eHNcblxuXHRcdFx0YXR0ciA9IGdldFRhcmdldFZhbChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgdGFnID0gbGlua0N0eC50YWcsXG5cdFx0XHRcdFx0bGlua0N0eC5hdHRyIHx8IGRlZmF1bHRBdHRyKHRhcmdldCwgdHJ1ZSwgY3Z0ICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdCk7XG5cblx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0Ly8gRXhpc3RpbmcgdGFnIGluc3RhbmNlXG5cdFx0XHRcdGZvcmNlVXBkYXRlID0gaGFzRXJyb3IgfHwgdGFnLl9lcjtcblx0XHRcdFx0Ly8gSWYgdGhlIG5ldyB0YWdDdHhzIGhhc0Vycm9yIG9yIHRoZSBwcmV2aW91cyB0YWdDdHhzIGhhZCBlcnJvciwgdGhlbiBmb3JjZSB1cGRhdGVcblx0XHRcdFx0c291cmNlVmFsdWUgPSBzb3VyY2VWYWx1ZVswXSA/IHNvdXJjZVZhbHVlIDogW3NvdXJjZVZhbHVlXTtcblx0XHRcdFx0bm9VcGRhdGUgPSAhZm9yY2VVcGRhdGUgJiYgZXZlbnRBcmdzICYmIHRhZy5vblVwZGF0ZSAmJiB0YWcub25VcGRhdGUoZXYsIGV2ZW50QXJncywgc291cmNlVmFsdWUpID09PSBmYWxzZTtcblxuXHRcdFx0XHRtZXJnZUN0eHModGFnLCBzb3VyY2VWYWx1ZSwgZm9yY2VVcGRhdGUpO1xuXG5cdFx0XHRcdGlmIChub1VwZGF0ZSB8fCBhdHRyID09PSBOT05FKSB7XG5cdFx0XHRcdFx0Ly8gb25VcGRhdGUgcmV0dXJuZWQgZmFsc2UsIG9yIGF0dHIgPT09IFwibm9uZVwiLCBvciB0aGlzIGlzIGFuIHVwZGF0ZSBjb21pbmcgZnJvbSB0aGUgdGFnJ3Mgb3duIGNoYW5nZSBldmVudFxuXHRcdFx0XHRcdC8vIC0gc28gZG9uJ3QgcmVmcmVzaCB0aGUgdGFnOiB3ZSBqdXN0IHVzZSB0aGUgbmV3IHRhZ0N0eHMgbWVyZ2VkIGZyb20gdGhlIHNvdXJjZVZhbHVlLFxuXHRcdFx0XHRcdC8vICh3aGljaCBtYXkgb3B0aW9uYWxseSBoYXZlIGJlZW4gbW9kaWZlZCBpbiBvblVwZGF0ZSgpLi4uKSBhbmQgdGhlbiBiaW5kLCBhbmQgd2UgYXJlIGRvbmVcblx0XHRcdFx0XHRjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0b2JzZXJ2ZUFuZEJpbmQobGlua0N0eCwgc291cmNlLCB0YXJnZXQpO1xuXHRcdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0YWcuXy5jaGdpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c291cmNlVmFsdWUgPSB0YWcudGFnTmFtZSA9PT0gXCI6XCIgLy8gQ2FsbCBjb252ZXJ0VmFsIGlmIGl0IGlzIGEge3tjdnQ6Li4ufX0gLSBvdGhlcndpc2UgY2FsbCByZW5kZXJUYWdcblx0XHRcdFx0XHQ/ICRzdWIuX2NudnQodGFnLmN2dCwgdmlldywgc291cmNlVmFsdWVbMF0pXG5cdFx0XHRcdFx0OiAkc3ViLl90YWcodGFnLCB2aWV3LCB2aWV3LnRtcGwsIHNvdXJjZVZhbHVlLCB0cnVlLCBvbkVycm9yKTtcblx0XHRcdH0gZWxzZSBpZiAobGlua0ZuLl90YWcpIHtcblx0XHRcdFx0Ly8gRm9yIHt7OiAuLi59fSB3aXRob3V0IGEgY29udmVydCBvciBjb252ZXJ0QmFjaywgd2UgYWxyZWFkeSBoYXZlIHRoZSBzb3VyY2VWYWx1ZSwgYW5kIHdlIGFyZSBkb25lXG5cdFx0XHRcdC8vIEZvciB7ezogLi4ufX0gd2l0aCBlaXRoZXIgY3Z0IG9yIGN2dEJhY2sgd2UgY2FsbCBjb252ZXJ0VmFsIHRvIGdldCB0aGUgc291cmNlVmFsdWUgYW5kIGluc3RhbnRpYXRlIHRoZSB0YWdcblx0XHRcdFx0Ly8gSWYgY3Z0IGlzIHVuZGVmaW5lZCB0aGVuIHRoaXMgaXMgYSB0YWcsIGFuZCB3ZSBjYWxsIHJlbmRlclRhZyB0byBnZXQgdGhlIHJlbmRlcmVkIGNvbnRlbnQgYW5kIGluc3RhbnRpYXRlIHRoZSB0YWdcblx0XHRcdFx0Y3Z0ID0gY3Z0ID09PSBcIlwiID8gVFJVRSA6IGN2dDsgLy8gSWYgdGhlcmUgaXMgYSBjdnRCYWNrIGJ1dCBubyBjdnQsIHNldCBjdnQgdG8gXCJ0cnVlXCJcblx0XHRcdFx0c291cmNlVmFsdWUgPSBjdnQgLy8gQ2FsbCBjb252ZXJ0VmFsIGlmIGl0IGlzIGEge3tjdnQ6Li4ufX0gLSBvdGhlcndpc2UgY2FsbCByZW5kZXJUYWdcblx0XHRcdFx0XHQ/ICRzdWIuX2NudnQoY3Z0LCB2aWV3LCBzb3VyY2VWYWx1ZVswXSB8fCBzb3VyY2VWYWx1ZSkgLy8gY29udmVydFZhbFxuXHRcdFx0XHRcdDogJHN1Yi5fdGFnKGxpbmtGbi5fdGFnLCB2aWV3LCB2aWV3LnRtcGwsIHNvdXJjZVZhbHVlLCB0cnVlLCBvbkVycm9yKTsgLy8gcmVuZGVyVGFnXG5cblx0XHRcdFx0YWRkTGlua01ldGhvZHModGFnID0gbGlua0N0eC50YWcsIHRydWUpOyAvLyBJbiBib3RoIGNvbnZlcnRWYWwgYW5kIHJlbmRlclRhZyB3ZSBoYXZlIGluc3RhbnRpYXRlZCBhIHRhZ1xuXHRcdFx0XHRhdHRyID0gbGlua0N0eC5hdHRyIHx8IGF0dHI7IC8vIGxpbmtDdHguYXR0ciBtYXkgaGF2ZSBiZWVuIHNldCB0byB0YWcuYXR0ciBkdXJpbmcgdGFnIGluc3RhbnRpYXRpb24gaW4gcmVuZGVyVGFnXG5cdFx0XHR9XG5cblx0XHRcdGlmICh1cGRhdGVDb250ZW50KHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCBhdHRyLCB0YWcpXG5cdFx0XHRcdFx0JiYgZXZlbnRBcmdzXG5cdFx0XHRcdFx0JiYgKG9uRXZlbnQgPSB2aWV3LmhscChvbkFmdGVyQ2hhbmdlU3RyKSkpIHtcblx0XHRcdFx0b25FdmVudC5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eC5fbm9VcGQgPSAwOyAvLyBGb3IgZGF0YS1saW5rPVwiXnsuLi59XCIgcmVtb3ZlIF9ub1VwZCBmbGFnIHNvIHVwZGF0ZXMgb24gc3Vic2VxdWVudCBjYWxsc1xuXG5cdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdHRhZy5fZXIgPSBoYXNFcnJvcjtcblx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KTtcblxuXHRcdC8vIFJlbW92ZSBkeW5hbWljYWxseSBhZGRlZCBsaW5rQ3R4IGZyb20gdmlld1xuXHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0VmFsKHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCB0YWcsIGF0dHIpIHtcblx0dmFyIGN1cnJlbnRWYWx1ZSwgc2V0dGVyLCBjc3MsICR0YXJnZXQsXG5cdFx0dGFyZ2V0ID0gdGFnICYmIHRhZy5wYXJlbnRFbGVtIHx8IGxpbmtDdHguZWxlbTtcblxuXHRpZiAoc291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdCR0YXJnZXQgPSAkKHRhcmdldCk7XG5cdFx0YXR0ciA9IHRhZyAmJiB0YWcuYXR0ciB8fCBhdHRyO1xuXHRcdGlmICgkaXNGdW5jdGlvbihzb3VyY2VWYWx1ZSkpIHtcblx0XHRcdGVycm9yKGxpbmtDdHguZXhwciArIFwiOiBtaXNzaW5nIHBhcmVuc1wiKTtcblx0XHR9XG5cblx0XHRpZiAoY3NzID0gL15jc3MtLy50ZXN0KGF0dHIpICYmIGF0dHIuc2xpY2UoNCkpIHtcblx0XHRcdGN1cnJlbnRWYWx1ZSA9ICQuc3R5bGUodGFyZ2V0LCBjc3MpO1xuXHRcdFx0aWYgKCtzb3VyY2VWYWx1ZSA9PT0gc291cmNlVmFsdWUpIHtcblx0XHRcdFx0Ly8gT3B0aW1pemF0aW9uIGZvciBwZXJmIG9uIGludGVnZXIgdmFsdWVzIC0gZS5nLiBjc3Mtd2lkdGh7OndpZHRoKydweCd9XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHBhcnNlSW50KGN1cnJlbnRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChhdHRyICE9PSBcImxpbmtcIikgeyAvLyBhdHRyID09PSBcImxpbmtcIiBpcyBmb3IgdGFnIGNvbnRyb2xzIHdoaWNoIGRvIGRhdGEgYmluZGluZyBidXQgaGF2ZSBubyByZW5kZXJlZCBvdXRwdXQgb3IgdGFyZ2V0XG5cdFx0XHRpZiAoYXR0ciA9PT0gXCJ2YWx1ZVwiKSB7XG5cdFx0XHRcdGlmICh0YXJnZXQudHlwZSA9PT0gQ0hFQ0tCT1gpIHtcblx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSAkdGFyZ2V0LnByb3AoYXR0ciA9IENIRUNLRUQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFJBRElPKSB7XG5cdFx0XHRcdGlmICh0YXJnZXQudmFsdWUgPT09IChcIlwiICsgc291cmNlVmFsdWUpKSB7XG5cdFx0XHRcdFx0Y3VycmVudFZhbHVlID0gJHRhcmdldC5wcm9wKENIRUNLRUQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBhdHRyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRzZXR0ZXIgPSBmblNldHRlcnNbYXR0cl07XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHNldHRlciA/ICR0YXJnZXRbc2V0dGVyXSgpIDogJHRhcmdldC5hdHRyKGF0dHIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsaW5rQ3R4Ll92YWwgPSBjdXJyZW50VmFsdWU7XG5cdH1cblx0cmV0dXJuIGF0dHI7XG59XG5cbmZ1bmN0aW9uIHNldERlZmVyKGVsZW0sIHZhbHVlKSB7XG5cdGVsZW0uX2RmID0gdmFsdWU7IC8vIFVzZSBib3RoIGFuIGV4cGFuZG8gYW5kIGFuIGF0dHJpYnV0ZSB0byB0cmFjayBkZWZlcmVkIHRva2Vucy4gQXR0cmlidXRlIGlzIG5lZWRlZCBmb3IgcXVlcnlTZWxlY3RvckFsbCBmb3IgZ2V0Vmlld0luZm9zIChjaGlsZFRhZ3MpXG5cdGVsZW1bKHZhbHVlID8gXCJzZXRcIiA6IFwicmVtb3ZlXCIpICsgXCJBdHRyaWJ1dGVcIl0oZGVmZXJBdHRyLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29udGVudChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgYXR0ciwgdGFnKSB7XG5cdC8vIFdoZW4gY2FsbGVkIGZvciBhIHRhZywgZWl0aGVyIGluIHRhZy5yZWZyZXNoKCkgb3IgcHJvcGVydHlDaGFuZ2VIYW5kbGVyKCksIHJldHVybnMgYSBwcm9taXNlIChhbmQgc3VwcG9ydHMgYXN5bmMpXG5cdC8vIFdoZW4gY2FsbGVkIChpbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIpIGZvciB0YXJnZXQgSFRNTCByZXR1cm5zIHRydWVcblx0Ly8gV2hlbiBjYWxsZWQgKGluIHByb3BlcnR5Q2hhbmdlSGFuZGxlcikgZm9yIG90aGVyIHRhcmdldHMgcmV0dXJucyBib29sZWFuIGZvciBcImNoYW5nZWRcIlxuXHR2YXIgc2V0dGVyLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHByb21pc2UsIG5vZGVzVG9SZW1vdmUsIHVzZVByb3AsIHRva2VucywgaWQsIG9wZW5JbmRleCwgY2xvc2VJbmRleCwgdGVzdEVsZW0sIG5vZGVOYW1lLCBjU3R5bGUsIGpzdlNlbCxcblx0XHRyZW5kZXJzID0gYXR0ciAhPT0gTk9ORSAmJiBzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFsaW5rQ3R4Ll9ub1VwZCwgLy8gRm9yIGRhdGEtbGluaz1cIl57Li4ufVwiLCBkb24ndCB1cGRhdGUgdGhlIGZpcnN0IHRpbWUgKG5vIGluaXRpYWwgcmVuZGVyKSAtIGUuZy4gdG8gbGVhdmUgc2VydmVyIHJlbmRlcmVkIHZhbHVlcy5cblx0XHRzb3VyY2UgPSBsaW5rQ3R4LmRhdGEsXG5cdFx0dGFyZ2V0ID0gdGFnICYmIHRhZy5wYXJlbnRFbGVtIHx8IGxpbmtDdHguZWxlbSxcblx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZSxcblx0XHQkdGFyZ2V0ID0gJCh0YXJnZXQpLFxuXHRcdHZpZXcgPSBsaW5rQ3R4LnZpZXcsXG5cdFx0dGFyZ2V0VmFsID0gbGlua0N0eC5fdmFsLFxuXHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHgsXG5cdFx0Ly8gSWYgbm90IGEgdGFnIHdlIGNhbiB1c2UgdGhlIC5fdmFsIG9idGFpbmVkIGZyb20gZ2V0VGFyZ2V0VmFsKClcblx0XHQvLyBhbmQgb25seSB1cGRhdGUgd2hlbiB0aGUgbmV3IHZhbHVlIChzb3VyY2VWYWx1ZSkgaGFzIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgb25lXG5cdFx0Y2hhbmdlID0gdGFnO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBJbml0aWFsaXplIHRoZSB0YWcgd2l0aCBlbGVtZW50IHJlZmVyZW5jZXNcblx0XHR0YWcuXy51bmxpbmtlZCA9IHRydWU7IC8vIFNldCB0byB1bmxpbmtlZCwgc28gaW5pdGlhbGl6YXRpb24gaXMgdHJpZ2dlcmVkIGFmdGVyIHJlLXJlbmRlcmluZywgZS5nLiBmb3Igc2V0dGluZyBsaW5rZWRFbGVtLCBhbmQgY2FsbGluZyBvbkJpbmRcblx0XHR0YWcucGFyZW50RWxlbSA9IHRhZy5wYXJlbnRFbGVtIHx8IChsaW5rQ3R4LmV4cHIgfHwgdGFnLl9lbENudCkgPyB0YXJnZXQgOiB0YXJnZXRQYXJlbnQ7XG5cdFx0cHJldk5vZGUgPSB0YWcuX3Bydjtcblx0XHRuZXh0Tm9kZSA9IHRhZy5fbnh0O1xuXHR9XG5cdGlmICghcmVuZGVycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmIChhdHRyID09PSBcInZpc2libGVcIikge1xuXHRcdGF0dHIgPSBcImNzcy1kaXNwbGF5XCI7XG5cdH1cblx0aWYgKC9eY3NzLS8udGVzdChhdHRyKSkge1xuXHRcdGlmIChsaW5rQ3R4LmF0dHIgPT09IFwidmlzaWJsZVwiKSB7XG5cdFx0XHQvLyBHZXQgdGhlIGN1cnJlbnQgZGlzcGxheSBzdHlsZVxuXHRcdFx0Y1N0eWxlID0gKHRhcmdldC5jdXJyZW50U3R5bGUgfHwgZ2V0Q29tcHV0ZWRTdHlsZS5jYWxsKGdsb2JhbCwgdGFyZ2V0LCBcIlwiKSkuZGlzcGxheTtcblxuXHRcdFx0aWYgKHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBzaG93aW5nIHRoZSBlbGVtZW50LlxuXHRcdFx0XHQvLyBHZXQgdGhlIGNhY2hlZCAndmlzaWJsZScgZGlzcGxheSB2YWx1ZSBmcm9tIHRoZSAtanN2ZCBleHBhbmRvXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gdGFyZ2V0Ll9qc3ZkXG5cdFx0XHRcdFx0Ly8gT3IsIGlmIG5vdCB5ZXQgY2FjaGVkLCBnZXQgdGhlIGN1cnJlbnQgZGlzcGxheSB2YWx1ZVxuXHRcdFx0XHRcdHx8IGNTdHlsZTtcblx0XHRcdFx0aWYgKHNvdXJjZVZhbHVlID09PSBOT05FICYmICEoc291cmNlVmFsdWUgPSBkaXNwbGF5U3R5bGVzW25vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lXSkpIHtcblx0XHRcdFx0XHQvLyBDdXJyZW50bHkgZGlzcGxheSB2YWx1ZSBpcyAnbm9uZScsIGFuZCB0aGUgJ3Zpc2libGUnIHN0eWxlIGhhcyBub3QgYmVlbiBjYWNoZWQuXG5cdFx0XHRcdFx0Ly8gV2UgY3JlYXRlIGFuIGVsZW1lbnQgdG8gZmluZCB0aGUgY29ycmVjdCAndmlzaWJsZScgZGlzcGxheSBzdHlsZSBmb3IgdGhpcyBub2RlTmFtZVxuXHRcdFx0XHRcdHRlc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXN0RWxlbSk7XG5cblx0XHRcdFx0XHQvLyBHZXQgdGhlIGRlZmF1bHQgc3R5bGUgZm9yIHRoaXMgSFRNTCB0YWcgdG8gdXNlIGFzICd2aXNpYmxlJyBzdHlsZVxuXHRcdFx0XHRcdHNvdXJjZVZhbHVlXG5cdFx0XHRcdFx0XHQvLyBhbmQgY2FjaGUgaXQgYXMgYSBoYXNoIGFnYWluc3Qgbm9kZU5hbWVcblx0XHRcdFx0XHRcdD0gZGlzcGxheVN0eWxlc1tub2RlTmFtZV1cblx0XHRcdFx0XHRcdD0gKHRlc3RFbGVtLmN1cnJlbnRTdHlsZSB8fCBnZXRDb21wdXRlZFN0eWxlLmNhbGwoZ2xvYmFsLCB0ZXN0RWxlbSwgXCJcIikpLmRpc3BsYXk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXN0RWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBoaWRpbmcgdGhlIGVsZW1lbnQuXG5cdFx0XHRcdC8vIENhY2hlIHRoZSBjdXJyZW50IGRpc3BsYXkgdmFsdWUgYXMgJ3Zpc2libGUnIHN0eWxlLCBvbiBfanN2ZCBleHBhbmRvLCBmb3Igd2hlbiB3ZSBzaG93IHRoZSBlbGVtZW50IGFnYWluXG5cdFx0XHRcdHRhcmdldC5fanN2ZCA9IGNTdHlsZTtcblx0XHRcdFx0c291cmNlVmFsdWUgPSBOT05FOyAvLyBIaWRlIHRoZSBlbGVtZW50XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjaGFuZ2UgPSBjaGFuZ2UgfHwgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0JC5zdHlsZSh0YXJnZXQsIGF0dHIuc2xpY2UoNCksIHNvdXJjZVZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoYXR0ciAhPT0gXCJsaW5rXCIpIHsgLy8gYXR0ciA9PT0gXCJsaW5rXCIgaXMgZm9yIHRhZyBjb250cm9scyB3aGljaCBkbyBkYXRhIGJpbmRpbmcgYnV0IGhhdmUgbm8gcmVuZGVyZWQgb3V0cHV0IG9yIHRhcmdldFxuXHRcdGlmICgvXmRhdGEtLy50ZXN0KGF0dHIpKSB7XG5cdFx0XHQkLmRhdGEodGFyZ2V0LCBhdHRyLnNsaWNlKDUpLCBzb3VyY2VWYWx1ZSk7IC8vIFN1cHBvcnQgZm9yIGJpbmRpbmcgdG8gZGF0YSBhdHRyaWJ1dGVzOiBkYXRhLWZvb3s6ZXhwcn06IGRhdGEtZm9vIGF0dHJpYnV0ZSB3aWxsIGJlXG5cdFx0XHQvLyBleHByLnRvU3RyaW5nKCksIGJ1dCAkLmRhdGEoZWxlbWVudCwgXCJmb29cIikgYW5kICQoZWxlbWVudCkuZGF0YShcImZvb1wiKSB3aWxsIGFjdHVhbGx5IHJldHVybiB2YWx1ZSBvZiBleHByLCBldmVuIGlmIG9mIHR5cGUgb2JqZWN0XG5cdFx0fVxuXHRcdGlmIChhdHRyID09PSBDSEVDS0VEKSB7XG5cdFx0XHR1c2VQcm9wID0gdHJ1ZTtcblx0XHRcdHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWUgJiYgc291cmNlVmFsdWUgIT09IFwiZmFsc2VcIjtcblx0XHRcdC8vIFRoZSBzdHJpbmcgdmFsdWUgXCJmYWxzZVwiIGNhbiBvY2N1ciB3aXRoIGRhdGEtbGluaz1cImNoZWNrZWR7YXR0cjpleHByfVwiIC0gYXMgYSByZXN1bHQgb2YgYXR0ciwgYW5kIGhlbmNlIHVzaW5nIGNvbnZlcnRWYWwoKVxuXHRcdFx0Ly8gV2Ugd2lsbCBzZXQgdGhlIFwiY2hlY2tlZFwiIHByb3BlcnR5XG5cdFx0XHQvLyBXZSB3aWxsIGNvbXBhcmUgdGhpcyB3aXRoIHRoZSBjdXJyZW50IHZhbHVlXG5cdFx0fSBlbHNlIGlmIChhdHRyID09PSBSQURJTykge1xuXHRcdFx0Ly8gVGhpcyBpcyBhIHNwZWNpYWwgYmluZGluZyBhdHRyaWJ1dGUgZm9yIHJhZGlvIGJ1dHRvbnMsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBkZWZhdWx0ICd0bycgYmluZGluZy5cblx0XHRcdC8vIFRoaXMgYWxsb3dzIGJpbmRpbmcgYm90aCB0byB2YWx1ZSAoZm9yIGVhY2ggaW5wdXQpIGFuZCB0byB0aGUgZGVmYXVsdCBjaGVja2VkIHJhZGlvIGJ1dHRvbiAoZm9yIGVhY2ggaW5wdXQgaW4gbmFtZWQgZ3JvdXAsXG5cdFx0XHQvLyBlLmcuIGJpbmRpbmcgdG8gcGFyZW50IGRhdGEpLlxuXHRcdFx0Ly8gUGxhY2UgdmFsdWUgYmluZGluZyBmaXJzdDogPGlucHV0IHR5cGU9XCJyYWRpb1wiIGRhdGEtbGluaz1cInZhbHVlezpuYW1lfSB7OiNnZXQoJ2RhdGEnKS5kYXRhLmN1cnJlbmN5On0gXCIgLi4uLz5cblx0XHRcdC8vIG9yIChhbGxvd2luZyBhbnkgb3JkZXIgZm9yIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zKTpcblx0XHRcdC8vIDxpbnB1dCB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cInt7Om5hbWV9fVwiIGRhdGEtbGluaz1cIns6I2dldCgnZGF0YScpLmRhdGEuY3VycmVuY3k6fSB2YWx1ZV57Om5hbWV9XCIgLi4uLz5cblx0XHRcdHVzZVByb3AgPSB0cnVlO1xuXHRcdFx0YXR0ciA9IENIRUNLRUQ7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IHRhcmdldC52YWx1ZSA9PT0gKFwiXCIgKyBzb3VyY2VWYWx1ZSk7XG5cdFx0XHQvLyBJZiB0aGUgZGF0YSB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIHRoaXMgcmFkaW8gYnV0dG9uIGlucHV0LCBzZXQgdGhlIGNoZWNrZWQgcHJvcGVydHkgdG8gdHJ1ZVxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHNldCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSB0byBmYWxzZVxuXHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gXCJzZWxlY3RlZFwiIHx8IGF0dHIgPT09IFwiZGlzYWJsZWRcIiB8fCBhdHRyID09PSBcIm11bHRpcGxlXCIgfHwgYXR0ciA9PT0gXCJyZWFkb25seVwiKSB7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IChzb3VyY2VWYWx1ZSAmJiBzb3VyY2VWYWx1ZSAhPT0gXCJmYWxzZVwiKSA/IGF0dHIgOiBudWxsO1xuXHRcdFx0Ly8gVXNlIGF0dHIsIG5vdCBwcm9wLCBzbyB3aGVuIHRoZSBvcHRpb25zIChmb3IgZXhhbXBsZSkgYXJlIGNoYW5nZWQgZHluYW1pY2FsbHksIGJ1dCBpbmNsdWRlIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHZhbHVlLFxuXHRcdFx0Ly8gdGhleSB3aWxsIHN0aWxsIGJlIHNlbGVjdGVkIGFmdGVyIHRoZSBjaGFuZ2Vcblx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFwidmFsdWVcIiAmJiB0YXJnZXQubm9kZU5hbWUgPT09IFwiU0VMRUNUXCIpIHtcblx0XHRcdHRhcmdldC5fanN2U2VsID0gJGlzQXJyYXkoc291cmNlVmFsdWUpXG5cdFx0XHRcdD8gc291cmNlVmFsdWVcblx0XHRcdFx0OiBcIlwiICsgc291cmNlVmFsdWU7IC8vIElmIG5vdCBhcnJheSwgY29lcmNlIHRvIHN0cmluZ1xuXHRcdH1cblxuXHRcdGlmIChzZXR0ZXIgPSBmblNldHRlcnNbYXR0cl0pIHtcblx0XHRcdGlmIChhdHRyID09PSBIVE1MKSB7XG5cdFx0XHRcdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0XHRpZiAodGFnICYmIHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHRcdG5vZGVzVG9SZW1vdmUgPSB0YWcubm9kZXModHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHRhZy5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZSAhPT0gbmV4dE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBwcmV2Tm9kZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB0cmFuc2ZlciB0aGUgdmlldyB0b2tlbnMgb24gcHJldk5vZGUgdG8gbmV4dE5vZGUgb2YgdGhpcyAndmlld1RvUmVmcmVzaCdcblx0XHRcdFx0XHRcdFx0dHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgdGFyZ2V0LCB0YWcuX3RnSWQsIFwiXlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodG9rZW5zID0gdGFyZ2V0Ll9kZikgeyAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIG5leHROb2RlLCBhbmQgc28gdGhlIHRhcmdldC5fZGYgbWF5IGluY2x1ZGUgdG9rZW5zIHJlZmVyZW5jaW5nXG5cdFx0XHRcdFx0XHRcdC8vIHZpZXcgYW5kIHRhZyBiaW5kaW5ncyBjb250YWluZWQgd2l0aGluIHRoZSBvcGVuIGFuZCBjbG9zZSB0b2tlbnMgb2YgdGhlIHVwZGF0ZWQgdGFnIGNvbnRyb2wuIFRoZXkgbmVlZCB0byBiZSBwcm9jZXNzZWQgKGRpc3Bvc2VkKVxuXHRcdFx0XHRcdFx0XHRpZCA9IHRhZy5fdGdJZCArIFwiXlwiO1xuXHRcdFx0XHRcdFx0XHRvcGVuSW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIiNcIiArIGlkKSArIDE7XG5cdFx0XHRcdFx0XHRcdGNsb3NlSW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIi9cIiArIGlkKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAob3BlbkluZGV4ICYmIGNsb3NlSW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0b3BlbkluZGV4ICs9IGlkLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2xvc2VJbmRleCA+IG9wZW5JbmRleCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0LCB0b2tlbnMuc2xpY2UoMCwgb3BlbkluZGV4KSArIHRva2Vucy5zbGljZShjbG9zZUluZGV4KSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRkaXNwb3NlVG9rZW5zKHRva2Vucy5zbGljZShvcGVuSW5kZXgsIGNsb3NlSW5kZXgpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVcblx0XHRcdFx0XHRcdFx0PyBwcmV2Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHRcdFx0OiBuZXh0Tm9kZVxuXHRcdFx0XHRcdFx0XHRcdD8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdFx0XHRcdFx0OiB0YXJnZXQubGFzdENoaWxkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBSZW1vdmUgSFRNTCBub2Rlc1xuXHRcdFx0XHRcdCQobm9kZXNUb1JlbW92ZSkucmVtb3ZlKCk7IC8vIE5vdGUgaWYgIXRhZy5fZWxDbnQgcmVtb3ZpbmcgdGhlIG5vZGVzVG9SZW1vdmUgd2lsbCBwcm9jZXNzIGFuZCBkaXNwb3NlIHZpZXcgYW5kIHRhZyBiaW5kaW5ncyBjb250YWluZWQgd2l0aGluIHRoZSB1cGRhdGVkIHRhZyBjb250cm9sXG5cblx0XHRcdFx0XHQvLyBJbnNlcnQgYW5kIGxpbmsgbmV3IGNvbnRlbnRcblx0XHRcdFx0XHRwcm9taXNlID0gdmlldy5saW5rKHZpZXcuZGF0YSwgdGFyZ2V0LCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHNvdXJjZVZhbHVlLCB0YWcgJiYge3RhZzogdGFnLl90Z0lkLCBsYXp5TGluazogdGFnLnRhZ0N0eC5wcm9wcy5sYXp5TGlua30pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGRhdGEtbGlua2VkIHZhbHVlIHRhcmdldGluZyBpbm5lckhUTUw6IGRhdGEtbGluaz1cImh0bWx7OmV4cHJ9XCIgb3IgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXG5cdFx0XHRcdFx0cmVuZGVycyA9IHJlbmRlcnMgJiYgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRpZiAocmVuZGVycykge1xuXHRcdFx0XHRcdFx0JHRhcmdldC5lbXB0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocmVuZGVycykge1xuXHRcdFx0XHRcdFx0cHJvbWlzZSA9IHZpZXcubGluayhzb3VyY2UsIHRhcmdldCwgcHJldk5vZGUsIG5leHROb2RlLCBzb3VyY2VWYWx1ZSwgdGFnICYmIHt0YWc6IHRhZy5fdGdJZH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBSZW1vdmUgZHluYW1pY2FsbHkgYWRkZWQgbGlua0N0eCBhbmQgY3R4IGZyb20gdmlld1xuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBvbGRMaW5rQ3R4O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKGF0dHIgPT09IFwidGV4dFwiICYmIHRhcmdldC5jaGlsZHJlbiAmJiAhdGFyZ2V0LmNoaWxkcmVuWzBdKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGNvZGUgaXMgZmFzdGVyIHRoZW4gJHRhcmdldC50ZXh0KClcblx0XHRcdFx0XHRcdGlmICh0YXJnZXQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQudGV4dENvbnRlbnQgPSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldC5pbm5lclRleHQgPSBzb3VyY2VWYWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JHRhcmdldFtzZXR0ZXJdKHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKChqc3ZTZWwgPSB0YXJnZXRQYXJlbnQuX2pzdlNlbClcblx0XHRcdFx0XHQvLyBTZXR0aW5nIHZhbHVlIG9mIDxvcHRpb24+IGVsZW1lbnRcblx0XHRcdFx0XHQmJiAoYXR0ciA9PT0gXCJ2YWx1ZVwiIHx8ICEkdGFyZ2V0LmF0dHIoXCJ2YWx1ZVwiKSkpIHsgLy8gU2V0dGluZyB2YWx1ZSBhdHRyaWJ1dGUsIG9yIHNldHRpbmcgdGV4dENvbnRlbnQgaWYgYXR0cmlidXRlIGlzIG51bGxcblx0XHRcdFx0XHQvLyBTZXQvdW5zZWxlY3Qgc2VsZWN0aW9uIGJhc2VkIG9uIHZhbHVlIHNldCBvbiBwYXJlbnQgPHNlbGVjdD4uIFdvcmtzIGZvciBtdWx0aXNlbGVjdCB0b29cblx0XHRcdFx0XHR0YXJnZXQuc2VsZWN0ZWQgPSAkLmluQXJyYXkoXCJcIiArIHNvdXJjZVZhbHVlLCAkaXNBcnJheShqc3ZTZWwpID8ganN2U2VsIDogW2pzdlNlbF0pID4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHQvLyBTZXR0aW5nIGFuIGF0dHJpYnV0ZSB0byB1bmRlZmluZWQgc2hvdWxkIHJlbW92ZSB0aGUgYXR0cmlidXRlXG5cdFx0XHQkdGFyZ2V0W3VzZVByb3AgPyBcInByb3BcIiA6IFwiYXR0clwiXShhdHRyLCBzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICF1c2VQcm9wID8gbnVsbCA6IHNvdXJjZVZhbHVlKTtcblx0XHR9XG5cdFx0bGlua0N0eC5fdmFsID0gc291cmNlVmFsdWU7XG5cdH1cblx0cmV0dXJuIHByb21pc2UgfHwgY2hhbmdlO1xufVxuXG5mdW5jdGlvbiBhcnJheUNoYW5nZUhhbmRsZXIoZXYsIGV2ZW50QXJncykge1xuXHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0b25CZWZvcmVDaGFuZ2UgPSBzZWxmLmhscChvbkJlZm9yZUNoYW5nZVN0ciksXG5cdFx0b25BZnRlckNoYW5nZSA9IHNlbGYuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpO1xuXHRpZiAoIW9uQmVmb3JlQ2hhbmdlIHx8IG9uQmVmb3JlQ2hhbmdlLmNhbGwodGhpcywgZXYsIGV2ZW50QXJncykgIT09IGZhbHNlKSB7XG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0Ly8gVGhpcyBpcyBhbiBvYnNlcnZhYmxlIGFjdGlvbiAobm90IGEgdHJpZ2dlci9oYW5kbGVyIGNhbGwgZnJvbSBwdXNoVmFsdWVzLCBvciBzaW1pbGFyLCBmb3Igd2hpY2ggZXZlbnRBcmdzIHdpbGwgYmUgbnVsbClcblx0XHRcdHZhciBhY3Rpb24gPSBldmVudEFyZ3MuY2hhbmdlLFxuXHRcdFx0XHRpbmRleCA9IGV2ZW50QXJncy5pbmRleCxcblx0XHRcdFx0aXRlbXMgPSBldmVudEFyZ3MuaXRlbXM7XG5cdFx0XHRzZWxmLl8uc3J0ID0gZXZlbnRBcmdzLnJlZnJlc2g7IC8vIHRydWUgaWYgcGFydCBvZiBhICdzb3J0JyBvbiByZWZyZXNoXG5cdFx0XHRzd2l0Y2ggKGFjdGlvbikge1xuXHRcdFx0XHRjYXNlIFwiaW5zZXJ0XCI6XG5cdFx0XHRcdFx0c2VsZi5hZGRWaWV3cyhpbmRleCwgaXRlbXMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmVtb3ZlXCI6XG5cdFx0XHRcdFx0c2VsZi5yZW1vdmVWaWV3cyhpbmRleCwgaXRlbXMubGVuZ3RoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIm1vdmVcIjpcblx0XHRcdFx0XHRzZWxmLnJlbW92ZVZpZXdzKGV2ZW50QXJncy5vbGRJbmRleCwgaXRlbXMubGVuZ3RoLCB1bmRlZmluZWQsIHRydWUpOyAvLyByZW1vdmVcblx0XHRcdFx0XHRzZWxmLmFkZFZpZXdzKGluZGV4LCBpdGVtcyk7IC8vIHJlLWluc2VydFxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmVmcmVzaFwiOlxuXHRcdFx0XHRcdHNlbGYuXy5zcnQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0c2VsZi5maXhJbmRleCgwKTtcblx0XHRcdFx0XHQvLyBPdGhlciBjYXNlczogKGUuZy51bmRlZmluZWQsIGZvciBzZXRQcm9wZXJ0eSBvbiBvYnNlcnZhYmxlIG9iamVjdCkgZXRjLiBkbyBub3RoaW5nXG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvbkFmdGVyQ2hhbmdlKSB7XG5cdFx0XHRvbkFmdGVyQ2hhbmdlLmNhbGwodGhpcywgZXYsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFV0aWxpdGllcyBmb3IgZXZlbnQgaGFuZGxlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gc2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXcpIHtcblx0Ly8gQWRkL3JlbW92ZSBhcnJheUNoYW5nZSBoYW5kbGVyIG9uIHZpZXdcblx0dmFyIGhhbmRsZXIsIGFycmF5QmluZGluZyxcblx0XHR0eXBlID0gdmlldy50eXBlLCAvLyB1bmRlZmluZWQgaWYgdmlldyBpcyBiZWluZyByZW1vdmVkXG5cdFx0ZGF0YSA9IHZpZXcuZGF0YSxcblx0XHRib3VuZCA9IHZpZXcuXy5ibmQ7IC8vIHRydWUgZm9yIHRvcC1sZXZlbCBsaW5rKCkgb3IgZGF0YS1saW5rPVwie2Zvcn1cIiwgb3IgdGhlIGZvciB0YWcgaW5zdGFuY2UgZm9yIHtee2Zvcn19IChvciBmb3IgYW55IGN1c3RvbSB0YWcgdGhhdCBoYXMgYW4gb25BcnJheUNoYW5nZSBoYW5kbGVyKVxuXG5cdGlmICghdmlldy5fLnVzZUtleSAmJiBib3VuZCkge1xuXHRcdC8vIFRoaXMgaXMgYW4gYXJyYXkgdmlldy4gKHZpZXcuXy51c2VLZXkgbm90IGRlZmluZWQgPT4gZGF0YSBpcyBhcnJheSksIGFuZCBpcyBkYXRhLWJvdW5kIHRvIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50c1xuXG5cdFx0aWYgKGFycmF5QmluZGluZyA9IHZpZXcuXy5ibmRBcnIpIHtcblx0XHRcdC8vIEZpcnN0IHJlbW92ZSB0aGUgY3VycmVudCBoYW5kbGVyIGlmIHRoZXJlIGlzIG9uZVxuXHRcdFx0JChbYXJyYXlCaW5kaW5nWzFdXSkub2ZmKGFycmF5Q2hhbmdlU3RyLCBhcnJheUJpbmRpbmdbMF0pO1xuXHRcdFx0dmlldy5fLmJuZEFyciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKGJvdW5kICE9PSAhIWJvdW5kKSB7XG5cdFx0XHQvLyBib3VuZCBpcyBub3QgYSBib29sZWFuLCBzbyBpdCBpcyB0aGUgZGF0YS1saW5rZWQgdGFnIHRoYXQgJ293bnMnIHRoaXMgYXJyYXkgYmluZGluZyAtIGUuZy4ge157Zm9yLi4ufX1cblx0XHRcdGlmICh0eXBlKSB7XG5cdFx0XHRcdGJvdW5kLl8uYXJyVndzW3ZpZXcuXy5pZF0gPSB2aWV3O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIGJvdW5kLl8uYXJyVndzW3ZpZXcuXy5pZF07IC8vIGlmIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSAmJiBkYXRhKSB7XG5cdFx0XHQvLyBJZiB0aGlzIHZpZXcgaXMgbm90IGJlaW5nIHJlbW92ZWQsIGJ1dCB0aGUgZGF0YSBhcnJheSBoYXMgYmVlbiByZXBsYWNlZCwgdGhlbiBiaW5kIHRvIHRoZSBuZXcgZGF0YSBhcnJheVxuXHRcdFx0aGFuZGxlciA9IGZ1bmN0aW9uKGV2KSB7XG5cdFx0XHRcdGlmICghKGV2LmRhdGEgJiYgZXYuZGF0YS5vZmYpKSB7XG5cdFx0XHRcdFx0Ly8gU2tpcCBpZiAhIWV2LmRhdGEub2ZmOiAtIGEgaGFuZGxlciB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCAobWF5YmUgd2FzIG9uIGhhbmRsZXIgY29sbGVjdGlvbiBhdCBjYWxsIHRpbWUgLSB0aGVuIHJlbW92ZWQgYnkgYW5vdGhlciBoYW5kbGVyKVxuXHRcdFx0XHRcdC8vIElmIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIGRvIG5vdGhpbmcuIChDb3JyZXNwb25kcyB0byBjYXNlIHdoZXJlIHRoZXJlIGlzIGFub3RoZXIgaGFuZGxlciBvbiB0aGUgc2FtZSBkYXRhIHdob3NlXG5cdFx0XHRcdFx0Ly8gZWZmZWN0IHdhcyB0byByZW1vdmUgdGhpcyB2aWV3LCBhbmQgd2hpY2ggaGFwcGVuZWQgdG8gcHJlY2VkZSB0aGlzIGV2ZW50IGluIHRoZSB0cmlnZ2VyIHNlcXVlbmNlLiBTbyBhbHRob3VnaCB0aGlzXG5cdFx0XHRcdFx0Ly8gZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBub3csIGl0IGlzIHN0aWxsIGNhbGxlZCBzaW5jZSBhbHJlYWR5IG9uIHRoZSB0cmlnZ2VyIHNlcXVlbmNlKVxuXHRcdFx0XHRcdGFycmF5Q2hhbmdlSGFuZGxlci5hcHBseSh2aWV3LCBhcmd1bWVudHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0JChbZGF0YV0pLm9uKGFycmF5Q2hhbmdlU3RyLCBoYW5kbGVyKTtcblx0XHRcdHZpZXcuXy5ibmRBcnIgPSBbaGFuZGxlciwgZGF0YV07XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBdHRyKGVsZW0sIHRvLCBsaW5rR2V0VmFsKSB7XG5cdC8vIHRvOiB0cnVlIC0gZGVmYXVsdCBhdHRyaWJ1dGUgZm9yIHNldHRpbmcgZGF0YSB2YWx1ZSBvbiBIVE1MIGVsZW1lbnQ7IGZhbHNlOiBkZWZhdWx0IGF0dHJpYnV0ZSBmb3IgZ2V0dGluZyB2YWx1ZSBmcm9tIEhUTUwgZWxlbWVudFxuXHQvLyBNZXJnZSBpbiB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgYmluZGluZ3MgZm9yIHRoaXMgdGFyZ2V0IGVsZW1lbnRcblx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdGF0dHIgPVxuXHRcdFx0JHN1YlNldHRpbmdzQWR2YW5jZWQuX2ZlW25vZGVOYW1lXSAvLyBnZXQgZm9ybSBlbGVtZW50IGJpbmRpbmcgc2V0dGluZ3MgZm9yIGlucHV0IHRleHRhcmVhIHNlbGVjdCBvciBvcHRncm91cFxuXHRcdFx0fHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09IFRSVUUgJiYge3RvOiBIVE1MLCBmcm9tOiBIVE1MfTsgLy8gT3IgaWYgY29udGVudEVkaXRhYmxlIHNldCB0byBcInRydWVcIiBzZXQgYXR0ciB0byBcImh0bWxcIlxuXHRyZXR1cm4gYXR0clxuXHRcdD8gKHRvXG5cdFx0XHQ/ICgobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFJBRElPKSAvLyBGb3IgcmFkaW8gYnV0dG9ucywgYmluZCBmcm9tIHZhbHVlLCBidXQgYmluZCB0byAncmFkaW8nIC0gc3BlY2lhbCB2YWx1ZS5cblx0XHRcdFx0PyBSQURJT1xuXHRcdFx0XHQ6IGF0dHIudG8pXG5cdFx0XHQ6IGF0dHIuZnJvbSlcblx0XHQ6IHRvXG5cdFx0XHQ/IGxpbmtHZXRWYWwgPyBcInRleHRcIiA6IEhUTUwgLy8gRGVmYXVsdCBpbm5lclRleHQgZm9yIGRhdGEtbGluaz1cImEuYi5jXCIgb3IgZGF0YS1saW5rPVwiezphLmIuY31cIiAod2l0aCBvciB3aXRob3V0IGNvbnZlcnRlcnMpLSBvdGhlcndpc2UgaW5uZXJIVE1MXG5cdFx0XHQ6IFwiXCI7IC8vIERlZmF1bHQgaXMgbm90IHRvIGJpbmQgZnJvbVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVuZGVyaW5nIGFuZCBET00gaW5zZXJ0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZW5kZXJBbmRMaW5rKHZpZXcsIGluZGV4LCB0bXBsLCB2aWV3cywgZGF0YSwgY29udGV4dCwgcmVmcmVzaCkge1xuXHR2YXIgaHRtbCwgbGlua1RvTm9kZSwgcHJldlZpZXcsIG5vZGVzVG9SZW1vdmUsIGJpbmRJZCxcblx0XHRwYXJlbnROb2RlID0gdmlldy5wYXJlbnRFbGVtLFxuXHRcdHByZXZOb2RlID0gdmlldy5fcHJ2LFxuXHRcdG5leHROb2RlID0gdmlldy5fbnh0LFxuXHRcdGVsQ250ID0gdmlldy5fZWxDbnQ7XG5cblx0aWYgKHByZXZOb2RlICYmIHByZXZOb2RlLnBhcmVudE5vZGUgIT09IHBhcmVudE5vZGUpIHtcblx0XHRlcnJvcihcIk1pc3NpbmcgcGFyZW50Tm9kZVwiKTtcblx0XHQvLyBBYmFuZG9uLCBzaW5jZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgb3Igd3JhcHBlciBlbGVtZW50IGhhcyBiZWVuIGluc2VydGVkIGJldHdlZW4gcHJldk5vZGUgYW5kIHBhcmVudE5vZGVcblx0fVxuXG5cdGlmIChyZWZyZXNoKSB7XG5cdFx0bm9kZXNUb1JlbW92ZSA9IHZpZXcubm9kZXMoKTtcblx0XHRpZiAoZWxDbnQgJiYgcHJldk5vZGUgJiYgcHJldk5vZGUgIT09IG5leHROb2RlKSB7XG5cdFx0XHQvLyBUaGlzIHByZXZOb2RlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRyYW5zZmVyIHRoZSB2aWV3IHRva2VucyBvbiBwcmV2Tm9kZSB0byBuZXh0Tm9kZSBvZiB0aGlzICd2aWV3VG9SZWZyZXNoJ1xuXHRcdFx0dHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgcGFyZW50Tm9kZSwgdmlldy5fLmlkLCBcIl9cIiwgdHJ1ZSk7XG5cdFx0fVxuXHRcdC8vIFJlbW92ZSBjaGlsZCB2aWV3c1xuXHRcdHZpZXcucmVtb3ZlVmlld3ModW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdGxpbmtUb05vZGUgPSBuZXh0Tm9kZTtcblxuXHRcdGlmIChlbENudCkge1xuXHRcdFx0cHJldk5vZGUgPSBwcmV2Tm9kZVxuXHRcdFx0XHQ/IHByZXZOb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHQ6IG5leHROb2RlXG5cdFx0XHRcdFx0PyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHQ6IHBhcmVudE5vZGUubGFzdENoaWxkO1xuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBIVE1MIG5vZGVzXG5cdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblxuXHRcdGZvciAoYmluZElkIGluIHZpZXcuXy5ibmRzKSB7XG5cdFx0XHQvLyBUaGUgdmlldyBiaW5kaW5ncyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBhYm92ZSBpbjogJChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblx0XHRcdC8vIElmIG5vdCwgcmVtb3ZlIHRoZW0gaGVyZTpcblx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIGFkZFZpZXdzLiBPbmx5IGNhbGxlZCBpZiB2aWV3IGlzIG9mIHR5cGUgXCJhcnJheVwiXG5cdFx0aWYgKGluZGV4KSB7XG5cdFx0XHQvLyBpbmRleCBpcyBhIG51bWJlciwgc28gaW5kZXhlZCB2aWV3IGluIHZpZXcgYXJyYXlcblx0XHRcdHByZXZWaWV3ID0gdmlld3NbaW5kZXggLSAxXTtcblx0XHRcdGlmICghcHJldlZpZXcpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBJZiBzdWJ2aWV3IGZvciBwcm92aWRlZCBpbmRleCBkb2VzIG5vdCBleGlzdCwgZG8gbm90aGluZ1xuXHRcdFx0fVxuXHRcdFx0cHJldk5vZGUgPSBwcmV2Vmlldy5fbnh0O1xuXHRcdH1cblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdGxpbmtUb05vZGUgPSBwcmV2Tm9kZTtcblx0XHRcdHByZXZOb2RlID0gbGlua1RvTm9kZVxuXHRcdFx0XHQ/IGxpbmtUb05vZGUucHJldmlvdXNTaWJsaW5nICAgICAgICAgLy8gVGhlcmUgaXMgYSBsaW5rVG9Ob2RlLCBzbyBpbnNlcnQgYWZ0ZXIgcHJldmlvdXNTaWJsaW5nLCBvciBhdCB0aGUgYmVnaW5uaW5nXG5cdFx0XHRcdDogcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7ICAgICAgICAgICAgICAvLyBJZiBubyBwcmV2VmlldyBhbmQgbm8gcHJldk5vZGUsIGluZGV4IGlzIDAgYW5kIHRoZSBjb250YWluZXIgaXMgZW1wdHksXG5cdFx0XHRcdC8vIHNvIHByZXZOb2RlID0gbGlua1RvTm9kZSA9IG51bGwuIEJ1dCBpZiBwcmV2Vmlldy5fbnh0IGlzIG51bGwgdGhlbiB3ZSBzZXQgcHJldk5vZGUgdG8gcGFyZW50Tm9kZS5sYXN0Q2hpbGRcblx0XHRcdFx0Ly8gKHdoaWNoIG11c3QgYmUgYmVmb3JlIHRoZSBwcmV2Vmlldykgc28gd2UgaW5zZXJ0IGFmdGVyIHRoYXQgbm9kZSAtIGFuZCBvbmx5IGxpbmsgdGhlIGluc2VydGVkIG5vZGVzXG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpbmtUb05vZGUgPSBwcmV2Tm9kZS5uZXh0U2libGluZztcblx0XHR9XG5cdH1cblx0aHRtbCA9IHRtcGwucmVuZGVyKGRhdGEsIGNvbnRleHQsIHZpZXcuXy51c2VLZXkgJiYgcmVmcmVzaCwgdmlldywgcmVmcmVzaCB8fCBpbmRleCwgdHJ1ZSk7XG5cdC8vIFBhc3MgaW4gdmlldy5fLnVzZUtleSBhcyB0ZXN0IGZvciBub0l0ZXJhdGlvbiAod2hpY2ggY29ycmVzcG9uZHMgdG8gd2hlbiBzZWxmLl8udXNlS2V5ID4gMCBhbmQgc2VsZi5kYXRhIGlzIGFuIGFycmF5KVxuXG5cdC8vIExpbmsgdGhlIG5ldyBIVE1MIG5vZGVzIHRvIHRoZSBkYXRhXG5cdHZpZXcubGluayhkYXRhLCBwYXJlbnROb2RlLCBwcmV2Tm9kZSwgbGlua1RvTm9kZSwgaHRtbCwgcHJldlZpZXcpO1xuLy99LCAwKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT1cbi8vIGFkZEJpbmRpbmdNYXJrZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBhZGRCaW5kaW5nTWFya2Vycyh2YWx1ZSwgdmlldywgdGFnKSB7XG5cdC8vIEluc2VydCBiaW5kaW5nIG1hcmtlcnMgaW50byB0aGUgcmVuZGVyZWQgdGVtcGxhdGUgb3V0cHV0LCB3aGljaCB3aWxsIGdldCBjb252ZXJ0ZWQgdG8gYXBwcm9wcmlhdGVcblx0Ly8gZGF0YS1qc3YgYXR0cmlidXRlcyAoZWxlbWVudC1vbmx5IGNvbnRlbnQpIG9yIHNjcmlwdCBtYXJrZXIgbm9kZXMgKHBocmFzaW5nIG9yIGZsb3cgY29udGVudCksIGluIGNvbnZlcnRNYXJrZXJzLFxuXHQvLyB3aXRoaW4gdmlldy5saW5rLCBwcmlvciB0byBpbnNlcnRpbmcgaW50byB0aGUgRE9NLiBMaW5raW5nIHdpbGwgdGhlbiBiaW5kIGJhc2VkIG9uIHRoZXNlIG1hcmtlcnMgaW4gdGhlIERPTS5cblx0Ly8gQWRkZWQgdmlldyBtYXJrZXJzOiAjbV8uLi5WSUVXLi4uL21fXG5cdC8vIEFkZGVkIHRhZyBtYXJrZXJzOiAjbV4uLi5UQUcuLi4uL21eXG5cdHZhciBpZCwgZW5kO1xuXHRpZiAodGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGJpbmRpbmcgbWFya2VyIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fVxuXHRcdGVuZCA9IFwiXmBcIjtcblx0XHRhZGRMaW5rTWV0aG9kcyh0YWcsIHRydWUpOyAvLyBUaGlzIGlzIHteez4uLi59fSBvciB7Xnt0YWcgLi4ufX0sIHt7Y3Z0Oi4uLn0gb3Ige157Oi4uLn19LCBhbmQgdGFnIHdhcyBkZWZpbmVkIGluIGNvbnZlcnRWYWwgb3IgcmVuZGVyVGFnXG5cdFx0aWQgPSB0YWcuX3RnSWQ7XG5cdFx0aWYgKCFpZCkge1xuXHRcdFx0YmluZGluZ1N0b3JlW2lkID0gYmluZGluZ0tleSsrXSA9IHRhZzsgLy8gU3RvcmUgdGhlIHRhZyB0ZW1wb3JhcmlseSwgcmVhZHkgZm9yIGRhdGFiaW5kaW5nLlxuXHRcdFx0Ly8gRHVyaW5nIGxpbmtpbmcsIGluIGFkZERhdGFCaW5kaW5nLCB0aGUgdGFnIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGxpbmtDdHgsXG5cdFx0XHQvLyBhbmQgdGhlbiBpbiBvYnNlcnZlQW5kQmluZCwgYmluZGluZ1N0b3JlW2JpbmRJZF0gd2lsbCBiZSByZXBsYWNlZCBieSBiaW5kaW5nIGluZm8uXG5cdFx0XHR0YWcuX3RnSWQgPSBcIlwiICsgaWQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSBiaW5kaW5nIG1hcmtlciBmb3IgYSB2aWV3XG5cdFx0Ly8gQWRkIHRoZSB2aWV3IHRvIHRoZSBzdG9yZSBvZiBjdXJyZW50IGxpbmtlZCB2aWV3c1xuXHRcdGVuZCA9IFwiX2BcIjtcblx0XHRhZGRMaW5rTWV0aG9kcyh2aWV3U3RvcmVbaWQgPSB2aWV3Ll8uaWRdID0gdmlldyk7XG5cdH1cblx0Ly8gRXhhbXBsZTogXCIjMjNeVGhlVmFsdWUvMjNeXCJcblx0cmV0dXJuIFwiI1wiICsgaWQgKyBlbmRcblx0XHQrICh2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IFwiXCIpIC8vIEZvciB7Xns6bmFtZX19IHRoaXMgZ2l2ZXMgdGhlIGVxdWl2YWxlbnQgc2VtYW50aWNzIHRvIGNvbXBpbGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gKHY9ZGF0YS5uYW1lKSE9bnVsbD92OlwiXCI7IHVzZWQgaW4ge3s6bmFtZX19IG9yIGRhdGEtbGluaz1cIm5hbWVcIlxuXHRcdCsgXCIvXCIgKyBpZCArIGVuZDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERhdGEtbGlua2luZyBhbmQgZGF0YSBiaW5kaW5nXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLy0tLS0tLS0tLS0tLS0tLVxuLy8gb2JzZXJ2ZUFuZEJpbmRcbi8vLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KSB7IC8vVE9ETz8gbGlua0ZuQXJncykgeztcblx0dmFyIGJpbmRpbmcsIGwsIGxpbmtlZEVsZW0sIGV4cHJGbkRlcHMsIGV4cHJPYixcblx0XHR0YWcgPSBsaW5rQ3R4LnRhZyxcblx0XHRjdnRCayA9IGxpbmtDdHguY29udmVydEJhY2ssXG5cdFx0ZGVwZW5kcyA9IFtdLFxuXHRcdGJpbmRJZCA9IGxpbmtDdHguX2JuZElkIHx8IFwiXCIgKyBiaW5kaW5nS2V5KyssXG5cdFx0aGFuZGxlciA9IGxpbmtDdHguX2hkbDtcblxuXHRsaW5rQ3R4Ll9ibmRJZCA9IHVuZGVmaW5lZDtcblxuXHRpZiAodGFnKSB7XG5cdFx0Ly8gVXNlIHRoZSAnZGVwZW5kcycgcGF0aHMgc2V0IG9uIGxpbmtDdHgudGFnIC0gd2hpY2ggbWF5IGhhdmUgYmVlbiBzZXQgb24gZGVjbGFyYXRpb25cblx0XHQvLyBvciBpbiBldmVudHM6IGluaXQsIHJlbmRlciwgb25BZnRlckxpbmsgZXRjLlxuXHRcdGRlcGVuZHMgPSB0YWcuZGVwZW5kcyB8fCBkZXBlbmRzO1xuXHRcdGRlcGVuZHMgPSAkaXNGdW5jdGlvbihkZXBlbmRzKSA/IHRhZy5kZXBlbmRzKHRhZykgOiBkZXBlbmRzO1xuXHRcdGxpbmtlZEVsZW0gPSB0YWcubGlua2VkRWxlbTtcblx0fVxuXHRpZiAoIWxpbmtDdHguX2RlcGVuZHMgfHwgKFwiXCIgKyBsaW5rQ3R4Ll9kZXBlbmRzICE9PSBcIlwiICsgZGVwZW5kcykpIHtcblx0XHQvLyBPbmx5IGJpbmQgdGhlIGZpcnN0IHRpbWUsIG9yIGlmIHRoZSBuZXcgZGVwZW5kcyAodG9TdHJpbmcpIGhhcyBjaGFuZ2VkIGZyb20gd2hlbiBsYXN0IGJvdW5kXG5cdFx0aWYgKGxpbmtDdHguX2RlcGVuZHMpIHtcblx0XHRcdC8vIFVub2JzZXJ2ZSBwcmV2aW91cyBiaW5kaW5nXG5cdFx0XHQkb2JzZXJ2YWJsZS5fYXBwbHkoZmFsc2UsIFtzb3VyY2VdLCBsaW5rQ3R4Ll9kZXBlbmRzLCBoYW5kbGVyLCB0cnVlKTtcblx0XHR9XG5cblx0XHRleHByRm5EZXBzID0gbGlua0N0eC5mbi5kZXBzLnNsaWNlKCk7IC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBkZXBlbmRlbmN5IHBhdGhzIGZvciB0aGUgY29tcGlsZWQgbGlua0N0eCBleHByZXNzaW9uIC0gdG8gcGFzcyB0byBvYnNlcnZlKCkuIEluIGdldElubmVyQ2IoKSxcblx0XHQvLyAoYW5kIHdoZW5ldmVyIHRoZSBvYmplY3QgaXMgdXBkYXRlZCwgaW4gaW5uZXJDYiksIHdlIHdpbGwgc2V0IGV4cHJPYi5vYiB0byB0aGUgY3VycmVudCBvYmplY3QgcmV0dXJuZWQgYnkgdGhhdCBjb21wdXRlZCBleHByZXNzaW9uLCBmb3IgdGhpcyB2aWV3LlxuXHRcdGwgPSBleHByRm5EZXBzLmxlbmd0aDtcblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRleHByT2IgPSBleHByRm5EZXBzW2xdO1xuXHRcdFx0aWYgKGV4cHJPYi5fanN2KSB7XG5cdFx0XHRcdC8vIFRoaXMgcGF0aCBpcyBhbiAnZXhwck9iJywgY29ycmVzcG9uZGluZyB0byBhIGNvbXB1dGVkLCByZXR1cm5pbmcgYW4gb2JqZWN0LiBXZSByZXBsYWNlIHRoZSBleHByT2IgYnlcblx0XHRcdFx0Ly8gYSB2aWV3LWJpbmRpbmctc3BlY2lmaWMgZXhwck9iIGluc3RhbmNlLiBUaGUgY3VycmVudCBvYmplY3Qgd2lsbCBiZSBzdG9yZWQgYXMgZXhwck9iLm9iLlxuXHRcdFx0XHRleHByRm5EZXBzW2xdID0gJGV4dGVuZCh7fSwgZXhwck9iKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRiaW5kaW5nID0gJG9ic2VydmFibGUuX2FwcGx5KFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRbc291cmNlXSxcblx0XHRcdGV4cHJGbkRlcHMsIC8vIGZsYXR0ZW4gdGhlIHBhdGhzIC0gdG8gZ2F0aGVyIGFsbCB0aGUgZGVwZW5kZW5jaWVzIGFjcm9zcyBhcmdzIGFuZCBib3VuZCBwYXJhbXNcblx0XHRcdGRlcGVuZHMsXG5cdFx0XHRoYW5kbGVyLFxuXHRcdFx0bGlua0N0eC5fY3R4Q2IpO1xuXHRcdC8vIFRoZSBiaW5kaW5nIHJldHVybmVkIGJ5ICRvYnNlcnZlIGhhcyBhIGJuZCBhcnJheSB3aXRoIHRoZSBzb3VyY2Ugb2JqZWN0cyBvZiB0aGUgaW5kaXZpZHVhbCBiaW5kaW5ncy5cblxuXHRcdGJpbmRpbmcuZWxlbSA9IHRhcmdldDsgLy8gVGhlIHRhcmdldCBvZiBhbGwgdGhlIGluZGl2aWR1YWwgYmluZGluZ3Ncblx0XHRiaW5kaW5nLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdGJpbmRpbmcuX3RnSWQgPSBiaW5kSWQ7XG5cblx0XHQvLyBBZGQgdG8gdGhlIF9qc3ZCbmQgb24gdGhlIHRhcmdldCB0aGUgdmlldyBpZCBhbmQgYmluZGluZyBpZCAtIGZvciB1bmJpbmRpbmcgd2hlbiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgcmVtb3ZlZFxuXHRcdHRhcmdldC5fanN2Qm5kID0gdGFyZ2V0Ll9qc3ZCbmQgfHwgXCJcIjtcblx0XHR0YXJnZXQuX2pzdkJuZCArPSBcIiZcIiArIGJpbmRJZDtcblx0XHRsaW5rQ3R4Ll9kZXBlbmRzID0gZGVwZW5kcztcblx0XHQvLyBTdG9yZSB0aGUgYmluZGluZyBrZXkgb24gdGhlIHZpZXcsIGZvciBkaXNwb3NhbCB3aGVuIHRoZSB2aWV3IGlzIHJlbW92ZWRcblx0XHRsaW5rQ3R4LnZpZXcuXy5ibmRzW2JpbmRJZF0gPSBiaW5kSWQ7XG5cdFx0Ly8gU3RvcmUgdGhlIGJpbmRpbmcuXG5cdFx0YmluZGluZ1N0b3JlW2JpbmRJZF0gPSBiaW5kaW5nOyAvLyBOb3RlOiBJZiB0aGlzIGNvcnJlc3BvbmRzIHRvIGEgZGF0YS1saW5rZWQgdGFnLCB3ZSBhcmUgcmVwbGFjaW5nIHRoZVxuXHRcdC8vIHRlbXBvcmFyaWx5IHN0b3JlZCB0YWcgYnkgdGhlIHN0b3JlZCBiaW5kaW5nLiBUaGUgdGFnIHdpbGwgbm93IGJlIGF0IGJpbmRpbmcubGlua0N0eC50YWdcblxuXHRcdGlmIChsaW5rZWRFbGVtKSB7XG5cdFx0XHRsID0gbGlua2VkRWxlbS5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdGxpbmtlZEVsZW1bbF0uX2pzdkxrRWwgPSB0YWc7XG5cdFx0XHRcdGJpbmRUbyhiaW5kaW5nLCB0YWcsIGxpbmtlZEVsZW1bbF0pO1xuXHRcdFx0XHRsaW5rZWRFbGVtW2xdLl9qc3ZCbmQgPSBcIiZcIiArIGJpbmRpbmcuX3RnSWQgKyBcIitcIjsgLy8gQWRkIGEgXCIrXCIgZm9yIGNsb25lZCBiaW5kaW5nIC0gc28gcmVtb3Zpbmdcblx0XHRcdFx0Ly8gZWxlbXMgd2l0aCBjbG9uZWQgYmluZGluZ3Mgd2lsbCBub3QgcmVtb3ZlIHRoZSAncGFyZW50JyBiaW5kaW5nIGZyb20gdGhlIGJpbmRpbmdTdG9yZS5cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGN2dEJrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGJpbmRUbyhiaW5kaW5nLCB0YWcsIHRhcmdldCwgY3Z0QmspO1xuXHRcdH1cblxuXHRcdGlmICh0YWcpIHtcblx0XHRcdGlmICghdGFnLmZsb3cgJiYgIXRhZy5fLmlubGluZSkge1xuXHRcdFx0XHR0YXJnZXQuc2V0QXR0cmlidXRlKGpzdkF0dHJTdHIsICh0YXJnZXQuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpfHxcIlwiKSArIFwiI1wiICsgYmluZElkICsgXCJeL1wiICsgYmluZElkICsgXCJeXCIpO1xuXHRcdFx0XHR0YWcuX3RnSWQgPSBcIlwiICsgYmluZElkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vLy0tLS0tLS1cbi8vICQubGlua1xuLy8tLS0tLS0tXG5cbmZ1bmN0aW9uIHRtcGxMaW5rKHRvLCBmcm9tLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50VmlldywgcHJldk5vZGUsIG5leHROb2RlKSB7XG5cdHJldHVybiAkbGluayh0aGlzLCB0bywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSk7XG59XG5cbmZ1bmN0aW9uICRsaW5rKHRtcGxPckxpbmtFeHByLCB0bywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHQvLyBXaGVuIGxpbmtpbmcgZnJvbSBhIHRlbXBsYXRlLCBwcmV2Tm9kZSBhbmQgbmV4dE5vZGUgcGFyYW1ldGVycyBhcmUgaWdub3JlZFxuXHRpZiAoY29udGV4dCA9PT0gdHJ1ZSkge1xuXHRcdG5vSXRlcmF0aW9uID0gY29udGV4dDsgLy8gcGFzc2luZyBib29sZWFuIGFzIHRoaXJkIHBhcmFtIC0gbm9JdGVyYXRpb25cblx0XHRjb250ZXh0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDsgLy8gY29udGV4dCBtdXN0IGJlIGEgYm9vbGVhbiAobm9JdGVyYXRpb24pIG9yIGEgcGxhaW4gb2JqZWN0XG5cdH0gZWxzZSB7XG5cdFx0Y29udGV4dCA9ICRleHRlbmQoe30sIGNvbnRleHQpO1xuXHR9XG5cdGlmICh0bXBsT3JMaW5rRXhwciAmJiB0bykge1xuXHRcdHRvID0gdG8uanF1ZXJ5ID8gdG8gOiAkKHRvKTsgLy8gdG8gaXMgYSBqcXVlcnkgb2JqZWN0IG9yIGFuIGVsZW1lbnQgb3Igc2VsZWN0b3JcblxuXHRcdGlmICghYWN0aXZlQm9keSkge1xuXHRcdFx0YWN0aXZlQm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdFx0XHQkKGFjdGl2ZUJvZHkpXG5cdFx0XHRcdC5vbihlbGVtZW50Q2hhbmdlU3RyLCBlbGVtQ2hhbmdlSGFuZGxlcilcblx0XHRcdFx0Lm9uKCdibHVyJywgJ1tjb250ZW50ZWRpdGFibGVdJywgZWxlbUNoYW5nZUhhbmRsZXIpO1xuXHRcdH1cblxuXHRcdHZhciBpLCBrLCBodG1sLCB2d0luZm9zLCB2aWV3LCBwbGFjZWhvbGRlclBhcmVudCwgdGFyZ2V0RWwsIHJlZnJlc2gsIHRvcExldmVsQ2FsbCxcblx0XHRcdG9uUmVuZGVyID0gYWRkQmluZGluZ01hcmtlcnMsXG5cdFx0XHRyZXBsYWNlTW9kZSA9IGNvbnRleHQgJiYgY29udGV4dC50YXJnZXQgPT09IFwicmVwbGFjZVwiLFxuXHRcdFx0bCA9IHRvLmxlbmd0aDtcblxuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdHRhcmdldEVsID0gdG9bbF07XG5cblx0XHRcdHBhcmVudFZpZXcgPSBwYXJlbnRWaWV3IHx8ICR2aWV3KHRhcmdldEVsKTtcblxuXHRcdFx0aWYgKHRvcExldmVsQ2FsbCA9IHBhcmVudFZpZXcgPT09IHRvcFZpZXcpIHtcblx0XHRcdFx0dG9wVmlldy5kYXRhID0gKHRvcFZpZXcuY3R4ID0gY29udGV4dCB8fCB7fSkucm9vdCA9IGZyb207XG5cdFx0XHR9XG5cdFx0XHRpZiAoXCJcIiArIHRtcGxPckxpbmtFeHByID09PSB0bXBsT3JMaW5rRXhwcikge1xuXHRcdFx0XHQvLyB0bXBsT3JMaW5rRXhwciBpcyBhIHN0cmluZzogdHJlYXQgYXMgZGF0YS1saW5rIGV4cHJlc3Npb24uXG5cdFx0XHRcdGFkZERhdGFCaW5kaW5nKHRtcGxPckxpbmtFeHByLCB0YXJnZXRFbCwgcGFyZW50VmlldywgdW5kZWZpbmVkLCB0cnVlLCBmcm9tLCBjb250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICh0bXBsT3JMaW5rRXhwci5tYXJrdXAgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBjYWxsIHRvIHRlbXBsYXRlLmxpbmsoKVxuXHRcdFx0XHRcdGlmIChyZXBsYWNlTW9kZSkge1xuXHRcdFx0XHRcdFx0cGxhY2Vob2xkZXJQYXJlbnQgPSB0YXJnZXRFbC5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGh0bWwgPSB0bXBsT3JMaW5rRXhwci5yZW5kZXIoZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgb25SZW5kZXIpO1xuXHRcdFx0XHRcdC8vIFRPRE8gQ29uc2lkZXIgZmluZGluZyBhIHdheSB0byBiaW5kIGRhdGEgKGxpbmspIHdpdGhpbiB0ZW1wbGF0ZSB3aXRob3V0IGh0bWwgYmVpbmcgZGlmZmVyZW50IGZvciBlYWNoIHZpZXcsIHRoZSBIVE1MIGNhblxuXHRcdFx0XHRcdC8vIGJlIGV2YWx1YXRlZCBvbmNlIG91dHNpZGUgdGhlIHdoaWxlIChsLS0pLCBhbmQgcHVzaGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCwgdGhlbiBjbG9uZWQgYW5kIGluc2VydGVkIGF0IGVhY2ggdGFyZ2V0LlxuXG5cdFx0XHRcdFx0aWYgKHBsYWNlaG9sZGVyUGFyZW50KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIHRhcmdldD1cInJlcGxhY2VcIiBtb2RlXG5cdFx0XHRcdFx0XHRwcmV2Tm9kZSA9IHRhcmdldEVsLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0XHRcdG5leHROb2RlID0gdGFyZ2V0RWwubmV4dFNpYmxpbmc7XG5cdFx0XHRcdFx0XHQkLmNsZWFuRGF0YShbdGFyZ2V0RWxdLCB0cnVlKTtcblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyUGFyZW50LnJlbW92ZUNoaWxkKHRhcmdldEVsKTtcblxuXHRcdFx0XHRcdFx0dGFyZ2V0RWwgPSBwbGFjZWhvbGRlclBhcmVudDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cHJldk5vZGUgPSBuZXh0Tm9kZSA9IHVuZGVmaW5lZDsgLy8gV2hlbiBsaW5raW5nIGZyb20gYSB0ZW1wbGF0ZSwgcHJldk5vZGUgYW5kIG5leHROb2RlIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWRcblx0XHRcdFx0XHRcdCQodGFyZ2V0RWwpLmVtcHR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHRtcGxPckxpbmtFeHByID09PSB0cnVlICYmIHBhcmVudFZpZXcgPT09IHRvcFZpZXcpIHtcblx0XHRcdFx0XHQvLyAkLmxpbmsodHJ1ZSwgc2VsZWN0b3IsIGRhdGEsIGN0eCkgLSB3aGVyZSBzZWxlY3RvciBwb2ludHMgdG8gZWxlbSBpbiB0b3AtbGV2ZWwgY29udGVudC4gKElmIG5vdCB0b3AtbGV2ZWwgY29udGVudCwgbm8tb3ApXG5cdFx0XHRcdFx0cmVmcmVzaCA9IHtsbms6IDF9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cbi8vIFRPRE8gQ29uc2lkZXIgZGVmZXJyZWQgbGlua2luZyBBUEkgZmVhdHVyZSBvbiBwZXItdGVtcGxhdGUgYmFzaXMgLSB7QHsgaW5zdGVhZCBvZiB7Xnsgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUgcmVuZGVyZWQgY29udGVudFxuLy8gYmVmb3JlIHRoYXQgY29udGVudCBpcyBsaW5rZWQsIHdpdGggYmV0dGVyIHBlcmNlaXZlZCBwZXJmLiBIYXZlIHZpZXcubGluayByZXR1cm4gYSBkZWZlcnJlZCwgYW5kIHBhc3MgdGhhdCB0byBvbkFmdGVyTGluay4uLlxuLy8gb3Igc29tZXRoaW5nIGFsb25nIHRob3NlIGxpbmVzLlxuLy8gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRpZiAodGFyZ2V0RWwuX2RmICYmICFuZXh0Tm9kZSkge1xuXHRcdFx0XHRcdC8vIFdlIGFyZSBpbnNlcnRpbmcgbmV3IGNvbnRlbnQgYW5kIHRoZSB0YXJnZXQgZWxlbWVudCBoYXMgc29tZSBkZWZlcnJlZCBiaW5kaW5nIGFubm90YXRpb25zLGFuZCB0aGVyZSBpcyBubyBuZXh0Tm9kZS5cblx0XHRcdFx0XHQvLyBUaG9zZSB2aWV3cyBtYXkgYmUgc3RhbGUgdmlld3MgKHRoYXQgd2lsbCBiZSByZWNyZWF0ZWQgaW4gdGhpcyBuZXcgbGlua2luZyBhY3Rpb24pIHNvIHdlIHdpbGwgZmlyc3QgcmVtb3ZlIHRoZW1cblx0XHRcdFx0XHQvLyAoaWYgbm90IGFscmVhZHkgcmVtb3ZlZCkuXG5cdFx0XHRcdFx0dndJbmZvcyA9IHZpZXdJbmZvcyh0YXJnZXRFbC5fZGYsIHRydWUsIHJPcGVuVmlld01hcmtlcnMpO1xuXG5cdFx0XHRcdFx0Zm9yIChpID0gMCwgayA9IHZ3SW5mb3MubGVuZ3RoOyBpIDwgazsgaSsrKSB7XG5cdFx0XHRcdFx0XHR2aWV3ID0gdndJbmZvc1tpXTtcblx0XHRcdFx0XHRcdGlmICgodmlldyA9IHZpZXdTdG9yZVt2aWV3LmlkXSkgJiYgdmlldy5kYXRhICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhpcyBpcyB0aGUgX3BydiAocHJldk5vZGUpIGZvciBhIHZpZXcsIHJlbW92ZSB0aGUgdmlld1xuXHRcdFx0XHRcdFx0XHQvLyAtIHVubGVzcyB2aWV3LmRhdGEgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIGFscmVhZHkgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0XHRcdFx0XHR2aWV3LnBhcmVudC5yZW1vdmVWaWV3cyh2aWV3Ll8ua2V5LCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRFbCk7IC8vIHJlbW92ZSBkZWZlciB0b2tlbnNcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIExpbmsgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQsIHNpbmNlIHRoaXMgaXMgYSBjYWxsIHRvIHRlbXBsYXRlLmxpbmsoKSwgb3IgdG8gJChlbCkubGluayh0cnVlLCAuLi4pLFxuXHRcdFx0XHRwYXJlbnRWaWV3LmxpbmsoZnJvbSwgdGFyZ2V0RWwsIHByZXZOb2RlLCBuZXh0Tm9kZSwgaHRtbCwgcmVmcmVzaCwgY29udGV4dCk7XG4vL30sIDApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRvcExldmVsQ2FsbCkge1xuXHRcdFx0XHR0b3BWaWV3LmRhdGEgPSB0b3BWaWV3LmN0eCA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRvOyAvLyBBbGxvdyBjaGFpbmluZywgdG8gYXR0YWNoIGV2ZW50IGhhbmRsZXJzLCBldGMuXG59XG5cbi8vLS0tLS0tLS0tLVxuLy8gdmlldy5saW5rXG4vLy0tLS0tLS0tLS1cblxuZnVuY3Rpb24gdmlld0xpbmsob3V0ZXJEYXRhLCBwYXJlbnROb2RlLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIGh0bWwsIHJlZnJlc2gsIGNvbnRleHQsIHZhbGlkYXRlT25seSkge1xuXHQvLyBPcHRpb25hbGx5IGluc2VydCBIVE1MIGludG8gRE9NIHVzaW5nIGRvY3VtZW50RnJhZ21lbnRzIChhbmQgd3JhcHBpbmcgSFRNTCBhcHByb3ByaWF0ZWx5KS5cblx0Ly8gRGF0YS1saW5rIGV4aXN0aW5nIGNvbnRlbnRzIG9mIHBhcmVudE5vZGUsIG9yIHRoZSBpbnNlcnRlZCBIVE1MLCBpZiBwcm92aWRlZFxuXG5cdC8vIERlcGVuZGluZyBvbiB0aGUgY29udGVudCBtb2RlbCBmb3IgdGhlIEhUTUwgZWxlbWVudHMsIHRoZSBzdGFuZGFyZCBkYXRhLWxpbmtpbmcgbWFya2VycyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBieSBhZGRCaW5kaW5nTWFya2VycyBkdXJpbmdcblx0Ly8gdGVtcGxhdGUgcmVuZGVyaW5nIHdpbGwgYmUgY29udmVydGVkIGVpdGhlciB0byBzY3JpcHQgbWFya2VyIG5vZGVzIG9yLCBmb3IgZWxlbWVudC1vbmx5IGNvbnRlbnQgc2VjdGlvbnMsIHRvIGRhdGEtanN2IGVsZW1lbnQgYW5ub3RhdGlvbnMuXG5cblx0Ly8gRGF0YS1saW5raW5nIHdpbGwgdGhlbiBhZGQgX3BydiBhbmQgX254dCB0byB2aWV3cywgd2hlcmU6XG5cdC8vICAgICBfcHJ2OiBSZWZlcmVuY2VzIHRoZSBwcmV2aW91cyBub2RlIChzY3JpcHQgZWxlbWVudCBvZiB0eXBlIFwianN2MTIzXCIpLCBvciAoZm9yIGVsQ250PXRydWUpLCB0aGUgZmlyc3QgZWxlbWVudCBub2RlIGluIHRoZSB2aWV3IChvciBpZiBub25lLCBzZXQgX3BydiA9IF9ueHQpXG5cdC8vICAgICBfbnh0OiBSZWZlcmVuY2VzIHRoZSBsYXN0IG5vZGUgKHNjcmlwdCBlbGVtZW50IG9mIHR5cGUgXCJqc3YvMTIzXCIpLCBvciAoZm9yIGVsQ250PXRydWUpLCB0aGUgbmV4dCBlbGVtZW50IG5vZGUgYWZ0ZXIgdGhlIHZpZXcuXG5cblx0Ly89PT09IG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXHRmdW5jdGlvbiBjb252ZXJ0TWFya2VycyhhbGwsIHByZWNlZGluZywgc2VsZkNsb3NlLCBjbG9zZVRhZywgc3BhY2VCZWZvcmUsIGlkLCBib3VuZElkLCBzcGFjZUFmdGVyLCB0YWcxLCB0YWcyLCBjbG9zZVRhZzIsIHNwYWNlQWZ0ZXJDbG9zZSwgc2VsZkNsb3NlMiwgZW5kT3BlblRhZykge1xuXHRcdC8vIHJDb252ZXJ0TWFya2VycyA9IC8oXnwoXFwvPil8PFxcLyhcXHcrKT58KShcXHMqKShbI1xcL11cXGQrKD86X3woXFxeKSkpYChcXHMqKSg8XFx3Kyg/PVtcXHNcXC8+XSkpP3xcXHMqKD86KDxcXHcrKD89W1xcc1xcLz5dKSl8PFxcLyhcXHcrKT4oXFxzKil8KFxcLz4pXFxzKnwoPikpL2csXG5cdFx0Ly8gICAgICAgICAgICAgICAgIHByZWMsIHNsZkNsLCBjbHNUYWcsICBzcEJlZm9yZSwgaWQsICAgICAgYm5kSWQgIHNwQWZ0ZXIsdGFnMSwgICAgICAgICAgICAgICAgICAgdGFnMiwgICAgICAgICAgICAgICBjbFRhZzIsc2FjICBzbGZDbDIsIGVuZE9wZW5UYWdcblx0XHQvLyBDb252ZXJ0IHRoZSBtYXJrZXJzIHRoYXQgd2VyZSBpbmNsdWRlZCBieSBhZGRCaW5kaW5nTWFya2VycyBpbiB0ZW1wbGF0ZSBvdXRwdXQsIHRvIGFwcHJvcHJpYXRlIERPTSBhbm5vdGF0aW9uczpcblx0XHQvLyBkYXRhLWpzdiBhdHRyaWJ1dGVzIChmb3IgZWxlbWVudC1vbmx5IGNvbnRlbnQpIG9yIHNjcmlwdCBtYXJrZXIgbm9kZXMgKHdpdGhpbiBwaHJhc2luZyBvciBmbG93IGNvbnRlbnQpLlxuXG4vLyBUT0RPIGNvbnNpZGVyIGRldGVjdGluZyAncXVvdGVkJyBjb250ZXh0cyAoYXR0cmlidXRlIHN0cmluZ3MpIHNvIHRoYXQgYXR0cmlidXRlIGVuY29kaW5nIGRvZXMgbm90IG5lZWQgdG8gZW5jb2RlID5cbi8vIEN1cnJlbnRseSByQXR0ckVuY29kZSA9IC9bPjxcIicmXS9nIGluY2x1ZGVzICc+JyBlbmNvZGluZyBpbiBvcmRlciB0byBhdm9pZCBlcnJvbmVvdXMgcGFyc2luZyBvZiA8c3BhbiB0aXRsZT1cIiZsdDthLz5cIj48L3NwYW4+XCI+XG5cdFx0dmFyIGVycm9yTXNnLCBibmRJZCxcblx0XHRcdGVuZE9mRWxDbnQgPSBcIlwiO1xuXHRcdGlmIChlbmRPcGVuVGFnKSB7XG5cdFx0XHRpblRhZyA9IDA7XG5cdFx0XHRyZXR1cm4gYWxsO1xuXHRcdH1cblx0XHR0YWcgPSB0YWcxIHx8IHRhZzIgfHwgXCJcIjtcblx0XHRjbG9zZVRhZyA9IGNsb3NlVGFnIHx8IGNsb3NlVGFnMjtcblx0XHRzZWxmQ2xvc2UgPSBzZWxmQ2xvc2UgfHwgc2VsZkNsb3NlMjtcblx0XHRpZiAoaXNWb2lkICYmICFzZWxmQ2xvc2UgJiYgKCAhYWxsIHx8IGNsb3NlVGFnIHx8IHRhZyB8fCBpZCAmJiAhaW5UYWcpKSB7IC8vICFhbGwgPSBlbmQgb2Ygc3RyaW5nXG5cdFx0XHRpc1ZvaWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWdTdGFjay5zaGlmdCgpOyAvLyBwcmVjZWRpbmcgdGFnIHdhcyBhIHZvaWQgZWxlbWVudCwgd2l0aCBubyBjbG9zaW5nIHNsYXNoLCBzdWNoIGFzIDxicj4uXG5cdFx0fVxuXHRcdGNsb3NlVGFnID0gY2xvc2VUYWcgfHwgc2VsZkNsb3NlO1xuXHRcdGlmIChjbG9zZVRhZykge1xuXHRcdFx0aW5UYWcgPSAwO1xuXHRcdFx0aXNWb2lkID0gdW5kZWZpbmVkO1xuXHRcdFx0Ly8gVE9ETzogc21hcnQgaW5zZXJ0aW9uIG9mIDx0Ym9keT4gLSB0byBiZSBjb21wbGV0ZWQgZm9yIHJvYnVzdCBpbnNlcnRpb24gb2YgZGVmZXJyZWQgYmluZGluZ3MgZXRjLlxuXHRcdFx0Ly9pZiAoY2xvc2VUYWcgPT09IFwidGFibGVcIiAmJiBwYXJlbnRUYWcgPT09IFwidGJvZHlcIikge1xuXHRcdFx0Ly9cdHByZWNlZGluZyA9IFwiPC90Ym9keT5cIiArIHByZWNlZGluZztcblx0XHRcdC8vXHRwYXJlbnRUYWcgPSBcInRhYmxlXCI7XG5cdFx0XHQvL1x0dGFnU3RhY2suc2hpZnQoKTtcblx0XHRcdC8vfVxuXHRcdFx0aWYgKHZhbGlkYXRlKSB7XG5cdFx0XHRcdGlmIChzZWxmQ2xvc2UgfHwgc2VsZkNsb3NlMikge1xuXHRcdFx0XHRcdGlmICghdm9pZEVsZW1zW3BhcmVudFRhZ10gJiYgIS87c3ZnO3w7bWF0aDsvLnRlc3QoXCI7XCIgKyB0YWdTdGFjay5qb2luKFwiO1wiKSArIFwiO1wiKSkge1xuXHRcdFx0XHRcdFx0Ly8gT25seSBzZWxmLWNsb3NpbmcgZWxlbWVudHMgbXVzdCBiZSBsZWdpdGltYXRlIHZvaWQgZWxlbWVudHMsIHN1Y2ggYXMgPGJyLz4sIHBlciBIVE1MIHNjaGVtYSxcblx0XHRcdFx0XHRcdC8vIG9yIHVuZGVyIHN2ZyBvciBtYXRoIGZvcmVpZ24gbmFtZXNwYWNlIGVsZW1lbnRzLlxuXHRcdFx0XHRcdFx0ZXJyb3JNc2cgPSBcIic8XCIgKyBwYXJlbnRUYWcgKyBcIi4uLi9cIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAodm9pZEVsZW1zW2Nsb3NlVGFnXSkge1xuXHRcdFx0XHRcdGVycm9yTXNnID0gXCInPC9cIiArIGNsb3NlVGFnOyAvLyBjbG9zaW5nIHRhZyBzdWNoIGFzIDwvaW5wdXQ+XG5cdFx0XHRcdH0gZWxzZSBpZiAoIXRhZ1N0YWNrLmxlbmd0aCB8fCBjbG9zZVRhZyAhPT0gcGFyZW50VGFnKSB7XG5cdFx0XHRcdFx0ZXJyb3JNc2cgPSBcIk1pc21hdGNoOiAnPC9cIiArIGNsb3NlVGFnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChlcnJvck1zZykge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKGVycm9yTXNnICsgXCI+JyBpbjpcXG5cIiArIGh0bWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwcmV2RWxDbnQgPSBlbENudDtcblx0XHRcdHBhcmVudFRhZyA9IHRhZ1N0YWNrLnNoaWZ0KCk7XG5cdFx0XHRlbENudCA9IGVsQ29udGVudFtwYXJlbnRUYWddO1xuXHRcdFx0Y2xvc2VUYWcyID0gY2xvc2VUYWcyID8gKFwiPC9cIiArIGNsb3NlVGFnMiArIFwiPlwiKSA6IFwiXCI7XG5cdFx0XHRpZiAocHJldkVsQ250KSB7XG5cdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBpZHMgKG1hcmtlcnMgc2luY2UgdGhlIGxhc3QgdGFnKSwgbW92ZSB0aGVtIHRvIHRoZSBkZWZlciBzdHJpbmdcblx0XHRcdFx0ZGVmZXIgKz0gaWRzO1xuXHRcdFx0XHRpZHMgPSBcIlwiO1xuXHRcdFx0XHRpZiAoIWVsQ250KSB7XG5cdFx0XHRcdFx0ZW5kT2ZFbENudCA9IGNsb3NlVGFnMiArIG9wZW5TY3JpcHQgKyBcIkBcIiArIGRlZmVyICsgY2xvc2VTY3JpcHQgKyAoc3BhY2VBZnRlckNsb3NlIHx8IFwiXCIpO1xuXHRcdFx0XHRcdGRlZmVyID0gZGVmZXJTdGFjay5zaGlmdCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVyICs9IFwiLVwiOyAvLyBXaWxsIGJlIHVzZWQgZm9yIHN0ZXBwaW5nIGJhY2sgdGhyb3VnaCBkZWZlcnJlZCB0b2tlbnNcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdC8vIGVsQ29udGVudCBtYXBzIHRhZ05hbWVzIHdoaWNoIGhhdmUgb25seSBlbGVtZW50IGNvbnRlbnQsIHNvIG1heSBub3Qgc3VwcG9ydCBzY3JpcHQgbm9kZXMuXG5cdFx0XHQvLyBXZSBhcmUgaW4gZWxlbWVudC1vbmx5IGNvbnRlbnQsIGNhbiByZW1vdmUgd2hpdGUgc3BhY2UsIGFuZCB1c2UgZGF0YS1qc3YgYXR0cmlidXRlcyBvbiBlbGVtZW50cyBhcyBtYXJrZXJzXG5cdFx0XHQvLyBFeGFtcGxlOiA8dHIgZGF0YS1qc3Y9XCIvMl8jNl9cIj4gLSBjbG9zZSBtYXJrZXIgZm9yIHZpZXcgMiBhbmQgb3BlbiBtYXJrZXIgZm9yIHZpZXcgNlxuXG5cdFx0XHRpZiAoaWQpIHtcblx0XHRcdFx0Ly8gYXBwZW5kIG1hcmtlciBmb3IgdGhpcyBpZCwgdG8gaWRzIHN0cmluZ1xuXHRcdFx0XHRpZHMgKz0gaWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcmVjZWRpbmcgPSAoY2xvc2VUYWcyIHx8IHNlbGZDbG9zZTIgfHwgXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdC8vIFRPRE86IHNtYXJ0IGluc2VydGlvbiBvZiA8dGJvZHk+IC0gdG8gYmUgY29tcGxldGVkIGZvciByb2J1c3QgaW5zZXJ0aW9uIG9mIGRlZmVycmVkIGJpbmRpbmdzIGV0Yy5cblx0XHRcdFx0Ly9pZiAodGFnID09PSBcIjx0clwiICYmIHBhcmVudFRhZyA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdC8vXHR0YWdTdGFjay51bnNoaWZ0KHBhcmVudFRhZyk7XG5cdFx0XHRcdC8vXHRwYXJlbnRUYWcgPSBcInRib2R5XCI7XG5cdFx0XHRcdC8vXHRwcmVjZWRpbmcgKz0gXCI8XCIgKyBwYXJlbnRUYWcgKyBcIj5cIjtcblx0XHRcdFx0Ly9cdGlmIChkZWZlcikge1xuXHRcdFx0XHQvL1x0XHRkZWZlciArPSBcIitcIjsgLy8gV2lsbCBiZSB1c2VkIGZvciBzdGVwcGluZyBiYWNrIHRocm91Z2ggZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRcdC8vXHR9XG5cdFx0XHRcdC8vXHQvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gZGVzaWduLXRpbWUgdmFsaWRhdGlvbiBjaGVja1xuXHRcdFx0XHQvL1x0Ly9cdGVycm9yKCdcIicgKyBwYXJlbnRUYWcgKyAnXCIgaGFzIGluY29ycmVjdCBwYXJlbnQgdGFnJyk7XG5cdFx0XHRcdC8vfVxuXHRcdFx0XHRwcmVjZWRpbmcgKz0gdGFnO1xuXHRcdFx0XHRpZiAoaWRzKSB7XG5cdFx0XHRcdFx0cHJlY2VkaW5nICs9ICcgJyArIGpzdkF0dHJTdHIgKyAnPVwiJyArIGlkcyArICdcIic7XG5cdFx0XHRcdFx0aWRzID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBhcmUgaW4gcGhyYXNpbmcgb3IgZmxvdyBjb250ZW50LCBzbyB1c2Ugc2NyaXB0IG1hcmtlciBub2Rlc1xuXHRcdFx0Ly8gRXhhbXBsZTogPHNjcmlwdCB0eXBlPVwianN2My9cIj48L3NjcmlwdD4gLSBkYXRhLWxpbmtlZCB0YWcsIGNsb3NlIG1hcmtlclxuXHRcdFx0Ly8gV2UgdmFsaWRhdGUgd2l0aCBpblRhZyBzbyBubyBzY3JpcHQgbWFya2VycyBhcmUgaW5zZXJ0ZWQgaW4gYXR0cmlidXRlIGNvbnRleHQgZS5nLiBmb3I6XG5cdFx0XHQvLyBcIjx0YWJsZSB7e2lmIC4uLn19Li4ue3svaWZ9fS4uLiA+XCIgb3IgXCI8dGFibGUge3tpZiAuLi59fS4uLj4gLi4ue3svaWZ9fS4uLlwiXG5cdFx0XHRwcmVjZWRpbmcgPSBpZFxuXHRcdFx0XHQ/IChwcmVjZWRpbmcgKyBlbmRPZkVsQ250ICsgc3BhY2VCZWZvcmUgKyAoaW5UYWcgPyBcIlwiIDogb3BlblNjcmlwdCArIGlkICsgY2xvc2VTY3JpcHQpKyBzcGFjZUFmdGVyICsgdGFnKVxuXHRcdFx0XHQ6IGVuZE9mRWxDbnQgfHwgYWxsO1xuXHRcdH1cblxuXHRcdGlmICh2YWxpZGF0ZSAmJiBib3VuZElkKSB7XG5cdFx0XHRpZiAoaW5UYWcpIHtcblx0XHRcdFx0Ly8gSnNWaWV3cyBkYXRhLWxpbmtpbmcgdGFncyBhcmUgbm90IGFsbG93ZWQgd2l0aGluIGVsZW1lbnQgbWFya3VwLlxuXHRcdFx0XHQvLyBTZWUganN2aWV3cy9pc3N1ZXMvMzAzXG5cdFx0XHRcdHN5bnRheEVycm9yKCd7Xnsgd2l0aGluIGVsZW0gbWFya3VwICgnICsgaW5UYWcgKyAnICkuIFVzZSBkYXRhLWxpbms9XCIuLi5cIicpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlkLmNoYXJBdCgwKSA9PT0gXCIjXCIpIHtcblx0XHRcdFx0dGFnU3RhY2sudW5zaGlmdChpZC5zbGljZSgxKSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlkLnNsaWNlKDEpICE9PSAoYm5kSWQgPSB0YWdTdGFjay5zaGlmdCgpKSkge1xuXHRcdFx0XHQvLyBTZWUganN2aWV3cy9pc3N1ZXMvMjEzXG5cdFx0XHRcdHN5bnRheEVycm9yKCdDbG9zaW5nIHRhZyBmb3Ige157Li4ufX0gdW5kZXIgZGlmZmVyZW50IGVsZW06IDwnICsgYm5kSWQgKyAnPicpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodGFnKSB7XG5cdFx0XHRpblRhZyA9IHRhZztcblx0XHRcdC8vIElmIHRoZXJlIGFyZSBpZHMgKG1hcmtlcnMgc2luY2UgdGhlIGxhc3QgdGFnKSwgbW92ZSB0aGVtIHRvIHRoZSBkZWZlciBzdHJpbmdcblx0XHRcdHRhZ1N0YWNrLnVuc2hpZnQocGFyZW50VGFnKTtcblx0XHRcdHBhcmVudFRhZyA9IHRhZy5zbGljZSgxKTtcblx0XHRcdGlmICh2YWxpZGF0ZSAmJiB0YWdTdGFja1swXSAmJiB0YWdTdGFja1swXSA9PT0gYmFkUGFyZW50W3BhcmVudFRhZ10pIHtcblx0XHRcdFx0Ly8gTWlzc2luZyA8dGJvZHk+XG5cdFx0XHRcdC8vIFRPRE86IHJlcGxhY2UgdGhpcyBieSBzbWFydCBpbnNlcnRpb24gb2YgPHRib2R5PiB0YWdzXG5cdFx0XHRcdGVycm9yKCdQYXJlbnQgb2YgPHRyPiBtdXN0IGJlIDx0Ym9keT4nKTtcblx0XHRcdH1cblx0XHRcdGlzVm9pZCA9IHZvaWRFbGVtc1twYXJlbnRUYWddO1xuXHRcdFx0aWYgKChlbENudCA9IGVsQ29udGVudFtwYXJlbnRUYWddKSAmJiAhcHJldkVsQ250KSB7XG5cdFx0XHRcdGRlZmVyU3RhY2sudW5zaGlmdChkZWZlcik7XG5cdFx0XHRcdGRlZmVyID0gXCJcIjtcblx0XHRcdH1cblx0XHRcdHByZXZFbENudCA9IGVsQ250O1xuLy9UT0RPIENvbnNpZGVyIHByb3ZpZGluZyB2YWxpZGF0aW9uIHdoaWNoIHRocm93cyBpZiB5b3UgcGxhY2UgPHNwYW4+IGFzIGNoaWxkIG9mIDx0cj4sIGV0Yy4gLSBzaW5jZSBpZiBub3QgY2F1Z2h0LFxuLy90aGlzIGNhbiBjYXVzZSBlcnJvcnMgc3Vic2VxdWVudGx5IHdoaWNoIGFyZSBkaWZmaWN1bHQgdG8gZGVidWcuXG4vL1x0XHRcdFx0aWYgKGVsQ29udGVudFt0YWdTdGFja1swXV0+MiAmJiAhZWxDbnQpIHtcbi8vXHRcdFx0XHRcdGVycm9yKHBhcmVudFRhZyArIFwiIGluIFwiICsgdGFnU3RhY2tbMF0pO1xuLy9cdFx0XHRcdH1cblx0XHRcdGlmIChkZWZlciAmJiBlbENudCkge1xuXHRcdFx0XHRkZWZlciArPSBcIitcIjsgLy8gV2lsbCBiZSB1c2VkIGZvciBzdGVwcGluZyBiYWNrIHRocm91Z2ggZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBwcmVjZWRpbmc7XG5cdH1cblxuXHRmdW5jdGlvbiBwcm9jZXNzVmlld0luZm9zKHZ3SW5mb3MsIHRhcmdldFBhcmVudCkge1xuXHRcdC8vIElmIHRhcmdldFBhcmVudCwgd2UgYXJlIHByb2Nlc3Npbmcgdmlld0luZm9zICh3aGljaCBtYXkgaW5jbHVkZSBuYXZpZ2F0aW9uIHRocm91Z2ggJystJyBwYXRocykgYW5kIGhvb2tpbmcgdXAgdG8gdGhlIHJpZ2h0IHBhcmVudEVsZW0gZXRjLlxuXHRcdC8vIChhbmQgZWxlbSBtYXkgYWxzbyBiZSBkZWZpbmVkIC0gdGhlIG5leHQgbm9kZSlcblx0XHQvLyBJZiBubyB0YXJnZXRQYXJlbnQsIHRoZW4gd2UgYXJlIHByb2Nlc3Npbmcgdmlld0luZm9zIG9uIG5ld2x5IGluc2VydGVkIGNvbnRlbnRcblx0XHR2YXIgZGVmZXJQYXRoLCBkZWZlckNoYXIsIGJpbmRDaGFyLCBwYXJlbnRFbGVtLCBpZCwgb25BZnRDciwgZGVlcCxcblx0XHRcdGFkZGVkQmluZEVscyA9IFtdO1xuXG5cdFx0Ly8gSW4gZWxDbnQgY29udGV4dCAoZWxlbWVudC1vbmx5IGNvbnRlbnQgbW9kZWwpLCBwcmV2Tm9kZSBpcyB0aGUgZmlyc3Qgbm9kZSBhZnRlciB0aGUgb3BlbiwgbmV4dE5vZGUgaXMgdGhlIGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIGNsb3NlLlxuXHRcdC8vIElmIGJvdGggYXJlIG51bGwvdW5kZWZpbmVkLCB0aGVuIG9wZW4gYW5kIGNsb3NlIGFyZSBhdCBlbmQgb2YgcGFyZW50IGNvbnRlbnQsIHNvIHRoZSB2aWV3IGlzIGVtcHR5LCBhbmQgaXRzIHBsYWNlaG9sZGVyIGlzIHRoZVxuXHRcdC8vICdsYXN0Q2hpbGQnIG9mIHRoZSBwYXJlbnROb2RlLiBJZiB0aGVyZSBpcyBhIHByZXZOb2RlLCB0aGVuIGl0IGlzIGVpdGhlciB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgdmlldywgb3IgdGhlIHZpZXcgaXMgZW1wdHkgYW5kXG5cdFx0Ly8gaXRzIHBsYWNlaG9sZGVyIGlzIHRoZSAncHJldmlvdXNTaWJsaW5nJyBvZiB0aGUgcHJldk5vZGUsIHdoaWNoIGlzIGFsc28gdGhlIG5leHROb2RlLlxuXHRcdGlmICh2d0luZm9zKSB7XG5cdFx0XHRpZiAodndJbmZvcy5fdGtucy5jaGFyQXQoMCkgPT09IFwiQFwiKSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBwcm9jZXNzaW5nIG5ld2x5IGluc2VydGVkIGNvbnRlbnQuIFRoaXMgaXMgYSBzcGVjaWFsIHNjcmlwdCBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQgaW4gY29udmVydE1hcmtlcnMoKSB0byBwcm9jZXNzIGRlZmVycmVkIGJpbmRpbmdzLFxuXHRcdFx0XHQvLyBhbmQgaW5zZXJ0ZWQgZm9sbG93aW5nIHRoZSB0YXJnZXQgcGFyZW50IGVsZW1lbnQgLSBiZWNhdXNlIG5vIGVsZW1lbnQgdGFncyAob3V0c2lkZSBlbENudCkgd2VyZSBlbmNvdW50ZXJlZCB0byBjYXJyeSB0aG9zZSBiaW5kaW5nIHRva2Vucy5cblx0XHRcdFx0Ly8gV2Ugd2lsbCBzdGVwIGJhY2sgZnJvbSB0aGUgcHJlY2VkaW5nIHNpYmxpbmcgb2YgdGhpcyBlbGVtZW50LCBsb29raW5nIGF0IHRhcmdldFBhcmVudCBlbGVtZW50cyB1bnRpbCB3ZSBmaW5kIHRoZSBvbmUgdGhhdCB0aGUgY3VycmVudCBiaW5kaW5nXG5cdFx0XHRcdC8vIHRva2VuIGJlbG9uZ3MgdG8uIFNldCBlbGVtIHRvIG51bGwgKHRoZSBzcGVjaWFsIHNjcmlwdCBlbGVtZW50KSwgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBET00uXG5cdFx0XHRcdHRhcmdldFBhcmVudCA9IGVsZW0ucHJldmlvdXNTaWJsaW5nO1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbSk7XG5cdFx0XHRcdGVsZW0gPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRsZW4gPSB2d0luZm9zLmxlbmd0aDtcblx0XHRcdHdoaWxlIChsZW4tLSkge1xuXHRcdFx0XHR2d0luZm8gPSB2d0luZm9zW2xlbl07XG4vL2lmIChwcmV2SWRzLmluZGV4T2YodndJbmZvLnRva2VuKSA8IDApIHsgLy8gVGhpcyB0b2tlbiBpcyBhIG5ld2x5IGNyZWF0ZWQgdmlldyBvciB0YWcgYmluZGluZ1xuXHRcdFx0XHRiaW5kQ2hhciA9IHZ3SW5mby5jaDtcblx0XHRcdFx0aWYgKGRlZmVyUGF0aCA9IHZ3SW5mby5wYXRoKSB7XG5cdFx0XHRcdFx0Ly8gV2UgaGF2ZSBhICdkZWZlcnJlZCBwYXRoJ1xuXHRcdFx0XHRcdGogPSBkZWZlclBhdGgubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHR3aGlsZSAoZGVmZXJDaGFyID0gZGVmZXJQYXRoLmNoYXJBdChqLS0pKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2UgdGhlIFwiK1wiIGFuZFwiLVwiIGNoYXJhY3RlcnMgdG8gbmF2aWdhdGUgdGhlIHBhdGggYmFjayB0byB0aGUgb3JpZ2luYWwgcGFyZW50IG5vZGUgd2hlcmUgdGhlIGRlZmVycmVkIGJpbmRpbmdzIG9jdXJyZWRcblx0XHRcdFx0XHRcdGlmIChkZWZlckNoYXIgPT09IFwiK1wiKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChkZWZlclBhdGguY2hhckF0KGopID09PSBcIi1cIikge1xuXHRcdFx0XHRcdFx0XHRcdGotLTtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXRQYXJlbnQucHJldmlvdXNTaWJsaW5nO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRhcmdldFBhcmVudCA9IHRhcmdldFBhcmVudC5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXRQYXJlbnQubGFzdENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gTm90ZTogQ2FuIHVzZSBwcmV2aW91c1NpYmxpbmcgYW5kIGxhc3RDaGlsZCwgbm90IHByZXZpb3VzRWxlbWVudFNpYmxpbmcgYW5kIGxhc3RFbGVtZW50Q2hpbGQsXG5cdFx0XHRcdFx0XHQvLyBzaW5jZSB3ZSBoYXZlIHJlbW92ZWQgd2hpdGUgc3BhY2Ugd2l0aGluIGVsQ250LiBIZW5jZSBzdXBwb3J0IElFIDwgOVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYmluZENoYXIgPT09IFwiXlwiKSB7XG5cdFx0XHRcdFx0aWYgKHRhZyA9IGJpbmRpbmdTdG9yZVtpZCA9IHZ3SW5mby5pZF0pIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBiaW5kaW5nIG1heSBoYXZlIGJlZW4gZGVsZXRlZCwgZm9yIGV4YW1wbGUgaW4gYSBkaWZmZXJlbnQgaGFuZGxlciB0byBhbiBhcnJheSBjb2xsZWN0aW9uQ2hhbmdlIGV2ZW50XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgdGFnIGJpbmRpbmdcblx0XHRcdFx0XHRcdGRlZXAgPSB0YXJnZXRQYXJlbnQgJiYgKCFlbGVtIHx8IGVsZW0ucGFyZW50Tm9kZSAhPT0gdGFyZ2V0UGFyZW50KTsgLy8gV2UgYXJlIHN0ZXBwaW5nIGJhY2sgbG9va2luZyBmb3IgdGhlIHJpZ2h0IHRhcmdldFBhcmVudCxcblx0XHRcdFx0XHRcdC8vIG9yIHdlIGFyZSBsaW5raW5nIGV4aXN0aW5nIGNvbnRlbnQgYW5kIHRoaXMgZWxlbWVudCBpcyBpbiBlbENudCwgbm90IGFuIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgdGFyZ2V0UGFyZW50LlxuXHRcdFx0XHRcdFx0aWYgKCFlbGVtIHx8IGRlZXApIHtcblx0XHRcdFx0XHRcdFx0dGFnLnBhcmVudEVsZW0gPSB0YXJnZXRQYXJlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodndJbmZvLmVsQ250ICYmIGRlZXApIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2l0aCBlbGVtZW50IG9ubHkgY29udGVudCwgaWYgdGhlcmUgaXMgbm8gZm9sbG93aW5nIGVsZW1lbnQsIG9yIGlmIHRoZSBiaW5kaW5nIGlzIGRlZXBlciB0aGFuIHRoZSBmb2xsb3dpbmcgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHQvLyB0aGVuIHdlIG5lZWQgdG8gc2V0IHRoZSBvcGVuIG9yIGNsb3NlIHRva2VuIGFzIGEgZGVmZXJyZWQgYmluZGluZyBhbm5vdGF0aW9uIG9uIHRoZSBwYXJlbnRcblx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0UGFyZW50LCAodndJbmZvLm9wZW4gPyBcIiNcIiA6IFwiL1wiKSArIGlkICsgYmluZENoYXIgKyAodGFyZ2V0UGFyZW50Ll9kZiB8fCBcIlwiKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuIG9wZW4gb3IgY2xvc2UgbWFya2VyIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fS4gQWRkIGl0IHRvIGJpbmRFbHMuXG5cdFx0XHRcdFx0XHRhZGRlZEJpbmRFbHMucHVzaChbZGVlcCA/IG51bGwgOiBlbGVtLCB2d0luZm9dKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAodmlldyA9IHZpZXdTdG9yZVtpZCA9IHZ3SW5mby5pZF0pIHtcblx0XHRcdFx0XHQvLyBUaGUgdmlldyBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQsIGZvciBleGFtcGxlIGluIGEgZGlmZmVyZW50IGhhbmRsZXIgdG8gYW4gYXJyYXkgY29sbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0XHRcdGlmICghdmlldy5wYXJlbnRFbGVtKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB2aWV3IGlzIG5vdCBhbHJlYWR5IGV4dGVuZGVkIGZvciBKc1ZpZXdzLCBleHRlbmQgYW5kIGluaXRpYWxpemUgdGhlIHZpZXcgb2JqZWN0IGNyZWF0ZWQgaW4gSnNSZW5kZXIsIGFzIGEgSnNWaWV3cyB2aWV3XG5cdFx0XHRcdFx0XHR2aWV3LnBhcmVudEVsZW0gPSB0YXJnZXRQYXJlbnQgfHwgZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgfHwgcGFyZW50Tm9kZTtcblx0XHRcdFx0XHRcdHZpZXcuXy5vblJlbmRlciA9IGFkZEJpbmRpbmdNYXJrZXJzO1xuXHRcdFx0XHRcdFx0dmlldy5fLm9uQXJyYXlDaGFuZ2UgPSBhcnJheUNoYW5nZUhhbmRsZXI7XG5cdFx0XHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsodmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBhcmVudEVsZW0gPSB2aWV3LnBhcmVudEVsZW07XG5cdFx0XHRcdFx0aWYgKHZ3SW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuICdvcGVuIHZpZXcnIG5vZGUgKHByZWNlZGluZyBzY3JpcHQgbWFya2VyIG5vZGUsXG5cdFx0XHRcdFx0XHQvLyBvciBpZiBlbENudCwgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHZpZXcsIHdpdGggYSBkYXRhLWpzdiBhbm5vdGF0aW9uKSBmb3IgYmluZGluZ1xuXHRcdFx0XHRcdFx0dmlldy5fZWxDbnQgPSB2d0luZm8uZWxDbnQ7XG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0UGFyZW50ICYmICFlbGVtKSB7XG5cdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldFBhcmVudCwgXCIjXCIgKyBpZCArIGJpbmRDaGFyICsgKHRhcmdldFBhcmVudC5fZGYgfHwgXCJcIikpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gTm8gdGFyZ2V0UGFyZW50LCBzbyB0aGVyZSBpcyBhIC5fbnh0IGVsZW0gKGFuZCB0aGlzIGlzIHByb2Nlc3NpbmcgdG9rZW5zIG9uIHRoZSBlbGVtKVxuXHRcdFx0XHRcdFx0XHRpZiAoIXZpZXcuX3Bydikge1xuXHRcdFx0XHRcdFx0XHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIjXCIgKyBpZCArIGJpbmRDaGFyKSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dmlldy5fcHJ2ID0gZWxlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhICdjbG9zZSB2aWV3JyBtYXJrZXIgbm9kZSBmb3IgYmluZGluZ1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFBhcmVudCAmJiAoIWVsZW0gfHwgZWxlbS5wYXJlbnROb2RlICE9PSB0YXJnZXRQYXJlbnQpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRoZXJlIGlzIG5vIC5fbnh0IHNvIGFkZCB0b2tlbiB0byBfZGYuIEl0IGlzIGRlZmVycmVkLlxuXHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRQYXJlbnQsIFwiL1wiICsgaWQgKyBiaW5kQ2hhciArICh0YXJnZXRQYXJlbnQuX2RmIHx8IFwiXCIpKTtcblx0XHRcdFx0XHRcdFx0dmlldy5fbnh0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChlbGVtKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgdmlldyBkaWQgbm90IGhhdmUgYSAuX254dCwgYnV0IGhhcyBvbmUgbm93LCBzbyB0b2tlbiBtYXkgYmUgaW4gX2RmLCBhbmQgbXVzdCBiZSByZW1vdmVkLiAoTm8gbG9uZ2VyIGRlZmVycmVkKVxuXHRcdFx0XHRcdFx0XHRpZiAoIXZpZXcuX254dCkge1xuXHRcdFx0XHRcdFx0XHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIvXCIgKyBpZCArIGJpbmRDaGFyKSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dmlldy5fbnh0ID0gZWxlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChvbkFmdENyID0gdmlldy5jdHggJiYgdmlldy5jdHhbb25BZnRlckNyZWF0ZVN0cl0gfHwgb25BZnRlckNyZWF0ZSkge1xuXHRcdFx0XHRcdFx0XHRvbkFmdENyLmNhbGwodmlldy5jdHgudGFnLCB2aWV3KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG4vL31cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGVuID0gYWRkZWRCaW5kRWxzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChsZW4tLSkge1xuXHRcdFx0XHQvLyBUaGVzZSB3ZXJlIGFkZGVkIGluIHJldmVyc2Ugb3JkZXIgdG8gYWRkZWRCaW5kRWxzLiBXZSBwdXNoIHRoZW0gaW4gQmluZEVscyBpbiB0aGUgY29ycmVjdCBvcmRlci5cblx0XHRcdFx0YmluZEVscy5wdXNoKGFkZGVkQmluZEVsc1tsZW5dKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuICF2d0luZm9zIHx8IHZ3SW5mb3MuZWxDbnQ7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRWaWV3SW5mb3ModndJbmZvcykge1xuXHRcdC8vIFVzZWQgYnkgdmlldy5jaGlsZFRhZ3MoKSBhbmQgdGFnLmNoaWxkVGFncygpXG5cdFx0Ly8gU2ltaWxhciB0byBwcm9jZXNzVmlld0luZm9zIGluIGhvdyBpdCBzdGVwcyB0aHJvdWdoIGJpbmRpbmdzIHRvIGZpbmQgdGFncy4gT25seSBmaW5kcyBkYXRhLWxpbmtlZCB0YWdzLlxuXHRcdHZhciBsZXZlbCwgcGFyZW50VGFnLCBuYW1lZDtcblxuXHRcdGlmICh2d0luZm9zKSB7XG5cdFx0XHRsZW4gPSB2d0luZm9zLmxlbmd0aDtcblx0XHRcdGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuXHRcdFx0XHR2d0luZm8gPSB2d0luZm9zW2pdO1xuXHRcdFx0XHQvLyBUaGlzIGlzIGFuIG9wZW4gbWFya2VyIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fSwgd2l0aGluIHRoZSBjb250ZW50IG9mIHRoZSB0YWcgd2hvc2UgaWQgaXMgZ2V0LmlkLiBBZGQgaXQgdG8gYmluZEVscy5cblx0XHRcdFx0Ly8gTm90ZSAtIGlmIGJpbmRpbmdTdG9yZVt2d0luZm8uaWRdLl9pcyA9PT0gXCJ0YWdcIiB0aGVuIGdldFZpZXdJbmZvcyBpcyBiZWluZyBjYWxsZWQgdG9vIHNvb24gLSBkdXJpbmcgZmlyc3QgbGlua2luZyBwYXNzXG5cdFx0XHRcdHBhcmVudFRhZyA9IHRhZyA9IGJpbmRpbmdTdG9yZVt2d0luZm8uaWRdLmxpbmtDdHgudGFnO1xuXHRcdFx0XHRuYW1lZCA9IHRhZy50YWdOYW1lID09PSB0YWdOYW1lO1xuXHRcdFx0XHRpZiAoIXRhZy5mbG93IHx8IG5hbWVkKSB7XG5cdFx0XHRcdFx0aWYgKCFkZWVwKSB7XG5cdFx0XHRcdFx0XHRsZXZlbCA9IDE7XG5cdFx0XHRcdFx0XHR3aGlsZSAocGFyZW50VGFnID0gcGFyZW50VGFnLnBhcmVudCkge1xuXHRcdFx0XHRcdFx0XHRsZXZlbCsrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGFnRGVwdGggPSB0YWdEZXB0aCB8fCBsZXZlbDsgLy8gVGhlIGxldmVsIG9mIHRoZSBmaXJzdCB0YWcgZW5jb3VudGVyZWQuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICgoZGVlcCB8fCBsZXZlbCA9PT0gdGFnRGVwdGgpICYmICghdGFnTmFtZSB8fCBuYW1lZCkpIHtcblx0XHRcdFx0XHRcdC8vIEZpbHRlciBvbiB0b3AtbGV2ZWwgb3IgdGFnTmFtZSBhcyBhcHByb3ByaWF0ZVxuXHRcdFx0XHRcdFx0dGFncy5wdXNoKHRhZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gZGF0YUxpbmsoKSB7XG5cdFx0Ly89PT09PT09PT09PT09PT09IERhdGEtbGluayBhbmQgZml4dXAgb2YgZGF0YS1qc3YgYW5ub3RhdGlvbnMgPT09PT09PT09PT09PT09PVxuXHRcdHZhciBqLCBpbmRleCxcblx0XHRcdHRva2VucyA9IFwiXCIsXG5cdFx0XHR3cmFwID0ge30sXG5cdFx0XHRzZWxlY3RvciA9IGxpbmtWaWV3c1NlbCArIChnZXQgPyBcIixbXCIgKyBkZWZlckF0dHIgKyBcIl1cIiA6IFwiXCIpO1xuXHRcdFx0Ly8gSWYgYSBjaGlsZFRhZ3MoKSBjYWxsLCBnZXQgPSBcIixbXCIgKyBkZWZlckF0dHIgKyBcIl1cIiAtIHNpbmNlIHdlIG5lZWQgdG8gaW5jbHVkZSBlbGVtZW50cyB0aGF0IGhhdmUgYSAuX2RmIGV4cGFuZG8gZm9yIGRlZmVycmVkIHRva2Vuc1xuXG5cdFx0ZWxlbXMgPSBxc2EgPyBwYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpIDogJChzZWxlY3RvciwgcGFyZW50Tm9kZSkuZ2V0KCk7XG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdC8vIFRoZSBwcmV2Tm9kZSB3aWxsIGJlIGluIHRoZSByZXR1cm5lZCBxdWVyeSwgc2luY2Ugd2UgY2FsbGVkIG1hcmtQcmV2T3JOZXh0Tm9kZSgpIG9uIGl0LlxuXHRcdC8vIEJ1dCBpdCBtYXkgaGF2ZSBjb250YWluZWQgbm9kZXMgdGhhdCBzYXRpc2Z5IHRoZSBzZWxlY3RvciBhbHNvLlxuXHRcdGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5pbm5lckhUTUwpIHtcblx0XHRcdC8vIEZpbmQgdGhlIGxhc3QgY29udGFpbmVkIG5vZGUgb2YgcHJldk5vZGUsIHRvIHVzZSBhcyB0aGUgcHJldk5vZGUgLSBzbyB3ZSBvbmx5IGxpbmsgc3Vic2VxdWVudCBlbGVtcyBpbiB0aGUgcXVlcnlcblx0XHRcdHByZXZOb2RlcyA9IHFzYSA/IHByZXZOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpIDogJChzZWxlY3RvciwgcHJldk5vZGUpLmdldCgpO1xuXHRcdFx0cHJldk5vZGUgPSBwcmV2Tm9kZXMubGVuZ3RoID8gcHJldk5vZGVzW3ByZXZOb2Rlcy5sZW5ndGggLSAxXSA6IHByZXZOb2RlO1xuXHRcdH1cblxuXHRcdHRhZ0RlcHRoID0gMDtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRlbGVtID0gZWxlbXNbaV07XG5cdFx0XHRpZiAocHJldk5vZGUgJiYgIWZvdW5kKSB7XG5cdFx0XHRcdC8vIElmIHByZXZOb2RlIGlzIHNldCwgbm90IGZhbHNlLCBza2lwIGxpbmtpbmcuIElmIHRoaXMgZWxlbWVudCBpcyB0aGUgcHJldk5vZGUsIHNldCB0byBmYWxzZSBzbyBzdWJzZXF1ZW50IGVsZW1lbnRzIHdpbGwgbGluay5cblx0XHRcdFx0Zm91bmQgPSAoZWxlbSA9PT0gcHJldk5vZGUpO1xuXHRcdFx0fSBlbHNlIGlmIChuZXh0Tm9kZSAmJiBlbGVtID09PSBuZXh0Tm9kZSkge1xuXHRcdFx0XHQvLyBJZiBuZXh0Tm9kZSBpcyBzZXQgdGhlbiBicmVhayB3aGVuIHdlIGdldCB0byBuZXh0Tm9kZVxuXHRcdFx0XHRpZiAoZ2V0KSB7XG5cdFx0XHRcdFx0dG9rZW5zICs9IG1hcmtlck5vZGVJbmZvKGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fSBlbHNlIGlmIChlbGVtLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0Ly8gZWxlbSBoYXMgbm90IGJlZW4gcmVtb3ZlZCBmcm9tIERPTVxuXHRcdFx0XHRpZiAoZ2V0KSB7XG5cdFx0XHRcdFx0dG9rZW5zICs9IG1hcmtlck5vZGVJbmZvKGVsZW0pO1xuXHRcdFx0XHRcdGlmIChlbGVtLl9kZikge1xuXHRcdFx0XHRcdFx0aiA9IGkgKyAxO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGogPCBsICYmIGVsZW0uY29udGFpbnMoZWxlbXNbal0pKSB7XG5cdFx0XHRcdFx0XHRcdGorKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIEFkZCBkZWZlcmVkIHRva2VucyBhZnRlciBhbnkgdG9rZW5zIG9uIGRlc2NlbmRhbnQgZWxlbWVudHMgb2YgdGhpcyBvbmVcblx0XHRcdFx0XHRcdHdyYXBbai0xXSA9IGVsZW0uX2RmO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAod3JhcFtpXSkge1xuXHRcdFx0XHRcdFx0dG9rZW5zICs9IHdyYXBbaV0gfHwgXCJcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGlzTGluayAmJiAodndJbmZvID0gdmlld0luZm9zKGVsZW0sIHVuZGVmaW5lZCwgclZpZXdNYXJrZXJzKSkgJiYgKHZ3SW5mbyA9IHZ3SW5mb1swXSkpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoaXMgaXMgYSBsaW5rKHRydWVPclN0cmluZyAuLi4pIGNhbGwgd2Ugd2lsbCBhdm9pZCByZS1iaW5kaW5nIHRvIGVsZW1zIHRoYXQgYXJlIHdpdGhpbiB0ZW1wbGF0ZS1yZW5kZXJlZCB2aWV3c1xuXHRcdFx0XHRcdFx0c2tpcCA9IHNraXAgPyAodndJbmZvLmlkICE9PSBza2lwICYmIHNraXApIDogdndJbmZvLm9wZW4gJiYgdndJbmZvLmlkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXNraXAgJiYgcHJvY2Vzc0luZm9zKHZpZXdJbmZvcyhlbGVtKSlcblx0XHRcdFx0XHRcdC8vIElmIGEgbGluaygpIGNhbGwsIHByb2Nlc3NWaWV3SW5mb3MoKSBhZGRzIGJpbmRpbmdzIHRvIGJpbmRFbHMsIGFuZCByZXR1cm5zIHRydWUgZm9yIG5vbi1zY3JpcHQgbm9kZXMsIGZvciBhZGRpbmcgZGF0YS1saW5rIGJpbmRpbmdzXG5cdFx0XHRcdFx0XHQvLyBJZiBhIGNoaWxkVGFncygpIGNhbGwsIGdldFZpZXdJbmZvcyByZXR1cm5zIGFycmF5IG9mIHRhZyBiaW5kaW5ncy5cblx0XHRcdFx0XHRcdFx0JiYgZWxlbS5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpKSB7XG5cdFx0XHRcdFx0XHRiaW5kRWxzLnB1c2goW2VsZW1dKTsgLy8gQSBkYXRhLWxpbmtlZCBlbGVtZW50IHNvIGFkZCB0byBiaW5kRWxzIHRvb1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXQpIHtcblx0XHRcdHRva2VucyArPSBwYXJlbnROb2RlLl9kZiB8fCBcIlwiO1xuXHRcdFx0aWYgKGluZGV4ID0gdG9rZW5zLmluZGV4T2YoXCIjXCIgKyBnZXQuaWQpICsgMSkge1xuXHRcdFx0XHQvLyBXZSBhcmUgbG9va2luZyBmb3Igdmlldy5jaGlsZFRhZ3MoKSBvciB0YWcuY2hpbGRUYWdzKCkgLSBzbyBzdGFydCBhZnRlciB0aGUgb3BlbiB0b2tlbiBvZiB0aGUgcGFyZW50IHZpZXcgb3IgdGFnLlxuXHRcdFx0XHR0b2tlbnMgPSB0b2tlbnMuc2xpY2UoaW5kZXggKyBnZXQuaWQubGVuZ3RoKTtcblx0XHRcdH1cblx0XHRcdGluZGV4ID0gdG9rZW5zLmluZGV4T2YoXCIvXCIgKyBnZXQuaWQpO1xuXHRcdFx0aWYgKGluZGV4ICsgMSkge1xuXHRcdFx0XHQvLyBXZSBhcmUgbG9va2luZyBmb3Igdmlldy5jaGlsZFRhZ3MoKSBvciB0YWcuY2hpbGRUYWdzKCkgLSBzbyBkb24ndCBsb29rIGJleW9uZCB0aGUgY2xvc2UgdG9rZW4gb2YgdGhlIHBhcmVudCB2aWV3IG9yIHRhZy5cblx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKDAsIGluZGV4KTtcblx0XHRcdH1cblx0XHRcdC8vIENhbGwgZ2V0Vmlld0luZm9zIHRvIGFkZCB0aGUgZm91bmQgY2hpbGRUYWdzIHRvIHRoZSB0YWdzIGFycmF5XG5cdFx0XHRnZXRWaWV3SW5mb3Modmlld0luZm9zKHRva2VucywgdW5kZWZpbmVkLCByT3BlblRhZ01hcmtlcnMpKTtcblx0XHR9XG5cblx0XHRpZiAoaHRtbCA9PT0gdW5kZWZpbmVkICYmIHBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0YmluZEVscy5wdXNoKFtwYXJlbnROb2RlXSk7IC8vIFN1cHBvcnQgZGF0YS1saW5raW5nIHRvcC1sZXZlbCBlbGVtZW50IGRpcmVjdGx5IChub3Qgd2l0aGluIGEgZGF0YS1saW5rZWQgY29udGFpbmVyKVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0ZW1wb3JhcnkgbWFya2VyIHNjcmlwdCBub2RlcyB0aGV5IHdlcmUgYWRkZWQgYnkgbWFya1ByZXZPck5leHROb2RlXG5cdFx0dW5tYXJrUHJldk9yTmV4dE5vZGUocHJldk5vZGUsIGVsQ250KTtcblx0XHR1bm1hcmtQcmV2T3JOZXh0Tm9kZShuZXh0Tm9kZSwgZWxDbnQpO1xuXG5cdFx0aWYgKGdldCkge1xuXHRcdFx0aWYgKGxhenlMaW5rKSB7XG5cdFx0XHRcdGxhenlMaW5rLnJlc29sdmUoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjsgLy8gV2UgaGF2ZSBhZGRlZCBjaGlsZFRhZ3MgdG8gdGhlIHRhZ3MgYXJyYXksIHNvIHdlIGFyZSBkb25lXG5cdFx0fVxuXG5cdFx0aWYgKGVsQ250ICYmIGRlZmVyICsgaWRzKSB7XG5cdFx0XHQvLyBUaGVyZSBhcmUgc29tZSB2aWV3cyB3aXRoIGVsQ250LCBmb3Igd2hpY2ggdGhlIG9wZW4gb3IgY2xvc2UgZGlkIG5vdCBwcmVjZWRlIGFueSBIVE1MIHRhZyAtIHNvIHRoZXkgaGF2ZSBub3QgYmVlbiBwcm9jZXNzZWQgeWV0XG5cdFx0XHRlbGVtID0gbmV4dE5vZGU7XG5cdFx0XHRpZiAoZGVmZXIpIHtcblx0XHRcdFx0aWYgKG5leHROb2RlKSB7XG5cdFx0XHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoZGVmZXIgKyBcIitcIiwgdHJ1ZSksIG5leHROb2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwcm9jZXNzVmlld0luZm9zKHZpZXdJbmZvcyhkZWZlciwgdHJ1ZSksIHBhcmVudE5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwcm9jZXNzVmlld0luZm9zKHZpZXdJbmZvcyhpZHMsIHRydWUpLCBwYXJlbnROb2RlKTtcblx0XHRcdC8vIElmIHRoZXJlIHdlcmUgYW55IHRva2VucyBvbiBuZXh0Tm9kZSB3aGljaCBoYXZlIG5vdyBiZWVuIGFzc29jaWF0ZWQgd2l0aCBpbnNlcnRlZCBIVE1MIHRhZ3MsIHJlbW92ZSB0aGVtIGZyb20gbmV4dE5vZGVcblx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHR0b2tlbnMgPSBuZXh0Tm9kZS5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cik7XG5cdFx0XHRcdGlmIChsID0gdG9rZW5zLmluZGV4T2YocHJldklkcykgKyAxKSB7XG5cdFx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKGwgKyBwcmV2SWRzLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5leHROb2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCBpZHMgKyB0b2tlbnMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vPT09PT09PT09PT09PT09PSBCaW5kIHRoZSBkYXRhLWxpbmtlZCBlbGVtZW50cyBhbmQgdGFncyA9PT09PT09PT09PT09PT09XG5cdFx0bCA9IGJpbmRFbHMubGVuZ3RoO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdGVsZW0gPSBiaW5kRWxzW2ldO1xuXHRcdFx0bGlua0luZm8gPSBlbGVtWzFdO1xuXHRcdFx0ZWxlbSA9IGVsZW1bMF07XG5cdFx0XHRpZiAobGlua0luZm8pIHtcblx0XHRcdFx0aWYgKHRhZyA9IGJpbmRpbmdTdG9yZVtsaW5rSW5mby5pZF0pIHtcblx0XHRcdFx0XHRpZiAobGlua0N0eCA9IHRhZy5saW5rQ3R4KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgdGFnIG1heSBoYXZlIGJlZW4gc3RvcmVkIHRlbXBvcmFyaWx5IG9uIHRoZSBiaW5kaW5nU3RvcmUgLSBvciBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVwbGFjZWQgYnkgdGhlIGFjdHVhbCBiaW5kaW5nXG5cdFx0XHRcdFx0XHR0YWcgPSBsaW5rQ3R4LnRhZztcblx0XHRcdFx0XHRcdHRhZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGxpbmtJbmZvLm9wZW4pIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYW4gJ29wZW4gbGlua2VkIHRhZycgYmluZGluZyBhbm5vdGF0aW9uIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fVxuXHRcdFx0XHRcdFx0aWYgKGVsZW0pIHtcblx0XHRcdFx0XHRcdFx0dGFnLnBhcmVudEVsZW0gPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHRcdHRhZy5fcHJ2ID0gZWxlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRhZy5fZWxDbnQgPSBsaW5rSW5mby5lbENudDtcblx0XHRcdFx0XHRcdC8vIFdlIGRhdGEtbGluayBkZXB0aC1maXJzdCAoXCJvbiB0aGUgd2F5IGluXCIpLCB3aGljaCBpcyBiZXR0ZXIgZm9yIHBlcmYgLSBhbmQgYWxsb3dzIHNldHRpbmcgcGFyZW50IHRhZ3MgZXRjLlxuXHRcdFx0XHRcdFx0dmlldyA9IHRhZy50YWdDdHgudmlldztcblx0XHRcdFx0XHRcdGFkZERhdGFCaW5kaW5nKHVuZGVmaW5lZCwgdGFnLl9wcnYsIHZpZXcsIGxpbmtJbmZvLmlkKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGFnLl9ueHQgPSBlbGVtO1xuXHRcdFx0XHRcdFx0aWYgKHRhZy5fLnVubGlua2VkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSAnY2xvc2UgbGlua2VkIHRhZycgYmluZGluZyBhbm5vdGF0aW9uXG5cdFx0XHRcdFx0XHRcdC8vIEFkZCBkYXRhIGJpbmRpbmdcblx0XHRcdFx0XHRcdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eDtcblx0XHRcdFx0XHRcdFx0dmlldyA9IHRhZ0N0eC52aWV3O1xuXHRcdFx0XHRcdFx0XHRjYWxsQWZ0ZXJMaW5rKHRhZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBZGQgZGF0YSBiaW5kaW5nIGZvciBhIGRhdGEtbGlua2VkIGVsZW1lbnQgKHdpdGggZGF0YS1saW5rIGF0dHJpYnV0ZSlcblx0XHRcdFx0YWRkRGF0YUJpbmRpbmcoZWxlbS5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpLCBlbGVtLCAkdmlldyhlbGVtKSwgdW5kZWZpbmVkLCBpc0xpbmssIG91dGVyRGF0YSwgY29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChsYXp5TGluaykge1xuXHRcdFx0bGF6eUxpbmsucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXHQvLz09PT0gL2VuZCBvZiBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblxuXHR2YXIgaW5UYWcsIGxpbmtDdHgsIHRhZywgaSwgbCwgaiwgbGVuLCBlbGVtcywgZWxlbSwgdmlldywgdndJbmZvLCBsaW5rSW5mbywgcHJldk5vZGVzLCB0b2tlbiwgcHJldlZpZXcsIG5leHRWaWV3LFxuXHRcdG5vZGUsIHRhZ3MsIGRlZXAsIHRhZ05hbWUsIHRhZ0N0eCwgdmFsaWRhdGUsIHRhZ0RlcHRoLCBkZXB0aCwgZnJhZ21lbnQsIGNvcGllZE5vZGUsIGZpcnN0VGFnLCBwYXJlbnRUYWcsXG5cdFx0aXNWb2lkLCB3cmFwcGVyLCBkaXYsIHRva2VucywgZWxDbnQsIHByZXZFbENudCwgaHRtbFRhZywgaWRzLCBwcmV2SWRzLCBmb3VuZCwgc2tpcCwgbGF6eUxpbmssIGlzTGluaywgZ2V0LFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdHRoaXNJZCA9IHNlbGYuXy5pZCArIFwiX1wiLFxuXHRcdGRlZmVyID0gXCJcIixcblx0XHQvLyBUaGUgbWFya2VyIGlkcyBmb3Igd2hpY2ggbm8gdGFnIHdhcyBlbmNvdW50ZXJlZCAoZW1wdHkgdmlld3Mgb3IgZmluYWwgY2xvc2luZyBtYXJrZXJzKSB3aGljaCB3ZSBjYXJyeSBvdmVyIHRvIGNvbnRhaW5lciB0YWdcblx0XHRiaW5kRWxzID0gW10sXG5cdFx0dGFnU3RhY2sgPSBbXSxcblx0XHRkZWZlclN0YWNrID0gW10sXG5cdFx0b25BZnRlckNyZWF0ZSA9IHNlbGYuaGxwKG9uQWZ0ZXJDcmVhdGVTdHIpLFxuXHRcdHByb2Nlc3NJbmZvcyA9IHByb2Nlc3NWaWV3SW5mb3M7XG5cblx0aWYgKHJlZnJlc2gpIHtcblx0XHRsYXp5TGluayA9IHJlZnJlc2gubGF6eUxpbmsgJiYgJC5EZWZlcnJlZCgpO1xuXHRcdGlmIChyZWZyZXNoLnRtcGwpIHtcblx0XHRcdC8vIHJlZnJlc2ggaXMgdGhlIHByZXZWaWV3LCBwYXNzZWQgaW4gZnJvbSBhZGRWaWV3cygpXG5cdFx0XHRwcmV2VmlldyA9IFwiL1wiICsgcmVmcmVzaC5fLmlkICsgXCJfXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlzTGluayA9IHJlZnJlc2gubG5rOyAvLyBUb3AtbGV2ZWwgbGlua2luZ1xuXHRcdFx0aWYgKHJlZnJlc2gudGFnKSB7XG5cdFx0XHRcdHRoaXNJZCA9IHJlZnJlc2gudGFnICsgXCJeXCI7XG5cdFx0XHRcdHJlZnJlc2ggPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGdldCA9IHJlZnJlc2guZ2V0KSB7XG5cdFx0XHRcdHByb2Nlc3NJbmZvcyA9IGdldFZpZXdJbmZvcztcblx0XHRcdFx0dGFncyA9IGdldC50YWdzO1xuXHRcdFx0XHRkZWVwID0gZ2V0LmRlZXA7XG5cdFx0XHRcdHRhZ05hbWUgPSBnZXQubmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVmcmVzaCA9IHJlZnJlc2ggPT09IHRydWU7XG5cdH1cblxuXHRwYXJlbnROb2RlID0gcGFyZW50Tm9kZVxuXHRcdD8gKFwiXCIgKyBwYXJlbnROb2RlID09PSBwYXJlbnROb2RlXG5cdFx0XHQ/ICQocGFyZW50Tm9kZSlbMF0gIC8vIEl0IGlzIGEgc3RyaW5nLCBzbyB0cmVhdCBhcyBzZWxlY3RvclxuXHRcdFx0OiBwYXJlbnROb2RlLmpxdWVyeVxuXHRcdFx0XHQ/IHBhcmVudE5vZGVbMF0gLy8gQSBqUXVlcnkgb2JqZWN0IC0gdGFrZSBmaXJzdCBlbGVtZW50LlxuXHRcdFx0XHQ6IHBhcmVudE5vZGUpXG5cdFx0OiAoc2VsZi5wYXJlbnRFbGVtICAgICAgLy8gdmlldy5saW5rKClcblx0XHRcdHx8IGRvY3VtZW50LmJvZHkpOyAgLy8gbGluayhudWxsLCBkYXRhKSB0byBsaW5rIHRoZSB3aG9sZSBkb2N1bWVudFxuXG5cdHZhbGlkYXRlID0gISRzdWJTZXR0aW5nc0FkdmFuY2VkLm5vVmFsaWRhdGUgJiYgcGFyZW50Tm9kZS5jb250ZW50RWRpdGFibGUgIT09IFRSVUU7XG5cdHBhcmVudFRhZyA9IHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRlbENudCA9ICEhZWxDb250ZW50W3BhcmVudFRhZ107XG5cblx0cHJldk5vZGUgPSBwcmV2Tm9kZSAmJiBtYXJrUHJldk9yTmV4dE5vZGUocHJldk5vZGUsIGVsQ250KTtcblx0bmV4dE5vZGUgPSBuZXh0Tm9kZSAmJiBtYXJrUHJldk9yTmV4dE5vZGUobmV4dE5vZGUsIGVsQ250KSB8fCBudWxsO1xuXG5cdGlmIChodG1sICE9IHVuZGVmaW5lZCkge1xuXHRcdC8vPT09PT09PT09PT09PT09PSBJbnNlcnQgaHRtbCBpbnRvIERPTSB1c2luZyBkb2N1bWVudEZyYWdtZW50cyAoYW5kIHdyYXBwaW5nIEhUTUwgYXBwcm9wcmlhdGVseSkuID09PT09PT09PT09PT09PT1cblx0XHQvLyBBbHNvIGNvbnZlcnQgbWFya2VycyB0byBET00gYW5ub3RhdGlvbnMsIGJhc2VkIG9uIGNvbnRlbnQgbW9kZWwuXG5cdFx0Ly8gQ29ycmVzcG9uZHMgdG8gbmV4dE5vZGUgPyAkKG5leHROb2RlKS5iZWZvcmUoaHRtbCkgOiAkKHBhcmVudE5vZGUpLmh0bWwoaHRtbCk7XG5cdFx0Ly8gYnV0IGFsbG93cyBpbnNlcnRpb24gdG8gd3JhcCBjb3JyZWN0bHkgZXZlbiB3aXRoIGluc2VydGVkIHNjcmlwdCBub2Rlcy4galF1ZXJ5IHZlcnNpb24gd2lsbCBmYWlsIGUuZy4gdW5kZXIgdGJvZHkgb3Igc2VsZWN0LlxuXHRcdC8vIFRoaXMgdmVyc2lvbiBzaG91bGQgYWxzbyBiZSBzbGlnaHRseSBmYXN0ZXJcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHdyYXBwZXIgPSBkaXY7XG5cdFx0cHJldklkcyA9IGlkcyA9IFwiXCI7XG5cdFx0aHRtbFRhZyA9IHBhcmVudE5vZGUubmFtZXNwYWNlVVJJID09PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgPyBcInN2Z19uc1wiIDogKGZpcnN0VGFnID0gckZpcnN0RWxlbS5leGVjKGh0bWwpKSAmJiBmaXJzdFRhZ1sxXSB8fCBcIlwiO1xuXHRcdGlmIChlbENudCkge1xuXHRcdFx0Ly8gTm93IGxvb2sgZm9yIGZvbGxvd2luZyB2aWV3LCBhbmQgZmluZCBpdHMgdG9rZW5zLCBvciBpZiBub3QgZm91bmQsIGdldCB0aGUgcGFyZW50Tm9kZS5fZGYgdG9rZW5zXG5cdFx0XHRub2RlID0gbmV4dE5vZGU7XG5cdFx0XHR3aGlsZSAobm9kZSAmJiAhKG5leHRWaWV3ID0gdmlld0luZm9zKG5vZGUpKSkge1xuXHRcdFx0XHRub2RlID0gbm9kZS5uZXh0U2libGluZztcblx0XHRcdH1cblx0XHRcdGlmICh0b2tlbnMgPSBuZXh0VmlldyA/IG5leHRWaWV3Ll90a25zIDogcGFyZW50Tm9kZS5fZGYpIHtcblx0XHRcdFx0dG9rZW4gPSBwcmV2VmlldyB8fCBcIlwiO1xuXHRcdFx0XHRpZiAocmVmcmVzaCB8fCAhcHJldlZpZXcpIHtcblx0XHRcdFx0XHR0b2tlbiArPSBcIiNcIiArIHRoaXNJZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRqID0gdG9rZW5zLmluZGV4T2YodG9rZW4pO1xuXHRcdFx0XHRpZiAoaiArIDEpIHtcblx0XHRcdFx0XHRqICs9IHRva2VuLmxlbmd0aDtcblx0XHRcdFx0XHQvLyBUcmFuc2ZlciB0aGUgaW5pdGlhbCB0b2tlbnMgdG8gaW5zZXJ0ZWQgbm9kZXMsIGJ5IHNldHRpbmcgdGhlbSBhcyB0aGUgaWRzIHZhcmlhYmxlLCBwaWNrZWQgdXAgaW4gY29udmVydE1hcmtlcnNcblx0XHRcdFx0XHRwcmV2SWRzID0gaWRzID0gdG9rZW5zLnNsaWNlKDAsIGopO1xuXHRcdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZShqKTtcblx0XHRcdFx0XHRpZiAobmV4dFZpZXcpIHtcblx0XHRcdFx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKGpzdkF0dHJTdHIsIHRva2Vucyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNldERlZmVyKHBhcmVudE5vZGUsIHRva2Vucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly89PT09PT09PT09PT09PT09IENvbnZlcnQgdGhlIG1hcmtlcnMgdG8gRE9NIGFubm90YXRpb25zLCBiYXNlZCBvbiBjb250ZW50IG1vZGVsLiA9PT09PT09PT09PT09PT09XG4vL1x0XHRcdG9sZEVsQ250ID0gZWxDbnQ7XG5cdFx0aXNWb2lkID0gdW5kZWZpbmVkO1xuXHRcdGh0bWwgPSAoXCJcIiArIGh0bWwpLnJlcGxhY2UockNvbnZlcnRNYXJrZXJzLCBjb252ZXJ0TWFya2Vycyk7XG4vL1x0XHRcdGlmICghIW9sZEVsQ250ICE9PSAhIWVsQ250KSB7XG4vL1x0XHRcdFx0ZXJyb3IoXCJQYXJzZTogXCIgKyBodG1sKTsgLy8gUGFyc2UgZXJyb3IuIENvbnRlbnQgbm90IHdlbGwtZm9ybWVkP1xuLy9cdFx0XHR9XG5cdFx0aWYgKHZhbGlkYXRlICYmIHRhZ1N0YWNrLmxlbmd0aCkge1xuXHRcdFx0c3ludGF4RXJyb3IoXCJNaXNtYXRjaGVkICc8XCIgKyBwYXJlbnRUYWcgKyBcIi4uLj4nIGluOlxcblwiICsgaHRtbCk7IC8vIFVubWF0Y2hlZCB0YWdcblx0XHR9XG5cdFx0aWYgKHZhbGlkYXRlT25seSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBBcHBlbmQgd3JhcHBlciBlbGVtZW50IHRvIGRvYyBmcmFnbWVudFxuXHRcdHNhZmVGcmFnbWVudC5hcHBlbmRDaGlsZChkaXYpO1xuXG5cdFx0Ly8gR28gdG8gaHRtbCBhbmQgYmFjaywgdGhlbiBwZWVsIG9mZiBleHRyYSB3cmFwcGVyc1xuXHRcdC8vIENvcnJlc3BvbmRzIHRvIGpRdWVyeSAkKG5leHROb2RlKS5iZWZvcmUoaHRtbCkgb3IgJChwYXJlbnROb2RlKS5odG1sKGh0bWwpO1xuXHRcdC8vIGJ1dCBzdXBwb3J0cyBzdmcgZWxlbWVudHMsIGFuZCBvdGhlciBmZWF0dXJlcyBtaXNzaW5nIGZyb20galF1ZXJ5IHZlcnNpb24gKGFuZCB0aGlzIHZlcnNpb24gc2hvdWxkIGFsc28gYmUgc2xpZ2h0bHkgZmFzdGVyKVxuXHRcdGh0bWxUYWcgPSB3cmFwTWFwW2h0bWxUYWddIHx8IHdyYXBNYXAuZGl2O1xuXHRcdGRlcHRoID0gaHRtbFRhZ1swXTtcblx0XHR3cmFwcGVyLmlubmVySFRNTCA9IGh0bWxUYWdbMV0gKyBodG1sICsgaHRtbFRhZ1syXTtcblx0XHR3aGlsZSAoZGVwdGgtLSkge1xuXHRcdFx0d3JhcHBlciA9IHdyYXBwZXIubGFzdENoaWxkO1xuXHRcdH1cblx0XHRzYWZlRnJhZ21lbnQucmVtb3ZlQ2hpbGQoZGl2KTtcblx0XHRmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblx0XHR3aGlsZSAoY29waWVkTm9kZSA9IHdyYXBwZXIuZmlyc3RDaGlsZCkge1xuXHRcdFx0ZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY29waWVkTm9kZSk7XG5cdFx0fVxuXHRcdC8vIEluc2VydCBpbnRvIHRoZSBET01cblx0XHRwYXJlbnROb2RlLmluc2VydEJlZm9yZShmcmFnbWVudCwgbmV4dE5vZGUpO1xuXHR9XG5cblx0aWYgKGxhenlMaW5rKSB7XG5cdFx0c2V0VGltZW91dChkYXRhTGluaywgMCk7XG5cdH0gZWxzZSB7XG5cdFx0ZGF0YUxpbmsoKTtcblx0fVxuXG5cdHJldHVybiBsYXp5TGluayAmJiBsYXp5TGluay5wcm9taXNlKCk7XG59XG5cbmZ1bmN0aW9uIGFkZERhdGFCaW5kaW5nKGxpbmtNYXJrdXAsIG5vZGUsIGN1cnJlbnRWaWV3LCBib3VuZFRhZ0lkLCBpc0xpbmssIGRhdGEsIGNvbnRleHQpIHtcblx0Ly8gQWRkIGRhdGEgYmluZGluZyBmb3IgZGF0YS1saW5rZWQgZWxlbWVudHMgb3Ige157Li4ufX0gZGF0YS1saW5rZWQgdGFnc1xuXHR2YXIgdG1wbCwgdG9rZW5zLCBhdHRyLCBjb252ZXJ0QmFjaywgdGFnRXhwciwgbGlua0ZuLCBsaW5rQ3R4LCB0YWcsIHJUYWdJbmRleCwgaGFzRWxzZSwgbGFzdEluZGV4LFxuXHRcdGxpbmtFeHByZXNzaW9ucyA9IFtdO1xuXG5cdGlmIChib3VuZFRhZ0lkKSB7XG5cdFx0Ly8gYm91bmRUYWdJZCBpcyBhIHN0cmluZyBmb3Ige157Li4ufX0gZGF0YS1saW5rZWQgdGFnLiBTbyBvbmx5IG9uZSBsaW5rVGFnIGluIGxpbmtNYXJrdXBcblx0XHQvLyBkYXRhIGFuZCBjb250ZXh0IHBhcmFtZXRlcnMgYXJlIHVuZGVmaW5lZFxuXHRcdHRhZyA9IGJpbmRpbmdTdG9yZVtib3VuZFRhZ0lkXTtcblx0XHR0YWcgPSB0YWcubGlua0N0eCA/IHRhZy5saW5rQ3R4LnRhZyA6IHRhZztcblxuXHRcdGxpbmtDdHggPSB0YWcubGlua0N0eCB8fCB7XG5cdFx0XHR0eXBlOiBcImlubGluZVwiLFxuXHRcdFx0ZGF0YTogY3VycmVudFZpZXcuZGF0YSwgICAgICAgICAgICAgICAgICAgLy8gc291cmNlXG5cdFx0XHRlbGVtOiB0YWcuX2VsQ250ID8gdGFnLnBhcmVudEVsZW0gOiBub2RlLCAvLyB0YXJnZXRcblx0XHRcdHZpZXc6IGN1cnJlbnRWaWV3LFxuXHRcdFx0Y3R4OiBjdXJyZW50Vmlldy5jdHgsXG5cdFx0XHRhdHRyOiBIVE1MLCAvLyBTY3JpcHQgbWFya2VyIG5vZGVzIGFyZSBhc3NvY2lhdGVkIHdpdGgge157IGFuZCBhbHdheXMgdGFyZ2V0IEhUTUwuXG5cdFx0XHRmbjogdGFnLl8uYm5kLFxuXHRcdFx0dGFnOiB0YWcsXG5cdFx0XHQvLyBQYXNzIHRoZSBib3VuZFRhZ0lkIGluIHRoZSBsaW5rQ3R4LCBzbyB0aGF0IGl0IGNhbiBiZSBwaWNrZWQgdXAgaW4gb2JzZXJ2ZUFuZEJpbmRcblx0XHRcdF9ibmRJZDogYm91bmRUYWdJZFxuXHRcdH07XG5cdFx0YmluZERhdGFMaW5rVGFyZ2V0KGxpbmtDdHgsIGxpbmtDdHguZm4pO1xuXHR9IGVsc2UgaWYgKGxpbmtNYXJrdXAgJiYgbm9kZSkge1xuXHRcdC8vIElmIGlzTGluayB0aGVuIHRoaXMgaXMgYSB0b3AtbGV2ZWwgbGlua2luZzogLmxpbmsoZXhwcmVzc2lvbiwgdGFyZ2V0LCBkYXRhLCAuLi4uKSBvclxuXHRcdC8vIC5saW5rKHRydWUsIHRhcmdldCwgZGF0YSwgLi4uLikgc2NlbmFyaW8gLSBhbmQgZGF0YSBhbmQgY29udGV4dCBhcmUgcGFzc2VkIGluIHNlcGFyYXRlbHkgZnJvbSB0aGUgdmlld1xuXHRcdGRhdGEgPSBpc0xpbmsgPyBkYXRhIDogY3VycmVudFZpZXcuZGF0YTtcblxuXHRcdC8vIENvbXBpbGVkIGxpbmtGbiBleHByZXNzaW9ucyBjb3VsZCBiZSBzdG9yZWQgaW4gdGhlIHRtcGwubGlua3MgYXJyYXkgb2YgdGhlIHRlbXBsYXRlXG5cdFx0Ly8gVE9ETyAtIGNvbnNpZGVyIGFsc28gY2FjaGluZyBnbG9iYWxseSBzbyB0aGF0IGlmIHt7OmZvb319IG9yIGRhdGEtbGluaz1cImZvb1wiIG9jY3VycyBpbiBkaWZmZXJlbnQgcGxhY2VzLFxuXHRcdC8vIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmb3IgdGhpcyBpcyBjYWNoZWQgYW5kIG9ubHkgY29tcGlsZWQgb25jZS4uLlxuXHRcdC8vbGlua3MgPSBjdXJyZW50Vmlldy5saW5rcyB8fCBjdXJyZW50Vmlldy50bXBsLmxpbmtzO1xuXG5cdFx0dG1wbCA9IGN1cnJlbnRWaWV3LnRtcGw7XG5cbi8vXHRcdFx0aWYgKCEobGlua1RhZ3MgPSBsaW5rc1tsaW5rTWFya3VwXSkpIHtcblx0XHQvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoaXMgdmlldyB0ZW1wbGF0ZSBoYXMgYmVlbiBsaW5rZWQsIHNvIHdlIGNvbXBpbGUgdGhlIGRhdGEtbGluayBleHByZXNzaW9ucywgYW5kIHN0b3JlIHRoZW0gb24gdGhlIHRlbXBsYXRlLlxuXG5cdFx0bGlua01hcmt1cCA9IG5vcm1hbGl6ZUxpbmtUYWcobGlua01hcmt1cCwgZGVmYXVsdEF0dHIobm9kZSkpO1xuXHRcdGxhc3RJbmRleCA9IHJUYWdEYXRhbGluay5sYXN0SW5kZXggPSAwO1xuXHRcdHdoaWxlICh0b2tlbnMgPSByVGFnRGF0YWxpbmsuZXhlYyhsaW5rTWFya3VwKSkgeyAvLyBUT0RPIHJlcXVpcmUgfSB0byBiZSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICQsIGFuZCByZW1vdmUgdGhlIFxcfSghXFx9KSBvcHRpb24uXG5cdFx0XHRsaW5rRXhwcmVzc2lvbnMucHVzaCh0b2tlbnMpO1xuXHRcdFx0bGFzdEluZGV4ID0gclRhZ0RhdGFsaW5rLmxhc3RJbmRleDtcblx0XHR9XG5cdFx0aWYgKGxhc3RJbmRleCA8IGxpbmtNYXJrdXAubGVuZ3RoKSB7XG5cdFx0XHRzeW50YXhFcnJvcihsaW5rTWFya3VwKTtcblx0XHR9XG5cdFx0d2hpbGUgKHRva2VucyA9IGxpbmtFeHByZXNzaW9ucy5zaGlmdCgpKSB7XG5cdFx0XHQvLyBJdGVyYXRlIG92ZXIgdGhlIGRhdGEtbGluayBleHByZXNzaW9ucywgZm9yIGRpZmZlcmVudCB0YXJnZXQgYXR0cnMsXG5cdFx0XHQvLyBlLmcuIDxpbnB1dCBkYXRhLWxpbms9XCJ7OmZpcnN0TmFtZTp9IHRpdGxlez5+ZGVzY3JpcHRpb24oZmlyc3ROYW1lLCBsYXN0TmFtZSl9XCJcblx0XHRcdC8vIHRva2VuczogW2FsbCwgYXR0ciwgYmluZE9ubHksIHRhZ0V4cHIsIHRhZ05hbWUsIGNvbnZlcnRlciwgY29sb24sIGh0bWwsIGNvbW1lbnQsIGNvZGUsIHBhcmFtc11cblx0XHRcdHJUYWdJbmRleCA9IHJUYWdEYXRhbGluay5sYXN0SW5kZXg7XG5cdFx0XHRhdHRyID0gdG9rZW5zWzFdO1xuXHRcdFx0dGFnRXhwciA9IHRva2Vuc1szXTtcblx0XHRcdHdoaWxlIChsaW5rRXhwcmVzc2lvbnNbMF0gJiYgbGlua0V4cHJlc3Npb25zWzBdWzRdID09PSBcImVsc2VcIikgeyAvLyBJZiB0aGlzIGlzIHtzb21lVGFnLi4ufSBhbmQgaXMgZm9sbG93ZWQgYnkgYW4ge2Vsc2UuLi59IGFkZCB0byB0YWdFeHByXG5cdFx0XHRcdHRhZ0V4cHIgKz0gZGVsaW1DbG9zZUNoYXIxICsgZGVsaW1PcGVuQ2hhcjAgKyBsaW5rRXhwcmVzc2lvbnMuc2hpZnQoKVszXTtcblx0XHRcdFx0aGFzRWxzZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaGFzRWxzZSkgeyAvLyBJZiBhbiB7ZWxzZX0gaGFzIGJlZW4gYWRkZWQsIG5lZWQgYWxzbyB0byBhZGQgY2xvc2luZyB7ey9zb21lVGFnfX1cblx0XHRcdFx0dGFnRXhwciArPSBkZWxpbUNsb3NlQ2hhcjEgKyBkZWxpbU9wZW5DaGFyMCArIGRlbGltT3BlbkNoYXIxICsgXCIvXCIgKyB0b2tlbnNbNF0gKyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0XHR9XG5cdFx0XHRsaW5rQ3R4ID0ge1xuXHRcdFx0XHR0eXBlOiBpc0xpbmsgPyBcInRvcFwiIDogXCJsaW5rXCIsXG5cdFx0XHRcdGRhdGE6IGRhdGEsIC8vIHNvdXJjZVxuXHRcdFx0XHRlbGVtOiBub2RlLCAvLyB0YXJnZXRcblx0XHRcdFx0dmlldzogY3VycmVudFZpZXcsXG5cdFx0XHRcdGN0eDogY29udGV4dCxcblx0XHRcdFx0YXR0cjogYXR0cixcblx0XHRcdFx0aXNMazogaXNMaW5rLCAvLyB0b3AtbGV2ZWwgbGlua2luZz9cblx0XHRcdFx0X3RvTGsgOiAxLCAvLyBGbGFnIHRvIGRhdGEtbGluayBvbiBpbml0aWFsIGRhdGEtbGluayBjYWxsIHJlbmRlcmluZyBjYWxsXG5cdFx0XHRcdF9ub1VwZCA6IHRva2Vuc1syXSAvLyBGbGFnIGZvciBkYXRhLWxpbms9XCJeey4uLn1cIiBzbyBvbiBpbml0aWFsIGRhdGEtbGluayBjYWxsIHdpbGwgYmluZCwgYnV0IG5vdCByZW5kZXIpXG5cdFx0XHR9O1xuXG5cdFx0XHRjb252ZXJ0QmFjayA9IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0b2tlbnNbNl0pIHtcblx0XHRcdFx0Y29udmVydEJhY2sgPSB0b2tlbnNbMTBdIHx8IHVuZGVmaW5lZDtcblx0XHRcdFx0bGlua0N0eC5jb252ZXJ0ID0gdG9rZW5zWzVdIHx8IFwiXCI7XG5cdFx0XHRcdGlmICghYXR0ciAmJiBjb252ZXJ0QmFjayAhPT0gdW5kZWZpbmVkICYmIGRlZmF1bHRBdHRyKG5vZGUpKSB7XG5cdFx0XHRcdFx0Ly8gRGVmYXVsdCB0YXJnZXQsIHNvIGFsbG93IDIgd2F5IGJpbmRpbmdcblx0XHRcdFx0XHRsaW5rQ3R4LmNvbnZlcnRCYWNrID0gY29udmVydEJhY2sgPSBjb252ZXJ0QmFjay5zbGljZSgxKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gQ29tcGlsZSB0aGUgbGlua0ZuIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIGFuZCBiaW5kcyBhIGRhdGEtbGluayBleHByZXNzaW9uXG5cdFx0XHQvLyBUT0RPIC0gb3B0aW1pemUgZm9yIHRoZSBjYXNlIG9mIHNpbXBsZSBkYXRhIHBhdGggd2l0aCBubyBjb252ZXJzaW9uLCBoZWxwZXJzLCBldGMuOlxuXHRcdFx0Ly8gICAgIGkuZS4gZGF0YS1saW5rPVwiYS5iLmNcIi4gQXZvaWQgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyBvZiBGdW5jdGlvbiBldmVyeSB0aW1lLiBDYW4gdXNlIGEgZGVmYXVsdCBmdW5jdGlvbiBmb3IgYWxsIG9mIHRoZXNlLi4uXG5cblx0XHRcdGxpbmtDdHguZXhwciA9IGF0dHIgKyB0YWdFeHByO1xuXHRcdFx0bGlua0ZuID0gdG1wbC5saW5rc1t0YWdFeHByXTtcblx0XHRcdGlmICghbGlua0ZuKSB7XG5cdFx0XHRcdHRtcGwubGlua3NbdGFnRXhwcl0gPSBsaW5rRm4gPSAkc3ViLnRtcGxGbih0YWdFeHByLCB0bXBsLCB0cnVlLCBjb252ZXJ0QmFjaywgaGFzRWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRsaW5rQ3R4LmZuID0gbGlua0ZuO1xuXHRcdFx0YmluZERhdGFMaW5rVGFyZ2V0KGxpbmtDdHgsIGxpbmtGbik7XG5cdFx0XHQvLyBXZSBzdG9yZSByVGFnSW5kZXggaW4gbG9jYWwgc2NvcGUsIHNpbmNlIHRoaXMgYWRkRGF0YUJpbmRpbmcgbWV0aG9kIGNhbiBzb21ldGltZXMgYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5LFxuXHRcdFx0Ly8gYW5kIGVhY2ggaXMgdXNpbmcgdGhlIHNhbWUgclRhZ0RhdGFsaW5rIGluc3RhbmNlLlxuXHRcdFx0clRhZ0RhdGFsaW5rLmxhc3RJbmRleCA9IHJUYWdJbmRleDtcblx0XHR9XG4vL1x0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYmluZERhdGFMaW5rVGFyZ2V0KGxpbmtDdHgsIGxpbmtGbikge1xuXHQvLyBBZGQgZGF0YSBsaW5rIGJpbmRpbmdzIGZvciBhIGxpbmsgZXhwcmVzc2lvbiBpbiBkYXRhLWxpbmsgYXR0cmlidXRlIG1hcmt1cFxuXHRmdW5jdGlvbiBoYW5kbGVyKGV2LCBldmVudEFyZ3MpIHtcblx0XHRwcm9wZXJ0eUNoYW5nZUhhbmRsZXIuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzLCBsaW5rRm4pO1xuXHRcdC8vIElmIHRoZSBsaW5rIGV4cHJlc3Npb24gdXNlcyBhIGN1c3RvbSB0YWcsIHRoZSBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIgY2FsbCB3aWxsIGNhbGwgcmVuZGVyVGFnLCB3aGljaCB3aWxsIHNldCB0YWdDdHggb24gbGlua0N0eFxuXHR9XG5cdGhhbmRsZXIubm9BcnJheSA9IHRydWU7XG5cdGlmIChsaW5rQ3R4LmlzTGspIHtcblx0XHQvLyBUb3AtbGV2ZWwgbGlua2luZzogLmxpbmsoZXhwcmVzc2lvbk9yVHJ1ZSwgZGF0YSwgY29udGV4dCkgLSBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHZpZXcgZm9yIHRoZSBsaW5raW5nLCB3aXRoIHRoZSBkYXRhIGFuZCBjdHhcblx0XHQvLyB3aGljaCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgdGFyZ2V0LiBOb3RlIHRoYXQgdGhpcyB2aWV3IGlzIG5vdCBhIHN0YW5kYXJkIGRhdGEtbGlua2VkIHZpZXcsIHNvIGl0IHdpbGxcblx0XHQvLyBiZSBkaXNwb3NlZCBvbmx5IHdoZW4gaXRzIHBhcmVudCB2aWV3IGlzIGRpc3Bvc2VkLlxuXHRcdGFkZExpbmtNZXRob2RzKGxpbmtDdHgudmlldyA9IG5ldyAkc3ViLlZpZXcoXG5cdFx0XHQkc3ViLmV4dGVuZEN0eChsaW5rQ3R4LmN0eCwgbGlua0N0eC52aWV3LmN0eCksXG5cdFx0XHRcImxpbmtcIiwgbGlua0N0eC52aWV3LCBsaW5rQ3R4LmRhdGEsIGxpbmtDdHguZXhwciwgdW5kZWZpbmVkLCBhZGRCaW5kaW5nTWFya2VycykpO1xuXHR9XG5cdGxpbmtDdHguX2N0eENiID0gZ2V0Q29udGV4dENiKGxpbmtDdHgudmlldyk7IC8vIF9jdHhDYiBpcyBmb3IgZmlsdGVyaW5nL2FwcGVuZGluZyB0byBkZXBlbmRlbmN5IHBhdGhzOiBmdW5jdGlvbihwYXRoLCBvYmplY3QpIHsgcmV0dXJuIFsob2JqZWN0fHBhdGgpKl19XG5cdGxpbmtDdHguX2hkbCA9IGhhbmRsZXI7XG5cdC8vIGhhbmRsZXIuX2N0eCA9IGxpbmtDdHg7IENvdWxkIHBhc3MgbGlua0N0eCBmb3IgdXNlIGluIGEgZGVwZW5kcyA9IGZ1bmN0aW9uKCkge30gY2FsbCwgc28gZGVwZW5kcyBpcyBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBsaW5rQ3R4J3Ncblx0aGFuZGxlcih0cnVlKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT1cbi8vIERhdGEtbGlua2luZyBoZWxwZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZW1vdmVTdWJTdHIoc3RyLCBzdWJzdHIpIHtcblx0dmFyIGs7XG5cdHJldHVybiBzdHJcblx0XHQ/IChrID0gc3RyLmluZGV4T2Yoc3Vic3RyKSxcblx0XHRcdChrICsgMVxuXHRcdFx0XHQ/IHN0ci5zbGljZSgwLCBrKSArIHN0ci5zbGljZShrICsgc3Vic3RyLmxlbmd0aClcblx0XHRcdFx0OiBzdHIpKVxuXHRcdDogXCJcIjtcbn1cblxuZnVuY3Rpb24gbWFya2VyTm9kZUluZm8obm9kZSkge1xuXHRyZXR1cm4gbm9kZSAmJlxuXHRcdChcIlwiICsgbm9kZSA9PT0gbm9kZVxuXHRcdFx0PyBub2RlXG5cdFx0XHQ6IG5vZGUudGFnTmFtZSA9PT0gU0NSSVBUXG5cdFx0XHRcdD8gbm9kZS50eXBlLnNsaWNlKDMpXG5cdFx0XHRcdDogbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKSB8fCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gdmlld0luZm9zKG5vZGUsIGlzVmFsLCByQmluZGluZykge1xuXHQvLyBUZXN0IHdoZXRoZXIgbm9kZSBpcyBhIHNjcmlwdCBtYXJrZXIgbm9kZSwgYW5kIGlmIHNvLCByZXR1cm4gbWV0YWRhdGFcblx0ZnVuY3Rpb24gZ2V0SW5mb3MoYWxsLCBvcGVuLCBjbG9zZSwgaWQsIGNoLCBlbFBhdGgpIHtcblx0XHRpbmZvcy5wdXNoKHtcblx0XHRcdGVsQ250OiBlbENudCxcblx0XHRcdGlkOiBpZCxcblx0XHRcdGNoOiBjaCxcblx0XHRcdG9wZW46IG9wZW4sXG5cdFx0XHRjbG9zZTogY2xvc2UsXG5cdFx0XHRwYXRoOiBlbFBhdGgsXG5cdFx0XHR0b2tlbjogYWxsXG5cdFx0fSk7XG5cdH1cblx0dmFyIGVsQ250LCB0b2tlbnMsXG5cdFx0aW5mb3MgPSBbXTtcblx0aWYgKHRva2VucyA9IGlzVmFsID8gbm9kZSA6IG1hcmtlck5vZGVJbmZvKG5vZGUpKSB7XG5cdFx0ZWxDbnQgPSBpbmZvcy5lbENudCA9IG5vZGUudGFnTmFtZSAhPT0gU0NSSVBUO1xuXHRcdGVsQ250ID0gdG9rZW5zLmNoYXJBdCgwKSA9PT0gXCJAXCIgfHwgZWxDbnQ7XG5cdFx0aW5mb3MuX3RrbnMgPSB0b2tlbnM7XG5cdFx0Ly8gck1hcmtlclRva2VucyA9IC8oPzooIyl8KFxcLykpKFxcZCspKFtfXl0pKFstK0BcXGRdKyk/L2c7XG5cdFx0dG9rZW5zLnJlcGxhY2UockJpbmRpbmcgfHwgck1hcmtlclRva2VucywgZ2V0SW5mb3MpO1xuXHRcdHJldHVybiBpbmZvcztcblx0fVxufVxuXG5mdW5jdGlvbiB1bm1hcmtQcmV2T3JOZXh0Tm9kZShub2RlLCBlbENudCkge1xuXHRpZiAobm9kZSkge1xuXHRcdGlmIChub2RlLnR5cGUgPT09IFwianN2XCIpIHtcblx0XHRcdG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcblx0XHR9IGVsc2UgaWYgKGVsQ250ICYmIG5vZGUuZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSA9PT0gXCJcIikge1xuXHRcdFx0bm9kZS5yZW1vdmVBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBtYXJrUHJldk9yTmV4dE5vZGUobm9kZSwgZWxDbnQpIHtcblx0dmFyIG1hcmtlciA9IG5vZGU7XG5cdHdoaWxlIChlbENudCAmJiBtYXJrZXIgJiYgbWFya2VyLm5vZGVUeXBlICE9PSAxKSB7XG5cdFx0bWFya2VyID0gbWFya2VyLnByZXZpb3VzU2libGluZztcblx0fVxuXHRpZiAobWFya2VyKSB7XG5cdFx0aWYgKG1hcmtlci5ub2RlVHlwZSAhPT0gMSkge1xuXHRcdFx0Ly8gRm9yIHRleHQgbm9kZXMsIHdlIHdpbGwgYWRkIGEgc2NyaXB0IG5vZGUgYmVmb3JlXG5cdFx0XHRtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFNDUklQVCk7XG5cdFx0XHRtYXJrZXIudHlwZSA9IFwianN2XCI7XG5cdFx0XHRub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG1hcmtlciwgbm9kZSk7XG5cdFx0fSBlbHNlIGlmICghbWFya2VyTm9kZUluZm8obWFya2VyKSAmJiAhbWFya2VyLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikpIHtcblx0XHRcdC8vIEZvciBlbGVtZW50IG5vZGVzLCB3ZSB3aWxsIGFkZCBhIGRhdGEtbGluayBhdHRyaWJ1dGUgKHVubGVzcyB0aGVyZSBpcyBhbHJlYWR5IG9uZSlcblx0XHRcdC8vIHNvIHRoYXQgdGhpcyBub2RlIGdldHMgaW5jbHVkZWQgaW4gdGhlIG5vZGUgbGlua2luZyBwcm9jZXNzLlxuXHRcdFx0bWFya2VyLnNldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0ciwgXCJcIik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXJrZXI7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmtUYWcobGlua01hcmt1cCwgdHdvd2F5KSB7XG5cdGxpbmtNYXJrdXAgPSAkLnRyaW0obGlua01hcmt1cCkucmVwbGFjZShyRXNjYXBlUXVvdGVzLCBcIlxcXFwkJlwiKTtcblx0cmV0dXJuIGxpbmtNYXJrdXAuc2xpY2UoLTEpICE9PSBkZWxpbUNsb3NlQ2hhcjBcblx0Ly8gSWYgc2ltcGxpZmllZCBzeW50YXggaXMgdXNlZDogZGF0YS1saW5rPVwiZXhwcmVzc2lvblwiLCBjb252ZXJ0IHRvIGRhdGEtbGluaz1cIns6ZXhwcmVzc2lvbn1cIixcblx0Ly8gb3IgZm9yIGlucHV0cywgZGF0YS1saW5rPVwiezpleHByZXNzaW9uOn1cIiBmb3IgKGRlZmF1bHQpIHR3by13YXkgYmluZGluZ1xuXHRcdD8gbGlua01hcmt1cCA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBsaW5rTWFya3VwICsgKHR3b3dheSA/IFwiOlwiIDogXCJcIikgKyBkZWxpbUNsb3NlQ2hhcjBcblx0XHQ6IGxpbmtNYXJrdXA7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNZXRob2RzIGZvciB2aWV3cyBhbmQgdGFnc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY2FsbEFmdGVyTGluayh0YWcsIGV2LCBldmVudEFyZ3MpIHtcblx0dmFyIGxpbmtlZEVsZW0sIGRpc3BsYXlFbGVtLCBsaW5rZWRFbCwgdmFsLCBsLCBsaW5rZWRUYWcsIG9sZFRyaWcsIG5ld1RyaWcsIHRhZ1Byb3BzLCBwcm9wc0V4cHIsIGxpbmtlZEVsZW1WaWV3LCBwcm9wLCBwcm9wRGVmLFxuXHRcdHRhZ0N0eCA9IHRhZy50YWdDdHgsXG5cdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdHByb3BzID0gdGFnQ3R4LnByb3BzLFxuXHRcdGxpbmtDdHggPSB0YWcubGlua0N0eDtcblxuXHRpZiAodGFnLl8udW5saW5rZWQpIHsgLy8gRmlyc3QgY2FsbCB0byBvbkFmdGVyTGluaywgb3IgZmlyc3QgY2FsbCBhZnRlciBvblVwZGF0ZTogdXBkYXRlQ29udGVudC4gSW5pdGlhbGl6ZSBhbmQgY2FsbCBvbkJpbmQgYW5kIHNldCBwcm9wZXJ0aWVzXG5cdFx0aWYgKHRhZy5saW5rZWRFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIGxpbmtlZEVsZW1lbnQ6IC0gc2VsZWN0b3IgZm9yIGlkZW50aWZ5aW5nIGxpbmtlZCBlbGVtZW50IGluIHRlbXBsYXRlL3JlbmRlcmVkIGNvbnRlbnRcblx0XHRcdHRhZy5saW5rZWRFbGVtID0gdGFnLl8uaW5saW5lID8gdGFnLmNvbnRlbnRzKHRydWUsIHRhZy5saW5rZWRFbGVtZW50IHx8IFwiKlwiKS5maXJzdCgpIDogJChsaW5rQ3R4LmVsZW0pO1xuXHRcdH1cblx0XHRpZiAodGFnLm9uQmluZCkge1xuXHRcdFx0dGFnLm9uQmluZCh0YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdH1cblx0fVxuXG5cdGlmICh0YWcub25BZnRlckxpbmspIHtcblx0XHR0YWcub25BZnRlckxpbmsodGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4LCBldiwgZXZlbnRBcmdzKTtcblx0fVxuXG5cdGxpbmtlZEVsZW0gPSB0YWcudGFyZ2V0VGFnID8gdGFnLnRhcmdldFRhZy5saW5rZWRFbGVtIDogdGFnLmxpbmtlZEVsZW07XG5cdGRpc3BsYXlFbGVtID0gdGFnLmRpc3BsYXlFbGVtIHx8IGxpbmtlZEVsZW07XG5cbmlmIChsaW5rZWRFbGVtICYmIGxpbmtlZEVsZW1bMF0pIHtcblx0XHRpZiAoIXRhZy5fLmNoZ2luZykge1xuXHRcdFx0dmFsID0gdGFnLmN2dEFyZ3MoKVswXTtcblx0XHRcdGwgPSBsaW5rZWRFbGVtLmxlbmd0aDtcblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0bGlua2VkRWwgPSBsaW5rZWRFbGVtW2xdO1xuXHRcdFx0XHRpZiAodGFnLl8udW5saW5rZWQgJiYgbGlua2VkRWwgIT09IGxpbmtDdHguZWxlbSkge1xuXHRcdFx0XHRcdGxpbmtlZFRhZyA9IGxpbmtlZEVsLl9qc3ZMa0VsO1xuXHRcdFx0XHRcdGlmICh0YWcuXy5pbmxpbmUgJiYgKCFsaW5rZWRUYWcgfHwgbGlua2VkVGFnICE9PSB0YWcgJiYgbGlua2VkVGFnLnRhcmdldFRhZyAhPT0gdGFnKSkge1xuXHRcdFx0XHRcdFx0Ly8gRm9yIGRhdGEtbGlua2VkIHRhZ3MsIGlkZW50aWZ5IHRoZSBsaW5rZWRFbCB3aXRoIHRoZSB0YWcsIGZvciBcInRvXCIgYmluZGluZ1xuXHRcdFx0XHRcdFx0Ly8gKEZvciBkYXRhLWxpbmtlZCBlbGVtZW50cywgaWYgbm90IHlldCBib3VuZCwgd2UgaWRlbnRpZnkgbGF0ZXIgd2hlbiB0aGUgbGlua0N0eC5lbGVtIGlzIGJvdW5kKVxuXHRcdFx0XHRcdFx0bGlua2VkRWwuX2pzdkxrRWwgPSB0YWc7XG5cdFx0XHRcdFx0XHRiaW5kVG8oYmluZGluZ1N0b3JlW3RhZy5fdGdJZF0sIHRhZywgbGlua2VkRWwpO1xuXHRcdFx0XHRcdFx0bGlua2VkRWwuX2pzdkJuZCA9IFwiJlwiICsgdGFnLl90Z0lkICsgXCIrXCI7IC8vIEFkZCBhIFwiK1wiIGZvciBjbG9uZWQgYmluZGluZyAtIHNvIHJlbW92aW5nXG5cdFx0XHRcdFx0XHQvLyBlbGVtcyB3aXRoIGNsb25lZCBiaW5kaW5ncyB3aWxsIG5vdCByZW1vdmUgdGhlICdwYXJlbnQnIGJpbmRpbmcgZnJvbSB0aGUgYmluZGluZ1N0b3JlLlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAobGlua2VkRWwudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0aWYgKGxpbmtlZEVsLnR5cGUgPT09IENIRUNLQk9YKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVsW0NIRUNLRURdID0gdmFsICYmIHZhbCAhPT0gXCJmYWxzZVwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChsaW5rZWRFbC50eXBlID09PSBSQURJTykge1xuXHRcdFx0XHRcdFx0XHRsaW5rZWRFbFtDSEVDS0VEXSA9IChsaW5rZWRFbC52YWx1ZSA9PT0gdmFsKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVsLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAobGlua2VkRWwuY29udGVudEVkaXRhYmxlID09PSBUUlVFKSB7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5pbm5lckhUTUwgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxpbmtDdHguX3ZhbCA9IHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvcHMubmFtZSkge1xuXHRcdFx0XHRcdGxpbmtlZEVsLm5hbWUgPSBsaW5rZWRFbC5uYW1lIHx8IHByb3BzLm5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRhZy5zZXRTaXplKSB7XG5cdFx0XHRpZiAocHJvcHMuaGVpZ2h0KSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLmhlaWdodChwcm9wcy5oZWlnaHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BzLndpZHRoKSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLndpZHRoKHByb3BzLndpZHRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHByb3BzLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGRpc3BsYXlFbGVtLmF0dHIoXCJ0aXRsZVwiLCBwcm9wcy50aXRsZSk7XG5cdFx0fVxuXHRcdGlmIChwcm9wc1tcImNsYXNzXCJdKSB7XG5cdFx0XHQvLyBUaGlzIGNvZGUgc3VwcG9ydHMgZHluYW1pYyBiaW5kaW5nIHRvIGNsYXNzIC0gd2hlcmUgaXQgYWRkcyB0aGUgY2xhc3MgaWYgYWJzZW50LCBhbmQgcmVtb3Zlcy9hZGRzIGlmIGEgcHJldmlvdXMgdmFsdWUgaXMgcHJlc2VudFxuXHRcdFx0aWYgKGV2ZW50QXJncyAmJiBkaXNwbGF5RWxlbS5oYXNDbGFzcyhldmVudEFyZ3Mub2xkVmFsdWUpKSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLnJlbW92ZUNsYXNzKGV2ZW50QXJncy5vbGRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRkaXNwbGF5RWxlbS5hZGRDbGFzcyhwcm9wc1tcImNsYXNzXCJdKTtcblx0XHR9XG5cdFx0aWYgKHByb3BzLmlkKSB7XG5cdFx0XHRsaW5rZWRFbGVtWzBdLmlkID0gcHJvcHMuaWQ7XG5cdFx0fVxuXHR9XG5cdHRhZy5fLnVubGlua2VkID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc3luY0VsZW1DaGFuZ2VIYW5kbGVyKGV2KSB7XG5cdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0ZWxlbUNoYW5nZUhhbmRsZXIoZXYpO1xuXHR9LCAwKTtcbn1cblxuZnVuY3Rpb24gYmluZEVsQ2hhbmdlKCRlbGVtLCB0cmlnLCBvbm9mZikge1xuXHRpZiAodHJpZykge1xuXHRcdHRyaWcgPSBcIlwiICsgdHJpZyA9PT0gdHJpZyA/IHRyaWcgOiBcImtleWRvd25cIjsgLy8gU2V0IHRyaWdnZXIgdG8gKHRydWUgfHwgdHJ1ZXkgbm9uLXN0cmluZyAoZS5nLiAxKSB8fCAna2V5ZG93bicpOiBHZXQgJ2tleWRvd24nIHdpdGggYXN5bmNcblx0XHQkZWxlbVtvbm9mZl0odHJpZywgdHJpZyA9PT0gXCJrZXlkb3duXCIgPyBhc3luY0VsZW1DaGFuZ2VIYW5kbGVyIDogZWxlbUNoYW5nZUhhbmRsZXIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGJpbmRUbyhiaW5kaW5nLCB0YWcsIGxpbmtlZEVsZW0sIGN2dEJrKSB7XG5cdC8vIFR3by13YXkgYmluZGluZy5cblx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nLnRvWzFdIHRvIGJlIHRoZSBjdnRCYWNrLCBhbmQgYmluZGluZy50b1swXSB0byBiZSBlaXRoZXIgdGhlIHBhdGggdG8gdGhlIHRhcmdldCwgb3IgW29iamVjdCwgcGF0aF0gd2hlcmUgdGhlIHRhcmdldCBpcyB0aGUgcGF0aCBvbiB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuXHQvLyBTbyBmb3IgYSBjb21wdXRlZCBwYXRoIHdpdGggYW4gb2JqZWN0IGNhbGw6IGEuYi5nZXRPYmplY3QoKS5kLmUsIHRoZW4gd2Ugc2V0IHRvWzBdIHRvIGJlIFtleHByT2IsIFwiZC5lXCJdLCBhbmQgd2UgYmluZCB0byB0aGUgcGF0aCBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LCBleHByT2Iub2IsIGFzIHRhcmdldFxuXHQvLyBPdGhlcndpc2Ugb3VyIHRhcmdldCBpcyB0aGUgZmlyc3QgcGF0aCwgcGF0aHNbMF0sIHdoaWNoIHdlIHdpbGwgY29udmVydCB3aXRoIGNvbnRleHRDYigpIGZvciBwYXRocyBsaWtlIH5hLmIuYyBvciAjeC55LnpcblxuXHR2YXIgYmluZHRvLCBwYXRoSW5kZXgsIHBhdGgsIGxhc3RQYXRoLCBiaW5kdG9PYiwgJGxpbmtlZEVsZW0sIG5ld1RyaWcsIG9sZFRyaWcsIHRvLCBsLCB0b3RyeSxcblx0XHRsaW5rQ3R4ID0gYmluZGluZy5saW5rQ3R4LFxuXHRcdHNvdXJjZSA9IGxpbmtDdHguZGF0YSxcblx0XHRwYXRocyA9IGxpbmtDdHguZm4ucGF0aHM7XG5cblx0dGFnID0gdGFnIHx8IGxpbmtlZEVsZW0uX2pzdkxrRWw7XG5cblx0XHRpZiAoYmluZGluZyAmJiBwYXRocyAmJiAhYmluZGluZy50bykge1xuXHRcdG9sZFRyaWcgPSBsaW5rZWRFbGVtLl9qc3ZUciB8fCBmYWxzZTtcblx0XHRpZiAodGFnKSB7XG5cdFx0XHRjdnRCayA9IHRhZy5jb252ZXJ0QmFjayB8fCBjdnRCaztcblx0XHRcdG5ld1RyaWcgPSB0YWcudGFnQ3R4LnByb3BzLnRyaWdnZXI7XG5cdFx0fVxuXHRcdG5ld1RyaWcgPSBuZXdUcmlnID09PSB1bmRlZmluZWQgPyAkc3ViU2V0dGluZ3MudHJpZ2dlciA6IG5ld1RyaWc7XG5cdFx0Ly8gVHJpZ2dlciBpcyBub29wIGV4Y2VwdCBmb3IgdGV4dCBib3gsIHRleHRhcmVhLCBjb250ZW50ZWRpdGFibGUuLi5cblx0XHRuZXdUcmlnID0gbmV3VHJpZyAmJiAobGlua2VkRWxlbS50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgbGlua2VkRWxlbS50eXBlICE9PSBDSEVDS0JPWCAmJiBsaW5rZWRFbGVtLnR5cGUgIT09IFJBRElPIHx8IGxpbmtlZEVsZW0udHlwZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IGxpbmtlZEVsZW0uY29udGVudEVkaXRhYmxlID09PSBUUlVFKSAmJiBuZXdUcmlnIHx8IGZhbHNlO1xuXG5cdFx0aWYgKG9sZFRyaWcgIT09IG5ld1RyaWcpIHtcblx0XHRcdCRsaW5rZWRFbGVtID0gJChsaW5rZWRFbGVtKTtcblx0XHRcdGJpbmRFbENoYW5nZSgkbGlua2VkRWxlbSwgb2xkVHJpZywgXCJvZmZcIik7XG5cdFx0XHRiaW5kRWxDaGFuZ2UoXG5cdFx0XHRcdCRsaW5rZWRFbGVtLFxuXHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZUciA9IG5ld1RyaWcsXG5cdFx0XHRcdFwib25cIlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRwYXRocyA9IChiaW5kdG8gPSBwYXRocy5fanN2dG8pIHx8IHBhdGhzWzBdO1xuXHRcdHBhdGhJbmRleCA9IHBhdGhzICYmIHBhdGhzLmxlbmd0aDtcblx0XHRpZiAocGF0aEluZGV4ICYmICghdGFnIHx8IHRhZy50YWdDdHguYXJncy5sZW5ndGgpKSB7XG5cdFx0XHRsYXN0UGF0aCA9IHBhdGhzW3BhdGhJbmRleCAtIDFdO1xuXHRcdFx0aWYgKGxhc3RQYXRoLl9qc3YpIHtcblx0XHRcdFx0YmluZHRvT2IgPSBsYXN0UGF0aDtcblx0XHRcdFx0d2hpbGUgKGxhc3RQYXRoLnNiICYmIGxhc3RQYXRoLnNiLl9qc3YpIHtcblx0XHRcdFx0XHRwYXRoID0gbGFzdFBhdGggPSBsYXN0UGF0aC5zYjtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYXRoID0gbGFzdFBhdGguc2IgfHwgcGF0aCAmJiBwYXRoLnBhdGg7XG5cdFx0XHRcdGxhc3RQYXRoID0gcGF0aCA/IHBhdGguc2xpY2UoMSkgOiBiaW5kdG9PYi5wYXRoO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhdGgpIHtcblx0XHRcdFx0dG8gPSBbXG5cdFx0XHRcdFx0XHRiaW5kdG9PYiwgLy8gJ2V4cHJPYicgZm9yIHRoaXMgZXhwcmVzc2lvbiBhbmQgdmlldy1iaW5kaW5nLiBTbyBiaW5kdG9PYi5vYiBpcyBjdXJyZW50IG9iamVjdCByZXR1cm5lZCBieSBleHByZXNzaW9uLlxuXHRcdFx0XHRcdFx0bGFzdFBhdGhcblx0XHRcdFx0XHRdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCh0b3RyeSA9IGxpbmtDdHguX2N0eENiKHBhdGggPSBsYXN0UGF0aC5zcGxpdChcIl5cIikuam9pbihcIi5cIiksIHNvdXJjZSkpICYmIChsID0gdG90cnkubGVuZ3RoKSkge1xuXHRcdFx0XHRcdC8vIFJlY3Vyc2l2ZWx5IGRlcmVmZXJlbmNlIGFueSB+Zm9vIG9yICNiYXIgdG9rZW5zIGluIHRoZSBwYXRoLiAoUmVjdXJzaXZlIGJlY2F1c2UgfmZvbyBtYXkgYmUgYSBjb250ZXh0dWFsIHBhcmFtIHdoaWNoIGhhc1xuXHRcdFx0XHRcdC8vIGl0cyBvd24gZGVwZW5kZW5jaWVzIG9uIG90aGVyIH5mb28gI2JhciBjb21wb25lbnRzKVxuXHRcdFx0XHRcdHRvID0gdG90cnk7XG5cdFx0XHRcdFx0aWYgKHRvLl9jcCkgeyAvLyBUd28td2F5IGJpbmRpbmcgdG8gYSBjb250ZXh0dWFsIHBhcmFtZXRlciByZWZlcmVuY2UsIH5mb28gKGRlY2xhcmVkIGFzIH5mb289ZXhwciBvbiBhIHBhcmVudCB0YWcpXG5cdFx0XHRcdFx0XHR0byA9IFt0b1tsLTNdLCB0b1tsLTJdXTtcblx0XHRcdFx0XHRcdGxhc3RQYXRoID0gdG9bMV07XG5cdFx0XHRcdFx0XHRpZiAobGFzdFBhdGguX2pzdikge1xuXHRcdFx0XHRcdFx0XHRiaW5kdG9PYiA9IGxhc3RQYXRoO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAobGFzdFBhdGguc2IgJiYgbGFzdFBhdGguc2IuX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aCA9IGxhc3RQYXRoLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aC5zYiB8fCBwYXRoICYmIHBhdGgucGF0aDtcblx0XHRcdFx0XHRcdFx0bGFzdFBhdGggPSBwYXRoID8gcGF0aC5zbGljZSgxKSA6IGJpbmR0b09iLnBhdGg7XG5cdFx0XHRcdFx0XHRcdHRvID0gW1xuXHRcdFx0XHRcdFx0XHRcdGJpbmR0b09iLCAvLyAnZXhwck9iJyBmb3IgdGhpcyBleHByZXNzaW9uIGFuZCB2aWV3LWJpbmRpbmcuIFNvIGJpbmR0b09iLm9iIGlzIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IGV4cHJlc3Npb24uXG5cdFx0XHRcdFx0XHRcdFx0bGFzdFBhdGhcblx0XHRcdFx0XHRcdFx0XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgeyAvLyBUd28td2F5IGJpbmRpbmcgdG8gYSBoZWxwZXIgLSBlLmcuIH5hZGRyZXNzLnN0cmVldCwgb3IgY29tcHV0ZWQsIGUuZy4gfmZ1bGxOYW1lKCksIG9yIHZpZXcgcHJvcGVydHkgZS5nLiAjZGF0YS5mb29cblx0XHRcdFx0XHRcdHRvID0gbD4yXG5cdFx0XHRcdFx0XHRcdD8gW3RvW2wtM10sIHRvW2wtMl1dIC8vIFdpdGggcGF0aDogW29iamVjdCwgcGF0aF1cblx0XHRcdFx0XHRcdFx0OiBbdG9bbC0yXV07ICAgICAgICAgLy8gTm8gcGF0aCwgKGUuZy4gW2Z1bmN0aW9uXSBmb3IgY29tcHV0ZWQgd2l0aCBzZXR0ZXIpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNvdXJjZSA9IHRvWzBdO1xuXHRcdFx0XHRcdGxhc3RQYXRoID0gdG9bMV07XG5cdFx0XHRcdH1cblx0XHRcdFx0dG8gPSB0byB8fCBbc291cmNlLCBwYXRoXTsgLy8gVHdvIHdheSBiaW5kaW5nIHRvIGFuIG9iamVjdCAobmVpdGhlciB+Zm9vIG5vciAjYmFyKVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0byA9IFtdO1xuXHRcdH1cblx0XHRiaW5kaW5nLnRvID0gW1xuXHRcdFx0dG8sXG5cdFx0XHRjdnRCa1xuXHRcdF07XG5cdH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VDdHhzKHRhZywgbmV3Q3R4cywgcmVwbGFjZSkgeyAvLyBNZXJnZSB1cGRhdGVkIHRhZ0N0eHMgaW50byB0YWcudGFnQ3R4c1xuXHR2YXIgdGFnQ3R4LCBuZXdUYWdDdHgsXG5cdFx0dmlldyA9IHRhZy50YWdDdHgudmlldyxcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMgfHwgW3RhZy50YWdDdHhdLFxuXHRcdGwgPSB0YWdDdHhzLmxlbmd0aCxcblx0XHRyZWZyZXNoID0gIW5ld0N0eHM7XG5cblx0bmV3Q3R4cyA9IG5ld0N0eHMgfHwgdGFnLl8uYm5kLmNhbGwodmlldy50bXBsLCAodGFnLmxpbmtDdHggfHwgdmlldykuZGF0YSwgdmlldywgJHN1Yik7XG5cblx0aWYgKHJlcGxhY2UpIHtcblx0XHQvLyBSZXBsYWNlIHByZXZpb3VzIHRhZ0N0eHMgYnkgbmV3IG9uZXMsIHJhdGhlciB0aGFuIG1lcmdpbmdcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMgPSBuZXdDdHhzO1xuXHRcdHRhZy50YWdDdHggPSB0YWdDdHhzWzBdO1xuXHR9IGVsc2Uge1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdHRhZ0N0eCA9IHRhZ0N0eHNbbF07XG5cdFx0XHRuZXdUYWdDdHggPSBuZXdDdHhzW2xdO1xuXHRcdFx0JG9ic2VydmFibGUodGFnQ3R4LnByb3BzKS5zZXRQcm9wZXJ0eShuZXdUYWdDdHgucHJvcHMpO1xuXHRcdFx0JGV4dGVuZCh0YWdDdHguY3R4LCBuZXdUYWdDdHguY3R4KTsgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBjdHggdmFyaWFibGVzLCB+Zm9vLCBvYnNlcnZhYmx5LCB0byBuZXN0ZWQgdmlld3MuIFNvIGV4dGVuZCwgbm90IHNldFByb3BlcnR5Li4uXG5cdFx0XHR0YWdDdHguYXJncyA9IG5ld1RhZ0N0eC5hcmdzO1xuXHRcdFx0aWYgKHJlZnJlc2gpIHtcblx0XHRcdFx0dGFnQ3R4LnRtcGwgPSBuZXdUYWdDdHgudG1wbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0JHN1Yi5fdGhzKHRhZywgdGFnQ3R4c1swXSk7IC8vIHRhZ0hhbmRsZXJzRnJvbVByb3BzXG5cdHJldHVybiB0YWdDdHhzO1xufVxuXG4vLz09PT09PT09PVxuLy8gRGlzcG9zYWxcbi8vPT09PT09PT09XG5cbmZ1bmN0aW9uIGNsZWFuKGVsZW1zKSB7XG5cdC8vIFJlbW92ZSBkYXRhLWxpbmsgYmluZGluZ3MsIG9yIGNvbnRhaW5lZCB2aWV3c1xuXHR2YXIgbCwgZWxlbSwgYmluZGluZ3MsXG5cdFx0ZWxlbUFycmF5ID0gW10sXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGkgPSBsZW47XG5cdHdoaWxlIChpLS0pIHtcblx0XHQvLyBDb3B5IGludG8gYW4gYXJyYXksIHNvIHRoYXQgZGVsZXRpb24gb2Ygbm9kZXMgZnJvbSBET00gd2lsbCBub3QgY2F1c2Ugb3VyICdpJyBjb3VudGVyIHRvIGdldCBzaGlmdGVkXG5cdFx0Ly8gKE5vdGU6IFRoaXMgc2VlbXMgYXMgZmFzdCBvciBmYXN0ZXIgdGhhbiBlbGVtQXJyYXkgPSBbXS5zbGljZS5jYWxsKGVsZW1zKTsgLi4uKVxuXHRcdGVsZW1BcnJheS5wdXNoKGVsZW1zW2ldKTtcblx0fVxuXHRpID0gbGVuO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0ZWxlbSA9IGVsZW1BcnJheVtpXTtcblx0XHRpZiAoZWxlbS5wYXJlbnROb2RlKSB7XG5cdFx0XHQvLyBIYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTVxuXHRcdFx0aWYgKGJpbmRpbmdzID0gZWxlbS5fanN2Qm5kKSB7XG5cdFx0XHRcdC8vIEdldCBwcm9wZXJ0eUNoYW5nZSBiaW5kaW5ncyBmb3IgdGhpcyBlbGVtZW50XG5cdFx0XHRcdC8vIFRoaXMgbWF5IGJlIGFuIGVsZW1lbnQgd2l0aCBkYXRhLWxpbmssIG9yIHRoZSBvcGVuaW5nIHNjcmlwdCBtYXJrZXIgbm9kZSBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRcdFx0Ly8gYmluZGluZ3MgaXMgYSBzdHJpbmcgd2l0aCB0aGUgc3ludGF4OiBcIigmYmluZGluZ0lkKSpcIlxuXHRcdFx0XHRiaW5kaW5ncyA9IGJpbmRpbmdzLnNsaWNlKDEpLnNwbGl0KFwiJlwiKTtcblx0XHRcdFx0ZWxlbS5fanN2Qm5kID0gXCJcIjtcblx0XHRcdFx0bCA9IGJpbmRpbmdzLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdC8vIFJlbW92ZSBhc3NvY2lhdGVkIGJpbmRpbmdzXG5cdFx0XHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcoYmluZGluZ3NbbF0sIGVsZW0uX2pzdkxrRWwsIGVsZW0pOyAvLyB1bmJpbmQgYmluZGluZ3Mgd2l0aCB0aGlzIGJpbmRpbmdJZCBvbiB0aGlzIHZpZXdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGlzcG9zZVRva2VucyhtYXJrZXJOb2RlSW5mbyhlbGVtKSArIChlbGVtLl9kZiB8fCBcIlwiKSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCwgbGlua2VkRWxlbVRhZywgZWxlbSkge1xuXHQvLyBVbmJpbmRcblx0dmFyIG9iaklkLCBsaW5rQ3R4LCB0YWcsIG9iamVjdCwgb2JzSWQsIHRhZ0N0eHMsIGwsIG1hcCwgJGxpbmtlZEVsZW0sIGxpbmtlZEVsZW0sIHRyaWdnZXIsIHZpZXcsIHRhcmdldFRhZyxcblx0XHRiaW5kaW5nID0gYmluZGluZ1N0b3JlW2JpbmRJZF07XG5cblx0aWYgKGxpbmtlZEVsZW1UYWcpIHtcblx0XHRsaW5rZWRFbGVtVGFnID0gbGlua2VkRWxlbVRhZy50YXJnZXRUYWcgfHwgbGlua2VkRWxlbVRhZztcblx0XHRlbGVtLl9qc3ZMa0VsID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGJpbmRpbmcpIHtcblx0XHRkZWxldGUgYmluZGluZ1N0b3JlW2JpbmRJZF07IC8vIERlbGV0ZSBhbHJlYWR5LCBzbyBjYWxsIHRvIG9uRGlzcG9zZSBoYW5kbGVyIGJlbG93IGNhbm5vdCB0cmlnZ2VyIHJlY3Vyc2l2ZSBkZWxldGlvbiAodGhyb3VnaCByZWN1cnNpdmUgY2FsbCB0byBqUXVlcnkgY2xlYW5EYXRhKVxuXHRcdGZvciAob2JqSWQgaW4gYmluZGluZy5ibmQpIHtcblx0XHRcdG9iamVjdCA9IGJpbmRpbmcuYm5kW29iaklkXTtcblx0XHRcdG9ic0lkID0gYmluZGluZy5jYklkO1xuXHRcdFx0aWYgKCRpc0FycmF5KG9iamVjdCkpIHtcblx0XHRcdFx0JChbb2JqZWN0XSkub2ZmKGFycmF5Q2hhbmdlU3RyICsgb2JzSWQpLm9mZihwcm9wZXJ0eUNoYW5nZVN0ciArIG9ic0lkKTsgLy8gVGhlcmUgbWF5IGJlIGVpdGhlciBvciBib3RoIG9mIGFycmF5Q2hhbmdlIGFuZCBwcm9wZXJ0eUNoYW5nZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JChvYmplY3QpLm9mZihwcm9wZXJ0eUNoYW5nZVN0ciArIG9ic0lkKTtcblx0XHRcdH1cblx0XHRcdGRlbGV0ZSBiaW5kaW5nLmJuZFtvYmpJZF07XG5cdFx0fVxuXG5cdFx0aWYgKGxpbmtDdHggPSBiaW5kaW5nLmxpbmtDdHgpIHtcblx0XHRcdGlmICh0YWcgPSBsaW5rQ3R4LnRhZykge1xuXHRcdFx0XHRpZiAodGFnQ3R4cyA9IHRhZy50YWdDdHhzKSB7XG5cdFx0XHRcdFx0bCA9IHRhZ0N0eHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdGlmIChtYXAgPSB0YWdDdHhzW2xdLm1hcCkge1xuXHRcdFx0XHRcdFx0XHRtYXAudW5tYXAoKTsgLy91bm9ic2VydmVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0JGxpbmtlZEVsZW0gPSB0YWcubGlua2VkRWxlbTtcblxuXHRcdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0YWcub25EaXNwb3NlKSB7XG5cdFx0XHRcdFx0dGFnLm9uRGlzcG9zZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0YWcuX2VsQ250KSB7XG5cdFx0XHRcdFx0aWYgKHRhZy5fcHJ2KSB7XG5cdFx0XHRcdFx0XHR0YWcuX3Bydi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZy5fcHJ2KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRhZy5fbnh0KSB7XG5cdFx0XHRcdFx0XHR0YWcuX254dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZy5fbnh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxpbmtlZEVsZW0gPSAkbGlua2VkRWxlbSAmJiAkbGlua2VkRWxlbVswXSB8fCBsaW5rQ3R4LmVsZW07XG5cblx0XHRcdGlmICh0cmlnZ2VyID0gbGlua2VkRWxlbSAmJiBsaW5rZWRFbGVtLl9qc3ZUcikge1xuXHRcdFx0XHRiaW5kRWxDaGFuZ2UoJGxpbmtlZEVsZW0gfHwgJChsaW5rZWRFbGVtKSwgdHJpZ2dlciwgXCJvZmZcIik7XG5cdFx0XHRcdGxpbmtlZEVsZW0uX2pzdlRyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0dmlldyA9IGxpbmtDdHgudmlldztcblx0XHRcdGlmICh2aWV3LnR5cGUgPT09IFwibGlua1wiKSB7XG5cdFx0XHRcdHZpZXcucGFyZW50LnJlbW92ZVZpZXdzKHZpZXcuXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIEEgXCJsaW5rXCIgdmlldyBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmRpbmcsIHNvIHNob3VsZCBiZSBkaXNwb3NlZCB3aXRoIGJpbmRpbmcuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgdmlldy5fLmJuZHNbYmluZElkXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZGVsZXRlIGJpbmRpbmcuc1tiaW5kaW5nLmNiSWRdO1xuXHR9XG59XG5cbmZ1bmN0aW9uICR1bmxpbmsodG8pIHtcblx0aWYgKHRvKSB7XG5cdFx0dG8gPSB0by5qcXVlcnkgPyB0byA6ICQodG8pO1xuXHRcdHRvLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5uZXJWaWV3O1xuXHRcdFx0Ly9UT0RPIGZpeCB0aGlzIGZvciBiZXR0ZXIgcGVyZi4gUmF0aGVyIHRoYXQgY2FsbGluZyBpbm5lciB2aWV3IG11bHRpcGxlIHRpbWVzIHdoaWNoIGRvZXMgcXVlcnlTZWxlY3RvckFsbCBlYWNoIHRpbWUsIGNvbnNpZGVyIGEgc2luZ2xlIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdC8vIG9yIHNpbXBseSBjYWxsIHZpZXcucmVtb3ZlVmlld3MoKSBvbiB0aGUgdG9wLWxldmVsIHZpZXdzIHVuZGVyIHRoZSB0YXJnZXQgJ3RvJyBub2RlLCB0aGVuIGNsZWFuKC4uLilcblx0XHRcdHdoaWxlICgoaW5uZXJWaWV3ID0gJHZpZXcodGhpcywgdHJ1ZSkpICYmIGlubmVyVmlldy5wYXJlbnQpIHtcblx0XHRcdFx0aW5uZXJWaWV3LnBhcmVudC5yZW1vdmVWaWV3cyhpbm5lclZpZXcuXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRjbGVhbih0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSk7XG5cdFx0fSk7XG5cdFx0Y2xlYW4odG8pO1xuXHR9IGVsc2Uge1xuXHRcdC8vIENhbGwgdG8gJC51bmxpbmsoKSBpcyBlcXVpdmFsZW50IHRvICQudW5saW5rKHRydWUsIFwiYm9keVwiKVxuXHRcdGlmIChhY3RpdmVCb2R5KSB7XG5cdFx0XHQkKGFjdGl2ZUJvZHkpXG5cdFx0XHRcdC5vZmYoZWxlbWVudENoYW5nZVN0ciwgZWxlbUNoYW5nZUhhbmRsZXIpXG5cdFx0XHRcdC5vZmYoJ2JsdXInLCAnW2NvbnRlbnRlZGl0YWJsZV0nLCBlbGVtQ2hhbmdlSGFuZGxlcik7XG5cdFx0XHRhY3RpdmVCb2R5ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0b3BWaWV3LnJlbW92ZVZpZXdzKCk7XG5cdFx0Y2xlYW4oZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikpO1xuXHR9XG59XG5cbi8vPT09PT09PT1cbi8vIEhlbHBlcnNcbi8vPT09PT09PT1cblxuZnVuY3Rpb24gZ2V0Q29udGV4dENiKHZpZXcpIHsgLy8gUmV0dXJuIGEgY2FsbGJhY2sgZm9yIGFjY2Vzc2luZyB0aGUgY29udGV4dCBvZiBhIHRlbXBsYXRlL2RhdGEtbGluayBleHByZXNzaW9uIC0gYW5kIGNvbnZlcnRpbmcgfmZvbywgI2ZvbyBldGMuXG5cdC8vIFRPRE8gQ29uc2lkZXIgZXhwb3Npbmcgb3IgYWxsb3dpbmcgb3ZlcnJpZGUsIGFzIHB1YmxpYyBBUElcblx0cmV0dXJuIGZ1bmN0aW9uKHBhdGgsIG9iamVjdCwgZGVwdGgpIHtcblx0XHQvLyBUT0RPIGNvbnNpZGVyIG9ubHkgY2FsbGluZyB0aGUgY29udGV4dENiIG9uIHRoZSBpbml0aWFsIHRva2VuIGluIHBhdGggJ35hLmIuYycgYW5kIG5vdCBjYWxsaW5nIGFnYWluIG9uXG5cdFx0Ly8gdGhlIGluZGl2aWR1YWwgdG9rZW5zLCAnYScsICdiJywgJ2MnLi4uIEN1cnJlbnRseSBpdCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXNcblx0XHR2YXIgdG9rZW5zLCB0YWcsIGl0ZW1zLCBoZWxwZXIsIGxhc3QsIG5leHRQYXRoLCBsO1xuXHRcdGlmICh2aWV3ICYmIHBhdGgpIHtcblx0XHRcdGlmIChwYXRoLl9qc3YpIHtcblx0XHRcdFx0cmV0dXJuIHBhdGguX2pzdi5jYWxsKHZpZXcudG1wbCwgb2JqZWN0LCB2aWV3LCAkc3ViKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gXCJ+XCIpIHtcblx0XHRcdFx0Ly8gV2UgcmV0dXJuIG5ldyBpdGVtcyB0byBpbnNlcnQgaW50byB0aGUgc2VxdWVuY2UsIHJlcGxhY2luZyB0aGUgXCJ+YS5iLmNcIiBzdHJpbmc6XG5cdFx0XHRcdC8vIFtoZWxwZXJPYmplY3QgJ2EnLCBcImEuYi5jXCIgY3VycmVudERhdGFJdGVtXSBzbyBjdXJyZW50RGF0YUl0ZW0gYmVjb21lcyB0aGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50IHBhdGhzLlxuXHRcdFx0XHRpZiAocGF0aC5zbGljZSgwLCA0KSA9PT0gXCJ+dGFnXCIpIHtcblx0XHRcdFx0XHR0YWcgPSB2aWV3LmN0eDtcblx0XHRcdFx0XHRpZiAocGF0aC5jaGFyQXQoNCkgPT09IFwiLlwiKSB7XG5cdFx0XHRcdFx0XHQvLyBcIn50YWcueHh4XCJcblx0XHRcdFx0XHRcdHRva2VucyA9IHBhdGguc2xpY2UoNSkuc3BsaXQoXCIuXCIpO1xuXHRcdFx0XHRcdFx0dGFnID0gdGFnLnRhZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRva2Vucykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRhZyA/IFt0YWcsIHRva2Vucy5qb2luKFwiLlwiKSwgb2JqZWN0XSA6IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRwYXRoID0gcGF0aC5zbGljZSgxKS5zcGxpdChcIi5cIik7XG5cdFx0XHRcdGlmIChoZWxwZXIgPSB2aWV3LmhscChsYXN0ID0gcGF0aC5zaGlmdCgpLCB0cnVlKSkge1xuXHRcdFx0XHRcdGlmIChoZWxwZXIuX2NwKSB7ICAvLyBoZWxwZXIgZm9yIChjb250ZXh0dWFsIHBhcmFtZXRlciB+Zm9vPS4uLikgaXMgYW4gYXJyYXkgLSBbZGF0YSwgY3R4UHJtRGVwZW5kZW5jaWVzIC4uLl1cblx0XHRcdFx0XHRcdGlmIChwYXRoLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRuZXh0UGF0aCA9IFwiLlwiICsgcGF0aC5qb2luKFwiLlwiKTtcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGhlbHBlcltsID0gaGVscGVyLmxlbmd0aC0xXTtcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3QuX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdGxhc3Quc2IgPSBuZXh0UGF0aDtcblx0XHRcdFx0XHRcdFx0XHRsYXN0LmJuZCA9ICEhZGVwdGg7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0aGVscGVyW2xdID0gKGxhc3QgKyBuZXh0UGF0aCkucmVwbGFjZShcIiNkYXRhLlwiLCBcIlwiKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobGFzdC5zbGljZSgwLCA1KSA9PT0gXCIjdmlld1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRoZWxwZXJbbF0gPSBoZWxwZXJbbF0uc2xpY2UoNik7XG5cdFx0XHRcdFx0XHRcdFx0XHRoZWxwZXIuc3BsaWNlKGwsIDAsIHZpZXcpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aGVscGVyLnB1c2gob2JqZWN0KTtcblx0XHRcdFx0XHRcdGl0ZW1zID0gaGVscGVyO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGF0aC5sZW5ndGggfHwgJGlzRnVuY3Rpb24oaGVscGVyKSkge1xuXHRcdFx0XHRcdFx0aXRlbXMgPSBbaGVscGVyLCBwYXRoLmpvaW4oXCIuXCIpLCBvYmplY3RdOyAvLyAyd2F5IGJpbmRuZyBvbiB+Zm9vLmhlbHBlckxlYWZQcm9wZXJ0eSBvciB+Y29tcHV0ZWQoKSBvciB+Y29udGV4dHVhbFBhcmFtXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBpdGVtcyB8fCBbXTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gXCIjXCIpIHtcblx0XHRcdFx0Ly8gV2UgcmV0dXJuIG5ldyBpdGVtcyB0byBpbnNlcnQgaW50byB0aGUgc2VxdWVuY2UsIHJlcGxhY2luZyB0aGUgXCIjYS5iLmNcIiBzdHJpbmc6IFt2aWV3LCBcImEuYi5jXCIgY3VycmVudERhdGFJdGVtXVxuXHRcdFx0XHQvLyBzbyBjdXJyZW50RGF0YUl0ZW0gYmVjb21lcyB0aGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50IHBhdGhzLiBUaGUgJ3RydWUnIGZsYWcgbWFrZXMgdGhlIHBhdGhzIGJpbmQgb25seSB0byBsZWFmIGNoYW5nZXMuXG5cdFx0XHRcdHJldHVybiBwYXRoID09PSBcIiNkYXRhXCIgPyBbXSA6IFt2aWV3LCBwYXRoLnJlcGxhY2UoclZpZXdQYXRoLCBcIlwiKSwgb2JqZWN0XTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIGlucHV0QXR0cmliKGVsZW0pIHtcblx0cmV0dXJuIGVsZW0udHlwZSA9PT0gQ0hFQ0tCT1ggPyBlbGVtW0NIRUNLRURdIDogZWxlbS52YWx1ZTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vPT09PT09PT09PT09PT09PT09PT09XG4vLyBKc1JlbmRlciBpbnRlZ3JhdGlvblxuLy89PT09PT09PT09PT09PT09PT09PT1cblxuJHN1Yi5vblN0b3JlLnRlbXBsYXRlID0gZnVuY3Rpb24obmFtZSwgaXRlbSkge1xuXHRpdGVtLmxpbmsgPSB0bXBsTGluaztcblx0aWYgKG5hbWUpIHtcblx0XHQkLmxpbmtbbmFtZV0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0bXBsTGluay5hcHBseShpdGVtLCBhcmd1bWVudHMpO1xuXHRcdH07XG5cdH1cbn07XG5cbiRzdWIudmlld0luZm9zID0gdmlld0luZm9zOyAvLyBFeHBvc2Ugdmlld0luZm9zKCkgYXMgcHVibGljIGhlbHBlciBtZXRob2RcblxuLy8gRGVmaW5lIEpzVmlld3MgdmVyc2lvbiBvZiBkZWxpbWl0ZXJzKCksIGFuZCBpbml0aWFsaXplXG4oJHZpZXdzU2V0dGluZ3MuZGVsaW1pdGVycyA9IGZ1bmN0aW9uKCkge1xuXHQvLyBSdW4gZGVsaW1pdGVycyBpbml0aWFsaXphdGlvbiBpbiBjb250ZXh0IG9mIGpzcmVuZGVyLmpzXG5cdHZhciByZXQgPSBvbGRKc3ZEZWxpbWl0ZXJzLmFwcGx5KDAsIGFyZ3VtZW50cyksXG5cdFx0Ly8gTm93IHNldCBhbHNvIGRlbGltT3BlbkNoYXIwIGV0Yy4gaW4gY29udGV4dCBvZiBqcXVlcnkudmlld3MuanMuLi5cblx0XHRkZWxpbUNoYXJzID0gJHN1YlNldHRpbmdzLmRlbGltaXRlcnM7XG5cblx0ZGVsaW1PcGVuQ2hhcjAgPSBkZWxpbUNoYXJzWzBdLmNoYXJBdCgwKTtcblx0ZGVsaW1PcGVuQ2hhcjEgPSBkZWxpbUNoYXJzWzBdLmNoYXJBdCgxKTtcblx0ZGVsaW1DbG9zZUNoYXIwID0gZGVsaW1DaGFyc1sxXS5jaGFyQXQoMCk7XG5cdGRlbGltQ2xvc2VDaGFyMSA9IGRlbGltQ2hhcnNbMV0uY2hhckF0KDEpO1xuXHRsaW5rQ2hhciA9IGRlbGltQ2hhcnNbMl07XG5cblx0Ly8gRGF0YS1saW5raW5nIG11c3QgdXNlIG5ldyBkZWxpbWl0ZXJzXG5cdHJUYWdEYXRhbGluayA9IG5ldyBSZWdFeHAoXCIoPzpefFxcXFxzKikoW1xcXFx3LV0qKShcXFxcXCIgKyBsaW5rQ2hhciArIFwiKT8oXFxcXFwiICsgZGVsaW1PcGVuQ2hhcjEgKyAkc3ViLnJUYWcgKyBcIig6XFxcXHcqKT9cXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIilcIiwgXCJnXCIpO1xuXHRyZXR1cm4gcmV0O1xufSkoKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiRzdWIuYWRkU2V0dGluZyhcInRyaWdnZXJcIik7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBZGRpdGlvbmFsIG1lbWJlcnMgZm9yIGxpbmtlZCB2aWV3c1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gdHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgcGFyZW50RWxlbSwgaWQsIHZpZXdPclRhZ0NoYXIsIHJlZnJlc2gpIHtcblx0Ly8gVHJhbnNmZXIgdG9rZW5zIG9uIHByZXZOb2RlIG9mIHZpZXdUb1JlbW92ZS92aWV3VG9SZWZyZXNoIHRvIG5leHROb2RlIG9yIHBhcmVudEVsZW0uX2RmXG5cdHZhciBpLCBsLCB2d0luZm9zLCB2d0luZm8sIHZpZXdPclRhZywgdmlld0lkLCB0b2tlbnMsXG5cdFx0cHJlY2VkaW5nTGVuZ3RoID0gMCxcblx0XHRlbXB0eVZpZXcgPSBwcmV2Tm9kZSA9PT0gbmV4dE5vZGU7XG5cblx0aWYgKHByZXZOb2RlKSB7XG5cdFx0Ly8gcHJldk5vZGUgaXMgZWl0aGVyIHRoZSBmaXJzdCBub2RlIGluIHRoZSB2aWV3T3JUYWcsIG9yIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSB2d0luZm9zIHRva2VucyBzdHJpbmdcblx0XHR2d0luZm9zID0gdmlld0luZm9zKHByZXZOb2RlKSB8fCBbXTtcblx0XHRmb3IgKGkgPSAwLCBsID0gdndJbmZvcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdC8vIFN0ZXAgdGhyb3VnaCB2aWV3cyBvciB0YWdzIG9uIHRoZSBwcmV2Tm9kZVxuXHRcdFx0dndJbmZvID0gdndJbmZvc1tpXTtcblx0XHRcdHZpZXdJZCA9IHZ3SW5mby5pZDtcblx0XHRcdGlmICh2aWV3SWQgPT09IGlkICYmIHZ3SW5mby5jaCA9PT0gdmlld09yVGFnQ2hhcikge1xuXHRcdFx0XHRpZiAocmVmcmVzaCkge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgdmlld09yVGFnVG9SZWZyZXNoLCB0aGlzIGlzIHRoZSBsYXN0IHZpZXdPclRhZyB0byBwcm9jZXNzLi4uXG5cdFx0XHRcdFx0bCA9IDA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyB2aWV3T3JUYWdUb1JlbW92ZSwgc28gd2UgYXJlIGRvbmUuLi5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFlbXB0eVZpZXcpIHtcblx0XHRcdFx0dmlld09yVGFnID0gdndJbmZvLmNoID09PSBcIl9cIlxuXHRcdFx0XHRcdD8gdmlld1N0b3JlW3ZpZXdJZF1cblx0XHRcdFx0XHQ6IGJpbmRpbmdTdG9yZVt2aWV3SWRdLmxpbmtDdHgudGFnO1xuXHRcdFx0XHRpZiAodndJbmZvLm9wZW4pIHtcblx0XHRcdFx0XHQvLyBBIFwiI21cIiB0b2tlblxuXHRcdFx0XHRcdHZpZXdPclRhZy5fcHJ2ID0gbmV4dE5vZGU7XG5cdFx0XHRcdH0gZWxzZSBpZiAodndJbmZvLmNsb3NlKSB7XG5cdFx0XHRcdFx0Ly8gQSBcIi9tXCIgdG9rZW5cblx0XHRcdFx0XHR2aWV3T3JUYWcuX254dCA9IG5leHROb2RlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwcmVjZWRpbmdMZW5ndGggKz0gdmlld0lkLmxlbmd0aCArIDI7XG5cdFx0fVxuXG5cdFx0aWYgKHByZWNlZGluZ0xlbmd0aCkge1xuXHRcdFx0cHJldk5vZGUuc2V0QXR0cmlidXRlKGpzdkF0dHJTdHIsIHByZXZOb2RlLmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKS5zbGljZShwcmVjZWRpbmdMZW5ndGgpKTtcblx0XHR9XG5cdFx0dG9rZW5zID0gbmV4dE5vZGUgPyBuZXh0Tm9kZS5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cikgOiBwYXJlbnRFbGVtLl9kZjtcblx0XHRpZiAobCA9IHRva2Vucy5pbmRleE9mKFwiL1wiICsgaWQgKyB2aWV3T3JUYWdDaGFyKSArIDEpIHtcblx0XHRcdHRva2VucyA9IHZ3SW5mb3MuX3RrbnMuc2xpY2UoMCwgcHJlY2VkaW5nTGVuZ3RoKSArIHRva2Vucy5zbGljZShsICsgKHJlZnJlc2ggPyAtMSA6IGlkLmxlbmd0aCArIDEpKTtcblx0XHR9XG5cdFx0aWYgKHRva2Vucykge1xuXHRcdFx0aWYgKG5leHROb2RlKSB7XG5cdFx0XHRcdC8vIElmIHZpZXdPclRhZ1RvUmVtb3ZlIHdhcyBhbiBlbXB0eSB2aWV3T3JUYWcsIHdlIHdpbGwgcmVtb3ZlIGJvdGggI24gYW5kIC9uXG5cdFx0XHRcdC8vIChhbmQgYW55IGludGVydmVuaW5nIHRva2VucykgZnJvbSB0aGUgbmV4dE5vZGUgKD09PSBwcmV2Tm9kZSlcblx0XHRcdFx0Ly8gSWYgdmlld09yVGFnVG9SZW1vdmUgd2FzIG5vdCBlbXB0eSwgd2Ugd2lsbCB0YWtlIHRva2VucyBwcmVjZWRpbmcgI24gZnJvbSBwcmV2Tm9kZSxcblx0XHRcdFx0Ly8gYW5kIGNvbmNhdGVuYXRlIHdpdGggdG9rZW5zIGZvbGxvd2luZyAvbiBvbiBuZXh0Tm9kZVxuXHRcdFx0XHRuZXh0Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgdG9rZW5zKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHRva2Vucyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vICFwcmV2Tm9kZSwgc28gdGhlcmUgbWF5IGJlIGEgZGVmZXJyZWQgbm9kZXMgdG9rZW4gb24gdGhlIHBhcmVudEVsZW0uIFJlbW92ZSBpdC5cblx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiI1wiICsgaWQgKyB2aWV3T3JUYWdDaGFyKSk7XG5cdFx0aWYgKCFyZWZyZXNoICYmICFuZXh0Tm9kZSkge1xuXHRcdFx0Ly8gSWYgdGhpcyB2aWV3T3JUYWcgaXMgYmVpbmcgcmVtb3ZlZCwgYW5kIHRoZXJlIHdhcyBubyAubnh0LCByZW1vdmUgY2xvc2luZyB0b2tlbiBmcm9tIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgcmVtb3ZlU3ViU3RyKHBhcmVudEVsZW0uX2RmLCBcIi9cIiArIGlkICsgdmlld09yVGFnQ2hhcikpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkaXNwb3NlVG9rZW5zKHRva2Vucykge1xuXHR2YXIgaSwgbCwgdndJdGVtLCB2d0luZm9zO1xuXHRpZiAodndJbmZvcyA9IHZpZXdJbmZvcyh0b2tlbnMsIHRydWUsIHJPcGVuTWFya2VycykpIHtcblx0XHRmb3IgKGkgPSAwLCBsID0gdndJbmZvcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdHZ3SXRlbSA9IHZ3SW5mb3NbaV07XG5cdFx0XHRpZiAodndJdGVtLmNoID09PSBcIl9cIikge1xuXHRcdFx0XHRpZiAoKHZ3SXRlbSA9IHZpZXdTdG9yZVt2d0l0ZW0uaWRdKSAmJiB2d0l0ZW0udHlwZSkge1xuXHRcdFx0XHRcdC8vIElmIHRoaXMgaXMgdGhlIF9wcnYgKHByZXZOb2RlKSBmb3IgYSB2aWV3LCByZW1vdmUgdGhlIHZpZXdcblx0XHRcdFx0XHQvLyAtIHVubGVzcyB2aWV3LnR5cGUgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIGFscmVhZHkgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0XHRcdHZ3SXRlbS5wYXJlbnQucmVtb3ZlVmlld3ModndJdGVtLl8ua2V5LCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1vdmVWaWV3QmluZGluZyh2d0l0ZW0uaWQpOyAvLyB1bmJpbmQgYmluZGluZ3Mgd2l0aCB0aGlzIGJpbmRpbmdJZCBvbiB0aGlzIHZpZXdcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFkZCBsaW5rIG1ldGhvZHMgdG8gZGF0YS1saW5rZWQgdmlldyBvciB0YWdcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5mdW5jdGlvbiBhZGRMaW5rTWV0aG9kcyh0YWdPclZpZXcsIGlzVGFnKSB7XG5cblx0dGFnT3JWaWV3LmNvbnRlbnRzID0gZnVuY3Rpb24oZGVlcCwgc2VsZWN0KSB7XG5cdFx0Ly8gRm9yIGEgdmlldyBvciBhIHRhZywgcmV0dXJuIGpRdWVyeSBvYmplY3Qgd2l0aCB0aGUgY29udGVudCBub2Rlcyxcblx0XHRpZiAoZGVlcCAhPT0gISFkZWVwKSB7XG5cdFx0XHQvLyBkZWVwIG5vdCBib29sZWFuLCBzbyB0aGlzIGlzIGNvbnRlbnRzKHNlbGVjdG9yKVxuXHRcdFx0c2VsZWN0ID0gZGVlcDtcblx0XHRcdGRlZXAgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHZhciBmaWx0ZXJlZCxcblx0XHRcdG5vZGVzID0gJCh0aGlzLm5vZGVzKCkpO1xuXHRcdGlmIChub2Rlc1swXSkge1xuXHRcdFx0ZmlsdGVyZWQgPSBzZWxlY3QgPyBub2Rlcy5maWx0ZXIoc2VsZWN0KSA6IG5vZGVzO1xuXHRcdFx0bm9kZXMgPSBkZWVwICYmIHNlbGVjdCA/IGZpbHRlcmVkLmFkZChub2Rlcy5maW5kKHNlbGVjdCkpIDogZmlsdGVyZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBub2Rlcztcblx0fTtcblxuXHR0YWdPclZpZXcubm9kZXMgPSBmdW5jdGlvbih3aXRoTWFya2VycywgcHJldk5vZGUsIG5leHROb2RlKSB7XG5cdFx0Ly8gRm9yIGEgdmlldyBvciBhIHRhZywgcmV0dXJuIHRvcC1sZXZlbCBub2Rlc1xuXHRcdC8vIERvIG5vdCByZXR1cm4gYW55IHNjcmlwdCBtYXJrZXIgbm9kZXMsIHVubGVzcyB3aXRoTWFya2VycyBpcyB0cnVlXG5cdFx0Ly8gT3B0aW9uYWxseSBsaW1pdCByYW5nZSwgYnkgcGFzc2luZyBpbiBwcmV2Tm9kZSBvciBuZXh0Tm9kZSBwYXJhbWV0ZXJzXG5cblx0XHR2YXIgbm9kZSxcblx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0ZWxDbnQgPSBzZWxmLl9lbENudCxcblx0XHRcdHByZXZJc0ZpcnN0Tm9kZSA9ICFwcmV2Tm9kZSAmJiBlbENudCxcblx0XHRcdG5vZGVzID0gW107XG5cblx0XHRwcmV2Tm9kZSA9IHByZXZOb2RlIHx8IHNlbGYuX3Bydjtcblx0XHRuZXh0Tm9kZSA9IG5leHROb2RlIHx8IHNlbGYuX254dDtcblxuXHRcdG5vZGUgPSBwcmV2SXNGaXJzdE5vZGVcblx0XHRcdD8gKHByZXZOb2RlID09PSBzZWxmLl9ueHRcblx0XHRcdFx0PyBzZWxmLnBhcmVudEVsZW0ubGFzdFNpYmxpbmdcblx0XHRcdFx0OiBwcmV2Tm9kZSlcblx0XHRcdDogKHNlbGYuXy5pbmxpbmUgPT09IGZhbHNlXG5cdFx0XHRcdD8gcHJldk5vZGUgfHwgc2VsZi5saW5rQ3R4LmVsZW0uZmlyc3RDaGlsZFxuXHRcdFx0XHQ6IHByZXZOb2RlICYmIHByZXZOb2RlLm5leHRTaWJsaW5nKTtcblxuXHRcdHdoaWxlIChub2RlICYmICghbmV4dE5vZGUgfHwgbm9kZSAhPT0gbmV4dE5vZGUpKSB7XG5cdFx0XHRpZiAod2l0aE1hcmtlcnMgfHwgZWxDbnQgfHwgbm9kZS50YWdOYW1lICE9PSBTQ1JJUFQpIHtcblx0XHRcdFx0Ly8gQWxsIHRoZSB0b3AtbGV2ZWwgbm9kZXMgaW4gdGhlIHZpZXdcblx0XHRcdFx0Ly8gKGV4Y2VwdCBzY3JpcHQgbWFya2VyIG5vZGVzLCB1bmxlc3Mgd2l0aE1hcmtlcnMgPSB0cnVlKVxuXHRcdFx0XHQvLyAoTm90ZTogSWYgYSBzY3JpcHQgbWFya2VyIG5vZGUsIHZpZXdJbmZvLmVsQ250IHVuZGVmaW5lZClcblx0XHRcdFx0bm9kZXMucHVzaChub2RlKTtcblx0XHRcdH1cblx0XHRcdG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuXHRcdH1cblx0XHRyZXR1cm4gbm9kZXM7XG5cdH07XG5cblx0dGFnT3JWaWV3LmNoaWxkVGFncyA9IGZ1bmN0aW9uKGRlZXAsIHRhZ05hbWUpIHtcblx0XHQvLyBGb3IgYSB2aWV3IG9yIGEgdGFnLCByZXR1cm4gY2hpbGQgdGFncyAtIGF0IGFueSBkZXB0aCwgb3IgYXMgaW1tZWRpYXRlIGNoaWxkcmVuIG9ubHkuXG5cdFx0aWYgKGRlZXAgIT09ICEhZGVlcCkge1xuXHRcdFx0Ly8gZGVlcCBub3QgYm9vbGVhbiwgc28gdGhpcyBpcyBjaGlsZFRhZ3ModGFnTmFtZSkgLSB3aGljaCBsb29rcyBmb3IgdG9wLWxldmVsIHRhZ3Mgb2YgZ2l2ZW4gdGFnTmFtZVxuXHRcdFx0dGFnTmFtZSA9IGRlZXA7XG5cdFx0XHRkZWVwID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdHZpZXcgPSBzZWxmLmxpbmsgPyBzZWxmIDogc2VsZi50YWdDdHgudmlldywgLy8gdGhpcyBtYXkgYmUgYSB2aWV3IG9yIGEgdGFnLiBJZiBhIHRhZywgZ2V0IHRoZSB2aWV3IGZyb20gdGFnLnZpZXcudGFnQ3R4XG5cdFx0XHRwcmV2Tm9kZSA9IHNlbGYuX3Bydixcblx0XHRcdGVsQ250ID0gc2VsZi5fZWxDbnQsXG5cdFx0XHR0YWdzID0gW107XG5cblx0XHR2aWV3LmxpbmsoXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRzZWxmLnBhcmVudEVsZW0sXG5cdFx0XHRlbENudCA/IHByZXZOb2RlICYmIHByZXZOb2RlLnByZXZpb3VzU2libGluZyA6IHByZXZOb2RlLFxuXHRcdFx0c2VsZi5fbnh0LFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0e2dldDp7XG5cdFx0XHRcdHRhZ3M6IHRhZ3MsXG5cdFx0XHRcdGRlZXA6IGRlZXAsXG5cdFx0XHRcdG5hbWU6IHRhZ05hbWUsXG5cdFx0XHRcdGlkOiBzZWxmLmxpbmsgPyBzZWxmLl8uaWQgKyBcIl9cIiA6IHNlbGYuX3RnSWQgKyBcIl5cIlxuXHRcdFx0fX1cblx0XHQpO1xuXHRcdHJldHVybiB0YWdzO1xuXHR9O1xuXG5cdHRhZ09yVmlldy5yZWZyZXNoID0gZnVuY3Rpb24oc291cmNlVmFsdWUpIHtcblx0XHR2YXIgcHJvbWlzZSwgYXR0cixcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRsaW5rQ3R4ID0gdGFnLmxpbmtDdHgsXG5cdFx0XHR2aWV3ID0gdGFnLnRhZ0N0eC52aWV3O1xuXG5cdFx0aWYgKHRhZy5kaXNwb3NlZCkgeyBlcnJvcihcIlJlbW92ZWQgdGFnXCIpOyB9XG5cdFx0aWYgKHNvdXJjZVZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNvdXJjZVZhbHVlID0gJHN1Yi5fdGFnKHRhZywgdmlldywgdmlldy50bXBsLCBtZXJnZUN0eHModGFnKSwgdHJ1ZSk7IC8vIEdldCByZW5kZXJlZCBIVE1MIGZvciB0YWcsIGJhc2VkIG9uIHJlZnJlc2hlZCB0YWdDdHhzXG5cdFx0fVxuXHRcdGlmIChzb3VyY2VWYWx1ZSArIFwiXCIgPT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHQvLyBJZiBubyByZW5kZXJlZCBjb250ZW50LCBzb3VyY2VWYWx1ZSB3aWxsIG5vdCBiZSBhIHN0cmluZyAoY2FuIGJlIDAgb3IgdW5kZWZpbmVkKVxuXHRcdFx0aWYgKHRhZy5vblVuYmluZCkge1xuXHRcdFx0XHR0YWcub25VbmJpbmQodGFnLnRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCk7XG5cdFx0XHR9XG5cdFx0XHRhdHRyID0gdGFnLl8uaW5saW5lID8gSFRNTCA6IChsaW5rQ3R4LmF0dHIgfHwgZGVmYXVsdEF0dHIodGFnLnBhcmVudEVsZW0sIHRydWUpKTtcblx0XHRcdHByb21pc2UgPSB1cGRhdGVDb250ZW50KHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCBhdHRyLCB0YWcpO1xuXHRcdH1cblxuXHRcdGNhbGxBZnRlckxpbmsodGFnKTtcblx0XHRyZXR1cm4gcHJvbWlzZSB8fCB0YWc7XG5cdH07XG5cblx0dGFnT3JWaWV3LnVwZGF0ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0dmFyIGxpbmtlZEVsZW0gPSB0aGlzLmxpbmtlZEVsZW07XG5cdFx0aWYgKGxpbmtlZEVsZW0pIHtcblx0XHRcdGVsZW1DaGFuZ2VIYW5kbGVyKHtcblx0XHRcdFx0dGFyZ2V0OiBsaW5rZWRFbGVtWzBdXG5cdFx0XHR9LCB1bmRlZmluZWQsIHZhbHVlKTtcblx0XHR9XG5cdH07XG5cblx0aWYgKGlzVGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIFRBR1xuXHRcdHRhZ09yVmlldy5kb21DaGFuZ2UgPSBmdW5jdGlvbigpIHsgLy8gZG9tQ2hhbmdlIG5vdGlmaWNhdGlvbiBzdXBwb3J0XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXMucGFyZW50RWxlbSxcblx0XHRcdFx0aGFzTGlzdGVuZXIgPSAkLmhhc0RhdGEoZWxlbSkgJiYgJC5fZGF0YShlbGVtKS5ldmVudHMsXG5cdFx0XHRcdGRvbUNoYW5nZU5vdGlmaWNhdGlvbiA9IFwianN2LWRvbWNoYW5nZVwiO1xuXG5cdFx0XHRpZiAoaGFzTGlzdGVuZXIgJiYgaGFzTGlzdGVuZXJbZG9tQ2hhbmdlTm90aWZpY2F0aW9uXSkge1xuXHRcdFx0XHQvLyBPbmx5IHRyaWdnZXIgaGFuZGxlciBpZiB0aGVyZSBpcyBhIGhhbmRsZXIgbGlzdGVuaW5nIGZvciB0aGlzIGV2ZW50LiAoTm90ZSB1c2luZyB0cmlnZ2VySGFuZGxlciAtIHNvIG5vIGV2ZW50IGJ1YmJsaW5nLilcblx0XHRcdFx0JChlbGVtKS50cmlnZ2VySGFuZGxlcihkb21DaGFuZ2VOb3RpZmljYXRpb24sIGFyZ3VtZW50cyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHQvLyBUaGlzIGlzIGEgVklFV1xuXHRcdC8vIE5vdGU6IGEgbGlua2VkIHZpZXcgd2lsbCBhbHNvLCBhZnRlciBsaW5raW5nIGhhdmUgbm9kZXNbXSwgX3BydiAocHJldk5vZGUpLCBfbnh0IChuZXh0Tm9kZSkgLi4uXG5cdFx0dGFnT3JWaWV3LmFkZFZpZXdzID0gZnVuY3Rpb24oaW5kZXgsIGRhdGFJdGVtcykge1xuXHRcdFx0Ly8gaWYgdmlldyBpcyBub3QgYW4gYXJyYXkgdmlldywgZG8gbm90aGluZ1xuXHRcdFx0dmFyIGksIHZpZXdzQ291bnQsXG5cdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRpdGVtc0NvdW50ID0gZGF0YUl0ZW1zLmxlbmd0aCxcblx0XHRcdFx0dmlld3MgPSBzZWxmLnZpZXdzO1xuXG5cdFx0XHRpZiAoIXNlbGYuXy51c2VLZXkgJiYgaXRlbXNDb3VudCkge1xuXHRcdFx0XHQvLyB2aWV3IGlzIG9mIHR5cGUgXCJhcnJheVwiXG5cdFx0XHRcdHZpZXdzQ291bnQgPSB2aWV3cy5sZW5ndGggKyBpdGVtc0NvdW50O1xuXG5cdFx0XHRcdGlmICh2aWV3c0NvdW50ID09PSBzZWxmLmRhdGEubGVuZ3RoIC8vIElmIHZpZXdzIG5vdCBhbHJlYWR5IHN5bmNlZCB0byBhcnJheSAoZS5nLiB0cmlnZ2VyZWQgYnkgYXJyYXkubGVuZ3RoIHByb3BlcnR5Q2hhbmdlIC0ganN2aWV3cy9pc3N1ZXMvMzAxKVxuXHRcdFx0XHRcdFx0JiYgcmVuZGVyQW5kTGluayhzZWxmLCBpbmRleCwgc2VsZi50bXBsLCB2aWV3cywgZGF0YUl0ZW1zLCBzZWxmLmN0eCkgIT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0aWYgKCFzZWxmLl8uc3J0KSB7IC8vIE5vdCBwYXJ0IG9mIGEgJ3NvcnQnIG9uIHJlZnJlc2hcblx0XHRcdFx0XHRcdHNlbGYuZml4SW5kZXgoaW5kZXggKyBpdGVtc0NvdW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LnJlbW92ZVZpZXdzID0gZnVuY3Rpb24oaW5kZXgsIGl0ZW1zQ291bnQsIGtlZXBOb2RlcywgaXNNb3ZlKSB7XG5cdFx0XHQvLyB2aWV3LnJlbW92ZVZpZXdzKCkgcmVtb3ZlcyBhbGwgdGhlIGNoaWxkIHZpZXdzXG5cdFx0XHQvLyB2aWV3LnJlbW92ZVZpZXdzKGluZGV4KSByZW1vdmVzIHRoZSBjaGlsZCB2aWV3IHdpdGggc3BlY2lmaWVkIGluZGV4IG9yIGtleVxuXHRcdFx0Ly8gdmlldy5yZW1vdmVWaWV3cyhpbmRleCwgY291bnQpIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBudW1tYmVyIG9mIGNoaWxkIHZpZXdzLCBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXhcblx0XHRcdGZ1bmN0aW9uIHJlbW92ZVZpZXcoaW5kZXgpIHtcblx0XHRcdFx0dmFyIGlkLCBiaW5kSWQsIHBhcmVudEVsZW0sIHByZXZOb2RlLCBuZXh0Tm9kZSwgbm9kZXNUb1JlbW92ZSxcblx0XHRcdFx0XHR2aWV3VG9SZW1vdmUgPSB2aWV3c1tpbmRleF07XG5cblx0XHRcdFx0aWYgKHZpZXdUb1JlbW92ZSAmJiB2aWV3VG9SZW1vdmUubGluaykge1xuXHRcdFx0XHRcdGlkID0gdmlld1RvUmVtb3ZlLl8uaWQ7XG5cdFx0XHRcdFx0aWYgKCFrZWVwTm9kZXMpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgSFRNTCBub2RlcyBmcm9tIHRoZSBET00sIHVubGVzcyB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIGluY2x1ZGluZyBub2RlcyBvZiBjaGlsZCB2aWV3c1xuXHRcdFx0XHRcdFx0bm9kZXNUb1JlbW92ZSA9IHZpZXdUb1JlbW92ZS5ub2RlcygpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFJlbW92ZSBjaGlsZCB2aWV3cywgd2l0aG91dCByZW1vdmluZyBub2Rlc1xuXHRcdFx0XHRcdHZpZXdUb1JlbW92ZS5yZW1vdmVWaWV3cyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0XHRcdFx0XHR2aWV3VG9SZW1vdmUudHlwZSA9IHVuZGVmaW5lZDsgLy8gU2V0IHR5cGUgdG8gdW5kZWZpbmVkOiB1c2VkIGFzIGEgZmxhZyB0aGF0IHRoaXMgdmlldyBpcyBiZWluZyByZW1vdmVkXG5cdFx0XHRcdFx0cHJldk5vZGUgPSB2aWV3VG9SZW1vdmUuX3Bydjtcblx0XHRcdFx0XHRuZXh0Tm9kZSA9IHZpZXdUb1JlbW92ZS5fbnh0O1xuXHRcdFx0XHRcdHBhcmVudEVsZW0gPSB2aWV3VG9SZW1vdmUucGFyZW50RWxlbTtcblx0XHRcdFx0XHQvLyBJZiBwcmV2Tm9kZSBhbmQgbmV4dE5vZGUgYXJlIHRoZSBzYW1lLCB0aGUgdmlldyBpcyBlbXB0eVxuXHRcdFx0XHRcdGlmICgha2VlcE5vZGVzKSB7XG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgdGhlIEhUTUwgbm9kZXMgZnJvbSB0aGUgRE9NLCB1bmxlc3MgdGhleSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkLCBpbmNsdWRpbmcgbm9kZXMgb2YgY2hpbGQgdmlld3Ncblx0XHRcdFx0XHRcdGlmICh2aWV3VG9SZW1vdmUuX2VsQ250KSB7XG5cdFx0XHRcdFx0XHRcdC8vIGlmIGtlZXBOb2RlcyBpcyBmYWxzZSAoYW5kIHRyYW5zZmVycmluZyBvZiB0b2tlbnMgaGFzIG5vdCBhbHJlYWR5IGJlZW4gZG9uZSBhdCBhIGhpZ2hlciBsZXZlbClcblx0XHRcdFx0XHRcdFx0Ly8gdGhlbiB0cmFuc2ZlciB0b2tlbnMgZnJvbSBwcmV2Tm9kZSB3aGljaCBpcyBiZWluZyByZW1vdmVkLCB0byBuZXh0Tm9kZS5cblx0XHRcdFx0XHRcdFx0dHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgcGFyZW50RWxlbSwgaWQsIFwiX1wiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCQobm9kZXNUb1JlbW92ZSkucmVtb3ZlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghdmlld1RvUmVtb3ZlLl9lbENudCkge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cHJldk5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwcmV2Tm9kZSk7IC8vIChwcmV2Tm9kZS5wYXJlbnROb2RlIGlzIHBhcmVudEVsZW0sIGV4Y2VwdCBpZiBqUXVlcnkgTW9iaWxlIG9yIHNpbWlsYXIgaGFzIGluc2VydGVkIGFuIGludGVybWVkaWF0ZSB3cmFwcGVyXG5cdFx0XHRcdFx0XHRcdG5leHROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobmV4dE5vZGUpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXdUb1JlbW92ZSk7XG5cdFx0XHRcdFx0Zm9yIChiaW5kSWQgaW4gdmlld1RvUmVtb3ZlLl8uYm5kcykge1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcoYmluZElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGVsZXRlIHZpZXdTdG9yZVtpZF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIGN1cnJlbnQsIHZpZXcsIHZpZXdzQ291bnQsXG5cdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRpc0FycmF5ID0gIXNlbGYuXy51c2VLZXksXG5cdFx0XHRcdHZpZXdzID0gc2VsZi52aWV3cztcblxuXHRcdFx0aWYgKGlzQXJyYXkpIHtcblx0XHRcdFx0dmlld3NDb3VudCA9IHZpZXdzLmxlbmd0aDtcblx0XHRcdH1cblx0XHRcdGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIFJlbW92ZSBhbGwgY2hpbGQgdmlld3Ncblx0XHRcdFx0aWYgKGlzQXJyYXkpIHtcblx0XHRcdFx0XHQvLyB2aWV3cyBhbmQgZGF0YSBhcmUgYXJyYXlzXG5cdFx0XHRcdFx0Y3VycmVudCA9IHZpZXdzQ291bnQ7XG5cdFx0XHRcdFx0d2hpbGUgKGN1cnJlbnQtLSkge1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyhjdXJyZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VsZi52aWV3cyA9IFtdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHZpZXdzIGFuZCBkYXRhIGFyZSBvYmplY3RzXG5cdFx0XHRcdFx0Zm9yICh2aWV3IGluIHZpZXdzKSB7XG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgYnkga2V5XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KHZpZXcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZWxmLnZpZXdzID0ge307XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChpdGVtc0NvdW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoaXNBcnJheSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHBhcmVudFZpZXcgaXMgZGF0YSBhcnJheSB2aWV3LlxuXHRcdFx0XHRcdFx0Ly8gU2V0IGl0ZW1zQ291bnQgdG8gMSwgdG8gcmVtb3ZlIHRoaXMgaXRlbVxuXHRcdFx0XHRcdFx0aXRlbXNDb3VudCA9IDE7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBjaGlsZCB2aWV3IHdpdGgga2V5ICdpbmRleCdcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXcoaW5kZXgpO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHZpZXdzW2luZGV4XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGlzQXJyYXkgJiYgaXRlbXNDb3VudFxuXHRcdFx0XHRcdCYmIChpc01vdmUgfHwgdmlld3NDb3VudCAtIGl0ZW1zQ291bnQgPT09IHNlbGYuZGF0YS5sZW5ndGgpKSB7IC8vIElmIHZpZXdzIG5vdCBhbHJlYWR5IHN5bmNlZCB0byBhcnJheSAoZS5nLiB0cmlnZ2VyZWQgYnkgYXJyYXkubGVuZ3RoIHByb3BlcnR5Q2hhbmdlIC0ganN2aWV3cy9pc3N1ZXMvMzAxKVxuXHRcdFx0XHRcdGN1cnJlbnQgPSBpbmRleCArIGl0ZW1zQ291bnQ7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGluZGV4ZWQgaXRlbXMgKHBhcmVudFZpZXcgaXMgZGF0YSBhcnJheSB2aWV3KTtcblx0XHRcdFx0XHR3aGlsZSAoY3VycmVudC0tID4gaW5kZXgpIHtcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXcoY3VycmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZpZXdzLnNwbGljZShpbmRleCwgaXRlbXNDb3VudCk7XG5cdFx0XHRcdFx0aWYgKCFzZWxmLl8uc29ydCkge1xuXHRcdFx0XHRcdFx0c2VsZi5maXhJbmRleChpbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdHBhcmVudCA9IHNlbGYucGFyZW50O1xuXG5cdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdHJlbmRlckFuZExpbmsoc2VsZiwgc2VsZi5pbmRleCwgc2VsZi50bXBsLCBwYXJlbnQudmlld3MsIHNlbGYuZGF0YSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0c2V0QXJyYXlDaGFuZ2VMaW5rKHNlbGYpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0YWdPclZpZXcuZml4SW5kZXggPSBmdW5jdGlvbihmcm9tSW5kZXgpIHtcblx0XHRcdC8vIEZpeHVwIGluZGV4IG9uIGZvbGxvd2luZyB2aWV3IGl0ZW1zLi4uXG5cdFx0XHR2YXIgdmlld3MgPSB0aGlzLnZpZXdzLFxuXHRcdFx0XHRpbmRleCA9IHZpZXdzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChmcm9tSW5kZXggPCBpbmRleC0tKSB7XG5cdFx0XHRcdGlmICh2aWV3c1tpbmRleF0uaW5kZXggIT09IGluZGV4KSB7XG5cdFx0XHRcdFx0JG9ic2VydmFibGUodmlld3NbaW5kZXhdKS5zZXRQcm9wZXJ0eShcImluZGV4XCIsIGluZGV4KTtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGZpeGluZyB1cCBpbmRleCwgYnV0IG5vdCBrZXksIGFuZCBub3QgaW5kZXggb24gY2hpbGQgdmlld3MuIEZyb20gY2hpbGQgdmlld3MsIHVzZSB2aWV3LmdldEluZGV4KClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0YWdPclZpZXcubGluayA9IHZpZXdMaW5rO1xuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBKc1ZpZXdzLXNwZWNpZmljIGNvbnZlcnRlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRjb252ZXJ0ZXJzLm1lcmdlID0gZnVuY3Rpb24odmFsKSB7XG5cdC8vIFNwZWNpYWwgY29udmVydGVyIHVzZWQgaW4gZGF0YS1saW5raW5nIHRvIHNwYWNlLXNlcGFyYXRlZCBsaXN0cywgc3VjaCBhcyBjbGFzc05hbWU6XG5cdC8vIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHRvZ2dsZSBzZW1hbnRpY3MgLSBhbmQgaGFzIG5vIGVmZmVjdCBpZiB0b2dnbGUgc3RyaW5nIGlzIG5vdCBzcGVjaWZpZWRcblx0Ly8gZGF0YS1saW5rPVwiY2xhc3N7bWVyZ2U6Ym9vbEV4cHIgdG9nZ2xlPWNsYXNzTmFtZX1cIlxuXHR2YXIgcmVndWxhckV4cHJlc3Npb24sXG5cdFx0Y3VycmVudFZhbHVlID0gdGhpcy5saW5rQ3R4Ll92YWwgfHwgXCJcIixcblx0XHR0b2dnbGUgPSB0aGlzLnRhZ0N0eC5wcm9wcy50b2dnbGU7XG5cblx0aWYgKHRvZ2dsZSkge1xuXHRcdC8vIFdlIGFyZSB0b2dnbGluZyB0aGUgY2xhc3Mgc3BlY2lmaWVkIGJ5IHRoZSB0b2dnbGUgcHJvcGVydHksXG5cdFx0Ly8gYW5kIHRoZSBib29sZWFuIHZhbCBiaW5kaW5nIGlzIGRyaXZpbmcgdGhlIGluc2VydC9yZW1vdmUgdG9nZ2xlXG5cblx0XHRyZWd1bGFyRXhwcmVzc2lvbiA9IHRvZ2dsZS5yZXBsYWNlKC9bXFxcXF4kLnw/KisoKVt7XS9nLCBcIlxcXFwkJlwiKTtcblx0XHQvLyBFc2NhcGUgYW55IHJlZ3VsYXIgZXhwcmVzc2lvbiBzcGVjaWFsIGNoYXJhY3RlcnMgKG1ldGFjaGFyYWN0ZXJzKSB3aXRoaW4gdGhlIHRvZ2dsZSBzdHJpbmdcblx0XHRyZWd1bGFyRXhwcmVzc2lvbiA9IFwiKFxcXFxzKD89XCIgKyByZWd1bGFyRXhwcmVzc2lvbiArIFwiJCl8KFxcXFxzKXxeKShcIiArIHJlZ3VsYXJFeHByZXNzaW9uICsgXCIoXFxcXHN8JCkpXCI7XG5cdFx0Ly8gRXhhbXBsZTogLyhcXHMoPz1teWNsYXNzJCl8KFxccyl8Xik/KG15Y2xhc3MoXFxzfCQpKS8gLSBzbyBtYXRjaGVzIChcIiBteWNsYXNzXCIgb3IgXCIgXCIgb3IgXiApIGZvbGxvd2VkIGJ5IChcIm15Y2xhc3MgXCIgb3IgXCJteWNsYXNzJFwiKSB3aGVyZSBeLyQgYXJlIGJlZ2lubmluZy9lbmQgb2Ygc3RyaW5nXG5cdFx0Y3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChyZWd1bGFyRXhwcmVzc2lvbiksIFwiJDJcIik7XG5cdFx0dmFsID0gY3VycmVudFZhbHVlICsgKHZhbCA/IChjdXJyZW50VmFsdWUgJiYgXCIgXCIpICsgdG9nZ2xlIDogXCJcIik7XG5cdH1cblx0cmV0dXJuIHZhbDtcbn07XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBKc1ZpZXdzLXNwZWNpZmljIHRhZ3Ncbi8vPT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGtlZXBQYXJlbnREYXRhQ3R4KHZhbCkge1xuXHRyZXR1cm4gdGhpcy50YWdDdHgudmlldzsgLy8gUmV0dXJuIHRoZSBwYXJlbnQgdmlldyBhcyBkYXRhIGNvbnRleHQgZm9yIHJlbmRlcmluZyBibG9jayBjb250ZW50XG59XG5cbiR0YWdzKHtcblx0b246IHtcblx0XHRhdHRyOiBOT05FLFxuXHRcdGluaXQ6IGZ1bmN0aW9uKHRhZ0N0eCkge1xuXHRcdFx0dmFyIGNvbnRlbnQsXG5cdFx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRhcmdzID0gdGFnQ3R4LmFyZ3MsIC8vIFtldmVudHMsXSBbc2VsZWN0b3IsXSBoYW5kbGVyXG5cdFx0XHRcdGwgPSBhcmdzLmxlbmd0aDtcblxuXHRcdFx0Zm9yICg7IGk8bCAmJiAhJGlzRnVuY3Rpb24oYXJnc1tpXSk7IGkrKyk7IC8vIEhhbmRsZXIgaXMgZmlyc3QgYXJnIG9mIHR5cGUgZnVuY3Rpb25cblx0XHRcdHRhZy5faGkgPSBsPmkgJiYgaSsxOyAvLyBoYW5kbGVyIGluZGV4XG5cdFx0XHRpZiAodGFnLl8uaW5saW5lKSB7XG5cdFx0XHRcdGlmICghJHN1Yi5yVG1wbC5leGVjKGNvbnRlbnQgPSB0YWdDdHgudG1wbC5tYXJrdXApKSB7XG5cdFx0XHRcdFx0Ly8gSW5saW5lIHtee29ufX0gdGFnIHdpdGggbm8gY29udGVudCAob3IgZXh0ZXJuYWwgdGVtcGxhdGUgY29udGVudCkgb3Igd2l0aCBjb250ZW50IGNvbnRhaW5pbmdcblx0XHRcdFx0XHQvLyBubyBIVE1MIG9yIEpzUmVuZGVyIHRhZ3M6IFdlIHdpbGwgd3JhcCB0aGUgKHRleHQpIGNvbnRlbnQsIG9yIHRoZSBvcGVyYXRpb24gbmFtZSBpbiBhIDxidXR0b24+IGVsZW1lbnRcblx0XHRcdFx0XHQvLyAoT3RoZXJ3aXNlIHdlIHdpbGwgYXR0YWNoIHRoZSBoYW5kbGVyIHRvIHRoZSBlbGVtZW50IGNvbnRlbnQgYWZ0ZXIgZGF0YS1saW5raW5nKVxuXHRcdFx0XHRcdHRhZy50ZW1wbGF0ZSA9IFwiPGJ1dHRvbj5cIiArICgkLnRyaW0oY29udGVudCkgfHwgdGFnQ3R4LnBhcmFtcy5hcmdzW2ldIHx8IFwibm9vcFwiKSArIFwiPC9idXR0b24+XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGFnLmF0dHIgPSBIVE1MO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25BZnRlckxpbms6IGZ1bmN0aW9uKHRhZ0N0eCwgbGlua0N0eCkge1xuXHRcdFx0dmFyIGhhbmRsZXIsIHBhcmFtcywgZmluZCwgYWN0aXZlRWxlbSxcblx0XHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdFx0aSA9IHRhZy5faGksXG5cdFx0XHRcdGFyZ3MgPSB0YWdDdHguYXJncywgLy8gW2V2ZW50cyxdIFtzZWxlY3RvcixdIGhhbmRsZXJcblx0XHRcdFx0bCA9IGFyZ3MubGVuZ3RoLFxuXHRcdFx0XHRwcm9wcyA9IHRhZ0N0eC5wcm9wcyxcblx0XHRcdFx0ZGF0YSA9IHByb3BzLmRhdGEsXG5cdFx0XHRcdHZpZXcgPSB0YWdDdHgudmlldyxcblx0XHRcdFx0Y29udGV4dE9iID0gcHJvcHMuY29udGV4dDsgLy8gQ29udGV4dCAoJ3RoaXMnIHBvaW50ZXIpIGZvciBhdHRhY2hlZCBoYW5kbGVyXG5cblx0XHRcdGlmIChpKSB7IC8vIFRoZXJlIGlzIGEgaGFuZGxlclxuXHRcdFx0XHRoYW5kbGVyID0gYXJnc1tpLTFdO1xuXHRcdFx0XHRwYXJhbXMgPSBhcmdzLnNsaWNlKGkpOyAvLyBTdWJzZXF1ZW50IGFyZ3MgYXJlIHBhcmFtc1xuXHRcdFx0XHRhcmdzID0gYXJncy5zbGljZSgwLCBpLTEpOyAvLyBQcmVjZWRpbmcgYXJncyAoaWYgYW55KSBhcmUgZXZlbnRzIGFuZCBzZWxlY3RvclxuXHRcdFx0XHR0YWcuX3NlbCA9IGFyZ3NbMV07IC8vIFNlbGVjdG9yIGZvciBkZXNjZW5kYW50IGVsZW1lbnRzIC0gZm9yIGRlbGVnYXRlZCBldmVudHMgb24gdGhvc2UgZWxlbWVudHMsIGRlbGVnYXRpbmcgdG8gdGhlIGFjdGl2ZUVsZW1cblxuXHRcdFx0XHRhY3RpdmVFbGVtID0gdGFnLmFjdGl2ZUVsZW0gPSB0YWcuYWN0aXZlRWxlbSB8fCAkKHRhZy5fLmlubGluZVxuXHRcdFx0XHRcdD8gKHRhZy5fc2VsID0gYXJnc1sxXSB8fCBcIipcIiwgdGFnLnBhcmVudEVsZW0pXG5cdFx0XHRcdFx0Ly8gSWYgaW5saW5lLCBhdHRhY2ggdG8gY2hpbGQgZWxlbWVudHMgb2YgdGFnIHBhcmVudCBlbGVtZW50IChmaWx0ZXJlZCBieSBzZWxlY3RvciBhcmd1bWVudCBpZiBwcm92aWRlZC5cblx0XHRcdFx0XHQvLyAoSW4gaGFuZGxlciB3ZSdsbCBmaWx0ZXIgb3V0IGV2ZW50cyBmcm9tIHNpYmxpbmcgZWxlbWVudHMgcHJlY2VkaW5nIG9yIGZvbGxvd2luZyB0YWcuKVxuXHRcdFx0XHRcdC8vIFRoaXMgYWxsb3dzIHVzIHRvIHVzZSB0aGUgZGVsZWdhdGVkIHBhdHRlcm4gd2hlcmUgdGhlIGF0dGFjaGVkIGV2ZW50IHdvcmtzIGV2ZW4gZm9yIGFkZGVkIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlIHNlbGVjdG9yXG5cdFx0XHRcdFx0OiBsaW5rQ3R4LmVsZW0pO1xuXG5cdFx0XHRcdGlmICghY29udGV4dE9iKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBwYXRoIGZvciB0aGUgcHJlY2VkaW5nIG9iamVjdCAoY29udGV4dCBvYmplY3QpIG9mIGhhbmRsZXIgKHdoaWNoIGlzIHRoZSBsYXN0IGFyZyksIGNvbXBpbGUgZnVuY3Rpb25cblx0XHRcdFx0XHQvLyB0byByZXR1cm4gdGhhdCBjb250ZXh0IG9iamVjdCwgYW5kIHJ1biBjb21waWxlZCBmdW5jdGlvbiBhZ2FpbnN0IGRhdGFcblx0XHRcdFx0XHRjb250ZXh0T2IgPSAvXiguKilbXFwuXl1bXFx3JF0rJC8uZXhlYyh0YWdDdHgucGFyYW1zLmFyZ3Muc2xpY2UoLXBhcmFtcy5sZW5ndGggLSAxKVswXSk7XG5cdFx0XHRcdFx0Y29udGV4dE9iID0gY29udGV4dE9iICYmICRzdWIudG1wbEZuKGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBjb250ZXh0T2JbMV0gKyBkZWxpbUNsb3NlQ2hhcjAsIHZpZXcudG1wbCwgdHJ1ZSkobGlua0N0eC5kYXRhLCB2aWV3KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0YWcuX2V2cykge1xuXHRcdFx0XHRcdHRhZy5vblVuYmluZCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YWN0aXZlRWxlbS5vbihcblx0XHRcdFx0XHR0YWcuX2V2cyA9IGFyZ3NbMF0gfHwgXCJjbGlja1wiLCAvLyBldmVudHMgZGVmYXVsdHMgdG8gXCJjbGlja1wiXG5cdFx0XHRcdFx0dGFnLl9zZWwsXG5cdFx0XHRcdFx0ZGF0YSA9PSB1bmRlZmluZWQgPyBudWxsIDogZGF0YSxcblx0XHRcdFx0XHR0YWcuX2hsciA9IGZ1bmN0aW9uIGhuZGxyKGV2KSB7XG5cdFx0XHRcdFx0XHR2YXIgbm9kZXMsIGxlbmd0aCxcblx0XHRcdFx0XHRcdFx0Zm91bmQgPSAhdGFnLl8uaW5saW5lO1xuXG5cdFx0XHRcdFx0XHRpZiAoIWZvdW5kKSB7IC8vIElmIGlubGluZSwgZmlsdGVyIG91dCBldmVudHMgZnJvbSBzaWJsaW5nIGVsZW1lbnRzIHByZWNlZGluZyBvciBmb2xsb3dpbmcgdGFnLlxuXHRcdFx0XHRcdFx0XHRub2RlcyA9IHRhZy5jb250ZW50cyhcIipcIik7XG5cdFx0XHRcdFx0XHRcdGwgPSBub2Rlcy5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICghZm91bmQgJiYgbC0tKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG5vZGVzW2xdLmNvbnRhaW5zKGV2LnRhcmdldCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChmb3VuZCkgeyAvLyB0YXJnZXQgZWxlbSBpcyBpbmRlZWQgd2l0aGluIHRoZSB0YWcsIHNvIGNhbGwgdGhlIHtvbn0gaGFuZGxlclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaGFuZGxlci5hcHBseShjb250ZXh0T2IgfHwgbGlua0N0eC5kYXRhLCBbXS5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW1zLCAvLyBlLmcuIHBhcjEsIHBhcjJcblx0XHRcdFx0XHRcdFx0XHRldixcblx0XHRcdFx0XHRcdFx0XHR7Y2hhbmdlOiBldi50eXBlLCB2aWV3OiB2aWV3LCBsaW5rQ3R4OiBsaW5rQ3R4fSxcblx0XHRcdFx0XHRcdFx0XHRwYXJhbXMuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpIC8vIElmIHRyaWdnZXJpbmcgZXZlbnQgKGUuZy4ganN2LWRvbWNoYW5nZSkgaGFzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFmdGVyIGV2LCBwYXNzIHRoZW0gdG9vXG5cdFx0XHRcdFx0XHRcdCkpO1xuXHRcdFx0XHRcdFx0XHQvLyBmb3Ige29uICdjbGljaycgaGFuZGxlciBwYXIxIHBhcjJ9IHVzZSBoYW5kbGVyKHBhcjEsIHBhcjIsIGV2LCBkb21jaGFuZ2VFdmVudEFyZ3MpXG5cdFx0XHRcdFx0XHRcdC8vIGZvciB7b24gJ2pzdi1kb21jaGFuZ2UnIGhhbmRsZXIgcGFyMSBwYXIyfSB1c2UgaGFuZGxlcihwYXIxLCBwYXIyLCBldiwgZG9tY2hhbmdlRXZlbnRBcmdzLCB0YWdDdHgsIGxpbmtDdHgsIG9ic2VydmFibGVFdmVudEFyZ3MpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25VcGRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0b25VbmJpbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXHRcdFx0aWYgKHNlbGYuYWN0aXZlRWxlbSkge1xuXHRcdFx0XHRzZWxmLmFjdGl2ZUVsZW0ub2ZmKHNlbGYuX2V2cywgc2VsZi5fc2VsLCBzZWxmLl9obHIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0ZmxvdzogdHJ1ZSxcblx0XHRjb250ZW50Q3R4OiBrZWVwUGFyZW50RGF0YUN0eCxcblx0XHRkYXRhQm91bmRPbmx5OiB0cnVlXG5cdH0sXG5cdHJhZGlvZ3JvdXA6IHtcblx0XHRpbml0OiBmdW5jdGlvbih0YWdDdHgpIHtcblx0XHRcdHRoaXMubmFtZSA9IHRhZ0N0eC5wcm9wcy5uYW1lIHx8IChcImpzdlwiICsgTWF0aC5yYW5kb20oKSk7XG5cdFx0fSxcblx0XHRvbkJpbmQ6IGZ1bmN0aW9uKHRhZ0N0eCwgbGlua0N0eCkge1xuXHRcdFx0dmFyIGRvbUNobmdDbnRucixcblx0XHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdFx0JGxpbmtlZEVsZW0gPSB0YWcubGlua2VkRWxlbSA9ICh0YWcuXy5pbmxpbmUgPyB0YWcuY29udGVudHModHJ1ZSwgXCJpbnB1dFt0eXBlPXJhZGlvXVwiKSA6ICQobGlua0N0eC5lbGVtKS5maW5kKFwiaW5wdXRbdHlwZT1yYWRpb11cIikpLFxuXHRcdFx0XHRsID0gJGxpbmtlZEVsZW0ubGVuZ3RoO1xuXG5cdFx0XHRpZiAodGFnLl8uaW5saW5lKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBmaXJzdCBlbGVtZW50IGlzIG93bmVkIGJ5IChyZW5kZXJlZCBieSkgdGhpcyB0YWcgKG5vdCBieSBhIGNoaWxkVGFnIHN1Y2ggYXMge157Zm9yfX0pXG5cdFx0XHRcdC8vIHVzZSBpdCBhcyBjb250YWluZXIgZm9yIGRldGVjdGluZyBkb20gY2hhbmdlc1xuXHRcdFx0XHRkb21DaG5nQ250bnIgPSB0YWcuY29udGVudHMoXCIqXCIpWzBdO1xuXHRcdFx0XHRkb21DaG5nQ250bnIgPSBkb21DaG5nQ250bnIgJiYgJC52aWV3KGRvbUNobmdDbnRucikuY3R4LnRhZyA9PT0gdGFnLnBhcmVudCA/IGRvbUNobmdDbnRuciA6IHRhZy5wYXJlbnRFbGVtO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZG9tQ2huZ0NudG5yID0gbGlua0N0eC5lbGVtO1xuXHRcdFx0fVxuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHQvLyBDb25maWd1cmUgdGhlIG5hbWUgZm9yIGVhY2ggcmFkaW8gaW5wdXQgZWxlbWVudFxuXHRcdFx0XHQkbGlua2VkRWxlbVtsXS5uYW1lID0gJGxpbmtlZEVsZW1bbF0ubmFtZSB8fCB0YWcubmFtZTtcblx0XHRcdH1cblx0XHRcdC8vIEVzdGFibGlzaCBhIGRvbWNoYW5nZSBsaXN0ZW5lciBpbiBjYXNlIHRoaXMgcmFkaW9ncm91cCB3cmFwcyBhIHtee2Zvcn19IG9yIHtee2lmfX0gb3Igc2ltaWxhciB3aGljaCBtaWdodCBkeW5hbWljYWxseSBpbnNlcnQgbmV3IHJhZGlvIGlucHV0IGVsZW1lbnRzXG5cdFx0XHQkKGRvbUNobmdDbnRucikub24oXCJqc3YtZG9tY2hhbmdlXCIsIGZ1bmN0aW9uKGV2LCBmb3JPcklmVGFnQ3R4KSB7XG5cdFx0XHRcdHZhciBsaW5rZWRFbGVtLFxuXHRcdFx0XHRcdHBhcmVudFRhZ3MgPSBmb3JPcklmVGFnQ3R4LmN0eC5wYXJlbnRUYWdzO1xuXHRcdFx0XHRpZiAoIXRhZy5fLmlubGluZSB8fCBkb21DaG5nQ250bnIgIT09IHRhZy5wYXJlbnRFbGVtIC8vIFRoZSBkb21DaG5nQ250bnIgaXMgc3BlY2lmaWMgdG8gdGhpcyB0YWdcblx0XHRcdFx0XHQvLyBUaGUgZG9tQ2huZ0NudG5yIGlzIHRoZSBwYXJlbnRFbGVtIG9mIHRoaXMgdGFnLCBzbyBuZWVkIHRvIG1ha2Ugc3VyZSBkb20gY2hhbmdlIGV2ZW50IGlzIGZvclxuXHRcdFx0XHRcdC8vIGEgY29udGVudCBjaGFuZ2Ugd2l0aGluIHRoaXMgdGFnLCBub3Qgb3V0c2lkZSBpdC5cblx0XHRcdFx0XHR8fCBwYXJlbnRUYWdzICYmIHBhcmVudFRhZ3NbdGFnLnRhZ05hbWVdID09PSB0YWcpIHtcblx0XHRcdFx0XHQvLyBDb250ZW50cyBoYXZlIGNoYW5nZWQgc28gcmVjcmVhdGUgJGxpbmtlZEVsZW0gZm9yIHRoZSByYWRpbyBpbnB1dCBlbGVtZW50cyAoaW5jbHVkaW5nIHBvc3NpYmxlIG5ldyBvbmUganVzdCBpbnNlcnRlZClcblx0XHRcdFx0XHQkbGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtID0gdGFnLmNvbnRlbnRzKHRydWUsIFwiaW5wdXRbdHlwZT1yYWRpb11cIik7XG5cdFx0XHRcdFx0bCA9ICRsaW5rZWRFbGVtLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdFx0XHQvLyBDb25maWd1cmUgYmluZGluZyAgYW5kIG5hbWUgZm9yIGVhY2ggcmFkaW8gaW5wdXQgZWxlbWVudFxuXHRcdFx0XHRcdFx0bGlua2VkRWxlbSA9ICRsaW5rZWRFbGVtW2xdO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5fanN2TGtFbCA9IHRhZztcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0ubmFtZSA9IGxpbmtlZEVsZW0ubmFtZSB8fCB0YWcubmFtZTtcblx0XHRcdFx0XHRcdGJpbmRUbyhiaW5kaW5nU3RvcmVbdGFnLl90Z0lkXSwgdGFnLCBsaW5rZWRFbGVtKTtcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0uX2pzdkJuZCA9IFwiJlwiICsgdGFnLl90Z0lkICsgXCIrXCI7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLmNoZWNrZWQgPSB0YWcuY3Z0QXJncygpWzBdID09PSBsaW5rZWRFbGVtLnZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRvblVwZGF0ZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgdGFnQ3R4cykge1xuXHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBkb24ndCByZXJlbmRlclxuXHRcdH0sXG5cdFx0Y29udGVudEN0eDoga2VlcFBhcmVudERhdGFDdHgsXG5cdFx0ZGF0YUJvdW5kT25seTogdHJ1ZVxuXHR9XG59KTtcblxuJGV4dGVuZCgkdGFnc1tcImZvclwiXSwge1xuXHQvL29uVXBkYXRlOiBmdW5jdGlvbihldiwgZXZlbnRBcmdzLCBuZXdUYWdDdHhzKSB7XG5cdFx0Ly9Db25zaWRlciBhZGRpbmcgZmlsdGVyaW5nIGZvciBwZXJmIG9wdGltaXphdGlvbi4gSG93ZXZlciB0aGUgYmVsb3cgcHJldmVudHMgdXBkYXRlIG9uIHNvbWUgc2NlbmFyaW9zIHdoaWNoIF9zaG91bGRfIHVwZGF0ZSAtIG5hbWVseSB3aGVuIHRoZXJlIGlzIGFub3RoZXIgYXJyYXkgb24gd2hpY2ggZm9yIGFsc28gZGVwZW5kcy5cblx0XHQvL3ZhciBpLCBsLCB0Y2ksIHByZXZBcmc7XG5cdFx0Ly9mb3IgKHRjaSA9IDA7IChwcmV2QXJnID0gdGhpcy50YWdDdHhzW3RjaV0pICYmIHByZXZBcmcuYXJncy5sZW5ndGg7IHRjaSsrKSB7XG5cdFx0Ly9cdGlmIChwcmV2QXJnLmFyZ3NbMF0gIT09IG5ld1RhZ0N0eHNbdGNpXS5hcmdzWzBdKSB7XG5cdFx0Ly9cdFx0cmV0dXJuIHRydWU7XG5cdFx0Ly9cdH1cblx0XHQvL31cblx0XHQvL3JldHVybiBmYWxzZTtcblx0Ly99LFxuXHRvbkFycmF5Q2hhbmdlOiBmdW5jdGlvbihldiwgZXZlbnRBcmdzLCB0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHR2YXIgYXJyYXlWaWV3LFxuXHRcdFx0dGFyZ2V0ID0gZXYudGFyZ2V0LFxuXHRcdFx0dGFyZ2V0TGVuZ3RoID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRjaGFuZ2UgPSBldmVudEFyZ3MuY2hhbmdlO1xuXHRcdGlmICh0YWcuXy5ub1Z3cyAvLyBDaGlsZCB2aWV3cyBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgdGFyZ2V0IGlzIG5vdCBodG1sIC0gZS5nLiBkYXRhLWxpbms9XCJ0aXRsZXtmb3IgLi4ufVwiXG5cdFx0XHR8fCB0YWcudGFnQ3R4c1sxXSAmJiAoIC8vIFRoZXJlIGlzIGFuIHt7ZWxzZX19XG5cdFx0XHRcdGNoYW5nZSA9PT0gXCJpbnNlcnRcIiAmJiB0YXJnZXRMZW5ndGggPT09IGV2ZW50QXJncy5pdGVtcy5sZW5ndGggLy8gaW5zZXJ0aW5nLCBhbmQgbmV3IGxlbmd0aCBpcyBzYW1lIGFzIGluc2VydGVkIGxlbmd0aCwgc28gZ29pbmcgZnJvbSAwIHRvIG5cblx0XHRcdFx0fHwgY2hhbmdlID09PSBcInJlbW92ZVwiICYmICF0YXJnZXRMZW5ndGggLy8gcmVtb3ZpbmcgLCBhbmQgbmV3IGxlbmd0aCAwLCBzbyBnb2luZyBmcm9tIG4gdG8gMFxuXHRcdFx0KSkge1xuXHRcdFx0dGFnLnJlZnJlc2goKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChhcnJheVZpZXcgaW4gdGFnLl8uYXJyVndzKSB7XG5cdFx0XHRcdGFycmF5VmlldyA9IHRhZy5fLmFyclZ3c1thcnJheVZpZXddO1xuXHRcdFx0XHRpZiAoYXJyYXlWaWV3LmRhdGEgPT09IHRhcmdldCkge1xuXHRcdFx0XHRcdGFycmF5Vmlldy5fLm9uQXJyYXlDaGFuZ2UuYXBwbHkoYXJyYXlWaWV3LCBhcmd1bWVudHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRhZy5kb21DaGFuZ2UodGFnQ3R4LCBsaW5rQ3R4LCBldmVudEFyZ3MpO1xuXHRcdGV2LmRvbmUgPSB0cnVlO1xuXHR9LFxuXHRvbkFmdGVyTGluazogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0dmFyIGksIGFyckhhbmRsZXIsIGFyckJpbmRpbmcsIGRhdGEsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0YXJyYXlCaW5kaW5ncyA9IHRhZy5fYXJzIHx8IHt9LFxuXHRcdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzLFxuXHRcdFx0bCA9IHRhZ0N0eHMubGVuZ3RoLFxuXHRcdFx0c2VsZWN0ZWQgPSB0YWcuc2VsZWN0ZWQgfHwgMDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPD0gc2VsZWN0ZWQ7IGkrKykge1xuXHRcdFx0dGFnQ3R4ID0gdGFnQ3R4c1tpXTsgICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0YWdDdHhzIHVwIHRvIHNlbGVjdGVkXG5cdFx0XHRkYXRhID0gdGFnQ3R4Lm1hcFxuXHRcdFx0XHQ/IHRhZ0N0eC5tYXAudGd0ICAgICAgICAvLyAnZGF0YScgaXMgbWFwcGVkIGRhdGFcblx0XHRcdFx0OiB0YWdDdHguYXJncy5sZW5ndGhcblx0XHRcdFx0XHQ/IHRhZ0N0eC5hcmdzWzBdICAgIC8vIG9yIGFyZ3NbMF1cblx0XHRcdFx0XHQ6IHRhZ0N0eC52aWV3LmRhdGE7IC8vIG9yIGRlZmF1bHRzIHRvIGN1cnJlbnQgZGF0YS5cblxuXHRcdFx0aWYgKChhcnJCaW5kaW5nID0gYXJyYXlCaW5kaW5nc1tpXSkgJiYgZGF0YSAhPT0gYXJyQmluZGluZ1swXSkgeyAvLyBJcyB0aGVyZSBwcmV2aW91cyBhcnJheSBkYXRhIG9uIHRoaXMgdGFnQ3R4LCBkaWZmZXJlbnQgZnJvbSBuZXcgZGF0YVxuXHRcdFx0XHQkb2JzZXJ2ZShhcnJCaW5kaW5nWzBdLCBhcnJCaW5kaW5nWzFdLCB0cnVlKTsgLy91bm9ic2VydmUgcHJldmlvdXMgYXJyYXlcblx0XHRcdFx0ZGVsZXRlIGFycmF5QmluZGluZ3NbaV07XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWFycmF5QmluZGluZ3NbaV0gJiYgJGlzQXJyYXkoZGF0YSkpIHtcblx0XHRcdFx0JG9ic2VydmUoZGF0YSwgYXJySGFuZGxlciA9IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MpIHtcblx0XHRcdFx0XHR2YXIgdGFnQ3QgPSB0YWdDdHg7XG5cdFx0XHRcdFx0dGFnLm9uQXJyYXlDaGFuZ2UoZXYsIGV2ZW50QXJncywgdGFnQ3QsIGxpbmtDdHgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YXJyYXlCaW5kaW5nc1tpXSA9IFtkYXRhLCBhcnJIYW5kbGVyXTsgLy8gU3RvcmUgYXJyYXkgZGF0YSBhbmQgYXJyYXlDaGFuZ2VIYW5kbGVyIG9uIHRhZy5fYXJzW2ldXG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoaSA9IHNlbGVjdGVkICsgMTsgaSA8IGw7IGkrKykgeyAvLyBJZiB0aGVyZSB3ZXJlIHByZXZpb3VzIGJpbmRpbmdzIG9uIGxhdGVyIHRhZ0N0eHMsIHJlbW92ZSB0aGVtXG5cdFx0XHRpZiAoYXJyQmluZGluZyA9IGFycmF5QmluZGluZ3NbaV0pIHtcblx0XHRcdFx0JG9ic2VydmUoYXJyQmluZGluZ1swXSwgYXJyQmluZGluZ1sxXSwgdHJ1ZSk7IC8vdW5vYnNlcnZlIHByZXZpb3VzIGJpbmRpbmdcblx0XHRcdFx0ZGVsZXRlIGFycmF5QmluZGluZ3NbaV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRhZy5fYXJzID0gYXJyYXlCaW5kaW5ncztcblx0fSxcblx0b25EaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbCwgdGFnID0gdGhpcztcblx0XHRmb3IgKGwgaW4gdGFnLl9hcnMpIHtcblx0XHRcdCRvYnNlcnZlKHRhZy5fYXJzW2xdWzBdLCB0YWcuX2Fyc1tsXVsxXSwgdHJ1ZSk7IC8vdW5vYnNlcnZlXG5cdFx0fVxuXHR9XG59KTtcblxuJGV4dGVuZCgkdGFnc1tcImlmXCJdLCB7XG5cdG9uVXBkYXRlOiBmdW5jdGlvbihldiwgZXZlbnRBcmdzLCBuZXdUYWdDdHhzKSB7XG5cdFx0dmFyIHRjaSwgcHJldkFyZywgZGlmZmVyZW50O1xuXHRcdGZvciAodGNpID0gMDsgKHByZXZBcmcgPSB0aGlzLnRhZ0N0eHNbdGNpXSk7IHRjaSsrKSB7XG5cdFx0XHRkaWZmZXJlbnQgPSBwcmV2QXJnLnByb3BzLnRtcGwgIT09IG5ld1RhZ0N0eHNbdGNpXS5wcm9wcy50bXBsIHx8IHByZXZBcmcuYXJncy5sZW5ndGggJiYgIShwcmV2QXJnID0gcHJldkFyZy5hcmdzWzBdKSAhPT0gIW5ld1RhZ0N0eHNbdGNpXS5hcmdzWzBdO1xuXHRcdFx0aWYgKCghdGhpcy5jb252ZXJ0ICYmICEhcHJldkFyZykgfHwgZGlmZmVyZW50KSB7XG5cdFx0XHRcdHJldHVybiBkaWZmZXJlbnQ7XG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIG5vdCBhIGNoYW5nZSBvZiB0ZW1wbGF0ZSwgYW5kIHRoZXJlIGlzIG5vIGNvbnZlcnRlciwgYW5kIG5ld0FyZyBhbmQgcHJldkFyZyBhcmUgYm90aCB0cnV0aHksIHJldHVybiBmYWxzZSB0byBjYW5jZWwgdXBkYXRlLlxuXHRcdFx0XHQvLyAoRXZlbiBpZiB2YWx1ZXMgb24gbGF0ZXIgZWxzZXMgYXJlIGRpZmZlcmVudCwgd2Ugc3RpbGwgZG9uJ3Qgd2FudCB0byB1cGRhdGUsIHNpbmNlIHJlbmRlcmVkIG91dHB1dCB3b3VsZCBiZSB1bmNoYW5nZWQpXG5cdFx0XHRcdC8vIElmIG5ld0FyZyBhbmQgcHJldkFyZyBhcmUgZGlmZmVyZW50LCByZXR1cm4gdHJ1ZSwgdG8gdXBkYXRlXG5cdFx0XHRcdC8vIElmIG5ld0FyZyBhbmQgcHJldkFyZyBhcmUgYm90aCBmYWxzZXksIG1vdmUgdG8gdGhlIG5leHQge3tlbHNlIC4uLn19XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIEJvb2xlYW4gdmFsdWUgb2YgYWxsIGFyZ3MgYXJlIHVuY2hhbmdlZCAoZmFsc2V5KSwgc28gcmV0dXJuIGZhbHNlIHRvIGNhbmNlbCB1cGRhdGVcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdG9uQWZ0ZXJMaW5rOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgsIGN0eCwgZXYsIGV2ZW50QXJncykge1xuXHRcdGlmIChldmVudEFyZ3MpIHtcblx0XHRcdHRoaXMuZG9tQ2hhbmdlKHRhZ0N0eCwgbGlua0N0eCwgZXZlbnRBcmdzKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5mdW5jdGlvbiBvYnNlcnZlUHJvcHMobWFwLCBldiwgZXZlbnRBcmdzKSB7XG5cdGlmIChldmVudEFyZ3MuY2hhbmdlID09PSBcInNldFwiKSB7XG5cdFx0dmFyIHRhcmdldCA9IG1hcC50Z3QsXG5cdFx0XHRsID0gdGFyZ2V0Lmxlbmd0aDtcblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRpZiAodGFyZ2V0W2xdLmtleSA9PT0gZXZlbnRBcmdzLnBhdGgpIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChsID09PSAtMSkge1xuXHRcdFx0aWYgKGV2ZW50QXJncy5wYXRoICYmICFldmVudEFyZ3MucmVtb3ZlKSB7XG5cdFx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldCkuaW5zZXJ0KHtrZXk6IGV2ZW50QXJncy5wYXRoLCBwcm9wOiBldmVudEFyZ3MudmFsdWV9KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGV2ZW50QXJncy5yZW1vdmUpIHtcblx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldCkucmVtb3ZlKGwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkb2JzZXJ2YWJsZSh0YXJnZXRbbF0pLnNldFByb3BlcnR5KFwicHJvcFwiLCBldmVudEFyZ3MudmFsdWUpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBvYnNlcnZlTWFwcGVkUHJvcHMobWFwLCBldiwgZXZlbnRBcmdzKSB7XG5cdHZhciBpdGVtLFxuXHRcdHNvdXJjZSA9IG1hcC5zcmMsXG5cdFx0Y2hhbmdlID0gZXZlbnRBcmdzLmNoYW5nZTtcblxuXHRpZiAoY2hhbmdlID09PSBcInNldFwiKSB7XG5cdFx0aWYgKGV2ZW50QXJncy5wYXRoID09PSBcInByb3BcIikge1xuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5zZXRQcm9wZXJ0eShldi50YXJnZXQua2V5LCBldmVudEFyZ3MudmFsdWUpO1xuXHRcdH0gZWxzZSB7IC8vIHBhdGggPT09IFwia2V5XCJcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkucmVtb3ZlUHJvcGVydHkoZXZlbnRBcmdzLm9sZFZhbHVlKTsgLy8gV2hlbiBrZXkgaXMgbW9kaWZpZWQgb2JzZXJ2YWJseSwgcmVtb3ZlIG9sZCBvbmUgYW5kIHNldCBuZXcgb25lXG5cdFx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnNldFByb3BlcnR5KGV2ZW50QXJncy52YWx1ZSwgZXYudGFyZ2V0LnByb3ApO1xuXHRcdH1cblx0fSBlbHNlIGlmIChjaGFuZ2UgPT09IFwicmVtb3ZlXCIpIHtcblx0XHRpdGVtID0gZXZlbnRBcmdzLml0ZW1zWzBdO1xuXHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkucmVtb3ZlUHJvcGVydHkoaXRlbS5rZXkpO1xuXHRcdGRlbGV0ZSBzb3VyY2VbaXRlbS5rZXldO1xuXHR9IGVsc2UgaWYgKGNoYW5nZSA9PT0gXCJpbnNlcnRcIikge1xuXHRcdGl0ZW0gPSBldmVudEFyZ3MuaXRlbXNbMF07XG5cdFx0aWYgKGl0ZW0ua2V5KSB7XG5cdFx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnNldFByb3BlcnR5KGl0ZW0ua2V5LCBpdGVtLnByb3ApO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBzaGFsbG93QXJyYXlGaWx0ZXIoYWxsUGF0aCAvKiwgb2JqZWN0LCBwYXJlbnRPYnMqLykgeyAvLyBGaWx0ZXIgdXNlZCBieSB7e3Byb3BzfX0gZm9yIHRoZSBtYXBwZWRQcm9wcyB0YXJnZXQgYXJyYXlcblx0cmV0dXJuIGFsbFBhdGguaW5kZXhPZihcIi5cIikgPCAwO1xufVxuXG4kdGFncyhcInByb3BzXCIsIHtcblx0YmFzZVRhZzogXCJmb3JcIixcblx0ZGF0YU1hcDogJHZpZXdzLm1hcCh7XG5cdFx0Z2V0VGd0OiAkdGFncy5wcm9wcy5kYXRhTWFwLmdldFRndCxcblx0XHRvYnNTcmM6IG9ic2VydmVQcm9wcyxcblx0XHRvYnNUZ3Q6IG9ic2VydmVNYXBwZWRQcm9wcyxcblx0XHR0Z3RGbHQ6IHNoYWxsb3dBcnJheUZpbHRlclxuXHR9KSxcblx0ZmxvdzogdHJ1ZVxufSk7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgalF1ZXJ5IG5hbWVzcGFjZVxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cblxuJGV4dGVuZCgkLCB7XG5cblx0Ly89PT09PT09PT09PT09PT09PT09PT09PVxuXHQvLyBqUXVlcnkgJC52aWV3KCkgcGx1Z2luXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT1cblxuXHR2aWV3OiAkdmlldyA9IGZ1bmN0aW9uKG5vZGUsIGlubmVyLCB0eXBlKSB7XG5cdFx0Ly8gJC52aWV3KCkgcmV0dXJucyB0b3Agdmlld1xuXHRcdC8vICQudmlldyhub2RlKSByZXR1cm5zIHZpZXcgdGhhdCBjb250YWlucyBub2RlXG5cdFx0Ly8gJC52aWV3KHNlbGVjdG9yKSByZXR1cm5zIHZpZXcgdGhhdCBjb250YWlucyBmaXJzdCBzZWxlY3RlZCBlbGVtZW50XG5cdFx0Ly8gJC52aWV3KG5vZGVPclNlbGVjdG9yLCB0eXBlKSByZXR1cm5zIG5lYXJlc3QgY29udGFpbmluZyB2aWV3IG9mIGdpdmVuIHR5cGVcblx0XHQvLyAkLnZpZXcobm9kZU9yU2VsZWN0b3IsIFwicm9vdFwiKSByZXR1cm5zIHJvb3QgY29udGFpbmluZyB2aWV3IChjaGlsZCBvZiB0b3Agdmlldylcblx0XHQvLyAkLnZpZXcobm9kZU9yU2VsZWN0b3IsIHRydWUsIHR5cGUpIHJldHVybnMgbmVhcmVzdCBpbm5lciAoY29udGFpbmVkKSB2aWV3IG9mIGdpdmVuIHR5cGVcblxuXHRcdGZ1bmN0aW9uIGdldElubmVyVmlldyhuZCwgaXNWbCkge1xuXHRcdFx0aWYgKG5kKSB7XG5cdFx0XHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3MobmQsIGlzVmwsIHJPcGVuVmlld01hcmtlcnMpO1xuXHRcdFx0XHRmb3IgKGogPSAwLCBrID0gdndJbmZvcy5sZW5ndGg7IGogPCBrOyBqKyspIHtcblx0XHRcdFx0XHRpZiAoKHZpZXcgPSB2aWV3U3RvcmVbdndJbmZvc1tqXS5pZF0pICYmICh2aWV3ID0gdmlldyAmJiB0eXBlID8gdmlldy5nZXQodHJ1ZSwgdHlwZSkgOiB2aWV3KSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGlubmVyICE9PSAhIWlubmVyKSB7XG5cdFx0XHQvLyBpbm5lciBub3QgYm9vbGVhbiwgc28gdGhpcyBpcyB2aWV3KG5vZGVPclNlbGVjdG9yLCB0eXBlKVxuXHRcdFx0dHlwZSA9IGlubmVyO1xuXHRcdFx0aW5uZXIgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHZhciB2aWV3LCB2d0luZm9zLCBpLCBqLCBrLCBsLCBlbGVtcyxcblx0XHRcdGxldmVsID0gMCxcblx0XHRcdGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXG5cdFx0aWYgKG5vZGUgJiYgbm9kZSAhPT0gYm9keSAmJiB0b3BWaWV3Ll8udXNlS2V5ID4gMSkge1xuXHRcdFx0Ly8gUGVyZiBvcHRpbWl6YXRpb24gZm9yIGNvbW1vbiBjYXNlc1xuXG5cdFx0XHRub2RlID0gXCJcIiArIG5vZGUgPT09IG5vZGVcblx0XHRcdFx0PyAkKG5vZGUpWzBdXG5cdFx0XHRcdDogbm9kZS5qcXVlcnlcblx0XHRcdFx0XHQ/IG5vZGVbMF1cblx0XHRcdFx0XHQ6IG5vZGU7XG5cblx0XHRcdGlmIChub2RlKSB7XG5cdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdGdldElubmVyVmlldyhub2RlLl9kZiwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCF2aWV3KSB7XG5cdFx0XHRcdFx0XHQvLyBUcmVhdCBzdXBwbGllZCBub2RlIGFzIGEgY29udGFpbmVyIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgZmlyc3QgdmlldyBlbmNvdW50ZXJlZC5cblx0XHRcdFx0XHRcdGVsZW1zID0gcXNhID8gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKGJpbmRFbHNTZWwpIDogJChiaW5kRWxzU2VsLCBub2RlKS5nZXQoKTtcblx0XHRcdFx0XHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyAhdmlldyAmJiBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGdldElubmVyVmlldyhlbGVtc1tpXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB2aWV3O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHdoaWxlIChub2RlKSB7XG5cdFx0XHRcdFx0Ly8gTW92ZSBiYWNrIHRocm91Z2ggc2libGluZ3MgYW5kIHVwIHRocm91Z2ggcGFyZW50cyB0byBmaW5kIHByZWNlZGluZyBub2RlIHdoaWNoIGlzIGEgX3BydiAocHJldk5vZGUpXG5cdFx0XHRcdFx0Ly8gc2NyaXB0IG1hcmtlciBub2RlIGZvciBhIG5vbi1lbGVtZW50LWNvbnRlbnQgdmlldywgb3IgYSBfcHJ2IChmaXJzdCBub2RlKSBmb3IgYW4gZWxDbnQgdmlld1xuXHRcdFx0XHRcdGlmICh2d0luZm9zID0gdmlld0luZm9zKG5vZGUsIHVuZGVmaW5lZCwgclZpZXdNYXJrZXJzKSkge1xuXHRcdFx0XHRcdFx0bCA9IHZ3SW5mb3MubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdFx0XHR2aWV3ID0gdndJbmZvc1tsXTtcblx0XHRcdFx0XHRcdFx0aWYgKHZpZXcub3Blbikge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChsZXZlbCA8IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZpZXcgPSB2aWV3U3RvcmVbdmlldy5pZF07XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdmlldyAmJiB0eXBlID8gdmlldy5nZXQodHlwZSkgOiB2aWV3IHx8IHRvcFZpZXc7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGxldmVsLS07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbGV2ZWwgc3RhcnRzIGF0IHplcm8uIElmIHdlIGhpdCBhIHZpZXcuY2xvc2UsIHRoZW4gd2UgbW92ZSBsZXZlbCB0byAxLCBhbmQgd2UgZG9uJ3QgcmV0dXJuIGEgdmlldyB1bnRpbFxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGFyZSBiYWNrIGF0IGxldmVsIHplcm8gKG9yIGEgcGFyZW50IHZpZXcgd2l0aCBsZXZlbCA8IDApXG5cdFx0XHRcdFx0XHRcdFx0bGV2ZWwrKztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcgfHwgbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0b3BWaWV3O1xuXHR9LFxuXG5cdGxpbms6ICRsaW5rLFxuXHR1bmxpbms6ICR1bmxpbmssXG5cblx0Ly89PT09PT09PT09PT09PT09PT09PT1cblx0Ly8gb3ZlcnJpZGUgJC5jbGVhbkRhdGFcblx0Ly89PT09PT09PT09PT09PT09PT09PT1cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbihlbGVtcykge1xuXHRcdGlmIChlbGVtcy5sZW5ndGggJiYgaXNDbGVhbkNhbGwpIHtcblx0XHRcdC8vIFJlbW92ZSBKc1ZpZXdzIGJpbmRpbmdzLiBBbHNvLCByZW1vdmUgZnJvbSB0aGUgRE9NIGFueSBjb3JyZXNwb25kaW5nIHNjcmlwdCBtYXJrZXIgbm9kZXNcblx0XHRcdGNsZWFuKGVsZW1zKTtcblx0XHR9XG5cdFx0b2xkQ2xlYW5EYXRhLmFwcGx5KCQsIGFyZ3VtZW50cyk7XG5cdH1cbn0pO1xuXG4vLyBQb3NzaWJsZSBmdXR1cmUgYWRkaXRpb24gLSBlLmcuIGZvciBja2VkaXRvciB0YWcgY29udHJvbFxuLy8kdmlld3MudXRpbGl0eSA9IHtcbi8vXHR2YWxpZGF0ZTogZnVuY3Rpb24oaHRtbCkge1xuLy9cdFx0dHJ5IHtcbi8vXHRcdFx0dG9wVmlldy5saW5rKHVuZGVmaW5lZCwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGh0bWwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAxKTtcbi8vXHRcdH1cbi8vXHRcdGNhdGNoIChlKSB7XG4vL1x0XHRcdHJldHVybiBlLm1lc3NhZ2U7XG4vL1x0XHR9XG4vL1x0fVxuLy99O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCBqUXVlcnkgaW5zdGFuY2UgcGx1Z2luc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRleHRlbmQoJC5mbiwge1xuXHRsaW5rOiBmdW5jdGlvbihleHByLCBmcm9tLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50VmlldywgcHJldk5vZGUsIG5leHROb2RlKSB7XG5cdFx0cmV0dXJuICRsaW5rKGV4cHIsIHRoaXMsIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpO1xuXHR9LFxuXHR1bmxpbms6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAkdW5saW5rKHRoaXMpO1xuXHR9LFxuXHR2aWV3OiBmdW5jdGlvbihpbm5lciwgdHlwZSkge1xuXHRcdHJldHVybiAkdmlldyh0aGlzWzBdLCBpbm5lciwgdHlwZSk7XG5cdH1cbn0pO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT3ZlcnJpZGUgalF1ZXJ5IG1ldGhvZHMgdGhhdCBjYWxsIG91ciBvdmVycmlkZGVuIGNsZWFuRGF0YSwgZm9yIGRpc3Bvc2FsIGV0Yy5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiQuZWFjaChbSFRNTCwgXCJyZXBsYWNlV2l0aFwiLCBcImVtcHR5XCIsIFwicmVtb3ZlXCJdLCBmdW5jdGlvbihpLCBuYW1lKSB7XG5cdHZhciBvbGRGbiA9ICQuZm5bbmFtZV07XG5cdCQuZm5bbmFtZV0gPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgcmVzdWx0O1xuXHRcdGlzQ2xlYW5DYWxsID0gMTsgLy8gTWFrZSBzdXJlIGNsZWFuRGF0YSBkb2VzIGRpc3Bvc2FsIG9ubHkgd2hlbiBjb21pbmcgZnJvbSB0aGVzZSBjYWxscy5cblx0XHR0cnkge1xuXHRcdFx0cmVzdWx0ID0gb2xkRm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHR9XG5cdFx0ZmluYWxseSB7XG5cdFx0XHRpc0NsZWFuQ2FsbCA9IDA7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG59KTtcblxuLy89PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCB0b3BWaWV3XG4vLz09PT09PT09PT09PT09PVxuXG5hZGRMaW5rTWV0aG9kcygkZXh0ZW5kKHRvcFZpZXcgPSAkc3ViLnRvcFZpZXcsIHt0bXBsOiB7bGlua3M6IHt9fX0pKTtcblxudmlld1N0b3JlID0gezA6IHRvcFZpZXd9OyAvLyBUb3AtbGV2ZWwgdmlld1xuLy89PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCAkLnZpZXdzXG4vLz09PT09PT09PT09PT09PVxuXG4kdmlld3MuZ2V0Q3R4ID0gZnVuY3Rpb24ocGFyYW0pIHsgLy8gUmV0dXJuIHZhbHVlIG9mIGN0eC5mb28sIGluY2x1ZGluZyBmb3IgY29tcGlsZWQgY29udGV4dHVhbCBwYXJhbWV0ZXJzLCB+Zm9vPWV4cHJcblx0aWYgKHBhcmFtICYmIHBhcmFtLl9jcCkgeyAvLyBJZiB0aGlzIGhlbHBlciByZXNvdXJjZSBpcyBhIGNvbnRleHR1YWwgcGFyYW1ldGVyLCB+Zm9vPWV4cHJcblx0XHRwYXJhbSA9ICBwYXJhbVsxXShwYXJhbVswXS5kYXRhLCBwYXJhbVswXSwgJHN1Yik7XG5cdH1cblx0cmV0dXJuIHBhcmFtO1xufTtcblxuLy89PT09PT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgJC52aWV3cy5zdWJcbi8vPT09PT09PT09PT09PT09PT09PVxuXG4kc3ViLl9jcCA9IGZ1bmN0aW9uKHBhcmFtVmFsLCBwYXJhbXMsIHZpZXcpIHsgLy8gR2V0IGNvbXBpbGVkIGNvbnRleHR1YWwgcGFyYW1ldGVycyAob3IgcHJvcGVydGllcykgfmZvbz1leHByLlxuXHRpZiAodmlldy5saW5rZWQpIHsgLy8gSW4gSnNWaWV3cywgcmV0dXJucyBbdmlldywgbGlua0ZuXSB3aGVyZSBsaW5rRm4gaXMgY29tcGlsZWQgZnVuY3Rpb24gZm9yIGV4cHJlc3Npb25cblx0XHRwYXJhbXMgPSBkZWxpbU9wZW5DaGFyMSArIFwiOlwiICsgcGFyYW1zICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdHZhciB0bXBsID0gdmlldy50bXBsLFxuXHRcdFx0bGlua3MgPSB0b3BWaWV3LnRtcGwubGlua3MsIC8vIFVzZSB0b3BWaWV3IGxpbmtzLCBhcyBmb3IgY29tcGlsZWQgdG9wLWxldmVsIGxpbmtpbmcgZXhwcmVzc2lvbnMuIFRvIGRvIC0gc2hvdWxkIHRoaXMgZXZlciBnZXQgZGlzcG9zZWQ/XG5cdFx0XHRsaW5rRm4gPSBsaW5rc1twYXJhbXNdO1xuXHRcdGlmICghbGlua0ZuKSB7XG5cdFx0XHRsaW5rc1twYXJhbXNdID0gbGlua0ZuID0gJHN1Yi50bXBsRm4ocGFyYW1zLCB0bXBsLCB0cnVlKTtcblx0XHR9XG5cdFx0cGFyYW1WYWwgPSBbdmlldywgbGlua0ZuXTtcblx0XHRwYXJhbVZhbC5fY3AgPSB0cnVlOyAvLyBGbGFnIHRoYXQgdGhpcyBpcyBhIGNvbnRleHR1YWwgcGFyYW1ldGVyXG5cdH1cblx0cmV0dXJuIHBhcmFtVmFsOyAvLyBJbiBKc1JlbmRlciByZXR1cm5zIGV2YWx1YXRlZCBleHByZXNzaW9uXG59O1xuXG4kc3ViLl9jZW8gPSBmdW5jdGlvbiBjbG9uZUV4cHJPYmplY3RzKG9icykgeyAgLy8gQ2xvbmUgZXhwck9icyBzbyB0aGF0IGVhY2ggcmVmZXJlbmNlZCBjb250ZXh0dWFsIHBhcmFtZXRlciB+Zm9vIHVzZXMgaXRzIG93biBleHByT2IgaW5zdGFuY2VzXG5cdHZhciBvYixcblx0XHRjbG9uZXMgPSBvYnMsXG5cdFx0bCA9IG9icy5sZW5ndGg7XG5cdGlmIChsKSB7XG5cdFx0Y2xvbmVzID0gW107XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0b2IgPSBvYnNbbF07XG5cdFx0XHRpZiAob2IuX2pzdikge1xuXHRcdFx0XHRvYiA9ICRleHRlbmQoe30sIG9iKTsgICAgICAgICAgICAgIC8vIElmIGFuIGV4cHJPYiwgY2xvbmUgaXQuIElmIGEgc3RyaW5nLCBrZWVwIGFzIGlzXG5cdFx0XHRcdG9iLnBybSA9IGNsb25lRXhwck9iamVjdHMob2IucHJtKTsgLy8gUmVjdXJzaXZlbHkgY2xvbmUgZXhwck9icyBpbiBwYXJhbWV0ZXJzLCB0b29cblx0XHRcdH1cblx0XHRcdGNsb25lcy51bnNoaWZ0KG9iKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNsb25lcztcbn07XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kICQudmlld3Muc2V0dGluZ3Ncbi8vPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5vbGRBZHZTZXQgPSAkc3ViLmFkdlNldDtcblxuJHN1Yi5hZHZTZXQgPSBmdW5jdGlvbigpIHsgLy8gcmVmcmVzaCBhZHZhbmNlZCBzZXR0aW5nc1xuXHRvbGRBZHZTZXQoKTtcblx0Z2xvYmFsLl9qc3YgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5fanN2XG5cdFx0PyAkZXh0ZW5kKGdsb2JhbC5fanN2IHx8IHt9LCB7IC8vIGNyZWF0ZSBnbG9iYWwgX2pzdiwgZm9yIGFjY2Vzc2luZyB2aWV3cywgZXRjXG5cdFx0XHRcdHZpZXdzOiB2aWV3U3RvcmUsXG5cdFx0XHRcdGJpbmRpbmdzOiBiaW5kaW5nU3RvcmVcblx0XHRcdH0pXG5cdFx0OiB1bmRlZmluZWQ7IC8vIEluIElFOCBjYW5ub3QgZG8gZGVsZXRlIGdsb2JhbC5fanN2XG5cdCR2aWV3c0xpbmtBdHRyID0gJHN1YlNldHRpbmdzQWR2YW5jZWQubGlua0F0dHI7XG5cdGxpbmtWaWV3c1NlbCA9IGJpbmRFbHNTZWwgKyBcIixbXCIgKyAkdmlld3NMaW5rQXR0ciArIFwiXVwiO1xuXHR3cmFwTWFwID0gJHN1YlNldHRpbmdzQWR2YW5jZWQuX3dtO1xuXHR3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247XG5cdHdyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7XG5cdHdyYXBNYXAudGggPSB3cmFwTWFwLnRkO1xufTtcblxuJHZpZXdzU2V0dGluZ3MuYWR2YW5jZWQoe1xuXHRsaW5rQXR0cjogXCJkYXRhLWxpbmtcIixcblx0dXNlVmlld3M6IGZhbHNlLFxuXHRub1ZhbGlkYXRlOiBmYWxzZSxcblx0Ly8gd3JhcE1hcCBwcm92aWRlIGFwcHJvcHJpYXRlIHdyYXBwZXJzIGZvciBpbnNlcnRpbmcgaW5uZXJIVE1MLCB1c2VkIGluIGluc2VydEJlZm9yZVxuXHQvLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxuXHQvLyBUT0RPIGludmVzdGlnYXRlIHdoZXRoZXIgbW9yZSByZWNlbnQgalF1ZXJ5IGltcGxlbWVudGF0aW9uIHVzaW5nIHdyYXBNYXAgaW4gZG9tTWFuaXAvJCgpLmh0bWwoKSBldGMuIGlzIGJldHRlciBvcHRpbWl6ZWQgbm93Li4uXG5cdF93bToge1xuXHRcdG9wdGlvbjogWzEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiXSxcblx0XHRsZWdlbmQ6IFsxLCBcIjxmaWVsZHNldD5cIiwgXCI8L2ZpZWxkc2V0PlwiXSxcblx0XHRhcmVhOiBbMSwgXCI8bWFwPlwiLCBcIjwvbWFwPlwiXSxcblx0XHRwYXJhbTogWzEsIFwiPG9iamVjdD5cIiwgXCI8L29iamVjdD5cIl0sXG5cdFx0dGhlYWQ6IFsxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiXSxcblx0XHR0cjogWzIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCJdLFxuXHRcdHRkOiBbMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIl0sXG5cdFx0Y29sOiBbMiwgXCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPlwiLCBcIjwvY29sZ3JvdXA+PC90YWJsZT5cIl0sXG5cdFx0c3ZnX25zOiBbMSwgXCI8c3ZnPlwiLCBcIjwvc3ZnPlwiXSxcblx0XHQvLyBJRTYtOCBjYW4ndCBzZXJpYWxpemUgbGluaywgc2NyaXB0LCBzdHlsZSwgb3IgYW55IGh0bWw1IChOb1Njb3BlKSB0YWdzLFxuXHRcdC8vIHVubGVzcyB3cmFwcGVkIGluIGEgZGl2IHdpdGggbm9uLWJyZWFraW5nIGNoYXJhY3RlcnMgaW4gZnJvbnQgb2YgaXQuXG5cdFx0ZGl2OiAkLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSA/IFswLCBcIlwiLCBcIlwiXSA6IFsxLCBcIlg8ZGl2PlwiLCBcIjwvZGl2PlwiXVxuXHR9LFxuXHRfZmU6IHtcblx0XHRpbnB1dDoge1xuXHRcdFx0ZnJvbTogaW5wdXRBdHRyaWIsIHRvOiBcInZhbHVlXCJcblx0XHR9LFxuXHRcdHRleHRhcmVhOiB2YWx1ZUJpbmRpbmcsXG5cdFx0c2VsZWN0OiB2YWx1ZUJpbmRpbmcsXG5cdFx0b3B0Z3JvdXA6IHtcblx0XHRcdHRvOiBcImxhYmVsXCJcblx0XHR9XG5cdH1cbn0pO1xuXG5cdHJldHVybiAkO1xufSwgd2luZG93KSk7XG4iLCIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjIuMS40XG4gKiBodHRwOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IDIwMDUsIDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNS0wNC0yOFQxNjowMVpcbiAqL1xuXG4oZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcblxuXHRpZiAoIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiICkge1xuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0odHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBTdXBwb3J0OiBGaXJlZm94IDE4K1xuLy8gQ2FuJ3QgYmUgaW4gc3RyaWN0IG1vZGUsIHNldmVyYWwgbGlicyBpbmNsdWRpbmcgQVNQLk5FVCB0cmFjZVxuLy8gdGhlIHN0YWNrIHZpYSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmXG4vLyB5b3UgdHJ5IHRvIHRyYWNlIHRocm91Z2ggXCJ1c2Ugc3RyaWN0XCIgY2FsbCBjaGFpbnMuICgjMTMzMzUpXG4vL1xuXG52YXIgYXJyID0gW107XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgc3VwcG9ydCA9IHt9O1xuXG5cblxudmFyXG5cdC8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveClcblx0ZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQsXG5cblx0dmVyc2lvbiA9IFwiMi4xLjRcIixcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xXG5cdC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUFxuXHRydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZyxcblxuXHQvLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmdcblx0cm1zUHJlZml4ID0gL14tbXMtLyxcblx0cmRhc2hBbHBoYSA9IC8tKFtcXGRhLXpdKS9naSxcblxuXHQvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5cdGZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7XG5cdFx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuXHR9O1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3Jcblx0c2VsZWN0b3I6IFwiXCIsXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXHRcdHJldHVybiBudW0gIT0gbnVsbCA/XG5cblx0XHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRcdCggbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXSApIDpcblxuXHRcdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdFx0c2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2tcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXG5cdHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkge1xuXG5cdFx0Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXRcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XG5cblx0XHQvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKVxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcblx0XHRyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuXHRcdC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LlxuXHQvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpc1xuXHQvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9KSk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTtcblx0fSxcblxuXHRlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkge1xuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNBcnJheShzcmMpID8gc3JjIDogW107XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09IFwiZnVuY3Rpb25cIjtcblx0fSxcblxuXHRpc0FycmF5OiBBcnJheS5pc0FycmF5LFxuXG5cdGlzV2luZG93OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH0sXG5cblx0aXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChudWxsfHRydWV8ZmFsc2V8XCJcIilcblx0XHQvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzIChcIjB4Li4uXCIpXG5cdFx0Ly8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOXG5cdFx0Ly8gYWRkaW5nIDEgY29ycmVjdHMgbG9zcyBvZiBwcmVjaXNpb24gZnJvbSBwYXJzZUZsb2F0ICgjMTUxMDApXG5cdFx0cmV0dXJuICFqUXVlcnkuaXNBcnJheSggb2JqICkgJiYgKG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApICsgMSkgPj0gMDtcblx0fSxcblxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdC8vIE5vdCBwbGFpbiBvYmplY3RzOlxuXHRcdC8vIC0gQW55IG9iamVjdCBvciB2YWx1ZSB3aG9zZSBpbnRlcm5hbCBbW0NsYXNzXV0gcHJvcGVydHkgaXMgbm90IFwiW29iamVjdCBPYmplY3RdXCJcblx0XHQvLyAtIERPTSBub2Rlc1xuXHRcdC8vIC0gd2luZG93XG5cdFx0aWYgKCBqUXVlcnkudHlwZSggb2JqICkgIT09IFwib2JqZWN0XCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCBvYmouY29uc3RydWN0b3IgJiZcblx0XHRcdFx0IWhhc093bi5jYWxsKCBvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCBcImlzUHJvdG90eXBlT2ZcIiApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBmdW5jdGlvbiBoYXNuJ3QgcmV0dXJuZWQgYWxyZWFkeSwgd2UncmUgY29uZmlkZW50IHRoYXRcblx0XHQvLyB8b2JqfCBpcyBhIHBsYWluIG9iamVjdCwgY3JlYXRlZCBieSB7fSBvciBjb25zdHJ1Y3RlZCB3aXRoIG5ldyBPYmplY3Rcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0XHR9XG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjAsIGlPUzw2IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdFx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRcdGNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdFx0dHlwZW9mIG9iajtcblx0fSxcblxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dFxuXHRnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHtcblx0XHR2YXIgc2NyaXB0LFxuXHRcdFx0aW5kaXJlY3QgPSBldmFsO1xuXG5cdFx0Y29kZSA9IGpRdWVyeS50cmltKCBjb2RlICk7XG5cblx0XHRpZiAoIGNvZGUgKSB7XG5cdFx0XHQvLyBJZiB0aGUgY29kZSBpbmNsdWRlcyBhIHZhbGlkLCBwcm9sb2d1ZSBwb3NpdGlvblxuXHRcdFx0Ly8gc3RyaWN0IG1vZGUgcHJhZ21hLCBleGVjdXRlIGNvZGUgYnkgaW5qZWN0aW5nIGFcblx0XHRcdC8vIHNjcmlwdCB0YWcgaW50byB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpZiAoIGNvZGUuaW5kZXhPZihcInVzZSBzdHJpY3RcIikgPT09IDEgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBhdm9pZCB0aGUgRE9NIG5vZGUgY3JlYXRpb24sIGluc2VydGlvblxuXHRcdFx0Ly8gYW5kIHJlbW92YWwgYnkgdXNpbmcgYW4gaW5kaXJlY3QgZ2xvYmFsIGV2YWxcblx0XHRcdFx0aW5kaXJlY3QoIGNvZGUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3Milcblx0Y2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkge1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xuXHR9LFxuXG5cdG5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0fSxcblxuXHQvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrLCBhcmdzICkge1xuXHRcdHZhciB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aCxcblx0XHRcdGlzQXJyYXkgPSBpc0FycmF5bGlrZSggb2JqICk7XG5cblx0XHRpZiAoIGFyZ3MgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXkgKSB7XG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2suYXBwbHkoIG9ialsgaSBdLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGlzQXJyYXkgKSB7XG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7XG5cblx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMVxuXHR0cmltOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cblx0XHRcdFwiXCIgOlxuXHRcdFx0KCB0ZXh0ICsgXCJcIiApLnJlcGxhY2UoIHJ0cmltLCBcIlwiICk7XG5cdH0sXG5cblx0Ly8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XG5cdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XG5cblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBpc0FycmF5bGlrZSggT2JqZWN0KGFycikgKSApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsXG5cdFx0XHRcdFx0dHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkge1xuXHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcblx0XHRcdGogPSAwLFxuXHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07XG5cdFx0fVxuXG5cdFx0Zmlyc3QubGVuZ3RoID0gaTtcblxuXHRcdHJldHVybiBmaXJzdDtcblx0fSxcblxuXHRncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7XG5cdFx0dmFyIGNhbGxiYWNrSW52ZXJzZSxcblx0XHRcdG1hdGNoZXMgPSBbXSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0Y2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0O1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xuXHRcdC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG5cdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRjYWxsYmFja0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTtcblx0XHRcdGlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHtcblx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBlbGVtc1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkge1xuXHRcdHZhciB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0aXNBcnJheSA9IGlzQXJyYXlsaWtlKCBlbGVtcyApLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsXG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gZWxlbXMgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0XHRyZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7XG5cdH0sXG5cblx0Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzXG5cdGd1aWQ6IDEsXG5cblx0Ly8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55XG5cdC8vIGFyZ3VtZW50cy5cblx0cHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcblx0XHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRcdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0bXAgPSBmblsgY29udGV4dCBdO1xuXHRcdFx0Y29udGV4dCA9IGZuO1xuXHRcdFx0Zm4gPSB0bXA7XG5cdFx0fVxuXG5cdFx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0XHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBTaW11bGF0ZWQgYmluZFxuXHRcdGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTtcblx0XHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdFx0fTtcblxuXHRcdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRcdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9LFxuXG5cdG5vdzogRGF0ZS5ub3csXG5cblx0Ly8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyXG5cdC8vIHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuXG5cdHN1cHBvcnQ6IHN1cHBvcnRcbn0pO1xuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvclwiLnNwbGl0KFwiIFwiKSwgZnVuY3Rpb24oaSwgbmFtZSkge1xuXHRjbGFzczJ0eXBlWyBcIltvYmplY3QgXCIgKyBuYW1lICsgXCJdXCIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbn0pO1xuXG5mdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IGlPUyA4LjIgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cblx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoIG9iai5ub2RlVHlwZSA9PT0gMSAmJiBsZW5ndGggKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMi4wLXByZVxuICogaHR0cDovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE0LTEyLTE2XG4gKi9cbihmdW5jdGlvbiggd2luZG93ICkge1xuXG52YXIgaSxcblx0c3VwcG9ydCxcblx0RXhwcixcblx0Z2V0VGV4dCxcblx0aXNYTUwsXG5cdHRva2VuaXplLFxuXHRjb21waWxlLFxuXHRzZWxlY3QsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXG5cdC8vIExvY2FsIGRvY3VtZW50IHZhcnNcblx0c2V0RG9jdW1lbnQsXG5cdGRvY3VtZW50LFxuXHRkb2NFbGVtLFxuXHRkb2N1bWVudElzSFRNTCxcblx0cmJ1Z2d5UVNBLFxuXHRyYnVnZ3lNYXRjaGVzLFxuXHRtYXRjaGVzLFxuXHRjb250YWlucyxcblxuXHQvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhXG5cdGV4cGFuZG8gPSBcInNpenpsZVwiICsgMSAqIG5ldyBEYXRlKCksXG5cdHByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCxcblx0ZGlycnVucyA9IDAsXG5cdGRvbmUgPSAwLFxuXHRjbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0dG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fSxcblxuXHQvLyBHZW5lcmFsLXB1cnBvc2UgY29uc3RhbnRzXG5cdE1BWF9ORUdBVElWRSA9IDEgPDwgMzEsXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHA6Ly9qc3BlcmYuY29tL3Rob3ItaW5kZXhvZi12cy1mb3IvNVxuXHRpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7XG5cdFx0dmFyIGkgPSAwLFxuXHRcdFx0bGVuID0gbGlzdC5sZW5ndGg7XG5cdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRpZiAoIGxpc3RbaV0gPT09IGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gLTE7XG5cdH0sXG5cblx0Ym9vbGVhbnMgPSBcImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkXCIsXG5cblx0Ly8gUmVndWxhciBleHByZXNzaW9uc1xuXG5cdC8vIFdoaXRlc3BhY2UgY2hhcmFjdGVycyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXN5bnRheC8jY2hhcmFjdGVyc1xuXHRjaGFyYWN0ZXJFbmNvZGluZyA9IFwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFxcXHgwMC1cXFxceGEwXSkrXCIsXG5cblx0Ly8gTG9vc2VseSBtb2RlbGVkIG9uIENTUyBpZGVudGlmaWVyIGNoYXJhY3RlcnNcblx0Ly8gQW4gdW5xdW90ZWQgdmFsdWUgc2hvdWxkIGJlIGEgQ1NTIGlkZW50aWZpZXIgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0Ly8gUHJvcGVyIHN5bnRheDogaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI3ZhbHVlLWRlZi1pZGVudGlmaWVyXG5cdGlkZW50aWZpZXIgPSBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCBcIndcIiwgXCJ3I1wiICksXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKSg/OlxcXFwoKFwiICtcblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXHRcdC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2KVxuXHRcdFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiICsgYXR0cmlidXRlcyArIFwiKSopfFwiICtcblx0XHQvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpXG5cdFx0XCIuKlwiICtcblx0XHRcIilcXFxcKXwpXCIsXG5cblx0Ly8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlclxuXHRyd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcIitcIiwgXCJnXCIgKSxcblx0cnRyaW0gPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblxuXHRyYXR0cmlidXRlUXVvdGVzID0gbmV3IFJlZ0V4cCggXCI9XCIgKyB3aGl0ZXNwYWNlICsgXCIqKFteXFxcXF0nXFxcIl0qPylcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcXVwiLCBcImdcIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0XCJJRFwiOiBuZXcgUmVnRXhwKCBcIl4jKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggXCJ3XCIsIFwidypcIiApICsgXCIpXCIgKSxcblx0XHRcIkFUVFJcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBhdHRyaWJ1dGVzICksXG5cdFx0XCJQU0VVRE9cIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBwc2V1ZG9zICksXG5cdFx0XCJDSElMRFwiOiBuZXcgUmVnRXhwKCBcIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcXFwoXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooXFxcXGQrKXwpKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfClcIiwgXCJpXCIgKSxcblx0XHRcImJvb2xcIjogbmV3IFJlZ0V4cCggXCJeKD86XCIgKyBib29sZWFucyArIFwiKSRcIiwgXCJpXCIgKSxcblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdHJuYXRpdmUgPSAvXltee10rXFx7XFxzKlxcW25hdGl2ZSBcXHcvLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cdHJlc2NhcGUgPSAvJ3xcXFxcL2csXG5cblx0Ly8gQ1NTIGVzY2FwZXMgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVyc1xuXHRydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCBcIlxcXFxcXFxcKFtcXFxcZGEtZl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3woXCIgKyB3aGl0ZXNwYWNlICsgXCIpfC4pXCIsIFwiaWdcIiApLFxuXHRmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7XG5cdFx0dmFyIGhpZ2ggPSBcIjB4XCIgKyBlc2NhcGVkIC0gMHgxMDAwMDtcblx0XHQvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludFxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjRcblx0XHQvLyBXb3JrYXJvdW5kIGVycm9uZW91cyBudW1lcmljIGludGVycHJldGF0aW9uIG9mICtcIjB4XCJcblx0XHRyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/XG5cdFx0XHRlc2NhcGVkIDpcblx0XHRcdGhpZ2ggPCAwID9cblx0XHRcdFx0Ly8gQk1QIGNvZGVwb2ludFxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFx0Ly8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpXG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXNcblx0Ly8gU2VlIHNldERvY3VtZW50KClcblx0Ly8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgXCJQZXJtaXNzaW9uIERlbmllZFwiXG5cdC8vIGVycm9yIGluIElFXG5cdHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblx0XHRzZXREb2N1bWVudCgpO1xuXHR9O1xuXG4vLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxpc3QgKVxudHJ5IHtcblx0cHVzaC5hcHBseShcblx0XHQoYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7IGFwcGx5OiBhcnIubGVuZ3RoID9cblxuXHRcdC8vIExldmVyYWdlIHNsaWNlIGlmIHBvc3NpYmxlXG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0cHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHQvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGhcblx0XHRcdHdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge31cblx0XHRcdHRhcmdldC5sZW5ndGggPSBqIC0gMTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBtYXRjaCwgZWxlbSwgbSwgbm9kZVR5cGUsXG5cdFx0Ly8gUVNBIHZhcnNcblx0XHRpLCBncm91cHMsIG9sZCwgbmlkLCBuZXdDb250ZXh0LCBuZXdTZWxlY3RvcjtcblxuXHRpZiAoICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblxuXHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cdG5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZTtcblxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdGlmICggIXNlZWQgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cblx0XHQvLyBUcnkgdG8gc2hvcnRjdXQgZmluZCBvcGVyYXRpb25zIHdoZW4gcG9zc2libGUgKGUuZy4sIG5vdCB1bmRlciBEb2N1bWVudEZyYWdtZW50KVxuXHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiI0lEXCIpXG5cdFx0XHRpZiAoIChtID0gbWF0Y2hbMV0pICkge1xuXHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnNcblx0XHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50IChqUXVlcnkgIzY5NjMpXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSwgT3BlcmEsIGFuZCBXZWJraXQgcmV0dXJuIGl0ZW1zXG5cdFx0XHRcdFx0XHQvLyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ29udGV4dCBpcyBub3QgYSBkb2N1bWVudFxuXHRcdFx0XHRcdGlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0gY29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRjb250YWlucyggY29udGV4dCwgZWxlbSApICYmIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiVEFHXCIpXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsyXSApIHtcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gU3BlZWQtdXA6IFNpenpsZShcIi5DTEFTU1wiKVxuXHRcdFx0fSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkgJiYgc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBRU0EgcGF0aFxuXHRcdGlmICggc3VwcG9ydC5xc2EgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHtcblx0XHRcdG5pZCA9IG9sZCA9IGV4cGFuZG87XG5cdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdG5ld1NlbGVjdG9yID0gbm9kZVR5cGUgIT09IDEgJiYgc2VsZWN0b3I7XG5cblx0XHRcdC8vIHFTQSB3b3JrcyBzdHJhbmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmllc1xuXHRcdFx0Ly8gV2UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgYnkgc3BlY2lmeWluZyBhbiBleHRyYSBJRCBvbiB0aGUgcm9vdFxuXHRcdFx0Ly8gYW5kIHdvcmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpXG5cdFx0XHQvLyBJRSA4IGRvZXNuJ3Qgd29yayBvbiBvYmplY3QgZWxlbWVudHNcblx0XHRcdGlmICggbm9kZVR5cGUgPT09IDEgJiYgY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXHRcdFx0XHRncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblxuXHRcdFx0XHRpZiAoIChvbGQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpKSApIHtcblx0XHRcdFx0XHRuaWQgPSBvbGQucmVwbGFjZSggcmVzY2FwZSwgXCJcXFxcJCZcIiApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRleHQuc2V0QXR0cmlidXRlKCBcImlkXCIsIG5pZCApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5pZCA9IFwiW2lkPSdcIiArIG5pZCArIFwiJ10gXCI7XG5cblx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdGdyb3Vwc1tpXSA9IG5pZCArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0O1xuXHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKFwiLFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBuZXdTZWxlY3RvciApIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaChxc2FFcnJvcikge1xuXHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdGlmICggIW9sZCApIHtcblx0XHRcdFx0XHRcdGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtGdW5jdGlvbihzdHJpbmcsIE9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1bHRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KCBmbiApIHtcblx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gISFmbiggZGl2ICk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cdFx0Ly8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0XG5cdFx0aWYgKCBkaXYucGFyZW50Tm9kZSApIHtcblx0XHRcdGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBkaXYgKTtcblx0XHR9XG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRkaXYgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGF0dHJzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3NcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGJcbiAqL1xuZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkge1xuXHR2YXIgY3VyID0gYiAmJiBhLFxuXHRcdGRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHQoIH5iLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApIC1cblx0XHRcdCggfmEuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICk7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkge1xuXHRcdGFyZ3VtZW50ID0gK2FyZ3VtZW50O1xuXHRcdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7XG5cdHJldHVybiBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnRleHQ7XG59XG5cbi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlXG5zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTtcblxuLyoqXG4gKiBEZXRlY3RzIFhNTCBub2Rlc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGVcbiAqL1xuaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0Ly8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdFxuXHQvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMylcblx0dmFyIGRvY3VtZW50RWxlbWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1lbnQ7XG5cdHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09IFwiSFRNTFwiIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqL1xuc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHtcblx0dmFyIGhhc0NvbXBhcmUsIHBhcmVudCxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gSWYgbm8gZG9jdW1lbnQgYW5kIGRvY3VtZW50RWxlbWVudCBpcyBhdmFpbGFibGUsIHJldHVyblxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFNldCBvdXIgZG9jdW1lbnRcblx0ZG9jdW1lbnQgPSBkb2M7XG5cdGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRwYXJlbnQgPSBkb2MuZGVmYXVsdFZpZXc7XG5cblx0Ly8gU3VwcG9ydDogSUU+OFxuXHQvLyBJZiBpZnJhbWUgZG9jdW1lbnQgaXMgYXNzaWduZWQgdG8gXCJkb2N1bWVudFwiIHZhcmlhYmxlIGFuZCBpZiBpZnJhbWUgaGFzIGJlZW4gcmVsb2FkZWQsXG5cdC8vIElFIHdpbGwgdGhyb3cgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gYWNjZXNzaW5nIFwiZG9jdW1lbnRcIiB2YXJpYWJsZSwgc2VlIGpRdWVyeSAjMTM5MzZcblx0Ly8gSUU2LTggZG8gbm90IHN1cHBvcnQgdGhlIGRlZmF1bHRWaWV3IHByb3BlcnR5IHNvIHBhcmVudCB3aWxsIGJlIHVuZGVmaW5lZFxuXHRpZiAoIHBhcmVudCAmJiBwYXJlbnQgIT09IHBhcmVudC50b3AgKSB7XG5cdFx0Ly8gSUUxMSBkb2VzIG5vdCBoYXZlIGF0dGFjaEV2ZW50LCBzbyBhbGwgbXVzdCBzdWZmZXJcblx0XHRpZiAoIHBhcmVudC5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0cGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7XG5cdFx0fSBlbHNlIGlmICggcGFyZW50LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0cGFyZW50LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBTdXBwb3J0IHRlc3RzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvYyApO1xuXG5cdC8qIEF0dHJpYnV0ZXNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFN1cHBvcnQ6IElFPDhcblx0Ly8gVmVyaWZ5IHRoYXQgZ2V0QXR0cmlidXRlIHJlYWxseSByZXR1cm5zIGF0dHJpYnV0ZXMgYW5kIG5vdCBwcm9wZXJ0aWVzXG5cdC8vIChleGNlcHRpbmcgSUU4IGJvb2xlYW5zKVxuXHRzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkaXYuY2xhc3NOYW1lID0gXCJpXCI7XG5cdFx0cmV0dXJuICFkaXYuZ2V0QXR0cmlidXRlKFwiY2xhc3NOYW1lXCIpO1xuXHR9KTtcblxuXHQvKiBnZXRFbGVtZW50KHMpQnkqXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzXG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkaXYuYXBwZW5kQ2hpbGQoIGRvYy5jcmVhdGVDb21tZW50KFwiXCIpICk7XG5cdFx0cmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8MTBcblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lXG5cdC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pZCA9IGV4cGFuZG87XG5cdFx0cmV0dXJuICFkb2MuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvYy5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gSUQgZmluZCBhbmQgZmlsdGVyXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHQvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJuc1xuXHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzXG5cdFx0XHRcdHJldHVybiBtICYmIG0ucGFyZW50Tm9kZSA/IFsgbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gU3VwcG9ydDogSUU2Lzdcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0ZGVsZXRlIEV4cHIuZmluZFtcIklEXCJdO1xuXG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShcImlkXCIpO1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH1cblxuXHQvLyBUYWdcblx0RXhwci5maW5kW1wiVEFHXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA/XG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROXG5cdFx0XHR9IGVsc2UgaWYgKCBzdXBwb3J0LnFzYSApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdHRtcCA9IFtdLFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0Ly8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvb1xuXHRcdFx0XHRyZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHNcblx0XHRcdGlmICggdGFnID09PSBcIipcIiApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0dG1wLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdG1wO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0fTtcblxuXHQvLyBDbGFzc1xuXHRFeHByLmZpbmRbXCJDTEFTU1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkge1xuXHRcdGlmICggZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTMzNzhcblx0cmJ1Z2d5UVNBID0gW107XG5cblx0aWYgKCAoc3VwcG9ydC5xc2EgPSBybmF0aXZlLnRlc3QoIGRvYy5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcZl0nIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW3NlbGVjdGVkXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86dmFsdWV8XCIgKyBib29sZWFucyArIFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjIrLCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuNytcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCBcIltpZH49XCIgKyBleHBhbmRvICsgXCItXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIn49XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCI6Y2hlY2tlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCtcblx0XHRcdC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzY4NTFcblx0XHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlsc1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiYSNcIiArIGV4cGFuZG8gKyBcIisqXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiLiMuK1srfl1cIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdFx0Ly8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25tZW50XG5cdFx0XHR2YXIgaW5wdXQgPSBkb2MuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9mIG5hbWUgYXR0cmlidXRlXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW25hbWU9ZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJuYW1lXCIgKyB3aGl0ZXNwYWNlICsgXCIqWypeJHwhfl0/PVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0c1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZW5hYmxlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3Ncblx0XHRcdGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiKiw6eFwiKTtcblx0XHRcdHJidWdneVFTQS5wdXNoKFwiLC4qOlwiKTtcblx0XHR9KTtcblx0fVxuXG5cdGlmICggKHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gcm5hdGl2ZS50ZXN0KCAobWF0Y2hlcyA9IGRvY0VsZW0ubWF0Y2hlcyB8fFxuXHRcdGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yKSApKSApIHtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZGl2LCBcImRpdlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZGl2LCBcIltzIT0nJ106eFwiICk7XG5cdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIFwiIT1cIiwgcHNldWRvcyApO1xuXHRcdH0pO1xuXHR9XG5cblx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbihcInxcIikgKTtcblx0cmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbihcInxcIikgKTtcblxuXHQvKiBDb250YWluc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cdGhhc0NvbXBhcmUgPSBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24gKTtcblxuXHQvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcblx0Ly8gUHVycG9zZWZ1bGx5IGRvZXMgbm90IGltcGxlbWVudCBpbmNsdXNpdmUgZGVzY2VuZGVudFxuXHQvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxuXHRjb250YWlucyA9IGhhc0NvbXBhcmUgfHwgcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgP1xuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSxcblx0XHRcdFx0YnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG5cdFx0XHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0YWRvd24uY29udGFpbnMgP1xuXHRcdFx0XHRcdGFkb3duLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2XG5cdFx0XHQpKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdGlmICggYiApIHtcblx0XHRcdFx0d2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBiID09PSBhICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHQvKiBTb3J0aW5nXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nXG5cdHNvcnRPcmRlciA9IGhhc0NvbXBhcmUgP1xuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugd2Uga25vdyB0aGV5IGFyZSBkaXNjb25uZWN0ZWRcblx0XHRcdDE7XG5cblx0XHQvLyBEaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRpZiAoIGNvbXBhcmUgJiAxIHx8XG5cdFx0XHQoIXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0aWYgKCBhID09PSBkb2MgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2MgfHwgYi5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBiKSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyXG5cdFx0XHRyZXR1cm4gc29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fSA6XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxuXHRcdFx0YnVwID0gYi5wYXJlbnROb2RlLFxuXHRcdFx0YXAgPSBbIGEgXSxcblx0XHRcdGJwID0gWyBiIF07XG5cblx0XHQvLyBQYXJlbnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRzIG9yIGRpc2Nvbm5lY3RlZFxuXHRcdGlmICggIWF1cCB8fCAhYnVwICkge1xuXHRcdFx0cmV0dXJuIGEgPT09IGRvYyA/IC0xIDpcblx0XHRcdFx0YiA9PT0gZG9jID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jO1xufTtcblxuU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7XG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdC8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZFxuXHRleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCBcIj0nJDEnXVwiICk7XG5cblx0aWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdCggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiZcblx0XHQoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cdFx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcblx0XHRcdFx0XHQvLyBmcmFnbWVudCBpbiBJRSA5XG5cdFx0XHRcdFx0ZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7fVxuXHR9XG5cblx0cmV0dXJuIFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDtcbn07XG5cblNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7XG59O1xuXG5TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXHRcdC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID9cblx0XHR2YWwgOlxuXHRcdHN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6XG5cdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcbn07XG5cblNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdHRocm93IG5ldyBFcnJvciggXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIiArIG1zZyApO1xufTtcblxuLyoqXG4gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzXG4gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0c1xuICovXG5TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRkdXBsaWNhdGVzID0gW10sXG5cdFx0aiA9IDAsXG5cdFx0aSA9IDA7XG5cblx0Ly8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZVxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTtcblx0cmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkge1xuXHRcdFx0XHRqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0cmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNVxuXHRzb3J0SW5wdXQgPSBudWxsO1xuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtXG4gKi9cbmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9kZSxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGkgPSAwLFxuXHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRpZiAoICFub2RlVHlwZSApIHtcblx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdHdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkge1xuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcblx0XHRcdHJldCArPSBnZXRUZXh0KCBub2RlICk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xuXHRcdC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVyeSAjMTExNTMpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRyZXQgKz0gZ2V0VGV4dCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHR9XG5cdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5FeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbM10gPSAoIG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzJdID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdG1hdGNoWzNdID0gXCIgXCIgKyBtYXRjaFszXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzFdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWzNdICkge1xuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRFxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXG5cdFx0XHRcdG1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSBcImV2ZW5cIiB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApICk7XG5cdFx0XHRcdG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdHZhciBleGNlc3MsXG5cdFx0XHRcdHVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwcltcIkNISUxEXCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0bWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiZcblx0XHRcdFx0Ly8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdChleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0XHRtYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09IFwiKlwiID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQocGF0dGVybiA9IG5ldyBSZWdFeHAoIFwiKF58XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkpICYmXG5cdFx0XHRcdGNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIgKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIj1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiE9XCIgPyByZXN1bHQgIT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJePVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIio9XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIkPVwiID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ+PVwiID8gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ8PVwiID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIiA6XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7XG5cdFx0XHR2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSBcIm50aFwiLFxuXHRcdFx0XHRmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gXCJsYXN0XCIsXG5cdFx0XHRcdG9mVHlwZSA9IHdoYXQgPT09IFwib2YtdHlwZVwiO1xuXG5cdFx0XHRyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/XG5cblx0XHRcdFx0Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKVxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gOlxuXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBkaWZmLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGU7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6IG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHQvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXhcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IHBhcmVudFsgZXhwYW5kbyBdIHx8IChwYXJlbnRbIGV4cGFuZG8gXSA9IHt9KTtcblx0XHRcdFx0XHRcdFx0Y2FjaGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWzBdID09PSBkaXJydW5zICYmIGNhY2hlWzFdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMl07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVucyApIHtcblx0XHRcdFx0XHRcdFx0ZGlmZiA9IGNhY2hlWzFdO1xuXG5cdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoICggb2ZUeXBlID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmICsrZGlmZiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdChub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KSlbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZVxuXHRcdFx0XHRcdFx0ZGlmZiAtPSBsYXN0O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIHBzZXVkbzogXCIgKyBwc2V1ZG8gKTtcblxuXHRcdFx0Ly8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdFxuXHRcdFx0Ly8gYXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb25cblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcblx0XHRcdGlmICggZm5bIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0cmV0dXJuIGZuKCBhcmd1bWVudCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXNcblx0XHRcdGlmICggZm4ubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sIFwiXCIsIGFyZ3VtZW50IF07XG5cdFx0XHRcdHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdFx0XHRcdHZhciBpZHgsXG5cdFx0XHRcdFx0XHRcdG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSxcblx0XHRcdFx0XHRcdFx0aSA9IG1hdGNoZWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlkeCA9IGluZGV4T2YoIHNlZWQsIG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblx0XHQvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3Ncblx0XHRcIm5vdFwiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcblx0XHRcdC8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG5cdFx0XHQvLyBzcGFjZXMgYXMgY29tYmluYXRvcnNcblx0XHRcdHZhciBpbnB1dCA9IFtdLFxuXHRcdFx0XHRyZXN1bHRzID0gW10sXG5cdFx0XHRcdG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICkgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/XG5cdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdHNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pIDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFswXSA9IGVsZW07XG5cdFx0XHRcdFx0bWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApO1xuXHRcdFx0XHRcdC8vIERvbid0IGtlZXAgdGhlIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImNvbnRhaW5zXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gXCJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yXG5cdFx0Ly8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWVcblx0XHQvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLFxuXHRcdC8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCItXCIuXG5cdFx0Ly8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdFx0Ly8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS5cIlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRcImxhbmdcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHtcblx0XHRcdC8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJcblx0XHRcdGlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCBcIlwiKSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIGxhbmc6IFwiICsgbGFuZyApO1xuXHRcdFx0fVxuXHRcdFx0bGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgZWxlbUxhbmc7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID9cblx0XHRcdFx0XHRcdGVsZW0ubGFuZyA6XG5cdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSkgKSB7XG5cblx0XHRcdFx0XHRcdGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgXCItXCIgKSA9PT0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gTWlzY2VsbGFuZW91c1xuXHRcdFwidGFyZ2V0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdFwicm9vdFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2NFbGVtO1xuXHRcdH0sXG5cblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTtcblx0XHR9LFxuXG5cdFx0Ly8gQm9vbGVhbiBwcm9wZXJ0aWVzXG5cdFx0XCJlbmFibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlO1xuXHRcdH0sXG5cblx0XHRcImRpc2FibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdFwiY2hlY2tlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCk7XG5cdFx0fSxcblxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0XG5cdFx0XHQvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5XG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBDb250ZW50c1xuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVkb1xuXHRcdFx0Ly8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLFxuXHRcdFx0Ly8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjogNzsgZXRjLilcblx0XHRcdC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPCA2ICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3NbXCJlbXB0eVwiXSggZWxlbSApO1xuXHRcdH0sXG5cblx0XHQvLyBFbGVtZW50L2lucHV0IHR5cGVzXG5cdFx0XCJoZWFkZXJcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiaW5wdXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gXCJidXR0b25cIiB8fCBuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgYXR0cjtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRlbGVtLnR5cGUgPT09IFwidGV4dFwiICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OFxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdFwiZmlyc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9KSxcblxuXHRcdFwibGFzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHJldHVybiBbIGxlbmd0aCAtIDEgXTtcblx0XHR9KSxcblxuXHRcdFwiZXFcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0cmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJldmVuXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJvZGRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImx0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgLS1pID49IDA7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwiZ3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyArK2kgPCBsZW5ndGg7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3NbXCJudGhcIl0gPSBFeHByLnBzZXVkb3NbXCJlcVwiXTtcblxuLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3NcbmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7XG59XG5mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApO1xufVxuXG4vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnNcbmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fVxuc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XG5FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpO1xuXG50b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0aWYgKCBtYXRjaCApIHtcblx0XHRcdFx0Ly8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWRcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKHRva2VucyA9IFtdKSApO1xuXHRcdH1cblxuXHRcdG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdC8vIENvbWJpbmF0b3JzXG5cdFx0aWYgKCAobWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdC8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZVxuXHRcdFx0XHR0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKVxuXHRcdFx0fSk7XG5cdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZpbHRlcnNcblx0XHRmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkge1xuXHRcdFx0aWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fFxuXHRcdFx0XHQobWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkpKSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdG1hdGNoZXM6IG1hdGNoXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRyZXR1cm4gcGFyc2VPbmx5ID9cblx0XHRzb0Zhci5sZW5ndGggOlxuXHRcdHNvRmFyID9cblx0XHRcdFNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6XG5cdFx0XHQvLyBDYWNoZSB0aGUgdG9rZW5zXG5cdFx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn07XG5cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0c2VsZWN0b3IgPSBcIlwiO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7XG5cdH1cblx0cmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkge1xuXHR2YXIgZGlyID0gY29tYmluYXRvci5kaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgb3V0ZXJDYWNoZSxcblx0XHRcdFx0bmV3Q2FjaGUgPSBbIGRpcnJ1bnMsIGRvbmVOYW1lIF07XG5cblx0XHRcdC8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGRpciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTtcblx0XHRcdFx0XHRcdGlmICggKG9sZENhY2hlID0gb3V0ZXJDYWNoZVsgZGlyIF0pICYmXG5cdFx0XHRcdFx0XHRcdG9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0cmV0dXJuIChuZXdDYWNoZVsgMiBdID0gb2xkQ2FjaGVbIDIgXSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBSZXVzZSBuZXdjYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGVbIGRpciBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbMF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmXG5cdFx0XHRcdFx0XHQodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbdGVtcF0gPSAhKHJlc3VsdHNbdGVtcF0gPSBlbGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlW1wiIFwiXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3Rvcihcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9KVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kW1wiVEFHXCJdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIEtlZXAgYGlgIGEgc3RyaW5nIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBzbyBgbWF0Y2hlZENvdW50YCB3aWxsIGJlIFwiMDBcIiBiZWxvd1xuXHRcdFx0Ly8gU3VwcG9ydDogSUU8OSwgU2FmYXJpXG5cdFx0XHQvLyBUb2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogXCJsZW5ndGhcIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWRcblx0XHRcdGZvciAoIDsgaSAhPT0gbGVuICYmIChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoIChtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzW2orK10pICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgbm8gc2VlZCBhbmQgb25seSBvbmUgZ3JvdXBcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBUYWtlIGEgc2hvcnRjdXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdHN1cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0XHRcdEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7XG5cblx0XHRcdGNvbnRleHQgPSAoIEV4cHIuZmluZFtcIklEXCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHJbXCJuZWVkc0NvbnRleHRcIl0udGVzdCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG9rZW4gPSB0b2tlbnNbaV07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggKGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSkgKSB7XG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoIChzZWVkID0gZmluZChcblx0XHRcdFx0XHR0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHRcdFx0XHQpKSApIHtcblxuXHRcdFx0XHRcdC8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVybiBlYXJseVxuXHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoIGksIDEgKTtcblx0XHRcdFx0XHRzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApO1xuXHRcdFx0XHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDb21waWxlIGFuZCBleGVjdXRlIGEgZmlsdGVyaW5nIGZ1bmN0aW9uIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcblx0Ly8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZVxuXHQoIGNvbXBpbGVkIHx8IGNvbXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApICkoXG5cdFx0c2VlZCxcblx0XHRjb250ZXh0LFxuXHRcdCFkb2N1bWVudElzSFRNTCxcblx0XHRyZXN1bHRzLFxuXHRcdHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0KTtcblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTb3J0IHN0YWJpbGl0eVxuc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdChcIlwiKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKFwiXCIpID09PSBleHBhbmRvO1xuXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrXG4vLyBBbHdheXMgYXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uXG5zdXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSAhIWhhc0R1cGxpY2F0ZTtcblxuLy8gSW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0IGRvY3VtZW50XG5zZXREb2N1bWVudCgpO1xuXG4vLyBTdXBwb3J0OiBXZWJraXQ8NTM3LjMyIC0gU2FmYXJpIDYuMC4zL0Nocm9tZSAyNSAoZml4ZWQgaW4gQ2hyb21lIDI3KVxuLy8gRGV0YWNoZWQgbm9kZXMgY29uZm91bmRpbmdseSBmb2xsb3cgKmVhY2ggb3RoZXIqXG5zdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZGl2MSApIHtcblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpICkgJiAxO1xufSk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGEgaHJlZj0nIyc+PC9hPlwiO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGlucHV0Lz5cIjtcblx0ZGl2LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0cmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xualF1ZXJ5LmV4cHJbXCI6XCJdID0galF1ZXJ5LmV4cHIucHNldWRvcztcbmpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5cblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxudmFyIHJzaW5nbGVUYWcgPSAoL148KFxcdyspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvKTtcblxuXG5cbnZhciByaXNTaW1wbGUgPSAvXi5bXjojXFxbXFwuLF0qJC87XG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHQvKiBqc2hpbnQgLVcwMTggKi9cblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9KTtcblxuXHR9XG5cblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0pO1xuXG5cdH1cblxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0aWYgKCByaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG5cdFx0fVxuXG5cdFx0cXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyApO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+PSAwICkgIT09IG5vdDtcblx0fSk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRyZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgP1xuXHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXSA6XG5cdFx0alF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHRcdH0pKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pICk7XG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHQvLyBOZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29udGV4dCApIGJlY29tZXMgJCggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yIClcblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7XG5cdFx0cmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciA/IHRoaXMuc2VsZWN0b3IgKyBcIiBcIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSkgKTtcblx0fSxcblx0aXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gISF3aW5ub3coXG5cdFx0XHR0aGlzLFxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0XG5cdFx0XHQvLyBzbyAkKFwicDpmaXJzdFwiKS5pcyhcInA6bGFzdFwiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gXCJwXCIuXG5cdFx0XHR0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0c2VsZWN0b3IgfHwgW10sXG5cdFx0XHRmYWxzZVxuXHRcdCkubGVuZ3RoO1xuXHR9XG59KTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxuXHQvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0cnF1aWNrRXhwciA9IC9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKnwjKFtcXHctXSopKSQvLFxuXG5cdGluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHR2YXIgbWF0Y2gsIGVsZW07XG5cblx0XHQvLyBIQU5ETEU6ICQoXCJcIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSlcblx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbMF0gPT09IFwiPFwiICYmIHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmIHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXHRcdFx0XHQvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVja1xuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcblx0XHRcdGlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsxXSApIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsxXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsxXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkge1xuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsyXSApO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQmxhY2tiZXJyeSA0LjZcblx0XHRcdFx0XHQvLyBnRUJJRCByZXR1cm5zIG5vZGVzIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKCM2OTYzKVxuXHRcdFx0XHRcdGlmICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0XHQvLyBJbmplY3QgdGhlIGVsZW1lbnQgZGlyZWN0bHkgaW50byB0aGUgalF1ZXJ5IG9iamVjdFxuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdFx0dGhpc1swXSA9IGVsZW07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gdGhpc1swXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIHJvb3RqUXVlcnkucmVhZHkgIT09IFwidW5kZWZpbmVkXCIgP1xuXHRcdFx0XHRyb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0Ly8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRzZWxlY3RvciggalF1ZXJ5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yO1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXHQvLyBNZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldFxuXHRndWFyYW50ZWVkVW5pcXVlID0ge1xuXHRcdGNoaWxkcmVuOiB0cnVlLFxuXHRcdGNvbnRlbnRzOiB0cnVlLFxuXHRcdG5leHQ6IHRydWUsXG5cdFx0cHJldjogdHJ1ZVxuXHR9O1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0ZGlyOiBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbWF0Y2hlZDtcblx0fSxcblxuXHRzaWJsaW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IFtdO1xuXG5cdFx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0XHRtYXRjaGVkLnB1c2goIG4gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlZDtcblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0Y2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHtcblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRtYXRjaGVkID0gW10sXG5cdFx0XHRwb3MgPSBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApIHx8IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6XG5cdFx0XHRcdDA7XG5cblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRmb3IgKCBjdXIgPSB0aGlzW2ldOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKHBvcyA/XG5cdFx0XHRcdFx0cG9zLmluZGV4KGN1cikgPiAtMSA6XG5cblx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykpICkge1xuXG5cdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlKFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoc2VsZWN0b3IpXG5cdFx0KTtcblx0fVxufSk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHR3aGlsZSAoIChjdXIgPSBjdXJbZGlyXSkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goe1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiwgdW50aWwgKTtcblx0fSxcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWUoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59KTtcbnZhciBybm90d2hpdGUgPSAoL1xcUysvZyk7XG5cblxuXG4vLyBTdHJpbmcgdG8gT2JqZWN0IG9wdGlvbnMgZm9ybWF0IGNhY2hlXG52YXIgb3B0aW9uc0NhY2hlID0ge307XG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzIGFuZCBzdG9yZSBpbiBjYWNoZVxuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9KTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHQoIG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdIHx8IGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBMYXN0IGZpcmUgdmFsdWUgKGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMpXG5cdFx0bWVtb3J5LFxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblx0XHQvLyBGaXJzdCBjYWxsYmFjayB0byBmaXJlICh1c2VkIGludGVybmFsbHkgYnkgYWRkIGFuZCBmaXJlV2l0aClcblx0XHRmaXJpbmdTdGFydCxcblx0XHQvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmdcblx0XHRmaXJpbmdMZW5ndGgsXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgcmVtb3ZlIGlmIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCxcblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblx0XHQvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0c3RhY2sgPSAhb3B0aW9ucy5vbmNlICYmIFtdLFxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdFx0bWVtb3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0YTtcblx0XHRcdGZpcmVkID0gdHJ1ZTtcblx0XHRcdGZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwgMDtcblx0XHRcdGZpcmluZ1N0YXJ0ID0gMDtcblx0XHRcdGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0ZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgbGlzdCAmJiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0aDsgZmlyaW5nSW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBkYXRhWyAwIF0sIGRhdGFbIDEgXSApID09PSBmYWxzZSAmJiBvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZpcmluZyA9IGZhbHNlO1xuXHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRpZiAoIHN0YWNrICkge1xuXHRcdFx0XHRcdGlmICggc3RhY2subGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0ZmlyZSggc3RhY2suc2hpZnQoKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzZWxmLmRpc2FibGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXHRcdFx0Ly8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdFxuXHRcdFx0YWRkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdC8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJyZW50IGxlbmd0aFxuXHRcdFx0XHRcdHZhciBzdGFydCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdChmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0dmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJnICk7XG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goIGFyZyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSkoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdC8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlXG5cdFx0XHRcdFx0Ly8gY3VycmVudCBmaXJpbmcgYmF0Y2g/XG5cdFx0XHRcdFx0aWYgKCBmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDtcblx0XHRcdFx0XHQvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVuXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdheVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1lbW9yeSApIHtcblx0XHRcdFx0XHRcdGZpcmluZ1N0YXJ0ID0gc3RhcnQ7XG5cdFx0XHRcdFx0XHRmaXJlKCBtZW1vcnkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaW5kZXg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGZpcmluZyApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0xlbmd0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZpcmluZ0xlbmd0aC0tO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID8galF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6ICEhKCBsaXN0ICYmIGxpc3QubGVuZ3RoICk7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdGZpcmluZ0xlbmd0aCA9IDA7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlXG5cdFx0XHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHQvLyBJcyBpdCBkaXNhYmxlZD9cblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFsaXN0O1xuXHRcdFx0fSxcblx0XHRcdC8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGVcblx0XHRcdGxvY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzdGFjayA9IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICkge1xuXHRcdFx0XHRcdHNlbGYuZGlzYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIElzIGl0IGxvY2tlZD9cblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhc3RhY2s7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHtcblx0XHRcdFx0XHRhcmdzID0gYXJncyB8fCBbXTtcblx0XHRcdFx0XHRhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdO1xuXHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0c3RhY2sucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRmaXJlKCBhcmdzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5qUXVlcnkuZXh0ZW5kKHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksIFwicmVqZWN0ZWRcIiBdLFxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyhcIm1lbW9yeVwiKSBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBqUXVlcnkuaXNGdW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTtcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsxXSBdKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywgZm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0pLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07XG5cblx0XHRcdC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsxXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0Ly8gc3RhdGUgPSBbIHJlc29sdmVkIHwgcmVqZWN0ZWQgXVxuXHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cblx0XHRcdFx0Ly8gWyByZWplY3RfbGlzdCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7IHByb2dyZXNzX2xpc3QubG9ja1xuXHRcdFx0XHR9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVmZXJyZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXVxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fTtcblx0XHRcdGRlZmVycmVkWyB0dXBsZVswXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0pO1xuXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXG5cdFx0cHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApO1xuXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxuXHRcdGlmICggZnVuYyApIHtcblx0XHRcdGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGRvbmUhXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xuXHR9LFxuXG5cdC8vIERlZmVycmVkIGhlbHBlclxuXHR3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCxcblxuXHRcdFx0Ly8gdGhlIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlc1xuXHRcdFx0cmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZC4gSWYgcmVzb2x2ZVZhbHVlcyBjb25zaXN0IG9mIG9ubHkgYSBzaW5nbGUgRGVmZXJyZWQsIGp1c3QgdXNlIHRoYXQuXG5cdFx0XHRkZWZlcnJlZCA9IHJlbWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIFVwZGF0ZSBmdW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2YWx1ZXNcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4dHMsIHZhbHVlcyApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRjb250ZXh0c1sgaSBdID0gdGhpcztcblx0XHRcdFx0XHR2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoIHZhbHVlcyA9PT0gcHJvZ3Jlc3NWYWx1ZXMgKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fSxcblxuXHRcdFx0cHJvZ3Jlc3NWYWx1ZXMsIHByb2dyZXNzQ29udGV4dHMsIHJlc29sdmVDb250ZXh0cztcblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWRcblx0XHRpZiAoIGxlbmd0aCA+IDEgKSB7XG5cdFx0XHRwcm9ncmVzc1ZhbHVlcyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0LmRvbmUoIHVwZGF0ZUZ1bmMoIGksIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApIClcblx0XHRcdFx0XHRcdC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKVxuXHRcdFx0XHRcdFx0LnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9ncmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LS1yZW1haW5pbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyXG5cdFx0aWYgKCAhcmVtYWluaW5nICkge1xuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cbn0pO1xuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdDtcblxualF1ZXJ5LmZuLnJlYWR5ID0gZnVuY3Rpb24oIGZuICkge1xuXHQvLyBBZGQgdGhlIGNhbGxiYWNrXG5cdGpRdWVyeS5yZWFkeS5wcm9taXNlKCkuZG9uZSggZm4gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoe1xuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnRcblx0aG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHtcblx0XHRpZiAoIGhvbGQgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHRcdH1cblx0fSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cblx0XHQvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHNcblx0XHRpZiAoIGpRdWVyeS5mbi50cmlnZ2VySGFuZGxlciApIHtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VySGFuZGxlciggXCJyZWFkeVwiICk7XG5cdFx0XHRqUXVlcnkoIGRvY3VtZW50ICkub2ZmKCBcInJlYWR5XCIgKTtcblx0XHR9XG5cdH1cbn0pO1xuXG4vKipcbiAqIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQsIGZhbHNlICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG5qUXVlcnkucmVhZHkucHJvbWlzZSA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cdGlmICggIXJlYWR5TGlzdCApIHtcblxuXHRcdHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Ly8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG5cdFx0Ly8gV2Ugb25jZSB0cmllZCB0byB1c2UgcmVhZHlTdGF0ZSBcImludGVyYWN0aXZlXCIgaGVyZSwgYnV0IGl0IGNhdXNlZCBpc3N1ZXMgbGlrZSB0aGUgb25lXG5cdFx0Ly8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNVxuXHRcdGlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiICkge1xuXHRcdFx0Ly8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5XG5cdFx0XHRzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQsIGZhbHNlICk7XG5cblx0XHRcdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlYWR5TGlzdC5wcm9taXNlKCBvYmogKTtcbn07XG5cbi8vIEtpY2sgb2ZmIHRoZSBET00gcmVhZHkgY2hlY2sgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdFxualF1ZXJ5LnJlYWR5LnByb21pc2UoKTtcblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBqUXVlcnkuYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggalF1ZXJ5LnR5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRqUXVlcnkuYWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVtpXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApO1xuXHRcdH1cblxuXHQvLyBTZXRzIG9uZSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0Zm4oIGVsZW1zW2ldLCBrZXksIHJhdyA/IHZhbHVlIDogdmFsdWUuY2FsbCggZWxlbXNbaV0sIGksIGZuKCBlbGVtc1tpXSwga2V5ICkgKSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjaGFpbmFibGUgP1xuXHRcdGVsZW1zIDpcblxuXHRcdC8vIEdldHNcblx0XHRidWxrID9cblx0XHRcdGZuLmNhbGwoIGVsZW1zICkgOlxuXHRcdFx0bGVuID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcblxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBvYmplY3QgY2FuIGhhdmUgZGF0YVxuICovXG5qUXVlcnkuYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblx0Ly8gQWNjZXB0cyBvbmx5OlxuXHQvLyAgLSBOb2RlXG5cdC8vICAgIC0gTm9kZS5FTEVNRU5UX05PREVcblx0Ly8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREVcblx0Ly8gIC0gT2JqZWN0XG5cdC8vICAgIC0gQW55XG5cdC8qIGpzaGludCAtVzAxOCAqL1xuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cbmZ1bmN0aW9uIERhdGEoKSB7XG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NCxcblx0Ly8gT2xkIFdlYktpdCBkb2VzIG5vdCBoYXZlIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucy9mcmVlemUgbWV0aG9kLFxuXHQvLyByZXR1cm4gbmV3IGVtcHR5IG9iamVjdCBpbnN0ZWFkIHdpdGggbm8gW1tzZXRdXSBhY2Nlc3NvclxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMuY2FjaGUgPSB7fSwgMCwge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXHR9KTtcblxuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcbkRhdGEuYWNjZXB0cyA9IGpRdWVyeS5hY2NlcHREYXRhO1xuXG5EYXRhLnByb3RvdHlwZSA9IHtcblx0a2V5OiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHQvLyBBbHdheXMgcmV0dXJuIHRoZSBrZXkgZm9yIGEgZnJvemVuIG9iamVjdC5cblx0XHRpZiAoICFEYXRhLmFjY2VwdHMoIG93bmVyICkgKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgZGVzY3JpcHRvciA9IHt9LFxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIG93bmVyIG9iamVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlIGtleVxuXHRcdFx0dW5sb2NrID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0Ly8gSWYgbm90LCBjcmVhdGUgb25lXG5cdFx0aWYgKCAhdW5sb2NrICkge1xuXHRcdFx0dW5sb2NrID0gRGF0YS51aWQrKztcblxuXHRcdFx0Ly8gU2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUsIG5vbi13cml0YWJsZSBwcm9wZXJ0eVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB7IHZhbHVlOiB1bmxvY2sgfTtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIG93bmVyLCBkZXNjcmlwdG9yICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NFxuXHRcdFx0Ly8gRmFsbGJhY2sgdG8gYSBsZXNzIHNlY3VyZSBkZWZpbml0aW9uXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0ZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB1bmxvY2s7XG5cdFx0XHRcdGpRdWVyeS5leHRlbmQoIG93bmVyLCBkZXNjcmlwdG9yICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoZSBjYWNoZSBvYmplY3Rcblx0XHRpZiAoICF0aGlzLmNhY2hlWyB1bmxvY2sgXSApIHtcblx0XHRcdHRoaXMuY2FjaGVbIHVubG9jayBdID0ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVubG9jaztcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Ly8gVGhlcmUgbWF5IGJlIGFuIHVubG9jayBhc3NpZ25lZCB0byB0aGlzIG5vZGUsXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyBcIm93bmVyXCIsIGNyZWF0ZSBvbmUgaW5saW5lXG5cdFx0XHQvLyBhbmQgc2V0IHRoZSB1bmxvY2sgYXMgdGhvdWdoIGFuIG93bmVyIGVudHJ5IGhhZCBhbHdheXMgZXhpc3RlZFxuXHRcdFx0dW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGVbIHVubG9jayBdO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgZGF0YSBdID0gdmFsdWU7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIHsgcHJvcGVydGllcyB9IF0gYXJnc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBGcmVzaCBhc3NpZ25tZW50cyBieSBvYmplY3QgYXJlIHNoYWxsb3cgY29waWVkXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXHRcdFx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLmNhY2hlWyB1bmxvY2sgXSwgZGF0YSApO1xuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBjb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGNhY2hlWyBwcm9wIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdC8vIEVpdGhlciBhIHZhbGlkIGNhY2hlIGlzIGZvdW5kLCBvciB3aWxsIGJlIGNyZWF0ZWQuXG5cdFx0Ly8gTmV3IGNhY2hlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSB1bmxvY2sgcmV0dXJuZWQsXG5cdFx0Ly8gYWxsb3dpbmcgZGlyZWN0IGFjY2VzcyB0byB0aGUgbmV3bHkgY3JlYXRlZFxuXHRcdC8vIGVtcHR5IGRhdGEgb2JqZWN0LiBBIHZhbGlkIG93bmVyIG9iamVjdCBtdXN0IGJlIHByb3ZpZGVkLlxuXHRcdHZhciBjYWNoZSA9IHRoaXMuY2FjaGVbIHRoaXMua2V5KCBvd25lciApIF07XG5cblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0Y2FjaGUgOiBjYWNoZVsga2V5IF07XG5cdH0sXG5cdGFjY2VzczogZnVuY3Rpb24oIG93bmVyLCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBzdG9yZWQ7XG5cdFx0Ly8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZFxuXHRcdC8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZFxuXHRcdC8vXG5cdFx0Ly8gVGFrZSB0aGUgXCJyZWFkXCIgcGF0aCBhbmQgYWxsb3cgdGhlIGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lXG5cdFx0Ly8gd2hpY2ggdmFsdWUgdG8gcmV0dXJuLCByZXNwZWN0aXZlbHkgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBUaGUgZW50aXJlIGNhY2hlIG9iamVjdFxuXHRcdC8vICAgMi4gVGhlIGRhdGEgc3RvcmVkIGF0IHRoZSBrZXlcblx0XHQvL1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KChrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgKSB7XG5cblx0XHRcdHN0b3JlZCA9IHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cblx0XHRcdHJldHVybiBzdG9yZWQgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHN0b3JlZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVsQ2FzZShrZXkpICk7XG5cdFx0fVxuXG5cdFx0Ly8gWypdV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLCBuYW1lLCBjYW1lbCxcblx0XHRcdHVubG9jayA9IHRoaXMua2V5KCBvd25lciApLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlWyB1bmxvY2sgXTtcblxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLmNhY2hlWyB1bmxvY2sgXSA9IHt9O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCBrZXkgKSApIHtcblx0XHRcdFx0Ly8gSWYgXCJuYW1lXCIgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLlxuXHRcdFx0XHQvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoXCJrZXlcIiwgXCJ2YWxcIikgc2lnbmF0dXJlLFxuXHRcdFx0XHQvLyBrZXlzIHdpbGwgYmUgY29udmVydGVkIHRvIGNhbWVsQ2FzZS5cblx0XHRcdFx0Ly8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmVcblx0XHRcdFx0Ly8gYm90aCBwbGFpbiBrZXkgYW5kIGNhbWVsQ2FzZSBrZXkuICMxMjc4NlxuXHRcdFx0XHQvLyBUaGlzIHdpbGwgb25seSBwZW5hbGl6ZSB0aGUgYXJyYXkgYXJndW1lbnQgcGF0aC5cblx0XHRcdFx0bmFtZSA9IGtleS5jb25jYXQoIGtleS5tYXAoIGpRdWVyeS5jYW1lbENhc2UgKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2FtZWwgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblx0XHRcdFx0Ly8gVHJ5IHRoZSBzdHJpbmcgYXMgYSBrZXkgYmVmb3JlIGFueSBtYW5pcHVsYXRpb25cblx0XHRcdFx0aWYgKCBrZXkgaW4gY2FjaGUgKSB7XG5cdFx0XHRcdFx0bmFtZSA9IFsga2V5LCBjYW1lbCBdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRcdG5hbWUgPSBjYW1lbDtcblx0XHRcdFx0XHRuYW1lID0gbmFtZSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0XHRbIG5hbWUgXSA6ICggbmFtZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW10gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpID0gbmFtZS5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBuYW1lWyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHRyZXR1cm4gIWpRdWVyeS5pc0VtcHR5T2JqZWN0KFxuXHRcdFx0dGhpcy5jYWNoZVsgb3duZXJbIHRoaXMuZXhwYW5kbyBdIF0gfHwge31cblx0XHQpO1xuXHR9LFxuXHRkaXNjYXJkOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0aWYgKCBvd25lclsgdGhpcy5leHBhbmRvIF0gKSB7XG5cdFx0XHRkZWxldGUgdGhpcy5jYWNoZVsgb3duZXJbIHRoaXMuZXhwYW5kbyBdIF07XG5cdFx0fVxuXHR9XG59O1xudmFyIGRhdGFfcHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhX3VzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gLyhbQS1aXSkvZztcblxuZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHtcblx0dmFyIG5hbWU7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQxXCIgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhID09PSBcInRydWVcIiA/IHRydWUgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwiZmFsc2VcIiA/IGZhbHNlIDpcblx0XHRcdFx0XHRkYXRhID09PSBcIm51bGxcIiA/IG51bGwgOlxuXHRcdFx0XHRcdC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nXG5cdFx0XHRcdFx0K2RhdGEgKyBcIlwiID09PSBkYXRhID8gK2RhdGEgOlxuXHRcdFx0XHRcdHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOlxuXHRcdFx0XHRcdGRhdGE7XG5cdFx0XHR9IGNhdGNoKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhX3VzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YV91c2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhX3ByaXYuaGFzRGF0YSggZWxlbSApO1xuXHR9LFxuXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhX3VzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YV91c2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFfcHJpdiBtZXRob2RzLCB0aGVzZSBjYW4gYmUgZGVwcmVjYXRlZC5cblx0X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHR2YXIgaSwgbmFtZSwgZGF0YSxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdGhpcy5sZW5ndGggKSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhX3ByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMStcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoNSkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YV9wcml2LnNldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH1cblxuXHRcdC8vIFNldHMgbXVsdGlwbGUgdmFsdWVzXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YV91c2VyLnNldCggdGhpcywga2V5ICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YSxcblx0XHRcdFx0Y2FtZWxLZXkgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIHdpdGggdGhlIGtleSBhcy1pc1xuXHRcdFx0XHRkYXRhID0gZGF0YV91c2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyB3aXRoIHRoZSBrZXkgY2FtZWxpemVkXG5cdFx0XHRcdGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtLCBjYW1lbEtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gXCJkaXNjb3ZlclwiIHRoZSBkYXRhIGluXG5cdFx0XHRcdC8vIEhUTUw1IGN1c3RvbSBkYXRhLSogYXR0cnNcblx0XHRcdFx0ZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBjYW1lbEtleSwgdW5kZWZpbmVkICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQvLyBGaXJzdCwgYXR0ZW1wdCB0byBzdG9yZSBhIGNvcHkgb3IgcmVmZXJlbmNlIG9mIGFueVxuXHRcdFx0XHQvLyBkYXRhIHRoYXQgbWlnaHQndmUgYmVlbiBzdG9yZSB3aXRoIGEgY2FtZWxDYXNlZCBrZXkuXG5cdFx0XHRcdHZhciBkYXRhID0gZGF0YV91c2VyLmdldCggdGhpcywgY2FtZWxLZXkgKTtcblxuXHRcdFx0XHQvLyBGb3IgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZSBpbnRlcm9wLCB3ZSBoYXZlIHRvXG5cdFx0XHRcdC8vIHN0b3JlIHByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIGluIGEgY2FtZWxDYXNlIGZvcm0uXG5cdFx0XHRcdC8vIFRoaXMgbWlnaHQgbm90IGFwcGx5IHRvIGFsbCBwcm9wZXJ0aWVzLi4uKlxuXHRcdFx0XHRkYXRhX3VzZXIuc2V0KCB0aGlzLCBjYW1lbEtleSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyAqLi4uIEluIHRoZSBjYXNlIG9mIHByb3BlcnRpZXMgdGhhdCBtaWdodCBfYWN0dWFsbHlfXG5cdFx0XHRcdC8vIGhhdmUgZGFzaGVzLCB3ZSBuZWVkIHRvIGFsc28gc3RvcmUgYSBjb3B5IG9mIHRoYXRcblx0XHRcdFx0Ly8gdW5jaGFuZ2VkIHByb3BlcnR5LlxuXHRcdFx0XHRpZiAoIGtleS5pbmRleE9mKFwiLVwiKSAhPT0gLTEgJiYgZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGRhdGFfdXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YV91c2VyLnJlbW92ZSggdGhpcywga2V5ICk7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5cbmpRdWVyeS5leHRlbmQoe1xuXHRxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHF1ZXVlO1xuXG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0dHlwZSA9ICggdHlwZSB8fCBcImZ4XCIgKSArIFwicXVldWVcIjtcblx0XHRcdHF1ZXVlID0gZGF0YV9wcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFfcHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwge1xuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKS5hZGQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0pXG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBzZXR0ZXIgPSAyO1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGRhdGEgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IFwiZnhcIjtcblx0XHRcdHNldHRlci0tO1xuXHRcdH1cblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbMF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTtcblxuXHRcdFx0XHQvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVswXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH0sXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0pO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YV9wcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArIFwicXVldWVIb29rc1wiICk7XG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdHRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzb2x2ZSgpO1xuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcblx0fVxufSk7XG52YXIgcG51bSA9ICgvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLykuc291cmNlO1xuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblx0XHQvLyBpc0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXHRcdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcIm5vbmVcIiB8fCAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0fTtcblxudmFyIHJjaGVja2FibGVUeXBlID0gKC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pKTtcblxuXG5cbihmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IFNhZmFyaTw9NS4xXG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBTYWZhcmk8PTUuMSwgQW5kcm9pZDw0LjJcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRTw9MTErXG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG59KSgpO1xudmFyIHN0cnVuZGVmaW5lZCA9IHR5cGVvZiB1bmRlZmluZWQ7XG5cblxuXG5zdXBwb3J0LmZvY3VzaW5CdWJibGVzID0gXCJvbmZvY3VzaW5cIiBpbiB3aW5kb3c7XG5cblxudmFyXG5cdHJrZXlFdmVudCA9IC9ea2V5Lyxcblx0cm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLyxcblx0cmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpJC87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXG5cdFx0aWYgKCAhaGFuZGxlci5ndWlkICkge1xuXHRcdFx0aGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKztcblx0XHR9XG5cblx0XHQvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0XG5cdFx0aWYgKCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0aWYgKCAhKGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IHN0cnVuZGVmaW5lZCAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsxXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnNcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGVcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblxuXHRcdFx0Ly8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRoYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3JpZ1R5cGU6IG9yaWdUeXBlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyLFxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXG5cdFx0XHRcdHNlbGVjdG9yOiBzZWxlY3Rvcixcblx0XHRcdFx0bmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSxcblx0XHRcdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oXCIuXCIpXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xuXG5cdFx0XHQvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdFxuXHRcdFx0aWYgKCAhKGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFfcHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YV9wcml2LmdldCggZWxlbSApO1xuXG5cdFx0aWYgKCAhZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsxXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnRcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gfHwgW107XG5cdFx0XHR0bXAgPSB0bXBbMl0gJiYgbmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbihcIlxcXFwuKD86LipcXFxcLnwpXCIpICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIGV2ZW50c1sgdHlwZSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkXG5cdFx0aWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7XG5cdFx0XHRkZWxldGUgZWxlbURhdGEuaGFuZGxlO1xuXHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgXCJldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsXG5cdFx0XHRldmVudFBhdGggPSBbIGVsZW0gfHwgZG9jdW1lbnQgXSxcblx0XHRcdHR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwidHlwZVwiICkgPyBldmVudC50eXBlIDogZXZlbnQsXG5cdFx0XHRuYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcIm5hbWVzcGFjZVwiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoXCIuXCIpIDogW107XG5cblx0XHRjdXIgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKFwiLlwiKSA+PSAwICkge1xuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoXCIuXCIpO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoXCI6XCIpIDwgMCAmJiBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nXG5cdFx0ZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRldmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQgKTtcblxuXHRcdC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSlcblx0XHRldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMztcblx0XHRldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oXCIuXCIpO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZV9yZSA9IGV2ZW50Lm5hbWVzcGFjZSA/XG5cdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKFwiXFxcXC4oPzouKlxcXFwufClcIikgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSlcblx0XHQvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KVxuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoIChjdXIgPSBldmVudFBhdGhbaSsrXSkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFfcHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJiBkYXRhX3ByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UpICYmXG5cdFx0XHRcdGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LlxuXHRcdFx0XHQvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlbGVtWyB0eXBlIF0gKSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaixcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFfcHJpdi5nZXQoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1swXSA9IGV2ZW50O1xuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0pICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkge1xuXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xuXHRcdFx0XHRcdGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTtcblxuXHRcdFx0XHRcdHJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVyIClcblx0XHRcdFx0XHRcdFx0LmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChldmVudC5yZXN1bHQgPSByZXQpID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIG1hdGNoZXMsIHNlbCwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCxcblx0XHRcdGN1ciA9IGV2ZW50LnRhcmdldDtcblxuXHRcdC8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnNcblx0XHQvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAoIzEzMTgwKVxuXHRcdC8vIEF2b2lkIG5vbi1sZWZ0LWNsaWNrIGJ1YmJsaW5nIGluIEZpcmVmb3ggKCMzODYxKVxuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJiBjdXIubm9kZVR5cGUgJiYgKCFldmVudC5idXR0b24gfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgcHJvY2VzcyBjbGlja3Mgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2NSwgIzExMzgyLCAjMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLmRpc2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09IFwiY2xpY2tcIiApIHtcblx0XHRcdFx0XHRtYXRjaGVzID0gW107XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKVxuXHRcdFx0XHRcdFx0c2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgXCIgXCI7XG5cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID9cblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+PSAwIDpcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlcyB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50XG5cdHByb3BzOiBcImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaFwiLnNwbGl0KFwiIFwiKSxcblxuXHRmaXhIb29rczoge30sXG5cblx0a2V5SG9va3M6IHtcblx0XHRwcm9wczogXCJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlXCIuc3BsaXQoXCIgXCIpLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzXG5cdFx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50LndoaWNoID0gb3JpZ2luYWwuY2hhckNvZGUgIT0gbnVsbCA/IG9yaWdpbmFsLmNoYXJDb2RlIDogb3JpZ2luYWwua2V5Q29kZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV2ZW50O1xuXHRcdH1cblx0fSxcblxuXHRtb3VzZUhvb2tzOiB7XG5cdFx0cHJvcHM6IFwiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50XCIuc3BsaXQoXCIgXCIpLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblx0XHRcdHZhciBldmVudERvYywgZG9jLCBib2R5LFxuXHRcdFx0XHRidXR0b24gPSBvcmlnaW5hbC5idXR0b247XG5cblx0XHRcdC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGVcblx0XHRcdGlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG5cdFx0XHRcdGRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDtcblx0XHRcdFx0Ym9keSA9IGV2ZW50RG9jLmJvZHk7XG5cblx0XHRcdFx0ZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApO1xuXHRcdFx0XHRldmVudC5wYWdlWSA9IG9yaWdpbmFsLmNsaWVudFkgKyAoIGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50VG9wICB8fCBib2R5ICYmIGJvZHkuY2xpZW50VG9wICB8fCAwICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRcdC8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0XG5cdFx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7XG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzXG5cdFx0dmFyIGksIHByb3AsIGNvcHksXG5cdFx0XHR0eXBlID0gZXZlbnQudHlwZSxcblx0XHRcdG9yaWdpbmFsRXZlbnQgPSBldmVudCxcblx0XHRcdGZpeEhvb2sgPSB0aGlzLmZpeEhvb2tzWyB0eXBlIF07XG5cblx0XHRpZiAoICFmaXhIb29rICkge1xuXHRcdFx0dGhpcy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9vayA9XG5cdFx0XHRcdHJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91c2VIb29rcyA6XG5cdFx0XHRcdHJrZXlFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLmtleUhvb2tzIDpcblx0XHRcdFx0e307XG5cdFx0fVxuXHRcdGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7XG5cblx0XHRldmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcblxuXHRcdGkgPSBjb3B5Lmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHByb3AgPSBjb3B5WyBpIF07XG5cdFx0XHRldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IENvcmRvdmEgMi41IChXZWJLaXQpICgjMTMyNTUpXG5cdFx0Ly8gQWxsIGV2ZW50cyBzaG91bGQgaGF2ZSBhIHRhcmdldDsgQ29yZG92YSBkZXZpY2VyZWFkeSBkb2Vzbid0XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDYuMCssIENocm9tZTwyOFxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0aWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZml4SG9vay5maWx0ZXIgPyBmaXhIb29rLmZpbHRlciggZXZlbnQsIG9yaWdpbmFsRXZlbnQgKSA6IGV2ZW50O1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cdFx0XHQvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkXG5cdFx0XHRub0J1YmJsZTogdHJ1ZVxuXHRcdH0sXG5cdFx0Zm9jdXM6IHtcblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblx0XHRcdC8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiAmJiB0aGlzLmNsaWNrICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5jbGljaygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50LCBidWJibGUgKSB7XG5cdFx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lLlxuXHRcdC8vIEZha2Ugb3JpZ2luYWxFdmVudCB0byBhdm9pZCBkb25vcidzIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGlmIHRoZVxuXHRcdC8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLlxuXHRcdHZhciBlID0galF1ZXJ5LmV4dGVuZChcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcblx0XHRcdGV2ZW50LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZSxcblx0XHRcdFx0b3JpZ2luYWxFdmVudDoge31cblx0XHRcdH1cblx0XHQpO1xuXHRcdGlmICggYnViYmxlICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmNhbGwoIGVsZW0sIGUgKTtcblx0XHR9XG5cdFx0aWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7XG5cdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuXHRcdGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlLCBmYWxzZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHtcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gRXZlbnQgb2JqZWN0XG5cdGlmICggc3JjICYmIHNyYy50eXBlICkge1xuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcblx0XHR0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG5cdFx0Ly8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fFxuXHRcdFx0XHRzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wXG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHQvLyBFdmVudCB0eXBlXG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gc3JjO1xuXHR9XG5cblx0Ly8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3Rcblx0aWYgKCBwcm9wcyApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcblx0dGhpcy50aW1lU3RhbXAgPSBzcmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBqUXVlcnkubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnN0b3BQcm9wYWdhdGlvbiApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gU3VwcG9ydDogQ2hyb21lIDE1K1xualF1ZXJ5LmVhY2goe1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkpICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaVxuLy8gQ3JlYXRlIFwiYnViYmxpbmdcIiBmb2N1cyBhbmQgYmx1ciBldmVudHNcbmlmICggIXN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgKSB7XG5cdGpRdWVyeS5lYWNoKHsgZm9jdXM6IFwiZm9jdXNpblwiLCBibHVyOiBcImZvY3Vzb3V0XCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblxuXHRcdC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0XG5cdFx0dmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICksIHRydWUgKTtcblx0XHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7XG5cdFx0XHR9LFxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFfcHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIC8qSU5URVJOQUwqLyBvbmUgKSB7XG5cdFx0dmFyIG9yaWdGbiwgdHlwZTtcblxuXHRcdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApXG5cdFx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub24oIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cdFx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRcdG9yaWdGbiA9IGZuO1xuXHRcdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mb1xuXHRcdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0fTtcblx0XHRcdC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuXG5cdFx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdFx0fSk7XG5cdH0sXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxuXHRcdFx0aGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqO1xuXHRcdFx0alF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZihcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6IGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApXG5cdFx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0pO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWzBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSk7XG5cblxudmFyXG5cdHJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcXHc6XSspW14+XSopXFwvPi9naSxcblx0cnRhZ05hbWUgPSAvPChbXFx3Ol0rKS8sXG5cdHJodG1sID0gLzx8JiM/XFx3KzsvLFxuXHRybm9Jbm5lcmh0bWwgPSAvPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLFxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyc2NyaXB0VHlwZSA9IC9eJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksXG5cdHJzY3JpcHRUeXBlTWFza2VkID0gL150cnVlXFwvKC4qKS8sXG5cdHJjbGVhblNjcmlwdCA9IC9eXFxzKjwhKD86XFxbQ0RBVEFcXFt8LS0pfCg/OlxcXVxcXXwtLSk+XFxzKiQvZyxcblxuXHQvLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxuXHR3cmFwTWFwID0ge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0XHR0aGVhZDogWyAxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiIF0sXG5cdFx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0XHR0cjogWyAyLCBcIjx0YWJsZT48dGJvZHk+XCIsIFwiPC90Ym9keT48L3RhYmxlPlwiIF0sXG5cdFx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXG5cdFx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG5cdH07XG5cbi8vIFN1cHBvcnQ6IElFOVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cbi8vIFN1cHBvcnQ6IDEueCBjb21wYXRpYmlsaXR5XG4vLyBNYW5pcHVsYXRpbmcgdGFibGVzIHJlcXVpcmVzIGEgdGJvZHlcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0cmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRqUXVlcnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgXCJ0clwiICkgP1xuXG5cdFx0ZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRib2R5XCIpWzBdIHx8XG5cdFx0XHRlbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRib2R5XCIpICkgOlxuXHRcdGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9IChlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IG51bGwpICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0dmFyIG1hdGNoID0gcnNjcmlwdFR5cGVNYXNrZWQuZXhlYyggZWxlbS50eXBlICk7XG5cblx0aWYgKCBtYXRjaCApIHtcblx0XHRlbGVtLnR5cGUgPSBtYXRjaFsgMSBdO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKFwidHlwZVwiKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFfcHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLCBcImdsb2JhbEV2YWxcIiwgIXJlZkVsZW1lbnRzIHx8IGRhdGFfcHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFfcHJpdi5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRwZGF0YU9sZCA9IGRhdGFfcHJpdi5hY2Nlc3MoIHNyYyApO1xuXHRcdHBkYXRhQ3VyID0gZGF0YV9wcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YV91c2VyLmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHVkYXRhT2xkID0gZGF0YV91c2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFfdXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cdHZhciByZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lID8gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIHx8IFwiKlwiICkgOlxuXHRcdFx0Y29udGV4dC5xdWVyeVNlbGVjdG9yQWxsID8gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHRbXTtcblxuXHRyZXR1cm4gdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVyeS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgP1xuXHRcdGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIHJldCApIDpcblx0XHRyZXQ7XG59XG5cbi8vIEZpeCBJRSBidWdzLCBzZWUgc3VwcG9ydCB0ZXN0c1xuZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLlxuXHRpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblx0XHRkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDtcblxuXHQvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEZpeCBJRSBjbG9uaW5nIGlzc3Vlc1xuXHRcdGlmICggIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgJiYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiZcblx0XHRcdFx0IWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHA6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMlxuXHRcdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApO1xuXHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZpeElucHV0KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmVcblx0XHRpZiAoIGRhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0XHRzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApO1xuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgXCJzY3JpcHRcIiApO1xuXHRcdGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCBcInNjcmlwdFwiICkgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXRcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0sXG5cblx0YnVpbGRGcmFnbWVudDogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24gKSB7XG5cdFx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBjb250YWlucywgaixcblx0XHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0XHRub2RlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0XHRpZiAoIGpRdWVyeS50eXBlKCBlbGVtICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXQsIFBoYW50b21KU1xuXHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHRcdH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XG5cdFx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgKTtcblxuXHRcdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHR3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDtcblx0XHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgZWxlbS5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRcdGogPSB3cmFwWyAwIF07XG5cdFx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFF0V2ViS2l0LCBQaGFudG9tSlNcblx0XHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHRcdC8vIFJlbWVtYmVyIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyXG5cdFx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKCMxMjM5Milcblx0XHRcdFx0XHR0bXAudGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRcdGZyYWdtZW50LnRleHRDb250ZW50ID0gXCJcIjtcblxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKGVsZW0gPSBub2Rlc1sgaSsrIF0pICkge1xuXG5cdFx0XHQvLyAjNDA4NyAtIElmIG9yaWdpbiBhbmQgZGVzdGluYXRpb24gZWxlbWVudHMgYXJlIHRoZSBzYW1lLCBhbmQgdGhpcyBpc1xuXHRcdFx0Ly8gdGhhdCBlbGVtZW50LCBkbyBub3QgZG8gYW55dGhpbmdcblx0XHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSAhPT0gLTEgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gdG1wWyBqKysgXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZyYWdtZW50O1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLCBrZXksXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWwsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKGVsZW0gPSBlbGVtc1sgaSBdKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGtleSA9IGVsZW1bIGRhdGFfcHJpdi5leHBhbmRvIF07XG5cblx0XHRcdFx0aWYgKCBrZXkgJiYgKGRhdGEgPSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBkYXRhX3ByaXYuY2FjaGVbIGtleSBdICkge1xuXHRcdFx0XHRcdFx0Ly8gRGlzY2FyZCBhbnkgcmVtYWluaW5nIGBwcml2YXRlYCBkYXRhXG5cdFx0XHRcdFx0XHRkZWxldGUgZGF0YV9wcml2LmNhY2hlWyBrZXkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIERpc2NhcmQgYW55IHJlbWFpbmluZyBgdXNlcmAgZGF0YVxuXHRcdFx0ZGVsZXRlIGRhdGFfdXNlci5jYWNoZVsgZWxlbVsgZGF0YV91c2VyLmV4cGFuZG8gXSBdO1xuXHRcdH1cblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGFwcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRwcmVwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0YWZ0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdFx0dmFyIGVsZW0sXG5cdFx0XHRlbGVtcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKSA6IHRoaXMsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCAha2VlcERhdGEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtICkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcblx0XHR9KTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUxcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF0gfHwge307XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXJnID0gYXJndW1lbnRzWyAwIF07XG5cblx0XHQvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnRcblx0XHR0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0YXJnID0gdGhpcy5wYXJlbnROb2RlO1xuXG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApO1xuXG5cdFx0XHRpZiAoIGFyZyApIHtcblx0XHRcdFx0YXJnLnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRm9yY2UgcmVtb3ZhbCBpZiB0aGVyZSB3YXMgbm8gbmV3IGNvbnRlbnQgKGUuZy4sIGZyb20gZW1wdHkgYXJndW1lbnRzKVxuXHRcdHJldHVybiBhcmcgJiYgKGFyZy5sZW5ndGggfHwgYXJnLm5vZGVUeXBlKSA/IHRoaXMgOiB0aGlzLnJlbW92ZSgpO1xuXHR9LFxuXG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTtcblx0fSxcblxuXHRkb21NYW5pcDogZnVuY3Rpb24oIGFyZ3MsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdGFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7XG5cblx0XHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHNldCA9IHRoaXMsXG5cdFx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0XHRpZiAoIGlzRnVuY3Rpb24gfHxcblx0XHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0XHR2YXIgc2VsZiA9IHNldC5lcSggaW5kZXggKTtcblx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYuZG9tTWFuaXAoIGFyZ3MsIGNhbGxiYWNrICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIGwgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsIHRoaXMgKTtcblx0XHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdFx0ZnJhZ21lbnQgPSBmaXJzdDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBmaXJzdCApIHtcblx0XHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0XHRoYXNTY3JpcHRzID0gc2NyaXB0cy5sZW5ndGg7XG5cblx0XHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbSBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdFx0Ly8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS5cblx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRcdGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXRcblx0XHRcdFx0XHRcdFx0Ly8galF1ZXJ5Lm1lcmdlIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93c1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y2FsbGJhY2suY2FsbCggdGhpc1sgaSBdLCBub2RlLCBpICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdFx0ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDtcblxuXHRcdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0XHQvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0aW9uXG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgXCJcIiApICYmXG5cdFx0XHRcdFx0XHRcdCFkYXRhX3ByaXYuYWNjZXNzKCBub2RlLCBcImdsb2JhbEV2YWxcIiApICYmIGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudFxuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZWFjaCh7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFF0V2ViS2l0XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzXG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0pO1xuXG5cbnZhciBpZnJhbWUsXG5cdGVsZW1kaXNwbGF5ID0ge307XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5IG9mIGEgZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgRG9jdW1lbnQgb2JqZWN0XG4gKi9cbi8vIENhbGxlZCBvbmx5IGZyb20gd2l0aGluIGRlZmF1bHREaXNwbGF5XG5mdW5jdGlvbiBhY3R1YWxEaXNwbGF5KCBuYW1lLCBkb2MgKSB7XG5cdHZhciBzdHlsZSxcblx0XHRlbGVtID0galF1ZXJ5KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSApICkuYXBwZW5kVG8oIGRvYy5ib2R5ICksXG5cblx0XHQvLyBnZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSBtaWdodCBiZSByZWxpYWJseSB1c2VkIG9ubHkgb24gYXR0YWNoZWQgZWxlbWVudFxuXHRcdGRpc3BsYXkgPSB3aW5kb3cuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUgJiYgKCBzdHlsZSA9IHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSggZWxlbVsgMCBdICkgKSA/XG5cblx0XHRcdC8vIFVzZSBvZiB0aGlzIG1ldGhvZCBpcyBhIHRlbXBvcmFyeSBmaXggKG1vcmUgbGlrZSBvcHRpbWl6YXRpb24pIHVudGlsIHNvbWV0aGluZyBiZXR0ZXIgY29tZXMgYWxvbmcsXG5cdFx0XHQvLyBzaW5jZSBpdCB3YXMgcmVtb3ZlZCBmcm9tIHNwZWNpZmljYXRpb24gYW5kIHN1cHBvcnRlZCBvbmx5IGluIEZGXG5cdFx0XHRzdHlsZS5kaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbVsgMCBdLCBcImRpc3BsYXlcIiApO1xuXG5cdC8vIFdlIGRvbid0IGhhdmUgYW55IGRhdGEgc3RvcmVkIG9uIHRoZSBlbGVtZW50LFxuXHQvLyBzbyB1c2UgXCJkZXRhY2hcIiBtZXRob2QgYXMgZmFzdCB3YXkgdG8gZ2V0IHJpZCBvZiB0aGUgZWxlbWVudFxuXHRlbGVtLmRldGFjaCgpO1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG4vKipcbiAqIFRyeSB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZGlzcGxheSB2YWx1ZSBvZiBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbm9kZU5hbWVcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkge1xuXHR2YXIgZG9jID0gZG9jdW1lbnQsXG5cdFx0ZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdO1xuXG5cdGlmICggIWRpc3BsYXkgKSB7XG5cdFx0ZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTtcblxuXHRcdC8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxzLCByZWFkIGZyb20gaW5zaWRlIGFuIGlmcmFtZVxuXHRcdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgfHwgIWRpc3BsYXkgKSB7XG5cblx0XHRcdC8vIFVzZSB0aGUgYWxyZWFkeS1jcmVhdGVkIGlmcmFtZSBpZiBwb3NzaWJsZVxuXHRcdFx0aWZyYW1lID0gKGlmcmFtZSB8fCBqUXVlcnkoIFwiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPlwiICkpLmFwcGVuZFRvKCBkb2MuZG9jdW1lbnRFbGVtZW50ICk7XG5cblx0XHRcdC8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxldG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZVxuXHRcdFx0ZG9jID0gaWZyYW1lWyAwIF0uY29udGVudERvY3VtZW50O1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRVxuXHRcdFx0ZG9jLndyaXRlKCk7XG5cdFx0XHRkb2MuY2xvc2UoKTtcblxuXHRcdFx0ZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTtcblx0XHRcdGlmcmFtZS5kZXRhY2goKTtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSB0aGUgY29ycmVjdCBkZWZhdWx0IGRpc3BsYXlcblx0XHRlbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7XG5cdH1cblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cbnZhciBybWFyZ2luID0gKC9ebWFyZ2luLyk7XG5cbnZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKTtcblxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdC8vIFN1cHBvcnQ6IElFPD0xMSssIEZpcmVmb3g8PTMwKyAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0aWYgKCBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcub3BlbmVyICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFOVxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG9ubHkgbmVlZGVkIGZvciAuY3NzKCdmaWx0ZXInKSAoIzEyNTM3KVxuXHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXHR9XG5cblx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdGlmICggcmV0ID09PSBcIlwiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogaU9TIDwgNlxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBpT1MgPCA2IChhdCBsZWFzdCkgcmV0dXJucyBwZXJjZW50YWdlIGZvciBhIGxhcmdlciBzZXQgb2YgdmFsdWVzLCBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzXG5cdFx0Ly8gdGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOiBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xuXHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0c3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0O1xuXHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmV0ICE9PSB1bmRlZmluZWQgP1xuXHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAodGhpcy5nZXQgPSBob29rRm4pLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxuKGZ1bmN0aW9uKCkge1xuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsXG5cdFx0ZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gXCJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweDtcIiArXG5cdFx0XCJwb3NpdGlvbjphYnNvbHV0ZVwiO1xuXHRjb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCkge1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFuZHJvaWQgMi4zXG5cdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFwiLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7XCIgK1xuXHRcdFx0XCJib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjElO3RvcDoxJTtcIiArXG5cdFx0XHRcImJvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NHB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHR2YXIgZGl2U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICk7XG5cdFx0cGl4ZWxQb3NpdGlvblZhbCA9IGRpdlN0eWxlLnRvcCAhPT0gXCIxJVwiO1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gZGl2U3R5bGUud2lkdGggPT09IFwiNHB4XCI7XG5cblx0XHRkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IG5vZGUuanMganNkb21cblx0Ly8gRG9uJ3QgYXNzdW1lIHRoYXQgZ2V0Q29tcHV0ZWRTdHlsZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBnbG9iYWwgb2JqZWN0XG5cdGlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdFx0cGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gVGhpcyB0ZXN0IGlzIGV4ZWN1dGVkIG9ubHkgb25jZSBidXQgd2Ugc3RpbGwgZG8gbWVtb2l6aW5nXG5cdFx0XHRcdC8vIHNpbmNlIHdlIGNhbiB1c2UgdGhlIGJveFNpemluZ1JlbGlhYmxlIHByZS1jb21wdXRpbmcuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHRlc3Qgd2FzIGFscmVhZHkgcGVyZm9ybWVkLCB0aG91Z2guXG5cdFx0XHRcdGNvbXB1dGVQaXhlbFBvc2l0aW9uQW5kQm94U2l6aW5nUmVsaWFibGUoKTtcblx0XHRcdFx0cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7XG5cdFx0XHR9LFxuXHRcdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGJveFNpemluZ1JlbGlhYmxlVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdFx0Y29tcHV0ZVBpeGVsUG9zaXRpb25BbmRCb3hTaXppbmdSZWxpYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHRcdH0sXG5cdFx0XHRyZWxpYWJsZU1hcmdpblJpZ2h0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5XG5cdFx0XHRcdC8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gKCMzMzMzKVxuXHRcdFx0XHQvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHRcblx0XHRcdFx0Ly8gVGhpcyBzdXBwb3J0IGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBzbyBubyBtZW1vaXppbmcgaXMgbmVlZGVkLlxuXHRcdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHRcdG1hcmdpbkRpdiA9IGRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gUmVzZXQgQ1NTOiBib3gtc2l6aW5nOyBkaXNwbGF5OyBtYXJnaW47IGJvcmRlcjsgcGFkZGluZ1xuXHRcdFx0XHRtYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PDI5LCBBbmRyb2lkIDIuM1xuXHRcdFx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XHRcdFwiLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtcIiArXG5cdFx0XHRcdFx0XCJib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowXCI7XG5cdFx0XHRcdG1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0XHRkaXYuc3R5bGUud2lkdGggPSBcIjFweFwiO1xuXHRcdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdFx0XHRyZXQgPSAhcGFyc2VGbG9hdCggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApLm1hcmdpblJpZ2h0ICk7XG5cblx0XHRcdFx0ZG9jRWxlbS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cdFx0XHRcdGRpdi5yZW1vdmVDaGlsZCggbWFyZ2luRGl2ICk7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufSkoKTtcblxuXG4vLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zLlxualF1ZXJ5LnN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7XG5cdHZhciByZXQsIG5hbWUsXG5cdFx0b2xkID0ge307XG5cblx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XG5cdH1cblxuXHRyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApO1xuXG5cdC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufTtcblxuXG52YXJcblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZSBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cm51bXNwbGl0ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSguKikkXCIsIFwiaVwiICksXG5cdHJyZWxOdW0gPSBuZXcgUmVnRXhwKCBcIl4oWystXSk9KFwiICsgcG51bSArIFwiKVwiLCBcImlcIiApLFxuXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk9cIiwgXCJNb3pcIiwgXCJtc1wiIF07XG5cbi8vIFJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBzdHlsZSwgbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gc3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSxcblx0XHRvcmlnTmFtZSA9IG5hbWUsXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIHN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9yaWdOYW1lO1xufVxuXG5mdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXHR2YXIgbWF0Y2hlcyA9IHJudW1zcGxpdC5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMiBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkge1xuXHR2YXIgaSA9IGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgP1xuXHRcdC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvblxuXHRcdDQgOlxuXHRcdC8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXNcblx0XHRuYW1lID09PSBcIndpZHRoXCIgPyAxIDogMCxcblxuXHRcdHZhbCA9IDA7XG5cblx0Zm9yICggOyBpIDwgNDsgaSArPSAyICkge1xuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXRcblx0XHRpZiAoIGV4dHJhID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdGlmICggaXNCb3JkZXJCb3ggKSB7XG5cdFx0XHQvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnRcblx0XHRcdGlmICggZXh0cmEgPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmdcblx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3IgcGFkZGluZywgc28gYWRkIGJvcmRlclxuXHRcdFx0aWYgKCBleHRyYSAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICkge1xuXG5cdC8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBib3JkZXItYm94IHZhbHVlXG5cdHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSxcblx0XHR2YWwgPSBuYW1lID09PSBcIndpZHRoXCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQsXG5cdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0aXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdC8vIFNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZFxuXHQvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODVcblx0Ly8gTWF0aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxNjY4XG5cdGlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7XG5cdFx0Ly8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5XG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHRpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7XG5cdFx0XHR2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gQ29tcHV0ZWQgdW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi5cblx0XHRpZiAoIHJudW1ub25weC50ZXN0KHZhbCkgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzXG5cdFx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJlxuXHRcdFx0KCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTtcblxuXHRcdC8vIE5vcm1hbGl6ZSBcIlwiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmFcblx0XHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXHR9XG5cblx0Ly8gVXNlIHRoZSBhY3RpdmUgYm94LXNpemluZyBtb2RlbCB0byBhZGQvc3VidHJhY3QgaXJyZWxldmFudCBzdHlsZXNcblx0cmV0dXJuICggdmFsICtcblx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdGVsZW0sXG5cdFx0XHRuYW1lLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlc1xuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVuLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiICk7XG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cdFx0XHQvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzXG5cdFx0XHQvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90XG5cdFx0XHRpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmVcblx0XHRcdC8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzXG5cdFx0XHQvLyBmb3Igc3VjaCBhbiBlbGVtZW50XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbiggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBcIm9sZGRpc3BsYXlcIiwgZGVmYXVsdERpc3BsYXkoZWxlbS5ub2RlTmFtZSkgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTtcblxuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiB8fCAhaGlkZGVuICkge1xuXHRcdFx0XHRkYXRhX3ByaXYuc2V0KCBlbGVtLCBcIm9sZGRpc3BsYXlcIiwgaGlkZGVuID8gZGlzcGxheSA6IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcFxuXHQvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0aWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0gfHwgXCJcIiA6IFwibm9uZVwiO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cdC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eVxuXHRjc3NIb29rczoge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHlcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xuXHRcdFx0XHRcdHJldHVybiByZXQgPT09IFwiXCIgPyBcIjFcIiA6IHJldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCBcInB4XCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllc1xuXHRjc3NOdW1iZXI6IHtcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7XG5cdFx0XCJmbG9hdFwiOiBcImNzc0Zsb2F0XCJcblx0fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBvcmlnTmFtZSApICk7XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkge1xuXHRcdFx0XHR2YWx1ZSA9ICggcmV0WzFdICsgMSApICogcmV0WzJdICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7XG5cdFx0XHRcdC8vIEZpeGVzIGJ1ZyAjOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIsIGFkZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm51bWJlclwiICYmICFqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkge1xuXHRcdFx0XHR2YWx1ZSArPSBcInB4XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0XHRcdC8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXNcblx0XHRcdGlmICggIXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlICYmIHZhbHVlID09PSBcIlwiICYmIG5hbWUuaW5kZXhPZiggXCJiYWNrZ3JvdW5kXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IFwiaW5oZXJpdFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWVcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoXCJzZXRcIiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBlbGVtLnN0eWxlLCBvcmlnTmFtZSApICk7XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZWFjaChbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHQvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW1cblx0XHRcdFx0Ly8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXRcblx0XHRcdFx0cmV0dXJuIHJkaXNwbGF5c3dhcC50ZXN0KCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApICkgJiYgZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCA/XG5cdFx0XHRcdFx0alF1ZXJ5LnN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIGV4dHJhID9cblx0XHRcdFx0YXVnbWVudFdpZHRoT3JIZWlnaHQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGV4dHJhLFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCkgOiAwXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xualF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7IFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiIH0sXG5cdFx0XHRcdGN1ckNTUywgWyBlbGVtLCBcIm1hcmdpblJpZ2h0XCIgXSApO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goe1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gQXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoXCIgXCIpIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHtcblx0XHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyO1xuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZXMsIGxlbixcblx0XHRcdFx0bWFwID0ge30sXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzLCB0cnVlICk7XG5cdH0sXG5cdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcyApO1xuXHR9LFxuXHR0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHtcblx0XHRpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufSk7XG5cblxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xuXHRyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApO1xufVxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XG5cblR3ZWVuLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxuXHRpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7XG5cdFx0dGhpcy5lbGVtID0gZWxlbTtcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xuXHRcdHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8IFwic3dpbmdcIjtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdGlmICggdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiZcblx0XHRcdFx0KCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5XG5cdFx0XHQvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLlxuXHRcdFx0Ly8gU2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7XG5cdFx0XHQvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzIFwicm90YXRlKDFyYWQpXCIgYXJlIHJldHVybmVkIGFzLWlzLlxuXHRcdFx0cmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgXCJcIiApO1xuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0Ly8gVXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQuXG5cdFx0XHQvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuXG5cdFx0XHQvLyBVc2UgLnN0eWxlIGlmIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlLlxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIFN1cHBvcnQ6IElFOVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fVxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgQ29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIHRpbWVySWQsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRyZnhudW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLyxcblx0YW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXHR0d2VlbmVycyA9IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApLFxuXHRcdFx0XHR0YXJnZXQgPSB0d2Vlbi5jdXIoKSxcblx0XHRcdFx0cGFydHMgPSByZnhudW0uZXhlYyggdmFsdWUgKSxcblx0XHRcdFx0dW5pdCA9IHBhcnRzICYmIHBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICksXG5cblx0XHRcdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRcdFx0c3RhcnQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSBcInB4XCIgJiYgK3RhcmdldCApICYmXG5cdFx0XHRcdFx0cmZ4bnVtLmV4ZWMoIGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHByb3AgKSApLFxuXHRcdFx0XHRzY2FsZSA9IDEsXG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAyMDtcblxuXHRcdFx0aWYgKCBzdGFydCAmJiBzdGFydFsgMyBdICE9PSB1bml0ICkge1xuXHRcdFx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0XHRcdHVuaXQgPSB1bml0IHx8IHN0YXJ0WyAzIF07XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdFx0XHRwYXJ0cyA9IHBhcnRzIHx8IFtdO1xuXG5cdFx0XHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0XHRcdHN0YXJ0ID0gK3RhcmdldCB8fCAxO1xuXG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHQvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKi5cblx0XHRcdFx0XHQvLyBVc2Ugc3RyaW5nIGZvciBkb3VibGluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xuXHRcdFx0XHRcdHNjYWxlID0gc2NhbGUgfHwgXCIuNVwiO1xuXG5cdFx0XHRcdFx0Ly8gQWRqdXN0IGFuZCBhcHBseVxuXHRcdFx0XHRcdHN0YXJ0ID0gc3RhcnQgLyBzY2FsZTtcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0ICsgdW5pdCApO1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSBzY2FsZSwgdG9sZXJhdGluZyB6ZXJvIG9yIE5hTiBmcm9tIHR3ZWVuLmN1cigpLFxuXHRcdFx0XHQvLyBicmVhayB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdoXG5cdFx0XHRcdH0gd2hpbGUgKCBzY2FsZSAhPT0gKHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9ucyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdHdlZW4gcHJvcGVydGllc1xuXHRcdFx0aWYgKCBwYXJ0cyApIHtcblx0XHRcdFx0c3RhcnQgPSB0d2Vlbi5zdGFydCA9ICtzdGFydCB8fCArdGFyZ2V0IHx8IDA7XG5cdFx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0XHQvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb25cblx0XHRcdFx0dHdlZW4uZW5kID0gcGFydHNbIDEgXSA/XG5cdFx0XHRcdFx0c3RhcnQgKyAoIHBhcnRzWyAxIF0gKyAxICkgKiBwYXJ0c1sgMiBdIDpcblx0XHRcdFx0XHQrcGFydHNbIDIgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9O1xuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSk7XG5cdHJldHVybiAoIGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7XG59XG5cbi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xuXHR2YXIgd2hpY2gsXG5cdFx0aSA9IDAsXG5cdFx0YXR0cnMgPSB7IGhlaWdodDogdHlwZSB9O1xuXG5cdC8vIElmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcyxcblx0Ly8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92ZXIgTGVmdCBhbmQgUmlnaHRcblx0aW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7XG5cdGZvciAoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggdHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggdHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAodHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSkgKSB7XG5cblx0XHRcdC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkge1xuXHQvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCB0d2VlbiwgaG9va3MsIG9sZGZpcmUsIGRpc3BsYXksIGNoZWNrRGlzcGxheSxcblx0XHRhbmltID0gdGhpcyxcblx0XHRvcmlnID0ge30sXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlLFxuXHRcdGhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW4oIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sIFwiZnhzaG93XCIgKTtcblxuXHQvLyBIYW5kbGUgcXVldWU6IGZhbHNlIHByb21pc2VzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcblx0XHRcdFx0aG9va3MudW5xdWV1ZWQtLTtcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCBcImZ4XCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8vIEhlaWdodC93aWR0aCBvdmVyZmxvdyBwYXNzXG5cdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiaGVpZ2h0XCIgaW4gcHJvcHMgfHwgXCJ3aWR0aFwiIGluIHByb3BzICkgKSB7XG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTktMTAgZG8gbm90XG5cdFx0Ly8gY2hhbmdlIHRoZSBvdmVyZmxvdyBhdHRyaWJ1dGUgd2hlbiBvdmVyZmxvd1ggYW5kXG5cdFx0Ly8gb3ZlcmZsb3dZIGFyZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWVcblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoXG5cdFx0Ly8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZFxuXHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXG5cdFx0Ly8gVGVzdCBkZWZhdWx0IGRpc3BsYXkgaWYgZGlzcGxheSBpcyBjdXJyZW50bHkgXCJub25lXCJcblx0XHRjaGVja0Rpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/XG5cdFx0XHRkYXRhX3ByaXYuZ2V0KCBlbGVtLCBcIm9sZGRpc3BsYXlcIiApIHx8IGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgOiBkaXNwbGF5O1xuXG5cdFx0aWYgKCBjaGVja0Rpc3BsYXkgPT09IFwiaW5saW5lXCIgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJmbG9hdFwiICkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0c3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBvcHRzLm92ZXJmbG93ICkge1xuXHRcdHN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcblx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gc2hvdy9oaWRlIHBhc3Ncblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy5leGVjKCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBsZWZ0IG92ZXIgZnJvbSBhIHN0b3BwZWQgaGlkZSBvciBzaG93IGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRoIHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlblxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcInNob3dcIiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblxuXHRcdC8vIEFueSBub24tZnggdmFsdWUgc3RvcHMgdXMgZnJvbSByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWVcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlzcGxheSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRpZiAoICFqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YVNob3cgPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7fSApO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIHN0YXRlIGlmIGl0cyB0b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9nZ2xlKCkgdG8gXCJyZXZlcnNlXCJcblx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47XG5cdFx0fVxuXHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0alF1ZXJ5KCBlbGVtICkuc2hvdygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeSggZWxlbSApLmhpZGUoKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgcHJvcDtcblxuXHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdHR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7XG5cblx0XHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0XHRkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRcdHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRcdHR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gXCJ3aWR0aFwiIHx8IHByb3AgPT09IFwiaGVpZ2h0XCIgPyAxIDogMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHQvLyBJZiB0aGlzIGlzIGEgbm9vcCBsaWtlIC5oaWRlKCkuaGlkZSgpLCByZXN0b3JlIGFuIG92ZXJ3cml0dGVuIGRpc3BsYXkgdmFsdWVcblx0fSBlbHNlIGlmICggKGRpc3BsYXkgPT09IFwibm9uZVwiID8gZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXkpID09PSBcImlubGluZVwiICkge1xuXHRcdHN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5O1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkge1xuXHR2YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzO1xuXG5cdC8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzc1xuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcblx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTtcblx0XHRlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07XG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBhbmltYXRpb25QcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHRcdC8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5Nylcblx0XHRcdFx0dGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLFxuXHRcdFx0XHRwZXJjZW50ID0gMSAtIHRlbXAsXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0pO1xuXG5cdFx0XHRpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2Uoe1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdHByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLFxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgeyBzcGVjaWFsRWFzaW5nOiB7fSB9LCBvcHRpb25zICksXG5cdFx0XHRvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsXG5cdFx0XHRvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcblx0XHRcdHR3ZWVuczogW10sXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHtcblx0XHRcdFx0dmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7XG5cdFx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHRcdH0sXG5cdFx0XHRzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHtcblx0XHRcdFx0dmFyIGluZGV4ID0gMCxcblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSksXG5cdFx0cHJvcHMgPSBhbmltYXRpb24ucHJvcHM7XG5cblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7XG5cdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSlcblx0KTtcblxuXHQvLyBhdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcblx0XHQuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApXG5cdFx0LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7XG5cdFx0XHRjYWxsYmFjayA9IHByb3BzO1xuXHRcdFx0cHJvcHMgPSBbIFwiKlwiIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BzID0gcHJvcHMuc3BsaXQoXCIgXCIpO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XG5cdFx0XHR0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdHR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH0sXG5cblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XG5cdFx0aWYgKCBwcmVwZW5kICkge1xuXHRcdFx0YW5pbWF0aW9uUHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhbmltYXRpb25QcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59KTtcblxualF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkge1xuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XG5cdFx0Y29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHxcblx0XHRcdGpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09IFwibnVtYmVyXCIgPyBvcHQuZHVyYXRpb24gOlxuXHRcdG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF0gOiBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW4gKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBkYXRhX3ByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBkYXRhX3ByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiAodHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSkgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFfcHJpdi5nZXQoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZWFjaChbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0pO1xuXG4vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zXG5qUXVlcnkuZWFjaCh7XG5cdHNsaWRlRG93bjogZ2VuRngoXCJzaG93XCIpLFxuXHRzbGlkZVVwOiBnZW5GeChcImhpZGVcIiksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeChcInRvZ2dsZVwiKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59KTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBqUXVlcnkubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cdFx0Ly8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkXG5cdFx0aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7XG5cdFx0XHR0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5meC5zdG9wKCk7XG5cdH1cblx0ZnhOb3cgPSB1bmRlZmluZWQ7XG59O1xuXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XG5cdGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTtcblx0aWYgKCB0aW1lcigpICkge1xuXHRcdGpRdWVyeS5meC5zdGFydCgpO1xuXHR9IGVsc2Uge1xuXHRcdGpRdWVyeS50aW1lcnMucG9wKCk7XG5cdH1cbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xuXG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCAhdGltZXJJZCApIHtcblx0XHR0aW1lcklkID0gc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0Y2xlYXJJbnRlcnZhbCggdGltZXJJZCApO1xuXHR0aW1lcklkID0gbnVsbDtcbn07XG5cbmpRdWVyeS5meC5zcGVlZHMgPSB7XG5cdHNsb3c6IDYwMCxcblx0ZmFzdDogMjAwLFxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxuLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5L1xualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdGNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0pO1xufTtcblxuXG4oZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogaU9TPD01LjEsIEFuZHJvaWQ8PTQuMitcblx0Ly8gRGVmYXVsdCB2YWx1ZSBmb3IgYSBjaGVja2JveCBzaG91bGQgYmUgXCJvblwiXG5cdHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSBcIlwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPD0yLjNcblx0Ly8gT3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmUgaW5jb3JyZWN0bHkgbWFya2VkIGFzIGRpc2FibGVkXG5cdHNlbGVjdC5kaXNhYmxlZCA9IHRydWU7XG5cdHN1cHBvcnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSkoKTtcblxuXG52YXIgbm9kZUhvb2ssIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gc3RydW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBhdHRyaWJ1dGVzIGFyZSBsb3dlcmNhc2Vcblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogbm9kZUhvb2sgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0Ly8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWRcblx0XHRcdHJldHVybiByZXQgPT0gbnVsbCA/XG5cdFx0XHRcdHVuZGVmaW5lZCA6XG5cdFx0XHRcdHJldDtcblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLCBwcm9wTmFtZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKG5hbWUgPSBhdHRyTmFtZXNbaSsrXSkgKSB7XG5cdFx0XHRcdHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXG5cdFx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgKCMxMDg3MClcblx0XHRcdFx0aWYgKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0XHQvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZVxuXHRcdFx0XHRcdGVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSk7XG5cblxuXG5cbnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRwcm9wRml4OiB7XG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXG5cdFx0XCJjbGFzc1wiOiBcImNsYXNzTmFtZVwiXG5cdH0sXG5cblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLCBub3R4bWwsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7XG5cblx0XHRpZiAoIG5vdHhtbCApIHtcblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm4gaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0cmV0IDpcblx0XHRcdFx0KCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgP1xuXHRcdFx0XHRyZXQgOlxuXHRcdFx0XHRlbGVtWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BIb29rczoge1xuXHRcdHRhYkluZGV4OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5oYXNBdHRyaWJ1dGUoIFwidGFiaW5kZXhcIiApIHx8IHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0uaHJlZiA/XG5cdFx0XHRcdFx0ZWxlbS50YWJJbmRleCA6XG5cdFx0XHRcdFx0LTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHtcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaChbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSk7XG5cblxuXG5cbnZhciByY2xhc3MgPSAvW1xcdFxcclxcblxcZl0vZztcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRwcm9jZWVkID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9jZWVkICkge1xuXHRcdFx0Ly8gVGhlIGRpc2p1bmN0aW9uIGhlcmUgaXMgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSByZW1vdmVDbGFzcylcblx0XHRcdGNsYXNzZXMgPSAoIHZhbHVlIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgP1xuXHRcdFx0XHRcdCggXCIgXCIgKyBlbGVtLmNsYXNzTmFtZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApIDpcblx0XHRcdFx0XHRcIiBcIlxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXp6ICsgXCIgXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gb25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0galF1ZXJ5LnRyaW0oIGN1ciApO1xuXHRcdFx0XHRcdGlmICggZWxlbS5jbGFzc05hbWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmNsYXNzTmFtZSA9IGZpbmFsVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdHByb2NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGg7XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoIHByb2NlZWQgKSB7XG5cdFx0XHRjbGFzc2VzID0gKCB2YWx1ZSB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXTtcblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIGVsZW0uY2xhc3NOYW1lID9cblx0XHRcdFx0XHQoIFwiIFwiICsgZWxlbS5jbGFzc05hbWUgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKSA6XG5cdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXNcblx0XHRcdFx0XHRcdHdoaWxlICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApID49IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gdmFsdWUgPyBqUXVlcnkudHJpbSggY3VyICkgOiBcIlwiO1xuXHRcdFx0XHRcdGlmICggZWxlbS5jbGFzc05hbWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmNsYXNzTmFtZSA9IGZpbmFsVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0Ly8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcblx0XHRcdFx0dmFyIGNsYXNzTmFtZSxcblx0XHRcdFx0XHRpID0gMCxcblx0XHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdFx0Y2xhc3NOYW1lcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0XHR3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IHN0cnVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0aWYgKCB0aGlzLmNsYXNzTmFtZSApIHtcblx0XHRcdFx0XHQvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YV9wcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIHRoaXMuY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gXCJcIiA6IGRhdGFfcHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIjtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRpZiAoIHRoaXNbaV0ubm9kZVR5cGUgPT09IDEgJiYgKFwiIFwiICsgdGhpc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZShyY2xhc3MsIFwiIFwiKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+PSAwICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0pO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZztcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLFxuXHRcdFx0ZWxlbSA9IHRoaXNbMF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgXCJ2YWx1ZVwiICkpICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0cmV0dXJuIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdC8vIEhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXNcblx0XHRcdFx0XHRyZXQucmVwbGFjZShycmV0dXJuLCBcIlwiKSA6XG5cdFx0XHRcdFx0Ly8gSGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyXG5cdFx0XHRcdFx0cmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgXCJcIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ1xuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dmFsID0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsICs9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0dmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKFwic2V0XCIgaW4gaG9va3MpIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCBcInZhbHVlXCIgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdHZhbEhvb2tzOiB7XG5cdFx0b3B0aW9uOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTEwLTExK1xuXHRcdFx0XHRcdC8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OClcblx0XHRcdFx0XHRqUXVlcnkudHJpbSggalF1ZXJ5LnRleHQoIGVsZW0gKSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIgfHwgaW5kZXggPCAwLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCxcblx0XHRcdFx0XHRpID0gaW5kZXggPCAwID9cblx0XHRcdFx0XHRcdG1heCA6XG5cdFx0XHRcdFx0XHRvbmUgPyBpbmRleCA6IDA7XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBJRTYtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQoIHN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJpYnV0ZSggXCJkaXNhYmxlZFwiICkgPT09IG51bGwgKSAmJlxuXHRcdFx0XHRcdFx0XHQoICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fCAhalF1ZXJ5Lm5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggKG9wdGlvbi5zZWxlY3RlZCA9IGpRdWVyeS5pbkFycmF5KCBvcHRpb24udmFsdWUsIHZhbHVlcyApID49IDApICkge1xuXHRcdFx0XHRcdFx0b3B0aW9uU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldFxuXHRcdFx0XHRpZiAoICFvcHRpb25TZXQgKSB7XG5cdFx0XHRcdFx0ZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDAgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59KTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxuXG5cbmpRdWVyeS5lYWNoKCAoXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnVcIikuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblxuXHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHR0aGlzLnRyaWdnZXIoIG5hbWUgKTtcblx0fTtcbn0pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0aG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkge1xuXHRcdHJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApO1xuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cdFx0Ly8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKVxuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6IHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59KTtcblxuXG52YXIgbm9uY2UgPSBqUXVlcnkubm93KCk7XG5cbnZhciBycXVlcnkgPSAoL1xcPy8pO1xuXG5cblxuLy8gU3VwcG9ydDogQW5kcm9pZCAyLjNcbi8vIFdvcmthcm91bmQgZmFpbHVyZSB0byBzdHJpbmctY2FzdCBudWxsIGlucHV0XG5qUXVlcnkucGFyc2VKU09OID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHJldHVybiBKU09OLnBhcnNlKCBkYXRhICsgXCJcIiApO1xufTtcblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbCwgdG1wO1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdHRyeSB7XG5cdFx0dG1wID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdHhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHR4bWwgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKS5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIGRhdGEgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJ0cyA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblx0cnVybCA9IC9eKFtcXHcuKy1dKzopKD86XFwvXFwvKD86W15cXC8/I10qQHwpKFteXFwvPyM6XSopKD86OihcXGQrKXwpfCkvLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gRG9jdW1lbnQgbG9jYXRpb25cblx0YWpheExvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWYsXG5cblx0Ly8gU2VnbWVudCBsb2NhdGlvbiBpbnRvIHBhcnRzXG5cdGFqYXhMb2NQYXJ0cyA9IHJ1cmwuZXhlYyggYWpheExvY2F0aW9uLnRvTG93ZXJDYXNlKCkgKSB8fCBbXTtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKGRhdGFUeXBlID0gZGF0YVR5cGVzW2krK10pICkge1xuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWzBdID09PSBcIitcIiApIHtcblx0XHRcdFx0XHRkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgXCIqXCI7XG5cdFx0XHRcdFx0KHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmICFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblx0XHRcdFx0b3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7XG5cdFx0XHRcdHJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKGRlZXAgPSB7fSkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XG5cdFx0fVxuXHR9XG5cdGlmICggZGVlcCApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcbiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpXG4gKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHtcblxuXHR2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsXG5cdFx0Y29udGVudHMgPSBzLmNvbnRlbnRzLFxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzO1xuXG5cdC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzXG5cdHdoaWxlICggZGF0YVR5cGVzWyAwIF0gPT09IFwiKlwiICkge1xuXHRcdGRhdGFUeXBlcy5zaGlmdCgpO1xuXHRcdGlmICggY3QgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1swXSBdICkge1xuXHRcdFx0XHRmaW5hbERhdGFUeXBlID0gdHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICFmaXJzdERhdGFUeXBlICkge1xuXHRcdFx0XHRmaXJzdERhdGFUeXBlID0gdHlwZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0Ly8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0b1xuXHRcdFx0aWYgKCBjdXJyZW50ID09PSBcIipcIiApIHtcblxuXHRcdFx0XHRjdXJyZW50ID0gcHJldjtcblxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxuXHRcdFx0fSBlbHNlIGlmICggcHJldiAhPT0gXCIqXCIgJiYgcHJldiAhPT0gY3VycmVudCApIHtcblxuXHRcdFx0XHQvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlclxuXHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbIFwiKiBcIiArIGN1cnJlbnQgXTtcblxuXHRcdFx0XHQvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpclxuXHRcdFx0XHRpZiAoICFjb252ICkge1xuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudFxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dFxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlcnNbIFwiKiBcIiArIHRtcFsgMCBdIF07XG5cdFx0XHRcdFx0XHRcdGlmICggY29udiApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHNbIFwidGhyb3dzXCIgXSApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7IHN0YXRlOiBcInBhcnNlcmVycm9yXCIsIGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudCB9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogYWpheExvY2F0aW9uLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggYWpheExvY1BhcnRzWyAxIF0gKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC94bWwvLFxuXHRcdFx0aHRtbDogL2h0bWwvLFxuXHRcdFx0anNvbjogL2pzb24vXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IGpRdWVyeS5wYXJzZUpTT04sXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyIHRyYW5zcG9ydCxcblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblx0XHRcdC8vIENyb3NzLWRvbWFpbiBkZXRlY3Rpb24gdmFyc1xuXHRcdFx0cGFydHMsXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXHRcdFx0Ly8gTG9vcCB2YXJpYWJsZVxuXHRcdFx0aSxcblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXHRcdFx0Ly8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvblxuXHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/XG5cdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cdFx0XHQvLyBEZWZlcnJlZHNcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLFxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cdFx0XHQvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNlKVxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcblx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSxcblx0XHRcdC8vIFRoZSBqcVhIUiBzdGF0ZVxuXHRcdFx0c3RhdGUgPSAwLFxuXHRcdFx0Ly8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlXG5cdFx0XHRzdHJBYm9ydCA9IFwiY2FuY2VsZWRcIixcblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnMgPSB7fTtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdHZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2sgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXNcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkO1xuXHRcdGpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lO1xuXHRcdGpxWEhSLmVycm9yID0ganFYSFIuZmFpbDtcblxuXHRcdC8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKVxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGFqYXhMb2NhdGlvbiApICsgXCJcIiApLnJlcGxhY2UoIHJoYXNoLCBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCBycHJvdG9jb2wsIGFqYXhMb2NQYXJ0c1sgMSBdICsgXCIvL1wiICk7XG5cblx0XHQvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCAjMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0galF1ZXJ5LnRyaW0oIHMuZGF0YVR5cGUgfHwgXCIqXCIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB3ZSBoYXZlIGEgcHJvdG9jb2w6aG9zdDpwb3J0IG1pc21hdGNoXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHRwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwudG9Mb3dlckNhc2UoKSApO1xuXHRcdFx0cy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJlxuXHRcdFx0XHQoIHBhcnRzWyAxIF0gIT09IGFqYXhMb2NQYXJ0c1sgMSBdIHx8IHBhcnRzWyAyIF0gIT09IGFqYXhMb2NQYXJ0c1sgMiBdIHx8XG5cdFx0XHRcdFx0KCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gXCI4MFwiIDogXCI0NDNcIiApICkgIT09XG5cdFx0XHRcdFx0XHQoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09IFwiaHR0cDpcIiA/IFwiODBcIiA6IFwiNDQzXCIgKSApIClcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nXG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXG5cdFx0aW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxuXHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoXCJhamF4U3RhcnRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybDtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGEgKTtcblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRzLnVybCA9IHJ0cy50ZXN0KCBjYWNoZVVSTCApID9cblxuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVlXG5cdFx0XHRcdFx0Y2FjaGVVUkwucmVwbGFjZSggcnRzLCBcIiQxXz1cIiArIG5vbmNlKysgKSA6XG5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0aGUgZW5kXG5cdFx0XHRcdFx0Y2FjaGVVUkwgKyAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgbm9uY2UrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU1vZGlmaWVkLVNpbmNlXCIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTm9uZS1NYXRjaFwiLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudFxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJDb250ZW50LVR5cGVcIiwgcy5jb250ZW50VHlwZSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcblx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKFxuXHRcdFx0XCJBY2NlcHRcIixcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdICsgKCBzLmRhdGFUeXBlc1sgMCBdICE9PSBcIipcIiA/IFwiLCBcIiArIGFsbFR5cGVzICsgXCI7IHE9MC4wMVwiIDogXCJcIiApIDpcblx0XHRcdFx0cy5hY2NlcHRzWyBcIipcIiBdXG5cdFx0KTtcblxuXHRcdC8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvblxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0XG5cdFx0aWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkge1xuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHtcblx0XHRcdGpxWEhSWyBpIF0oIHNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEdldCB0cmFuc3BvcnRcblx0XHR0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydFxuXHRcdGlmICggIXRyYW5zcG9ydCApIHtcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSAxO1xuXG5cdFx0XHQvLyBTZW5kIGdsb2JhbCBldmVudFxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFNlbmRcIiwgWyBqcVhIUiwgcyBdICk7XG5cdFx0XHR9XG5cdFx0XHQvLyBUaW1lb3V0XG5cdFx0XHRpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHtcblx0XHRcdFx0dGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydChcInRpbWVvdXRcIik7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRzdGF0ZSA9IDE7XG5cdFx0XHRcdHRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBleGNlcHRpb24gYXMgZXJyb3IgaWYgbm90IGRvbmVcblx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XG5cdFx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdFx0Ly8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIENhbGxlZCBvbmNlXG5cdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXRlIGlzIFwiZG9uZVwiIG5vd1xuXHRcdFx0c3RhdGUgPSAyO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiTGFzdC1Nb2RpZmllZFwiKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiZXRhZ1wiKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoXCJhamF4U3RvcFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblx0XHQvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZFxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoe1xuXHRcdFx0dXJsOiB1cmwsXG5cdFx0XHR0eXBlOiBtZXRob2QsXG5cdFx0XHRkYXRhVHlwZTogdHlwZSxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFja1xuXHRcdH0pO1xuXHR9O1xufSk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KHtcblx0XHR1cmw6IHVybCxcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSk7XG59O1xuXG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwuY2FsbCh0aGlzLCBpKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcChmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xuXG5cdFx0XHRcdHdoaWxlICggZWxlbS5maXJzdEVsZW1lbnRDaGlsZCApIHtcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbGVtO1xuXHRcdFx0fSkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHdyYXA6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJib2R5XCIgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApO1xuXHRcdFx0fVxuXHRcdH0pLmVuZCgpO1xuXHR9XG59KTtcblxuXG5qUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMlxuXHQvLyBPcGVyYSByZXBvcnRzIG9mZnNldFdpZHRocyBhbmQgb2Zmc2V0SGVpZ2h0cyBsZXNzIHRoYW4gemVybyBvbiBzb21lIGVsZW1lbnRzXG5cdHJldHVybiBlbGVtLm9mZnNldFdpZHRoIDw9IDAgJiYgZWxlbS5vZmZzZXRIZWlnaHQgPD0gMDtcbn07XG5qUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApO1xufTtcblxuXG5cblxudmFyIHIyMCA9IC8lMjAvZyxcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggb2JqICkgKSB7XG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG5cdFx0XHRcdGFkZCggcHJlZml4LCB2ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiID8gaSA6IFwiXCIgKSArIFwiXVwiLCB2LCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0fSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyBuYW1lICsgXCJdXCIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlXG5cdFx0XHR2YWx1ZSA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApID8gdmFsdWUoKSA6ICggdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSApO1xuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTtcblx0XHR9O1xuXG5cdC8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuXG5cdGlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHR0cmFkaXRpb25hbCA9IGpRdWVyeS5hamF4U2V0dGluZ3MgJiYgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDtcblx0fVxuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9KTtcblxuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0c2VyaWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTtcblx0fSxcblx0c2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHtcblx0XHRcdC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yIFwiZWxlbWVudHNcIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHNcblx0XHRcdHZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCBcImVsZW1lbnRzXCIgKTtcblx0XHRcdHJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzO1xuXHRcdH0pXG5cdFx0LmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSlcblx0XHQubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRyZXR1cm4gdmFsID09IG51bGwgP1xuXHRcdFx0XHRudWxsIDpcblx0XHRcdFx0alF1ZXJ5LmlzQXJyYXkoIHZhbCApID9cblx0XHRcdFx0XHRqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHR7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0fSkuZ2V0KCk7XG5cdH1cbn0pO1xuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoKCBlICkge31cbn07XG5cbnZhciB4aHJJZCA9IDAsXG5cdHhockNhbGxiYWNrcyA9IHt9LFxuXHR4aHJTdWNjZXNzU3RhdHVzID0ge1xuXHRcdC8vIGZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXHRcdC8vIFN1cHBvcnQ6IElFOVxuXHRcdC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxuXHRcdDEyMjM6IDIwNFxuXHR9LFxuXHR4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpO1xuXG4vLyBTdXBwb3J0OiBJRTlcbi8vIE9wZW4gcmVxdWVzdHMgbXVzdCBiZSBtYW51YWxseSBhYm9ydGVkIG9uIHVubG9hZCAoIzUyODApXG4vLyBTZWUgaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMjg1Njc0NiBmb3IgbW9yZSBpbmZvXG5pZiAoIHdpbmRvdy5hdHRhY2hFdmVudCApIHtcblx0d2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIGZ1bmN0aW9uKCkge1xuXHRcdGZvciAoIHZhciBrZXkgaW4geGhyQ2FsbGJhY2tzICkge1xuXHRcdFx0eGhyQ2FsbGJhY2tzWyBrZXkgXSgpO1xuXHRcdH1cblx0fSk7XG59XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCksXG5cdFx0XHRcdFx0aWQgPSArK3hocklkO1xuXG5cdFx0XHRcdHhoci5vcGVuKCBvcHRpb25zLnR5cGUsIG9wdGlvbnMudXJsLCBvcHRpb25zLmFzeW5jLCBvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3JkICk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBoZWFkZXJzXG5cdFx0XHRcdGZvciAoIGkgaW4gaGVhZGVycyApIHtcblx0XHRcdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB4aHJDYWxsYmFja3NbIGlkIF07XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0geGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gZmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBBY2Nlc3NpbmcgYmluYXJ5LWRhdGEgcmVzcG9uc2VUZXh0IHRocm93cyBhbiBleGNlcHRpb25cblx0XHRcdFx0XHRcdFx0XHRcdC8vICgjMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCA9PT0gXCJzdHJpbmdcIiA/IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogeGhyLnJlc3BvbnNlVGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0fSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdHhoci5vbmVycm9yID0gY2FsbGJhY2soXCJlcnJvclwiKTtcblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0geGhyQ2FsbGJhY2tzWyBpZCBdID0gY2FsbGJhY2soXCJhYm9ydFwiKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIERvIHNlbmQgdGhlIHJlcXVlc3QgKHRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbilcblx0XHRcdFx0XHR4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8fCBudWxsICk7XG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0pO1xuXG5cblxuXG4vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZVxualF1ZXJ5LmFqYXhTZXR1cCh7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIlxuXHR9LFxuXHRjb250ZW50czoge1xuXHRcdHNjcmlwdDogLyg/OmphdmF8ZWNtYSlzY3JpcHQvXG5cdH0sXG5cdGNvbnZlcnRlcnM6IHtcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTtcblx0XHRcdHJldHVybiB0ZXh0O1xuXHRcdH1cblx0fVxufSk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59KTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHNcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeShcIjxzY3JpcHQ+XCIpLnByb3Aoe1xuXHRcdFx0XHRcdGFzeW5jOiB0cnVlLFxuXHRcdFx0XHRcdGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCxcblx0XHRcdFx0XHRzcmM6IHMudXJsXG5cdFx0XHRcdH0pLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59KTtcblxuXG5cblxudmFyIG9sZENhbGxiYWNrcyA9IFtdLFxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vO1xuXG4vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzXG5qUXVlcnkuYWpheFNldHVwKHtcblx0anNvbnA6IFwiY2FsbGJhY2tcIixcblx0anNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UrKyApICk7XG5cdFx0dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7XG5cdFx0cmV0dXJuIGNhbGxiYWNrO1xuXHR9XG59KTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiAhKCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKS5pbmRleE9mKFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpICYmIHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzW1wic2NyaXB0IGpzb25cIl0gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkge1xuXHRcdFx0XHRqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArIFwiIHdhcyBub3QgY2FsbGVkXCIgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdO1xuXHRcdH07XG5cblx0XHQvLyBmb3JjZSBqc29uIGRhdGFUeXBlXG5cdFx0cy5kYXRhVHlwZXNbIDAgXSA9IFwianNvblwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja1xuXHRcdG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTtcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50cztcblx0XHR9O1xuXG5cdFx0Ly8gQ2xlYW4tdXAgZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpXG5cdFx0anFYSFIuYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gUmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblx0XHRcdFx0Ly8gbWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBzYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkge1xuXHRcdFx0XHRvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkO1xuXHRcdH0pO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0pO1xuXG5cblxuXG4vLyBkYXRhOiBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRrZWVwU2NyaXB0cyA9IGNvbnRleHQ7XG5cdFx0Y29udGV4dCA9IGZhbHNlO1xuXHR9XG5cdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdHZhciBwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKSxcblx0XHRzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdO1xuXG5cdC8vIFNpbmdsZSB0YWdcblx0aWYgKCBwYXJzZWQgKSB7XG5cdFx0cmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbMV0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2RcbnZhciBfbG9hZCA9IGpRdWVyeS5mbi5sb2FkO1xuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHRpZiAoIHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIgJiYgX2xvYWQgKSB7XG5cdFx0cmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxuXG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoXCIgXCIpO1xuXG5cdGlmICggb2ZmID49IDAgKSB7XG5cdFx0c2VsZWN0b3IgPSBqUXVlcnkudHJpbSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XG5cblx0XHQvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xuXHRcdHBhcmFtcyA9IHVuZGVmaW5lZDtcblxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXG5cdH0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiICkge1xuXHRcdHR5cGUgPSBcIlBPU1RcIjtcblx0fVxuXG5cdC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0XG5cdGlmICggc2VsZi5sZW5ndGggPiAwICkge1xuXHRcdGpRdWVyeS5hamF4KHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBpZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkXG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSkuZG9uZShmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeShcIjxkaXY+XCIpLmFwcGVuZCggalF1ZXJ5LnBhcnNlSFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdFxuXHRcdFx0XHRyZXNwb25zZVRleHQgKTtcblxuXHRcdH0pLmNvbXBsZXRlKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggY2FsbGJhY2ssIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuXG5cblxuLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHNcbmpRdWVyeS5lYWNoKCBbIFwiYWpheFN0YXJ0XCIsIFwiYWpheFN0b3BcIiwgXCJhamF4Q29tcGxldGVcIiwgXCJhamF4RXJyb3JcIiwgXCJhamF4U3VjY2Vzc1wiLCBcImFqYXhTZW5kXCIgXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSk7XG5cblxuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTtcblx0fSkubGVuZ3RoO1xufTtcblxuXG5cblxudmFyIGRvY0VsZW0gPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4vKipcbiAqIEdldHMgYSB3aW5kb3cgZnJvbSBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kZWZhdWx0Vmlldztcbn1cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKFwiYXV0b1wiKSA+IC0xO1xuXG5cdFx0Ly8gTmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXJcblx0XHQvLyB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcblx0XHRpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkge1xuXHRcdFx0Y3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7XG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XG5cdFx0XHRjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwO1xuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7XG5cdFx0fVxuXHRcdGlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoIFwidXNpbmdcIiBpbiBvcHRpb25zICkge1xuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1ckVsZW0uY3NzKCBwcm9wcyApO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dmFyIGRvY0VsZW0sIHdpbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LFxuXHRcdFx0ZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRpZiAoICFkb2MgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHQvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGVcblx0XHRpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHtcblx0XHRcdHJldHVybiBib3g7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogQmxhY2tCZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBob25lKVxuXHRcdC8vIElmIHdlIGRvbid0IGhhdmUgZ0JDUiwganVzdCB1c2UgMCwwIHJhdGhlciB0aGFuIGVycm9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09IHN0cnVuZGVmaW5lZCApIHtcblx0XHRcdGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0fVxuXHRcdHdpbiA9IGdldFdpbmRvdyggZG9jICk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogYm94LnRvcCArIHdpbi5wYWdlWU9mZnNldCAtIGRvY0VsZW0uY2xpZW50VG9wLFxuXHRcdFx0bGVmdDogYm94LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQgLSBkb2NFbGVtLmNsaWVudExlZnRcblx0XHR9O1xuXHR9LFxuXG5cdHBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICF0aGlzWyAwIF0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIG9mZnNldFBhcmVudCwgb2Zmc2V0LFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBGaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNhdXNlIGl0IGlzIGl0cyBvbmx5IG9mZnNldCBwYXJlbnRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cdFx0XHQvLyBBc3N1bWUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlzIHRoZXJlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWRcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnRcblx0XHRcdG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7XG5cblx0XHRcdC8vIEdldCBjb3JyZWN0IG9mZnNldHNcblx0XHRcdG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7XG5cdFx0XHRpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCBcImh0bWxcIiApICkge1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVyc1xuXHRcdFx0cGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRwYXJlbnRPZmZzZXQubGVmdCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCB8fCBkb2NFbGVtO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudCwgXCJodG1sXCIgKSAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTtcblx0XHR9KTtcblx0fVxufSk7XG5cbi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIiB9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkge1xuXHR2YXIgdG9wID0gXCJwYWdlWU9mZnNldFwiID09PSBwcm9wO1xuXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcblx0XHRcdHZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTtcblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/IHdpblsgcHJvcCBdIDogZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IHdpbmRvdy5wYWdlWE9mZnNldCxcblx0XHRcdFx0XHR0b3AgPyB2YWwgOiB3aW5kb3cucGFnZVlPZmZzZXRcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGgsIG51bGwgKTtcblx0fTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmk8NyssIENocm9tZTwzNytcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTI4MFxuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXHRcdFx0XHQvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXRcblx0XHRcdFx0cmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID9cblx0XHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn0pO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXHRcdC8vIE1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aFxuXHRcdGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBtYXJnaW4sIHZhbHVlICkge1xuXHRcdFx0dmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gXCJib29sZWFuXCIgKSxcblx0XHRcdFx0ZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJnaW4gPT09IHRydWUgfHwgdmFsdWUgPT09IHRydWUgPyBcIm1hcmdpblwiIDogXCJib3JkZXJcIiApO1xuXG5cdFx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBkb2M7XG5cblx0XHRcdFx0aWYgKCBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblx0XHRcdFx0XHQvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZVxuXHRcdFx0XHRcdC8vIGlzbid0IGEgd2hvbGUgbG90IHdlIGNhbiBkby4gU2VlIHB1bGwgcmVxdWVzdCBhdCB0aGlzIFVSTCBmb3IgZGlzY3Vzc2lvbjpcblx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NFxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTtcblx0XHR9O1xuXHR9KTtcbn0pO1xuXG5cbi8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5qUXVlcnkuZm4uc2l6ZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5sZW5ndGg7XG59O1xuXG5qUXVlcnkuZm4uYW5kU2VsZiA9IGpRdWVyeS5mbi5hZGRCYWNrO1xuXG5cblxuXG4vLyBSZWdpc3RlciBhcyBhIG5hbWVkIEFNRCBtb2R1bGUsIHNpbmNlIGpRdWVyeSBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXJcbi8vIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsIGJ1dCBub3QgdmlhIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXRcbi8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdFxuLy8gd2F5IHRvIHJlZ2lzdGVyLiBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9kdWxlIG5hbWVzIGFyZVxuLy8gZGVyaXZlZCBmcm9tIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlXG4vLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHNcbi8vIHRvIGNhbGwgbm9Db25mbGljdCB0byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay5cblxuLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGRcbi8vIGRlY2xhcmUgdGhlbXNlbHZlcyBhcyBhbm9ueW1vdXMgbW9kdWxlcywgYW5kIGF2b2lkIHNldHRpbmcgYSBnbG9iYWwgaWYgYW5cbi8vIEFNRCBsb2FkZXIgaXMgcHJlc2VudC4galF1ZXJ5IGlzIGEgc3BlY2lhbCBjYXNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uXG5cbmlmICggdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgKSB7XG5cdGRlZmluZSggXCJqcXVlcnlcIiwgW10sIGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnk7XG5cdH0pO1xufVxuXG5cblxuXG52YXJcblx0Ly8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxuXG5cdC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF8kID0gd2luZG93LiQ7XG5cbmpRdWVyeS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oIGRlZXAgKSB7XG5cdGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cuJCA9IF8kO1xuXHR9XG5cblx0aWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnk7XG59O1xuXG4vLyBFeHBvc2UgalF1ZXJ5IGFuZCAkIGlkZW50aWZpZXJzLCBldmVuIGluIEFNRFxuLy8gKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KVxuaWYgKCB0eXBlb2Ygbm9HbG9iYWwgPT09IHN0cnVuZGVmaW5lZCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xuXG59KSk7XG4iLCIvKiEgSnNSZW5kZXIgdjAuOS44MiAoQmV0YSk6IGh0dHA6Ly9qc3ZpZXdzLmNvbS8janNyZW5kZXIgKi9cbi8qISAqKlZFUlNJT04gRk9SIFdFQioqIChGb3IgTk9ERS5KUyBzZWUgaHR0cDovL2pzdmlld3MuY29tL2Rvd25sb2FkL2pzcmVuZGVyLW5vZGUuanMpICovXG4vKlxuICogQmVzdC1vZi1icmVlZCB0ZW1wbGF0aW5nIGluIGJyb3dzZXIgb3Igb24gTm9kZS5qcy5cbiAqIERvZXMgbm90IHJlcXVpcmUgalF1ZXJ5LCBvciBIVE1MIERPTVxuICogSW50ZWdyYXRlcyB3aXRoIEpzVmlld3MgKGh0dHA6Ly9qc3ZpZXdzLmNvbS8janN2aWV3cylcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNiwgQm9yaXMgTW9vcmVcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4vL2pzaGludCAtVzAxOCwgLVcwNDFcblxuKGZ1bmN0aW9uKGZhY3RvcnksIGdsb2JhbCkge1xuXHQvLyBnbG9iYWwgdmFyIGlzIHRoZSB0aGlzIG9iamVjdCwgd2hpY2ggaXMgd2luZG93IHdoZW4gcnVubmluZyBpbiB0aGUgdXN1YWwgYnJvd3NlciBlbnZpcm9ubWVudFxuXHR2YXIgJCA9IGdsb2JhbC5qUXVlcnk7XG5cblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7IC8vIENvbW1vbkpTIGUuZy4gQnJvd3NlcmlmeVxuXHRcdG1vZHVsZS5leHBvcnRzID0gJFxuXHRcdFx0PyBmYWN0b3J5KGdsb2JhbCwgJClcblx0XHRcdDogZnVuY3Rpb24oJCkgeyAvLyBJZiBubyBnbG9iYWwgalF1ZXJ5LCB0YWtlIG9wdGlvbmFsIGpRdWVyeSBwYXNzZWQgYXMgcGFyYW1ldGVyOiByZXF1aXJlKCdqc3JlbmRlcicpKGpRdWVyeSlcblx0XHRcdFx0aWYgKCQgJiYgISQuZm4pIHtcblx0XHRcdFx0XHR0aHJvdyBcIlByb3ZpZGUgalF1ZXJ5IG9yIG51bGxcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdFx0fTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgeyAvLyBBTUQgc2NyaXB0IGxvYWRlciwgZS5nLiBSZXF1aXJlSlNcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwpO1xuXHRcdH0pO1xuXHR9IGVsc2UgeyAvLyBCcm93c2VyIHVzaW5nIHBsYWluIDxzY3JpcHQ+IHRhZ1xuXHRcdGZhY3RvcnkoZ2xvYmFsLCBmYWxzZSk7XG5cdH1cbn0gKFxuXG4vLyBmYWN0b3J5IChmb3IganNyZW5kZXIuanMpXG5mdW5jdGlvbihnbG9iYWwsICQpIHtcblwidXNlIHN0cmljdFwiO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCB2YXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG52YXIgc2V0R2xvYmFscyA9ICQgPT09IGZhbHNlOyAvLyBPbmx5IHNldCBnbG9iYWxzIGlmIHNjcmlwdCBibG9jayBpbiBicm93c2VyIChub3QgQU1EIGFuZCBub3QgQ29tbW9uSlMpXG5cbiQgPSAkICYmICQuZm4gPyAkIDogZ2xvYmFsLmpRdWVyeTsgLy8gJCBpcyBqUXVlcnkgcGFzc2VkIGluIGJ5IENvbW1vbkpTIGxvYWRlciAoQnJvd3NlcmlmeSksIG9yIGdsb2JhbCBqUXVlcnkuXG5cbnZhciB2ZXJzaW9uTnVtYmVyID0gXCJ2MC45LjgyXCIsXG5cdGpzdlN0b3JlTmFtZSwgclRhZywgclRtcGxTdHJpbmcsIHRvcFZpZXcsICR2aWV3cyxcdCRleHBhbmRvLFxuXG4vL1RPRE9cdHRtcGxGbnNDYWNoZSA9IHt9LFxuXHQkaXNGdW5jdGlvbiwgJGlzQXJyYXksICR0ZW1wbGF0ZXMsICRjb252ZXJ0ZXJzLCAkaGVscGVycywgJHRhZ3MsICRzdWIsICRzdWJTZXR0aW5ncywgJHN1YlNldHRpbmdzQWR2YW5jZWQsICR2aWV3c1NldHRpbmdzLCBkZWxpbU9wZW5DaGFyMCwgZGVsaW1PcGVuQ2hhcjEsIGRlbGltQ2xvc2VDaGFyMCwgZGVsaW1DbG9zZUNoYXIxLCBsaW5rQ2hhciwgc2V0dGluZywgYmFzZU9uRXJyb3IsXG5cblx0clBhdGggPSAvXighKj8pKD86bnVsbHx0cnVlfGZhbHNlfFxcZFtcXGQuXSp8KFtcXHckXSt8XFwufH4oW1xcdyRdKyl8Iyh2aWV3fChbXFx3JF0rKSk/KShbXFx3JC5eXSo/KSg/OlsuW15dKFtcXHckXSspXFxdPyk/KSQvZyxcblx0Ly8gICAgICAgIG5vdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgICAgIGhlbHBlciAgICB2aWV3ICB2aWV3UHJvcGVydHkgcGF0aFRva2VucyAgICAgIGxlYWZUb2tlblxuXG5cdHJQYXJhbXMgPSAvKFxcKCkoPz1cXHMqXFwoKXwoPzooWyhbXSlcXHMqKT8oPzooXFxePykoISo/WyN+XT9bXFx3JC5eXSspP1xccyooKFxcK1xcK3wtLSl8XFwrfC18JiZ8XFx8XFx8fD09PXwhPT18PT18IT18PD18Pj18Wzw+JSo6P1xcL118KD0pKVxccyp8KCEqP1sjfl0/W1xcdyQuXl0rKShbKFtdKT8pfCgsXFxzKil8KFxcKD8pXFxcXD8oPzooJyl8KFwiKSl8KD86XFxzKigoWylcXF1dKSg/PVxccypbLl5dfFxccyokfFteKFtdKXxbKVxcXV0pKFsoW10/KSl8KFxccyspL2csXG5cdC8vICAgICAgICAgIGxmdFBybjAgICAgICAgIGxmdFBybiAgICAgICAgYm91bmQgICAgICAgICAgICBwYXRoICAgIG9wZXJhdG9yIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxICAgICAgICAgICAgIHBhdGgyICAgICAgIHBybiAgICBjb21tYSAgIGxmdFBybjIgICBhcG9zIHF1b3QgICAgICBydFBybiBydFBybkRvdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBybjIgIHNwYWNlXG5cdC8vIChsZWZ0IHBhcmVuPyBmb2xsb3dlZCBieSAocGF0aD8gZm9sbG93ZWQgYnkgb3BlcmF0b3IpIG9yIChwYXRoIGZvbGxvd2VkIGJ5IGxlZnQgcGFyZW4/KSkgb3IgY29tbWEgb3IgYXBvcyBvciBxdW90IG9yIHJpZ2h0IHBhcmVuIG9yIHNwYWNlXG5cblx0aXNSZW5kZXJDYWxsLFxuXHRyTmV3TGluZSA9IC9bIFxcdF0qKFxcclxcbnxcXG58XFxyKS9nLFxuXHRyVW5lc2NhcGVRdW90ZXMgPSAvXFxcXChbJ1wiXSkvZyxcblx0ckVzY2FwZVF1b3RlcyA9IC9bJ1wiXFxcXF0vZywgLy8gRXNjYXBlIHF1b3RlcyBhbmQgXFwgY2hhcmFjdGVyXG5cdHJCdWlsZEhhc2ggPSAvKD86XFx4MDh8Xikob25lcnJvcjopPyg/Oih+PykoKFtcXHckX1xcLl0rKTopPyhbXlxceDA4XSspKVxceDA4KCwpPyhbXlxceDA4XSspL2dpLFxuXHRyVGVzdEVsc2VJZiA9IC9eaWZcXHMvLFxuXHRyRmlyc3RFbGVtID0gLzwoXFx3KylbPlxcc10vLFxuXHRyQXR0ckVuY29kZSA9IC9bXFx4MDBgPjxcIicmPV0vZywgLy8gSW5jbHVkZXMgPiBlbmNvZGluZyBzaW5jZSByQ29udmVydE1hcmtlcnMgaW4gSnNWaWV3cyBkb2VzIG5vdCBza2lwID4gY2hhcmFjdGVycyBpbiBhdHRyaWJ1dGUgc3RyaW5nc1xuXHRySXNIdG1sID0gL1tcXHgwMGA+PFxcXCInJj1dLyxcblx0ckhhc0hhbmRsZXJzID0gL15vbltBLVpdfF5jb252ZXJ0KEJhY2spPyQvLFxuXHRyV3JhcHBlZEluVmlld01hcmtlciA9IC9eXFwjXFxkK19gW1xcc1xcU10qXFwvXFxkK19gJC8sXG5cdHJIdG1sRW5jb2RlID0gckF0dHJFbmNvZGUsXG5cdHZpZXdJZCA9IDAsXG5cdGNoYXJFbnRpdGllcyA9IHtcblx0XHRcIiZcIjogXCImYW1wO1wiLFxuXHRcdFwiPFwiOiBcIiZsdDtcIixcblx0XHRcIj5cIjogXCImZ3Q7XCIsXG5cdFx0XCJcXHgwMFwiOiBcIiYjMDtcIixcblx0XHRcIidcIjogXCImIzM5O1wiLFxuXHRcdCdcIic6IFwiJiMzNDtcIixcblx0XHRcImBcIjogXCImIzk2O1wiLFxuXHRcdFwiPVwiOiBcIiYjNjE7XCJcblx0fSxcblx0SFRNTCA9IFwiaHRtbFwiLFxuXHRPQkpFQ1QgPSBcIm9iamVjdFwiLFxuXHR0bXBsQXR0ciA9IFwiZGF0YS1qc3YtdG1wbFwiLFxuXHRqc3ZUbXBsID0gXCJqc3ZUbXBsXCIsXG5cdGluZGV4U3RyID0gXCJGb3IgI2luZGV4IGluIG5lc3RlZCBibG9jayB1c2UgI2dldEluZGV4KCkuXCIsXG5cdCRyZW5kZXIgPSB7fSxcblxuXHRqc3IgPSBnbG9iYWwuanNyZW5kZXIsXG5cdGpzclRvSnEgPSBqc3IgJiYgJCAmJiAhJC5yZW5kZXIsIC8vIEpzUmVuZGVyIGFscmVhZHkgbG9hZGVkLCB3aXRob3V0IGpRdWVyeS4gYnV0IHdlIHdpbGwgcmUtbG9hZCBpdCBub3cgdG8gYXR0YWNoIHRvIGpRdWVyeVxuXG5cdGpzdlN0b3JlcyA9IHtcblx0XHR0ZW1wbGF0ZToge1xuXHRcdFx0Y29tcGlsZTogY29tcGlsZVRtcGxcblx0XHR9LFxuXHRcdHRhZzoge1xuXHRcdFx0Y29tcGlsZTogY29tcGlsZVRhZ1xuXHRcdH0sXG5cdFx0dmlld01vZGVsOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVmlld01vZGVsXG5cdFx0fSxcblx0XHRoZWxwZXI6IHt9LFxuXHRcdGNvbnZlcnRlcjoge31cblx0fTtcblxuXHQvLyB2aWV3cyBvYmplY3QgKCQudmlld3MgaWYgalF1ZXJ5IGlzIGxvYWRlZCwganNyZW5kZXIudmlld3MgaWYgbm8galF1ZXJ5LCBlLmcuIGluIE5vZGUuanMpXG5cdCR2aWV3cyA9IHtcblx0XHRqc3ZpZXdzOiB2ZXJzaW9uTnVtYmVyLFxuXHRcdHN1Yjoge1xuXHRcdFx0Ly8gc3Vic2NyaXB0aW9uLCBlLmcuIEpzVmlld3MgaW50ZWdyYXRpb25cblx0XHRcdFZpZXc6IFZpZXcsXG5cdFx0XHRFcnI6IEpzVmlld3NFcnJvcixcblx0XHRcdHRtcGxGbjogdG1wbEZuLFxuXHRcdFx0cGFyc2U6IHBhcnNlUGFyYW1zLFxuXHRcdFx0ZXh0ZW5kOiAkZXh0ZW5kLFxuXHRcdFx0ZXh0ZW5kQ3R4OiBleHRlbmRDdHgsXG5cdFx0XHRzeW50YXhFcnI6IHN5bnRheEVycm9yLFxuXHRcdFx0b25TdG9yZToge30sXG5cdFx0XHRhZGRTZXR0aW5nOiBhZGRTZXR0aW5nLFxuXHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0YWxsb3dDb2RlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdGFkdlNldDogbm9vcCwgLy8gVXBkYXRlIGFkdmFuY2VkIHNldHRpbmdzXG5cdFx0XHRfdGhzOiB0YWdIYW5kbGVyc0Zyb21Qcm9wcyxcblx0XHRcdF90ZzogZnVuY3Rpb24oKSB7fSwgLy8gQ29uc3RydWN0b3IgZm9yIHRhZ0RlZlxuXHRcdFx0X2NudnQ6IGNvbnZlcnRWYWwsXG5cdFx0XHRfdGFnOiByZW5kZXJUYWcsXG5cdFx0XHRfZXI6IGVycm9yLFxuXHRcdFx0X2Vycjogb25SZW5kZXJFcnJvcixcblx0XHRcdF9odG1sOiBodG1sRW5jb2RlLFxuXHRcdFx0X2NwOiByZXRWYWwsIC8vIEdldCBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMgKG9yIHByb3BlcnRpZXMpIH5mb289ZXhwci4gSW4gSnNSZW5kZXIsIHNpbXBseSByZXR1cm5zIHZhbC5cblx0XHRcdF9zcTogZnVuY3Rpb24odG9rZW4pIHtcblx0XHRcdFx0aWYgKHRva2VuID09PSBcImNvbnN0cnVjdG9yXCIpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZXR0aW5nczoge1xuXHRcdFx0ZGVsaW1pdGVyczogJHZpZXdzRGVsaW1pdGVycyxcblx0XHRcdGFkdmFuY2VkOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWVcblx0XHRcdFx0XHQ/IChcblx0XHRcdFx0XHRcdFx0JGV4dGVuZCgkc3ViU2V0dGluZ3NBZHZhbmNlZCwgdmFsdWUpLFxuXHRcdFx0XHRcdFx0XHQkc3ViLmFkdlNldCgpLFxuXHRcdFx0XHRcdFx0XHQkdmlld3NTZXR0aW5nc1xuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0OiAkc3ViU2V0dGluZ3NBZHZhbmNlZDtcblx0XHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0Q3R4OiByZXRWYWwsIC8vIEdldCBjdHguZm9vIHZhbHVlLiBJbiBKc1JlbmRlciwgc2ltcGx5IHJldHVybnMgdmFsLlxuXHRcdG1hcDogZGF0YU1hcCAgICAvLyBJZiBqc09ic2VydmFibGUgbG9hZGVkIGZpcnN0LCB1c2UgdGhhdCBkZWZpbml0aW9uIG9mIGRhdGFNYXBcblx0fTtcblxuZnVuY3Rpb24gZ2V0RGVyaXZlZE1ldGhvZChiYXNlTWV0aG9kLCBtZXRob2QpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdHZhciByZXQsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0cHJldkJhc2UgPSB0YWcuYmFzZTtcblxuXHRcdHRhZy5iYXNlID0gYmFzZU1ldGhvZDsgLy8gV2l0aGluIG1ldGhvZCBjYWxsLCBjYWxsaW5nIHRoaXMuYmFzZSB3aWxsIGNhbGwgdGhlIGJhc2UgbWV0aG9kXG5cdFx0cmV0ID0gbWV0aG9kLmFwcGx5KHRhZywgYXJndW1lbnRzKTsgLy8gQ2FsbCB0aGUgbWV0aG9kXG5cdFx0dGFnLmJhc2UgPSBwcmV2QmFzZTsgLy8gUmVwbGFjZSB0aGlzLmJhc2UgdG8gYmUgdGhlIGJhc2UgbWV0aG9kIG9mIHRoZSBwcmV2aW91cyBjYWxsLCBmb3IgY2hhaW5lZCBjYWxsc1xuXHRcdHJldHVybiByZXQ7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldE1ldGhvZChiYXNlTWV0aG9kLCBtZXRob2QpIHtcblx0Ly8gRm9yIGRlcml2ZWQgbWV0aG9kcyAob3IgaGFuZGxlcnMgZGVjbGFyZWQgZGVjbGFyYXRpdmVseSBhcyBpbiB7ezpmb28gb25DaGFuZ2U9fmZvb0NoYW5nZWR9fSByZXBsYWNlIGJ5IGEgZGVyaXZlZCBtZXRob2QsIHRvIGFsbG93IHVzaW5nIHRoaXMuYmFzZSguLi4pXG5cdC8vIG9yIHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgdG8gY2FsbCB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbi4gKEVxdWl2YWxlbnQgdG8gdGhpcy5fc3VwZXIoLi4uKSBhbmQgdGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpIGluIGpRdWVyeSBVSSlcblx0aWYgKCRpc0Z1bmN0aW9uKG1ldGhvZCkpIHtcblx0XHRtZXRob2QgPSBnZXREZXJpdmVkTWV0aG9kKFxuXHRcdFx0XHQhYmFzZU1ldGhvZFxuXHRcdFx0XHRcdD8gbm9vcCAvLyBubyBiYXNlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiwgc28gdXNlIG5vb3AgYXMgYmFzZSBtZXRob2Rcblx0XHRcdFx0XHQ6IGJhc2VNZXRob2QuX2Rcblx0XHRcdFx0XHRcdD8gYmFzZU1ldGhvZCAvLyBiYXNlTWV0aG9kIGlzIGEgZGVyaXZlZCBtZXRob2QsIHNvIHVzIGl0XG5cdFx0XHRcdFx0XHQ6IGdldERlcml2ZWRNZXRob2Qobm9vcCwgYmFzZU1ldGhvZCksIC8vIGJhc2VNZXRob2QgaXMgbm90IGRlcml2ZWQgc28gbWFrZSBpdHMgYmFzZSBtZXRob2QgYmUgdGhlIG5vb3AgbWV0aG9kXG5cdFx0XHRcdG1ldGhvZFxuXHRcdFx0KTtcblx0XHRtZXRob2QuX2QgPSAxOyAvLyBBZGQgZmxhZyB0aGF0IHRoaXMgaXMgYSBkZXJpdmVkIG1ldGhvZFxuXHR9XG5cdHJldHVybiBtZXRob2Q7XG59XG5cbmZ1bmN0aW9uIHRhZ0hhbmRsZXJzRnJvbVByb3BzKHRhZywgdGFnQ3R4KSB7XG5cdGZvciAodmFyIHByb3AgaW4gdGFnQ3R4LnByb3BzKSB7XG5cdFx0aWYgKHJIYXNIYW5kbGVycy50ZXN0KHByb3ApKSB7XG5cdFx0XHR0YWdbcHJvcF0gPSBnZXRNZXRob2QodGFnW3Byb3BdLCB0YWdDdHgucHJvcHNbcHJvcF0pO1xuXHRcdFx0Ly8gQ29weSBvdmVyIHRoZSBvbkZvbyBwcm9wcywgY29udmVydCBhbmQgY29udmVydEJhY2sgZnJvbSB0YWdDdHgucHJvcHMgdG8gdGFnIChvdmVycmlkZXMgdmFsdWVzIGluIHRhZ0RlZikuXG5cdFx0XHQvLyBOb3RlOiB1bnN1cHBvcnRlZCBzY2VuYXJpbzogaWYgaGFuZGxlcnMgYXJlIGR5bmFtaWNhbGx5IGFkZGVkIF5vbkZvbz1leHByZXNzaW9uIHRoaXMgd2lsbCB3b3JrLCBidXQgZHluYW1pY2FsbHkgcmVtb3Zpbmcgd2lsbCBub3Qgd29yay5cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcmV0VmFsKHZhbCkge1xuXHRyZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBub29wKCkge1xuXHRyZXR1cm4gXCJcIjtcbn1cblxuZnVuY3Rpb24gZGJnQnJlYWsodmFsKSB7XG5cdC8vIFVzYWdlIGV4YW1wbGVzOiB7e2RiZzouLi59fSwge3s6fmRiZyguLi4pfX0sIHt7ZGJnIC4uLi99fSwge157Zm9yIC4uLiBvbkFmdGVyTGluaz1+ZGJnfX0gZXRjLlxuXHR0cnkge1xuXHRcdGNvbnNvbGUubG9nKFwiSnNSZW5kZXIgZGJnIGJyZWFrcG9pbnQ6IFwiICsgdmFsKTtcblx0XHR0aHJvdyBcImRiZyBicmVha3BvaW50XCI7IC8vIFRvIGJyZWFrIGhlcmUsIHN0b3Agb24gY2F1Z2h0IGV4Y2VwdGlvbnMuXG5cdH1cblx0Y2F0Y2ggKGUpIHt9XG5cdHJldHVybiB0aGlzLmJhc2UgPyB0aGlzLmJhc2VBcHBseShhcmd1bWVudHMpIDogdmFsO1xufVxuXG5mdW5jdGlvbiBKc1ZpZXdzRXJyb3IobWVzc2FnZSkge1xuXHQvLyBFcnJvciBleGNlcHRpb24gdHlwZSBmb3IgSnNWaWV3cy9Kc1JlbmRlclxuXHQvLyBPdmVycmlkZSBvZiAkLnZpZXdzLnN1Yi5FcnJvciBpcyBwb3NzaWJsZVxuXHR0aGlzLm5hbWUgPSAoJC5saW5rID8gXCJKc1ZpZXdzXCIgOiBcIkpzUmVuZGVyXCIpICsgXCIgRXJyb3JcIjtcblx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCB0aGlzLm5hbWU7XG59XG5cbmZ1bmN0aW9uICRleHRlbmQodGFyZ2V0LCBzb3VyY2UpIHtcblx0Zm9yICh2YXIgbmFtZSBpbiBzb3VyY2UpIHtcblx0XHR0YXJnZXRbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG5cdH1cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuKEpzVmlld3NFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKSkuY29uc3RydWN0b3IgPSBKc1ZpZXdzRXJyb3I7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PT09PT1cbi8vIHZpZXdzLmRlbGltaXRlcnNcbi8vPT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiAkdmlld3NEZWxpbWl0ZXJzKG9wZW5DaGFycywgY2xvc2VDaGFycywgbGluaykge1xuXHQvLyBTZXQgdGhlIHRhZyBvcGVuaW5nIGFuZCBjbG9zaW5nIGRlbGltaXRlcnMgYW5kICdsaW5rJyBjaGFyYWN0ZXIuIERlZmF1bHQgaXMgXCJ7e1wiLCBcIn19XCIgYW5kIFwiXlwiXG5cdC8vIG9wZW5DaGFycywgY2xvc2VDaGFyczogb3BlbmluZyBhbmQgY2xvc2luZyBzdHJpbmdzLCBlYWNoIHdpdGggdHdvIGNoYXJhY3RlcnNcblx0aWYgKCFvcGVuQ2hhcnMpIHtcblx0XHRyZXR1cm4gJHN1YlNldHRpbmdzLmRlbGltaXRlcnM7XG5cdH1cblx0aWYgKCRpc0FycmF5KG9wZW5DaGFycykpIHtcblx0XHRyZXR1cm4gJHZpZXdzRGVsaW1pdGVycy5hcHBseSgkdmlld3MsIG9wZW5DaGFycyk7XG5cdH1cblxuXHQkc3ViU2V0dGluZ3MuZGVsaW1pdGVycyA9IFtvcGVuQ2hhcnMsIGNsb3NlQ2hhcnMsIGxpbmtDaGFyID0gbGluayA/IGxpbmsuY2hhckF0KDApIDogbGlua0NoYXJdO1xuXG5cdGRlbGltT3BlbkNoYXIwID0gb3BlbkNoYXJzLmNoYXJBdCgwKTsgLy8gRXNjYXBlIHRoZSBjaGFyYWN0ZXJzIC0gc2luY2UgdGhleSBjb3VsZCBiZSByZWdleCBzcGVjaWFsIGNoYXJhY3RlcnNcblx0ZGVsaW1PcGVuQ2hhcjEgPSBvcGVuQ2hhcnMuY2hhckF0KDEpO1xuXHRkZWxpbUNsb3NlQ2hhcjAgPSBjbG9zZUNoYXJzLmNoYXJBdCgwKTtcblx0ZGVsaW1DbG9zZUNoYXIxID0gY2xvc2VDaGFycy5jaGFyQXQoMSk7XG5cdG9wZW5DaGFycyA9IFwiXFxcXFwiICsgZGVsaW1PcGVuQ2hhcjAgKyBcIihcXFxcXCIgKyBsaW5rQ2hhciArIFwiKT9cXFxcXCIgKyBkZWxpbU9wZW5DaGFyMTsgLy8gRGVmYXVsdCBpcyBcIntee1wiXG5cdGNsb3NlQ2hhcnMgPSBcIlxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIxOyAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFwifX1cIlxuXHQvLyBCdWlsZCByZWdleCB3aXRoIG5ldyBkZWxpbWl0ZXJzXG5cdC8vICAgICAgICAgIFt0YWcgICAgKGZvbGxvd2VkIGJ5IC8gc3BhY2Ugb3IgfSkgIG9yIGN2dHIrY29sb24gb3IgaHRtbCBvciBjb2RlXSBmb2xsb3dlZCBieSBzcGFjZStwYXJhbXMgdGhlbiBjb252ZXJ0QmFjaz9cblx0clRhZyA9IFwiKD86KFxcXFx3Kyg/PVtcXFxcL1xcXFxzXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCJdKSl8KFxcXFx3Kyk/KDopfCg+KXwoXFxcXCopKVxcXFxzKigoPzpbXlxcXFxcIlxuXHRcdCsgZGVsaW1DbG9zZUNoYXIwICsgXCJdfFxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiKD8hXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIxICsgXCIpKSo/KVwiO1xuXG5cdC8vIE1ha2UgclRhZyBhdmFpbGFibGUgdG8gSnNWaWV3cyAob3Igb3RoZXIgY29tcG9uZW50cykgZm9yIHBhcnNpbmcgYmluZGluZyBleHByZXNzaW9uc1xuXHQkc3ViLnJUYWcgPSBcIig/OlwiICsgclRhZyArIFwiKVwiO1xuXHQvLyAgICAgICAgICAgICAgICAgICAgICAgIHsgXj8geyAgIHRhZytwYXJhbXMgc2xhc2g/ICBvciBjbG9zaW5nVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgY29tbWVudFxuXHRyVGFnID0gbmV3IFJlZ0V4cChcIig/OlwiICsgb3BlbkNoYXJzICsgclRhZyArIFwiKFxcXFwvKT98XFxcXFwiICsgZGVsaW1PcGVuQ2hhcjAgKyBcIihcXFxcXCIgKyBsaW5rQ2hhciArIFwiKT9cXFxcXCIgKyBkZWxpbU9wZW5DaGFyMSArIFwiKD86KD86XFxcXC8oXFxcXHcrKSlcXFxccyp8IS0tW1xcXFxzXFxcXFNdKj8tLSkpXCIgKyBjbG9zZUNoYXJzLCBcImdcIik7XG5cblx0Ly8gRGVmYXVsdDogIGJpbmQgICAgIHRhZ05hbWUgICAgICAgICBjdnQgICBjbG4gaHRtbCBjb2RlICAgIHBhcmFtcyAgICAgICAgICAgIHNsYXNoICAgYmluZDIgICAgICAgICBjbG9zZUJsayAgY29tbWVudFxuXHQvLyAgICAgIC8oPzp7KFxcXik/eyg/OihcXHcrKD89W1xcL1xcc31dKSl8KFxcdyspPyg6KXwoPil8KFxcKikpXFxzKigoPzpbXn1dfH0oPyF9KSkqPykoXFwvKT98eyhcXF4pP3soPzooPzpcXC8oXFx3KykpXFxzKnwhLS1bXFxzXFxTXSo/LS0pKX19XG5cblx0JHN1Yi5yVG1wbCA9IG5ldyBSZWdFeHAoXCI8Lio+fChbXlxcXFxcXFxcXXxeKVt7fV18XCIgKyBvcGVuQ2hhcnMgKyBcIi4qXCIgKyBjbG9zZUNoYXJzKTtcblx0Ly8gJHN1Yi5yVG1wbCBsb29rcyBmb3IgaHRtbCB0YWdzIG9yIHsgb3IgfSBjaGFyIG5vdCBwcmVjZWRlZCBieSBcXFxcLCBvciBKc1JlbmRlciB0YWdzIHt7eHh4fX0uIEVhY2ggb2YgdGhlc2Ugc3RyaW5ncyBhcmUgY29uc2lkZXJlZFxuXHQvLyBOT1QgdG8gYmUgalF1ZXJ5IHNlbGVjdG9yc1xuXHRyZXR1cm4gJHZpZXdzU2V0dGluZ3M7XG59XG5cbi8vPT09PT09PT09XG4vLyBWaWV3LmdldFxuLy89PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0Vmlldyhpbm5lciwgdHlwZSkgeyAvL3ZpZXcuZ2V0KGlubmVyLCB0eXBlKVxuXHRpZiAoIXR5cGUgJiYgaW5uZXIgIT09IHRydWUpIHtcblx0XHQvLyB2aWV3LmdldCh0eXBlKVxuXHRcdHR5cGUgPSBpbm5lcjtcblx0XHRpbm5lciA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdHZhciB2aWV3cywgaSwgbCwgZm91bmQsXG5cdFx0dmlldyA9IHRoaXMsXG5cdFx0cm9vdCA9ICF0eXBlIHx8IHR5cGUgPT09IFwicm9vdFwiO1xuXHRcdC8vIElmIHR5cGUgaXMgdW5kZWZpbmVkLCByZXR1cm5zIHJvb3QgdmlldyAodmlldyB1bmRlciB0b3AgdmlldykuXG5cblx0aWYgKGlubmVyKSB7XG5cdFx0Ly8gR28gdGhyb3VnaCB2aWV3cyAtIHRoaXMgb25lLCBhbmQgYWxsIG5lc3RlZCBvbmVzLCBkZXB0aC1maXJzdCAtIGFuZCByZXR1cm4gZmlyc3Qgb25lIHdpdGggZ2l2ZW4gdHlwZS5cblx0XHQvLyBJZiB0eXBlIGlzIHVuZGVmaW5lZCwgaS5lLiB2aWV3LmdldCh0cnVlKSwgcmV0dXJuIGZpcnN0IGNoaWxkIHZpZXcuXG5cdFx0Zm91bmQgPSB0eXBlICYmIHZpZXcudHlwZSA9PT0gdHlwZSAmJiB2aWV3O1xuXHRcdGlmICghZm91bmQpIHtcblx0XHRcdHZpZXdzID0gdmlldy52aWV3cztcblx0XHRcdGlmICh2aWV3Ll8udXNlS2V5KSB7XG5cdFx0XHRcdGZvciAoaSBpbiB2aWV3cykge1xuXHRcdFx0XHRcdGlmIChmb3VuZCA9IHR5cGUgPyB2aWV3c1tpXS5nZXQoaW5uZXIsIHR5cGUpIDogdmlld3NbaV0pIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IHZpZXdzLmxlbmd0aDsgIWZvdW5kICYmIGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRmb3VuZCA9IHR5cGUgPyB2aWV3c1tpXS5nZXQoaW5uZXIsIHR5cGUpIDogdmlld3NbaV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAocm9vdCkge1xuXHRcdC8vIEZpbmQgcm9vdCB2aWV3LiAodmlldyB3aG9zZSBwYXJlbnQgaXMgdG9wIHZpZXcpXG5cdFx0d2hpbGUgKHZpZXcucGFyZW50KSB7XG5cdFx0XHRmb3VuZCA9IHZpZXc7XG5cdFx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHdoaWxlICh2aWV3ICYmICFmb3VuZCkge1xuXHRcdFx0Ly8gR28gdGhyb3VnaCB2aWV3cyAtIHRoaXMgb25lLCBhbmQgYWxsIHBhcmVudCBvbmVzIC0gYW5kIHJldHVybiBmaXJzdCBvbmUgd2l0aCBnaXZlbiB0eXBlLlxuXHRcdFx0Zm91bmQgPSB2aWV3LnR5cGUgPT09IHR5cGUgPyB2aWV3IDogdW5kZWZpbmVkO1xuXHRcdFx0dmlldyA9IHZpZXcucGFyZW50O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZm91bmQ7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZEluZGV4KCkge1xuXHR2YXIgdmlldyA9IHRoaXMuZ2V0KFwiaXRlbVwiKTtcblx0cmV0dXJuIHZpZXcgPyB2aWV3LmluZGV4IDogdW5kZWZpbmVkO1xufVxuXG5nZXROZXN0ZWRJbmRleC5kZXBlbmRzID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBbdGhpcy5nZXQoXCJpdGVtXCIpLCBcImluZGV4XCJdO1xufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXgoKSB7XG5cdHJldHVybiB0aGlzLmluZGV4O1xufVxuXG5nZXRJbmRleC5kZXBlbmRzID0gXCJpbmRleFwiO1xuXG4vLz09PT09PT09PT1cbi8vIFZpZXcuaGxwXG4vLz09PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0SGVscGVyKGhlbHBlciwgaXNDb250ZXh0Q2IpIHtcblx0Ly8gSGVscGVyIG1ldGhvZCBjYWxsZWQgYXMgdmlldy5obHAoa2V5KSBmcm9tIGNvbXBpbGVkIHRlbXBsYXRlLCBmb3IgaGVscGVycyBvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIH5mb29cblx0dmFyIHdyYXBwZWQsIGRlcHMsXG5cdHZpZXcgPSB0aGlzLFxuXHRyZXMgPSB2aWV3LmN0eDtcblxuXHRpZiAocmVzKSB7XG5cdFx0cmVzID0gcmVzW2hlbHBlcl07XG5cdH1cblx0aWYgKHJlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmVzID0gJGhlbHBlcnNbaGVscGVyXTtcblx0fVxuXHRpZiAocmVzICYmIHJlcy5fY3ApIHsgLy8gSWYgdGhpcyBoZWxwZXIgcmVzb3VyY2UgaXMgYSBjb250ZXh0dWFsIHBhcmFtZXRlciwgfmZvbz1leHByXG5cdFx0aWYgKGlzQ29udGV4dENiKSB7IC8vIEluIGEgY29udGV4dCBjYWxsYmFjayBmb3IgYSBjb250ZXh0dWFsIHBhcmFtLCByZXR1cm4gdGhlIFtjdXJyZW50RGF0YSwgZGVwZW5kZW5jaWVzLi4uXSBhcnJheSAtIG5lZWRlZCBmb3Igb2JzZXJ2ZSBjYWxsXG5cdFx0XHRkZXBzID0gJHN1Yi5fY2VvKHJlc1sxXS5kZXBzKTsgIC8vIGZuIGRlcHMsIHdpdGggYW55IGV4cHJPYnMgY2xvbmVkXG5cdFx0XHRkZXBzLnVuc2hpZnQocmVzWzBdLmRhdGEpOyAgICAgIC8vIHZpZXcuZGF0YVxuXHRcdFx0ZGVwcy5fY3AgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIGRlcHM7XG5cdFx0fVxuXHRcdHJlcyA9ICR2aWV3cy5nZXRDdHgocmVzKTsgLy8gSWYgYSBjb250ZXh0dWFsIHBhcmFtLCBidXQgbm90IGEgY29udGV4dCBjYWxsYmFjaywgcmV0dXJuIGV2YWx1YXRlZCBwYXJhbSAtIGZuKGRhdGEsIHZpZXcsIGopXG5cdH1cblxuXHRpZiAocmVzKSB7XG5cdFx0aWYgKCRpc0Z1bmN0aW9uKHJlcykgJiYgIXJlcy5fd3JwKSB7XG5cdFx0XHQvLyBJZiBpdCBpcyBvZiB0eXBlIGZ1bmN0aW9uLCBhbmQgbm90IGFscmVhZHkgd3JhcHBlZCwgd2Ugd2lsbCB3cmFwIGl0LCBzbyBpZiBjYWxsZWQgd2l0aCBubyB0aGlzIHBvaW50ZXIgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcblx0XHRcdC8vIHZpZXcgYXMgJ3RoaXMnIGNvbnRleHQuIElmIHRoZSBoZWxwZXIgfmZvbygpIHdhcyBpbiBhIGRhdGEtbGluayBleHByZXNzaW9uLCB0aGUgdmlldyB3aWxsIGhhdmUgYSAndGVtcG9yYXJ5JyBsaW5rQ3R4IHByb3BlcnR5IHRvby5cblx0XHRcdC8vIE5vdGUgdGhhdCBoZWxwZXIgZnVuY3Rpb25zIG9uIGRlZXBlciBwYXRocyB3aWxsIGhhdmUgc3BlY2lmaWMgdGhpcyBwb2ludGVycywgZnJvbSB0aGUgcHJlY2VkaW5nIHBhdGguXG5cdFx0XHQvLyBGb3IgZXhhbXBsZSwgfnV0aWwuZm9vKCkgd2lsbCBoYXZlIHRoZSB+dXRpbCBvYmplY3QgYXMgJ3RoaXMnIHBvaW50ZXJcblx0XHRcdHdyYXBwZWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHJlcy5hcHBseSgoIXRoaXMgfHwgdGhpcyA9PT0gZ2xvYmFsKSA/IHZpZXcgOiB0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcblx0XHRcdHdyYXBwZWQuX3dycCA9IHZpZXc7XG5cdFx0XHQkZXh0ZW5kKHdyYXBwZWQsIHJlcyk7IC8vIEF0dGFjaCBzYW1lIGV4cGFuZG9zIChpZiBhbnkpIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uXG5cdFx0fVxuXHR9XG5cdHJldHVybiB3cmFwcGVkIHx8IHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0VGVtcGxhdGUodG1wbCkge1xuXHRyZXR1cm4gdG1wbCAmJiAodG1wbC5mblxuXHRcdD8gdG1wbFxuXHRcdDogdGhpcy5nZXRSc2MoXCJ0ZW1wbGF0ZXNcIiwgdG1wbCkgfHwgJHRlbXBsYXRlcyh0bXBsKSk7IC8vIG5vdCB5ZXQgY29tcGlsZWRcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gdmlld3MuX2NudnRcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29udmVydFZhbChjb252ZXJ0ZXIsIHZpZXcsIHRhZ0N0eCwgb25FcnJvcikge1xuXHQvLyBzZWxmIGlzIHRlbXBsYXRlIG9iamVjdCBvciBsaW5rQ3R4IG9iamVjdFxuXHR2YXIgdGFnLCB2YWx1ZSxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhcblx0XHRib3VuZFRhZyA9IHR5cGVvZiB0YWdDdHggPT09IFwibnVtYmVyXCIgJiYgdmlldy50bXBsLmJuZHNbdGFnQ3R4LTFdLFxuXHRcdGxpbmtDdHggPSB2aWV3LmxpbmtDdHg7IC8vIEZvciBkYXRhLWxpbms9XCJ7Y3Z0Oi4uLn1cIi4uLlxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YWdDdHggPSBvbkVycm9yID0ge3Byb3BzOiB7fSwgYXJnczogW29uRXJyb3JdfTtcblx0fSBlbHNlIGlmIChib3VuZFRhZykge1xuXHRcdHRhZ0N0eCA9IGJvdW5kVGFnKHZpZXcuZGF0YSwgdmlldywgJHN1Yik7XG5cdH1cblxuXHR2YWx1ZSA9IHRhZ0N0eC5hcmdzWzBdO1xuXHRpZiAoY29udmVydGVyIHx8IGJvdW5kVGFnKSB7XG5cdFx0dGFnID0gbGlua0N0eCAmJiBsaW5rQ3R4LnRhZztcblx0XHRpZiAoIXRhZykge1xuXHRcdFx0dGFnID0gJGV4dGVuZChuZXcgJHN1Yi5fdGcoKSwge1xuXHRcdFx0XHRfOiB7XG5cdFx0XHRcdFx0aW5saW5lOiAhbGlua0N0eCxcblx0XHRcdFx0XHRibmQ6IGJvdW5kVGFnLFxuXHRcdFx0XHRcdHVubGlua2VkOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRhZ05hbWU6IFwiOlwiLFxuXHRcdFx0XHRjdnQ6IGNvbnZlcnRlcixcblx0XHRcdFx0ZmxvdzogdHJ1ZSxcblx0XHRcdFx0dGFnQ3R4OiB0YWdDdHhcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0bGlua0N0eC50YWcgPSB0YWc7XG5cdFx0XHRcdHRhZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdH1cblx0XHRcdHRhZ0N0eC5jdHggPSBleHRlbmRDdHgodGFnQ3R4LmN0eCwgKGxpbmtDdHggPyBsaW5rQ3R4LnZpZXcgOiB2aWV3KS5jdHgpO1xuXHRcdH1cblx0XHR0YWcuX2VyID0gb25FcnJvciAmJiB2YWx1ZTtcblx0XHR0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eCk7XG5cblx0XHR0YWdDdHgudmlldyA9IHZpZXc7XG5cblx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eCB8fCB0YWcuY3R4IHx8IHt9O1xuXHRcdHRhZ0N0eC5jdHggPSB1bmRlZmluZWQ7XG5cblx0XHR2YWx1ZSA9IHRhZy5jdnRBcmdzKGNvbnZlcnRlciAhPT0gXCJ0cnVlXCIgJiYgY29udmVydGVyKVswXTsgLy8gSWYgdGhlcmUgaXMgYSBjb252ZXJ0QmFjayBidXQgbm8gY29udmVydCwgY29udmVydGVyIHdpbGwgYmUgXCJ0cnVlXCJcblxuXHRcdC8vIENhbGwgb25SZW5kZXIgKHVzZWQgYnkgSnNWaWV3cyBpZiBwcmVzZW50LCB0byBhZGQgYmluZGluZyBhbm5vdGF0aW9ucyBhcm91bmQgcmVuZGVyZWQgY29udGVudClcblx0XHR2YWx1ZSA9IGJvdW5kVGFnICYmIHZpZXcuXy5vblJlbmRlclxuXHRcdFx0PyB2aWV3Ll8ub25SZW5kZXIodmFsdWUsIHZpZXcsIHRhZylcblx0XHRcdDogdmFsdWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9IHVuZGVmaW5lZCA/IHZhbHVlIDogXCJcIjtcbn1cblxuZnVuY3Rpb24gY29udmVydEFyZ3MoY29udmVydGVyKSB7XG5cdHZhciB0YWcgPSB0aGlzLFxuXHRcdHRhZ0N0eCA9IHRhZy50YWdDdHgsXG5cdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdGFyZ3MgPSB0YWdDdHguYXJncztcblxuXHRjb252ZXJ0ZXIgPSBjb252ZXJ0ZXIgfHwgdGFnLmNvbnZlcnQ7XG5cdGNvbnZlcnRlciA9IGNvbnZlcnRlciAmJiAoXCJcIiArIGNvbnZlcnRlciA9PT0gY29udmVydGVyXG5cdFx0PyAodmlldy5nZXRSc2MoXCJjb252ZXJ0ZXJzXCIsIGNvbnZlcnRlcikgfHwgZXJyb3IoXCJVbmtub3duIGNvbnZlcnRlcjogJ1wiICsgY29udmVydGVyICsgXCInXCIpKVxuXHRcdDogY29udmVydGVyKTtcblxuXHRhcmdzID0gIWFyZ3MubGVuZ3RoICYmICF0YWdDdHguaW5kZXggLy8gT24gdGhlIG9wZW5pbmcgdGFnIHdpdGggbm8gYXJncywgYmluZCB0byB0aGUgY3VycmVudCBkYXRhIGNvbnRleHRcblx0XHQ/IFt2aWV3LmRhdGFdXG5cdFx0OiBjb252ZXJ0ZXJcblx0XHRcdD8gYXJncy5zbGljZSgpIC8vIElmIHRoZXJlIGlzIGEgY29udmVydGVyLCB1c2UgYSBjb3B5IG9mIHRoZSB0YWdDdHguYXJncyBhcnJheSBmb3IgcmVuZGVyaW5nLCBhbmQgcmVwbGFjZSB0aGUgYXJnc1swXSBpblxuXHRcdFx0Ly8gdGhlIGNvcGllZCBhcnJheSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUuIEJ1dCB3ZSBkbyBub3QgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0YWcudGFnQ3R4LmFyZ3NbMF0gKHRoZSBvcmlnaW5hbCBhcmdzIGFycmF5KVxuXHRcdFx0OiBhcmdzOyAvLyBJZiBubyBjb252ZXJ0ZXIsIGdldCB0aGUgb3JpZ2luYWwgdGFnQ3R4LmFyZ3NcblxuXHRpZiAoY29udmVydGVyKSB7XG5cdFx0aWYgKGNvbnZlcnRlci5kZXBlbmRzKSB7XG5cdFx0XHR0YWcuZGVwZW5kcyA9ICRzdWIuZ2V0RGVwcyh0YWcuZGVwZW5kcywgdGFnLCBjb252ZXJ0ZXIuZGVwZW5kcywgY29udmVydGVyKTtcblx0XHR9XG5cdFx0YXJnc1swXSA9IGNvbnZlcnRlci5hcHBseSh0YWcsIGFyZ3MpO1xuXHR9XG5cdHJldHVybiBhcmdzO1xufVxuXG4vLz09PT09PT09PT09PT1cbi8vIHZpZXdzLl90YWdcbi8vPT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZVR5cGUsIGl0ZW1OYW1lKSB7XG5cdHZhciByZXMsIHN0b3JlLFxuXHRcdHZpZXcgPSB0aGlzO1xuXHR3aGlsZSAoKHJlcyA9PT0gdW5kZWZpbmVkKSAmJiB2aWV3KSB7XG5cdFx0c3RvcmUgPSB2aWV3LnRtcGwgJiYgdmlldy50bXBsW3Jlc291cmNlVHlwZV07XG5cdFx0cmVzID0gc3RvcmUgJiYgc3RvcmVbaXRlbU5hbWVdO1xuXHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0fVxuXHRyZXR1cm4gcmVzIHx8ICR2aWV3c1tyZXNvdXJjZVR5cGVdW2l0ZW1OYW1lXTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyVGFnKHRhZ05hbWUsIHBhcmVudFZpZXcsIHRtcGwsIHRhZ0N0eHMsIGlzVXBkYXRlLCBvbkVycm9yKSB7XG5cdHBhcmVudFZpZXcgPSBwYXJlbnRWaWV3IHx8IHRvcFZpZXc7XG5cdHZhciB0YWcsIHRhZ18sIHRhZ0RlZiwgdGVtcGxhdGUsIHRhZ3MsIGF0dHIsIHBhcmVudFRhZywgaSwgbCwgaXRlbVJldCwgdGFnQ3R4LCB0YWdDdHhDdHgsXG5cdFx0Y29udGVudCwgY2FsbEluaXQsIG1hcERlZiwgdGhpc01hcCwgYXJncywgcHJvcHMsIGluaXRpYWxUbXBsLCB0YWdEYXRhTWFwLCBjb250ZW50Q3R4LFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0bGlua0N0eCA9IHBhcmVudFZpZXcubGlua0N0eCB8fCAwLFxuXHRcdGN0eCA9IHBhcmVudFZpZXcuY3R4LFxuXHRcdHBhcmVudFRtcGwgPSB0bXBsIHx8IHBhcmVudFZpZXcudG1wbCxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhzXG5cdFx0Ym91bmRUYWcgPSB0eXBlb2YgdGFnQ3R4cyA9PT0gXCJudW1iZXJcIiAmJiBwYXJlbnRWaWV3LnRtcGwuYm5kc1t0YWdDdHhzLTFdO1xuXG5cdGlmICh0YWdOYW1lLl9pcyA9PT0gXCJ0YWdcIikge1xuXHRcdHRhZyA9IHRhZ05hbWU7XG5cdFx0dGFnTmFtZSA9IHRhZy50YWdOYW1lO1xuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cztcblx0XHR0ZW1wbGF0ZSA9IHRhZy50ZW1wbGF0ZTtcblx0fSBlbHNlIHtcblx0XHR0YWdEZWYgPSBwYXJlbnRWaWV3LmdldFJzYyhcInRhZ3NcIiwgdGFnTmFtZSkgfHwgZXJyb3IoXCJVbmtub3duIHRhZzoge3tcIiArIHRhZ05hbWUgKyBcIn19IFwiKTtcblx0XHR0ZW1wbGF0ZSA9IHRhZ0RlZi50ZW1wbGF0ZTtcblx0fVxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXQgKz0gb25FcnJvcjtcblx0XHR0YWdDdHhzID0gb25FcnJvciA9IFt7cHJvcHM6IHt9LCBhcmdzOiBbXX1dO1xuXHR9IGVsc2UgaWYgKGJvdW5kVGFnKSB7XG5cdFx0dGFnQ3R4cyA9IGJvdW5kVGFnKHBhcmVudFZpZXcuZGF0YSwgcGFyZW50VmlldywgJHN1Yik7XG5cdH1cblxuXHRsID0gdGFnQ3R4cy5sZW5ndGg7XG5cdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHR0YWdDdHggPSB0YWdDdHhzW2ldO1xuXHRcdGlmICghbGlua0N0eCB8fCAhbGlua0N0eC50YWcgfHwgaSAmJiAhbGlua0N0eC50YWcuXy5pbmxpbmUgfHwgdGFnLl9lcikge1xuXHRcdFx0Ly8gSW5pdGlhbGl6ZSB0YWdDdHhcblx0XHRcdC8vIEZvciBibG9jayB0YWdzLCB0YWdDdHgudG1wbCBpcyBhbiBpbnRlZ2VyID4gMFxuXHRcdFx0aWYgKGNvbnRlbnQgPSBwYXJlbnRUbXBsLnRtcGxzICYmIHRhZ0N0eC50bXBsKSB7XG5cdFx0XHRcdGNvbnRlbnQgPSB0YWdDdHguY29udGVudCA9IHBhcmVudFRtcGwudG1wbHNbY29udGVudCAtIDFdO1xuXHRcdFx0fVxuXHRcdFx0dGFnQ3R4LmluZGV4ID0gaTtcblx0XHRcdHRhZ0N0eC50bXBsID0gY29udGVudDsgLy8gU2V0IHRoZSB0bXBsIHByb3BlcnR5IHRvIHRoZSBjb250ZW50IG9mIHRoZSBibG9jayB0YWdcblx0XHRcdHRhZ0N0eC5yZW5kZXIgPSByZW5kZXJDb250ZW50O1xuXHRcdFx0dGFnQ3R4LnZpZXcgPSBwYXJlbnRWaWV3O1xuXHRcdFx0dGFnQ3R4LmN0eCA9IGV4dGVuZEN0eCh0YWdDdHguY3R4LCBjdHgpOyAvLyBDbG9uZSBhbmQgZXh0ZW5kIHBhcmVudFZpZXcuY3R4XG5cdFx0fVxuXHRcdGlmICh0bXBsID0gdGFnQ3R4LnByb3BzLnRtcGwpIHtcblx0XHRcdC8vIElmIHRoZSB0bXBsIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4sIHNldCB0aGUgdmFsdWUgKHdoZW4gaW5pdGlhbGl6aW5nLCBvciwgaW4gY2FzZSBvZiBiaW5kaW5nOiBedG1wbD0uLi4sIHdoZW4gdXBkYXRpbmcpXG5cdFx0XHR0YWdDdHgudG1wbCA9IHBhcmVudFZpZXcuZ2V0VG1wbCh0bXBsKTtcblx0XHR9XG5cblx0XHRpZiAoIXRhZykge1xuXHRcdFx0Ly8gVGhpcyB3aWxsIG9ubHkgYmUgaGl0IGZvciBpbml0aWFsIHRhZ0N0eCAobm90IGZvciB7e2Vsc2V9fSkgLSBpZiB0aGUgdGFnIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0IHlldFxuXHRcdFx0Ly8gSW5zdGFudGlhdGUgdGFnIGlmIGl0IGRvZXMgbm90IHlldCBleGlzdFxuXHRcdFx0Ly8gSWYgdGhlIHRhZyBoYXMgbm90IGFscmVhZHkgYmVlbiBpbnN0YW50aWF0ZWQsIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGluc3RhbmNlLlxuXHRcdFx0Ly8gfnRhZyB3aWxsIGFjY2VzcyB0aGUgdGFnLCBldmVuIHdpdGhpbiB0aGUgcmVuZGVyaW5nIG9mIHRoZSB0ZW1wbGF0ZSBjb250ZW50IG9mIHRoaXMgdGFnLlxuXHRcdFx0Ly8gRnJvbSBjaGlsZC9kZXNjZW5kYW50IHRhZ3MsIGNhbiBhY2Nlc3MgdXNpbmcgfnRhZy5wYXJlbnQsIG9yIH5wYXJlbnRUYWdzLnRhZ05hbWVcblx0XHRcdHRhZyA9IG5ldyB0YWdEZWYuX2N0cigpO1xuXHRcdFx0Y2FsbEluaXQgPSAhIXRhZy5pbml0O1xuXG5cdFx0XHR0YWcucGFyZW50ID0gcGFyZW50VGFnID0gY3R4ICYmIGN0eC50YWc7XG5cdFx0XHR0YWcudGFnQ3R4cyA9IHRhZ0N0eHM7XG5cdFx0XHR0YWdEYXRhTWFwID0gdGFnLmRhdGFNYXA7XG5cblx0XHRcdGlmIChsaW5rQ3R4KSB7XG5cdFx0XHRcdHRhZy5fLmlubGluZSA9IGZhbHNlO1xuXHRcdFx0XHRsaW5rQ3R4LnRhZyA9IHRhZztcblx0XHRcdFx0dGFnLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZy5fLmJuZCA9IGJvdW5kVGFnIHx8IGxpbmtDdHguZm4pIHtcblx0XHRcdFx0Ly8gQm91bmQgaWYge157dGFnLi4ufX0gb3IgZGF0YS1saW5rPVwie3RhZy4uLn1cIlxuXHRcdFx0XHR0YWcuXy5hcnJWd3MgPSB7fTtcblx0XHRcdH0gZWxzZSBpZiAodGFnLmRhdGFCb3VuZE9ubHkpIHtcblx0XHRcdFx0ZXJyb3IoXCJ7XntcIiArIHRhZ05hbWUgKyBcIn19IHRhZyBtdXN0IGJlIGRhdGEtYm91bmRcIik7XG5cdFx0XHR9XG5cdFx0XHQvL1RPRE8gYmV0dGVyIHBlcmYgZm9yIGNoaWxkVGFncygpIC0ga2VlcCBjaGlsZCB0YWcudGFncyBhcnJheSwgKGFuZCByZW1vdmUgY2hpbGQsIHdoZW4gZGlzcG9zZWQpXG5cdFx0XHQvLyB0YWcudGFncyA9IFtdO1xuXHRcdH1cblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHM7XG5cdFx0dGFnRGF0YU1hcCA9IHRhZy5kYXRhTWFwO1xuXG5cdFx0dGFnQ3R4LnRhZyA9IHRhZztcblx0XHRpZiAodGFnRGF0YU1hcCAmJiB0YWdDdHhzKSB7XG5cdFx0XHR0YWdDdHgubWFwID0gdGFnQ3R4c1tpXS5tYXA7IC8vIENvcHkgb3ZlciB0aGUgY29tcGlsZWQgbWFwIGluc3RhbmNlIGZyb20gdGhlIHByZXZpb3VzIHRhZ0N0eHMgdG8gdGhlIHJlZnJlc2hlZCBvbmVzXG5cdFx0fVxuXHRcdGlmICghdGFnLmZsb3cpIHtcblx0XHRcdHRhZ0N0eEN0eCA9IHRhZ0N0eC5jdHggPSB0YWdDdHguY3R4IHx8IHt9O1xuXG5cdFx0XHQvLyB0YWdzIGhhc2g6IHRhZy5jdHgudGFncywgbWVyZ2VkIHdpdGggcGFyZW50Vmlldy5jdHgudGFncyxcblx0XHRcdHRhZ3MgPSB0YWcucGFyZW50cyA9IHRhZ0N0eEN0eC5wYXJlbnRUYWdzID0gY3R4ICYmIGV4dGVuZEN0eCh0YWdDdHhDdHgucGFyZW50VGFncywgY3R4LnBhcmVudFRhZ3MpIHx8IHt9O1xuXHRcdFx0aWYgKHBhcmVudFRhZykge1xuXHRcdFx0XHR0YWdzW3BhcmVudFRhZy50YWdOYW1lXSA9IHBhcmVudFRhZztcblx0XHRcdFx0Ly9UT0RPIGJldHRlciBwZXJmIGZvciBjaGlsZFRhZ3M6IHBhcmVudFRhZy50YWdzLnB1c2godGFnKTtcblx0XHRcdH1cblx0XHRcdHRhZ3NbdGFnLnRhZ05hbWVdID0gdGFnQ3R4Q3R4LnRhZyA9IHRhZztcblx0XHR9XG5cdH1cblx0aWYgKCEodGFnLl9lciA9IG9uRXJyb3IpKSB7XG5cdFx0dGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHhzWzBdKTtcblx0XHR0YWcucmVuZGVyaW5nID0ge307IC8vIFByb3ZpZGUgb2JqZWN0IGZvciBzdGF0ZSBkdXJpbmcgcmVuZGVyIGNhbGxzIHRvIHRhZyBhbmQgZWxzZXMuIChVc2VkIGJ5IHt7aWZ9fSBhbmQge3tmb3J9fS4uLilcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR0YWdDdHggPSB0YWcudGFnQ3R4ID0gdGFnQ3R4c1tpXTtcblx0XHRcdHByb3BzID0gdGFnQ3R4LnByb3BzO1xuXHRcdFx0YXJncyA9IHRhZy5jdnRBcmdzKCk7XG5cblx0XHRcdGlmIChtYXBEZWYgPSBwcm9wcy5kYXRhTWFwIHx8IHRhZ0RhdGFNYXApIHtcblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoIHx8IHByb3BzLmRhdGFNYXApIHtcblx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcDtcblx0XHRcdFx0XHRpZiAoIXRoaXNNYXAgfHwgdGhpc01hcC5zcmMgIT09IGFyZ3NbMF0gfHwgaXNVcGRhdGUpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzTWFwICYmIHRoaXNNYXAuc3JjKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXNNYXAudW5tYXAoKTsgLy8gb25seSBjYWxsZWQgaWYgb2JzZXJ2YWJsZSBtYXAgLSBub3Qgd2hlbiBvbmx5IHVzZWQgaW4gSnNSZW5kZXIsIGUuZy4gYnkge3twcm9wc319XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcCA9IG1hcERlZi5tYXAoYXJnc1swXSwgcHJvcHMsIHVuZGVmaW5lZCwgIXRhZy5fLmJuZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFyZ3MgPSBbdGhpc01hcC50Z3RdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eDtcblxuXHRcdFx0aWYgKCFpKSB7XG5cdFx0XHRcdGlmIChjYWxsSW5pdCkge1xuXHRcdFx0XHRcdGluaXRpYWxUbXBsID0gdGFnLnRlbXBsYXRlO1xuXHRcdFx0XHRcdHRhZy5pbml0KHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCk7XG5cdFx0XHRcdFx0Y2FsbEluaXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0XHQvLyBTZXQgYXR0ciBvbiBsaW5rQ3R4IHRvIGVuc3VyZSBvdXRwdXR0aW5nIHRvIHRoZSBjb3JyZWN0IHRhcmdldCBhdHRyaWJ1dGUuXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyBlaXRoZXIgbGlua0N0eC5hdHRyIG9yIHRoaXMuYXR0ciBpbiB0aGUgaW5pdCgpIGFsbG93cyBwZXItaW5zdGFuY2UgY2hvaWNlIG9mIHRhcmdldCBhdHRyaWIuXG5cdFx0XHRcdFx0bGlua0N0eC5hdHRyID0gdGFnLmF0dHIgPSBsaW5rQ3R4LmF0dHIgfHwgdGFnLmF0dHI7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXR0ciA9IHRhZy5hdHRyO1xuXHRcdFx0XHR0YWcuXy5ub1Z3cyA9IGF0dHIgJiYgYXR0ciAhPT0gSFRNTDtcblx0XHRcdH1cblxuXHRcdFx0aXRlbVJldCA9IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0YWcucmVuZGVyKSB7XG5cdFx0XHRcdGl0ZW1SZXQgPSB0YWcucmVuZGVyLmFwcGx5KHRhZywgYXJncyk7XG5cdFx0XHRcdGlmIChwYXJlbnRWaWV3LmxpbmtlZCAmJiBpdGVtUmV0ICYmIHRhZy5saW5rZWRFbGVtICYmICFyV3JhcHBlZEluVmlld01hcmtlci50ZXN0KGl0ZW1SZXQpKSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBhIHRhZyByZW5kZXJzIGNvbnRlbnQgZnJvbSB0aGUgcmVuZGVyIG1ldGhvZCwgd2l0aCBkYXRhIGxpbmtpbmcsIGFuZCBoYXMgYSBsaW5rZWRFbGVtIGJpbmRpbmcsIHRoZW4gd2UgbmVlZCB0byB3cmFwIHdpdGhcblx0XHRcdFx0XHQvLyB2aWV3IG1hcmtlcnMsIGlmIGFic2VudCwgc28gdGhlIGNvbnRlbnQgaXMgYSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFnLCB3aGljaCB3aWxsIGNvcnJlY3RseSBkaXNwb3NlIGJpbmRpbmdzIGlmIGRlbGV0ZWQuXG5cdFx0XHRcdFx0aXRlbVJldCA9IHJlbmRlcldpdGhWaWV3cygkLnRlbXBsYXRlcyhpdGVtUmV0KSwgYXJnc1swXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0YWcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWFyZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdGFyZ3MgPSBbcGFyZW50Vmlld107IC8vIG5vIGFyZ3VtZW50cyAtIChlLmcuIHt7ZWxzZX19KSBnZXQgZGF0YSBjb250ZXh0IGZyb20gdmlldy5cblx0XHRcdH1cblx0XHRcdGlmIChpdGVtUmV0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGVudEN0eCA9IGFyZ3NbMF07IC8vIERlZmF1bHQgZGF0YSBjb250ZXh0IGZvciB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBEZWZpbmVkIHRhZy5jb250ZW50Q3R4IGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoaXMuXG5cdFx0XHRcdGlmICh0YWcuY29udGVudEN0eCkge1xuXHRcdFx0XHRcdGNvbnRlbnRDdHggPSB0YWcuY29udGVudEN0eChjb250ZW50Q3R4KSB8fCBjb250ZW50Q3R4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGl0ZW1SZXQgPSB0YWdDdHgucmVuZGVyKGNvbnRlbnRDdHgsIHRydWUpIHx8IChpc1VwZGF0ZSA/IHVuZGVmaW5lZCA6IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm8gcmV0dXJuIHZhbHVlIGZyb20gcmVuZGVyLCBhbmQgbm8gdGVtcGxhdGUvY29udGVudCB0YWdDdHgucmVuZGVyKC4uLiksIHNvIHJldHVybiB1bmRlZmluZWRcblx0XHRcdHJldCA9IHJldCA/IHJldCArIChpdGVtUmV0IHx8IFwiXCIpIDogaXRlbVJldDsgLy8gSWYgbm8gcmVuZGVyZWQgY29udGVudCwgdGhpcyB3aWxsIGJlIHVuZGVmaW5lZFxuXHRcdH1cblx0XHR0YWcucmVuZGVyaW5nID0gdW5kZWZpbmVkO1xuXHR9XG5cdHRhZy50YWdDdHggPSB0YWdDdHhzWzBdO1xuXHR0YWcuY3R4ID0gdGFnLnRhZ0N0eC5jdHg7XG5cblx0aWYgKHRhZy5fLm5vVndzKSB7XG5cdFx0XHRpZiAodGFnLl8uaW5saW5lKSB7XG5cdFx0XHQvLyBpbmxpbmUgdGFnIHdpdGggYXR0ciBzZXQgdG8gXCJ0ZXh0XCIgd2lsbCBpbnNlcnQgSFRNTC1lbmNvZGVkIGNvbnRlbnQgLSBhcyBpZiBpdCB3YXMgZWxlbWVudC1iYXNlZCBpbm5lclRleHRcblx0XHRcdHJldCA9IGF0dHIgPT09IFwidGV4dFwiXG5cdFx0XHRcdD8gJGNvbnZlcnRlcnMuaHRtbChyZXQpXG5cdFx0XHRcdDogXCJcIjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGJvdW5kVGFnICYmIHBhcmVudFZpZXcuXy5vblJlbmRlclxuXHRcdC8vIENhbGwgb25SZW5kZXIgKHVzZWQgYnkgSnNWaWV3cyBpZiBwcmVzZW50LCB0byBhZGQgYmluZGluZyBhbm5vdGF0aW9ucyBhcm91bmQgcmVuZGVyZWQgY29udGVudClcblx0XHQ/IHBhcmVudFZpZXcuXy5vblJlbmRlcihyZXQsIHBhcmVudFZpZXcsIHRhZylcblx0XHQ6IHJldDtcbn1cblxuLy89PT09PT09PT09PT09PT09PVxuLy8gVmlldyBjb25zdHJ1Y3RvclxuLy89PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBWaWV3KGNvbnRleHQsIHR5cGUsIHBhcmVudFZpZXcsIGRhdGEsIHRlbXBsYXRlLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCkge1xuXHQvLyBDb25zdHJ1Y3RvciBmb3IgdmlldyBvYmplY3QgaW4gdmlldyBoaWVyYXJjaHkuIChBdWdtZW50ZWQgYnkgSnNWaWV3cyBpZiBKc1ZpZXdzIGlzIGxvYWRlZClcblx0dmFyIHZpZXdzLCBwYXJlbnRWaWV3XywgdGFnLCBzZWxmXyxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRpc0FycmF5ID0gdHlwZSA9PT0gXCJhcnJheVwiO1xuXG5cdHNlbGYuY29udGVudCA9IGNvbnRlbnRUbXBsO1xuXHRzZWxmLnZpZXdzID0gaXNBcnJheSA/IFtdIDoge307XG5cdHNlbGYucGFyZW50ID0gcGFyZW50Vmlldztcblx0c2VsZi50eXBlID0gdHlwZSB8fCBcInRvcFwiO1xuXHRzZWxmLmRhdGEgPSBkYXRhO1xuXHRzZWxmLnRtcGwgPSB0ZW1wbGF0ZTtcblx0Ly8gSWYgdGhlIGRhdGEgaXMgYW4gYXJyYXksIHRoaXMgaXMgYW4gJ2FycmF5IHZpZXcnIHdpdGggYSB2aWV3cyBhcnJheSBmb3IgZWFjaCBjaGlsZCAnaXRlbSB2aWV3J1xuXHQvLyBJZiB0aGUgZGF0YSBpcyBub3QgYW4gYXJyYXksIHRoaXMgaXMgYW4gJ2l0ZW0gdmlldycgd2l0aCBhIHZpZXdzICdoYXNoJyBvYmplY3QgZm9yIGFueSBjaGlsZCBuZXN0ZWQgdmlld3Ncblx0Ly8gLl8udXNlS2V5IGlzIG5vbiB6ZXJvIGlmIGlzIG5vdCBhbiAnYXJyYXkgdmlldycgKG93bmluZyBhIGRhdGEgYXJyYXkpLiBVc2UgdGhpcyBhcyBuZXh0IGtleSBmb3IgYWRkaW5nIHRvIGNoaWxkIHZpZXdzIGhhc2hcblx0c2VsZl8gPSBzZWxmLl8gPSB7XG5cdFx0a2V5OiAwLFxuXHRcdHVzZUtleTogaXNBcnJheSA/IDAgOiAxLFxuXHRcdGlkOiBcIlwiICsgdmlld0lkKyssXG5cdFx0b25SZW5kZXI6IG9uUmVuZGVyLFxuXHRcdGJuZHM6IHt9XG5cdH07XG5cdHNlbGYubGlua2VkID0gISFvblJlbmRlcjtcblx0aWYgKHBhcmVudFZpZXcpIHtcblx0XHR2aWV3cyA9IHBhcmVudFZpZXcudmlld3M7XG5cdFx0cGFyZW50Vmlld18gPSBwYXJlbnRWaWV3Ll87XG5cdFx0aWYgKHBhcmVudFZpZXdfLnVzZUtleSkge1xuXHRcdFx0Ly8gUGFyZW50IGlzIG5vdCBhbiAnYXJyYXkgdmlldycuIEFkZCB0aGlzIHZpZXcgdG8gaXRzIHZpZXdzIG9iamVjdFxuXHRcdFx0Ly8gc2VsZi5fa2V5ID0gaXMgdGhlIGtleSBpbiB0aGUgcGFyZW50IHZpZXcgaGFzaFxuXHRcdFx0dmlld3Nbc2VsZl8ua2V5ID0gXCJfXCIgKyBwYXJlbnRWaWV3Xy51c2VLZXkrK10gPSBzZWxmO1xuXHRcdFx0c2VsZi5pbmRleCA9IGluZGV4U3RyO1xuXHRcdFx0c2VsZi5nZXRJbmRleCA9IGdldE5lc3RlZEluZGV4O1xuXHRcdH0gZWxzZSBpZiAodmlld3MubGVuZ3RoID09PSAoc2VsZl8ua2V5ID0gc2VsZi5pbmRleCA9IGtleSkpIHsgLy8gUGFyZW50IGlzIGFuICdhcnJheSB2aWV3Jy4gQWRkIHRoaXMgdmlldyB0byBpdHMgdmlld3MgYXJyYXlcblx0XHRcdHZpZXdzLnB1c2goc2VsZik7IC8vIEFkZGluZyB0byBlbmQgb2Ygdmlld3MgYXJyYXkuIChVc2luZyBwdXNoIHdoZW4gcG9zc2libGUgLSBiZXR0ZXIgcGVyZiB0aGFuIHNwbGljZSlcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmlld3Muc3BsaWNlKGtleSwgMCwgc2VsZik7IC8vIEluc2VydGluZyBpbiB2aWV3cyBhcnJheVxuXHRcdH1cblx0XHQvLyBJZiBubyBjb250ZXh0IHdhcyBwYXNzZWQgaW4sIHVzZSBwYXJlbnQgY29udGV4dFxuXHRcdC8vIElmIGNvbnRleHQgd2FzIHBhc3NlZCBpbiwgaXQgc2hvdWxkIGhhdmUgYmVlbiBtZXJnZWQgYWxyZWFkeSB3aXRoIHBhcmVudCBjb250ZXh0XG5cdFx0c2VsZi5jdHggPSBjb250ZXh0IHx8IHBhcmVudFZpZXcuY3R4O1xuXHR9IGVsc2Uge1xuXHRcdHNlbGYuY3R4ID0gY29udGV4dDtcblx0fVxufVxuXG5WaWV3LnByb3RvdHlwZSA9IHtcblx0Z2V0OiBnZXRWaWV3LFxuXHRnZXRJbmRleDogZ2V0SW5kZXgsXG5cdGdldFJzYzogZ2V0UmVzb3VyY2UsXG5cdGdldFRtcGw6IGdldFRlbXBsYXRlLFxuXHRobHA6IGdldEhlbHBlcixcblx0X2lzOiBcInZpZXdcIlxufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZWdpc3RyYXRpb25cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb21waWxlQ2hpbGRSZXNvdXJjZXMocGFyZW50VG1wbCkge1xuXHR2YXIgc3RvcmVOYW1lLCBzdG9yZU5hbWVzLCByZXNvdXJjZXM7XG5cdGZvciAoc3RvcmVOYW1lIGluIGpzdlN0b3Jlcykge1xuXHRcdHN0b3JlTmFtZXMgPSBzdG9yZU5hbWUgKyBcInNcIjtcblx0XHRpZiAocGFyZW50VG1wbFtzdG9yZU5hbWVzXSkge1xuXHRcdFx0cmVzb3VyY2VzID0gcGFyZW50VG1wbFtzdG9yZU5hbWVzXTsgICAgLy8gUmVzb3VyY2VzIG5vdCB5ZXQgY29tcGlsZWRcblx0XHRcdHBhcmVudFRtcGxbc3RvcmVOYW1lc10gPSB7fTsgICAgICAgICAgICAgICAvLyBSZW1vdmUgdW5jb21waWxlZCByZXNvdXJjZXNcblx0XHRcdCR2aWV3c1tzdG9yZU5hbWVzXShyZXNvdXJjZXMsIHBhcmVudFRtcGwpOyAvLyBBZGQgYmFjayBpbiB0aGUgY29tcGlsZWQgcmVzb3VyY2VzXG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBjb21waWxlVGFnXG4vLz09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb21waWxlVGFnKG5hbWUsIHRhZ0RlZiwgcGFyZW50VG1wbCkge1xuXHR2YXIgdG1wbCwgYmFzZVRhZywgcHJvcCxcblx0XHRjb21waWxlZERlZiA9IG5ldyAkc3ViLl90ZygpO1xuXG5cdGZ1bmN0aW9uIFRhZygpIHtcblx0XHR2YXIgdGFnID0gdGhpcztcblx0XHR0YWcuXyA9IHtcblx0XHRcdGlubGluZTogdHJ1ZSxcblx0XHRcdHVubGlua2VkOiB0cnVlXG5cdFx0fTtcblxuXHRcdHRhZy50YWdOYW1lID0gbmFtZTtcblx0fVxuXG5cdGlmICgkaXNGdW5jdGlvbih0YWdEZWYpKSB7XG5cdFx0Ly8gU2ltcGxlIHRhZyBkZWNsYXJlZCBhcyBmdW5jdGlvbi4gTm8gcHJlc2VudGVyIGluc3RhbnRhdGlvbi5cblx0XHR0YWdEZWYgPSB7XG5cdFx0XHRkZXBlbmRzOiB0YWdEZWYuZGVwZW5kcyxcblx0XHRcdHJlbmRlcjogdGFnRGVmXG5cdFx0fTtcblx0fSBlbHNlIGlmIChcIlwiICsgdGFnRGVmID09PSB0YWdEZWYpIHtcblx0XHR0YWdEZWYgPSB7dGVtcGxhdGU6IHRhZ0RlZn07XG5cdH1cblx0aWYgKGJhc2VUYWcgPSB0YWdEZWYuYmFzZVRhZykge1xuXHRcdHRhZ0RlZi5mbG93ID0gISF0YWdEZWYuZmxvdzsgLy8gU2V0IGZsb3cgcHJvcGVydHksIHNvIGRlZmF1bHRzIHRvIGZhbHNlIGV2ZW4gaWYgYmFzZVRhZyBoYXMgZmxvdz10cnVlXG5cdFx0dGFnRGVmLmJhc2VUYWcgPSBiYXNlVGFnID0gXCJcIiArIGJhc2VUYWcgPT09IGJhc2VUYWdcblx0XHRcdD8gKHBhcmVudFRtcGwgJiYgcGFyZW50VG1wbC50YWdzW2Jhc2VUYWddIHx8ICR0YWdzW2Jhc2VUYWddKVxuXHRcdFx0OiBiYXNlVGFnO1xuXG5cdFx0Y29tcGlsZWREZWYgPSAkZXh0ZW5kKGNvbXBpbGVkRGVmLCBiYXNlVGFnKTtcblxuXHRcdGZvciAocHJvcCBpbiB0YWdEZWYpIHtcblx0XHRcdGNvbXBpbGVkRGVmW3Byb3BdID0gZ2V0TWV0aG9kKGJhc2VUYWdbcHJvcF0sIHRhZ0RlZltwcm9wXSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbXBpbGVkRGVmID0gJGV4dGVuZChjb21waWxlZERlZiwgdGFnRGVmKTtcblx0fVxuXG5cdC8vIFRhZyBkZWNsYXJlZCBhcyBvYmplY3QsIHVzZWQgYXMgdGhlIHByb3RvdHlwZSBmb3IgdGFnIGluc3RhbnRpYXRpb24gKGNvbnRyb2wvcHJlc2VudGVyKVxuXHRpZiAoKHRtcGwgPSBjb21waWxlZERlZi50ZW1wbGF0ZSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdGNvbXBpbGVkRGVmLnRlbXBsYXRlID0gXCJcIiArIHRtcGwgPT09IHRtcGwgPyAoJHRlbXBsYXRlc1t0bXBsXSB8fCAkdGVtcGxhdGVzKHRtcGwpKSA6IHRtcGw7XG5cdH1cblx0aWYgKGNvbXBpbGVkRGVmLmluaXQgIT09IGZhbHNlKSB7XG5cdFx0Ly8gU2V0IGluaXQ6IGZhbHNlIG9uIHRhZ0RlZiBpZiB5b3Ugd2FudCB0byBwcm92aWRlIGp1c3QgYSByZW5kZXIgbWV0aG9kLCBvciByZW5kZXIgYW5kIHRlbXBsYXRlLCBidXQgbm8gY29uc3RydWN0b3Igb3IgcHJvdG90eXBlLlxuXHRcdC8vIHNvIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0YWcgdG8gcmVuZGVyIGZ1bmN0aW9uLCBleGNlcHQgeW91IGNhbiBhbHNvIHByb3ZpZGUgYSB0ZW1wbGF0ZS5cblx0XHQoVGFnLnByb3RvdHlwZSA9IGNvbXBpbGVkRGVmKS5jb25zdHJ1Y3RvciA9IGNvbXBpbGVkRGVmLl9jdHIgPSBUYWc7XG5cdH1cblxuXHRpZiAocGFyZW50VG1wbCkge1xuXHRcdGNvbXBpbGVkRGVmLl9wYXJlbnRUbXBsID0gcGFyZW50VG1wbDtcblx0fVxuXHRyZXR1cm4gY29tcGlsZWREZWY7XG59XG5cbmZ1bmN0aW9uIGJhc2VBcHBseShhcmdzKSB7XG5cdC8vIEluIGRlcml2ZWQgbWV0aG9kIChvciBoYW5kbGVyIGRlY2xhcmVkIGRlY2xhcmF0aXZlbHkgYXMgaW4ge3s6Zm9vIG9uQ2hhbmdlPX5mb29DaGFuZ2VkfX0gY2FuIGNhbGwgYmFzZSBtZXRob2QsXG5cdC8vIHVzaW5nIHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgKEVxdWl2YWxlbnQgdG8gdGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpIGluIGpRdWVyeSBVSSlcblx0cmV0dXJuIHRoaXMuYmFzZS5hcHBseSh0aGlzLCBhcmdzKTtcbn1cblxuLy89PT09PT09PT09PT09PT1cbi8vIGNvbXBpbGVUbXBsXG4vLz09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb21waWxlVG1wbChuYW1lLCB0bXBsLCBwYXJlbnRUbXBsLCBvcHRpb25zKSB7XG5cdC8vIHRtcGwgaXMgZWl0aGVyIGEgdGVtcGxhdGUgb2JqZWN0LCBhIHNlbGVjdG9yIGZvciBhIHRlbXBsYXRlIHNjcmlwdCBibG9jaywgdGhlIG5hbWUgb2YgYSBjb21waWxlZCB0ZW1wbGF0ZSwgb3IgYSB0ZW1wbGF0ZSBvYmplY3RcblxuXHQvLz09PT0gbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cdGZ1bmN0aW9uIGxvb2t1cFRlbXBsYXRlKHZhbHVlKSB7XG5cdFx0Ly8gSWYgdmFsdWUgaXMgb2YgdHlwZSBzdHJpbmcgLSB0cmVhdCBhcyBzZWxlY3Rvciwgb3IgbmFtZSBvZiBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdC8vIFJldHVybiB0aGUgdGVtcGxhdGUgb2JqZWN0LCBpZiBhbHJlYWR5IGNvbXBpbGVkLCBvciB0aGUgbWFya3VwIHN0cmluZ1xuXHRcdHZhciBjdXJyZW50TmFtZSwgdG1wbDtcblx0XHRpZiAoKFwiXCIgKyB2YWx1ZSA9PT0gdmFsdWUpIHx8IHZhbHVlLm5vZGVUeXBlID4gMCAmJiAoZWxlbSA9IHZhbHVlKSkge1xuXHRcdFx0aWYgKCFlbGVtKSB7XG5cdFx0XHRcdGlmICgvXlxcLlxcL1teXFxcXDoqP1wiPD5dKiQvLnRlc3QodmFsdWUpKSB7XG5cdFx0XHRcdFx0Ly8gdG1wbD1cIi4vc29tZS9maWxlLmh0bWxcIlxuXHRcdFx0XHRcdC8vIElmIHRoZSB0ZW1wbGF0ZSBpcyBub3QgbmFtZWQsIHVzZSBcIi4vc29tZS9maWxlLmh0bWxcIiBhcyBuYW1lLlxuXHRcdFx0XHRcdGlmICh0bXBsID0gJHRlbXBsYXRlc1tuYW1lID0gbmFtZSB8fCB2YWx1ZV0pIHtcblx0XHRcdFx0XHRcdHZhbHVlID0gdG1wbDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gQlJPV1NFUi1TUEVDSUZJQyBDT0RFIChub3Qgb24gTm9kZS5qcyk6XG5cdFx0XHRcdFx0XHQvLyBMb29rIGZvciBzZXJ2ZXItZ2VuZXJhdGVkIHNjcmlwdCBibG9jayB3aXRoIGlkIFwiLi9zb21lL2ZpbGUuaHRtbFwiXG5cdFx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICgkLmZuICYmICEkc3ViLnJUbXBsLnRlc3QodmFsdWUpKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGVsZW0gPSAkKGRvY3VtZW50KS5maW5kKHZhbHVlKVswXTsgLy8gaWYgalF1ZXJ5IGlzIGxvYWRlZCwgdGVzdCBmb3Igc2VsZWN0b3IgcmV0dXJuaW5nIGVsZW1lbnRzLCBhbmQgZ2V0IGZpcnN0IGVsZW1lbnRcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0XHR9Ly8gRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0fSAvL0JST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0aWYgKGVsZW0pIHtcblx0XHRcdFx0Ly8gR2VuZXJhbGx5IHRoaXMgaXMgYSBzY3JpcHQgZWxlbWVudC5cblx0XHRcdFx0Ly8gSG93ZXZlciB3ZSBhbGxvdyBpdCB0byBiZSBhbnkgZWxlbWVudCwgc28geW91IGNhbiBmb3IgZXhhbXBsZSB0YWtlIHRoZSBjb250ZW50IG9mIGEgZGl2LFxuXHRcdFx0XHQvLyB1c2UgaXQgYXMgYSB0ZW1wbGF0ZSwgYW5kIHJlcGxhY2UgaXQgYnkgdGhlIHNhbWUgY29udGVudCByZW5kZXJlZCBhZ2FpbnN0IGRhdGEuXG5cdFx0XHRcdC8vIGUuZy4gZm9yIGxpbmtpbmcgdGhlIGNvbnRlbnQgb2YgYSBkaXYgdG8gYSBjb250YWluZXIsIGFuZCB1c2luZyB0aGUgaW5pdGlhbCBjb250ZW50IGFzIHRlbXBsYXRlOlxuXHRcdFx0XHQvLyAkLmxpbmsoXCIjY29udGVudFwiLCBtb2RlbCwge3RtcGw6IFwiI2NvbnRlbnRcIn0pO1xuXHRcdFx0XHRpZiAob3B0aW9ucykge1xuXHRcdFx0XHRcdC8vIFdlIHdpbGwgY29tcGlsZSBhIG5ldyB0ZW1wbGF0ZSB1c2luZyB0aGUgbWFya3VwIGluIHRoZSBzY3JpcHQgZWxlbWVudFxuXHRcdFx0XHRcdHZhbHVlID0gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gV2Ugd2lsbCBjYWNoZSBhIHNpbmdsZSBjb3B5IG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSwgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBuYW1lXG5cdFx0XHRcdFx0Ly8gKHJlbmFtaW5nIGZyb20gYSBwcmV2aW91cyBuYW1lIGlmIHRoZXJlIHdhcyBvbmUpLlxuXHRcdFx0XHRcdGN1cnJlbnROYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUodG1wbEF0dHIpO1xuXHRcdFx0XHRcdGlmIChjdXJyZW50TmFtZSkge1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnROYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gJHRlbXBsYXRlc1tjdXJyZW50TmFtZV07XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSAkdGVtcGxhdGVzW2N1cnJlbnROYW1lXTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoJC5mbikge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9ICQuZGF0YShlbGVtKVtqc3ZUbXBsXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bmFtZSA9IG5hbWUgfHwgKCQuZm4gPyBqc3ZUbXBsIDogdmFsdWUpO1xuXHRcdFx0XHRcdFx0dmFsdWUgPSBjb21waWxlVG1wbChuYW1lLCBlbGVtLmlubmVySFRNTCwgcGFyZW50VG1wbCwgb3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhbHVlLnRtcGxOYW1lID0gbmFtZSA9IG5hbWUgfHwgY3VycmVudE5hbWU7XG5cdFx0XHRcdFx0aWYgKG5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdFx0XHRcdCR0ZW1wbGF0ZXNbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUodG1wbEF0dHIsIG5hbWUpO1xuXHRcdFx0XHRcdGlmICgkLmZuKSB7XG5cdFx0XHRcdFx0XHQkLmRhdGEoZWxlbSwganN2VG1wbCwgdmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSAvLyBFTkQgQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0XHRlbGVtID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoIXZhbHVlLmZuKSB7XG5cdFx0XHR2YWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdC8vIElmIHZhbHVlIGlzIG5vdCBhIHN0cmluZy4gSFRNTCBlbGVtZW50LCBvciBjb21waWxlZCB0ZW1wbGF0ZSwgcmV0dXJuIHVuZGVmaW5lZFxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHR2YXIgZWxlbSwgY29tcGlsZWRUbXBsLFxuXHRcdHRtcGxPck1hcmt1cCA9IHRtcGwgPSB0bXBsIHx8IFwiXCI7XG5cblx0Ly89PT09IENvbXBpbGUgdGhlIHRlbXBsYXRlID09PT1cblx0aWYgKG9wdGlvbnMgPT09IDApIHtcblx0XHRvcHRpb25zID0gdW5kZWZpbmVkO1xuXHRcdHRtcGxPck1hcmt1cCA9IGxvb2t1cFRlbXBsYXRlKHRtcGxPck1hcmt1cCk7IC8vIFRvcC1sZXZlbCBjb21waWxlIHNvIGRvIGEgdGVtcGxhdGUgbG9va3VwXG5cdH1cblxuXHQvLyBJZiBvcHRpb25zLCB0aGVuIHRoaXMgd2FzIGFscmVhZHkgY29tcGlsZWQgZnJvbSBhIChzY3JpcHQpIGVsZW1lbnQgdGVtcGxhdGUgZGVjbGFyYXRpb24uXG5cdC8vIElmIG5vdCwgdGhlbiBpZiB0bXBsIGlzIGEgdGVtcGxhdGUgb2JqZWN0LCB1c2UgaXQgZm9yIG9wdGlvbnNcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwgKHRtcGwubWFya3VwID8gdG1wbCA6IHt9KTtcblx0b3B0aW9ucy50bXBsTmFtZSA9IG5hbWU7XG5cdGlmIChwYXJlbnRUbXBsKSB7XG5cdFx0b3B0aW9ucy5fcGFyZW50VG1wbCA9IHBhcmVudFRtcGw7XG5cdH1cblx0Ly8gSWYgdG1wbCBpcyBub3QgYSBtYXJrdXAgc3RyaW5nIG9yIGEgc2VsZWN0b3Igc3RyaW5nLCB0aGVuIGl0IG11c3QgYmUgYSB0ZW1wbGF0ZSBvYmplY3Rcblx0Ly8gSW4gdGhhdCBjYXNlLCBnZXQgaXQgZnJvbSB0aGUgbWFya3VwIHByb3BlcnR5IG9mIHRoZSBvYmplY3Rcblx0aWYgKCF0bXBsT3JNYXJrdXAgJiYgdG1wbC5tYXJrdXAgJiYgKHRtcGxPck1hcmt1cCA9IGxvb2t1cFRlbXBsYXRlKHRtcGwubWFya3VwKSkpIHtcblx0XHRpZiAodG1wbE9yTWFya3VwLmZuKSB7XG5cdFx0XHQvLyBJZiB0aGUgc3RyaW5nIHJlZmVyZW5jZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBvYmplY3QsIG5lZWQgdG8gcmVjb21waWxlIHRvIG1lcmdlIGFueSBtb2RpZmllZCBvcHRpb25zXG5cdFx0XHR0bXBsT3JNYXJrdXAgPSB0bXBsT3JNYXJrdXAubWFya3VwO1xuXHRcdH1cblx0fVxuXHRpZiAodG1wbE9yTWFya3VwICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAodG1wbE9yTWFya3VwLmZuIHx8IHRtcGwuZm4pIHtcblx0XHRcdC8vIHRtcGwgaXMgYWxyZWFkeSBjb21waWxlZCwgc28gdXNlIGl0XG5cdFx0XHRpZiAodG1wbE9yTWFya3VwLmZuKSB7XG5cdFx0XHRcdGNvbXBpbGVkVG1wbCA9IHRtcGxPck1hcmt1cDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdG1wbE9yTWFya3VwIGlzIGEgbWFya3VwIHN0cmluZywgbm90IGEgY29tcGlsZWQgdGVtcGxhdGVcblx0XHRcdC8vIENyZWF0ZSB0ZW1wbGF0ZSBvYmplY3Rcblx0XHRcdHRtcGwgPSB0bXBsT2JqZWN0KHRtcGxPck1hcmt1cCwgb3B0aW9ucyk7XG5cdFx0XHQvLyBDb21waWxlIHRvIEFTVCBhbmQgdGhlbiB0byBjb21waWxlZCBmdW5jdGlvblxuXHRcdFx0dG1wbEZuKHRtcGxPck1hcmt1cC5yZXBsYWNlKHJFc2NhcGVRdW90ZXMsIFwiXFxcXCQmXCIpLCB0bXBsKTtcblx0XHR9XG5cdFx0aWYgKCFjb21waWxlZFRtcGwpIHtcblx0XHRcdGNvbXBpbGVkVG1wbCA9ICRleHRlbmQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBjb21waWxlZFRtcGwucmVuZGVyLmFwcGx5KGNvbXBpbGVkVG1wbCwgYXJndW1lbnRzKTtcblx0XHRcdH0sIHRtcGwpO1xuXG5cdFx0XHRjb21waWxlQ2hpbGRSZXNvdXJjZXMoY29tcGlsZWRUbXBsKTtcblx0XHR9XG5cdFx0aWYgKG5hbWUgJiYgIXBhcmVudFRtcGwgJiYgbmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0JHJlbmRlcltuYW1lXSA9IGNvbXBpbGVkVG1wbDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbXBpbGVkVG1wbDtcblx0fVxufVxuXG4vLz09PT0gL2VuZCBvZiBmdW5jdGlvbiBjb21waWxlVG1wbCA9PT09XG5cbi8vPT09PT09PT09PT09PT09PT1cbi8vIGNvbXBpbGVWaWV3TW9kZWxcbi8vPT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbChkZWZhdWx0VmFsLCBkYXRhKSB7XG5cdHJldHVybiAkLmlzRnVuY3Rpb24oZGVmYXVsdFZhbClcblx0XHQ/IGRlZmF1bHRWYWwuY2FsbChkYXRhKVxuXHRcdDogZGVmYXVsdFZhbDtcbn1cblxuZnVuY3Rpb24gdW5tYXBBcnJheShtb2RlbEFycikge1xuXHRcdHZhciBpLCBhcnIgPSBbXSxcblx0XHRcdGwgPSBtb2RlbEFyci5sZW5ndGg7XG5cdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRhcnIucHVzaChtb2RlbEFycltpXS51bm1hcCgpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gY29tcGlsZVZpZXdNb2RlbChuYW1lLCB0eXBlKSB7XG5cdHZhciBpLCBjb25zdHJ1Y3Rvcixcblx0XHR2aWV3TW9kZWxzID0gdGhpcyxcblx0XHRnZXR0ZXJzID0gdHlwZS5nZXR0ZXJzLFxuXHRcdGV4dGVuZCA9IHR5cGUuZXh0ZW5kLFxuXHRcdGlkID0gdHlwZS5pZCxcblx0XHRwcm90byA9ICQuZXh0ZW5kKHtcblx0XHRcdF9pczogbmFtZSB8fCBcInVubmFtZWRcIixcblx0XHRcdHVubWFwOiB1bm1hcCxcblx0XHRcdG1lcmdlOiBtZXJnZVxuXHRcdH0sIGV4dGVuZCksXG5cdFx0YXJncyA9IFwiXCIsXG5cdFx0Ym9keSA9IFwiXCIsXG5cdFx0bCA9IGdldHRlcnMgPyBnZXR0ZXJzLmxlbmd0aCA6IDAsXG5cdFx0JG9ic2VydmFibGUgPSAkLm9ic2VydmFibGUsXG5cdFx0Z2V0dGVyTmFtZXMgPSB7fTtcblxuXHRmdW5jdGlvbiBHZXROZXcoYXJncykge1xuXHRcdGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHR9XG5cblx0ZnVuY3Rpb24gdm0oKSB7XG5cdFx0cmV0dXJuIG5ldyBHZXROZXcoYXJndW1lbnRzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGl0ZXJhdGUoZGF0YSwgYWN0aW9uKSB7XG5cdFx0dmFyIGosIGdldHRlclR5cGUsIGRlZmF1bHRWYWwsIHByb3AsIG9iLFxuXHRcdFx0bSA9IGdldHRlcnMubGVuZ3RoO1xuXHRcdGZvciAoaj0wOyBqPG07IGorKykge1xuXHRcdFx0cHJvcCA9IGdldHRlcnNbal07XG5cdFx0XHRnZXR0ZXJUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHByb3AgKyBcIlwiICE9PSBwcm9wKSB7XG5cdFx0XHRcdGdldHRlclR5cGUgPSBwcm9wO1xuXHRcdFx0XHRwcm9wID0gZ2V0dGVyVHlwZS5nZXR0ZXI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoKG9iID0gZGF0YVtwcm9wXSkgPT09IHVuZGVmaW5lZCAmJiBnZXR0ZXJUeXBlICYmIChkZWZhdWx0VmFsID0gZ2V0dGVyVHlwZS5kZWZhdWx0VmFsKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG9iID0gZ2V0RGVmYXVsdFZhbChkZWZhdWx0VmFsLCBkYXRhKTtcblx0XHRcdH1cblx0XHRcdGFjdGlvbihvYiwgZ2V0dGVyVHlwZSAmJiB2aWV3TW9kZWxzW2dldHRlclR5cGUudHlwZV0sIHByb3ApO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIG1hcChkYXRhKSB7XG5cdFx0ZGF0YSA9IGRhdGEgKyBcIlwiID09PSBkYXRhXG5cdFx0XHQ/IEpTT04ucGFyc2UoZGF0YSkgLy8gQWNjZXB0IEpTT04gc3RyaW5nXG5cdFx0XHQ6IGRhdGE7ICAgICAgICAgICAgLy8gb3Igb2JqZWN0L2FycmF5XG5cdFx0dmFyIGksIGosICBsLCBtLCBwcm9wLFxuXHRcdFx0b2IgPSBkYXRhLFxuXHRcdFx0YXJyID0gW107XG5cblx0XHRpZiAoJGlzQXJyYXkoZGF0YSkpIHtcblx0XHRcdGRhdGEgPSBkYXRhIHx8IFtdO1xuXHRcdFx0bCA9IGRhdGEubGVuZ3RoO1xuXHRcdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRcdGFyci5wdXNoKHRoaXMubWFwKGRhdGFbaV0pKTtcblx0XHRcdH1cblx0XHRcdGFyci5faXMgPSBuYW1lO1xuXHRcdFx0YXJyLnVubWFwID0gdW5tYXA7XG5cdFx0XHRhcnIubWVyZ2UgPSBtZXJnZTtcblx0XHRcdHJldHVybiBhcnI7XG5cdFx0fVxuXG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGl0ZXJhdGUoZGF0YSwgZnVuY3Rpb24ob2IsIHZpZXdNb2RlbCkge1xuXHRcdFx0XHRpZiAodmlld01vZGVsKSB7IC8vIEl0ZXJhdGUgdG8gYnVpbGQgZ2V0dGVycyBhcmcgYXJyYXkgKHZhbHVlLCBvciBtYXBwZWQgdmFsdWUpXG5cdFx0XHRcdFx0b2IgPSB2aWV3TW9kZWwubWFwKG9iKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhcnIucHVzaChvYik7XG5cdFx0XHR9KTtcblxuXHRcdFx0b2IgPSB0aGlzLmFwcGx5KHRoaXMsIGFycik7IC8vIEluc2FudGlhdGUgdGhpcyBWaWV3IE1vZGVsLCBwYXNzaW5nIGdldHRlcnMgYXJncyBhcnJheSB0byBjb25zdHJ1Y3RvclxuXHRcdFx0Zm9yIChwcm9wIGluIGRhdGEpIHsgLy8gQ29weSBvdmVyIGFueSBvdGhlciBwcm9wZXJ0aWVzLiB0aGF0IGFyZSBub3QgZ2V0L3NldCBwcm9wZXJ0aWVzXG5cdFx0XHRcdGlmIChwcm9wICE9PSAkZXhwYW5kbyAgJiYgIWdldHRlck5hbWVzW3Byb3BdKSB7XG5cdFx0XHRcdFx0b2JbcHJvcF0gPSBkYXRhW3Byb3BdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvYjtcblx0fVxuXG5cdGZ1bmN0aW9uIG1lcmdlKGRhdGEpIHtcblx0XHRkYXRhID0gZGF0YSArIFwiXCIgPT09IGRhdGFcblx0XHRcdD8gSlNPTi5wYXJzZShkYXRhKSAvLyBBY2NlcHQgSlNPTiBzdHJpbmdcblx0XHRcdDogZGF0YTsgICAgICAgICAgICAvLyBvciBvYmplY3QvYXJyYXlcblx0XHR2YXIgaSwgaiwgbCwgbSwgcHJvcCwgbW9kLCBmb3VuZCwgYXNzaWduZWQsIG9iLCBuZXdNb2RBcnIsXG5cdFx0XHRtb2RlbCA9IHRoaXM7XG5cblx0XHRpZiAoJGlzQXJyYXkobW9kZWwpKSB7XG5cdFx0XHRhc3NpZ25lZCA9IHt9O1xuXHRcdFx0bmV3TW9kQXJyID0gW107XG5cdFx0XHRsID0gZGF0YS5sZW5ndGg7XG5cdFx0XHRtID0gbW9kZWwubGVuZ3RoO1xuXHRcdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRcdG9iID0gZGF0YVtpXTtcblx0XHRcdFx0Zm91bmQgPSBmYWxzZTtcblx0XHRcdFx0Zm9yIChqPTA7IGo8bSAmJiAhZm91bmQ7IGorKykge1xuXHRcdFx0XHRcdGlmIChhc3NpZ25lZFtqXSkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZCA9IG1vZGVsW2pdO1xuXG5cdFx0XHRcdFx0aWYgKGlkKSB7XG5cdFx0XHRcdFx0XHRhc3NpZ25lZFtqXSA9IGZvdW5kID0gaWQgKyBcIlwiID09PSBpZFxuXHRcdFx0XHRcdFx0PyAob2JbaWRdICYmIChnZXR0ZXJOYW1lc1tpZF0gPyBtb2RbaWRdKCkgOiBtb2RbaWRdKSA9PT0gb2JbaWRdKVxuXHRcdFx0XHRcdFx0OiBpZChtb2QsIG9iKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGZvdW5kKSB7XG5cdFx0XHRcdFx0bW9kLm1lcmdlKG9iKTtcblx0XHRcdFx0XHRuZXdNb2RBcnIucHVzaChtb2QpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5ld01vZEFyci5wdXNoKHZtLm1hcChvYikpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoJG9ic2VydmFibGUpIHtcblx0XHRcdFx0JG9ic2VydmFibGUobW9kZWwpLnJlZnJlc2gobmV3TW9kQXJyLCB0cnVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1vZGVsLnNwbGljZS5hcHBseShtb2RlbCwgWzAsIG1vZGVsLmxlbmd0aF0uY29uY2F0KG5ld01vZEFycikpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpdGVyYXRlKGRhdGEsIGZ1bmN0aW9uKG9iLCB2aWV3TW9kZWwsIGdldHRlcikge1xuXHRcdFx0aWYgKHZpZXdNb2RlbCkge1xuXHRcdFx0XHRtb2RlbFtnZXR0ZXJdKCkubWVyZ2Uob2IpOyAvLyBVcGRhdGUgdHlwZWQgcHJvcGVydHlcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1vZGVsW2dldHRlcl0ob2IpOyAvLyBVcGRhdGUgbm9uLXR5cGVkIHByb3BlcnR5XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Zm9yIChwcm9wIGluIGRhdGEpIHtcblx0XHRcdGlmIChwcm9wICE9PSAkZXhwYW5kbyAmJiAhZ2V0dGVyTmFtZXNbcHJvcF0pIHtcblx0XHRcdFx0bW9kZWxbcHJvcF0gPSBkYXRhW3Byb3BdO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHVubWFwKCkge1xuXHRcdHZhciBvYiwgcHJvcCwgaSwgbCwgZ2V0dGVyVHlwZSwgYXJyLCB2YWx1ZSxcblx0XHRcdG1vZGVsID0gdGhpcztcblxuXHRcdGlmICgkaXNBcnJheShtb2RlbCkpIHtcblx0XHRcdHJldHVybiB1bm1hcEFycmF5KG1vZGVsKTtcblx0XHR9XG5cdFx0b2IgPSB7fTtcblx0XHRsID0gZ2V0dGVycy5sZW5ndGg7XG5cdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRwcm9wID0gZ2V0dGVyc1tpXTtcblx0XHRcdGdldHRlclR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAocHJvcCArIFwiXCIgIT09IHByb3ApIHtcblx0XHRcdFx0Z2V0dGVyVHlwZSA9IHByb3A7XG5cdFx0XHRcdHByb3AgPSBnZXR0ZXJUeXBlLmdldHRlcjtcblx0XHRcdH1cblx0XHRcdHZhbHVlID0gbW9kZWxbcHJvcF0oKTtcblx0XHRcdG9iW3Byb3BdID0gZ2V0dGVyVHlwZSAmJiB2YWx1ZSAmJiB2aWV3TW9kZWxzW2dldHRlclR5cGUudHlwZV1cblx0XHRcdFx0PyAkaXNBcnJheSh2YWx1ZSlcblx0XHRcdFx0XHQ/IHVubWFwQXJyYXkodmFsdWUpXG5cdFx0XHRcdFx0OiB2YWx1ZS51bm1hcCgpXG5cdFx0XHRcdDogdmFsdWU7XG5cdFx0fVxuXHRcdGZvciAocHJvcCBpbiBtb2RlbCkge1xuXHRcdFx0aWYgKHByb3AgIT09IFwiX2lzXCIgJiYgIWdldHRlck5hbWVzW3Byb3BdICYmIHByb3AgIT09ICRleHBhbmRvICAmJiAocHJvcC5jaGFyQXQoMCkgIT09IFwiX1wiIHx8ICFnZXR0ZXJOYW1lc1twcm9wLnNsaWNlKDEpXSkgJiYgISQuaXNGdW5jdGlvbihtb2RlbFtwcm9wXSkpIHtcblx0XHRcdFx0b2JbcHJvcF0gPSBtb2RlbFtwcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9iO1xuXHR9XG5cblx0R2V0TmV3LnByb3RvdHlwZSA9IHByb3RvO1xuXG5cdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdChmdW5jdGlvbihnZXR0ZXIpIHtcblx0XHRcdGdldHRlciA9IGdldHRlci5nZXR0ZXIgfHwgZ2V0dGVyO1xuXHRcdFx0Z2V0dGVyTmFtZXNbZ2V0dGVyXSA9IGkrMTtcblx0XHRcdHZhciBwcml2RmllbGQgPSBcIl9cIiArIGdldHRlcjtcblxuXHRcdFx0YXJncyArPSAoYXJncyA/IFwiLFwiIDogXCJcIikgKyBnZXR0ZXI7XG5cdFx0XHRib2R5ICs9IFwidGhpcy5cIiArIHByaXZGaWVsZCArIFwiID0gXCIgKyBnZXR0ZXIgKyBcIjtcXG5cIjtcblx0XHRcdHByb3RvW2dldHRlcl0gPSBwcm90b1tnZXR0ZXJdIHx8IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpc1twcml2RmllbGRdOyAvLyBJZiB0aGVyZSBpcyBubyBhcmd1bWVudCwgdXNlIGFzIGEgZ2V0dGVyXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdFx0JG9ic2VydmFibGUodGhpcykuc2V0UHJvcGVydHkoZ2V0dGVyLCB2YWwpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXNbcHJpdkZpZWxkXSA9IHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdHByb3RvW2dldHRlcl0uc2V0ID0gcHJvdG9bZ2V0dGVyXS5zZXQgfHwgZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdFx0dGhpc1twcml2RmllbGRdID0gdmFsOyAvLyBTZXR0ZXIgY2FsbGVkIGJ5IG9ic2VydmFibGUgcHJvcGVydHkgY2hhbmdlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSkoZ2V0dGVyc1tpXSk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvciA9IG5ldyBGdW5jdGlvbihhcmdzLCBib2R5LnNsaWNlKDAsIC0xKSk7XG5cdGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IHByb3RvO1xuXHRwcm90by5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuXG5cdHZtLm1hcCA9IG1hcDtcblx0dm0uZ2V0dGVycyA9IGdldHRlcnM7XG5cdHZtLmV4dGVuZCA9IGV4dGVuZDtcblx0dm0uaWQgPSBpZDtcblx0cmV0dXJuIHZtO1xufVxuXG5mdW5jdGlvbiB0bXBsT2JqZWN0KG1hcmt1cCwgb3B0aW9ucykge1xuXHQvLyBUZW1wbGF0ZSBvYmplY3QgY29uc3RydWN0b3Jcblx0dmFyIGh0bWxUYWcsXG5cdFx0d3JhcE1hcCA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl93bSB8fCB7fSwgLy8gT25seSB1c2VkIGluIEpzVmlld3MuIE90aGVyd2lzZSBlbXB0eToge31cblx0XHR0bXBsID0gJGV4dGVuZChcblx0XHRcdHtcblx0XHRcdFx0dG1wbHM6IFtdLFxuXHRcdFx0XHRsaW5rczoge30sIC8vIENvbXBpbGVkIGZ1bmN0aW9ucyBmb3IgbGluayBleHByZXNzaW9uc1xuXHRcdFx0XHRibmRzOiBbXSxcblx0XHRcdFx0X2lzOiBcInRlbXBsYXRlXCIsXG5cdFx0XHRcdHJlbmRlcjogcmVuZGVyQ29udGVudFxuXHRcdFx0fSxcblx0XHRcdG9wdGlvbnNcblx0XHQpO1xuXG5cdHRtcGwubWFya3VwID0gbWFya3VwO1xuXHRpZiAoIW9wdGlvbnMuaHRtbFRhZykge1xuXHRcdC8vIFNldCB0bXBsLnRhZyB0byB0aGUgdG9wLWxldmVsIEhUTUwgdGFnIHVzZWQgaW4gdGhlIHRlbXBsYXRlLCBpZiBhbnkuLi5cblx0XHRodG1sVGFnID0gckZpcnN0RWxlbS5leGVjKG1hcmt1cCk7XG5cdFx0dG1wbC5odG1sVGFnID0gaHRtbFRhZyA/IGh0bWxUYWdbMV0udG9Mb3dlckNhc2UoKSA6IFwiXCI7XG5cdH1cblx0aHRtbFRhZyA9IHdyYXBNYXBbdG1wbC5odG1sVGFnXTtcblx0aWYgKGh0bWxUYWcgJiYgaHRtbFRhZyAhPT0gd3JhcE1hcC5kaXYpIHtcblx0XHQvLyBXaGVuIHVzaW5nIEpzVmlld3MsIHdlIHRyaW0gdGVtcGxhdGVzIHdoaWNoIGFyZSBpbnNlcnRlZCBpbnRvIEhUTUwgY29udGV4dHMgd2hlcmUgdGV4dCBub2RlcyBhcmUgbm90IHJlbmRlcmVkIChpLmUuIG5vdCAnUGhyYXNpbmcgQ29udGVudCcpLlxuXHRcdC8vIEN1cnJlbnRseSBub3QgdHJpbW1lZCBmb3IgPGxpPiB0YWcuIChOb3Qgd29ydGggYWRkaW5nIHBlcmYgY29zdClcblx0XHR0bXBsLm1hcmt1cCA9ICQudHJpbSh0bXBsLm1hcmt1cCk7XG5cdH1cblxuXHRyZXR1cm4gdG1wbDtcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gcmVnaXN0ZXJTdG9yZVxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZWdpc3RlclN0b3JlKHN0b3JlTmFtZSwgc3RvcmVTZXR0aW5ncykge1xuXG5cdGZ1bmN0aW9uIHRoZVN0b3JlKG5hbWUsIGl0ZW0sIHBhcmVudFRtcGwpIHtcblx0XHQvLyBUaGUgc3RvcmUgaXMgYWxzbyB0aGUgZnVuY3Rpb24gdXNlZCB0byBhZGQgaXRlbXMgdG8gdGhlIHN0b3JlLiBlLmcuICQudGVtcGxhdGVzLCBvciAkLnZpZXdzLnRhZ3NcblxuXHRcdC8vIEZvciBzdG9yZSBvZiBuYW1lICd0aGluZycsIENhbGwgYXM6XG5cdFx0Ly8gICAgJC52aWV3cy50aGluZ3MoaXRlbXNbLCBwYXJlbnRUbXBsXSksXG5cdFx0Ly8gb3IgJC52aWV3cy50aGluZ3MobmFtZSwgaXRlbVssIHBhcmVudFRtcGxdKVxuXG5cdFx0dmFyIG9uU3RvcmUsIGNvbXBpbGUsIGl0ZW1OYW1lLCB0aGlzU3RvcmU7XG5cdFx0aWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09IE9CSkVDVCAmJiAhbmFtZS5ub2RlVHlwZSAmJiAhbmFtZS5tYXJrdXAgJiYgIW5hbWUuZ2V0VGd0ICYmICEoc3RvcmVOYW1lID09PSBcInZpZXdNb2RlbFwiICYmIG5hbWUuZ2V0dGVycyB8fCBuYW1lLmV4dGVuZCkpIHtcblx0XHRcdC8vIENhbGwgdG8gJC52aWV3cy50aGluZ3MoaXRlbXNbLCBwYXJlbnRUbXBsXSksXG5cblx0XHRcdC8vIEFkZGluZyBpdGVtcyB0byB0aGUgc3RvcmVcblx0XHRcdC8vIElmIG5hbWUgaXMgYSBoYXNoLCB0aGVuIGl0ZW0gaXMgcGFyZW50VG1wbC4gSXRlcmF0ZSBvdmVyIGhhc2ggYW5kIGNhbGwgc3RvcmUgZm9yIGtleS5cblx0XHRcdGZvciAoaXRlbU5hbWUgaW4gbmFtZSkge1xuXHRcdFx0XHR0aGVTdG9yZShpdGVtTmFtZSwgbmFtZVtpdGVtTmFtZV0sIGl0ZW0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGl0ZW0gfHwgJHZpZXdzO1xuXHRcdH1cblx0XHQvLyBBZGRpbmcgYSBzaW5nbGUgdW5uYW1lZCBpdGVtIHRvIHRoZSBzdG9yZVxuXHRcdGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGl0ZW0gPSBuYW1lO1xuXHRcdFx0bmFtZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKG5hbWUgJiYgXCJcIiArIG5hbWUgIT09IG5hbWUpIHsgLy8gbmFtZSBtdXN0IGJlIGEgc3RyaW5nXG5cdFx0XHRwYXJlbnRUbXBsID0gaXRlbTtcblx0XHRcdGl0ZW0gPSBuYW1lO1xuXHRcdFx0bmFtZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dGhpc1N0b3JlID0gcGFyZW50VG1wbFxuXHRcdFx0PyBzdG9yZU5hbWUgPT09IFwidmlld01vZGVsXCJcblx0XHRcdFx0PyBwYXJlbnRUbXBsXG5cdFx0XHRcdDogKHBhcmVudFRtcGxbc3RvcmVOYW1lc10gPSBwYXJlbnRUbXBsW3N0b3JlTmFtZXNdIHx8IHt9KVxuXHRcdFx0OiB0aGVTdG9yZTtcblx0XHRjb21waWxlID0gc3RvcmVTZXR0aW5ncy5jb21waWxlO1xuXHRcdGlmIChpdGVtID09PSBudWxsKSB7XG5cdFx0XHQvLyBJZiBpdGVtIGlzIG51bGwsIGRlbGV0ZSB0aGlzIGVudHJ5XG5cdFx0XHRpZiAobmFtZSkge1xuXHRcdFx0XHRkZWxldGUgdGhpc1N0b3JlW25hbWVdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpdGVtID0gY29tcGlsZSA/IGNvbXBpbGUuY2FsbCh0aGlzU3RvcmUsIG5hbWUsIGl0ZW0sIHBhcmVudFRtcGwsIDApIDogaXRlbTtcblx0XHRcdGlmIChuYW1lKSB7XG5cdFx0XHRcdHRoaXNTdG9yZVtuYW1lXSA9IGl0ZW07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjb21waWxlICYmIGl0ZW0pIHtcblx0XHRcdGl0ZW0uX2lzID0gc3RvcmVOYW1lOyAvLyBPbmx5IGRvIHRoaXMgZm9yIGNvbXBpbGVkIG9iamVjdHMgKHRhZ3MsIHRlbXBsYXRlcy4uLilcblx0XHR9XG5cdFx0aWYgKGl0ZW0gJiYgKG9uU3RvcmUgPSAkc3ViLm9uU3RvcmVbc3RvcmVOYW1lXSkpIHtcblx0XHRcdC8vIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0b25TdG9yZShuYW1lLCBpdGVtLCBjb21waWxlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGl0ZW07XG5cdH1cblxuXHR2YXIgc3RvcmVOYW1lcyA9IHN0b3JlTmFtZSArIFwic1wiO1xuXG5cdCR2aWV3c1tzdG9yZU5hbWVzXSA9IHRoZVN0b3JlO1xufVxuXG5mdW5jdGlvbiBhZGRTZXR0aW5nKHN0KSB7XG5cdCR2aWV3c1NldHRpbmdzW3N0XSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcblx0XHRcdD8gKCRzdWJTZXR0aW5nc1tzdF0gPSB2YWx1ZSwgJHZpZXdzU2V0dGluZ3MpXG5cdFx0XHQ6ICRzdWJTZXR0aW5nc1tzdF07XG5cdH07XG59XG5cbi8vPT09PT09PT09XG4vLyBkYXRhTWFwXG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBkYXRhTWFwKG1hcERlZikge1xuXHRmdW5jdGlvbiBNYXAoc291cmNlLCBvcHRpb25zKSB7XG5cdFx0dGhpcy50Z3QgPSBtYXBEZWYuZ2V0VGd0KHNvdXJjZSwgb3B0aW9ucyk7XG5cdH1cblxuXHRpZiAoJGlzRnVuY3Rpb24obWFwRGVmKSkge1xuXHRcdC8vIFNpbXBsZSBtYXAgZGVjbGFyZWQgYXMgZnVuY3Rpb25cblx0XHRtYXBEZWYgPSB7XG5cdFx0XHRnZXRUZ3Q6IG1hcERlZlxuXHRcdH07XG5cdH1cblxuXHRpZiAobWFwRGVmLmJhc2VNYXApIHtcblx0XHRtYXBEZWYgPSAkZXh0ZW5kKCRleHRlbmQoe30sIG1hcERlZi5iYXNlTWFwKSwgbWFwRGVmKTtcblx0fVxuXG5cdG1hcERlZi5tYXAgPSBmdW5jdGlvbihzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gbmV3IE1hcChzb3VyY2UsIG9wdGlvbnMpO1xuXHR9O1xuXHRyZXR1cm4gbWFwRGVmO1xufVxuXG4vLz09PT09PT09PT09PT09XG4vLyByZW5kZXJDb250ZW50XG4vLz09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIGtleSwgb25SZW5kZXIpIHtcblx0dmFyIGksIGwsIHRhZywgdG1wbCwgdGFnQ3R4LCBpc1RvcFJlbmRlckNhbGwsIHByZXZEYXRhLCBwcmV2SW5kZXgsXG5cdFx0dmlldyA9IHBhcmVudFZpZXcsXG5cdFx0cmVzdWx0ID0gXCJcIjtcblxuXHRpZiAoY29udGV4dCA9PT0gdHJ1ZSkge1xuXHRcdG5vSXRlcmF0aW9uID0gY29udGV4dDsgLy8gcGFzc2luZyBib29sZWFuIGFzIHNlY29uZCBwYXJhbSAtIG5vSXRlcmF0aW9uXG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICh0eXBlb2YgY29udGV4dCAhPT0gT0JKRUNUKSB7XG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDsgLy8gY29udGV4dCBtdXN0IGJlIGEgYm9vbGVhbiAobm9JdGVyYXRpb24pIG9yIGEgcGxhaW4gb2JqZWN0XG5cdH1cblxuXHRpZiAodGFnID0gdGhpcy50YWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgY2FsbCBmcm9tIHJlbmRlclRhZyBvciB0YWdDdHgucmVuZGVyKC4uLilcblx0XHR0YWdDdHggPSB0aGlzO1xuXHRcdHZpZXcgPSB2aWV3IHx8IHRhZ0N0eC52aWV3O1xuXHRcdHRtcGwgPSB2aWV3LmdldFRtcGwodGFnLnRlbXBsYXRlIHx8IHRhZ0N0eC50bXBsKTtcblx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdGRhdGEgPSB2aWV3O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBUaGlzIGlzIGEgdGVtcGxhdGUucmVuZGVyKC4uLikgY2FsbFxuXHRcdHRtcGwgPSB0aGlzO1xuXHR9XG5cblx0aWYgKHRtcGwpIHtcblx0XHRpZiAoIXBhcmVudFZpZXcgJiYgZGF0YSAmJiBkYXRhLl9pcyA9PT0gXCJ2aWV3XCIpIHtcblx0XHRcdHZpZXcgPSBkYXRhOyAvLyBXaGVuIHBhc3NpbmcgaW4gYSB2aWV3IHRvIHJlbmRlciBvciBsaW5rIChhbmQgbm90IHBhc3NpbmcgaW4gYSBwYXJlbnQgdmlldykgdXNlIHRoZSBwYXNzZWQtaW4gdmlldyBhcyBwYXJlbnRWaWV3XG5cdFx0fVxuXG5cdFx0aWYgKHZpZXcpIHtcblx0XHRcdGlmIChkYXRhID09PSB2aWV3KSB7XG5cdFx0XHRcdC8vIEluaGVyaXQgdGhlIGRhdGEgZnJvbSB0aGUgcGFyZW50IHZpZXcuXG5cdFx0XHRcdC8vIFRoaXMgbWF5IGJlIHRoZSBjb250ZW50cyBvZiBhbiB7e2lmfX0gYmxvY2tcblx0XHRcdFx0ZGF0YSA9IHZpZXcuZGF0YTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpc1RvcFJlbmRlckNhbGwgPSAhdmlldztcblx0XHRpc1JlbmRlckNhbGwgPSBpc1JlbmRlckNhbGwgfHwgaXNUb3BSZW5kZXJDYWxsO1xuXHRcdGlmICghdmlldykge1xuXHRcdFx0KGNvbnRleHQgPSBjb250ZXh0IHx8IHt9KS5yb290ID0gZGF0YTsgLy8gUHJvdmlkZSB+cm9vdCBhcyBzaG9ydGN1dCB0byB0b3AtbGV2ZWwgZGF0YS5cblx0XHR9XG5cdFx0aWYgKCFpc1JlbmRlckNhbGwgfHwgJHN1YlNldHRpbmdzQWR2YW5jZWQudXNlVmlld3MgfHwgdG1wbC51c2VWaWV3cyB8fCB2aWV3ICYmIHZpZXcgIT09IHRvcFZpZXcpIHtcblx0XHRcdHJlc3VsdCA9IHJlbmRlcldpdGhWaWV3cyh0bXBsLCBkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgdmlldywga2V5LCBvblJlbmRlciwgdGFnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHZpZXcpIHsgLy8gSW4gYSBibG9ja1xuXHRcdFx0XHRwcmV2RGF0YSA9IHZpZXcuZGF0YTtcblx0XHRcdFx0cHJldkluZGV4ID0gdmlldy5pbmRleDtcblx0XHRcdFx0dmlldy5pbmRleCA9IGluZGV4U3RyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmlldyA9IHRvcFZpZXc7XG5cdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGE7XG5cdFx0XHRcdHZpZXcuY3R4ID0gY29udGV4dDtcblx0XHRcdH1cblx0XHRcdGlmICgkaXNBcnJheShkYXRhKSAmJiAhbm9JdGVyYXRpb24pIHtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgdGhlIGFycmF5LCB3aG9zZSBjaGlsZCB2aWV3cyBjb3JyZXNwb25kIHRvIGVhY2ggZGF0YSBpdGVtLiAoTm90ZTogaWYga2V5IGFuZCBwYXJlbnRWaWV3IGFyZSBwYXNzZWQgaW5cblx0XHRcdFx0Ly8gYWxvbmcgd2l0aCBwYXJlbnQgdmlldywgdHJlYXQgYXMgaW5zZXJ0IC1lLmcuIGZyb20gdmlldy5hZGRWaWV3cyAtIHNvIHBhcmVudFZpZXcgaXMgYWxyZWFkeSB0aGUgdmlldyBpdGVtIGZvciBhcnJheSlcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IGRhdGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0dmlldy5pbmRleCA9IGk7XG5cdFx0XHRcdFx0dmlldy5kYXRhID0gZGF0YVtpXTtcblx0XHRcdFx0XHRyZXN1bHQgKz0gdG1wbC5mbihkYXRhW2ldLCB2aWV3LCAkc3ViKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmlldy5kYXRhID0gZGF0YTtcblx0XHRcdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YSwgdmlldywgJHN1Yik7XG5cdFx0XHR9XG5cdFx0XHR2aWV3LmRhdGEgPSBwcmV2RGF0YTtcblx0XHRcdHZpZXcuaW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0fVxuXHRcdGlmIChpc1RvcFJlbmRlckNhbGwpIHtcblx0XHRcdGlzUmVuZGVyQ2FsbCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aFZpZXdzKHRtcGwsIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCB2aWV3LCBrZXksIG9uUmVuZGVyLCB0YWcpIHtcblx0ZnVuY3Rpb24gc2V0SXRlbVZhcihpdGVtKSB7XG5cdFx0Ly8gV2hlbiBpdGVtVmFyIGlzIHNwZWNpZmllZCwgc2V0IG1vZGlmaWVkIGN0eCB3aXRoIHVzZXItbmFtZWQgfml0ZW1cblx0XHRuZXdDdHggPSAkZXh0ZW5kKHt9LCBjb250ZXh0KTtcblx0XHRuZXdDdHhbaXRlbVZhcl0gPSBpdGVtO1xuXHR9XG5cblx0Ly8gUmVuZGVyIHRlbXBsYXRlIGFnYWluc3QgZGF0YSBhcyBhIHRyZWUgb2Ygc3Vidmlld3MgKG5lc3RlZCByZW5kZXJlZCB0ZW1wbGF0ZSBpbnN0YW5jZXMpLCBvciBhcyBhIHN0cmluZyAodG9wLWxldmVsIHRlbXBsYXRlKS5cblx0Ly8gSWYgdGhlIGRhdGEgaXMgdGhlIHBhcmVudCB2aWV3LCB0cmVhdCBhcyBub0l0ZXJhdGlvbiwgcmUtcmVuZGVyIHdpdGggdGhlIHNhbWUgZGF0YSBjb250ZXh0LlxuXHR2YXIgaSwgbCwgbmV3VmlldywgY2hpbGRWaWV3LCBpdGVtUmVzdWx0LCBzd2FwQ29udGVudCwgY29udGVudFRtcGwsIG91dGVyT25SZW5kZXIsIHRtcGxOYW1lLCBpdGVtVmFyLCBuZXdDdHgsIHRhZ0N0eCxcblx0XHRyZXN1bHQgPSBcIlwiO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgY2FsbCBmcm9tIHJlbmRlclRhZyBvciB0YWdDdHgucmVuZGVyKC4uLilcblx0XHR0bXBsTmFtZSA9IHRhZy50YWdOYW1lO1xuXHRcdHRhZ0N0eCA9IHRhZy50YWdDdHg7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgPyBleHRlbmRDdHgoY29udGV4dCwgdGFnLmN0eCkgOiB0YWcuY3R4O1xuXG5cdFx0aWYgKHRtcGwgPT09IHZpZXcuY29udGVudCkgeyAvLyB7e3h4eCB0bXBsPSNjb250ZW50fX1cblx0XHRcdGNvbnRlbnRUbXBsID0gdG1wbCAhPT0gdmlldy5jdHguX3dycCAvLyBXZSBhcmUgcmVuZGVyaW5nIHRoZSAjY29udGVudFxuXHRcdFx0XHQ/IHZpZXcuY3R4Ll93cnAgLy8gI2NvbnRlbnQgd2FzIHRoZSB0YWdDdHgucHJvcHMudG1wbCB3cmFwcGVyIG9mIHRoZSBibG9jayBjb250ZW50IC0gc28gd2l0aGluIHRoaXMgdmlldywgI2NvbnRlbnQgd2lsbCBub3cgYmUgdGhlIHZpZXcuY3R4Ll93cnAgYmxvY2sgY29udGVudFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDsgLy8gI2NvbnRlbnQgd2FzIHRoZSB2aWV3LmN0eC5fd3JwIGJsb2NrIGNvbnRlbnQgLSBzbyB3aXRoaW4gdGhpcyB2aWV3LCB0aGVyZSBpcyBubyBsb25nZXIgYW55ICNjb250ZW50IHRvIHdyYXAuXG5cdFx0fSBlbHNlIGlmICh0bXBsICE9PSB0YWdDdHguY29udGVudCkge1xuXHRcdFx0aWYgKHRtcGwgPT09IHRhZy50ZW1wbGF0ZSkgeyAvLyBSZW5kZXJpbmcge3t0YWd9fSB0YWcudGVtcGxhdGUsIHJlcGxhY2luZyBibG9jayBjb250ZW50LlxuXHRcdFx0XHRjb250ZW50VG1wbCA9IHRhZ0N0eC50bXBsOyAvLyBTZXQgI2NvbnRlbnQgdG8gYmxvY2sgY29udGVudCAob3Igd3JhcHBlZCBibG9jayBjb250ZW50IGlmIHRhZ0N0eC5wcm9wcy50bXBsIGlzIHNldClcblx0XHRcdFx0Y29udGV4dC5fd3JwID0gdGFnQ3R4LmNvbnRlbnQ7IC8vIFBhc3Mgd3JhcHBlZCBibG9jayBjb250ZW50IHRvIG5lc3RlZCB2aWV3c1xuXHRcdFx0fSBlbHNlIHsgLy8gUmVuZGVyaW5nIHRhZ0N0eC5wcm9wcy50bXBsIHdyYXBwZXJcblx0XHRcdFx0Y29udGVudFRtcGwgPSB0YWdDdHguY29udGVudCB8fCB2aWV3LmNvbnRlbnQ7IC8vIFNldCAjY29udGVudCB0byB3cmFwcGVkIGJsb2NrIGNvbnRlbnRcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGVudFRtcGwgPSB2aWV3LmNvbnRlbnQ7IC8vIE5lc3RlZCB2aWV3cyBpbmhlcml0IHNhbWUgd3JhcHBlZCAjY29udGVudCBwcm9wZXJ0eVxuXHRcdH1cblxuXHRcdGlmICh0YWdDdHgucHJvcHMubGluayA9PT0gZmFsc2UpIHtcblx0XHRcdC8vIGxpbms9ZmFsc2Ugc2V0dGluZyBvbiBibG9jayB0YWdcblx0XHRcdC8vIFdlIHdpbGwgb3ZlcnJpZGUgaW5oZXJpdGVkIHZhbHVlIG9mIGxpbmsgYnkgdGhlIGV4cGxpY2l0IHNldHRpbmcgbGluaz1mYWxzZSB0YWtlbiBmcm9tIHByb3BzXG5cdFx0XHQvLyBUaGUgY2hpbGQgdmlld3Mgb2YgYW4gdW5saW5rZWQgdmlldyBhcmUgYWxzbyB1bmxpbmtlZC4gU28gc2V0dGluZyBjaGlsZCBiYWNrIHRvIHRydWUgd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0LlxuXHRcdFx0Y29udGV4dCA9IGNvbnRleHQgfHwge307XG5cdFx0XHRjb250ZXh0LmxpbmsgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbVZhciA9IHRhZ0N0eC5wcm9wcy5pdGVtVmFyKSB7XG5cdFx0XHRpZiAoaXRlbVZhci5jaGFyQXQoMCkgIT09IFwiflwiKSB7XG5cdFx0XHRcdHN5bnRheEVycm9yKFwiVXNlIGl0ZW1WYXI9J35teUl0ZW0nXCIpO1xuXHRcdFx0fVxuXHRcdFx0aXRlbVZhciA9IGl0ZW1WYXIuc2xpY2UoMSk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHZpZXcpIHtcblx0XHRvblJlbmRlciA9IG9uUmVuZGVyIHx8IHZpZXcuXy5vblJlbmRlcjtcblx0XHRjb250ZXh0ID0gZXh0ZW5kQ3R4KGNvbnRleHQsIHZpZXcuY3R4KTtcblx0fVxuXG5cdGlmIChrZXkgPT09IHRydWUpIHtcblx0XHRzd2FwQ29udGVudCA9IHRydWU7XG5cdFx0a2V5ID0gMDtcblx0fVxuXG5cdC8vIElmIGxpbms9PT1mYWxzZSwgZG8gbm90IGNhbGwgb25SZW5kZXIsIHNvIG5vIGRhdGEtbGlua2luZyBtYXJrZXIgbm9kZXNcblx0aWYgKG9uUmVuZGVyICYmIChjb250ZXh0ICYmIGNvbnRleHQubGluayA9PT0gZmFsc2UgfHwgdGFnICYmIHRhZy5fLm5vVndzKSkge1xuXHRcdG9uUmVuZGVyID0gdW5kZWZpbmVkO1xuXHR9XG5cdG91dGVyT25SZW5kZXIgPSBvblJlbmRlcjtcblx0aWYgKG9uUmVuZGVyID09PSB0cnVlKSB7XG5cdFx0Ly8gVXNlZCBieSB2aWV3LnJlZnJlc2goKS4gRG9uJ3QgY3JlYXRlIGEgbmV3IHdyYXBwZXIgdmlldy5cblx0XHRvdXRlck9uUmVuZGVyID0gdW5kZWZpbmVkO1xuXHRcdG9uUmVuZGVyID0gdmlldy5fLm9uUmVuZGVyO1xuXHR9XG5cdC8vIFNldCBhZGRpdGlvbmFsIGNvbnRleHQgb24gdmlld3MgY3JlYXRlZCBoZXJlLCAoYXMgbW9kaWZpZWQgY29udGV4dCBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50LCBhbmQgdG8gYmUgaW5oZXJpdGVkIGJ5IGNoaWxkIHZpZXdzKVxuXHRjb250ZXh0ID0gdG1wbC5oZWxwZXJzXG5cdFx0PyBleHRlbmRDdHgodG1wbC5oZWxwZXJzLCBjb250ZXh0KVxuXHRcdDogY29udGV4dDtcblxuXHRuZXdDdHggPSBjb250ZXh0O1xuXHRpZiAoJGlzQXJyYXkoZGF0YSkgJiYgIW5vSXRlcmF0aW9uKSB7XG5cdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgdGhlIGFycmF5LCB3aG9zZSBjaGlsZCB2aWV3cyBjb3JyZXNwb25kIHRvIGVhY2ggZGF0YSBpdGVtLiAoTm90ZTogaWYga2V5IGFuZCB2aWV3IGFyZSBwYXNzZWQgaW5cblx0XHQvLyBhbG9uZyB3aXRoIHBhcmVudCB2aWV3LCB0cmVhdCBhcyBpbnNlcnQgLWUuZy4gZnJvbSB2aWV3LmFkZFZpZXdzIC0gc28gdmlldyBpcyBhbHJlYWR5IHRoZSB2aWV3IGl0ZW0gZm9yIGFycmF5KVxuXHRcdG5ld1ZpZXcgPSBzd2FwQ29udGVudFxuXHRcdFx0PyB2aWV3XG5cdFx0XHQ6IChrZXkgIT09IHVuZGVmaW5lZCAmJiB2aWV3KVxuXHRcdFx0XHR8fCBuZXcgVmlldyhjb250ZXh0LCBcImFycmF5XCIsIHZpZXcsIGRhdGEsIHRtcGwsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKTtcblx0XHRpZiAodmlldyAmJiB2aWV3Ll8udXNlS2V5KSB7XG5cdFx0XHQvLyBQYXJlbnQgaXMgbm90IGFuICdhcnJheSB2aWV3J1xuXHRcdFx0bmV3Vmlldy5fLmJuZCA9ICF0YWcgfHwgdGFnLl8uYm5kICYmIHRhZzsgLy8gRm9yIGFycmF5IHZpZXdzIHRoYXQgYXJlIGRhdGEgYm91bmQgZm9yIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cywgc2V0IHRoZVxuXHRcdFx0Ly8gdmlldy5fLmJuZCBwcm9wZXJ0eSB0byB0cnVlIGZvciB0b3AtbGV2ZWwgbGluaygpIG9yIGRhdGEtbGluaz1cIntmb3J9XCIsIG9yIHRvIHRoZSB0YWcgaW5zdGFuY2UgZm9yIGEgZGF0YS1ib3VuZCB0YWcsIGUuZy4ge157Zm9yIC4uLn19XG5cdFx0fVxuXHRcdGlmIChpdGVtVmFyKSB7XG5cdFx0XHRuZXdWaWV3Lml0ID0gaXRlbVZhcjtcblx0XHR9XG5cdFx0aXRlbVZhciA9IG5ld1ZpZXcuaXQ7XG5cdFx0Zm9yIChpID0gMCwgbCA9IGRhdGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciBlYWNoIGRhdGEgaXRlbS5cblx0XHRcdGlmIChpdGVtVmFyKSB7XG5cdFx0XHRcdHNldEl0ZW1WYXIoZGF0YVtpXSk7IC8vIHVzZSBtb2RpZmllZCBjdHggd2l0aCB1c2VyLW5hbWVkIH5pdGVtXG5cdFx0XHR9XG5cdFx0XHRjaGlsZFZpZXcgPSBuZXcgVmlldyhuZXdDdHgsIFwiaXRlbVwiLCBuZXdWaWV3LCBkYXRhW2ldLCB0bXBsLCAoa2V5IHx8IDApICsgaSwgb25SZW5kZXIsIG5ld1ZpZXcuY29udGVudCk7XG5cblx0XHRcdGl0ZW1SZXN1bHQgPSB0bXBsLmZuKGRhdGFbaV0sIGNoaWxkVmlldywgJHN1Yik7XG5cdFx0XHRyZXN1bHQgKz0gbmV3Vmlldy5fLm9uUmVuZGVyID8gbmV3Vmlldy5fLm9uUmVuZGVyKGl0ZW1SZXN1bHQsIGNoaWxkVmlldykgOiBpdGVtUmVzdWx0O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciBzaW5nbGV0b24gZGF0YSBvYmplY3QuIFRoZSB0eXBlIG9mIHRoZSB2aWV3IHdpbGwgYmUgdGhlIHRhZyBuYW1lLCBlLmcuIFwiaWZcIiBvciBcIm15VGFnXCIgZXhjZXB0IGZvclxuXHRcdC8vIFwiaXRlbVwiLCBcImFycmF5XCIgYW5kIFwiZGF0YVwiIHZpZXdzLiBBIFwiZGF0YVwiIHZpZXcgaXMgZnJvbSBwcm9ncmFtbWF0aWMgcmVuZGVyKG9iamVjdCkgYWdhaW5zdCBhICdzaW5nbGV0b24nLlxuXHRcdGlmIChpdGVtVmFyKSB7XG5cdFx0XHRzZXRJdGVtVmFyKGRhdGEpO1xuXHRcdH1cblx0XHRuZXdWaWV3ID0gc3dhcENvbnRlbnQgPyB2aWV3IDogbmV3IFZpZXcobmV3Q3R4LCB0bXBsTmFtZSB8fCBcImRhdGFcIiwgdmlldywgZGF0YSwgdG1wbCwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpO1xuXHRcdGlmICh0YWcgJiYgIXRhZy5mbG93KSB7XG5cdFx0XHRuZXdWaWV3LnRhZyA9IHRhZztcblx0XHRcdHRhZy52aWV3ID0gbmV3Vmlldztcblx0XHR9XG5cdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YSwgbmV3VmlldywgJHN1Yik7XG5cdH1cblx0cmV0dXJuIG91dGVyT25SZW5kZXIgPyBvdXRlck9uUmVuZGVyKHJlc3VsdCwgbmV3VmlldykgOiByZXN1bHQ7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCdWlsZCBhbmQgY29tcGlsZSB0ZW1wbGF0ZVxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gR2VuZXJhdGUgYSByZXVzYWJsZSBmdW5jdGlvbiB0aGF0IHdpbGwgc2VydmUgdG8gcmVuZGVyIGEgdGVtcGxhdGUgYWdhaW5zdCBkYXRhXG4vLyAoQ29tcGlsZSBBU1QgdGhlbiBidWlsZCB0ZW1wbGF0ZSBmdW5jdGlvbilcblxuZnVuY3Rpb24gb25SZW5kZXJFcnJvcihlLCB2aWV3LCBmYWxsYmFjaykge1xuXHR2YXIgbWVzc2FnZSA9IGZhbGxiYWNrICE9PSB1bmRlZmluZWRcblx0XHQ/ICRpc0Z1bmN0aW9uKGZhbGxiYWNrKVxuXHRcdFx0PyBmYWxsYmFjay5jYWxsKHZpZXcuZGF0YSwgZSwgdmlldylcblx0XHRcdDogZmFsbGJhY2sgfHwgXCJcIlxuXHRcdDogXCJ7RXJyb3I6IFwiICsgZS5tZXNzYWdlICsgXCJ9XCI7XG5cblx0aWYgKCRzdWJTZXR0aW5ncy5vbkVycm9yICYmIChmYWxsYmFjayA9ICRzdWJTZXR0aW5ncy5vbkVycm9yLmNhbGwodmlldy5kYXRhLCBlLCBmYWxsYmFjayAmJiBtZXNzYWdlLCB2aWV3KSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdG1lc3NhZ2UgPSBmYWxsYmFjazsgLy8gVGhlcmUgaXMgYSBzZXR0aW5ncy5kZWJ1Z01vZGUoaGFuZGxlcikgb25FcnJvciBvdmVycmlkZS4gQ2FsbCBpdCwgYW5kIHVzZSByZXR1cm4gdmFsdWUgKGlmIGFueSkgdG8gcmVwbGFjZSBtZXNzYWdlXG5cdH1cblxuXHRyZXR1cm4gdmlldyAmJiAhdmlldy5saW5rQ3R4ID8gJGNvbnZlcnRlcnMuaHRtbChtZXNzYWdlKSA6IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGVycm9yKG1lc3NhZ2UpIHtcblx0dGhyb3cgbmV3ICRzdWIuRXJyKG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBzeW50YXhFcnJvcihtZXNzYWdlKSB7XG5cdGVycm9yKFwiU3ludGF4IGVycm9yXFxuXCIgKyBtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gdG1wbEZuKG1hcmt1cCwgdG1wbCwgaXNMaW5rRXhwciwgY29udmVydEJhY2ssIGhhc0Vsc2UpIHtcblx0Ly8gQ29tcGlsZSBtYXJrdXAgdG8gQVNUIChhYnRyYWN0IHN5bnRheCB0cmVlKSB0aGVuIGJ1aWxkIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBjb2RlIGZyb20gdGhlIEFTVCBub2Rlc1xuXHQvLyBVc2VkIGZvciBjb21waWxpbmcgdGVtcGxhdGVzLCBhbmQgYWxzbyBieSBKc1ZpZXdzIHRvIGJ1aWxkIGZ1bmN0aW9ucyBmb3IgZGF0YSBsaW5rIGV4cHJlc3Npb25zXG5cblx0Ly89PT09IG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXHRmdW5jdGlvbiBwdXNocHJlY2VkaW5nQ29udGVudChzaGlmdCkge1xuXHRcdHNoaWZ0IC09IGxvYztcblx0XHRpZiAoc2hpZnQpIHtcblx0XHRcdGNvbnRlbnQucHVzaChtYXJrdXAuc3Vic3RyKGxvYywgc2hpZnQpLnJlcGxhY2Uock5ld0xpbmUsIFwiXFxcXG5cIikpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGJsb2NrVGFnQ2hlY2sodGFnTmFtZSwgYmxvY2spIHtcblx0XHRpZiAodGFnTmFtZSkge1xuXHRcdFx0dGFnTmFtZSArPSAnfX0nO1xuXHRcdFx0Ly9cdFx0XHQne3tpbmNsdWRlfX0gYmxvY2sgaGFzIHt7L2Zvcn19IHdpdGggbm8gb3BlbiB7e2Zvcn19J1xuXHRcdFx0c3ludGF4RXJyb3IoKFxuXHRcdFx0XHRibG9ja1xuXHRcdFx0XHRcdD8gJ3t7JyArIGJsb2NrICsgJ319IGJsb2NrIGhhcyB7ey8nICsgdGFnTmFtZSArICcgd2l0aG91dCB7eycgKyB0YWdOYW1lXG5cdFx0XHRcdFx0OiAnVW5tYXRjaGVkIG9yIG1pc3Npbmcge3svJyArIHRhZ05hbWUpICsgJywgaW4gdGVtcGxhdGU6XFxuJyArIG1hcmt1cCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VUYWcoYWxsLCBiaW5kLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIGNvbG9uLCBodG1sLCBjb2RlVGFnLCBwYXJhbXMsIHNsYXNoLCBiaW5kMiwgY2xvc2VCbG9jaywgaW5kZXgpIHtcbi8qXG5cbiAgICAgYmluZCAgICAgdGFnTmFtZSAgICAgICAgIGN2dCAgIGNsbiBodG1sIGNvZGUgICAgcGFyYW1zICAgICAgICAgICAgc2xhc2ggICBiaW5kMiAgICAgICAgIGNsb3NlQmxrICBjb21tZW50XG4vKD86eyhcXF4pP3soPzooXFx3Kyg/PVtcXC9cXHN9XSkpfChcXHcrKT8oOil8KD4pfChcXCopKVxccyooKD86W159XXx9KD8hfSkpKj8pKFxcLyk/fHsoXFxeKT97KD86KD86XFwvKFxcdyspKVxccyp8IS0tW1xcc1xcU10qPy0tKSl9fS9nXG5cbig/OlxuICB7KFxcXik/eyAgICAgICAgICAgIGJpbmRcbiAgKD86XG4gICAgKFxcdysgICAgICAgICAgICAgdGFnTmFtZVxuICAgICAgKD89W1xcL1xcc31dKVxuICAgIClcbiAgICB8XG4gICAgKFxcdyspPyg6KSAgICAgICAgY29udmVydGVyIGNvbG9uXG4gICAgfFxuICAgICg+KSAgICAgICAgICAgICAgaHRtbFxuICAgIHxcbiAgICAoXFwqKSAgICAgICAgICAgICBjb2RlVGFnXG4gIClcbiAgXFxzKlxuICAoICAgICAgICAgICAgICAgICAgcGFyYW1zXG4gICAgKD86W159XXx9KD8hfSkpKj9cbiAgKVxuICAoXFwvKT8gICAgICAgICAgICAgIHNsYXNoXG4gIHxcbiAgeyhcXF4pP3sgICAgICAgICAgICBiaW5kMlxuICAoPzpcbiAgICAoPzpcXC8oXFx3KykpXFxzKiAgIGNsb3NlQmxvY2tcbiAgICB8XG4gICAgIS0tW1xcc1xcU10qPy0tICAgIGNvbW1lbnRcbiAgKVxuKVxufX0vZ1xuXG4qL1xuXHRcdGlmIChjb2RlVGFnICYmIGJpbmQgfHwgc2xhc2ggJiYgIXRhZ05hbWUgfHwgcGFyYW1zICYmIHBhcmFtcy5zbGljZSgtMSkgPT09IFwiOlwiIHx8IGJpbmQyKSB7XG5cdFx0XHRzeW50YXhFcnJvcihhbGwpO1xuXHRcdH1cblxuXHRcdC8vIEJ1aWxkIGFic3RyYWN0IHN5bnRheCB0cmVlIChBU1QpOiBbdGFnTmFtZSwgY29udmVydGVyLCBwYXJhbXMsIGNvbnRlbnQsIGhhc2gsIGJpbmRpbmdzLCBjb250ZW50TWFya3VwXVxuXHRcdGlmIChodG1sKSB7XG5cdFx0XHRjb2xvbiA9IFwiOlwiO1xuXHRcdFx0Y29udmVydGVyID0gSFRNTDtcblx0XHR9XG5cdFx0c2xhc2ggPSBzbGFzaCB8fCBpc0xpbmtFeHByICYmICFoYXNFbHNlO1xuXG5cdFx0dmFyIHBhdGhCaW5kaW5ncyA9IChiaW5kIHx8IGlzTGlua0V4cHIpICYmIFtbXV0sXG5cdFx0XHRwcm9wcyA9IFwiXCIsXG5cdFx0XHRhcmdzID0gXCJcIixcblx0XHRcdGN0eFByb3BzID0gXCJcIixcblx0XHRcdHBhcmFtc0FyZ3MgPSBcIlwiLFxuXHRcdFx0cGFyYW1zUHJvcHMgPSBcIlwiLFxuXHRcdFx0cGFyYW1zQ3R4UHJvcHMgPSBcIlwiLFxuXHRcdFx0b25FcnJvciA9IFwiXCIsXG5cdFx0XHR1c2VUcmlnZ2VyID0gXCJcIixcblx0XHRcdC8vIEJsb2NrIHRhZyBpZiBub3Qgc2VsZi1jbG9zaW5nIGFuZCBub3Qge3s6fX0gb3Ige3s+fX0gKHNwZWNpYWwgY2FzZSkgYW5kIG5vdCBhIGRhdGEtbGluayBleHByZXNzaW9uXG5cdFx0XHRibG9jayA9ICFzbGFzaCAmJiAhY29sb247XG5cblx0XHQvLz09PT0gbmVzdGVkIGhlbHBlciBmdW5jdGlvbiA9PT09XG5cdFx0dGFnTmFtZSA9IHRhZ05hbWUgfHwgKHBhcmFtcyA9IHBhcmFtcyB8fCBcIiNkYXRhXCIsIGNvbG9uKTsgLy8ge3s6fX0gaXMgZXF1aXZhbGVudCB0byB7ezojZGF0YX19XG5cdFx0cHVzaHByZWNlZGluZ0NvbnRlbnQoaW5kZXgpO1xuXHRcdGxvYyA9IGluZGV4ICsgYWxsLmxlbmd0aDsgLy8gbG9jYXRpb24gbWFya2VyIC0gcGFyc2VkIHVwIHRvIGhlcmVcblx0XHRpZiAoY29kZVRhZykge1xuXHRcdFx0aWYgKGFsbG93Q29kZSkge1xuXHRcdFx0XHRjb250ZW50LnB1c2goW1wiKlwiLCBcIlxcblwiICsgcGFyYW1zLnJlcGxhY2UoL146LywgXCJyZXQrPSBcIikucmVwbGFjZShyVW5lc2NhcGVRdW90ZXMsIFwiJDFcIikgKyBcIjtcXG5cIl0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGFnTmFtZSkge1xuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwiZWxzZVwiKSB7XG5cdFx0XHRcdGlmIChyVGVzdEVsc2VJZi50ZXN0KHBhcmFtcykpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcignZm9yIFwie3tlbHNlIGlmIGV4cHJ9fVwiIHVzZSBcInt7ZWxzZSBleHByfX1cIicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGhCaW5kaW5ncyA9IGN1cnJlbnRbN10gJiYgW1tdXTtcblx0XHRcdFx0Y3VycmVudFs4XSA9IG1hcmt1cC5zdWJzdHJpbmcoY3VycmVudFs4XSwgaW5kZXgpOyAvLyBjb250ZW50TWFya3VwIGZvciBibG9jayB0YWdcblx0XHRcdFx0Y3VycmVudCA9IHN0YWNrLnBvcCgpO1xuXHRcdFx0XHRjb250ZW50ID0gY3VycmVudFsyXTtcblx0XHRcdFx0YmxvY2sgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcykge1xuXHRcdFx0XHQvLyByZW1vdmUgbmV3bGluZXMgZnJvbSB0aGUgcGFyYW1zIHN0cmluZywgdG8gYXZvaWQgY29tcGlsZWQgY29kZSBlcnJvcnMgZm9yIHVudGVybWluYXRlZCBzdHJpbmdzXG5cdFx0XHRcdHBhcnNlUGFyYW1zKHBhcmFtcy5yZXBsYWNlKHJOZXdMaW5lLCBcIiBcIiksIHBhdGhCaW5kaW5ncywgdG1wbClcblx0XHRcdFx0XHQucmVwbGFjZShyQnVpbGRIYXNoLCBmdW5jdGlvbihhbGwsIG9uZXJyb3IsIGlzQ3R4LCBrZXksIGtleVRva2VuLCBrZXlWYWx1ZSwgYXJnLCBwYXJhbSkge1xuXHRcdFx0XHRcdFx0a2V5ID0gXCInXCIgKyBrZXlUb2tlbiArIFwiJzpcIjtcblx0XHRcdFx0XHRcdGlmIChhcmcpIHtcblx0XHRcdFx0XHRcdFx0YXJncyArPSBrZXlWYWx1ZSArIFwiLFwiO1xuXHRcdFx0XHRcdFx0XHRwYXJhbXNBcmdzICs9IFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGlzQ3R4KSB7XG5cdFx0XHRcdFx0XHRcdGN0eFByb3BzICs9IGtleSArICdqLl9jcCgnICsga2V5VmFsdWUgKyAnLFwiJyArIHBhcmFtICsgJ1wiLHZpZXcpLCc7XG5cdFx0XHRcdFx0XHRcdC8vIENvbXBpbGVkIGNvZGUgZm9yIGV2YWx1YXRpbmcgdGFnQ3R4IG9uIGEgdGFnIHdpbGwgaGF2ZTogY3R4OnsnZm9vJzpqLl9jcChjb21waWxlZEV4cHIsIFwiZXhwclwiLCB2aWV3KX1cblx0XHRcdFx0XHRcdFx0cGFyYW1zQ3R4UHJvcHMgKz0ga2V5ICsgXCInXCIgKyBwYXJhbSArIFwiJyxcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob25lcnJvcikge1xuXHRcdFx0XHRcdFx0XHRvbkVycm9yICs9IGtleVZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0aWYgKGtleVRva2VuID09PSBcInRyaWdnZXJcIikge1xuXHRcdFx0XHRcdFx0XHRcdHVzZVRyaWdnZXIgKz0ga2V5VmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cHJvcHMgKz0ga2V5ICsga2V5VmFsdWUgKyBcIixcIjtcblx0XHRcdFx0XHRcdFx0cGFyYW1zUHJvcHMgKz0ga2V5ICsgXCInXCIgKyBwYXJhbSArIFwiJyxcIjtcblx0XHRcdFx0XHRcdFx0aGFzSGFuZGxlcnMgPSBoYXNIYW5kbGVycyB8fCBySGFzSGFuZGxlcnMudGVzdChrZXlUb2tlbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRcdFx0XHR9KS5zbGljZSgwLCAtMSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwYXRoQmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzWzBdKSB7XG5cdFx0XHRcdHBhdGhCaW5kaW5ncy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBiaW5kaW5ncyB0aGF0IHdhcyBwcmVwYXJlZCBmb3IgbmV4dCBhcmcuIChUaGVyZSBpcyBhbHdheXMgYW4gZXh0cmEgb25lIHJlYWR5KS5cblx0XHRcdH1cblxuXHRcdFx0bmV3Tm9kZSA9IFtcblx0XHRcdFx0XHR0YWdOYW1lLFxuXHRcdFx0XHRcdGNvbnZlcnRlciB8fCAhIWNvbnZlcnRCYWNrIHx8IGhhc0hhbmRsZXJzIHx8IFwiXCIsXG5cdFx0XHRcdFx0YmxvY2sgJiYgW10sXG5cdFx0XHRcdFx0cGFyc2VkUGFyYW0ocGFyYW1zQXJncyB8fCAodGFnTmFtZSA9PT0gXCI6XCIgPyBcIicjZGF0YScsXCIgOiBcIlwiKSwgcGFyYW1zUHJvcHMsIHBhcmFtc0N0eFByb3BzKSwgLy8ge3s6fX0gZXF1aXZhbGVudCB0byB7ezojZGF0YX19XG5cdFx0XHRcdFx0cGFyc2VkUGFyYW0oYXJncyB8fCAodGFnTmFtZSA9PT0gXCI6XCIgPyBcImRhdGEsXCIgOiBcIlwiKSwgcHJvcHMsIGN0eFByb3BzKSxcblx0XHRcdFx0XHRvbkVycm9yLFxuXHRcdFx0XHRcdHVzZVRyaWdnZXIsXG5cdFx0XHRcdFx0cGF0aEJpbmRpbmdzIHx8IDBcblx0XHRcdFx0XTtcblx0XHRcdGNvbnRlbnQucHVzaChuZXdOb2RlKTtcblx0XHRcdGlmIChibG9jaykge1xuXHRcdFx0XHRzdGFjay5wdXNoKGN1cnJlbnQpO1xuXHRcdFx0XHRjdXJyZW50ID0gbmV3Tm9kZTtcblx0XHRcdFx0Y3VycmVudFs4XSA9IGxvYzsgLy8gU3RvcmUgY3VycmVudCBsb2NhdGlvbiBvZiBvcGVuIHRhZywgdG8gYmUgYWJsZSB0byBhZGQgY29udGVudE1hcmt1cCB3aGVuIHdlIHJlYWNoIGNsb3NpbmcgdGFnXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjbG9zZUJsb2NrKSB7XG5cdFx0XHRibG9ja1RhZ0NoZWNrKGNsb3NlQmxvY2sgIT09IGN1cnJlbnRbMF0gJiYgY3VycmVudFswXSAhPT0gXCJlbHNlXCIgJiYgY2xvc2VCbG9jaywgY3VycmVudFswXSk7XG5cdFx0XHRjdXJyZW50WzhdID0gbWFya3VwLnN1YnN0cmluZyhjdXJyZW50WzhdLCBpbmRleCk7IC8vIGNvbnRlbnRNYXJrdXAgZm9yIGJsb2NrIHRhZ1xuXHRcdFx0Y3VycmVudCA9IHN0YWNrLnBvcCgpO1xuXHRcdH1cblx0XHRibG9ja1RhZ0NoZWNrKCFjdXJyZW50ICYmIGNsb3NlQmxvY2spO1xuXHRcdGNvbnRlbnQgPSBjdXJyZW50WzJdO1xuXHR9XG5cdC8vPT09PSAvZW5kIG9mIG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXG5cdHZhciBpLCByZXN1bHQsIG5ld05vZGUsIGhhc0hhbmRsZXJzLCBiaW5kaW5ncyxcblx0XHRhbGxvd0NvZGUgPSAkc3ViU2V0dGluZ3MuYWxsb3dDb2RlIHx8IHRtcGwgJiYgdG1wbC5hbGxvd0NvZGVcblx0XHRcdHx8ICR2aWV3c1NldHRpbmdzLmFsbG93Q29kZSA9PT0gdHJ1ZSwgLy8gaW5jbHVkZSBkaXJlY3Qgc2V0dGluZyBvZiBzZXR0aW5ncy5hbGxvd0NvZGUgdHJ1ZSBmb3IgYmFja3dhcmQgY29tcGF0IG9ubHlcblx0XHRhc3RUb3AgPSBbXSxcblx0XHRsb2MgPSAwLFxuXHRcdHN0YWNrID0gW10sXG5cdFx0Y29udGVudCA9IGFzdFRvcCxcblx0XHRjdXJyZW50ID0gWywsYXN0VG9wXTtcblxuXHRpZiAoYWxsb3dDb2RlICYmIHRtcGwuX2lzKSB7XG5cdFx0dG1wbC5hbGxvd0NvZGUgPSBhbGxvd0NvZGU7XG5cdH1cblxuLy9UT0RPXHRyZXN1bHQgPSB0bXBsRm5zQ2FjaGVbbWFya3VwXTsgLy8gT25seSBjYWNoZSBpZiB0ZW1wbGF0ZSBpcyBub3QgbmFtZWQgYW5kIG1hcmt1cCBsZW5ndGggPCAuLi4sXG4vL2FuZCB0aGVyZSBhcmUgbm8gYmluZGluZ3Mgb3Igc3VidGVtcGxhdGVzPz8gQ29uc2lkZXIgc3RhbmRhcmQgb3B0aW1pemF0aW9uIGZvciBkYXRhLWxpbms9XCJhLmIuY1wiXG4vL1x0XHRpZiAocmVzdWx0KSB7XG4vL1x0XHRcdHRtcGwuZm4gPSByZXN1bHQ7XG4vL1x0XHR9IGVsc2Uge1xuXG4vL1x0XHRyZXN1bHQgPSBtYXJrdXA7XG5cdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0aWYgKGNvbnZlcnRCYWNrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG1hcmt1cCA9IG1hcmt1cC5zbGljZSgwLCAtY29udmVydEJhY2subGVuZ3RoIC0gMikgKyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0fVxuXHRcdG1hcmt1cCA9IGRlbGltT3BlbkNoYXIwICsgbWFya3VwICsgZGVsaW1DbG9zZUNoYXIxO1xuXHR9XG5cblx0YmxvY2tUYWdDaGVjayhzdGFja1swXSAmJiBzdGFja1swXVsyXS5wb3AoKVswXSk7XG5cdC8vIEJ1aWxkIHRoZSBBU1QgKGFic3RyYWN0IHN5bnRheCB0cmVlKSB1bmRlciBhc3RUb3Bcblx0bWFya3VwLnJlcGxhY2UoclRhZywgcGFyc2VUYWcpO1xuXG5cdHB1c2hwcmVjZWRpbmdDb250ZW50KG1hcmt1cC5sZW5ndGgpO1xuXG5cdGlmIChsb2MgPSBhc3RUb3BbYXN0VG9wLmxlbmd0aCAtIDFdKSB7XG5cdFx0YmxvY2tUYWdDaGVjayhcIlwiICsgbG9jICE9PSBsb2MgJiYgKCtsb2NbOF0gPT09IGxvY1s4XSkgJiYgbG9jWzBdKTtcblx0fVxuLy9cdFx0XHRyZXN1bHQgPSB0bXBsRm5zQ2FjaGVbbWFya3VwXSA9IGJ1aWxkQ29kZShhc3RUb3AsIHRtcGwpO1xuLy9cdFx0fVxuXG5cdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0cmVzdWx0ID0gYnVpbGRDb2RlKGFzdFRvcCwgbWFya3VwLCBpc0xpbmtFeHByKTtcblx0XHRiaW5kaW5ncyA9IFtdO1xuXHRcdGkgPSBhc3RUb3AubGVuZ3RoO1xuXHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdGJpbmRpbmdzLnVuc2hpZnQoYXN0VG9wW2ldWzddKTsgIC8vIFdpdGggZGF0YS1saW5rIGV4cHJlc3Npb25zLCBwYXRoQmluZGluZ3MgYXJyYXkgZm9yIHRhZ0N0eFtpXSBpcyBhc3RUb3BbaV1bN11cblx0XHR9XG5cdFx0c2V0UGF0aHMocmVzdWx0LCBiaW5kaW5ncyk7XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gYnVpbGRDb2RlKGFzdFRvcCwgdG1wbCk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2V0UGF0aHMoZm4sIHBhdGhzQXJyKSB7XG5cdHZhciBrZXksIHBhdGhzLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBwYXRoc0Fyci5sZW5ndGg7XG5cdGZuLmRlcHMgPSBbXTtcblx0Zm9yICg7IGkgPCBsOyBpKyspIHtcblx0XHRwYXRocyA9IHBhdGhzQXJyW2ldO1xuXHRcdGZvciAoa2V5IGluIHBhdGhzKSB7XG5cdFx0XHRpZiAoa2V5ICE9PSBcIl9qc3Z0b1wiICYmIHBhdGhzLmhhc093blByb3BlcnR5KGtleSkgJiYgcGF0aHNba2V5XS5sZW5ndGgpIHtcblx0XHRcdFx0Zm4uZGVwcyA9IGZuLmRlcHMuY29uY2F0KHBhdGhzW2tleV0pOyAvLyBkZXBzIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBwYXRocyBhcnJheXMgZm9yIHRoZSBkaWZmZXJlbnQgYmluZGluZ3Ncblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Zm4ucGF0aHMgPSBwYXRoczsgLy8gVGhlIGFycmF5IG9mIHBhdGhzIGFycmF5cyBmb3IgdGhlIGRpZmZlcmVudCBiaW5kaW5nc1xufVxuXG5mdW5jdGlvbiBwYXJzZWRQYXJhbShhcmdzLCBwcm9wcywgY3R4KSB7XG5cdHJldHVybiBbYXJncy5zbGljZSgwLCAtMSksIHByb3BzLnNsaWNlKDAsIC0xKSwgY3R4LnNsaWNlKDAsIC0xKV07XG59XG5cbmZ1bmN0aW9uIHBhcmFtU3RydWN0dXJlKHBhcnRzLCB0eXBlKSB7XG5cdHJldHVybiAnXFxuXFx0J1xuXHRcdCsgKHR5cGVcblx0XHRcdD8gdHlwZSArICc6eydcblx0XHRcdDogJycpXG5cdFx0KyAnYXJnczpbJyArIHBhcnRzWzBdICsgJ10nXG5cdFx0KyAocGFydHNbMV0gfHwgIXR5cGVcblx0XHRcdD8gJyxcXG5cXHRwcm9wczp7JyArIHBhcnRzWzFdICsgJ30nXG5cdFx0XHQ6IFwiXCIpXG5cdFx0KyAocGFydHNbMl0gPyAnLFxcblxcdGN0eDp7JyArIHBhcnRzWzJdICsgJ30nIDogXCJcIik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zKHBhcmFtcywgcGF0aEJpbmRpbmdzLCB0bXBsKSB7XG5cblx0ZnVuY3Rpb24gcGFyc2VUb2tlbnMoYWxsLCBsZnRQcm4wLCBsZnRQcm4sIGJvdW5kLCBwYXRoLCBvcGVyYXRvciwgZXJyLCBlcSwgcGF0aDIsIHBybiwgY29tbWEsIGxmdFBybjIsIGFwb3MsIHF1b3QsIHJ0UHJuLCBydFBybkRvdCwgcHJuMiwgc3BhY2UsIGluZGV4LCBmdWxsKSB7XG5cdC8vIC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICBsZnRQcm4wICAgICAgICBsZnRQcm4gICAgICAgIGJvdW5kICAgICAgICAgICAgcGF0aCAgICBvcGVyYXRvciBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcSAgICAgICAgICAgICBwYXRoMiAgICAgICBwcm4gICAgY29tbWEgICBsZnRQcm4yICAgYXBvcyBxdW90ICAgICAgcnRQcm4gcnRQcm5Eb3QgICAgICAgICAgICAgICAgICAgICAgICBwcm4yICBzcGFjZVxuXHRcdC8vIChsZWZ0IHBhcmVuPyBmb2xsb3dlZCBieSAocGF0aD8gZm9sbG93ZWQgYnkgb3BlcmF0b3IpIG9yIChwYXRoIGZvbGxvd2VkIGJ5IHBhcmVuPykpIG9yIGNvbW1hIG9yIGFwb3Mgb3IgcXVvdCBvciByaWdodCBwYXJlbiBvciBzcGFjZVxuXHRcdGZ1bmN0aW9uIHBhcnNlUGF0aChhbGxQYXRoLCBub3QsIG9iamVjdCwgaGVscGVyLCB2aWV3LCB2aWV3UHJvcGVydHksIHBhdGhUb2tlbnMsIGxlYWZUb2tlbikge1xuXHRcdFx0Ly9yUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHRcdFx0Ly8gICAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cdFx0XHR2YXIgc3ViUGF0aCA9IG9iamVjdCA9PT0gXCIuXCI7XG5cdFx0XHRpZiAob2JqZWN0KSB7XG5cdFx0XHRcdHBhdGggPSBwYXRoLnNsaWNlKG5vdC5sZW5ndGgpO1xuXHRcdFx0XHRpZiAoL15cXC4/Y29uc3RydWN0b3IkLy50ZXN0KGxlYWZUb2tlbnx8cGF0aCkpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihhbGxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXN1YlBhdGgpIHtcblx0XHRcdFx0XHRhbGxQYXRoID0gKGhlbHBlclxuXHRcdFx0XHRcdFx0XHQ/ICd2aWV3LmhscChcIicgKyBoZWxwZXIgKyAnXCIpJ1xuXHRcdFx0XHRcdFx0XHQ6IHZpZXdcblx0XHRcdFx0XHRcdFx0XHQ/IFwidmlld1wiXG5cdFx0XHRcdFx0XHRcdFx0OiBcImRhdGFcIilcblx0XHRcdFx0XHRcdCsgKGxlYWZUb2tlblxuXHRcdFx0XHRcdFx0XHQ/ICh2aWV3UHJvcGVydHlcblx0XHRcdFx0XHRcdFx0XHQ/IFwiLlwiICsgdmlld1Byb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0OiBoZWxwZXJcblx0XHRcdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0OiAodmlldyA/IFwiXCIgOiBcIi5cIiArIG9iamVjdClcblx0XHRcdFx0XHRcdFx0XHQpICsgKHBhdGhUb2tlbnMgfHwgXCJcIilcblx0XHRcdFx0XHRcdFx0OiAobGVhZlRva2VuID0gaGVscGVyID8gXCJcIiA6IHZpZXcgPyB2aWV3UHJvcGVydHkgfHwgXCJcIiA6IG9iamVjdCwgXCJcIikpO1xuXG5cdFx0XHRcdFx0YWxsUGF0aCA9IGFsbFBhdGggKyAobGVhZlRva2VuID8gXCIuXCIgKyBsZWFmVG9rZW4gOiBcIlwiKTtcblxuXHRcdFx0XHRcdGFsbFBhdGggPSBub3QgKyAoYWxsUGF0aC5zbGljZSgwLCA5KSA9PT0gXCJ2aWV3LmRhdGFcIlxuXHRcdFx0XHRcdFx0PyBhbGxQYXRoLnNsaWNlKDUpIC8vIGNvbnZlcnQgI3ZpZXcuZGF0YS4uLiB0byBkYXRhLi4uXG5cdFx0XHRcdFx0XHQ6IGFsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChiaW5kaW5ncykge1xuXHRcdFx0XHRcdGJpbmRzID0gbmFtZWQgPT09IFwibGlua1RvXCIgPyAoYmluZHRvID0gcGF0aEJpbmRpbmdzLl9qc3Z0byA9IHBhdGhCaW5kaW5ncy5fanN2dG8gfHwgW10pIDogYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdGlmICh0aGVPYiA9IHN1YlBhdGggJiYgYmluZHNbYmluZHMubGVuZ3RoLTFdKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhlT2IuX2pzdikge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAodGhlT2Iuc2IpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGVPYiA9IHRoZU9iLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0aGVPYi5ibmQpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoID0gXCJeXCIgKyBwYXRoLnNsaWNlKDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoZU9iLnNiID0gcGF0aDtcblx0XHRcdFx0XHRcdFx0dGhlT2IuYm5kID0gdGhlT2IuYm5kIHx8IHBhdGguY2hhckF0KDApID09PSBcIl5cIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YmluZHMucHVzaChwYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGF0aFN0YXJ0W3BhcmVuRGVwdGhdID0gaW5kZXggKyAoc3ViUGF0aCA/IDEgOiAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFsbFBhdGg7XG5cdFx0fVxuXG5cdFx0Ly9ib3VuZCA9IGJpbmRpbmdzICYmIGJvdW5kO1xuXHRcdGlmIChib3VuZCAmJiAhZXEpIHtcblx0XHRcdHBhdGggPSBib3VuZCArIHBhdGg7IC8vIGUuZy4gc29tZS5mbiguLi4pXnNvbWUucGF0aCAtIHNvIGhlcmUgcGF0aCBpcyBcIl5zb21lLnBhdGhcIlxuXHRcdH1cblx0XHRvcGVyYXRvciA9IG9wZXJhdG9yIHx8IFwiXCI7XG5cdFx0bGZ0UHJuID0gbGZ0UHJuIHx8IGxmdFBybjAgfHwgbGZ0UHJuMjtcblx0XHRwYXRoID0gcGF0aCB8fCBwYXRoMjtcblx0XHQvLyBDb3VsZCBkbyB0aGlzIC0gYnV0IG5vdCB3b3J0aCBwZXJmIGNvc3Q/PyA6LVxuXHRcdC8vIGlmICghcGF0aC5sYXN0SW5kZXhPZihcIiNkYXRhLlwiLCAwKSkgeyBwYXRoID0gcGF0aC5zbGljZSg2KTsgfSAvLyBJZiBwYXRoIHN0YXJ0cyB3aXRoIFwiI2RhdGEuXCIsIHJlbW92ZSB0aGF0LlxuXHRcdHBybiA9IHBybiB8fCBwcm4yIHx8IFwiXCI7XG5cblx0XHR2YXIgZXhwciwgZXhwckZuLCBiaW5kcywgdGhlT2IsIG5ld09iLFxuXHRcdFx0cnRTcSA9IFwiKVwiO1xuXG5cdFx0aWYgKHBybiA9PT0gXCJbXCIpIHtcblx0XHRcdHBybiAgPVwiW2ouX3NxKFwiO1xuXHRcdFx0cnRTcSA9IFwiKV1cIjtcblx0XHR9XG5cblx0XHRpZiAoZXJyICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0c3ludGF4RXJyb3IocGFyYW1zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGJpbmRpbmdzICYmIHJ0UHJuRG90ICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgYmluZGluZyB0byBhIHBhdGggaW4gd2hpY2ggYW4gb2JqZWN0IGlzIHJldHVybmVkIGJ5IGEgaGVscGVyL2RhdGEgZnVuY3Rpb24vZXhwcmVzc2lvbiwgZS5nLiBmb28oKV54Lnkgb3IgKGE/YjpjKV54Lnlcblx0XHRcdFx0Ly8gV2UgY3JlYXRlIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gZ2V0IHRoZSBvYmplY3QgaW5zdGFuY2UgKHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGRlcGVuZGVudCBkYXRhIG9mIHRoZSBzdWJleHByZXNzaW9uIGNoYW5nZXMsIHRvIHJldHVybiB0aGUgbmV3IG9iamVjdCwgYW5kIHRyaWdnZXIgcmUtYmluZGluZyBvZiB0aGUgc3Vic2VxdWVudCBwYXRoKVxuXHRcdFx0XHRpZiAoIW5hbWVkIHx8IGJvdW5kTmFtZSB8fCBiaW5kdG8pIHtcblx0XHRcdFx0XHRleHByID0gcGF0aFN0YXJ0W3BhcmVuRGVwdGggLSAxXTtcblx0XHRcdFx0XHRpZiAoZnVsbC5sZW5ndGggLSAxID4gaW5kZXggLSAoZXhwciB8fCAwKSkgeyAvLyBXZSBuZWVkIHRvIGNvbXBpbGUgYSBzdWJleHByZXNzaW9uXG5cdFx0XHRcdFx0XHRleHByID0gZnVsbC5zbGljZShleHByLCBpbmRleCArIGFsbC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0aWYgKGV4cHJGbiAhPT0gdHJ1ZSkgeyAvLyBJZiBub3QgcmVlbnRyYW50IGNhbGwgZHVyaW5nIGNvbXBpbGF0aW9uXG5cdFx0XHRcdFx0XHRcdGJpbmRzID0gYmluZHRvIHx8IGJuZFN0YWNrW3BhcmVuRGVwdGgtMV0uYmQ7XG5cdFx0XHRcdFx0XHRcdC8vIEluc2VydCBleHByT2Igb2JqZWN0LCB0byBiZSB1c2VkIGR1cmluZyBiaW5kaW5nIHRvIHJldHVybiB0aGUgY29tcHV0ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdHRoZU9iID0gYmluZHNbYmluZHMubGVuZ3RoLTFdO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhlT2IgJiYgdGhlT2IucHJtKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKHRoZU9iLnNiICYmIHRoZU9iLnNiLnBybSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhlT2IgPSB0aGVPYi5zYjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bmV3T2IgPSB0aGVPYi5zYiA9IHtwYXRoOiB0aGVPYi5zYiwgYm5kOiB0aGVPYi5ibmR9O1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGJpbmRzLnB1c2gobmV3T2IgPSB7cGF0aDogYmluZHMucG9wKCl9KTsgLy8gSW5zZXJ0IGV4cHJPYiBvYmplY3QsIHRvIGJlIHVzZWQgZHVyaW5nIGJpbmRpbmcgdG8gcmV0dXJuIHRoZSBjb21wdXRlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgLy8gKGUuZy4gXCJzb21lLm9iamVjdCgpXCIgaW4gXCJzb21lLm9iamVjdCgpLmEuYlwiIC0gdG8gYmUgdXNlZCBhcyBjb250ZXh0IGZvciBiaW5kaW5nIHRoZSBmb2xsb3dpbmcgdG9rZW5zIFwiYS5iXCIpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRydFBybkRvdCA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBleHByIC8vIFRoZSBwYXJhbWV0ZXIgb3IgZnVuY3Rpb24gc3ViZXhwcmVzc2lvblxuXHRcdFx0XHRcdFx0XHQrIFwiIG9uZXJyb3I9JydcIiAvLyBzZXQgb25lcnJvcj0nJyBpbiBvcmRlciB0byB3cmFwIGdlbmVyYXRlZCBjb2RlIHdpdGggYSB0cnkgY2F0Y2ggLSByZXR1cm5pbmcgJycgYXMgb2JqZWN0IGluc3RhbmNlIGlmIHRoZXJlIGlzIGFuIGVycm9yL21pc3NpbmcgcGFyZW50XG5cdFx0XHRcdFx0XHRcdCsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0XHRcdFx0ZXhwckZuID0gdG1wbExpbmtzW3J0UHJuRG90XTtcblx0XHRcdFx0XHRcdGlmICghZXhwckZuKSB7XG5cdFx0XHRcdFx0XHRcdHRtcGxMaW5rc1tydFBybkRvdF0gPSB0cnVlOyAvLyBGbGFnIHRoYXQgdGhpcyBleHByRm4gKGZvciBydFBybkRvdCkgaXMgYmVpbmcgY29tcGlsZWRcblx0XHRcdFx0XHRcdFx0dG1wbExpbmtzW3J0UHJuRG90XSA9IGV4cHJGbiA9IHRtcGxGbihydFBybkRvdCwgdG1wbCwgdHJ1ZSk7IC8vIENvbXBpbGUgdGhlIGV4cHJlc3Npb24gKG9yIHVzZSBjYWNoZWQgY29weSBhbHJlYWR5IGluIHRtcGwubGlua3MpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoZXhwckZuICE9PSB0cnVlICYmIG5ld09iKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIG5vdCByZWVudHJhbnQgY2FsbCBkdXJpbmcgY29tcGlsYXRpb25cblx0XHRcdFx0XHRcdFx0bmV3T2IuX2pzdiA9IGV4cHJGbjtcblx0XHRcdFx0XHRcdFx0bmV3T2IucHJtID0gYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdFx0XHRuZXdPYi5ibmQgPSBuZXdPYi5ibmQgfHwgbmV3T2IucGF0aCAmJiBuZXdPYi5wYXRoLmluZGV4T2YoXCJeXCIpID49IDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKGFwb3NlZFxuXHRcdFx0XHQvLyB3aXRoaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmdcblx0XHRcdFx0PyAoYXBvc2VkID0gIWFwb3MsIChhcG9zZWQgPyBhbGwgOiBsZnRQcm4yICsgJ1wiJykpXG5cdFx0XHRcdDogcXVvdGVkXG5cdFx0XHRcdC8vIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ1xuXHRcdFx0XHRcdD8gKHF1b3RlZCA9ICFxdW90LCAocXVvdGVkID8gYWxsIDogbGZ0UHJuMiArICdcIicpKVxuXHRcdFx0XHRcdDpcblx0XHRcdFx0KFxuXHRcdFx0XHRcdChsZnRQcm5cblx0XHRcdFx0XHRcdD8gKHBhdGhTdGFydFtwYXJlbkRlcHRoXSA9IGluZGV4KyssIGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0gPSB7YmQ6IFtdfSwgbGZ0UHJuKVxuXHRcdFx0XHRcdFx0OiBcIlwiKVxuXHRcdFx0XHRcdCsgKHNwYWNlXG5cdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoXG5cdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHQvLyBOZXcgYXJnIG9yIHByb3AgLSBzbyBpbnNlcnQgYmFja3NwYWNlIFxcYiAoXFx4MDgpIGFzIHNlcGFyYXRvciBmb3IgbmFtZWQgcGFyYW1zLCB1c2VkIHN1YnNlcXVlbnRseSBieSByQnVpbGRIYXNoLCBhbmQgcHJlcGFyZSBuZXcgYmluZGluZ3MgYXJyYXlcblx0XHRcdFx0XHRcdFx0OiAocGFyYW1JbmRleCA9IGZ1bGwuc2xpY2UocGFyYW1JbmRleCwgaW5kZXgpLCBuYW1lZFxuXHRcdFx0XHRcdFx0XHRcdD8gKG5hbWVkID0gYm91bmROYW1lID0gYmluZHRvID0gZmFsc2UsIFwiXFxiXCIpXG5cdFx0XHRcdFx0XHRcdFx0OiBcIlxcYixcIikgKyBwYXJhbUluZGV4ICsgKHBhcmFtSW5kZXggPSBpbmRleCArIGFsbC5sZW5ndGgsIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wdXNoKGJuZEN0eC5iZCA9IFtdKSwgXCJcXGJcIilcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogZXFcblx0XHRcdFx0Ly8gbmFtZWQgcGFyYW0uIFJlbW92ZSBiaW5kaW5ncyBmb3IgYXJnIGFuZCBjcmVhdGUgaW5zdGVhZCBiaW5kaW5ncyBhcnJheSBmb3IgcHJvcFxuXHRcdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoICYmIHN5bnRheEVycm9yKHBhcmFtcyksIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wb3AoKSwgbmFtZWQgPSBwYXRoLCBib3VuZE5hbWUgPSBib3VuZCwgcGFyYW1JbmRleCA9IGluZGV4ICsgYWxsLmxlbmd0aCwgYm91bmQgJiYgKGJpbmRpbmdzID0gYm5kQ3R4LmJkID0gcGF0aEJpbmRpbmdzW25hbWVkXSA9IFtdKSwgcGF0aCArICc6Jylcblx0XHRcdFx0XHRcdFx0OiBwYXRoXG5cdFx0XHRcdC8vIHBhdGhcblx0XHRcdFx0XHRcdFx0XHQ/IChwYXRoLnNwbGl0KFwiXlwiKS5qb2luKFwiLlwiKS5yZXBsYWNlKHJQYXRoLCBwYXJzZVBhdGgpXG5cdFx0XHRcdFx0XHRcdFx0XHQrIChwcm5cblx0XHRcdFx0Ly8gc29tZS5mbmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0gPSB7YmQ6IFtdfSwgZm5DYWxsW3BhcmVuRGVwdGhdID0gcnRTcSwgcHJuKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IG9wZXJhdG9yKVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQ6IG9wZXJhdG9yXG5cdFx0XHRcdC8vIG9wZXJhdG9yXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IG9wZXJhdG9yXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IHJ0UHJuXG5cdFx0XHRcdC8vIGZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gKChydFBybiA9IGZuQ2FsbFtwYXJlbkRlcHRoXSB8fCBydFBybiwgZm5DYWxsW3BhcmVuRGVwdGhdID0gZmFsc2UsIGJuZEN0eCA9IGJuZFN0YWNrWy0tcGFyZW5EZXB0aF0sIHJ0UHJuKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgKHBybiAvLyBydFBybiBhbmQgcHJuLCBlLmcgKSggaW4gKGEpKCkgb3IgYSgpKCksIG9yIClbIGluIGEoKVtdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChibmRDdHggPSBibmRTdGFja1srK3BhcmVuRGVwdGhdLCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBydFNxLCBwcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBjb21tYVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGZuQ2FsbFtwYXJlbkRlcHRoXSB8fCBzeW50YXhFcnJvcihwYXJhbXMpLCBcIixcIikgLy8gV2UgZG9uJ3QgYWxsb3cgdG9wLWxldmVsIGxpdGVyYWwgYXJyYXlzIG9yIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGxmdFBybjBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiAoYXBvc2VkID0gYXBvcywgcXVvdGVkID0gcXVvdCwgJ1wiJylcblx0XHRcdFx0KSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIG5hbWVkLCBiaW5kdG8sIGJvdW5kTmFtZSxcblx0XHRxdW90ZWQsIC8vIGJvb2xlYW4gZm9yIHN0cmluZyBjb250ZW50IGluIGRvdWJsZSBxdW90ZXNcblx0XHRhcG9zZWQsIC8vIG9yIGluIHNpbmdsZSBxdW90ZXNcblx0XHRiaW5kaW5ncyA9IHBhdGhCaW5kaW5ncyAmJiBwYXRoQmluZGluZ3NbMF0sIC8vIGJpbmRpbmdzIGFycmF5IGZvciB0aGUgZmlyc3QgYXJnXG5cdFx0Ym5kQ3R4ID0ge2JkOiBiaW5kaW5nc30sXG5cdFx0Ym5kU3RhY2sgPSB7MDogYm5kQ3R4fSxcblx0XHRwYXJhbUluZGV4ID0gMCwgLy8gbGlzdCxcblx0XHR0bXBsTGlua3MgPSAodG1wbCA/IHRtcGwubGlua3MgOiBiaW5kaW5ncyAmJiAoYmluZGluZ3MubGlua3MgPSBiaW5kaW5ncy5saW5rcyB8fCB7fSkpIHx8IHRvcFZpZXcudG1wbC5saW5rcyxcblx0XHQvLyBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGZvciB0cmFja2luZyBwYXRoIHBhcnNpbmcgaW5jbHVkaW5nIG5lc3RlZCBwYXRocywgc3VjaCBhcyBcImEuYihjXmQgKyAoZSkpXmZcIiwgYW5kIGNoYWluZWQgY29tcHV0ZWQgcGF0aHMgc3VjaCBhc1xuXHRcdC8vIFwiYS5iKCkuY15kKCkuZS5mKCkuZ1wiIC0gd2hpY2ggaGFzIGZvdXIgY2hhaW5lZCBwYXRocywgXCJhLmIoKVwiLCBcIl5jLmQoKVwiLCBcIi5lLmYoKVwiIGFuZCBcIi5nXCJcblx0XHRwYXJlbkRlcHRoID0gMCxcblx0XHRmbkNhbGwgPSB7fSwgLy8gV2UgYXJlIGluIGEgZnVuY3Rpb24gY2FsbFxuXHRcdHBhdGhTdGFydCA9IHt9LCAvLyB0cmFja3MgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHBhdGggc3VjaCBhcyBjXmQoKSBpbiB0aGUgYWJvdmUgZXhhbXBsZVxuXHRcdHJlc3VsdCA9IChwYXJhbXMgKyAodG1wbCA/IFwiIFwiIDogXCJcIikpLnJlcGxhY2UoclBhcmFtcywgcGFyc2VUb2tlbnMpO1xuXG5cdHJldHVybiAhcGFyZW5EZXB0aCAmJiByZXN1bHQgfHwgc3ludGF4RXJyb3IocGFyYW1zKTsgLy8gU3ludGF4IGVycm9yIGlmIHVuYmFsYW5jZWQgcGFyZW5zIGluIHBhcmFtcyBleHByZXNzaW9uXG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29kZShhc3QsIHRtcGwsIGlzTGlua0V4cHIpIHtcblx0Ly8gQnVpbGQgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIGNvZGUgZnJvbSB0aGUgQVNUIG5vZGVzLCBhbmQgc2V0IGFzIHByb3BlcnR5IG9uIHRoZSBwYXNzZWQtaW4gdGVtcGxhdGUgb2JqZWN0XG5cdC8vIFVzZWQgZm9yIGNvbXBpbGluZyB0ZW1wbGF0ZXMsIGFuZCBhbHNvIGJ5IEpzVmlld3MgdG8gYnVpbGQgZnVuY3Rpb25zIGZvciBkYXRhIGxpbmsgZXhwcmVzc2lvbnNcblx0dmFyIGksIG5vZGUsIHRhZ05hbWUsIGNvbnZlcnRlciwgdGFnQ3R4LCBoYXNUYWcsIGhhc0VuY29kZXIsIGdldHNWYWwsIGhhc0NudnQsIHVzZUNudnQsIHRtcGxCaW5kaW5ncywgcGF0aEJpbmRpbmdzLCBwYXJhbXMsIGJvdW5kT25FcnJTdGFydCwgYm91bmRPbkVyckVuZCxcblx0XHR0YWdSZW5kZXIsIG5lc3RlZFRtcGxzLCB0bXBsTmFtZSwgbmVzdGVkVG1wbCwgdGFnQW5kRWxzZXMsIGNvbnRlbnQsIG1hcmt1cCwgbmV4dElzRWxzZSwgb2xkQ29kZSwgaXNFbHNlLCBpc0dldFZhbCwgdGFnQ3R4Rm4sIG9uRXJyb3IsIHRhZ1N0YXJ0LCB0cmlnZ2VyLFxuXHRcdHRtcGxCaW5kaW5nS2V5ID0gMCxcblx0XHR1c2VWaWV3cyA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLnVzZVZpZXdzIHx8IHRtcGwudXNlVmlld3MgfHwgdG1wbC50YWdzIHx8IHRtcGwudGVtcGxhdGVzIHx8IHRtcGwuaGVscGVycyB8fCB0bXBsLmNvbnZlcnRlcnMsXG5cdFx0Y29kZSA9IFwiXCIsXG5cdFx0dG1wbE9wdGlvbnMgPSB7fSxcblx0XHRsID0gYXN0Lmxlbmd0aDtcblxuXHRpZiAoXCJcIiArIHRtcGwgPT09IHRtcGwpIHtcblx0XHR0bXBsTmFtZSA9IGlzTGlua0V4cHIgPyAnZGF0YS1saW5rPVwiJyArIHRtcGwucmVwbGFjZShyTmV3TGluZSwgXCIgXCIpLnNsaWNlKDEsIC0xKSArICdcIicgOiB0bXBsO1xuXHRcdHRtcGwgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHRtcGxOYW1lID0gdG1wbC50bXBsTmFtZSB8fCBcInVubmFtZWRcIjtcblx0XHRpZiAodG1wbC5hbGxvd0NvZGUpIHtcblx0XHRcdHRtcGxPcHRpb25zLmFsbG93Q29kZSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmICh0bXBsLmRlYnVnKSB7XG5cdFx0XHR0bXBsT3B0aW9ucy5kZWJ1ZyA9IHRydWU7XG5cdFx0fVxuXHRcdHRtcGxCaW5kaW5ncyA9IHRtcGwuYm5kcztcblx0XHRuZXN0ZWRUbXBscyA9IHRtcGwudG1wbHM7XG5cdH1cblx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdC8vIEFTVCBub2RlczogWzA6IHRhZ05hbWUsIDE6IGNvbnZlcnRlciwgMjogY29udGVudCwgMzogcGFyYW1zLCA0OiBjb2RlLCA1OiBvbkVycm9yLCA2OiB0cmlnZ2VyLCA3OnBhdGhCaW5kaW5ncywgODogY29udGVudE1hcmt1cF1cblx0XHRub2RlID0gYXN0W2ldO1xuXG5cdFx0Ly8gQWRkIG5ld2xpbmUgZm9yIGVhY2ggY2FsbG91dCB0byB0KCkgYygpIGV0Yy4gYW5kIGVhY2ggbWFya3VwIHN0cmluZ1xuXHRcdGlmIChcIlwiICsgbm9kZSA9PT0gbm9kZSkge1xuXHRcdFx0Ly8gYSBtYXJrdXAgc3RyaW5nIHRvIGJlIGluc2VydGVkXG5cdFx0XHRjb2RlICs9ICdcXG4rXCInICsgbm9kZSArICdcIic7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGEgY29tcGlsZWQgdGFnIGV4cHJlc3Npb24gdG8gYmUgaW5zZXJ0ZWRcblx0XHRcdHRhZ05hbWUgPSBub2RlWzBdO1xuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwiKlwiKSB7XG5cdFx0XHRcdC8vIENvZGUgdGFnOiB7eyogfX1cblx0XHRcdFx0Y29kZSArPSBcIjtcXG5cIiArIG5vZGVbMV0gKyBcIlxcbnJldD1yZXRcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnZlcnRlciA9IG5vZGVbMV07XG5cdFx0XHRcdGNvbnRlbnQgPSAhaXNMaW5rRXhwciAmJiBub2RlWzJdO1xuXHRcdFx0XHR0YWdDdHggPSBwYXJhbVN0cnVjdHVyZShub2RlWzNdLCAncGFyYW1zJykgKyAnfSwnICsgcGFyYW1TdHJ1Y3R1cmUocGFyYW1zID0gbm9kZVs0XSk7XG5cdFx0XHRcdG9uRXJyb3IgPSBub2RlWzVdO1xuXHRcdFx0XHR0cmlnZ2VyID0gbm9kZVs2XTtcblx0XHRcdFx0bWFya3VwID0gbm9kZVs4XSAmJiBub2RlWzhdLnJlcGxhY2UoclVuZXNjYXBlUXVvdGVzLCBcIiQxXCIpO1xuXHRcdFx0XHRpZiAoaXNFbHNlID0gdGFnTmFtZSA9PT0gXCJlbHNlXCIpIHtcblx0XHRcdFx0XHRpZiAocGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRwYXRoQmluZGluZ3MucHVzaChub2RlWzddKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dG1wbEJpbmRpbmdLZXkgPSAwO1xuXHRcdFx0XHRcdGlmICh0bXBsQmluZGluZ3MgJiYgKHBhdGhCaW5kaW5ncyA9IG5vZGVbN10pKSB7IC8vIEFycmF5IG9mIHBhdGhzLCBvciBmYWxzZSBpZiBub3QgZGF0YS1ib3VuZFxuXHRcdFx0XHRcdFx0cGF0aEJpbmRpbmdzID0gW3BhdGhCaW5kaW5nc107XG5cdFx0XHRcdFx0XHR0bXBsQmluZGluZ0tleSA9IHRtcGxCaW5kaW5ncy5wdXNoKDEpOyAvLyBBZGQgcGxhY2Vob2xkZXIgaW4gdG1wbEJpbmRpbmdzIGZvciBjb21waWxlZCBmdW5jdGlvblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR1c2VWaWV3cyA9IHVzZVZpZXdzIHx8IHBhcmFtc1sxXSB8fCBwYXJhbXNbMl0gfHwgcGF0aEJpbmRpbmdzIHx8IC92aWV3Lig/IWluZGV4KS8udGVzdChwYXJhbXNbMF0pO1xuXHRcdFx0XHQvLyB1c2VWaWV3cyBpcyBmb3IgcGVyZiBvcHRpbWl6YXRpb24uIEZvciByZW5kZXIoKSB3ZSBvbmx5IHVzZSB2aWV3cyBpZiBuZWNlc3NhcnkgLSBmb3IgdGhlIG1vcmUgYWR2YW5jZWQgc2NlbmFyaW9zLlxuXHRcdFx0XHQvLyBXZSB1c2Ugdmlld3MgaWYgdGhlcmUgYXJlIHByb3BzLCBjb250ZXh0dWFsIHByb3BlcnRpZXMgb3IgYXJncyB3aXRoICMuLi4gKG90aGVyIHRoYW4gI2luZGV4KSAtIGJ1dCB5b3UgY2FuIGZvcmNlXG5cdFx0XHRcdC8vIHVzaW5nIHRoZSBmdWxsIHZpZXcgaW5mcmFzdHJ1Y3R1cmUsIChhbmQgcGF5IGEgcGVyZiBwcmljZSkgYnkgb3B0aW5nIGluOiBTZXQgdXNlVmlld3M6IHRydWUgb24gdGhlIHRlbXBsYXRlLCBtYW51YWxseS4uLlxuXHRcdFx0XHRpZiAoaXNHZXRWYWwgPSB0YWdOYW1lID09PSBcIjpcIikge1xuXHRcdFx0XHRcdGlmIChjb252ZXJ0ZXIpIHtcblx0XHRcdFx0XHRcdHRhZ05hbWUgPSBjb252ZXJ0ZXIgPT09IEhUTUwgPyBcIj5cIiA6IGNvbnZlcnRlciArIHRhZ05hbWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChjb250ZW50KSB7IC8vIFRPRE8gb3B0aW1pemUgLSBpZiBjb250ZW50Lmxlbmd0aCA9PT0gMCBvciBpZiB0aGVyZSBpcyBhIHRtcGw9XCIuLi5cIiBzcGVjaWZpZWQgLSBzZXQgY29udGVudCB0byBudWxsIC8gZG9uJ3QgcnVuIHRoaXMgY29tcGlsYXRpb24gY29kZSAtIHNpbmNlIGNvbnRlbnQgd29uJ3QgZ2V0IHVzZWQhIVxuXHRcdFx0XHRcdFx0Ly8gQ3JlYXRlIHRlbXBsYXRlIG9iamVjdCBmb3IgbmVzdGVkIHRlbXBsYXRlXG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBsID0gdG1wbE9iamVjdChtYXJrdXAsIHRtcGxPcHRpb25zKTtcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwudG1wbE5hbWUgPSB0bXBsTmFtZSArIFwiL1wiICsgdGFnTmFtZTtcblx0XHRcdFx0XHRcdC8vIENvbXBpbGUgdG8gQVNUIGFuZCB0aGVuIHRvIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBsLnVzZVZpZXdzID0gbmVzdGVkVG1wbC51c2VWaWV3cyB8fCB1c2VWaWV3cztcblx0XHRcdFx0XHRcdGJ1aWxkQ29kZShjb250ZW50LCBuZXN0ZWRUbXBsKTtcblx0XHRcdFx0XHRcdHVzZVZpZXdzID0gbmVzdGVkVG1wbC51c2VWaWV3cztcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGxzLnB1c2gobmVzdGVkVG1wbCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFpc0Vsc2UpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgbm90IGFuIGVsc2UgdGFnLlxuXHRcdFx0XHRcdFx0dGFnQW5kRWxzZXMgPSB0YWdOYW1lO1xuXHRcdFx0XHRcdFx0dXNlVmlld3MgPSB1c2VWaWV3cyB8fCB0YWdOYW1lICYmICghJHRhZ3NbdGFnTmFtZV0gfHwgISR0YWdzW3RhZ05hbWVdLmZsb3cpO1xuXHRcdFx0XHRcdFx0Ly8gU3dpdGNoIHRvIGEgbmV3IGNvZGUgc3RyaW5nIGZvciB0aGlzIGJvdW5kIHRhZyAoYW5kIGl0cyBlbHNlcywgaWYgaXQgaGFzIGFueSkgLSBmb3IgcmV0dXJuaW5nIHRoZSB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0XHRvbGRDb2RlID0gY29kZTtcblx0XHRcdFx0XHRcdGNvZGUgPSBcIlwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXh0SXNFbHNlID0gYXN0W2kgKyAxXTtcblx0XHRcdFx0XHRuZXh0SXNFbHNlID0gbmV4dElzRWxzZSAmJiBuZXh0SXNFbHNlWzBdID09PSBcImVsc2VcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YWdTdGFydCA9IG9uRXJyb3IgPyBcIjtcXG50cnl7XFxucmV0Kz1cIiA6IFwiXFxuK1wiO1xuXHRcdFx0XHRib3VuZE9uRXJyU3RhcnQgPSBcIlwiO1xuXHRcdFx0XHRib3VuZE9uRXJyRW5kID0gXCJcIjtcblxuXHRcdFx0XHRpZiAoaXNHZXRWYWwgJiYgKHBhdGhCaW5kaW5ncyB8fCB0cmlnZ2VyIHx8IGNvbnZlcnRlciAmJiBjb252ZXJ0ZXIgIT09IEhUTUwpKSB7XG5cdFx0XHRcdFx0Ly8gRm9yIGNvbnZlcnRWYWwgd2UgbmVlZCBhIGNvbXBpbGVkIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgbmV3IHRhZ0N0eChzKVxuXHRcdFx0XHRcdHRhZ0N0eEZuID0gbmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3LGosdVwiLCBcIiAvLyBcIiArIHRtcGxOYW1lICsgXCIgXCIgKyB0bXBsQmluZGluZ0tleSArIFwiIFwiICsgdGFnTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrIFwiXFxucmV0dXJuIHtcIiArIHRhZ0N0eCArIFwifTtcIik7XG5cdFx0XHRcdFx0dGFnQ3R4Rm4uX2VyID0gb25FcnJvcjtcblx0XHRcdFx0XHR0YWdDdHhGbi5fdGFnID0gdGFnTmFtZTtcblxuXHRcdFx0XHRcdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGFnQ3R4Rm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2V0UGF0aHModGFnQ3R4Rm4sIHBhdGhCaW5kaW5ncyk7XG5cdFx0XHRcdFx0dGFnUmVuZGVyID0gJ2MoXCInICsgY29udmVydGVyICsgJ1wiLHZpZXcsJztcblx0XHRcdFx0XHR1c2VDbnZ0ID0gdHJ1ZTtcblx0XHRcdFx0XHRib3VuZE9uRXJyU3RhcnQgPSB0YWdSZW5kZXIgKyB0bXBsQmluZGluZ0tleSArIFwiLFwiO1xuXHRcdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIilcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb2RlICs9IChpc0dldFZhbFxuXHRcdFx0XHRcdD8gKGlzTGlua0V4cHIgPyAob25FcnJvciA/IFwidHJ5e1xcblwiIDogXCJcIikgKyBcInJldHVybiBcIiA6IHRhZ1N0YXJ0KSArICh1c2VDbnZ0IC8vIENhbGwgX2NudnQgaWYgdGhlcmUgaXMgYSBjb252ZXJ0ZXI6IHt7Y252dDogLi4uIH19IG9yIHtee2NudnQ6IC4uLiB9fVxuXHRcdFx0XHRcdFx0PyAodXNlQ252dCA9IHVuZGVmaW5lZCwgdXNlVmlld3MgPSBoYXNDbnZ0ID0gdHJ1ZSwgdGFnUmVuZGVyICsgKHBhdGhCaW5kaW5nc1xuXHRcdFx0XHRcdFx0XHQ/ICgodG1wbEJpbmRpbmdzW3RtcGxCaW5kaW5nS2V5IC0gMV0gPSB0YWdDdHhGbiksIHRtcGxCaW5kaW5nS2V5KSAvLyBTdG9yZSB0aGUgY29tcGlsZWQgdGFnQ3R4Rm4gaW4gdG1wbC5ibmRzLCBhbmQgcGFzcyB0aGUga2V5IHRvIGNvbnZlcnRWYWwoKVxuXHRcdFx0XHRcdFx0XHQ6IFwie1wiICsgdGFnQ3R4ICsgXCJ9XCIpICsgXCIpXCIpXG5cdFx0XHRcdFx0XHQ6IHRhZ05hbWUgPT09IFwiPlwiXG5cdFx0XHRcdFx0XHRcdD8gKGhhc0VuY29kZXIgPSB0cnVlLCBcImgoXCIgKyBwYXJhbXNbMF0gKyBcIilcIilcblx0XHRcdFx0XHRcdFx0OiAoZ2V0c1ZhbCA9IHRydWUsIFwiKCh2PVwiICsgcGFyYW1zWzBdICsgJykhPW51bGw/djonICsgKGlzTGlua0V4cHIgPyAnbnVsbCknIDogJ1wiXCIpJykpXG5cdFx0XHRcdFx0XHRcdC8vIE5vbiBzdHJpY3QgZXF1YWxpdHkgc28gZGF0YS1saW5rPVwidGl0bGV7OmV4cHJ9XCIgd2l0aCBleHByPW51bGwvdW5kZWZpbmVkIHJlbW92ZXMgdGl0bGUgYXR0cmlidXRlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdDogKGhhc1RhZyA9IHRydWUsIFwiXFxue3ZpZXc6dmlldyx0bXBsOlwiIC8vIEFkZCB0aGlzIHRhZ0N0eCB0byB0aGUgY29tcGlsZWQgY29kZSBmb3IgdGhlIHRhZ0N0eHMgdG8gYmUgcGFzc2VkIHRvIHJlbmRlclRhZygpXG5cdFx0XHRcdFx0XHQrIChjb250ZW50ID8gbmVzdGVkVG1wbHMubGVuZ3RoIDogXCIwXCIpICsgXCIsXCIgLy8gRm9yIGJsb2NrIHRhZ3MsIHBhc3MgaW4gdGhlIGtleSAobmVzdGVkVG1wbHMubGVuZ3RoKSB0byB0aGUgbmVzdGVkIGNvbnRlbnQgdGVtcGxhdGVcblx0XHRcdFx0XHRcdCsgdGFnQ3R4ICsgXCJ9LFwiKSk7XG5cblx0XHRcdFx0aWYgKHRhZ0FuZEVsc2VzICYmICFuZXh0SXNFbHNlKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGRhdGEtbGluayBleHByZXNzaW9uIG9yIGFuIGlubGluZSB0YWcgd2l0aG91dCBhbnkgZWxzZXMsIG9yIHRoZSBsYXN0IHt7ZWxzZX19IG9mIGFuIGlubGluZSB0YWdcblx0XHRcdFx0XHQvLyBXZSBjb21wbGV0ZSB0aGUgY29kZSBmb3IgcmV0dXJuaW5nIHRoZSB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0Y29kZSA9IFwiW1wiICsgY29kZS5zbGljZSgwLCAtMSkgKyBcIl1cIjtcblx0XHRcdFx0XHR0YWdSZW5kZXIgPSAndChcIicgKyB0YWdBbmRFbHNlcyArICdcIix2aWV3LHRoaXMsJztcblx0XHRcdFx0XHRpZiAoaXNMaW5rRXhwciB8fCBwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBib3VuZCB0YWcgKGRhdGEtbGluayBleHByZXNzaW9uIG9yIGlubGluZSBib3VuZCB0YWcge157dGFnIC4uLn19KSBzbyB3ZSBzdG9yZSBhIGNvbXBpbGVkIHRhZ0N0eHMgZnVuY3Rpb24gaW4gdG1wLmJuZHNcblx0XHRcdFx0XHRcdGNvZGUgPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIFwiIC8vIFwiICsgdG1wbE5hbWUgKyBcIiBcIiArIHRtcGxCaW5kaW5nS2V5ICsgXCIgXCIgKyB0YWdBbmRFbHNlcyArIFwiXFxucmV0dXJuIFwiICsgY29kZSArIFwiO1wiKTtcblx0XHRcdFx0XHRcdGNvZGUuX2VyID0gb25FcnJvcjtcblx0XHRcdFx0XHRcdGNvZGUuX3RhZyA9IHRhZ0FuZEVsc2VzO1xuXHRcdFx0XHRcdFx0aWYgKHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0XHRzZXRQYXRocyh0bXBsQmluZGluZ3NbdG1wbEJpbmRpbmdLZXkgLSAxXSA9IGNvZGUsIHBhdGhCaW5kaW5ncyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gY29kZTsgLy8gRm9yIGEgZGF0YS1saW5rIGV4cHJlc3Npb24gd2UgcmV0dXJuIHRoZSBjb21waWxlZCB0YWdDdHhzIGZ1bmN0aW9uXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRib3VuZE9uRXJyU3RhcnQgPSB0YWdSZW5kZXIgKyB0bXBsQmluZGluZ0tleSArIFwiLHVuZGVmaW5lZCxcIjtcblx0XHRcdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIilcIjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBUaGlzIGlzIHRoZSBsYXN0IHt7ZWxzZX19IGZvciBhbiBpbmxpbmUgdGFnLlxuXHRcdFx0XHRcdC8vIEZvciBhIGJvdW5kIHRhZywgcGFzcyB0aGUgdGFnQ3R4cyBmbiBsb29rdXAga2V5IHRvIHJlbmRlclRhZy5cblx0XHRcdFx0XHQvLyBGb3IgYW4gdW5ib3VuZCB0YWcsIGluY2x1ZGUgdGhlIGNvZGUgZGlyZWN0bHkgZm9yIGV2YWx1YXRpbmcgdGFnQ3R4cyBhcnJheVxuXHRcdFx0XHRcdGNvZGUgPSBvbGRDb2RlICsgdGFnU3RhcnQgKyB0YWdSZW5kZXIgKyAodG1wbEJpbmRpbmdLZXkgfHwgY29kZSkgKyBcIilcIjtcblx0XHRcdFx0XHRwYXRoQmluZGluZ3MgPSAwO1xuXHRcdFx0XHRcdHRhZ0FuZEVsc2VzID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob25FcnJvcikge1xuXHRcdFx0XHRcdHVzZVZpZXdzID0gdHJ1ZTtcblx0XHRcdFx0XHRjb2RlICs9ICc7XFxufWNhdGNoKGUpe3JldCcgKyAoaXNMaW5rRXhwciA/IFwidXJuIFwiIDogXCIrPVwiKSArIGJvdW5kT25FcnJTdGFydCArICdqLl9lcnIoZSx2aWV3LCcgKyBvbkVycm9yICsgJyknICsgYm91bmRPbkVyckVuZCArICc7fScgKyAoaXNMaW5rRXhwciA/IFwiXCIgOiAncmV0PXJldCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIEluY2x1ZGUgb25seSB0aGUgdmFyIHJlZmVyZW5jZXMgdGhhdCBhcmUgbmVlZGVkIGluIHRoZSBjb2RlXG5cdGNvZGUgPSBcIi8vIFwiICsgdG1wbE5hbWVcblxuXHRcdCsgXCJcXG52YXIgdlwiXG5cdFx0KyAoaGFzVGFnID8gXCIsdD1qLl90YWdcIiA6IFwiXCIpICAgICAgICAgICAgICAgIC8vIGhhcyB0YWdcblx0XHQrIChoYXNDbnZ0ID8gXCIsYz1qLl9jbnZ0XCIgOiBcIlwiKSAgICAgICAgICAgICAgLy8gY29udmVydGVyXG5cdFx0KyAoaGFzRW5jb2RlciA/IFwiLGg9ai5faHRtbFwiIDogXCJcIikgICAgICAgICAgIC8vIGh0bWwgY29udmVydGVyXG5cdFx0KyAoaXNMaW5rRXhwciA/IFwiO1xcblwiIDogJyxyZXQ9XCJcIlxcbicpXG5cdFx0KyAodG1wbE9wdGlvbnMuZGVidWcgPyBcImRlYnVnZ2VyO1wiIDogXCJcIilcblx0XHQrIGNvZGVcblx0XHQrIChpc0xpbmtFeHByID8gXCJcXG5cIiA6IFwiO1xcbnJldHVybiByZXQ7XCIpO1xuXG5cdGlmICgkc3ViU2V0dGluZ3MuZGVidWdNb2RlICE9PSBmYWxzZSkge1xuXHRcdGNvZGUgPSBcInRyeSB7XFxuXCIgKyBjb2RlICsgXCJcXG59Y2F0Y2goZSl7XFxucmV0dXJuIGouX2VycihlLCB2aWV3KTtcXG59XCI7XG5cdH1cblxuXHR0cnkge1xuXHRcdGNvZGUgPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIGNvZGUpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0c3ludGF4RXJyb3IoXCJDb21waWxlZCB0ZW1wbGF0ZSBjb2RlOlxcblxcblwiICsgY29kZSArICdcXG46IFwiJyArIGUubWVzc2FnZSArICdcIicpO1xuXHR9XG5cdGlmICh0bXBsKSB7XG5cdFx0dG1wbC5mbiA9IGNvZGU7XG5cdFx0dG1wbC51c2VWaWV3cyA9ICEhdXNlVmlld3M7XG5cdH1cblx0cmV0dXJuIGNvZGU7XG59XG5cbi8vPT09PT09PT09PVxuLy8gVXRpbGl0aWVzXG4vLz09PT09PT09PT1cblxuLy8gTWVyZ2Ugb2JqZWN0cywgaW4gcGFydGljdWxhciBjb250ZXh0cyB3aGljaCBpbmhlcml0IGZyb20gcGFyZW50IGNvbnRleHRzXG5mdW5jdGlvbiBleHRlbmRDdHgoY29udGV4dCwgcGFyZW50Q29udGV4dCkge1xuXHQvLyBSZXR1cm4gY29weSBvZiBwYXJlbnRDb250ZXh0LCB1bmxlc3MgY29udGV4dCBpcyBkZWZpbmVkIGFuZCBpcyBkaWZmZXJlbnQsIGluIHdoaWNoIGNhc2UgcmV0dXJuIGEgbmV3IG1lcmdlZCBjb250ZXh0XG5cdC8vIElmIG5laXRoZXIgY29udGV4dCBub3IgcGFyZW50Q29udGV4dCBhcmUgZGVmaW5lZCwgcmV0dXJuIHVuZGVmaW5lZFxuXHRyZXR1cm4gY29udGV4dCAmJiBjb250ZXh0ICE9PSBwYXJlbnRDb250ZXh0XG5cdFx0PyAocGFyZW50Q29udGV4dFxuXHRcdFx0PyAkZXh0ZW5kKCRleHRlbmQoe30sIHBhcmVudENvbnRleHQpLCBjb250ZXh0KVxuXHRcdFx0OiBjb250ZXh0KVxuXHRcdDogcGFyZW50Q29udGV4dCAmJiAkZXh0ZW5kKHt9LCBwYXJlbnRDb250ZXh0KTtcbn1cblxuLy8gR2V0IGNoYXJhY3RlciBlbnRpdHkgZm9yIEhUTUwgYW5kIEF0dHJpYnV0ZSBlbmNvZGluZ1xuZnVuY3Rpb24gZ2V0Q2hhckVudGl0eShjaCkge1xuXHRyZXR1cm4gY2hhckVudGl0aWVzW2NoXSB8fCAoY2hhckVudGl0aWVzW2NoXSA9IFwiJiNcIiArIGNoLmNoYXJDb2RlQXQoMCkgKyBcIjtcIik7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldFByb3BzKHNvdXJjZSkge1xuXHQvLyB0aGlzIHBvaW50ZXIgaXMgdGhlTWFwIC0gd2hpY2ggaGFzIHRhZ0N0eC5wcm9wcyB0b29cblx0Ly8gYXJndW1lbnRzOiB0YWdDdHguYXJncy5cblx0dmFyIGtleSwgcHJvcCxcblx0XHRwcm9wcyA9IFtdO1xuXG5cdGlmICh0eXBlb2Ygc291cmNlID09PSBPQkpFQ1QpIHtcblx0XHRmb3IgKGtleSBpbiBzb3VyY2UpIHtcblx0XHRcdHByb3AgPSBzb3VyY2Vba2V5XTtcblx0XHRcdGlmIChrZXkgIT09ICRleHBhbmRvICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICEkaXNGdW5jdGlvbihwcm9wKSkge1xuXHRcdFx0XHRwcm9wcy5wdXNoKHtrZXk6IGtleSwgcHJvcDogcHJvcH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcHM7XG59XG5cbmZ1bmN0aW9uICRmblJlbmRlcihkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbikge1xuXHR2YXIgdG1wbEVsZW0gPSB0aGlzLmpxdWVyeSAmJiAodGhpc1swXSB8fCBlcnJvcignVW5rbm93biB0ZW1wbGF0ZTogXCInICsgdGhpcy5zZWxlY3RvciArICdcIicpKSxcblx0XHR0bXBsID0gdG1wbEVsZW0uZ2V0QXR0cmlidXRlKHRtcGxBdHRyKTtcblxuXHRyZXR1cm4gcmVuZGVyQ29udGVudC5jYWxsKHRtcGwgPyAkLmRhdGEodG1wbEVsZW0pW2pzdlRtcGxdIDogJHRlbXBsYXRlcyh0bXBsRWxlbSksIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWdpc3RlciBjb252ZXJ0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGh0bWxFbmNvZGUodGV4dCkge1xuXHQvLyBIVE1MIGVuY29kZTogUmVwbGFjZSA8ID4gJiAnIGFuZCBcIiBieSBjb3JyZXNwb25kaW5nIGVudGl0aWVzLlxuXHRyZXR1cm4gdGV4dCAhPSB1bmRlZmluZWQgPyBySXNIdG1sLnRlc3QodGV4dCkgJiYgKFwiXCIgKyB0ZXh0KS5yZXBsYWNlKHJIdG1sRW5jb2RlLCBnZXRDaGFyRW50aXR5KSB8fCB0ZXh0IDogXCJcIjtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRzdWIgPSAkdmlld3Muc3ViO1xuJHZpZXdzU2V0dGluZ3MgPSAkdmlld3Muc2V0dGluZ3M7XG5cbmlmICghKGpzciB8fCAkICYmICQucmVuZGVyKSkge1xuXHQvLyBKc1JlbmRlciBub3QgYWxyZWFkeSBsb2FkZWQsIG9yIGxvYWRlZCB3aXRob3V0IGpRdWVyeSwgYW5kIHdlIGFyZSBub3cgbW92aW5nIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lcGFjZVxuXHRmb3IgKGpzdlN0b3JlTmFtZSBpbiBqc3ZTdG9yZXMpIHtcblx0XHRyZWdpc3RlclN0b3JlKGpzdlN0b3JlTmFtZSwganN2U3RvcmVzW2pzdlN0b3JlTmFtZV0pO1xuXHR9XG5cblx0JGNvbnZlcnRlcnMgPSAkdmlld3MuY29udmVydGVycztcblx0JGhlbHBlcnMgPSAkdmlld3MuaGVscGVycztcblx0JHRhZ3MgPSAkdmlld3MudGFncztcblxuXHQkc3ViLl90Zy5wcm90b3R5cGUgPSB7XG5cdFx0YmFzZUFwcGx5OiBiYXNlQXBwbHksXG5cdFx0Y3Z0QXJnczogY29udmVydEFyZ3Ncblx0fTtcblxuXHR0b3BWaWV3ID0gJHN1Yi50b3BWaWV3ID0gbmV3IFZpZXcoKTtcblxuXHQvL0JST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRpZiAoJCkge1xuXG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5ICg9ICQpIGlzIGxvYWRlZFxuXG5cdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0JGV4cGFuZG8gPSAkLmV4cGFuZG87XG5cdFx0aWYgKCQub2JzZXJ2YWJsZSkge1xuXHRcdFx0JGV4dGVuZCgkc3ViLCAkLnZpZXdzLnN1Yik7IC8vIGpxdWVyeS5vYnNlcnZhYmxlLmpzIHdhcyBsb2FkZWQgYmVmb3JlIGpzcmVuZGVyLmpzXG5cdFx0XHQkdmlld3MubWFwID0gJC52aWV3cy5tYXA7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5IGlzIG5vdCBsb2FkZWQuXG5cblx0XHQkID0ge307XG5cblx0XHRpZiAoc2V0R2xvYmFscykge1xuXHRcdFx0Z2xvYmFsLmpzcmVuZGVyID0gJDsgLy8gV2UgYXJlIGxvYWRpbmcganNyZW5kZXIuanMgZnJvbSBhIHNjcmlwdCBlbGVtZW50LCBub3QgQU1EIG9yIENvbW1vbkpTLCBzbyBzZXQgZ2xvYmFsXG5cdFx0fVxuXG5cdFx0Ly8gRXJyb3Igd2FybmluZyBpZiBqc3JlbmRlci5qcyBpcyB1c2VkIGFzIHRlbXBsYXRlIGVuZ2luZSBvbiBOb2RlLmpzIChlLmcuIEV4cHJlc3Mgb3IgSGFwaS4uLilcblx0XHQvLyBVc2UganNyZW5kZXItbm9kZS5qcyBpbnN0ZWFkLi4uXG5cdFx0JC5yZW5kZXJGaWxlID0gJC5fX2V4cHJlc3MgPSAkLmNvbXBpbGUgPSBmdW5jdGlvbigpIHsgdGhyb3cgXCJOb2RlLmpzOiB1c2UgbnBtIGpzcmVuZGVyLCBvciBqc3JlbmRlci1ub2RlLmpzXCI7IH07XG5cblx0XHQvL0VORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHQkLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihvYikge1xuXHRcdFx0cmV0dXJuIHR5cGVvZiBvYiA9PT0gXCJmdW5jdGlvblwiO1xuXHRcdH07XG5cblx0XHQkLmlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0cmV0dXJuICh7fS50b1N0cmluZykuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCI7XG5cdFx0fTtcblxuXHRcdCRzdWIuX2pxID0gZnVuY3Rpb24oanEpIHsgLy8gcHJpdmF0ZSBtZXRob2QgdG8gbW92ZSBmcm9tIEpzUmVuZGVyIEFQSXMgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVzcGFjZVxuXHRcdFx0aWYgKGpxICE9PSAkKSB7XG5cdFx0XHRcdCRleHRlbmQoanEsICQpOyAvLyBtYXAgb3ZlciBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXNwYWNlXG5cdFx0XHRcdCQgPSBqcTtcblx0XHRcdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0XHRcdGRlbGV0ZSAkLmpzcmVuZGVyO1xuXHRcdFx0XHQkZXhwYW5kbyA9ICQuZXhwYW5kbztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0JC5qc3JlbmRlciA9IHZlcnNpb25OdW1iZXI7XG5cdH1cblx0JHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcblx0JHN1YlNldHRpbmdzLmFsbG93Q29kZSA9IGZhbHNlO1xuXHQkaXNGdW5jdGlvbiA9ICQuaXNGdW5jdGlvbjtcblx0JC5yZW5kZXIgPSAkcmVuZGVyO1xuXHQkLnZpZXdzID0gJHZpZXdzO1xuXHQkLnRlbXBsYXRlcyA9ICR0ZW1wbGF0ZXMgPSAkdmlld3MudGVtcGxhdGVzO1xuXG5cdGZvciAoc2V0dGluZyBpbiAkc3ViU2V0dGluZ3MpIHtcblx0XHRhZGRTZXR0aW5nKHNldHRpbmcpO1xuXHR9XG5cblx0KCR2aWV3c1NldHRpbmdzLmRlYnVnTW9kZSA9IGZ1bmN0aW9uKGRlYnVnTW9kZSkge1xuXHRcdHJldHVybiBkZWJ1Z01vZGUgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyAkc3ViU2V0dGluZ3MuZGVidWdNb2RlXG5cdFx0XHQ6IChcblx0XHRcdFx0JHN1YlNldHRpbmdzLmRlYnVnTW9kZSA9IGRlYnVnTW9kZSxcblx0XHRcdFx0JHN1YlNldHRpbmdzLm9uRXJyb3IgPSBkZWJ1Z01vZGUgKyBcIlwiID09PSBkZWJ1Z01vZGVcblx0XHRcdFx0XHQ/IG5ldyBGdW5jdGlvbihcIlwiLCBcInJldHVybiAnXCIgKyBkZWJ1Z01vZGUgKyBcIic7XCIgKVxuXHRcdFx0XHRcdDogJGlzRnVuY3Rpb24oZGVidWdNb2RlKVxuXHRcdFx0XHRcdFx0PyBkZWJ1Z01vZGVcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0XHQkdmlld3NTZXR0aW5ncyk7XG5cdH0pKGZhbHNlKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cblx0JHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQgPSB7XG5cdFx0dXNlVmlld3M6IGZhbHNlLFxuXHRcdF9qc3Y6IGZhbHNlIC8vIEZvciBnbG9iYWwgYWNjZXNzIHRvIEpzVmlld3Mgc3RvcmVcblx0fTtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZ2lzdGVyIHRhZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQkdGFncyh7XG5cdFx0XCJpZlwiOiB7XG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHQvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciB7e2lmfX0gYW5kIG9uY2UgZm9yIGVhY2gge3tlbHNlfX0uXG5cdFx0XHRcdC8vIFdlIHdpbGwgdXNlIHRoZSB0YWcucmVuZGVyaW5nIG9iamVjdCBmb3IgY2FycnlpbmcgcmVuZGVyaW5nIHN0YXRlIGFjcm9zcyB0aGUgY2FsbHMuXG5cdFx0XHRcdC8vIElmIG5vdCBkb25lIChhIHByZXZpb3VzIGJsb2NrIGhhcyBub3QgYmVlbiByZW5kZXJlZCksIGxvb2sgYXQgZXhwcmVzc2lvbiBmb3IgdGhpcyBibG9jayBhbmQgcmVuZGVyIHRoZSBibG9jayBpZiBleHByZXNzaW9uIGlzIHRydXRoeVxuXHRcdFx0XHQvLyBPdGhlcndpc2UgcmV0dXJuIFwiXCJcblx0XHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJldCA9IChzZWxmLnJlbmRlcmluZy5kb25lIHx8ICF2YWwgJiYgKGFyZ3VtZW50cy5sZW5ndGggfHwgIXRhZ0N0eC5pbmRleCkpXG5cdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0XHRcdDogKHNlbGYucmVuZGVyaW5nLmRvbmUgPSB0cnVlLCBzZWxmLnNlbGVjdGVkID0gdGFnQ3R4LmluZGV4LFxuXHRcdFx0XHRcdFx0XHQvLyBUZXN0IGlzIHNhdGlzZmllZCwgc28gcmVuZGVyIGNvbnRlbnQgb24gY3VycmVudCBjb250ZXh0LiBXZSBjYWxsIHRhZ0N0eC5yZW5kZXIoKSByYXRoZXIgdGhhbiByZXR1cm4gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdC8vICh3aGljaCB3b3VsZCBhbHNvIHJlbmRlciB0aGUgdG1wbC9jb250ZW50IG9uIHRoZSBjdXJyZW50IGNvbnRleHQgYnV0IHdvdWxkIGl0ZXJhdGUgaWYgaXQgaXMgYW4gYXJyYXkpXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eC5yZW5kZXIodGFnQ3R4LnZpZXcsIHRydWUpKTsgLy8gbm8gYXJnLCBzbyByZW5kZXJzIGFnYWluc3QgcGFyZW50Vmlldy5kYXRhXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9LFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCJmb3JcIjoge1xuXHRcdFx0cmVuZGVyOiBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0Ly8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3Ige3tmb3J9fSBhbmQgb25jZSBmb3IgZWFjaCB7e2Vsc2V9fS5cblx0XHRcdFx0Ly8gV2Ugd2lsbCB1c2UgdGhlIHRhZy5yZW5kZXJpbmcgb2JqZWN0IGZvciBjYXJyeWluZyByZW5kZXJpbmcgc3RhdGUgYWNyb3NzIHRoZSBjYWxscy5cblx0XHRcdFx0dmFyIGZpbmFsRWxzZSA9ICFhcmd1bWVudHMubGVuZ3RoLFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJlc3VsdCA9IFwiXCIsXG5cdFx0XHRcdFx0ZG9uZSA9IDA7XG5cblx0XHRcdFx0aWYgKCFzZWxmLnJlbmRlcmluZy5kb25lKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBmaW5hbEVsc2UgPyB0YWdDdHgudmlldy5kYXRhIDogdmFsOyAvLyBGb3IgdGhlIGZpbmFsIGVsc2UsIGRlZmF1bHRzIHRvIGN1cnJlbnQgZGF0YSB3aXRob3V0IGl0ZXJhdGlvbi5cblx0XHRcdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IHRhZ0N0eC5yZW5kZXIodmFsdWUsIGZpbmFsRWxzZSk7IC8vIEl0ZXJhdGVzIGV4Y2VwdCBvbiBmaW5hbCBlbHNlLCBpZiBkYXRhIGlzIGFuIGFycmF5LiAoVXNlIHt7aW5jbHVkZX19IHRvIGNvbXBvc2UgdGVtcGxhdGVzIHdpdGhvdXQgYXJyYXkgaXRlcmF0aW9uKVxuXHRcdFx0XHRcdFx0ZG9uZSArPSAkaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc2VsZi5yZW5kZXJpbmcuZG9uZSA9IGRvbmUpIHtcblx0XHRcdFx0XHRcdHNlbGYuc2VsZWN0ZWQgPSB0YWdDdHguaW5kZXg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIElmIG5vdGhpbmcgd2FzIHJlbmRlcmVkIHdlIHdpbGwgbG9vayBhdCB0aGUgbmV4dCB7e2Vsc2V9fS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZG9uZS5cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdHByb3BzOiB7XG5cdFx0XHRiYXNlVGFnOiBcImZvclwiLFxuXHRcdFx0ZGF0YU1hcDogZGF0YU1hcChnZXRUYXJnZXRQcm9wcyksXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRpbmNsdWRlOiB7XG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcIipcIjoge1xuXHRcdFx0Ly8ge3sqIGNvZGUuLi4gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiOipcIjoge1xuXHRcdFx0Ly8ge3s6KiByZXR1cm5lZEV4cHJlc3Npb24gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdGRiZzogJGhlbHBlcnMuZGJnID0gJGNvbnZlcnRlcnMuZGJnID0gZGJnQnJlYWsgLy8gUmVnaXN0ZXIge3tkYmcvfX0sIHt7ZGJnOi4uLn19IGFuZCB+ZGJnKCkgdG8gdGhyb3cgYW5kIGNhdGNoLCBhcyBicmVha3BvaW50cyBmb3IgZGVidWdnaW5nLlxuXHR9KTtcblxuXHQkY29udmVydGVycyh7XG5cdFx0aHRtbDogaHRtbEVuY29kZSxcblx0XHRhdHRyOiBodG1sRW5jb2RlLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdFx0dXJsOiBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0XHQvLyBVUkwgZW5jb2RpbmcgaGVscGVyLlxuXHRcdFx0cmV0dXJuIHRleHQgIT0gdW5kZWZpbmVkID8gZW5jb2RlVVJJKFwiXCIgKyB0ZXh0KSA6IHRleHQgPT09IG51bGwgPyB0ZXh0IDogXCJcIjsgLy8gbnVsbCByZXR1cm5zIG51bGwsIGUuZy4gdG8gcmVtb3ZlIGF0dHJpYnV0ZS4gdW5kZWZpbmVkIHJldHVybnMgXCJcIlxuXHRcdH1cblx0fSk7XG59XG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IERlZmluZSBkZWZhdWx0IGRlbGltaXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiRzdWJTZXR0aW5ncyA9ICRzdWIuc2V0dGluZ3M7XG4kaXNBcnJheSA9ICgkfHxqc3IpLmlzQXJyYXk7XG4kdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzKFwie3tcIiwgXCJ9fVwiLCBcIl5cIik7XG5cbmlmIChqc3JUb0pxKSB7IC8vIE1vdmluZyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXBhY2UgLSBjb3B5IG92ZXIgdGhlIHN0b3JlZCBpdGVtcyAodGVtcGxhdGVzLCBjb252ZXJ0ZXJzLCBoZWxwZXJzLi4uKVxuXHRqc3Iudmlld3Muc3ViLl9qcSgkKTtcbn1cbnJldHVybiAkIHx8IGpzcjtcbn0sIHdpbmRvdykpO1xuIiwiLypnbG9iYWwgUVVuaXQsIHRlc3QsIGVxdWFsLCBvayovXG4oZnVuY3Rpb24odW5kZWZpbmVkKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuYnJvd3NlcmlmeS5kb25lLnNldmVuID0gdHJ1ZTtcblxuUVVuaXQubW9kdWxlKFwiQnJvd3NlcmlmeSAtIGNsaWVudCBjb2RlXCIpO1xuXG52YXIgaXNJRTggPSB3aW5kb3cuYXR0YWNoRXZlbnQgJiYgIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyO1xuXG5pZiAoIWlzSUU4KSB7XG5cbnRlc3QoXCJqUXVlcnkgZ2xvYmFsOiByZXF1aXJlKCdqcXVlcnkudmlld3MnKVwiLCBmdW5jdGlvbigpIHtcblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBIaWRlIFFVbml0IGdsb2JhbCBqUXVlcnkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdHZhciBqUXVlcnkgPSBnbG9iYWwualF1ZXJ5O1xuXHRnbG9iYWwualF1ZXJ5ID0gdW5kZWZpbmVkO1xuXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXJyYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciBkYXRhID0ge25hbWU6IFwiSm9cIn07XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gQWN0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0Z2xvYmFsLmpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuXG5cdHZhciAkanNyID0gcmVxdWlyZSgnanNyZW5kZXInKTsgLy8gVXNlcyBnbG9iYWwgalF1ZXJ5LCBzbyAkanNyID09PSBnbG9iYWwualF1ZXJ5IGlzIGdsb2JhbCBqUXVlcnkgbmFtZXNwYWNlIC8vIEVsc2UgSnNWaWV3cyByZXF1aXJlcyBKc1JlbmRlclxuXHQkanNyID0gcmVxdWlyZSgnLi4vLi4vanF1ZXJ5Lm9ic2VydmFibGUuanMnKTsgLy8gJGpzciA9PT0gZ2xvYmFsLmpRdWVyeSAvLyBFbHNlIEpzVmlld3MgcmVxdWlyZXMgSnNPYnNlcnZhYmxlXG5cdCRqc3IgPSByZXF1aXJlKCcuLi8uLi9qcXVlcnkudmlld3MnKTsgLy8gJGpzciA9PT0gZ2xvYmFsLmpRdWVyeVxuXG5cdC8vIFVzZSByZXF1aXJlIHRvIGdldCBzZXJ2ZXIgdGVtcGxhdGUsIHRoYW5rcyB0byBCcm93c2VyaWZ5IGJ1bmRsZSB0aGF0IHVzZWQganNyZW5kZXIvdG1wbGlmeSB0cmFuc2Zvcm1cblx0dmFyIHRtcGwgPSByZXF1aXJlKCcuLi90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sJyk7IC8vIFVzZXMganNyZW5kZXIgYXR0YWNoZWQgdG8gZ2xvYmFsIGpRdWVyeVxuXG5cdHZhciByZXN1bHQgPSB0bXBsKGRhdGEpO1xuXG5cdCRqc3Iub2JzZXJ2ZShkYXRhLCBcIm5hbWVcIiwgZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdHJlc3VsdCArPSBcIiBcIiArIGV2ZW50QXJncy52YWx1ZTtcblx0fSlcblx0JGpzci5vYnNlcnZhYmxlKGRhdGEpLnNldFByb3BlcnR5KFwibmFtZVwiLCBcIm5ldyBuYW1lXCIpOyAvLyByZXN1bHQgPT09IFwibmV3IG5hbWVcIlxuXG5cdHJlc3VsdCArPSBcIiBcIiArICgkanNyID09PSBnbG9iYWwualF1ZXJ5KTtcblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEFzc2VydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0ZXF1YWwocmVzdWx0LCBcIk5hbWU6IEpvIChuYW1lLXRlbXBsYXRlLmh0bWwpIG5ldyBuYW1lIHRydWVcIiwgXCJyZXN1bHQ6IGpRdWVyeSBnbG9iYWw6IHJlcXVpcmUoJ2pxdWVyeS52aWV3cycpXCIpO1xuXG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gUmVzZXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdGdsb2JhbC5qUXVlcnkgPSBqUXVlcnk7IC8vIFJlcGxhY2UgUVVuaXQgZ2xvYmFsIGpRdWVyeVxufSk7XG59XG59KSgpO1xuIiwidmFyIHRtcGxSZWZzID0gW10sXG4gIG1rdXAgPSAnTmFtZToge3s6bmFtZX19IChuYW1lLXRlbXBsYXRlLmh0bWwpJyxcbiAgJCA9IGdsb2JhbC5qc3JlbmRlciB8fCBnbG9iYWwualF1ZXJ5O1xuXG5tb2R1bGUuZXhwb3J0cyA9ICQgPyAkLnRlbXBsYXRlcyhcIi4vdGVzdC90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sXCIsIG1rdXApIDpcbiAgZnVuY3Rpb24oJCkge1xuICAgIGlmICghJCB8fCAhJC52aWV3cykge3Rocm93IFwiUmVxdWlyZXMganNyZW5kZXIvalF1ZXJ5XCI7fVxuICAgIHdoaWxlICh0bXBsUmVmcy5sZW5ndGgpIHtcbiAgICAgIHRtcGxSZWZzLnBvcCgpKCQpOyAvLyBjb21waWxlIG5lc3RlZCB0ZW1wbGF0ZVxuICAgIH1cblxuICAgIHJldHVybiAkLnRlbXBsYXRlcyhcIi4vdGVzdC90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sXCIsIG1rdXApXG4gIH07Il19 +//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqcXVlcnkub2JzZXJ2YWJsZS5qcyIsImpxdWVyeS52aWV3cy5qcyIsIm5vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCJub2RlX21vZHVsZXMvanNyZW5kZXIvanNyZW5kZXIuanMiLCJ0ZXN0L2Jyb3dzZXJpZnkvNy11bml0LXRlc3RzLmpzIiwidGVzdC90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6bUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM29HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxL1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzl5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKiEgSnNPYnNlcnZhYmxlIHYwLjkuODMgKEJldGEpOiBodHRwOi8vanN2aWV3cy5jb20vI2pzb2JzZXJ2YWJsZSAqL1xuLypcbiAqIFN1YmNvbXBvbmVudCBvZiBKc1ZpZXdzXG4gKiBEYXRhIGNoYW5nZSBldmVudHMgZm9yIGRhdGEtbGlua2luZ1xuICpcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vanNoaW50IC1XMDE4LCAtVzA0MVxuXG4oZnVuY3Rpb24oZmFjdG9yeSwgZ2xvYmFsKSB7XG5cdC8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG5cdHZhciAkID0gZ2xvYmFsLmpRdWVyeTtcblxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHsgLy8gQ29tbW9uSlMgZS5nLiBCcm93c2VyaWZ5XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSAkXG5cdFx0XHQ/IGZhY3RvcnkoZ2xvYmFsLCAkKVxuXHRcdFx0OiBmdW5jdGlvbigkKSB7IC8vIElmIG5vIGdsb2JhbCBqUXVlcnksIHRha2UgalF1ZXJ5IHBhc3NlZCBhcyBwYXJhbWV0ZXI6IHJlcXVpcmUoXCJqc29ic2VydmFibGVcIikoalF1ZXJ5KVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdFx0fTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgeyAvLyBBTUQgc2NyaXB0IGxvYWRlciwgZS5nLiBSZXF1aXJlSlNcblx0XHRkZWZpbmUoW1wianF1ZXJ5XCJdLCBmdW5jdGlvbigkKSB7XG5cdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpOyAvLyBSZXF1aXJlIGpRdWVyeVxuXHRcdH0pO1xuXHR9IGVsc2UgeyAvLyBCcm93c2VyIHVzaW5nIHBsYWluIDxzY3JpcHQ+IHRhZ1xuXHRcdGZhY3RvcnkoZ2xvYmFsLCBmYWxzZSk7XG5cdH1cbn0gKFxuXG4vLyBmYWN0b3J5IChmb3IganN2aWV3cy5qcylcbmZ1bmN0aW9uKGdsb2JhbCwgJCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcbnZhciBzZXRHbG9iYWxzID0gJCA9PT0gZmFsc2U7IC8vIE9ubHkgc2V0IGdsb2JhbHMgaWYgc2NyaXB0IGJsb2NrIGluIGJyb3dzZXIgKG5vdCBBTUQgYW5kIG5vdCBDb21tb25KUylcblxuJCA9ICQgfHwgZ2xvYmFsLmpRdWVyeTtcblxuaWYgKCEkIHx8ICEkLmZuKSB7XG5cdC8vIGpRdWVyeSBpcyBub3QgbG9hZGVkLlxuXHR0aHJvdyBcIkpzT2JzZXJ2YWJsZSByZXF1aXJlcyBqUXVlcnlcIjsgLy8gV2UgcmVxdWlyZSBqUXVlcnlcbn1cblxudmFyIHZlcnNpb25OdW1iZXIgPSBcInYwLjkuODNcIixcblx0JG9ic2VydmUsICRvYnNlcnZhYmxlLFxuXG5cdCR2aWV3cyA9ICQudmlld3MgPVxuXHRcdCQudmlld3MgfHxcblx0XHRzZXRHbG9iYWxzICYmIGdsb2JhbC5qc3JlbmRlciAmJiBqc3JlbmRlci52aWV3cyB8fCAvL2pzcmVuZGVyIHdhcyBsb2FkZWQgYmVmb3JlIGpxdWVyeS5vYnNlcnZhYmxlXG5cdFx0eyAvLyBqc3JlbmRlciBub3QgbG9hZGVkIHNvIHNldCB1cCAkLnZpZXdzIGFuZCAkLnZpZXdzLnN1YiBoZXJlLCBhbmQgbWVyZ2UgYmFjayBpbiBqc3JlbmRlciBpZiBsb2FkZWQgYWZ0ZXJ3YXJkc1xuXHRcdFx0anN2aWV3czogdmVyc2lvbk51bWJlcixcblx0XHRcdHN1Yjoge1xuXHRcdFx0XHQvLyBzdWJzY3JpcHRpb24sIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0XHRzZXR0aW5nczoge31cblx0XHRcdH0sXG5cdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRhZHZhbmNlZDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0XHQkc3ViU2V0dGluZ3NBZHZhbmNlZCA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZCA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZCB8fCB7X2pzdjogdHJ1ZX07XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdFx0XHQ/IChcblx0XHRcdFx0XHRcdFx0XCJfanN2XCIgaW4gdmFsdWUgJiYgKCRzdWJTZXR0aW5nc0FkdmFuY2VkLl9qc3YgPSB2YWx1ZS5fanN2KSxcblx0XHRcdFx0XHRcdFx0JHN1Yi5hZHZTZXQoKSxcblx0XHRcdFx0XHRcdFx0JHZpZXdzLnNldHRpbmdzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6ICRzdWJTZXR0aW5nc0FkdmFuY2VkO1xuXHRcdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHQkc3ViID0gJHZpZXdzLnN1Yixcblx0JHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncyxcblx0JHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQsXG5cdCRpc0Z1bmN0aW9uID0gJC5pc0Z1bmN0aW9uLFxuXHQkZXhwYW5kbyA9ICQuZXhwYW5kbyxcblx0JGlzQXJyYXkgPSAkLmlzQXJyYXksXG5cdE9CSkVDVCA9IFwib2JqZWN0XCI7XG5cbmlmICghJC5vYnNlcnZlKSB7XG5cblx0dmFyICRldmVudFNwZWNpYWwgPSAkLmV2ZW50LnNwZWNpYWwsXG5cdFx0c2xpY2UgPSBbXS5zbGljZSxcblx0XHRzcGxpY2UgPSBbXS5zcGxpY2UsXG5cdFx0Y29uY2F0ID0gW10uY29uY2F0LFxuXHRcdFBBUlNFSU5UID0gcGFyc2VJbnQsXG5cdFx0ck5vdFdoaXRlID0gL1xcUysvZyxcblx0XHRwcm9wZXJ0eUNoYW5nZVN0ciA9ICRzdWIucHJvcENobmcgPSAkc3ViLnByb3BDaG5nIHx8IFwicHJvcGVydHlDaGFuZ2VcIiwvLyBUaGVzZSB0d28gc2V0dGluZ3MgY2FuIGJlIG92ZXJyaWRkZW4gb24gc2V0dGluZ3MgYWZ0ZXIgbG9hZGluZ1xuXHRcdGFycmF5Q2hhbmdlU3RyID0gJHN1Yi5hcnJDaG5nID0gJHN1Yi5hcnJDaG5nIHx8IFwiYXJyYXlDaGFuZ2VcIiwgICAgICAgIC8vIGpzUmVuZGVyLCBhbmQgcHJpb3IgdG8gbG9hZGluZyBqcXVlcnkub2JzZXJ2YWJsZS5qcyBhbmQvb3IgSnNWaWV3c1xuXHRcdGNiQmluZGluZ3NTdG9yZSA9IHt9LFxuXHRcdG9ic2VydmVTdHIgPSBwcm9wZXJ0eUNoYW5nZVN0ciArIFwiLm9ic2VydmVcIixcblx0XHRvYnNlcnZlT2JqS2V5ID0gMSxcblx0XHRvYnNlcnZlQ2JLZXkgPSAxLFxuXHRcdG9ic2VydmVJbm5lckNiS2V5ID0gMSxcblx0XHQkaGFzRGF0YSA9ICQuaGFzRGF0YSxcblx0XHQkZGF0YSA9ICQuZGF0YSxcblx0XHRyZW1vdmUgPSB7fSwgLy8gZmxhZyBmb3IgcmVtb3ZlUHJvcGVydHlcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRnZXRDYktleSA9IGZ1bmN0aW9uKGNiKSB7XG5cdFx0cmV0dXJuIGNiLl9jSWQgPSBjYi5fY0lkIHx8IChcIi5vYnNcIiArIG9ic2VydmVDYktleSsrKTtcblx0fSxcblxuXHRPYmplY3RPYnNlcnZhYmxlID0gZnVuY3Rpb24obnMsIGRhdGEpIHtcblx0XHR0aGlzLl9kYXRhID0gZGF0YTtcblx0XHR0aGlzLl9ucyA9IG5zO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdEFycmF5T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKG5zLCBkYXRhKSB7XG5cdFx0dGhpcy5fZGF0YSA9IGRhdGE7XG5cdFx0dGhpcy5fbnMgPSBucztcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwQXJyYXkgPSBmdW5jdGlvbihkYXRhKSB7XG5cdFx0cmV0dXJuICRpc0FycmF5KGRhdGEpXG5cdFx0XHQ/IFtkYXRhXVxuXHRcdFx0OiBkYXRhO1xuXHR9LFxuXG5cdHJlc29sdmVQYXRoT2JqZWN0cyA9IGZ1bmN0aW9uKHBhdGhzLCByb290LCBjYWxsYmFjaykge1xuXHRcdHBhdGhzID0gcGF0aHNcblx0XHRcdD8gJGlzQXJyYXkocGF0aHMpXG5cdFx0XHRcdD8gcGF0aHNcblx0XHRcdFx0OiBbcGF0aHNdXG5cdFx0XHQ6IFtdO1xuXG5cdFx0dmFyIGksIHBhdGgsXG5cdFx0XHRvYmplY3QgPSByb290LFxuXHRcdFx0bmV4dE9iaiA9IG9iamVjdCxcblx0XHRcdGwgPSBwYXRocyAmJiBwYXRocy5sZW5ndGgsXG5cdFx0XHRvdXQgPSBbXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdHBhdGggPSBwYXRoc1tpXTtcblx0XHRcdGlmICgkaXNGdW5jdGlvbihwYXRoKSkge1xuXHRcdFx0XHRvdXQgPSBvdXQuY29uY2F0KHJlc29sdmVQYXRoT2JqZWN0cyhwYXRoLmNhbGwocm9vdCwgcm9vdCwgY2FsbGJhY2spLCByb290KSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIGlmIChcIlwiICsgcGF0aCAhPT0gcGF0aCkge1xuXHRcdFx0XHRyb290ID0gbmV4dE9iaiA9IHBhdGg7XG5cdFx0XHRcdGlmIChuZXh0T2JqICE9PSBvYmplY3QpIHtcblx0XHRcdFx0XHRvdXQucHVzaChvYmplY3QgPSBuZXh0T2JqKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChuZXh0T2JqICE9PSBvYmplY3QpIHtcblx0XHRcdFx0b3V0LnB1c2gob2JqZWN0ID0gbmV4dE9iaik7XG5cdFx0XHR9XG5cdFx0XHRvdXQucHVzaChwYXRoKTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dDtcblx0fSxcblxuXHRyZW1vdmVDYkJpbmRpbmdzID0gZnVuY3Rpb24oY2JCaW5kaW5ncywgY2JCaW5kaW5nc0lkKSB7XG5cdFx0Ly8gSWYgdGhlIGNiQmluZGluZ3MgY29sbGVjdGlvbiBpcyBlbXB0eSB3ZSB3aWxsIHJlbW92ZSBpdCBmcm9tIHRoZSBjYkJpbmRpbmdzU3RvcmVcblx0XHRmb3IgKHZhciBjYiBpbiBjYkJpbmRpbmdzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGRlbGV0ZSBjYkJpbmRpbmdzU3RvcmVbY2JCaW5kaW5nc0lkXTsgLy8gVGhpcyBiaW5kaW5nIGNvbGxlY3Rpb24gaXMgZW1wdHksIHNvIHJlbW92ZSBmcm9tIHN0b3JlXG5cdH0sXG5cblx0b25PYnNlcnZhYmxlQ2hhbmdlID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdGZ1bmN0aW9uIGlzT2IodmFsKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIHZhbCA9PT0gT0JKRUNUICYmIChwYXRoc1swXSB8fCBhbGxvd0FycmF5ICYmICRpc0FycmF5KHZhbCkpO1xuXHRcdH1cblxuXHRcdGlmICghKGV2LmRhdGEgJiYgZXYuZGF0YS5vZmYpKSB7XG5cdFx0XHQvLyBTa2lwIGlmICEhZXYuZGF0YS5vZmY6IC0gYSBoYW5kbGVyIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIChtYXliZSB3YXMgb24gaGFuZGxlciBjb2xsZWN0aW9uIGF0IGNhbGwgdGltZSAtIHRoZW4gcmVtb3ZlZCBieSBhbm90aGVyIGhhbmRsZXIpXG5cdFx0XHR2YXIgYWxsUGF0aCwgZmlsdGVyLCBwYXJlbnRPYnMsXG5cdFx0XHRcdG9sZFZhbHVlID0gZXZlbnRBcmdzLm9sZFZhbHVlLFxuXHRcdFx0XHR2YWx1ZSA9IGV2ZW50QXJncy52YWx1ZSxcblx0XHRcdFx0Y3R4ID0gZXYuZGF0YSxcblx0XHRcdFx0b2JzZXJ2ZUFsbCA9IGN0eC5vYnNlcnZlQWxsLFxuXHRcdFx0XHRjYiA9IGN0eC5jYixcblx0XHRcdFx0YWxsb3dBcnJheSA9ICFjYi5ub0FycmF5LFxuXHRcdFx0XHRwYXRocyA9IGN0eC5wYXRocyxcblx0XHRcdFx0bnMgPSBjdHgubnM7XG5cblx0XHRcdGlmIChldi50eXBlID09PSBhcnJheUNoYW5nZVN0cikge1xuXHRcdFx0XHQoY2IuYXJyYXkgfHwgY2IpLmNhbGwoY3R4LCBldiwgZXZlbnRBcmdzKTsgLy8gSWYgdGhlcmUgaXMgYW4gYXJyYXlIYW5kbGVyIGV4cGFuZG8gb24gdGhlIHJlZ3VsYXIgaGFuZGxlciwgdXNlIGl0LCBvdGhlcndpc2UgdXNlIHRoZSByZWd1bGFyIGhhbmRsZXIgZm9yIGFycmF5Q2hhbmdlIGV2ZW50cyBhbHNvIC0gZm9yIGV4YW1wbGU6ICQub2JzZXJ2ZShhcnJheSwgaGFuZGxlcilcblx0XHRcdFx0Ly8gb3Igb2JzZXJ2ZUFsbCgpIHdpdGggYW4gYXJyYXkgaW4gdGhlIGdyYXBoLiBOb3RlIHRoYXQgb24gZGF0YS1saW5rIGJpbmRpbmdzIHdlIGVuc3VyZSBhbHdheXMgdG8gaGF2ZSBhbiBhcnJheSBoYW5kbGVyIC0gJC5ub29wIGlmIG5vbmUgaXMgc3BlY2lmaWVkIGUuZy4gb24gdGhlIGRhdGEtbGlua2VkIHRhZy5cblx0XHRcdH0gZWxzZSBpZiAoY3R4LnByb3AgPT09IGV2ZW50QXJncy5wYXRoIHx8IGN0eC5wcm9wID09PSBcIipcIikge1xuXHRcdFx0XHRpZiAob2JzZXJ2ZUFsbCkge1xuXHRcdFx0XHRcdGFsbFBhdGggPSBvYnNlcnZlQWxsLl9wYXRoICsgXCIuXCIgKyBldmVudEFyZ3MucGF0aDtcblx0XHRcdFx0XHRmaWx0ZXIgPSBvYnNlcnZlQWxsLmZpbHRlcjtcblx0XHRcdFx0XHRwYXJlbnRPYnMgPSBbZXYudGFyZ2V0XS5jb25jYXQob2JzZXJ2ZUFsbC5wYXJlbnRzKCkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzT2Iob2xkVmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRvYnNlcnZlX2FwcGx5KGFsbG93QXJyYXksIG5zLCBbb2xkVmFsdWVdLCBwYXRocywgY2IsIHRydWUsIGZpbHRlciwgW3BhcmVudE9ic10sIGFsbFBhdGgpOyAvLyB1bm9ic2VydmVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGlzT2IodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRvYnNlcnZlX2FwcGx5KGFsbG93QXJyYXksIG5zLCBbdmFsdWVdLCBwYXRocywgY2IsIHVuZGVmaW5lZCwgZmlsdGVyLCBbcGFyZW50T2JzXSwgYWxsUGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChpc09iKG9sZFZhbHVlKSkgeyAvLyBvbGRWYWx1ZSBpcyBhbiBvYmplY3QsIHNvIHVub2JzZXJ2ZVxuXHRcdFx0XHRcdFx0b2JzZXJ2ZV9hcHBseShhbGxvd0FycmF5LCBucywgW29sZFZhbHVlXSwgcGF0aHMsIGNiLCB0cnVlKTsgLy8gdW5vYnNlcnZlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpc09iKHZhbHVlKSkgeyAvLyB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvIG9ic2VydmVcblx0XHRcdFx0XHRcdG9ic2VydmVfYXBwbHkoYWxsb3dBcnJheSwgbnMsIFt2YWx1ZV0sIHBhdGhzLCBjYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGN0eC5jYihldiwgZXZlbnRBcmdzKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0b2JzZXJ2ZV9hcHBseSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vICQub2JzZXJ2ZSgpLCBidXQgYWxsb3dpbmcgeW91IHRvIGluY2x1ZGUgYXJyYXlzIHdpdGhpbiB0aGUgYXJndW1lbnRzIC0gd2hpY2ggeW91IHdhbnQgZmxhdHRlbmVkLlxuXHRcdHZhciBhcmdzID0gY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpOyAvLyBGbGF0dGVuIHRoZSBhcmd1bWVudHNcblx0XHRyZXR1cm4gJG9ic2VydmUuYXBwbHkoYXJncy5zaGlmdCgpLCBhcmdzKTtcblx0fSxcblxuXHQkb2JzZXJ2ZUFsbCA9IGZ1bmN0aW9uKGNiLCBmaWx0ZXIsIHVub2JzZXJ2ZSkge1xuXHRcdG9ic2VydmVBbGwodGhpcy5fbnMsIHRoaXMuX2RhdGEsIGNiLCBmaWx0ZXIsIFtdLCBcInJvb3RcIiwgdW5vYnNlcnZlKTtcblx0fSxcblxuXHQkdW5vYnNlcnZlQWxsID0gZnVuY3Rpb24oY2IsIGZpbHRlcikge1xuXHRcdCRvYnNlcnZlQWxsLmNhbGwodGhpcywgY2IsIGZpbHRlciwgdHJ1ZSk7XG5cdH0sXG5cblx0b2JzZXJ2ZUFsbCA9IGZ1bmN0aW9uKG5hbWVzcGFjZSwgb2JqZWN0LCBjYiwgZmlsdGVyLCBwYXJlbnRPYnMsIGFsbFBhdGgsIHVub2JzZXJ2ZSwgb2JqTWFwKSB7XG5cdFx0ZnVuY3Rpb24gb2JzZXJ2ZUFycmF5SXRlbXMoYXJyLCB1bm9icykge1xuXHRcdFx0bCA9IGFyci5sZW5ndGg7XG5cdFx0XHRuZXdBbGxQYXRoID0gYWxsUGF0aCArIFwiW11cIjtcblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChhcnIsIGwsIHVub2JzLCAxKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmaWx0ZXJBbmRPYnNlcnZlQWxsKG9iaiwgcHJvcCwgdW5vYnMsIG5lc3RlZEFycmF5KSB7XG5cdFx0XHR2YXIgbmV3T2JqZWN0LCBuZXdQYXJlbnRPYnM7XG5cdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8pIHtcblx0XHRcdFx0aWYgKG5ld09iamVjdCA9ICRvYnNlcnZhYmxlLl9mbHRyKG5ld0FsbFBhdGgsIG9ialtwcm9wXSwgbmV4dFBhcmVudE9icywgZmlsdGVyKSkge1xuXHRcdFx0XHRcdG5ld1BhcmVudE9icyA9IG5leHRQYXJlbnRPYnMuc2xpY2UoKTtcblx0XHRcdFx0XHRpZiAobmVzdGVkQXJyYXkgJiYgdXBkYXRlZFRndCAmJiBuZXdQYXJlbnRPYnNbMF0gIT09IHVwZGF0ZWRUZ3QpIHtcblx0XHRcdFx0XHRcdG5ld1BhcmVudE9icy51bnNoaWZ0KHVwZGF0ZWRUZ3QpOyAvLyBGb3IgYXJyYXkgY2hhbmdlIGV2ZW50cyB3aGVuIG9ic2VydmluZyBhbiBhcnJheSB3aGljaCBpcyBub3QgdGhlIHJvb3QsIG5lZWQgdG8gYWRkIHVwZGF0ZWQgYXJyYXkgdG8gcGFyZW50T2JzXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9ic2VydmVBbGwobmFtZXNwYWNlLCBuZXdPYmplY3QsIGNiLCBmaWx0ZXIgfHwgKG5lc3RlZEFycmF5ID8gdW5kZWZpbmVkIDogMCksIG5ld1BhcmVudE9icywgbmV3QWxsUGF0aCwgdW5vYnMsIG9iak1hcCk7XG5cdFx0XHRcdFx0Ly8gSWYgbmVzdGVkIGFycmF5LCBuZWVkIHRvIG9ic2VydmUgdGhlIGFycmF5IHRvbyAtIHNvIHNldCBmaWx0ZXIgdG8gdW5kZWZpbmVkXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiB3cmFwcGVkQ2IoZXYsIGV2ZW50QXJncykge1xuXHRcdFx0Ly8gVGhpcyBvYmplY3QgaXMgY2hhbmdpbmcuXG5cdFx0XHRhbGxQYXRoID0gZXYuZGF0YS5vYnNlcnZlQWxsLl9wYXRoO1xuXHRcdFx0dXBkYXRlZFRndCA9IGV2LnRhcmdldDtcblx0XHRcdHN3aXRjaCAoZXZlbnRBcmdzLmNoYW5nZSkgeyAvLyBvYnNlcnZlQWxsL3Vub2JzZXJ2ZUFsbCBvbiBhZGRlZCBvciByZW1vdmVkIG9iamVjdHNcblx0XHRcdFx0Y2FzZSBcImluc2VydFwiOlxuXHRcdFx0XHRcdG9ic2VydmVBcnJheUl0ZW1zKGV2ZW50QXJncy5pdGVtcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJyZW1vdmVcIjpcblx0XHRcdFx0XHRvYnNlcnZlQXJyYXlJdGVtcyhldmVudEFyZ3MuaXRlbXMsIHRydWUpOyAvLyB1bm9ic2VydmVBbGwgb24gcmVtb3ZlZCBpdGVtc1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwic2V0XCI6XG5cdFx0XHRcdFx0bmV3QWxsUGF0aCA9IGFsbFBhdGggKyBcIi5cIiArIGV2ZW50QXJncy5wYXRoO1xuXHRcdFx0XHRcdGZpbHRlckFuZE9ic2VydmVBbGwoZXZlbnRBcmdzLCBcIm9sZFZhbHVlXCIsIHRydWUpOyAvLyB1bm9ic2VydmUgb2xkIHZhbHVlXG5cdFx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChldmVudEFyZ3MsIFwidmFsdWVcIik7IC8vIG9ic2VydmUgbmV3IHZhbHVlXG5cdFx0XHR9XG5cdFx0XHR1cGRhdGVkVGd0ID0gdW5kZWZpbmVkO1xuXHRcdFx0Y2IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gT2JzZXJ2ZSB0aGlzIG9iamVjdCAoaW52b2tlIHRoZSBjYWxsYmFjaylcblx0XHR9XG5cblx0XHR2YXIgbCwgaXNPYmplY3QsIG5ld0FsbFBhdGgsIG5leHRQYXJlbnRPYnMsIHVwZGF0ZWRUZ3QsIG9iSWQsXG5cdFx0XHRub3RSZW1vdmluZyA9ICFvYmpNYXAgfHwgb2JqTWFwLnVuIHx8ICF1bm9ic2VydmU7IC8vIHRydWUgdW5sZXNzIGl0IGlzIGFuIG9ic2VydmVBbGwgY2FsbCAobm90IHVub2JzZXJ2ZUFsbCkgYW5kIHdlIGFyZSByZW1vdmluZyBhIGxpc3RlbmVyIChub3QgYWRkaW5nIG9uZSlcblxuXHRcdGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gT0JKRUNUKSB7XG5cdFx0XHRuZXh0UGFyZW50T2JzID0gW29iamVjdF0uY29uY2F0KHBhcmVudE9icyk7IC8vIFRoZSBwYXJlbnRPYnMgY2hhaW4gZm9yIHRoZSBuZXh0IGRlcHRoIG9mIG9ic2VydmVBbGxcblx0XHRcdGlzT2JqZWN0ID0gJGlzQXJyYXkob2JqZWN0KSA/IFwiXCIgOiBcIipcIjtcblx0XHRcdGlmIChvYmpNYXAgJiYgbm90UmVtb3ZpbmcgJiYgJGhhc0RhdGEob2JqZWN0KSAmJiBvYmpNYXBbb2JJZCA9ICRkYXRhKG9iamVjdCkub2JJZF0pIHtcblx0XHRcdFx0b2JqTWFwW29iSWRdKys7XG5cdFx0XHRcdHJldHVybjsgLy8gVGhpcyBvYmplY3QgaGFzIGFscmVhZHkgYmVpbmcgb2JzZXJ2ZWQvdW5vYnNlcnZlZCBieSB0aGlzIG9ic2VydmVBbGwvdW5vYnNlcnZlQWxsIGNhbGwgKG11c3QgYmUgYSBjeWNsaWMgb2JqZWN0IGdyYXBoKSBzbyBza2lwLCB0byBhdm9pZFxuXHRcdFx0XHQvLyBzdGFjayBvdmVyZmxvdy9tdWx0aXBsZSBpbnN0YW5jZXMgb2YgbGlzdGVuZXIuIFNlZSBqc3ZpZXdzL3B1bGwvMzA1XG5cdFx0XHRcdC8vIE5PVEUgLSBXRSBETyBOT1Qgc3VwcG9ydCBPYnNlcnZlQWxsIG9uIGRhdGEgd2l0aCBjeWNsaWMgZ3JhcGhzIHdoaWNoIGluY2x1ZGUgRFVQTElDQVRFIFJFRkVSRU5DRVMgVE8gQVJSQVkgUFJPUEVSVElFUyAtIHN1Y2ggYXMgZGF0YS5jaGlsZHJlbiA9IGRhdGEuZGVzY2VuZGFudHMgPSBbXVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFvYmpNYXApIHtcblx0XHRcdFx0b2JqTWFwID0ge3VuOiB1bm9ic2VydmV9OyAvLyBNYXAgb2JqZWN0IHRvIHJlZ2lzdGVyIG9ic2VydmVkIG9iamVjdHMgZm9yIHRoaXMgb2JzZXJ2ZUFsbFxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2IpIHtcblx0XHRcdFx0Ly8gT2JzZXJ2ZSB0aGlzIG9iamVjdCBvciBhcnJheSAtIGFuZCBhbHNvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byBvYmplY3QgZ3JhcGgsIHRvIGFkZCBvciByZW1vdmUgb2JzZXJ2ZXJzIGZyb20gdGhlIG1vZGlmaWVkIG9iamVjdCBncmFwaFxuXHRcdFx0XHRpZiAoaXNPYmplY3QgfHwgZmlsdGVyICE9PSAwKSB7XG5cdFx0XHRcdFx0Ly8gSWYgYW4gb2JqZWN0LCBvYnNlcnZlIHRoZSBvYmplY3QuIElmIGFuIGFycmF5LCBvbmx5IGFkZCBhcnJheUNoYW5nZSBiaW5kaW5nIGlmIGhhcyBmaWx0ZXIgb3IgaWYgZmlsdGVyIGlzIHVuZGVmaW5lZCAoIT09IDApIC0gd2hpY2hcblx0XHRcdFx0XHQvLyBpcyB0aGUgY2FzZSBmb3IgdG9wLWxldmVsIGNhbGxzIG9yIGZvciBuZXN0ZWQgYXJyYXkgKGFycmF5IGl0ZW0gb2YgYW4gYXJyYXkgLSBlLmcuIG1lbWJlciBvZiAyLWRpbWVuc2lvbmFsIGFycmF5KS5cblx0XHRcdFx0XHQvLyBGb3IgYXJyYXkgcHJvcGVydGllcyBsb3dlciBpbiB0aGUgdHJlZSwgd2l0aCBubyBmaWx0ZXIsIGZpbHRlciBpcyBzZXQgdG8gMCBpbiBmaWx0ZXJBbmRPYnNlcnZlQWxsLCBzbyBubyBhcnJheUNoYW5nZSBiaW5kaW5nIGhlcmUsXG5cdFx0XHRcdFx0Ly8gc2luY2UgdGhleSBnZXQgYXJyYXlDaGFuZ2UgYmluZGluZyBhZGRlZCBkdXJpbmcgcmVndWxhciAkLm9ic2VydmUoYXJyYXkgLi4uKSBiaW5kaW5nLlxuXHRcdFx0XHRcdHdyYXBwZWRDYi5fY0lkID0gZ2V0Q2JLZXkoY2IpOyAvLyBJZGVudGlmeSB3cmFwcGVkIGNhbGxiYWNrIHdpdGggdW53cmFwcGVkIGNhbGxiYWNrLCBzbyB1bm9ic2VydmVBbGwgd2lsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgcHJldmlvdXMgb2JzZXJ2ZUFsbCB3cmFwcGVkIGNhbGxiYWNrLCBpZiBpbm5lciBjYWxsYmFjayB3YXMgdGhlIHNhbWU7XG5cdFx0XHRcdFx0aWYgKG5vdFJlbW92aW5nKSB7XG5cdFx0XHRcdFx0XHQkb2JzZXJ2ZShuYW1lc3BhY2UsIG9iamVjdCwgaXNPYmplY3QsIHdyYXBwZWRDYiwgdW5vYnNlcnZlLCBmaWx0ZXIsIG5leHRQYXJlbnRPYnMsIGFsbFBhdGgpO1xuXHRcdFx0XHRcdFx0b2JJZCA9ICRkYXRhKG9iamVjdCkub2JJZDtcblx0XHRcdFx0XHRcdG9iak1hcFtvYklkXSA9IChvYmpNYXBbb2JJZF0gfHwgMCkgKyAxOyAvLyBSZWdpc3RlciBvbiBtYXAgb2Ygb2JqZWN0cyBvYnNlcnZlZC91bm9ic2VydmVkIGJ5IHRoaXMgb2JzZXJ2ZUFsbC91bm9ic2VydmVBbGwgY2FsbFxuXHRcdFx0XHRcdFx0XHQvLy0gb3IgcmVtb3ZlIGZyb20gbWFwIGlmIHdlIGFyZSByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIG9ic2VydmVBbGwgY2FsbC4gKEF2b2lkIGR1cHMsIGZvciBjeWNsaWMgZ3JhcGhzKVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoLS1vYmpNYXBbJGRhdGEob2JqZWN0KS5vYklkXSkge1xuXHRcdFx0XHRcdFx0XHQvLyBSZWdpc3RlciBvbiBtYXAgb2Ygb2JqZWN0cyBvYnNlcnZlZC91bm9ic2VydmVkIGJ5IHRoaXMgb2JzZXJ2ZUFsbC91bm9ic2VydmVBbGwgY2FsbFxuXHRcdFx0XHRcdFx0XHQvLy0gb3IgcmVtb3ZlIGZyb20gbWFwIGlmIHdlIGFyZSByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIG9ic2VydmVBbGwgY2FsbC4gKEF2b2lkIGR1cHMsIGZvciBjeWNsaWMgZ3JhcGhzKVxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQkb2JzZXJ2ZShuYW1lc3BhY2UsIG9iamVjdCwgaXNPYmplY3QsIHdyYXBwZWRDYiwgdW5vYnNlcnZlLCBmaWx0ZXIsIG5leHRQYXJlbnRPYnMsIGFsbFBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gTm8gY2FsbGJhY2suIEp1c3QgdW5vYnNlcnZlIGlmIHVub2JzZXJ2ZSA9PT0gdHJ1ZS5cblx0XHRcdFx0aWYgKG9iak1hcCkge1xuXHRcdFx0XHRcdG9iak1hcFskZGF0YShvYmplY3QpLm9iSWRdID0gMTsgLy8gUmVnaXN0ZXIgb24gbWFwIG9mIG9iamVjdHMgdW5vYnNlcnZlZCBieSB0aGlzIHVub2JzZXJ2ZUFsbCBjYWxsLiAoQXZvaWQgZHVwcywgZm9yIGN5Y2xpYyBncmFwaHMpXG5cdFx0XHRcdH1cblx0XHRcdFx0JG9ic2VydmUobmFtZXNwYWNlLCBvYmplY3QsIGlzT2JqZWN0LCB1bmRlZmluZWQsIHVub2JzZXJ2ZSwgZmlsdGVyLCBuZXh0UGFyZW50T2JzLCBhbGxQYXRoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzT2JqZWN0KSB7XG5cdFx0XHRcdC8vIENvbnRpbnVlIHN0ZXBwaW5nIHRocm91Z2ggb2JqZWN0IGdyYXBoLCBvYnNlcnZpbmcgb2JqZWN0IGFuZCBhcnJheXNcblx0XHRcdFx0Ly8gVG8gb3ZlcnJpZGUgZmlsdGVyaW5nLCBwYXNzIGluIGZpbHRlciBmdW5jdGlvbiwgb3IgcmVwbGFjZSAkLm9ic2VydmFibGUuX2ZsdHJcblx0XHRcdFx0Zm9yIChsIGluIG9iamVjdCkge1xuXHRcdFx0XHRcdG5ld0FsbFBhdGggPSBhbGxQYXRoICsgXCIuXCIgKyBsO1xuXHRcdFx0XHRcdGZpbHRlckFuZE9ic2VydmVBbGwob2JqZWN0LCBsLCB1bm9ic2VydmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgeyAvLyBPYnNlcnZlIGl0ZW1zIGluIEFycmF5XG5cdFx0XHRcdG9ic2VydmVBcnJheUl0ZW1zKG9iamVjdCwgdW5vYnNlcnZlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0c2hhbGxvd0ZpbHRlciA9IGZ1bmN0aW9uKGFsbFBhdGggLyosIG9iamVjdCwgcGFyZW50T2JzKi8pIHtcblx0XHRyZXR1cm4gYWxsUGF0aC5pbmRleE9mKFwiLlwiKSA8IDAgJiYgYWxsUGF0aC5pbmRleE9mKFwiW1wiKSA8IDA7XG5cdH0sXG5cblx0JHVub2JzZXJ2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFtdLnB1c2guY2FsbChhcmd1bWVudHMsIHRydWUpOyAvLyBBZGQgdHJ1ZSBhcyBhZGRpdGlvbmFsIGZpbmFsIGFyZ3VtZW50XG5cdFx0cmV0dXJuICRvYnNlcnZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdH07XG5cblx0JG9ic2VydmUgPSBmdW5jdGlvbigpIHtcblx0XHQvLyAkLm9ic2VydmUoW25hbWVzcGFjZSwgXXJvb3QsIFsxIG9yIG1vcmUgb2JqZWN0cywgcGF0aCBvciBwYXRoIEFycmF5IHBhcmFtcy4uLl0sIGNhbGxiYWNrWywgY29udGV4dENhbGxiYWNrXVssIHVub2JzZXJ2ZV0pXG5cblx0XHRmdW5jdGlvbiBpbm5lck9ic2VydmUoKSB7XG5cblx0XHRcdGZ1bmN0aW9uIG9ic2VydmVPbk9mZihuYW1lc3BhY2UsIHBhdGhTdHIsIGlzQXJyYXlCaW5kaW5nLCBvZmYpIHtcblx0XHRcdFx0dmFyIGosIGV2RGF0YSxcblx0XHRcdFx0XHRvYklkRXhwYW5kbyA9ICRoYXNEYXRhKG9iamVjdCksXG5cdFx0XHRcdFx0Ym91bmRPYk9yQXJyID0gd3JhcEFycmF5KG9iamVjdCksXG5cdFx0XHRcdFx0cHJudE9icyA9IHBhcmVudE9icyxcblx0XHRcdFx0XHRhbGxQdGggPSBhbGxQYXRoO1xuXG5cdFx0XHRcdG5hbWVzcGFjZSA9IGluaXRpYWxOcyA/IG5hbWVzcGFjZSArIFwiLlwiICsgaW5pdGlhbE5zIDogbmFtZXNwYWNlO1xuXG5cdFx0XHRcdGlmICghdW5vYnNlcnZlICYmIChvZmYgfHwgaXNBcnJheUJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0ZXZlbnRzID0gb2JJZEV4cGFuZG8gJiYgJC5fZGF0YShvYmplY3QpO1xuXHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cyAmJiBldmVudHMuZXZlbnRzO1xuXHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cyAmJiBldmVudHNbaXNBcnJheUJpbmRpbmcgPyBhcnJheUNoYW5nZVN0ciA6IHByb3BlcnR5Q2hhbmdlU3RyXTtcblx0XHRcdFx0XHRlbCA9IGV2ZW50cyAmJiBldmVudHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChlbC0tKSB7IC8vIFNraXAgZHVwbGljYXRlc1xuXHRcdFx0XHRcdFx0ZGF0YSA9IGV2ZW50c1tlbF0gJiYgZXZlbnRzW2VsXS5kYXRhO1xuXHRcdFx0XHRcdFx0aWYgKGRhdGEgJiYgKG9mZiAmJiBkYXRhLm5zICE9PSBpbml0aWFsTnNcblx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBvYnNlcnZpbmcsIGRvbid0IHVuYmluZCBkdXBzIHVubGVzcyB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlXG5cdFx0XHRcdFx0XHRcdHx8ICFvZmYgJiYgZGF0YS5ucyA9PT0gaW5pdGlhbE5zICYmIGRhdGEuY2IgJiYgZGF0YS5jYi5fY0lkID09PSBjYWxsYmFjay5fY0lkKSlcblx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBvYnNlcnZpbmcgYW5kIGRvaW5nIGFycmF5IGJpbmRpbmcsIGRvbid0IGJpbmQgZHVwcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlIChEdXBzIGNhbiBoYXBwZW4gZS5nLiB3aXRoIHtee2ZvciBwZW9wbGUgfmZvbz1wZW9wbGV9fSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodW5vYnNlcnZlIHx8IG9mZikge1xuXHRcdFx0XHRcdCQoYm91bmRPYk9yQXJyKS5vZmYobmFtZXNwYWNlLCBvbk9ic2VydmFibGVDaGFuZ2UpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGV2RGF0YSA9IGlzQXJyYXlCaW5kaW5nID8ge31cblx0XHRcdFx0XHRcdDoge1xuXHRcdFx0XHRcdFx0XHRmdWxsUGF0aDogcGF0aCxcblx0XHRcdFx0XHRcdFx0cGF0aHM6IHBhdGhTdHIgPyBbcGF0aFN0cl0gOiBbXSxcblx0XHRcdFx0XHRcdFx0cHJvcDogcHJvcFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRldkRhdGEubnMgPSBpbml0aWFsTnM7XG5cdFx0XHRcdFx0ZXZEYXRhLmNiID0gY2FsbGJhY2s7XG5cblx0XHRcdFx0XHRpZiAoYWxsUGF0aCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvYnNlcnZlQWxsIGNhbGxcblx0XHRcdFx0XHRcdGV2RGF0YS5vYnNlcnZlQWxsID0ge1xuXHRcdFx0XHRcdFx0XHRfcGF0aDogYWxsUHRoLFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBmdW5jdGlvbigpIHsgLy8gU3RlcCB0aHJvdWdoIHBhdGggYW5kIHBhcmVudE9icyBwYXJlbnQgY2hhaW4sIHJlcGxhY2luZyAnW10nIGJ5ICdbbl0nIGJhc2VkIG9uIGN1cnJlbnQgaW5kZXggb2Ygb2JqZWN0cyBpbiBwYXJlbnQgYXJyYXlzLlxuXHRcdFx0XHRcdFx0XHRcdGogPSBwcm50T2JzLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYWxsUHRoLnJlcGxhY2UoL1tbLl0vZywgZnVuY3Rpb24oYWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRqLS07XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYWxsID09PSBcIltcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/IFwiW1wiICsgJC5pbkFycmF5KHBybnRPYnNbaiAtIDFdLCBwcm50T2JzW2pdKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IFwiLlwiO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJudE9iczsgLy8gVGhlIGNoYWluIG9mIHBhcmVudHMgYmV0d2VlbiB0aGUgbW9kaWZpZWQgb2JqZWN0IGFuZCB0aGUgcm9vdCBvYmplY3QgdXNlZCBpbiB0aGUgb2JzZXJ2ZUFsbCgpIGNhbGxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0ZmlsdGVyOiBmaWx0ZXJcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCQoYm91bmRPYk9yQXJyKS5vbihuYW1lc3BhY2UsIG51bGwsIGV2RGF0YSwgb25PYnNlcnZhYmxlQ2hhbmdlKTtcblx0XHRcdFx0XHRpZiAoY2JCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Ly8gQWRkIG9iamVjdCB0byBjYkJpbmRpbmdzXG5cdFx0XHRcdFx0XHRjYkJpbmRpbmdzWyRkYXRhKG9iamVjdCkub2JJZCB8fCAkZGF0YShvYmplY3QsIFwib2JJZFwiLCBvYnNlcnZlT2JqS2V5KyspXSA9IG9iamVjdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gZ2V0SW5uZXJDYihleHByT2IpIHtcblx0XHRcdFx0Ly8gUmV0dXJucyB0aGUgaW5uZXJDYiB1c2VkIGZvciB1cGRhdGluZyBhIGNvbXB1dGVkIGluIGEgY29tcGlsZWQgZXhwcmVzc2lvbiAoc2V0dGluZyB0aGUgbmV3IGluc3RhbmNlIGFzIGV4cHJPYi5vYiwgdW5vYnNlcnZpbmcgdGhlIHByZXZpb3VzIG9iamVjdCxcblx0XHRcdFx0Ly8gYW5kIG9ic2VydmluZyB0aGUgbmV3IG9uZSksIHRoZW4gY2FsbGluZyB0aGUgb3V0ZXJDQiAtIGkuZS4gdGhlIGhhbmRsZXIgZm9yIHRoZSB3aG9sZSBjb21waWxlZCBleHByZXNzaW9uLlxuXHRcdFx0XHQvLyBJbml0aWFsaXplZCBleHByT2Iub2IgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LlxuXHRcdFx0XHQvLyBVc2VzIHRoZSBjb250ZXh0Q2IgY2FsbGJhY2sgdG8gZXhlY3V0ZSB0aGUgY29tcGlsZWQgZXhwck9iIHRlbXBsYXRlIGluIHRoZSBjb250ZXh0IG9mIHRoZSB2aWV3L2RhdGEgZXRjLiB0byBnZXQgdGhlIHJldHVybmVkIHZhbHVlLCB0eXBpY2FsbHkgYW4gb2JqZWN0IG9yIGFycmF5LlxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhbiBhcnJheSwgcmVnaXN0ZXJzIGFycmF5IGJpbmRpbmdcblx0XHRcdFx0dmFyIG9yaWdSdCA9IHJvb3Q7XG5cdFx0XHRcdC8vIE5vdGU6IEZvciBqc3ZpZXdzL2lzc3Vlcy8yOTIgY3R4Q2Igd2lsbCBuZWVkIHZhciBjdHhDYiA9IGNvbnRleHRDYiB8fCBmdW5jdGlvbihleHByT2IsIG9yaWdSdCkge3JldHVybiBleHByT2IuX2pzdihvcmlnUnQpO307XG5cblx0XHRcdFx0ZXhwck9iLm9iID0gY29udGV4dENiKGV4cHJPYiwgb3JpZ1J0KTsgLy8gSW5pdGlhbGl6ZSBvYmplY3RcblxuXHRcdFx0XHRyZXR1cm4gZXhwck9iLmNiID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdHZhciBvYmogPSBleHByT2Iub2IsIC8vIFRoZSBvbGQgb2JqZWN0XG5cdFx0XHRcdFx0XHRzdWIgPSBleHByT2Iuc2IsXG5cdFx0XHRcdFx0XHRuZXdPYmogPSBjb250ZXh0Q2IoZXhwck9iLCBvcmlnUnQpO1xuXG5cdFx0XHRcdFx0aWYgKG5ld09iaiAhPT0gb2JqKSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iaiA9PT0gT0JKRUNUKSB7XG5cdFx0XHRcdFx0XHRcdGJpbmRBcnJheShvYmosIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3ViIHx8IGFsbG93QXJyYXkgJiYgJGlzQXJyYXkob2JqKSkge1xuXHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbb2JqXSwgc3ViLCBjYWxsYmFjaywgY29udGV4dENiLCB0cnVlKTsgLy8gdW5vYnNlcnZlIG9uIHRoZSBvbGQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGV4cHJPYi5vYiA9IG5ld09iajtcblx0XHRcdFx0XHRcdC8vIFB1dCB0aGUgdXBkYXRlZCBvYmplY3QgaW5zdGFuY2Ugb250byB0aGUgZXhwck9iIGluIHRoZSBwYXRocyBhcnJheSwgc28gc3Vic2VxdWVudCBzdHJpbmcgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgb2JqZWN0XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG5ld09iaiA9PT0gT0JKRUNUKSB7XG5cdFx0XHRcdFx0XHRcdGJpbmRBcnJheShuZXdPYmopO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3ViIHx8IGFsbG93QXJyYXkgJiYgJGlzQXJyYXkobmV3T2JqKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIGFycmF5IGJpbmRpbmdcblx0XHRcdFx0XHRcdFx0XHRpbm5lck9ic2VydmUoW25ld09ial0sIHN1YiwgY2FsbGJhY2ssIGNvbnRleHRDYik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQ2FsbCB0aGUgb3V0ZXJDYiAtIHRvIGV4ZWN1dGUgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb24gdGhhdCB0aGlzIGNvbXB1dGVkIGlzIHBhcnQgb2Zcblx0XHRcdFx0XHRjYWxsYmFjayhldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gYmluZEFycmF5KGFyciwgdW5iaW5kLCBpc0FycmF5LCByZWxQYXRoKSB7XG5cdFx0XHRcdGlmIChhbGxvd0FycmF5KSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGNhbGwgdG8gb2JzZXJ2ZSB0aGF0IGRvZXMgbm90IGNvbWUgZnJvbSBvYnNlcnZlQW5kQmluZCAodGFnIGJpbmRpbmcpLCBzbyB3ZSBhbGxvdyBhcnJheUNoYW5nZSBiaW5kaW5nXG5cdFx0XHRcdFx0dmFyIHByZXZPYmogPSBvYmplY3QsXG5cdFx0XHRcdFx0XHRwcmV2QWxsUGF0aCA9IGFsbFBhdGg7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBhcnI7XG5cdFx0XHRcdFx0aWYgKHJlbFBhdGgpIHtcblx0XHRcdFx0XHRcdG9iamVjdCA9IGFycltyZWxQYXRoXTtcblx0XHRcdFx0XHRcdGFsbFBhdGggKz0gXCIuXCIgKyByZWxQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoZmlsdGVyICYmIG9iamVjdCkge1xuXHRcdFx0XHRcdFx0b2JqZWN0ID0gJG9ic2VydmFibGUuX2ZsdHIoYWxsUGF0aCwgb2JqZWN0LCByZWxQYXRoID8gW2Fycl0uY29uY2F0KHBhcmVudE9icykgOiBwYXJlbnRPYnMsIGZpbHRlcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvYmplY3QgJiYgKGlzQXJyYXkgfHwgJGlzQXJyYXkob2JqZWN0KSkpIHtcblx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihhcnJheUNoYW5nZVN0ciArIFwiLm9ic2VydmVcIiArIChjYWxsYmFjayA/IGdldENiS2V5KGNhbGxiYWNrKSA6IFwiXCIpLCB1bmRlZmluZWQsIHRydWUsIHVuYmluZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9iamVjdCA9IHByZXZPYmo7XG5cdFx0XHRcdFx0YWxsUGF0aCA9IHByZXZBbGxQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpLCBwLCBza2lwLCBwYXJ0cywgcHJvcCwgcGF0aCwgZGVwLCB1bm9ic2VydmUsIGNhbGxiYWNrLCBjYklkLCBpbklkLCBlbCwgZGF0YSwgZXZlbnRzLCBjb250ZXh0Q2IsIGlubmVyQ29udGV4dENiLFxuXHRcdFx0XHRpdGVtcywgY2JCaW5kaW5ncywgZGVwdGgsIGlubmVyQ2IsIHBhcmVudE9icywgYWxsUGF0aCwgZmlsdGVyLCBpbml0TnNBcnIsIGluaXROc0Fyckxlbixcblx0XHRcdFx0bnMgPSBvYnNlcnZlU3RyLFxuXHRcdFx0XHRwYXRocyA9IHRoaXMgIT0gMSAvLyBVc2luZyAhPSBmb3IgSUU8MTAgYnVnLSBzZWUganN2aWV3cy9pc3N1ZXMvMjM3XG5cdFx0XHRcdFx0PyBjb25jYXQuYXBwbHkoW10sIGFyZ3VtZW50cykgLy8gRmxhdHRlbiB0aGUgYXJndW1lbnRzIC0gdGhpcyBpcyBhICdyZWN1cnNpdmUgY2FsbCcgd2l0aCBwYXJhbXMgdXNpbmcgdGhlICd3cmFwcGVkIGFycmF5J1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBzdHlsZSAtIHN1Y2ggYXMgaW5uZXJPYnNlcnZlKFtvYmplY3RdLCBwYXRoLnBhdGgsIFtvcmlnUm9vdF0sIHBhdGgucHJtLCBpbm5lckNiLCAuLi4pO1xuXHRcdFx0XHRcdDogc2xpY2UuY2FsbChhcmd1bWVudHMpLCAvLyBEb24ndCBmbGF0dGVuIC0gdGhpcyBpcyB0aGUgZmlyc3QgJ3RvcC1sZXZlbCBjYWxsLCB0byBpbm5lck9ic2VydmUuYXBwbHkoMSwgcGF0aHMpXG5cdFx0XHRcdGxhc3RBcmcgPSBwYXRocy5wb3AoKSB8fCBmYWxzZSxcblx0XHRcdFx0cm9vdCA9IHBhdGhzLnNoaWZ0KCksXG5cdFx0XHRcdG9iamVjdCA9IHJvb3QsXG5cdFx0XHRcdGwgPSBwYXRocy5sZW5ndGg7XG5cblx0XHRcdGlmIChsYXN0QXJnICsgXCJcIiA9PT0gbGFzdEFyZykgeyAvLyBJZiBsYXN0IGFyZyBpcyBhIHN0cmluZyB0aGVuIHRoaXMgb2JzZXJ2ZSBjYWxsIGlzIHBhcnQgb2YgYW4gb2JzZXJ2ZUFsbCBjYWxsLFxuXHRcdFx0XHRhbGxQYXRoID0gbGFzdEFyZzsgICAgICAgICAgLy8gYW5kIHRoZSBsYXN0IHRocmVlIGFyZ3MgYXJlIHRoZSBwYXJlbnRPYnMgYXJyYXksIHRoZSBmaWx0ZXIsIGFuZCB0aGUgYWxsUGF0aCBzdHJpbmcuXG5cdFx0XHRcdHBhcmVudE9icyA9IHBhdGhzLnBvcCgpO1xuXHRcdFx0XHRmaWx0ZXIgPSBwYXRocy5wb3AoKTtcblx0XHRcdFx0bGFzdEFyZyA9ICEhcGF0aHMucG9wKCk7IC8vIHVub2JzZXJ2ZVxuXHRcdFx0XHRsIC09IDM7XG5cdFx0XHR9XG5cdFx0XHRpZiAobGFzdEFyZyA9PT0gISFsYXN0QXJnKSB7XG5cdFx0XHRcdHVub2JzZXJ2ZSA9IGxhc3RBcmc7XG5cdFx0XHRcdGxhc3RBcmcgPSBwYXRoc1tsLTFdO1xuXHRcdFx0XHRsYXN0QXJnID0gbCAmJiBsYXN0QXJnICsgXCJcIiAhPT0gbGFzdEFyZyAmJiAoIWxhc3RBcmcgfHwgJGlzRnVuY3Rpb24obGFzdEFyZykpID8gKGwtLSwgcGF0aHMucG9wKCkpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAodW5vYnNlcnZlICYmICFsICYmICRpc0Z1bmN0aW9uKHJvb3QpKSB7XG5cdFx0XHRcdFx0bGFzdEFyZyA9IHJvb3Q7XG5cdFx0XHRcdFx0cm9vdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y2FsbGJhY2sgPSBsYXN0QXJnO1xuXHRcdFx0aWYgKGwgJiYgJGlzRnVuY3Rpb24ocGF0aHNbbCAtIDFdKSkge1xuXHRcdFx0XHRpbm5lckNvbnRleHRDYiA9IGNvbnRleHRDYiA9IGNhbGxiYWNrO1xuXHRcdFx0XHRjYWxsYmFjayA9IHBhdGhzLnBvcCgpO1xuXHRcdFx0XHRsLS07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh1bm9ic2VydmUgJiYgY2FsbGJhY2sgJiYgIWNhbGxiYWNrLl9jSWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVc2UgYSB1bmlxdWUgbmFtZXNwYWNlIChlLmcuIG9iczcpIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9ic2VydmUoKSBjYWxsYmFjayB0byBhbGxvdyB1bm9ic2VydmUgdG8gcmVtb3ZlIGhhbmRsZXJzXG5cdFx0XHRucyArPSBjYWxsYmFja1xuXHRcdFx0XHQ/ICgoaW5JZCA9IGNhbGxiYWNrLl9pbklkIHx8IFwiXCIpLCB1bm9ic2VydmUpXG5cdFx0XHRcdFx0PyBjYWxsYmFjay5fY0lkICsgaW5JZFxuXHRcdFx0XHRcdDogKGNiSWQgPSBnZXRDYktleShjYWxsYmFjaykpICsgaW5JZFxuXHRcdFx0XHQ6IFwiXCI7XG5cblx0XHRcdGlmIChjYklkICYmICF1bm9ic2VydmUpIHtcblx0XHRcdFx0Y2JCaW5kaW5ncyA9IGNiQmluZGluZ3NTdG9yZVtjYklkXSA9IGNiQmluZGluZ3NTdG9yZVtjYklkXSB8fCB7fTtcblx0XHRcdH1cblxuXHRcdFx0aW5pdE5zQXJyID0gaW5pdGlhbE5zICYmIGluaXRpYWxOcy5tYXRjaChyTm90V2hpdGUpIHx8IFtcIlwiXTtcblx0XHRcdGluaXROc0FyckxlbiA9IGluaXROc0Fyci5sZW5ndGg7XG5cblx0XHRcdHdoaWxlIChpbml0TnNBcnJMZW4tLSkge1xuXHRcdFx0XHRpbml0aWFsTnMgPSBpbml0TnNBcnJbaW5pdE5zQXJyTGVuXTtcblx0XHRcdFx0aWYgKHJvb3QgJiYgKHBhdGggPSBwYXRoc1swXSwgIXBhdGggfHwgcGF0aCArIFwiXCIgIT09IHBhdGgpKSB7XG5cdFx0XHRcdFx0aWYgKCRpc0FycmF5KHJvb3QpKSB7XG5cdFx0XHRcdFx0XHRiaW5kQXJyYXkocm9vdCwgdW5vYnNlcnZlLCB0cnVlKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHVub2JzZXJ2ZSkge1xuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIG9uT2JzZXJ2YWJsZUNoYW5nZSBoYW5kbGVycyB0aGF0IHdyYXAgdGhhdCBjYWxsYmFja1xuXHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zLCBcIlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHVub2JzZXJ2ZSAmJiAhbCAmJiAhcm9vdCkgeyAvLyB1bm9ic2VydmUoKSAtIHVub2JzZXJ2ZXMgYWxsXG5cdFx0XHRcdFx0Zm9yIChwIGluIGNiQmluZGluZ3NTdG9yZSkge1xuXHRcdFx0XHRcdFx0cCA9IGNiQmluZGluZ3NTdG9yZVtwXTtcblx0XHRcdFx0XHRcdGZvciAoZGF0YSBpbiBwKSB7XG5cdFx0XHRcdFx0XHRcdG9iamVjdCA9IHBbZGF0YV07XG5cdFx0XHRcdFx0XHRcdGlmICgkaXNBcnJheShvYmplY3QpKSB7XG5cdFx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG9iamVjdCwgdW5vYnNlcnZlLCB1bm9ic2VydmUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBvbk9ic2VydmFibGVDaGFuZ2UgaGFuZGxlcnMgdGhhdCB3cmFwIHRoYXQgY2FsbGJhY2tcblx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGRlcHRoID0gMDtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHBhdGggPSBwYXRoc1tpXTtcblx0XHRcdFx0XHRpZiAocGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwYXRoICYmIHBhdGguX2NwKSB7IC8vIENvbnRleHR1YWwgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRjb250ZXh0Q2IgPSAkc3ViLl9nY2NiKHBhdGhbMF0pOyAgIC8vIGdldENvbnRleHRDYjogR2V0IGNvbnRleHQgY2FsbGJhY2sgZm9yIHRoZSBjb250ZXh0dWFsIHZpZXcgKHdoZXJlIGNvbnRleHR1YWwgcGFyYW0gZXZhbHVhdGVkL2Fzc2lnbmVkKVxuXHRcdFx0XHRcdFx0b3JpZ1Jvb3QgPSByb290ID0gcGF0aFswXS5kYXRhOyAgICAvLyBDb250ZXh0dWFsIGRhdGFcblx0XHRcdFx0XHRcdHBhdGggPSBwYXRoWzFdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvYmplY3QgPSByb290O1xuXHRcdFx0XHRcdGlmIChcIlwiICsgcGF0aCA9PT0gcGF0aCkge1xuXHRcdFx0XHRcdFx0Ly8gQ29uc2lkZXIgc3VwcG9ydCBmb3IgY29tcHV0ZWQgcGF0aHM6IGpzdmlld3MvaXNzdWVzLzI5MlxuXHRcdFx0XHRcdFx0Ly9pZiAoL1tcXChcXFtcXCtdLy50ZXN0KHBhdGgpKSB7XG5cdFx0XHRcdFx0XHQvL1x0dmFyIGI9e2xpbmtzOnt9fSwgdCA9ICRzdWIudG1wbEZuKFwiezpcIitwYXRoK1wifVwiLCBiLCB0cnVlKSwgaXRlbXMgPSB0LnBhdGhzWzBdO1xuXHRcdFx0XHRcdFx0Ly9cdGwgKz0gaXRlbXMubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdC8vXHRzcGxpY2UuYXBwbHkocGF0aHMsIFtpLS0sIDFdLmNvbmNhdChpdGVtcykpO1xuXHRcdFx0XHRcdFx0Ly9cdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0Ly99XG5cdFx0XHRcdFx0XHRwYXJ0cyA9IHBhdGguc3BsaXQoXCJeXCIpO1xuXHRcdFx0XHRcdFx0aWYgKHBhcnRzWzFdKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdlIGJpbmQgdGhlIGxlYWYsIHBsdXMgYWRkaXRpb25hbCBub2RlcyBiYXNlZCBvbiBkZXB0aC5cblx0XHRcdFx0XHRcdFx0Ly8gXCJhLmIuY15kLmVcIiBpcyBkZXB0aCAyLCBzbyBsaXN0ZW5zIHRvIGNoYW5nZXMgb2YgZSwgcGx1cyBjaGFuZ2VzIG9mIGQgYW5kIG9mIGNcblx0XHRcdFx0XHRcdFx0ZGVwdGggPSBwYXJ0c1swXS5zcGxpdChcIi5cIikubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gcGFydHMuam9pbihcIi5cIik7XG5cdFx0XHRcdFx0XHRcdGRlcHRoID0gcGF0aC5zcGxpdChcIi5cIikubGVuZ3RoIC0gZGVwdGg7XG5cdFx0XHRcdFx0XHRcdC8vIGlmIG1vcmUgdGhhbiBvbmUgXiBpbiB0aGUgcGF0aCwgdGhlIGZpcnN0IG9uZSBkZXRlcm1pbmVzIGRlcHRoXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoY29udGV4dENiKSB7XG5cdFx0XHRcdFx0XHRcdGl0ZW1zID0gY29udGV4dENiKHBhdGgsIHJvb3QsIGRlcHRoKTtcblx0XHRcdFx0XHRcdFx0Y29udGV4dENiID0gaW5uZXJDb250ZXh0Q2I7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoaXRlbXMpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFycmF5IG9mIG9iamVjdHMgYW5kIHBhdGhzIHJldHVybmVkIGJ5IGNvbnRleHRDYiBpcyBub24gZW1wdHksIGluc2VydCB0aGVtXG5cdFx0XHRcdFx0XHRcdC8vIGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIGN1cnJlbnQgaXRlbSAocGF0aCkuIE90aGVyd2lzZSBzaW1wbHkgcmVtb3ZlIGN1cnJlbnQgaXRlbSAocGF0aClcblx0XHRcdFx0XHRcdFx0bCArPSBpdGVtcy5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0XHRzcGxpY2UuYXBwbHkocGF0aHMsIFtpLS0sIDFdLmNvbmNhdChpdGVtcykpO1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICghJGlzRnVuY3Rpb24ocGF0aCkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGNvbXBpbGVkIGZ1bmN0aW9uIGZvciBiaW5kaW5nIHRvIGFuIG9iamVjdCByZXR1cm5lZCBieSBhIGhlbHBlci9kYXRhIGZ1bmN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdC8vIFNldCBjdXJyZW50IG9iamVjdCBvbiBleHByT2Iub2IsIGFuZCBnZXQgaW5uZXJDYiBmb3IgdXBkYXRpbmcgdGhlIG9iamVjdFxuXHRcdFx0XHRcdFx0XHRcdGlubmVyQ2IgPSB1bm9ic2VydmUgPyBwYXRoLmNiIDogZ2V0SW5uZXJDYihwYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRpbm5lckNiLm5vQXJyYXkgPSAhYWxsb3dBcnJheTtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbm5lckNiLl9jdHggPSBjYWxsYmFjay5fY3R4OyBDb3VsZCBwYXNzIGNvbnRleHQgKGUuZy4gbGlua0N0eCkgZm9yIHVzZSBpbiBhIGRlcGVuZHMgPSBmdW5jdGlvbigpIHt9IGNhbGwsIHNvIGRlcGVuZHMgaXMgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgbGlua0N0eCdzXG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJDYi5fY0lkID0gY2FsbGJhY2suX2NJZDtcblx0XHRcdFx0XHRcdFx0XHQvLyBTZXQgdGhlIHNhbWUgY2JCaW5kaW5nc1N0b3JlIGtleSBhcyBmb3IgY2FsbGJhY2ssIHNvIHdoZW4gY2FsbGJhY2sgaXMgZGlzcG9zZWQsIGRpc3Bvc2FsIG9mIGlubmVyQ2IgaGFwcGVucyB0b28uXG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJDYi5faW5JZCA9IGlubmVyQ2IuX2luSWQgfHwgXCIub2JJblwiICsgb2JzZXJ2ZUlubmVyQ2JLZXkrKztcblx0XHRcdFx0XHRcdFx0XHRpZiAocGF0aC5ibmQgfHwgcGF0aC5wcm0gJiYgcGF0aC5wcm0ubGVuZ3RoIHx8ICFwYXRoLnNiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgZXhwck9iIGlzIGJvdW5kIGUuZy4gZm9vKClec3ViLnBhdGgsIG9yIGhhcyBwYXJhbWV0ZXJzIGUuZy4gZm9vKGJhcikgb3IgaXMgYSBsZWFmIG9iamVjdCAoc28gbm8gc3ViIHBhdGgpIGUuZy4gZm9vKClcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoZW4gb2JzZXJ2ZSBjaGFuZ2VzIG9uIHRoZSBvYmplY3QsIG9yIGl0cyBwYXJhbWV0ZXJzIGFuZCBzdWItcGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtvYmplY3RdLCBwYXRoLnBhdGgsIFtvcmlnUm9vdF0sIHBhdGgucHJtLCBpbm5lckNiLCBjb250ZXh0Q2IsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXRoLnNiKSB7IC8vIHN1YlBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbcGF0aC5vYl0sIHBhdGguc2IsIGNhbGxiYWNrLCBjb250ZXh0Q2IsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBvcmlnUm9vdDtcblx0XHRcdFx0XHRcdFx0XHRvYmplY3QgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gcGF0aDsgLy8gRm9yIHRvcC1sZXZlbCBjYWxscywgb2JqZWN0cyBpbiB0aGUgcGF0aHMgYXJyYXkgYmVjb21lIHRoZSBvcmlnUm9vdCBmb3Igc3Vic2VxdWVudCBwYXRocy5cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cGFydHMgPSBbcm9vdCA9IHBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR3aGlsZSAob2JqZWN0ICYmIChwcm9wID0gcGFydHMuc2hpZnQoKSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3QgPT09IE9CSkVDVCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoXCJcIiArIHByb3AgPT09IHByb3ApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAocHJvcCA9PT0gXCJcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmICgocGFydHMubGVuZ3RoIDwgZGVwdGggKyAxKSAmJiAhb2JqZWN0Lm5vZGVUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBBZGQgb2JzZXJ2ZXIgZm9yIGVhY2ggdG9rZW4gaW4gcGF0aCBzdGFydGluZyBhdCBkZXB0aCwgYW5kIG9uIHRvIHRoZSBsZWFmXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXVub2JzZXJ2ZSAmJiAoZXZlbnRzID0gJGhhc0RhdGEob2JqZWN0KSAmJiAkLl9kYXRhKG9iamVjdCkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cy5ldmVudHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50cyA9IGV2ZW50cyAmJiBldmVudHNbcHJvcGVydHlDaGFuZ2VTdHJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbCA9IGV2ZW50cyAmJiBldmVudHMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRza2lwID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGVsLS0pIHsgLy8gU2tpcCBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IGV2ZW50c1tlbF0uZGF0YTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZGF0YVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JiYgZGF0YS5ucyA9PT0gaW5pdGlhbE5zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQmJiBkYXRhLmNiLl9jSWQgPT09IGNhbGxiYWNrLl9jSWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCYmIGRhdGEuY2IuX2luSWQgPT09IGNhbGxiYWNrLl9pbklkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQmJiAoZGF0YS5wcm9wID09PSBwcm9wIHx8IGRhdGEucHJvcCA9PT0gXCIqXCIgfHwgZGF0YS5wcm9wID09PSBcIioqXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocCA9IHBhcnRzLmpvaW4oXCIuXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGEucGF0aHMucHVzaChwKTsgLy8gV2Ugd2lsbCBza2lwIHRoaXMgYmluZGluZywgYnV0IGlmIGl0IGlzIG5vdCBhIGxlYWYgYmluZGluZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gbmVlZCB0byBrZWVwIGJpbmRpbmdzIGZvciByZXN0IG9mIHBhdGgsIHJlYWR5IGZvciBpZiB0aGUgb2JqZWN0IGdldHMgc3dhcHBlZC5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNraXArKztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNraXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEdXBsaWNhdGUgYmluZGluZyhzKSBmb3VuZCwgc28gbW92ZSBvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdCA9IG9iamVjdFtwcm9wXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHByb3AgPT09IFwiKlwiIHx8IHByb3AgPT09IFwiKipcIikgeyAvLyBcIipcIiA9PiBhbGwgcHJvcGVydGllcy4gXCIqKlwiID0+IGFsbCBwcm9wZXJ0aWVzIGFuZCBzdWItcHJvcGVydGllcyAoaS5lLiBkZWVwIG9ic2VydmVBbGwgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghdW5vYnNlcnZlICYmIGV2ZW50cyAmJiBldmVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIGJpbmRpbmdzLCBzaW5jZSB0aGV5IHdpbGwgYmUgZHVwbGljYXRlcyB3aXRoIFwiKlwiIG9yIFwiKipcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIiwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wID09PSBcIipcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIik7IC8vIG9ic2VydmUgdGhlIG9iamVjdCBmb3IgYW55IHByb3BlcnR5IGNoYW5nZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAocCBpbiBvYmplY3QpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIG9ic2VydmluZyBcIipcIjogU28gKGluIGFkZGl0aW9uIHRvIGxpc3RlbmluZyB0byBwcm9wIGNoYW5nZSwgYWJvdmUpIGxpc3RlbiB0byBhcnJheWNoYW5nZSBvbiBwcm9wcyBvZiB0eXBlIGFycmF5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocCAhPT0gJGV4cGFuZG8pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG9iamVjdCwgdW5vYnNlcnZlLCB1bmRlZmluZWQsIHApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkLm9ic2VydmFibGUoaW5pdGlhbE5zLCBvYmplY3QpWyh1bm9ic2VydmUgPyBcInVuXCIgOiBcIlwiKSArIFwib2JzZXJ2ZUFsbFwiXShjYWxsYmFjayk7IC8vIG9ic2VydmUgb3IgdW5vYnNlcnZlIHRoZSBvYmplY3QgZm9yIGFueSBwcm9wZXJ0eSBjaGFuZ2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJvcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMgKyBcIi5wX1wiICsgcHJvcCwgcGFydHMuam9pbihcIl5cIikpOyAvLyBCeSB1c2luZyBcIl5cIiByYXRoZXIgdGhhbiBcIi5cIiB3ZSBlbnN1cmUgdGhhdCBkZWVwIGJpbmRpbmcgd2lsbCBiZSB1c2VkIG9uIG5ld2x5IGluc2VydGVkIG9iamVjdCBncmFwaHNcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFsbFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFsbFBhdGggKz0gXCIuXCIgKyBwcm9wO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRwcm9wID0gb2JqZWN0W3Byb3BdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICgkaXNGdW5jdGlvbihwcm9wKSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChkZXAgPSBwcm9wLmRlcGVuZHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBjb21wdXRlZCBvYnNlcnZhYmxlLiBXZSB3aWxsIG9ic2VydmUgYW55IGRlY2xhcmVkIGRlcGVuZGVuY2llc1xuXHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtvYmplY3RdLCByZXNvbHZlUGF0aE9iamVjdHMoZGVwLCBvYmplY3QsIGNhbGxiYWNrKSwgY2FsbGJhY2ssIGNvbnRleHRDYiwgdW5vYnNlcnZlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gcHJvcDtcblx0XHRcdFx0XHRcdFx0aWYgKHVub2JzZXJ2ZSAmJiBvYmplY3QgPT09IHJvb3QgJiYgKGk+bC0yIHx8IHBhdGhzW2krMV0gKyBcIlwiICE9PSBwYXRoc1tpKzFdKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIHVub2JzZXJ2ZSBhbGwgaGFuZGxlcnMgb2Ygb2JqZWN0LCBpZiBub3QgZm9sbG93ZWQgYnkgc3RyaW5nIHBhdGguXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZS5nLiQudW5vYnNlcnZlKG9iamVjdDEsIG9iamVjdDIsIFwicGF0aFwiLCBvYmplY3QzKSB3aWxsIHVub2JzZXJ2ZSBhbGwgZnJvbSBvYmplY3QxIGFuZCBvYmplY3QzLCBhbmQganVzdCBcInBhdGhcIiBsaXN0ZW5lciBmcm9tIG9iamVjdDJcblx0XHRcdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJpbmRBcnJheShvYmplY3QsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChjYklkKSB7XG5cdFx0XHRcdHJlbW92ZUNiQmluZGluZ3MoY2JCaW5kaW5ncywgY2JJZCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiB0aGUgY2JCaW5kaW5ncyB0byB0aGUgdG9wLWxldmVsIGNhbGxlciwgYWxvbmcgd2l0aCB0aGUgY2JJZFxuXHRcdFx0cmV0dXJuIHtjYklkOiBjYklkLCBibmQ6IGNiQmluZGluZ3MsIHM6IGNiQmluZGluZ3NTdG9yZX07XG5cdFx0fVxuXG5cdFx0dmFyIGluaXRpYWxOcyxcblx0XHRcdGFsbG93QXJyYXkgPSB0aGlzICE9IGZhbHNlLCAvLyBJZiB0aGlzID09PSBmYWxzZSwgdGhpcyBpcyBhIGNhbGwgZnJvbSBvYnNlcnZlQW5kQmluZCAtIGRvaW5nIGJpbmRpbmcgb2YgZGF0YWxpbmsgZXhwcmVzc2lvbnMuIFdlIGRvbid0IGJpbmRcblx0XHRcdC8vIGFycmF5Q2hhbmdlIGV2ZW50cyBpbiB0aGlzIHNjZW5hcmlvLiBJbnN0ZWFkLCB7Xntmb3J9fSBhbmQgc2ltaWxhciBkbyBzcGVjaWZpYyBhcnJheUNoYW5nZSBiaW5kaW5nIHRvIHRoZSB0YWdDdHguYXJnc1swXSB2YWx1ZSwgaW4gb25BZnRlckxpbmsuXG5cdFx0XHQvLyBOb3RlIGRlbGliZXJhdGVseSB1c2luZyB0aGlzICE9IGZhbHNlLCByYXRoZXIgdGhhbiB0aGlzICE9PSBmYWxzZSBiZWNhdXNlIG9mIElFPDEwIGJ1Zy0gc2VlIGpzdmlld3MvaXNzdWVzLzIzN1xuXHRcdFx0cGF0aHMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyksXG5cdFx0XHRvcmlnUm9vdCA9IHBhdGhzWzBdO1xuXG5cdFx0aWYgKG9yaWdSb290ICsgXCJcIiA9PT0gb3JpZ1Jvb3QgJiYgYWxsb3dBcnJheSkge1xuXHRcdFx0aW5pdGlhbE5zID0gb3JpZ1Jvb3Q7IC8vIFRoZSBmaXJzdCBhcmcgaXMgYSBuYW1lc3BhY2UsIHNpbmNlIGl0IGlzIGEgc3RyaW5nLCBhbmQgdGhpcyBjYWxsIGlzIG5vdCBmcm9tIG9ic2VydmVBbmRCaW5kXG5cdFx0XHRwYXRocy5zaGlmdCgpO1xuXHRcdFx0b3JpZ1Jvb3QgPSBwYXRoc1swXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaW5uZXJPYnNlcnZlLmFwcGx5KDEsIHBhdGhzKTtcblx0fTtcblxuXHQkb2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKG5zLCBkYXRhKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGRhdGEgPSBucztcblx0XHRcdG5zID0gXCJcIjtcblx0XHR9XG5cdFx0cmV0dXJuICRpc0FycmF5KGRhdGEpXG5cdFx0XHQ/IG5ldyBBcnJheU9ic2VydmFibGUobnMsIGRhdGEpXG5cdFx0XHQ6IG5ldyBPYmplY3RPYnNlcnZhYmxlKG5zLCBkYXRhKTtcblx0fTtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQkc3ViLmdldERlcHMgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXJncyA9IGFyZ3VtZW50cztcblx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgYXJnLCBkZXAsXG5cdFx0XHRcdGRlcHMgPSBbXSxcblx0XHRcdFx0bCA9IGFyZ3MubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRhcmcgPSBhcmdzW2wtLV07XG5cdFx0XHRcdGRlcCA9IGFyZ3NbbF07XG5cdFx0XHRcdGlmIChkZXApIHtcblx0XHRcdFx0XHRkZXBzID0gZGVwcy5jb25jYXQoJGlzRnVuY3Rpb24oZGVwKSA/IGRlcChhcmcsIGFyZykgOiBkZXApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZGVwcztcblx0XHR9O1xuXHR9O1xuXG5cdCQub2JzZXJ2YWJsZSA9ICRvYnNlcnZhYmxlO1xuXHQkb2JzZXJ2YWJsZS5fZmx0ciA9IGZ1bmN0aW9uKGFsbFBhdGgsIG9iamVjdCwgcGFyZW50T2JzLCBmaWx0ZXIpIHtcblx0XHRpZiAoZmlsdGVyICYmICRpc0Z1bmN0aW9uKGZpbHRlcilcblx0XHRcdD8gZmlsdGVyKGFsbFBhdGgsIG9iamVjdCwgcGFyZW50T2JzKVxuXHRcdFx0OiB0cnVlIC8vIFRPRE8gQ29uc2lkZXIgc3VwcG9ydGluZyBmaWx0ZXIgYmVpbmcgYSBzdHJpbmcgb3Igc3RyaW5ncyB0byBkbyBSZWdFeCBmaWx0ZXJpbmcgYmFzZWQgb24ga2V5IGFuZC9vciBhbGxQYXRoXG5cdFx0KSB7XG5cdFx0XHRvYmplY3QgPSAkaXNGdW5jdGlvbihvYmplY3QpXG5cdFx0XHRcdD8gb2JqZWN0LnNldCAmJiBvYmplY3QuY2FsbChwYXJlbnRPYnNbMF0pIC8vIEl0IGlzIGEgZ2V0dGVyL3NldHRlclxuXHRcdFx0XHQ6IG9iamVjdDtcblx0XHRcdHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSBPQkpFQ1QgJiYgb2JqZWN0O1xuXHRcdH1cblx0fTtcblxuXHQkb2JzZXJ2YWJsZS5PYmplY3QgPSBPYmplY3RPYnNlcnZhYmxlO1xuXHQkb2JzZXJ2YWJsZS5BcnJheSA9IEFycmF5T2JzZXJ2YWJsZTtcblx0JC5vYnNlcnZlID0gJG9ic2VydmFibGUub2JzZXJ2ZSA9ICRvYnNlcnZlO1xuXHQkLnVub2JzZXJ2ZSA9ICRvYnNlcnZhYmxlLnVub2JzZXJ2ZSA9ICR1bm9ic2VydmU7XG5cdCRvYnNlcnZhYmxlLl9hcHBseSA9IG9ic2VydmVfYXBwbHk7XG5cblx0T2JqZWN0T2JzZXJ2YWJsZS5wcm90b3R5cGUgPSB7XG5cdFx0X2RhdGE6IG51bGwsXG5cblx0XHRvYnNlcnZlQWxsOiAkb2JzZXJ2ZUFsbCxcblx0XHR1bm9ic2VydmVBbGw6ICR1bm9ic2VydmVBbGwsXG5cblx0XHRkYXRhOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9kYXRhO1xuXHRcdH0sXG5cblx0XHRzZXRQcm9wZXJ0eTogZnVuY3Rpb24ocGF0aCwgdmFsdWUsIG5vblN0cmljdCkge1xuXHRcdFx0cGF0aCA9IHBhdGggfHwgXCJcIjtcblx0XHRcdHZhciBrZXksIHBhaXIsIHBhcnRzLFxuXHRcdFx0XHRtdWx0aSA9IHBhdGggKyBcIlwiICE9PSBwYXRoLFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0b2JqZWN0ID0gc2VsZi5fZGF0YTtcblxuXHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRpZiAobXVsdGkpIHtcblx0XHRcdFx0XHRub25TdHJpY3QgPSB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoJGlzQXJyYXkocGF0aCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgdGhlIGFycmF5IGZvcm1hdCBnZW5lcmF0ZWQgYnkgc2VyaWFsaXplQXJyYXkuIEhvd2V2ZXIsIHRoaXMgaGFzIHRoZSBwcm9ibGVtIHRoYXQgaXQgY29lcmNlcyB0eXBlcyB0byBzdHJpbmcsXG5cdFx0XHRcdFx0XHQvLyBhbmQgZG9lcyBub3QgcHJvdmlkZSBzaW1wbGUgc3VwcG9ydCBvZiBjb252ZXJ0VG8gYW5kIGNvbnZlcnRGcm9tIGZ1bmN0aW9ucy5cblx0XHRcdFx0XHRcdGtleSA9IHBhdGgubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGtleS0tKSB7XG5cdFx0XHRcdFx0XHRcdHBhaXIgPSBwYXRoW2tleV07XG5cdFx0XHRcdFx0XHRcdHNlbGYuc2V0UHJvcGVydHkocGFpci5uYW1lLCBwYWlyLnZhbHVlLCBub25TdHJpY3QgPT09IHVuZGVmaW5lZCB8fCBub25TdHJpY3QpOyAvL0lmIG5vblN0cmljdCBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0IHRvIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIE9iamVjdCByZXByZXNlbnRhdGlvbiB3aGVyZSBwcm9wZXJ0eSBuYW1lIGlzIHBhdGggYW5kIHByb3BlcnR5IHZhbHVlIGlzIHZhbHVlLlxuXHRcdFx0XHRcdFx0Zm9yIChrZXkgaW4gcGF0aCkge1xuXHRcdFx0XHRcdFx0XHRzZWxmLnNldFByb3BlcnR5KGtleSwgcGF0aFtrZXldLCBub25TdHJpY3QpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwYXRoICE9PSAkZXhwYW5kbykge1xuXHRcdFx0XHRcdC8vIFNpbXBsZSBzaW5nbGUgcHJvcGVydHkgY2FzZS5cblx0XHRcdFx0XHRwYXJ0cyA9IHBhdGguc3BsaXQoL1suXl0vKTtcblx0XHRcdFx0XHR3aGlsZSAob2JqZWN0ICYmIHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdG9iamVjdCA9IG9iamVjdFtwYXJ0cy5zaGlmdCgpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRcdFx0c2VsZi5fc2V0UHJvcGVydHkob2JqZWN0LCBwYXJ0c1swXSwgdmFsdWUsIG5vblN0cmljdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc2VsZjtcblx0XHR9LFxuXG5cdFx0cmVtb3ZlUHJvcGVydHk6IGZ1bmN0aW9uKHBhdGgpIHtcblx0XHRcdHRoaXMuc2V0UHJvcGVydHkocGF0aCwgcmVtb3ZlKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfc2V0UHJvcGVydHk6IGZ1bmN0aW9uKGxlYWYsIHBhdGgsIHZhbHVlLCBub25TdHJpY3QpIHtcblx0XHRcdHZhciBzZXR0ZXIsIGdldHRlciwgcmVtb3ZlUHJvcCxcblx0XHRcdFx0cHJvcGVydHkgPSBwYXRoID8gbGVhZltwYXRoXSA6IGxlYWY7XG5cblx0XHRcdGlmICgkaXNGdW5jdGlvbihwcm9wZXJ0eSkpIHtcblx0XHRcdFx0aWYgKHByb3BlcnR5LnNldCkge1xuXHRcdFx0XHRcdC8vIENhc2Ugb2YgcHJvcGVydHkgc2V0dGVyL2dldHRlciAtIHdpdGggY29udmVudGlvbiB0aGF0IHByb3BlcnR5IGlzIGdldHRlciBhbmQgcHJvcGVydHkuc2V0IGlzIHNldHRlclxuXHRcdFx0XHRcdGxlYWYgPSBsZWFmLl93cnAgIC8vIENhc2Ugb2YgSnNWaWV3cyAyLXdheSBkYXRhLWxpbmtpbmcgdG8gYSBoZWxwZXIgZnVuY3Rpb24gYXMgZ2V0dGVyLCB3aXRoIGEgc2V0dGVyLlxuXHRcdFx0XHRcdFx0Ly8gVGhlIHZpZXcgd2lsbCBiZSB0aGUgdGhpcyBwb2ludGVyIGZvciBnZXR0ZXIgYW5kIHNldHRlci4gTm90ZTogdGhpcyBpcyB0aGUgb25lIHNjZW5hcmlvIHdoZXJlIHBhdGggaXMgXCJcIi5cblx0XHRcdFx0XHRcdHx8IGxlYWY7XG5cdFx0XHRcdFx0Z2V0dGVyID0gcHJvcGVydHk7XG5cdFx0XHRcdFx0c2V0dGVyID0gZ2V0dGVyLnNldCA9PT0gdHJ1ZSA/IGdldHRlciA6IGdldHRlci5zZXQ7XG5cdFx0XHRcdFx0cHJvcGVydHkgPSBnZXR0ZXIuY2FsbChsZWFmKTsgLy8gZ2V0IC0gb25seSB0cmVhdGVkIGFzIGdldHRlciBpZiBhbHNvIGEgc2V0dGVyLiBPdGhlcndpc2UgaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgb2YgdHlwZSBmdW5jdGlvbi4gU2VlIHVuaXQgdGVzdHMgJ0NhbiBvYnNlcnZlIHByb3BlcnRpZXMgb2YgdHlwZSBmdW5jdGlvbicuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BlcnR5ICE9PSB2YWx1ZSB8fCBub25TdHJpY3QgJiYgcHJvcGVydHkgIT0gdmFsdWUpIHsgLy8gT3B0aW9uYWwgbm9uLXN0cmljdCBlcXVhbGl0eSwgc2luY2Ugc2VyaWFsaXplQXJyYXksIGFuZCBmb3JtLWJhc2VkIGVkaXRvcnMgY2FuIG1hcCBudW1iZXJzIHRvIHN0cmluZ3MsIGV0Yy5cblx0XHRcdFx0Ly8gRGF0ZSBvYmplY3RzIGRvbid0IHN1cHBvcnQgIT0gY29tcGFyaXNvbi4gVHJlYXQgYXMgc3BlY2lhbCBjYXNlLlxuXHRcdFx0XHRpZiAoIShwcm9wZXJ0eSBpbnN0YW5jZW9mIERhdGUpIHx8IHByb3BlcnR5ID4gdmFsdWUgfHwgcHJvcGVydHkgPCB2YWx1ZSkge1xuXHRcdFx0XHRcdGlmIChzZXR0ZXIpIHtcblx0XHRcdFx0XHRcdHNldHRlci5jYWxsKGxlYWYsIHZhbHVlKTsgICAvL3NldFxuXHRcdFx0XHRcdFx0dmFsdWUgPSBnZXR0ZXIuY2FsbChsZWFmKTsgIC8vZ2V0IHVwZGF0ZWQgdmFsdWVcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHJlbW92ZVByb3AgPSB2YWx1ZSA9PT0gcmVtb3ZlKSB7XG5cdFx0XHRcdFx0XHRpZiAocHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgbGVhZltwYXRoXTtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gdW5kZWZpbmVkOyAvLyBJZiB2YWx1ZSB3YXMgYWxyZWFkeSB1bmRlZmluZWQsIGRvbid0IHRyaWdnZXIgaGFuZGxlciBmb3IgcmVtb3ZlUHJvcFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0bGVhZltwYXRoXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fdHJpZ2dlcihsZWFmLCB7Y2hhbmdlOiBcInNldFwiLCBwYXRoOiBwYXRoLCB2YWx1ZTogdmFsdWUsIG9sZFZhbHVlOiBwcm9wZXJ0eSwgcmVtb3ZlOiByZW1vdmVQcm9wfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdF90cmlnZ2VyOiBmdW5jdGlvbih0YXJnZXQsIGV2ZW50QXJncykge1xuXHRcdFx0JCh0YXJnZXQpLnRyaWdnZXJIYW5kbGVyKHByb3BlcnR5Q2hhbmdlU3RyICsgKHRoaXMuX25zID8gXCIuXCIgKyAvXlxcUysvLmV4ZWModGhpcy5fbnMpWzBdIDogXCJcIiksIGV2ZW50QXJncyk7IC8vIElmIHdoaXRlLXNwYWNlIHNlcGFyYXRlZCBuYW1lc3BhY2VzLCB1c2UgZmlyc3Qgb25lIG9ubHlcblx0XHR9XG5cdH07XG5cblx0QXJyYXlPYnNlcnZhYmxlLnByb3RvdHlwZSA9IHtcblx0XHRfZGF0YTogbnVsbCxcblxuXHRcdG9ic2VydmVBbGw6ICRvYnNlcnZlQWxsLFxuXHRcdHVub2JzZXJ2ZUFsbDogJHVub2JzZXJ2ZUFsbCxcblxuXHRcdGRhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2RhdGE7XG5cdFx0fSxcblxuXHRcdGluc2VydDogZnVuY3Rpb24oaW5kZXgsIGRhdGEpIHtcblx0XHRcdHZhciBfZGF0YSA9IHRoaXMuX2RhdGE7XG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRkYXRhID0gaW5kZXg7XG5cdFx0XHRcdGluZGV4ID0gX2RhdGEubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0aW5kZXggPSBQQVJTRUlOVChpbmRleCk7XG5cdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHRkYXRhID0gJGlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdO1xuXHRcdFx0XHQvLyBkYXRhIGNhbiBiZSBhIHNpbmdsZSBpdGVtIChpbmNsdWRpbmcgYSBudWxsL3VuZGVmaW5lZCB2YWx1ZSkgb3IgYW4gYXJyYXkgb2YgaXRlbXMuXG5cdFx0XHRcdC8vIE5vdGUgdGhlIHByb3ZpZGVkIGl0ZW1zIGFyZSBpbnNlcnRlZCB3aXRob3V0IGJlaW5nIGNsb25lZCwgYXMgZGlyZWN0IHJlZmVyZW5jZXMgdG8gdGhlIHByb3ZpZGVkIG9iamVjdHNcblxuXHRcdFx0XHRpZiAoZGF0YS5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9pbnNlcnQoaW5kZXgsIGRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X2luc2VydDogZnVuY3Rpb24oaW5kZXgsIGRhdGEpIHtcblx0XHRcdHZhciBfZGF0YSA9IHRoaXMuX2RhdGEsXG5cdFx0XHRcdG9sZExlbmd0aCA9IF9kYXRhLmxlbmd0aDtcblx0XHRcdGlmIChpbmRleCA+IG9sZExlbmd0aCkge1xuXHRcdFx0XHRpbmRleCA9IG9sZExlbmd0aDtcblx0XHRcdH1cblx0XHRcdHNwbGljZS5hcHBseShfZGF0YSwgW2luZGV4LCAwXS5jb25jYXQoZGF0YSkpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiBcImluc2VydFwiLCBpbmRleDogaW5kZXgsIGl0ZW1zOiBkYXRhfSwgb2xkTGVuZ3RoKTtcblx0XHR9LFxuXG5cdFx0cmVtb3ZlOiBmdW5jdGlvbihpbmRleCwgbnVtVG9SZW1vdmUpIHtcblx0XHRcdHZhciBpdGVtcyxcblx0XHRcdFx0X2RhdGEgPSB0aGlzLl9kYXRhO1xuXG5cdFx0XHRpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpbmRleCA9IF9kYXRhLmxlbmd0aCAtIDE7XG5cdFx0XHR9XG5cblx0XHRcdGluZGV4ID0gUEFSU0VJTlQoaW5kZXgpO1xuXHRcdFx0bnVtVG9SZW1vdmUgPSBudW1Ub1JlbW92ZSA/IFBBUlNFSU5UKG51bVRvUmVtb3ZlKSA6IG51bVRvUmVtb3ZlID09PSAwID8gMCA6IDE7IC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkOiByZW1vdmUgMVxuXHRcdFx0aWYgKG51bVRvUmVtb3ZlID4gMCAmJiBpbmRleCA+IC0xKSB7XG5cdFx0XHRcdGl0ZW1zID0gX2RhdGEuc2xpY2UoaW5kZXgsIGluZGV4ICsgbnVtVG9SZW1vdmUpO1xuXHRcdFx0XHRpZiAobnVtVG9SZW1vdmUgPSBpdGVtcy5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmUoaW5kZXgsIG51bVRvUmVtb3ZlLCBpdGVtcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfcmVtb3ZlOiBmdW5jdGlvbihpbmRleCwgbnVtVG9SZW1vdmUsIGl0ZW1zKSB7XG5cdFx0XHR2YXIgX2RhdGEgPSB0aGlzLl9kYXRhLFxuXHRcdFx0XHRvbGRMZW5ndGggPSBfZGF0YS5sZW5ndGg7XG5cblx0XHRcdF9kYXRhLnNwbGljZShpbmRleCwgbnVtVG9SZW1vdmUpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiBcInJlbW92ZVwiLCBpbmRleDogaW5kZXgsIGl0ZW1zOiBpdGVtc30sIG9sZExlbmd0aCk7XG5cdFx0fSxcblxuXHRcdG1vdmU6IGZ1bmN0aW9uKG9sZEluZGV4LCBuZXdJbmRleCwgbnVtVG9Nb3ZlKSB7XG5cdFx0XHRudW1Ub01vdmUgPSBudW1Ub01vdmUgPyBQQVJTRUlOVChudW1Ub01vdmUpIDogbnVtVG9Nb3ZlID09PSAwID8gMCA6IDE7IC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkOiBtb3ZlIDFcblx0XHRcdG9sZEluZGV4ID0gUEFSU0VJTlQob2xkSW5kZXgpO1xuXHRcdFx0bmV3SW5kZXggPSBQQVJTRUlOVChuZXdJbmRleCk7XG5cblx0XHRcdGlmIChudW1Ub01vdmUgPiAwICYmIG9sZEluZGV4ID4gLTEgJiYgbmV3SW5kZXggPiAtMSAmJiBvbGRJbmRleCAhPT0gbmV3SW5kZXgpIHtcblx0XHRcdFx0dGhpcy5fbW92ZShvbGRJbmRleCwgbmV3SW5kZXgsIG51bVRvTW92ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X21vdmU6IGZ1bmN0aW9uKG9sZEluZGV4LCBuZXdJbmRleCwgbnVtVG9Nb3ZlKSB7XG5cdFx0XHR2YXIgaXRlbXMsXG5cdFx0XHRcdF9kYXRhID0gdGhpcy5fZGF0YSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gX2RhdGEubGVuZ3RoLFxuXHRcdFx0XHRleGNlc3MgPSBvbGRJbmRleCArIG51bVRvTW92ZSAtIG9sZExlbmd0aDtcblx0XHRcdGlmIChleGNlc3MgPiAwKSB7XG5cdFx0XHRcdG51bVRvTW92ZSAtPSBleGNlc3M7XG5cdFx0XHR9XG5cdFx0XHRpZiAobnVtVG9Nb3ZlKSB7XG5cdFx0XHRcdGl0ZW1zID0gX2RhdGEuc3BsaWNlKG9sZEluZGV4LCBudW1Ub01vdmUpOyAvLyByZW1vdmVcblx0XHRcdFx0aWYgKG5ld0luZGV4ID4gX2RhdGEubGVuZ3RoKSB7XG5cdFx0XHRcdFx0bmV3SW5kZXggPSBfZGF0YS5sZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3BsaWNlLmFwcGx5KF9kYXRhLCBbbmV3SW5kZXgsIDBdLmNvbmNhdChpdGVtcykpOyAvL3JlLWluc2VydFxuXHRcdFx0XHR0aGlzLl90cmlnZ2VyKHtjaGFuZ2U6IFwibW92ZVwiLCBvbGRJbmRleDogb2xkSW5kZXgsIGluZGV4OiBuZXdJbmRleCwgaXRlbXM6IGl0ZW1zfSwgb2xkTGVuZ3RoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0cmVmcmVzaDogZnVuY3Rpb24obmV3SXRlbXMsIHNvcnQpIHtcblx0XHRcdGZ1bmN0aW9uIGluc2VydEFkZGVkKCkge1xuXHRcdFx0XHRpZiAoaykge1xuXHRcdFx0XHRcdHNlbGYuaW5zZXJ0KGotaywgYWRkZWRJdGVtcyk7IC8vIE5vdCBmb3VuZCBpbiBvcmlnaW5hbCBhcnJheSAtIHNvIGluc2VydFxuXHRcdFx0XHRcdGRhdGFMZW5ndGggKz0gaztcblx0XHRcdFx0XHRpICs9IGs7XG5cdFx0XHRcdFx0ayA9IDA7XG5cdFx0XHRcdFx0YWRkZWRJdGVtcyA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciByZWZyZXNoIG9wZXJhdGlvbiB3ZSBpdGVyYXRpdmVseSBzdGVwIHRocm91Z2ggdGhlIHRhcmdldCBhcnJheSBhbmQgc29ydCBieSBtb3ZlL2FkZC9yZW1vdmUgb3BlcmF0aW9ucyBvbiB0aGUgc291cmNlIGFycmF5IHVudGlsIHRoZXkgbWF0Y2hcblx0XHRcdHZhciBpLCBqLCBrLCBuZXdJdGVtLCBudW0sXG5cdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRhZGRlZEl0ZW1zID0gW10sXG5cdFx0XHRcdGRhdGEgPSBzZWxmLl9kYXRhLFxuXHRcdFx0XHRvbGRJdGVtcyA9IGRhdGEuc2xpY2UoKSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG5cdFx0XHRcdGRhdGFMZW5ndGggPSBvbGRMZW5ndGgsXG5cdFx0XHRcdG5ld0xlbmd0aCA9IG5ld0l0ZW1zLmxlbmd0aDtcblx0XHRcdHNlbGYuX3NydCA9IHRydWU7IC8vIEZsYWcgZm9yIHNvcnRpbmcgZHVyaW5nIHJlZnJlc2hcblx0XHRcdGZvciAoaj1rPTA7IGo8bmV3TGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0aWYgKChuZXdJdGVtID0gbmV3SXRlbXNbal0pID09PSBkYXRhW2ota10pIHtcblx0XHRcdFx0XHRcdGluc2VydEFkZGVkKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9yIChpPWotazsgaTxkYXRhTGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGlmIChuZXdJdGVtID09PSBkYXRhW2ldKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaTxkYXRhTGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRpbnNlcnRBZGRlZCgpO1xuXHRcdFx0XHRcdFx0bnVtID0gMDtcblx0XHRcdFx0XHRcdHdoaWxlIChudW0rKyA8IG5ld0xlbmd0aC1pICYmIG5ld0l0ZW1zW2orbnVtXSA9PT0gZGF0YVtpK251bV0pO1xuXHRcdFx0XHRcdFx0c2VsZi5tb3ZlKGksIGosIG51bSk7IC8vIEZvdW5kIG5ld0l0ZW0gaW4gb3JpZ2luYWwgYXJyYXkgLSBzbyBtb3ZlIGl0IHRvIG5ldyBwb3NpdGlvblxuXHRcdFx0XHRcdFx0aiArPSBudW0gLSAxO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRrKys7XG5cdFx0XHRcdFx0XHRhZGRlZEl0ZW1zLnB1c2gobmV3SXRlbSk7IC8vIE5vdCBmb3VuZCBpbiBvcmlnaW5hbCBhcnJheSAtIHNvIGluc2VydFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aW5zZXJ0QWRkZWQoKTtcblx0XHRcdGlmIChkYXRhTGVuZ3RoID4gaikge1xuXHRcdFx0XHRzZWxmLnJlbW92ZShqLCBkYXRhTGVuZ3RoIC0gaik7XG5cdFx0XHR9XG5cdFx0XHRzZWxmLl9zcnQgPSB1bmRlZmluZWQ7IC8vIFdlIGhhdmUgZmluaXNoZWQgc29ydCBvcGVyYXRpb25zIGR1cmluZyByZWZyZXNoXG5cdFx0XHRzZWxmLl90cmlnZ2VyKHtjaGFuZ2U6IFwicmVmcmVzaFwiLCBvbGRJdGVtczogb2xkSXRlbXN9LCBvbGRMZW5ndGgpO1xuXHRcdFx0cmV0dXJuIHNlbGY7XG5cdFx0fSxcblxuXHRcdF90cmlnZ2VyOiBmdW5jdGlvbihldmVudEFyZ3MsIG9sZExlbmd0aCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRfZGF0YSA9IHNlbGYuX2RhdGEsXG5cdFx0XHRcdGxlbmd0aCA9IF9kYXRhLmxlbmd0aCxcblx0XHRcdFx0JF9kYXRhID0gJChbX2RhdGFdKTtcblx0XHRcdGlmIChzZWxmLl9zcnQpIHtcblx0XHRcdFx0ZXZlbnRBcmdzLnJlZnJlc2ggPSB0cnVlOyAvLyBXZSBhcmUgc29ydGluZyBkdXJpbmcgcmVmcmVzaFxuXHRcdFx0fSBlbHNlIGlmIChsZW5ndGggIT09IG9sZExlbmd0aCkgeyAgLy8gV2UgaGF2ZSBmaW5pc2hlZCBzb3J0IG9wZXJhdGlvbnMgZHVyaW5nIHJlZnJlc2hcblx0XHRcdFx0JF9kYXRhLnRyaWdnZXJIYW5kbGVyKHByb3BlcnR5Q2hhbmdlU3RyLCB7Y2hhbmdlOiBcInNldFwiLCBwYXRoOiBcImxlbmd0aFwiLCB2YWx1ZTogbGVuZ3RoLCBvbGRWYWx1ZTogb2xkTGVuZ3RofSk7XG5cdFx0XHR9XG5cdFx0XHQkX2RhdGEudHJpZ2dlckhhbmRsZXIoYXJyYXlDaGFuZ2VTdHIgKyAoc2VsZi5fbnMgPyBcIi5cIiArIC9eXFxTKy8uZXhlYyhzZWxmLl9ucylbMF0gOiBcIlwiKSwgZXZlbnRBcmdzKTsgLy8gSWYgd2hpdGUtc3BhY2Ugc2VwYXJhdGVkIG5hbWVzcGFjZXMsIHVzZSBmaXJzdCBvbmUgb25seVxuXHRcdH1cblx0fTtcblxuXHQkZXZlbnRTcGVjaWFsW3Byb3BlcnR5Q2hhbmdlU3RyXSA9ICRldmVudFNwZWNpYWxbYXJyYXlDaGFuZ2VTdHJdID0ge1xuXHRcdC8vIFJlZ2lzdGVyIGEgalF1ZXJ5IHNwZWNpYWwgJ3JlbW92ZScgZXZlbnQsIHRvIGFjY2VzcyB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggaGFuZGxlcnMgYmVpbmcgcmVtb3ZlZCBieSBqUXVlcnkub2ZmKCkuXG5cdFx0Ly8gV2UgZ2V0IGRhdGEuY2IuX2NJZCBmcm9tIHRoZSBldmVudCBoYW5kbGVPYmogYW5kIGdldCB0aGUgY29ycmVzcG9uZGluZyBjYkJpbmRpbmdzIGhhc2ggZnJvbSB0aGUgY2JCaW5kaW5nc1N0b3JlLFxuXHRcdC8vIHRoZW4gcmVtb3ZlIHRoaXMgb2JqZWN0IGZyb20gdGhhdCBiaW5kaW5ncyBoYXNoIC0gaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBoYW5kbGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgY2FsbGJhY2suXG5cdFx0cmVtb3ZlOiBmdW5jdGlvbiAoaGFuZGxlT2JqKSB7XG5cdFx0XHR2YXIgY2JCaW5kaW5ncywgZm91bmQsIGV2ZW50cywgbCwgZGF0YSxcblx0XHRcdFx0ZXZEYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cdFx0XHRpZiAoKGV2RGF0YSkgJiYgKGV2RGF0YS5vZmYgPSB0cnVlLCBldkRhdGEgPSBldkRhdGEuY2IpKSB7IC8vU2V0IG9mZiA9IHRydWUgYXMgbWFya2VyIGZvciBkaXNwb3NlZCBldmVudFxuXHRcdFx0XHQvLyBHZXQgdGhlIGNiLl9jSWQgZnJvbSBoYW5kbGVPYmouZGF0YS5jYi5fY0lkXG5cdFx0XHRcdGlmIChjYkJpbmRpbmdzID0gY2JCaW5kaW5nc1N0b3JlW2V2RGF0YS5fY0lkXSkge1xuXHRcdFx0XHRcdC8vIFRoZXJlIHdlcmUgYmluZGluZ3MgZm9yIHRoaXMgY2FsbGJhY2suIElmIHRoaXMgd2FzIHRoZSBsYXN0IG9uZSwgd2UnbGwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEodGhpcykuZXZlbnRzW2hhbmRsZU9iai50eXBlXTtcblx0XHRcdFx0XHRsID0gZXZlbnRzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAobC0tICYmICFmb3VuZCkge1xuXHRcdFx0XHRcdFx0Zm91bmQgPSAoZGF0YSA9IGV2ZW50c1tsXS5kYXRhKSAmJiBkYXRhLmNiICYmIGRhdGEuY2IuX2NJZCA9PT0gZXZEYXRhLl9jSWQ7XG5cdFx0XHRcdFx0XHQvLyBGb3VuZCBhbm90aGVyIG9uZSB3aXRoIHNhbWUgY2FsbGJhY2sgKHRob3VnaCBtYXkgYmUgYSBkaWZmZXJlbnQgaW5uZXJDYWxsYmFjaylcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyB3YXMgdGhlIGxhc3QgaGFuZGxlciBmb3IgdGhpcyBjYWxsYmFjayBhbmQgb2JqZWN0LCBzbyByZW1vdmUgdGhlIGJpbmRpbmcgZW50cnlcblx0XHRcdFx0XHRcdGRlbGV0ZSBjYkJpbmRpbmdzWyRkYXRhKHRoaXMpLm9iSWRdO1xuXHRcdFx0XHRcdFx0cmVtb3ZlQ2JCaW5kaW5ncyhjYkJpbmRpbmdzLCBldkRhdGEuX2NJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdCR2aWV3cy5tYXAgPSBmdW5jdGlvbihtYXBEZWYpIHtcblx0XHRmdW5jdGlvbiBNYXAoc291cmNlLCBvcHRpb25zLCB0YXJnZXQsIHVuYm91bmQpIHtcblx0XHRcdHZhciBjaGFuZ2luZyxcblx0XHRcdFx0bWFwID0gdGhpcztcblx0XHRcdGlmICh0aGlzLnNyYykge1xuXHRcdFx0XHR0aGlzLnVubWFwKCk7IC8vIFdlIGFyZSByZS1tYXBwaW5nIGEgbmV3IHNvdXJjZVxuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IE9CSkVDVCkge1xuXHRcdFx0XHRtYXAuc3JjID0gc291cmNlO1xuXHRcdFx0XHRtYXAudGd0ID0gdGFyZ2V0IHx8IG1hcC50Z3QgfHwgW107XG5cdFx0XHRcdG1hcC5vcHRpb25zID0gb3B0aW9ucyB8fCBtYXAub3B0aW9ucztcblx0XHRcdFx0bWFwLnVwZGF0ZSgpO1xuXHRcdFx0XHRpZiAoIXVuYm91bmQpIHtcblx0XHRcdFx0XHRpZiAobWFwRGVmLm9ic1NyYykge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnNyYykub2JzZXJ2ZUFsbChtYXAub2JzID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdFx0XHRpZiAoIWNoYW5naW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdG1hcERlZi5vYnNTcmMobWFwLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgbWFwLnNyY0ZsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChtYXBEZWYub2JzVGd0ICkge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnRndCkub2JzZXJ2ZUFsbChtYXAub2J0ID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdFx0aWYgKCFjaGFuZ2luZykge1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG1hcERlZi5vYnNUZ3QobWFwLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LCBtYXAudGd0Rmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoJGlzRnVuY3Rpb24obWFwRGVmKSkge1xuXHRcdFx0Ly8gU2ltcGxlIG1hcCBkZWNsYXJlZCBhcyBmdW5jdGlvblxuXHRcdFx0bWFwRGVmID0ge1xuXHRcdFx0XHRnZXRUZ3Q6IG1hcERlZlxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAobWFwRGVmLmJhc2VNYXApIHtcblx0XHRcdG1hcERlZiA9ICQuZXh0ZW5kKHt9LCBtYXBEZWYuYmFzZU1hcCwgbWFwRGVmKTtcblx0XHR9XG5cblx0XHRtYXBEZWYubWFwID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zLCB0YXJnZXQsIHVuYm91bmQpIHtcblx0XHRcdHJldHVybiBuZXcgTWFwKHNvdXJjZSwgb3B0aW9ucywgdGFyZ2V0LCB1bmJvdW5kKTtcblx0XHR9O1xuXG5cdFx0KE1hcC5wcm90b3R5cGUgPSB7XG5cdFx0XHRzcmNGbHQ6IG1hcERlZi5zcmNGbHQgfHwgc2hhbGxvd0ZpbHRlciwgLy8gZGVmYXVsdCB0byBzaGFsbG93RmlsdGVyXG5cdFx0XHR0Z3RGbHQ6IG1hcERlZi50Z3RGbHQgfHwgc2hhbGxvd0ZpbHRlcixcblx0XHRcdHVwZGF0ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdFx0XHR2YXIgbWFwID0gdGhpcztcblx0XHRcdFx0JG9ic2VydmFibGUobWFwLnRndCkucmVmcmVzaChtYXBEZWYuZ2V0VGd0KG1hcC5zcmMsIG1hcC5vcHRpb25zID0gb3B0aW9ucyB8fCBtYXAub3B0aW9ucykpO1xuXHRcdFx0fSxcblx0XHRcdHVubWFwOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG1hcCA9IHRoaXM7XG5cdFx0XHRcdGlmIChtYXAuc3JjKSB7XG5cdFx0XHRcdFx0aWYgKG1hcC5vYnMpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC5zcmMpLnVub2JzZXJ2ZUFsbChtYXAub2JzLCBtYXAuc3JjRmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG1hcC5vYnQpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC50Z3QpLnVub2JzZXJ2ZUFsbChtYXAub2J0LCBtYXAudGd0Rmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bWFwLnNyYyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG1hcDogTWFwLFxuXHRcdFx0X2RlZjogbWFwRGVmXG5cdFx0fSkuY29uc3RydWN0b3IgPSBNYXA7XG5cblx0XHRyZXR1cm4gbWFwRGVmO1xuXHR9O1xuXG5cdCRzdWIuYWR2U2V0ID0gZnVuY3Rpb24oKSB7IC8vIHJlZnJlc2ggYWR2YW5jZWQgc2V0dGluZ3Ncblx0XHQkc3ViLl9nY2NiID0gdGhpcy5fZ2NjYjsgLy8gZ2V0Q29udGV4dENhbGxiYWNrIG1ldGhvZFxuXHRcdGdsb2JhbC5fanN2ID0gJHN1YlNldHRpbmdzLmFkdmFuY2VkLl9qc3Zcblx0XHRcdD8geyAvLyBjcmVhdGUgZ2xvYmFsIF9qc3YsIGZvciBhY2Nlc3Npbmcgdmlld3MsIGV0Y1xuXHRcdFx0XHRcdGNiQmluZGluZ3M6IGNiQmluZGluZ3NTdG9yZVxuXHRcdFx0XHR9XG5cdFx0XHQ6IHVuZGVmaW5lZDsgLy8gSW4gSUU4IGNhbm5vdCBkbyBkZWxldGUgZ2xvYmFsLl9qc3Zcblx0fTtcbn1cblxucmV0dXJuICQ7XG59LCB3aW5kb3cpKTtcbiIsIi8qISBqcXVlcnkudmlld3MuanMgdjAuOS44MyAoQmV0YSk6IGh0dHA6Ly9qc3ZpZXdzLmNvbS8gKi9cbi8qXG4gKiBJbnRlcmFjdGl2ZSBkYXRhLWRyaXZlbiB2aWV3cyB1c2luZyBKc1JlbmRlciB0ZW1wbGF0ZXMuXG4gKiBTdWJjb21wb25lbnQgb2YgSnNWaWV3c1xuICogUmVxdWlyZXMgalF1ZXJ5IGFuZCBqc3JlbmRlci5qcyAoQmVzdC1vZi1icmVlZCB0ZW1wbGF0aW5nIGluIGJyb3dzZXIgb3Igb24gTm9kZS5qcylcbiAqICAgU2VlIEpzUmVuZGVyIGF0IGh0dHA6Ly9qc3ZpZXdzLmNvbS8jZG93bmxvYWQgYW5kIGh0dHA6Ly9naXRodWIuY29tL0JvcmlzTW9vcmUvanNyZW5kZXJcbiAqIEFsc28gcmVxdWlyZXMganF1ZXJ5Lm9ic2VydmFibGUuanNcbiAqICAgU2VlIEpzT2JzZXJ2YWJsZSBhdCBodHRwOi8vanN2aWV3cy5jb20vI2Rvd25sb2FkIGFuZCBodHRwOi8vZ2l0aHViLmNvbS9Cb3Jpc01vb3JlL2pzdmlld3NcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNiwgQm9yaXMgTW9vcmVcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4vL2pzaGludCAtVzAxOCwgLVcwNDFcblxuKGZ1bmN0aW9uKGZhY3RvcnksIGdsb2JhbCkge1xuXHQvLyBnbG9iYWwgdmFyIGlzIHRoZSB0aGlzIG9iamVjdCwgd2hpY2ggaXMgd2luZG93IHdoZW4gcnVubmluZyBpbiB0aGUgdXN1YWwgYnJvd3NlciBlbnZpcm9ubWVudFxuXHR2YXIgJCA9IGdsb2JhbC5qUXVlcnk7XG5cblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7IC8vIENvbW1vbkpTIGUuZy4gQnJvd3NlcmlmeVxuXHRcdG1vZHVsZS5leHBvcnRzID0gJFxuXHRcdFx0PyBmYWN0b3J5KGdsb2JhbCwgJClcblx0XHRcdDogZnVuY3Rpb24oJCkgeyAvLyBJZiBubyBnbG9iYWwgalF1ZXJ5LCB0YWtlIGpRdWVyeSBwYXNzZWQgYXMgcGFyYW1ldGVyICh3aXRoIEpzUmVuZGVyIGFuZCBKc09ic2VydmFibGUpOiByZXF1aXJlKFwianF1ZXJ5LnZpZXdzXCIpKGpRdWVyeSlcblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoZ2xvYmFsLCAkKTtcblx0XHRcdH07XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHsgLy8gQU1EIHNjcmlwdCBsb2FkZXIsIGUuZy4gUmVxdWlyZUpTXG5cdFx0ZGVmaW5lKFtcImpxdWVyeVwiLCBcIi4vanNyZW5kZXJcIiwgXCIuL2pxdWVyeS5vYnNlcnZhYmxlXCJdLCBmdW5jdGlvbigkLCBqc3IsIGpzbykge1xuXHRcdFx0cmV0dXJuIGZhY3RvcnkoZ2xvYmFsLCAkLCBqc3IsIGpzbyk7XG5cdFx0fSk7IC8vIFJlcXVpcmUgalF1ZXJ5LCBKc1JlbmRlciwgSnNPYnNlcnZhYmxlXG5cdH0gZWxzZSB7IC8vIEJyb3dzZXIgdXNpbmcgcGxhaW4gPHNjcmlwdD4gdGFnXG5cdFx0ZmFjdG9yeShnbG9iYWwsIGZhbHNlKTtcblx0fVxufSAoXG5cbi8vIGZhY3RvcnkgKGZvciBqcXVlcnkudmlld3MuanMpXG5mdW5jdGlvbihnbG9iYWwsICQsIGpzciwganNvKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgdmFycyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBnbG9iYWwgdmFyIGlzIHRoZSB0aGlzIG9iamVjdCwgd2hpY2ggaXMgd2luZG93IHdoZW4gcnVubmluZyBpbiB0aGUgdXN1YWwgYnJvd3NlciBlbnZpcm9ubWVudFxudmFyIHNldEdsb2JhbHMgPSAkID09PSBmYWxzZTsgLy8gT25seSBzZXQgZ2xvYmFscyBpZiBzY3JpcHQgYmxvY2sgaW4gYnJvd3NlciAobm90IEFNRCBhbmQgbm90IENvbW1vbkpTKVxuXG5qc3IgPSBqc3IgfHwgc2V0R2xvYmFscyAmJiBnbG9iYWwuanNyZW5kZXI7XG4kID0gJCB8fCBnbG9iYWwualF1ZXJ5O1xuXG52YXIgdmVyc2lvbk51bWJlciA9IFwidjAuOS44M1wiLFxuXHRyZXF1aXJlc1N0ciA9IFwiSnNWaWV3cyByZXF1aXJlcyBcIjtcblxuaWYgKCEkIHx8ICEkLmZuKSB7XG5cdC8vIGpRdWVyeSBpcyBub3QgbG9hZGVkLlxuXHR0aHJvdyByZXF1aXJlc1N0ciArIFwialF1ZXJ5XCI7IC8vIFdlIHJlcXVpcmUgalF1ZXJ5XG59XG5cbmlmIChqc3IgJiYgIWpzci5mbikge1xuXHRqc3Iudmlld3Muc3ViLl9qcSgkKTsgLy8gbWFwIG92ZXIgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVzcGFjZVxufVxuXG52YXIgJG9ic2VydmUsICRvYnNlcnZhYmxlLFxuXHQkaXNBcnJheSA9ICQuaXNBcnJheSxcblx0JHZpZXdzID0gJC52aWV3cztcblxuaWYgKCEkdmlld3MgfHwgISR2aWV3cy5tYXApIHtcblx0XHQvLyBKc1JlbmRlciBpcyBub3QgbG9hZGVkLlxuXHR0aHJvdyByZXF1aXJlc1N0ciArIFwiSnNSZW5kZXJcIjsgLy8ganNyZW5kZXIuanMgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIEpzVmlld3MgYW5kIGFmdGVyIGpRdWVyeVxufVxuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQsXG5cdCR2aWV3c1NldHRpbmdzID0gJHZpZXdzLnNldHRpbmdzLFxuXHQkc3ViID0gJHZpZXdzLnN1Yixcblx0JHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncyxcblx0JGV4dGVuZCA9ICRzdWIuZXh0ZW5kLFxuXHQkaXNGdW5jdGlvbiA9ICQuaXNGdW5jdGlvbixcblx0JGV4cGFuZG8gPSAkLmV4cGFuZG8sXG5cdCRjb252ZXJ0ZXJzID0gJHZpZXdzLmNvbnZlcnRlcnMsXG5cdCR0YWdzID0gJHZpZXdzLnRhZ3MsXG5cdCRzdWJTZXR0aW5nc0FkdmFuY2VkID0gJHN1YlNldHRpbmdzLmFkdmFuY2VkLFxuXG5cdC8vIFRoZXNlIHR3byBzZXR0aW5ncyBjYW4gYmUgb3ZlcnJpZGRlbiBvbiBzZXR0aW5ncyBhZnRlciBsb2FkaW5nIGpzUmVuZGVyLCBhbmQgcHJpb3IgdG8gbG9hZGluZyBqcXVlcnkub2JzZXJ2YWJsZS5qcyBhbmQvb3IgSnNWaWV3c1xuXHRwcm9wZXJ0eUNoYW5nZVN0ciA9ICRzdWIucHJvcENobmcgPSAkc3ViLnByb3BDaG5nIHx8IFwicHJvcGVydHlDaGFuZ2VcIixcblx0YXJyYXlDaGFuZ2VTdHIgPSAkc3ViLmFyckNobmcgPSAkc3ViLmFyckNobmcgfHwgXCJhcnJheUNoYW5nZVwiLFxuXG5cdEhUTUwgPSBcImh0bWxcIixcblx0c3ludGF4RXJyb3IgPSAkc3ViLnN5bnRheEVycixcblx0ckZpcnN0RWxlbSA9IC88KD8hc2NyaXB0KShcXHcrKVs+XFxzXS8sXG5cdGVycm9yID0gJHN1Yi5fZXIsXG5cdG9uUmVuZGVyRXJyb3IgPSAkc3ViLl9lcnIsXG5cdGRlbGltT3BlbkNoYXIwLCBkZWxpbU9wZW5DaGFyMSwgZGVsaW1DbG9zZUNoYXIwLCBkZWxpbUNsb3NlQ2hhcjEsIGxpbmtDaGFyLCB0b3BWaWV3LFxuXHRyRXNjYXBlUXVvdGVzID0gL1snXCJcXFxcXS9nOyAvLyBFc2NhcGUgcXVvdGVzIGFuZCBcXCBjaGFyYWN0ZXJcbmlmICgkLmxpbmspIHsgcmV0dXJuICQ7IH0gLy8gSnNWaWV3cyBpcyBhbHJlYWR5IGxvYWRlZFxuXG4kc3ViU2V0dGluZ3MudHJpZ2dlciA9IHRydWU7XG52YXIgYWN0aXZlQm9keSwgclRhZ0RhdGFsaW5rLCAkdmlldywgJHZpZXdzTGlua0F0dHIsIGxpbmtWaWV3c1NlbCwgd3JhcE1hcCwgdmlld1N0b3JlLCBvbGRBZHZTZXQsXG5cdGpzdkF0dHJTdHIgPSBcImRhdGEtanN2XCIsXG5cdGVsZW1lbnRDaGFuZ2VTdHIgPSBcImNoYW5nZS5qc3ZcIixcblx0b25CZWZvcmVDaGFuZ2VTdHIgPSBcIm9uQmVmb3JlQ2hhbmdlXCIsXG5cdG9uQWZ0ZXJDaGFuZ2VTdHIgPSBcIm9uQWZ0ZXJDaGFuZ2VcIixcblx0b25BZnRlckNyZWF0ZVN0ciA9IFwib25BZnRlckNyZWF0ZVwiLFxuXHRDSEVDS0VEID0gXCJjaGVja2VkXCIsXG5cdENIRUNLQk9YID0gXCJjaGVja2JveFwiLFxuXHRSQURJTyA9IFwicmFkaW9cIixcblx0Tk9ORSA9IFwibm9uZVwiLFxuXHRTQ1JJUFQgPSBcIlNDUklQVFwiLFxuXHRUUlVFID0gXCJ0cnVlXCIsXG5cdGNsb3NlU2NyaXB0ID0gJ1wiPjwvc2NyaXB0PicsXG5cdG9wZW5TY3JpcHQgPSAnPHNjcmlwdCB0eXBlPVwianN2Jyxcblx0ZGVmZXJBdHRyID0ganN2QXR0clN0ciArIFwiLWRmXCIsXG5cdGJpbmRFbHNTZWwgPSBcInNjcmlwdCxbXCIgKyBqc3ZBdHRyU3RyICsgXCJdXCIsXG5cdGZuU2V0dGVycyA9IHtcblx0XHR2YWx1ZTogXCJ2YWxcIixcblx0XHRpbnB1dDogXCJ2YWxcIixcblx0XHRodG1sOiBIVE1MLFxuXHRcdHRleHQ6IFwidGV4dFwiXG5cdH0sXG5cdHZhbHVlQmluZGluZyA9IHtmcm9tOiBcInZhbHVlXCIsIHRvOiBcInZhbHVlXCJ9LFxuXHRpc0NsZWFuQ2FsbCA9IDAsXG5cdG9sZENsZWFuRGF0YSA9ICQuY2xlYW5EYXRhLFxuXHRvbGRKc3ZEZWxpbWl0ZXJzID0gJHZpZXdzU2V0dGluZ3MuZGVsaW1pdGVycyxcblx0c2FmZUZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRxc2EgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yLFxuXG5cdC8vIGVsQ29udGVudCBtYXBzIHRhZ05hbWVzIHdoaWNoIGhhdmUgb25seSBlbGVtZW50IGNvbnRlbnQsIHNvIG1heSBub3Qgc3VwcG9ydCBzY3JpcHQgbm9kZXMuXG5cdGVsQ29udGVudCA9IHtvbDogMSwgdWw6IDEsIHRhYmxlOiAxLCB0Ym9keTogMSwgdGhlYWQ6IDEsIHRmb290OiAxLCB0cjogMSwgY29sZ3JvdXA6IDEsIGRsOiAxLCBzZWxlY3Q6IDEsIG9wdGdyb3VwOiAxLCBzdmc6IDEsIHN2Z19uczogMX0sXG5cdGJhZFBhcmVudCA9IHt0cjogXCJ0YWJsZVwifSxcblx0dm9pZEVsZW1zID0ge2JyOiAxLCBpbWc6IDEsIGlucHV0OiAxLCBocjogMSwgYXJlYTogMSwgYmFzZTogMSwgY29sOiAxLCBsaW5rOiAxLCBtZXRhOiAxLFxuXHRcdGNvbW1hbmQ6IDEsIGVtYmVkOiAxLCBrZXlnZW46IDEsIHBhcmFtOiAxLCBzb3VyY2U6IDEsIHRyYWNrOiAxLCB3YnI6IDF9LFxuXHRkaXNwbGF5U3R5bGVzID0ge30sXG5cdGJpbmRpbmdTdG9yZSA9IHt9LFxuXHRiaW5kaW5nS2V5ID0gMSxcblx0clZpZXdQYXRoID0gL14jKHZpZXdcXC4/KT8vLFxuXHRyQ29udmVydE1hcmtlcnMgPSAvKChcXC8+KXw8XFwvKFxcdyspPnwpKFxccyopKFsjXFwvXVxcZCsoPzpffChcXF4pKSlgKFxccyopKDxcXHcrKD89W1xcc1xcLz5dKSk/fFxccyooPzooPFxcdysoPz1bXFxzXFwvPl0pKXw8XFwvKFxcdyspPihcXHMqKXwoXFwvPilcXHMqfCg+KXwkKS9nLFxuXHRyT3BlblZpZXdNYXJrZXJzID0gLygjKSgpKFxcZCspKF8pL2csXG5cdHJPcGVuTWFya2VycyA9IC8oIykoKShcXGQrKShbX15dKS9nLFxuXHRyVmlld01hcmtlcnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShfKS9nLFxuXHRyT3BlblRhZ01hcmtlcnMgPSAvKCMpKCkoXFxkKykoXFxeKS9nLFxuXHRyTWFya2VyVG9rZW5zID0gLyg/OigjKXwoXFwvKSkoXFxkKykoW19eXSkoWy0rQFxcZF0rKT8vZyxcblx0clNwbGl0QmluZGluZ3MgPSAvJihcXGQrKVxcKz8vZyxcblx0Z2V0Q29tcHV0ZWRTdHlsZSA9IGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlO1xuXG4kb2JzZXJ2YWJsZSA9ICQub2JzZXJ2YWJsZTtcblxuaWYgKCEkb2JzZXJ2YWJsZSkge1xuXHQvLyBKc09ic2VydmFibGUgaXMgbm90IGxvYWRlZC5cblx0dGhyb3cgcmVxdWlyZXNTdHIgKyBcIkpzT2JzZXJ2YWJsZVwiOyAvLyBqcXVlcnkub2JzZXJ2YWJsZS5qcyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgSnNWaWV3c1xufVxuXG4kb2JzZXJ2ZSA9ICRvYnNlcnZhYmxlLm9ic2VydmU7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gRXZlbnQgaGFuZGxlcnNcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGVsZW1DaGFuZ2VIYW5kbGVyKGV2LCBwYXJhbXMsIHNvdXJjZVZhbHVlKSB7XG5cdHZhciBzZXR0ZXIsIGNhbmNlbCwgZnJvbUF0dHIsIGxpbmtDdHgsIGN2dEJhY2ssIGNudnROYW1lLCB0YXJnZXQsICRzb3VyY2UsIHZpZXcsIGJpbmRpbmcsXG5cdFx0b2xkTGlua0N0eCwgb25CZWZvcmVDaGFuZ2UsIG9uQWZ0ZXJDaGFuZ2UsIHRhZywgdG8sIGV2ZW50QXJncywgZXhwck9iLCBjb250ZXh0Q2IsXG5cdFx0c291cmNlID0gZXYudGFyZ2V0LFxuXHRcdGJpbmRpbmdzID0gc291cmNlLl9qc3ZCbmQ7XG5cblx0Ly8gX2pzdkJuZCBpcyBhIHN0cmluZyB3aXRoIHRoZSBzeW50YXg6IFwiJmJpbmRpbmdJZDEmYmluZGluZ0lkMlwiXG5cdHdoaWxlIChiaW5kaW5nID0gclNwbGl0QmluZGluZ3MuZXhlYyhiaW5kaW5ncykpIHtcblx0XHRpZiAoYmluZGluZyA9IGJpbmRpbmdTdG9yZVtiaW5kaW5nWzFdXSkge1xuXHRcdFx0aWYgKHRvID0gYmluZGluZy50bykge1xuXHRcdFx0XHQvLyBUaGUgYmluZGluZyBoYXMgYSAndG8nIGZpZWxkLCB3aGljaCBpcyBvZiB0aGUgZm9ybSBbW3RhcmdldE9iamVjdCwgdG9QYXRoXSwgY3Z0QmFja11cblx0XHRcdFx0bGlua0N0eCA9IGJpbmRpbmcubGlua0N0eDtcblx0XHRcdFx0dmlldyA9IGxpbmtDdHgudmlldztcblx0XHRcdFx0dGFnID0gbGlua0N0eC50YWcgfHwgdmlldy50YWc7XG5cdFx0XHRcdCRzb3VyY2UgPSAkKHNvdXJjZSk7XG5cdFx0XHRcdG9uQmVmb3JlQ2hhbmdlID0gdmlldy5obHAob25CZWZvcmVDaGFuZ2VTdHIpOyAvLyBUT0RPIENhbiB3ZSBvcHRpbWl6ZSB0aGlzIGFuZCBvdGhlciBpbnN0YW5jZXMgb2Ygc2FtZT9cblx0XHRcdFx0b25BZnRlckNoYW5nZSA9IHZpZXcuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpOyAvLyBUT0RPIENhbiB3ZSBvcHRpbWl6ZSB0aGlzIGFuZCBvdGhlciBpbnN0YW5jZXMgb2Ygc2FtZVxuXHRcdFx0XHRmcm9tQXR0ciA9IGRlZmF1bHRBdHRyKHNvdXJjZSk7XG5cdFx0XHRcdHNldHRlciA9IGZuU2V0dGVyc1tmcm9tQXR0cl07XG5cdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0c291cmNlVmFsdWUgPSAkaXNGdW5jdGlvbihmcm9tQXR0cilcblx0XHRcdFx0XHRcdD8gZnJvbUF0dHIoc291cmNlKVxuXHRcdFx0XHRcdFx0OiBzZXR0ZXJcblx0XHRcdFx0XHRcdFx0PyAkc291cmNlW3NldHRlcl0oKVxuXHRcdFx0XHRcdFx0XHQ6ICRzb3VyY2UuYXR0cihmcm9tQXR0cik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y252dE5hbWUgPSB0b1sxXTtcblx0XHRcdFx0dG8gPSB0b1swXTsgLy8gW29iamVjdCwgcGF0aF1cblx0XHRcdFx0dG8gPSB0byArIFwiXCIgPT09IHRvID8gW2xpbmtDdHguZGF0YSwgdG9dIDogdG87XG5cdFx0XHRcdGlmIChjbnZ0TmFtZSkge1xuXHRcdFx0XHRcdGlmICgkaXNGdW5jdGlvbihjbnZ0TmFtZSkpIHtcblx0XHRcdFx0XHRcdGN2dEJhY2sgPSBjbnZ0TmFtZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y3Z0QmFjayA9IHZpZXcuZ2V0UnNjKFwiY29udmVydGVyc1wiLCBjbnZ0TmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChsaW5rQ3R4LmVsZW0ubm9kZU5hbWUgPT09IFwiU0VMRUNUXCIpIHtcblx0XHRcdFx0XHRsaW5rQ3R4LmVsZW0uX2pzdlNlbCA9IHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWUgfHwgKGxpbmtDdHguZWxlbS5tdWx0aXBsZSA/IFtdIDogc291cmNlVmFsdWUpO1xuXHRcdFx0XHRcdC8vIGRhdGEtbGluayA8c2VsZWN0PiB0byBzdHJpbmcgb3IgKG11bHRpc2VsZWN0KSBhcnJheSBvZiBzdHJpbmdzXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGN2dEJhY2spIHtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGN2dEJhY2suY2FsbCh0YWcsIHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHRcdFx0XHRvbGRMaW5rQ3R4ID0gdmlldy5saW5rQ3R4O1xuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0XHRldmVudEFyZ3MgPSB7XG5cdFx0XHRcdFx0Y2hhbmdlOiBcImNoYW5nZVwiLFxuXHRcdFx0XHRcdG9sZFZhbHVlOiBsaW5rQ3R4Ll92YWwsXG5cdFx0XHRcdFx0dmFsdWU6IHNvdXJjZVZhbHVlXG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmICgoIW9uQmVmb3JlQ2hhbmdlIHx8ICEoY2FuY2VsID0gb25CZWZvcmVDaGFuZ2UuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKSAmJlxuXHRcdFx0XHRcdFx0KCF0YWcgfHwgIXRhZy5vbkJlZm9yZUNoYW5nZSB8fCAhKGNhbmNlbCA9IHRhZy5vbkJlZm9yZUNoYW5nZShldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKSAmJlxuXHRcdFx0XHRcdFx0c291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRhcmdldCA9IHRvWzBdOyAvLyBbb2JqZWN0LCBwYXRoXVxuXHRcdFx0XHRcdGlmIChzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCkge1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHRDYiA9IGxpbmtDdHguX2N0eENiOyAvLyBUaGlzIGlzIGEgY29tcHV0ZWQgdmFsdWVcblx0XHRcdFx0XHRcdFx0ZXhwck9iID0gdGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQgPSBsaW5rQ3R4LmRhdGE7XG5cdFx0XHRcdFx0XHRcdGlmIChleHByT2IuX2NwQ3R4KSB7IC8vIENvbXB1dGVkIHZhbHVlIGZvciBhIGNvbnRleHR1YWwgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gZXhwck9iLmRhdGE7IC8vIFRoZSBkYXRhIGZvciB0aGUgY29udGV4dHVhbCB2aWV3ICh3aGVyZSBjb250ZXh0dWFsIHBhcmFtIGV4cHJlc3Npb24gZXZhbHVhdGVkL2Fzc2lnbmVkKVxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRDYiA9IGV4cHJPYi5fY3BDdHg7IC8vIENvbnRleHQgY2FsbGJhY2sgZm9yIGNvbnRleHR1YWwgdmlld1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHdoaWxlIChleHByT2IgJiYgZXhwck9iLnNiKSB7IC8vIFN0ZXAgdGhyb3VnaCBjaGFpbmVkIGNvbXB1dGVkIHZhbHVlcyB0byBsZWFmIG9uZS4uLlxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldCA9IGNvbnRleHRDYihleHByT2IsIHRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwck9iID0gZXhwck9iLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5fLmNoZ2luZyA9IHRydWU7IC8vIG1hcmtlciB0byBwcmV2ZW50IHRhZyBjaGFuZ2UgZXZlbnQgdHJpZ2dlcmluZyBpdHMgb3duIHJlZnJlc2hcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldCkuc2V0UHJvcGVydHkodG9bMV0sIHNvdXJjZVZhbHVlKTsgLy8gMndheSBiaW5kaW5nIGNoYW5nZSBldmVudCAtIG9ic2VydmFibHkgdXBkYXRpbmcgYm91bmQgb2JqZWN0XG5cdFx0XHRcdFx0XHRpZiAob25BZnRlckNoYW5nZSkge1xuXHRcdFx0XHRcdFx0XHRvbkFmdGVyQ2hhbmdlLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0YWcub25BZnRlckNoYW5nZSkge1xuXHRcdFx0XHRcdFx0XHRcdHRhZy5vbkFmdGVyQ2hhbmdlKGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRhZy5fLmNoZ2luZyA9IHVuZGVmaW5lZDsgLy8gY2xlYXIgdGhlIG1hcmtlclxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bGlua0N0eC5fdmFsID0gc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q2hhbmdlSGFuZGxlcihldiwgZXZlbnRBcmdzLCBsaW5rRm4pIHtcblx0dmFyIGF0dHIsIHNvdXJjZVZhbHVlLCBub1VwZGF0ZSwgZm9yY2VVcGRhdGUsIGhhc0Vycm9yLCBvbkVycm9yLFxuXHRcdGxpbmtDdHggPSB0aGlzLFxuXHRcdHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdHNvdXJjZSA9IGxpbmtDdHguZGF0YSxcblx0XHR0YXJnZXQgPSBsaW5rQ3R4LmVsZW0sXG5cdFx0Y3Z0ID0gbGlua0N0eC5jb252ZXJ0LFxuXHRcdHBhcmVudEVsZW0gPSB0YXJnZXQucGFyZW50Tm9kZSxcblx0XHR2aWV3ID0gbGlua0N0eC52aWV3LFxuXHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHgsXG5cdFx0b25FdmVudCA9IHZpZXcuaGxwKG9uQmVmb3JlQ2hhbmdlU3RyKTtcblxuXHQvLyBTZXQgbGlua0N0eCBvbiB2aWV3LCBkeW5hbWljYWxseSwganVzdCBkdXJpbmcgdGhpcyBoYW5kbGVyIGNhbGxcblx0dmlldy5saW5rQ3R4ID0gbGlua0N0eDtcblxuXHRpZiAocGFyZW50RWxlbSAmJiAoIW9uRXZlbnQgfHwgIShldmVudEFyZ3MgJiYgb25FdmVudC5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpID09PSBmYWxzZSkpXG5cdFx0XHQvLyBJZiBkYXRhIGNoYW5nZWQsIHRoZSBldi5kYXRhIGlzIHNldCB0byBiZSB0aGUgcGF0aC4gVXNlIHRoYXQgdG8gZmlsdGVyIHRoZSBoYW5kbGVyIGFjdGlvbi4uLlxuXHRcdFx0JiYgIShldmVudEFyZ3MgJiYgZXYuZGF0YS5wcm9wICE9PSBcIipcIiAmJiBldi5kYXRhLnByb3AgIT09IGV2ZW50QXJncy5wYXRoKSkge1xuXG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0bGlua0N0eC5ldmVudEFyZ3MgPSBldmVudEFyZ3M7XG5cdFx0fVxuXHRcdGlmIChldmVudEFyZ3MgfHwgbGlua0N0eC5fdG9Maykge1xuXHRcdFx0Ly8gSWYgZXZlbnRBcmdzIGFyZSBkZWZpbmVkLCB0aGlzIGlzIGEgZGF0YSB1cGRhdGVcblx0XHRcdC8vIE90aGVyd2lzZSB0aGlzIGlzIHRoZSBpbml0aWFsIGRhdGEtbGluayByZW5kZXJpbmcgY2FsbC4gQmluZCBvbiB0aGlzIHRoZSBmaXJzdCB0aW1lIGl0IGdldCBjYWxsZWRcblx0XHRcdGxpbmtDdHguX3RvTGsgPSAwOyAvLyBSZW1vdmUgZmxhZyB0byBza2lwIHVubmVjY2Vzc2FyeSByZWJpbmRpbmcgbmV4dCB0aW1lXG5cdFx0XHRpZiAobGlua0ZuLl9lcikge1xuXHRcdFx0XHQvLyBkYXRhLWxpbms9XCJleHByVXNpbmdUYWdPckN2dCB3aXRoIG9uZXJyb3I9Li4uXCIgLSBlLmcuIHt0YWcgLi4uIHtjdnQ6Li4uIHs6Li4uIGNvbnZlcnQ9J2N2dCdcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGxpbmtGbihzb3VyY2UsIHZpZXcpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0aGFzRXJyb3IgPSBsaW5rRm4uX2VyO1xuXHRcdFx0XHRcdG9uRXJyb3IgPSBvblJlbmRlckVycm9yKGUsdmlldywobmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3XCIsIFwicmV0dXJuIFwiICsgaGFzRXJyb3IgKyBcIjtcIikpKHNvdXJjZSwgdmlldykpO1xuXHRcdFx0XHRcdHNvdXJjZVZhbHVlID0gW3twcm9wczoge30sIGFyZ3M6IFtvbkVycm9yXX1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGxpbmtGbihzb3VyY2UsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQ29tcGlsZWQgbGluayBleHByZXNzaW9uIGZvciBsaW5rVGFnOiByZXR1cm4gdmFsdWUgZm9yIGRhdGEtbGluaz1cIns6eHh4fVwiIHdpdGggbm8gY3Z0IG9yIGN2dEJrLCBvdGhlcndpc2UgdGFnQ3R4IG9yIHRhZ0N0eHNcblxuXHRcdFx0YXR0ciA9IGdldFRhcmdldFZhbChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgdGFnID0gbGlua0N0eC50YWcsXG5cdFx0XHRcdFx0bGlua0N0eC5hdHRyIHx8IGRlZmF1bHRBdHRyKHRhcmdldCwgdHJ1ZSwgY3Z0ICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdCk7XG5cblx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0Ly8gRXhpc3RpbmcgdGFnIGluc3RhbmNlXG5cdFx0XHRcdGZvcmNlVXBkYXRlID0gaGFzRXJyb3IgfHwgdGFnLl9lcjtcblx0XHRcdFx0Ly8gSWYgdGhlIG5ldyB0YWdDdHhzIGhhc0Vycm9yIG9yIHRoZSBwcmV2aW91cyB0YWdDdHhzIGhhZCBlcnJvciwgdGhlbiBmb3JjZSB1cGRhdGVcblx0XHRcdFx0c291cmNlVmFsdWUgPSBzb3VyY2VWYWx1ZVswXSA/IHNvdXJjZVZhbHVlIDogW3NvdXJjZVZhbHVlXTtcblx0XHRcdFx0bm9VcGRhdGUgPSAhZm9yY2VVcGRhdGUgJiYgZXZlbnRBcmdzICYmIHRhZy5vblVwZGF0ZSAmJiB0YWcub25VcGRhdGUoZXYsIGV2ZW50QXJncywgc291cmNlVmFsdWUpID09PSBmYWxzZTtcblxuXHRcdFx0XHRtZXJnZUN0eHModGFnLCBzb3VyY2VWYWx1ZSwgZm9yY2VVcGRhdGUpO1xuXG5cdFx0XHRcdGlmIChub1VwZGF0ZSB8fCBhdHRyID09PSBOT05FKSB7XG5cdFx0XHRcdFx0Ly8gb25VcGRhdGUgcmV0dXJuZWQgZmFsc2UsIG9yIGF0dHIgPT09IFwibm9uZVwiLCBvciB0aGlzIGlzIGFuIHVwZGF0ZSBjb21pbmcgZnJvbSB0aGUgdGFnJ3Mgb3duIGNoYW5nZSBldmVudFxuXHRcdFx0XHRcdC8vIC0gc28gZG9uJ3QgcmVmcmVzaCB0aGUgdGFnOiB3ZSBqdXN0IHVzZSB0aGUgbmV3IHRhZ0N0eHMgbWVyZ2VkIGZyb20gdGhlIHNvdXJjZVZhbHVlLFxuXHRcdFx0XHRcdC8vICh3aGljaCBtYXkgb3B0aW9uYWxseSBoYXZlIGJlZW4gbW9kaWZlZCBpbiBvblVwZGF0ZSgpLi4uKSBhbmQgdGhlbiBiaW5kLCBhbmQgd2UgYXJlIGRvbmVcblx0XHRcdFx0XHRjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0b2JzZXJ2ZUFuZEJpbmQobGlua0N0eCwgc291cmNlLCB0YXJnZXQpO1xuXHRcdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0YWcuXy5jaGdpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c291cmNlVmFsdWUgPSB0YWcudGFnTmFtZSA9PT0gXCI6XCIgLy8gQ2FsbCBjb252ZXJ0VmFsIGlmIGl0IGlzIGEge3tjdnQ6Li4ufX0gLSBvdGhlcndpc2UgY2FsbCByZW5kZXJUYWdcblx0XHRcdFx0XHQ/ICRzdWIuX2NudnQodGFnLmN2dCwgdmlldywgc291cmNlVmFsdWVbMF0pXG5cdFx0XHRcdFx0OiAkc3ViLl90YWcodGFnLCB2aWV3LCB2aWV3LnRtcGwsIHNvdXJjZVZhbHVlLCB0cnVlLCBvbkVycm9yKTtcblx0XHRcdH0gZWxzZSBpZiAobGlua0ZuLl90YWcpIHtcblx0XHRcdFx0Ly8gRm9yIHt7OiAuLi59fSB3aXRob3V0IGEgY29udmVydCBvciBjb252ZXJ0QmFjaywgd2UgYWxyZWFkeSBoYXZlIHRoZSBzb3VyY2VWYWx1ZSwgYW5kIHdlIGFyZSBkb25lXG5cdFx0XHRcdC8vIEZvciB7ezogLi4ufX0gd2l0aCBlaXRoZXIgY3Z0IG9yIGN2dEJhY2sgd2UgY2FsbCBjb252ZXJ0VmFsIHRvIGdldCB0aGUgc291cmNlVmFsdWUgYW5kIGluc3RhbnRpYXRlIHRoZSB0YWdcblx0XHRcdFx0Ly8gSWYgY3Z0IGlzIHVuZGVmaW5lZCB0aGVuIHRoaXMgaXMgYSB0YWcsIGFuZCB3ZSBjYWxsIHJlbmRlclRhZyB0byBnZXQgdGhlIHJlbmRlcmVkIGNvbnRlbnQgYW5kIGluc3RhbnRpYXRlIHRoZSB0YWdcblx0XHRcdFx0Y3Z0ID0gY3Z0ID09PSBcIlwiID8gVFJVRSA6IGN2dDsgLy8gSWYgdGhlcmUgaXMgYSBjdnRCYWNrIGJ1dCBubyBjdnQsIHNldCBjdnQgdG8gXCJ0cnVlXCJcblx0XHRcdFx0c291cmNlVmFsdWUgPSBjdnQgLy8gQ2FsbCBjb252ZXJ0VmFsIGlmIGl0IGlzIGEge3tjdnQ6Li4ufX0gLSBvdGhlcndpc2UgY2FsbCByZW5kZXJUYWdcblx0XHRcdFx0XHQ/ICRzdWIuX2NudnQoY3Z0LCB2aWV3LCBzb3VyY2VWYWx1ZVswXSB8fCBzb3VyY2VWYWx1ZSkgLy8gY29udmVydFZhbFxuXHRcdFx0XHRcdDogJHN1Yi5fdGFnKGxpbmtGbi5fdGFnLCB2aWV3LCB2aWV3LnRtcGwsIHNvdXJjZVZhbHVlLCB0cnVlLCBvbkVycm9yKTsgLy8gcmVuZGVyVGFnXG5cblx0XHRcdFx0YWRkTGlua01ldGhvZHModGFnID0gbGlua0N0eC50YWcsIHRydWUpOyAvLyBJbiBib3RoIGNvbnZlcnRWYWwgYW5kIHJlbmRlclRhZyB3ZSBoYXZlIGluc3RhbnRpYXRlZCBhIHRhZ1xuXHRcdFx0XHRhdHRyID0gbGlua0N0eC5hdHRyIHx8IGF0dHI7IC8vIGxpbmtDdHguYXR0ciBtYXkgaGF2ZSBiZWVuIHNldCB0byB0YWcuYXR0ciBkdXJpbmcgdGFnIGluc3RhbnRpYXRpb24gaW4gcmVuZGVyVGFnXG5cdFx0XHR9XG5cblx0XHRcdGlmICh1cGRhdGVDb250ZW50KHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCBhdHRyLCB0YWcpXG5cdFx0XHRcdFx0JiYgZXZlbnRBcmdzXG5cdFx0XHRcdFx0JiYgKG9uRXZlbnQgPSB2aWV3LmhscChvbkFmdGVyQ2hhbmdlU3RyKSkpIHtcblx0XHRcdFx0b25FdmVudC5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eC5fbm9VcGQgPSAwOyAvLyBGb3IgZGF0YS1saW5rPVwiXnsuLi59XCIgcmVtb3ZlIF9ub1VwZCBmbGFnIHNvIHVwZGF0ZXMgb24gc3Vic2VxdWVudCBjYWxsc1xuXG5cdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdHRhZy5fZXIgPSBoYXNFcnJvcjtcblx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcsIGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KTtcblxuXHRcdC8vIFJlbW92ZSBkeW5hbWljYWxseSBhZGRlZCBsaW5rQ3R4IGZyb20gdmlld1xuXHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0VmFsKHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCB0YWcsIGF0dHIpIHtcblx0dmFyIGN1cnJlbnRWYWx1ZSwgc2V0dGVyLCBjc3MsICR0YXJnZXQsXG5cdFx0dGFyZ2V0ID0gdGFnICYmIHRhZy5wYXJlbnRFbGVtIHx8IGxpbmtDdHguZWxlbTtcblxuXHRpZiAoc291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdCR0YXJnZXQgPSAkKHRhcmdldCk7XG5cdFx0YXR0ciA9IHRhZyAmJiB0YWcuYXR0ciB8fCBhdHRyO1xuXHRcdGlmICgkaXNGdW5jdGlvbihzb3VyY2VWYWx1ZSkpIHtcblx0XHRcdGVycm9yKGxpbmtDdHguZXhwciArIFwiOiBtaXNzaW5nIHBhcmVuc1wiKTtcblx0XHR9XG5cblx0XHRpZiAoY3NzID0gL15jc3MtLy50ZXN0KGF0dHIpICYmIGF0dHIuc2xpY2UoNCkpIHtcblx0XHRcdGN1cnJlbnRWYWx1ZSA9ICQuc3R5bGUodGFyZ2V0LCBjc3MpO1xuXHRcdFx0aWYgKCtzb3VyY2VWYWx1ZSA9PT0gc291cmNlVmFsdWUpIHtcblx0XHRcdFx0Ly8gT3B0aW1pemF0aW9uIGZvciBwZXJmIG9uIGludGVnZXIgdmFsdWVzIC0gZS5nLiBjc3Mtd2lkdGh7OndpZHRoKydweCd9XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHBhcnNlSW50KGN1cnJlbnRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChhdHRyICE9PSBcImxpbmtcIikgeyAvLyBhdHRyID09PSBcImxpbmtcIiBpcyBmb3IgdGFnIGNvbnRyb2xzIHdoaWNoIGRvIGRhdGEgYmluZGluZyBidXQgaGF2ZSBubyByZW5kZXJlZCBvdXRwdXQgb3IgdGFyZ2V0XG5cdFx0XHRpZiAoYXR0ciA9PT0gXCJ2YWx1ZVwiKSB7XG5cdFx0XHRcdGlmICh0YXJnZXQudHlwZSA9PT0gQ0hFQ0tCT1gpIHtcblx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSAkdGFyZ2V0LnByb3AoYXR0ciA9IENIRUNLRUQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFJBRElPKSB7XG5cdFx0XHRcdGlmICh0YXJnZXQudmFsdWUgPT09IChcIlwiICsgc291cmNlVmFsdWUpKSB7XG5cdFx0XHRcdFx0Y3VycmVudFZhbHVlID0gJHRhcmdldC5wcm9wKENIRUNLRUQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBhdHRyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRzZXR0ZXIgPSBmblNldHRlcnNbYXR0cl07XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IHNldHRlciA/ICR0YXJnZXRbc2V0dGVyXSgpIDogJHRhcmdldC5hdHRyKGF0dHIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsaW5rQ3R4Ll92YWwgPSBjdXJyZW50VmFsdWU7XG5cdH1cblx0cmV0dXJuIGF0dHI7XG59XG5cbmZ1bmN0aW9uIHNldERlZmVyKGVsZW0sIHZhbHVlKSB7XG5cdGVsZW0uX2RmID0gdmFsdWU7IC8vIFVzZSBib3RoIGFuIGV4cGFuZG8gYW5kIGFuIGF0dHJpYnV0ZSB0byB0cmFjayBkZWZlcmVkIHRva2Vucy4gQXR0cmlidXRlIGlzIG5lZWRlZCBmb3IgcXVlcnlTZWxlY3RvckFsbCBmb3IgZ2V0Vmlld0luZm9zIChjaGlsZFRhZ3MpXG5cdGVsZW1bKHZhbHVlID8gXCJzZXRcIiA6IFwicmVtb3ZlXCIpICsgXCJBdHRyaWJ1dGVcIl0oZGVmZXJBdHRyLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29udGVudChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgYXR0ciwgdGFnKSB7XG5cdC8vIFdoZW4gY2FsbGVkIGZvciBhIHRhZywgZWl0aGVyIGluIHRhZy5yZWZyZXNoKCkgb3IgcHJvcGVydHlDaGFuZ2VIYW5kbGVyKCksIHJldHVybnMgYSBwcm9taXNlIChhbmQgc3VwcG9ydHMgYXN5bmMpXG5cdC8vIFdoZW4gY2FsbGVkIChpbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIpIGZvciB0YXJnZXQgSFRNTCByZXR1cm5zIHRydWVcblx0Ly8gV2hlbiBjYWxsZWQgKGluIHByb3BlcnR5Q2hhbmdlSGFuZGxlcikgZm9yIG90aGVyIHRhcmdldHMgcmV0dXJucyBib29sZWFuIGZvciBcImNoYW5nZWRcIlxuXHR2YXIgc2V0dGVyLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHByb21pc2UsIG5vZGVzVG9SZW1vdmUsIHVzZVByb3AsIHRva2VucywgaWQsIG9wZW5JbmRleCwgY2xvc2VJbmRleCwgdGVzdEVsZW0sIG5vZGVOYW1lLCBjU3R5bGUsIGpzdlNlbCxcblx0XHRyZW5kZXJzID0gYXR0ciAhPT0gTk9ORSAmJiBzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFsaW5rQ3R4Ll9ub1VwZCwgLy8gRm9yIGRhdGEtbGluaz1cIl57Li4ufVwiLCBkb24ndCB1cGRhdGUgdGhlIGZpcnN0IHRpbWUgKG5vIGluaXRpYWwgcmVuZGVyKSAtIGUuZy4gdG8gbGVhdmUgc2VydmVyIHJlbmRlcmVkIHZhbHVlcy5cblx0XHRzb3VyY2UgPSBsaW5rQ3R4LmRhdGEsXG5cdFx0dGFyZ2V0ID0gdGFnICYmIHRhZy5wYXJlbnRFbGVtIHx8IGxpbmtDdHguZWxlbSxcblx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZSxcblx0XHQkdGFyZ2V0ID0gJCh0YXJnZXQpLFxuXHRcdHZpZXcgPSBsaW5rQ3R4LnZpZXcsXG5cdFx0dGFyZ2V0VmFsID0gbGlua0N0eC5fdmFsLFxuXHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHgsXG5cdFx0Ly8gSWYgbm90IGEgdGFnIHdlIGNhbiB1c2UgdGhlIC5fdmFsIG9idGFpbmVkIGZyb20gZ2V0VGFyZ2V0VmFsKClcblx0XHQvLyBhbmQgb25seSB1cGRhdGUgd2hlbiB0aGUgbmV3IHZhbHVlIChzb3VyY2VWYWx1ZSkgaGFzIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgb25lXG5cdFx0Y2hhbmdlID0gdGFnO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBJbml0aWFsaXplIHRoZSB0YWcgd2l0aCBlbGVtZW50IHJlZmVyZW5jZXNcblx0XHR0YWcuXy51bmxpbmtlZCA9IHRydWU7IC8vIFNldCB0byB1bmxpbmtlZCwgc28gaW5pdGlhbGl6YXRpb24gaXMgdHJpZ2dlcmVkIGFmdGVyIHJlLXJlbmRlcmluZywgZS5nLiBmb3Igc2V0dGluZyBsaW5rZWRFbGVtLCBhbmQgY2FsbGluZyBvbkJpbmRcblx0XHR0YWcucGFyZW50RWxlbSA9IHRhZy5wYXJlbnRFbGVtIHx8IChsaW5rQ3R4LmV4cHIgfHwgdGFnLl9lbENudCkgPyB0YXJnZXQgOiB0YXJnZXRQYXJlbnQ7XG5cdFx0cHJldk5vZGUgPSB0YWcuX3Bydjtcblx0XHRuZXh0Tm9kZSA9IHRhZy5fbnh0O1xuXHR9XG5cdGlmICghcmVuZGVycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmIChhdHRyID09PSBcInZpc2libGVcIikge1xuXHRcdGF0dHIgPSBcImNzcy1kaXNwbGF5XCI7XG5cdH1cblx0aWYgKC9eY3NzLS8udGVzdChhdHRyKSkge1xuXHRcdGlmIChsaW5rQ3R4LmF0dHIgPT09IFwidmlzaWJsZVwiKSB7XG5cdFx0XHQvLyBHZXQgdGhlIGN1cnJlbnQgZGlzcGxheSBzdHlsZVxuXHRcdFx0Y1N0eWxlID0gKHRhcmdldC5jdXJyZW50U3R5bGUgfHwgZ2V0Q29tcHV0ZWRTdHlsZS5jYWxsKGdsb2JhbCwgdGFyZ2V0LCBcIlwiKSkuZGlzcGxheTtcblxuXHRcdFx0aWYgKHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBzaG93aW5nIHRoZSBlbGVtZW50LlxuXHRcdFx0XHQvLyBHZXQgdGhlIGNhY2hlZCAndmlzaWJsZScgZGlzcGxheSB2YWx1ZSBmcm9tIHRoZSAtanN2ZCBleHBhbmRvXG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gdGFyZ2V0Ll9qc3ZkXG5cdFx0XHRcdFx0Ly8gT3IsIGlmIG5vdCB5ZXQgY2FjaGVkLCBnZXQgdGhlIGN1cnJlbnQgZGlzcGxheSB2YWx1ZVxuXHRcdFx0XHRcdHx8IGNTdHlsZTtcblx0XHRcdFx0aWYgKHNvdXJjZVZhbHVlID09PSBOT05FICYmICEoc291cmNlVmFsdWUgPSBkaXNwbGF5U3R5bGVzW25vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lXSkpIHtcblx0XHRcdFx0XHQvLyBDdXJyZW50bHkgZGlzcGxheSB2YWx1ZSBpcyAnbm9uZScsIGFuZCB0aGUgJ3Zpc2libGUnIHN0eWxlIGhhcyBub3QgYmVlbiBjYWNoZWQuXG5cdFx0XHRcdFx0Ly8gV2UgY3JlYXRlIGFuIGVsZW1lbnQgdG8gZmluZCB0aGUgY29ycmVjdCAndmlzaWJsZScgZGlzcGxheSBzdHlsZSBmb3IgdGhpcyBub2RlTmFtZVxuXHRcdFx0XHRcdHRlc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXN0RWxlbSk7XG5cblx0XHRcdFx0XHQvLyBHZXQgdGhlIGRlZmF1bHQgc3R5bGUgZm9yIHRoaXMgSFRNTCB0YWcgdG8gdXNlIGFzICd2aXNpYmxlJyBzdHlsZVxuXHRcdFx0XHRcdHNvdXJjZVZhbHVlXG5cdFx0XHRcdFx0XHQvLyBhbmQgY2FjaGUgaXQgYXMgYSBoYXNoIGFnYWluc3Qgbm9kZU5hbWVcblx0XHRcdFx0XHRcdD0gZGlzcGxheVN0eWxlc1tub2RlTmFtZV1cblx0XHRcdFx0XHRcdD0gKHRlc3RFbGVtLmN1cnJlbnRTdHlsZSB8fCBnZXRDb21wdXRlZFN0eWxlLmNhbGwoZ2xvYmFsLCB0ZXN0RWxlbSwgXCJcIikpLmRpc3BsYXk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXN0RWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBoaWRpbmcgdGhlIGVsZW1lbnQuXG5cdFx0XHRcdC8vIENhY2hlIHRoZSBjdXJyZW50IGRpc3BsYXkgdmFsdWUgYXMgJ3Zpc2libGUnIHN0eWxlLCBvbiBfanN2ZCBleHBhbmRvLCBmb3Igd2hlbiB3ZSBzaG93IHRoZSBlbGVtZW50IGFnYWluXG5cdFx0XHRcdHRhcmdldC5fanN2ZCA9IGNTdHlsZTtcblx0XHRcdFx0c291cmNlVmFsdWUgPSBOT05FOyAvLyBIaWRlIHRoZSBlbGVtZW50XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjaGFuZ2UgPSBjaGFuZ2UgfHwgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0JC5zdHlsZSh0YXJnZXQsIGF0dHIuc2xpY2UoNCksIHNvdXJjZVZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoYXR0ciAhPT0gXCJsaW5rXCIpIHsgLy8gYXR0ciA9PT0gXCJsaW5rXCIgaXMgZm9yIHRhZyBjb250cm9scyB3aGljaCBkbyBkYXRhIGJpbmRpbmcgYnV0IGhhdmUgbm8gcmVuZGVyZWQgb3V0cHV0IG9yIHRhcmdldFxuXHRcdGlmICgvXmRhdGEtLy50ZXN0KGF0dHIpKSB7XG5cdFx0XHQkLmRhdGEodGFyZ2V0LCBhdHRyLnNsaWNlKDUpLCBzb3VyY2VWYWx1ZSk7IC8vIFN1cHBvcnQgZm9yIGJpbmRpbmcgdG8gZGF0YSBhdHRyaWJ1dGVzOiBkYXRhLWZvb3s6ZXhwcn06IGRhdGEtZm9vIGF0dHJpYnV0ZSB3aWxsIGJlXG5cdFx0XHQvLyBleHByLnRvU3RyaW5nKCksIGJ1dCAkLmRhdGEoZWxlbWVudCwgXCJmb29cIikgYW5kICQoZWxlbWVudCkuZGF0YShcImZvb1wiKSB3aWxsIGFjdHVhbGx5IHJldHVybiB2YWx1ZSBvZiBleHByLCBldmVuIGlmIG9mIHR5cGUgb2JqZWN0XG5cdFx0fVxuXHRcdGlmIChhdHRyID09PSBDSEVDS0VEKSB7XG5cdFx0XHR1c2VQcm9wID0gdHJ1ZTtcblx0XHRcdHNvdXJjZVZhbHVlID0gc291cmNlVmFsdWUgJiYgc291cmNlVmFsdWUgIT09IFwiZmFsc2VcIjtcblx0XHRcdC8vIFRoZSBzdHJpbmcgdmFsdWUgXCJmYWxzZVwiIGNhbiBvY2N1ciB3aXRoIGRhdGEtbGluaz1cImNoZWNrZWR7YXR0cjpleHByfVwiIC0gYXMgYSByZXN1bHQgb2YgYXR0ciwgYW5kIGhlbmNlIHVzaW5nIGNvbnZlcnRWYWwoKVxuXHRcdFx0Ly8gV2Ugd2lsbCBzZXQgdGhlIFwiY2hlY2tlZFwiIHByb3BlcnR5XG5cdFx0XHQvLyBXZSB3aWxsIGNvbXBhcmUgdGhpcyB3aXRoIHRoZSBjdXJyZW50IHZhbHVlXG5cdFx0fSBlbHNlIGlmIChhdHRyID09PSBSQURJTykge1xuXHRcdFx0Ly8gVGhpcyBpcyBhIHNwZWNpYWwgYmluZGluZyBhdHRyaWJ1dGUgZm9yIHJhZGlvIGJ1dHRvbnMsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBkZWZhdWx0ICd0bycgYmluZGluZy5cblx0XHRcdC8vIFRoaXMgYWxsb3dzIGJpbmRpbmcgYm90aCB0byB2YWx1ZSAoZm9yIGVhY2ggaW5wdXQpIGFuZCB0byB0aGUgZGVmYXVsdCBjaGVja2VkIHJhZGlvIGJ1dHRvbiAoZm9yIGVhY2ggaW5wdXQgaW4gbmFtZWQgZ3JvdXAsXG5cdFx0XHQvLyBlLmcuIGJpbmRpbmcgdG8gcGFyZW50IGRhdGEpLlxuXHRcdFx0Ly8gUGxhY2UgdmFsdWUgYmluZGluZyBmaXJzdDogPGlucHV0IHR5cGU9XCJyYWRpb1wiIGRhdGEtbGluaz1cInZhbHVlezpuYW1lfSB7OiNnZXQoJ2RhdGEnKS5kYXRhLmN1cnJlbmN5On0gXCIgLi4uLz5cblx0XHRcdC8vIG9yIChhbGxvd2luZyBhbnkgb3JkZXIgZm9yIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zKTpcblx0XHRcdC8vIDxpbnB1dCB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cInt7Om5hbWV9fVwiIGRhdGEtbGluaz1cIns6I2dldCgnZGF0YScpLmRhdGEuY3VycmVuY3k6fSB2YWx1ZV57Om5hbWV9XCIgLi4uLz5cblx0XHRcdHVzZVByb3AgPSB0cnVlO1xuXHRcdFx0YXR0ciA9IENIRUNLRUQ7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IHRhcmdldC52YWx1ZSA9PT0gKFwiXCIgKyBzb3VyY2VWYWx1ZSk7XG5cdFx0XHQvLyBJZiB0aGUgZGF0YSB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIHRoaXMgcmFkaW8gYnV0dG9uIGlucHV0LCBzZXQgdGhlIGNoZWNrZWQgcHJvcGVydHkgdG8gdHJ1ZVxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHNldCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSB0byBmYWxzZVxuXHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gXCJzZWxlY3RlZFwiIHx8IGF0dHIgPT09IFwiZGlzYWJsZWRcIiB8fCBhdHRyID09PSBcIm11bHRpcGxlXCIgfHwgYXR0ciA9PT0gXCJyZWFkb25seVwiKSB7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9IChzb3VyY2VWYWx1ZSAmJiBzb3VyY2VWYWx1ZSAhPT0gXCJmYWxzZVwiKSA/IGF0dHIgOiBudWxsO1xuXHRcdFx0Ly8gVXNlIGF0dHIsIG5vdCBwcm9wLCBzbyB3aGVuIHRoZSBvcHRpb25zIChmb3IgZXhhbXBsZSkgYXJlIGNoYW5nZWQgZHluYW1pY2FsbHksIGJ1dCBpbmNsdWRlIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHZhbHVlLFxuXHRcdFx0Ly8gdGhleSB3aWxsIHN0aWxsIGJlIHNlbGVjdGVkIGFmdGVyIHRoZSBjaGFuZ2Vcblx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFwidmFsdWVcIiAmJiB0YXJnZXQubm9kZU5hbWUgPT09IFwiU0VMRUNUXCIpIHtcblx0XHRcdHRhcmdldC5fanN2U2VsID0gJGlzQXJyYXkoc291cmNlVmFsdWUpXG5cdFx0XHRcdD8gc291cmNlVmFsdWVcblx0XHRcdFx0OiBcIlwiICsgc291cmNlVmFsdWU7IC8vIElmIG5vdCBhcnJheSwgY29lcmNlIHRvIHN0cmluZ1xuXHRcdH1cblxuXHRcdGlmIChzZXR0ZXIgPSBmblNldHRlcnNbYXR0cl0pIHtcblx0XHRcdGlmIChhdHRyID09PSBIVE1MKSB7XG5cdFx0XHRcdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0XHRpZiAodGFnICYmIHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHRcdG5vZGVzVG9SZW1vdmUgPSB0YWcubm9kZXModHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHRhZy5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZSAhPT0gbmV4dE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBwcmV2Tm9kZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB0cmFuc2ZlciB0aGUgdmlldyB0b2tlbnMgb24gcHJldk5vZGUgdG8gbmV4dE5vZGUgb2YgdGhpcyAndmlld1RvUmVmcmVzaCdcblx0XHRcdFx0XHRcdFx0dHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgdGFyZ2V0LCB0YWcuX3RnSWQsIFwiXlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodG9rZW5zID0gdGFyZ2V0Ll9kZikgeyAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIG5leHROb2RlLCBhbmQgc28gdGhlIHRhcmdldC5fZGYgbWF5IGluY2x1ZGUgdG9rZW5zIHJlZmVyZW5jaW5nXG5cdFx0XHRcdFx0XHRcdC8vIHZpZXcgYW5kIHRhZyBiaW5kaW5ncyBjb250YWluZWQgd2l0aGluIHRoZSBvcGVuIGFuZCBjbG9zZSB0b2tlbnMgb2YgdGhlIHVwZGF0ZWQgdGFnIGNvbnRyb2wuIFRoZXkgbmVlZCB0byBiZSBwcm9jZXNzZWQgKGRpc3Bvc2VkKVxuXHRcdFx0XHRcdFx0XHRpZCA9IHRhZy5fdGdJZCArIFwiXlwiO1xuXHRcdFx0XHRcdFx0XHRvcGVuSW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIiNcIiArIGlkKSArIDE7XG5cdFx0XHRcdFx0XHRcdGNsb3NlSW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIi9cIiArIGlkKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAob3BlbkluZGV4ICYmIGNsb3NlSW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0b3BlbkluZGV4ICs9IGlkLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2xvc2VJbmRleCA+IG9wZW5JbmRleCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0LCB0b2tlbnMuc2xpY2UoMCwgb3BlbkluZGV4KSArIHRva2Vucy5zbGljZShjbG9zZUluZGV4KSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRkaXNwb3NlVG9rZW5zKHRva2Vucy5zbGljZShvcGVuSW5kZXgsIGNsb3NlSW5kZXgpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVcblx0XHRcdFx0XHRcdFx0PyBwcmV2Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHRcdFx0OiBuZXh0Tm9kZVxuXHRcdFx0XHRcdFx0XHRcdD8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdFx0XHRcdFx0OiB0YXJnZXQubGFzdENoaWxkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBSZW1vdmUgSFRNTCBub2Rlc1xuXHRcdFx0XHRcdCQobm9kZXNUb1JlbW92ZSkucmVtb3ZlKCk7IC8vIE5vdGUgaWYgIXRhZy5fZWxDbnQgcmVtb3ZpbmcgdGhlIG5vZGVzVG9SZW1vdmUgd2lsbCBwcm9jZXNzIGFuZCBkaXNwb3NlIHZpZXcgYW5kIHRhZyBiaW5kaW5ncyBjb250YWluZWQgd2l0aGluIHRoZSB1cGRhdGVkIHRhZyBjb250cm9sXG5cblx0XHRcdFx0XHQvLyBJbnNlcnQgYW5kIGxpbmsgbmV3IGNvbnRlbnRcblx0XHRcdFx0XHRwcm9taXNlID0gdmlldy5saW5rKHZpZXcuZGF0YSwgdGFyZ2V0LCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHNvdXJjZVZhbHVlLCB0YWcgJiYge3RhZzogdGFnLl90Z0lkLCBsYXp5TGluazogdGFnLnRhZ0N0eC5wcm9wcy5sYXp5TGlua30pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGRhdGEtbGlua2VkIHZhbHVlIHRhcmdldGluZyBpbm5lckhUTUw6IGRhdGEtbGluaz1cImh0bWx7OmV4cHJ9XCIgb3IgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXG5cdFx0XHRcdFx0cmVuZGVycyA9IHJlbmRlcnMgJiYgdGFyZ2V0VmFsICE9PSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRpZiAocmVuZGVycykge1xuXHRcdFx0XHRcdFx0JHRhcmdldC5lbXB0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocmVuZGVycykge1xuXHRcdFx0XHRcdFx0cHJvbWlzZSA9IHZpZXcubGluayhzb3VyY2UsIHRhcmdldCwgcHJldk5vZGUsIG5leHROb2RlLCBzb3VyY2VWYWx1ZSwgdGFnICYmIHt0YWc6IHRhZy5fdGdJZH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBSZW1vdmUgZHluYW1pY2FsbHkgYWRkZWQgbGlua0N0eCBhbmQgY3R4IGZyb20gdmlld1xuXHRcdFx0XHR2aWV3LmxpbmtDdHggPSBvbGRMaW5rQ3R4O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKGF0dHIgPT09IFwidGV4dFwiICYmIHRhcmdldC5jaGlsZHJlbiAmJiAhdGFyZ2V0LmNoaWxkcmVuWzBdKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGNvZGUgaXMgZmFzdGVyIHRoZW4gJHRhcmdldC50ZXh0KClcblx0XHRcdFx0XHRcdGlmICh0YXJnZXQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQudGV4dENvbnRlbnQgPSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldC5pbm5lclRleHQgPSBzb3VyY2VWYWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JHRhcmdldFtzZXR0ZXJdKHNvdXJjZVZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKChqc3ZTZWwgPSB0YXJnZXRQYXJlbnQuX2pzdlNlbClcblx0XHRcdFx0XHQvLyBTZXR0aW5nIHZhbHVlIG9mIDxvcHRpb24+IGVsZW1lbnRcblx0XHRcdFx0XHQmJiAoYXR0ciA9PT0gXCJ2YWx1ZVwiIHx8ICEkdGFyZ2V0LmF0dHIoXCJ2YWx1ZVwiKSkpIHsgLy8gU2V0dGluZyB2YWx1ZSBhdHRyaWJ1dGUsIG9yIHNldHRpbmcgdGV4dENvbnRlbnQgaWYgYXR0cmlidXRlIGlzIG51bGxcblx0XHRcdFx0XHQvLyBTZXQvdW5zZWxlY3Qgc2VsZWN0aW9uIGJhc2VkIG9uIHZhbHVlIHNldCBvbiBwYXJlbnQgPHNlbGVjdD4uIFdvcmtzIGZvciBtdWx0aXNlbGVjdCB0b29cblx0XHRcdFx0XHR0YXJnZXQuc2VsZWN0ZWQgPSAkLmluQXJyYXkoXCJcIiArIHNvdXJjZVZhbHVlLCAkaXNBcnJheShqc3ZTZWwpID8ganN2U2VsIDogW2pzdlNlbF0pID4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHQvLyBTZXR0aW5nIGFuIGF0dHJpYnV0ZSB0byB1bmRlZmluZWQgc2hvdWxkIHJlbW92ZSB0aGUgYXR0cmlidXRlXG5cdFx0XHQkdGFyZ2V0W3VzZVByb3AgPyBcInByb3BcIiA6IFwiYXR0clwiXShhdHRyLCBzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICF1c2VQcm9wID8gbnVsbCA6IHNvdXJjZVZhbHVlKTtcblx0XHR9XG5cdFx0bGlua0N0eC5fdmFsID0gc291cmNlVmFsdWU7XG5cdH1cblx0cmV0dXJuIHByb21pc2UgfHwgY2hhbmdlO1xufVxuXG5mdW5jdGlvbiBhcnJheUNoYW5nZUhhbmRsZXIoZXYsIGV2ZW50QXJncykge1xuXHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0b25CZWZvcmVDaGFuZ2UgPSBzZWxmLmhscChvbkJlZm9yZUNoYW5nZVN0ciksXG5cdFx0b25BZnRlckNoYW5nZSA9IHNlbGYuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpO1xuXHRpZiAoIW9uQmVmb3JlQ2hhbmdlIHx8IG9uQmVmb3JlQ2hhbmdlLmNhbGwodGhpcywgZXYsIGV2ZW50QXJncykgIT09IGZhbHNlKSB7XG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0Ly8gVGhpcyBpcyBhbiBvYnNlcnZhYmxlIGFjdGlvbiAobm90IGEgdHJpZ2dlci9oYW5kbGVyIGNhbGwgZnJvbSBwdXNoVmFsdWVzLCBvciBzaW1pbGFyLCBmb3Igd2hpY2ggZXZlbnRBcmdzIHdpbGwgYmUgbnVsbClcblx0XHRcdHZhciBhY3Rpb24gPSBldmVudEFyZ3MuY2hhbmdlLFxuXHRcdFx0XHRpbmRleCA9IGV2ZW50QXJncy5pbmRleCxcblx0XHRcdFx0aXRlbXMgPSBldmVudEFyZ3MuaXRlbXM7XG5cdFx0XHRzZWxmLl8uc3J0ID0gZXZlbnRBcmdzLnJlZnJlc2g7IC8vIHRydWUgaWYgcGFydCBvZiBhICdzb3J0JyBvbiByZWZyZXNoXG5cdFx0XHRzd2l0Y2ggKGFjdGlvbikge1xuXHRcdFx0XHRjYXNlIFwiaW5zZXJ0XCI6XG5cdFx0XHRcdFx0c2VsZi5hZGRWaWV3cyhpbmRleCwgaXRlbXMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmVtb3ZlXCI6XG5cdFx0XHRcdFx0c2VsZi5yZW1vdmVWaWV3cyhpbmRleCwgaXRlbXMubGVuZ3RoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIm1vdmVcIjpcblx0XHRcdFx0XHRzZWxmLnJlbW92ZVZpZXdzKGV2ZW50QXJncy5vbGRJbmRleCwgaXRlbXMubGVuZ3RoLCB1bmRlZmluZWQsIHRydWUpOyAvLyByZW1vdmVcblx0XHRcdFx0XHRzZWxmLmFkZFZpZXdzKGluZGV4LCBpdGVtcyk7IC8vIHJlLWluc2VydFxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwicmVmcmVzaFwiOlxuXHRcdFx0XHRcdHNlbGYuXy5zcnQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0c2VsZi5maXhJbmRleCgwKTtcblx0XHRcdFx0XHQvLyBPdGhlciBjYXNlczogKGUuZy51bmRlZmluZWQsIGZvciBzZXRQcm9wZXJ0eSBvbiBvYnNlcnZhYmxlIG9iamVjdCkgZXRjLiBkbyBub3RoaW5nXG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvbkFmdGVyQ2hhbmdlKSB7XG5cdFx0XHRvbkFmdGVyQ2hhbmdlLmNhbGwodGhpcywgZXYsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFV0aWxpdGllcyBmb3IgZXZlbnQgaGFuZGxlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gc2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXcpIHtcblx0Ly8gQWRkL3JlbW92ZSBhcnJheUNoYW5nZSBoYW5kbGVyIG9uIHZpZXdcblx0dmFyIGhhbmRsZXIsIGFycmF5QmluZGluZyxcblx0XHR0eXBlID0gdmlldy50eXBlLCAvLyB1bmRlZmluZWQgaWYgdmlldyBpcyBiZWluZyByZW1vdmVkXG5cdFx0ZGF0YSA9IHZpZXcuZGF0YSxcblx0XHRib3VuZCA9IHZpZXcuXy5ibmQ7IC8vIHRydWUgZm9yIHRvcC1sZXZlbCBsaW5rKCkgb3IgZGF0YS1saW5rPVwie2Zvcn1cIiwgb3IgdGhlIGZvciB0YWcgaW5zdGFuY2UgZm9yIHtee2Zvcn19IChvciBmb3IgYW55IGN1c3RvbSB0YWcgdGhhdCBoYXMgYW4gb25BcnJheUNoYW5nZSBoYW5kbGVyKVxuXG5cdGlmICghdmlldy5fLnVzZUtleSAmJiBib3VuZCkge1xuXHRcdC8vIFRoaXMgaXMgYW4gYXJyYXkgdmlldy4gKHZpZXcuXy51c2VLZXkgbm90IGRlZmluZWQgPT4gZGF0YSBpcyBhcnJheSksIGFuZCBpcyBkYXRhLWJvdW5kIHRvIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50c1xuXG5cdFx0aWYgKGFycmF5QmluZGluZyA9IHZpZXcuXy5ibmRBcnIpIHtcblx0XHRcdC8vIEZpcnN0IHJlbW92ZSB0aGUgY3VycmVudCBoYW5kbGVyIGlmIHRoZXJlIGlzIG9uZVxuXHRcdFx0JChbYXJyYXlCaW5kaW5nWzFdXSkub2ZmKGFycmF5Q2hhbmdlU3RyLCBhcnJheUJpbmRpbmdbMF0pO1xuXHRcdFx0dmlldy5fLmJuZEFyciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKGJvdW5kICE9PSAhIWJvdW5kKSB7XG5cdFx0XHQvLyBib3VuZCBpcyBub3QgYSBib29sZWFuLCBzbyBpdCBpcyB0aGUgZGF0YS1saW5rZWQgdGFnIHRoYXQgJ293bnMnIHRoaXMgYXJyYXkgYmluZGluZyAtIGUuZy4ge157Zm9yLi4ufX1cblx0XHRcdGlmICh0eXBlKSB7XG5cdFx0XHRcdGJvdW5kLl8uYXJyVndzW3ZpZXcuXy5pZF0gPSB2aWV3O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIGJvdW5kLl8uYXJyVndzW3ZpZXcuXy5pZF07IC8vIGlmIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSAmJiBkYXRhKSB7XG5cdFx0XHQvLyBJZiB0aGlzIHZpZXcgaXMgbm90IGJlaW5nIHJlbW92ZWQsIGJ1dCB0aGUgZGF0YSBhcnJheSBoYXMgYmVlbiByZXBsYWNlZCwgdGhlbiBiaW5kIHRvIHRoZSBuZXcgZGF0YSBhcnJheVxuXHRcdFx0aGFuZGxlciA9IGZ1bmN0aW9uKGV2KSB7XG5cdFx0XHRcdGlmICghKGV2LmRhdGEgJiYgZXYuZGF0YS5vZmYpKSB7XG5cdFx0XHRcdFx0Ly8gU2tpcCBpZiAhIWV2LmRhdGEub2ZmOiAtIGEgaGFuZGxlciB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCAobWF5YmUgd2FzIG9uIGhhbmRsZXIgY29sbGVjdGlvbiBhdCBjYWxsIHRpbWUgLSB0aGVuIHJlbW92ZWQgYnkgYW5vdGhlciBoYW5kbGVyKVxuXHRcdFx0XHRcdC8vIElmIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIGRvIG5vdGhpbmcuIChDb3JyZXNwb25kcyB0byBjYXNlIHdoZXJlIHRoZXJlIGlzIGFub3RoZXIgaGFuZGxlciBvbiB0aGUgc2FtZSBkYXRhIHdob3NlXG5cdFx0XHRcdFx0Ly8gZWZmZWN0IHdhcyB0byByZW1vdmUgdGhpcyB2aWV3LCBhbmQgd2hpY2ggaGFwcGVuZWQgdG8gcHJlY2VkZSB0aGlzIGV2ZW50IGluIHRoZSB0cmlnZ2VyIHNlcXVlbmNlLiBTbyBhbHRob3VnaCB0aGlzXG5cdFx0XHRcdFx0Ly8gZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBub3csIGl0IGlzIHN0aWxsIGNhbGxlZCBzaW5jZSBhbHJlYWR5IG9uIHRoZSB0cmlnZ2VyIHNlcXVlbmNlKVxuXHRcdFx0XHRcdGFycmF5Q2hhbmdlSGFuZGxlci5hcHBseSh2aWV3LCBhcmd1bWVudHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0JChbZGF0YV0pLm9uKGFycmF5Q2hhbmdlU3RyLCBoYW5kbGVyKTtcblx0XHRcdHZpZXcuXy5ibmRBcnIgPSBbaGFuZGxlciwgZGF0YV07XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBdHRyKGVsZW0sIHRvLCBsaW5rR2V0VmFsKSB7XG5cdC8vIHRvOiB0cnVlIC0gZGVmYXVsdCBhdHRyaWJ1dGUgZm9yIHNldHRpbmcgZGF0YSB2YWx1ZSBvbiBIVE1MIGVsZW1lbnQ7IGZhbHNlOiBkZWZhdWx0IGF0dHJpYnV0ZSBmb3IgZ2V0dGluZyB2YWx1ZSBmcm9tIEhUTUwgZWxlbWVudFxuXHQvLyBNZXJnZSBpbiB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgYmluZGluZ3MgZm9yIHRoaXMgdGFyZ2V0IGVsZW1lbnRcblx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdGF0dHIgPVxuXHRcdFx0JHN1YlNldHRpbmdzQWR2YW5jZWQuX2ZlW25vZGVOYW1lXSAvLyBnZXQgZm9ybSBlbGVtZW50IGJpbmRpbmcgc2V0dGluZ3MgZm9yIGlucHV0IHRleHRhcmVhIHNlbGVjdCBvciBvcHRncm91cFxuXHRcdFx0fHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09IFRSVUUgJiYge3RvOiBIVE1MLCBmcm9tOiBIVE1MfTsgLy8gT3IgaWYgY29udGVudEVkaXRhYmxlIHNldCB0byBcInRydWVcIiBzZXQgYXR0ciB0byBcImh0bWxcIlxuXHRyZXR1cm4gYXR0clxuXHRcdD8gKHRvXG5cdFx0XHQ/ICgobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFJBRElPKSAvLyBGb3IgcmFkaW8gYnV0dG9ucywgYmluZCBmcm9tIHZhbHVlLCBidXQgYmluZCB0byAncmFkaW8nIC0gc3BlY2lhbCB2YWx1ZS5cblx0XHRcdFx0PyBSQURJT1xuXHRcdFx0XHQ6IGF0dHIudG8pXG5cdFx0XHQ6IGF0dHIuZnJvbSlcblx0XHQ6IHRvXG5cdFx0XHQ/IGxpbmtHZXRWYWwgPyBcInRleHRcIiA6IEhUTUwgLy8gRGVmYXVsdCBpbm5lclRleHQgZm9yIGRhdGEtbGluaz1cImEuYi5jXCIgb3IgZGF0YS1saW5rPVwiezphLmIuY31cIiAod2l0aCBvciB3aXRob3V0IGNvbnZlcnRlcnMpLSBvdGhlcndpc2UgaW5uZXJIVE1MXG5cdFx0XHQ6IFwiXCI7IC8vIERlZmF1bHQgaXMgbm90IHRvIGJpbmQgZnJvbVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVuZGVyaW5nIGFuZCBET00gaW5zZXJ0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZW5kZXJBbmRMaW5rKHZpZXcsIGluZGV4LCB0bXBsLCB2aWV3cywgZGF0YSwgY29udGV4dCwgcmVmcmVzaCkge1xuXHR2YXIgaHRtbCwgbGlua1RvTm9kZSwgcHJldlZpZXcsIG5vZGVzVG9SZW1vdmUsIGJpbmRJZCxcblx0XHRwYXJlbnROb2RlID0gdmlldy5wYXJlbnRFbGVtLFxuXHRcdHByZXZOb2RlID0gdmlldy5fcHJ2LFxuXHRcdG5leHROb2RlID0gdmlldy5fbnh0LFxuXHRcdGVsQ250ID0gdmlldy5fZWxDbnQ7XG5cblx0aWYgKHByZXZOb2RlICYmIHByZXZOb2RlLnBhcmVudE5vZGUgIT09IHBhcmVudE5vZGUpIHtcblx0XHRlcnJvcihcIk1pc3NpbmcgcGFyZW50Tm9kZVwiKTtcblx0XHQvLyBBYmFuZG9uLCBzaW5jZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgb3Igd3JhcHBlciBlbGVtZW50IGhhcyBiZWVuIGluc2VydGVkIGJldHdlZW4gcHJldk5vZGUgYW5kIHBhcmVudE5vZGVcblx0fVxuXG5cdGlmIChyZWZyZXNoKSB7XG5cdFx0bm9kZXNUb1JlbW92ZSA9IHZpZXcubm9kZXMoKTtcblx0XHRpZiAoZWxDbnQgJiYgcHJldk5vZGUgJiYgcHJldk5vZGUgIT09IG5leHROb2RlKSB7XG5cdFx0XHQvLyBUaGlzIHByZXZOb2RlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRyYW5zZmVyIHRoZSB2aWV3IHRva2VucyBvbiBwcmV2Tm9kZSB0byBuZXh0Tm9kZSBvZiB0aGlzICd2aWV3VG9SZWZyZXNoJ1xuXHRcdFx0dHJhbnNmZXJWaWV3VG9rZW5zKHByZXZOb2RlLCBuZXh0Tm9kZSwgcGFyZW50Tm9kZSwgdmlldy5fLmlkLCBcIl9cIiwgdHJ1ZSk7XG5cdFx0fVxuXHRcdC8vIFJlbW92ZSBjaGlsZCB2aWV3c1xuXHRcdHZpZXcucmVtb3ZlVmlld3ModW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdGxpbmtUb05vZGUgPSBuZXh0Tm9kZTtcblxuXHRcdGlmIChlbENudCkge1xuXHRcdFx0cHJldk5vZGUgPSBwcmV2Tm9kZVxuXHRcdFx0XHQ/IHByZXZOb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHQ6IG5leHROb2RlXG5cdFx0XHRcdFx0PyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHQ6IHBhcmVudE5vZGUubGFzdENoaWxkO1xuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBIVE1MIG5vZGVzXG5cdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblxuXHRcdGZvciAoYmluZElkIGluIHZpZXcuXy5ibmRzKSB7XG5cdFx0XHQvLyBUaGUgdmlldyBiaW5kaW5ncyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBhYm92ZSBpbjogJChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblx0XHRcdC8vIElmIG5vdCwgcmVtb3ZlIHRoZW0gaGVyZTpcblx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIGFkZFZpZXdzLiBPbmx5IGNhbGxlZCBpZiB2aWV3IGlzIG9mIHR5cGUgXCJhcnJheVwiXG5cdFx0aWYgKGluZGV4KSB7XG5cdFx0XHQvLyBpbmRleCBpcyBhIG51bWJlciwgc28gaW5kZXhlZCB2aWV3IGluIHZpZXcgYXJyYXlcblx0XHRcdHByZXZWaWV3ID0gdmlld3NbaW5kZXggLSAxXTtcblx0XHRcdGlmICghcHJldlZpZXcpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBJZiBzdWJ2aWV3IGZvciBwcm92aWRlZCBpbmRleCBkb2VzIG5vdCBleGlzdCwgZG8gbm90aGluZ1xuXHRcdFx0fVxuXHRcdFx0cHJldk5vZGUgPSBwcmV2Vmlldy5fbnh0O1xuXHRcdH1cblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdGxpbmtUb05vZGUgPSBwcmV2Tm9kZTtcblx0XHRcdHByZXZOb2RlID0gbGlua1RvTm9kZVxuXHRcdFx0XHQ/IGxpbmtUb05vZGUucHJldmlvdXNTaWJsaW5nICAgICAgICAgLy8gVGhlcmUgaXMgYSBsaW5rVG9Ob2RlLCBzbyBpbnNlcnQgYWZ0ZXIgcHJldmlvdXNTaWJsaW5nLCBvciBhdCB0aGUgYmVnaW5uaW5nXG5cdFx0XHRcdDogcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7ICAgICAgICAgICAgICAvLyBJZiBubyBwcmV2VmlldyBhbmQgbm8gcHJldk5vZGUsIGluZGV4IGlzIDAgYW5kIHRoZSBjb250YWluZXIgaXMgZW1wdHksXG5cdFx0XHRcdC8vIHNvIHByZXZOb2RlID0gbGlua1RvTm9kZSA9IG51bGwuIEJ1dCBpZiBwcmV2Vmlldy5fbnh0IGlzIG51bGwgdGhlbiB3ZSBzZXQgcHJldk5vZGUgdG8gcGFyZW50Tm9kZS5sYXN0Q2hpbGRcblx0XHRcdFx0Ly8gKHdoaWNoIG11c3QgYmUgYmVmb3JlIHRoZSBwcmV2Vmlldykgc28gd2UgaW5zZXJ0IGFmdGVyIHRoYXQgbm9kZSAtIGFuZCBvbmx5IGxpbmsgdGhlIGluc2VydGVkIG5vZGVzXG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpbmtUb05vZGUgPSBwcmV2Tm9kZS5uZXh0U2libGluZztcblx0XHR9XG5cdH1cblx0aHRtbCA9IHRtcGwucmVuZGVyKGRhdGEsIGNvbnRleHQsIHZpZXcuXy51c2VLZXkgJiYgcmVmcmVzaCwgdmlldywgcmVmcmVzaCB8fCBpbmRleCwgdHJ1ZSk7XG5cdC8vIFBhc3MgaW4gdmlldy5fLnVzZUtleSBhcyB0ZXN0IGZvciBub0l0ZXJhdGlvbiAod2hpY2ggY29ycmVzcG9uZHMgdG8gd2hlbiBzZWxmLl8udXNlS2V5ID4gMCBhbmQgc2VsZi5kYXRhIGlzIGFuIGFycmF5KVxuXG5cdC8vIExpbmsgdGhlIG5ldyBIVE1MIG5vZGVzIHRvIHRoZSBkYXRhXG5cdHZpZXcubGluayhkYXRhLCBwYXJlbnROb2RlLCBwcmV2Tm9kZSwgbGlua1RvTm9kZSwgaHRtbCwgcHJldlZpZXcpO1xuLy99LCAwKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT1cbi8vIGFkZEJpbmRpbmdNYXJrZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBhZGRCaW5kaW5nTWFya2Vycyh2YWx1ZSwgdmlldywgdGFnKSB7XG5cdC8vIEluc2VydCBiaW5kaW5nIG1hcmtlcnMgaW50byB0aGUgcmVuZGVyZWQgdGVtcGxhdGUgb3V0cHV0LCB3aGljaCB3aWxsIGdldCBjb252ZXJ0ZWQgdG8gYXBwcm9wcmlhdGVcblx0Ly8gZGF0YS1qc3YgYXR0cmlidXRlcyAoZWxlbWVudC1vbmx5IGNvbnRlbnQpIG9yIHNjcmlwdCBtYXJrZXIgbm9kZXMgKHBocmFzaW5nIG9yIGZsb3cgY29udGVudCksIGluIGNvbnZlcnRNYXJrZXJzLFxuXHQvLyB3aXRoaW4gdmlldy5saW5rLCBwcmlvciB0byBpbnNlcnRpbmcgaW50byB0aGUgRE9NLiBMaW5raW5nIHdpbGwgdGhlbiBiaW5kIGJhc2VkIG9uIHRoZXNlIG1hcmtlcnMgaW4gdGhlIERPTS5cblx0Ly8gQWRkZWQgdmlldyBtYXJrZXJzOiAjbV8uLi5WSUVXLi4uL21fXG5cdC8vIEFkZGVkIHRhZyBtYXJrZXJzOiAjbV4uLi5UQUcuLi4uL21eXG5cdHZhciBpZCwgZW5kO1xuXHRpZiAodGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGJpbmRpbmcgbWFya2VyIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fVxuXHRcdGVuZCA9IFwiXmBcIjtcblx0XHRhZGRMaW5rTWV0aG9kcyh0YWcsIHRydWUpOyAvLyBUaGlzIGlzIHteez4uLi59fSBvciB7Xnt0YWcgLi4ufX0sIHt7Y3Z0Oi4uLn0gb3Ige157Oi4uLn19LCBhbmQgdGFnIHdhcyBkZWZpbmVkIGluIGNvbnZlcnRWYWwgb3IgcmVuZGVyVGFnXG5cdFx0aWQgPSB0YWcuX3RnSWQ7XG5cdFx0aWYgKCFpZCkge1xuXHRcdFx0YmluZGluZ1N0b3JlW2lkID0gYmluZGluZ0tleSsrXSA9IHRhZzsgLy8gU3RvcmUgdGhlIHRhZyB0ZW1wb3JhcmlseSwgcmVhZHkgZm9yIGRhdGFiaW5kaW5nLlxuXHRcdFx0Ly8gRHVyaW5nIGxpbmtpbmcsIGluIGFkZERhdGFCaW5kaW5nLCB0aGUgdGFnIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGxpbmtDdHgsXG5cdFx0XHQvLyBhbmQgdGhlbiBpbiBvYnNlcnZlQW5kQmluZCwgYmluZGluZ1N0b3JlW2JpbmRJZF0gd2lsbCBiZSByZXBsYWNlZCBieSBiaW5kaW5nIGluZm8uXG5cdFx0XHR0YWcuX3RnSWQgPSBcIlwiICsgaWQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSBiaW5kaW5nIG1hcmtlciBmb3IgYSB2aWV3XG5cdFx0Ly8gQWRkIHRoZSB2aWV3IHRvIHRoZSBzdG9yZSBvZiBjdXJyZW50IGxpbmtlZCB2aWV3c1xuXHRcdGVuZCA9IFwiX2BcIjtcblx0XHRhZGRMaW5rTWV0aG9kcyh2aWV3U3RvcmVbaWQgPSB2aWV3Ll8uaWRdID0gdmlldyk7XG5cdH1cblx0Ly8gRXhhbXBsZTogXCIjMjNeVGhlVmFsdWUvMjNeXCJcblx0cmV0dXJuIFwiI1wiICsgaWQgKyBlbmRcblx0XHQrICh2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IFwiXCIpIC8vIEZvciB7Xns6bmFtZX19IHRoaXMgZ2l2ZXMgdGhlIGVxdWl2YWxlbnQgc2VtYW50aWNzIHRvIGNvbXBpbGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gKHY9ZGF0YS5uYW1lKSE9bnVsbD92OlwiXCI7IHVzZWQgaW4ge3s6bmFtZX19IG9yIGRhdGEtbGluaz1cIm5hbWVcIlxuXHRcdCsgXCIvXCIgKyBpZCArIGVuZDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERhdGEtbGlua2luZyBhbmQgZGF0YSBiaW5kaW5nXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLy0tLS0tLS0tLS0tLS0tLVxuLy8gb2JzZXJ2ZUFuZEJpbmRcbi8vLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIG9ic2VydmVBbmRCaW5kKGxpbmtDdHgsIHNvdXJjZSwgdGFyZ2V0KSB7XG5cdHZhciBiaW5kaW5nLCBsLCBrLCBsaW5rZWRFbGVtLCBleHByRm5EZXBzLCBleHByT2IsIHByb3AsIHByb3BEZXBzLFxuXHRcdHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdGN2dEJrID0gbGlua0N0eC5jb252ZXJ0QmFjayxcblx0XHRkZXBlbmRzID0gW10sXG5cdFx0YmluZElkID0gbGlua0N0eC5fYm5kSWQgfHwgXCJcIiArIGJpbmRpbmdLZXkrKyxcblx0XHRoYW5kbGVyID0gbGlua0N0eC5faGRsO1xuXG5cdGxpbmtDdHguX2JuZElkID0gdW5kZWZpbmVkO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBVc2UgdGhlICdkZXBlbmRzJyBwYXRocyBzZXQgb24gbGlua0N0eC50YWcgLSB3aGljaCBtYXkgaGF2ZSBiZWVuIHNldCBvbiBkZWNsYXJhdGlvblxuXHRcdC8vIG9yIGluIGV2ZW50czogaW5pdCwgcmVuZGVyLCBvbkFmdGVyTGluayBldGMuXG5cdFx0ZGVwZW5kcyA9IHRhZy5kZXBlbmRzIHx8IGRlcGVuZHM7XG5cdFx0ZGVwZW5kcyA9ICRpc0Z1bmN0aW9uKGRlcGVuZHMpID8gdGFnLmRlcGVuZHModGFnKSA6IGRlcGVuZHM7XG5cdFx0bGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtO1xuXHR9XG5cdGlmICghbGlua0N0eC5fZGVwZW5kcyB8fCAoXCJcIiArIGxpbmtDdHguX2RlcGVuZHMgIT09IFwiXCIgKyBkZXBlbmRzKSkge1xuXHRcdC8vIE9ubHkgYmluZCB0aGUgZmlyc3QgdGltZSwgb3IgaWYgdGhlIG5ldyBkZXBlbmRzICh0b1N0cmluZykgaGFzIGNoYW5nZWQgZnJvbSB3aGVuIGxhc3QgYm91bmRcblx0XHRpZiAobGlua0N0eC5fZGVwZW5kcykge1xuXHRcdFx0Ly8gVW5vYnNlcnZlIHByZXZpb3VzIGJpbmRpbmdcblx0XHRcdCRvYnNlcnZhYmxlLl9hcHBseShmYWxzZSwgW3NvdXJjZV0sIGxpbmtDdHguX2RlcGVuZHMsIGhhbmRsZXIsIHRydWUpO1xuXHRcdH1cblxuXHRcdGV4cHJGbkRlcHMgPSBsaW5rQ3R4LmZuLmRlcHMuc2xpY2UoKTsgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGRlcGVuZGVuY3kgcGF0aHMgZm9yIHRoZSBjb21waWxlZCBsaW5rQ3R4IGV4cHJlc3Npb24gLSB0byBwYXNzIHRvIG9ic2VydmUoKS4gSW4gZ2V0SW5uZXJDYigpLFxuXHRcdC8vIChhbmQgd2hlbmV2ZXIgdGhlIG9iamVjdCBpcyB1cGRhdGVkLCBpbiBpbm5lckNiKSwgd2Ugd2lsbCBzZXQgZXhwck9iLm9iIHRvIHRoZSBjdXJyZW50IG9iamVjdCByZXR1cm5lZCBieSB0aGF0IGNvbXB1dGVkIGV4cHJlc3Npb24sIGZvciB0aGlzIHZpZXcuXG5cblx0XHRpZiAodGFnICYmIHRhZy5ib3VuZFByb3BzKSB7XG5cdFx0XHQvLyBBZGQgZGVwZW5kZW5jeSBwYXRocyBmb3IgZGVjbGFyZWQgYm91bmRQcm9wcyAoc28gbm8gbmVlZCB0byB3cml0aCBebXlwcm9wPS4uLiB0byBnZXQgYmluZGluZykgYW5kIGZvciBsaW5rZWRQcm9wIHRvbyBpZiB0aGVyZSBpcyBvbmVcblx0XHRcdGwgPSB0YWcuYm91bmRQcm9wcy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdHByb3AgPSB0YWcuYm91bmRQcm9wc1tsXTtcblx0XHRcdFx0ayA9IHRhZy5fLmJuZC5wYXRocy5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlIChrLS0pIHtcblx0XHRcdFx0XHRwcm9wRGVwcyA9IHRhZy5fLmJuZC5wYXRoc1trXVtwcm9wXTtcblx0XHRcdFx0XHRpZiAocHJvcERlcHMgJiYgcHJvcERlcHMuc2twKSB7IC8vIE5vdCBhbHJlYWR5IGEgYm91bmQgcHJvcCBecHJvcD1leHByZXNzaW9uO1xuXHRcdFx0XHRcdFx0ZXhwckZuRGVwcyA9IGV4cHJGbkRlcHMuY29uY2F0KHByb3BEZXBzKTsgLy8gQWRkIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBwcm9wIGV4cHJlc3Npb25cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsID0gZXhwckZuRGVwcy5sZW5ndGg7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0ZXhwck9iID0gZXhwckZuRGVwc1tsXTtcblx0XHRcdGlmIChleHByT2IuX2pzdikge1xuXHRcdFx0XHQvLyBUaGlzIHBhdGggaXMgYW4gJ2V4cHJPYicsIGNvcnJlc3BvbmRpbmcgdG8gYSBjb21wdXRlZCwgcmV0dXJuaW5nIGFuIG9iamVjdC4gV2UgcmVwbGFjZSB0aGUgZXhwck9iIGJ5XG5cdFx0XHRcdC8vIGEgdmlldy1iaW5kaW5nLXNwZWNpZmljIGV4cHJPYiBpbnN0YW5jZS4gVGhlIGN1cnJlbnQgb2JqZWN0IHdpbGwgYmUgc3RvcmVkIGFzIGV4cHJPYi5vYi5cblx0XHRcdFx0ZXhwckZuRGVwc1tsXSA9ICRleHRlbmQoe30sIGV4cHJPYik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YmluZGluZyA9ICRvYnNlcnZhYmxlLl9hcHBseShcblx0XHRcdGZhbHNlLFxuXHRcdFx0W3NvdXJjZV0sXG5cdFx0XHRleHByRm5EZXBzLCAvLyBmbGF0dGVuIHRoZSBwYXRocyAtIHRvIGdhdGhlciBhbGwgdGhlIGRlcGVuZGVuY2llcyBhY3Jvc3MgYXJncyBhbmQgYm91bmQgcGFyYW1zXG5cdFx0XHRkZXBlbmRzLFxuXHRcdFx0aGFuZGxlcixcblx0XHRcdGxpbmtDdHguX2N0eENiKTtcblx0XHQvLyBUaGUgYmluZGluZyByZXR1cm5lZCBieSAkb2JzZXJ2ZSBoYXMgYSBibmQgYXJyYXkgd2l0aCB0aGUgc291cmNlIG9iamVjdHMgb2YgdGhlIGluZGl2aWR1YWwgYmluZGluZ3MuXG5cblx0XHRiaW5kaW5nLmVsZW0gPSB0YXJnZXQ7IC8vIFRoZSB0YXJnZXQgb2YgYWxsIHRoZSBpbmRpdmlkdWFsIGJpbmRpbmdzXG5cdFx0YmluZGluZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRiaW5kaW5nLl90Z0lkID0gYmluZElkO1xuXG5cdFx0Ly8gQWRkIHRvIHRoZSBfanN2Qm5kIG9uIHRoZSB0YXJnZXQgdGhlIHZpZXcgaWQgYW5kIGJpbmRpbmcgaWQgLSBmb3IgdW5iaW5kaW5nIHdoZW4gdGhlIHRhcmdldCBlbGVtZW50IGlzIHJlbW92ZWRcblx0XHR0YXJnZXQuX2pzdkJuZCA9IHRhcmdldC5fanN2Qm5kIHx8IFwiXCI7XG5cdFx0dGFyZ2V0Ll9qc3ZCbmQgKz0gXCImXCIgKyBiaW5kSWQ7XG5cdFx0bGlua0N0eC5fZGVwZW5kcyA9IGRlcGVuZHM7XG5cdFx0Ly8gU3RvcmUgdGhlIGJpbmRpbmcga2V5IG9uIHRoZSB2aWV3LCBmb3IgZGlzcG9zYWwgd2hlbiB0aGUgdmlldyBpcyByZW1vdmVkXG5cdFx0bGlua0N0eC52aWV3Ll8uYm5kc1tiaW5kSWRdID0gYmluZElkO1xuXHRcdC8vIFN0b3JlIHRoZSBiaW5kaW5nLlxuXHRcdGJpbmRpbmdTdG9yZVtiaW5kSWRdID0gYmluZGluZzsgLy8gTm90ZTogSWYgdGhpcyBjb3JyZXNwb25kcyB0byBhIGRhdGEtbGlua2VkIHRhZywgd2UgYXJlIHJlcGxhY2luZyB0aGVcblx0XHQvLyB0ZW1wb3JhcmlseSBzdG9yZWQgdGFnIGJ5IHRoZSBzdG9yZWQgYmluZGluZy4gVGhlIHRhZyB3aWxsIG5vdyBiZSBhdCBiaW5kaW5nLmxpbmtDdHgudGFnXG5cblx0XHRpZiAobGlua2VkRWxlbSkge1xuXHRcdFx0bCA9IGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRsaW5rZWRFbGVtW2xdLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCBsaW5rZWRFbGVtW2xdKTtcblx0XHRcdFx0bGlua2VkRWxlbVtsXS5fanN2Qm5kID0gXCImXCIgKyBiaW5kaW5nLl90Z0lkICsgXCIrXCI7IC8vIEFkZCBhIFwiK1wiIGZvciBjbG9uZWQgYmluZGluZyAtIHNvIHJlbW92aW5nXG5cdFx0XHRcdC8vIGVsZW1zIHdpdGggY2xvbmVkIGJpbmRpbmdzIHdpbGwgbm90IHJlbW92ZSB0aGUgJ3BhcmVudCcgYmluZGluZyBmcm9tIHRoZSBiaW5kaW5nU3RvcmUuXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjdnRCayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRiaW5kVG8oYmluZGluZywgdGFnLCB0YXJnZXQsIGN2dEJrKTtcblx0XHR9XG5cblx0XHRpZiAodGFnKSB7XG5cdFx0XHRpZiAoIXRhZy5mbG93ICYmICF0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0dGFyZ2V0LnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCAodGFyZ2V0LmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKXx8XCJcIikgKyBcIiNcIiArIGJpbmRJZCArIFwiXi9cIiArIGJpbmRJZCArIFwiXlwiKTtcblx0XHRcdFx0dGFnLl90Z0lkID0gXCJcIiArIGJpbmRJZDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLy8tLS0tLS0tXG4vLyAkLmxpbmtcbi8vLS0tLS0tLVxuXG5mdW5jdGlvbiB0bXBsTGluayh0bywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRyZXR1cm4gJGxpbmsodGhpcywgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpO1xufVxuXG5mdW5jdGlvbiAkbGluayh0bXBsT3JMaW5rRXhwciwgdG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0Ly8gV2hlbiBsaW5raW5nIGZyb20gYSB0ZW1wbGF0ZSwgcHJldk5vZGUgYW5kIG5leHROb2RlIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWRcblx0aWYgKGNvbnRleHQgPT09IHRydWUpIHtcblx0XHRub0l0ZXJhdGlvbiA9IGNvbnRleHQ7IC8vIHBhc3NpbmcgYm9vbGVhbiBhcyB0aGlyZCBwYXJhbSAtIG5vSXRlcmF0aW9uXG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICh0eXBlb2YgY29udGV4dCAhPT0gXCJvYmplY3RcIikge1xuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7IC8vIGNvbnRleHQgbXVzdCBiZSBhIGJvb2xlYW4gKG5vSXRlcmF0aW9uKSBvciBhIHBsYWluIG9iamVjdFxuXHR9IGVsc2Uge1xuXHRcdGNvbnRleHQgPSAkZXh0ZW5kKHt9LCBjb250ZXh0KTtcblx0fVxuXHRpZiAodG1wbE9yTGlua0V4cHIgJiYgdG8pIHtcblx0XHR0byA9IHRvLmpxdWVyeSA/IHRvIDogJCh0byk7IC8vIHRvIGlzIGEganF1ZXJ5IG9iamVjdCBvciBhbiBlbGVtZW50IG9yIHNlbGVjdG9yXG5cblx0XHRpZiAoIWFjdGl2ZUJvZHkpIHtcblx0XHRcdGFjdGl2ZUJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHRcdFx0JChhY3RpdmVCb2R5KVxuXHRcdFx0XHQub24oZWxlbWVudENoYW5nZVN0ciwgZWxlbUNoYW5nZUhhbmRsZXIpXG5cdFx0XHRcdC5vbignYmx1cicsICdbY29udGVudGVkaXRhYmxlXScsIGVsZW1DaGFuZ2VIYW5kbGVyKTtcblx0XHR9XG5cblx0XHR2YXIgaSwgaywgaHRtbCwgdndJbmZvcywgdmlldywgcGxhY2Vob2xkZXJQYXJlbnQsIHRhcmdldEVsLCByZWZyZXNoLCB0b3BMZXZlbENhbGwsXG5cdFx0XHRvblJlbmRlciA9IGFkZEJpbmRpbmdNYXJrZXJzLFxuXHRcdFx0cmVwbGFjZU1vZGUgPSBjb250ZXh0ICYmIGNvbnRleHQudGFyZ2V0ID09PSBcInJlcGxhY2VcIixcblx0XHRcdGwgPSB0by5sZW5ndGg7XG5cblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHR0YXJnZXRFbCA9IHRvW2xdO1xuXG5cdFx0XHRwYXJlbnRWaWV3ID0gcGFyZW50VmlldyB8fCAkdmlldyh0YXJnZXRFbCk7XG5cblx0XHRcdGlmICh0b3BMZXZlbENhbGwgPSBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdHRvcFZpZXcuZGF0YSA9ICh0b3BWaWV3LmN0eCA9IGNvbnRleHQgfHwge30pLnJvb3QgPSBmcm9tO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFwiXCIgKyB0bXBsT3JMaW5rRXhwciA9PT0gdG1wbE9yTGlua0V4cHIpIHtcblx0XHRcdFx0Ly8gdG1wbE9yTGlua0V4cHIgaXMgYSBzdHJpbmc6IHRyZWF0IGFzIGRhdGEtbGluayBleHByZXNzaW9uLlxuXHRcdFx0XHRhZGREYXRhQmluZGluZyh0bXBsT3JMaW5rRXhwciwgdGFyZ2V0RWwsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdHJ1ZSwgZnJvbSwgY29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodG1wbE9yTGlua0V4cHIubWFya3VwICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKClcblx0XHRcdFx0XHRpZiAocmVwbGFjZU1vZGUpIHtcblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyUGFyZW50ID0gdGFyZ2V0RWwucGFyZW50Tm9kZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRodG1sID0gdG1wbE9yTGlua0V4cHIucmVuZGVyKGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCB1bmRlZmluZWQsIG9uUmVuZGVyKTtcblx0XHRcdFx0XHQvLyBUT0RPIENvbnNpZGVyIGZpbmRpbmcgYSB3YXkgdG8gYmluZCBkYXRhIChsaW5rKSB3aXRoaW4gdGVtcGxhdGUgd2l0aG91dCBodG1sIGJlaW5nIGRpZmZlcmVudCBmb3IgZWFjaCB2aWV3LCB0aGUgSFRNTCBjYW5cblx0XHRcdFx0XHQvLyBiZSBldmFsdWF0ZWQgb25jZSBvdXRzaWRlIHRoZSB3aGlsZSAobC0tKSwgYW5kIHB1c2hlZCBpbnRvIGEgZG9jdW1lbnQgZnJhZ21lbnQsIHRoZW4gY2xvbmVkIGFuZCBpbnNlcnRlZCBhdCBlYWNoIHRhcmdldC5cblxuXHRcdFx0XHRcdGlmIChwbGFjZWhvbGRlclBhcmVudCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyB0YXJnZXQ9XCJyZXBsYWNlXCIgbW9kZVxuXHRcdFx0XHRcdFx0cHJldk5vZGUgPSB0YXJnZXRFbC5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHRcdFx0XHRuZXh0Tm9kZSA9IHRhcmdldEVsLm5leHRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0JC5jbGVhbkRhdGEoW3RhcmdldEVsXSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRwbGFjZWhvbGRlclBhcmVudC5yZW1vdmVDaGlsZCh0YXJnZXRFbCk7XG5cblx0XHRcdFx0XHRcdHRhcmdldEVsID0gcGxhY2Vob2xkZXJQYXJlbnQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHByZXZOb2RlID0gbmV4dE5vZGUgPSB1bmRlZmluZWQ7IC8vIFdoZW4gbGlua2luZyBmcm9tIGEgdGVtcGxhdGUsIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkXG5cdFx0XHRcdFx0XHQkKHRhcmdldEVsKS5lbXB0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0bXBsT3JMaW5rRXhwciA9PT0gdHJ1ZSAmJiBwYXJlbnRWaWV3ID09PSB0b3BWaWV3KSB7XG5cdFx0XHRcdFx0Ly8gJC5saW5rKHRydWUsIHNlbGVjdG9yLCBkYXRhLCBjdHgpIC0gd2hlcmUgc2VsZWN0b3IgcG9pbnRzIHRvIGVsZW0gaW4gdG9wLWxldmVsIGNvbnRlbnQuIChJZiBub3QgdG9wLWxldmVsIGNvbnRlbnQsIG5vLW9wKVxuXHRcdFx0XHRcdHJlZnJlc2ggPSB7bG5rOiAxfTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG4vLyBUT0RPIENvbnNpZGVyIGRlZmVycmVkIGxpbmtpbmcgQVBJIGZlYXR1cmUgb24gcGVyLXRlbXBsYXRlIGJhc2lzIC0ge0B7IGluc3RlYWQgb2Yge157IHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIHJlbmRlcmVkIGNvbnRlbnRcbi8vIGJlZm9yZSB0aGF0IGNvbnRlbnQgaXMgbGlua2VkLCB3aXRoIGJldHRlciBwZXJjZWl2ZWQgcGVyZi4gSGF2ZSB2aWV3LmxpbmsgcmV0dXJuIGEgZGVmZXJyZWQsIGFuZCBwYXNzIHRoYXQgdG8gb25BZnRlckxpbmsuLi5cbi8vIG9yIHNvbWV0aGluZyBhbG9uZyB0aG9zZSBsaW5lcy5cbi8vIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0aWYgKHRhcmdldEVsLl9kZiAmJiAhbmV4dE5vZGUpIHtcblx0XHRcdFx0XHQvLyBXZSBhcmUgaW5zZXJ0aW5nIG5ldyBjb250ZW50IGFuZCB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzIHNvbWUgZGVmZXJyZWQgYmluZGluZyBhbm5vdGF0aW9ucyxhbmQgdGhlcmUgaXMgbm8gbmV4dE5vZGUuXG5cdFx0XHRcdFx0Ly8gVGhvc2Ugdmlld3MgbWF5IGJlIHN0YWxlIHZpZXdzICh0aGF0IHdpbGwgYmUgcmVjcmVhdGVkIGluIHRoaXMgbmV3IGxpbmtpbmcgYWN0aW9uKSBzbyB3ZSB3aWxsIGZpcnN0IHJlbW92ZSB0aGVtXG5cdFx0XHRcdFx0Ly8gKGlmIG5vdCBhbHJlYWR5IHJlbW92ZWQpLlxuXHRcdFx0XHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3ModGFyZ2V0RWwuX2RmLCB0cnVlLCByT3BlblZpZXdNYXJrZXJzKTtcblxuXHRcdFx0XHRcdGZvciAoaSA9IDAsIGsgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGs7IGkrKykge1xuXHRcdFx0XHRcdFx0dmlldyA9IHZ3SW5mb3NbaV07XG5cdFx0XHRcdFx0XHRpZiAoKHZpZXcgPSB2aWV3U3RvcmVbdmlldy5pZF0pICYmIHZpZXcuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoaXMgaXMgdGhlIF9wcnYgKHByZXZOb2RlKSBmb3IgYSB2aWV3LCByZW1vdmUgdGhlIHZpZXdcblx0XHRcdFx0XHRcdFx0Ly8gLSB1bmxlc3Mgdmlldy5kYXRhIGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHRcdFx0dmlldy5wYXJlbnQucmVtb3ZlVmlld3Modmlldy5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0RWwpOyAvLyByZW1vdmUgZGVmZXIgdG9rZW5zXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMaW5rIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50LCBzaW5jZSB0aGlzIGlzIGEgY2FsbCB0byB0ZW1wbGF0ZS5saW5rKCksIG9yIHRvICQoZWwpLmxpbmsodHJ1ZSwgLi4uKSxcblx0XHRcdFx0cGFyZW50Vmlldy5saW5rKGZyb20sIHRhcmdldEVsLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIGh0bWwsIHJlZnJlc2gsIGNvbnRleHQpO1xuLy99LCAwKTtcblx0XHRcdH1cblx0XHRcdGlmICh0b3BMZXZlbENhbGwpIHtcblx0XHRcdFx0dG9wVmlldy5kYXRhID0gdG9wVmlldy5jdHggPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0bzsgLy8gQWxsb3cgY2hhaW5pbmcsIHRvIGF0dGFjaCBldmVudCBoYW5kbGVycywgZXRjLlxufVxuXG4vLy0tLS0tLS0tLS1cbi8vIHZpZXcubGlua1xuLy8tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHZpZXdMaW5rKG91dGVyRGF0YSwgcGFyZW50Tm9kZSwgcHJldk5vZGUsIG5leHROb2RlLCBodG1sLCByZWZyZXNoLCBjb250ZXh0LCB2YWxpZGF0ZU9ubHkpIHtcblx0Ly8gT3B0aW9uYWxseSBpbnNlcnQgSFRNTCBpbnRvIERPTSB1c2luZyBkb2N1bWVudEZyYWdtZW50cyAoYW5kIHdyYXBwaW5nIEhUTUwgYXBwcm9wcmlhdGVseSkuXG5cdC8vIERhdGEtbGluayBleGlzdGluZyBjb250ZW50cyBvZiBwYXJlbnROb2RlLCBvciB0aGUgaW5zZXJ0ZWQgSFRNTCwgaWYgcHJvdmlkZWRcblxuXHQvLyBEZXBlbmRpbmcgb24gdGhlIGNvbnRlbnQgbW9kZWwgZm9yIHRoZSBIVE1MIGVsZW1lbnRzLCB0aGUgc3RhbmRhcmQgZGF0YS1saW5raW5nIG1hcmtlcnMgaW5zZXJ0ZWQgaW4gdGhlIEhUTUwgYnkgYWRkQmluZGluZ01hcmtlcnMgZHVyaW5nXG5cdC8vIHRlbXBsYXRlIHJlbmRlcmluZyB3aWxsIGJlIGNvbnZlcnRlZCBlaXRoZXIgdG8gc2NyaXB0IG1hcmtlciBub2RlcyBvciwgZm9yIGVsZW1lbnQtb25seSBjb250ZW50IHNlY3Rpb25zLCB0byBkYXRhLWpzdiBlbGVtZW50IGFubm90YXRpb25zLlxuXG5cdC8vIERhdGEtbGlua2luZyB3aWxsIHRoZW4gYWRkIF9wcnYgYW5kIF9ueHQgdG8gdmlld3MsIHdoZXJlOlxuXHQvLyAgICAgX3BydjogUmVmZXJlbmNlcyB0aGUgcHJldmlvdXMgbm9kZSAoc2NyaXB0IGVsZW1lbnQgb2YgdHlwZSBcImpzdjEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIGZpcnN0IGVsZW1lbnQgbm9kZSBpbiB0aGUgdmlldyAob3IgaWYgbm9uZSwgc2V0IF9wcnYgPSBfbnh0KVxuXHQvLyAgICAgX254dDogUmVmZXJlbmNlcyB0aGUgbGFzdCBub2RlIChzY3JpcHQgZWxlbWVudCBvZiB0eXBlIFwianN2LzEyM1wiKSwgb3IgKGZvciBlbENudD10cnVlKSwgdGhlIG5leHQgZWxlbWVudCBub2RlIGFmdGVyIHRoZSB2aWV3LlxuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gY29udmVydE1hcmtlcnMoYWxsLCBwcmVjZWRpbmcsIHNlbGZDbG9zZSwgY2xvc2VUYWcsIHNwYWNlQmVmb3JlLCBpZCwgYm91bmRJZCwgc3BhY2VBZnRlciwgdGFnMSwgdGFnMiwgY2xvc2VUYWcyLCBzcGFjZUFmdGVyQ2xvc2UsIHNlbGZDbG9zZTIsIGVuZE9wZW5UYWcpIHtcblx0XHQvLyByQ29udmVydE1hcmtlcnMgPSAvKF58KFxcLz4pfDxcXC8oXFx3Kyk+fCkoXFxzKikoWyNcXC9dXFxkKyg/Ol98KFxcXikpKWAoXFxzKikoPFxcdysoPz1bXFxzXFwvPl0pKT98XFxzKig/Oig8XFx3Kyg/PVtcXHNcXC8+XSkpfDxcXC8oXFx3Kyk+KFxccyopfChcXC8+KVxccyp8KD4pKS9nLFxuXHRcdC8vICAgICAgICAgICAgICAgICBwcmVjLCBzbGZDbCwgY2xzVGFnLCAgc3BCZWZvcmUsIGlkLCAgICAgIGJuZElkICBzcEFmdGVyLHRhZzEsICAgICAgICAgICAgICAgICAgIHRhZzIsICAgICAgICAgICAgICAgY2xUYWcyLHNhYyAgc2xmQ2wyLCBlbmRPcGVuVGFnXG5cdFx0Ly8gQ29udmVydCB0aGUgbWFya2VycyB0aGF0IHdlcmUgaW5jbHVkZWQgYnkgYWRkQmluZGluZ01hcmtlcnMgaW4gdGVtcGxhdGUgb3V0cHV0LCB0byBhcHByb3ByaWF0ZSBET00gYW5ub3RhdGlvbnM6XG5cdFx0Ly8gZGF0YS1qc3YgYXR0cmlidXRlcyAoZm9yIGVsZW1lbnQtb25seSBjb250ZW50KSBvciBzY3JpcHQgbWFya2VyIG5vZGVzICh3aXRoaW4gcGhyYXNpbmcgb3IgZmxvdyBjb250ZW50KS5cblxuLy8gVE9ETyBjb25zaWRlciBkZXRlY3RpbmcgJ3F1b3RlZCcgY29udGV4dHMgKGF0dHJpYnV0ZSBzdHJpbmdzKSBzbyB0aGF0IGF0dHJpYnV0ZSBlbmNvZGluZyBkb2VzIG5vdCBuZWVkIHRvIGVuY29kZSA+XG4vLyBDdXJyZW50bHkgckF0dHJFbmNvZGUgPSAvWz48XCInJl0vZyBpbmNsdWRlcyAnPicgZW5jb2RpbmcgaW4gb3JkZXIgdG8gYXZvaWQgZXJyb25lb3VzIHBhcnNpbmcgb2YgPHNwYW4gdGl0bGU9XCImbHQ7YS8+XCI+PC9zcGFuPlwiPlxuXHRcdHZhciBlcnJvck1zZywgYm5kSWQsXG5cdFx0XHRlbmRPZkVsQ250ID0gXCJcIjtcblx0XHRpZiAoZW5kT3BlblRhZykge1xuXHRcdFx0aW5UYWcgPSAwO1xuXHRcdFx0cmV0dXJuIGFsbDtcblx0XHR9XG5cdFx0dGFnID0gdGFnMSB8fCB0YWcyIHx8IFwiXCI7XG5cdFx0Y2xvc2VUYWcgPSBjbG9zZVRhZyB8fCBjbG9zZVRhZzI7XG5cdFx0c2VsZkNsb3NlID0gc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTI7XG5cdFx0aWYgKGlzVm9pZCAmJiAhc2VsZkNsb3NlICYmICggIWFsbCB8fCBjbG9zZVRhZyB8fCB0YWcgfHwgaWQgJiYgIWluVGFnKSkgeyAvLyAhYWxsID0gZW5kIG9mIHN0cmluZ1xuXHRcdFx0aXNWb2lkID0gdW5kZWZpbmVkO1xuXHRcdFx0cGFyZW50VGFnID0gdGFnU3RhY2suc2hpZnQoKTsgLy8gcHJlY2VkaW5nIHRhZyB3YXMgYSB2b2lkIGVsZW1lbnQsIHdpdGggbm8gY2xvc2luZyBzbGFzaCwgc3VjaCBhcyA8YnI+LlxuXHRcdH1cblx0XHRjbG9zZVRhZyA9IGNsb3NlVGFnIHx8IHNlbGZDbG9zZTtcblx0XHRpZiAoY2xvc2VUYWcpIHtcblx0XHRcdGluVGFnID0gMDtcblx0XHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRcdC8vIFRPRE86IHNtYXJ0IGluc2VydGlvbiBvZiA8dGJvZHk+IC0gdG8gYmUgY29tcGxldGVkIGZvciByb2J1c3QgaW5zZXJ0aW9uIG9mIGRlZmVycmVkIGJpbmRpbmdzIGV0Yy5cblx0XHRcdC8vaWYgKGNsb3NlVGFnID09PSBcInRhYmxlXCIgJiYgcGFyZW50VGFnID09PSBcInRib2R5XCIpIHtcblx0XHRcdC8vXHRwcmVjZWRpbmcgPSBcIjwvdGJvZHk+XCIgKyBwcmVjZWRpbmc7XG5cdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0YWJsZVwiO1xuXHRcdFx0Ly9cdHRhZ1N0YWNrLnNoaWZ0KCk7XG5cdFx0XHQvL31cblx0XHRcdGlmICh2YWxpZGF0ZSkge1xuXHRcdFx0XHRpZiAoc2VsZkNsb3NlIHx8IHNlbGZDbG9zZTIpIHtcblx0XHRcdFx0XHRpZiAoIXZvaWRFbGVtc1twYXJlbnRUYWddICYmICEvO3N2Zzt8O21hdGg7Ly50ZXN0KFwiO1wiICsgdGFnU3RhY2suam9pbihcIjtcIikgKyBcIjtcIikpIHtcblx0XHRcdFx0XHRcdC8vIE9ubHkgc2VsZi1jbG9zaW5nIGVsZW1lbnRzIG11c3QgYmUgbGVnaXRpbWF0ZSB2b2lkIGVsZW1lbnRzLCBzdWNoIGFzIDxici8+LCBwZXIgSFRNTCBzY2hlbWEsXG5cdFx0XHRcdFx0XHQvLyBvciB1bmRlciBzdmcgb3IgbWF0aCBmb3JlaWduIG5hbWVzcGFjZSBlbGVtZW50cy5cblx0XHRcdFx0XHRcdGVycm9yTXNnID0gXCInPFwiICsgcGFyZW50VGFnICsgXCIuLi4vXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZvaWRFbGVtc1tjbG9zZVRhZ10pIHtcblx0XHRcdFx0XHRlcnJvck1zZyA9IFwiJzwvXCIgKyBjbG9zZVRhZzsgLy8gY2xvc2luZyB0YWcgc3VjaCBhcyA8L2lucHV0PlxuXHRcdFx0XHR9IGVsc2UgaWYgKCF0YWdTdGFjay5sZW5ndGggfHwgY2xvc2VUYWcgIT09IHBhcmVudFRhZykge1xuXHRcdFx0XHRcdGVycm9yTXNnID0gXCJNaXNtYXRjaDogJzwvXCIgKyBjbG9zZVRhZztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyb3JNc2cpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihlcnJvck1zZyArIFwiPicgaW46XFxuXCIgKyBodG1sKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJldkVsQ250ID0gZWxDbnQ7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWdTdGFjay5zaGlmdCgpO1xuXHRcdFx0ZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXTtcblx0XHRcdGNsb3NlVGFnMiA9IGNsb3NlVGFnMiA/IChcIjwvXCIgKyBjbG9zZVRhZzIgKyBcIj5cIikgOiBcIlwiO1xuXHRcdFx0aWYgKHByZXZFbENudCkge1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHRcdGRlZmVyICs9IGlkcztcblx0XHRcdFx0aWRzID0gXCJcIjtcblx0XHRcdFx0aWYgKCFlbENudCkge1xuXHRcdFx0XHRcdGVuZE9mRWxDbnQgPSBjbG9zZVRhZzIgKyBvcGVuU2NyaXB0ICsgXCJAXCIgKyBkZWZlciArIGNsb3NlU2NyaXB0ICsgKHNwYWNlQWZ0ZXJDbG9zZSB8fCBcIlwiKTtcblx0XHRcdFx0XHRkZWZlciA9IGRlZmVyU3RhY2suc2hpZnQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlciArPSBcIi1cIjsgLy8gV2lsbCBiZSB1c2VkIGZvciBzdGVwcGluZyBiYWNrIHRocm91Z2ggZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHQvLyBlbENvbnRlbnQgbWFwcyB0YWdOYW1lcyB3aGljaCBoYXZlIG9ubHkgZWxlbWVudCBjb250ZW50LCBzbyBtYXkgbm90IHN1cHBvcnQgc2NyaXB0IG5vZGVzLlxuXHRcdFx0Ly8gV2UgYXJlIGluIGVsZW1lbnQtb25seSBjb250ZW50LCBjYW4gcmVtb3ZlIHdoaXRlIHNwYWNlLCBhbmQgdXNlIGRhdGEtanN2IGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgYXMgbWFya2Vyc1xuXHRcdFx0Ly8gRXhhbXBsZTogPHRyIGRhdGEtanN2PVwiLzJfIzZfXCI+IC0gY2xvc2UgbWFya2VyIGZvciB2aWV3IDIgYW5kIG9wZW4gbWFya2VyIGZvciB2aWV3IDZcblxuXHRcdFx0aWYgKGlkKSB7XG5cdFx0XHRcdC8vIGFwcGVuZCBtYXJrZXIgZm9yIHRoaXMgaWQsIHRvIGlkcyBzdHJpbmdcblx0XHRcdFx0aWRzICs9IGlkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJlY2VkaW5nID0gKGNsb3NlVGFnMiB8fCBzZWxmQ2xvc2UyIHx8IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHQvLyBUT0RPOiBzbWFydCBpbnNlcnRpb24gb2YgPHRib2R5PiAtIHRvIGJlIGNvbXBsZXRlZCBmb3Igcm9idXN0IGluc2VydGlvbiBvZiBkZWZlcnJlZCBiaW5kaW5ncyBldGMuXG5cdFx0XHRcdC8vaWYgKHRhZyA9PT0gXCI8dHJcIiAmJiBwYXJlbnRUYWcgPT09IFwidGFibGVcIikge1xuXHRcdFx0XHQvL1x0dGFnU3RhY2sudW5zaGlmdChwYXJlbnRUYWcpO1xuXHRcdFx0XHQvL1x0cGFyZW50VGFnID0gXCJ0Ym9keVwiO1xuXHRcdFx0XHQvL1x0cHJlY2VkaW5nICs9IFwiPFwiICsgcGFyZW50VGFnICsgXCI+XCI7XG5cdFx0XHRcdC8vXHRpZiAoZGVmZXIpIHtcblx0XHRcdFx0Ly9cdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0XHQvL1x0fVxuXHRcdFx0XHQvL1x0Ly8gVE9ETzogbW92ZSB0aGlzIHRvIGRlc2lnbi10aW1lIHZhbGlkYXRpb24gY2hlY2tcblx0XHRcdFx0Ly9cdC8vXHRlcnJvcignXCInICsgcGFyZW50VGFnICsgJ1wiIGhhcyBpbmNvcnJlY3QgcGFyZW50IHRhZycpO1xuXHRcdFx0XHQvL31cblx0XHRcdFx0cHJlY2VkaW5nICs9IHRhZztcblx0XHRcdFx0aWYgKGlkcykge1xuXHRcdFx0XHRcdHByZWNlZGluZyArPSAnICcgKyBqc3ZBdHRyU3RyICsgJz1cIicgKyBpZHMgKyAnXCInO1xuXHRcdFx0XHRcdGlkcyA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgYXJlIGluIHBocmFzaW5nIG9yIGZsb3cgY29udGVudCwgc28gdXNlIHNjcmlwdCBtYXJrZXIgbm9kZXNcblx0XHRcdC8vIEV4YW1wbGU6IDxzY3JpcHQgdHlwZT1cImpzdjMvXCI+PC9zY3JpcHQ+IC0gZGF0YS1saW5rZWQgdGFnLCBjbG9zZSBtYXJrZXJcblx0XHRcdC8vIFdlIHZhbGlkYXRlIHdpdGggaW5UYWcgc28gbm8gc2NyaXB0IG1hcmtlcnMgYXJlIGluc2VydGVkIGluIGF0dHJpYnV0ZSBjb250ZXh0IGUuZy4gZm9yOlxuXHRcdFx0Ly8gXCI8dGFibGUge3tpZiAuLi59fS4uLnt7L2lmfX0uLi4gPlwiIG9yIFwiPHRhYmxlIHt7aWYgLi4ufX0uLi4+IC4uLnt7L2lmfX0uLi5cIlxuXHRcdFx0cHJlY2VkaW5nID0gaWRcblx0XHRcdFx0PyAocHJlY2VkaW5nICsgZW5kT2ZFbENudCArIHNwYWNlQmVmb3JlICsgKGluVGFnID8gXCJcIiA6IG9wZW5TY3JpcHQgKyBpZCArIGNsb3NlU2NyaXB0KSsgc3BhY2VBZnRlciArIHRhZylcblx0XHRcdFx0OiBlbmRPZkVsQ250IHx8IGFsbDtcblx0XHR9XG5cblx0XHRpZiAodmFsaWRhdGUgJiYgYm91bmRJZCkge1xuXHRcdFx0aWYgKGluVGFnKSB7XG5cdFx0XHRcdC8vIEpzVmlld3MgZGF0YS1saW5raW5nIHRhZ3MgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbiBlbGVtZW50IG1hcmt1cC5cblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzMwM1xuXHRcdFx0XHRzeW50YXhFcnJvcigne157IHdpdGhpbiBlbGVtIG1hcmt1cCAoJyArIGluVGFnICsgJyApLiBVc2UgZGF0YS1saW5rPVwiLi4uXCInKTtcblx0XHRcdH1cblx0XHRcdGlmIChpZC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdHRhZ1N0YWNrLnVuc2hpZnQoaWQuc2xpY2UoMSkpO1xuXHRcdFx0fSBlbHNlIGlmIChpZC5zbGljZSgxKSAhPT0gKGJuZElkID0gdGFnU3RhY2suc2hpZnQoKSkpIHtcblx0XHRcdFx0Ly8gU2VlIGpzdmlld3MvaXNzdWVzLzIxM1xuXHRcdFx0XHRzeW50YXhFcnJvcignQ2xvc2luZyB0YWcgZm9yIHteey4uLn19IHVuZGVyIGRpZmZlcmVudCBlbGVtOiA8JyArIGJuZElkICsgJz4nKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRhZykge1xuXHRcdFx0aW5UYWcgPSB0YWc7XG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgaWRzIChtYXJrZXJzIHNpbmNlIHRoZSBsYXN0IHRhZyksIG1vdmUgdGhlbSB0byB0aGUgZGVmZXIgc3RyaW5nXG5cdFx0XHR0YWdTdGFjay51bnNoaWZ0KHBhcmVudFRhZyk7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWcuc2xpY2UoMSk7XG5cdFx0XHRpZiAodmFsaWRhdGUgJiYgdGFnU3RhY2tbMF0gJiYgdGFnU3RhY2tbMF0gPT09IGJhZFBhcmVudFtwYXJlbnRUYWddKSB7XG5cdFx0XHRcdC8vIE1pc3NpbmcgPHRib2R5PlxuXHRcdFx0XHQvLyBUT0RPOiByZXBsYWNlIHRoaXMgYnkgc21hcnQgaW5zZXJ0aW9uIG9mIDx0Ym9keT4gdGFnc1xuXHRcdFx0XHRlcnJvcignUGFyZW50IG9mIDx0cj4gbXVzdCBiZSA8dGJvZHk+Jyk7XG5cdFx0XHR9XG5cdFx0XHRpc1ZvaWQgPSB2b2lkRWxlbXNbcGFyZW50VGFnXTtcblx0XHRcdGlmICgoZWxDbnQgPSBlbENvbnRlbnRbcGFyZW50VGFnXSkgJiYgIXByZXZFbENudCkge1xuXHRcdFx0XHRkZWZlclN0YWNrLnVuc2hpZnQoZGVmZXIpO1xuXHRcdFx0XHRkZWZlciA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRwcmV2RWxDbnQgPSBlbENudDtcbi8vVE9ETyBDb25zaWRlciBwcm92aWRpbmcgdmFsaWRhdGlvbiB3aGljaCB0aHJvd3MgaWYgeW91IHBsYWNlIDxzcGFuPiBhcyBjaGlsZCBvZiA8dHI+LCBldGMuIC0gc2luY2UgaWYgbm90IGNhdWdodCxcbi8vdGhpcyBjYW4gY2F1c2UgZXJyb3JzIHN1YnNlcXVlbnRseSB3aGljaCBhcmUgZGlmZmljdWx0IHRvIGRlYnVnLlxuLy9cdFx0XHRcdGlmIChlbENvbnRlbnRbdGFnU3RhY2tbMF1dPjIgJiYgIWVsQ250KSB7XG4vL1x0XHRcdFx0XHRlcnJvcihwYXJlbnRUYWcgKyBcIiBpbiBcIiArIHRhZ1N0YWNrWzBdKTtcbi8vXHRcdFx0XHR9XG5cdFx0XHRpZiAoZGVmZXIgJiYgZWxDbnQpIHtcblx0XHRcdFx0ZGVmZXIgKz0gXCIrXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcHJlY2VkaW5nO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJvY2Vzc1ZpZXdJbmZvcyh2d0luZm9zLCB0YXJnZXRQYXJlbnQpIHtcblx0XHQvLyBJZiB0YXJnZXRQYXJlbnQsIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyAod2hpY2ggbWF5IGluY2x1ZGUgbmF2aWdhdGlvbiB0aHJvdWdoICcrLScgcGF0aHMpIGFuZCBob29raW5nIHVwIHRvIHRoZSByaWdodCBwYXJlbnRFbGVtIGV0Yy5cblx0XHQvLyAoYW5kIGVsZW0gbWF5IGFsc28gYmUgZGVmaW5lZCAtIHRoZSBuZXh0IG5vZGUpXG5cdFx0Ly8gSWYgbm8gdGFyZ2V0UGFyZW50LCB0aGVuIHdlIGFyZSBwcm9jZXNzaW5nIHZpZXdJbmZvcyBvbiBuZXdseSBpbnNlcnRlZCBjb250ZW50XG5cdFx0dmFyIGRlZmVyUGF0aCwgZGVmZXJDaGFyLCBiaW5kQ2hhciwgcGFyZW50RWxlbSwgaWQsIG9uQWZ0Q3IsIGRlZXAsXG5cdFx0XHRhZGRlZEJpbmRFbHMgPSBbXTtcblxuXHRcdC8vIEluIGVsQ250IGNvbnRleHQgKGVsZW1lbnQtb25seSBjb250ZW50IG1vZGVsKSwgcHJldk5vZGUgaXMgdGhlIGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIG9wZW4sIG5leHROb2RlIGlzIHRoZSBmaXJzdCBub2RlIGFmdGVyIHRoZSBjbG9zZS5cblx0XHQvLyBJZiBib3RoIGFyZSBudWxsL3VuZGVmaW5lZCwgdGhlbiBvcGVuIGFuZCBjbG9zZSBhcmUgYXQgZW5kIG9mIHBhcmVudCBjb250ZW50LCBzbyB0aGUgdmlldyBpcyBlbXB0eSwgYW5kIGl0cyBwbGFjZWhvbGRlciBpcyB0aGVcblx0XHQvLyAnbGFzdENoaWxkJyBvZiB0aGUgcGFyZW50Tm9kZS4gSWYgdGhlcmUgaXMgYSBwcmV2Tm9kZSwgdGhlbiBpdCBpcyBlaXRoZXIgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXcsIG9yIHRoZSB2aWV3IGlzIGVtcHR5IGFuZFxuXHRcdC8vIGl0cyBwbGFjZWhvbGRlciBpcyB0aGUgJ3ByZXZpb3VzU2libGluZycgb2YgdGhlIHByZXZOb2RlLCB3aGljaCBpcyBhbHNvIHRoZSBuZXh0Tm9kZS5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0aWYgKHZ3SW5mb3MuX3RrbnMuY2hhckF0KDApID09PSBcIkBcIikge1xuXHRcdFx0XHQvLyBXZSBhcmUgcHJvY2Vzc2luZyBuZXdseSBpbnNlcnRlZCBjb250ZW50LiBUaGlzIGlzIGEgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkIGluIGNvbnZlcnRNYXJrZXJzKCkgdG8gcHJvY2VzcyBkZWZlcnJlZCBiaW5kaW5ncyxcblx0XHRcdFx0Ly8gYW5kIGluc2VydGVkIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHBhcmVudCBlbGVtZW50IC0gYmVjYXVzZSBubyBlbGVtZW50IHRhZ3MgKG91dHNpZGUgZWxDbnQpIHdlcmUgZW5jb3VudGVyZWQgdG8gY2FycnkgdGhvc2UgYmluZGluZyB0b2tlbnMuXG5cdFx0XHRcdC8vIFdlIHdpbGwgc3RlcCBiYWNrIGZyb20gdGhlIHByZWNlZGluZyBzaWJsaW5nIG9mIHRoaXMgZWxlbWVudCwgbG9va2luZyBhdCB0YXJnZXRQYXJlbnQgZWxlbWVudHMgdW50aWwgd2UgZmluZCB0aGUgb25lIHRoYXQgdGhlIGN1cnJlbnQgYmluZGluZ1xuXHRcdFx0XHQvLyB0b2tlbiBiZWxvbmdzIHRvLiBTZXQgZWxlbSB0byBudWxsICh0aGUgc3BlY2lhbCBzY3JpcHQgZWxlbWVudCksIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgRE9NLlxuXHRcdFx0XHR0YXJnZXRQYXJlbnQgPSBlbGVtLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW0pO1xuXHRcdFx0XHRlbGVtID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tsZW5dO1xuLy9pZiAocHJldklkcy5pbmRleE9mKHZ3SW5mby50b2tlbikgPCAwKSB7IC8vIFRoaXMgdG9rZW4gaXMgYSBuZXdseSBjcmVhdGVkIHZpZXcgb3IgdGFnIGJpbmRpbmdcblx0XHRcdFx0YmluZENoYXIgPSB2d0luZm8uY2g7XG5cdFx0XHRcdGlmIChkZWZlclBhdGggPSB2d0luZm8ucGF0aCkge1xuXHRcdFx0XHRcdC8vIFdlIGhhdmUgYSAnZGVmZXJyZWQgcGF0aCdcblx0XHRcdFx0XHRqID0gZGVmZXJQYXRoLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0d2hpbGUgKGRlZmVyQ2hhciA9IGRlZmVyUGF0aC5jaGFyQXQoai0tKSkge1xuXHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBcIitcIiBhbmRcIi1cIiBjaGFyYWN0ZXJzIHRvIG5hdmlnYXRlIHRoZSBwYXRoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBhcmVudCBub2RlIHdoZXJlIHRoZSBkZWZlcnJlZCBiaW5kaW5ncyBvY3VycmVkXG5cdFx0XHRcdFx0XHRpZiAoZGVmZXJDaGFyID09PSBcIitcIikge1xuXHRcdFx0XHRcdFx0XHRpZiAoZGVmZXJQYXRoLmNoYXJBdChqKSA9PT0gXCItXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRqLS07XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50LnByZXZpb3VzU2libGluZztcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50Lmxhc3RDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIE5vdGU6IENhbiB1c2UgcHJldmlvdXNTaWJsaW5nIGFuZCBsYXN0Q2hpbGQsIG5vdCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFuZCBsYXN0RWxlbWVudENoaWxkLFxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgaGF2ZSByZW1vdmVkIHdoaXRlIHNwYWNlIHdpdGhpbiBlbENudC4gSGVuY2Ugc3VwcG9ydCBJRSA8IDlcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJpbmRDaGFyID09PSBcIl5cIikge1xuXHRcdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgYmluZGluZyBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQsIGZvciBleGFtcGxlIGluIGEgZGlmZmVyZW50IGhhbmRsZXIgdG8gYW4gYXJyYXkgY29sbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHRhZyBiaW5kaW5nXG5cdFx0XHRcdFx0XHRkZWVwID0gdGFyZ2V0UGFyZW50ICYmICghZWxlbSB8fCBlbGVtLnBhcmVudE5vZGUgIT09IHRhcmdldFBhcmVudCk7IC8vIFdlIGFyZSBzdGVwcGluZyBiYWNrIGxvb2tpbmcgZm9yIHRoZSByaWdodCB0YXJnZXRQYXJlbnQsXG5cdFx0XHRcdFx0XHQvLyBvciB3ZSBhcmUgbGlua2luZyBleGlzdGluZyBjb250ZW50IGFuZCB0aGlzIGVsZW1lbnQgaXMgaW4gZWxDbnQsIG5vdCBhbiBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIHRhcmdldFBhcmVudC5cblx0XHRcdFx0XHRcdGlmICghZWxlbSB8fCBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHZ3SW5mby5lbENudCAmJiBkZWVwKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdpdGggZWxlbWVudCBvbmx5IGNvbnRlbnQsIGlmIHRoZXJlIGlzIG5vIGZvbGxvd2luZyBlbGVtZW50LCBvciBpZiB0aGUgYmluZGluZyBpcyBkZWVwZXIgdGhhbiB0aGUgZm9sbG93aW5nIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0Ly8gdGhlbiB3ZSBuZWVkIHRvIHNldCB0aGUgb3BlbiBvciBjbG9zZSB0b2tlbiBhcyBhIGRlZmVycmVkIGJpbmRpbmcgYW5ub3RhdGlvbiBvbiB0aGUgcGFyZW50XG5cdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldFBhcmVudCwgKHZ3SW5mby5vcGVuID8gXCIjXCIgOiBcIi9cIikgKyBpZCArIGJpbmRDaGFyICsgKHRhcmdldFBhcmVudC5fZGYgfHwgXCJcIikpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG9yIGNsb3NlIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0uIEFkZCBpdCB0byBiaW5kRWxzLlxuXHRcdFx0XHRcdFx0YWRkZWRCaW5kRWxzLnB1c2goW2RlZXAgPyBudWxsIDogZWxlbSwgdndJbmZvXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHZpZXcgPSB2aWV3U3RvcmVbaWQgPSB2d0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHZpZXcgbWF5IGhhdmUgYmVlbiBkZWxldGVkLCBmb3IgZXhhbXBsZSBpbiBhIGRpZmZlcmVudCBoYW5kbGVyIHRvIGFuIGFycmF5IGNvbGxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdFx0XHRpZiAoIXZpZXcucGFyZW50RWxlbSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdmlldyBpcyBub3QgYWxyZWFkeSBleHRlbmRlZCBmb3IgSnNWaWV3cywgZXh0ZW5kIGFuZCBpbml0aWFsaXplIHRoZSB2aWV3IG9iamVjdCBjcmVhdGVkIGluIEpzUmVuZGVyLCBhcyBhIEpzVmlld3Mgdmlld1xuXHRcdFx0XHRcdFx0dmlldy5wYXJlbnRFbGVtID0gdGFyZ2V0UGFyZW50IHx8IGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlIHx8IHBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHR2aWV3Ll8ub25SZW5kZXIgPSBhZGRCaW5kaW5nTWFya2Vycztcblx0XHRcdFx0XHRcdHZpZXcuXy5vbkFycmF5Q2hhbmdlID0gYXJyYXlDaGFuZ2VIYW5kbGVyO1xuXHRcdFx0XHRcdFx0c2V0QXJyYXlDaGFuZ2VMaW5rKHZpZXcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXJlbnRFbGVtID0gdmlldy5wYXJlbnRFbGVtO1xuXHRcdFx0XHRcdGlmICh2d0luZm8ub3Blbikge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiAnb3BlbiB2aWV3JyBub2RlIChwcmVjZWRpbmcgc2NyaXB0IG1hcmtlciBub2RlLFxuXHRcdFx0XHRcdFx0Ly8gb3IgaWYgZWxDbnQsIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSB2aWV3LCB3aXRoIGEgZGF0YS1qc3YgYW5ub3RhdGlvbikgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdHZpZXcuX2VsQ250ID0gdndJbmZvLmVsQ250O1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFBhcmVudCAmJiAhZWxlbSkge1xuXHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRQYXJlbnQsIFwiI1wiICsgaWQgKyBiaW5kQ2hhciArICh0YXJnZXRQYXJlbnQuX2RmIHx8IFwiXCIpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIE5vIHRhcmdldFBhcmVudCwgc28gdGhlcmUgaXMgYSAuX254dCBlbGVtIChhbmQgdGhpcyBpcyBwcm9jZXNzaW5nIHRva2VucyBvbiB0aGUgZWxlbSlcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9wcnYpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiI1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSAnY2xvc2UgdmlldycgbWFya2VyIG5vZGUgZm9yIGJpbmRpbmdcblx0XHRcdFx0XHRcdGlmICh0YXJnZXRQYXJlbnQgJiYgKCFlbGVtIHx8IGVsZW0ucGFyZW50Tm9kZSAhPT0gdGFyZ2V0UGFyZW50KSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGVyZSBpcyBubyAuX254dCBzbyBhZGQgdG9rZW4gdG8gX2RmLiBJdCBpcyBkZWZlcnJlZC5cblx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0UGFyZW50LCBcIi9cIiArIGlkICsgYmluZENoYXIgKyAodGFyZ2V0UGFyZW50Ll9kZiB8fCBcIlwiKSk7XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZWxlbSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIHZpZXcgZGlkIG5vdCBoYXZlIGEgLl9ueHQsIGJ1dCBoYXMgb25lIG5vdywgc28gdG9rZW4gbWF5IGJlIGluIF9kZiwgYW5kIG11c3QgYmUgcmVtb3ZlZC4gKE5vIGxvbmdlciBkZWZlcnJlZClcblx0XHRcdFx0XHRcdFx0aWYgKCF2aWV3Ll9ueHQpIHtcblx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiL1wiICsgaWQgKyBiaW5kQ2hhcikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHZpZXcuX254dCA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob25BZnRDciA9IHZpZXcuY3R4ICYmIHZpZXcuY3R4W29uQWZ0ZXJDcmVhdGVTdHJdIHx8IG9uQWZ0ZXJDcmVhdGUpIHtcblx0XHRcdFx0XHRcdFx0b25BZnRDci5jYWxsKHZpZXcuY3R4LnRhZywgdmlldyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuLy99XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxlbiA9IGFkZGVkQmluZEVscy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobGVuLS0pIHtcblx0XHRcdFx0Ly8gVGhlc2Ugd2VyZSBhZGRlZCBpbiByZXZlcnNlIG9yZGVyIHRvIGFkZGVkQmluZEVscy4gV2UgcHVzaCB0aGVtIGluIEJpbmRFbHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG5cdFx0XHRcdGJpbmRFbHMucHVzaChhZGRlZEJpbmRFbHNbbGVuXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAhdndJbmZvcyB8fCB2d0luZm9zLmVsQ250O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Vmlld0luZm9zKHZ3SW5mb3MpIHtcblx0XHQvLyBVc2VkIGJ5IHZpZXcuY2hpbGRUYWdzKCkgYW5kIHRhZy5jaGlsZFRhZ3MoKVxuXHRcdC8vIFNpbWlsYXIgdG8gcHJvY2Vzc1ZpZXdJbmZvcyBpbiBob3cgaXQgc3RlcHMgdGhyb3VnaCBiaW5kaW5ncyB0byBmaW5kIHRhZ3MuIE9ubHkgZmluZHMgZGF0YS1saW5rZWQgdGFncy5cblx0XHR2YXIgbGV2ZWwsIHBhcmVudFRhZywgbmFtZWQ7XG5cblx0XHRpZiAodndJbmZvcykge1xuXHRcdFx0bGVuID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcblx0XHRcdFx0dndJbmZvID0gdndJbmZvc1tqXTtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBvcGVuIG1hcmtlciBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX0sIHdpdGhpbiB0aGUgY29udGVudCBvZiB0aGUgdGFnIHdob3NlIGlkIGlzIGdldC5pZC4gQWRkIGl0IHRvIGJpbmRFbHMuXG5cdFx0XHRcdC8vIE5vdGUgLSBpZiBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5faXMgPT09IFwidGFnXCIgdGhlbiBnZXRWaWV3SW5mb3MgaXMgYmVpbmcgY2FsbGVkIHRvbyBzb29uIC0gZHVyaW5nIGZpcnN0IGxpbmtpbmcgcGFzc1xuXHRcdFx0XHRwYXJlbnRUYWcgPSB0YWcgPSBiaW5kaW5nU3RvcmVbdndJbmZvLmlkXS5saW5rQ3R4LnRhZztcblx0XHRcdFx0bmFtZWQgPSB0YWcudGFnTmFtZSA9PT0gdGFnTmFtZTtcblx0XHRcdFx0aWYgKCF0YWcuZmxvdyB8fCBuYW1lZCkge1xuXHRcdFx0XHRcdGlmICghZGVlcCkge1xuXHRcdFx0XHRcdFx0bGV2ZWwgPSAxO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHBhcmVudFRhZyA9IHBhcmVudFRhZy5wYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0bGV2ZWwrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRhZ0RlcHRoID0gdGFnRGVwdGggfHwgbGV2ZWw7IC8vIFRoZSBsZXZlbCBvZiB0aGUgZmlyc3QgdGFnIGVuY291bnRlcmVkLlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoKGRlZXAgfHwgbGV2ZWwgPT09IHRhZ0RlcHRoKSAmJiAoIXRhZ05hbWUgfHwgbmFtZWQpKSB7XG5cdFx0XHRcdFx0XHQvLyBGaWx0ZXIgb24gdG9wLWxldmVsIG9yIHRhZ05hbWUgYXMgYXBwcm9wcmlhdGVcblx0XHRcdFx0XHRcdHRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGRhdGFMaW5rKCkge1xuXHRcdC8vPT09PT09PT09PT09PT09PSBEYXRhLWxpbmsgYW5kIGZpeHVwIG9mIGRhdGEtanN2IGFubm90YXRpb25zID09PT09PT09PT09PT09PT1cblx0XHR2YXIgaiwgaW5kZXgsXG5cdFx0XHR0b2tlbnMgPSBcIlwiLFxuXHRcdFx0d3JhcCA9IHt9LFxuXHRcdFx0c2VsZWN0b3IgPSBsaW5rVmlld3NTZWwgKyAoZ2V0ID8gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgOiBcIlwiKTtcblx0XHRcdC8vIElmIGEgY2hpbGRUYWdzKCkgY2FsbCwgZ2V0ID0gXCIsW1wiICsgZGVmZXJBdHRyICsgXCJdXCIgLSBzaW5jZSB3ZSBuZWVkIHRvIGluY2x1ZGUgZWxlbWVudHMgdGhhdCBoYXZlIGEgLl9kZiBleHBhbmRvIGZvciBkZWZlcnJlZCB0b2tlbnNcblxuXHRcdGVsZW1zID0gcXNhID8gcGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHBhcmVudE5vZGUpLmdldCgpO1xuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0XHQvLyBUaGUgcHJldk5vZGUgd2lsbCBiZSBpbiB0aGUgcmV0dXJuZWQgcXVlcnksIHNpbmNlIHdlIGNhbGxlZCBtYXJrUHJldk9yTmV4dE5vZGUoKSBvbiBpdC5cblx0XHQvLyBCdXQgaXQgbWF5IGhhdmUgY29udGFpbmVkIG5vZGVzIHRoYXQgc2F0aXNmeSB0aGUgc2VsZWN0b3IgYWxzby5cblx0XHRpZiAocHJldk5vZGUgJiYgcHJldk5vZGUuaW5uZXJIVE1MKSB7XG5cdFx0XHQvLyBGaW5kIHRoZSBsYXN0IGNvbnRhaW5lZCBub2RlIG9mIHByZXZOb2RlLCB0byB1c2UgYXMgdGhlIHByZXZOb2RlIC0gc28gd2Ugb25seSBsaW5rIHN1YnNlcXVlbnQgZWxlbXMgaW4gdGhlIHF1ZXJ5XG5cdFx0XHRwcmV2Tm9kZXMgPSBxc2EgPyBwcmV2Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6ICQoc2VsZWN0b3IsIHByZXZOb2RlKS5nZXQoKTtcblx0XHRcdHByZXZOb2RlID0gcHJldk5vZGVzLmxlbmd0aCA/IHByZXZOb2Rlc1twcmV2Tm9kZXMubGVuZ3RoIC0gMV0gOiBwcmV2Tm9kZTtcblx0XHR9XG5cblx0XHR0YWdEZXB0aCA9IDA7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0ZWxlbSA9IGVsZW1zW2ldO1xuXHRcdFx0aWYgKHByZXZOb2RlICYmICFmb3VuZCkge1xuXHRcdFx0XHQvLyBJZiBwcmV2Tm9kZSBpcyBzZXQsIG5vdCBmYWxzZSwgc2tpcCBsaW5raW5nLiBJZiB0aGlzIGVsZW1lbnQgaXMgdGhlIHByZXZOb2RlLCBzZXQgdG8gZmFsc2Ugc28gc3Vic2VxdWVudCBlbGVtZW50cyB3aWxsIGxpbmsuXG5cdFx0XHRcdGZvdW5kID0gKGVsZW0gPT09IHByZXZOb2RlKTtcblx0XHRcdH0gZWxzZSBpZiAobmV4dE5vZGUgJiYgZWxlbSA9PT0gbmV4dE5vZGUpIHtcblx0XHRcdFx0Ly8gSWYgbmV4dE5vZGUgaXMgc2V0IHRoZW4gYnJlYWsgd2hlbiB3ZSBnZXQgdG8gbmV4dE5vZGVcblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSBpZiAoZWxlbS5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdC8vIGVsZW0gaGFzIG5vdCBiZWVuIHJlbW92ZWQgZnJvbSBET01cblx0XHRcdFx0aWYgKGdldCkge1xuXHRcdFx0XHRcdHRva2VucyArPSBtYXJrZXJOb2RlSW5mbyhlbGVtKTtcblx0XHRcdFx0XHRpZiAoZWxlbS5fZGYpIHtcblx0XHRcdFx0XHRcdGogPSBpICsgMTtcblx0XHRcdFx0XHRcdHdoaWxlIChqIDwgbCAmJiBlbGVtLmNvbnRhaW5zKGVsZW1zW2pdKSkge1xuXHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBBZGQgZGVmZXJlZCB0b2tlbnMgYWZ0ZXIgYW55IHRva2VucyBvbiBkZXNjZW5kYW50IGVsZW1lbnRzIG9mIHRoaXMgb25lXG5cdFx0XHRcdFx0XHR3cmFwW2otMV0gPSBlbGVtLl9kZjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHdyYXBbaV0pIHtcblx0XHRcdFx0XHRcdHRva2VucyArPSB3cmFwW2ldIHx8IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChpc0xpbmsgJiYgKHZ3SW5mbyA9IHZpZXdJbmZvcyhlbGVtLCB1bmRlZmluZWQsIHJWaWV3TWFya2VycykpICYmICh2d0luZm8gPSB2d0luZm9bMF0pKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIGEgbGluayh0cnVlT3JTdHJpbmcgLi4uKSBjYWxsIHdlIHdpbGwgYXZvaWQgcmUtYmluZGluZyB0byBlbGVtcyB0aGF0IGFyZSB3aXRoaW4gdGVtcGxhdGUtcmVuZGVyZWQgdmlld3Ncblx0XHRcdFx0XHRcdHNraXAgPSBza2lwID8gKHZ3SW5mby5pZCAhPT0gc2tpcCAmJiBza2lwKSA6IHZ3SW5mby5vcGVuICYmIHZ3SW5mby5pZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFza2lwICYmIHByb2Nlc3NJbmZvcyh2aWV3SW5mb3MoZWxlbSkpXG5cdFx0XHRcdFx0XHQvLyBJZiBhIGxpbmsoKSBjYWxsLCBwcm9jZXNzVmlld0luZm9zKCkgYWRkcyBiaW5kaW5ncyB0byBiaW5kRWxzLCBhbmQgcmV0dXJucyB0cnVlIGZvciBub24tc2NyaXB0IG5vZGVzLCBmb3IgYWRkaW5nIGRhdGEtbGluayBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBjaGlsZFRhZ3MoKSBjYWxsLCBnZXRWaWV3SW5mb3MgcmV0dXJucyBhcnJheSBvZiB0YWcgYmluZGluZ3MuXG5cdFx0XHRcdFx0XHRcdCYmIGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0XHRcdFx0YmluZEVscy5wdXNoKFtlbGVtXSk7IC8vIEEgZGF0YS1saW5rZWQgZWxlbWVudCBzbyBhZGQgdG8gYmluZEVscyB0b29cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0KSB7XG5cdFx0XHR0b2tlbnMgKz0gcGFyZW50Tm9kZS5fZGYgfHwgXCJcIjtcblx0XHRcdGlmIChpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiI1wiICsgZ2V0LmlkKSArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gc3RhcnQgYWZ0ZXIgdGhlIG9wZW4gdG9rZW4gb2YgdGhlIHBhcmVudCB2aWV3IG9yIHRhZy5cblx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKGluZGV4ICsgZ2V0LmlkLmxlbmd0aCk7XG5cdFx0XHR9XG5cdFx0XHRpbmRleCA9IHRva2Vucy5pbmRleE9mKFwiL1wiICsgZ2V0LmlkKTtcblx0XHRcdGlmIChpbmRleCArIDEpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGxvb2tpbmcgZm9yIHZpZXcuY2hpbGRUYWdzKCkgb3IgdGFnLmNoaWxkVGFncygpIC0gc28gZG9uJ3QgbG9vayBiZXlvbmQgdGhlIGNsb3NlIHRva2VuIG9mIHRoZSBwYXJlbnQgdmlldyBvciB0YWcuXG5cdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZSgwLCBpbmRleCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBDYWxsIGdldFZpZXdJbmZvcyB0byBhZGQgdGhlIGZvdW5kIGNoaWxkVGFncyB0byB0aGUgdGFncyBhcnJheVxuXHRcdFx0Z2V0Vmlld0luZm9zKHZpZXdJbmZvcyh0b2tlbnMsIHVuZGVmaW5lZCwgck9wZW5UYWdNYXJrZXJzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKGh0bWwgPT09IHVuZGVmaW5lZCAmJiBwYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikpIHtcblx0XHRcdGJpbmRFbHMucHVzaChbcGFyZW50Tm9kZV0pOyAvLyBTdXBwb3J0IGRhdGEtbGlua2luZyB0b3AtbGV2ZWwgZWxlbWVudCBkaXJlY3RseSAobm90IHdpdGhpbiBhIGRhdGEtbGlua2VkIGNvbnRhaW5lcilcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGVtcG9yYXJ5IG1hcmtlciBzY3JpcHQgbm9kZXMgdGhleSB3ZXJlIGFkZGVkIGJ5IG1hcmtQcmV2T3JOZXh0Tm9kZVxuXHRcdHVubWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdFx0dW5tYXJrUHJldk9yTmV4dE5vZGUobmV4dE5vZGUsIGVsQ250KTtcblxuXHRcdGlmIChnZXQpIHtcblx0XHRcdGlmIChsYXp5TGluaykge1xuXHRcdFx0XHRsYXp5TGluay5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47IC8vIFdlIGhhdmUgYWRkZWQgY2hpbGRUYWdzIHRvIHRoZSB0YWdzIGFycmF5LCBzbyB3ZSBhcmUgZG9uZVxuXHRcdH1cblxuXHRcdGlmIChlbENudCAmJiBkZWZlciArIGlkcykge1xuXHRcdFx0Ly8gVGhlcmUgYXJlIHNvbWUgdmlld3Mgd2l0aCBlbENudCwgZm9yIHdoaWNoIHRoZSBvcGVuIG9yIGNsb3NlIGRpZCBub3QgcHJlY2VkZSBhbnkgSFRNTCB0YWcgLSBzbyB0aGV5IGhhdmUgbm90IGJlZW4gcHJvY2Vzc2VkIHlldFxuXHRcdFx0ZWxlbSA9IG5leHROb2RlO1xuXHRcdFx0aWYgKGRlZmVyKSB7XG5cdFx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHRcdHByb2Nlc3NWaWV3SW5mb3Modmlld0luZm9zKGRlZmVyICsgXCIrXCIsIHRydWUpLCBuZXh0Tm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoZGVmZXIsIHRydWUpLCBwYXJlbnROb2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoaWRzLCB0cnVlKSwgcGFyZW50Tm9kZSk7XG5cdFx0XHQvLyBJZiB0aGVyZSB3ZXJlIGFueSB0b2tlbnMgb24gbmV4dE5vZGUgd2hpY2ggaGF2ZSBub3cgYmVlbiBhc3NvY2lhdGVkIHdpdGggaW5zZXJ0ZWQgSFRNTCB0YWdzLCByZW1vdmUgdGhlbSBmcm9tIG5leHROb2RlXG5cdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0dG9rZW5zID0gbmV4dE5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpO1xuXHRcdFx0XHRpZiAobCA9IHRva2Vucy5pbmRleE9mKHByZXZJZHMpICsgMSkge1xuXHRcdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZShsICsgcHJldklkcy5sZW5ndGggLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRuZXh0Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgaWRzICsgdG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLz09PT09PT09PT09PT09PT0gQmluZCB0aGUgZGF0YS1saW5rZWQgZWxlbWVudHMgYW5kIHRhZ3MgPT09PT09PT09PT09PT09PVxuXHRcdGwgPSBiaW5kRWxzLmxlbmd0aDtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRlbGVtID0gYmluZEVsc1tpXTtcblx0XHRcdGxpbmtJbmZvID0gZWxlbVsxXTtcblx0XHRcdGVsZW0gPSBlbGVtWzBdO1xuXHRcdFx0aWYgKGxpbmtJbmZvKSB7XG5cdFx0XHRcdGlmICh0YWcgPSBiaW5kaW5nU3RvcmVbbGlua0luZm8uaWRdKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtDdHggPSB0YWcubGlua0N0eCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHRhZyBtYXkgaGF2ZSBiZWVuIHN0b3JlZCB0ZW1wb3JhcmlseSBvbiB0aGUgYmluZGluZ1N0b3JlIC0gb3IgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBhY3R1YWwgYmluZGluZ1xuXHRcdFx0XHRcdFx0dGFnID0gbGlua0N0eC50YWc7XG5cdFx0XHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsaW5rSW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuICdvcGVuIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRcdFx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdFx0XHRcdHRhZy5wYXJlbnRFbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHR0YWcuX3BydiA9IGVsZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0YWcuX2VsQ250ID0gbGlua0luZm8uZWxDbnQ7XG5cdFx0XHRcdFx0XHQvLyBXZSBkYXRhLWxpbmsgZGVwdGgtZmlyc3QgKFwib24gdGhlIHdheSBpblwiKSwgd2hpY2ggaXMgYmV0dGVyIGZvciBwZXJmIC0gYW5kIGFsbG93cyBzZXR0aW5nIHBhcmVudCB0YWdzIGV0Yy5cblx0XHRcdFx0XHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXc7XG5cdFx0XHRcdFx0XHRhZGREYXRhQmluZGluZyh1bmRlZmluZWQsIHRhZy5fcHJ2LCB2aWV3LCBsaW5rSW5mby5pZCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRhZy5fbnh0ID0gZWxlbTtcblx0XHRcdFx0XHRcdGlmICh0YWcuXy51bmxpbmtlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgJ2Nsb3NlIGxpbmtlZCB0YWcnIGJpbmRpbmcgYW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHQvLyBBZGQgZGF0YSBiaW5kaW5nXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eCA9IHRhZy50YWdDdHg7XG5cdFx0XHRcdFx0XHRcdHZpZXcgPSB0YWdDdHgudmlldztcblx0XHRcdFx0XHRcdFx0Y2FsbEFmdGVyTGluayh0YWcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQWRkIGRhdGEgYmluZGluZyBmb3IgYSBkYXRhLWxpbmtlZCBlbGVtZW50ICh3aXRoIGRhdGEtbGluayBhdHRyaWJ1dGUpXG5cdFx0XHRcdGFkZERhdGFCaW5kaW5nKGVsZW0uZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSwgZWxlbSwgJHZpZXcoZWxlbSksIHVuZGVmaW5lZCwgaXNMaW5rLCBvdXRlckRhdGEsIGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobGF6eUxpbmspIHtcblx0XHRcdGxhenlMaW5rLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblx0Ly89PT09IC9lbmQgb2YgbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cblx0dmFyIGluVGFnLCBsaW5rQ3R4LCB0YWcsIGksIGwsIGosIGxlbiwgZWxlbXMsIGVsZW0sIHZpZXcsIHZ3SW5mbywgbGlua0luZm8sIHByZXZOb2RlcywgdG9rZW4sIHByZXZWaWV3LCBuZXh0Vmlldyxcblx0XHRub2RlLCB0YWdzLCBkZWVwLCB0YWdOYW1lLCB0YWdDdHgsIHZhbGlkYXRlLCB0YWdEZXB0aCwgZGVwdGgsIGZyYWdtZW50LCBjb3BpZWROb2RlLCBmaXJzdFRhZywgcGFyZW50VGFnLFxuXHRcdGlzVm9pZCwgd3JhcHBlciwgZGl2LCB0b2tlbnMsIGVsQ250LCBwcmV2RWxDbnQsIGh0bWxUYWcsIGlkcywgcHJldklkcywgZm91bmQsIHNraXAsIGxhenlMaW5rLCBpc0xpbmssIGdldCxcblx0XHRzZWxmID0gdGhpcyxcblx0XHR0aGlzSWQgPSBzZWxmLl8uaWQgKyBcIl9cIixcblx0XHRkZWZlciA9IFwiXCIsXG5cdFx0Ly8gVGhlIG1hcmtlciBpZHMgZm9yIHdoaWNoIG5vIHRhZyB3YXMgZW5jb3VudGVyZWQgKGVtcHR5IHZpZXdzIG9yIGZpbmFsIGNsb3NpbmcgbWFya2Vycykgd2hpY2ggd2UgY2Fycnkgb3ZlciB0byBjb250YWluZXIgdGFnXG5cdFx0YmluZEVscyA9IFtdLFxuXHRcdHRhZ1N0YWNrID0gW10sXG5cdFx0ZGVmZXJTdGFjayA9IFtdLFxuXHRcdG9uQWZ0ZXJDcmVhdGUgPSBzZWxmLmhscChvbkFmdGVyQ3JlYXRlU3RyKSxcblx0XHRwcm9jZXNzSW5mb3MgPSBwcm9jZXNzVmlld0luZm9zO1xuXG5cdGlmIChyZWZyZXNoKSB7XG5cdFx0bGF6eUxpbmsgPSByZWZyZXNoLmxhenlMaW5rICYmICQuRGVmZXJyZWQoKTtcblx0XHRpZiAocmVmcmVzaC50bXBsKSB7XG5cdFx0XHQvLyByZWZyZXNoIGlzIHRoZSBwcmV2VmlldywgcGFzc2VkIGluIGZyb20gYWRkVmlld3MoKVxuXHRcdFx0cHJldlZpZXcgPSBcIi9cIiArIHJlZnJlc2guXy5pZCArIFwiX1wiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpc0xpbmsgPSByZWZyZXNoLmxuazsgLy8gVG9wLWxldmVsIGxpbmtpbmdcblx0XHRcdGlmIChyZWZyZXNoLnRhZykge1xuXHRcdFx0XHR0aGlzSWQgPSByZWZyZXNoLnRhZyArIFwiXlwiO1xuXHRcdFx0XHRyZWZyZXNoID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChnZXQgPSByZWZyZXNoLmdldCkge1xuXHRcdFx0XHRwcm9jZXNzSW5mb3MgPSBnZXRWaWV3SW5mb3M7XG5cdFx0XHRcdHRhZ3MgPSBnZXQudGFncztcblx0XHRcdFx0ZGVlcCA9IGdldC5kZWVwO1xuXHRcdFx0XHR0YWdOYW1lID0gZ2V0Lm5hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlZnJlc2ggPSByZWZyZXNoID09PSB0cnVlO1xuXHR9XG5cblx0cGFyZW50Tm9kZSA9IHBhcmVudE5vZGVcblx0XHQ/IChcIlwiICsgcGFyZW50Tm9kZSA9PT0gcGFyZW50Tm9kZVxuXHRcdFx0PyAkKHBhcmVudE5vZGUpWzBdICAvLyBJdCBpcyBhIHN0cmluZywgc28gdHJlYXQgYXMgc2VsZWN0b3Jcblx0XHRcdDogcGFyZW50Tm9kZS5qcXVlcnlcblx0XHRcdFx0PyBwYXJlbnROb2RlWzBdIC8vIEEgalF1ZXJ5IG9iamVjdCAtIHRha2UgZmlyc3QgZWxlbWVudC5cblx0XHRcdFx0OiBwYXJlbnROb2RlKVxuXHRcdDogKHNlbGYucGFyZW50RWxlbSAgICAgIC8vIHZpZXcubGluaygpXG5cdFx0XHR8fCBkb2N1bWVudC5ib2R5KTsgIC8vIGxpbmsobnVsbCwgZGF0YSkgdG8gbGluayB0aGUgd2hvbGUgZG9jdW1lbnRcblxuXHR2YWxpZGF0ZSA9ICEkc3ViU2V0dGluZ3NBZHZhbmNlZC5ub1ZhbGlkYXRlICYmIHBhcmVudE5vZGUuY29udGVudEVkaXRhYmxlICE9PSBUUlVFO1xuXHRwYXJlbnRUYWcgPSBwYXJlbnROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblx0ZWxDbnQgPSAhIWVsQ29udGVudFtwYXJlbnRUYWddO1xuXG5cdHByZXZOb2RlID0gcHJldk5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKHByZXZOb2RlLCBlbENudCk7XG5cdG5leHROb2RlID0gbmV4dE5vZGUgJiYgbWFya1ByZXZPck5leHROb2RlKG5leHROb2RlLCBlbENudCkgfHwgbnVsbDtcblxuXHRpZiAoaHRtbCAhPSB1bmRlZmluZWQpIHtcblx0XHQvLz09PT09PT09PT09PT09PT0gSW5zZXJ0IGh0bWwgaW50byBET00gdXNpbmcgZG9jdW1lbnRGcmFnbWVudHMgKGFuZCB3cmFwcGluZyBIVE1MIGFwcHJvcHJpYXRlbHkpLiA9PT09PT09PT09PT09PT09XG5cdFx0Ly8gQWxzbyBjb252ZXJ0IG1hcmtlcnMgdG8gRE9NIGFubm90YXRpb25zLCBiYXNlZCBvbiBjb250ZW50IG1vZGVsLlxuXHRcdC8vIENvcnJlc3BvbmRzIHRvIG5leHROb2RlID8gJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIDogJChwYXJlbnROb2RlKS5odG1sKGh0bWwpO1xuXHRcdC8vIGJ1dCBhbGxvd3MgaW5zZXJ0aW9uIHRvIHdyYXAgY29ycmVjdGx5IGV2ZW4gd2l0aCBpbnNlcnRlZCBzY3JpcHQgbm9kZXMuIGpRdWVyeSB2ZXJzaW9uIHdpbGwgZmFpbCBlLmcuIHVuZGVyIHRib2R5IG9yIHNlbGVjdC5cblx0XHQvLyBUaGlzIHZlcnNpb24gc2hvdWxkIGFsc28gYmUgc2xpZ2h0bHkgZmFzdGVyXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR3cmFwcGVyID0gZGl2O1xuXHRcdHByZXZJZHMgPSBpZHMgPSBcIlwiO1xuXHRcdGh0bWxUYWcgPSBwYXJlbnROb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiID8gXCJzdmdfbnNcIiA6IChmaXJzdFRhZyA9IHJGaXJzdEVsZW0uZXhlYyhodG1sKSkgJiYgZmlyc3RUYWdbMV0gfHwgXCJcIjtcblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdC8vIE5vdyBsb29rIGZvciBmb2xsb3dpbmcgdmlldywgYW5kIGZpbmQgaXRzIHRva2Vucywgb3IgaWYgbm90IGZvdW5kLCBnZXQgdGhlIHBhcmVudE5vZGUuX2RmIHRva2Vuc1xuXHRcdFx0bm9kZSA9IG5leHROb2RlO1xuXHRcdFx0d2hpbGUgKG5vZGUgJiYgIShuZXh0VmlldyA9IHZpZXdJbmZvcyhub2RlKSkpIHtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAodG9rZW5zID0gbmV4dFZpZXcgPyBuZXh0Vmlldy5fdGtucyA6IHBhcmVudE5vZGUuX2RmKSB7XG5cdFx0XHRcdHRva2VuID0gcHJldlZpZXcgfHwgXCJcIjtcblx0XHRcdFx0aWYgKHJlZnJlc2ggfHwgIXByZXZWaWV3KSB7XG5cdFx0XHRcdFx0dG9rZW4gKz0gXCIjXCIgKyB0aGlzSWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aiA9IHRva2Vucy5pbmRleE9mKHRva2VuKTtcblx0XHRcdFx0aWYgKGogKyAxKSB7XG5cdFx0XHRcdFx0aiArPSB0b2tlbi5sZW5ndGg7XG5cdFx0XHRcdFx0Ly8gVHJhbnNmZXIgdGhlIGluaXRpYWwgdG9rZW5zIHRvIGluc2VydGVkIG5vZGVzLCBieSBzZXR0aW5nIHRoZW0gYXMgdGhlIGlkcyB2YXJpYWJsZSwgcGlja2VkIHVwIGluIGNvbnZlcnRNYXJrZXJzXG5cdFx0XHRcdFx0cHJldklkcyA9IGlkcyA9IHRva2Vucy5zbGljZSgwLCBqKTtcblx0XHRcdFx0XHR0b2tlbnMgPSB0b2tlbnMuc2xpY2Uoaik7XG5cdFx0XHRcdFx0aWYgKG5leHRWaWV3KSB7XG5cdFx0XHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZXREZWZlcihwYXJlbnROb2RlLCB0b2tlbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vPT09PT09PT09PT09PT09PSBDb252ZXJ0IHRoZSBtYXJrZXJzIHRvIERPTSBhbm5vdGF0aW9ucywgYmFzZWQgb24gY29udGVudCBtb2RlbC4gPT09PT09PT09PT09PT09PVxuLy9cdFx0XHRvbGRFbENudCA9IGVsQ250O1xuXHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRodG1sID0gKFwiXCIgKyBodG1sKS5yZXBsYWNlKHJDb252ZXJ0TWFya2VycywgY29udmVydE1hcmtlcnMpO1xuLy9cdFx0XHRpZiAoISFvbGRFbENudCAhPT0gISFlbENudCkge1xuLy9cdFx0XHRcdGVycm9yKFwiUGFyc2U6IFwiICsgaHRtbCk7IC8vIFBhcnNlIGVycm9yLiBDb250ZW50IG5vdCB3ZWxsLWZvcm1lZD9cbi8vXHRcdFx0fVxuXHRcdGlmICh2YWxpZGF0ZSAmJiB0YWdTdGFjay5sZW5ndGgpIHtcblx0XHRcdHN5bnRheEVycm9yKFwiTWlzbWF0Y2hlZCAnPFwiICsgcGFyZW50VGFnICsgXCIuLi4+JyBpbjpcXG5cIiArIGh0bWwpOyAvLyBVbm1hdGNoZWQgdGFnXG5cdFx0fVxuXHRcdGlmICh2YWxpZGF0ZU9ubHkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gQXBwZW5kIHdyYXBwZXIgZWxlbWVudCB0byBkb2MgZnJhZ21lbnRcblx0XHRzYWZlRnJhZ21lbnQuYXBwZW5kQ2hpbGQoZGl2KTtcblxuXHRcdC8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnNcblx0XHQvLyBDb3JyZXNwb25kcyB0byBqUXVlcnkgJChuZXh0Tm9kZSkuYmVmb3JlKGh0bWwpIG9yICQocGFyZW50Tm9kZSkuaHRtbChodG1sKTtcblx0XHQvLyBidXQgc3VwcG9ydHMgc3ZnIGVsZW1lbnRzLCBhbmQgb3RoZXIgZmVhdHVyZXMgbWlzc2luZyBmcm9tIGpRdWVyeSB2ZXJzaW9uIChhbmQgdGhpcyB2ZXJzaW9uIHNob3VsZCBhbHNvIGJlIHNsaWdodGx5IGZhc3Rlcilcblx0XHRodG1sVGFnID0gd3JhcE1hcFtodG1sVGFnXSB8fCB3cmFwTWFwLmRpdjtcblx0XHRkZXB0aCA9IGh0bWxUYWdbMF07XG5cdFx0d3JhcHBlci5pbm5lckhUTUwgPSBodG1sVGFnWzFdICsgaHRtbCArIGh0bWxUYWdbMl07XG5cdFx0d2hpbGUgKGRlcHRoLS0pIHtcblx0XHRcdHdyYXBwZXIgPSB3cmFwcGVyLmxhc3RDaGlsZDtcblx0XHR9XG5cdFx0c2FmZUZyYWdtZW50LnJlbW92ZUNoaWxkKGRpdik7XG5cdFx0ZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0d2hpbGUgKGNvcGllZE5vZGUgPSB3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcblx0XHRcdGZyYWdtZW50LmFwcGVuZENoaWxkKGNvcGllZE5vZGUpO1xuXHRcdH1cblx0XHQvLyBJbnNlcnQgaW50byB0aGUgRE9NXG5cdFx0cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIG5leHROb2RlKTtcblx0fVxuXG5cdGlmIChsYXp5TGluaykge1xuXHRcdHNldFRpbWVvdXQoZGF0YUxpbmssIDApO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGFMaW5rKCk7XG5cdH1cblxuXHRyZXR1cm4gbGF6eUxpbmsgJiYgbGF6eUxpbmsucHJvbWlzZSgpO1xufVxuXG5mdW5jdGlvbiBhZGREYXRhQmluZGluZyhsaW5rTWFya3VwLCBub2RlLCBjdXJyZW50VmlldywgYm91bmRUYWdJZCwgaXNMaW5rLCBkYXRhLCBjb250ZXh0KSB7XG5cdC8vIEFkZCBkYXRhIGJpbmRpbmcgZm9yIGRhdGEtbGlua2VkIGVsZW1lbnRzIG9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZ3Ncblx0dmFyIHRtcGwsIHRva2VucywgYXR0ciwgY29udmVydEJhY2ssIHRhZ0V4cHIsIGxpbmtGbiwgbGlua0N0eCwgdGFnLCByVGFnSW5kZXgsIGhhc0Vsc2UsIGxhc3RJbmRleCxcblx0XHRsaW5rRXhwcmVzc2lvbnMgPSBbXTtcblxuXHRpZiAoYm91bmRUYWdJZCkge1xuXHRcdC8vIGJvdW5kVGFnSWQgaXMgYSBzdHJpbmcgZm9yIHteey4uLn19IGRhdGEtbGlua2VkIHRhZy4gU28gb25seSBvbmUgbGlua1RhZyBpbiBsaW5rTWFya3VwXG5cdFx0Ly8gZGF0YSBhbmQgY29udGV4dCBwYXJhbWV0ZXJzIGFyZSB1bmRlZmluZWRcblx0XHR0YWcgPSBiaW5kaW5nU3RvcmVbYm91bmRUYWdJZF07XG5cdFx0dGFnID0gdGFnLmxpbmtDdHggPyB0YWcubGlua0N0eC50YWcgOiB0YWc7XG5cblx0XHRsaW5rQ3R4ID0gdGFnLmxpbmtDdHggfHwge1xuXHRcdFx0dHlwZTogXCJpbmxpbmVcIixcblx0XHRcdGRhdGE6IGN1cnJlbnRWaWV3LmRhdGEsICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZVxuXHRcdFx0ZWxlbTogdGFnLl9lbENudCA/IHRhZy5wYXJlbnRFbGVtIDogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHR2aWV3OiBjdXJyZW50Vmlldyxcblx0XHRcdGN0eDogY3VycmVudFZpZXcuY3R4LFxuXHRcdFx0YXR0cjogSFRNTCwgLy8gU2NyaXB0IG1hcmtlciBub2RlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHteeyBhbmQgYWx3YXlzIHRhcmdldCBIVE1MLlxuXHRcdFx0Zm46IHRhZy5fLmJuZCxcblx0XHRcdHRhZzogdGFnLFxuXHRcdFx0Ly8gUGFzcyB0aGUgYm91bmRUYWdJZCBpbiB0aGUgbGlua0N0eCwgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGluIG9ic2VydmVBbmRCaW5kXG5cdFx0XHRfYm5kSWQ6IGJvdW5kVGFnSWRcblx0XHR9O1xuXHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rQ3R4LmZuKTtcblx0fSBlbHNlIGlmIChsaW5rTWFya3VwICYmIG5vZGUpIHtcblx0XHQvLyBJZiBpc0xpbmsgdGhlbiB0aGlzIGlzIGEgdG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb24sIHRhcmdldCwgZGF0YSwgLi4uLikgb3Jcblx0XHQvLyAubGluayh0cnVlLCB0YXJnZXQsIGRhdGEsIC4uLi4pIHNjZW5hcmlvIC0gYW5kIGRhdGEgYW5kIGNvbnRleHQgYXJlIHBhc3NlZCBpbiBzZXBhcmF0ZWx5IGZyb20gdGhlIHZpZXdcblx0XHRkYXRhID0gaXNMaW5rID8gZGF0YSA6IGN1cnJlbnRWaWV3LmRhdGE7XG5cblx0XHQvLyBDb21waWxlZCBsaW5rRm4gZXhwcmVzc2lvbnMgY291bGQgYmUgc3RvcmVkIGluIHRoZSB0bXBsLmxpbmtzIGFycmF5IG9mIHRoZSB0ZW1wbGF0ZVxuXHRcdC8vIFRPRE8gLSBjb25zaWRlciBhbHNvIGNhY2hpbmcgZ2xvYmFsbHkgc28gdGhhdCBpZiB7ezpmb299fSBvciBkYXRhLWxpbms9XCJmb29cIiBvY2N1cnMgaW4gZGlmZmVyZW50IHBsYWNlcyxcblx0XHQvLyB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZm9yIHRoaXMgaXMgY2FjaGVkIGFuZCBvbmx5IGNvbXBpbGVkIG9uY2UuLi5cblx0XHQvL2xpbmtzID0gY3VycmVudFZpZXcubGlua3MgfHwgY3VycmVudFZpZXcudG1wbC5saW5rcztcblxuXHRcdHRtcGwgPSBjdXJyZW50Vmlldy50bXBsO1xuXG4vL1x0XHRcdGlmICghKGxpbmtUYWdzID0gbGlua3NbbGlua01hcmt1cF0pKSB7XG5cdFx0Ly8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGlzIHZpZXcgdGVtcGxhdGUgaGFzIGJlZW4gbGlua2VkLCBzbyB3ZSBjb21waWxlIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSB0ZW1wbGF0ZS5cblxuXHRcdGxpbmtNYXJrdXAgPSBub3JtYWxpemVMaW5rVGFnKGxpbmtNYXJrdXAsIGRlZmF1bHRBdHRyKG5vZGUpKTtcblx0XHRsYXN0SW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4ID0gMDtcblx0XHR3aGlsZSAodG9rZW5zID0gclRhZ0RhdGFsaW5rLmV4ZWMobGlua01hcmt1cCkpIHsgLy8gVE9ETyByZXF1aXJlIH0gdG8gYmUgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAkLCBhbmQgcmVtb3ZlIHRoZSBcXH0oIVxcfSkgb3B0aW9uLlxuXHRcdFx0bGlua0V4cHJlc3Npb25zLnB1c2godG9rZW5zKTtcblx0XHRcdGxhc3RJbmRleCA9IHJUYWdEYXRhbGluay5sYXN0SW5kZXg7XG5cdFx0fVxuXHRcdGlmIChsYXN0SW5kZXggPCBsaW5rTWFya3VwLmxlbmd0aCkge1xuXHRcdFx0c3ludGF4RXJyb3IobGlua01hcmt1cCk7XG5cdFx0fVxuXHRcdHdoaWxlICh0b2tlbnMgPSBsaW5rRXhwcmVzc2lvbnMuc2hpZnQoKSkge1xuXHRcdFx0Ly8gSXRlcmF0ZSBvdmVyIHRoZSBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIGZvciBkaWZmZXJlbnQgdGFyZ2V0IGF0dHJzLFxuXHRcdFx0Ly8gZS5nLiA8aW5wdXQgZGF0YS1saW5rPVwiezpmaXJzdE5hbWU6fSB0aXRsZXs+fmRlc2NyaXB0aW9uKGZpcnN0TmFtZSwgbGFzdE5hbWUpfVwiXG5cdFx0XHQvLyB0b2tlbnM6IFthbGwsIGF0dHIsIGJpbmRPbmx5LCB0YWdFeHByLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIGNvbG9uLCBodG1sLCBjb21tZW50LCBjb2RlLCBwYXJhbXNdXG5cdFx0XHRyVGFnSW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4O1xuXHRcdFx0YXR0ciA9IHRva2Vuc1sxXTtcblx0XHRcdHRhZ0V4cHIgPSB0b2tlbnNbM107XG5cdFx0XHR3aGlsZSAobGlua0V4cHJlc3Npb25zWzBdICYmIGxpbmtFeHByZXNzaW9uc1swXVs0XSA9PT0gXCJlbHNlXCIpIHsgLy8gSWYgdGhpcyBpcyB7c29tZVRhZy4uLn0gYW5kIGlzIGZvbGxvd2VkIGJ5IGFuIHtlbHNlLi4ufSBhZGQgdG8gdGFnRXhwclxuXHRcdFx0XHR0YWdFeHByICs9IGRlbGltQ2xvc2VDaGFyMSArIGRlbGltT3BlbkNoYXIwICsgbGlua0V4cHJlc3Npb25zLnNoaWZ0KClbM107XG5cdFx0XHRcdGhhc0Vsc2UgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGhhc0Vsc2UpIHsgLy8gSWYgYW4ge2Vsc2V9IGhhcyBiZWVuIGFkZGVkLCBuZWVkIGFsc28gdG8gYWRkIGNsb3Npbmcge3svc29tZVRhZ319XG5cdFx0XHRcdHRhZ0V4cHIgKz0gZGVsaW1DbG9zZUNoYXIxICsgZGVsaW1PcGVuQ2hhcjAgKyBkZWxpbU9wZW5DaGFyMSArIFwiL1wiICsgdG9rZW5zWzRdICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eCA9IHtcblx0XHRcdFx0dHlwZTogaXNMaW5rID8gXCJ0b3BcIiA6IFwibGlua1wiLFxuXHRcdFx0XHRkYXRhOiBkYXRhLCAvLyBzb3VyY2Vcblx0XHRcdFx0ZWxlbTogbm9kZSwgLy8gdGFyZ2V0XG5cdFx0XHRcdHZpZXc6IGN1cnJlbnRWaWV3LFxuXHRcdFx0XHRjdHg6IGNvbnRleHQsXG5cdFx0XHRcdGF0dHI6IGF0dHIsXG5cdFx0XHRcdGlzTGs6IGlzTGluaywgLy8gdG9wLWxldmVsIGxpbmtpbmc/XG5cdFx0XHRcdF90b0xrIDogMSwgLy8gRmxhZyB0byBkYXRhLWxpbmsgb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCByZW5kZXJpbmcgY2FsbFxuXHRcdFx0XHRfbm9VcGQgOiB0b2tlbnNbMl0gLy8gRmxhZyBmb3IgZGF0YS1saW5rPVwiXnsuLi59XCIgc28gb24gaW5pdGlhbCBkYXRhLWxpbmsgY2FsbCB3aWxsIGJpbmQsIGJ1dCBub3QgcmVuZGVyKVxuXHRcdFx0fTtcblxuXHRcdFx0Y29udmVydEJhY2sgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodG9rZW5zWzZdKSB7XG5cdFx0XHRcdGNvbnZlcnRCYWNrID0gdG9rZW5zWzEwXSB8fCB1bmRlZmluZWQ7XG5cdFx0XHRcdGxpbmtDdHguY29udmVydCA9IHRva2Vuc1s1XSB8fCBcIlwiO1xuXHRcdFx0XHRpZiAoIWF0dHIgJiYgY29udmVydEJhY2sgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0QXR0cihub2RlKSkge1xuXHRcdFx0XHRcdC8vIERlZmF1bHQgdGFyZ2V0LCBzbyBhbGxvdyAyIHdheSBiaW5kaW5nXG5cdFx0XHRcdFx0bGlua0N0eC5jb252ZXJ0QmFjayA9IGNvbnZlcnRCYWNrID0gY29udmVydEJhY2suc2xpY2UoMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIENvbXBpbGUgdGhlIGxpbmtGbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyBhbmQgYmluZHMgYSBkYXRhLWxpbmsgZXhwcmVzc2lvblxuXHRcdFx0Ly8gVE9ETyAtIG9wdGltaXplIGZvciB0aGUgY2FzZSBvZiBzaW1wbGUgZGF0YSBwYXRoIHdpdGggbm8gY29udmVyc2lvbiwgaGVscGVycywgZXRjLjpcblx0XHRcdC8vICAgICBpLmUuIGRhdGEtbGluaz1cImEuYi5jXCIuIEF2b2lkIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgb2YgRnVuY3Rpb24gZXZlcnkgdGltZS4gQ2FuIHVzZSBhIGRlZmF1bHQgZnVuY3Rpb24gZm9yIGFsbCBvZiB0aGVzZS4uLlxuXG5cdFx0XHRsaW5rQ3R4LmV4cHIgPSBhdHRyICsgdGFnRXhwcjtcblx0XHRcdGxpbmtGbiA9IHRtcGwubGlua3NbdGFnRXhwcl07XG5cdFx0XHRpZiAoIWxpbmtGbikge1xuXHRcdFx0XHR0bXBsLmxpbmtzW3RhZ0V4cHJdID0gbGlua0ZuID0gJHN1Yi50bXBsRm4odGFnRXhwciwgdG1wbCwgdHJ1ZSwgY29udmVydEJhY2ssIGhhc0Vsc2UpO1xuXHRcdFx0fVxuXHRcdFx0bGlua0N0eC5mbiA9IGxpbmtGbjtcblx0XHRcdGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pO1xuXHRcdFx0Ly8gV2Ugc3RvcmUgclRhZ0luZGV4IGluIGxvY2FsIHNjb3BlLCBzaW5jZSB0aGlzIGFkZERhdGFCaW5kaW5nIG1ldGhvZCBjYW4gc29tZXRpbWVzIGJlIGNhbGxlZCByZWN1cnNpdmVseSxcblx0XHRcdC8vIGFuZCBlYWNoIGlzIHVzaW5nIHRoZSBzYW1lIHJUYWdEYXRhbGluayBpbnN0YW5jZS5cblx0XHRcdHJUYWdEYXRhbGluay5sYXN0SW5kZXggPSByVGFnSW5kZXg7XG5cdFx0fVxuLy9cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGJpbmREYXRhTGlua1RhcmdldChsaW5rQ3R4LCBsaW5rRm4pIHtcblx0Ly8gQWRkIGRhdGEgbGluayBiaW5kaW5ncyBmb3IgYSBsaW5rIGV4cHJlc3Npb24gaW4gZGF0YS1saW5rIGF0dHJpYnV0ZSBtYXJrdXBcblx0ZnVuY3Rpb24gaGFuZGxlcihldiwgZXZlbnRBcmdzKSB7XG5cdFx0cHJvcGVydHlDaGFuZ2VIYW5kbGVyLmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncywgbGlua0ZuKTtcblx0XHQvLyBJZiB0aGUgbGluayBleHByZXNzaW9uIHVzZXMgYSBjdXN0b20gdGFnLCB0aGUgcHJvcGVydHlDaGFuZ2VIYW5kbGVyIGNhbGwgd2lsbCBjYWxsIHJlbmRlclRhZywgd2hpY2ggd2lsbCBzZXQgdGFnQ3R4IG9uIGxpbmtDdHhcblx0fVxuXHRoYW5kbGVyLm5vQXJyYXkgPSB0cnVlO1xuXHRpZiAobGlua0N0eC5pc0xrKSB7XG5cdFx0Ly8gVG9wLWxldmVsIGxpbmtpbmc6IC5saW5rKGV4cHJlc3Npb25PclRydWUsIGRhdGEsIGNvbnRleHQpIC0gc28gd2UgbmVlZCB0byBjcmVhdGUgYSB2aWV3IGZvciB0aGUgbGlua2luZywgd2l0aCB0aGUgZGF0YSBhbmQgY3R4XG5cdFx0Ly8gd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIHRhcmdldC4gTm90ZSB0aGF0IHRoaXMgdmlldyBpcyBub3QgYSBzdGFuZGFyZCBkYXRhLWxpbmtlZCB2aWV3LCBzbyBpdCB3aWxsXG5cdFx0Ly8gYmUgZGlzcG9zZWQgb25seSB3aGVuIGl0cyBwYXJlbnQgdmlldyBpcyBkaXNwb3NlZC5cblx0XHRhZGRMaW5rTWV0aG9kcyhsaW5rQ3R4LnZpZXcgPSBuZXcgJHN1Yi5WaWV3KFxuXHRcdFx0JHN1Yi5leHRlbmRDdHgobGlua0N0eC5jdHgsIGxpbmtDdHgudmlldy5jdHgpLFxuXHRcdFx0XCJsaW5rXCIsIGxpbmtDdHgudmlldywgbGlua0N0eC5kYXRhLCBsaW5rQ3R4LmV4cHIsIHVuZGVmaW5lZCwgYWRkQmluZGluZ01hcmtlcnMpKTtcblx0fVxuXHRsaW5rQ3R4Ll9jdHhDYiA9ICRzdWIuX2djY2IobGlua0N0eC52aWV3KTsgLy8gZ2V0Q29udGV4dENhbGxiYWNrOiBfY3R4Q2IsIGZvciBmaWx0ZXJpbmcvYXBwZW5kaW5nIHRvIGRlcGVuZGVuY3kgcGF0aHM6IGZ1bmN0aW9uKHBhdGgsIG9iamVjdCkgeyByZXR1cm4gWyhvYmplY3R8cGF0aCkqXX1cblx0bGlua0N0eC5faGRsID0gaGFuZGxlcjtcblx0Ly8gaGFuZGxlci5fY3R4ID0gbGlua0N0eDsgQ291bGQgcGFzcyBsaW5rQ3R4IGZvciB1c2UgaW4gYSBkZXBlbmRzID0gZnVuY3Rpb24oKSB7fSBjYWxsLCBzbyBkZXBlbmRzIGlzIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGxpbmtDdHgnc1xuXHRoYW5kbGVyKHRydWUpO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PVxuLy8gRGF0YS1saW5raW5nIGhlbHBlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlbW92ZVN1YlN0cihzdHIsIHN1YnN0cikge1xuXHR2YXIgaztcblx0cmV0dXJuIHN0clxuXHRcdD8gKGsgPSBzdHIuaW5kZXhPZihzdWJzdHIpLFxuXHRcdFx0KGsgKyAxXG5cdFx0XHRcdD8gc3RyLnNsaWNlKDAsIGspICsgc3RyLnNsaWNlKGsgKyBzdWJzdHIubGVuZ3RoKVxuXHRcdFx0XHQ6IHN0cikpXG5cdFx0OiBcIlwiO1xufVxuXG5mdW5jdGlvbiBtYXJrZXJOb2RlSW5mbyhub2RlKSB7XG5cdHJldHVybiBub2RlICYmXG5cdFx0KFwiXCIgKyBub2RlID09PSBub2RlXG5cdFx0XHQ/IG5vZGVcblx0XHRcdDogbm9kZS50YWdOYW1lID09PSBTQ1JJUFRcblx0XHRcdFx0PyBub2RlLnR5cGUuc2xpY2UoMylcblx0XHRcdFx0OiBub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpIHx8IFwiXCIpO1xufVxuXG5mdW5jdGlvbiB2aWV3SW5mb3Mobm9kZSwgaXNWYWwsIHJCaW5kaW5nKSB7XG5cdC8vIFRlc3Qgd2hldGhlciBub2RlIGlzIGEgc2NyaXB0IG1hcmtlciBub2RlLCBhbmQgaWYgc28sIHJldHVybiBtZXRhZGF0YVxuXHRmdW5jdGlvbiBnZXRJbmZvcyhhbGwsIG9wZW4sIGNsb3NlLCBpZCwgY2gsIGVsUGF0aCkge1xuXHRcdGluZm9zLnB1c2goe1xuXHRcdFx0ZWxDbnQ6IGVsQ250LFxuXHRcdFx0aWQ6IGlkLFxuXHRcdFx0Y2g6IGNoLFxuXHRcdFx0b3Blbjogb3Blbixcblx0XHRcdGNsb3NlOiBjbG9zZSxcblx0XHRcdHBhdGg6IGVsUGF0aCxcblx0XHRcdHRva2VuOiBhbGxcblx0XHR9KTtcblx0fVxuXHR2YXIgZWxDbnQsIHRva2Vucyxcblx0XHRpbmZvcyA9IFtdO1xuXHRpZiAodG9rZW5zID0gaXNWYWwgPyBub2RlIDogbWFya2VyTm9kZUluZm8obm9kZSkpIHtcblx0XHRlbENudCA9IGluZm9zLmVsQ250ID0gbm9kZS50YWdOYW1lICE9PSBTQ1JJUFQ7XG5cdFx0ZWxDbnQgPSB0b2tlbnMuY2hhckF0KDApID09PSBcIkBcIiB8fCBlbENudDtcblx0XHRpbmZvcy5fdGtucyA9IHRva2Vucztcblx0XHQvLyByTWFya2VyVG9rZW5zID0gLyg/OigjKXwoXFwvKSkoXFxkKykoW19eXSkoWy0rQFxcZF0rKT8vZztcblx0XHR0b2tlbnMucmVwbGFjZShyQmluZGluZyB8fCByTWFya2VyVG9rZW5zLCBnZXRJbmZvcyk7XG5cdFx0cmV0dXJuIGluZm9zO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVubWFya1ByZXZPck5leHROb2RlKG5vZGUsIGVsQ250KSB7XG5cdGlmIChub2RlKSB7XG5cdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJqc3ZcIikge1xuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdH0gZWxzZSBpZiAoZWxDbnQgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpID09PSBcIlwiKSB7XG5cdFx0XHRub2RlLnJlbW92ZUF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cik7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIG1hcmtQcmV2T3JOZXh0Tm9kZShub2RlLCBlbENudCkge1xuXHR2YXIgbWFya2VyID0gbm9kZTtcblx0d2hpbGUgKGVsQ250ICYmIG1hcmtlciAmJiBtYXJrZXIubm9kZVR5cGUgIT09IDEpIHtcblx0XHRtYXJrZXIgPSBtYXJrZXIucHJldmlvdXNTaWJsaW5nO1xuXHR9XG5cdGlmIChtYXJrZXIpIHtcblx0XHRpZiAobWFya2VyLm5vZGVUeXBlICE9PSAxKSB7XG5cdFx0XHQvLyBGb3IgdGV4dCBub2Rlcywgd2Ugd2lsbCBhZGQgYSBzY3JpcHQgbm9kZSBiZWZvcmVcblx0XHRcdG1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoU0NSSVBUKTtcblx0XHRcdG1hcmtlci50eXBlID0gXCJqc3ZcIjtcblx0XHRcdG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFya2VyLCBub2RlKTtcblx0XHR9IGVsc2UgaWYgKCFtYXJrZXJOb2RlSW5mbyhtYXJrZXIpICYmICFtYXJrZXIuZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0Ly8gRm9yIGVsZW1lbnQgbm9kZXMsIHdlIHdpbGwgYWRkIGEgZGF0YS1saW5rIGF0dHJpYnV0ZSAodW5sZXNzIHRoZXJlIGlzIGFscmVhZHkgb25lKVxuXHRcdFx0Ly8gc28gdGhhdCB0aGlzIG5vZGUgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgbm9kZSBsaW5raW5nIHByb2Nlc3MuXG5cdFx0XHRtYXJrZXIuc2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyLCBcIlwiKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1hcmtlcjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGlua1RhZyhsaW5rTWFya3VwLCB0d293YXkpIHtcblx0bGlua01hcmt1cCA9ICQudHJpbShsaW5rTWFya3VwKS5yZXBsYWNlKHJFc2NhcGVRdW90ZXMsIFwiXFxcXCQmXCIpO1xuXHRyZXR1cm4gbGlua01hcmt1cC5zbGljZSgtMSkgIT09IGRlbGltQ2xvc2VDaGFyMFxuXHQvLyBJZiBzaW1wbGlmaWVkIHN5bnRheCBpcyB1c2VkOiBkYXRhLWxpbms9XCJleHByZXNzaW9uXCIsIGNvbnZlcnQgdG8gZGF0YS1saW5rPVwiezpleHByZXNzaW9ufVwiLFxuXHQvLyBvciBmb3IgaW5wdXRzLCBkYXRhLWxpbms9XCJ7OmV4cHJlc3Npb246fVwiIGZvciAoZGVmYXVsdCkgdHdvLXdheSBiaW5kaW5nXG5cdFx0PyBsaW5rTWFya3VwID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGxpbmtNYXJrdXAgKyAodHdvd2F5ID8gXCI6XCIgOiBcIlwiKSArIGRlbGltQ2xvc2VDaGFyMFxuXHRcdDogbGlua01hcmt1cDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1ldGhvZHMgZm9yIHZpZXdzIGFuZCB0YWdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncykge1xuXHR2YXIgbGlua2VkRWxlbSwgZGlzcGxheUVsZW0sIGxpbmtlZEVsLCB2YWwsIGwsIGxpbmtlZFRhZywgb2xkVHJpZywgbmV3VHJpZywgdGFnUHJvcHMsIHByb3BzRXhwciwgbGlua2VkRWxlbVZpZXcsIHByb3AsIHByb3BEZWYsXG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eCxcblx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0cHJvcHMgPSB0YWdDdHgucHJvcHMsXG5cdFx0bGlua0N0eCA9IHRhZy5saW5rQ3R4O1xuXG5cdGlmICh0YWcuXy51bmxpbmtlZCkgeyAvLyBGaXJzdCBjYWxsIHRvIG9uQWZ0ZXJMaW5rLCBvciBmaXJzdCBjYWxsIGFmdGVyIG9uVXBkYXRlOiB1cGRhdGVDb250ZW50LiBJbml0aWFsaXplIGFuZCBjYWxsIG9uQmluZCBhbmQgc2V0IHByb3BlcnRpZXNcblx0XHRpZiAodGFnLmxpbmtlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gbGlua2VkRWxlbWVudDogLSBzZWxlY3RvciBmb3IgaWRlbnRpZnlpbmcgbGlua2VkIGVsZW1lbnQgaW4gdGVtcGxhdGUvcmVuZGVyZWQgY29udGVudFxuXHRcdFx0dGFnLmxpbmtlZEVsZW0gPSB0YWcuXy5pbmxpbmUgPyB0YWcuY29udGVudHModHJ1ZSwgdGFnLmxpbmtlZEVsZW1lbnQgfHwgXCIqXCIpLmZpcnN0KCkgOiAkKGxpbmtDdHguZWxlbSk7XG5cdFx0fVxuXHRcdGlmICh0YWcub25CaW5kKSB7XG5cdFx0XHR0YWcub25CaW5kKHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHRhZy5vbkFmdGVyTGluaykge1xuXHRcdHRhZy5vbkFmdGVyTGluayh0YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIGV2LCBldmVudEFyZ3MpO1xuXHR9XG5cblx0bGlua2VkRWxlbSA9IHRhZy50YXJnZXRUYWcgPyB0YWcudGFyZ2V0VGFnLmxpbmtlZEVsZW0gOiB0YWcubGlua2VkRWxlbTtcblx0ZGlzcGxheUVsZW0gPSB0YWcuZGlzcGxheUVsZW0gfHwgbGlua2VkRWxlbTtcblxuXHRpZiAobGlua2VkRWxlbSAmJiBsaW5rZWRFbGVtWzBdKSB7XG5cdFx0dmFsID0gdGFnLmN2dEFyZ3MoKVswXTtcblx0XHRpZiAodmFsICE9PSB1bmRlZmluZWQgJiYgIXRhZy5fLmNoZ2luZykge1xuXHRcdFx0bCA9IGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRsaW5rZWRFbCA9IGxpbmtlZEVsZW1bbF07XG5cdFx0XHRcdGlmICh0YWcuXy51bmxpbmtlZCAmJiBsaW5rZWRFbCAhPT0gbGlua0N0eC5lbGVtKSB7XG5cdFx0XHRcdFx0bGlua2VkVGFnID0gbGlua2VkRWwuX2pzdkxrRWw7XG5cdFx0XHRcdFx0aWYgKHRhZy5fLmlubGluZSAmJiAoIWxpbmtlZFRhZyB8fCBsaW5rZWRUYWcgIT09IHRhZyAmJiBsaW5rZWRUYWcudGFyZ2V0VGFnICE9PSB0YWcpKSB7XG5cdFx0XHRcdFx0XHQvLyBGb3IgZGF0YS1saW5rZWQgdGFncywgaWRlbnRpZnkgdGhlIGxpbmtlZEVsIHdpdGggdGhlIHRhZywgZm9yIFwidG9cIiBiaW5kaW5nXG5cdFx0XHRcdFx0XHQvLyAoRm9yIGRhdGEtbGlua2VkIGVsZW1lbnRzLCBpZiBub3QgeWV0IGJvdW5kLCB3ZSBpZGVudGlmeSBsYXRlciB3aGVuIHRoZSBsaW5rQ3R4LmVsZW0gaXMgYm91bmQpXG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5fanN2TGtFbCA9IHRhZztcblx0XHRcdFx0XHRcdGJpbmRUbyhiaW5kaW5nU3RvcmVbdGFnLl90Z0lkXSwgdGFnLCBsaW5rZWRFbCk7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5fanN2Qm5kID0gXCImXCIgKyB0YWcuX3RnSWQgKyBcIitcIjsgLy8gQWRkIGEgXCIrXCIgZm9yIGNsb25lZCBiaW5kaW5nIC0gc28gcmVtb3Zpbmdcblx0XHRcdFx0XHRcdC8vIGVsZW1zIHdpdGggY2xvbmVkIGJpbmRpbmdzIHdpbGwgbm90IHJlbW92ZSB0aGUgJ3BhcmVudCcgYmluZGluZyBmcm9tIHRoZSBiaW5kaW5nU3RvcmUuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChsaW5rZWRFbC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRpZiAobGlua2VkRWwudHlwZSA9PT0gQ0hFQ0tCT1gpIHtcblx0XHRcdFx0XHRcdFx0bGlua2VkRWxbQ0hFQ0tFRF0gPSB2YWwgJiYgdmFsICE9PSBcImZhbHNlXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpbmtlZEVsLnR5cGUgPT09IFJBRElPKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVsW0NIRUNLRURdID0gKGxpbmtlZEVsLnZhbHVlID09PSB2YWwpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0JChsaW5rZWRFbCkudmFsKHZhbCk7IC8vIFVzZSBqUXVlcnkgZm9yIGF0dHJIb29rcyAtIGNhbid0IGp1c3Qgc2V0IHZhbHVlIChvbiBzZWxlY3QsIGZvciBleGFtcGxlKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAobGlua2VkRWwuY29udGVudEVkaXRhYmxlID09PSBUUlVFKSB7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5pbm5lckhUTUwgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxpbmtDdHguX3ZhbCA9IHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvcHMubmFtZSkge1xuXHRcdFx0XHRcdGxpbmtlZEVsLm5hbWUgPSBsaW5rZWRFbC5uYW1lIHx8IHByb3BzLm5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRhZy5zZXRTaXplKSB7XG5cdFx0XHRpZiAocHJvcHMuaGVpZ2h0KSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLmhlaWdodChwcm9wcy5oZWlnaHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BzLndpZHRoKSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLndpZHRoKHByb3BzLndpZHRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHByb3BzLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGRpc3BsYXlFbGVtLmF0dHIoXCJ0aXRsZVwiLCBwcm9wcy50aXRsZSk7XG5cdFx0fVxuXHRcdGlmIChwcm9wc1tcImNsYXNzXCJdKSB7XG5cdFx0XHQvLyBUaGlzIGNvZGUgc3VwcG9ydHMgZHluYW1pYyBiaW5kaW5nIHRvIGNsYXNzIC0gd2hlcmUgaXQgYWRkcyB0aGUgY2xhc3MgaWYgYWJzZW50LCBhbmQgcmVtb3Zlcy9hZGRzIGlmIGEgcHJldmlvdXMgdmFsdWUgaXMgcHJlc2VudFxuXHRcdFx0aWYgKGV2ZW50QXJncyAmJiBkaXNwbGF5RWxlbS5oYXNDbGFzcyhldmVudEFyZ3Mub2xkVmFsdWUpKSB7XG5cdFx0XHRcdGRpc3BsYXlFbGVtLnJlbW92ZUNsYXNzKGV2ZW50QXJncy5vbGRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRkaXNwbGF5RWxlbS5hZGRDbGFzcyhwcm9wc1tcImNsYXNzXCJdKTtcblx0XHR9XG5cdFx0aWYgKHByb3BzLmlkKSB7XG5cdFx0XHRsaW5rZWRFbGVtWzBdLmlkID0gcHJvcHMuaWQ7XG5cdFx0fVxuXHR9XG5cdHRhZy5fLnVubGlua2VkID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc3luY0VsZW1DaGFuZ2VIYW5kbGVyKGV2KSB7XG5cdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0ZWxlbUNoYW5nZUhhbmRsZXIoZXYpO1xuXHR9LCAwKTtcbn1cblxuZnVuY3Rpb24gYmluZEVsQ2hhbmdlKCRlbGVtLCB0cmlnLCBvbm9mZikge1xuXHRpZiAodHJpZykge1xuXHRcdHRyaWcgPSBcIlwiICsgdHJpZyA9PT0gdHJpZyA/IHRyaWcgOiBcImtleWRvd25cIjsgLy8gU2V0IHRyaWdnZXIgdG8gKHRydWUgfHwgdHJ1ZXkgbm9uLXN0cmluZyAoZS5nLiAxKSB8fCAna2V5ZG93bicpOiBHZXQgJ2tleWRvd24nIHdpdGggYXN5bmNcblx0XHQkZWxlbVtvbm9mZl0odHJpZywgdHJpZyA9PT0gXCJrZXlkb3duXCIgPyBhc3luY0VsZW1DaGFuZ2VIYW5kbGVyIDogZWxlbUNoYW5nZUhhbmRsZXIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGJpbmRUbyhiaW5kaW5nLCB0YWcsIGxpbmtlZEVsZW0sIGN2dEJrKSB7XG5cdC8vIFR3by13YXkgYmluZGluZy5cblx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nLnRvWzFdIHRvIGJlIHRoZSBjdnRCYWNrLCBhbmQgYmluZGluZy50b1swXSB0byBiZSBlaXRoZXIgdGhlIHBhdGggdG8gdGhlIHRhcmdldCwgb3IgW29iamVjdCwgcGF0aF0gd2hlcmUgdGhlIHRhcmdldCBpcyB0aGUgcGF0aCBvbiB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuXHQvLyBTbyBmb3IgYSBjb21wdXRlZCBwYXRoIHdpdGggYW4gb2JqZWN0IGNhbGw6IGEuYi5nZXRPYmplY3QoKS5kLmUsIHRoZW4gd2Ugc2V0IHRvWzBdIHRvIGJlIFtleHByT2IsIFwiZC5lXCJdLCBhbmQgd2UgYmluZCB0byB0aGUgcGF0aCBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LCBleHByT2Iub2IsIGFzIHRhcmdldFxuXHQvLyBPdGhlcndpc2Ugb3VyIHRhcmdldCBpcyB0aGUgZmlyc3QgcGF0aCwgcGF0aHNbMF0sIHdoaWNoIHdlIHdpbGwgY29udmVydCB3aXRoIGNvbnRleHRDYigpIGZvciBwYXRocyBsaWtlIH5hLmIuYyBvciAjeC55LnpcblxuXHR2YXIgYmluZHRvLCBwYXRoSW5kZXgsIHBhdGgsIGxhc3RQYXRoLCBiaW5kdG9PYiwgJGxpbmtlZEVsZW0sIG5ld1RyaWcsIG9sZFRyaWcsIHRvLCBsLFxuXHRcdGxpbmtDdHggPSBiaW5kaW5nLmxpbmtDdHgsXG5cdFx0Y29udGV4dENiID0gbGlua0N0eC5fY3R4Q2IsXG5cdFx0c291cmNlID0gbGlua0N0eC5kYXRhLFxuXHRcdHBhdGhzID0gbGlua0N0eC5mbi5wYXRoc1swXTtcblxuXHR0YWcgPSB0YWcgfHwgbGlua2VkRWxlbS5fanN2TGtFbDtcblxuXHRpZiAoYmluZGluZyAmJiBwYXRocyAmJiAhYmluZGluZy50bykge1xuXHRcdG9sZFRyaWcgPSBsaW5rZWRFbGVtLl9qc3ZUciB8fCBmYWxzZTtcblx0XHRpZiAodGFnKSB7XG5cdFx0XHRjdnRCayA9IHRhZy5jb252ZXJ0QmFjayB8fCBjdnRCaztcblx0XHRcdG5ld1RyaWcgPSB0YWcudGFnQ3R4LnByb3BzLnRyaWdnZXI7XG5cdFx0fVxuXHRcdG5ld1RyaWcgPSBuZXdUcmlnID09PSB1bmRlZmluZWQgPyAkc3ViU2V0dGluZ3MudHJpZ2dlciA6IG5ld1RyaWc7XG5cdFx0Ly8gVHJpZ2dlciBpcyBub29wIGV4Y2VwdCBmb3IgdGV4dCBib3gsIHRleHRhcmVhLCBjb250ZW50ZWRpdGFibGUuLi5cblx0XHRuZXdUcmlnID0gbmV3VHJpZyAmJiAobGlua2VkRWxlbS50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgbGlua2VkRWxlbS50eXBlICE9PSBDSEVDS0JPWCAmJiBsaW5rZWRFbGVtLnR5cGUgIT09IFJBRElPIHx8IGxpbmtlZEVsZW0udHlwZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IGxpbmtlZEVsZW0uY29udGVudEVkaXRhYmxlID09PSBUUlVFKSAmJiBuZXdUcmlnIHx8IGZhbHNlO1xuXG5cdFx0aWYgKG9sZFRyaWcgIT09IG5ld1RyaWcpIHtcblx0XHRcdCRsaW5rZWRFbGVtID0gJChsaW5rZWRFbGVtKTtcblx0XHRcdGJpbmRFbENoYW5nZSgkbGlua2VkRWxlbSwgb2xkVHJpZywgXCJvZmZcIik7XG5cdFx0XHRiaW5kRWxDaGFuZ2UoXG5cdFx0XHRcdCRsaW5rZWRFbGVtLFxuXHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZUciA9IG5ld1RyaWcsXG5cdFx0XHRcdFwib25cIlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRwYXRocyA9IChiaW5kdG8gPSBwYXRocy5fanN2dG8pIHx8IHBhdGhzWzBdO1xuXHRcdGlmIChwYXRoSW5kZXggPSBwYXRocyAmJiBwYXRocy5sZW5ndGgpIHtcblx0XHRcdGxhc3RQYXRoID0gcGF0aHNbcGF0aEluZGV4IC0gMV07XG5cdFx0XHRpZiAobGFzdFBhdGguX2pzdikge1xuXHRcdFx0XHRiaW5kdG9PYiA9IGxhc3RQYXRoO1xuXHRcdFx0XHR3aGlsZSAobGFzdFBhdGguc2IgJiYgbGFzdFBhdGguc2IuX2pzdikge1xuXHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aCA9IGxhc3RQYXRoLnNiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGggPSBsYXN0UGF0aC5zYiB8fCBwYXRoICYmIHBhdGgucGF0aDtcblx0XHRcdFx0bGFzdFBhdGggPSBwYXRoID8gcGF0aC5zbGljZSgxKSA6IGJpbmR0b09iLnBhdGg7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHR0byA9IFtcblx0XHRcdFx0XHRcdGJpbmR0b09iLCAvLyAnZXhwck9iJyBmb3IgdGhpcyBleHByZXNzaW9uIGFuZCB2aWV3LWJpbmRpbmcuIFNvIGJpbmR0b09iLm9iIGlzIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IGV4cHJlc3Npb24uXG5cdFx0XHRcdFx0XHRsYXN0UGF0aFxuXHRcdFx0XHRcdF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoKHRvID0gY29udGV4dENiKHBhdGggPSBsYXN0UGF0aC5zcGxpdChcIl5cIikuam9pbihcIi5cIiksIHNvdXJjZSkpICYmIChsID0gdG8ubGVuZ3RoKSkge1xuXHRcdFx0XHRcdC8vIFJlY3Vyc2l2ZWx5IGRlcmVmZXJlbmNlIGFueSB+Zm9vIG9yICNiYXIgdG9rZW5zIGluIHRoZSBwYXRoLiAoUmVjdXJzaXZlIGJlY2F1c2UgfmZvbyBtYXkgYmUgYSBjb250ZXh0dWFsIHBhcmFtIHdoaWNoIGhhc1xuXHRcdFx0XHRcdC8vIGl0cyBvd24gZGVwZW5kZW5jaWVzIG9uIG90aGVyIH5mb28gI2JhciBjb21wb25lbnRzKVxuXHRcdFx0XHRcdGlmICh0b1swXS5fY3ApIHsgLy8gVHdvLXdheSBiaW5kaW5nIHRvIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIgcmVmZXJlbmNlLCB+Zm9vIChkZWNsYXJlZCBhcyB+Zm9vPWV4cHIgb24gYSBwYXJlbnQgdGFnKVxuXHRcdFx0XHRcdFx0dG8gPSB0b1swXTsgICAgLy8gc28gJ3RvJyBpcyB0aGUgW3ZpZXcsIGV4cHJlc3Npb24vZGVwZW5kZW5jaWVzXSBmb3IgdGhlIGNvbnRleHR1YWwgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRjb250ZXh0Q2IgPSAkc3ViLl9nY2NiKHRvWzBdKTsgLy8gZ2V0Q29udGV4dENhbGxiYWNrOiBNb3ZlIGNvbnRleHRDYiB1cCB0byB2aWV3IHdoZXJlIGNvbnRleHR1YWwgcGFyYW1ldGVyIHdhcyBhc3NpZ25lZFxuXHRcdFx0XHRcdFx0bGFzdFBhdGggPSB0b1sxXTtcblx0XHRcdFx0XHRcdHRvID0gW3RvWzBdLmRhdGEsIHRvWzFdXTtcblx0XHRcdFx0XHRcdGlmIChsYXN0UGF0aC5fanN2KSB7IC8vIGNvbXB1dGVkIHZhbHVlXG5cdFx0XHRcdFx0XHRcdGJpbmR0b09iID0gbGFzdFBhdGg7XG5cdFx0XHRcdFx0XHRcdGJpbmR0b09iLmRhdGEgPSB0b1swXTtcblx0XHRcdFx0XHRcdFx0YmluZHRvT2IuX2NwQ3R4ID0gY29udGV4dENiO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAobGFzdFBhdGguc2IgJiYgbGFzdFBhdGguc2IuX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aCA9IGxhc3RQYXRoLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aC5zYiB8fCBwYXRoICYmIHBhdGgucGF0aDtcblx0XHRcdFx0XHRcdFx0bGFzdFBhdGggPSBwYXRoID8gcGF0aC5zbGljZSgxKSA6IGJpbmR0b09iLnBhdGg7XG5cdFx0XHRcdFx0XHRcdHRvID0gW1xuXHRcdFx0XHRcdFx0XHRcdGJpbmR0b09iLCAvLyAnZXhwck9iJyBmb3IgdGhpcyBleHByZXNzaW9uIGFuZCB2aWV3LWJpbmRpbmcuIFNvIGJpbmR0b09iLm9iIGlzIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IGV4cHJlc3Npb24uXG5cdFx0XHRcdFx0XHRcdFx0bGFzdFBhdGhcblx0XHRcdFx0XHRcdFx0XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgeyAvLyBUd28td2F5IGJpbmRpbmcgdG8gYSBoZWxwZXIgLSBlLmcuIH5hZGRyZXNzLnN0cmVldCwgb3IgY29tcHV0ZWQsIGUuZy4gfmZ1bGxOYW1lKCksIG9yIHZpZXcgcHJvcGVydHkgZS5nLiAjZGF0YS5mb29cblx0XHRcdFx0XHRcdHRvID0gbD4yXG5cdFx0XHRcdFx0XHRcdD8gW3RvW2wtM10sIHRvW2wtMl1dIC8vIFdpdGggcGF0aDogW29iamVjdCwgcGF0aF1cblx0XHRcdFx0XHRcdFx0OiBbdG9bbC0yXV07ICAgICAgICAgLy8gTm8gcGF0aCwgKGUuZy4gW2Z1bmN0aW9uXSBmb3IgY29tcHV0ZWQgd2l0aCBzZXR0ZXIpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNvdXJjZSA9IHRvWzBdO1xuXHRcdFx0XHRcdGxhc3RQYXRoID0gdG9bMV07XG5cdFx0XHRcdH1cblx0XHRcdFx0dG8gPSB0byB8fCBbc291cmNlLCBwYXRoXTsgLy8gVHdvIHdheSBiaW5kaW5nIHRvIGFuIG9iamVjdCAobmVpdGhlciB+Zm9vIG5vciAjYmFyKVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0byA9IFtdO1xuXHRcdH1cblx0XHRiaW5kaW5nLnRvID0gW1xuXHRcdFx0dG8sXG5cdFx0XHRjdnRCa1xuXHRcdF07XG5cdH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VDdHhzKHRhZywgbmV3Q3R4cywgcmVwbGFjZSkgeyAvLyBNZXJnZSB1cGRhdGVkIHRhZ0N0eHMgaW50byB0YWcudGFnQ3R4c1xuXHR2YXIgdGFnQ3R4LCBuZXdUYWdDdHgsXG5cdFx0dmlldyA9IHRhZy50YWdDdHgudmlldyxcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMgfHwgW3RhZy50YWdDdHhdLFxuXHRcdGwgPSB0YWdDdHhzLmxlbmd0aCxcblx0XHRyZWZyZXNoID0gIW5ld0N0eHM7XG5cblx0bmV3Q3R4cyA9IG5ld0N0eHMgfHwgdGFnLl8uYm5kLmNhbGwodmlldy50bXBsLCAodGFnLmxpbmtDdHggfHwgdmlldykuZGF0YSwgdmlldywgJHN1Yik7XG5cblx0aWYgKHJlcGxhY2UpIHtcblx0XHQvLyBSZXBsYWNlIHByZXZpb3VzIHRhZ0N0eHMgYnkgbmV3IG9uZXMsIHJhdGhlciB0aGFuIG1lcmdpbmdcblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMgPSBuZXdDdHhzO1xuXHRcdHRhZy50YWdDdHggPSB0YWdDdHhzWzBdO1xuXHR9IGVsc2Uge1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdHRhZ0N0eCA9IHRhZ0N0eHNbbF07XG5cdFx0XHRuZXdUYWdDdHggPSBuZXdDdHhzW2xdO1xuXHRcdFx0JG9ic2VydmFibGUodGFnQ3R4LnByb3BzKS5zZXRQcm9wZXJ0eShuZXdUYWdDdHgucHJvcHMpO1xuXHRcdFx0JGV4dGVuZCh0YWdDdHguY3R4LCBuZXdUYWdDdHguY3R4KTsgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBjdHggdmFyaWFibGVzLCB+Zm9vLCBvYnNlcnZhYmx5LCB0byBuZXN0ZWQgdmlld3MuIFNvIGV4dGVuZCwgbm90IHNldFByb3BlcnR5Li4uXG5cdFx0XHR0YWdDdHguYXJncyA9IG5ld1RhZ0N0eC5hcmdzO1xuXHRcdFx0aWYgKHJlZnJlc2gpIHtcblx0XHRcdFx0dGFnQ3R4LnRtcGwgPSBuZXdUYWdDdHgudG1wbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0JHN1Yi5fdGhzKHRhZywgdGFnQ3R4c1swXSk7IC8vIHRhZ0hhbmRsZXJzRnJvbVByb3BzXG5cdHJldHVybiB0YWdDdHhzO1xufVxuXG4vLz09PT09PT09PVxuLy8gRGlzcG9zYWxcbi8vPT09PT09PT09XG5cbmZ1bmN0aW9uIGNsZWFuKGVsZW1zKSB7XG5cdC8vIFJlbW92ZSBkYXRhLWxpbmsgYmluZGluZ3MsIG9yIGNvbnRhaW5lZCB2aWV3c1xuXHR2YXIgbCwgZWxlbSwgYmluZGluZ3MsXG5cdFx0ZWxlbUFycmF5ID0gW10sXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGkgPSBsZW47XG5cdHdoaWxlIChpLS0pIHtcblx0XHQvLyBDb3B5IGludG8gYW4gYXJyYXksIHNvIHRoYXQgZGVsZXRpb24gb2Ygbm9kZXMgZnJvbSBET00gd2lsbCBub3QgY2F1c2Ugb3VyICdpJyBjb3VudGVyIHRvIGdldCBzaGlmdGVkXG5cdFx0Ly8gKE5vdGU6IFRoaXMgc2VlbXMgYXMgZmFzdCBvciBmYXN0ZXIgdGhhbiBlbGVtQXJyYXkgPSBbXS5zbGljZS5jYWxsKGVsZW1zKTsgLi4uKVxuXHRcdGVsZW1BcnJheS5wdXNoKGVsZW1zW2ldKTtcblx0fVxuXHRpID0gbGVuO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0ZWxlbSA9IGVsZW1BcnJheVtpXTtcblx0XHRpZiAoZWxlbS5wYXJlbnROb2RlKSB7XG5cdFx0XHQvLyBIYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTVxuXHRcdFx0aWYgKGJpbmRpbmdzID0gZWxlbS5fanN2Qm5kKSB7XG5cdFx0XHRcdC8vIEdldCBwcm9wZXJ0eUNoYW5nZSBiaW5kaW5ncyBmb3IgdGhpcyBlbGVtZW50XG5cdFx0XHRcdC8vIFRoaXMgbWF5IGJlIGFuIGVsZW1lbnQgd2l0aCBkYXRhLWxpbmssIG9yIHRoZSBvcGVuaW5nIHNjcmlwdCBtYXJrZXIgbm9kZSBmb3IgYSBkYXRhLWxpbmtlZCB0YWcge157Li4ufX1cblx0XHRcdFx0Ly8gYmluZGluZ3MgaXMgYSBzdHJpbmcgd2l0aCB0aGUgc3ludGF4OiBcIigmYmluZGluZ0lkKSpcIlxuXHRcdFx0XHRiaW5kaW5ncyA9IGJpbmRpbmdzLnNsaWNlKDEpLnNwbGl0KFwiJlwiKTtcblx0XHRcdFx0ZWxlbS5fanN2Qm5kID0gXCJcIjtcblx0XHRcdFx0bCA9IGJpbmRpbmdzLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdC8vIFJlbW92ZSBhc3NvY2lhdGVkIGJpbmRpbmdzXG5cdFx0XHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcoYmluZGluZ3NbbF0sIGVsZW0uX2pzdkxrRWwsIGVsZW0pOyAvLyB1bmJpbmQgYmluZGluZ3Mgd2l0aCB0aGlzIGJpbmRpbmdJZCBvbiB0aGlzIHZpZXdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGlzcG9zZVRva2VucyhtYXJrZXJOb2RlSW5mbyhlbGVtKSArIChlbGVtLl9kZiB8fCBcIlwiKSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCwgbGlua2VkRWxlbVRhZywgZWxlbSkge1xuXHQvLyBVbmJpbmRcblx0dmFyIG9iaklkLCBsaW5rQ3R4LCB0YWcsIG9iamVjdCwgb2JzSWQsIHRhZ0N0eHMsIGwsIG1hcCwgJGxpbmtlZEVsZW0sIGxpbmtlZEVsZW0sIHRyaWdnZXIsIHZpZXcsIHRhcmdldFRhZyxcblx0XHRiaW5kaW5nID0gYmluZGluZ1N0b3JlW2JpbmRJZF07XG5cblx0aWYgKGxpbmtlZEVsZW1UYWcpIHtcblx0XHRsaW5rZWRFbGVtVGFnID0gbGlua2VkRWxlbVRhZy50YXJnZXRUYWcgfHwgbGlua2VkRWxlbVRhZztcblx0XHRlbGVtLl9qc3ZMa0VsID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGJpbmRpbmcpIHtcblx0XHRkZWxldGUgYmluZGluZ1N0b3JlW2JpbmRJZF07IC8vIERlbGV0ZSBhbHJlYWR5LCBzbyBjYWxsIHRvIG9uRGlzcG9zZSBoYW5kbGVyIGJlbG93IGNhbm5vdCB0cmlnZ2VyIHJlY3Vyc2l2ZSBkZWxldGlvbiAodGhyb3VnaCByZWN1cnNpdmUgY2FsbCB0byBqUXVlcnkgY2xlYW5EYXRhKVxuXHRcdGZvciAob2JqSWQgaW4gYmluZGluZy5ibmQpIHtcblx0XHRcdG9iamVjdCA9IGJpbmRpbmcuYm5kW29iaklkXTtcblx0XHRcdG9ic0lkID0gYmluZGluZy5jYklkO1xuXHRcdFx0aWYgKCRpc0FycmF5KG9iamVjdCkpIHtcblx0XHRcdFx0JChbb2JqZWN0XSkub2ZmKGFycmF5Q2hhbmdlU3RyICsgb2JzSWQpLm9mZihwcm9wZXJ0eUNoYW5nZVN0ciArIG9ic0lkKTsgLy8gVGhlcmUgbWF5IGJlIGVpdGhlciBvciBib3RoIG9mIGFycmF5Q2hhbmdlIGFuZCBwcm9wZXJ0eUNoYW5nZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JChvYmplY3QpLm9mZihwcm9wZXJ0eUNoYW5nZVN0ciArIG9ic0lkKTtcblx0XHRcdH1cblx0XHRcdGRlbGV0ZSBiaW5kaW5nLmJuZFtvYmpJZF07XG5cdFx0fVxuXG5cdFx0aWYgKGxpbmtDdHggPSBiaW5kaW5nLmxpbmtDdHgpIHtcblx0XHRcdGlmICh0YWcgPSBsaW5rQ3R4LnRhZykge1xuXHRcdFx0XHRpZiAodGFnQ3R4cyA9IHRhZy50YWdDdHhzKSB7XG5cdFx0XHRcdFx0bCA9IHRhZ0N0eHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdGlmIChtYXAgPSB0YWdDdHhzW2xdLm1hcCkge1xuXHRcdFx0XHRcdFx0XHRtYXAudW5tYXAoKTsgLy91bm9ic2VydmVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0JGxpbmtlZEVsZW0gPSB0YWcubGlua2VkRWxlbTtcblxuXHRcdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0YWcub25EaXNwb3NlKSB7XG5cdFx0XHRcdFx0dGFnLm9uRGlzcG9zZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0YWcuX2VsQ250KSB7XG5cdFx0XHRcdFx0aWYgKHRhZy5fcHJ2KSB7XG5cdFx0XHRcdFx0XHR0YWcuX3Bydi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZy5fcHJ2KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRhZy5fbnh0KSB7XG5cdFx0XHRcdFx0XHR0YWcuX254dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZy5fbnh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxpbmtlZEVsZW0gPSAkbGlua2VkRWxlbSAmJiAkbGlua2VkRWxlbVswXSB8fCBsaW5rQ3R4LmVsZW07XG5cblx0XHRcdGlmICh0cmlnZ2VyID0gbGlua2VkRWxlbSAmJiBsaW5rZWRFbGVtLl9qc3ZUcikge1xuXHRcdFx0XHRiaW5kRWxDaGFuZ2UoJGxpbmtlZEVsZW0gfHwgJChsaW5rZWRFbGVtKSwgdHJpZ2dlciwgXCJvZmZcIik7XG5cdFx0XHRcdGxpbmtlZEVsZW0uX2pzdlRyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0dmlldyA9IGxpbmtDdHgudmlldztcblx0XHRcdGlmICh2aWV3LnR5cGUgPT09IFwibGlua1wiKSB7XG5cdFx0XHRcdHZpZXcucGFyZW50LnJlbW92ZVZpZXdzKHZpZXcuXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIEEgXCJsaW5rXCIgdmlldyBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmRpbmcsIHNvIHNob3VsZCBiZSBkaXNwb3NlZCB3aXRoIGJpbmRpbmcuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgdmlldy5fLmJuZHNbYmluZElkXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZGVsZXRlIGJpbmRpbmcuc1tiaW5kaW5nLmNiSWRdO1xuXHR9XG59XG5cbmZ1bmN0aW9uICR1bmxpbmsodG8pIHtcblx0aWYgKHRvKSB7XG5cdFx0dG8gPSB0by5qcXVlcnkgPyB0byA6ICQodG8pO1xuXHRcdHRvLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5uZXJWaWV3O1xuXHRcdFx0Ly9UT0RPIGZpeCB0aGlzIGZvciBiZXR0ZXIgcGVyZi4gUmF0aGVyIHRoYXQgY2FsbGluZyBpbm5lciB2aWV3IG11bHRpcGxlIHRpbWVzIHdoaWNoIGRvZXMgcXVlcnlTZWxlY3RvckFsbCBlYWNoIHRpbWUsIGNvbnNpZGVyIGEgc2luZ2xlIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdC8vIG9yIHNpbXBseSBjYWxsIHZpZXcucmVtb3ZlVmlld3MoKSBvbiB0aGUgdG9wLWxldmVsIHZpZXdzIHVuZGVyIHRoZSB0YXJnZXQgJ3RvJyBub2RlLCB0aGVuIGNsZWFuKC4uLilcblx0XHRcdHdoaWxlICgoaW5uZXJWaWV3ID0gJHZpZXcodGhpcywgdHJ1ZSkpICYmIGlubmVyVmlldy5wYXJlbnQpIHtcblx0XHRcdFx0aW5uZXJWaWV3LnBhcmVudC5yZW1vdmVWaWV3cyhpbm5lclZpZXcuXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRjbGVhbih0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSk7XG5cdFx0fSk7XG5cdFx0Y2xlYW4odG8pO1xuXHR9IGVsc2Uge1xuXHRcdC8vIENhbGwgdG8gJC51bmxpbmsoKSBpcyBlcXVpdmFsZW50IHRvICQudW5saW5rKHRydWUsIFwiYm9keVwiKVxuXHRcdGlmIChhY3RpdmVCb2R5KSB7XG5cdFx0XHQkKGFjdGl2ZUJvZHkpXG5cdFx0XHRcdC5vZmYoZWxlbWVudENoYW5nZVN0ciwgZWxlbUNoYW5nZUhhbmRsZXIpXG5cdFx0XHRcdC5vZmYoJ2JsdXInLCAnW2NvbnRlbnRlZGl0YWJsZV0nLCBlbGVtQ2hhbmdlSGFuZGxlcik7XG5cdFx0XHRhY3RpdmVCb2R5ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0b3BWaWV3LnJlbW92ZVZpZXdzKCk7XG5cdFx0Y2xlYW4oZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikpO1xuXHR9XG59XG5cbi8vPT09PT09PT1cbi8vIEhlbHBlcnNcbi8vPT09PT09PT1cblxuZnVuY3Rpb24gaW5wdXRBdHRyaWIoZWxlbSkge1xuXHRyZXR1cm4gZWxlbS50eXBlID09PSBDSEVDS0JPWCA/IGVsZW1bQ0hFQ0tFRF0gOiBlbGVtLnZhbHVlO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy89PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzUmVuZGVyIGludGVncmF0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PVxuXG4kc3ViLm9uU3RvcmUudGVtcGxhdGUgPSBmdW5jdGlvbihuYW1lLCBpdGVtKSB7XG5cdGl0ZW0ubGluayA9IHRtcGxMaW5rO1xuXHRpZiAobmFtZSkge1xuXHRcdCQubGlua1tuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRtcGxMaW5rLmFwcGx5KGl0ZW0sIGFyZ3VtZW50cyk7XG5cdFx0fTtcblx0fVxufTtcblxuJHN1Yi52aWV3SW5mb3MgPSB2aWV3SW5mb3M7IC8vIEV4cG9zZSB2aWV3SW5mb3MoKSBhcyBwdWJsaWMgaGVscGVyIG1ldGhvZFxuXG4vLyBEZWZpbmUgSnNWaWV3cyB2ZXJzaW9uIG9mIGRlbGltaXRlcnMoKSwgYW5kIGluaXRpYWxpemVcbigkdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzID0gZnVuY3Rpb24oKSB7XG5cdC8vIFJ1biBkZWxpbWl0ZXJzIGluaXRpYWxpemF0aW9uIGluIGNvbnRleHQgb2YganNyZW5kZXIuanNcblx0dmFyIHJldCA9IG9sZEpzdkRlbGltaXRlcnMuYXBwbHkoMCwgYXJndW1lbnRzKSxcblx0XHQvLyBOb3cgc2V0IGFsc28gZGVsaW1PcGVuQ2hhcjAgZXRjLiBpbiBjb250ZXh0IG9mIGpxdWVyeS52aWV3cy5qcy4uLlxuXHRcdGRlbGltQ2hhcnMgPSAkc3ViU2V0dGluZ3MuZGVsaW1pdGVycztcblxuXHRkZWxpbU9wZW5DaGFyMCA9IGRlbGltQ2hhcnNbMF0uY2hhckF0KDApO1xuXHRkZWxpbU9wZW5DaGFyMSA9IGRlbGltQ2hhcnNbMF0uY2hhckF0KDEpO1xuXHRkZWxpbUNsb3NlQ2hhcjAgPSBkZWxpbUNoYXJzWzFdLmNoYXJBdCgwKTtcblx0ZGVsaW1DbG9zZUNoYXIxID0gZGVsaW1DaGFyc1sxXS5jaGFyQXQoMSk7XG5cdGxpbmtDaGFyID0gZGVsaW1DaGFyc1syXTtcblxuXHQvLyBEYXRhLWxpbmtpbmcgbXVzdCB1c2UgbmV3IGRlbGltaXRlcnNcblx0clRhZ0RhdGFsaW5rID0gbmV3IFJlZ0V4cChcIig/Ol58XFxcXHMqKShbXFxcXHctXSopKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpPyhcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMSArICRzdWIuclRhZyArIFwiKDpcXFxcdyopP1xcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiKVwiLCBcImdcIik7XG5cdHJldHVybiByZXQ7XG59KSgpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuJHN1Yi5hZGRTZXR0aW5nKFwidHJpZ2dlclwiKTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFkZGl0aW9uYWwgbWVtYmVycyBmb3IgbGlua2VkIHZpZXdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiB0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnRFbGVtLCBpZCwgdmlld09yVGFnQ2hhciwgcmVmcmVzaCkge1xuXHQvLyBUcmFuc2ZlciB0b2tlbnMgb24gcHJldk5vZGUgb2Ygdmlld1RvUmVtb3ZlL3ZpZXdUb1JlZnJlc2ggdG8gbmV4dE5vZGUgb3IgcGFyZW50RWxlbS5fZGZcblx0dmFyIGksIGwsIHZ3SW5mb3MsIHZ3SW5mbywgdmlld09yVGFnLCB2aWV3SWQsIHRva2Vucyxcblx0XHRwcmVjZWRpbmdMZW5ndGggPSAwLFxuXHRcdGVtcHR5VmlldyA9IHByZXZOb2RlID09PSBuZXh0Tm9kZTtcblxuXHRpZiAocHJldk5vZGUpIHtcblx0XHQvLyBwcmV2Tm9kZSBpcyBlaXRoZXIgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXdPclRhZywgb3IgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHZ3SW5mb3MgdG9rZW5zIHN0cmluZ1xuXHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3MocHJldk5vZGUpIHx8IFtdO1xuXHRcdGZvciAoaSA9IDAsIGwgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gU3RlcCB0aHJvdWdoIHZpZXdzIG9yIHRhZ3Mgb24gdGhlIHByZXZOb2RlXG5cdFx0XHR2d0luZm8gPSB2d0luZm9zW2ldO1xuXHRcdFx0dmlld0lkID0gdndJbmZvLmlkO1xuXHRcdFx0aWYgKHZpZXdJZCA9PT0gaWQgJiYgdndJbmZvLmNoID09PSB2aWV3T3JUYWdDaGFyKSB7XG5cdFx0XHRcdGlmIChyZWZyZXNoKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyB2aWV3T3JUYWdUb1JlZnJlc2gsIHRoaXMgaXMgdGhlIGxhc3Qgdmlld09yVGFnIHRvIHByb2Nlc3MuLi5cblx0XHRcdFx0XHRsID0gMDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIHZpZXdPclRhZ1RvUmVtb3ZlLCBzbyB3ZSBhcmUgZG9uZS4uLlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWVtcHR5Vmlldykge1xuXHRcdFx0XHR2aWV3T3JUYWcgPSB2d0luZm8uY2ggPT09IFwiX1wiXG5cdFx0XHRcdFx0PyB2aWV3U3RvcmVbdmlld0lkXVxuXHRcdFx0XHRcdDogYmluZGluZ1N0b3JlW3ZpZXdJZF0ubGlua0N0eC50YWc7XG5cdFx0XHRcdGlmICh2d0luZm8ub3Blbikge1xuXHRcdFx0XHRcdC8vIEEgXCIjbVwiIHRva2VuXG5cdFx0XHRcdFx0dmlld09yVGFnLl9wcnYgPSBuZXh0Tm9kZTtcblx0XHRcdFx0fSBlbHNlIGlmICh2d0luZm8uY2xvc2UpIHtcblx0XHRcdFx0XHQvLyBBIFwiL21cIiB0b2tlblxuXHRcdFx0XHRcdHZpZXdPclRhZy5fbnh0ID0gbmV4dE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHByZWNlZGluZ0xlbmd0aCArPSB2aWV3SWQubGVuZ3RoICsgMjtcblx0XHR9XG5cblx0XHRpZiAocHJlY2VkaW5nTGVuZ3RoKSB7XG5cdFx0XHRwcmV2Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgcHJldk5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpLnNsaWNlKHByZWNlZGluZ0xlbmd0aCkpO1xuXHRcdH1cblx0XHR0b2tlbnMgPSBuZXh0Tm9kZSA/IG5leHROb2RlLmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKSA6IHBhcmVudEVsZW0uX2RmO1xuXHRcdGlmIChsID0gdG9rZW5zLmluZGV4T2YoXCIvXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpICsgMSkge1xuXHRcdFx0dG9rZW5zID0gdndJbmZvcy5fdGtucy5zbGljZSgwLCBwcmVjZWRpbmdMZW5ndGgpICsgdG9rZW5zLnNsaWNlKGwgKyAocmVmcmVzaCA/IC0xIDogaWQubGVuZ3RoICsgMSkpO1xuXHRcdH1cblx0XHRpZiAodG9rZW5zKSB7XG5cdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0Ly8gSWYgdmlld09yVGFnVG9SZW1vdmUgd2FzIGFuIGVtcHR5IHZpZXdPclRhZywgd2Ugd2lsbCByZW1vdmUgYm90aCAjbiBhbmQgL25cblx0XHRcdFx0Ly8gKGFuZCBhbnkgaW50ZXJ2ZW5pbmcgdG9rZW5zKSBmcm9tIHRoZSBuZXh0Tm9kZSAoPT09IHByZXZOb2RlKVxuXHRcdFx0XHQvLyBJZiB2aWV3T3JUYWdUb1JlbW92ZSB3YXMgbm90IGVtcHR5LCB3ZSB3aWxsIHRha2UgdG9rZW5zIHByZWNlZGluZyAjbiBmcm9tIHByZXZOb2RlLFxuXHRcdFx0XHQvLyBhbmQgY29uY2F0ZW5hdGUgd2l0aCB0b2tlbnMgZm9sbG93aW5nIC9uIG9uIG5leHROb2RlXG5cdFx0XHRcdG5leHROb2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCB0b2tlbnMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgdG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gIXByZXZOb2RlLCBzbyB0aGVyZSBtYXkgYmUgYSBkZWZlcnJlZCBub2RlcyB0b2tlbiBvbiB0aGUgcGFyZW50RWxlbS4gUmVtb3ZlIGl0LlxuXHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIjXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpKTtcblx0XHRpZiAoIXJlZnJlc2ggJiYgIW5leHROb2RlKSB7XG5cdFx0XHQvLyBJZiB0aGlzIHZpZXdPclRhZyBpcyBiZWluZyByZW1vdmVkLCBhbmQgdGhlcmUgd2FzIG5vIC5ueHQsIHJlbW92ZSBjbG9zaW5nIHRva2VuIGZyb20gZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiL1wiICsgaWQgKyB2aWV3T3JUYWdDaGFyKSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRpc3Bvc2VUb2tlbnModG9rZW5zKSB7XG5cdHZhciBpLCBsLCB2d0l0ZW0sIHZ3SW5mb3M7XG5cdGlmICh2d0luZm9zID0gdmlld0luZm9zKHRva2VucywgdHJ1ZSwgck9wZW5NYXJrZXJzKSkge1xuXHRcdGZvciAoaSA9IDAsIGwgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dndJdGVtID0gdndJbmZvc1tpXTtcblx0XHRcdGlmICh2d0l0ZW0uY2ggPT09IFwiX1wiKSB7XG5cdFx0XHRcdGlmICgodndJdGVtID0gdmlld1N0b3JlW3Z3SXRlbS5pZF0pICYmIHZ3SXRlbS50eXBlKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhpcyBpcyB0aGUgX3BydiAocHJldk5vZGUpIGZvciBhIHZpZXcsIHJlbW92ZSB0aGUgdmlld1xuXHRcdFx0XHRcdC8vIC0gdW5sZXNzIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgaXQgaXMgYWxyZWFkeSBiZWluZyByZW1vdmVkXG5cdFx0XHRcdFx0dndJdGVtLnBhcmVudC5yZW1vdmVWaWV3cyh2d0l0ZW0uXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKHZ3SXRlbS5pZCk7IC8vIHVuYmluZCBiaW5kaW5ncyB3aXRoIHRoaXMgYmluZGluZ0lkIG9uIHRoaXMgdmlld1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQWRkIGxpbmsgbWV0aG9kcyB0byBkYXRhLWxpbmtlZCB2aWV3IG9yIHRhZ1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIGFkZExpbmtNZXRob2RzKHRhZ09yVmlldywgaXNUYWcpIHtcblxuXHR0YWdPclZpZXcuY29udGVudHMgPSBmdW5jdGlvbihkZWVwLCBzZWxlY3QpIHtcblx0XHQvLyBGb3IgYSB2aWV3IG9yIGEgdGFnLCByZXR1cm4galF1ZXJ5IG9iamVjdCB3aXRoIHRoZSBjb250ZW50IG5vZGVzLFxuXHRcdGlmIChkZWVwICE9PSAhIWRlZXApIHtcblx0XHRcdC8vIGRlZXAgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgY29udGVudHMoc2VsZWN0b3IpXG5cdFx0XHRzZWxlY3QgPSBkZWVwO1xuXHRcdFx0ZGVlcCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dmFyIGZpbHRlcmVkLFxuXHRcdFx0bm9kZXMgPSAkKHRoaXMubm9kZXMoKSk7XG5cdFx0aWYgKG5vZGVzWzBdKSB7XG5cdFx0XHRmaWx0ZXJlZCA9IHNlbGVjdCA/IG5vZGVzLmZpbHRlcihzZWxlY3QpIDogbm9kZXM7XG5cdFx0XHRub2RlcyA9IGRlZXAgJiYgc2VsZWN0ID8gZmlsdGVyZWQuYWRkKG5vZGVzLmZpbmQoc2VsZWN0KSkgOiBmaWx0ZXJlZDtcblx0XHR9XG5cdFx0cmV0dXJuIG5vZGVzO1xuXHR9O1xuXG5cdHRhZ09yVmlldy5ub2RlcyA9IGZ1bmN0aW9uKHdpdGhNYXJrZXJzLCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0XHQvLyBGb3IgYSB2aWV3IG9yIGEgdGFnLCByZXR1cm4gdG9wLWxldmVsIG5vZGVzXG5cdFx0Ly8gRG8gbm90IHJldHVybiBhbnkgc2NyaXB0IG1hcmtlciBub2RlcywgdW5sZXNzIHdpdGhNYXJrZXJzIGlzIHRydWVcblx0XHQvLyBPcHRpb25hbGx5IGxpbWl0IHJhbmdlLCBieSBwYXNzaW5nIGluIHByZXZOb2RlIG9yIG5leHROb2RlIHBhcmFtZXRlcnNcblxuXHRcdHZhciBub2RlLFxuXHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRlbENudCA9IHNlbGYuX2VsQ250LFxuXHRcdFx0cHJldklzRmlyc3ROb2RlID0gIXByZXZOb2RlICYmIGVsQ250LFxuXHRcdFx0bm9kZXMgPSBbXTtcblxuXHRcdHByZXZOb2RlID0gcHJldk5vZGUgfHwgc2VsZi5fcHJ2O1xuXHRcdG5leHROb2RlID0gbmV4dE5vZGUgfHwgc2VsZi5fbnh0O1xuXG5cdFx0bm9kZSA9IHByZXZJc0ZpcnN0Tm9kZVxuXHRcdFx0PyAocHJldk5vZGUgPT09IHNlbGYuX254dFxuXHRcdFx0XHQ/IHNlbGYucGFyZW50RWxlbS5sYXN0U2libGluZ1xuXHRcdFx0XHQ6IHByZXZOb2RlKVxuXHRcdFx0OiAoc2VsZi5fLmlubGluZSA9PT0gZmFsc2Vcblx0XHRcdFx0PyBwcmV2Tm9kZSB8fCBzZWxmLmxpbmtDdHguZWxlbS5maXJzdENoaWxkXG5cdFx0XHRcdDogcHJldk5vZGUgJiYgcHJldk5vZGUubmV4dFNpYmxpbmcpO1xuXG5cdFx0d2hpbGUgKG5vZGUgJiYgKCFuZXh0Tm9kZSB8fCBub2RlICE9PSBuZXh0Tm9kZSkpIHtcblx0XHRcdGlmICh3aXRoTWFya2VycyB8fCBlbENudCB8fCBub2RlLnRhZ05hbWUgIT09IFNDUklQVCkge1xuXHRcdFx0XHQvLyBBbGwgdGhlIHRvcC1sZXZlbCBub2RlcyBpbiB0aGUgdmlld1xuXHRcdFx0XHQvLyAoZXhjZXB0IHNjcmlwdCBtYXJrZXIgbm9kZXMsIHVubGVzcyB3aXRoTWFya2VycyA9IHRydWUpXG5cdFx0XHRcdC8vIChOb3RlOiBJZiBhIHNjcmlwdCBtYXJrZXIgbm9kZSwgdmlld0luZm8uZWxDbnQgdW5kZWZpbmVkKVxuXHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHRcdHJldHVybiBub2Rlcztcblx0fTtcblxuXHR0YWdPclZpZXcuY2hpbGRUYWdzID0gZnVuY3Rpb24oZGVlcCwgdGFnTmFtZSkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiBjaGlsZCB0YWdzIC0gYXQgYW55IGRlcHRoLCBvciBhcyBpbW1lZGlhdGUgY2hpbGRyZW4gb25seS5cblx0XHRpZiAoZGVlcCAhPT0gISFkZWVwKSB7XG5cdFx0XHQvLyBkZWVwIG5vdCBib29sZWFuLCBzbyB0aGlzIGlzIGNoaWxkVGFncyh0YWdOYW1lKSAtIHdoaWNoIGxvb2tzIGZvciB0b3AtbGV2ZWwgdGFncyBvZiBnaXZlbiB0YWdOYW1lXG5cdFx0XHR0YWdOYW1lID0gZGVlcDtcblx0XHRcdGRlZXAgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0dmlldyA9IHNlbGYubGluayA/IHNlbGYgOiBzZWxmLnRhZ0N0eC52aWV3LCAvLyB0aGlzIG1heSBiZSBhIHZpZXcgb3IgYSB0YWcuIElmIGEgdGFnLCBnZXQgdGhlIHZpZXcgZnJvbSB0YWcudmlldy50YWdDdHhcblx0XHRcdHByZXZOb2RlID0gc2VsZi5fcHJ2LFxuXHRcdFx0ZWxDbnQgPSBzZWxmLl9lbENudCxcblx0XHRcdHRhZ3MgPSBbXTtcblxuXHRcdHZpZXcubGluayhcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHNlbGYucGFyZW50RWxlbSxcblx0XHRcdGVsQ250ID8gcHJldk5vZGUgJiYgcHJldk5vZGUucHJldmlvdXNTaWJsaW5nIDogcHJldk5vZGUsXG5cdFx0XHRzZWxmLl9ueHQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR7Z2V0Ontcblx0XHRcdFx0dGFnczogdGFncyxcblx0XHRcdFx0ZGVlcDogZGVlcCxcblx0XHRcdFx0bmFtZTogdGFnTmFtZSxcblx0XHRcdFx0aWQ6IHNlbGYubGluayA/IHNlbGYuXy5pZCArIFwiX1wiIDogc2VsZi5fdGdJZCArIFwiXlwiXG5cdFx0XHR9fVxuXHRcdCk7XG5cdFx0cmV0dXJuIHRhZ3M7XG5cdH07XG5cblx0dGFnT3JWaWV3LnJlZnJlc2ggPSBmdW5jdGlvbihzb3VyY2VWYWx1ZSkge1xuXHRcdHZhciBwcm9taXNlLCBhdHRyLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGxpbmtDdHggPSB0YWcubGlua0N0eCxcblx0XHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXc7XG5cblx0XHRpZiAodGFnLmRpc3Bvc2VkKSB7IGVycm9yKFwiUmVtb3ZlZCB0YWdcIik7IH1cblx0XHRpZiAoc291cmNlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c291cmNlVmFsdWUgPSAkc3ViLl90YWcodGFnLCB2aWV3LCB2aWV3LnRtcGwsIG1lcmdlQ3R4cyh0YWcpLCB0cnVlKTsgLy8gR2V0IHJlbmRlcmVkIEhUTUwgZm9yIHRhZywgYmFzZWQgb24gcmVmcmVzaGVkIHRhZ0N0eHNcblx0XHR9XG5cdFx0aWYgKHNvdXJjZVZhbHVlICsgXCJcIiA9PT0gc291cmNlVmFsdWUpIHtcblx0XHRcdC8vIElmIG5vIHJlbmRlcmVkIGNvbnRlbnQsIHNvdXJjZVZhbHVlIHdpbGwgbm90IGJlIGEgc3RyaW5nIChjYW4gYmUgMCBvciB1bmRlZmluZWQpXG5cdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdHRhZy5vblVuYmluZCh0YWcudGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4KTtcblx0XHRcdH1cblx0XHRcdGF0dHIgPSB0YWcuXy5pbmxpbmUgPyBIVE1MIDogKGxpbmtDdHguYXR0ciB8fCBkZWZhdWx0QXR0cih0YWcucGFyZW50RWxlbSwgdHJ1ZSkpO1xuXHRcdFx0cHJvbWlzZSA9IHVwZGF0ZUNvbnRlbnQoc291cmNlVmFsdWUsIGxpbmtDdHgsIGF0dHIsIHRhZyk7XG5cdFx0fVxuXG5cdFx0Y2FsbEFmdGVyTGluayh0YWcpO1xuXHRcdHJldHVybiBwcm9taXNlIHx8IHRhZztcblx0fTtcblxuXHR0YWdPclZpZXcudXBkYXRlID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHR2YXIgbGlua2VkRWxlbSA9IHRoaXMubGlua2VkRWxlbTtcblx0XHRpZiAobGlua2VkRWxlbSkge1xuXHRcdFx0ZWxlbUNoYW5nZUhhbmRsZXIoe1xuXHRcdFx0XHR0YXJnZXQ6IGxpbmtlZEVsZW1bMF1cblx0XHRcdH0sIHVuZGVmaW5lZCwgdmFsdWUpO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoaXNUYWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgVEFHXG5cdFx0dGFnT3JWaWV3LmRvbUNoYW5nZSA9IGZ1bmN0aW9uKCkgeyAvLyBkb21DaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnRcblx0XHRcdHZhciBlbGVtID0gdGhpcy5wYXJlbnRFbGVtLFxuXHRcdFx0XHRoYXNMaXN0ZW5lciA9ICQuaGFzRGF0YShlbGVtKSAmJiAkLl9kYXRhKGVsZW0pLmV2ZW50cyxcblx0XHRcdFx0ZG9tQ2hhbmdlTm90aWZpY2F0aW9uID0gXCJqc3YtZG9tY2hhbmdlXCI7XG5cblx0XHRcdGlmIChoYXNMaXN0ZW5lciAmJiBoYXNMaXN0ZW5lcltkb21DaGFuZ2VOb3RpZmljYXRpb25dKSB7XG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciBoYW5kbGVyIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBsaXN0ZW5pbmcgZm9yIHRoaXMgZXZlbnQuIChOb3RlIHVzaW5nIHRyaWdnZXJIYW5kbGVyIC0gc28gbm8gZXZlbnQgYnViYmxpbmcuKVxuXHRcdFx0XHQkKGVsZW0pLnRyaWdnZXJIYW5kbGVyKGRvbUNoYW5nZU5vdGlmaWNhdGlvbiwgYXJndW1lbnRzKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSBWSUVXXG5cdFx0Ly8gTm90ZTogYSBsaW5rZWQgdmlldyB3aWxsIGFsc28sIGFmdGVyIGxpbmtpbmcgaGF2ZSBub2Rlc1tdLCBfcHJ2IChwcmV2Tm9kZSksIF9ueHQgKG5leHROb2RlKSAuLi5cblx0XHR0YWdPclZpZXcuYWRkVmlld3MgPSBmdW5jdGlvbihpbmRleCwgZGF0YUl0ZW1zKSB7XG5cdFx0XHQvLyBpZiB2aWV3IGlzIG5vdCBhbiBhcnJheSB2aWV3LCBkbyBub3RoaW5nXG5cdFx0XHR2YXIgaSwgdmlld3NDb3VudCxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdGl0ZW1zQ291bnQgPSBkYXRhSXRlbXMubGVuZ3RoLFxuXHRcdFx0XHR2aWV3cyA9IHNlbGYudmlld3M7XG5cblx0XHRcdGlmICghc2VsZi5fLnVzZUtleSAmJiBpdGVtc0NvdW50KSB7XG5cdFx0XHRcdC8vIHZpZXcgaXMgb2YgdHlwZSBcImFycmF5XCJcblx0XHRcdFx0dmlld3NDb3VudCA9IHZpZXdzLmxlbmd0aCArIGl0ZW1zQ291bnQ7XG5cblx0XHRcdFx0aWYgKHZpZXdzQ291bnQgPT09IHNlbGYuZGF0YS5sZW5ndGggLy8gSWYgdmlld3Mgbm90IGFscmVhZHkgc3luY2VkIHRvIGFycmF5IChlLmcuIHRyaWdnZXJlZCBieSBhcnJheS5sZW5ndGggcHJvcGVydHlDaGFuZ2UgLSBqc3ZpZXdzL2lzc3Vlcy8zMDEpXG5cdFx0XHRcdFx0XHQmJiByZW5kZXJBbmRMaW5rKHNlbGYsIGluZGV4LCBzZWxmLnRtcGwsIHZpZXdzLCBkYXRhSXRlbXMsIHNlbGYuY3R4KSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRpZiAoIXNlbGYuXy5zcnQpIHsgLy8gTm90IHBhcnQgb2YgYSAnc29ydCcgb24gcmVmcmVzaFxuXHRcdFx0XHRcdFx0c2VsZi5maXhJbmRleChpbmRleCArIGl0ZW1zQ291bnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0YWdPclZpZXcucmVtb3ZlVmlld3MgPSBmdW5jdGlvbihpbmRleCwgaXRlbXNDb3VudCwga2VlcE5vZGVzLCBpc01vdmUpIHtcblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoKSByZW1vdmVzIGFsbCB0aGUgY2hpbGQgdmlld3Ncblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoaW5kZXgpIHJlbW92ZXMgdGhlIGNoaWxkIHZpZXcgd2l0aCBzcGVjaWZpZWQgaW5kZXggb3Iga2V5XG5cdFx0XHQvLyB2aWV3LnJlbW92ZVZpZXdzKGluZGV4LCBjb3VudCkgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG51bW1iZXIgb2YgY2hpbGQgdmlld3MsIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleFxuXHRcdFx0ZnVuY3Rpb24gcmVtb3ZlVmlldyhpbmRleCkge1xuXHRcdFx0XHR2YXIgaWQsIGJpbmRJZCwgcGFyZW50RWxlbSwgcHJldk5vZGUsIG5leHROb2RlLCBub2Rlc1RvUmVtb3ZlLFxuXHRcdFx0XHRcdHZpZXdUb1JlbW92ZSA9IHZpZXdzW2luZGV4XTtcblxuXHRcdFx0XHRpZiAodmlld1RvUmVtb3ZlICYmIHZpZXdUb1JlbW92ZS5saW5rKSB7XG5cdFx0XHRcdFx0aWQgPSB2aWV3VG9SZW1vdmUuXy5pZDtcblx0XHRcdFx0XHRpZiAoIWtlZXBOb2Rlcykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBIVE1MIG5vZGVzIGZyb20gdGhlIERPTSwgdW5sZXNzIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgaW5jbHVkaW5nIG5vZGVzIG9mIGNoaWxkIHZpZXdzXG5cdFx0XHRcdFx0XHRub2Rlc1RvUmVtb3ZlID0gdmlld1RvUmVtb3ZlLm5vZGVzKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXdzLCB3aXRob3V0IHJlbW92aW5nIG5vZGVzXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlLnJlbW92ZVZpZXdzKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcblxuXHRcdFx0XHRcdHZpZXdUb1JlbW92ZS50eXBlID0gdW5kZWZpbmVkOyAvLyBTZXQgdHlwZSB0byB1bmRlZmluZWQ6IHVzZWQgYXMgYSBmbGFnIHRoYXQgdGhpcyB2aWV3IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHRwcmV2Tm9kZSA9IHZpZXdUb1JlbW92ZS5fcHJ2O1xuXHRcdFx0XHRcdG5leHROb2RlID0gdmlld1RvUmVtb3ZlLl9ueHQ7XG5cdFx0XHRcdFx0cGFyZW50RWxlbSA9IHZpZXdUb1JlbW92ZS5wYXJlbnRFbGVtO1xuXHRcdFx0XHRcdC8vIElmIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBhcmUgdGhlIHNhbWUsIHRoZSB2aWV3IGlzIGVtcHR5XG5cdFx0XHRcdFx0aWYgKCFrZWVwTm9kZXMpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgSFRNTCBub2RlcyBmcm9tIHRoZSBET00sIHVubGVzcyB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIGluY2x1ZGluZyBub2RlcyBvZiBjaGlsZCB2aWV3c1xuXHRcdFx0XHRcdFx0aWYgKHZpZXdUb1JlbW92ZS5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaWYga2VlcE5vZGVzIGlzIGZhbHNlIChhbmQgdHJhbnNmZXJyaW5nIG9mIHRva2VucyBoYXMgbm90IGFscmVhZHkgYmVlbiBkb25lIGF0IGEgaGlnaGVyIGxldmVsKVxuXHRcdFx0XHRcdFx0XHQvLyB0aGVuIHRyYW5zZmVyIHRva2VucyBmcm9tIHByZXZOb2RlIHdoaWNoIGlzIGJlaW5nIHJlbW92ZWQsIHRvIG5leHROb2RlLlxuXHRcdFx0XHRcdFx0XHR0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnRFbGVtLCBpZCwgXCJfXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCF2aWV3VG9SZW1vdmUuX2VsQ250KSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRwcmV2Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHByZXZOb2RlKTsgLy8gKHByZXZOb2RlLnBhcmVudE5vZGUgaXMgcGFyZW50RWxlbSwgZXhjZXB0IGlmIGpRdWVyeSBNb2JpbGUgb3Igc2ltaWxhciBoYXMgaW5zZXJ0ZWQgYW4gaW50ZXJtZWRpYXRlIHdyYXBwZXJcblx0XHRcdFx0XHRcdFx0bmV4dE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsodmlld1RvUmVtb3ZlKTtcblx0XHRcdFx0XHRmb3IgKGJpbmRJZCBpbiB2aWV3VG9SZW1vdmUuXy5ibmRzKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3QmluZGluZyhiaW5kSWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkZWxldGUgdmlld1N0b3JlW2lkXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY3VycmVudCwgdmlldywgdmlld3NDb3VudCxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdGlzQXJyYXkgPSAhc2VsZi5fLnVzZUtleSxcblx0XHRcdFx0dmlld3MgPSBzZWxmLnZpZXdzO1xuXG5cdFx0XHRpZiAoaXNBcnJheSkge1xuXHRcdFx0XHR2aWV3c0NvdW50ID0gdmlld3MubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIGFsbCBjaGlsZCB2aWV3c1xuXHRcdFx0XHRpZiAoaXNBcnJheSkge1xuXHRcdFx0XHRcdC8vIHZpZXdzIGFuZCBkYXRhIGFyZSBhcnJheXNcblx0XHRcdFx0XHRjdXJyZW50ID0gdmlld3NDb3VudDtcblx0XHRcdFx0XHR3aGlsZSAoY3VycmVudC0tKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGN1cnJlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZWxmLnZpZXdzID0gW107XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdmlld3MgYW5kIGRhdGEgYXJlIG9iamVjdHNcblx0XHRcdFx0XHRmb3IgKHZpZXcgaW4gdmlld3MpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBieSBrZXlcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXcodmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGYudmlld3MgPSB7fTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGl0ZW1zQ291bnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgcGFyZW50VmlldyBpcyBkYXRhIGFycmF5IHZpZXcuXG5cdFx0XHRcdFx0XHQvLyBTZXQgaXRlbXNDb3VudCB0byAxLCB0byByZW1vdmUgdGhpcyBpdGVtXG5cdFx0XHRcdFx0XHRpdGVtc0NvdW50ID0gMTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXcgd2l0aCBrZXkgJ2luZGV4J1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyhpbmRleCk7XG5cdFx0XHRcdFx0XHRkZWxldGUgdmlld3NbaW5kZXhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaXNBcnJheSAmJiBpdGVtc0NvdW50XG5cdFx0XHRcdFx0JiYgKGlzTW92ZSB8fCB2aWV3c0NvdW50IC0gaXRlbXNDb3VudCA9PT0gc2VsZi5kYXRhLmxlbmd0aCkpIHsgLy8gSWYgdmlld3Mgbm90IGFscmVhZHkgc3luY2VkIHRvIGFycmF5IChlLmcuIHRyaWdnZXJlZCBieSBhcnJheS5sZW5ndGggcHJvcGVydHlDaGFuZ2UgLSBqc3ZpZXdzL2lzc3Vlcy8zMDEpXG5cdFx0XHRcdFx0Y3VycmVudCA9IGluZGV4ICsgaXRlbXNDb3VudDtcblx0XHRcdFx0XHQvLyBSZW1vdmUgaW5kZXhlZCBpdGVtcyAocGFyZW50VmlldyBpcyBkYXRhIGFycmF5IHZpZXcpO1xuXHRcdFx0XHRcdHdoaWxlIChjdXJyZW50LS0gPiBpbmRleCkge1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyhjdXJyZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmlld3Muc3BsaWNlKGluZGV4LCBpdGVtc0NvdW50KTtcblx0XHRcdFx0XHRpZiAoIXNlbGYuXy5zb3J0KSB7XG5cdFx0XHRcdFx0XHRzZWxmLmZpeEluZGV4KGluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0cGFyZW50ID0gc2VsZi5wYXJlbnQ7XG5cblx0XHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdFx0cmVuZGVyQW5kTGluayhzZWxmLCBzZWxmLmluZGV4LCBzZWxmLnRtcGwsIHBhcmVudC52aWV3cywgc2VsZi5kYXRhLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsoc2VsZik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5maXhJbmRleCA9IGZ1bmN0aW9uKGZyb21JbmRleCkge1xuXHRcdFx0Ly8gRml4dXAgaW5kZXggb24gZm9sbG93aW5nIHZpZXcgaXRlbXMuLi5cblx0XHRcdHZhciB2aWV3cyA9IHRoaXMudmlld3MsXG5cdFx0XHRcdGluZGV4ID0gdmlld3MubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGZyb21JbmRleCA8IGluZGV4LS0pIHtcblx0XHRcdFx0aWYgKHZpZXdzW2luZGV4XS5pbmRleCAhPT0gaW5kZXgpIHtcblx0XHRcdFx0XHQkb2JzZXJ2YWJsZSh2aWV3c1tpbmRleF0pLnNldFByb3BlcnR5KFwiaW5kZXhcIiwgaW5kZXgpO1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgZml4aW5nIHVwIGluZGV4LCBidXQgbm90IGtleSwgYW5kIG5vdCBpbmRleCBvbiBjaGlsZCB2aWV3cy4gRnJvbSBjaGlsZCB2aWV3cywgdXNlIHZpZXcuZ2V0SW5kZXgoKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5saW5rID0gdmlld0xpbms7XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzVmlld3Mtc3BlY2lmaWMgY29udmVydGVyc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT1cblxuJGNvbnZlcnRlcnMubWVyZ2UgPSBmdW5jdGlvbih2YWwpIHtcblx0Ly8gU3BlY2lhbCBjb252ZXJ0ZXIgdXNlZCBpbiBkYXRhLWxpbmtpbmcgdG8gc3BhY2Utc2VwYXJhdGVkIGxpc3RzLCBzdWNoIGFzIGNsYXNzTmFtZTpcblx0Ly8gQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdG9nZ2xlIHNlbWFudGljcyAtIGFuZCBoYXMgbm8gZWZmZWN0IGlmIHRvZ2dsZSBzdHJpbmcgaXMgbm90IHNwZWNpZmllZFxuXHQvLyBkYXRhLWxpbms9XCJjbGFzc3ttZXJnZTpib29sRXhwciB0b2dnbGU9Y2xhc3NOYW1lfVwiXG5cdHZhciByZWd1bGFyRXhwcmVzc2lvbixcblx0XHRjdXJyZW50VmFsdWUgPSB0aGlzLmxpbmtDdHguX3ZhbCB8fCBcIlwiLFxuXHRcdHRvZ2dsZSA9IHRoaXMudGFnQ3R4LnByb3BzLnRvZ2dsZTtcblxuXHRpZiAodG9nZ2xlKSB7XG5cdFx0Ly8gV2UgYXJlIHRvZ2dsaW5nIHRoZSBjbGFzcyBzcGVjaWZpZWQgYnkgdGhlIHRvZ2dsZSBwcm9wZXJ0eSxcblx0XHQvLyBhbmQgdGhlIGJvb2xlYW4gdmFsIGJpbmRpbmcgaXMgZHJpdmluZyB0aGUgaW5zZXJ0L3JlbW92ZSB0b2dnbGVcblxuXHRcdHJlZ3VsYXJFeHByZXNzaW9uID0gdG9nZ2xlLnJlcGxhY2UoL1tcXFxcXiQufD8qKygpW3tdL2csIFwiXFxcXCQmXCIpO1xuXHRcdC8vIEVzY2FwZSBhbnkgcmVndWxhciBleHByZXNzaW9uIHNwZWNpYWwgY2hhcmFjdGVycyAobWV0YWNoYXJhY3RlcnMpIHdpdGhpbiB0aGUgdG9nZ2xlIHN0cmluZ1xuXHRcdHJlZ3VsYXJFeHByZXNzaW9uID0gXCIoXFxcXHMoPz1cIiArIHJlZ3VsYXJFeHByZXNzaW9uICsgXCIkKXwoXFxcXHMpfF4pKFwiICsgcmVndWxhckV4cHJlc3Npb24gKyBcIihcXFxcc3wkKSlcIjtcblx0XHQvLyBFeGFtcGxlOiAvKFxccyg/PW15Y2xhc3MkKXwoXFxzKXxeKT8obXljbGFzcyhcXHN8JCkpLyAtIHNvIG1hdGNoZXMgKFwiIG15Y2xhc3NcIiBvciBcIiBcIiBvciBeICkgZm9sbG93ZWQgYnkgKFwibXljbGFzcyBcIiBvciBcIm15Y2xhc3MkXCIpIHdoZXJlIF4vJCBhcmUgYmVnaW5uaW5nL2VuZCBvZiBzdHJpbmdcblx0XHRjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKHJlZ3VsYXJFeHByZXNzaW9uKSwgXCIkMlwiKTtcblx0XHR2YWwgPSBjdXJyZW50VmFsdWUgKyAodmFsID8gKGN1cnJlbnRWYWx1ZSAmJiBcIiBcIikgKyB0b2dnbGUgOiBcIlwiKTtcblx0fVxuXHRyZXR1cm4gdmFsO1xufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzVmlld3Mtc3BlY2lmaWMgdGFnc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24ga2VlcFBhcmVudERhdGFDdHgodmFsKSB7XG5cdHJldHVybiB0aGlzLnRhZ0N0eC52aWV3OyAvLyBSZXR1cm4gdGhlIHBhcmVudCB2aWV3IGFzIGRhdGEgY29udGV4dCBmb3IgcmVuZGVyaW5nIGJsb2NrIGNvbnRlbnRcbn1cblxuJHRhZ3Moe1xuXHRvbjoge1xuXHRcdGF0dHI6IE5PTkUsXG5cdFx0aW5pdDogZnVuY3Rpb24odGFnQ3R4KSB7XG5cdFx0XHR2YXIgY29udGVudCxcblx0XHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGFyZ3MgPSB0YWdDdHguYXJncywgLy8gW2V2ZW50cyxdIFtzZWxlY3RvcixdIGhhbmRsZXJcblx0XHRcdFx0bCA9IGFyZ3MubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKDsgaTxsICYmICEkaXNGdW5jdGlvbihhcmdzW2ldKTsgaSsrKTsgLy8gSGFuZGxlciBpcyBmaXJzdCBhcmcgb2YgdHlwZSBmdW5jdGlvblxuXHRcdFx0dGFnLl9oaSA9IGw+aSAmJiBpKzE7IC8vIGhhbmRsZXIgaW5kZXhcblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0aWYgKCEkc3ViLnJUbXBsLmV4ZWMoY29udGVudCA9IHRhZ0N0eC50bXBsLm1hcmt1cCkpIHtcblx0XHRcdFx0XHQvLyBJbmxpbmUge157b259fSB0YWcgd2l0aCBubyBjb250ZW50IChvciBleHRlcm5hbCB0ZW1wbGF0ZSBjb250ZW50KSBvciB3aXRoIGNvbnRlbnQgY29udGFpbmluZ1xuXHRcdFx0XHRcdC8vIG5vIEhUTUwgb3IgSnNSZW5kZXIgdGFnczogV2Ugd2lsbCB3cmFwIHRoZSAodGV4dCkgY29udGVudCwgb3IgdGhlIG9wZXJhdGlvbiBuYW1lIGluIGEgPGJ1dHRvbj4gZWxlbWVudFxuXHRcdFx0XHRcdC8vIChPdGhlcndpc2Ugd2Ugd2lsbCBhdHRhY2ggdGhlIGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQgY29udGVudCBhZnRlciBkYXRhLWxpbmtpbmcpXG5cdFx0XHRcdFx0dGFnLnRlbXBsYXRlID0gXCI8YnV0dG9uPlwiICsgKCQudHJpbShjb250ZW50KSB8fCB0YWdDdHgucGFyYW1zLmFyZ3NbaV0gfHwgXCJub29wXCIpICsgXCI8L2J1dHRvbj5cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YWcuYXR0ciA9IEhUTUw7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbkFmdGVyTGluazogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0XHR2YXIgaGFuZGxlciwgcGFyYW1zLCBmaW5kLCBhY3RpdmVFbGVtLFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHRpID0gdGFnLl9oaSxcblx0XHRcdFx0YXJncyA9IHRhZ0N0eC5hcmdzLCAvLyBbZXZlbnRzLF0gW3NlbGVjdG9yLF0gaGFuZGxlclxuXHRcdFx0XHRsID0gYXJncy5sZW5ndGgsXG5cdFx0XHRcdHByb3BzID0gdGFnQ3R4LnByb3BzLFxuXHRcdFx0XHRkYXRhID0gcHJvcHMuZGF0YSxcblx0XHRcdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdFx0XHRjb250ZXh0T2IgPSBwcm9wcy5jb250ZXh0OyAvLyBDb250ZXh0ICgndGhpcycgcG9pbnRlcikgZm9yIGF0dGFjaGVkIGhhbmRsZXJcblxuXHRcdFx0aWYgKGkpIHsgLy8gVGhlcmUgaXMgYSBoYW5kbGVyXG5cdFx0XHRcdGhhbmRsZXIgPSBhcmdzW2ktMV07XG5cdFx0XHRcdHBhcmFtcyA9IGFyZ3Muc2xpY2UoaSk7IC8vIFN1YnNlcXVlbnQgYXJncyBhcmUgcGFyYW1zXG5cdFx0XHRcdGFyZ3MgPSBhcmdzLnNsaWNlKDAsIGktMSk7IC8vIFByZWNlZGluZyBhcmdzIChpZiBhbnkpIGFyZSBldmVudHMgYW5kIHNlbGVjdG9yXG5cdFx0XHRcdHRhZy5fc2VsID0gYXJnc1sxXTsgLy8gU2VsZWN0b3IgZm9yIGRlc2NlbmRhbnQgZWxlbWVudHMgLSBmb3IgZGVsZWdhdGVkIGV2ZW50cyBvbiB0aG9zZSBlbGVtZW50cywgZGVsZWdhdGluZyB0byB0aGUgYWN0aXZlRWxlbVxuXG5cdFx0XHRcdGFjdGl2ZUVsZW0gPSB0YWcuYWN0aXZlRWxlbSA9IHRhZy5hY3RpdmVFbGVtIHx8ICQodGFnLl8uaW5saW5lXG5cdFx0XHRcdFx0PyAodGFnLl9zZWwgPSBhcmdzWzFdIHx8IFwiKlwiLCB0YWcucGFyZW50RWxlbSlcblx0XHRcdFx0XHQvLyBJZiBpbmxpbmUsIGF0dGFjaCB0byBjaGlsZCBlbGVtZW50cyBvZiB0YWcgcGFyZW50IGVsZW1lbnQgKGZpbHRlcmVkIGJ5IHNlbGVjdG9yIGFyZ3VtZW50IGlmIHByb3ZpZGVkLlxuXHRcdFx0XHRcdC8vIChJbiBoYW5kbGVyIHdlJ2xsIGZpbHRlciBvdXQgZXZlbnRzIGZyb20gc2libGluZyBlbGVtZW50cyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRhZy4pXG5cdFx0XHRcdFx0Ly8gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSBkZWxlZ2F0ZWQgcGF0dGVybiB3aGVyZSB0aGUgYXR0YWNoZWQgZXZlbnQgd29ya3MgZXZlbiBmb3IgYWRkZWQgZWxlbWVudHMgc2F0aXNmeWluZyB0aGUgc2VsZWN0b3Jcblx0XHRcdFx0XHQ6IGxpbmtDdHguZWxlbSk7XG5cblx0XHRcdFx0aWYgKCFjb250ZXh0T2IpIHtcblx0XHRcdFx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBwcmVjZWRpbmcgb2JqZWN0IChjb250ZXh0IG9iamVjdCkgb2YgaGFuZGxlciAod2hpY2ggaXMgdGhlIGxhc3QgYXJnKSwgY29tcGlsZSBmdW5jdGlvblxuXHRcdFx0XHRcdC8vIHRvIHJldHVybiB0aGF0IGNvbnRleHQgb2JqZWN0LCBhbmQgcnVuIGNvbXBpbGVkIGZ1bmN0aW9uIGFnYWluc3QgZGF0YVxuXHRcdFx0XHRcdGNvbnRleHRPYiA9IC9eKC4qKVtcXC5eXVtcXHckXSskLy5leGVjKHRhZ0N0eC5wYXJhbXMuYXJncy5zbGljZSgtcGFyYW1zLmxlbmd0aCAtIDEpWzBdKTtcblx0XHRcdFx0XHRjb250ZXh0T2IgPSBjb250ZXh0T2IgJiYgJHN1Yi50bXBsRm4oZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGNvbnRleHRPYlsxXSArIGRlbGltQ2xvc2VDaGFyMCwgdmlldy50bXBsLCB0cnVlKShsaW5rQ3R4LmRhdGEsIHZpZXcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRhZy5fZXZzKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY3RpdmVFbGVtLm9uKFxuXHRcdFx0XHRcdHRhZy5fZXZzID0gYXJnc1swXSB8fCBcImNsaWNrXCIsIC8vIGV2ZW50cyBkZWZhdWx0cyB0byBcImNsaWNrXCJcblx0XHRcdFx0XHR0YWcuX3NlbCxcblx0XHRcdFx0XHRkYXRhID09IHVuZGVmaW5lZCA/IG51bGwgOiBkYXRhLFxuXHRcdFx0XHRcdHRhZy5faGxyID0gZnVuY3Rpb24gaG5kbHIoZXYpIHtcblx0XHRcdFx0XHRcdHZhciBub2RlcywgbGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRmb3VuZCA9ICF0YWcuXy5pbmxpbmU7XG5cblx0XHRcdFx0XHRcdGlmICghZm91bmQpIHsgLy8gSWYgaW5saW5lLCBmaWx0ZXIgb3V0IGV2ZW50cyBmcm9tIHNpYmxpbmcgZWxlbWVudHMgcHJlY2VkaW5nIG9yIGZvbGxvd2luZyB0YWcuXG5cdFx0XHRcdFx0XHRcdG5vZGVzID0gdGFnLmNvbnRlbnRzKFwiKlwiKTtcblx0XHRcdFx0XHRcdFx0bCA9IG5vZGVzLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCFmb3VuZCAmJiBsLS0pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobm9kZXNbbF0uY29udGFpbnMoZXYudGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGZvdW5kKSB7IC8vIHRhcmdldCBlbGVtIGlzIGluZGVlZCB3aXRoaW4gdGhlIHRhZywgc28gY2FsbCB0aGUge29ufSBoYW5kbGVyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBoYW5kbGVyLmFwcGx5KGNvbnRleHRPYiB8fCBsaW5rQ3R4LmRhdGEsIFtdLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0XHRwYXJhbXMsIC8vIGUuZy4gcGFyMSwgcGFyMlxuXHRcdFx0XHRcdFx0XHRcdGV2LFxuXHRcdFx0XHRcdFx0XHRcdHtjaGFuZ2U6IGV2LnR5cGUsIHZpZXc6IHZpZXcsIGxpbmtDdHg6IGxpbmtDdHh9LFxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgLy8gSWYgdHJpZ2dlcmluZyBldmVudCAoZS5nLiBqc3YtZG9tY2hhbmdlKSBoYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgZXYsIHBhc3MgdGhlbSB0b29cblx0XHRcdFx0XHRcdFx0KSk7XG5cdFx0XHRcdFx0XHRcdC8vIGZvciB7b24gJ2NsaWNrJyBoYW5kbGVyIHBhcjEgcGFyMn0gdXNlIGhhbmRsZXIocGFyMSwgcGFyMiwgZXYsIGRvbWNoYW5nZUV2ZW50QXJncylcblx0XHRcdFx0XHRcdFx0Ly8gZm9yIHtvbiAnanN2LWRvbWNoYW5nZScgaGFuZGxlciBwYXIxIHBhcjJ9IHVzZSBoYW5kbGVyKHBhcjEsIHBhcjIsIGV2LCBkb21jaGFuZ2VFdmVudEFyZ3MsIHRhZ0N0eCwgbGlua0N0eCwgb2JzZXJ2YWJsZUV2ZW50QXJncylcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblVwZGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRvblVuYmluZDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHRpZiAoc2VsZi5hY3RpdmVFbGVtKSB7XG5cdFx0XHRcdHNlbGYuYWN0aXZlRWxlbS5vZmYoc2VsZi5fZXZzLCBzZWxmLl9zZWwsIHNlbGYuX2hscik7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRmbG93OiB0cnVlLFxuXHRcdGNvbnRlbnRDdHg6IGtlZXBQYXJlbnREYXRhQ3R4LFxuXHRcdGRhdGFCb3VuZE9ubHk6IHRydWVcblx0fSxcblx0cmFkaW9ncm91cDoge1xuXHRcdGluaXQ6IGZ1bmN0aW9uKHRhZ0N0eCkge1xuXHRcdFx0dGhpcy5uYW1lID0gdGFnQ3R4LnByb3BzLm5hbWUgfHwgKFwianN2XCIgKyBNYXRoLnJhbmRvbSgpKTtcblx0XHR9LFxuXHRcdG9uQmluZDogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0XHR2YXIgZG9tQ2huZ0NudG5yLFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHQkbGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtID0gKHRhZy5fLmlubGluZSA/IHRhZy5jb250ZW50cyh0cnVlLCBcImlucHV0W3R5cGU9cmFkaW9dXCIpIDogJChsaW5rQ3R4LmVsZW0pLmZpbmQoXCJpbnB1dFt0eXBlPXJhZGlvXVwiKSksXG5cdFx0XHRcdGwgPSAkbGlua2VkRWxlbS5sZW5ndGg7XG5cblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgb3duZWQgYnkgKHJlbmRlcmVkIGJ5KSB0aGlzIHRhZyAobm90IGJ5IGEgY2hpbGRUYWcgc3VjaCBhcyB7Xntmb3J9fSlcblx0XHRcdFx0Ly8gdXNlIGl0IGFzIGNvbnRhaW5lciBmb3IgZGV0ZWN0aW5nIGRvbSBjaGFuZ2VzXG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IHRhZy5jb250ZW50cyhcIipcIilbMF07XG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IGRvbUNobmdDbnRuciAmJiAkLnZpZXcoZG9tQ2huZ0NudG5yKS5jdHgudGFnID09PSB0YWcucGFyZW50ID8gZG9tQ2huZ0NudG5yIDogdGFnLnBhcmVudEVsZW07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkb21DaG5nQ250bnIgPSBsaW5rQ3R4LmVsZW07XG5cdFx0XHR9XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdC8vIENvbmZpZ3VyZSB0aGUgbmFtZSBmb3IgZWFjaCByYWRpbyBpbnB1dCBlbGVtZW50XG5cdFx0XHRcdCRsaW5rZWRFbGVtW2xdLm5hbWUgPSAkbGlua2VkRWxlbVtsXS5uYW1lIHx8IHRhZy5uYW1lO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRXN0YWJsaXNoIGEgZG9tY2hhbmdlIGxpc3RlbmVyIGluIGNhc2UgdGhpcyByYWRpb2dyb3VwIHdyYXBzIGEge157Zm9yfX0gb3Ige157aWZ9fSBvciBzaW1pbGFyIHdoaWNoIG1pZ2h0IGR5bmFtaWNhbGx5IGluc2VydCBuZXcgcmFkaW8gaW5wdXQgZWxlbWVudHNcblx0XHRcdCQoZG9tQ2huZ0NudG5yKS5vbihcImpzdi1kb21jaGFuZ2VcIiwgZnVuY3Rpb24oZXYsIGZvck9ySWZUYWdDdHgpIHtcblx0XHRcdFx0dmFyIGxpbmtlZEVsZW0sXG5cdFx0XHRcdFx0cGFyZW50VGFncyA9IGZvck9ySWZUYWdDdHguY3R4LnBhcmVudFRhZ3M7XG5cdFx0XHRcdGlmICghdGFnLl8uaW5saW5lIHx8IGRvbUNobmdDbnRuciAhPT0gdGFnLnBhcmVudEVsZW0gLy8gVGhlIGRvbUNobmdDbnRuciBpcyBzcGVjaWZpYyB0byB0aGlzIHRhZ1xuXHRcdFx0XHRcdC8vIFRoZSBkb21DaG5nQ250bnIgaXMgdGhlIHBhcmVudEVsZW0gb2YgdGhpcyB0YWcsIHNvIG5lZWQgdG8gbWFrZSBzdXJlIGRvbSBjaGFuZ2UgZXZlbnQgaXMgZm9yXG5cdFx0XHRcdFx0Ly8gYSBjb250ZW50IGNoYW5nZSB3aXRoaW4gdGhpcyB0YWcsIG5vdCBvdXRzaWRlIGl0LlxuXHRcdFx0XHRcdHx8IHBhcmVudFRhZ3MgJiYgcGFyZW50VGFnc1t0YWcudGFnTmFtZV0gPT09IHRhZykge1xuXHRcdFx0XHRcdC8vIENvbnRlbnRzIGhhdmUgY2hhbmdlZCBzbyByZWNyZWF0ZSAkbGlua2VkRWxlbSBmb3IgdGhlIHJhZGlvIGlucHV0IGVsZW1lbnRzIChpbmNsdWRpbmcgcG9zc2libGUgbmV3IG9uZSBqdXN0IGluc2VydGVkKVxuXHRcdFx0XHRcdCRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW0gPSB0YWcuY29udGVudHModHJ1ZSwgXCJpbnB1dFt0eXBlPXJhZGlvXVwiKTtcblx0XHRcdFx0XHRsID0gJGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdC8vIENvbmZpZ3VyZSBiaW5kaW5nICBhbmQgbmFtZSBmb3IgZWFjaCByYWRpbyBpbnB1dCBlbGVtZW50XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtID0gJGxpbmtlZEVsZW1bbF07XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5uYW1lID0gbGlua2VkRWxlbS5uYW1lIHx8IHRhZy5uYW1lO1xuXHRcdFx0XHRcdFx0YmluZFRvKGJpbmRpbmdTdG9yZVt0YWcuX3RnSWRdLCB0YWcsIGxpbmtlZEVsZW0pO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5fanN2Qm5kID0gXCImXCIgKyB0YWcuX3RnSWQgKyBcIitcIjtcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0uY2hlY2tlZCA9IHRhZy5jdnRBcmdzKClbMF0gPT09IGxpbmtlZEVsZW0udmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdG9uVXBkYXRlOiBmdW5jdGlvbihldiwgZXZlbnRBcmdzLCB0YWdDdHhzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHJlcmVuZGVyXG5cdFx0fSxcblx0XHRjb250ZW50Q3R4OiBrZWVwUGFyZW50RGF0YUN0eCxcblx0XHRkYXRhQm91bmRPbmx5OiB0cnVlXG5cdH1cbn0pO1xuXG4kZXh0ZW5kKCR0YWdzW1wiZm9yXCJdLCB7XG5cdC8vb25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIG5ld1RhZ0N0eHMpIHtcblx0XHQvL0NvbnNpZGVyIGFkZGluZyBmaWx0ZXJpbmcgZm9yIHBlcmYgb3B0aW1pemF0aW9uLiBIb3dldmVyIHRoZSBiZWxvdyBwcmV2ZW50cyB1cGRhdGUgb24gc29tZSBzY2VuYXJpb3Mgd2hpY2ggX3Nob3VsZF8gdXBkYXRlIC0gbmFtZWx5IHdoZW4gdGhlcmUgaXMgYW5vdGhlciBhcnJheSBvbiB3aGljaCBmb3IgYWxzbyBkZXBlbmRzLlxuXHRcdC8vdmFyIGksIGwsIHRjaSwgcHJldkFyZztcblx0XHQvL2ZvciAodGNpID0gMDsgKHByZXZBcmcgPSB0aGlzLnRhZ0N0eHNbdGNpXSkgJiYgcHJldkFyZy5hcmdzLmxlbmd0aDsgdGNpKyspIHtcblx0XHQvL1x0aWYgKHByZXZBcmcuYXJnc1swXSAhPT0gbmV3VGFnQ3R4c1t0Y2ldLmFyZ3NbMF0pIHtcblx0XHQvL1x0XHRyZXR1cm4gdHJ1ZTtcblx0XHQvL1x0fVxuXHRcdC8vfVxuXHRcdC8vcmV0dXJuIGZhbHNlO1xuXHQvL30sXG5cdG9uQXJyYXlDaGFuZ2U6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIHRhZ0N0eCwgbGlua0N0eCkge1xuXHRcdHZhciBhcnJheVZpZXcsXG5cdFx0XHR0YXJnZXQgPSBldi50YXJnZXQsXG5cdFx0XHR0YXJnZXRMZW5ndGggPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGNoYW5nZSA9IGV2ZW50QXJncy5jaGFuZ2U7XG5cdFx0aWYgKHRhZy5fLm5vVndzIC8vIENoaWxkIHZpZXdzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0YXJnZXQgaXMgbm90IGh0bWwgLSBlLmcuIGRhdGEtbGluaz1cInRpdGxle2ZvciAuLi59XCJcblx0XHRcdHx8IHRhZy50YWdDdHhzWzFdICYmICggLy8gVGhlcmUgaXMgYW4ge3tlbHNlfX1cblx0XHRcdFx0Y2hhbmdlID09PSBcImluc2VydFwiICYmIHRhcmdldExlbmd0aCA9PT0gZXZlbnRBcmdzLml0ZW1zLmxlbmd0aCAvLyBpbnNlcnRpbmcsIGFuZCBuZXcgbGVuZ3RoIGlzIHNhbWUgYXMgaW5zZXJ0ZWQgbGVuZ3RoLCBzbyBnb2luZyBmcm9tIDAgdG8gblxuXHRcdFx0XHR8fCBjaGFuZ2UgPT09IFwicmVtb3ZlXCIgJiYgIXRhcmdldExlbmd0aCAvLyByZW1vdmluZyAsIGFuZCBuZXcgbGVuZ3RoIDAsIHNvIGdvaW5nIGZyb20gbiB0byAwXG5cdFx0XHQpKSB7XG5cdFx0XHR0YWcucmVmcmVzaCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGFycmF5VmlldyBpbiB0YWcuXy5hcnJWd3MpIHtcblx0XHRcdFx0YXJyYXlWaWV3ID0gdGFnLl8uYXJyVndzW2FycmF5Vmlld107XG5cdFx0XHRcdGlmIChhcnJheVZpZXcuZGF0YSA9PT0gdGFyZ2V0KSB7XG5cdFx0XHRcdFx0YXJyYXlWaWV3Ll8ub25BcnJheUNoYW5nZS5hcHBseShhcnJheVZpZXcsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGFnLmRvbUNoYW5nZSh0YWdDdHgsIGxpbmtDdHgsIGV2ZW50QXJncyk7XG5cdFx0ZXYuZG9uZSA9IHRydWU7XG5cdH0sXG5cdG9uQWZ0ZXJMaW5rOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHR2YXIgaSwgYXJySGFuZGxlciwgYXJyQmluZGluZywgZGF0YSxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRhcnJheUJpbmRpbmdzID0gdGFnLl9hcnMgfHwge30sXG5cdFx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMsXG5cdFx0XHRsID0gdGFnQ3R4cy5sZW5ndGgsXG5cdFx0XHRzZWxlY3RlZCA9IHRhZy5zZWxlY3RlZCB8fCAwO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8PSBzZWxlY3RlZDsgaSsrKSB7XG5cdFx0XHR0YWdDdHggPSB0YWdDdHhzW2ldOyAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRhZ0N0eHMgdXAgdG8gc2VsZWN0ZWRcblx0XHRcdGRhdGEgPSB0YWdDdHgubWFwXG5cdFx0XHRcdD8gdGFnQ3R4Lm1hcC50Z3QgICAgICAgIC8vICdkYXRhJyBpcyBtYXBwZWQgZGF0YVxuXHRcdFx0XHQ6IHRhZ0N0eC5hcmdzLmxlbmd0aFxuXHRcdFx0XHRcdD8gdGFnQ3R4LmFyZ3NbMF0gICAgLy8gb3IgYXJnc1swXVxuXHRcdFx0XHRcdDogdGFnQ3R4LnZpZXcuZGF0YTsgLy8gb3IgZGVmYXVsdHMgdG8gY3VycmVudCBkYXRhLlxuXG5cdFx0XHRpZiAoKGFyckJpbmRpbmcgPSBhcnJheUJpbmRpbmdzW2ldKSAmJiBkYXRhICE9PSBhcnJCaW5kaW5nWzBdKSB7IC8vIElzIHRoZXJlIHByZXZpb3VzIGFycmF5IGRhdGEgb24gdGhpcyB0YWdDdHgsIGRpZmZlcmVudCBmcm9tIG5ldyBkYXRhXG5cdFx0XHRcdCRvYnNlcnZlKGFyckJpbmRpbmdbMF0sIGFyckJpbmRpbmdbMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZSBwcmV2aW91cyBhcnJheVxuXHRcdFx0XHRkZWxldGUgYXJyYXlCaW5kaW5nc1tpXTtcblx0XHRcdH1cblx0XHRcdGlmICghYXJyYXlCaW5kaW5nc1tpXSAmJiAkaXNBcnJheShkYXRhKSkge1xuXHRcdFx0XHQkb2JzZXJ2ZShkYXRhLCBhcnJIYW5kbGVyID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdHZhciB0YWdDdCA9IHRhZ0N0eDtcblx0XHRcdFx0XHR0YWcub25BcnJheUNoYW5nZShldiwgZXZlbnRBcmdzLCB0YWdDdCwgbGlua0N0eCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhcnJheUJpbmRpbmdzW2ldID0gW2RhdGEsIGFyckhhbmRsZXJdOyAvLyBTdG9yZSBhcnJheSBkYXRhIGFuZCBhcnJheUNoYW5nZUhhbmRsZXIgb24gdGFnLl9hcnNbaV1cblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChpID0gc2VsZWN0ZWQgKyAxOyBpIDwgbDsgaSsrKSB7IC8vIElmIHRoZXJlIHdlcmUgcHJldmlvdXMgYmluZGluZ3Mgb24gbGF0ZXIgdGFnQ3R4cywgcmVtb3ZlIHRoZW1cblx0XHRcdGlmIChhcnJCaW5kaW5nID0gYXJyYXlCaW5kaW5nc1tpXSkge1xuXHRcdFx0XHQkb2JzZXJ2ZShhcnJCaW5kaW5nWzBdLCBhcnJCaW5kaW5nWzFdLCB0cnVlKTsgLy91bm9ic2VydmUgcHJldmlvdXMgYmluZGluZ1xuXHRcdFx0XHRkZWxldGUgYXJyYXlCaW5kaW5nc1tpXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGFnLl9hcnMgPSBhcnJheUJpbmRpbmdzO1xuXHR9LFxuXHRvbkRpc3Bvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsLCB0YWcgPSB0aGlzO1xuXHRcdGZvciAobCBpbiB0YWcuX2Fycykge1xuXHRcdFx0JG9ic2VydmUodGFnLl9hcnNbbF1bMF0sIHRhZy5fYXJzW2xdWzFdLCB0cnVlKTsgLy91bm9ic2VydmVcblx0XHR9XG5cdH1cbn0pO1xuXG4kZXh0ZW5kKCR0YWdzW1wiaWZcIl0sIHtcblx0b25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIG5ld1RhZ0N0eHMpIHtcblx0XHR2YXIgdGNpLCBwcmV2QXJnLCBkaWZmZXJlbnQ7XG5cdFx0Zm9yICh0Y2kgPSAwOyAocHJldkFyZyA9IHRoaXMudGFnQ3R4c1t0Y2ldKTsgdGNpKyspIHtcblx0XHRcdGRpZmZlcmVudCA9IHByZXZBcmcucHJvcHMudG1wbCAhPT0gbmV3VGFnQ3R4c1t0Y2ldLnByb3BzLnRtcGwgfHwgcHJldkFyZy5hcmdzLmxlbmd0aCAmJiAhKHByZXZBcmcgPSBwcmV2QXJnLmFyZ3NbMF0pICE9PSAhbmV3VGFnQ3R4c1t0Y2ldLmFyZ3NbMF07XG5cdFx0XHRpZiAoKCF0aGlzLmNvbnZlcnQgJiYgISFwcmV2QXJnKSB8fCBkaWZmZXJlbnQpIHtcblx0XHRcdFx0cmV0dXJuIGRpZmZlcmVudDtcblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgbm90IGEgY2hhbmdlIG9mIHRlbXBsYXRlLCBhbmQgdGhlcmUgaXMgbm8gY29udmVydGVyLCBhbmQgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBib3RoIHRydXRoeSwgcmV0dXJuIGZhbHNlIHRvIGNhbmNlbCB1cGRhdGUuXG5cdFx0XHRcdC8vIChFdmVuIGlmIHZhbHVlcyBvbiBsYXRlciBlbHNlcyBhcmUgZGlmZmVyZW50LCB3ZSBzdGlsbCBkb24ndCB3YW50IHRvIHVwZGF0ZSwgc2luY2UgcmVuZGVyZWQgb3V0cHV0IHdvdWxkIGJlIHVuY2hhbmdlZClcblx0XHRcdFx0Ly8gSWYgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBkaWZmZXJlbnQsIHJldHVybiB0cnVlLCB0byB1cGRhdGVcblx0XHRcdFx0Ly8gSWYgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBib3RoIGZhbHNleSwgbW92ZSB0byB0aGUgbmV4dCB7e2Vsc2UgLi4ufX1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gQm9vbGVhbiB2YWx1ZSBvZiBhbGwgYXJncyBhcmUgdW5jaGFuZ2VkIChmYWxzZXkpLCBzbyByZXR1cm4gZmFsc2UgdG8gY2FuY2VsIHVwZGF0ZVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0b25BZnRlckxpbms6IGZ1bmN0aW9uKHRhZ0N0eCwgbGlua0N0eCwgY3R4LCBldiwgZXZlbnRBcmdzKSB7XG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0dGhpcy5kb21DaGFuZ2UodGFnQ3R4LCBsaW5rQ3R4LCBldmVudEFyZ3MpO1xuXHRcdH1cblx0fVxufSk7XG5cbmZ1bmN0aW9uIG9ic2VydmVQcm9wcyhtYXAsIGV2LCBldmVudEFyZ3MpIHtcblx0aWYgKGV2ZW50QXJncy5jaGFuZ2UgPT09IFwic2V0XCIpIHtcblx0XHR2YXIgdGFyZ2V0ID0gbWFwLnRndCxcblx0XHRcdGwgPSB0YXJnZXQubGVuZ3RoO1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdGlmICh0YXJnZXRbbF0ua2V5ID09PSBldmVudEFyZ3MucGF0aCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGwgPT09IC0xKSB7XG5cdFx0XHRpZiAoZXZlbnRBcmdzLnBhdGggJiYgIWV2ZW50QXJncy5yZW1vdmUpIHtcblx0XHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5pbnNlcnQoe2tleTogZXZlbnRBcmdzLnBhdGgsIHByb3A6IGV2ZW50QXJncy52YWx1ZX0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZXZlbnRBcmdzLnJlbW92ZSkge1xuXHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5yZW1vdmUobCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldFtsXSkuc2V0UHJvcGVydHkoXCJwcm9wXCIsIGV2ZW50QXJncy52YWx1ZSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIG9ic2VydmVNYXBwZWRQcm9wcyhtYXAsIGV2LCBldmVudEFyZ3MpIHtcblx0dmFyIGl0ZW0sXG5cdFx0c291cmNlID0gbWFwLnNyYyxcblx0XHRjaGFuZ2UgPSBldmVudEFyZ3MuY2hhbmdlO1xuXG5cdGlmIChjaGFuZ2UgPT09IFwic2V0XCIpIHtcblx0XHRpZiAoZXZlbnRBcmdzLnBhdGggPT09IFwicHJvcFwiKSB7XG5cdFx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnNldFByb3BlcnR5KGV2LnRhcmdldC5rZXksIGV2ZW50QXJncy52YWx1ZSk7XG5cdFx0fSBlbHNlIHsgLy8gcGF0aCA9PT0gXCJrZXlcIlxuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5yZW1vdmVQcm9wZXJ0eShldmVudEFyZ3Mub2xkVmFsdWUpOyAvLyBXaGVuIGtleSBpcyBtb2RpZmllZCBvYnNlcnZhYmx5LCByZW1vdmUgb2xkIG9uZSBhbmQgc2V0IG5ldyBvbmVcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoZXZlbnRBcmdzLnZhbHVlLCBldi50YXJnZXQucHJvcCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGNoYW5nZSA9PT0gXCJyZW1vdmVcIikge1xuXHRcdGl0ZW0gPSBldmVudEFyZ3MuaXRlbXNbMF07XG5cdFx0JG9ic2VydmFibGUoc291cmNlKS5yZW1vdmVQcm9wZXJ0eShpdGVtLmtleSk7XG5cdFx0ZGVsZXRlIHNvdXJjZVtpdGVtLmtleV07XG5cdH0gZWxzZSBpZiAoY2hhbmdlID09PSBcImluc2VydFwiKSB7XG5cdFx0aXRlbSA9IGV2ZW50QXJncy5pdGVtc1swXTtcblx0XHRpZiAoaXRlbS5rZXkpIHtcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoaXRlbS5rZXksIGl0ZW0ucHJvcCk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHNoYWxsb3dBcnJheUZpbHRlcihhbGxQYXRoIC8qLCBvYmplY3QsIHBhcmVudE9icyovKSB7IC8vIEZpbHRlciB1c2VkIGJ5IHt7cHJvcHN9fSBmb3IgdGhlIG1hcHBlZFByb3BzIHRhcmdldCBhcnJheVxuXHRyZXR1cm4gYWxsUGF0aC5pbmRleE9mKFwiLlwiKSA8IDA7XG59XG5cbiR0YWdzKFwicHJvcHNcIiwge1xuXHRiYXNlVGFnOiBcImZvclwiLFxuXHRkYXRhTWFwOiAkdmlld3MubWFwKHtcblx0XHRnZXRUZ3Q6ICR0YWdzLnByb3BzLmRhdGFNYXAuZ2V0VGd0LFxuXHRcdG9ic1NyYzogb2JzZXJ2ZVByb3BzLFxuXHRcdG9ic1RndDogb2JzZXJ2ZU1hcHBlZFByb3BzLFxuXHRcdHRndEZsdDogc2hhbGxvd0FycmF5RmlsdGVyXG5cdH0pLFxuXHRmbG93OiB0cnVlXG59KTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCBqUXVlcnkgbmFtZXNwYWNlXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kZXh0ZW5kKCQsIHtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09XG5cdC8vIGpRdWVyeSAkLnZpZXcoKSBwbHVnaW5cblx0Ly89PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHZpZXc6ICR2aWV3ID0gZnVuY3Rpb24obm9kZSwgaW5uZXIsIHR5cGUpIHtcblx0XHQvLyAkLnZpZXcoKSByZXR1cm5zIHRvcCB2aWV3XG5cdFx0Ly8gJC52aWV3KG5vZGUpIHJldHVybnMgdmlldyB0aGF0IGNvbnRhaW5zIG5vZGVcblx0XHQvLyAkLnZpZXcoc2VsZWN0b3IpIHJldHVybnMgdmlldyB0aGF0IGNvbnRhaW5zIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnRcblx0XHQvLyAkLnZpZXcobm9kZU9yU2VsZWN0b3IsIHR5cGUpIHJldHVybnMgbmVhcmVzdCBjb250YWluaW5nIHZpZXcgb2YgZ2l2ZW4gdHlwZVxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgXCJyb290XCIpIHJldHVybnMgcm9vdCBjb250YWluaW5nIHZpZXcgKGNoaWxkIG9mIHRvcCB2aWV3KVxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgdHJ1ZSwgdHlwZSkgcmV0dXJucyBuZWFyZXN0IGlubmVyIChjb250YWluZWQpIHZpZXcgb2YgZ2l2ZW4gdHlwZVxuXG5cdFx0ZnVuY3Rpb24gZ2V0SW5uZXJWaWV3KG5kLCBpc1ZsKSB7XG5cdFx0XHRpZiAobmQpIHtcblx0XHRcdFx0dndJbmZvcyA9IHZpZXdJbmZvcyhuZCwgaXNWbCwgck9wZW5WaWV3TWFya2Vycyk7XG5cdFx0XHRcdGZvciAoaiA9IDAsIGsgPSB2d0luZm9zLmxlbmd0aDsgaiA8IGs7IGorKykge1xuXHRcdFx0XHRcdGlmICgodmlldyA9IHZpZXdTdG9yZVt2d0luZm9zW2pdLmlkXSkgJiYgKHZpZXcgPSB2aWV3ICYmIHR5cGUgPyB2aWV3LmdldCh0cnVlLCB0eXBlKSA6IHZpZXcpKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5uZXIgIT09ICEhaW5uZXIpIHtcblx0XHRcdC8vIGlubmVyIG5vdCBib29sZWFuLCBzbyB0aGlzIGlzIHZpZXcobm9kZU9yU2VsZWN0b3IsIHR5cGUpXG5cdFx0XHR0eXBlID0gaW5uZXI7XG5cdFx0XHRpbm5lciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dmFyIHZpZXcsIHZ3SW5mb3MsIGksIGosIGssIGwsIGVsZW1zLFxuXHRcdFx0bGV2ZWwgPSAwLFxuXHRcdFx0Ym9keSA9IGRvY3VtZW50LmJvZHk7XG5cblx0XHRpZiAobm9kZSAmJiBub2RlICE9PSBib2R5ICYmIHRvcFZpZXcuXy51c2VLZXkgPiAxKSB7XG5cdFx0XHQvLyBQZXJmIG9wdGltaXphdGlvbiBmb3IgY29tbW9uIGNhc2VzXG5cblx0XHRcdG5vZGUgPSBcIlwiICsgbm9kZSA9PT0gbm9kZVxuXHRcdFx0XHQ/ICQobm9kZSlbMF1cblx0XHRcdFx0OiBub2RlLmpxdWVyeVxuXHRcdFx0XHRcdD8gbm9kZVswXVxuXHRcdFx0XHRcdDogbm9kZTtcblxuXHRcdFx0aWYgKG5vZGUpIHtcblx0XHRcdFx0aWYgKGlubmVyKSB7XG5cdFx0XHRcdFx0Z2V0SW5uZXJWaWV3KG5vZGUuX2RmLCB0cnVlKTtcblx0XHRcdFx0XHRpZiAoIXZpZXcpIHtcblx0XHRcdFx0XHRcdC8vIFRyZWF0IHN1cHBsaWVkIG5vZGUgYXMgYSBjb250YWluZXIgZWxlbWVudCBhbmQgcmV0dXJuIHRoZSBmaXJzdCB2aWV3IGVuY291bnRlcmVkLlxuXHRcdFx0XHRcdFx0ZWxlbXMgPSBxc2EgPyBub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoYmluZEVsc1NlbCkgOiAkKGJpbmRFbHNTZWwsIG5vZGUpLmdldCgpO1xuXHRcdFx0XHRcdFx0bCA9IGVsZW1zLmxlbmd0aDtcblx0XHRcdFx0XHRcdGZvciAoaSA9IDA7ICF2aWV3ICYmIGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0Z2V0SW5uZXJWaWV3KGVsZW1zW2ldKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZpZXc7XG5cdFx0XHRcdH1cblx0XHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0XHQvLyBNb3ZlIGJhY2sgdGhyb3VnaCBzaWJsaW5ncyBhbmQgdXAgdGhyb3VnaCBwYXJlbnRzIHRvIGZpbmQgcHJlY2VkaW5nIG5vZGUgd2hpY2ggaXMgYSBfcHJ2IChwcmV2Tm9kZSlcblx0XHRcdFx0XHQvLyBzY3JpcHQgbWFya2VyIG5vZGUgZm9yIGEgbm9uLWVsZW1lbnQtY29udGVudCB2aWV3LCBvciBhIF9wcnYgKGZpcnN0IG5vZGUpIGZvciBhbiBlbENudCB2aWV3XG5cdFx0XHRcdFx0aWYgKHZ3SW5mb3MgPSB2aWV3SW5mb3Mobm9kZSwgdW5kZWZpbmVkLCByVmlld01hcmtlcnMpKSB7XG5cdFx0XHRcdFx0XHRsID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdFx0XHRcdHZpZXcgPSB2d0luZm9zW2xdO1xuXHRcdFx0XHRcdFx0XHRpZiAodmlldy5vcGVuKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGxldmVsIDwgMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmlldyA9IHZpZXdTdG9yZVt2aWV3LmlkXTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB2aWV3ICYmIHR5cGUgPyB2aWV3LmdldCh0eXBlKSA6IHZpZXcgfHwgdG9wVmlldztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bGV2ZWwtLTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBsZXZlbCBzdGFydHMgYXQgemVyby4gSWYgd2UgaGl0IGEgdmlldy5jbG9zZSwgdGhlbiB3ZSBtb3ZlIGxldmVsIHRvIDEsIGFuZCB3ZSBkb24ndCByZXR1cm4gYSB2aWV3IHVudGlsXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgYXJlIGJhY2sgYXQgbGV2ZWwgemVybyAob3IgYSBwYXJlbnQgdmlldyB3aXRoIGxldmVsIDwgMClcblx0XHRcdFx0XHRcdFx0XHRsZXZlbCsrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZyB8fCBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRvcFZpZXc7XG5cdH0sXG5cblx0bGluazogJGxpbmssXG5cdHVubGluazogJHVubGluayxcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PVxuXHQvLyBvdmVycmlkZSAkLmNsZWFuRGF0YVxuXHQvLz09PT09PT09PT09PT09PT09PT09PVxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKGVsZW1zKSB7XG5cdFx0aWYgKGVsZW1zLmxlbmd0aCAmJiBpc0NsZWFuQ2FsbCkge1xuXHRcdFx0Ly8gUmVtb3ZlIEpzVmlld3MgYmluZGluZ3MuIEFsc28sIHJlbW92ZSBmcm9tIHRoZSBET00gYW55IGNvcnJlc3BvbmRpbmcgc2NyaXB0IG1hcmtlciBub2Rlc1xuXHRcdFx0Y2xlYW4oZWxlbXMpO1xuXHRcdH1cblx0XHRvbGRDbGVhbkRhdGEuYXBwbHkoJCwgYXJndW1lbnRzKTtcblx0fVxufSk7XG5cbi8vIFBvc3NpYmxlIGZ1dHVyZSBhZGRpdGlvbiAtIGUuZy4gZm9yIGNrZWRpdG9yIHRhZyBjb250cm9sXG4vLyR2aWV3cy51dGlsaXR5ID0ge1xuLy9cdHZhbGlkYXRlOiBmdW5jdGlvbihodG1sKSB7XG4vL1x0XHR0cnkge1xuLy9cdFx0XHR0b3BWaWV3LmxpbmsodW5kZWZpbmVkLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaHRtbCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIDEpO1xuLy9cdFx0fVxuLy9cdFx0Y2F0Y2ggKGUpIHtcbi8vXHRcdFx0cmV0dXJuIGUubWVzc2FnZTtcbi8vXHRcdH1cbi8vXHR9XG4vL307XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIGpRdWVyeSBpbnN0YW5jZSBwbHVnaW5zXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJGV4dGVuZCgkLmZuLCB7XG5cdGxpbms6IGZ1bmN0aW9uKGV4cHIsIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0XHRyZXR1cm4gJGxpbmsoZXhwciwgdGhpcywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSk7XG5cdH0sXG5cdHVubGluazogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICR1bmxpbmsodGhpcyk7XG5cdH0sXG5cdHZpZXc6IGZ1bmN0aW9uKGlubmVyLCB0eXBlKSB7XG5cdFx0cmV0dXJuICR2aWV3KHRoaXNbMF0sIGlubmVyLCB0eXBlKTtcblx0fVxufSk7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPdmVycmlkZSBqUXVlcnkgbWV0aG9kcyB0aGF0IGNhbGwgb3VyIG92ZXJyaWRkZW4gY2xlYW5EYXRhLCBmb3IgZGlzcG9zYWwgZXRjLlxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJC5lYWNoKFtIVE1MLCBcInJlcGxhY2VXaXRoXCIsIFwiZW1wdHlcIiwgXCJyZW1vdmVcIl0sIGZ1bmN0aW9uKGksIG5hbWUpIHtcblx0dmFyIG9sZEZuID0gJC5mbltuYW1lXTtcblx0JC5mbltuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciByZXN1bHQ7XG5cdFx0aXNDbGVhbkNhbGwgPSAxOyAvLyBNYWtlIHN1cmUgY2xlYW5EYXRhIGRvZXMgZGlzcG9zYWwgb25seSB3aGVuIGNvbWluZyBmcm9tIHRoZXNlIGNhbGxzLlxuXHRcdHRyeSB7XG5cdFx0XHRyZXN1bHQgPSBvbGRGbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdH1cblx0XHRmaW5hbGx5IHtcblx0XHRcdGlzQ2xlYW5DYWxsID0gMDtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcbn0pO1xuXG4vLz09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIHRvcFZpZXdcbi8vPT09PT09PT09PT09PT09XG5cbmFkZExpbmtNZXRob2RzKCRleHRlbmQodG9wVmlldyA9ICRzdWIudG9wVmlldywge3RtcGw6IHtsaW5rczoge319fSkpO1xuXG52aWV3U3RvcmUgPSB7MDogdG9wVmlld307IC8vIFRvcC1sZXZlbCB2aWV3XG4vLz09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kICQudmlld3Ncbi8vPT09PT09PT09PT09PT09XG5cbiR2aWV3cy5nZXRDdHggPSBmdW5jdGlvbihwYXJhbSkgeyAvLyBSZXR1cm4gdmFsdWUgb2YgY3R4LmZvbywgaW5jbHVkaW5nIGZvciBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMsIH5mb289ZXhwclxuXHRpZiAocGFyYW0gJiYgcGFyYW0uX2NwKSB7IC8vIElmIHRoaXMgaGVscGVyIHJlc291cmNlIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIsIH5mb289ZXhwclxuXHRcdHBhcmFtID0gIHBhcmFtWzFdKHBhcmFtWzBdLmRhdGEsIHBhcmFtWzBdLCAkc3ViKTtcblx0fVxuXHRyZXR1cm4gcGFyYW07XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCAkLnZpZXdzLnN1YlxuLy89PT09PT09PT09PT09PT09PT09XG5cbiRzdWIuX2NwID0gZnVuY3Rpb24ocGFyYW1WYWwsIHBhcmFtcywgdmlldykgeyAvLyBHZXQgY29tcGlsZWQgY29udGV4dHVhbCBwYXJhbWV0ZXJzIChvciBwcm9wZXJ0aWVzKSB+Zm9vPWV4cHIuXG5cdGlmICh2aWV3LmxpbmtlZCkgeyAvLyBJbiBKc1ZpZXdzLCByZXR1cm5zIFt2aWV3LCBsaW5rRm5dIHdoZXJlIGxpbmtGbiBpcyBjb21waWxlZCBmdW5jdGlvbiBmb3IgZXhwcmVzc2lvblxuXHRcdHBhcmFtcyA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBwYXJhbXMgKyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0dmFyIHRtcGwgPSB2aWV3LnRtcGwsXG5cdFx0XHRsaW5rcyA9IHRvcFZpZXcudG1wbC5saW5rcywgLy8gVXNlIHRvcFZpZXcgbGlua3MsIGFzIGZvciBjb21waWxlZCB0b3AtbGV2ZWwgbGlua2luZyBleHByZXNzaW9ucy4gVG8gZG8gLSBzaG91bGQgdGhpcyBldmVyIGdldCBkaXNwb3NlZD9cblx0XHRcdGxpbmtGbiA9IGxpbmtzW3BhcmFtc107XG5cdFx0aWYgKCFsaW5rRm4pIHtcblx0XHRcdGxpbmtzW3BhcmFtc10gPSBsaW5rRm4gPSAkc3ViLnRtcGxGbihwYXJhbXMsIHRtcGwsIHRydWUpO1xuXHRcdH1cblx0XHRwYXJhbVZhbCA9IFt2aWV3LCBsaW5rRm5dO1xuXHRcdHBhcmFtVmFsLl9jcCA9IHRydWU7IC8vIEZsYWcgdGhhdCB0aGlzIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXJcblx0fVxuXHRyZXR1cm4gcGFyYW1WYWw7IC8vIEluIEpzUmVuZGVyIHJldHVybnMgZXZhbHVhdGVkIGV4cHJlc3Npb25cbn07XG5cbiRzdWIuX2NlbyA9IGZ1bmN0aW9uIGNsb25lRXhwck9iamVjdHMob2JzKSB7ICAvLyBDbG9uZSBleHByT2JzIHNvIHRoYXQgZWFjaCByZWZlcmVuY2VkIGNvbnRleHR1YWwgcGFyYW1ldGVyIH5mb28gdXNlcyBpdHMgb3duIGV4cHJPYiBpbnN0YW5jZXNcblx0dmFyIG9iLFxuXHRcdGNsb25lcyA9IG9icyxcblx0XHRsID0gb2JzLmxlbmd0aDtcblx0aWYgKGwpIHtcblx0XHRjbG9uZXMgPSBbXTtcblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRvYiA9IG9ic1tsXTtcblx0XHRcdGlmIChvYi5fanN2KSB7XG5cdFx0XHRcdG9iID0gJGV4dGVuZCh7fSwgb2IpOyAgICAgICAgICAgICAgLy8gSWYgYW4gZXhwck9iLCBjbG9uZSBpdC4gSWYgYSBzdHJpbmcsIGtlZXAgYXMgaXNcblx0XHRcdFx0b2IucHJtID0gY2xvbmVFeHByT2JqZWN0cyhvYi5wcm0pOyAvLyBSZWN1cnNpdmVseSBjbG9uZSBleHByT2JzIGluIHBhcmFtZXRlcnMsIHRvb1xuXHRcdFx0fVxuXHRcdFx0Y2xvbmVzLnVuc2hpZnQob2IpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY2xvbmVzO1xufTtcblxuJHN1Yi5fZ2NjYiA9IGZ1bmN0aW9uKHZpZXcpIHsgLy8gUmV0dXJuIGEgY2FsbGJhY2sgZm9yIGFjY2Vzc2luZyB0aGUgY29udGV4dCBvZiBhIHRlbXBsYXRlL2RhdGEtbGluayBleHByZXNzaW9uIC0gYW5kIGNvbnZlcnRpbmcgfmZvbywgI2ZvbyBldGMuXG5cdC8vIFRPRE8gQ29uc2lkZXIgZXhwb3Npbmcgb3IgYWxsb3dpbmcgb3ZlcnJpZGUsIGFzIHB1YmxpYyBBUElcblx0cmV0dXJuIGZ1bmN0aW9uKHBhdGgsIG9iamVjdCwgZGVwdGgpIHtcblx0XHQvLyBUT0RPIGNvbnNpZGVyIG9ubHkgY2FsbGluZyB0aGUgY29udGV4dENiIG9uIHRoZSBpbml0aWFsIHRva2VuIGluIHBhdGggJ35hLmIuYycgYW5kIG5vdCBjYWxsaW5nIGFnYWluIG9uXG5cdFx0Ly8gdGhlIGluZGl2aWR1YWwgdG9rZW5zLCAnYScsICdiJywgJ2MnLi4uIEN1cnJlbnRseSBpdCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXNcblx0XHR2YXIgdG9rZW5zLCB0YWcsIGl0ZW1zLCBoZWxwZXIsIGxhc3QsIG5leHRQYXRoLCBsO1xuXHRcdGlmICh2aWV3ICYmIHBhdGgpIHtcblx0XHRcdGlmIChwYXRoLl9qc3YpIHtcblx0XHRcdFx0cmV0dXJuIHBhdGguX2pzdi5jYWxsKHZpZXcudG1wbCwgb2JqZWN0LCB2aWV3LCAkc3ViKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gXCJ+XCIpIHtcblx0XHRcdFx0Ly8gV2UgcmV0dXJuIG5ldyBpdGVtcyB0byBpbnNlcnQgaW50byB0aGUgc2VxdWVuY2UsIHJlcGxhY2luZyB0aGUgXCJ+YS5iLmNcIiBzdHJpbmc6XG5cdFx0XHRcdC8vIFtoZWxwZXJPYmplY3QgJ2EnLCBcImEuYi5jXCIgY3VycmVudERhdGFJdGVtXSBzbyBjdXJyZW50RGF0YUl0ZW0gYmVjb21lcyB0aGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50IHBhdGhzLlxuXHRcdFx0XHRpZiAocGF0aC5zbGljZSgwLCA0KSA9PT0gXCJ+dGFnXCIpIHtcblx0XHRcdFx0XHR0YWcgPSB2aWV3LmN0eDtcblx0XHRcdFx0XHRpZiAocGF0aC5jaGFyQXQoNCkgPT09IFwiLlwiKSB7XG5cdFx0XHRcdFx0XHQvLyBcIn50YWcueHh4XCJcblx0XHRcdFx0XHRcdHRva2VucyA9IHBhdGguc2xpY2UoNSkuc3BsaXQoXCIuXCIpO1xuXHRcdFx0XHRcdFx0dGFnID0gdGFnLnRhZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRva2Vucykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRhZyA/IFt0YWcsIHRva2Vucy5qb2luKFwiLlwiKSwgb2JqZWN0XSA6IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRwYXRoID0gcGF0aC5zbGljZSgxKS5zcGxpdChcIi5cIik7XG5cdFx0XHRcdGlmIChoZWxwZXIgPSB2aWV3LmhscChsYXN0ID0gcGF0aC5zaGlmdCgpLCB0cnVlKSkge1xuXHRcdFx0XHRcdGlmIChoZWxwZXIuX2NwKSB7ICAvLyBoZWxwZXIgZm9yIChjb250ZXh0dWFsIHBhcmFtZXRlciB+Zm9vPS4uLikgaXMgYW4gYXJyYXkgLSBbdmlldywgY3R4UHJtRGVwZW5kZW5jaWVzIC4uLl1cblx0XHRcdFx0XHRcdGlmIChwYXRoLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRuZXh0UGF0aCA9IFwiLlwiICsgcGF0aC5qb2luKFwiLlwiKTtcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGhlbHBlcltsID0gaGVscGVyLmxlbmd0aC0xXTtcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3QuX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdGxhc3Quc2IgPSBuZXh0UGF0aDtcblx0XHRcdFx0XHRcdFx0XHRsYXN0LmJuZCA9ICEhZGVwdGg7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0aGVscGVyW2xdID0gKGxhc3QgKyBuZXh0UGF0aCkucmVwbGFjZShcIiNkYXRhLlwiLCBcIlwiKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobGFzdC5zbGljZSgwLCA1KSA9PT0gXCIjdmlld1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRoZWxwZXJbbF0gPSBoZWxwZXJbbF0uc2xpY2UoNik7XG5cdFx0XHRcdFx0XHRcdFx0XHRoZWxwZXIuc3BsaWNlKGwsIDAsIHZpZXcpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aXRlbXMgPSBbaGVscGVyXTsgLy8gQ29udGV4dHVhbCBwYXJhbWV0ZXJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhdGgubGVuZ3RoIHx8ICRpc0Z1bmN0aW9uKGhlbHBlcikpIHtcblx0XHRcdFx0XHRcdGl0ZW1zID0gW2hlbHBlciwgcGF0aC5qb2luKFwiLlwiKSwgb2JqZWN0XTsgLy8gMndheSBiaW5kbmcgb24gfmZvby5oZWxwZXJMZWFmUHJvcGVydHkgb3IgfmNvbXB1dGVkKCkgb3IgfmNvbnRleHR1YWxQYXJhbVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaXRlbXMgfHwgW107XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5jaGFyQXQoMCkgPT09IFwiI1wiKSB7XG5cdFx0XHRcdC8vIFdlIHJldHVybiBuZXcgaXRlbXMgdG8gaW5zZXJ0IGludG8gdGhlIHNlcXVlbmNlLCByZXBsYWNpbmcgdGhlIFwiI2EuYi5jXCIgc3RyaW5nOiBbdmlldywgXCJhLmIuY1wiIGN1cnJlbnREYXRhSXRlbV1cblx0XHRcdFx0Ly8gc28gY3VycmVudERhdGFJdGVtIGJlY29tZXMgdGhlIG9iamVjdCBmb3Igc3Vic2VxdWVudCBwYXRocy4gVGhlICd0cnVlJyBmbGFnIG1ha2VzIHRoZSBwYXRocyBiaW5kIG9ubHkgdG8gbGVhZiBjaGFuZ2VzLlxuXHRcdFx0XHRyZXR1cm4gcGF0aCA9PT0gXCIjZGF0YVwiID8gW10gOiBbdmlldywgcGF0aC5yZXBsYWNlKHJWaWV3UGF0aCwgXCJcIiksIG9iamVjdF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgJC52aWV3cy5zZXR0aW5nc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09XG5cbm9sZEFkdlNldCA9ICRzdWIuYWR2U2V0O1xuXG4kc3ViLmFkdlNldCA9IGZ1bmN0aW9uKCkgeyAvLyByZWZyZXNoIGFkdmFuY2VkIHNldHRpbmdzXG5cdG9sZEFkdlNldC5jYWxsKCRzdWIpO1xuXHRnbG9iYWwuX2pzdiA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl9qc3Zcblx0XHQ/ICRleHRlbmQoZ2xvYmFsLl9qc3YgfHwge30sIHsgLy8gY3JlYXRlIGdsb2JhbCBfanN2LCBmb3IgYWNjZXNzaW5nIHZpZXdzLCBldGNcblx0XHRcdFx0dmlld3M6IHZpZXdTdG9yZSxcblx0XHRcdFx0YmluZGluZ3M6IGJpbmRpbmdTdG9yZVxuXHRcdFx0fSlcblx0XHQ6IHVuZGVmaW5lZDsgLy8gSW4gSUU4IGNhbm5vdCBkbyBkZWxldGUgZ2xvYmFsLl9qc3Zcblx0JHZpZXdzTGlua0F0dHIgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5saW5rQXR0cjtcblx0bGlua1ZpZXdzU2VsID0gYmluZEVsc1NlbCArIFwiLFtcIiArICR2aWV3c0xpbmtBdHRyICsgXCJdXCI7XG5cdHdyYXBNYXAgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5fd207XG5cdHdyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjtcblx0d3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcblx0d3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG59O1xuXG4kdmlld3NTZXR0aW5ncy5hZHZhbmNlZCh7XG5cdGxpbmtBdHRyOiBcImRhdGEtbGlua1wiLFxuXHR1c2VWaWV3czogZmFsc2UsXG5cdG5vVmFsaWRhdGU6IGZhbHNlLFxuXHQvLyB3cmFwTWFwIHByb3ZpZGUgYXBwcm9wcmlhdGUgd3JhcHBlcnMgZm9yIGluc2VydGluZyBpbm5lckhUTUwsIHVzZWQgaW4gaW5zZXJ0QmVmb3JlXG5cdC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApXG5cdC8vIFRPRE8gaW52ZXN0aWdhdGUgd2hldGhlciBtb3JlIHJlY2VudCBqUXVlcnkgaW1wbGVtZW50YXRpb24gdXNpbmcgd3JhcE1hcCBpbiBkb21NYW5pcC8kKCkuaHRtbCgpIGV0Yy4gaXMgYmV0dGVyIG9wdGltaXplZCBub3cuLi5cblx0X3dtOiB7XG5cdFx0b3B0aW9uOiBbMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCJdLFxuXHRcdGxlZ2VuZDogWzEsIFwiPGZpZWxkc2V0PlwiLCBcIjwvZmllbGRzZXQ+XCJdLFxuXHRcdGFyZWE6IFsxLCBcIjxtYXA+XCIsIFwiPC9tYXA+XCJdLFxuXHRcdHBhcmFtOiBbMSwgXCI8b2JqZWN0PlwiLCBcIjwvb2JqZWN0PlwiXSxcblx0XHR0aGVhZDogWzEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCJdLFxuXHRcdHRyOiBbMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIl0sXG5cdFx0dGQ6IFszLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiXSxcblx0XHRjb2w6IFsyLCBcIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiXSxcblx0XHRzdmdfbnM6IFsxLCBcIjxzdmc+XCIsIFwiPC9zdmc+XCJdLFxuXHRcdC8vIElFNi04IGNhbid0IHNlcmlhbGl6ZSBsaW5rLCBzY3JpcHQsIHN0eWxlLCBvciBhbnkgaHRtbDUgKE5vU2NvcGUpIHRhZ3MsXG5cdFx0Ly8gdW5sZXNzIHdyYXBwZWQgaW4gYSBkaXYgd2l0aCBub24tYnJlYWtpbmcgY2hhcmFjdGVycyBpbiBmcm9udCBvZiBpdC5cblx0XHRkaXY6ICQuc3VwcG9ydC5odG1sU2VyaWFsaXplID8gWzAsIFwiXCIsIFwiXCJdIDogWzEsIFwiWDxkaXY+XCIsIFwiPC9kaXY+XCJdXG5cdH0sXG5cdF9mZToge1xuXHRcdGlucHV0OiB7XG5cdFx0XHRmcm9tOiBpbnB1dEF0dHJpYiwgdG86IFwidmFsdWVcIlxuXHRcdH0sXG5cdFx0dGV4dGFyZWE6IHZhbHVlQmluZGluZyxcblx0XHRzZWxlY3Q6IHZhbHVlQmluZGluZyxcblx0XHRvcHRncm91cDoge1xuXHRcdFx0dG86IFwibGFiZWxcIlxuXHRcdH1cblx0fVxufSk7XG5cblx0cmV0dXJuICQ7XG59LCB3aW5kb3cpKTtcbiIsIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2Mi4xLjRcbiAqIGh0dHA6Ly9qcXVlcnkuY29tL1xuICpcbiAqIEluY2x1ZGVzIFNpenpsZS5qc1xuICogaHR0cDovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgMjAwNSwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE1LTA0LTI4VDE2OjAxWlxuICovXG5cbihmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Ly8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YFxuXHRcdC8vIGlzIHByZXNlbnQsIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkuXG5cdFx0Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBoYXZlIGEgYHdpbmRvd2Agd2l0aCBhIGBkb2N1bWVudGBcblx0XHQvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy5cblx0XHQvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIGB3aW5kb3dgLlxuXHRcdC8vIGUuZy4gdmFyIGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIikod2luZG93KTtcblx0XHQvLyBTZWUgdGlja2V0ICMxNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrXG4vLyBDYW4ndCBiZSBpbiBzdHJpY3QgbW9kZSwgc2V2ZXJhbCBsaWJzIGluY2x1ZGluZyBBU1AuTkVUIHRyYWNlXG4vLyB0aGUgc3RhY2sgdmlhIGFyZ3VtZW50cy5jYWxsZXIuY2FsbGVlIGFuZCBGaXJlZm94IGRpZXMgaWZcbi8vIHlvdSB0cnkgdG8gdHJhY2UgdGhyb3VnaCBcInVzZSBzdHJpY3RcIiBjYWxsIGNoYWlucy4gKCMxMzMzNSlcbi8vXG5cbnZhciBhcnIgPSBbXTtcblxudmFyIHNsaWNlID0gYXJyLnNsaWNlO1xuXG52YXIgY29uY2F0ID0gYXJyLmNvbmNhdDtcblxudmFyIHB1c2ggPSBhcnIucHVzaDtcblxudmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjtcblxudmFyIGNsYXNzMnR5cGUgPSB7fTtcblxudmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxudmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cblxuXG52YXJcblx0Ly8gVXNlIHRoZSBjb3JyZWN0IGRvY3VtZW50IGFjY29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5kYm94KVxuXHRkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCxcblxuXHR2ZXJzaW9uID0gXCIyLjEuNFwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjFcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLFxuXG5cdC8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xuXHRybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW1xcZGEtel0pL2dpLFxuXG5cdC8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKClcblx0ZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHtcblx0XHRyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG5cdH07XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvclxuXHRzZWxlY3RvcjogXCJcIixcblxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcblx0bGVuZ3RoOiAwLFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxuXHQvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheVxuXHRnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7XG5cdFx0cmV0dXJuIG51bSAhPSBudWxsID9cblxuXHRcdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldFxuXHRcdFx0KCBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdICkgOlxuXG5cdFx0XHQvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBpbiBhIGNsZWFuIGFycmF5XG5cdFx0XHRzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXHRcdHJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdC8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzXG5cdC8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5Lilcblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApO1xuXHRcdH0pKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzW2pdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKG51bGwpO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXG5cdHB1c2g6IHB1c2gsXG5cdHNvcnQ6IGFyci5zb3J0LFxuXHRzcGxpY2U6IGFyci5zcGxpY2Vcbn07XG5cbmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG5cdHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSxcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdC8vIEV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZFxuXHRpZiAoIGkgPT09IGxlbmd0aCApIHtcblx0XHR0YXJnZXQgPSB0aGlzO1xuXHRcdGktLTtcblx0fVxuXG5cdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoIChvcHRpb25zID0gYXJndW1lbnRzWyBpIF0pICE9IG51bGwgKSB7XG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRcdHNyYyA9IHRhcmdldFsgbmFtZSBdO1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1sgbmFtZSBdO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0aWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdChjb3B5KSB8fCAoY29weUlzQXJyYXkgPSBqUXVlcnkuaXNBcnJheShjb3B5KSkgKSApIHtcblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICkge1xuXHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0aXNGdW5jdGlvbjogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gXCJmdW5jdGlvblwiO1xuXHR9LFxuXG5cdGlzQXJyYXk6IEFycmF5LmlzQXJyYXksXG5cblx0aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fSxcblxuXHRpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKG51bGx8dHJ1ZXxmYWxzZXxcIlwiKVxuXHRcdC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcblx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHQvLyBhZGRpbmcgMSBjb3JyZWN0cyBsb3NzIG9mIHByZWNpc2lvbiBmcm9tIHBhcnNlRmxvYXQgKCMxNTEwMClcblx0XHRyZXR1cm4gIWpRdWVyeS5pc0FycmF5KCBvYmogKSAmJiAob2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKyAxKSA+PSAwO1xuXHR9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0Ly8gTm90IHBsYWluIG9iamVjdHM6XG5cdFx0Ly8gLSBBbnkgb2JqZWN0IG9yIHZhbHVlIHdob3NlIGludGVybmFsIFtbQ2xhc3NdXSBwcm9wZXJ0eSBpcyBub3QgXCJbb2JqZWN0IE9iamVjdF1cIlxuXHRcdC8vIC0gRE9NIG5vZGVzXG5cdFx0Ly8gLSB3aW5kb3dcblx0XHRpZiAoIGpRdWVyeS50eXBlKCBvYmogKSAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIG9iai5jb25zdHJ1Y3RvciAmJlxuXHRcdFx0XHQhaGFzT3duLmNhbGwoIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiaXNQcm90b3R5cGVPZlwiICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGZ1bmN0aW9uIGhhc24ndCByZXR1cm5lZCBhbHJlYWR5LCB3ZSdyZSBjb25maWRlbnQgdGhhdFxuXHRcdC8vIHxvYmp8IGlzIGEgcGxhaW4gb2JqZWN0LCBjcmVhdGVkIGJ5IHt9IG9yIGNvbnN0cnVjdGVkIHdpdGggbmV3IE9iamVjdFxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdGlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIG5hbWU7XG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHRcdH1cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMCwgaU9TPDYgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbChvYmopIF0gfHwgXCJvYmplY3RcIiA6XG5cdFx0XHR0eXBlb2Ygb2JqO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0XG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlICkge1xuXHRcdHZhciBzY3JpcHQsXG5cdFx0XHRpbmRpcmVjdCA9IGV2YWw7XG5cblx0XHRjb2RlID0galF1ZXJ5LnRyaW0oIGNvZGUgKTtcblxuXHRcdGlmICggY29kZSApIHtcblx0XHRcdC8vIElmIHRoZSBjb2RlIGluY2x1ZGVzIGEgdmFsaWQsIHByb2xvZ3VlIHBvc2l0aW9uXG5cdFx0XHQvLyBzdHJpY3QgbW9kZSBwcmFnbWEsIGV4ZWN1dGUgY29kZSBieSBpbmplY3RpbmcgYVxuXHRcdFx0Ly8gc2NyaXB0IHRhZyBpbnRvIHRoZSBkb2N1bWVudC5cblx0XHRcdGlmICggY29kZS5pbmRleE9mKFwidXNlIHN0cmljdFwiKSA9PT0gMSApIHtcblx0XHRcdFx0c2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcblx0XHRcdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPdGhlcndpc2UsIGF2b2lkIHRoZSBET00gbm9kZSBjcmVhdGlvbiwgaW5zZXJ0aW9uXG5cdFx0XHQvLyBhbmQgcmVtb3ZhbCBieSB1c2luZyBhbiBpbmRpcmVjdCBnbG9iYWwgZXZhbFxuXHRcdFx0XHRpbmRpcmVjdCggY29kZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxuXHRjYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG5cdH0sXG5cblx0bm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9LFxuXG5cdC8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2ssIGFyZ3MgKSB7XG5cdFx0dmFyIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoLFxuXHRcdFx0aXNBcnJheSA9IGlzQXJyYXlsaWtlKCBvYmogKTtcblxuXHRcdGlmICggYXJncyApIHtcblx0XHRcdGlmICggaXNBcnJheSApIHtcblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggaXNBcnJheSApIHtcblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApO1xuXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xXG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlsaWtlKCBPYmplY3QoYXJyKSApICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHJldCxcblx0XHRcdFx0XHR0eXBlb2YgYXJyID09PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTtcblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRpc0FycmF5ID0gaXNBcnJheWxpa2UoIGVsZW1zICksXG5cdFx0XHRyZXQgPSBbXTtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpciBuZXcgdmFsdWVzXG5cdFx0aWYgKCBpc0FycmF5ICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBjb25jYXQuYXBwbHkoIFtdLCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcblx0Ly8gYXJndW1lbnRzLlxuXHRwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkge1xuXHRcdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XG5cdFx0XHRjb250ZXh0ID0gZm47XG5cdFx0XHRmbiA9IHRtcDtcblx0XHR9XG5cblx0XHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHRcdC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuXG5cdFx0aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFNpbXVsYXRlZCBiaW5kXG5cdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApO1xuXHRcdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQgfHwgdGhpcywgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTtcblx0XHR9O1xuXG5cdFx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdFx0cHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7XG5cblx0XHRyZXR1cm4gcHJveHk7XG5cdH0sXG5cblx0bm93OiBEYXRlLm5vdyxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSk7XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yXCIuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbihpLCBuYW1lKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlsaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogaU9TIDguMiAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0b3IpXG5cdC8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSlcblx0Ly8gaGFzT3duIGlzbid0IHVzZWQgaGVyZSBkdWUgdG8gZmFsc2UgbmVnYXRpdmVzXG5cdC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUVcblx0dmFyIGxlbmd0aCA9IFwibGVuZ3RoXCIgaW4gb2JqICYmIG9iai5sZW5ndGgsXG5cdFx0dHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblxuXHRpZiAoIHR5cGUgPT09IFwiZnVuY3Rpb25cIiB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggb2JqLm5vZGVUeXBlID09PSAxICYmIGxlbmd0aCApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4yLjAtcHJlXG4gKiBodHRwOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCAyMDA4LCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTQtMTItMTZcbiAqL1xuKGZ1bmN0aW9uKCB3aW5kb3cgKSB7XG5cbnZhciBpLFxuXHRzdXBwb3J0LFxuXHRFeHByLFxuXHRnZXRUZXh0LFxuXHRpc1hNTCxcblx0dG9rZW5pemUsXG5cdGNvbXBpbGUsXG5cdHNlbGVjdCxcblx0b3V0ZXJtb3N0Q29udGV4dCxcblx0c29ydElucHV0LFxuXHRoYXNEdXBsaWNhdGUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRzZXREb2N1bWVudCxcblx0ZG9jdW1lbnQsXG5cdGRvY0VsZW0sXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdHJidWdneU1hdGNoZXMsXG5cdG1hdGNoZXMsXG5cdGNvbnRhaW5zLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IFwic2l6emxlXCIgKyAxICogbmV3IERhdGUoKSxcblx0cHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEdlbmVyYWwtcHVycG9zZSBjb25zdGFudHNcblx0TUFYX05FR0FUSVZFID0gMSA8PCAzMSxcblxuXHQvLyBJbnN0YW5jZSBtZXRob2RzXG5cdGhhc093biA9ICh7fSkuaGFzT3duUHJvcGVydHksXG5cdGFyciA9IFtdLFxuXHRwb3AgPSBhcnIucG9wLFxuXHRwdXNoX25hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXHQvLyBVc2UgYSBzdHJpcHBlZC1kb3duIGluZGV4T2YgYXMgaXQncyBmYXN0ZXIgdGhhbiBuYXRpdmVcblx0Ly8gaHR0cDovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFtpXSA9PT0gZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlXG5cdHdoaXRlc3BhY2UgPSBcIltcXFxceDIwXFxcXHRcXFxcclxcXFxuXFxcXGZdXCIsXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNjaGFyYWN0ZXJzXG5cdGNoYXJhY3RlckVuY29kaW5nID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXFxceDAwLVxcXFx4YTBdKStcIixcblxuXHQvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVyc1xuXHQvLyBBbiB1bnF1b3RlZCB2YWx1ZSBzaG91bGQgYmUgYSBDU1MgaWRlbnRpZmllciBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHQvLyBQcm9wZXIgc3ludGF4OiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcblx0aWRlbnRpZmllciA9IGNoYXJhY3RlckVuY29kaW5nLnJlcGxhY2UoIFwid1wiLCBcIncjXCIgKSxcblxuXHQvLyBBdHRyaWJ1dGUgc2VsZWN0b3JzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cdFx0Ly8gT3BlcmF0b3IgKGNhcHR1cmUgMilcblx0XHRcIiooWypeJHwhfl0/PSlcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGNoYXJhY3RlckVuY29kaW5nICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKVwiICksXG5cdFx0XCJDTEFTU1wiOiBuZXcgUmVnRXhwKCBcIl5cXFxcLihcIiArIGNoYXJhY3RlckVuY29kaW5nICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCBcIndcIiwgXCJ3KlwiICkgKyBcIilcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblx0cmVzY2FwZSA9IC8nfFxcXFwvZyxcblxuXHQvLyBDU1MgZXNjYXBlcyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gVXNlZCBmb3IgaWZyYW1lc1xuXHQvLyBTZWUgc2V0RG9jdW1lbnQoKVxuXHQvLyBSZW1vdmluZyB0aGUgZnVuY3Rpb24gd3JhcHBlciBjYXVzZXMgYSBcIlBlcm1pc3Npb24gRGVuaWVkXCJcblx0Ly8gZXJyb3IgaW4gSUVcblx0dW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNldERvY3VtZW50KCk7XG5cdH07XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG1hdGNoLCBlbGVtLCBtLCBub2RlVHlwZSxcblx0XHQvLyBRU0EgdmFyc1xuXHRcdGksIGdyb3Vwcywgb2xkLCBuaWQsIG5ld0NvbnRleHQsIG5ld1NlbGVjdG9yO1xuXG5cdGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXG5cdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblx0bm9kZVR5cGUgPSBjb250ZXh0Lm5vZGVUeXBlO1xuXG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0aWYgKCAhc2VlZCAmJiBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgd2hlbiBwb3NzaWJsZSAoZS5nLiwgbm90IHVuZGVyIERvY3VtZW50RnJhZ21lbnQpXG5cdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHtcblx0XHRcdC8vIFNwZWVkLXVwOiBTaXp6bGUoXCIjSURcIilcblx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XG5cdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKTtcblx0XHRcdFx0XHQvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJuc1xuXHRcdFx0XHRcdC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKGpRdWVyeSAjNjk2Mylcblx0XHRcdFx0XHRpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXNcblx0XHRcdFx0XHRcdC8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDb250ZXh0IGlzIG5vdCBhIGRvY3VtZW50XG5cdFx0XHRcdFx0aWYgKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgJiYgKGVsZW0gPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgJiZcblx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiYgZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdC8vIFNwZWVkLXVwOiBTaXp6bGUoXCJUQUdcIilcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzJdICkge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiLkNMQVNTXCIpXG5cdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFFTQSBwYXRoXG5cdFx0aWYgKCBzdXBwb3J0LnFzYSAmJiAoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkge1xuXHRcdFx0bmlkID0gb2xkID0gZXhwYW5kbztcblx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0bmV3U2VsZWN0b3IgPSBub2RlVHlwZSAhPT0gMSAmJiBzZWxlY3RvcjtcblxuXHRcdFx0Ly8gcVNBIHdvcmtzIHN0cmFuZ2VseSBvbiBFbGVtZW50LXJvb3RlZCBxdWVyaWVzXG5cdFx0XHQvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290XG5cdFx0XHQvLyBhbmQgd29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhlIHRlY2huaXF1ZSlcblx0XHRcdC8vIElFIDggZG9lc24ndCB3b3JrIG9uIG9iamVjdCBlbGVtZW50c1xuXHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXG5cdFx0XHRcdGlmICggKG9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIikpICkge1xuXHRcdFx0XHRcdG5pZCA9IG9sZC5yZXBsYWNlKCByZXNjYXBlLCBcIlxcXFwkJlwiICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgbmlkICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bmlkID0gXCJbaWQ9J1wiICsgbmlkICsgXCInXSBcIjtcblxuXHRcdFx0XHRpID0gZ3JvdXBzLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0Z3JvdXBzW2ldID0gbmlkICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQ7XG5cdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oXCIsXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsXG5cdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9IGNhdGNoKHFzYUVycm9yKSB7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCAhb2xkICkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoXCJpZFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBbGwgb3RoZXJzXG5cdHJldHVybiBzZWxlY3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApO1xufVxuXG4vKipcbiAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZVxuICogQHJldHVybnMge0Z1bmN0aW9uKHN0cmluZywgT2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aFxuICpcdHByb3BlcnR5IG5hbWUgdGhlIChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4cHIuY2FjaGVMZW5ndGgpXG4gKlx0ZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeVxuICovXG5mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcblx0dmFyIGtleXMgPSBbXTtcblxuXHRmdW5jdGlvbiBjYWNoZSgga2V5LCB2YWx1ZSApIHtcblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblx0XHRcdC8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllc1xuXHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTtcblx0XHR9XG5cdFx0cmV0dXJuIChjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrXG4gKi9cbmZ1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7XG5cdGZuWyBleHBhbmRvIF0gPSB0cnVlO1xuXHRyZXR1cm4gZm47XG59XG5cbi8qKlxuICogU3VwcG9ydCB0ZXN0aW5nIHVzaW5nIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFBhc3NlZCB0aGUgY3JlYXRlZCBkaXYgYW5kIGV4cGVjdHMgYSBib29sZWFuIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhc3NlcnQoIGZuICkge1xuXHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBkaXYgKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblx0XHQvLyBSZW1vdmUgZnJvbSBpdHMgcGFyZW50IGJ5IGRlZmF1bHRcblx0XHRpZiAoIGRpdi5wYXJlbnROb2RlICkge1xuXHRcdFx0ZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApO1xuXHRcdH1cblx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxuXHRcdGRpdiA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KFwifFwiKSxcblx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGRvY3VtZW50IG9yZGVyIG9mIHR3byBzaWJsaW5nc1xuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgbGVzcyB0aGFuIDAgaWYgYSBwcmVjZWRlcyBiLCBncmVhdGVyIHRoYW4gMCBpZiBhIGZvbGxvd3MgYlxuICovXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7XG5cdHZhciBjdXIgPSBiICYmIGEsXG5cdFx0ZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdCggfmIuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICkgLVxuXHRcdFx0KCB+YS5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKTtcblxuXHQvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXNcblx0aWYgKCBkaWZmICkge1xuXHRcdHJldHVybiBkaWZmO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgYiBmb2xsb3dzIGFcblx0aWYgKCBjdXIgKSB7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAobmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgcGFyZW50LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBJZiBubyBkb2N1bWVudCBhbmQgZG9jdW1lbnRFbGVtZW50IGlzIGF2YWlsYWJsZSwgcmV0dXJuXG5cdGlmICggZG9jID09PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9XG5cblx0Ly8gU2V0IG91ciBkb2N1bWVudFxuXHRkb2N1bWVudCA9IGRvYztcblx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdHBhcmVudCA9IGRvYy5kZWZhdWx0VmlldztcblxuXHQvLyBTdXBwb3J0OiBJRT44XG5cdC8vIElmIGlmcmFtZSBkb2N1bWVudCBpcyBhc3NpZ25lZCB0byBcImRvY3VtZW50XCIgdmFyaWFibGUgYW5kIGlmIGlmcmFtZSBoYXMgYmVlbiByZWxvYWRlZCxcblx0Ly8gSUUgd2lsbCB0aHJvdyBcInBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBhY2Nlc3NpbmcgXCJkb2N1bWVudFwiIHZhcmlhYmxlLCBzZWUgalF1ZXJ5ICMxMzkzNlxuXHQvLyBJRTYtOCBkbyBub3Qgc3VwcG9ydCB0aGUgZGVmYXVsdFZpZXcgcHJvcGVydHkgc28gcGFyZW50IHdpbGwgYmUgdW5kZWZpbmVkXG5cdGlmICggcGFyZW50ICYmIHBhcmVudCAhPT0gcGFyZW50LnRvcCApIHtcblx0XHQvLyBJRTExIGRvZXMgbm90IGhhdmUgYXR0YWNoRXZlbnQsIHNvIGFsbCBtdXN0IHN1ZmZlclxuXHRcdGlmICggcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblx0XHR9IGVsc2UgaWYgKCBwYXJlbnQuYXR0YWNoRXZlbnQgKSB7XG5cdFx0XHRwYXJlbnQuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgdW5sb2FkSGFuZGxlciApO1xuXHRcdH1cblx0fVxuXG5cdC8qIFN1cHBvcnQgdGVzdHNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jICk7XG5cblx0LyogQXR0cmlidXRlc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gU3VwcG9ydDogSUU8OFxuXHQvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXNcblx0Ly8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpXG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWRpdi5nZXRBdHRyaWJ1dGUoXCJjbGFzc05hbWVcIik7XG5cdH0pO1xuXG5cdC8qIGdldEVsZW1lbnQocylCeSpcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUNvbW1lbnQoXCJcIikgKTtcblx0XHRyZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBTdXBwb3J0OiBJRTw5XG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IHJuYXRpdmUudGVzdCggZG9jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvYy5nZXRFbGVtZW50c0J5TmFtZSB8fCAhZG9jLmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaW5kIGFuZCBmaWx0ZXJcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maW5kW1wiSURcIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cdFx0XHRcdC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zXG5cdFx0XHRcdC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjNcblx0XHRcdFx0cmV0dXJuIG0gJiYgbS5wYXJlbnROb2RlID8gWyBtIF0gOiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdEV4cHIuZmlsdGVyW1wiSURcIl0gPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHQvLyBTdXBwb3J0OiBJRTYvN1xuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRkZWxldGUgRXhwci5maW5kW1wiSURcIl07XG5cblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbXCJUQUdcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFtcIkNMQVNTXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApO1xuXHRcdH1cblx0fTtcblxuXHQvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0XG5cblx0Ly8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSlcblx0cmJ1Z2d5TWF0Y2hlcyA9IFtdO1xuXG5cdC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpXG5cdC8vIFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRocm93cyBhbiBlcnJvclxuXHQvLyB3aGVuZXZlciBgZG9jdW1lbnQuYWN0aXZlRWxlbWVudGAgaXMgYWNjZXNzZWQgb24gYW4gaWZyYW1lXG5cdC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yXG5cdC8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OFxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHRpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jLnF1ZXJ5U2VsZWN0b3JBbGwgKSkgKSB7XG5cdFx0Ly8gQnVpbGQgUVNBIHJlZ2V4XG5cdFx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OVxuXHRcdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZGl2ICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2hoNDY1Mzg4LmFzcHgjYXR0cmlidXRlX3NlY3Rpb25cblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbc2VsZWN0ZWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuMissIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS43K1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiOmNoZWNrZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2liaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIuIy4rWyt+XVwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvYy5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcImhpZGRlblwiICk7XG5cdFx0XHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZT1kXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIipbKl4kfCF+XT89XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZClcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqLDp4XCIpO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIsLio6XCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8XG5cdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IpICkpICkge1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3Jcblx0XHRcdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpXG5cdFx0XHRzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBkaXYsIFwiZGl2XCIgKTtcblxuXHRcdFx0Ly8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvblxuXHRcdFx0Ly8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZFxuXHRcdFx0bWF0Y2hlcy5jYWxsKCBkaXYsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgZG9lcyBub3QgaW1wbGVtZW50IGluY2x1c2l2ZSBkZXNjZW5kZW50XG5cdC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmXG5cdGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29udGFpbnMgKSA/XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLFxuXHRcdFx0XHRidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblx0XHRcdHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRhZG93bi5jb250YWlucyA/XG5cdFx0XHRcdFx0YWRvd24uY29udGFpbnMoIGJ1cCApIDpcblx0XHRcdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0XHRcdCkpO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0aWYgKCBiICkge1xuXHRcdFx0XHR3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHtcblx0XHRcdFx0XHRpZiAoIGIgPT09IGEgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdC8qIFNvcnRpbmdcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmdcblx0c29ydE9yZGVyID0gaGFzQ29tcGFyZSA/XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuXHRcdHZhciBjb21wYXJlID0gIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtcblx0XHRpZiAoIGNvbXBhcmUgKSB7XG5cdFx0XHRyZXR1cm4gY29tcGFyZTtcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRoZSBzYW1lIGRvY3VtZW50XG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID9cblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0MTtcblxuXHRcdC8vIERpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdGlmICggY29tcGFyZSAmIDEgfHxcblx0XHRcdCghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlKSApIHtcblxuXHRcdFx0Ly8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50XG5cdFx0XHRpZiAoIGEgPT09IGRvYyB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGEpICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGIgPT09IGRvYyB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jID8gLTEgOlxuXHRcdFx0XHRiID09PSBkb2MgPyAxIDpcblx0XHRcdFx0YXVwID8gLTEgOlxuXHRcdFx0XHRidXAgPyAxIDpcblx0XHRcdFx0c29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Ly8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2tcblx0XHR9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHtcblx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvblxuXHRcdGN1ciA9IGE7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YXAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXHRcdGN1ciA9IGI7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YnAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3lcblx0XHR3aGlsZSAoIGFwW2ldID09PSBicFtpXSApIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gaSA/XG5cdFx0XHQvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3Jcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3Rcblx0XHRcdGFwW2ldID09PSBwcmVmZXJyZWREb2MgPyAtMSA6XG5cdFx0XHRicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6XG5cdFx0XHQwO1xuXHR9O1xuXG5cdHJldHVybiBkb2M7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIGRpZmYsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9IG5vZGVbIGRpciBdKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggb2ZUeXBlID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gcGFyZW50WyBleHBhbmRvIF0gfHwgKHBhcmVudFsgZXhwYW5kbyBdID0ge30pO1xuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IG91dGVyQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMV07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBjYWNoZVsyXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHNlZWtpbmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVha1xuXHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB1c2VDYWNoZSAmJiAoY2FjaGUgPSAoZWxlbVsgZXhwYW5kbyBdIHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSkpWyB0eXBlIF0pICYmIGNhY2hlWzBdID09PSBkaXJydW5zICkge1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gY2FjaGVbMV07XG5cblx0XHRcdFx0XHRcdC8vIHhtbCA6bnRoLWNoaWxkKC4uLikgb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYgKytkaWZmICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0KG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkge1xuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXG5cdFx0XHQvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyc1xuXHRcdFx0Ly8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvc1xuXHRcdFx0dmFyIGFyZ3MsXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBTaXp6bGUgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZiggc2VlZCwgbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmbjtcblx0XHR9XG5cdH0sXG5cblx0cHNldWRvczoge1xuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksXG5cdFx0XHRcdFx0XHRpID0gc2VlZC5sZW5ndGg7XG5cblx0XHRcdFx0XHQvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgXG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdGlucHV0WzBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdFx0XHRpbnB1dFswXSA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuICFyZXN1bHRzLnBvcCgpO1xuXHRcdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJoYXNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkb1xuXHRcdFwibGFuZ1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8IFwiXCIpICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0XCJ0YXJnZXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDtcblx0XHR9LFxuXG5cdFx0XCJyb290XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY0VsZW07XG5cdFx0fSxcblxuXHRcdFwiZm9jdXNcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRcImVuYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7XG5cdFx0fSxcblxuXHRcdFwiZGlzYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJjaGVja2VkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09IFwib3B0aW9uXCIgJiYgISFlbGVtLnNlbGVjdGVkKTtcblx0XHR9LFxuXG5cdFx0XCJzZWxlY3RlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcblx0XHRcdC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHlcblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0XCJlbXB0eVwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJwYXJlbnRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1tcImVtcHR5XCJdKCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJidXR0b25cIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblxuXHRcdFwidGV4dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRcdC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCBcInNlYXJjaFwiKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09IFwidGV4dFwiXG5cdFx0XHRcdCggKGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIiApO1xuXHRcdH0sXG5cblx0XHQvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uXG5cdFx0XCJmaXJzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFsgMCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJsYXN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0pLFxuXG5cdFx0XCJlcVwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSksXG5cblx0XHRcImV2ZW5cIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcIm9kZFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwibHRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJndFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pXG5cdH1cbn07XG5cbkV4cHIucHNldWRvc1tcIm50aFwiXSA9IEV4cHIucHNldWRvc1tcImVxXCJdO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbnRva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7XG5cdHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLFxuXHRcdHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggY2FjaGVkICkge1xuXHRcdHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7XG5cdH1cblxuXHRzb0ZhciA9IHNlbGVjdG9yO1xuXHRncm91cHMgPSBbXTtcblx0cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyO1xuXG5cdHdoaWxlICggc29GYXIgKSB7XG5cblx0XHQvLyBDb21tYSBhbmQgZmlyc3QgcnVuXG5cdFx0aWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0Zhcjtcblx0XHRcdH1cblx0XHRcdGdyb3Vwcy5wdXNoKCAodG9rZW5zID0gW10pICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCBcIiBcIiApXG5cdFx0XHR9KTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoIChtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdChtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xuXHQvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmdcblx0Ly8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zXG5cdHJldHVybiBwYXJzZU9ubHkgP1xuXHRcdHNvRmFyLmxlbmd0aCA6XG5cdFx0c29GYXIgP1xuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcblx0XHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHRcdHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApO1xufTtcblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRjaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBkaXIgPT09IFwicGFyZW50Tm9kZVwiLFxuXHRcdGRvbmVOYW1lID0gZG9uZSsrO1xuXG5cdHJldHVybiBjb21iaW5hdG9yLmZpcnN0ID9cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGFsbCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudHNcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIG9sZENhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gZGlyIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXHRcdFx0XHRcdFx0aWYgKCAob2xkQ2FjaGUgPSBvdXRlckNhY2hlWyBkaXIgXSkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsgZGlyIF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ICE9PSBkb2N1bWVudCAmJiBjb250ZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgZWxlbWVudHMgcGFzc2luZyBlbGVtZW50TWF0Y2hlcnMgZGlyZWN0bHkgdG8gcmVzdWx0c1xuXHRcdFx0Ly8gS2VlcCBgaWAgYSBzdHJpbmcgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIHNvIGBtYXRjaGVkQ291bnRgIHdpbGwgYmUgXCIwMFwiIGJlbG93XG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZvciBzZXQgZmlsdGVyc1xuXHRcdFx0XHRpZiAoIGJ5U2V0ICkge1xuXHRcdFx0XHRcdC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnNcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gIW1hdGNoZXIgJiYgZWxlbSkgKSB7XG5cdFx0XHRcdFx0XHRtYXRjaGVkQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90XG5cdFx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdFx0dW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblx0XHRcdGlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkge1xuXHRcdFx0XHRqID0gMDtcblx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IHNldE1hdGNoZXJzW2orK10pICkge1xuXHRcdFx0XHRcdG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0Ly8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZ1xuXHRcdFx0XHRcdGlmICggbWF0Y2hlZENvdW50ID4gMCApIHtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRcdHNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRGlzY2FyZCBpbmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXNcblx0XHRcdFx0XHRzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHNcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApO1xuXG5cdFx0XHRcdC8vIFNlZWRsZXNzIHNldCBtYXRjaGVzIHN1Y2NlZWRpbmcgbXVsdGlwbGUgc3VjY2Vzc2Z1bCBtYXRjaGVycyBzdGlwdWxhdGUgc29ydGluZ1xuXHRcdFx0XHRpZiAoIG91dGVybW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHQoIG1hdGNoZWRDb3VudCArIHNldE1hdGNoZXJzLmxlbmd0aCApID4gMSApIHtcblxuXHRcdFx0XHRcdFNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gT3ZlcnJpZGUgbWFuaXB1bGF0aW9uIG9mIGdsb2JhbHMgYnkgbmVzdGVkIG1hdGNoZXJzXG5cdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5tYXRjaGVkO1xuXHRcdH07XG5cblx0cmV0dXJuIGJ5U2V0ID9cblx0XHRtYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDpcblx0XHRzdXBlck1hdGNoZXI7XG59XG5cbmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdHZhciBpLFxuXHRcdHNldE1hdGNoZXJzID0gW10sXG5cdFx0ZWxlbWVudE1hdGNoZXJzID0gW10sXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggIWNhY2hlZCApIHtcblx0XHQvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnRcblx0XHRpZiAoICFtYXRjaCApIHtcblx0XHRcdG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0fVxuXHRcdGkgPSBtYXRjaC5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTtcblx0XHRcdGlmICggY2FjaGVkWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvblxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoIHNlbGVjdG9yLCBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSApO1xuXG5cdFx0Ly8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uXG5cdFx0Y2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdH1cblx0cmV0dXJuIGNhY2hlZDtcbn07XG5cbi8qKlxuICogQSBsb3ctbGV2ZWwgc2VsZWN0aW9uIGZ1bmN0aW9uIHRoYXQgd29ya3Mgd2l0aCBTaXp6bGUncyBjb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uc1xuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHNlbGVjdG9yIEEgc2VsZWN0b3Igb3IgYSBwcmUtY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbiBidWlsdCB3aXRoIFNpenpsZS5jb21waWxlXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHRcbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHRzXVxuICogQHBhcmFtIHtBcnJheX0gW3NlZWRdIEEgc2V0IG9mIGVsZW1lbnRzIHRvIG1hdGNoIGFnYWluc3RcbiAqL1xuc2VsZWN0ID0gU2l6emxlLnNlbGVjdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsXG5cdFx0Y29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBzZWxlY3Rvcixcblx0XHRtYXRjaCA9ICFzZWVkICYmIHRva2VuaXplKCAoc2VsZWN0b3IgPSBjb21waWxlZC5zZWxlY3RvciB8fCBzZWxlY3RvcikgKTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBubyBzZWVkIGFuZCBvbmx5IG9uZSBncm91cFxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0c3VwcG9ydC5nZXRCeUlkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHRcdFx0RXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kW1wiSURcIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwcltcIm5lZWRzQ29udGV4dFwiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHtcblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdFx0XHRcdCkpICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0cnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KFwiXCIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oXCJcIikgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGRpdjEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHhcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PSBcIiNcIiA7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidHlwZVwiID8gMSA6IDIgKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5pZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRkaXYuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiwgXCJcIiApO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRyZXR1cm4gZGl2LmdldEF0dHJpYnV0ZShcImRpc2FibGVkXCIpID09IG51bGw7XG59KSApIHtcblx0YWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciB2YWw7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0fVxuXHR9KTtcbn1cblxucmV0dXJuIFNpenpsZTtcblxufSkoIHdpbmRvdyApO1xuXG5cblxualF1ZXJ5LmZpbmQgPSBTaXp6bGU7XG5qUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7XG5qUXVlcnkuZXhwcltcIjpcIl0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0O1xualF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDtcbmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDtcbmpRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWlucztcblxuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG52YXIgcnNpbmdsZVRhZyA9ICgvXjwoXFx3KylcXHMqXFwvPz4oPzo8XFwvXFwxPnwpJC8pO1xuXG5cblxudmFyIHJpc1NpbXBsZSA9IC9eLlteOiNcXFtcXC4sXSokLztcblxuLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3RcbmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkge1xuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0cmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90O1xuXHRcdH0pO1xuXG5cdH1cblxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSk7XG5cblx0fVxuXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRpZiAoIHJpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTtcblx0XHR9XG5cblx0XHRxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzICk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID49IDAgKSAhPT0gbm90O1xuXHR9KTtcbn1cblxualF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xuXHR2YXIgZWxlbSA9IGVsZW1zWyAwIF07XG5cblx0aWYgKCBub3QgKSB7XG5cdFx0ZXhwciA9IFwiOm5vdChcIiArIGV4cHIgKyBcIilcIjtcblx0fVxuXG5cdHJldHVybiBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSA/XG5cdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdIDpcblx0XHRqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdFx0fSkpO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSkgKTtcblx0XHR9XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApO1xuXHRcdH1cblxuXHRcdC8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVjdG9yLCBjb250ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKVxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQgKTtcblx0XHRyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciArIFwiIFwiICsgc2VsZWN0b3IgOiBzZWxlY3Rvcjtcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UpICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0pO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKikpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIEhUTUwgc3RyaW5nc1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0aWYgKCBzZWxlY3RvclswXSA9PT0gXCI8XCIgJiYgc2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiYgc2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWzFdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFswXSA6IGNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBPcHRpb24gdG8gcnVuIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbGx5IGxldCB0aGUgZXJyb3IgYmUgdGhyb3duIGlmIHBhcnNlSFRNTCBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTChcblx0XHRcdFx0XHRcdG1hdGNoWzFdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWzFdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFByb3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGVcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBCbGFja2JlcnJ5IDQuNlxuXHRcdFx0XHRcdC8vIGdFQklEIHJldHVybnMgbm9kZXMgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAoIzY5NjMpXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0XHR0aGlzWzBdID0gZWxlbTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLmNvbnRleHQgPSBkb2N1bWVudDtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsICQoLi4uKSlcblx0XHRcdH0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gKCBjb250ZXh0IHx8IHJvb3RqUXVlcnkgKS5maW5kKCBzZWxlY3RvciApO1xuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dClcblx0XHRcdC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSEFORExFOiAkKERPTUVsZW1lbnQpXG5cdFx0fSBlbHNlIGlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiB0eXBlb2Ygcm9vdGpRdWVyeS5yZWFkeSAhPT0gXCJ1bmRlZmluZWRcIiA/XG5cdFx0XHRcdHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0O1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHRcdHZhciBtYXRjaGVkID0gW10sXG5cdFx0XHR0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7XG5cblx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBtYXRjaGVkO1xuXHR9LFxuXG5cdHNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkge1xuXHRcdHZhciBtYXRjaGVkID0gW107XG5cblx0XHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdFx0aWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7XG5cdFx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVkO1xuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGhhczogZnVuY3Rpb24oIHRhcmdldCApIHtcblx0XHR2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksXG5cdFx0XHRsID0gdGFyZ2V0cy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDpcblx0XHRcdFx0MDtcblxuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdGZvciAoIGN1ciA9IHRoaXNbaV07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHQvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHNcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAocG9zID9cblx0XHRcdFx0XHRwb3MuaW5kZXgoY3VyKSA+IC0xIDpcblxuXHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSkgKSB7XG5cblx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlKCBtYXRjaGVkICkgOiBtYXRjaGVkICk7XG5cdH0sXG5cblx0Ly8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0XG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBJbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcyxcblxuXHRcdFx0Ly8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkXG5cdFx0XHRlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW1cblx0XHQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWUoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihzZWxlY3Rvcilcblx0XHQpO1xuXHR9XG59KTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKGN1ciA9IGN1cltkaXJdKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCh7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LnNpYmxpbmcoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudCB8fCBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZSggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0pO1xudmFyIHJub3R3aGl0ZSA9ICgvXFxTKy9nKTtcblxuXG5cbi8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGVcbnZhciBvcHRpb25zQ2FjaGUgPSB7fTtcblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0gb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0pO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdCggb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gfHwgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIExhc3QgZmlyZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cylcblx0XHRtZW1vcnksXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXHRcdC8vIEZpcnN0IGNhbGxiYWNrIHRvIGZpcmUgKHVzZWQgaW50ZXJuYWxseSBieSBhZGQgYW5kIGZpcmVXaXRoKVxuXHRcdGZpcmluZ1N0YXJ0LFxuXHRcdC8vIEVuZCBvZiB0aGUgbG9vcCB3aGVuIGZpcmluZ1xuXHRcdGZpcmluZ0xlbmd0aCxcblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1vdmUgaWYgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4LFxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXHRcdC8vIFN0YWNrIG9mIGZpcmUgY2FsbHMgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRzdGFjayA9ICFvcHRpb25zLm9uY2UgJiYgW10sXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdFx0XHRtZW1vcnkgPSBvcHRpb25zLm1lbW9yeSAmJiBkYXRhO1xuXHRcdFx0ZmlyZWQgPSB0cnVlO1xuXHRcdFx0ZmlyaW5nSW5kZXggPSBmaXJpbmdTdGFydCB8fCAwO1xuXHRcdFx0ZmlyaW5nU3RhcnQgPSAwO1xuXHRcdFx0ZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRmaXJpbmcgPSB0cnVlO1xuXHRcdFx0Zm9yICggOyBsaXN0ICYmIGZpcmluZ0luZGV4IDwgZmlyaW5nTGVuZ3RoOyBmaXJpbmdJbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIGRhdGFbIDAgXSwgZGF0YVsgMSBdICkgPT09IGZhbHNlICYmIG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7IC8vIFRvIHByZXZlbnQgZnVydGhlciBjYWxscyB1c2luZyBhZGRcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdGlmICggc3RhY2sgKSB7XG5cdFx0XHRcdFx0aWYgKCBzdGFjay5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCBzdGFjay5zaGlmdCgpICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYuZGlzYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0Ly8gRmlyc3QsIHdlIHNhdmUgdGhlIGN1cnJlbnQgbGVuZ3RoXG5cdFx0XHRcdFx0dmFyIHN0YXJ0ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0KGZ1bmN0aW9uIGFkZCggYXJncyApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcblx0XHRcdFx0XHRcdFx0XHRhZGQoIGFyZyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KSggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0Ly8gRG8gd2UgbmVlZCB0byBhZGQgdGhlIGNhbGxiYWNrcyB0byB0aGVcblx0XHRcdFx0XHQvLyBjdXJyZW50IGZpcmluZyBiYXRjaD9cblx0XHRcdFx0XHRpZiAoIGZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdC8vIFdpdGggbWVtb3J5LCBpZiB3ZSdyZSBub3QgZmlyaW5nIHRoZW5cblx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgY2FsbCByaWdodCBhd2F5XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdFx0ZmlyaW5nU3RhcnQgPSBzdGFydDtcblx0XHRcdFx0XHRcdGZpcmUoIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0XHRsaXN0LnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzXG5cdFx0XHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nTGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyaW5nTGVuZ3RoLS07XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmaXJpbmdJbmRleC0tO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuXG5cdFx0XHQvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC5cblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRyZXR1cm4gZm4gPyBqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDogISEoIGxpc3QgJiYgbGlzdC5sZW5ndGggKTtcblx0XHRcdH0sXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0ZmlyaW5nTGVuZ3RoID0gMDtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gSGF2ZSB0aGUgbGlzdCBkbyBub3RoaW5nIGFueW1vcmVcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsaXN0ID0gc3RhY2sgPSBtZW1vcnkgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIElzIGl0IGRpc2FibGVkP1xuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gTG9jayB0aGUgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZVxuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHN0YWNrID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoICFtZW1vcnkgKSB7XG5cdFx0XHRcdFx0c2VsZi5kaXNhYmxlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gSXMgaXQgbG9ja2VkP1xuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFzdGFjaztcblx0XHRcdH0sXG5cdFx0XHQvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XG5cdFx0XHRcdGlmICggbGlzdCAmJiAoICFmaXJlZCB8fCBzdGFjayApICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0aWYgKCBmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRzdGFjay5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZpcmUoIGFyZ3MgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcblx0XHRcdGZpcmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmpRdWVyeS5leHRlbmQoe1xuXG5cdERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHtcblx0XHR2YXIgdHVwbGVzID0gW1xuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3RhdGVcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwgXCJyZWplY3RlZFwiIF0sXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKFwibWVtb3J5XCIpIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBmbnNbIGkgXSApICYmIGZuc1sgaSBdO1xuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3RGVmZXJcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oIHRoaXMgPT09IHByb21pc2UgPyBuZXdEZWZlci5wcm9taXNlKCkgOiB0aGlzLCBmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDMgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZVsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWzFdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdXG5cdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblxuXHRcdFx0XHQvLyBbIHJlamVjdF9saXN0IHwgcmVzb2x2ZV9saXN0IF0uZGlzYWJsZTsgcHJvZ3Jlc3NfbGlzdC5sb2NrXG5cdFx0XHRcdH0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbMF0gXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbMF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHByb21pc2UgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdICsgXCJXaXRoXCIgXSA9IGxpc3QuZmlyZVdpdGg7XG5cdFx0fSk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblx0XHRcdGxlbmd0aCA9IHJlc29sdmVWYWx1ZXMubGVuZ3RoLFxuXG5cdFx0XHQvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBsZW5ndGggIT09IDEgfHwgKCBzdWJvcmRpbmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggc3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLFxuXG5cdFx0XHQvLyB0aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNpbmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC5cblx0XHRcdGRlZmVycmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSxcblxuXHRcdFx0Ly8gVXBkYXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlc1xuXHRcdFx0dXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpLCBjb250ZXh0cywgdmFsdWVzICkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdGNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggdmFsdWVzID09PSBwcm9ncmVzc1ZhbHVlcyApIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXG5cdFx0XHRwcm9ncmVzc1ZhbHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBEZWZlcnJlZCBzdWJvcmRpbmF0ZXM7IHRyZWF0IG90aGVycyBhcyByZXNvbHZlZFxuXHRcdGlmICggbGVuZ3RoID4gMSApIHtcblx0XHRcdHByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHByb2dyZXNzQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHQuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKVxuXHRcdFx0XHRcdFx0LmZhaWwoIGRlZmVycmVkLnJlamVjdCApXG5cdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQtLXJlbWFpbmluZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElmIHdlJ3JlIG5vdCB3YWl0aW5nIG9uIGFueXRoaW5nLCByZXNvbHZlIHRoZSBtYXN0ZXJcblx0XHRpZiAoICFyZW1haW5pbmcgKSB7XG5cdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcblx0fVxufSk7XG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0O1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cdC8vIEFkZCB0aGUgY2FsbGJhY2tcblx0alF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBmbiApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhvbGQgKG9yIHJlbGVhc2UpIHRoZSByZWFkeSBldmVudFxuXHRob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkge1xuXHRcdGlmICggaG9sZCApIHtcblx0XHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0XHR9IGVsc2Uge1xuXHRcdFx0alF1ZXJ5LnJlYWR5KCB0cnVlICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblxuXHRcdC8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50c1xuXHRcdGlmICggalF1ZXJ5LmZuLnRyaWdnZXJIYW5kbGVyICkge1xuXHRcdFx0alF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXJIYW5kbGVyKCBcInJlYWR5XCIgKTtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS5vZmYoIFwicmVhZHlcIiApO1xuXHRcdH1cblx0fVxufSk7XG5cbi8qKlxuICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkLCBmYWxzZSApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblx0alF1ZXJ5LnJlYWR5KCk7XG59XG5cbmpRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHtcblx0aWYgKCAhcmVhZHlMaXN0ICkge1xuXG5cdFx0cmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHQvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cblx0XHQvLyBXZSBvbmNlIHRyaWVkIHRvIHVzZSByZWFkeVN0YXRlIFwiaW50ZXJhY3RpdmVcIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmVcblx0XHQvLyBkaXNjb3ZlcmVkIGJ5IENocmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1XG5cdFx0aWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgKSB7XG5cdFx0XHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0XHRcdHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblxuXHRcdFx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApO1xufTtcblxuLy8gS2ljayBvZmYgdGhlIERPTSByZWFkeSBjaGVjayBldmVuIGlmIHRoZSB1c2VyIGRvZXMgbm90XG5qUXVlcnkucmVhZHkucHJvbWlzZSgpO1xuXG5cblxuXG4vLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cbi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvblxudmFyIGFjY2VzcyA9IGpRdWVyeS5hY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCBqUXVlcnkudHlwZSgga2V5ICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblx0XHRmb3IgKCBpIGluIGtleSApIHtcblx0XHRcdGpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmF3ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGJ1bGsgKSB7XG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbiggZWxlbXNbaV0sIGtleSwgcmF3ID8gdmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNoYWluYWJsZSA/XG5cdFx0ZWxlbXMgOlxuXG5cdFx0Ly8gR2V0c1xuXHRcdGJ1bGsgP1xuXHRcdFx0Zm4uY2FsbCggZWxlbXMgKSA6XG5cdFx0XHRsZW4gPyBmbiggZWxlbXNbMF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9iamVjdCBjYW4gaGF2ZSBkYXRhXG4gKi9cbmpRdWVyeS5hY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0LyoganNoaW50IC1XMDE4ICovXG5cdHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTtcbn07XG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LFxuXHQvLyBPbGQgV2ViS2l0IGRvZXMgbm90IGhhdmUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zL2ZyZWV6ZSBtZXRob2QsXG5cdC8vIHJldHVybiBuZXcgZW1wdHkgb2JqZWN0IGluc3RlYWQgd2l0aCBubyBbW3NldF1dIGFjY2Vzc29yXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcy5jYWNoZSA9IHt9LCAwLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cdH0pO1xuXG5cdHRoaXMuZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvICsgRGF0YS51aWQrKztcbn1cblxuRGF0YS51aWQgPSAxO1xuRGF0YS5hY2NlcHRzID0galF1ZXJ5LmFjY2VwdERhdGE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXHRrZXk6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdC8vIEFsd2F5cyByZXR1cm4gdGhlIGtleSBmb3IgYSBmcm96ZW4gb2JqZWN0LlxuXHRcdGlmICggIURhdGEuYWNjZXB0cyggb3duZXIgKSApIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHZhciBkZXNjcmlwdG9yID0ge30sXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUga2V5XG5cdFx0XHR1bmxvY2sgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF1bmxvY2sgKSB7XG5cdFx0XHR1bmxvY2sgPSBEYXRhLnVpZCsrO1xuXG5cdFx0XHQvLyBTZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnR5XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkZXNjcmlwdG9yWyB0aGlzLmV4cGFuZG8gXSA9IHsgdmFsdWU6IHVubG9jayB9O1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggb3duZXIsIGRlc2NyaXB0b3IgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0XG5cdFx0XHQvLyBGYWxsYmFjayB0byBhIGxlc3Mgc2VjdXJlIGRlZmluaXRpb25cblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRkZXNjcmlwdG9yWyB0aGlzLmV4cGFuZG8gXSA9IHVubG9jaztcblx0XHRcdFx0alF1ZXJ5LmV4dGVuZCggb3duZXIsIGRlc2NyaXB0b3IgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgdGhlIGNhY2hlIG9iamVjdFxuXHRcdGlmICggIXRoaXMuY2FjaGVbIHVubG9jayBdICkge1xuXHRcdFx0dGhpcy5jYWNoZVsgdW5sb2NrIF0gPSB7fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5sb2NrO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHQvLyBUaGVyZSBtYXkgYmUgYW4gdW5sb2NrIGFzc2lnbmVkIHRvIHRoaXMgbm9kZSxcblx0XHRcdC8vIGlmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciB0aGlzIFwib3duZXJcIiwgY3JlYXRlIG9uZSBpbmxpbmVcblx0XHRcdC8vIGFuZCBzZXQgdGhlIHVubG9jayBhcyB0aG91Z2ggYW4gb3duZXIgZW50cnkgaGFkIGFsd2F5cyBleGlzdGVkXG5cdFx0XHR1bmxvY2sgPSB0aGlzLmtleSggb3duZXIgKSxcblx0XHRcdGNhY2hlID0gdGhpcy5jYWNoZVsgdW5sb2NrIF07XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGNhY2hlWyBkYXRhIF0gPSB2YWx1ZTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEZyZXNoIGFzc2lnbm1lbnRzIGJ5IG9iamVjdCBhcmUgc2hhbGxvdyBjb3BpZWRcblx0XHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5leHRlbmQoIHRoaXMuY2FjaGVbIHVubG9jayBdLCBkYXRhICk7XG5cdFx0XHQvLyBPdGhlcndpc2UsIGNvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBwcm9wIGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0Y2FjaGVbIHByb3AgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2FjaGU7XG5cdH0sXG5cdGdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0Ly8gRWl0aGVyIGEgdmFsaWQgY2FjaGUgaXMgZm91bmQsIG9yIHdpbGwgYmUgY3JlYXRlZC5cblx0XHQvLyBOZXcgY2FjaGVzIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIHVubG9jayByZXR1cm5lZCxcblx0XHQvLyBhbGxvd2luZyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBuZXdseSBjcmVhdGVkXG5cdFx0Ly8gZW1wdHkgZGF0YSBvYmplY3QuIEEgdmFsaWQgb3duZXIgb2JqZWN0IG11c3QgYmUgcHJvdmlkZWQuXG5cdFx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZVsgdGhpcy5rZXkoIG93bmVyICkgXTtcblxuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRjYWNoZSA6IGNhY2hlWyBrZXkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIHN0b3JlZDtcblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoKGtleSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSApIHtcblxuXHRcdFx0c3RvcmVkID0gdGhpcy5nZXQoIG93bmVyLCBrZXkgKTtcblxuXHRcdFx0cmV0dXJuIHN0b3JlZCAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0c3RvcmVkIDogdGhpcy5nZXQoIG93bmVyLCBqUXVlcnkuY2FtZWxDYXNlKGtleSkgKTtcblx0XHR9XG5cblx0XHQvLyBbKl1XaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllc1xuXHRcdC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly9cblx0XHR0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTtcblxuXHRcdC8vIFNpbmNlIHRoZSBcInNldFwiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50c1xuXHRcdC8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXVxuXHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7XG5cdH0sXG5cdHJlbW92ZTogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGNhbWVsLFxuXHRcdFx0dW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGVbIHVubG9jayBdO1xuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHRoaXMuY2FjaGVbIHVubG9jayBdID0ge307XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIGtleSApICkge1xuXHRcdFx0XHQvLyBJZiBcIm5hbWVcIiBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdoZW4gZGF0YSBpcyBpbml0aWFsbHkgY3JlYXRlZCwgdmlhIChcImtleVwiLCBcInZhbFwiKSBzaWduYXR1cmUsXG5cdFx0XHRcdC8vIGtleXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlLlxuXHRcdFx0XHQvLyBTaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBfaG93XyBhIGtleSB3YXMgYWRkZWQsIHJlbW92ZVxuXHRcdFx0XHQvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2XG5cdFx0XHRcdC8vIFRoaXMgd2lsbCBvbmx5IHBlbmFsaXplIHRoZSBhcnJheSBhcmd1bWVudCBwYXRoLlxuXHRcdFx0XHRuYW1lID0ga2V5LmNvbmNhdCgga2V5Lm1hcCggalF1ZXJ5LmNhbWVsQ2FzZSApICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjYW1lbCA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXHRcdFx0XHQvLyBUcnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvblxuXHRcdFx0XHRpZiAoIGtleSBpbiBjYWNoZSApIHtcblx0XHRcdFx0XHRuYW1lID0gWyBrZXksIGNhbWVsIF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LlxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0bmFtZSA9IGNhbWVsO1xuXHRcdFx0XHRcdG5hbWUgPSBuYW1lIGluIGNhY2hlID9cblx0XHRcdFx0XHRcdFsgbmFtZSBdIDogKCBuYW1lLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGkgPSBuYW1lLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIG5hbWVbIGkgXSBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHJldHVybiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoXG5cdFx0XHR0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXSB8fCB7fVxuXHRcdCk7XG5cdH0sXG5cdGRpc2NhcmQ6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHRpZiAoIG93bmVyWyB0aGlzLmV4cGFuZG8gXSApIHtcblx0XHRcdGRlbGV0ZSB0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXTtcblx0XHR9XG5cdH1cbn07XG52YXIgZGF0YV9wcml2ID0gbmV3IERhdGEoKTtcblxudmFyIGRhdGFfdXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvKFtBLVpdKS9nO1xuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJDFcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGRhdGEgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6XG5cdFx0XHRcdFx0ZGF0YSA9PT0gXCJmYWxzZVwiID8gZmFsc2UgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwibnVsbFwiID8gbnVsbCA6XG5cdFx0XHRcdFx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0XHRcdFx0XHQrZGF0YSArIFwiXCIgPT09IGRhdGEgPyArZGF0YSA6XG5cdFx0XHRcdFx0cmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6XG5cdFx0XHRcdFx0ZGF0YTtcblx0XHRcdH0gY2F0Y2goIGUgKSB7fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXJcblx0XHRcdGRhdGFfdXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkYXRhX3VzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFfcHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFfdXNlci5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhX3VzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YV9wcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVsZW0gKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFfcHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTExK1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxsICgjMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZS5zbGljZSg1KSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhX3ByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhX3VzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhLFxuXHRcdFx0XHRjYW1lbEtleSA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gd2l0aCB0aGUga2V5IGFzLWlzXG5cdFx0XHRcdGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIHdpdGggdGhlIGtleSBjYW1lbGl6ZWRcblx0XHRcdFx0ZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVsZW0sIGNhbWVsS2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGNhbWVsS2V5LCB1bmRlZmluZWQgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSB0cmllZCByZWFsbHkgaGFyZCwgYnV0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBkYXRhLi4uXG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIEZpcnN0LCBhdHRlbXB0IHRvIHN0b3JlIGEgY29weSBvciByZWZlcmVuY2Ugb2YgYW55XG5cdFx0XHRcdC8vIGRhdGEgdGhhdCBtaWdodCd2ZSBiZWVuIHN0b3JlIHdpdGggYSBjYW1lbENhc2VkIGtleS5cblx0XHRcdFx0dmFyIGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCB0aGlzLCBjYW1lbEtleSApO1xuXG5cdFx0XHRcdC8vIEZvciBIVE1MNSBkYXRhLSogYXR0cmlidXRlIGludGVyb3AsIHdlIGhhdmUgdG9cblx0XHRcdFx0Ly8gc3RvcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBkYXNoZXMgaW4gYSBjYW1lbENhc2UgZm9ybS5cblx0XHRcdFx0Ly8gVGhpcyBtaWdodCBub3QgYXBwbHkgdG8gYWxsIHByb3BlcnRpZXMuLi4qXG5cdFx0XHRcdGRhdGFfdXNlci5zZXQoIHRoaXMsIGNhbWVsS2V5LCB2YWx1ZSApO1xuXG5cdFx0XHRcdC8vICouLi4gSW4gdGhlIGNhc2Ugb2YgcHJvcGVydGllcyB0aGF0IG1pZ2h0IF9hY3R1YWxseV9cblx0XHRcdFx0Ly8gaGF2ZSBkYXNoZXMsIHdlIG5lZWQgdG8gYWxzbyBzdG9yZSBhIGNvcHkgb2YgdGhhdFxuXHRcdFx0XHQvLyB1bmNoYW5nZWQgcHJvcGVydHkuXG5cdFx0XHRcdGlmICgga2V5LmluZGV4T2YoXCItXCIpICE9PSAtMSAmJiBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0ZGF0YV91c2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhX3VzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9KTtcblx0fVxufSk7XG5cblxualF1ZXJ5LmV4dGVuZCh7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXBcblx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0aWYgKCAhcXVldWUgfHwgalF1ZXJ5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBkYXRhICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBxdWV1ZSB8fCBbXTtcblx0XHR9XG5cdH0sXG5cblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXG5cdFx0XHRzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCxcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKSxcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXG5cdFx0XHRuZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbFxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0c3RhcnRMZW5ndGgtLTtcblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXG5cdFx0XHQvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nXG5cdFx0XHQvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcblx0XHRcdFx0cXVldWUudW5zaGlmdCggXCJpbnByb2dyZXNzXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvblxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xuXHRcdH1cblxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBOb3QgcHVibGljIC0gZ2VuZXJhdGUgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJuIHRoZSBjdXJyZW50IG9uZVxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dmFyIGtleSA9IHR5cGUgKyBcInF1ZXVlSG9va3NcIjtcblx0XHRyZXR1cm4gZGF0YV9wcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YV9wcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLmFkZChmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgWyB0eXBlICsgXCJxdWV1ZVwiLCBrZXkgXSApO1xuXHRcdFx0fSlcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcyA6XG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWzBdICE9PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSk7XG5cdH0sXG5cdGNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0fSxcblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59KTtcbnZhciBwbnVtID0gKC9bKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkvKS5zb3VyY2U7XG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24oIGVsZW0sIGVsICkge1xuXHRcdC8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247XG5cdFx0Ly8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwgYmUgc2Vjb25kIGFyZ3VtZW50XG5cdFx0ZWxlbSA9IGVsIHx8IGVsZW07XG5cdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiIHx8ICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXHR9O1xuXG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoL14oPzpjaGVja2JveHxyYWRpbykkL2kpO1xuXG5cblxuKGZ1bmN0aW9uKCkge1xuXHR2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0ZGl2ID0gZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApLFxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cblx0Ly8gU3VwcG9ydDogU2FmYXJpPD01LjFcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKCMxMTIxNylcblx0Ly8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKVxuXHQvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSlcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XG5cblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdC8vIFN1cHBvcnQ6IFNhZmFyaTw9NS4xLCBBbmRyb2lkPDQuMlxuXHQvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0pKCk7XG52YXIgc3RydW5kZWZpbmVkID0gdHlwZW9mIHVuZGVmaW5lZDtcblxuXG5cbnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXJcblx0cmtleUV2ZW50ID0gL15rZXkvLFxuXHRybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudSl8Y2xpY2svLFxuXHRyZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcXC4oLispfCkkLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxuICovXG5qUXVlcnkuZXZlbnQgPSB7XG5cblx0Z2xvYmFsOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XG5cblx0XHR2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YV9wcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cylcblx0XHRpZiAoICFlbGVtRGF0YSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzKSApIHtcblx0XHRcdGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRpZiAoICEoZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUpICkge1xuXHRcdFx0ZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHtcblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gc3RydW5kZWZpbmVkICYmIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSA/XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBlbGVtLCBhcmd1bWVudHMgKSA6IHVuZGVmaW5lZDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZVxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVyc1xuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcblx0XHRcdGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoe1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbihcIi5cIilcblx0XHRcdH0sIGhhbmRsZU9iakluICk7XG5cblx0XHRcdC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0XG5cdFx0XHRpZiAoICEoaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSkgKSB7XG5cdFx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTtcblx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7XG5cblx0XHRcdFx0Ly8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XG5cdFx0XHRcdHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udFxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cblx0XHRcdGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7XG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50XG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XG5cblx0XHR2YXIgaiwgb3JpZ0NvdW50LCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhX3ByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZFxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsyXSAmJiBuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKFwiXFxcXC4oPzouKlxcXFwufClcIikgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gXCIqKlwiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkge1xuXHRcdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaiwgMSApO1xuXG5cdFx0XHRcdFx0aWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc3BlY2lhbC5yZW1vdmUgKSB7XG5cdFx0XHRcdFx0XHRzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdFxuXHRcdFx0Ly8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpXG5cdFx0XHRpZiAoIG9yaWdDb3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8IHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7XG5cdFx0XHRkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBcImV2ZW50c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xuXG5cdFx0dmFyIGksIGN1ciwgdG1wLCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdChcIi5cIikgOiBbXTtcblxuXHRcdGN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoXCIuXCIpID49IDAgKSB7XG5cdFx0XHQvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdChcIi5cIik7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZihcIjpcIikgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbihcIi5cIik7XG5cdFx0ZXZlbnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKSArIFwiKFxcXFwufCQpXCIgKSA6XG5cdFx0XHRudWxsO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXG5cdFx0ZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkO1xuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxuXHRcdGRhdGEgPSBkYXRhID09IG51bGwgP1xuXHRcdFx0WyBldmVudCBdIDpcblx0XHRcdGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZlbnQgXSApO1xuXG5cdFx0Ly8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lc1xuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09IChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKGN1ciA9IGV2ZW50UGF0aFtpKytdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9ICggZGF0YV9wcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmIGRhdGFfcHJpdi5nZXQoIGN1ciwgXCJoYW5kbGVcIiApO1xuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XG5cdFx0XHRcdGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5hdGl2ZSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTtcblx0XHRcdGlmICggaGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSkgJiZcblx0XHRcdFx0alF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHtcblxuXHRcdFx0XHQvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSApICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2Rcblx0XHRcdFx0XHR0bXAgPSBlbGVtWyBvbnR5cGUgXTtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBudWxsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7XG5cdFx0XHRcdFx0ZWxlbVsgdHlwZSBdKCk7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApO1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRoYW5kbGVycyA9ICggZGF0YV9wcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWzBdID0gZXZlbnQ7XG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAobWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0pICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoIChoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSkgJiYgIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvciAyKSBoYXZlIG5hbWVzcGFjZShzKVxuXHRcdFx0XHQvLyBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS5cblx0XHRcdFx0aWYgKCAhZXZlbnQubmFtZXNwYWNlX3JlIHx8IGV2ZW50Lm5hbWVzcGFjZV9yZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9KS5oYW5kbGUgfHwgaGFuZGxlT2JqLmhhbmRsZXIgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdGlmICggKGV2ZW50LnJlc3VsdCA9IHJldCkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgbWF0Y2hlcywgc2VsLCBoYW5kbGVPYmosXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICgjMTMxODApXG5cdFx0Ly8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmIGN1ci5ub2RlVHlwZSAmJiAoIWV2ZW50LmJ1dHRvbiB8fCBldmVudC50eXBlICE9PSBcImNsaWNrXCIpICkge1xuXG5cdFx0XHRmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiICkge1xuXHRcdFx0XHRcdG1hdGNoZXMgPSBbXTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDAgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG1hdGNoZXMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVzIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnNcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IHRoaXMsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBoYW5kbGVyUXVldWU7XG5cdH0sXG5cblx0Ly8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnRcblx0cHJvcHM6IFwiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoXCIuc3BsaXQoXCIgXCIpLFxuXG5cdGZpeEhvb2tzOiB7fSxcblxuXHRrZXlIb29rczoge1xuXHRcdHByb3BzOiBcImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGVcIi5zcGxpdChcIiBcIiksXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xuXG5cdFx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRcdGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCApIHtcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXHR9LFxuXG5cdG1vdXNlSG9va3M6IHtcblx0XHRwcm9wczogXCJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnRcIi5zcGxpdChcIiBcIiksXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xuXHRcdFx0dmFyIGV2ZW50RG9jLCBkb2MsIGJvZHksXG5cdFx0XHRcdGJ1dHRvbiA9IG9yaWdpbmFsLmJ1dHRvbjtcblxuXHRcdFx0Ly8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZVxuXHRcdFx0aWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIG9yaWdpbmFsLmNsaWVudFggIT0gbnVsbCApIHtcblx0XHRcdFx0ZXZlbnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcblx0XHRcdFx0ZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0XHRib2R5ID0gZXZlbnREb2MuYm9keTtcblxuXHRcdFx0XHRldmVudC5wYWdlWCA9IG9yaWdpbmFsLmNsaWVudFggKyAoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwICk7XG5cdFx0XHRcdGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdFx0Ly8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXRcblx0XHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRldmVudC53aGljaCA9ICggYnV0dG9uICYgMSA/IDEgOiAoIGJ1dHRvbiAmIDIgPyAzIDogKCBidXR0b24gJiA0ID8gMiA6IDAgKSApICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHtcblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXNcblx0XHR2YXIgaSwgcHJvcCwgY29weSxcblx0XHRcdHR5cGUgPSBldmVudC50eXBlLFxuXHRcdFx0b3JpZ2luYWxFdmVudCA9IGV2ZW50LFxuXHRcdFx0Zml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTtcblxuXHRcdGlmICggIWZpeEhvb2sgKSB7XG5cdFx0XHR0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBmaXhIb29rID1cblx0XHRcdFx0cm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDpcblx0XHRcdFx0cmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOlxuXHRcdFx0XHR7fTtcblx0XHR9XG5cdFx0Y29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlzLnByb3BzLmNvbmNhdCggZml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wcztcblxuXHRcdGV2ZW50ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXG5cdFx0aSA9IGNvcHkubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0cHJvcCA9IGNvcHlbIGkgXTtcblx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogQ29yZG92YSAyLjUgKFdlYktpdCkgKCMxMzI1NSlcblx0XHQvLyBBbGwgZXZlbnRzIHNob3VsZCBoYXZlIGEgdGFyZ2V0OyBDb3Jkb3ZhIGRldmljZXJlYWR5IGRvZXNuJ3Rcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBkb2N1bWVudDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgNi4wKywgQ2hyb21lPDI4XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsICMxMzE0Mylcblx0XHRpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaXhIb29rLmZpbHRlciA/IGZpeEhvb2suZmlsdGVyKCBldmVudCwgb3JpZ2luYWxFdmVudCApIDogZXZlbnQ7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRmb2N1czoge1xuXHRcdFx0Ly8gRmlyZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1ZW5jZSBpcyBjb3JyZWN0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzICE9PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuZm9jdXMgKSB7XG5cdFx0XHRcdFx0dGhpcy5mb2N1cygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGVnYXRlVHlwZTogXCJmb2N1c2luXCJcblx0XHR9LFxuXHRcdGJsdXI6IHtcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMgPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5ibHVyICkge1xuXHRcdFx0XHRcdHRoaXMuYmx1cigpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGVnYXRlVHlwZTogXCJmb2N1c291dFwiXG5cdFx0fSxcblx0XHRjbGljazoge1xuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR0aGlzLmNsaWNrKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9uJ3QgZmlyZSBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgXCJhXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YmVmb3JldW5sb2FkOiB7XG5cdFx0XHRwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDIwK1xuXHRcdFx0XHQvLyBGaXJlZm94IGRvZXNuJ3QgYWxlcnQgaWYgdGhlIHJldHVyblZhbHVlIGZpZWxkIGlzIG5vdCBzZXQuXG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHtcblx0XHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuXG5cdFx0Ly8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlXG5cdFx0Ly8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuXG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlLFxuXHRcdFx0XHRvcmlnaW5hbEV2ZW50OiB7fVxuXHRcdFx0fVxuXHRcdCk7XG5cdFx0aWYgKCBidWJibGUgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guY2FsbCggZWxlbSwgZSApO1xuXHRcdH1cblx0XHRpZiAoIGUuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7XG5cdH1cbn07XG5cbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQpICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IGpRdWVyeS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnByZXZlbnREZWZhdWx0ICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fSxcblx0c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmIGUuc3RvcFByb3BhZ2F0aW9uICkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiApIHtcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcblx0fVxufTtcblxuLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTUrXG5qUXVlcnkuZWFjaCh7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSk7XG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3gsIENocm9tZSwgU2FmYXJpXG4vLyBDcmVhdGUgXCJidWJibGluZ1wiIGZvY3VzIGFuZCBibHVyIGV2ZW50c1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHtcblx0alF1ZXJ5LmVhY2goeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSwgdHJ1ZSApO1xuXHRcdFx0fTtcblxuXHRcdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHtcblx0XHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4ICkgLSAxO1xuXG5cdFx0XHRcdGlmICggIWF0dGFjaGVzICkge1xuXHRcdFx0XHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSk7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHtcblx0XHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdFx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKVxuXHRcdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vbiggdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblx0XHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHQvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKVxuXHRcdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXG5cdFx0XHRcdGZuID0gZGF0YTtcblx0XHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICggb25lID09PSAxICkge1xuXHRcdFx0b3JpZ0ZuID0gZm47XG5cdFx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdFx0cmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9O1xuXHRcdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0XHR9KTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID8gaGFuZGxlT2JqLm9yaWdUeXBlICsgXCIuXCIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDogaGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRcdFx0Ly8gKCB0eXBlcyBbLCBmbl0gKVxuXHRcdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSk7XG5cdH0sXG5cdHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgZWxlbSA9IHRoaXNbMF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59KTtcblxuXG52YXJcblx0cnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1xcdzpdKylbXj5dKilcXC8+L2dpLFxuXHRydGFnTmFtZSA9IC88KFtcXHc6XSspLyxcblx0cmh0bWwgPSAvPHwmIz9cXHcrOy8sXG5cdHJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksXG5cdC8vIGNoZWNrZWQ9XCJjaGVja2VkXCIgb3IgY2hlY2tlZFxuXHRyY2hlY2tlZCA9IC9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksXG5cdHJzY3JpcHRUeXBlID0gL14kfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxcblx0cnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcXC8oLiopLyxcblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nLFxuXG5cdC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApXG5cdHdyYXBNYXAgPSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRvcHRpb246IFsgMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCIgXSxcblxuXHRcdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0XHRjb2w6IFsgMiwgXCI8dGFibGU+PGNvbGdyb3VwPlwiLCBcIjwvY29sZ3JvdXA+PC90YWJsZT5cIiBdLFxuXHRcdHRyOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCIgXSxcblx0XHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0XHRfZGVmYXVsdDogWyAwLCBcIlwiLCBcIlwiIF1cblx0fTtcblxuLy8gU3VwcG9ydDogSUU5XG53cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247XG5cbndyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7XG53cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcblxuLy8gU3VwcG9ydDogMS54IGNvbXBhdGliaWxpdHlcbi8vIE1hbmlwdWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0Ym9keVxuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdGpRdWVyeS5ub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSA/XG5cblx0XHRlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGJvZHlcIilbMF0gfHxcblx0XHRcdGVsZW0uYXBwZW5kQ2hpbGQoIGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIikgKSA6XG5cdFx0ZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gbnVsbCkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHR2YXIgbWF0Y2ggPSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTtcblxuXHRpZiAoIG1hdGNoICkge1xuXHRcdGVsZW0udHlwZSA9IG1hdGNoWyAxIF07XG5cdH0gZWxzZSB7XG5cdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YV9wcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sIFwiZ2xvYmFsRXZhbFwiLCAhcmVmRWxlbWVudHMgfHwgZGF0YV9wcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0dmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YV9wcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YV9wcml2LmFjY2Vzcyggc3JjICk7XG5cdFx0cGRhdGFDdXIgPSBkYXRhX3ByaXYuc2V0KCBkZXN0LCBwZGF0YU9sZCApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTtcblx0XHRcdHBkYXRhQ3VyLmV2ZW50cyA9IHt9O1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhX3VzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhX3VzZXIuYWNjZXNzKCBzcmMgKTtcblx0XHR1ZGF0YUN1ciA9IGpRdWVyeS5leHRlbmQoIHt9LCB1ZGF0YU9sZCApO1xuXG5cdFx0ZGF0YV91c2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHtcblx0dmFyIHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHRjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgPyBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCBcIipcIiApIDpcblx0XHRcdFtdO1xuXG5cdHJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/XG5cdFx0alF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICkgOlxuXHRcdHJldDtcbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXG5cdFx0Ly8gRml4IElFIGNsb25pbmcgaXNzdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJlxuXHRcdFx0XHQhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cDovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRidWlsZEZyYWdtZW50OiBmdW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiApIHtcblx0XHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLFxuXHRcdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRcdG5vZGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRcdGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBRdFdlYktpdCwgUGhhbnRvbUpTXG5cdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0XHQvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcblx0XHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0XHQvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXNcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudChcImRpdlwiKSApO1xuXG5cdFx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHRcdHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBlbGVtLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdFx0Ly8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50XG5cdFx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHRcdHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXQsIFBoYW50b21KU1xuXHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApO1xuXG5cdFx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdFx0Ly8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKVxuXHRcdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50XG5cdFx0ZnJhZ21lbnQudGV4dENvbnRlbnQgPSBcIlwiO1xuXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoZWxlbSA9IG5vZGVzWyBpKysgXSkgKSB7XG5cblx0XHRcdC8vICM0MDg3IC0gSWYgb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBlbGVtZW50cyBhcmUgdGhlIHNhbWUsIGFuZCB0aGlzIGlzXG5cdFx0XHQvLyB0aGF0IGVsZW1lbnQsIGRvIG5vdCBkbyBhbnl0aGluZ1xuXHRcdFx0aWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApICE9PSAtMSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0XHR0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksIFwic2NyaXB0XCIgKTtcblxuXHRcdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdFx0aWYgKCBjb250YWlucyApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggdG1wICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRcdGlmICggc2NyaXB0cyApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSB0bXBbIGorKyBdKSApIHtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0XHRzY3JpcHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZnJhZ21lbnQ7XG5cdH0sXG5cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cdFx0dmFyIGRhdGEsIGVsZW0sIHR5cGUsIGtleSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoZWxlbSA9IGVsZW1zWyBpIF0pICE9PSB1bmRlZmluZWQ7IGkrKyApIHtcblx0XHRcdGlmICggalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0a2V5ID0gZWxlbVsgZGF0YV9wcml2LmV4cGFuZG8gXTtcblxuXHRcdFx0XHRpZiAoIGtleSAmJiAoZGF0YSA9IGRhdGFfcHJpdi5jYWNoZVsga2V5IF0pICkge1xuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZFxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGRhdGFfcHJpdi5jYWNoZVsga2V5IF0gKSB7XG5cdFx0XHRcdFx0XHQvLyBEaXNjYXJkIGFueSByZW1haW5pbmcgYHByaXZhdGVgIGRhdGFcblx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gRGlzY2FyZCBhbnkgcmVtYWluaW5nIGB1c2VyYCBkYXRhXG5cdFx0XHRkZWxldGUgZGF0YV91c2VyLmNhY2hlWyBlbGVtWyBkYXRhX3VzZXIuZXhwYW5kbyBdIF07XG5cdFx0fVxuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS50ZXh0KCB0aGlzICkgOlxuXHRcdFx0XHR0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGVsZW1zID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgdGhpcyApIDogdGhpcyxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0gKSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkge1xuXHRcdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzXG5cdFx0XHRcdGVsZW0udGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcblx0XHRkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7XG5cblx0XHRyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoKCBlICkge31cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHR0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBhcmcgPSBhcmd1bWVudHNbIDAgXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRhcmcgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cblx0XHRcdGlmICggYXJnICkge1xuXHRcdFx0XHRhcmcucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBGb3JjZSByZW1vdmFsIGlmIHRoZXJlIHdhcyBubyBuZXcgY29udGVudCAoZS5nLiwgZnJvbSBlbXB0eSBhcmd1bWVudHMpXG5cdFx0cmV0dXJuIGFyZyAmJiAoYXJnLmxlbmd0aCB8fCBhcmcubm9kZVR5cGUpID8gdGhpcyA6IHRoaXMucmVtb3ZlKCk7XG5cdH0sXG5cblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlKCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdGRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHRcdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2V0ID0gdGhpcyxcblx0XHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdC8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdFxuXHRcdGlmICggaXNGdW5jdGlvbiB8fFxuXHRcdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHRcdHZhciBzZWxmID0gc2V0LmVxKCBpbmRleCApO1xuXHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdFx0YXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2VsZi5kb21NYW5pcCggYXJncywgY2FsbGJhY2sgKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICggbCApIHtcblx0XHRcdGZyYWdtZW50ID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIGFyZ3MsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgdGhpcyApO1xuXHRcdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGZpcnN0ICkge1xuXHRcdFx0XHRzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgXCJzY3JpcHRcIiApLCBkaXNhYmxlU2NyaXB0ICk7XG5cdFx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cFxuXHRcdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IGZyYWdtZW50O1xuXG5cdFx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdFx0Ly8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvblxuXHRcdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBRdFdlYktpdFxuXHRcdFx0XHRcdFx0XHQvLyBqUXVlcnkubWVyZ2UgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjYWxsYmFjay5jYWxsKCB0aGlzWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdFx0Ly8gUmVlbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRcdGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTtcblxuXHRcdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBzY3JpcHRzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdFx0IWRhdGFfcHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiYgalF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUuc3JjICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKHtcblx0YXBwZW5kVG86IFwiYXBwZW5kXCIsXG5cdHByZXBlbmRUbzogXCJwcmVwZW5kXCIsXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcblx0aW5zZXJ0QWZ0ZXI6IFwiYWZ0ZXJcIixcblx0cmVwbGFjZUFsbDogXCJyZXBsYWNlV2l0aFwiXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBlbGVtcyxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxuXHRcdFx0bGFzdCA9IGluc2VydC5sZW5ndGggLSAxLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkge1xuXHRcdFx0ZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTtcblx0XHRcdGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXRcblx0XHRcdC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Ncblx0XHRcdHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSk7XG5cblxudmFyIGlmcmFtZSxcblx0ZWxlbWRpc3BsYXkgPSB7fTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIGRpc3BsYXkgb2YgYSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBub2RlTmFtZSBvZiB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IGRvYyBEb2N1bWVudCBvYmplY3RcbiAqL1xuLy8gQ2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gZGVmYXVsdERpc3BsYXlcbmZ1bmN0aW9uIGFjdHVhbERpc3BsYXkoIG5hbWUsIGRvYyApIHtcblx0dmFyIHN0eWxlLFxuXHRcdGVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVtZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9jLmJvZHkgKSxcblxuXHRcdC8vIGdldERlZmF1bHRDb21wdXRlZFN0eWxlIG1pZ2h0IGJlIHJlbGlhYmx5IHVzZWQgb25seSBvbiBhdHRhY2hlZCBlbGVtZW50XG5cdFx0ZGlzcGxheSA9IHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSAmJiAoIHN0eWxlID0gd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlKCBlbGVtWyAwIF0gKSApID9cblxuXHRcdFx0Ly8gVXNlIG9mIHRoaXMgbWV0aG9kIGlzIGEgdGVtcG9yYXJ5IGZpeCAobW9yZSBsaWtlIG9wdGltaXphdGlvbikgdW50aWwgc29tZXRoaW5nIGJldHRlciBjb21lcyBhbG9uZyxcblx0XHRcdC8vIHNpbmNlIGl0IHdhcyByZW1vdmVkIGZyb20gc3BlY2lmaWNhdGlvbiBhbmQgc3VwcG9ydGVkIG9ubHkgaW4gRkZcblx0XHRcdHN0eWxlLmRpc3BsYXkgOiBqUXVlcnkuY3NzKCBlbGVtWyAwIF0sIFwiZGlzcGxheVwiICk7XG5cblx0Ly8gV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSBzdG9yZWQgb24gdGhlIGVsZW1lbnQsXG5cdC8vIHNvIHVzZSBcImRldGFjaFwiIG1ldGhvZCBhcyBmYXN0IHdheSB0byBnZXQgcmlkIG9mIHRoZSBlbGVtZW50XG5cdGVsZW0uZGV0YWNoKCk7XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG5cbi8qKlxuICogVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZVxuICovXG5mdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7XG5cdHZhciBkb2MgPSBkb2N1bWVudCxcblx0XHRkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07XG5cblx0aWYgKCAhZGlzcGxheSApIHtcblx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXG5cdFx0Ly8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1lXG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiB8fCAhZGlzcGxheSApIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxlXG5cdFx0XHRpZnJhbWUgPSAoaWZyYW1lIHx8IGpRdWVyeSggXCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+XCIgKSkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVsZW1lbnQgKTtcblxuXHRcdFx0Ly8gQWx3YXlzIHdyaXRlIGEgbmV3IEhUTUwgc2tlbGV0b24gc28gV2Via2l0IGFuZCBGaXJlZm94IGRvbid0IGNob2tlIG9uIHJldXNlXG5cdFx0XHRkb2MgPSBpZnJhbWVbIDAgXS5jb250ZW50RG9jdW1lbnQ7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0XHRkb2Mud3JpdGUoKTtcblx0XHRcdGRvYy5jbG9zZSgpO1xuXG5cdFx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXHRcdFx0aWZyYW1lLmRldGFjaCgpO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheVxuXHRcdGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTtcblx0fVxuXG5cdHJldHVybiBkaXNwbGF5O1xufVxudmFyIHJtYXJnaW4gPSAoL15tYXJnaW4vKTtcblxudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0Ly8gU3VwcG9ydDogSUU8PTExKywgRmlyZWZveDw9MzArICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHRpZiAoIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5vcGVuZXIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTtcblx0fTtcblxuXG5cbmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7XG5cdHZhciB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLCByZXQsXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdC8vIGdldFByb3BlcnR5VmFsdWUgaXMgb25seSBuZWVkZWQgZm9yIC5jc3MoJ2ZpbHRlcicpICgjMTI1MzcpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cdH1cblxuXHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgPCA2XG5cdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdC8vIGlPUyA8IDYgKGF0IGxlYXN0KSByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIGEgbGFyZ2VyIHNldCBvZiB2YWx1ZXMsIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHNcblx0XHQvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBybWFyZ2luLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cdFx0Ly8gU3VwcG9ydDogSUVcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICh0aGlzLmdldCA9IGhvb2tGbikuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG4oZnVuY3Rpb24oKSB7XG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCxcblx0XHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4O1wiICtcblx0XHRcInBvc2l0aW9uOmFic29sdXRlXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVQaXhlbFBvc2l0aW9uQW5kQm94U2l6aW5nUmVsaWFibGUoKSB7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjNcblx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtcIiArXG5cdFx0XHRcImJveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MSU7dG9wOjElO1wiICtcblx0XHRcdFwiYm9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGVcIjtcblx0XHRkaXYuaW5uZXJIVE1MID0gXCJcIjtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYsIG51bGwgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cdFx0Ym94U2l6aW5nUmVsaWFibGVWYWwgPSBkaXZTdHlsZS53aWR0aCA9PT0gXCI0cHhcIjtcblxuXHRcdGRvY0VsZW0ucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogbm9kZS5qcyBqc2RvbVxuXHQvLyBEb24ndCBhc3N1bWUgdGhhdCBnZXRDb21wdXRlZFN0eWxlIGlzIGEgcHJvcGVydHkgb2YgdGhlIGdsb2JhbCBvYmplY3Rcblx0aWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCBzdXBwb3J0LCB7XG5cdFx0XHRwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBUaGlzIHRlc3QgaXMgZXhlY3V0ZWQgb25seSBvbmNlIGJ1dCB3ZSBzdGlsbCBkbyBtZW1vaXppbmdcblx0XHRcdFx0Ly8gc2luY2Ugd2UgY2FuIHVzZSB0aGUgYm94U2l6aW5nUmVsaWFibGUgcHJlLWNvbXB1dGluZy5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byBjaGVjayBpZiB0aGUgdGVzdCB3YXMgYWxyZWFkeSBwZXJmb3JtZWQsIHRob3VnaC5cblx0XHRcdFx0Y29tcHV0ZVBpeGVsUG9zaXRpb25BbmRCb3hTaXppbmdSZWxpYWJsZSgpO1xuXHRcdFx0XHRyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDtcblx0XHRcdH0sXG5cdFx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdFx0fSxcblx0XHRcdHJlbGlhYmxlTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHRcdC8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHlcblx0XHRcdFx0Ly8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiAoIzMzMzMpXG5cdFx0XHRcdC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodFxuXHRcdFx0XHQvLyBUaGlzIHN1cHBvcnQgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBvbmNlIHNvIG5vIG1lbW9pemluZyBpcyBuZWVkZWQuXG5cdFx0XHRcdHZhciByZXQsXG5cdFx0XHRcdFx0bWFyZ2luRGl2ID0gZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHRcdFx0XHQvLyBSZXNldCBDU1M6IGJveC1zaXppbmc7IGRpc3BsYXk7IG1hcmdpbjsgYm9yZGVyOyBwYWRkaW5nXG5cdFx0XHRcdG1hcmdpbkRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFuZHJvaWQgMi4zXG5cdFx0XHRcdFx0Ly8gVmVuZG9yLXByZWZpeCBib3gtc2l6aW5nXG5cdFx0XHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O1wiICtcblx0XHRcdFx0XHRcImJveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjBcIjtcblx0XHRcdFx0bWFyZ2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gXCIwXCI7XG5cdFx0XHRcdGRpdi5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XG5cdFx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0XHRcdHJldCA9ICFwYXJzZUZsb2F0KCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkubWFyZ2luUmlnaHQgKTtcblxuXHRcdFx0XHRkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0XHRcdFx0ZGl2LnJlbW92ZUNoaWxkKCBtYXJnaW5EaXYgKTtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KSgpO1xuXG5cbi8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMuXG5qUXVlcnkuc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjaywgYXJncyApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhclxuXHQvLyBTd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxuXHQvLyBTZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXlcblx0cmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFxuXHRybnVtc3BsaXQgPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKC4qKSRcIiwgXCJpXCIgKSxcblx0cnJlbE51bSA9IG5ldyBSZWdFeHAoIFwiXihbKy1dKT0oXCIgKyBwbnVtICsgXCIpXCIsIFwiaVwiICksXG5cblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH0sXG5cblx0Y3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiT1wiLCBcIk1velwiLCBcIm1zXCIgXTtcblxuLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBuYW1lICkge1xuXG5cdC8vIFNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkXG5cdGlmICggbmFtZSBpbiBzdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLFxuXHRcdG9yaWdOYW1lID0gbmFtZSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb3JpZ05hbWU7XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cdHZhciBtYXRjaGVzID0gcm51bXNwbGl0LmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAxIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAyIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMgKSB7XG5cdHZhciBpID0gZXh0cmEgPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSA/XG5cdFx0Ly8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJlbWVudCwgYXZvaWQgYXVnbWVudGF0aW9uXG5cdFx0NCA6XG5cdFx0Ly8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllc1xuXHRcdG5hbWUgPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXG5cdFx0dmFsID0gMDtcblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cdFx0Ly8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luLCBzbyBhZGQgaXQgaWYgd2Ugd2FudCBpdFxuXHRcdGlmICggZXh0cmEgPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0JvcmRlckJveCApIHtcblx0XHRcdC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudFxuXHRcdFx0aWYgKCBleHRyYSA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBtYXJnaW4sIHNvIHJlbW92ZSBib3JkZXJcblx0XHRcdGlmICggZXh0cmEgIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZ1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWVcblx0dmFyIHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLFxuXHRcdHZhbCA9IG5hbWUgPT09IFwid2lkdGhcIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCxcblx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0Ly8gU29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkXG5cdC8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NVxuXHQvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2Njhcblx0aWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHtcblx0XHQvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3Nhcnlcblx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdGlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdHZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLlxuXHRcdGlmICggcm51bW5vbnB4LnRlc3QodmFsKSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0XHQvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmXG5cdFx0XHQoIHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApO1xuXG5cdFx0Ly8gTm9ybWFsaXplIFwiXCIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuXHRcdHZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7XG5cdH1cblxuXHQvLyBVc2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlc1xuXHRyZXR1cm4gKCB2YWwgK1xuXHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0ZWxlbSxcblx0XHRcdG5hbWUsXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXG5cdFx0XHR2YWx1ZUlzQm9yZGVyQm94LFxuXHRcdFx0c3R5bGVzXG5cdFx0KVxuXHQpICsgXCJweFwiO1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLCBoaWRkZW4sXG5cdFx0dmFsdWVzID0gW10sXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YV9wcml2LmdldCggZWxlbSwgXCJvbGRkaXNwbGF5XCIgKTtcblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblx0XHRcdC8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXNcblx0XHRcdC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3Rcblx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBvdmVycmlkZGVuIHdpdGggZGlzcGxheTogbm9uZVxuXHRcdFx0Ly8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXNcblx0XHRcdC8vIGZvciBzdWNoIGFuIGVsZW1lbnRcblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuKCBlbGVtICkgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIFwib2xkZGlzcGxheVwiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRoaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApO1xuXG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiIHx8ICFoaWRkZW4gKSB7XG5cdFx0XHRcdGRhdGFfcHJpdi5zZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiLCBoaWRkZW4gPyBkaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wXG5cdC8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3dcblx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAoICFzaG93IHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCBcIlwiIDogXCJub25lXCI7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZXh0ZW5kKHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiY29sdW1uQ291bnRcIjogdHJ1ZSxcblx0XHRcImZpbGxPcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJmbGV4R3Jvd1wiOiB0cnVlLFxuXHRcdFwiZmxleFNocmlua1wiOiB0cnVlLFxuXHRcdFwiZm9udFdlaWdodFwiOiB0cnVlLFxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxuXHRcdFwib3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwib3JkZXJcIjogdHJ1ZSxcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcblx0XHRcIndpZG93c1wiOiB0cnVlLFxuXHRcdFwiekluZGV4XCI6IHRydWUsXG5cdFx0XCJ6b29tXCI6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHtcblx0XHRcImZsb2F0XCI6IFwiY3NzRmxvYXRcIlxuXHR9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG9yaWdOYW1lICkgKTtcblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgKHJldCA9IHJyZWxOdW0uZXhlYyggdmFsdWUgKSkgKSB7XG5cdFx0XHRcdHZhbHVlID0gKCByZXRbMV0gKyAxICkgKiByZXRbMl0gKyBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICkgKTtcblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7XG5cdFx0XHRcdHZhbHVlICs9IFwicHhcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgIShcInNldFwiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XG5cdFx0XHRyZXR1cm4gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHtcblx0XHR2YXIgdmFsLCBudW0sIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTtcblxuXHRcdC8vIFRyeSBwcmVmaXhlZCBuYW1lIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIG5hbWVcblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0XG5cdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBcIm5vcm1hbFwiIHRvIGNvbXB1dGVkIHZhbHVlXG5cdFx0aWYgKCB2YWwgPT09IFwibm9ybWFsXCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7XG5cdFx0XHR2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWNcblx0XHRpZiAoIGV4dHJhID09PSBcIlwiIHx8IGV4dHJhICkge1xuXHRcdFx0bnVtID0gcGFyc2VGbG9hdCggdmFsICk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgalF1ZXJ5LmlzTnVtZXJpYyggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJiBlbGVtLm9mZnNldFdpZHRoID09PSAwID9cblx0XHRcdFx0XHRqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdFx0XHR9KSA6XG5cdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgP1xuXHRcdFx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0XHRzdHlsZXNcblx0XHRcdFx0KSA6IDBcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xufSk7XG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luUmlnaHQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIHsgXCJkaXNwbGF5XCI6IFwiaW5saW5lLWJsb2NrXCIgfSxcblx0XHRcdFx0Y3VyQ1NTLCBbIGVsZW0sIFwibWFyZ2luUmlnaHRcIiBdICk7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCh7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdChcIiBcIikgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0Y3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0dmFyIHN0eWxlcywgbGVuLFxuXHRcdFx0XHRtYXAgPSB7fSxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW4oIHRoaXMgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuc2hvdygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgXCJzd2luZ1wiO1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJlxuXHRcdFx0XHQoIXR3ZWVuLmVsZW0uc3R5bGUgfHwgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwpICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMuXG5cdFx0XHQvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdDtcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMtaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cdFx0XHQvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kIFwiYXV0b1wiIGFyZSBjb252ZXJ0ZWQgdG8gMC5cblx0XHRcdHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gXCJhdXRvXCIgPyAwIDogcmVzdWx0O1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLnN0eWxlICYmICggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8IGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUU5XG4vLyBQYW5pYyBiYXNlZCBhcHByb2FjaCB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHtcblx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5lYXNpbmcgPSB7XG5cdGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIHA7XG5cdH0sXG5cdHN3aW5nOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAgKiBNYXRoLlBJICkgLyAyO1xuXHR9XG59O1xuXG5qUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDtcblxuLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnRcbmpRdWVyeS5meC5zdGVwID0ge307XG5cblxuXG5cbnZhclxuXHRmeE5vdywgdGltZXJJZCxcblx0cmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sXG5cdHJmeG51bSA9IG5ldyBSZWdFeHAoIFwiXig/OihbKy1dKT18KShcIiArIHBudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICksXG5cdHJydW4gPSAvcXVldWVIb29rcyQvLFxuXHRhbmltYXRpb25QcmVmaWx0ZXJzID0gWyBkZWZhdWx0UHJlZmlsdGVyIF0sXG5cdHR3ZWVuZXJzID0ge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksXG5cdFx0XHRcdHRhcmdldCA9IHR3ZWVuLmN1cigpLFxuXHRcdFx0XHRwYXJ0cyA9IHJmeG51bS5leGVjKCB2YWx1ZSApLFxuXHRcdFx0XHR1bml0ID0gcGFydHMgJiYgcGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdFx0XHQvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlc1xuXHRcdFx0XHRzdGFydCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiArdGFyZ2V0ICkgJiZcblx0XHRcdFx0XHRyZnhudW0uZXhlYyggalF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgcHJvcCApICksXG5cdFx0XHRcdHNjYWxlID0gMSxcblx0XHRcdFx0bWF4SXRlcmF0aW9ucyA9IDIwO1xuXG5cdFx0XHRpZiAoIHN0YXJ0ICYmIHN0YXJ0WyAzIF0gIT09IHVuaXQgKSB7XG5cdFx0XHRcdC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3Ncblx0XHRcdFx0dW5pdCA9IHVuaXQgfHwgc3RhcnRbIDMgXTtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0XHRcdHBhcnRzID0gcGFydHMgfHwgW107XG5cblx0XHRcdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRcdFx0c3RhcnQgPSArdGFyZ2V0IHx8IDE7XG5cblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdC8vIElmIHByZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3VibGUgdW50aWwgd2UgZ2V0ICpzb21ldGhpbmcqLlxuXHRcdFx0XHRcdC8vIFVzZSBzdHJpbmcgZm9yIGRvdWJsaW5nIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93XG5cdFx0XHRcdFx0c2NhbGUgPSBzY2FsZSB8fCBcIi41XCI7XG5cblx0XHRcdFx0XHQvLyBBZGp1c3QgYW5kIGFwcGx5XG5cdFx0XHRcdFx0c3RhcnQgPSBzdGFydCAvIHNjYWxlO1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgcHJvcCwgc3RhcnQgKyB1bml0ICk7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKCksXG5cdFx0XHRcdC8vIGJyZWFrIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2hcblx0XHRcdFx0fSB3aGlsZSAoIHNjYWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIoKSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSB0d2VlbiBwcm9wZXJ0aWVzXG5cdFx0XHRpZiAoIHBhcnRzICkge1xuXHRcdFx0XHRzdGFydCA9IHR3ZWVuLnN0YXJ0ID0gK3N0YXJ0IHx8ICt0YXJnZXQgfHwgMDtcblx0XHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHRcdC8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvblxuXHRcdFx0XHR0d2Vlbi5lbmQgPSBwYXJ0c1sgMSBdID9cblx0XHRcdFx0XHRzdGFydCArICggcGFydHNbIDEgXSArIDEgKSAqIHBhcnRzWyAyIF0gOlxuXHRcdFx0XHRcdCtwYXJ0c1sgMiBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH07XG5cbi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHlcbmZ1bmN0aW9uIGNyZWF0ZUZ4Tm93KCkge1xuXHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9KTtcblx0cmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRpID0gMCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07XG5cblx0Ly8gSWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNCA7IGkgKz0gMiAtIGluY2x1ZGVXaWR0aCApIHtcblx0XHR3aGljaCA9IGNzc0V4cGFuZFsgaSBdO1xuXHRcdGF0dHJzWyBcIm1hcmdpblwiICsgd2hpY2ggXSA9IGF0dHJzWyBcInBhZGRpbmdcIiArIHdoaWNoIF0gPSB0eXBlO1xuXHR9XG5cblx0aWYgKCBpbmNsdWRlV2lkdGggKSB7XG5cdFx0YXR0cnMub3BhY2l0eSA9IGF0dHJzLndpZHRoID0gdHlwZTtcblx0fVxuXG5cdHJldHVybiBhdHRycztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7XG5cdHZhciB0d2Vlbixcblx0XHRjb2xsZWN0aW9uID0gKCB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICh0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApKSApIHtcblxuXHRcdFx0Ly8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBob29rcywgb2xkZmlyZSwgZGlzcGxheSwgY2hlY2tEaXNwbGF5LFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YV9wcml2LmdldCggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIEhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXNcblx0aWYgKCAhb3B0cy5xdWV1ZSApIHtcblx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgXCJmeFwiICk7XG5cdFx0aWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkge1xuXHRcdFx0aG9va3MudW5xdWV1ZWQgPSAwO1xuXHRcdFx0b2xkZmlyZSA9IGhvb2tzLmVtcHR5LmZpcmU7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggIWhvb2tzLnVucXVldWVkICkge1xuXHRcdFx0XHRcdG9sZGZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0aG9va3MudW5xdWV1ZWQrKztcblxuXHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gRW5zdXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVyIGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBjb21wbGV0ZXNcblx0XHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gSGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3Ncblx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCJoZWlnaHRcIiBpbiBwcm9wcyB8fCBcIndpZHRoXCIgaW4gcHJvcHMgKSApIHtcblx0XHQvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXRcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFOS0xMCBkbyBub3Rcblx0XHQvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmRcblx0XHQvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZVxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gaW5saW5lLWJsb2NrIGZvciBoZWlnaHQvd2lkdGhcblx0XHQvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkXG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cblx0XHQvLyBUZXN0IGRlZmF1bHQgZGlzcGxheSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSBcIm5vbmVcIlxuXHRcdGNoZWNrRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID9cblx0XHRcdGRhdGFfcHJpdi5nZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiICkgfHwgZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXk7XG5cblx0XHRpZiAoIGNoZWNrRGlzcGxheSA9PT0gXCJpbmxpbmVcIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBzaG93L2hpZGUgcGFzc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGRhdGFTaG93IGxlZnQgb3ZlciBmcm9tIGEgc3RvcHBlZCBoaWRlIG9yIHNob3cgYW5kIHdlIGFyZSBnb2luZyB0byBwcm9jZWVkIHdpdGggc2hvdywgd2Ugc2hvdWxkIHByZXRlbmQgdG8gYmUgaGlkZGVuXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXG5cdFx0Ly8gQW55IG5vbi1meCB2YWx1ZSBzdG9wcyB1cyBmcm9tIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXNwbGF5ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0aWYgKCBkYXRhU2hvdyApIHtcblx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhU2hvdyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIFwiZnhzaG93XCIsIHt9ICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgc3RhdGUgaWYgaXRzIHRvZ2dsZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byBcInJldmVyc2VcIlxuXHRcdGlmICggdG9nZ2xlICkge1xuXHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHR9XG5cdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRqUXVlcnkoIGVsZW0gKS5zaG93KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFuaW0uZG9uZShmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5KCBlbGVtICkuaGlkZSgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGFuaW0uZG9uZShmdW5jdGlvbigpIHtcblx0XHRcdHZhciBwcm9wO1xuXG5cdFx0XHRkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0dHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblxuXHRcdFx0aWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7XG5cdFx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDtcblx0XHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdFx0dHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdFx0dHdlZW4uc3RhcnQgPSBwcm9wID09PSBcIndpZHRoXCIgfHwgcHJvcCA9PT0gXCJoZWlnaHRcIiA/IDEgOiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdC8vIElmIHRoaXMgaXMgYSBub29wIGxpa2UgLmhpZGUoKS5oaWRlKCksIHJlc3RvcmUgYW4gb3ZlcndyaXR0ZW4gZGlzcGxheSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCAoZGlzcGxheSA9PT0gXCJub25lXCIgPyBkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApIDogZGlzcGxheSkgPT09IFwiaW5saW5lXCIgKSB7XG5cdFx0c3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApO1xuXHRcdGVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTtcblx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdO1xuXHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGFuaW1hdGlvblByZWZpbHRlcnMubGVuZ3RoLFxuXHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9KSxcblx0XHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSk7XG5cblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSh7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9IH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXHRcdFx0XHRcdC8vIElmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVuc1xuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxuXHRcdFx0XHRcdGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7XG5cdFx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9KSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdHJlc3VsdCA9IGFuaW1hdGlvblByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xuXHRcdGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApO1xuXHR9XG5cblx0alF1ZXJ5LmZ4LnRpbWVyKFxuXHRcdGpRdWVyeS5leHRlbmQoIHRpY2ssIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRhbmltOiBhbmltYXRpb24sXG5cdFx0XHRxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWVcblx0XHR9KVxuXHQpO1xuXG5cdC8vIGF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdHJldHVybiBhbmltYXRpb24ucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5zcGxpdChcIiBcIik7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdHR3ZWVuZXJzWyBwcm9wIF0gPSB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xuXHRcdFx0dHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRhbmltYXRpb25QcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFuaW1hdGlvblByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsXG5cdFx0ZHVyYXRpb246IHNwZWVkLFxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gXCJudW1iZXJcIiA/IG9wdC5kdXJhdGlvbiA6XG5cdFx0b3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7XG5cblx0Ly8gTm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXG5cdGlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkge1xuXHRcdG9wdC5xdWV1ZSA9IFwiZnhcIjtcblx0fVxuXG5cdC8vIFF1ZXVlaW5nXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XG5cblx0b3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gU2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFfcHJpdi5nZXQoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFfcHJpdi5nZXQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZC5cblx0XHRcdC8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2hcblx0XHRcdC8vIHdpbGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC5cblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YV9wcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSBcImJvb2xlYW5cIiA/XG5cdFx0XHRjc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOlxuXHRcdFx0dGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKHtcblx0c2xpZGVEb3duOiBnZW5GeChcInNob3dcIiksXG5cdHNsaWRlVXA6IGdlbkZ4KFwiaGlkZVwiKSxcblx0c2xpZGVUb2dnbGU6IGdlbkZ4KFwidG9nZ2xlXCIpLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0pO1xuXG5qUXVlcnkudGltZXJzID0gW107XG5qUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgdGltZXIsXG5cdFx0aSA9IDAsXG5cdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycztcblxuXHRmeE5vdyA9IGpRdWVyeS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblx0XHQvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWRcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRpZiAoIHRpbWVyKCkgKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnRpbWVycy5wb3AoKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5cbmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXHRpZiAoICF0aW1lcklkICkge1xuXHRcdHRpbWVySWQgPSBzZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHR9XG59O1xuXG5qUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRjbGVhckludGVydmFsKCB0aW1lcklkICk7XG5cdHRpbWVySWQgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cdC8vIERlZmF1bHQgc3BlZWRcblx0X2RlZmF1bHQ6IDQwMFxufTtcblxuXG4vLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uXG4vLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSk7XG59O1xuXG5cbihmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBpT1M8PTUuMSwgQW5kcm9pZDw9NC4yK1xuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8PTIuM1xuXHQvLyBPcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZSBpbmNvcnJlY3RseSBtYXJrZWQgYXMgZGlzYWJsZWRcblx0c2VsZWN0LmRpc2FibGVkID0gdHJ1ZTtcblx0c3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59KSgpO1xuXG5cbnZhciBub2RlSG9vaywgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBkb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBzdHJ1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2VyY2FzZVxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyBcIlwiICk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID9cblx0XHRcdFx0dW5kZWZpbmVkIDpcblx0XHRcdFx0cmV0O1xuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsIHByb3BOYW1lLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAobmFtZSA9IGF0dHJOYW1lc1tpKytdKSApIHtcblx0XHRcdFx0cHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cblx0XHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGdldCBzcGVjaWFsIHRyZWF0bWVudCAoIzEwODcwKVxuXHRcdFx0XHRpZiAoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRcdC8vIFNldCBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHRvIGZhbHNlXG5cdFx0XHRcdFx0ZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0YXR0ckhvb2tzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmXG5cdFx0XHRcdFx0alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgcmV0LCBoYW5kbGU7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBuYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSBoYW5kbGU7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG59KTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdO1xuXHRcdH0pO1xuXHR9XG59KTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fSxcblxuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsIG5vdHhtbCxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTtcblxuXHRcdGlmICggbm90eG1sICkge1xuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybiBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyZXQgOlxuXHRcdFx0XHQoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCA/XG5cdFx0XHRcdHJldCA6XG5cdFx0XHRcdGVsZW1bIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmhhc0F0dHJpYnV0ZSggXCJ0YWJpbmRleFwiICkgfHwgcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgZWxlbS5ocmVmID9cblx0XHRcdFx0XHRlbGVtLnRhYkluZGV4IDpcblx0XHRcdFx0XHQtMTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKFtcblx0XCJ0YWJJbmRleFwiLFxuXHRcInJlYWRPbmx5XCIsXG5cdFwibWF4TGVuZ3RoXCIsXG5cdFwiY2VsbFNwYWNpbmdcIixcblx0XCJjZWxsUGFkZGluZ1wiLFxuXHRcInJvd1NwYW5cIixcblx0XCJjb2xTcGFuXCIsXG5cdFwidXNlTWFwXCIsXG5cdFwiZnJhbWVCb3JkZXJcIixcblx0XCJjb250ZW50RWRpdGFibGVcIlxuXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7XG59KTtcblxuXG5cblxudmFyIHJjbGFzcyA9IC9bXFx0XFxyXFxuXFxmXS9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdHByb2NlZWQgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIHByb2NlZWQgKSB7XG5cdFx0XHQvLyBUaGUgZGlzanVuY3Rpb24gaGVyZSBpcyBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIHJlbW92ZUNsYXNzKVxuXHRcdFx0Y2xhc3NlcyA9ICggdmFsdWUgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF07XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/XG5cdFx0XHRcdFx0KCBcIiBcIiArIGVsZW0uY2xhc3NOYW1lICsgXCIgXCIgKS5yZXBsYWNlKCByY2xhc3MsIFwiIFwiICkgOlxuXHRcdFx0XHRcdFwiIFwiXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBvbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBqUXVlcnkudHJpbSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0cHJvY2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmICggcHJvY2VlZCApIHtcblx0XHRcdGNsYXNzZXMgPSAoIHZhbHVlIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdO1xuXHRcdFx0XHQvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKVxuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgP1xuXHRcdFx0XHRcdCggXCIgXCIgKyBlbGVtLmNsYXNzTmFtZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApIDpcblx0XHRcdFx0XHRcIlwiXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPj0gMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjdXIgKSA6IFwiXCI7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHtcblx0XHR2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdGlmICggdHlwZW9mIHN0YXRlVmFsID09PSBcImJvb2xlYW5cIiAmJiB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlVmFsID8gdGhpcy5hZGRDbGFzcyggdmFsdWUgKSA6IHRoaXMucmVtb3ZlQ2xhc3MoIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnRvZ2dsZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGksIHRoaXMuY2xhc3NOYW1lLCBzdGF0ZVZhbCksIHN0YXRlVmFsICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHR2YXIgY2xhc3NOYW1lLFxuXHRcdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRcdHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0XHRjbGFzc05hbWVzID0gdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRcdHdoaWxlICggKGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdKSApIHtcblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gc3RydW5kZWZpbmVkIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0XHRpZiAoIHRoaXMuY2xhc3NOYW1lICkge1xuXHRcdFx0XHRcdC8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXRcblx0XHRcdFx0XHRkYXRhX3ByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgdGhpcy5jbGFzc05hbWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkIGBmYWxzZWAsXG5cdFx0XHRcdC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksXG5cdFx0XHRcdC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cblx0XHRcdFx0dGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyBcIlwiIDogZGF0YV9wcml2LmdldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdGlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoXCIgXCIgKyB0aGlzW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKHJjbGFzcywgXCIgXCIpLmluZGV4T2YoIGNsYXNzTmFtZSApID49IDAgKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIGlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1swXTtcblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRcdHJldC5yZXBsYWNlKHJyZXR1cm4sIFwiXCIpIDpcblx0XHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0XHRyZXQgPT0gbnVsbCA/IFwiXCIgOiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHR2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCI7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoXCJzZXRcIiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0dmFsSG9va3M6IHtcblx0XHRvcHRpb246IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFMTAtMTErXG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdGpRdWVyeS50cmltKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIiB8fCBpbmRleCA8IDAsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoLFxuXHRcdFx0XHRcdGkgPSBpbmRleCA8IDAgP1xuXHRcdFx0XHRcdFx0bWF4IDpcblx0XHRcdFx0XHRcdG9uZSA/IGluZGV4IDogMDtcblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIElFNi05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKCMyNTUxKVxuXHRcdFx0XHRcdGlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJlxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCggc3VwcG9ydC5vcHREaXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0QXR0cmlidXRlKCBcImRpc2FibGVkXCIgKSA9PT0gbnVsbCApICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cdFx0XHRcdFx0aWYgKCAob3B0aW9uLnNlbGVjdGVkID0galF1ZXJ5LmluQXJyYXkoIG9wdGlvbi52YWx1ZSwgdmFsdWVzICkgPj0gMCkgKSB7XG5cdFx0XHRcdFx0XHRvcHRpb25TZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaChbIFwicmFkaW9cIiwgXCJjaGVja2JveFwiIF0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoZWxlbSkudmFsKCksIHZhbHVlICkgPj0gMCApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKCAhc3VwcG9ydC5jaGVja09uICkge1xuXHRcdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0pO1xuXG5cblxuXG4vLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRyaWJ1dGVzLW9ubHkgaW5jbHVzaW9uXG5cblxualF1ZXJ5LmVhY2goIChcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudVwiKS5zcGxpdChcIiBcIiksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH0sXG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyB0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XG5cdH1cbn0pO1xuXG5cbnZhciBub25jZSA9IGpRdWVyeS5ub3coKTtcblxudmFyIHJxdWVyeSA9ICgvXFw/Lyk7XG5cblxuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuLy8gV29ya2Fyb3VuZCBmYWlsdXJlIHRvIHN0cmluZy1jYXN0IG51bGwgaW5wdXRcbmpRdWVyeS5wYXJzZUpTT04gPSBmdW5jdGlvbiggZGF0YSApIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKyBcIlwiICk7XG59O1xuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sLCB0bXA7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTlcblx0dHJ5IHtcblx0XHR0bXAgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdFx0eG1sID0gdG1wLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyaGFzaCA9IC8jLiokLyxcblx0cnRzID0gLyhbPyZdKV89W14mXSovLFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvbWcsXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXHRydXJsID0gL14oW1xcdy4rLV0rOikoPzpcXC9cXC8oPzpbXlxcLz8jXSpAfCkoW15cXC8/IzpdKikoPzo6KFxcZCspfCl8KS8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uXG5cdGFsbFR5cGVzID0gXCIqL1wiLmNvbmNhdCggXCIqXCIgKSxcblxuXHQvLyBEb2N1bWVudCBsb2NhdGlvblxuXHRhamF4TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZixcblxuXHQvLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHNcblx0YWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdO1xuXG4vLyBCYXNlIFwiY29uc3RydWN0b3JcIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0XG5mdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHtcblxuXHQvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIFwiKlwiXG5cdHJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkge1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZnVuYyA9IGRhdGFUeXBlRXhwcmVzc2lvbjtcblx0XHRcdGRhdGFUeXBlRXhwcmVzc2lvbiA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdHZhciBkYXRhVHlwZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0ZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkge1xuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoZGF0YVR5cGUgPSBkYXRhVHlwZXNbaSsrXSkgKSB7XG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbMF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS51bnNoaWZ0KCBmdW5jICk7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdChzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiYgIXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoZGVlcCA9IHt9KSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1UeXBlXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZVxuXHRpZiAoIGN0ICkge1xuXHRcdGZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7XG5cdFx0XHRpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkge1xuXHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHJlc3BvbnNlIGZvciB0aGUgZXhwZWN0ZWQgZGF0YVR5cGVcblx0aWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7XG5cdFx0ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWzBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmVcblx0XHRmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlO1xuXHR9XG5cblx0Ly8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZVxuXHQvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZFxuXHQvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG5cdGlmICggZmluYWxEYXRhVHlwZSApIHtcblx0XHRpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkge1xuXHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdO1xuXHR9XG59XG5cbi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcbiAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7XG5cdHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBwcmV2LFxuXHRcdGNvbnZlcnRlcnMgPSB7fSxcblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgY29udjIgXTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudCA9IHRtcFsgMCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpXG5cdFx0XHRcdGlmICggY29udiAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW1cblx0XHRcdFx0XHRpZiAoIGNvbnYgJiYgc1sgXCJ0aHJvd3NcIiBdICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgc3RhdGU6IFwicGFyc2VyZXJyb3JcIiwgZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50IH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBhamF4TG9jYXRpb24sXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL3htbC8sXG5cdFx0XHRodG1sOiAvaHRtbC8sXG5cdFx0XHRqc29uOiAvanNvbi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogalF1ZXJ5LnBhcnNlSlNPTixcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXHRcdFx0Ly8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbVxuXHRcdFx0Y2FjaGVVUkwsXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXHRcdFx0Ly8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzXG5cdFx0XHRwYXJ0cyxcblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxuXHRcdFx0cyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYgKCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdGpRdWVyeS5ldmVudCxcblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXHRcdFx0Ly8gVGhlIGpxWEhSIHN0YXRlXG5cdFx0XHRzdGF0ZSA9IDAsXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXHRcdFx0Ly8gRmFrZSB4aHJcblx0XHRcdGpxWEhSID0ge1xuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxuXG5cdFx0XHRcdC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWRcblx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXHRcdFx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIChtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnNbIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0dmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVEZWZlcnJlZC5hZGQ7XG5cdFx0anFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7XG5cdFx0anFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsO1xuXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9tb3Rpb24pXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgYWpheExvY2F0aW9uICkgKyBcIlwiICkucmVwbGFjZSggcmhhc2gsIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNFxuXHRcdHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7XG5cblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XG5cdFx0cy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHdlIGhhdmUgYSBwcm90b2NvbDpob3N0OnBvcnQgbWlzbWF0Y2hcblx0XHRpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHtcblx0XHRcdHBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7XG5cdFx0XHRzLmNyb3NzRG9tYWluID0gISEoIHBhcnRzICYmXG5cdFx0XHRcdCggcGFydHNbIDEgXSAhPT0gYWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHxcblx0XHRcdFx0XHQoIHBhcnRzWyAzIF0gfHwgKCBwYXJ0c1sgMSBdID09PSBcImh0dHA6XCIgPyBcIjgwXCIgOiBcIjQ0M1wiICkgKSAhPT1cblx0XHRcdFx0XHRcdCggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gXCI4MFwiIDogXCI0NDNcIiApICkgKVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpXG5cdFx0ZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7XG5cblx0XHQvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzXG5cdFx0aWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcihcImFqYXhTdGFydFwiKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHRjYWNoZVVSTCA9IHMudXJsO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9ICggcy51cmwgKz0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuZGF0YSApO1xuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgP1xuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJhbWV0ZXIsIHNldCBpdHMgdmFsdWVcblx0XHRcdFx0XHRjYWNoZVVSTC5yZXBsYWNlKCBydHMsIFwiJDFfPVwiICsgbm9uY2UrKyApIDpcblxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmRcblx0XHRcdFx0XHRjYWNoZVVSTCArICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyBub25jZSsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gP1xuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJiAoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IHN0YXRlID09PSAyICkgKSB7XG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Zm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkge1xuXHRcdFx0anFYSFJbIGkgXSggc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGpxWEhSLmFib3J0KFwidGltZW91dFwiKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHN0YXRlID0gMTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0Ly8gUHJvcGFnYXRlIGV4Y2VwdGlvbiBhcyBlcnJvciBpZiBub3QgZG9uZVxuXHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0XHQvLyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lXG5cdFx0ZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7XG5cdFx0XHR2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLFxuXHRcdFx0XHRzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dDtcblxuXHRcdFx0Ly8gQ2FsbGVkIG9uY2Vcblx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdGUgaXMgXCJkb25lXCIgbm93XG5cdFx0XHRzdGF0ZSA9IDI7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb25cblx0XHRcdC8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcblxuXHRcdFx0Ly8gU2V0IHJlYWR5U3RhdGVcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XG5cblx0XHRcdC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsXG5cdFx0XHRpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNDtcblxuXHRcdFx0Ly8gR2V0IHJlc3BvbnNlIGRhdGFcblx0XHRcdGlmICggcmVzcG9uc2VzICkge1xuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJMYXN0LU1vZGlmaWVkXCIpO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJldGFnXCIpO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcihcImFqYXhTdG9wXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59KTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XG5cdFx0XHRjYWxsYmFjayA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkuYWpheCh7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSk7XG5cdH07XG59KTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoe1xuXHRcdHVybDogdXJsLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cdFx0XCJ0aHJvd3NcIjogdHJ1ZVxuXHR9KTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXNbIDAgXSApIHtcblxuXHRcdFx0Ly8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmRcblx0XHRcdHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1ZSApO1xuXG5cdFx0XHRpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR3cmFwLmluc2VydEJlZm9yZSggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXAubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9KS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKHRoaXMsIGkpICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0Y29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7XG5cblx0XHRcdGlmICggY29udGVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250ZW50cy53cmFwQWxsKCBodG1sICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYXBwZW5kKCBodG1sICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0d3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGlzRnVuY3Rpb24gPyBodG1sLmNhbGwodGhpcywgaSkgOiBodG1sICk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dW53cmFwOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImJvZHlcIiApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0XHR9XG5cdFx0fSkuZW5kKCk7XG5cdH1cbn0pO1xuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdC8vIFN1cHBvcnQ6IE9wZXJhIDw9IDEyLjEyXG5cdC8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBvZmZzZXRIZWlnaHRzIGxlc3MgdGhhbiB6ZXJvIG9uIHNvbWUgZWxlbWVudHNcblx0cmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPD0gMCAmJiBlbGVtLm9mZnNldEhlaWdodCA8PSAwO1xufTtcbmpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7XG59O1xuXG5cblxuXG52YXIgcjIwID0gLyUyMC9nLFxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHtcblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgPyBpIDogXCJcIiApICsgXCJdXCIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgalF1ZXJ5LnR5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblx0XHQvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xuXHR9XG59XG5cbi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mXG4vLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmdcbmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHtcblx0dmFyIHByZWZpeCxcblx0XHRzID0gW10sXG5cdFx0YWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWVcblx0XHRcdHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSApO1xuXHRcdH07XG5cblx0Ly8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci5cblx0aWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0pO1xuXG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApLnJlcGxhY2UoIHIyMCwgXCIrXCIgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSlcblx0XHQuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRcdC8vIFVzZSAuaXMoIFwiOmRpc2FibGVkXCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9KVxuXHRcdC5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdHJldHVybiB2YWwgPT0gbnVsbCA/XG5cdFx0XHRcdG51bGwgOlxuXHRcdFx0XHRqUXVlcnkuaXNBcnJheSggdmFsICkgP1xuXHRcdFx0XHRcdGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9KS5nZXQoKTtcblx0fVxufSk7XG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cdH0gY2F0Y2goIGUgKSB7fVxufTtcblxudmFyIHhocklkID0gMCxcblx0eGhyQ2FsbGJhY2tzID0ge30sXG5cdHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cdFx0Ly8gZmlsZSBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyBjb2RlIDAsIGFzc3VtZSAyMDBcblx0XHQwOiAyMDAsXG5cdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbi8vIFN1cHBvcnQ6IElFOVxuLy8gT3BlbiByZXF1ZXN0cyBtdXN0IGJlIG1hbnVhbGx5IGFib3J0ZWQgb24gdW5sb2FkICgjNTI4MClcbi8vIFNlZSBodHRwczovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8yODU2NzQ2IGZvciBtb3JlIGluZm9cbmlmICggd2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHR3aW5kb3cuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgZnVuY3Rpb24oKSB7XG5cdFx0Zm9yICggdmFyIGtleSBpbiB4aHJDYWxsYmFja3MgKSB7XG5cdFx0XHR4aHJDYWxsYmFja3NbIGtleSBdKCk7XG5cdFx0fVxuXHR9KTtcbn1cblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHR2YXIgY2FsbGJhY2s7XG5cblx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxuXHRpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0dmFyIGksXG5cdFx0XHRcdFx0eGhyID0gb3B0aW9ucy54aHIoKSxcblx0XHRcdFx0XHRpZCA9ICsreGhySWQ7XG5cblx0XHRcdFx0eGhyLm9wZW4oIG9wdGlvbnMudHlwZSwgb3B0aW9ucy51cmwsIG9wdGlvbnMuYXN5bmMsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQgKTtcblxuXHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRcdHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcblx0XHRcdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXJcblx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxuXHRcdFx0XHQvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLlxuXHRcdFx0XHQvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cClcblx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXG5cdFx0XHRcdGlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbXCJYLVJlcXVlc3RlZC1XaXRoXCJdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbXCJYLVJlcXVlc3RlZC1XaXRoXCJdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHhockNhbGxiYWNrc1sgaWQgXTtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSB4aHIub25sb2FkID0geGhyLm9uZXJyb3IgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJhYm9ydFwiICkge1xuXHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcImVycm9yXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBmaWxlOiBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyAwOyBzZWUgIzg2MDUsICMxNDIwN1xuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEFjY2Vzc2luZyBiaW5hcnktZGF0YSByZXNwb25zZVRleHQgdGhyb3dzIGFuIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gKCMxMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiB4aHIucmVzcG9uc2VUZXh0ID09PSBcInN0cmluZ1wiID8ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiB4aHIucmVzcG9uc2VUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHR9IDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0eGhyLm9uZXJyb3IgPSBjYWxsYmFjayhcImVycm9yXCIpO1xuXG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSB4aHJDYWxsYmFja3NbIGlkIF0gPSBjYWxsYmFjayhcImFib3J0XCIpO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0Ly8gIzE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3RpZmllZCBhcyBhbiBlcnJvciB5ZXRcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSk7XG5cblxuXG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvKD86amF2YXxlY21hKXNjcmlwdC9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59KTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0pO1xuXG4vLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnRcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KFwiPHNjcmlwdD5cIikucHJvcCh7XG5cdFx0XHRcdFx0YXN5bmM6IHRydWUsXG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSkub24oXG5cdFx0XHRcdFx0XCJsb2FkIGVycm9yXCIsXG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggZXZ0ICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBldnQudHlwZSA9PT0gXCJlcnJvclwiID8gNDA0IDogMjAwLCBldnQudHlwZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTtcblx0XHRcdH0sXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0pO1xuXG5cblxuXG52YXIgb2xkQ2FsbGJhY2tzID0gW10sXG5cdHJqc29ucCA9IC8oPSlcXD8oPz0mfCQpfFxcP1xcPy87XG5cbi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3NcbmpRdWVyeS5hamF4U2V0dXAoe1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0pO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmICEoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIikgJiYgcmpzb25wLnRlc3QoIHMuZGF0YSApICYmIFwiZGF0YVwiXG5cdFx0KTtcblxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XG5cdGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gXCJqc29ucFwiICkge1xuXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxuXHRcdGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbXCJzY3JpcHQganNvblwiXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIGZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlXG5cdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XG5cblx0XHRcdC8vIFNhdmUgYmFjayBhcyBmcmVlXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xuXHRcdFx0XHQvLyBtYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSk7XG5cblxuXG5cbi8vIGRhdGE6IHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0dmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLFxuXHRcdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsxXSApIF07XG5cdH1cblxuXHRwYXJzZWQgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZFxudmFyIF9sb2FkID0galF1ZXJ5LmZuLmxvYWQ7XG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdGlmICggdHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIiAmJiBfbG9hZCApIHtcblx0XHRyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG5cblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZihcIiBcIik7XG5cblx0aWYgKCBvZmYgPj0gMCApIHtcblx0XHRzZWxlY3RvciA9IGpRdWVyeS50cmltKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoe1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIGlmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWRcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhVHlwZTogXCJodG1sXCIsXG5cdFx0XHRkYXRhOiBwYXJhbXNcblx0XHR9KS5kb25lKGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KFwiPGRpdj5cIikuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0fSkuY29tcGxldGUoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBjYWxsYmFjaywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFsgXCJhamF4U3RhcnRcIiwgXCJhamF4U3RvcFwiLCBcImFqYXhDb21wbGV0ZVwiLCBcImFqYXhFcnJvclwiLCBcImFqYXhTdWNjZXNzXCIsIFwiYWpheFNlbmRcIiBdLCBmdW5jdGlvbiggaSwgdHlwZSApIHtcblx0alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7XG5cdH07XG59KTtcblxuXG5cblxualF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9KS5sZW5ndGg7XG59O1xuXG5cblxuXG52YXIgZG9jRWxlbSA9IHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbi8qKlxuICogR2V0cyBhIHdpbmRvdyBmcm9tIGFuIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPyBlbGVtIDogZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRlZmF1bHRWaWV3O1xufVxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoXCJhdXRvXCIpID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkge1xuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgY3VyT2Zmc2V0ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0XHRqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHR2YXIgZG9jRWxlbSwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sXG5cdFx0XHRkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1bWVudDtcblxuXHRcdGlmICggIWRvYyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhIGRpc2Nvbm5lY3RlZCBET00gbm9kZVxuXHRcdGlmICggIWpRdWVyeS5jb250YWlucyggZG9jRWxlbSwgZWxlbSApICkge1xuXHRcdFx0cmV0dXJuIGJveDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBCbGFja0JlcnJ5IDUsIGlPUyAzIChvcmlnaW5hbCBpUGhvbmUpXG5cdFx0Ly8gSWYgd2UgZG9uJ3QgaGF2ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0aGVyIHRoYW4gZXJyb3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gc3RydW5kZWZpbmVkICkge1xuXHRcdFx0Ym94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR9XG5cdFx0d2luID0gZ2V0V2luZG93KCBkb2MgKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBib3gudG9wICsgd2luLnBhZ2VZT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRUb3AsXG5cdFx0XHRsZWZ0OiBib3gubGVmdCArIHdpbi5wYWdlWE9mZnNldCAtIGRvY0VsZW0uY2xpZW50TGVmdFxuXHRcdH07XG5cdH0sXG5cblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sIGJlY2F1c2UgaXQgaXMgaXRzIG9ubHkgb2Zmc2V0IHBhcmVudFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblx0XHRcdC8vIEFzc3VtZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXMgdGhlcmUgd2hlbiBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudFxuXHRcdFx0b2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKTtcblxuXHRcdFx0Ly8gR2V0IGNvcnJlY3Qgb2Zmc2V0c1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sIFwiaHRtbFwiICkgKSB7XG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzXG5cdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdG9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY0VsZW07XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50LCBcImh0bWxcIiApICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSApIHtcblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2NFbGVtO1xuXHRcdH0pO1xuXHR9XG59KTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXHRcdFx0dmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApO1xuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luZG93LnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbmRvdy5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApO1xuXHR9O1xufSk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaTw3KywgQ2hyb21lPDM3K1xuLy8gQWRkIHRoZSB0b3AvbGVmdCBjc3NIb29rcyB1c2luZyBqUXVlcnkuZm4ucG9zaXRpb25cbi8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NFxuLy8gQmxpbmsgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjI5MjgwXG4vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0O1xuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5waXhlbFBvc2l0aW9uLFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGNvbXB1dGVkID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7XG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSk7XG5cblxuLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBIZWlnaHQ6IFwiaGVpZ2h0XCIsIFdpZHRoOiBcIndpZHRoXCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7XG5cdGpRdWVyeS5lYWNoKCB7IHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsIFwiXCI6IFwib3V0ZXJcIiArIG5hbWUgfSwgZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXHRcdFx0XHRcdC8vIEFzIG9mIDUvOC8yMDEyIHRoaXMgd2lsbCB5aWVsZCBpbmNvcnJlY3QgcmVzdWx0cyBmb3IgTW9iaWxlIFNhZmFyaSwgYnV0IHRoZXJlXG5cdFx0XHRcdFx0Ly8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOlxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNzY0XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBcImNsaWVudFwiICsgbmFtZSBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodFxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0ZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdFx0XHQvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRoL0hlaWdodF0sXG5cdFx0XHRcdFx0Ly8gd2hpY2hldmVyIGlzIGdyZWF0ZXN0XG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcInNjcm9sbFwiICsgbmFtZSBdLCBkb2NbIFwic2Nyb2xsXCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwib2Zmc2V0XCIgKyBuYW1lIF0sIGRvY1sgXCJvZmZzZXRcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGRvY1sgXCJjbGllbnRcIiArIG5hbWUgXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApO1xuXHRcdH07XG5cdH0pO1xufSk7XG5cblxuLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXRcbmpRdWVyeS5mbi5zaXplID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbmpRdWVyeS5mbi5hbmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSk7XG59XG5cblxuXG5cbnZhclxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoIHR5cGVvZiBub0dsb2JhbCA9PT0gc3RydW5kZWZpbmVkICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cbnJldHVybiBqUXVlcnk7XG5cbn0pKTtcbiIsIi8qISBKc1JlbmRlciB2MC45LjgzIChCZXRhKTogaHR0cDovL2pzdmlld3MuY29tLyNqc3JlbmRlciAqL1xuLyohICoqVkVSU0lPTiBGT1IgV0VCKiogKEZvciBOT0RFLkpTIHNlZSBodHRwOi8vanN2aWV3cy5jb20vZG93bmxvYWQvanNyZW5kZXItbm9kZS5qcykgKi9cbi8qXG4gKiBCZXN0LW9mLWJyZWVkIHRlbXBsYXRpbmcgaW4gYnJvd3NlciBvciBvbiBOb2RlLmpzLlxuICogRG9lcyBub3QgcmVxdWlyZSBqUXVlcnksIG9yIEhUTUwgRE9NXG4gKiBJbnRlZ3JhdGVzIHdpdGggSnNWaWV3cyAoaHR0cDovL2pzdmlld3MuY29tLyNqc3ZpZXdzKVxuICpcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vanNoaW50IC1XMDE4LCAtVzA0MVxuXG4oZnVuY3Rpb24oZmFjdG9yeSwgZ2xvYmFsKSB7XG5cdC8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG5cdHZhciAkID0gZ2xvYmFsLmpRdWVyeTtcblxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHsgLy8gQ29tbW9uSlMgZS5nLiBCcm93c2VyaWZ5XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSAkXG5cdFx0XHQ/IGZhY3RvcnkoZ2xvYmFsLCAkKVxuXHRcdFx0OiBmdW5jdGlvbigkKSB7IC8vIElmIG5vIGdsb2JhbCBqUXVlcnksIHRha2Ugb3B0aW9uYWwgalF1ZXJ5IHBhc3NlZCBhcyBwYXJhbWV0ZXI6IHJlcXVpcmUoJ2pzcmVuZGVyJykoalF1ZXJ5KVxuXHRcdFx0XHRpZiAoJCAmJiAhJC5mbikge1xuXHRcdFx0XHRcdHRocm93IFwiUHJvdmlkZSBqUXVlcnkgb3IgbnVsbFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KGdsb2JhbCwgJCk7XG5cdFx0XHR9O1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRCBzY3JpcHQgbG9hZGVyLCBlLmcuIFJlcXVpcmVKU1xuXHRcdGRlZmluZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmYWN0b3J5KGdsb2JhbCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7IC8vIEJyb3dzZXIgdXNpbmcgcGxhaW4gPHNjcmlwdD4gdGFnXG5cdFx0ZmFjdG9yeShnbG9iYWwsIGZhbHNlKTtcblx0fVxufSAoXG5cbi8vIGZhY3RvcnkgKGZvciBqc3JlbmRlci5qcylcbmZ1bmN0aW9uKGdsb2JhbCwgJCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcbnZhciBzZXRHbG9iYWxzID0gJCA9PT0gZmFsc2U7IC8vIE9ubHkgc2V0IGdsb2JhbHMgaWYgc2NyaXB0IGJsb2NrIGluIGJyb3dzZXIgKG5vdCBBTUQgYW5kIG5vdCBDb21tb25KUylcblxuJCA9ICQgJiYgJC5mbiA/ICQgOiBnbG9iYWwualF1ZXJ5OyAvLyAkIGlzIGpRdWVyeSBwYXNzZWQgaW4gYnkgQ29tbW9uSlMgbG9hZGVyIChCcm93c2VyaWZ5KSwgb3IgZ2xvYmFsIGpRdWVyeS5cblxudmFyIHZlcnNpb25OdW1iZXIgPSBcInYwLjkuODNcIixcblx0anN2U3RvcmVOYW1lLCByVGFnLCByVG1wbFN0cmluZywgdG9wVmlldywgJHZpZXdzLFx0JGV4cGFuZG8sXG5cbi8vVE9ET1x0dG1wbEZuc0NhY2hlID0ge30sXG5cdCRpc0Z1bmN0aW9uLCAkaXNBcnJheSwgJHRlbXBsYXRlcywgJGNvbnZlcnRlcnMsICRoZWxwZXJzLCAkdGFncywgJHN1YiwgJHN1YlNldHRpbmdzLCAkc3ViU2V0dGluZ3NBZHZhbmNlZCwgJHZpZXdzU2V0dGluZ3MsIGRlbGltT3BlbkNoYXIwLCBkZWxpbU9wZW5DaGFyMSwgZGVsaW1DbG9zZUNoYXIwLCBkZWxpbUNsb3NlQ2hhcjEsIGxpbmtDaGFyLCBzZXR0aW5nLCBiYXNlT25FcnJvcixcblxuXHRyUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHQvLyAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cblx0clBhcmFtcyA9IC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICAgICAgICAgbGZ0UHJuMCAgICAgICAgbGZ0UHJuICAgICAgICBib3VuZCAgICAgICAgICAgIHBhdGggICAgb3BlcmF0b3IgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgICAgICAgICAgICAgcGF0aDIgICAgICAgcHJuICAgIGNvbW1hICAgbGZ0UHJuMiAgIGFwb3MgcXVvdCAgICAgIHJ0UHJuIHJ0UHJuRG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuMiAgc3BhY2Vcblx0Ly8gKGxlZnQgcGFyZW4/IGZvbGxvd2VkIGJ5IChwYXRoPyBmb2xsb3dlZCBieSBvcGVyYXRvcikgb3IgKHBhdGggZm9sbG93ZWQgYnkgbGVmdCBwYXJlbj8pKSBvciBjb21tYSBvciBhcG9zIG9yIHF1b3Qgb3IgcmlnaHQgcGFyZW4gb3Igc3BhY2VcblxuXHRpc1JlbmRlckNhbGwsXG5cdHJOZXdMaW5lID0gL1sgXFx0XSooXFxyXFxufFxcbnxcXHIpL2csXG5cdHJVbmVzY2FwZVF1b3RlcyA9IC9cXFxcKFsnXCJdKS9nLFxuXHRyRXNjYXBlUXVvdGVzID0gL1snXCJcXFxcXS9nLCAvLyBFc2NhcGUgcXVvdGVzIGFuZCBcXCBjaGFyYWN0ZXJcblx0ckJ1aWxkSGFzaCA9IC8oPzpcXHgwOHxeKShvbmVycm9yOik/KD86KH4/KSgoW1xcdyRfXFwuXSspOik/KFteXFx4MDhdKykpXFx4MDgoLCk/KFteXFx4MDhdKykvZ2ksXG5cdHJUZXN0RWxzZUlmID0gL15pZlxccy8sXG5cdHJGaXJzdEVsZW0gPSAvPChcXHcrKVs+XFxzXS8sXG5cdHJBdHRyRW5jb2RlID0gL1tcXHgwMGA+PFwiJyY9XS9nLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdHJJc0h0bWwgPSAvW1xceDAwYD48XFxcIicmPV0vLFxuXHRySGFzSGFuZGxlcnMgPSAvXm9uW0EtWl18XmNvbnZlcnQoQmFjayk/JC8sXG5cdHJXcmFwcGVkSW5WaWV3TWFya2VyID0gL15cXCNcXGQrX2BbXFxzXFxTXSpcXC9cXGQrX2AkLyxcblx0ckh0bWxFbmNvZGUgPSByQXR0ckVuY29kZSxcblx0dmlld0lkID0gMCxcblx0Y2hhckVudGl0aWVzID0ge1xuXHRcdFwiJlwiOiBcIiZhbXA7XCIsXG5cdFx0XCI8XCI6IFwiJmx0O1wiLFxuXHRcdFwiPlwiOiBcIiZndDtcIixcblx0XHRcIlxceDAwXCI6IFwiJiMwO1wiLFxuXHRcdFwiJ1wiOiBcIiYjMzk7XCIsXG5cdFx0J1wiJzogXCImIzM0O1wiLFxuXHRcdFwiYFwiOiBcIiYjOTY7XCIsXG5cdFx0XCI9XCI6IFwiJiM2MTtcIlxuXHR9LFxuXHRIVE1MID0gXCJodG1sXCIsXG5cdE9CSkVDVCA9IFwib2JqZWN0XCIsXG5cdHRtcGxBdHRyID0gXCJkYXRhLWpzdi10bXBsXCIsXG5cdGpzdlRtcGwgPSBcImpzdlRtcGxcIixcblx0aW5kZXhTdHIgPSBcIkZvciAjaW5kZXggaW4gbmVzdGVkIGJsb2NrIHVzZSAjZ2V0SW5kZXgoKS5cIixcblx0JHJlbmRlciA9IHt9LFxuXG5cdGpzciA9IGdsb2JhbC5qc3JlbmRlcixcblx0anNyVG9KcSA9IGpzciAmJiAkICYmICEkLnJlbmRlciwgLy8gSnNSZW5kZXIgYWxyZWFkeSBsb2FkZWQsIHdpdGhvdXQgalF1ZXJ5LiBidXQgd2Ugd2lsbCByZS1sb2FkIGl0IG5vdyB0byBhdHRhY2ggdG8galF1ZXJ5XG5cblx0anN2U3RvcmVzID0ge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVG1wbFxuXHRcdH0sXG5cdFx0dGFnOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVGFnXG5cdFx0fSxcblx0XHR2aWV3TW9kZWw6IHtcblx0XHRcdGNvbXBpbGU6IGNvbXBpbGVWaWV3TW9kZWxcblx0XHR9LFxuXHRcdGhlbHBlcjoge30sXG5cdFx0Y29udmVydGVyOiB7fVxuXHR9O1xuXG5cdC8vIHZpZXdzIG9iamVjdCAoJC52aWV3cyBpZiBqUXVlcnkgaXMgbG9hZGVkLCBqc3JlbmRlci52aWV3cyBpZiBubyBqUXVlcnksIGUuZy4gaW4gTm9kZS5qcylcblx0JHZpZXdzID0ge1xuXHRcdGpzdmlld3M6IHZlcnNpb25OdW1iZXIsXG5cdFx0c3ViOiB7XG5cdFx0XHQvLyBzdWJzY3JpcHRpb24sIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0VmlldzogVmlldyxcblx0XHRcdEVycjogSnNWaWV3c0Vycm9yLFxuXHRcdFx0dG1wbEZuOiB0bXBsRm4sXG5cdFx0XHRwYXJzZTogcGFyc2VQYXJhbXMsXG5cdFx0XHRleHRlbmQ6ICRleHRlbmQsXG5cdFx0XHRleHRlbmRDdHg6IGV4dGVuZEN0eCxcblx0XHRcdHN5bnRheEVycjogc3ludGF4RXJyb3IsXG5cdFx0XHRvblN0b3JlOiB7fSxcblx0XHRcdGFkZFNldHRpbmc6IGFkZFNldHRpbmcsXG5cdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRhbGxvd0NvZGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0YWR2U2V0OiBub29wLCAvLyBVcGRhdGUgYWR2YW5jZWQgc2V0dGluZ3Ncblx0XHRcdF90aHM6IHRhZ0hhbmRsZXJzRnJvbVByb3BzLFxuXHRcdFx0X3RnOiBmdW5jdGlvbigpIHt9LCAvLyBDb25zdHJ1Y3RvciBmb3IgdGFnRGVmXG5cdFx0XHRfY252dDogY29udmVydFZhbCxcblx0XHRcdF90YWc6IHJlbmRlclRhZyxcblx0XHRcdF9lcjogZXJyb3IsXG5cdFx0XHRfZXJyOiBvblJlbmRlckVycm9yLFxuXHRcdFx0X2h0bWw6IGh0bWxFbmNvZGUsXG5cdFx0XHRfY3A6IHJldFZhbCwgLy8gR2V0IGNvbXBpbGVkIGNvbnRleHR1YWwgcGFyYW1ldGVycyAob3IgcHJvcGVydGllcykgfmZvbz1leHByLiBJbiBKc1JlbmRlciwgc2ltcGx5IHJldHVybnMgdmFsLlxuXHRcdFx0X3NxOiBmdW5jdGlvbih0b2tlbikge1xuXHRcdFx0XHRpZiAodG9rZW4gPT09IFwiY29uc3RydWN0b3JcIikge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0b2tlbjtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNldHRpbmdzOiB7XG5cdFx0XHRkZWxpbWl0ZXJzOiAkdmlld3NEZWxpbWl0ZXJzLFxuXHRcdFx0YWR2YW5jZWQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZVxuXHRcdFx0XHRcdD8gKFxuXHRcdFx0XHRcdFx0XHQkZXh0ZW5kKCRzdWJTZXR0aW5nc0FkdmFuY2VkLCB2YWx1ZSksXG5cdFx0XHRcdFx0XHRcdCRzdWIuYWR2U2V0KCksXG5cdFx0XHRcdFx0XHRcdCR2aWV3c1NldHRpbmdzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6ICRzdWJTZXR0aW5nc0FkdmFuY2VkO1xuXHRcdFx0XHR9XG5cdFx0fSxcblx0XHRnZXRDdHg6IHJldFZhbCwgLy8gR2V0IGN0eC5mb28gdmFsdWUuIEluIEpzUmVuZGVyLCBzaW1wbHkgcmV0dXJucyB2YWwuXG5cdFx0bWFwOiBkYXRhTWFwICAgIC8vIElmIGpzT2JzZXJ2YWJsZSBsb2FkZWQgZmlyc3QsIHVzZSB0aGF0IGRlZmluaXRpb24gb2YgZGF0YU1hcFxuXHR9O1xuXG5mdW5jdGlvbiBnZXREZXJpdmVkTWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJldCxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRwcmV2QmFzZSA9IHRhZy5iYXNlO1xuXG5cdFx0dGFnLmJhc2UgPSBiYXNlTWV0aG9kOyAvLyBXaXRoaW4gbWV0aG9kIGNhbGwsIGNhbGxpbmcgdGhpcy5iYXNlIHdpbGwgY2FsbCB0aGUgYmFzZSBtZXRob2Rcblx0XHRyZXQgPSBtZXRob2QuYXBwbHkodGFnLCBhcmd1bWVudHMpOyAvLyBDYWxsIHRoZSBtZXRob2Rcblx0XHR0YWcuYmFzZSA9IHByZXZCYXNlOyAvLyBSZXBsYWNlIHRoaXMuYmFzZSB0byBiZSB0aGUgYmFzZSBtZXRob2Qgb2YgdGhlIHByZXZpb3VzIGNhbGwsIGZvciBjaGFpbmVkIGNhbGxzXG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0TWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHQvLyBGb3IgZGVyaXZlZCBtZXRob2RzIChvciBoYW5kbGVycyBkZWNsYXJlZCBkZWNsYXJhdGl2ZWx5IGFzIGluIHt7OmZvbyBvbkNoYW5nZT1+Zm9vQ2hhbmdlZH19IHJlcGxhY2UgYnkgYSBkZXJpdmVkIG1ldGhvZCwgdG8gYWxsb3cgdXNpbmcgdGhpcy5iYXNlKC4uLilcblx0Ly8gb3IgdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSB0byBjYWxsIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLiAoRXF1aXZhbGVudCB0byB0aGlzLl9zdXBlciguLi4pIGFuZCB0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cykgaW4galF1ZXJ5IFVJKVxuXHRpZiAoJGlzRnVuY3Rpb24obWV0aG9kKSkge1xuXHRcdG1ldGhvZCA9IGdldERlcml2ZWRNZXRob2QoXG5cdFx0XHRcdCFiYXNlTWV0aG9kXG5cdFx0XHRcdFx0PyBub29wIC8vIG5vIGJhc2UgbWV0aG9kIGltcGxlbWVudGF0aW9uLCBzbyB1c2Ugbm9vcCBhcyBiYXNlIG1ldGhvZFxuXHRcdFx0XHRcdDogYmFzZU1ldGhvZC5fZFxuXHRcdFx0XHRcdFx0PyBiYXNlTWV0aG9kIC8vIGJhc2VNZXRob2QgaXMgYSBkZXJpdmVkIG1ldGhvZCwgc28gdXMgaXRcblx0XHRcdFx0XHRcdDogZ2V0RGVyaXZlZE1ldGhvZChub29wLCBiYXNlTWV0aG9kKSwgLy8gYmFzZU1ldGhvZCBpcyBub3QgZGVyaXZlZCBzbyBtYWtlIGl0cyBiYXNlIG1ldGhvZCBiZSB0aGUgbm9vcCBtZXRob2Rcblx0XHRcdFx0bWV0aG9kXG5cdFx0XHQpO1xuXHRcdG1ldGhvZC5fZCA9IDE7IC8vIEFkZCBmbGFnIHRoYXQgdGhpcyBpcyBhIGRlcml2ZWQgbWV0aG9kXG5cdH1cblx0cmV0dXJuIG1ldGhvZDtcbn1cblxuZnVuY3Rpb24gdGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHgpIHtcblx0Zm9yICh2YXIgcHJvcCBpbiB0YWdDdHgucHJvcHMpIHtcblx0XHRpZiAockhhc0hhbmRsZXJzLnRlc3QocHJvcCkpIHtcblx0XHRcdHRhZ1twcm9wXSA9IGdldE1ldGhvZCh0YWdbcHJvcF0sIHRhZ0N0eC5wcm9wc1twcm9wXSk7XG5cdFx0XHQvLyBDb3B5IG92ZXIgdGhlIG9uRm9vIHByb3BzLCBjb252ZXJ0IGFuZCBjb252ZXJ0QmFjayBmcm9tIHRhZ0N0eC5wcm9wcyB0byB0YWcgKG92ZXJyaWRlcyB2YWx1ZXMgaW4gdGFnRGVmKS5cblx0XHRcdC8vIE5vdGU6IHVuc3VwcG9ydGVkIHNjZW5hcmlvOiBpZiBoYW5kbGVycyBhcmUgZHluYW1pY2FsbHkgYWRkZWQgXm9uRm9vPWV4cHJlc3Npb24gdGhpcyB3aWxsIHdvcmssIGJ1dCBkeW5hbWljYWxseSByZW1vdmluZyB3aWxsIG5vdCB3b3JrLlxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiByZXRWYWwodmFsKSB7XG5cdHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7XG5cdHJldHVybiBcIlwiO1xufVxuXG5mdW5jdGlvbiBkYmdCcmVhayh2YWwpIHtcblx0Ly8gVXNhZ2UgZXhhbXBsZXM6IHt7ZGJnOi4uLn19LCB7ezp+ZGJnKC4uLil9fSwge3tkYmcgLi4uL319LCB7Xntmb3IgLi4uIG9uQWZ0ZXJMaW5rPX5kYmd9fSBldGMuXG5cdHRyeSB7XG5cdFx0Y29uc29sZS5sb2coXCJKc1JlbmRlciBkYmcgYnJlYWtwb2ludDogXCIgKyB2YWwpO1xuXHRcdHRocm93IFwiZGJnIGJyZWFrcG9pbnRcIjsgLy8gVG8gYnJlYWsgaGVyZSwgc3RvcCBvbiBjYXVnaHQgZXhjZXB0aW9ucy5cblx0fVxuXHRjYXRjaCAoZSkge31cblx0cmV0dXJuIHRoaXMuYmFzZSA/IHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgOiB2YWw7XG59XG5cbmZ1bmN0aW9uIEpzVmlld3NFcnJvcihtZXNzYWdlKSB7XG5cdC8vIEVycm9yIGV4Y2VwdGlvbiB0eXBlIGZvciBKc1ZpZXdzL0pzUmVuZGVyXG5cdC8vIE92ZXJyaWRlIG9mICQudmlld3Muc3ViLkVycm9yIGlzIHBvc3NpYmxlXG5cdHRoaXMubmFtZSA9ICgkLmxpbmsgPyBcIkpzVmlld3NcIiA6IFwiSnNSZW5kZXJcIikgKyBcIiBFcnJvclwiO1xuXHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IHRoaXMubmFtZTtcbn1cblxuZnVuY3Rpb24gJGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuXHRmb3IgKHZhciBuYW1lIGluIHNvdXJjZSkge1xuXHRcdHRhcmdldFtuYW1lXSA9IHNvdXJjZVtuYW1lXTtcblx0fVxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4oSnNWaWV3c0Vycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpKS5jb25zdHJ1Y3RvciA9IEpzVmlld3NFcnJvcjtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vPT09PT09PT09PT09PT09PT09PVxuLy8gdmlld3MuZGVsaW1pdGVyc1xuLy89PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uICR2aWV3c0RlbGltaXRlcnMob3BlbkNoYXJzLCBjbG9zZUNoYXJzLCBsaW5rKSB7XG5cdC8vIFNldCB0aGUgdGFnIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyBhbmQgJ2xpbmsnIGNoYXJhY3Rlci4gRGVmYXVsdCBpcyBcInt7XCIsIFwifX1cIiBhbmQgXCJeXCJcblx0Ly8gb3BlbkNoYXJzLCBjbG9zZUNoYXJzOiBvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MsIGVhY2ggd2l0aCB0d28gY2hhcmFjdGVyc1xuXHRpZiAoIW9wZW5DaGFycykge1xuXHRcdHJldHVybiAkc3ViU2V0dGluZ3MuZGVsaW1pdGVycztcblx0fVxuXHRpZiAoJGlzQXJyYXkob3BlbkNoYXJzKSkge1xuXHRcdHJldHVybiAkdmlld3NEZWxpbWl0ZXJzLmFwcGx5KCR2aWV3cywgb3BlbkNoYXJzKTtcblx0fVxuXG5cdCRzdWJTZXR0aW5ncy5kZWxpbWl0ZXJzID0gW29wZW5DaGFycywgY2xvc2VDaGFycywgbGlua0NoYXIgPSBsaW5rID8gbGluay5jaGFyQXQoMCkgOiBsaW5rQ2hhcl07XG5cblx0ZGVsaW1PcGVuQ2hhcjAgPSBvcGVuQ2hhcnMuY2hhckF0KDApOyAvLyBFc2NhcGUgdGhlIGNoYXJhY3RlcnMgLSBzaW5jZSB0aGV5IGNvdWxkIGJlIHJlZ2V4IHNwZWNpYWwgY2hhcmFjdGVyc1xuXHRkZWxpbU9wZW5DaGFyMSA9IG9wZW5DaGFycy5jaGFyQXQoMSk7XG5cdGRlbGltQ2xvc2VDaGFyMCA9IGNsb3NlQ2hhcnMuY2hhckF0KDApO1xuXHRkZWxpbUNsb3NlQ2hhcjEgPSBjbG9zZUNoYXJzLmNoYXJBdCgxKTtcblx0b3BlbkNoYXJzID0gXCJcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxOyAvLyBEZWZhdWx0IGlzIFwie157XCJcblx0Y2xvc2VDaGFycyA9IFwiXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCJcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjE7ICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgXCJ9fVwiXG5cdC8vIEJ1aWxkIHJlZ2V4IHdpdGggbmV3IGRlbGltaXRlcnNcblx0Ly8gICAgICAgICAgW3RhZyAgICAoZm9sbG93ZWQgYnkgLyBzcGFjZSBvciB9KSAgb3IgY3Z0citjb2xvbiBvciBodG1sIG9yIGNvZGVdIGZvbGxvd2VkIGJ5IHNwYWNlK3BhcmFtcyB0aGVuIGNvbnZlcnRCYWNrP1xuXHRyVGFnID0gXCIoPzooXFxcXHcrKD89W1xcXFwvXFxcXHNcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl0pKXwoXFxcXHcrKT8oOil8KD4pfChcXFxcKikpXFxcXHMqKCg/OlteXFxcXFwiXG5cdFx0KyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl18XFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCIoPyFcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjEgKyBcIikpKj8pXCI7XG5cblx0Ly8gTWFrZSByVGFnIGF2YWlsYWJsZSB0byBKc1ZpZXdzIChvciBvdGhlciBjb21wb25lbnRzKSBmb3IgcGFyc2luZyBiaW5kaW5nIGV4cHJlc3Npb25zXG5cdCRzdWIuclRhZyA9IFwiKD86XCIgKyByVGFnICsgXCIpXCI7XG5cdC8vICAgICAgICAgICAgICAgICAgICAgICAgeyBePyB7ICAgdGFnK3BhcmFtcyBzbGFzaD8gIG9yIGNsb3NpbmdUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBjb21tZW50XG5cdHJUYWcgPSBuZXcgUmVnRXhwKFwiKD86XCIgKyBvcGVuQ2hhcnMgKyByVGFnICsgXCIoXFxcXC8pP3xcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxICsgXCIoPzooPzpcXFxcLyhcXFxcdyspKVxcXFxzKnwhLS1bXFxcXHNcXFxcU10qPy0tKSlcIiArIGNsb3NlQ2hhcnMsIFwiZ1wiKTtcblxuXHQvLyBEZWZhdWx0OiAgYmluZCAgICAgdGFnTmFtZSAgICAgICAgIGN2dCAgIGNsbiBodG1sIGNvZGUgICAgcGFyYW1zICAgICAgICAgICAgc2xhc2ggICBiaW5kMiAgICAgICAgIGNsb3NlQmxrICBjb21tZW50XG5cdC8vICAgICAgLyg/OnsoXFxeKT97KD86KFxcdysoPz1bXFwvXFxzfV0pKXwoXFx3Kyk/KDopfCg+KXwoXFwqKSlcXHMqKCg/OltefV18fSg/IX0pKSo/KShcXC8pP3x7KFxcXik/eyg/Oig/OlxcLyhcXHcrKSlcXHMqfCEtLVtcXHNcXFNdKj8tLSkpfX1cblxuXHQkc3ViLnJUbXBsID0gbmV3IFJlZ0V4cChcIjwuKj58KFteXFxcXFxcXFxdfF4pW3t9XXxcIiArIG9wZW5DaGFycyArIFwiLipcIiArIGNsb3NlQ2hhcnMpO1xuXHQvLyAkc3ViLnJUbXBsIGxvb2tzIGZvciBodG1sIHRhZ3Mgb3IgeyBvciB9IGNoYXIgbm90IHByZWNlZGVkIGJ5IFxcXFwsIG9yIEpzUmVuZGVyIHRhZ3Mge3t4eHh9fS4gRWFjaCBvZiB0aGVzZSBzdHJpbmdzIGFyZSBjb25zaWRlcmVkXG5cdC8vIE5PVCB0byBiZSBqUXVlcnkgc2VsZWN0b3JzXG5cdHJldHVybiAkdmlld3NTZXR0aW5ncztcbn1cblxuLy89PT09PT09PT1cbi8vIFZpZXcuZ2V0XG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRWaWV3KGlubmVyLCB0eXBlKSB7IC8vdmlldy5nZXQoaW5uZXIsIHR5cGUpXG5cdGlmICghdHlwZSAmJiBpbm5lciAhPT0gdHJ1ZSkge1xuXHRcdC8vIHZpZXcuZ2V0KHR5cGUpXG5cdFx0dHlwZSA9IGlubmVyO1xuXHRcdGlubmVyID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dmFyIHZpZXdzLCBpLCBsLCBmb3VuZCxcblx0XHR2aWV3ID0gdGhpcyxcblx0XHRyb290ID0gIXR5cGUgfHwgdHlwZSA9PT0gXCJyb290XCI7XG5cdFx0Ly8gSWYgdHlwZSBpcyB1bmRlZmluZWQsIHJldHVybnMgcm9vdCB2aWV3ICh2aWV3IHVuZGVyIHRvcCB2aWV3KS5cblxuXHRpZiAoaW5uZXIpIHtcblx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgbmVzdGVkIG9uZXMsIGRlcHRoLWZpcnN0IC0gYW5kIHJldHVybiBmaXJzdCBvbmUgd2l0aCBnaXZlbiB0eXBlLlxuXHRcdC8vIElmIHR5cGUgaXMgdW5kZWZpbmVkLCBpLmUuIHZpZXcuZ2V0KHRydWUpLCByZXR1cm4gZmlyc3QgY2hpbGQgdmlldy5cblx0XHRmb3VuZCA9IHR5cGUgJiYgdmlldy50eXBlID09PSB0eXBlICYmIHZpZXc7XG5cdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0dmlld3MgPSB2aWV3LnZpZXdzO1xuXHRcdFx0aWYgKHZpZXcuXy51c2VLZXkpIHtcblx0XHRcdFx0Zm9yIChpIGluIHZpZXdzKSB7XG5cdFx0XHRcdFx0aWYgKGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGkgPSAwLCBsID0gdmlld3MubGVuZ3RoOyAhZm91bmQgJiYgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChyb290KSB7XG5cdFx0Ly8gRmluZCByb290IHZpZXcuICh2aWV3IHdob3NlIHBhcmVudCBpcyB0b3Agdmlldylcblx0XHR3aGlsZSAodmlldy5wYXJlbnQpIHtcblx0XHRcdGZvdW5kID0gdmlldztcblx0XHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0d2hpbGUgKHZpZXcgJiYgIWZvdW5kKSB7XG5cdFx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgcGFyZW50IG9uZXMgLSBhbmQgcmV0dXJuIGZpcnN0IG9uZSB3aXRoIGdpdmVuIHR5cGUuXG5cdFx0XHRmb3VuZCA9IHZpZXcudHlwZSA9PT0gdHlwZSA/IHZpZXcgOiB1bmRlZmluZWQ7XG5cdFx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkSW5kZXgoKSB7XG5cdHZhciB2aWV3ID0gdGhpcy5nZXQoXCJpdGVtXCIpO1xuXHRyZXR1cm4gdmlldyA/IHZpZXcuaW5kZXggOiB1bmRlZmluZWQ7XG59XG5cbmdldE5lc3RlZEluZGV4LmRlcGVuZHMgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIFt0aGlzLmdldChcIml0ZW1cIiksIFwiaW5kZXhcIl07XG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleCgpIHtcblx0cmV0dXJuIHRoaXMuaW5kZXg7XG59XG5cbmdldEluZGV4LmRlcGVuZHMgPSBcImluZGV4XCI7XG5cbi8vPT09PT09PT09PVxuLy8gVmlldy5obHBcbi8vPT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRIZWxwZXIoaGVscGVyLCBpc0NvbnRleHRDYikge1xuXHQvLyBIZWxwZXIgbWV0aG9kIGNhbGxlZCBhcyB2aWV3LmhscChrZXkpIGZyb20gY29tcGlsZWQgdGVtcGxhdGUsIGZvciBoZWxwZXJzIG9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgfmZvb1xuXHR2YXIgd3JhcHBlZCwgZGVwcyxcblx0dmlldyA9IHRoaXMsXG5cdHJlcyA9IHZpZXcuY3R4O1xuXG5cdGlmIChyZXMpIHtcblx0XHRyZXMgPSByZXNbaGVscGVyXTtcblx0fVxuXHRpZiAocmVzID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXMgPSAkaGVscGVyc1toZWxwZXJdO1xuXHR9XG5cdGlmIChyZXMgJiYgcmVzLl9jcCkgeyAvLyBJZiB0aGlzIGhlbHBlciByZXNvdXJjZSBpcyBhIGNvbnRleHR1YWwgcGFyYW1ldGVyLCB+Zm9vPWV4cHJcblx0XHRpZiAoaXNDb250ZXh0Q2IpIHsgIC8vIEluIGEgY29udGV4dCBjYWxsYmFjayBmb3IgYSBjb250ZXh0dWFsIHBhcmFtLCByZXR1cm4gdGhlIFt2aWV3LCBkZXBlbmRlbmNpZXMuLi5dIGFycmF5IC0gbmVlZGVkIGZvciBvYnNlcnZlIGNhbGxcblx0XHRcdGRlcHMgPSAkc3ViLl9jZW8ocmVzWzFdLmRlcHMpOyAgLy8gZm4gZGVwcywgd2l0aCBhbnkgZXhwck9icyBjbG9uZWRcblx0XHRcdGRlcHMudW5zaGlmdChyZXNbMF0pOyAgICAgICAgICAgLy8gdmlld1xuXHRcdFx0ZGVwcy5fY3AgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIGRlcHM7XG5cdFx0fVxuXHRcdHJlcyA9ICR2aWV3cy5nZXRDdHgocmVzKTsgLy8gSWYgYSBjb250ZXh0dWFsIHBhcmFtLCBidXQgbm90IGEgY29udGV4dCBjYWxsYmFjaywgcmV0dXJuIGV2YWx1YXRlZCBwYXJhbSAtIGZuKGRhdGEsIHZpZXcsIGopXG5cdH1cblxuXHRpZiAocmVzKSB7XG5cdFx0aWYgKCRpc0Z1bmN0aW9uKHJlcykgJiYgIXJlcy5fd3JwKSB7XG5cdFx0XHQvLyBJZiBpdCBpcyBvZiB0eXBlIGZ1bmN0aW9uLCBhbmQgbm90IGFscmVhZHkgd3JhcHBlZCwgd2Ugd2lsbCB3cmFwIGl0LCBzbyBpZiBjYWxsZWQgd2l0aCBubyB0aGlzIHBvaW50ZXIgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcblx0XHRcdC8vIHZpZXcgYXMgJ3RoaXMnIGNvbnRleHQuIElmIHRoZSBoZWxwZXIgfmZvbygpIHdhcyBpbiBhIGRhdGEtbGluayBleHByZXNzaW9uLCB0aGUgdmlldyB3aWxsIGhhdmUgYSAndGVtcG9yYXJ5JyBsaW5rQ3R4IHByb3BlcnR5IHRvby5cblx0XHRcdC8vIE5vdGUgdGhhdCBoZWxwZXIgZnVuY3Rpb25zIG9uIGRlZXBlciBwYXRocyB3aWxsIGhhdmUgc3BlY2lmaWMgdGhpcyBwb2ludGVycywgZnJvbSB0aGUgcHJlY2VkaW5nIHBhdGguXG5cdFx0XHQvLyBGb3IgZXhhbXBsZSwgfnV0aWwuZm9vKCkgd2lsbCBoYXZlIHRoZSB+dXRpbCBvYmplY3QgYXMgJ3RoaXMnIHBvaW50ZXJcblx0XHRcdHdyYXBwZWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHJlcy5hcHBseSgoIXRoaXMgfHwgdGhpcyA9PT0gZ2xvYmFsKSA/IHZpZXcgOiB0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcblx0XHRcdHdyYXBwZWQuX3dycCA9IHZpZXc7XG5cdFx0XHQkZXh0ZW5kKHdyYXBwZWQsIHJlcyk7IC8vIEF0dGFjaCBzYW1lIGV4cGFuZG9zIChpZiBhbnkpIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uXG5cdFx0fVxuXHR9XG5cdHJldHVybiB3cmFwcGVkIHx8IHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0VGVtcGxhdGUodG1wbCkge1xuXHRyZXR1cm4gdG1wbCAmJiAodG1wbC5mblxuXHRcdD8gdG1wbFxuXHRcdDogdGhpcy5nZXRSc2MoXCJ0ZW1wbGF0ZXNcIiwgdG1wbCkgfHwgJHRlbXBsYXRlcyh0bXBsKSk7IC8vIG5vdCB5ZXQgY29tcGlsZWRcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gdmlld3MuX2NudnRcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29udmVydFZhbChjb252ZXJ0ZXIsIHZpZXcsIHRhZ0N0eCwgb25FcnJvcikge1xuXHQvLyBzZWxmIGlzIHRlbXBsYXRlIG9iamVjdCBvciBsaW5rQ3R4IG9iamVjdFxuXHR2YXIgdGFnLCB2YWx1ZSxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhcblx0XHRib3VuZFRhZyA9IHR5cGVvZiB0YWdDdHggPT09IFwibnVtYmVyXCIgJiYgdmlldy50bXBsLmJuZHNbdGFnQ3R4LTFdLFxuXHRcdGxpbmtDdHggPSB2aWV3LmxpbmtDdHg7IC8vIEZvciBkYXRhLWxpbms9XCJ7Y3Z0Oi4uLn1cIi4uLlxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YWdDdHggPSBvbkVycm9yID0ge3Byb3BzOiB7fSwgYXJnczogW29uRXJyb3JdfTtcblx0fSBlbHNlIGlmIChib3VuZFRhZykge1xuXHRcdHRhZ0N0eCA9IGJvdW5kVGFnKHZpZXcuZGF0YSwgdmlldywgJHN1Yik7XG5cdH1cblxuXHR2YWx1ZSA9IHRhZ0N0eC5hcmdzWzBdO1xuXHRpZiAoY29udmVydGVyIHx8IGJvdW5kVGFnKSB7XG5cdFx0dGFnID0gbGlua0N0eCAmJiBsaW5rQ3R4LnRhZztcblx0XHRpZiAoIXRhZykge1xuXHRcdFx0dGFnID0gJGV4dGVuZChuZXcgJHN1Yi5fdGcoKSwge1xuXHRcdFx0XHRfOiB7XG5cdFx0XHRcdFx0aW5saW5lOiAhbGlua0N0eCxcblx0XHRcdFx0XHRibmQ6IGJvdW5kVGFnLFxuXHRcdFx0XHRcdHVubGlua2VkOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRhZ05hbWU6IFwiOlwiLFxuXHRcdFx0XHRjdnQ6IGNvbnZlcnRlcixcblx0XHRcdFx0ZmxvdzogdHJ1ZSxcblx0XHRcdFx0dGFnQ3R4OiB0YWdDdHhcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0bGlua0N0eC50YWcgPSB0YWc7XG5cdFx0XHRcdHRhZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdH1cblx0XHRcdHRhZ0N0eC5jdHggPSBleHRlbmRDdHgodGFnQ3R4LmN0eCwgKGxpbmtDdHggPyBsaW5rQ3R4LnZpZXcgOiB2aWV3KS5jdHgpO1xuXHRcdH1cblx0XHR0YWcuX2VyID0gb25FcnJvciAmJiB2YWx1ZTtcblx0XHR0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eCk7XG5cblx0XHR0YWdDdHgudmlldyA9IHZpZXc7XG5cblx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eCB8fCB0YWcuY3R4IHx8IHt9O1xuXHRcdHRhZ0N0eC5jdHggPSB1bmRlZmluZWQ7XG5cblx0XHR2YWx1ZSA9IHRhZy5jdnRBcmdzKGNvbnZlcnRlciAhPT0gXCJ0cnVlXCIgJiYgY29udmVydGVyKVswXTsgLy8gSWYgdGhlcmUgaXMgYSBjb252ZXJ0QmFjayBidXQgbm8gY29udmVydCwgY29udmVydGVyIHdpbGwgYmUgXCJ0cnVlXCJcblxuXHRcdC8vIENhbGwgb25SZW5kZXIgKHVzZWQgYnkgSnNWaWV3cyBpZiBwcmVzZW50LCB0byBhZGQgYmluZGluZyBhbm5vdGF0aW9ucyBhcm91bmQgcmVuZGVyZWQgY29udGVudClcblx0XHR2YWx1ZSA9IGJvdW5kVGFnICYmIHZpZXcuXy5vblJlbmRlclxuXHRcdFx0PyB2aWV3Ll8ub25SZW5kZXIodmFsdWUsIHZpZXcsIHRhZylcblx0XHRcdDogdmFsdWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9IHVuZGVmaW5lZCA/IHZhbHVlIDogXCJcIjtcbn1cblxuZnVuY3Rpb24gY29udmVydEFyZ3MoY29udmVydGVyKSB7XG5cdHZhciB0YWcgPSB0aGlzLFxuXHRcdHRhZ0N0eCA9IHRhZy50YWdDdHgsXG5cdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdGFyZ3MgPSB0YWdDdHguYXJncztcblxuXHRjb252ZXJ0ZXIgPSBjb252ZXJ0ZXIgfHwgdGFnLmNvbnZlcnQ7XG5cdGNvbnZlcnRlciA9IGNvbnZlcnRlciAmJiAoXCJcIiArIGNvbnZlcnRlciA9PT0gY29udmVydGVyXG5cdFx0PyAodmlldy5nZXRSc2MoXCJjb252ZXJ0ZXJzXCIsIGNvbnZlcnRlcikgfHwgZXJyb3IoXCJVbmtub3duIGNvbnZlcnRlcjogJ1wiICsgY29udmVydGVyICsgXCInXCIpKVxuXHRcdDogY29udmVydGVyKTtcblxuXHRhcmdzID0gIWFyZ3MubGVuZ3RoICYmICF0YWdDdHguaW5kZXggLy8gT24gdGhlIG9wZW5pbmcgdGFnIHdpdGggbm8gYXJncywgYmluZCB0byB0aGUgY3VycmVudCBkYXRhIGNvbnRleHRcblx0XHQ/IFt2aWV3LmRhdGFdXG5cdFx0OiBjb252ZXJ0ZXJcblx0XHRcdD8gYXJncy5zbGljZSgpIC8vIElmIHRoZXJlIGlzIGEgY29udmVydGVyLCB1c2UgYSBjb3B5IG9mIHRoZSB0YWdDdHguYXJncyBhcnJheSBmb3IgcmVuZGVyaW5nLCBhbmQgcmVwbGFjZSB0aGUgYXJnc1swXSBpblxuXHRcdFx0Ly8gdGhlIGNvcGllZCBhcnJheSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUuIEJ1dCB3ZSBkbyBub3QgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0YWcudGFnQ3R4LmFyZ3NbMF0gKHRoZSBvcmlnaW5hbCBhcmdzIGFycmF5KVxuXHRcdFx0OiBhcmdzOyAvLyBJZiBubyBjb252ZXJ0ZXIsIGdldCB0aGUgb3JpZ2luYWwgdGFnQ3R4LmFyZ3NcblxuXHRpZiAoY29udmVydGVyKSB7XG5cdFx0aWYgKGNvbnZlcnRlci5kZXBlbmRzKSB7XG5cdFx0XHR0YWcuZGVwZW5kcyA9ICRzdWIuZ2V0RGVwcyh0YWcuZGVwZW5kcywgdGFnLCBjb252ZXJ0ZXIuZGVwZW5kcywgY29udmVydGVyKTtcblx0XHR9XG5cdFx0YXJnc1swXSA9IGNvbnZlcnRlci5hcHBseSh0YWcsIGFyZ3MpO1xuXHR9XG5cdHJldHVybiBhcmdzO1xufVxuXG4vLz09PT09PT09PT09PT1cbi8vIHZpZXdzLl90YWdcbi8vPT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZVR5cGUsIGl0ZW1OYW1lKSB7XG5cdHZhciByZXMsIHN0b3JlLFxuXHRcdHZpZXcgPSB0aGlzO1xuXHR3aGlsZSAoKHJlcyA9PT0gdW5kZWZpbmVkKSAmJiB2aWV3KSB7XG5cdFx0c3RvcmUgPSB2aWV3LnRtcGwgJiYgdmlldy50bXBsW3Jlc291cmNlVHlwZV07XG5cdFx0cmVzID0gc3RvcmUgJiYgc3RvcmVbaXRlbU5hbWVdO1xuXHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0fVxuXHRyZXR1cm4gcmVzIHx8ICR2aWV3c1tyZXNvdXJjZVR5cGVdW2l0ZW1OYW1lXTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyVGFnKHRhZ05hbWUsIHBhcmVudFZpZXcsIHRtcGwsIHRhZ0N0eHMsIGlzVXBkYXRlLCBvbkVycm9yKSB7XG5cdHBhcmVudFZpZXcgPSBwYXJlbnRWaWV3IHx8IHRvcFZpZXc7XG5cdHZhciB0YWcsIHRhZ18sIHRhZ0RlZiwgdGVtcGxhdGUsIHRhZ3MsIGF0dHIsIHBhcmVudFRhZywgaSwgbCwgaXRlbVJldCwgdGFnQ3R4LCB0YWdDdHhDdHgsXG5cdFx0Y29udGVudCwgY2FsbEluaXQsIG1hcERlZiwgdGhpc01hcCwgYXJncywgcHJvcHMsIGluaXRpYWxUbXBsLCB0YWdEYXRhTWFwLCBjb250ZW50Q3R4LFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0bGlua0N0eCA9IHBhcmVudFZpZXcubGlua0N0eCB8fCAwLFxuXHRcdGN0eCA9IHBhcmVudFZpZXcuY3R4LFxuXHRcdHBhcmVudFRtcGwgPSB0bXBsIHx8IHBhcmVudFZpZXcudG1wbCxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhzXG5cdFx0Ym91bmRUYWcgPSB0eXBlb2YgdGFnQ3R4cyA9PT0gXCJudW1iZXJcIiAmJiBwYXJlbnRWaWV3LnRtcGwuYm5kc1t0YWdDdHhzLTFdO1xuXG5cdGlmICh0YWdOYW1lLl9pcyA9PT0gXCJ0YWdcIikge1xuXHRcdHRhZyA9IHRhZ05hbWU7XG5cdFx0dGFnTmFtZSA9IHRhZy50YWdOYW1lO1xuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cztcblx0XHR0ZW1wbGF0ZSA9IHRhZy50ZW1wbGF0ZTtcblx0fSBlbHNlIHtcblx0XHR0YWdEZWYgPSBwYXJlbnRWaWV3LmdldFJzYyhcInRhZ3NcIiwgdGFnTmFtZSkgfHwgZXJyb3IoXCJVbmtub3duIHRhZzoge3tcIiArIHRhZ05hbWUgKyBcIn19IFwiKTtcblx0XHR0ZW1wbGF0ZSA9IHRhZ0RlZi50ZW1wbGF0ZTtcblx0fVxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXQgKz0gb25FcnJvcjtcblx0XHR0YWdDdHhzID0gb25FcnJvciA9IFt7cHJvcHM6IHt9LCBhcmdzOiBbXX1dO1xuXHR9IGVsc2UgaWYgKGJvdW5kVGFnKSB7XG5cdFx0dGFnQ3R4cyA9IGJvdW5kVGFnKHBhcmVudFZpZXcuZGF0YSwgcGFyZW50VmlldywgJHN1Yik7XG5cdH1cblxuXHRsID0gdGFnQ3R4cy5sZW5ndGg7XG5cdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHR0YWdDdHggPSB0YWdDdHhzW2ldO1xuXHRcdGlmICghbGlua0N0eCB8fCAhbGlua0N0eC50YWcgfHwgaSAmJiAhbGlua0N0eC50YWcuXy5pbmxpbmUgfHwgdGFnLl9lcikge1xuXHRcdFx0Ly8gSW5pdGlhbGl6ZSB0YWdDdHhcblx0XHRcdC8vIEZvciBibG9jayB0YWdzLCB0YWdDdHgudG1wbCBpcyBhbiBpbnRlZ2VyID4gMFxuXHRcdFx0aWYgKGNvbnRlbnQgPSBwYXJlbnRUbXBsLnRtcGxzICYmIHRhZ0N0eC50bXBsKSB7XG5cdFx0XHRcdGNvbnRlbnQgPSB0YWdDdHguY29udGVudCA9IHBhcmVudFRtcGwudG1wbHNbY29udGVudCAtIDFdO1xuXHRcdFx0fVxuXHRcdFx0dGFnQ3R4LmluZGV4ID0gaTtcblx0XHRcdHRhZ0N0eC50bXBsID0gY29udGVudDsgLy8gU2V0IHRoZSB0bXBsIHByb3BlcnR5IHRvIHRoZSBjb250ZW50IG9mIHRoZSBibG9jayB0YWdcblx0XHRcdHRhZ0N0eC5yZW5kZXIgPSByZW5kZXJDb250ZW50O1xuXHRcdFx0dGFnQ3R4LnZpZXcgPSBwYXJlbnRWaWV3O1xuXHRcdFx0dGFnQ3R4LmN0eCA9IGV4dGVuZEN0eCh0YWdDdHguY3R4LCBjdHgpOyAvLyBDbG9uZSBhbmQgZXh0ZW5kIHBhcmVudFZpZXcuY3R4XG5cdFx0fVxuXHRcdGlmICh0bXBsID0gdGFnQ3R4LnByb3BzLnRtcGwpIHtcblx0XHRcdC8vIElmIHRoZSB0bXBsIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4sIHNldCB0aGUgdmFsdWUgKHdoZW4gaW5pdGlhbGl6aW5nLCBvciwgaW4gY2FzZSBvZiBiaW5kaW5nOiBedG1wbD0uLi4sIHdoZW4gdXBkYXRpbmcpXG5cdFx0XHR0YWdDdHgudG1wbCA9IHBhcmVudFZpZXcuZ2V0VG1wbCh0bXBsKTtcblx0XHR9XG5cblx0XHRpZiAoIXRhZykge1xuXHRcdFx0Ly8gVGhpcyB3aWxsIG9ubHkgYmUgaGl0IGZvciBpbml0aWFsIHRhZ0N0eCAobm90IGZvciB7e2Vsc2V9fSkgLSBpZiB0aGUgdGFnIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0IHlldFxuXHRcdFx0Ly8gSW5zdGFudGlhdGUgdGFnIGlmIGl0IGRvZXMgbm90IHlldCBleGlzdFxuXHRcdFx0Ly8gSWYgdGhlIHRhZyBoYXMgbm90IGFscmVhZHkgYmVlbiBpbnN0YW50aWF0ZWQsIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGluc3RhbmNlLlxuXHRcdFx0Ly8gfnRhZyB3aWxsIGFjY2VzcyB0aGUgdGFnLCBldmVuIHdpdGhpbiB0aGUgcmVuZGVyaW5nIG9mIHRoZSB0ZW1wbGF0ZSBjb250ZW50IG9mIHRoaXMgdGFnLlxuXHRcdFx0Ly8gRnJvbSBjaGlsZC9kZXNjZW5kYW50IHRhZ3MsIGNhbiBhY2Nlc3MgdXNpbmcgfnRhZy5wYXJlbnQsIG9yIH5wYXJlbnRUYWdzLnRhZ05hbWVcblx0XHRcdHRhZyA9IG5ldyB0YWdEZWYuX2N0cigpO1xuXHRcdFx0Y2FsbEluaXQgPSAhIXRhZy5pbml0O1xuXG5cdFx0XHR0YWcucGFyZW50ID0gcGFyZW50VGFnID0gY3R4ICYmIGN0eC50YWc7XG5cdFx0XHR0YWcudGFnQ3R4cyA9IHRhZ0N0eHM7XG5cdFx0XHR0YWdEYXRhTWFwID0gdGFnLmRhdGFNYXA7XG5cblx0XHRcdGlmIChsaW5rQ3R4KSB7XG5cdFx0XHRcdHRhZy5fLmlubGluZSA9IGZhbHNlO1xuXHRcdFx0XHRsaW5rQ3R4LnRhZyA9IHRhZztcblx0XHRcdFx0dGFnLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZy5fLmJuZCA9IGJvdW5kVGFnIHx8IGxpbmtDdHguZm4pIHtcblx0XHRcdFx0Ly8gQm91bmQgaWYge157dGFnLi4ufX0gb3IgZGF0YS1saW5rPVwie3RhZy4uLn1cIlxuXHRcdFx0XHR0YWcuXy5hcnJWd3MgPSB7fTtcblx0XHRcdH0gZWxzZSBpZiAodGFnLmRhdGFCb3VuZE9ubHkpIHtcblx0XHRcdFx0ZXJyb3IoXCJ7XntcIiArIHRhZ05hbWUgKyBcIn19IHRhZyBtdXN0IGJlIGRhdGEtYm91bmRcIik7XG5cdFx0XHR9XG5cdFx0XHQvL1RPRE8gYmV0dGVyIHBlcmYgZm9yIGNoaWxkVGFncygpIC0ga2VlcCBjaGlsZCB0YWcudGFncyBhcnJheSwgKGFuZCByZW1vdmUgY2hpbGQsIHdoZW4gZGlzcG9zZWQpXG5cdFx0XHQvLyB0YWcudGFncyA9IFtdO1xuXHRcdH1cblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHM7XG5cdFx0dGFnRGF0YU1hcCA9IHRhZy5kYXRhTWFwO1xuXG5cdFx0dGFnQ3R4LnRhZyA9IHRhZztcblx0XHRpZiAodGFnRGF0YU1hcCAmJiB0YWdDdHhzKSB7XG5cdFx0XHR0YWdDdHgubWFwID0gdGFnQ3R4c1tpXS5tYXA7IC8vIENvcHkgb3ZlciB0aGUgY29tcGlsZWQgbWFwIGluc3RhbmNlIGZyb20gdGhlIHByZXZpb3VzIHRhZ0N0eHMgdG8gdGhlIHJlZnJlc2hlZCBvbmVzXG5cdFx0fVxuXHRcdGlmICghdGFnLmZsb3cpIHtcblx0XHRcdHRhZ0N0eEN0eCA9IHRhZ0N0eC5jdHggPSB0YWdDdHguY3R4IHx8IHt9O1xuXG5cdFx0XHQvLyB0YWdzIGhhc2g6IHRhZy5jdHgudGFncywgbWVyZ2VkIHdpdGggcGFyZW50Vmlldy5jdHgudGFncyxcblx0XHRcdHRhZ3MgPSB0YWcucGFyZW50cyA9IHRhZ0N0eEN0eC5wYXJlbnRUYWdzID0gY3R4ICYmIGV4dGVuZEN0eCh0YWdDdHhDdHgucGFyZW50VGFncywgY3R4LnBhcmVudFRhZ3MpIHx8IHt9O1xuXHRcdFx0aWYgKHBhcmVudFRhZykge1xuXHRcdFx0XHR0YWdzW3BhcmVudFRhZy50YWdOYW1lXSA9IHBhcmVudFRhZztcblx0XHRcdFx0Ly9UT0RPIGJldHRlciBwZXJmIGZvciBjaGlsZFRhZ3M6IHBhcmVudFRhZy50YWdzLnB1c2godGFnKTtcblx0XHRcdH1cblx0XHRcdHRhZ3NbdGFnLnRhZ05hbWVdID0gdGFnQ3R4Q3R4LnRhZyA9IHRhZztcblx0XHR9XG5cdH1cblx0aWYgKCEodGFnLl9lciA9IG9uRXJyb3IpKSB7XG5cdFx0dGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHhzWzBdKTtcblx0XHR0YWcucmVuZGVyaW5nID0ge307IC8vIFByb3ZpZGUgb2JqZWN0IGZvciBzdGF0ZSBkdXJpbmcgcmVuZGVyIGNhbGxzIHRvIHRhZyBhbmQgZWxzZXMuIChVc2VkIGJ5IHt7aWZ9fSBhbmQge3tmb3J9fS4uLilcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR0YWdDdHggPSB0YWcudGFnQ3R4ID0gdGFnQ3R4c1tpXTtcblx0XHRcdHByb3BzID0gdGFnQ3R4LnByb3BzO1xuXHRcdFx0YXJncyA9IHRhZy5jdnRBcmdzKCk7XG5cblx0XHRcdGlmIChtYXBEZWYgPSBwcm9wcy5kYXRhTWFwIHx8IHRhZ0RhdGFNYXApIHtcblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoIHx8IHByb3BzLmRhdGFNYXApIHtcblx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcDtcblx0XHRcdFx0XHRpZiAoIXRoaXNNYXAgfHwgdGhpc01hcC5zcmMgIT09IGFyZ3NbMF0gfHwgaXNVcGRhdGUpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzTWFwICYmIHRoaXNNYXAuc3JjKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXNNYXAudW5tYXAoKTsgLy8gb25seSBjYWxsZWQgaWYgb2JzZXJ2YWJsZSBtYXAgLSBub3Qgd2hlbiBvbmx5IHVzZWQgaW4gSnNSZW5kZXIsIGUuZy4gYnkge3twcm9wc319XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcCA9IG1hcERlZi5tYXAoYXJnc1swXSwgcHJvcHMsIHVuZGVmaW5lZCwgIXRhZy5fLmJuZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFyZ3MgPSBbdGhpc01hcC50Z3RdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eDtcblxuXHRcdFx0aWYgKCFpKSB7XG5cdFx0XHRcdGlmIChjYWxsSW5pdCkge1xuXHRcdFx0XHRcdGluaXRpYWxUbXBsID0gdGFnLnRlbXBsYXRlO1xuXHRcdFx0XHRcdHRhZy5pbml0KHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCk7XG5cdFx0XHRcdFx0Y2FsbEluaXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0XHQvLyBTZXQgYXR0ciBvbiBsaW5rQ3R4IHRvIGVuc3VyZSBvdXRwdXR0aW5nIHRvIHRoZSBjb3JyZWN0IHRhcmdldCBhdHRyaWJ1dGUuXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyBlaXRoZXIgbGlua0N0eC5hdHRyIG9yIHRoaXMuYXR0ciBpbiB0aGUgaW5pdCgpIGFsbG93cyBwZXItaW5zdGFuY2UgY2hvaWNlIG9mIHRhcmdldCBhdHRyaWIuXG5cdFx0XHRcdFx0bGlua0N0eC5hdHRyID0gdGFnLmF0dHIgPSBsaW5rQ3R4LmF0dHIgfHwgdGFnLmF0dHI7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXR0ciA9IHRhZy5hdHRyO1xuXHRcdFx0XHR0YWcuXy5ub1Z3cyA9IGF0dHIgJiYgYXR0ciAhPT0gSFRNTDtcblx0XHRcdH1cblxuXHRcdFx0aXRlbVJldCA9IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0YWcucmVuZGVyKSB7XG5cdFx0XHRcdGl0ZW1SZXQgPSB0YWcucmVuZGVyLmFwcGx5KHRhZywgYXJncyk7XG5cdFx0XHRcdGlmIChwYXJlbnRWaWV3LmxpbmtlZCAmJiBpdGVtUmV0ICYmIHRhZy5saW5rZWRFbGVtICYmICFyV3JhcHBlZEluVmlld01hcmtlci50ZXN0KGl0ZW1SZXQpKSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBhIHRhZyByZW5kZXJzIGNvbnRlbnQgZnJvbSB0aGUgcmVuZGVyIG1ldGhvZCwgd2l0aCBkYXRhIGxpbmtpbmcsIGFuZCBoYXMgYSBsaW5rZWRFbGVtIGJpbmRpbmcsIHRoZW4gd2UgbmVlZCB0byB3cmFwIHdpdGhcblx0XHRcdFx0XHQvLyB2aWV3IG1hcmtlcnMsIGlmIGFic2VudCwgc28gdGhlIGNvbnRlbnQgaXMgYSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFnLCB3aGljaCB3aWxsIGNvcnJlY3RseSBkaXNwb3NlIGJpbmRpbmdzIGlmIGRlbGV0ZWQuXG5cdFx0XHRcdFx0aXRlbVJldCA9IHJlbmRlcldpdGhWaWV3cygkLnRlbXBsYXRlcyhpdGVtUmV0KSwgYXJnc1swXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0YWcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWFyZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdGFyZ3MgPSBbcGFyZW50Vmlld107IC8vIG5vIGFyZ3VtZW50cyAtIChlLmcuIHt7ZWxzZX19KSBnZXQgZGF0YSBjb250ZXh0IGZyb20gdmlldy5cblx0XHRcdH1cblx0XHRcdGlmIChpdGVtUmV0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGVudEN0eCA9IGFyZ3NbMF07IC8vIERlZmF1bHQgZGF0YSBjb250ZXh0IGZvciB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBEZWZpbmVkIHRhZy5jb250ZW50Q3R4IGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoaXMuXG5cdFx0XHRcdGlmICh0YWcuY29udGVudEN0eCkge1xuXHRcdFx0XHRcdGNvbnRlbnRDdHggPSB0YWcuY29udGVudEN0eChjb250ZW50Q3R4KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpdGVtUmV0ID0gdGFnQ3R4LnJlbmRlcihjb250ZW50Q3R4LCB0cnVlKSB8fCAoaXNVcGRhdGUgPyB1bmRlZmluZWQgOiBcIlwiKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vIHJldHVybiB2YWx1ZSBmcm9tIHJlbmRlciwgYW5kIG5vIHRlbXBsYXRlL2NvbnRlbnQgdGFnQ3R4LnJlbmRlciguLi4pLCBzbyByZXR1cm4gdW5kZWZpbmVkXG5cdFx0XHRyZXQgPSByZXQgPyByZXQgKyAoaXRlbVJldCB8fCBcIlwiKSA6IGl0ZW1SZXQ7IC8vIElmIG5vIHJlbmRlcmVkIGNvbnRlbnQsIHRoaXMgd2lsbCBiZSB1bmRlZmluZWRcblx0XHR9XG5cdFx0dGFnLnJlbmRlcmluZyA9IHVuZGVmaW5lZDtcblx0fVxuXHR0YWcudGFnQ3R4ID0gdGFnQ3R4c1swXTtcblx0dGFnLmN0eCA9IHRhZy50YWdDdHguY3R4O1xuXG5cdGlmICh0YWcuXy5ub1Z3cykge1xuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0Ly8gaW5saW5lIHRhZyB3aXRoIGF0dHIgc2V0IHRvIFwidGV4dFwiIHdpbGwgaW5zZXJ0IEhUTUwtZW5jb2RlZCBjb250ZW50IC0gYXMgaWYgaXQgd2FzIGVsZW1lbnQtYmFzZWQgaW5uZXJUZXh0XG5cdFx0XHRyZXQgPSBhdHRyID09PSBcInRleHRcIlxuXHRcdFx0XHQ/ICRjb252ZXJ0ZXJzLmh0bWwocmV0KVxuXHRcdFx0XHQ6IFwiXCI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBib3VuZFRhZyAmJiBwYXJlbnRWaWV3Ll8ub25SZW5kZXJcblx0XHQvLyBDYWxsIG9uUmVuZGVyICh1c2VkIGJ5IEpzVmlld3MgaWYgcHJlc2VudCwgdG8gYWRkIGJpbmRpbmcgYW5ub3RhdGlvbnMgYXJvdW5kIHJlbmRlcmVkIGNvbnRlbnQpXG5cdFx0PyBwYXJlbnRWaWV3Ll8ub25SZW5kZXIocmV0LCBwYXJlbnRWaWV3LCB0YWcpXG5cdFx0OiByZXQ7XG59XG5cbi8vPT09PT09PT09PT09PT09PT1cbi8vIFZpZXcgY29uc3RydWN0b3Jcbi8vPT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gVmlldyhjb250ZXh0LCB0eXBlLCBwYXJlbnRWaWV3LCBkYXRhLCB0ZW1wbGF0ZSwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpIHtcblx0Ly8gQ29uc3RydWN0b3IgZm9yIHZpZXcgb2JqZWN0IGluIHZpZXcgaGllcmFyY2h5LiAoQXVnbWVudGVkIGJ5IEpzVmlld3MgaWYgSnNWaWV3cyBpcyBsb2FkZWQpXG5cdHZhciB2aWV3cywgcGFyZW50Vmlld18sIHRhZywgc2VsZl8sXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0aXNBcnJheSA9IHR5cGUgPT09IFwiYXJyYXlcIjtcblxuXHRzZWxmLmNvbnRlbnQgPSBjb250ZW50VG1wbDtcblx0c2VsZi52aWV3cyA9IGlzQXJyYXkgPyBbXSA6IHt9O1xuXHRzZWxmLnBhcmVudCA9IHBhcmVudFZpZXc7XG5cdHNlbGYudHlwZSA9IHR5cGUgfHwgXCJ0b3BcIjtcblx0c2VsZi5kYXRhID0gZGF0YTtcblx0c2VsZi50bXBsID0gdGVtcGxhdGU7XG5cdC8vIElmIHRoZSBkYXRhIGlzIGFuIGFycmF5LCB0aGlzIGlzIGFuICdhcnJheSB2aWV3JyB3aXRoIGEgdmlld3MgYXJyYXkgZm9yIGVhY2ggY2hpbGQgJ2l0ZW0gdmlldydcblx0Ly8gSWYgdGhlIGRhdGEgaXMgbm90IGFuIGFycmF5LCB0aGlzIGlzIGFuICdpdGVtIHZpZXcnIHdpdGggYSB2aWV3cyAnaGFzaCcgb2JqZWN0IGZvciBhbnkgY2hpbGQgbmVzdGVkIHZpZXdzXG5cdC8vIC5fLnVzZUtleSBpcyBub24gemVybyBpZiBpcyBub3QgYW4gJ2FycmF5IHZpZXcnIChvd25pbmcgYSBkYXRhIGFycmF5KS4gVXNlIHRoaXMgYXMgbmV4dCBrZXkgZm9yIGFkZGluZyB0byBjaGlsZCB2aWV3cyBoYXNoXG5cdHNlbGZfID0gc2VsZi5fID0ge1xuXHRcdGtleTogMCxcblx0XHR1c2VLZXk6IGlzQXJyYXkgPyAwIDogMSxcblx0XHRpZDogXCJcIiArIHZpZXdJZCsrLFxuXHRcdG9uUmVuZGVyOiBvblJlbmRlcixcblx0XHRibmRzOiB7fVxuXHR9O1xuXHRzZWxmLmxpbmtlZCA9ICEhb25SZW5kZXI7XG5cdGlmIChwYXJlbnRWaWV3KSB7XG5cdFx0dmlld3MgPSBwYXJlbnRWaWV3LnZpZXdzO1xuXHRcdHBhcmVudFZpZXdfID0gcGFyZW50Vmlldy5fO1xuXHRcdGlmIChwYXJlbnRWaWV3Xy51c2VLZXkpIHtcblx0XHRcdC8vIFBhcmVudCBpcyBub3QgYW4gJ2FycmF5IHZpZXcnLiBBZGQgdGhpcyB2aWV3IHRvIGl0cyB2aWV3cyBvYmplY3Rcblx0XHRcdC8vIHNlbGYuX2tleSA9IGlzIHRoZSBrZXkgaW4gdGhlIHBhcmVudCB2aWV3IGhhc2hcblx0XHRcdHZpZXdzW3NlbGZfLmtleSA9IFwiX1wiICsgcGFyZW50Vmlld18udXNlS2V5KytdID0gc2VsZjtcblx0XHRcdHNlbGYuaW5kZXggPSBpbmRleFN0cjtcblx0XHRcdHNlbGYuZ2V0SW5kZXggPSBnZXROZXN0ZWRJbmRleDtcblx0XHR9IGVsc2UgaWYgKHZpZXdzLmxlbmd0aCA9PT0gKHNlbGZfLmtleSA9IHNlbGYuaW5kZXggPSBrZXkpKSB7IC8vIFBhcmVudCBpcyBhbiAnYXJyYXkgdmlldycuIEFkZCB0aGlzIHZpZXcgdG8gaXRzIHZpZXdzIGFycmF5XG5cdFx0XHR2aWV3cy5wdXNoKHNlbGYpOyAvLyBBZGRpbmcgdG8gZW5kIG9mIHZpZXdzIGFycmF5LiAoVXNpbmcgcHVzaCB3aGVuIHBvc3NpYmxlIC0gYmV0dGVyIHBlcmYgdGhhbiBzcGxpY2UpXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZpZXdzLnNwbGljZShrZXksIDAsIHNlbGYpOyAvLyBJbnNlcnRpbmcgaW4gdmlld3MgYXJyYXlcblx0XHR9XG5cdFx0Ly8gSWYgbm8gY29udGV4dCB3YXMgcGFzc2VkIGluLCB1c2UgcGFyZW50IGNvbnRleHRcblx0XHQvLyBJZiBjb250ZXh0IHdhcyBwYXNzZWQgaW4sIGl0IHNob3VsZCBoYXZlIGJlZW4gbWVyZ2VkIGFscmVhZHkgd2l0aCBwYXJlbnQgY29udGV4dFxuXHRcdHNlbGYuY3R4ID0gY29udGV4dCB8fCBwYXJlbnRWaWV3LmN0eDtcblx0fSBlbHNlIHtcblx0XHRzZWxmLmN0eCA9IGNvbnRleHQ7XG5cdH1cbn1cblxuVmlldy5wcm90b3R5cGUgPSB7XG5cdGdldDogZ2V0Vmlldyxcblx0Z2V0SW5kZXg6IGdldEluZGV4LFxuXHRnZXRSc2M6IGdldFJlc291cmNlLFxuXHRnZXRUbXBsOiBnZXRUZW1wbGF0ZSxcblx0aGxwOiBnZXRIZWxwZXIsXG5cdF9pczogXCJ2aWV3XCJcbn07XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVnaXN0cmF0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZUNoaWxkUmVzb3VyY2VzKHBhcmVudFRtcGwpIHtcblx0dmFyIHN0b3JlTmFtZSwgc3RvcmVOYW1lcywgcmVzb3VyY2VzO1xuXHRmb3IgKHN0b3JlTmFtZSBpbiBqc3ZTdG9yZXMpIHtcblx0XHRzdG9yZU5hbWVzID0gc3RvcmVOYW1lICsgXCJzXCI7XG5cdFx0aWYgKHBhcmVudFRtcGxbc3RvcmVOYW1lc10pIHtcblx0XHRcdHJlc291cmNlcyA9IHBhcmVudFRtcGxbc3RvcmVOYW1lc107ICAgIC8vIFJlc291cmNlcyBub3QgeWV0IGNvbXBpbGVkXG5cdFx0XHRwYXJlbnRUbXBsW3N0b3JlTmFtZXNdID0ge307ICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHVuY29tcGlsZWQgcmVzb3VyY2VzXG5cdFx0XHQkdmlld3Nbc3RvcmVOYW1lc10ocmVzb3VyY2VzLCBwYXJlbnRUbXBsKTsgLy8gQWRkIGJhY2sgaW4gdGhlIGNvbXBpbGVkIHJlc291cmNlc1xuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVRhZ1xuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZVRhZyhuYW1lLCB0YWdEZWYsIHBhcmVudFRtcGwpIHtcblx0dmFyIHRtcGwsIGJhc2VUYWcsIHByb3AsXG5cdFx0Y29tcGlsZWREZWYgPSBuZXcgJHN1Yi5fdGcoKTtcblxuXHRmdW5jdGlvbiBUYWcoKSB7XG5cdFx0dmFyIHRhZyA9IHRoaXM7XG5cdFx0dGFnLl8gPSB7XG5cdFx0XHRpbmxpbmU6IHRydWUsXG5cdFx0XHR1bmxpbmtlZDogdHJ1ZVxuXHRcdH07XG5cblx0XHR0YWcudGFnTmFtZSA9IG5hbWU7XG5cdH1cblxuXHRpZiAoJGlzRnVuY3Rpb24odGFnRGVmKSkge1xuXHRcdC8vIFNpbXBsZSB0YWcgZGVjbGFyZWQgYXMgZnVuY3Rpb24uIE5vIHByZXNlbnRlciBpbnN0YW50YXRpb24uXG5cdFx0dGFnRGVmID0ge1xuXHRcdFx0ZGVwZW5kczogdGFnRGVmLmRlcGVuZHMsXG5cdFx0XHRyZW5kZXI6IHRhZ0RlZlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoXCJcIiArIHRhZ0RlZiA9PT0gdGFnRGVmKSB7XG5cdFx0dGFnRGVmID0ge3RlbXBsYXRlOiB0YWdEZWZ9O1xuXHR9XG5cdGlmIChiYXNlVGFnID0gdGFnRGVmLmJhc2VUYWcpIHtcblx0XHR0YWdEZWYuZmxvdyA9ICEhdGFnRGVmLmZsb3c7IC8vIFNldCBmbG93IHByb3BlcnR5LCBzbyBkZWZhdWx0cyB0byBmYWxzZSBldmVuIGlmIGJhc2VUYWcgaGFzIGZsb3c9dHJ1ZVxuXHRcdHRhZ0RlZi5iYXNlVGFnID0gYmFzZVRhZyA9IFwiXCIgKyBiYXNlVGFnID09PSBiYXNlVGFnXG5cdFx0XHQ/IChwYXJlbnRUbXBsICYmIHBhcmVudFRtcGwudGFnc1tiYXNlVGFnXSB8fCAkdGFnc1tiYXNlVGFnXSlcblx0XHRcdDogYmFzZVRhZztcblxuXHRcdGNvbXBpbGVkRGVmID0gJGV4dGVuZChjb21waWxlZERlZiwgYmFzZVRhZyk7XG5cblx0XHRmb3IgKHByb3AgaW4gdGFnRGVmKSB7XG5cdFx0XHRjb21waWxlZERlZltwcm9wXSA9IGdldE1ldGhvZChiYXNlVGFnW3Byb3BdLCB0YWdEZWZbcHJvcF0pO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb21waWxlZERlZiA9ICRleHRlbmQoY29tcGlsZWREZWYsIHRhZ0RlZik7XG5cdH1cblxuXHQvLyBUYWcgZGVjbGFyZWQgYXMgb2JqZWN0LCB1c2VkIGFzIHRoZSBwcm90b3R5cGUgZm9yIHRhZyBpbnN0YW50aWF0aW9uIChjb250cm9sL3ByZXNlbnRlcilcblx0aWYgKCh0bXBsID0gY29tcGlsZWREZWYudGVtcGxhdGUpICE9PSB1bmRlZmluZWQpIHtcblx0XHRjb21waWxlZERlZi50ZW1wbGF0ZSA9IFwiXCIgKyB0bXBsID09PSB0bXBsID8gKCR0ZW1wbGF0ZXNbdG1wbF0gfHwgJHRlbXBsYXRlcyh0bXBsKSkgOiB0bXBsO1xuXHR9XG5cdGlmIChjb21waWxlZERlZi5pbml0ICE9PSBmYWxzZSkge1xuXHRcdC8vIFNldCBpbml0OiBmYWxzZSBvbiB0YWdEZWYgaWYgeW91IHdhbnQgdG8gcHJvdmlkZSBqdXN0IGEgcmVuZGVyIG1ldGhvZCwgb3IgcmVuZGVyIGFuZCB0ZW1wbGF0ZSwgYnV0IG5vIGNvbnN0cnVjdG9yIG9yIHByb3RvdHlwZS5cblx0XHQvLyBzbyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGFnIHRvIHJlbmRlciBmdW5jdGlvbiwgZXhjZXB0IHlvdSBjYW4gYWxzbyBwcm92aWRlIGEgdGVtcGxhdGUuXG5cdFx0KFRhZy5wcm90b3R5cGUgPSBjb21waWxlZERlZikuY29uc3RydWN0b3IgPSBjb21waWxlZERlZi5fY3RyID0gVGFnO1xuXHR9XG5cblx0aWYgKHBhcmVudFRtcGwpIHtcblx0XHRjb21waWxlZERlZi5fcGFyZW50VG1wbCA9IHBhcmVudFRtcGw7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVkRGVmO1xufVxuXG5mdW5jdGlvbiBiYXNlQXBwbHkoYXJncykge1xuXHQvLyBJbiBkZXJpdmVkIG1ldGhvZCAob3IgaGFuZGxlciBkZWNsYXJlZCBkZWNsYXJhdGl2ZWx5IGFzIGluIHt7OmZvbyBvbkNoYW5nZT1+Zm9vQ2hhbmdlZH19IGNhbiBjYWxsIGJhc2UgbWV0aG9kLFxuXHQvLyB1c2luZyB0aGlzLmJhc2VBcHBseShhcmd1bWVudHMpIChFcXVpdmFsZW50IHRvIHRoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSBpbiBqUXVlcnkgVUkpXG5cdHJldHVybiB0aGlzLmJhc2UuYXBwbHkodGhpcywgYXJncyk7XG59XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBjb21waWxlVG1wbFxuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZVRtcGwobmFtZSwgdG1wbCwgcGFyZW50VG1wbCwgb3B0aW9ucykge1xuXHQvLyB0bXBsIGlzIGVpdGhlciBhIHRlbXBsYXRlIG9iamVjdCwgYSBzZWxlY3RvciBmb3IgYSB0ZW1wbGF0ZSBzY3JpcHQgYmxvY2ssIHRoZSBuYW1lIG9mIGEgY29tcGlsZWQgdGVtcGxhdGUsIG9yIGEgdGVtcGxhdGUgb2JqZWN0XG5cblx0Ly89PT09IG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXHRmdW5jdGlvbiBsb29rdXBUZW1wbGF0ZSh2YWx1ZSkge1xuXHRcdC8vIElmIHZhbHVlIGlzIG9mIHR5cGUgc3RyaW5nIC0gdHJlYXQgYXMgc2VsZWN0b3IsIG9yIG5hbWUgb2YgY29tcGlsZWQgdGVtcGxhdGVcblx0XHQvLyBSZXR1cm4gdGhlIHRlbXBsYXRlIG9iamVjdCwgaWYgYWxyZWFkeSBjb21waWxlZCwgb3IgdGhlIG1hcmt1cCBzdHJpbmdcblx0XHR2YXIgY3VycmVudE5hbWUsIHRtcGw7XG5cdFx0aWYgKChcIlwiICsgdmFsdWUgPT09IHZhbHVlKSB8fCB2YWx1ZS5ub2RlVHlwZSA+IDAgJiYgKGVsZW0gPSB2YWx1ZSkpIHtcblx0XHRcdGlmICghZWxlbSkge1xuXHRcdFx0XHRpZiAoL15cXC5cXC9bXlxcXFw6Kj9cIjw+XSokLy50ZXN0KHZhbHVlKSkge1xuXHRcdFx0XHRcdC8vIHRtcGw9XCIuL3NvbWUvZmlsZS5odG1sXCJcblx0XHRcdFx0XHQvLyBJZiB0aGUgdGVtcGxhdGUgaXMgbm90IG5hbWVkLCB1c2UgXCIuL3NvbWUvZmlsZS5odG1sXCIgYXMgbmFtZS5cblx0XHRcdFx0XHRpZiAodG1wbCA9ICR0ZW1wbGF0ZXNbbmFtZSA9IG5hbWUgfHwgdmFsdWVdKSB7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHRtcGw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIEJST1dTRVItU1BFQ0lGSUMgQ09ERSAobm90IG9uIE5vZGUuanMpOlxuXHRcdFx0XHRcdFx0Ly8gTG9vayBmb3Igc2VydmVyLWdlbmVyYXRlZCBzY3JpcHQgYmxvY2sgd2l0aCBpZCBcIi4vc29tZS9maWxlLmh0bWxcIlxuXHRcdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoJC5mbiAmJiAhJHN1Yi5yVG1wbC50ZXN0KHZhbHVlKSkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gJChkb2N1bWVudCkuZmluZCh2YWx1ZSlbMF07IC8vIGlmIGpRdWVyeSBpcyBsb2FkZWQsIHRlc3QgZm9yIHNlbGVjdG9yIHJldHVybmluZyBlbGVtZW50cywgYW5kIGdldCBmaXJzdCBlbGVtZW50XG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHRcdFx0fS8vIEVORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdH0gLy9CUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdC8vIEdlbmVyYWxseSB0aGlzIGlzIGEgc2NyaXB0IGVsZW1lbnQuXG5cdFx0XHRcdC8vIEhvd2V2ZXIgd2UgYWxsb3cgaXQgdG8gYmUgYW55IGVsZW1lbnQsIHNvIHlvdSBjYW4gZm9yIGV4YW1wbGUgdGFrZSB0aGUgY29udGVudCBvZiBhIGRpdixcblx0XHRcdFx0Ly8gdXNlIGl0IGFzIGEgdGVtcGxhdGUsIGFuZCByZXBsYWNlIGl0IGJ5IHRoZSBzYW1lIGNvbnRlbnQgcmVuZGVyZWQgYWdhaW5zdCBkYXRhLlxuXHRcdFx0XHQvLyBlLmcuIGZvciBsaW5raW5nIHRoZSBjb250ZW50IG9mIGEgZGl2IHRvIGEgY29udGFpbmVyLCBhbmQgdXNpbmcgdGhlIGluaXRpYWwgY29udGVudCBhcyB0ZW1wbGF0ZTpcblx0XHRcdFx0Ly8gJC5saW5rKFwiI2NvbnRlbnRcIiwgbW9kZWwsIHt0bXBsOiBcIiNjb250ZW50XCJ9KTtcblx0XHRcdFx0aWYgKG9wdGlvbnMpIHtcblx0XHRcdFx0XHQvLyBXZSB3aWxsIGNvbXBpbGUgYSBuZXcgdGVtcGxhdGUgdXNpbmcgdGhlIG1hcmt1cCBpbiB0aGUgc2NyaXB0IGVsZW1lbnRcblx0XHRcdFx0XHR2YWx1ZSA9IGVsZW0uaW5uZXJIVE1MO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFdlIHdpbGwgY2FjaGUgYSBzaW5nbGUgY29weSBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUsIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbmFtZVxuXHRcdFx0XHRcdC8vIChyZW5hbWluZyBmcm9tIGEgcHJldmlvdXMgbmFtZSBpZiB0aGVyZSB3YXMgb25lKS5cblx0XHRcdFx0XHRjdXJyZW50TmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKHRtcGxBdHRyKTtcblx0XHRcdFx0XHRpZiAoY3VycmVudE5hbWUpIHtcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50TmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9ICR0ZW1wbGF0ZXNbY3VycmVudE5hbWVdO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgJHRlbXBsYXRlc1tjdXJyZW50TmFtZV07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCQuZm4pIHtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSAkLmRhdGEoZWxlbSlbanN2VG1wbF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG5hbWUgPSBuYW1lIHx8ICgkLmZuID8ganN2VG1wbCA6IHZhbHVlKTtcblx0XHRcdFx0XHRcdHZhbHVlID0gY29tcGlsZVRtcGwobmFtZSwgZWxlbS5pbm5lckhUTUwsIHBhcmVudFRtcGwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YWx1ZS50bXBsTmFtZSA9IG5hbWUgPSBuYW1lIHx8IGN1cnJlbnROYW1lO1xuXHRcdFx0XHRcdGlmIChuYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHRcdFx0XHQkdGVtcGxhdGVzW25hbWVdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKHRtcGxBdHRyLCBuYW1lKTtcblx0XHRcdFx0XHRpZiAoJC5mbikge1xuXHRcdFx0XHRcdFx0JC5kYXRhKGVsZW0sIGpzdlRtcGwsIHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gLy8gRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0ZWxlbSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKCF2YWx1ZS5mbikge1xuXHRcdFx0dmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuIEhUTUwgZWxlbWVudCwgb3IgY29tcGlsZWQgdGVtcGxhdGUsIHJldHVybiB1bmRlZmluZWRcblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0dmFyIGVsZW0sIGNvbXBpbGVkVG1wbCxcblx0XHR0bXBsT3JNYXJrdXAgPSB0bXBsID0gdG1wbCB8fCBcIlwiO1xuXG5cdC8vPT09PSBDb21waWxlIHRoZSB0ZW1wbGF0ZSA9PT09XG5cdGlmIChvcHRpb25zID09PSAwKSB7XG5cdFx0b3B0aW9ucyA9IHVuZGVmaW5lZDtcblx0XHR0bXBsT3JNYXJrdXAgPSBsb29rdXBUZW1wbGF0ZSh0bXBsT3JNYXJrdXApOyAvLyBUb3AtbGV2ZWwgY29tcGlsZSBzbyBkbyBhIHRlbXBsYXRlIGxvb2t1cFxuXHR9XG5cblx0Ly8gSWYgb3B0aW9ucywgdGhlbiB0aGlzIHdhcyBhbHJlYWR5IGNvbXBpbGVkIGZyb20gYSAoc2NyaXB0KSBlbGVtZW50IHRlbXBsYXRlIGRlY2xhcmF0aW9uLlxuXHQvLyBJZiBub3QsIHRoZW4gaWYgdG1wbCBpcyBhIHRlbXBsYXRlIG9iamVjdCwgdXNlIGl0IGZvciBvcHRpb25zXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8ICh0bXBsLm1hcmt1cCA/IHRtcGwgOiB7fSk7XG5cdG9wdGlvbnMudG1wbE5hbWUgPSBuYW1lO1xuXHRpZiAocGFyZW50VG1wbCkge1xuXHRcdG9wdGlvbnMuX3BhcmVudFRtcGwgPSBwYXJlbnRUbXBsO1xuXHR9XG5cdC8vIElmIHRtcGwgaXMgbm90IGEgbWFya3VwIHN0cmluZyBvciBhIHNlbGVjdG9yIHN0cmluZywgdGhlbiBpdCBtdXN0IGJlIGEgdGVtcGxhdGUgb2JqZWN0XG5cdC8vIEluIHRoYXQgY2FzZSwgZ2V0IGl0IGZyb20gdGhlIG1hcmt1cCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG5cdGlmICghdG1wbE9yTWFya3VwICYmIHRtcGwubWFya3VwICYmICh0bXBsT3JNYXJrdXAgPSBsb29rdXBUZW1wbGF0ZSh0bXBsLm1hcmt1cCkpKSB7XG5cdFx0aWYgKHRtcGxPck1hcmt1cC5mbikge1xuXHRcdFx0Ly8gSWYgdGhlIHN0cmluZyByZWZlcmVuY2VzIGEgY29tcGlsZWQgdGVtcGxhdGUgb2JqZWN0LCBuZWVkIHRvIHJlY29tcGlsZSB0byBtZXJnZSBhbnkgbW9kaWZpZWQgb3B0aW9uc1xuXHRcdFx0dG1wbE9yTWFya3VwID0gdG1wbE9yTWFya3VwLm1hcmt1cDtcblx0XHR9XG5cdH1cblx0aWYgKHRtcGxPck1hcmt1cCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYgKHRtcGxPck1hcmt1cC5mbiB8fCB0bXBsLmZuKSB7XG5cdFx0XHQvLyB0bXBsIGlzIGFscmVhZHkgY29tcGlsZWQsIHNvIHVzZSBpdFxuXHRcdFx0aWYgKHRtcGxPck1hcmt1cC5mbikge1xuXHRcdFx0XHRjb21waWxlZFRtcGwgPSB0bXBsT3JNYXJrdXA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRtcGxPck1hcmt1cCBpcyBhIG1hcmt1cCBzdHJpbmcsIG5vdCBhIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHQvLyBDcmVhdGUgdGVtcGxhdGUgb2JqZWN0XG5cdFx0XHR0bXBsID0gdG1wbE9iamVjdCh0bXBsT3JNYXJrdXAsIG9wdGlvbnMpO1xuXHRcdFx0Ly8gQ29tcGlsZSB0byBBU1QgYW5kIHRoZW4gdG8gY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdHRtcGxGbih0bXBsT3JNYXJrdXAucmVwbGFjZShyRXNjYXBlUXVvdGVzLCBcIlxcXFwkJlwiKSwgdG1wbCk7XG5cdFx0fVxuXHRcdGlmICghY29tcGlsZWRUbXBsKSB7XG5cdFx0XHRjb21waWxlZFRtcGwgPSAkZXh0ZW5kKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gY29tcGlsZWRUbXBsLnJlbmRlci5hcHBseShjb21waWxlZFRtcGwsIGFyZ3VtZW50cyk7XG5cdFx0XHR9LCB0bXBsKTtcblxuXHRcdFx0Y29tcGlsZUNoaWxkUmVzb3VyY2VzKGNvbXBpbGVkVG1wbCk7XG5cdFx0fVxuXHRcdGlmIChuYW1lICYmICFwYXJlbnRUbXBsICYmIG5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdCRyZW5kZXJbbmFtZV0gPSBjb21waWxlZFRtcGw7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlZFRtcGw7XG5cdH1cbn1cblxuLy89PT09IC9lbmQgb2YgZnVuY3Rpb24gY29tcGlsZVRtcGwgPT09PVxuXG4vLz09PT09PT09PT09PT09PT09XG4vLyBjb21waWxlVmlld01vZGVsXG4vLz09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRWYWwoZGVmYXVsdFZhbCwgZGF0YSkge1xuXHRyZXR1cm4gJC5pc0Z1bmN0aW9uKGRlZmF1bHRWYWwpXG5cdFx0PyBkZWZhdWx0VmFsLmNhbGwoZGF0YSlcblx0XHQ6IGRlZmF1bHRWYWw7XG59XG5cbmZ1bmN0aW9uIHVubWFwQXJyYXkobW9kZWxBcnIpIHtcblx0XHR2YXIgaSwgYXJyID0gW10sXG5cdFx0XHRsID0gbW9kZWxBcnIubGVuZ3RoO1xuXHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0YXJyLnB1c2gobW9kZWxBcnJbaV0udW5tYXAoKSk7XG5cdFx0fVxuXHRcdHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVWaWV3TW9kZWwobmFtZSwgdHlwZSkge1xuXHR2YXIgaSwgY29uc3RydWN0b3IsXG5cdFx0dmlld01vZGVscyA9IHRoaXMsXG5cdFx0Z2V0dGVycyA9IHR5cGUuZ2V0dGVycyxcblx0XHRleHRlbmQgPSB0eXBlLmV4dGVuZCxcblx0XHRpZCA9IHR5cGUuaWQsXG5cdFx0cHJvdG8gPSAkLmV4dGVuZCh7XG5cdFx0XHRfaXM6IG5hbWUgfHwgXCJ1bm5hbWVkXCIsXG5cdFx0XHR1bm1hcDogdW5tYXAsXG5cdFx0XHRtZXJnZTogbWVyZ2Vcblx0XHR9LCBleHRlbmQpLFxuXHRcdGFyZ3MgPSBcIlwiLFxuXHRcdGJvZHkgPSBcIlwiLFxuXHRcdGwgPSBnZXR0ZXJzID8gZ2V0dGVycy5sZW5ndGggOiAwLFxuXHRcdCRvYnNlcnZhYmxlID0gJC5vYnNlcnZhYmxlLFxuXHRcdGdldHRlck5hbWVzID0ge307XG5cblx0ZnVuY3Rpb24gR2V0TmV3KGFyZ3MpIHtcblx0XHRjb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmdzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHZtKCkge1xuXHRcdHJldHVybiBuZXcgR2V0TmV3KGFyZ3VtZW50cyk7XG5cdH1cblxuXHRmdW5jdGlvbiBpdGVyYXRlKGRhdGEsIGFjdGlvbikge1xuXHRcdHZhciBqLCBnZXR0ZXJUeXBlLCBkZWZhdWx0VmFsLCBwcm9wLCBvYixcblx0XHRcdG0gPSBnZXR0ZXJzLmxlbmd0aDtcblx0XHRmb3IgKGo9MDsgajxtOyBqKyspIHtcblx0XHRcdHByb3AgPSBnZXR0ZXJzW2pdO1xuXHRcdFx0Z2V0dGVyVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGlmIChwcm9wICsgXCJcIiAhPT0gcHJvcCkge1xuXHRcdFx0XHRnZXR0ZXJUeXBlID0gcHJvcDtcblx0XHRcdFx0cHJvcCA9IGdldHRlclR5cGUuZ2V0dGVyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKChvYiA9IGRhdGFbcHJvcF0pID09PSB1bmRlZmluZWQgJiYgZ2V0dGVyVHlwZSAmJiAoZGVmYXVsdFZhbCA9IGdldHRlclR5cGUuZGVmYXVsdFZhbCkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvYiA9IGdldERlZmF1bHRWYWwoZGVmYXVsdFZhbCwgZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRhY3Rpb24ob2IsIGdldHRlclR5cGUgJiYgdmlld01vZGVsc1tnZXR0ZXJUeXBlLnR5cGVdLCBwcm9wKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBtYXAoZGF0YSkge1xuXHRcdGRhdGEgPSBkYXRhICsgXCJcIiA9PT0gZGF0YVxuXHRcdFx0PyBKU09OLnBhcnNlKGRhdGEpIC8vIEFjY2VwdCBKU09OIHN0cmluZ1xuXHRcdFx0OiBkYXRhOyAgICAgICAgICAgIC8vIG9yIG9iamVjdC9hcnJheVxuXHRcdHZhciBpLCBqLCAgbCwgbSwgcHJvcCxcblx0XHRcdG9iID0gZGF0YSxcblx0XHRcdGFyciA9IFtdO1xuXG5cdFx0aWYgKCRpc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRkYXRhID0gZGF0YSB8fCBbXTtcblx0XHRcdGwgPSBkYXRhLmxlbmd0aDtcblx0XHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0XHRhcnIucHVzaCh0aGlzLm1hcChkYXRhW2ldKSk7XG5cdFx0XHR9XG5cdFx0XHRhcnIuX2lzID0gbmFtZTtcblx0XHRcdGFyci51bm1hcCA9IHVubWFwO1xuXHRcdFx0YXJyLm1lcmdlID0gbWVyZ2U7XG5cdFx0XHRyZXR1cm4gYXJyO1xuXHRcdH1cblxuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRpdGVyYXRlKGRhdGEsIGZ1bmN0aW9uKG9iLCB2aWV3TW9kZWwpIHtcblx0XHRcdFx0aWYgKHZpZXdNb2RlbCkgeyAvLyBJdGVyYXRlIHRvIGJ1aWxkIGdldHRlcnMgYXJnIGFycmF5ICh2YWx1ZSwgb3IgbWFwcGVkIHZhbHVlKVxuXHRcdFx0XHRcdG9iID0gdmlld01vZGVsLm1hcChvYik7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXJyLnB1c2gob2IpO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9iID0gdGhpcy5hcHBseSh0aGlzLCBhcnIpOyAvLyBJbnNhbnRpYXRlIHRoaXMgVmlldyBNb2RlbCwgcGFzc2luZyBnZXR0ZXJzIGFyZ3MgYXJyYXkgdG8gY29uc3RydWN0b3Jcblx0XHRcdGZvciAocHJvcCBpbiBkYXRhKSB7IC8vIENvcHkgb3ZlciBhbnkgb3RoZXIgcHJvcGVydGllcy4gdGhhdCBhcmUgbm90IGdldC9zZXQgcHJvcGVydGllc1xuXHRcdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8gICYmICFnZXR0ZXJOYW1lc1twcm9wXSkge1xuXHRcdFx0XHRcdG9iW3Byb3BdID0gZGF0YVtwcm9wXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb2I7XG5cdH1cblxuXHRmdW5jdGlvbiBtZXJnZShkYXRhKSB7XG5cdFx0ZGF0YSA9IGRhdGEgKyBcIlwiID09PSBkYXRhXG5cdFx0XHQ/IEpTT04ucGFyc2UoZGF0YSkgLy8gQWNjZXB0IEpTT04gc3RyaW5nXG5cdFx0XHQ6IGRhdGE7ICAgICAgICAgICAgLy8gb3Igb2JqZWN0L2FycmF5XG5cdFx0dmFyIGksIGosIGwsIG0sIHByb3AsIG1vZCwgZm91bmQsIGFzc2lnbmVkLCBvYiwgbmV3TW9kQXJyLFxuXHRcdFx0bW9kZWwgPSB0aGlzO1xuXG5cdFx0aWYgKCRpc0FycmF5KG1vZGVsKSkge1xuXHRcdFx0YXNzaWduZWQgPSB7fTtcblx0XHRcdG5ld01vZEFyciA9IFtdO1xuXHRcdFx0bCA9IGRhdGEubGVuZ3RoO1xuXHRcdFx0bSA9IG1vZGVsLmxlbmd0aDtcblx0XHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0XHRvYiA9IGRhdGFbaV07XG5cdFx0XHRcdGZvdW5kID0gZmFsc2U7XG5cdFx0XHRcdGZvciAoaj0wOyBqPG0gJiYgIWZvdW5kOyBqKyspIHtcblx0XHRcdFx0XHRpZiAoYXNzaWduZWRbal0pIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2QgPSBtb2RlbFtqXTtcblxuXHRcdFx0XHRcdGlmIChpZCkge1xuXHRcdFx0XHRcdFx0YXNzaWduZWRbal0gPSBmb3VuZCA9IGlkICsgXCJcIiA9PT0gaWRcblx0XHRcdFx0XHRcdD8gKG9iW2lkXSAmJiAoZ2V0dGVyTmFtZXNbaWRdID8gbW9kW2lkXSgpIDogbW9kW2lkXSkgPT09IG9iW2lkXSlcblx0XHRcdFx0XHRcdDogaWQobW9kLCBvYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChmb3VuZCkge1xuXHRcdFx0XHRcdG1vZC5tZXJnZShvYik7XG5cdFx0XHRcdFx0bmV3TW9kQXJyLnB1c2gobW9kKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuZXdNb2RBcnIucHVzaCh2bS5tYXAob2IpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdCRvYnNlcnZhYmxlKG1vZGVsKS5yZWZyZXNoKG5ld01vZEFyciwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb2RlbC5zcGxpY2UuYXBwbHkobW9kZWwsIFswLCBtb2RlbC5sZW5ndGhdLmNvbmNhdChuZXdNb2RBcnIpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aXRlcmF0ZShkYXRhLCBmdW5jdGlvbihvYiwgdmlld01vZGVsLCBnZXR0ZXIpIHtcblx0XHRcdGlmICh2aWV3TW9kZWwpIHtcblx0XHRcdFx0bW9kZWxbZ2V0dGVyXSgpLm1lcmdlKG9iKTsgLy8gVXBkYXRlIHR5cGVkIHByb3BlcnR5XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb2RlbFtnZXR0ZXJdKG9iKTsgLy8gVXBkYXRlIG5vbi10eXBlZCBwcm9wZXJ0eVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGZvciAocHJvcCBpbiBkYXRhKSB7XG5cdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8gJiYgIWdldHRlck5hbWVzW3Byb3BdKSB7XG5cdFx0XHRcdG1vZGVsW3Byb3BdID0gZGF0YVtwcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiB1bm1hcCgpIHtcblx0XHR2YXIgb2IsIHByb3AsIGksIGwsIGdldHRlclR5cGUsIGFyciwgdmFsdWUsXG5cdFx0XHRtb2RlbCA9IHRoaXM7XG5cblx0XHRpZiAoJGlzQXJyYXkobW9kZWwpKSB7XG5cdFx0XHRyZXR1cm4gdW5tYXBBcnJheShtb2RlbCk7XG5cdFx0fVxuXHRcdG9iID0ge307XG5cdFx0bCA9IGdldHRlcnMubGVuZ3RoO1xuXHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0cHJvcCA9IGdldHRlcnNbaV07XG5cdFx0XHRnZXR0ZXJUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHByb3AgKyBcIlwiICE9PSBwcm9wKSB7XG5cdFx0XHRcdGdldHRlclR5cGUgPSBwcm9wO1xuXHRcdFx0XHRwcm9wID0gZ2V0dGVyVHlwZS5nZXR0ZXI7XG5cdFx0XHR9XG5cdFx0XHR2YWx1ZSA9IG1vZGVsW3Byb3BdKCk7XG5cdFx0XHRvYltwcm9wXSA9IGdldHRlclR5cGUgJiYgdmFsdWUgJiYgdmlld01vZGVsc1tnZXR0ZXJUeXBlLnR5cGVdXG5cdFx0XHRcdD8gJGlzQXJyYXkodmFsdWUpXG5cdFx0XHRcdFx0PyB1bm1hcEFycmF5KHZhbHVlKVxuXHRcdFx0XHRcdDogdmFsdWUudW5tYXAoKVxuXHRcdFx0XHQ6IHZhbHVlO1xuXHRcdH1cblx0XHRmb3IgKHByb3AgaW4gbW9kZWwpIHtcblx0XHRcdGlmIChwcm9wICE9PSBcIl9pc1wiICYmICFnZXR0ZXJOYW1lc1twcm9wXSAmJiBwcm9wICE9PSAkZXhwYW5kbyAgJiYgKHByb3AuY2hhckF0KDApICE9PSBcIl9cIiB8fCAhZ2V0dGVyTmFtZXNbcHJvcC5zbGljZSgxKV0pICYmICEkLmlzRnVuY3Rpb24obW9kZWxbcHJvcF0pKSB7XG5cdFx0XHRcdG9iW3Byb3BdID0gbW9kZWxbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvYjtcblx0fVxuXG5cdEdldE5ldy5wcm90b3R5cGUgPSBwcm90bztcblxuXHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHQoZnVuY3Rpb24oZ2V0dGVyKSB7XG5cdFx0XHRnZXR0ZXIgPSBnZXR0ZXIuZ2V0dGVyIHx8IGdldHRlcjtcblx0XHRcdGdldHRlck5hbWVzW2dldHRlcl0gPSBpKzE7XG5cdFx0XHR2YXIgcHJpdkZpZWxkID0gXCJfXCIgKyBnZXR0ZXI7XG5cblx0XHRcdGFyZ3MgKz0gKGFyZ3MgPyBcIixcIiA6IFwiXCIpICsgZ2V0dGVyO1xuXHRcdFx0Ym9keSArPSBcInRoaXMuXCIgKyBwcml2RmllbGQgKyBcIiA9IFwiICsgZ2V0dGVyICsgXCI7XFxuXCI7XG5cdFx0XHRwcm90b1tnZXR0ZXJdID0gcHJvdG9bZ2V0dGVyXSB8fCBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXNbcHJpdkZpZWxkXTsgLy8gSWYgdGhlcmUgaXMgbm8gYXJndW1lbnQsIHVzZSBhcyBhIGdldHRlclxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHRcdCRvYnNlcnZhYmxlKHRoaXMpLnNldFByb3BlcnR5KGdldHRlciwgdmFsKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzW3ByaXZGaWVsZF0gPSB2YWw7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHRwcm90b1tnZXR0ZXJdLnNldCA9IHByb3RvW2dldHRlcl0uc2V0IHx8IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHRcdHRoaXNbcHJpdkZpZWxkXSA9IHZhbDsgLy8gU2V0dGVyIGNhbGxlZCBieSBvYnNlcnZhYmxlIHByb3BlcnR5IGNoYW5nZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pKGdldHRlcnNbaV0pO1xuXHR9XG5cblx0Y29uc3RydWN0b3IgPSBuZXcgRnVuY3Rpb24oYXJncywgYm9keS5zbGljZSgwLCAtMSkpO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBwcm90bztcblx0cHJvdG8uY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjtcblxuXHR2bS5tYXAgPSBtYXA7XG5cdHZtLmdldHRlcnMgPSBnZXR0ZXJzO1xuXHR2bS5leHRlbmQgPSBleHRlbmQ7XG5cdHZtLmlkID0gaWQ7XG5cdHJldHVybiB2bTtcbn1cblxuZnVuY3Rpb24gdG1wbE9iamVjdChtYXJrdXAsIG9wdGlvbnMpIHtcblx0Ly8gVGVtcGxhdGUgb2JqZWN0IGNvbnN0cnVjdG9yXG5cdHZhciBodG1sVGFnLFxuXHRcdHdyYXBNYXAgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5fd20gfHwge30sIC8vIE9ubHkgdXNlZCBpbiBKc1ZpZXdzLiBPdGhlcndpc2UgZW1wdHk6IHt9XG5cdFx0dG1wbCA9ICRleHRlbmQoXG5cdFx0XHR7XG5cdFx0XHRcdHRtcGxzOiBbXSxcblx0XHRcdFx0bGlua3M6IHt9LCAvLyBDb21waWxlZCBmdW5jdGlvbnMgZm9yIGxpbmsgZXhwcmVzc2lvbnNcblx0XHRcdFx0Ym5kczogW10sXG5cdFx0XHRcdF9pczogXCJ0ZW1wbGF0ZVwiLFxuXHRcdFx0XHRyZW5kZXI6IHJlbmRlckNvbnRlbnRcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zXG5cdFx0KTtcblxuXHR0bXBsLm1hcmt1cCA9IG1hcmt1cDtcblx0aWYgKCFvcHRpb25zLmh0bWxUYWcpIHtcblx0XHQvLyBTZXQgdG1wbC50YWcgdG8gdGhlIHRvcC1sZXZlbCBIVE1MIHRhZyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSwgaWYgYW55Li4uXG5cdFx0aHRtbFRhZyA9IHJGaXJzdEVsZW0uZXhlYyhtYXJrdXApO1xuXHRcdHRtcGwuaHRtbFRhZyA9IGh0bWxUYWcgPyBodG1sVGFnWzFdLnRvTG93ZXJDYXNlKCkgOiBcIlwiO1xuXHR9XG5cdGh0bWxUYWcgPSB3cmFwTWFwW3RtcGwuaHRtbFRhZ107XG5cdGlmIChodG1sVGFnICYmIGh0bWxUYWcgIT09IHdyYXBNYXAuZGl2KSB7XG5cdFx0Ly8gV2hlbiB1c2luZyBKc1ZpZXdzLCB3ZSB0cmltIHRlbXBsYXRlcyB3aGljaCBhcmUgaW5zZXJ0ZWQgaW50byBIVE1MIGNvbnRleHRzIHdoZXJlIHRleHQgbm9kZXMgYXJlIG5vdCByZW5kZXJlZCAoaS5lLiBub3QgJ1BocmFzaW5nIENvbnRlbnQnKS5cblx0XHQvLyBDdXJyZW50bHkgbm90IHRyaW1tZWQgZm9yIDxsaT4gdGFnLiAoTm90IHdvcnRoIGFkZGluZyBwZXJmIGNvc3QpXG5cdFx0dG1wbC5tYXJrdXAgPSAkLnRyaW0odG1wbC5tYXJrdXApO1xuXHR9XG5cblx0cmV0dXJuIHRtcGw7XG59XG5cbi8vPT09PT09PT09PT09PT1cbi8vIHJlZ2lzdGVyU3RvcmVcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVnaXN0ZXJTdG9yZShzdG9yZU5hbWUsIHN0b3JlU2V0dGluZ3MpIHtcblxuXHRmdW5jdGlvbiB0aGVTdG9yZShuYW1lLCBpdGVtLCBwYXJlbnRUbXBsKSB7XG5cdFx0Ly8gVGhlIHN0b3JlIGlzIGFsc28gdGhlIGZ1bmN0aW9uIHVzZWQgdG8gYWRkIGl0ZW1zIHRvIHRoZSBzdG9yZS4gZS5nLiAkLnRlbXBsYXRlcywgb3IgJC52aWV3cy50YWdzXG5cblx0XHQvLyBGb3Igc3RvcmUgb2YgbmFtZSAndGhpbmcnLCBDYWxsIGFzOlxuXHRcdC8vICAgICQudmlld3MudGhpbmdzKGl0ZW1zWywgcGFyZW50VG1wbF0pLFxuXHRcdC8vIG9yICQudmlld3MudGhpbmdzKG5hbWUsIGl0ZW1bLCBwYXJlbnRUbXBsXSlcblxuXHRcdHZhciBvblN0b3JlLCBjb21waWxlLCBpdGVtTmFtZSwgdGhpc1N0b3JlO1xuXHRcdGlmIChuYW1lICYmIHR5cGVvZiBuYW1lID09PSBPQkpFQ1QgJiYgIW5hbWUubm9kZVR5cGUgJiYgIW5hbWUubWFya3VwICYmICFuYW1lLmdldFRndCAmJiAhKHN0b3JlTmFtZSA9PT0gXCJ2aWV3TW9kZWxcIiAmJiBuYW1lLmdldHRlcnMgfHwgbmFtZS5leHRlbmQpKSB7XG5cdFx0XHQvLyBDYWxsIHRvICQudmlld3MudGhpbmdzKGl0ZW1zWywgcGFyZW50VG1wbF0pLFxuXG5cdFx0XHQvLyBBZGRpbmcgaXRlbXMgdG8gdGhlIHN0b3JlXG5cdFx0XHQvLyBJZiBuYW1lIGlzIGEgaGFzaCwgdGhlbiBpdGVtIGlzIHBhcmVudFRtcGwuIEl0ZXJhdGUgb3ZlciBoYXNoIGFuZCBjYWxsIHN0b3JlIGZvciBrZXkuXG5cdFx0XHRmb3IgKGl0ZW1OYW1lIGluIG5hbWUpIHtcblx0XHRcdFx0dGhlU3RvcmUoaXRlbU5hbWUsIG5hbWVbaXRlbU5hbWVdLCBpdGVtKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpdGVtIHx8ICR2aWV3cztcblx0XHR9XG5cdFx0Ly8gQWRkaW5nIGEgc2luZ2xlIHVubmFtZWQgaXRlbSB0byB0aGUgc3RvcmVcblx0XHRpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpdGVtID0gbmFtZTtcblx0XHRcdG5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmIChuYW1lICYmIFwiXCIgKyBuYW1lICE9PSBuYW1lKSB7IC8vIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xuXHRcdFx0cGFyZW50VG1wbCA9IGl0ZW07XG5cdFx0XHRpdGVtID0gbmFtZTtcblx0XHRcdG5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHRoaXNTdG9yZSA9IHBhcmVudFRtcGxcblx0XHRcdD8gc3RvcmVOYW1lID09PSBcInZpZXdNb2RlbFwiXG5cdFx0XHRcdD8gcGFyZW50VG1wbFxuXHRcdFx0XHQ6IChwYXJlbnRUbXBsW3N0b3JlTmFtZXNdID0gcGFyZW50VG1wbFtzdG9yZU5hbWVzXSB8fCB7fSlcblx0XHRcdDogdGhlU3RvcmU7XG5cdFx0Y29tcGlsZSA9IHN0b3JlU2V0dGluZ3MuY29tcGlsZTtcblx0XHRpZiAoaXRlbSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gSWYgaXRlbSBpcyBudWxsLCBkZWxldGUgdGhpcyBlbnRyeVxuXHRcdFx0aWYgKG5hbWUpIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXNTdG9yZVtuYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aXRlbSA9IGNvbXBpbGUgPyBjb21waWxlLmNhbGwodGhpc1N0b3JlLCBuYW1lLCBpdGVtLCBwYXJlbnRUbXBsLCAwKSA6IGl0ZW07XG5cdFx0XHRpZiAobmFtZSkge1xuXHRcdFx0XHR0aGlzU3RvcmVbbmFtZV0gPSBpdGVtO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoY29tcGlsZSAmJiBpdGVtKSB7XG5cdFx0XHRpdGVtLl9pcyA9IHN0b3JlTmFtZTsgLy8gT25seSBkbyB0aGlzIGZvciBjb21waWxlZCBvYmplY3RzICh0YWdzLCB0ZW1wbGF0ZXMuLi4pXG5cdFx0fVxuXHRcdGlmIChpdGVtICYmIChvblN0b3JlID0gJHN1Yi5vblN0b3JlW3N0b3JlTmFtZV0pKSB7XG5cdFx0XHQvLyBlLmcuIEpzVmlld3MgaW50ZWdyYXRpb25cblx0XHRcdG9uU3RvcmUobmFtZSwgaXRlbSwgY29tcGlsZSk7XG5cdFx0fVxuXHRcdHJldHVybiBpdGVtO1xuXHR9XG5cblx0dmFyIHN0b3JlTmFtZXMgPSBzdG9yZU5hbWUgKyBcInNcIjtcblxuXHQkdmlld3Nbc3RvcmVOYW1lc10gPSB0aGVTdG9yZTtcbn1cblxuZnVuY3Rpb24gYWRkU2V0dGluZyhzdCkge1xuXHQkdmlld3NTZXR0aW5nc1tzdF0gPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG5cdFx0XHQ/ICgkc3ViU2V0dGluZ3Nbc3RdID0gdmFsdWUsICR2aWV3c1NldHRpbmdzKVxuXHRcdFx0OiAkc3ViU2V0dGluZ3Nbc3RdO1xuXHR9O1xufVxuXG4vLz09PT09PT09PVxuLy8gZGF0YU1hcFxuLy89PT09PT09PT1cblxuZnVuY3Rpb24gZGF0YU1hcChtYXBEZWYpIHtcblx0ZnVuY3Rpb24gTWFwKHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdHRoaXMudGd0ID0gbWFwRGVmLmdldFRndChzb3VyY2UsIG9wdGlvbnMpO1xuXHR9XG5cblx0aWYgKCRpc0Z1bmN0aW9uKG1hcERlZikpIHtcblx0XHQvLyBTaW1wbGUgbWFwIGRlY2xhcmVkIGFzIGZ1bmN0aW9uXG5cdFx0bWFwRGVmID0ge1xuXHRcdFx0Z2V0VGd0OiBtYXBEZWZcblx0XHR9O1xuXHR9XG5cblx0aWYgKG1hcERlZi5iYXNlTWFwKSB7XG5cdFx0bWFwRGVmID0gJGV4dGVuZCgkZXh0ZW5kKHt9LCBtYXBEZWYuYmFzZU1hcCksIG1hcERlZik7XG5cdH1cblxuXHRtYXBEZWYubWFwID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zKSB7XG5cdFx0cmV0dXJuIG5ldyBNYXAoc291cmNlLCBvcHRpb25zKTtcblx0fTtcblx0cmV0dXJuIG1hcERlZjtcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gcmVuZGVyQ29udGVudFxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZW5kZXJDb250ZW50KGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBrZXksIG9uUmVuZGVyKSB7XG5cdHZhciBpLCBsLCB0YWcsIHRtcGwsIHRhZ0N0eCwgaXNUb3BSZW5kZXJDYWxsLCBwcmV2RGF0YSwgcHJldkluZGV4LFxuXHRcdHZpZXcgPSBwYXJlbnRWaWV3LFxuXHRcdHJlc3VsdCA9IFwiXCI7XG5cblx0aWYgKGNvbnRleHQgPT09IHRydWUpIHtcblx0XHRub0l0ZXJhdGlvbiA9IGNvbnRleHQ7IC8vIHBhc3NpbmcgYm9vbGVhbiBhcyBzZWNvbmQgcGFyYW0gLSBub0l0ZXJhdGlvblxuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHQgIT09IE9CSkVDVCkge1xuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7IC8vIGNvbnRleHQgbXVzdCBiZSBhIGJvb2xlYW4gKG5vSXRlcmF0aW9uKSBvciBhIHBsYWluIG9iamVjdFxuXHR9XG5cblx0aWYgKHRhZyA9IHRoaXMudGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGNhbGwgZnJvbSByZW5kZXJUYWcgb3IgdGFnQ3R4LnJlbmRlciguLi4pXG5cdFx0dGFnQ3R4ID0gdGhpcztcblx0XHR2aWV3ID0gdmlldyB8fCB0YWdDdHgudmlldztcblx0XHR0bXBsID0gdmlldy5nZXRUbXBsKHRhZy50ZW1wbGF0ZSB8fCB0YWdDdHgudG1wbCk7XG5cdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRkYXRhID0gdmlldztcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyBhIHRlbXBsYXRlLnJlbmRlciguLi4pIGNhbGxcblx0XHR0bXBsID0gdGhpcztcblx0fVxuXG5cdGlmICh0bXBsKSB7XG5cdFx0aWYgKCFwYXJlbnRWaWV3ICYmIGRhdGEgJiYgZGF0YS5faXMgPT09IFwidmlld1wiKSB7XG5cdFx0XHR2aWV3ID0gZGF0YTsgLy8gV2hlbiBwYXNzaW5nIGluIGEgdmlldyB0byByZW5kZXIgb3IgbGluayAoYW5kIG5vdCBwYXNzaW5nIGluIGEgcGFyZW50IHZpZXcpIHVzZSB0aGUgcGFzc2VkLWluIHZpZXcgYXMgcGFyZW50Vmlld1xuXHRcdH1cblxuXHRcdGlmICh2aWV3KSB7XG5cdFx0XHRpZiAoZGF0YSA9PT0gdmlldykge1xuXHRcdFx0XHQvLyBJbmhlcml0IHRoZSBkYXRhIGZyb20gdGhlIHBhcmVudCB2aWV3LlxuXHRcdFx0XHQvLyBUaGlzIG1heSBiZSB0aGUgY29udGVudHMgb2YgYW4ge3tpZn19IGJsb2NrXG5cdFx0XHRcdGRhdGEgPSB2aWV3LmRhdGE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aXNUb3BSZW5kZXJDYWxsID0gIXZpZXc7XG5cdFx0aXNSZW5kZXJDYWxsID0gaXNSZW5kZXJDYWxsIHx8IGlzVG9wUmVuZGVyQ2FsbDtcblx0XHRpZiAoIXZpZXcpIHtcblx0XHRcdChjb250ZXh0ID0gY29udGV4dCB8fCB7fSkucm9vdCA9IGRhdGE7IC8vIFByb3ZpZGUgfnJvb3QgYXMgc2hvcnRjdXQgdG8gdG9wLWxldmVsIGRhdGEuXG5cdFx0fVxuXHRcdGlmICghaXNSZW5kZXJDYWxsIHx8ICRzdWJTZXR0aW5nc0FkdmFuY2VkLnVzZVZpZXdzIHx8IHRtcGwudXNlVmlld3MgfHwgdmlldyAmJiB2aWV3ICE9PSB0b3BWaWV3KSB7XG5cdFx0XHRyZXN1bHQgPSByZW5kZXJXaXRoVmlld3ModG1wbCwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHZpZXcsIGtleSwgb25SZW5kZXIsIHRhZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh2aWV3KSB7IC8vIEluIGEgYmxvY2tcblx0XHRcdFx0cHJldkRhdGEgPSB2aWV3LmRhdGE7XG5cdFx0XHRcdHByZXZJbmRleCA9IHZpZXcuaW5kZXg7XG5cdFx0XHRcdHZpZXcuaW5kZXggPSBpbmRleFN0cjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZpZXcgPSB0b3BWaWV3O1xuXHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhO1xuXHRcdFx0XHR2aWV3LmN0eCA9IGNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGlzQXJyYXkoZGF0YSkgJiYgIW5vSXRlcmF0aW9uKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHRoZSBhcnJheSwgd2hvc2UgY2hpbGQgdmlld3MgY29ycmVzcG9uZCB0byBlYWNoIGRhdGEgaXRlbS4gKE5vdGU6IGlmIGtleSBhbmQgcGFyZW50VmlldyBhcmUgcGFzc2VkIGluXG5cdFx0XHRcdC8vIGFsb25nIHdpdGggcGFyZW50IHZpZXcsIHRyZWF0IGFzIGluc2VydCAtZS5nLiBmcm9tIHZpZXcuYWRkVmlld3MgLSBzbyBwYXJlbnRWaWV3IGlzIGFscmVhZHkgdGhlIHZpZXcgaXRlbSBmb3IgYXJyYXkpXG5cdFx0XHRcdGZvciAoaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHZpZXcuaW5kZXggPSBpO1xuXHRcdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGFbaV07XG5cdFx0XHRcdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YVtpXSwgdmlldywgJHN1Yik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGE7XG5cdFx0XHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGEsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0dmlldy5kYXRhID0gcHJldkRhdGE7XG5cdFx0XHR2aWV3LmluZGV4ID0gcHJldkluZGV4O1xuXHRcdH1cblx0XHRpZiAoaXNUb3BSZW5kZXJDYWxsKSB7XG5cdFx0XHRpc1JlbmRlckNhbGwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcldpdGhWaWV3cyh0bXBsLCBkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgdmlldywga2V5LCBvblJlbmRlciwgdGFnKSB7XG5cdGZ1bmN0aW9uIHNldEl0ZW1WYXIoaXRlbSkge1xuXHRcdC8vIFdoZW4gaXRlbVZhciBpcyBzcGVjaWZpZWQsIHNldCBtb2RpZmllZCBjdHggd2l0aCB1c2VyLW5hbWVkIH5pdGVtXG5cdFx0bmV3Q3R4ID0gJGV4dGVuZCh7fSwgY29udGV4dCk7XG5cdFx0bmV3Q3R4W2l0ZW1WYXJdID0gaXRlbTtcblx0fVxuXG5cdC8vIFJlbmRlciB0ZW1wbGF0ZSBhZ2FpbnN0IGRhdGEgYXMgYSB0cmVlIG9mIHN1YnZpZXdzIChuZXN0ZWQgcmVuZGVyZWQgdGVtcGxhdGUgaW5zdGFuY2VzKSwgb3IgYXMgYSBzdHJpbmcgKHRvcC1sZXZlbCB0ZW1wbGF0ZSkuXG5cdC8vIElmIHRoZSBkYXRhIGlzIHRoZSBwYXJlbnQgdmlldywgdHJlYXQgYXMgbm9JdGVyYXRpb24sIHJlLXJlbmRlciB3aXRoIHRoZSBzYW1lIGRhdGEgY29udGV4dC5cblx0dmFyIGksIGwsIG5ld1ZpZXcsIGNoaWxkVmlldywgaXRlbVJlc3VsdCwgc3dhcENvbnRlbnQsIGNvbnRlbnRUbXBsLCBvdXRlck9uUmVuZGVyLCB0bXBsTmFtZSwgaXRlbVZhciwgbmV3Q3R4LCB0YWdDdHgsXG5cdFx0cmVzdWx0ID0gXCJcIjtcblxuXHRpZiAodGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGNhbGwgZnJvbSByZW5kZXJUYWcgb3IgdGFnQ3R4LnJlbmRlciguLi4pXG5cdFx0dG1wbE5hbWUgPSB0YWcudGFnTmFtZTtcblx0XHR0YWdDdHggPSB0YWcudGFnQ3R4O1xuXHRcdGNvbnRleHQgPSBjb250ZXh0ID8gZXh0ZW5kQ3R4KGNvbnRleHQsIHRhZy5jdHgpIDogdGFnLmN0eDtcblxuXHRcdGlmICh0bXBsID09PSB2aWV3LmNvbnRlbnQpIHsgLy8ge3t4eHggdG1wbD0jY29udGVudH19XG5cdFx0XHRjb250ZW50VG1wbCA9IHRtcGwgIT09IHZpZXcuY3R4Ll93cnAgLy8gV2UgYXJlIHJlbmRlcmluZyB0aGUgI2NvbnRlbnRcblx0XHRcdFx0PyB2aWV3LmN0eC5fd3JwIC8vICNjb250ZW50IHdhcyB0aGUgdGFnQ3R4LnByb3BzLnRtcGwgd3JhcHBlciBvZiB0aGUgYmxvY2sgY29udGVudCAtIHNvIHdpdGhpbiB0aGlzIHZpZXcsICNjb250ZW50IHdpbGwgbm93IGJlIHRoZSB2aWV3LmN0eC5fd3JwIGJsb2NrIGNvbnRlbnRcblx0XHRcdFx0OiB1bmRlZmluZWQ7IC8vICNjb250ZW50IHdhcyB0aGUgdmlldy5jdHguX3dycCBibG9jayBjb250ZW50IC0gc28gd2l0aGluIHRoaXMgdmlldywgdGhlcmUgaXMgbm8gbG9uZ2VyIGFueSAjY29udGVudCB0byB3cmFwLlxuXHRcdH0gZWxzZSBpZiAodG1wbCAhPT0gdGFnQ3R4LmNvbnRlbnQpIHtcblx0XHRcdGlmICh0bXBsID09PSB0YWcudGVtcGxhdGUpIHsgLy8gUmVuZGVyaW5nIHt7dGFnfX0gdGFnLnRlbXBsYXRlLCByZXBsYWNpbmcgYmxvY2sgY29udGVudC5cblx0XHRcdFx0Y29udGVudFRtcGwgPSB0YWdDdHgudG1wbDsgLy8gU2V0ICNjb250ZW50IHRvIGJsb2NrIGNvbnRlbnQgKG9yIHdyYXBwZWQgYmxvY2sgY29udGVudCBpZiB0YWdDdHgucHJvcHMudG1wbCBpcyBzZXQpXG5cdFx0XHRcdGNvbnRleHQuX3dycCA9IHRhZ0N0eC5jb250ZW50OyAvLyBQYXNzIHdyYXBwZWQgYmxvY2sgY29udGVudCB0byBuZXN0ZWQgdmlld3Ncblx0XHRcdH0gZWxzZSB7IC8vIFJlbmRlcmluZyB0YWdDdHgucHJvcHMudG1wbCB3cmFwcGVyXG5cdFx0XHRcdGNvbnRlbnRUbXBsID0gdGFnQ3R4LmNvbnRlbnQgfHwgdmlldy5jb250ZW50OyAvLyBTZXQgI2NvbnRlbnQgdG8gd3JhcHBlZCBibG9jayBjb250ZW50XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRlbnRUbXBsID0gdmlldy5jb250ZW50OyAvLyBOZXN0ZWQgdmlld3MgaW5oZXJpdCBzYW1lIHdyYXBwZWQgI2NvbnRlbnQgcHJvcGVydHlcblx0XHR9XG5cblx0XHRpZiAodGFnQ3R4LnByb3BzLmxpbmsgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBsaW5rPWZhbHNlIHNldHRpbmcgb24gYmxvY2sgdGFnXG5cdFx0XHQvLyBXZSB3aWxsIG92ZXJyaWRlIGluaGVyaXRlZCB2YWx1ZSBvZiBsaW5rIGJ5IHRoZSBleHBsaWNpdCBzZXR0aW5nIGxpbms9ZmFsc2UgdGFrZW4gZnJvbSBwcm9wc1xuXHRcdFx0Ly8gVGhlIGNoaWxkIHZpZXdzIG9mIGFuIHVubGlua2VkIHZpZXcgYXJlIGFsc28gdW5saW5rZWQuIFNvIHNldHRpbmcgY2hpbGQgYmFjayB0byB0cnVlIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdC5cblx0XHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xuXHRcdFx0Y29udGV4dC5saW5rID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1WYXIgPSB0YWdDdHgucHJvcHMuaXRlbVZhcikge1xuXHRcdFx0aWYgKGl0ZW1WYXIuY2hhckF0KDApICE9PSBcIn5cIikge1xuXHRcdFx0XHRzeW50YXhFcnJvcihcIlVzZSBpdGVtVmFyPSd+bXlJdGVtJ1wiKTtcblx0XHRcdH1cblx0XHRcdGl0ZW1WYXIgPSBpdGVtVmFyLnNsaWNlKDEpO1xuXHRcdH1cblx0fVxuXG5cdGlmICh2aWV3KSB7XG5cdFx0b25SZW5kZXIgPSBvblJlbmRlciB8fCB2aWV3Ll8ub25SZW5kZXI7XG5cdFx0Y29udGV4dCA9IGV4dGVuZEN0eChjb250ZXh0LCB2aWV3LmN0eCk7XG5cdH1cblxuXHRpZiAoa2V5ID09PSB0cnVlKSB7XG5cdFx0c3dhcENvbnRlbnQgPSB0cnVlO1xuXHRcdGtleSA9IDA7XG5cdH1cblxuXHQvLyBJZiBsaW5rPT09ZmFsc2UsIGRvIG5vdCBjYWxsIG9uUmVuZGVyLCBzbyBubyBkYXRhLWxpbmtpbmcgbWFya2VyIG5vZGVzXG5cdGlmIChvblJlbmRlciAmJiAoY29udGV4dCAmJiBjb250ZXh0LmxpbmsgPT09IGZhbHNlIHx8IHRhZyAmJiB0YWcuXy5ub1Z3cykpIHtcblx0XHRvblJlbmRlciA9IHVuZGVmaW5lZDtcblx0fVxuXHRvdXRlck9uUmVuZGVyID0gb25SZW5kZXI7XG5cdGlmIChvblJlbmRlciA9PT0gdHJ1ZSkge1xuXHRcdC8vIFVzZWQgYnkgdmlldy5yZWZyZXNoKCkuIERvbid0IGNyZWF0ZSBhIG5ldyB3cmFwcGVyIHZpZXcuXG5cdFx0b3V0ZXJPblJlbmRlciA9IHVuZGVmaW5lZDtcblx0XHRvblJlbmRlciA9IHZpZXcuXy5vblJlbmRlcjtcblx0fVxuXHQvLyBTZXQgYWRkaXRpb25hbCBjb250ZXh0IG9uIHZpZXdzIGNyZWF0ZWQgaGVyZSwgKGFzIG1vZGlmaWVkIGNvbnRleHQgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCwgYW5kIHRvIGJlIGluaGVyaXRlZCBieSBjaGlsZCB2aWV3cylcblx0Y29udGV4dCA9IHRtcGwuaGVscGVyc1xuXHRcdD8gZXh0ZW5kQ3R4KHRtcGwuaGVscGVycywgY29udGV4dClcblx0XHQ6IGNvbnRleHQ7XG5cblx0bmV3Q3R4ID0gY29udGV4dDtcblx0aWYgKCRpc0FycmF5KGRhdGEpICYmICFub0l0ZXJhdGlvbikge1xuXHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHRoZSBhcnJheSwgd2hvc2UgY2hpbGQgdmlld3MgY29ycmVzcG9uZCB0byBlYWNoIGRhdGEgaXRlbS4gKE5vdGU6IGlmIGtleSBhbmQgdmlldyBhcmUgcGFzc2VkIGluXG5cdFx0Ly8gYWxvbmcgd2l0aCBwYXJlbnQgdmlldywgdHJlYXQgYXMgaW5zZXJ0IC1lLmcuIGZyb20gdmlldy5hZGRWaWV3cyAtIHNvIHZpZXcgaXMgYWxyZWFkeSB0aGUgdmlldyBpdGVtIGZvciBhcnJheSlcblx0XHRuZXdWaWV3ID0gc3dhcENvbnRlbnRcblx0XHRcdD8gdmlld1xuXHRcdFx0OiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdmlldylcblx0XHRcdFx0fHwgbmV3IFZpZXcoY29udGV4dCwgXCJhcnJheVwiLCB2aWV3LCBkYXRhLCB0bXBsLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCk7XG5cdFx0aWYgKHZpZXcgJiYgdmlldy5fLnVzZUtleSkge1xuXHRcdFx0Ly8gUGFyZW50IGlzIG5vdCBhbiAnYXJyYXkgdmlldydcblx0XHRcdG5ld1ZpZXcuXy5ibmQgPSAhdGFnIHx8IHRhZy5fLmJuZCAmJiB0YWc7IC8vIEZvciBhcnJheSB2aWV3cyB0aGF0IGFyZSBkYXRhIGJvdW5kIGZvciBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHMsIHNldCB0aGVcblx0XHRcdC8vIHZpZXcuXy5ibmQgcHJvcGVydHkgdG8gdHJ1ZSBmb3IgdG9wLWxldmVsIGxpbmsoKSBvciBkYXRhLWxpbms9XCJ7Zm9yfVwiLCBvciB0byB0aGUgdGFnIGluc3RhbmNlIGZvciBhIGRhdGEtYm91bmQgdGFnLCBlLmcuIHtee2ZvciAuLi59fVxuXHRcdH1cblx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0bmV3Vmlldy5pdCA9IGl0ZW1WYXI7XG5cdFx0fVxuXHRcdGl0ZW1WYXIgPSBuZXdWaWV3Lml0O1xuXHRcdGZvciAoaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgZWFjaCBkYXRhIGl0ZW0uXG5cdFx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0XHRzZXRJdGVtVmFyKGRhdGFbaV0pOyAvLyB1c2UgbW9kaWZpZWQgY3R4IHdpdGggdXNlci1uYW1lZCB+aXRlbVxuXHRcdFx0fVxuXHRcdFx0Y2hpbGRWaWV3ID0gbmV3IFZpZXcobmV3Q3R4LCBcIml0ZW1cIiwgbmV3VmlldywgZGF0YVtpXSwgdG1wbCwgKGtleSB8fCAwKSArIGksIG9uUmVuZGVyLCBuZXdWaWV3LmNvbnRlbnQpO1xuXG5cdFx0XHRpdGVtUmVzdWx0ID0gdG1wbC5mbihkYXRhW2ldLCBjaGlsZFZpZXcsICRzdWIpO1xuXHRcdFx0cmVzdWx0ICs9IG5ld1ZpZXcuXy5vblJlbmRlciA/IG5ld1ZpZXcuXy5vblJlbmRlcihpdGVtUmVzdWx0LCBjaGlsZFZpZXcpIDogaXRlbVJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3Igc2luZ2xldG9uIGRhdGEgb2JqZWN0LiBUaGUgdHlwZSBvZiB0aGUgdmlldyB3aWxsIGJlIHRoZSB0YWcgbmFtZSwgZS5nLiBcImlmXCIgb3IgXCJteVRhZ1wiIGV4Y2VwdCBmb3Jcblx0XHQvLyBcIml0ZW1cIiwgXCJhcnJheVwiIGFuZCBcImRhdGFcIiB2aWV3cy4gQSBcImRhdGFcIiB2aWV3IGlzIGZyb20gcHJvZ3JhbW1hdGljIHJlbmRlcihvYmplY3QpIGFnYWluc3QgYSAnc2luZ2xldG9uJy5cblx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0c2V0SXRlbVZhcihkYXRhKTtcblx0XHR9XG5cdFx0bmV3VmlldyA9IHN3YXBDb250ZW50ID8gdmlldyA6IG5ldyBWaWV3KG5ld0N0eCwgdG1wbE5hbWUgfHwgXCJkYXRhXCIsIHZpZXcsIGRhdGEsIHRtcGwsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKTtcblx0XHRpZiAodGFnICYmICF0YWcuZmxvdykge1xuXHRcdFx0bmV3Vmlldy50YWcgPSB0YWc7XG5cdFx0XHR0YWcudmlldyA9IG5ld1ZpZXc7XG5cdFx0fVxuXHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGEsIG5ld1ZpZXcsICRzdWIpO1xuXHR9XG5cdHJldHVybiBvdXRlck9uUmVuZGVyID8gb3V0ZXJPblJlbmRlcihyZXN1bHQsIG5ld1ZpZXcpIDogcmVzdWx0O1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbGQgYW5kIGNvbXBpbGUgdGVtcGxhdGVcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIEdlbmVyYXRlIGEgcmV1c2FibGUgZnVuY3Rpb24gdGhhdCB3aWxsIHNlcnZlIHRvIHJlbmRlciBhIHRlbXBsYXRlIGFnYWluc3QgZGF0YVxuLy8gKENvbXBpbGUgQVNUIHRoZW4gYnVpbGQgdGVtcGxhdGUgZnVuY3Rpb24pXG5cbmZ1bmN0aW9uIG9uUmVuZGVyRXJyb3IoZSwgdmlldywgZmFsbGJhY2spIHtcblx0dmFyIG1lc3NhZ2UgPSBmYWxsYmFjayAhPT0gdW5kZWZpbmVkXG5cdFx0PyAkaXNGdW5jdGlvbihmYWxsYmFjaylcblx0XHRcdD8gZmFsbGJhY2suY2FsbCh2aWV3LmRhdGEsIGUsIHZpZXcpXG5cdFx0XHQ6IGZhbGxiYWNrIHx8IFwiXCJcblx0XHQ6IFwie0Vycm9yOiBcIiArIGUubWVzc2FnZSArIFwifVwiO1xuXG5cdGlmICgkc3ViU2V0dGluZ3Mub25FcnJvciAmJiAoZmFsbGJhY2sgPSAkc3ViU2V0dGluZ3Mub25FcnJvci5jYWxsKHZpZXcuZGF0YSwgZSwgZmFsbGJhY2sgJiYgbWVzc2FnZSwgdmlldykpICE9PSB1bmRlZmluZWQpIHtcblx0XHRtZXNzYWdlID0gZmFsbGJhY2s7IC8vIFRoZXJlIGlzIGEgc2V0dGluZ3MuZGVidWdNb2RlKGhhbmRsZXIpIG9uRXJyb3Igb3ZlcnJpZGUuIENhbGwgaXQsIGFuZCB1c2UgcmV0dXJuIHZhbHVlIChpZiBhbnkpIHRvIHJlcGxhY2UgbWVzc2FnZVxuXHR9XG5cblx0cmV0dXJuIHZpZXcgJiYgIXZpZXcubGlua0N0eCA/ICRjb252ZXJ0ZXJzLmh0bWwobWVzc2FnZSkgOiBtZXNzYWdlO1xufVxuXG5mdW5jdGlvbiBlcnJvcihtZXNzYWdlKSB7XG5cdHRocm93IG5ldyAkc3ViLkVycihtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gc3ludGF4RXJyb3IobWVzc2FnZSkge1xuXHRlcnJvcihcIlN5bnRheCBlcnJvclxcblwiICsgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHRtcGxGbihtYXJrdXAsIHRtcGwsIGlzTGlua0V4cHIsIGNvbnZlcnRCYWNrLCBoYXNFbHNlKSB7XG5cdC8vIENvbXBpbGUgbWFya3VwIHRvIEFTVCAoYWJ0cmFjdCBzeW50YXggdHJlZSkgdGhlbiBidWlsZCB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBBU1Qgbm9kZXNcblx0Ly8gVXNlZCBmb3IgY29tcGlsaW5nIHRlbXBsYXRlcywgYW5kIGFsc28gYnkgSnNWaWV3cyB0byBidWlsZCBmdW5jdGlvbnMgZm9yIGRhdGEgbGluayBleHByZXNzaW9uc1xuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gcHVzaHByZWNlZGluZ0NvbnRlbnQoc2hpZnQpIHtcblx0XHRzaGlmdCAtPSBsb2M7XG5cdFx0aWYgKHNoaWZ0KSB7XG5cdFx0XHRjb250ZW50LnB1c2gobWFya3VwLnN1YnN0cihsb2MsIHNoaWZ0KS5yZXBsYWNlKHJOZXdMaW5lLCBcIlxcXFxuXCIpKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBibG9ja1RhZ0NoZWNrKHRhZ05hbWUsIGJsb2NrKSB7XG5cdFx0aWYgKHRhZ05hbWUpIHtcblx0XHRcdHRhZ05hbWUgKz0gJ319Jztcblx0XHRcdC8vXHRcdFx0J3t7aW5jbHVkZX19IGJsb2NrIGhhcyB7ey9mb3J9fSB3aXRoIG5vIG9wZW4ge3tmb3J9fSdcblx0XHRcdHN5bnRheEVycm9yKChcblx0XHRcdFx0YmxvY2tcblx0XHRcdFx0XHQ/ICd7eycgKyBibG9jayArICd9fSBibG9jayBoYXMge3svJyArIHRhZ05hbWUgKyAnIHdpdGhvdXQge3snICsgdGFnTmFtZVxuXHRcdFx0XHRcdDogJ1VubWF0Y2hlZCBvciBtaXNzaW5nIHt7LycgKyB0YWdOYW1lKSArICcsIGluIHRlbXBsYXRlOlxcbicgKyBtYXJrdXApO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlVGFnKGFsbCwgYmluZCwgdGFnTmFtZSwgY29udmVydGVyLCBjb2xvbiwgaHRtbCwgY29kZVRhZywgcGFyYW1zLCBzbGFzaCwgYmluZDIsIGNsb3NlQmxvY2ssIGluZGV4KSB7XG4vKlxuXG4gICAgIGJpbmQgICAgIHRhZ05hbWUgICAgICAgICBjdnQgICBjbG4gaHRtbCBjb2RlICAgIHBhcmFtcyAgICAgICAgICAgIHNsYXNoICAgYmluZDIgICAgICAgICBjbG9zZUJsayAgY29tbWVudFxuLyg/OnsoXFxeKT97KD86KFxcdysoPz1bXFwvXFxzfV0pKXwoXFx3Kyk/KDopfCg+KXwoXFwqKSlcXHMqKCg/OltefV18fSg/IX0pKSo/KShcXC8pP3x7KFxcXik/eyg/Oig/OlxcLyhcXHcrKSlcXHMqfCEtLVtcXHNcXFNdKj8tLSkpfX0vZ1xuXG4oPzpcbiAgeyhcXF4pP3sgICAgICAgICAgICBiaW5kXG4gICg/OlxuICAgIChcXHcrICAgICAgICAgICAgIHRhZ05hbWVcbiAgICAgICg/PVtcXC9cXHN9XSlcbiAgICApXG4gICAgfFxuICAgIChcXHcrKT8oOikgICAgICAgIGNvbnZlcnRlciBjb2xvblxuICAgIHxcbiAgICAoPikgICAgICAgICAgICAgIGh0bWxcbiAgICB8XG4gICAgKFxcKikgICAgICAgICAgICAgY29kZVRhZ1xuICApXG4gIFxccypcbiAgKCAgICAgICAgICAgICAgICAgIHBhcmFtc1xuICAgICg/OltefV18fSg/IX0pKSo/XG4gIClcbiAgKFxcLyk/ICAgICAgICAgICAgICBzbGFzaFxuICB8XG4gIHsoXFxeKT97ICAgICAgICAgICAgYmluZDJcbiAgKD86XG4gICAgKD86XFwvKFxcdyspKVxccyogICBjbG9zZUJsb2NrXG4gICAgfFxuICAgICEtLVtcXHNcXFNdKj8tLSAgICBjb21tZW50XG4gIClcbilcbn19L2dcblxuKi9cblx0XHRpZiAoY29kZVRhZyAmJiBiaW5kIHx8IHNsYXNoICYmICF0YWdOYW1lIHx8IHBhcmFtcyAmJiBwYXJhbXMuc2xpY2UoLTEpID09PSBcIjpcIiB8fCBiaW5kMikge1xuXHRcdFx0c3ludGF4RXJyb3IoYWxsKTtcblx0XHR9XG5cblx0XHQvLyBCdWlsZCBhYnN0cmFjdCBzeW50YXggdHJlZSAoQVNUKTogW3RhZ05hbWUsIGNvbnZlcnRlciwgcGFyYW1zLCBjb250ZW50LCBoYXNoLCBiaW5kaW5ncywgY29udGVudE1hcmt1cF1cblx0XHRpZiAoaHRtbCkge1xuXHRcdFx0Y29sb24gPSBcIjpcIjtcblx0XHRcdGNvbnZlcnRlciA9IEhUTUw7XG5cdFx0fVxuXHRcdHNsYXNoID0gc2xhc2ggfHwgaXNMaW5rRXhwciAmJiAhaGFzRWxzZTtcblxuXHRcdHZhciBwYXRoQmluZGluZ3MgPSAoYmluZCB8fCBpc0xpbmtFeHByKSAmJiBbW11dLFxuXHRcdFx0cHJvcHMgPSBcIlwiLFxuXHRcdFx0YXJncyA9IFwiXCIsXG5cdFx0XHRjdHhQcm9wcyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNBcmdzID0gXCJcIixcblx0XHRcdHBhcmFtc1Byb3BzID0gXCJcIixcblx0XHRcdHBhcmFtc0N0eFByb3BzID0gXCJcIixcblx0XHRcdG9uRXJyb3IgPSBcIlwiLFxuXHRcdFx0dXNlVHJpZ2dlciA9IFwiXCIsXG5cdFx0XHQvLyBCbG9jayB0YWcgaWYgbm90IHNlbGYtY2xvc2luZyBhbmQgbm90IHt7On19IG9yIHt7Pn19IChzcGVjaWFsIGNhc2UpIGFuZCBub3QgYSBkYXRhLWxpbmsgZXhwcmVzc2lvblxuXHRcdFx0YmxvY2sgPSAhc2xhc2ggJiYgIWNvbG9uO1xuXG5cdFx0Ly89PT09IG5lc3RlZCBoZWxwZXIgZnVuY3Rpb24gPT09PVxuXHRcdHRhZ05hbWUgPSB0YWdOYW1lIHx8IChwYXJhbXMgPSBwYXJhbXMgfHwgXCIjZGF0YVwiLCBjb2xvbik7IC8vIHt7On19IGlzIGVxdWl2YWxlbnQgdG8ge3s6I2RhdGF9fVxuXHRcdHB1c2hwcmVjZWRpbmdDb250ZW50KGluZGV4KTtcblx0XHRsb2MgPSBpbmRleCArIGFsbC5sZW5ndGg7IC8vIGxvY2F0aW9uIG1hcmtlciAtIHBhcnNlZCB1cCB0byBoZXJlXG5cdFx0aWYgKGNvZGVUYWcpIHtcblx0XHRcdGlmIChhbGxvd0NvZGUpIHtcblx0XHRcdFx0Y29udGVudC5wdXNoKFtcIipcIiwgXCJcXG5cIiArIHBhcmFtcy5yZXBsYWNlKC9eOi8sIFwicmV0Kz0gXCIpLnJlcGxhY2UoclVuZXNjYXBlUXVvdGVzLCBcIiQxXCIpICsgXCI7XFxuXCJdKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRhZ05hbWUpIHtcblx0XHRcdGlmICh0YWdOYW1lID09PSBcImVsc2VcIikge1xuXHRcdFx0XHRpZiAoclRlc3RFbHNlSWYudGVzdChwYXJhbXMpKSB7XG5cdFx0XHRcdFx0c3ludGF4RXJyb3IoJ2ZvciBcInt7ZWxzZSBpZiBleHByfX1cIiB1c2UgXCJ7e2Vsc2UgZXhwcn19XCInKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYXRoQmluZGluZ3MgPSBjdXJyZW50WzddICYmIFtbXV07XG5cdFx0XHRcdGN1cnJlbnRbOF0gPSBtYXJrdXAuc3Vic3RyaW5nKGN1cnJlbnRbOF0sIGluZGV4KTsgLy8gY29udGVudE1hcmt1cCBmb3IgYmxvY2sgdGFnXG5cdFx0XHRcdGN1cnJlbnQgPSBzdGFjay5wb3AoKTtcblx0XHRcdFx0Y29udGVudCA9IGN1cnJlbnRbMl07XG5cdFx0XHRcdGJsb2NrID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIG5ld2xpbmVzIGZyb20gdGhlIHBhcmFtcyBzdHJpbmcsIHRvIGF2b2lkIGNvbXBpbGVkIGNvZGUgZXJyb3JzIGZvciB1bnRlcm1pbmF0ZWQgc3RyaW5nc1xuXHRcdFx0XHRwYXJzZVBhcmFtcyhwYXJhbXMucmVwbGFjZShyTmV3TGluZSwgXCIgXCIpLCBwYXRoQmluZGluZ3MsIHRtcGwpXG5cdFx0XHRcdFx0LnJlcGxhY2UockJ1aWxkSGFzaCwgZnVuY3Rpb24oYWxsLCBvbmVycm9yLCBpc0N0eCwga2V5LCBrZXlUb2tlbiwga2V5VmFsdWUsIGFyZywgcGFyYW0pIHtcblx0XHRcdFx0XHRcdGtleSA9IFwiJ1wiICsga2V5VG9rZW4gKyBcIic6XCI7XG5cdFx0XHRcdFx0XHRpZiAoYXJnKSB7XG5cdFx0XHRcdFx0XHRcdGFyZ3MgKz0ga2V5VmFsdWUgKyBcIixcIjtcblx0XHRcdFx0XHRcdFx0cGFyYW1zQXJncyArPSBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpc0N0eCkge1xuXHRcdFx0XHRcdFx0XHRjdHhQcm9wcyArPSBrZXkgKyAnai5fY3AoJyArIGtleVZhbHVlICsgJyxcIicgKyBwYXJhbSArICdcIix2aWV3KSwnO1xuXHRcdFx0XHRcdFx0XHQvLyBDb21waWxlZCBjb2RlIGZvciBldmFsdWF0aW5nIHRhZ0N0eCBvbiBhIHRhZyB3aWxsIGhhdmU6IGN0eDp7J2Zvbyc6ai5fY3AoY29tcGlsZWRFeHByLCBcImV4cHJcIiwgdmlldyl9XG5cdFx0XHRcdFx0XHRcdHBhcmFtc0N0eFByb3BzICs9IGtleSArIFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9uZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0b25FcnJvciArPSBrZXlWYWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmIChrZXlUb2tlbiA9PT0gXCJ0cmlnZ2VyXCIpIHtcblx0XHRcdFx0XHRcdFx0XHR1c2VUcmlnZ2VyICs9IGtleVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHByb3BzICs9IGtleSArIGtleVZhbHVlICsgXCIsXCI7XG5cdFx0XHRcdFx0XHRcdHBhcmFtc1Byb3BzICs9IGtleSArIFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHRcdGhhc0hhbmRsZXJzID0gaGFzSGFuZGxlcnMgfHwgckhhc0hhbmRsZXJzLnRlc3Qoa2V5VG9rZW4pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0XHRcdFx0fSkuc2xpY2UoMCwgLTEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGF0aEJpbmRpbmdzICYmIHBhdGhCaW5kaW5nc1swXSkge1xuXHRcdFx0XHRwYXRoQmluZGluZ3MucG9wKCk7IC8vIFJlbW92ZSB0aGUgYmluZGluZ3MgdGhhdCB3YXMgcHJlcGFyZWQgZm9yIG5leHQgYXJnLiAoVGhlcmUgaXMgYWx3YXlzIGFuIGV4dHJhIG9uZSByZWFkeSkuXG5cdFx0XHR9XG5cblx0XHRcdG5ld05vZGUgPSBbXG5cdFx0XHRcdFx0dGFnTmFtZSxcblx0XHRcdFx0XHRjb252ZXJ0ZXIgfHwgISFjb252ZXJ0QmFjayB8fCBoYXNIYW5kbGVycyB8fCBcIlwiLFxuXHRcdFx0XHRcdGJsb2NrICYmIFtdLFxuXHRcdFx0XHRcdHBhcnNlZFBhcmFtKHBhcmFtc0FyZ3MgfHwgKHRhZ05hbWUgPT09IFwiOlwiID8gXCInI2RhdGEnLFwiIDogXCJcIiksIHBhcmFtc1Byb3BzLCBwYXJhbXNDdHhQcm9wcyksIC8vIHt7On19IGVxdWl2YWxlbnQgdG8ge3s6I2RhdGF9fVxuXHRcdFx0XHRcdHBhcnNlZFBhcmFtKGFyZ3MgfHwgKHRhZ05hbWUgPT09IFwiOlwiID8gXCJkYXRhLFwiIDogXCJcIiksIHByb3BzLCBjdHhQcm9wcyksXG5cdFx0XHRcdFx0b25FcnJvcixcblx0XHRcdFx0XHR1c2VUcmlnZ2VyLFxuXHRcdFx0XHRcdHBhdGhCaW5kaW5ncyB8fCAwXG5cdFx0XHRcdF07XG5cdFx0XHRjb250ZW50LnB1c2gobmV3Tm9kZSk7XG5cdFx0XHRpZiAoYmxvY2spIHtcblx0XHRcdFx0c3RhY2sucHVzaChjdXJyZW50KTtcblx0XHRcdFx0Y3VycmVudCA9IG5ld05vZGU7XG5cdFx0XHRcdGN1cnJlbnRbOF0gPSBsb2M7IC8vIFN0b3JlIGN1cnJlbnQgbG9jYXRpb24gb2Ygb3BlbiB0YWcsIHRvIGJlIGFibGUgdG8gYWRkIGNvbnRlbnRNYXJrdXAgd2hlbiB3ZSByZWFjaCBjbG9zaW5nIHRhZ1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2xvc2VCbG9jaykge1xuXHRcdFx0YmxvY2tUYWdDaGVjayhjbG9zZUJsb2NrICE9PSBjdXJyZW50WzBdICYmIGN1cnJlbnRbMF0gIT09IFwiZWxzZVwiICYmIGNsb3NlQmxvY2ssIGN1cnJlbnRbMF0pO1xuXHRcdFx0Y3VycmVudFs4XSA9IG1hcmt1cC5zdWJzdHJpbmcoY3VycmVudFs4XSwgaW5kZXgpOyAvLyBjb250ZW50TWFya3VwIGZvciBibG9jayB0YWdcblx0XHRcdGN1cnJlbnQgPSBzdGFjay5wb3AoKTtcblx0XHR9XG5cdFx0YmxvY2tUYWdDaGVjayghY3VycmVudCAmJiBjbG9zZUJsb2NrKTtcblx0XHRjb250ZW50ID0gY3VycmVudFsyXTtcblx0fVxuXHQvLz09PT0gL2VuZCBvZiBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblxuXHR2YXIgaSwgcmVzdWx0LCBuZXdOb2RlLCBoYXNIYW5kbGVycywgYmluZGluZ3MsXG5cdFx0YWxsb3dDb2RlID0gJHN1YlNldHRpbmdzLmFsbG93Q29kZSB8fCB0bXBsICYmIHRtcGwuYWxsb3dDb2RlXG5cdFx0XHR8fCAkdmlld3NTZXR0aW5ncy5hbGxvd0NvZGUgPT09IHRydWUsIC8vIGluY2x1ZGUgZGlyZWN0IHNldHRpbmcgb2Ygc2V0dGluZ3MuYWxsb3dDb2RlIHRydWUgZm9yIGJhY2t3YXJkIGNvbXBhdCBvbmx5XG5cdFx0YXN0VG9wID0gW10sXG5cdFx0bG9jID0gMCxcblx0XHRzdGFjayA9IFtdLFxuXHRcdGNvbnRlbnQgPSBhc3RUb3AsXG5cdFx0Y3VycmVudCA9IFssLGFzdFRvcF07XG5cblx0aWYgKGFsbG93Q29kZSAmJiB0bXBsLl9pcykge1xuXHRcdHRtcGwuYWxsb3dDb2RlID0gYWxsb3dDb2RlO1xuXHR9XG5cbi8vVE9ET1x0cmVzdWx0ID0gdG1wbEZuc0NhY2hlW21hcmt1cF07IC8vIE9ubHkgY2FjaGUgaWYgdGVtcGxhdGUgaXMgbm90IG5hbWVkIGFuZCBtYXJrdXAgbGVuZ3RoIDwgLi4uLFxuLy9hbmQgdGhlcmUgYXJlIG5vIGJpbmRpbmdzIG9yIHN1YnRlbXBsYXRlcz8/IENvbnNpZGVyIHN0YW5kYXJkIG9wdGltaXphdGlvbiBmb3IgZGF0YS1saW5rPVwiYS5iLmNcIlxuLy9cdFx0aWYgKHJlc3VsdCkge1xuLy9cdFx0XHR0bXBsLmZuID0gcmVzdWx0O1xuLy9cdFx0fSBlbHNlIHtcblxuLy9cdFx0cmVzdWx0ID0gbWFya3VwO1xuXHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdGlmIChjb252ZXJ0QmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtYXJrdXAgPSBtYXJrdXAuc2xpY2UoMCwgLWNvbnZlcnRCYWNrLmxlbmd0aCAtIDIpICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdH1cblx0XHRtYXJrdXAgPSBkZWxpbU9wZW5DaGFyMCArIG1hcmt1cCArIGRlbGltQ2xvc2VDaGFyMTtcblx0fVxuXG5cdGJsb2NrVGFnQ2hlY2soc3RhY2tbMF0gJiYgc3RhY2tbMF1bMl0ucG9wKClbMF0pO1xuXHQvLyBCdWlsZCB0aGUgQVNUIChhYnN0cmFjdCBzeW50YXggdHJlZSkgdW5kZXIgYXN0VG9wXG5cdG1hcmt1cC5yZXBsYWNlKHJUYWcsIHBhcnNlVGFnKTtcblxuXHRwdXNocHJlY2VkaW5nQ29udGVudChtYXJrdXAubGVuZ3RoKTtcblxuXHRpZiAobG9jID0gYXN0VG9wW2FzdFRvcC5sZW5ndGggLSAxXSkge1xuXHRcdGJsb2NrVGFnQ2hlY2soXCJcIiArIGxvYyAhPT0gbG9jICYmICgrbG9jWzhdID09PSBsb2NbOF0pICYmIGxvY1swXSk7XG5cdH1cbi8vXHRcdFx0cmVzdWx0ID0gdG1wbEZuc0NhY2hlW21hcmt1cF0gPSBidWlsZENvZGUoYXN0VG9wLCB0bXBsKTtcbi8vXHRcdH1cblxuXHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdHJlc3VsdCA9IGJ1aWxkQ29kZShhc3RUb3AsIG1hcmt1cCwgaXNMaW5rRXhwcik7XG5cdFx0YmluZGluZ3MgPSBbXTtcblx0XHRpID0gYXN0VG9wLmxlbmd0aDtcblx0XHR3aGlsZSAoaS0tKSB7XG5cdFx0XHRiaW5kaW5ncy51bnNoaWZ0KGFzdFRvcFtpXVs3XSk7ICAvLyBXaXRoIGRhdGEtbGluayBleHByZXNzaW9ucywgcGF0aEJpbmRpbmdzIGFycmF5IGZvciB0YWdDdHhbaV0gaXMgYXN0VG9wW2ldWzddXG5cdFx0fVxuXHRcdHNldFBhdGhzKHJlc3VsdCwgYmluZGluZ3MpO1xuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9IGJ1aWxkQ29kZShhc3RUb3AsIHRtcGwpO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNldFBhdGhzKGZuLCBwYXRoc0Fycikge1xuXHR2YXIga2V5LCBwYXRocyxcblx0XHRpID0gMCxcblx0XHRsID0gcGF0aHNBcnIubGVuZ3RoO1xuXHRmbi5kZXBzID0gW107XG5cdGZuLnBhdGhzID0gW107IC8vIFRoZSBhcnJheSBvZiBwYXRoIGJpbmRpbmcgKGFycmF5L2RpY3Rpb25hcnkpcyBmb3IgZWFjaCB0YWcvZWxzZSBibG9jaydzIGFyZ3MgYW5kIHByb3BzXG5cdGZvciAoOyBpIDwgbDsgaSsrKSB7XG5cdFx0Zm4ucGF0aHMucHVzaChwYXRocyA9IHBhdGhzQXJyW2ldKTtcblx0XHRmb3IgKGtleSBpbiBwYXRocykge1xuXHRcdFx0aWYgKGtleSAhPT0gXCJfanN2dG9cIiAmJiBwYXRocy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHBhdGhzW2tleV0ubGVuZ3RoICYmICFwYXRoc1trZXldLnNrcCkge1xuXHRcdFx0XHRmbi5kZXBzID0gZm4uZGVwcy5jb25jYXQocGF0aHNba2V5XSk7IC8vIGRlcHMgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHBhdGhzIGFycmF5cyBmb3IgdGhlIGRpZmZlcmVudCBiaW5kaW5nc1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwYXJzZWRQYXJhbShhcmdzLCBwcm9wcywgY3R4KSB7XG5cdHJldHVybiBbYXJncy5zbGljZSgwLCAtMSksIHByb3BzLnNsaWNlKDAsIC0xKSwgY3R4LnNsaWNlKDAsIC0xKV07XG59XG5cbmZ1bmN0aW9uIHBhcmFtU3RydWN0dXJlKHBhcnRzLCB0eXBlKSB7XG5cdHJldHVybiAnXFxuXFx0J1xuXHRcdCsgKHR5cGVcblx0XHRcdD8gdHlwZSArICc6eydcblx0XHRcdDogJycpXG5cdFx0KyAnYXJnczpbJyArIHBhcnRzWzBdICsgJ10nXG5cdFx0KyAocGFydHNbMV0gfHwgIXR5cGVcblx0XHRcdD8gJyxcXG5cXHRwcm9wczp7JyArIHBhcnRzWzFdICsgJ30nXG5cdFx0XHQ6IFwiXCIpXG5cdFx0KyAocGFydHNbMl0gPyAnLFxcblxcdGN0eDp7JyArIHBhcnRzWzJdICsgJ30nIDogXCJcIik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zKHBhcmFtcywgcGF0aEJpbmRpbmdzLCB0bXBsKSB7XG5cblx0ZnVuY3Rpb24gcGFyc2VUb2tlbnMoYWxsLCBsZnRQcm4wLCBsZnRQcm4sIGJvdW5kLCBwYXRoLCBvcGVyYXRvciwgZXJyLCBlcSwgcGF0aDIsIHBybiwgY29tbWEsIGxmdFBybjIsIGFwb3MsIHF1b3QsIHJ0UHJuLCBydFBybkRvdCwgcHJuMiwgc3BhY2UsIGluZGV4LCBmdWxsKSB7XG5cdC8vIC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICBsZnRQcm4wICAgICAgICBsZnRQcm4gICAgICAgIGJvdW5kICAgICAgICAgICAgcGF0aCAgICBvcGVyYXRvciBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcSAgICAgICAgICAgICBwYXRoMiAgICAgICBwcm4gICAgY29tbWEgICBsZnRQcm4yICAgYXBvcyBxdW90ICAgICAgcnRQcm4gcnRQcm5Eb3QgICAgICAgICAgICAgICAgICAgICAgICBwcm4yICBzcGFjZVxuXHRcdC8vIChsZWZ0IHBhcmVuPyBmb2xsb3dlZCBieSAocGF0aD8gZm9sbG93ZWQgYnkgb3BlcmF0b3IpIG9yIChwYXRoIGZvbGxvd2VkIGJ5IHBhcmVuPykpIG9yIGNvbW1hIG9yIGFwb3Mgb3IgcXVvdCBvciByaWdodCBwYXJlbiBvciBzcGFjZVxuXHRcdGZ1bmN0aW9uIHBhcnNlUGF0aChhbGxQYXRoLCBub3QsIG9iamVjdCwgaGVscGVyLCB2aWV3LCB2aWV3UHJvcGVydHksIHBhdGhUb2tlbnMsIGxlYWZUb2tlbikge1xuXHRcdFx0Ly9yUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHRcdFx0Ly8gICAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cdFx0XHR2YXIgc3ViUGF0aCA9IG9iamVjdCA9PT0gXCIuXCI7XG5cdFx0XHRpZiAob2JqZWN0KSB7XG5cdFx0XHRcdHBhdGggPSBwYXRoLnNsaWNlKG5vdC5sZW5ndGgpO1xuXHRcdFx0XHRpZiAoL15cXC4/Y29uc3RydWN0b3IkLy50ZXN0KGxlYWZUb2tlbnx8cGF0aCkpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihhbGxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXN1YlBhdGgpIHtcblx0XHRcdFx0XHRhbGxQYXRoID0gKGhlbHBlclxuXHRcdFx0XHRcdFx0XHQ/ICd2aWV3LmhscChcIicgKyBoZWxwZXIgKyAnXCIpJ1xuXHRcdFx0XHRcdFx0XHQ6IHZpZXdcblx0XHRcdFx0XHRcdFx0XHQ/IFwidmlld1wiXG5cdFx0XHRcdFx0XHRcdFx0OiBcImRhdGFcIilcblx0XHRcdFx0XHRcdCsgKGxlYWZUb2tlblxuXHRcdFx0XHRcdFx0XHQ/ICh2aWV3UHJvcGVydHlcblx0XHRcdFx0XHRcdFx0XHQ/IFwiLlwiICsgdmlld1Byb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0OiBoZWxwZXJcblx0XHRcdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0OiAodmlldyA/IFwiXCIgOiBcIi5cIiArIG9iamVjdClcblx0XHRcdFx0XHRcdFx0XHQpICsgKHBhdGhUb2tlbnMgfHwgXCJcIilcblx0XHRcdFx0XHRcdFx0OiAobGVhZlRva2VuID0gaGVscGVyID8gXCJcIiA6IHZpZXcgPyB2aWV3UHJvcGVydHkgfHwgXCJcIiA6IG9iamVjdCwgXCJcIikpO1xuXG5cdFx0XHRcdFx0YWxsUGF0aCA9IGFsbFBhdGggKyAobGVhZlRva2VuID8gXCIuXCIgKyBsZWFmVG9rZW4gOiBcIlwiKTtcblxuXHRcdFx0XHRcdGFsbFBhdGggPSBub3QgKyAoYWxsUGF0aC5zbGljZSgwLCA5KSA9PT0gXCJ2aWV3LmRhdGFcIlxuXHRcdFx0XHRcdFx0PyBhbGxQYXRoLnNsaWNlKDUpIC8vIGNvbnZlcnQgI3ZpZXcuZGF0YS4uLiB0byBkYXRhLi4uXG5cdFx0XHRcdFx0XHQ6IGFsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChiaW5kaW5ncykge1xuXHRcdFx0XHRcdGJpbmRzID0gbmFtZWQgPT09IFwibGlua1RvXCIgPyAoYmluZHRvID0gcGF0aEJpbmRpbmdzLl9qc3Z0byA9IHBhdGhCaW5kaW5ncy5fanN2dG8gfHwgW10pIDogYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdGlmICh0aGVPYiA9IHN1YlBhdGggJiYgYmluZHNbYmluZHMubGVuZ3RoLTFdKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhlT2IuX2pzdikge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAodGhlT2Iuc2IpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGVPYiA9IHRoZU9iLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0aGVPYi5ibmQpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoID0gXCJeXCIgKyBwYXRoLnNsaWNlKDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoZU9iLnNiID0gcGF0aDtcblx0XHRcdFx0XHRcdFx0dGhlT2IuYm5kID0gdGhlT2IuYm5kIHx8IHBhdGguY2hhckF0KDApID09PSBcIl5cIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YmluZHMucHVzaChwYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGF0aFN0YXJ0W3BhcmVuRGVwdGhdID0gaW5kZXggKyAoc3ViUGF0aCA/IDEgOiAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFsbFBhdGg7XG5cdFx0fVxuXG5cdFx0Ly9ib3VuZCA9IGJpbmRpbmdzICYmIGJvdW5kO1xuXHRcdGlmIChib3VuZCAmJiAhZXEpIHtcblx0XHRcdHBhdGggPSBib3VuZCArIHBhdGg7IC8vIGUuZy4gc29tZS5mbiguLi4pXnNvbWUucGF0aCAtIHNvIGhlcmUgcGF0aCBpcyBcIl5zb21lLnBhdGhcIlxuXHRcdH1cblx0XHRvcGVyYXRvciA9IG9wZXJhdG9yIHx8IFwiXCI7XG5cdFx0bGZ0UHJuID0gbGZ0UHJuIHx8IGxmdFBybjAgfHwgbGZ0UHJuMjtcblx0XHRwYXRoID0gcGF0aCB8fCBwYXRoMjtcblx0XHQvLyBDb3VsZCBkbyB0aGlzIC0gYnV0IG5vdCB3b3J0aCBwZXJmIGNvc3Q/PyA6LVxuXHRcdC8vIGlmICghcGF0aC5sYXN0SW5kZXhPZihcIiNkYXRhLlwiLCAwKSkgeyBwYXRoID0gcGF0aC5zbGljZSg2KTsgfSAvLyBJZiBwYXRoIHN0YXJ0cyB3aXRoIFwiI2RhdGEuXCIsIHJlbW92ZSB0aGF0LlxuXHRcdHBybiA9IHBybiB8fCBwcm4yIHx8IFwiXCI7XG5cblx0XHR2YXIgZXhwciwgZXhwckZuLCBiaW5kcywgdGhlT2IsIG5ld09iLFxuXHRcdFx0cnRTcSA9IFwiKVwiO1xuXG5cdFx0aWYgKHBybiA9PT0gXCJbXCIpIHtcblx0XHRcdHBybiAgPVwiW2ouX3NxKFwiO1xuXHRcdFx0cnRTcSA9IFwiKV1cIjtcblx0XHR9XG5cblx0XHRpZiAoZXJyICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0c3ludGF4RXJyb3IocGFyYW1zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGJpbmRpbmdzICYmIHJ0UHJuRG90ICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgYmluZGluZyB0byBhIHBhdGggaW4gd2hpY2ggYW4gb2JqZWN0IGlzIHJldHVybmVkIGJ5IGEgaGVscGVyL2RhdGEgZnVuY3Rpb24vZXhwcmVzc2lvbiwgZS5nLiBmb28oKV54Lnkgb3IgKGE/YjpjKV54Lnlcblx0XHRcdFx0Ly8gV2UgY3JlYXRlIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gZ2V0IHRoZSBvYmplY3QgaW5zdGFuY2UgKHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGRlcGVuZGVudCBkYXRhIG9mIHRoZSBzdWJleHByZXNzaW9uIGNoYW5nZXMsIHRvIHJldHVybiB0aGUgbmV3IG9iamVjdCwgYW5kIHRyaWdnZXIgcmUtYmluZGluZyBvZiB0aGUgc3Vic2VxdWVudCBwYXRoKVxuXHRcdFx0XHRpZiAoIW5hbWVkIHx8IGJvdW5kTmFtZSB8fCBiaW5kdG8pIHtcblx0XHRcdFx0XHRleHByID0gcGF0aFN0YXJ0W3BhcmVuRGVwdGggLSAxXTtcblx0XHRcdFx0XHRpZiAoZnVsbC5sZW5ndGggLSAxID4gaW5kZXggLSAoZXhwciB8fCAwKSkgeyAvLyBXZSBuZWVkIHRvIGNvbXBpbGUgYSBzdWJleHByZXNzaW9uXG5cdFx0XHRcdFx0XHRleHByID0gZnVsbC5zbGljZShleHByLCBpbmRleCArIGFsbC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0aWYgKGV4cHJGbiAhPT0gdHJ1ZSkgeyAvLyBJZiBub3QgcmVlbnRyYW50IGNhbGwgZHVyaW5nIGNvbXBpbGF0aW9uXG5cdFx0XHRcdFx0XHRcdGJpbmRzID0gYmluZHRvIHx8IGJuZFN0YWNrW3BhcmVuRGVwdGgtMV0uYmQ7XG5cdFx0XHRcdFx0XHRcdC8vIEluc2VydCBleHByT2Igb2JqZWN0LCB0byBiZSB1c2VkIGR1cmluZyBiaW5kaW5nIHRvIHJldHVybiB0aGUgY29tcHV0ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdHRoZU9iID0gYmluZHNbYmluZHMubGVuZ3RoLTFdO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhlT2IgJiYgdGhlT2IucHJtKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKHRoZU9iLnNiICYmIHRoZU9iLnNiLnBybSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhlT2IgPSB0aGVPYi5zYjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bmV3T2IgPSB0aGVPYi5zYiA9IHtwYXRoOiB0aGVPYi5zYiwgYm5kOiB0aGVPYi5ibmR9O1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGJpbmRzLnB1c2gobmV3T2IgPSB7cGF0aDogYmluZHMucG9wKCl9KTsgLy8gSW5zZXJ0IGV4cHJPYiBvYmplY3QsIHRvIGJlIHVzZWQgZHVyaW5nIGJpbmRpbmcgdG8gcmV0dXJuIHRoZSBjb21wdXRlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgLy8gKGUuZy4gXCJzb21lLm9iamVjdCgpXCIgaW4gXCJzb21lLm9iamVjdCgpLmEuYlwiIC0gdG8gYmUgdXNlZCBhcyBjb250ZXh0IGZvciBiaW5kaW5nIHRoZSBmb2xsb3dpbmcgdG9rZW5zIFwiYS5iXCIpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRydFBybkRvdCA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBleHByIC8vIFRoZSBwYXJhbWV0ZXIgb3IgZnVuY3Rpb24gc3ViZXhwcmVzc2lvblxuXHRcdFx0XHRcdFx0XHQrIFwiIG9uZXJyb3I9JydcIiAvLyBzZXQgb25lcnJvcj0nJyBpbiBvcmRlciB0byB3cmFwIGdlbmVyYXRlZCBjb2RlIHdpdGggYSB0cnkgY2F0Y2ggLSByZXR1cm5pbmcgJycgYXMgb2JqZWN0IGluc3RhbmNlIGlmIHRoZXJlIGlzIGFuIGVycm9yL21pc3NpbmcgcGFyZW50XG5cdFx0XHRcdFx0XHRcdCsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0XHRcdFx0ZXhwckZuID0gdG1wbExpbmtzW3J0UHJuRG90XTtcblx0XHRcdFx0XHRcdGlmICghZXhwckZuKSB7XG5cdFx0XHRcdFx0XHRcdHRtcGxMaW5rc1tydFBybkRvdF0gPSB0cnVlOyAvLyBGbGFnIHRoYXQgdGhpcyBleHByRm4gKGZvciBydFBybkRvdCkgaXMgYmVpbmcgY29tcGlsZWRcblx0XHRcdFx0XHRcdFx0dG1wbExpbmtzW3J0UHJuRG90XSA9IGV4cHJGbiA9IHRtcGxGbihydFBybkRvdCwgdG1wbCwgdHJ1ZSk7IC8vIENvbXBpbGUgdGhlIGV4cHJlc3Npb24gKG9yIHVzZSBjYWNoZWQgY29weSBhbHJlYWR5IGluIHRtcGwubGlua3MpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoZXhwckZuICE9PSB0cnVlICYmIG5ld09iKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIG5vdCByZWVudHJhbnQgY2FsbCBkdXJpbmcgY29tcGlsYXRpb25cblx0XHRcdFx0XHRcdFx0bmV3T2IuX2pzdiA9IGV4cHJGbjtcblx0XHRcdFx0XHRcdFx0bmV3T2IucHJtID0gYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdFx0XHRuZXdPYi5ibmQgPSBuZXdPYi5ibmQgfHwgbmV3T2IucGF0aCAmJiBuZXdPYi5wYXRoLmluZGV4T2YoXCJeXCIpID49IDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKGFwb3NlZFxuXHRcdFx0XHQvLyB3aXRoaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmdcblx0XHRcdFx0PyAoYXBvc2VkID0gIWFwb3MsIChhcG9zZWQgPyBhbGwgOiBsZnRQcm4yICsgJ1wiJykpXG5cdFx0XHRcdDogcXVvdGVkXG5cdFx0XHRcdC8vIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ1xuXHRcdFx0XHRcdD8gKHF1b3RlZCA9ICFxdW90LCAocXVvdGVkID8gYWxsIDogbGZ0UHJuMiArICdcIicpKVxuXHRcdFx0XHRcdDpcblx0XHRcdFx0KFxuXHRcdFx0XHRcdChsZnRQcm5cblx0XHRcdFx0XHRcdD8gKHBhdGhTdGFydFtwYXJlbkRlcHRoXSA9IGluZGV4KyssIGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0gPSB7YmQ6IFtdfSwgbGZ0UHJuKVxuXHRcdFx0XHRcdFx0OiBcIlwiKVxuXHRcdFx0XHRcdCsgKHNwYWNlXG5cdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoXG5cdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHQvLyBOZXcgYXJnIG9yIHByb3AgLSBzbyBpbnNlcnQgYmFja3NwYWNlIFxcYiAoXFx4MDgpIGFzIHNlcGFyYXRvciBmb3IgbmFtZWQgcGFyYW1zLCB1c2VkIHN1YnNlcXVlbnRseSBieSByQnVpbGRIYXNoLCBhbmQgcHJlcGFyZSBuZXcgYmluZGluZ3MgYXJyYXlcblx0XHRcdFx0XHRcdFx0OiAocGFyYW1JbmRleCA9IGZ1bGwuc2xpY2UocGFyYW1JbmRleCwgaW5kZXgpLCBuYW1lZFxuXHRcdFx0XHRcdFx0XHRcdD8gKG5hbWVkID0gYm91bmROYW1lID0gYmluZHRvID0gZmFsc2UsIFwiXFxiXCIpXG5cdFx0XHRcdFx0XHRcdFx0OiBcIlxcYixcIikgKyBwYXJhbUluZGV4ICsgKHBhcmFtSW5kZXggPSBpbmRleCArIGFsbC5sZW5ndGgsIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wdXNoKGJuZEN0eC5iZCA9IFtdKSwgXCJcXGJcIilcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogZXFcblx0XHRcdFx0Ly8gbmFtZWQgcGFyYW0uIFJlbW92ZSBiaW5kaW5ncyBmb3IgYXJnIGFuZCBjcmVhdGUgaW5zdGVhZCBiaW5kaW5ncyBhcnJheSBmb3IgcHJvcFxuXHRcdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoICYmIHN5bnRheEVycm9yKHBhcmFtcyksIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wb3AoKSwgbmFtZWQgPSBwYXRoLCBib3VuZE5hbWUgPSBib3VuZCwgcGFyYW1JbmRleCA9IGluZGV4ICsgYWxsLmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdGJpbmRpbmdzICYmICgoYmluZGluZ3MgPSBibmRDdHguYmQgPSBwYXRoQmluZGluZ3NbbmFtZWRdID0gW10pLCBiaW5kaW5ncy5za3AgPSAhYm91bmQpLCBwYXRoICsgJzonKVxuXHRcdFx0XHRcdFx0XHQ6IHBhdGhcblx0XHRcdFx0Ly8gcGF0aFxuXHRcdFx0XHRcdFx0XHRcdD8gKHBhdGguc3BsaXQoXCJeXCIpLmpvaW4oXCIuXCIpLnJlcGxhY2UoclBhdGgsIHBhcnNlUGF0aClcblx0XHRcdFx0XHRcdFx0XHRcdCsgKHByblxuXHRcdFx0XHQvLyBzb21lLmZuY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSA9IHtiZDogW119LCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBydFNxLCBwcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3IpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3Jcblx0XHRcdFx0Ly8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdD8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdDogcnRQcm5cblx0XHRcdFx0Ly8gZnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoKHJ0UHJuID0gZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHJ0UHJuLCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBmYWxzZSwgYm5kQ3R4ID0gYm5kU3RhY2tbLS1wYXJlbkRlcHRoXSwgcnRQcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAocHJuIC8vIHJ0UHJuIGFuZCBwcm4sIGUuZyApKCBpbiAoYSkoKSBvciBhKCkoKSwgb3IgKVsgaW4gYSgpW11cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0sIGZuQ2FsbFtwYXJlbkRlcHRoXSA9IHJ0U3EsIHBybilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGNvbW1hXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHN5bnRheEVycm9yKHBhcmFtcyksIFwiLFwiKSAvLyBXZSBkb24ndCBhbGxvdyB0b3AtbGV2ZWwgbGl0ZXJhbCBhcnJheXMgb3Igb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogbGZ0UHJuMFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IChhcG9zZWQgPSBhcG9zLCBxdW90ZWQgPSBxdW90LCAnXCInKVxuXHRcdFx0XHQpKVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgbmFtZWQsIGJpbmR0bywgYm91bmROYW1lLFxuXHRcdHF1b3RlZCwgLy8gYm9vbGVhbiBmb3Igc3RyaW5nIGNvbnRlbnQgaW4gZG91YmxlIHF1b3Rlc1xuXHRcdGFwb3NlZCwgLy8gb3IgaW4gc2luZ2xlIHF1b3Rlc1xuXHRcdGJpbmRpbmdzID0gcGF0aEJpbmRpbmdzICYmIHBhdGhCaW5kaW5nc1swXSwgLy8gYmluZGluZ3MgYXJyYXkgZm9yIHRoZSBmaXJzdCBhcmdcblx0XHRibmRDdHggPSB7YmQ6IGJpbmRpbmdzfSxcblx0XHRibmRTdGFjayA9IHswOiBibmRDdHh9LFxuXHRcdHBhcmFtSW5kZXggPSAwLCAvLyBsaXN0LFxuXHRcdHRtcGxMaW5rcyA9ICh0bXBsID8gdG1wbC5saW5rcyA6IGJpbmRpbmdzICYmIChiaW5kaW5ncy5saW5rcyA9IGJpbmRpbmdzLmxpbmtzIHx8IHt9KSkgfHwgdG9wVmlldy50bXBsLmxpbmtzLFxuXHRcdC8vIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIHRyYWNraW5nIHBhdGggcGFyc2luZyBpbmNsdWRpbmcgbmVzdGVkIHBhdGhzLCBzdWNoIGFzIFwiYS5iKGNeZCArIChlKSleZlwiLCBhbmQgY2hhaW5lZCBjb21wdXRlZCBwYXRocyBzdWNoIGFzXG5cdFx0Ly8gXCJhLmIoKS5jXmQoKS5lLmYoKS5nXCIgLSB3aGljaCBoYXMgZm91ciBjaGFpbmVkIHBhdGhzLCBcImEuYigpXCIsIFwiXmMuZCgpXCIsIFwiLmUuZigpXCIgYW5kIFwiLmdcIlxuXHRcdHBhcmVuRGVwdGggPSAwLFxuXHRcdGZuQ2FsbCA9IHt9LCAvLyBXZSBhcmUgaW4gYSBmdW5jdGlvbiBjYWxsXG5cdFx0cGF0aFN0YXJ0ID0ge30sIC8vIHRyYWNrcyB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGF0aCBzdWNoIGFzIGNeZCgpIGluIHRoZSBhYm92ZSBleGFtcGxlXG5cdFx0cmVzdWx0ID0gKHBhcmFtcyArICh0bXBsID8gXCIgXCIgOiBcIlwiKSkucmVwbGFjZShyUGFyYW1zLCBwYXJzZVRva2Vucyk7XG5cblx0cmV0dXJuICFwYXJlbkRlcHRoICYmIHJlc3VsdCB8fCBzeW50YXhFcnJvcihwYXJhbXMpOyAvLyBTeW50YXggZXJyb3IgaWYgdW5iYWxhbmNlZCBwYXJlbnMgaW4gcGFyYW1zIGV4cHJlc3Npb25cbn1cblxuZnVuY3Rpb24gYnVpbGRDb2RlKGFzdCwgdG1wbCwgaXNMaW5rRXhwcikge1xuXHQvLyBCdWlsZCB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBBU1Qgbm9kZXMsIGFuZCBzZXQgYXMgcHJvcGVydHkgb24gdGhlIHBhc3NlZC1pbiB0ZW1wbGF0ZSBvYmplY3Rcblx0Ly8gVXNlZCBmb3IgY29tcGlsaW5nIHRlbXBsYXRlcywgYW5kIGFsc28gYnkgSnNWaWV3cyB0byBidWlsZCBmdW5jdGlvbnMgZm9yIGRhdGEgbGluayBleHByZXNzaW9uc1xuXHR2YXIgaSwgbm9kZSwgdGFnTmFtZSwgY29udmVydGVyLCB0YWdDdHgsIGhhc1RhZywgaGFzRW5jb2RlciwgZ2V0c1ZhbCwgaGFzQ252dCwgdXNlQ252dCwgdG1wbEJpbmRpbmdzLCBwYXRoQmluZGluZ3MsIHBhcmFtcywgYm91bmRPbkVyclN0YXJ0LCBib3VuZE9uRXJyRW5kLFxuXHRcdHRhZ1JlbmRlciwgbmVzdGVkVG1wbHMsIHRtcGxOYW1lLCBuZXN0ZWRUbXBsLCB0YWdBbmRFbHNlcywgY29udGVudCwgbWFya3VwLCBuZXh0SXNFbHNlLCBvbGRDb2RlLCBpc0Vsc2UsIGlzR2V0VmFsLCB0YWdDdHhGbiwgb25FcnJvciwgdGFnU3RhcnQsIHRyaWdnZXIsXG5cdFx0dG1wbEJpbmRpbmdLZXkgPSAwLFxuXHRcdHVzZVZpZXdzID0gJHN1YlNldHRpbmdzQWR2YW5jZWQudXNlVmlld3MgfHwgdG1wbC51c2VWaWV3cyB8fCB0bXBsLnRhZ3MgfHwgdG1wbC50ZW1wbGF0ZXMgfHwgdG1wbC5oZWxwZXJzIHx8IHRtcGwuY29udmVydGVycyxcblx0XHRjb2RlID0gXCJcIixcblx0XHR0bXBsT3B0aW9ucyA9IHt9LFxuXHRcdGwgPSBhc3QubGVuZ3RoO1xuXG5cdGlmIChcIlwiICsgdG1wbCA9PT0gdG1wbCkge1xuXHRcdHRtcGxOYW1lID0gaXNMaW5rRXhwciA/ICdkYXRhLWxpbms9XCInICsgdG1wbC5yZXBsYWNlKHJOZXdMaW5lLCBcIiBcIikuc2xpY2UoMSwgLTEpICsgJ1wiJyA6IHRtcGw7XG5cdFx0dG1wbCA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0dG1wbE5hbWUgPSB0bXBsLnRtcGxOYW1lIHx8IFwidW5uYW1lZFwiO1xuXHRcdGlmICh0bXBsLmFsbG93Q29kZSkge1xuXHRcdFx0dG1wbE9wdGlvbnMuYWxsb3dDb2RlID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHRtcGwuZGVidWcpIHtcblx0XHRcdHRtcGxPcHRpb25zLmRlYnVnID0gdHJ1ZTtcblx0XHR9XG5cdFx0dG1wbEJpbmRpbmdzID0gdG1wbC5ibmRzO1xuXHRcdG5lc3RlZFRtcGxzID0gdG1wbC50bXBscztcblx0fVxuXHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0Ly8gQVNUIG5vZGVzOiBbMDogdGFnTmFtZSwgMTogY29udmVydGVyLCAyOiBjb250ZW50LCAzOiBwYXJhbXMsIDQ6IGNvZGUsIDU6IG9uRXJyb3IsIDY6IHRyaWdnZXIsIDc6cGF0aEJpbmRpbmdzLCA4OiBjb250ZW50TWFya3VwXVxuXHRcdG5vZGUgPSBhc3RbaV07XG5cblx0XHQvLyBBZGQgbmV3bGluZSBmb3IgZWFjaCBjYWxsb3V0IHRvIHQoKSBjKCkgZXRjLiBhbmQgZWFjaCBtYXJrdXAgc3RyaW5nXG5cdFx0aWYgKFwiXCIgKyBub2RlID09PSBub2RlKSB7XG5cdFx0XHQvLyBhIG1hcmt1cCBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWRcblx0XHRcdGNvZGUgKz0gJ1xcbitcIicgKyBub2RlICsgJ1wiJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYSBjb21waWxlZCB0YWcgZXhwcmVzc2lvbiB0byBiZSBpbnNlcnRlZFxuXHRcdFx0dGFnTmFtZSA9IG5vZGVbMF07XG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCIqXCIpIHtcblx0XHRcdFx0Ly8gQ29kZSB0YWc6IHt7KiB9fVxuXHRcdFx0XHRjb2RlICs9IFwiO1xcblwiICsgbm9kZVsxXSArIFwiXFxucmV0PXJldFwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29udmVydGVyID0gbm9kZVsxXTtcblx0XHRcdFx0Y29udGVudCA9ICFpc0xpbmtFeHByICYmIG5vZGVbMl07XG5cdFx0XHRcdHRhZ0N0eCA9IHBhcmFtU3RydWN0dXJlKG5vZGVbM10sICdwYXJhbXMnKSArICd9LCcgKyBwYXJhbVN0cnVjdHVyZShwYXJhbXMgPSBub2RlWzRdKTtcblx0XHRcdFx0b25FcnJvciA9IG5vZGVbNV07XG5cdFx0XHRcdHRyaWdnZXIgPSBub2RlWzZdO1xuXHRcdFx0XHRtYXJrdXAgPSBub2RlWzhdICYmIG5vZGVbOF0ucmVwbGFjZShyVW5lc2NhcGVRdW90ZXMsIFwiJDFcIik7XG5cdFx0XHRcdGlmIChpc0Vsc2UgPSB0YWdOYW1lID09PSBcImVsc2VcIikge1xuXHRcdFx0XHRcdGlmIChwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdHBhdGhCaW5kaW5ncy5wdXNoKG5vZGVbN10pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0bXBsQmluZGluZ0tleSA9IDA7XG5cdFx0XHRcdFx0aWYgKHRtcGxCaW5kaW5ncyAmJiAocGF0aEJpbmRpbmdzID0gbm9kZVs3XSkpIHsgLy8gQXJyYXkgb2YgcGF0aHMsIG9yIGZhbHNlIGlmIG5vdCBkYXRhLWJvdW5kXG5cdFx0XHRcdFx0XHRwYXRoQmluZGluZ3MgPSBbcGF0aEJpbmRpbmdzXTtcblx0XHRcdFx0XHRcdHRtcGxCaW5kaW5nS2V5ID0gdG1wbEJpbmRpbmdzLnB1c2goMSk7IC8vIEFkZCBwbGFjZWhvbGRlciBpbiB0bXBsQmluZGluZ3MgZm9yIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHVzZVZpZXdzID0gdXNlVmlld3MgfHwgcGFyYW1zWzFdIHx8IHBhcmFtc1syXSB8fCBwYXRoQmluZGluZ3MgfHwgL3ZpZXcuKD8haW5kZXgpLy50ZXN0KHBhcmFtc1swXSk7XG5cdFx0XHRcdC8vIHVzZVZpZXdzIGlzIGZvciBwZXJmIG9wdGltaXphdGlvbi4gRm9yIHJlbmRlcigpIHdlIG9ubHkgdXNlIHZpZXdzIGlmIG5lY2Vzc2FyeSAtIGZvciB0aGUgbW9yZSBhZHZhbmNlZCBzY2VuYXJpb3MuXG5cdFx0XHRcdC8vIFdlIHVzZSB2aWV3cyBpZiB0aGVyZSBhcmUgcHJvcHMsIGNvbnRleHR1YWwgcHJvcGVydGllcyBvciBhcmdzIHdpdGggIy4uLiAob3RoZXIgdGhhbiAjaW5kZXgpIC0gYnV0IHlvdSBjYW4gZm9yY2Vcblx0XHRcdFx0Ly8gdXNpbmcgdGhlIGZ1bGwgdmlldyBpbmZyYXN0cnVjdHVyZSwgKGFuZCBwYXkgYSBwZXJmIHByaWNlKSBieSBvcHRpbmcgaW46IFNldCB1c2VWaWV3czogdHJ1ZSBvbiB0aGUgdGVtcGxhdGUsIG1hbnVhbGx5Li4uXG5cdFx0XHRcdGlmIChpc0dldFZhbCA9IHRhZ05hbWUgPT09IFwiOlwiKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnZlcnRlcikge1xuXHRcdFx0XHRcdFx0dGFnTmFtZSA9IGNvbnZlcnRlciA9PT0gSFRNTCA/IFwiPlwiIDogY29udmVydGVyICsgdGFnTmFtZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRlbnQpIHsgLy8gVE9ETyBvcHRpbWl6ZSAtIGlmIGNvbnRlbnQubGVuZ3RoID09PSAwIG9yIGlmIHRoZXJlIGlzIGEgdG1wbD1cIi4uLlwiIHNwZWNpZmllZCAtIHNldCBjb250ZW50IHRvIG51bGwgLyBkb24ndCBydW4gdGhpcyBjb21waWxhdGlvbiBjb2RlIC0gc2luY2UgY29udGVudCB3b24ndCBnZXQgdXNlZCEhXG5cdFx0XHRcdFx0XHQvLyBDcmVhdGUgdGVtcGxhdGUgb2JqZWN0IGZvciBuZXN0ZWQgdGVtcGxhdGVcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwgPSB0bXBsT2JqZWN0KG1hcmt1cCwgdG1wbE9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbC50bXBsTmFtZSA9IHRtcGxOYW1lICsgXCIvXCIgKyB0YWdOYW1lO1xuXHRcdFx0XHRcdFx0Ly8gQ29tcGlsZSB0byBBU1QgYW5kIHRoZW4gdG8gY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwudXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzIHx8IHVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0YnVpbGRDb2RlKGNvbnRlbnQsIG5lc3RlZFRtcGwpO1xuXHRcdFx0XHRcdFx0dXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbHMucHVzaChuZXN0ZWRUbXBsKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIWlzRWxzZSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBub3QgYW4gZWxzZSB0YWcuXG5cdFx0XHRcdFx0XHR0YWdBbmRFbHNlcyA9IHRhZ05hbWU7XG5cdFx0XHRcdFx0XHR1c2VWaWV3cyA9IHVzZVZpZXdzIHx8IHRhZ05hbWUgJiYgKCEkdGFnc1t0YWdOYW1lXSB8fCAhJHRhZ3NbdGFnTmFtZV0uZmxvdyk7XG5cdFx0XHRcdFx0XHQvLyBTd2l0Y2ggdG8gYSBuZXcgY29kZSBzdHJpbmcgZm9yIHRoaXMgYm91bmQgdGFnIChhbmQgaXRzIGVsc2VzLCBpZiBpdCBoYXMgYW55KSAtIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRcdG9sZENvZGUgPSBjb2RlO1xuXHRcdFx0XHRcdFx0Y29kZSA9IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBhc3RbaSArIDFdO1xuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBuZXh0SXNFbHNlICYmIG5leHRJc0Vsc2VbMF0gPT09IFwiZWxzZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZ1N0YXJ0ID0gb25FcnJvciA/IFwiO1xcbnRyeXtcXG5yZXQrPVwiIDogXCJcXG4rXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IFwiXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChpc0dldFZhbCAmJiAocGF0aEJpbmRpbmdzIHx8IHRyaWdnZXIgfHwgY29udmVydGVyICYmIGNvbnZlcnRlciAhPT0gSFRNTCkpIHtcblx0XHRcdFx0XHQvLyBGb3IgY29udmVydFZhbCB3ZSBuZWVkIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBuZXcgdGFnQ3R4KHMpXG5cdFx0XHRcdFx0dGFnQ3R4Rm4gPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIFwiIC8vIFwiICsgdG1wbE5hbWUgKyBcIiBcIiArIHRtcGxCaW5kaW5nS2V5ICsgXCIgXCIgKyB0YWdOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgXCJcXG5yZXR1cm4ge1wiICsgdGFnQ3R4ICsgXCJ9O1wiKTtcblx0XHRcdFx0XHR0YWdDdHhGbi5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdHRhZ0N0eEZuLl90YWcgPSB0YWdOYW1lO1xuXG5cdFx0XHRcdFx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0YWdDdHhGbjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzZXRQYXRocyh0YWdDdHhGbiwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHR0YWdSZW5kZXIgPSAnYyhcIicgKyBjb252ZXJ0ZXIgKyAnXCIsdmlldywnO1xuXHRcdFx0XHRcdHVzZUNudnQgPSB0cnVlO1xuXHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsXCI7XG5cdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGUgKz0gKGlzR2V0VmFsXG5cdFx0XHRcdFx0PyAoaXNMaW5rRXhwciA/IChvbkVycm9yID8gXCJ0cnl7XFxuXCIgOiBcIlwiKSArIFwicmV0dXJuIFwiIDogdGFnU3RhcnQpICsgKHVzZUNudnQgLy8gQ2FsbCBfY252dCBpZiB0aGVyZSBpcyBhIGNvbnZlcnRlcjoge3tjbnZ0OiAuLi4gfX0gb3Ige157Y252dDogLi4uIH19XG5cdFx0XHRcdFx0XHQ/ICh1c2VDbnZ0ID0gdW5kZWZpbmVkLCB1c2VWaWV3cyA9IGhhc0NudnQgPSB0cnVlLCB0YWdSZW5kZXIgKyAocGF0aEJpbmRpbmdzXG5cdFx0XHRcdFx0XHRcdD8gKCh0bXBsQmluZGluZ3NbdG1wbEJpbmRpbmdLZXkgLSAxXSA9IHRhZ0N0eEZuKSwgdG1wbEJpbmRpbmdLZXkpIC8vIFN0b3JlIHRoZSBjb21waWxlZCB0YWdDdHhGbiBpbiB0bXBsLmJuZHMsIGFuZCBwYXNzIHRoZSBrZXkgdG8gY29udmVydFZhbCgpXG5cdFx0XHRcdFx0XHRcdDogXCJ7XCIgKyB0YWdDdHggKyBcIn1cIikgKyBcIilcIilcblx0XHRcdFx0XHRcdDogdGFnTmFtZSA9PT0gXCI+XCJcblx0XHRcdFx0XHRcdFx0PyAoaGFzRW5jb2RlciA9IHRydWUsIFwiaChcIiArIHBhcmFtc1swXSArIFwiKVwiKVxuXHRcdFx0XHRcdFx0XHQ6IChnZXRzVmFsID0gdHJ1ZSwgXCIoKHY9XCIgKyBwYXJhbXNbMF0gKyAnKSE9bnVsbD92OicgKyAoaXNMaW5rRXhwciA/ICdudWxsKScgOiAnXCJcIiknKSlcblx0XHRcdFx0XHRcdFx0Ly8gTm9uIHN0cmljdCBlcXVhbGl0eSBzbyBkYXRhLWxpbms9XCJ0aXRsZXs6ZXhwcn1cIiB3aXRoIGV4cHI9bnVsbC91bmRlZmluZWQgcmVtb3ZlcyB0aXRsZSBhdHRyaWJ1dGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0OiAoaGFzVGFnID0gdHJ1ZSwgXCJcXG57dmlldzp2aWV3LHRtcGw6XCIgLy8gQWRkIHRoaXMgdGFnQ3R4IHRvIHRoZSBjb21waWxlZCBjb2RlIGZvciB0aGUgdGFnQ3R4cyB0byBiZSBwYXNzZWQgdG8gcmVuZGVyVGFnKClcblx0XHRcdFx0XHRcdCsgKGNvbnRlbnQgPyBuZXN0ZWRUbXBscy5sZW5ndGggOiBcIjBcIikgKyBcIixcIiAvLyBGb3IgYmxvY2sgdGFncywgcGFzcyBpbiB0aGUga2V5IChuZXN0ZWRUbXBscy5sZW5ndGgpIHRvIHRoZSBuZXN0ZWQgY29udGVudCB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0KyB0YWdDdHggKyBcIn0sXCIpKTtcblxuXHRcdFx0XHRpZiAodGFnQW5kRWxzZXMgJiYgIW5leHRJc0Vsc2UpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgYW4gaW5saW5lIHRhZyB3aXRob3V0IGFueSBlbHNlcywgb3IgdGhlIGxhc3Qge3tlbHNlfX0gb2YgYW4gaW5saW5lIHRhZ1xuXHRcdFx0XHRcdC8vIFdlIGNvbXBsZXRlIHRoZSBjb2RlIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRjb2RlID0gXCJbXCIgKyBjb2RlLnNsaWNlKDAsIC0xKSArIFwiXVwiO1xuXHRcdFx0XHRcdHRhZ1JlbmRlciA9ICd0KFwiJyArIHRhZ0FuZEVsc2VzICsgJ1wiLHZpZXcsdGhpcywnO1xuXHRcdFx0XHRcdGlmIChpc0xpbmtFeHByIHx8IHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGJvdW5kIHRhZyAoZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgaW5saW5lIGJvdW5kIHRhZyB7Xnt0YWcgLi4ufX0pIHNvIHdlIHN0b3JlIGEgY29tcGlsZWQgdGFnQ3R4cyBmdW5jdGlvbiBpbiB0bXAuYm5kc1xuXHRcdFx0XHRcdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgXCIgLy8gXCIgKyB0bXBsTmFtZSArIFwiIFwiICsgdG1wbEJpbmRpbmdLZXkgKyBcIiBcIiArIHRhZ0FuZEVsc2VzICsgXCJcXG5yZXR1cm4gXCIgKyBjb2RlICsgXCI7XCIpO1xuXHRcdFx0XHRcdFx0Y29kZS5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdFx0Y29kZS5fdGFnID0gdGFnQW5kRWxzZXM7XG5cdFx0XHRcdFx0XHRpZiAocGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRcdHNldFBhdGhzKHRtcGxCaW5kaW5nc1t0bXBsQmluZGluZ0tleSAtIDFdID0gY29kZSwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb2RlOyAvLyBGb3IgYSBkYXRhLWxpbmsgZXhwcmVzc2lvbiB3ZSByZXR1cm4gdGhlIGNvbXBpbGVkIHRhZ0N0eHMgZnVuY3Rpb25cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsdW5kZWZpbmVkLFwiO1xuXHRcdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgdGhlIGxhc3Qge3tlbHNlfX0gZm9yIGFuIGlubGluZSB0YWcuXG5cdFx0XHRcdFx0Ly8gRm9yIGEgYm91bmQgdGFnLCBwYXNzIHRoZSB0YWdDdHhzIGZuIGxvb2t1cCBrZXkgdG8gcmVuZGVyVGFnLlxuXHRcdFx0XHRcdC8vIEZvciBhbiB1bmJvdW5kIHRhZywgaW5jbHVkZSB0aGUgY29kZSBkaXJlY3RseSBmb3IgZXZhbHVhdGluZyB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0Y29kZSA9IG9sZENvZGUgKyB0YWdTdGFydCArIHRhZ1JlbmRlciArICh0bXBsQmluZGluZ0tleSB8fCBjb2RlKSArIFwiKVwiO1xuXHRcdFx0XHRcdHBhdGhCaW5kaW5ncyA9IDA7XG5cdFx0XHRcdFx0dGFnQW5kRWxzZXMgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvbkVycm9yKSB7XG5cdFx0XHRcdFx0dXNlVmlld3MgPSB0cnVlO1xuXHRcdFx0XHRcdGNvZGUgKz0gJztcXG59Y2F0Y2goZSl7cmV0JyArIChpc0xpbmtFeHByID8gXCJ1cm4gXCIgOiBcIis9XCIpICsgYm91bmRPbkVyclN0YXJ0ICsgJ2ouX2VycihlLHZpZXcsJyArIG9uRXJyb3IgKyAnKScgKyBib3VuZE9uRXJyRW5kICsgJzt9JyArIChpc0xpbmtFeHByID8gXCJcIiA6ICdyZXQ9cmV0Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gSW5jbHVkZSBvbmx5IHRoZSB2YXIgcmVmZXJlbmNlcyB0aGF0IGFyZSBuZWVkZWQgaW4gdGhlIGNvZGVcblx0Y29kZSA9IFwiLy8gXCIgKyB0bXBsTmFtZVxuXG5cdFx0KyBcIlxcbnZhciB2XCJcblx0XHQrIChoYXNUYWcgPyBcIix0PWouX3RhZ1wiIDogXCJcIikgICAgICAgICAgICAgICAgLy8gaGFzIHRhZ1xuXHRcdCsgKGhhc0NudnQgPyBcIixjPWouX2NudnRcIiA6IFwiXCIpICAgICAgICAgICAgICAvLyBjb252ZXJ0ZXJcblx0XHQrIChoYXNFbmNvZGVyID8gXCIsaD1qLl9odG1sXCIgOiBcIlwiKSAgICAgICAgICAgLy8gaHRtbCBjb252ZXJ0ZXJcblx0XHQrIChpc0xpbmtFeHByID8gXCI7XFxuXCIgOiAnLHJldD1cIlwiXFxuJylcblx0XHQrICh0bXBsT3B0aW9ucy5kZWJ1ZyA/IFwiZGVidWdnZXI7XCIgOiBcIlwiKVxuXHRcdCsgY29kZVxuXHRcdCsgKGlzTGlua0V4cHIgPyBcIlxcblwiIDogXCI7XFxucmV0dXJuIHJldDtcIik7XG5cblx0aWYgKCRzdWJTZXR0aW5ncy5kZWJ1Z01vZGUgIT09IGZhbHNlKSB7XG5cdFx0Y29kZSA9IFwidHJ5IHtcXG5cIiArIGNvZGUgKyBcIlxcbn1jYXRjaChlKXtcXG5yZXR1cm4gai5fZXJyKGUsIHZpZXcpO1xcbn1cIjtcblx0fVxuXG5cdHRyeSB7XG5cdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgY29kZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRzeW50YXhFcnJvcihcIkNvbXBpbGVkIHRlbXBsYXRlIGNvZGU6XFxuXFxuXCIgKyBjb2RlICsgJ1xcbjogXCInICsgZS5tZXNzYWdlICsgJ1wiJyk7XG5cdH1cblx0aWYgKHRtcGwpIHtcblx0XHR0bXBsLmZuID0gY29kZTtcblx0XHR0bXBsLnVzZVZpZXdzID0gISF1c2VWaWV3cztcblx0fVxuXHRyZXR1cm4gY29kZTtcbn1cblxuLy89PT09PT09PT09XG4vLyBVdGlsaXRpZXNcbi8vPT09PT09PT09PVxuXG4vLyBNZXJnZSBvYmplY3RzLCBpbiBwYXJ0aWN1bGFyIGNvbnRleHRzIHdoaWNoIGluaGVyaXQgZnJvbSBwYXJlbnQgY29udGV4dHNcbmZ1bmN0aW9uIGV4dGVuZEN0eChjb250ZXh0LCBwYXJlbnRDb250ZXh0KSB7XG5cdC8vIFJldHVybiBjb3B5IG9mIHBhcmVudENvbnRleHQsIHVubGVzcyBjb250ZXh0IGlzIGRlZmluZWQgYW5kIGlzIGRpZmZlcmVudCwgaW4gd2hpY2ggY2FzZSByZXR1cm4gYSBuZXcgbWVyZ2VkIGNvbnRleHRcblx0Ly8gSWYgbmVpdGhlciBjb250ZXh0IG5vciBwYXJlbnRDb250ZXh0IGFyZSBkZWZpbmVkLCByZXR1cm4gdW5kZWZpbmVkXG5cdHJldHVybiBjb250ZXh0ICYmIGNvbnRleHQgIT09IHBhcmVudENvbnRleHRcblx0XHQ/IChwYXJlbnRDb250ZXh0XG5cdFx0XHQ/ICRleHRlbmQoJGV4dGVuZCh7fSwgcGFyZW50Q29udGV4dCksIGNvbnRleHQpXG5cdFx0XHQ6IGNvbnRleHQpXG5cdFx0OiBwYXJlbnRDb250ZXh0ICYmICRleHRlbmQoe30sIHBhcmVudENvbnRleHQpO1xufVxuXG4vLyBHZXQgY2hhcmFjdGVyIGVudGl0eSBmb3IgSFRNTCBhbmQgQXR0cmlidXRlIGVuY29kaW5nXG5mdW5jdGlvbiBnZXRDaGFyRW50aXR5KGNoKSB7XG5cdHJldHVybiBjaGFyRW50aXRpZXNbY2hdIHx8IChjaGFyRW50aXRpZXNbY2hdID0gXCImI1wiICsgY2guY2hhckNvZGVBdCgwKSArIFwiO1wiKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0UHJvcHMoc291cmNlKSB7XG5cdC8vIHRoaXMgcG9pbnRlciBpcyB0aGVNYXAgLSB3aGljaCBoYXMgdGFnQ3R4LnByb3BzIHRvb1xuXHQvLyBhcmd1bWVudHM6IHRhZ0N0eC5hcmdzLlxuXHR2YXIga2V5LCBwcm9wLFxuXHRcdHByb3BzID0gW107XG5cblx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IE9CSkVDVCkge1xuXHRcdGZvciAoa2V5IGluIHNvdXJjZSkge1xuXHRcdFx0cHJvcCA9IHNvdXJjZVtrZXldO1xuXHRcdFx0aWYgKGtleSAhPT0gJGV4cGFuZG8gJiYgc291cmNlLmhhc093blByb3BlcnR5KGtleSkgJiYgISRpc0Z1bmN0aW9uKHByb3ApKSB7XG5cdFx0XHRcdHByb3BzLnB1c2goe2tleToga2V5LCBwcm9wOiBwcm9wfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wcztcbn1cblxuZnVuY3Rpb24gJGZuUmVuZGVyKGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKSB7XG5cdHZhciB0bXBsRWxlbSA9IHRoaXMuanF1ZXJ5ICYmICh0aGlzWzBdIHx8IGVycm9yKCdVbmtub3duIHRlbXBsYXRlJykpLCAvLyBUYXJnZXRlZCBlbGVtZW50IG5vdCBmb3VuZCBmb3IgalF1ZXJ5IHRlbXBsYXRlIHNlbGVjdG9yIHN1Y2ggYXMgXCIjbXlUbXBsXCJcblx0XHR0bXBsID0gdG1wbEVsZW0uZ2V0QXR0cmlidXRlKHRtcGxBdHRyKTtcblxuXHRyZXR1cm4gcmVuZGVyQ29udGVudC5jYWxsKHRtcGwgPyAkLmRhdGEodG1wbEVsZW0pW2pzdlRtcGxdIDogJHRlbXBsYXRlcyh0bXBsRWxlbSksIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWdpc3RlciBjb252ZXJ0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGh0bWxFbmNvZGUodGV4dCkge1xuXHQvLyBIVE1MIGVuY29kZTogUmVwbGFjZSA8ID4gJiAnIGFuZCBcIiBieSBjb3JyZXNwb25kaW5nIGVudGl0aWVzLlxuXHRyZXR1cm4gdGV4dCAhPSB1bmRlZmluZWQgPyBySXNIdG1sLnRlc3QodGV4dCkgJiYgKFwiXCIgKyB0ZXh0KS5yZXBsYWNlKHJIdG1sRW5jb2RlLCBnZXRDaGFyRW50aXR5KSB8fCB0ZXh0IDogXCJcIjtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRzdWIgPSAkdmlld3Muc3ViO1xuJHZpZXdzU2V0dGluZ3MgPSAkdmlld3Muc2V0dGluZ3M7XG5cbmlmICghKGpzciB8fCAkICYmICQucmVuZGVyKSkge1xuXHQvLyBKc1JlbmRlciBub3QgYWxyZWFkeSBsb2FkZWQsIG9yIGxvYWRlZCB3aXRob3V0IGpRdWVyeSwgYW5kIHdlIGFyZSBub3cgbW92aW5nIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lcGFjZVxuXHRmb3IgKGpzdlN0b3JlTmFtZSBpbiBqc3ZTdG9yZXMpIHtcblx0XHRyZWdpc3RlclN0b3JlKGpzdlN0b3JlTmFtZSwganN2U3RvcmVzW2pzdlN0b3JlTmFtZV0pO1xuXHR9XG5cblx0JGNvbnZlcnRlcnMgPSAkdmlld3MuY29udmVydGVycztcblx0JGhlbHBlcnMgPSAkdmlld3MuaGVscGVycztcblx0JHRhZ3MgPSAkdmlld3MudGFncztcblxuXHQkc3ViLl90Zy5wcm90b3R5cGUgPSB7XG5cdFx0YmFzZUFwcGx5OiBiYXNlQXBwbHksXG5cdFx0Y3Z0QXJnczogY29udmVydEFyZ3Ncblx0fTtcblxuXHR0b3BWaWV3ID0gJHN1Yi50b3BWaWV3ID0gbmV3IFZpZXcoKTtcblxuXHQvL0JST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRpZiAoJCkge1xuXG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5ICg9ICQpIGlzIGxvYWRlZFxuXG5cdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0JGV4cGFuZG8gPSAkLmV4cGFuZG87XG5cdFx0aWYgKCQub2JzZXJ2YWJsZSkge1xuXHRcdFx0JGV4dGVuZCgkc3ViLCAkLnZpZXdzLnN1Yik7IC8vIGpxdWVyeS5vYnNlcnZhYmxlLmpzIHdhcyBsb2FkZWQgYmVmb3JlIGpzcmVuZGVyLmpzXG5cdFx0XHQkdmlld3MubWFwID0gJC52aWV3cy5tYXA7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5IGlzIG5vdCBsb2FkZWQuXG5cblx0XHQkID0ge307XG5cblx0XHRpZiAoc2V0R2xvYmFscykge1xuXHRcdFx0Z2xvYmFsLmpzcmVuZGVyID0gJDsgLy8gV2UgYXJlIGxvYWRpbmcganNyZW5kZXIuanMgZnJvbSBhIHNjcmlwdCBlbGVtZW50LCBub3QgQU1EIG9yIENvbW1vbkpTLCBzbyBzZXQgZ2xvYmFsXG5cdFx0fVxuXG5cdFx0Ly8gRXJyb3Igd2FybmluZyBpZiBqc3JlbmRlci5qcyBpcyB1c2VkIGFzIHRlbXBsYXRlIGVuZ2luZSBvbiBOb2RlLmpzIChlLmcuIEV4cHJlc3Mgb3IgSGFwaS4uLilcblx0XHQvLyBVc2UganNyZW5kZXItbm9kZS5qcyBpbnN0ZWFkLi4uXG5cdFx0JC5yZW5kZXJGaWxlID0gJC5fX2V4cHJlc3MgPSAkLmNvbXBpbGUgPSBmdW5jdGlvbigpIHsgdGhyb3cgXCJOb2RlLmpzOiB1c2UgbnBtIGpzcmVuZGVyLCBvciBqc3JlbmRlci1ub2RlLmpzXCI7IH07XG5cblx0XHQvL0VORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHQkLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihvYikge1xuXHRcdFx0cmV0dXJuIHR5cGVvZiBvYiA9PT0gXCJmdW5jdGlvblwiO1xuXHRcdH07XG5cblx0XHQkLmlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0cmV0dXJuICh7fS50b1N0cmluZykuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCI7XG5cdFx0fTtcblxuXHRcdCRzdWIuX2pxID0gZnVuY3Rpb24oanEpIHsgLy8gcHJpdmF0ZSBtZXRob2QgdG8gbW92ZSBmcm9tIEpzUmVuZGVyIEFQSXMgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVzcGFjZVxuXHRcdFx0aWYgKGpxICE9PSAkKSB7XG5cdFx0XHRcdCRleHRlbmQoanEsICQpOyAvLyBtYXAgb3ZlciBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXNwYWNlXG5cdFx0XHRcdCQgPSBqcTtcblx0XHRcdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0XHRcdGRlbGV0ZSAkLmpzcmVuZGVyO1xuXHRcdFx0XHQkZXhwYW5kbyA9ICQuZXhwYW5kbztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0JC5qc3JlbmRlciA9IHZlcnNpb25OdW1iZXI7XG5cdH1cblx0JHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcblx0JHN1YlNldHRpbmdzLmFsbG93Q29kZSA9IGZhbHNlO1xuXHQkaXNGdW5jdGlvbiA9ICQuaXNGdW5jdGlvbjtcblx0JC5yZW5kZXIgPSAkcmVuZGVyO1xuXHQkLnZpZXdzID0gJHZpZXdzO1xuXHQkLnRlbXBsYXRlcyA9ICR0ZW1wbGF0ZXMgPSAkdmlld3MudGVtcGxhdGVzO1xuXG5cdGZvciAoc2V0dGluZyBpbiAkc3ViU2V0dGluZ3MpIHtcblx0XHRhZGRTZXR0aW5nKHNldHRpbmcpO1xuXHR9XG5cblx0KCR2aWV3c1NldHRpbmdzLmRlYnVnTW9kZSA9IGZ1bmN0aW9uKGRlYnVnTW9kZSkge1xuXHRcdHJldHVybiBkZWJ1Z01vZGUgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyAkc3ViU2V0dGluZ3MuZGVidWdNb2RlXG5cdFx0XHQ6IChcblx0XHRcdFx0JHN1YlNldHRpbmdzLmRlYnVnTW9kZSA9IGRlYnVnTW9kZSxcblx0XHRcdFx0JHN1YlNldHRpbmdzLm9uRXJyb3IgPSBkZWJ1Z01vZGUgKyBcIlwiID09PSBkZWJ1Z01vZGVcblx0XHRcdFx0XHQ/IG5ldyBGdW5jdGlvbihcIlwiLCBcInJldHVybiAnXCIgKyBkZWJ1Z01vZGUgKyBcIic7XCIgKVxuXHRcdFx0XHRcdDogJGlzRnVuY3Rpb24oZGVidWdNb2RlKVxuXHRcdFx0XHRcdFx0PyBkZWJ1Z01vZGVcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0XHQkdmlld3NTZXR0aW5ncyk7XG5cdH0pKGZhbHNlKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cblx0JHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQgPSB7XG5cdFx0dXNlVmlld3M6IGZhbHNlLFxuXHRcdF9qc3Y6IGZhbHNlIC8vIEZvciBnbG9iYWwgYWNjZXNzIHRvIEpzVmlld3Mgc3RvcmVcblx0fTtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZ2lzdGVyIHRhZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQkdGFncyh7XG5cdFx0XCJpZlwiOiB7XG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHQvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciB7e2lmfX0gYW5kIG9uY2UgZm9yIGVhY2gge3tlbHNlfX0uXG5cdFx0XHRcdC8vIFdlIHdpbGwgdXNlIHRoZSB0YWcucmVuZGVyaW5nIG9iamVjdCBmb3IgY2FycnlpbmcgcmVuZGVyaW5nIHN0YXRlIGFjcm9zcyB0aGUgY2FsbHMuXG5cdFx0XHRcdC8vIElmIG5vdCBkb25lIChhIHByZXZpb3VzIGJsb2NrIGhhcyBub3QgYmVlbiByZW5kZXJlZCksIGxvb2sgYXQgZXhwcmVzc2lvbiBmb3IgdGhpcyBibG9jayBhbmQgcmVuZGVyIHRoZSBibG9jayBpZiBleHByZXNzaW9uIGlzIHRydXRoeVxuXHRcdFx0XHQvLyBPdGhlcndpc2UgcmV0dXJuIFwiXCJcblx0XHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJldCA9IChzZWxmLnJlbmRlcmluZy5kb25lIHx8ICF2YWwgJiYgKGFyZ3VtZW50cy5sZW5ndGggfHwgIXRhZ0N0eC5pbmRleCkpXG5cdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0XHRcdDogKHNlbGYucmVuZGVyaW5nLmRvbmUgPSB0cnVlLCBzZWxmLnNlbGVjdGVkID0gdGFnQ3R4LmluZGV4LFxuXHRcdFx0XHRcdFx0XHQvLyBUZXN0IGlzIHNhdGlzZmllZCwgc28gcmVuZGVyIGNvbnRlbnQgb24gY3VycmVudCBjb250ZXh0LiBXZSBjYWxsIHRhZ0N0eC5yZW5kZXIoKSByYXRoZXIgdGhhbiByZXR1cm4gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdC8vICh3aGljaCB3b3VsZCBhbHNvIHJlbmRlciB0aGUgdG1wbC9jb250ZW50IG9uIHRoZSBjdXJyZW50IGNvbnRleHQgYnV0IHdvdWxkIGl0ZXJhdGUgaWYgaXQgaXMgYW4gYXJyYXkpXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eC5yZW5kZXIodGFnQ3R4LnZpZXcsIHRydWUpKTsgLy8gbm8gYXJnLCBzbyByZW5kZXJzIGFnYWluc3QgcGFyZW50Vmlldy5kYXRhXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9LFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCJmb3JcIjoge1xuXHRcdFx0cmVuZGVyOiBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0Ly8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3Ige3tmb3J9fSBhbmQgb25jZSBmb3IgZWFjaCB7e2Vsc2V9fS5cblx0XHRcdFx0Ly8gV2Ugd2lsbCB1c2UgdGhlIHRhZy5yZW5kZXJpbmcgb2JqZWN0IGZvciBjYXJyeWluZyByZW5kZXJpbmcgc3RhdGUgYWNyb3NzIHRoZSBjYWxscy5cblx0XHRcdFx0dmFyIGZpbmFsRWxzZSA9ICFhcmd1bWVudHMubGVuZ3RoLFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJlc3VsdCA9IFwiXCIsXG5cdFx0XHRcdFx0ZG9uZSA9IDA7XG5cblx0XHRcdFx0aWYgKCFzZWxmLnJlbmRlcmluZy5kb25lKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBmaW5hbEVsc2UgPyB0YWdDdHgudmlldy5kYXRhIDogdmFsOyAvLyBGb3IgdGhlIGZpbmFsIGVsc2UsIGRlZmF1bHRzIHRvIGN1cnJlbnQgZGF0YSB3aXRob3V0IGl0ZXJhdGlvbi5cblx0XHRcdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IHRhZ0N0eC5yZW5kZXIodmFsdWUsIGZpbmFsRWxzZSk7IC8vIEl0ZXJhdGVzIGV4Y2VwdCBvbiBmaW5hbCBlbHNlLCBpZiBkYXRhIGlzIGFuIGFycmF5LiAoVXNlIHt7aW5jbHVkZX19IHRvIGNvbXBvc2UgdGVtcGxhdGVzIHdpdGhvdXQgYXJyYXkgaXRlcmF0aW9uKVxuXHRcdFx0XHRcdFx0ZG9uZSArPSAkaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc2VsZi5yZW5kZXJpbmcuZG9uZSA9IGRvbmUpIHtcblx0XHRcdFx0XHRcdHNlbGYuc2VsZWN0ZWQgPSB0YWdDdHguaW5kZXg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIElmIG5vdGhpbmcgd2FzIHJlbmRlcmVkIHdlIHdpbGwgbG9vayBhdCB0aGUgbmV4dCB7e2Vsc2V9fS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZG9uZS5cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdHByb3BzOiB7XG5cdFx0XHRiYXNlVGFnOiBcImZvclwiLFxuXHRcdFx0ZGF0YU1hcDogZGF0YU1hcChnZXRUYXJnZXRQcm9wcyksXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRpbmNsdWRlOiB7XG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcIipcIjoge1xuXHRcdFx0Ly8ge3sqIGNvZGUuLi4gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiOipcIjoge1xuXHRcdFx0Ly8ge3s6KiByZXR1cm5lZEV4cHJlc3Npb24gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdGRiZzogJGhlbHBlcnMuZGJnID0gJGNvbnZlcnRlcnMuZGJnID0gZGJnQnJlYWsgLy8gUmVnaXN0ZXIge3tkYmcvfX0sIHt7ZGJnOi4uLn19IGFuZCB+ZGJnKCkgdG8gdGhyb3cgYW5kIGNhdGNoLCBhcyBicmVha3BvaW50cyBmb3IgZGVidWdnaW5nLlxuXHR9KTtcblxuXHQkY29udmVydGVycyh7XG5cdFx0aHRtbDogaHRtbEVuY29kZSxcblx0XHRhdHRyOiBodG1sRW5jb2RlLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdFx0dXJsOiBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0XHQvLyBVUkwgZW5jb2RpbmcgaGVscGVyLlxuXHRcdFx0cmV0dXJuIHRleHQgIT0gdW5kZWZpbmVkID8gZW5jb2RlVVJJKFwiXCIgKyB0ZXh0KSA6IHRleHQgPT09IG51bGwgPyB0ZXh0IDogXCJcIjsgLy8gbnVsbCByZXR1cm5zIG51bGwsIGUuZy4gdG8gcmVtb3ZlIGF0dHJpYnV0ZS4gdW5kZWZpbmVkIHJldHVybnMgXCJcIlxuXHRcdH1cblx0fSk7XG59XG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IERlZmluZSBkZWZhdWx0IGRlbGltaXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiRzdWJTZXR0aW5ncyA9ICRzdWIuc2V0dGluZ3M7XG4kaXNBcnJheSA9ICgkfHxqc3IpLmlzQXJyYXk7XG4kdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzKFwie3tcIiwgXCJ9fVwiLCBcIl5cIik7XG5cbmlmIChqc3JUb0pxKSB7IC8vIE1vdmluZyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXBhY2UgLSBjb3B5IG92ZXIgdGhlIHN0b3JlZCBpdGVtcyAodGVtcGxhdGVzLCBjb252ZXJ0ZXJzLCBoZWxwZXJzLi4uKVxuXHRqc3Iudmlld3Muc3ViLl9qcSgkKTtcbn1cbnJldHVybiAkIHx8IGpzcjtcbn0sIHdpbmRvdykpO1xuIiwiLypnbG9iYWwgUVVuaXQsIHRlc3QsIGVxdWFsLCBvayovXG4oZnVuY3Rpb24odW5kZWZpbmVkKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuYnJvd3NlcmlmeS5kb25lLnNldmVuID0gdHJ1ZTtcblxuUVVuaXQubW9kdWxlKFwiQnJvd3NlcmlmeSAtIGNsaWVudCBjb2RlXCIpO1xuXG52YXIgaXNJRTggPSB3aW5kb3cuYXR0YWNoRXZlbnQgJiYgIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyO1xuXG5pZiAoIWlzSUU4KSB7XG5cbnRlc3QoXCJqUXVlcnkgZ2xvYmFsOiByZXF1aXJlKCdqcXVlcnkudmlld3MnKVwiLCBmdW5jdGlvbigpIHtcblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBIaWRlIFFVbml0IGdsb2JhbCBqUXVlcnkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdHZhciBqUXVlcnkgPSBnbG9iYWwualF1ZXJ5O1xuXHRnbG9iYWwualF1ZXJ5ID0gdW5kZWZpbmVkO1xuXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXJyYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciBkYXRhID0ge25hbWU6IFwiSm9cIn07XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gQWN0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0Z2xvYmFsLmpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuXG5cdHZhciAkanNyID0gcmVxdWlyZSgnanNyZW5kZXInKTsgLy8gVXNlcyBnbG9iYWwgalF1ZXJ5LCBzbyAkanNyID09PSBnbG9iYWwualF1ZXJ5IGlzIGdsb2JhbCBqUXVlcnkgbmFtZXNwYWNlIC8vIEVsc2UgSnNWaWV3cyByZXF1aXJlcyBKc1JlbmRlclxuXHQkanNyID0gcmVxdWlyZSgnLi4vLi4vanF1ZXJ5Lm9ic2VydmFibGUuanMnKTsgLy8gJGpzciA9PT0gZ2xvYmFsLmpRdWVyeSAvLyBFbHNlIEpzVmlld3MgcmVxdWlyZXMgSnNPYnNlcnZhYmxlXG5cdCRqc3IgPSByZXF1aXJlKCcuLi8uLi9qcXVlcnkudmlld3MnKTsgLy8gJGpzciA9PT0gZ2xvYmFsLmpRdWVyeVxuXG5cdC8vIFVzZSByZXF1aXJlIHRvIGdldCBzZXJ2ZXIgdGVtcGxhdGUsIHRoYW5rcyB0byBCcm93c2VyaWZ5IGJ1bmRsZSB0aGF0IHVzZWQganNyZW5kZXIvdG1wbGlmeSB0cmFuc2Zvcm1cblx0dmFyIHRtcGwgPSByZXF1aXJlKCcuLi90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sJyk7IC8vIFVzZXMganNyZW5kZXIgYXR0YWNoZWQgdG8gZ2xvYmFsIGpRdWVyeVxuXG5cdHZhciByZXN1bHQgPSB0bXBsKGRhdGEpO1xuXG5cdCRqc3Iub2JzZXJ2ZShkYXRhLCBcIm5hbWVcIiwgZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdHJlc3VsdCArPSBcIiBcIiArIGV2ZW50QXJncy52YWx1ZTtcblx0fSlcblx0JGpzci5vYnNlcnZhYmxlKGRhdGEpLnNldFByb3BlcnR5KFwibmFtZVwiLCBcIm5ldyBuYW1lXCIpOyAvLyByZXN1bHQgPT09IFwibmV3IG5hbWVcIlxuXG5cdHJlc3VsdCArPSBcIiBcIiArICgkanNyID09PSBnbG9iYWwualF1ZXJ5KTtcblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEFzc2VydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0ZXF1YWwocmVzdWx0LCBcIk5hbWU6IEpvIChuYW1lLXRlbXBsYXRlLmh0bWwpIG5ldyBuYW1lIHRydWVcIiwgXCJyZXN1bHQ6IGpRdWVyeSBnbG9iYWw6IHJlcXVpcmUoJ2pxdWVyeS52aWV3cycpXCIpO1xuXG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gUmVzZXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdGdsb2JhbC5qUXVlcnkgPSBqUXVlcnk7IC8vIFJlcGxhY2UgUVVuaXQgZ2xvYmFsIGpRdWVyeVxufSk7XG59XG59KSgpO1xuIiwidmFyIHRtcGxSZWZzID0gW10sXG4gIG1rdXAgPSAnTmFtZToge3s6bmFtZX19IChuYW1lLXRlbXBsYXRlLmh0bWwpJyxcbiAgJCA9IGdsb2JhbC5qc3JlbmRlciB8fCBnbG9iYWwualF1ZXJ5O1xuXG5tb2R1bGUuZXhwb3J0cyA9ICQgPyAkLnRlbXBsYXRlcyhcIi4vdGVzdC90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sXCIsIG1rdXApIDpcbiAgZnVuY3Rpb24oJCkge1xuICAgIGlmICghJCB8fCAhJC52aWV3cykge3Rocm93IFwiUmVxdWlyZXMganNyZW5kZXIvalF1ZXJ5XCI7fVxuICAgIHdoaWxlICh0bXBsUmVmcy5sZW5ndGgpIHtcbiAgICAgIHRtcGxSZWZzLnBvcCgpKCQpOyAvLyBjb21waWxlIG5lc3RlZCB0ZW1wbGF0ZVxuICAgIH1cblxuICAgIHJldHVybiAkLnRlbXBsYXRlcyhcIi4vdGVzdC90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sXCIsIG1rdXApXG4gIH07Il19 diff --git a/test/browserify/bundles/8-bundle.js b/test/browserify/bundles/8-bundle.js index 4f289ca..231c06b 100644 --- a/test/browserify/bundles/8-bundle.js +++ b/test/browserify/bundles/8-bundle.js @@ -1,5 +1,5 @@ (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 to string or (multiselect) array of strings - } - if (cvtBack) { - sourceValue = cvtBack.call(tag, sourceValue); + while (binding = rSplitBindings.exec(bindings)) { + if (binding = bindingStore[binding[1]]) { + if (to = binding.to) { + // The binding has a 'to' field, which is of the form [[targetObject, toPath], cvtBack] + linkCtx = binding.linkCtx; + view = linkCtx.view; + tag = linkCtx.tag || view.tag; + $source = $(source); + onBeforeChange = view.hlp(onBeforeChangeStr); // TODO Can we optimize this and other instances of same? + onAfterChange = view.hlp(onAfterChangeStr); // TODO Can we optimize this and other instances of same + fromAttr = defaultAttr(source); + setter = fnSetters[fromAttr]; + if (sourceValue === undefined) { + sourceValue = $isFunction(fromAttr) + ? fromAttr(source) + : setter + ? $source[setter]() + : $source.attr(fromAttr); + } + cnvtName = to[1]; + to = to[0]; // [object, path] + to = to + "" === to ? [linkCtx.data, to] : to; + if (cnvtName) { + if ($isFunction(cnvtName)) { + cvtBack = cnvtName; + } else { + cvtBack = view.getRsc("converters", cnvtName); } + } + if (linkCtx.elem.nodeName === "SELECT") { + linkCtx.elem._jsvSel = sourceValue = sourceValue || (linkCtx.elem.multiple ? [] : sourceValue); + // data-link to string or (multiselect) array of strings + } + if (cvtBack) { + sourceValue = cvtBack.call(tag, sourceValue); + } - // Set linkCtx on view, dynamically, just during this handler call - oldLinkCtx = view.linkCtx; - view.linkCtx = linkCtx; - eventArgs = { - change: "change", - oldValue: linkCtx._val, - value: sourceValue - }; - if ((!onBeforeChange || !(cancel = onBeforeChange.call(linkCtx, ev, eventArgs) === false)) && - (!tag || !tag.onBeforeChange || !(cancel = tag.onBeforeChange(ev, eventArgs) === false)) && - sourceValue !== undefined) { - target = to[0]; // [object, path] - if (sourceValue !== undefined && target) { - if (target._jsv) { - exprOb = target; - target = linkCtx.data; - while (exprOb && exprOb.sb) { - target = linkCtx._ctxCb(exprOb, target); - exprOb = exprOb.sb; - } - } - if (tag) { - tag._.chging = true; // marker to prevent tag change event triggering its own refresh + // Set linkCtx on view, dynamically, just during this handler call + oldLinkCtx = view.linkCtx; + view.linkCtx = linkCtx; + eventArgs = { + change: "change", + oldValue: linkCtx._val, + value: sourceValue + }; + if ((!onBeforeChange || !(cancel = onBeforeChange.call(linkCtx, ev, eventArgs) === false)) && + (!tag || !tag.onBeforeChange || !(cancel = tag.onBeforeChange(ev, eventArgs) === false)) && + sourceValue !== undefined) { + target = to[0]; // [object, path] + if (sourceValue !== undefined && target) { + if (target._jsv) { + contextCb = linkCtx._ctxCb; // This is a computed value + exprOb = target; + target = linkCtx.data; + if (exprOb._cpCtx) { // Computed value for a contextual parameter + target = exprOb.data; // The data for the contextual view (where contextual param expression evaluated/assigned) + contextCb = exprOb._cpCtx; // Context callback for contextual view } - $observable(target).setProperty(to[1], sourceValue); // 2way binding change event - observably updating bound object - if (onAfterChange) { - onAfterChange.call(linkCtx, ev, eventArgs); + while (exprOb && exprOb.sb) { // Step through chained computed values to leaf one... + target = contextCb(exprOb, target); + exprOb = exprOb.sb; } - if (tag) { - if (tag.onAfterChange) { - tag.onAfterChange(ev, eventArgs); - } - tag._.chging = undefined; // clear the marker + } + if (tag) { + tag._.chging = true; // marker to prevent tag change event triggering its own refresh + } + $observable(target).setProperty(to[1], sourceValue); // 2way binding change event - observably updating bound object + if (onAfterChange) { + onAfterChange.call(linkCtx, ev, eventArgs); + } + if (tag) { + if (tag.onAfterChange) { + tag.onAfterChange(ev, eventArgs); } - linkCtx._val = sourceValue; + tag._.chging = undefined; // clear the marker } + linkCtx._val = sourceValue; } - view.linkCtx = oldLinkCtx; } + view.linkCtx = oldLinkCtx; } } } @@ -4108,8 +4123,8 @@ function addBindingMarkers(value, view, tag) { // observeAndBind //--------------- -function observeAndBind(linkCtx, source, target) { //TODO? linkFnArgs) {; - var binding, l, linkedElem, exprFnDeps, exprOb, +function observeAndBind(linkCtx, source, target) { + var binding, l, k, linkedElem, exprFnDeps, exprOb, prop, propDeps, tag = linkCtx.tag, cvtBk = linkCtx.convertBack, depends = [], @@ -4134,6 +4149,22 @@ function observeAndBind(linkCtx, source, target) { //TODO? linkFnArgs) {; exprFnDeps = linkCtx.fn.deps.slice(); // Make a copy of the dependency paths for the compiled linkCtx expression - to pass to observe(). In getInnerCb(), // (and whenever the object is updated, in innerCb), we will set exprOb.ob to the current object returned by that computed expression, for this view. + + if (tag && tag.boundProps) { + // Add dependency paths for declared boundProps (so no need to writh ^myprop=... to get binding) and for linkedProp too if there is one + l = tag.boundProps.length; + while (l--) { + prop = tag.boundProps[l]; + k = tag._.bnd.paths.length; + while (k--) { + propDeps = tag._.bnd.paths[k][prop]; + if (propDeps && propDeps.skp) { // Not already a bound prop ^prop=expression; + exprFnDeps = exprFnDeps.concat(propDeps); // Add dependencies for this prop expression + } + } + } + } + l = exprFnDeps.length; while (l--) { exprOb = exprFnDeps[l]; @@ -5002,7 +5033,7 @@ function bindDataLinkTarget(linkCtx, linkFn) { $sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx), "link", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers)); } - linkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]} + linkCtx._ctxCb = $sub._gccb(linkCtx.view); // getContextCallback: _ctxCb, for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]} linkCtx._hdl = handler; // handler._ctx = linkCtx; Could pass linkCtx for use in a depends = function() {} call, so depends is different for different linkCtx's handler(true); @@ -5123,9 +5154,9 @@ function callAfterLink(tag, ev, eventArgs) { linkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem; displayElem = tag.displayElem || linkedElem; -if (linkedElem && linkedElem[0]) { - if (!tag._.chging) { - val = tag.cvtArgs()[0]; + if (linkedElem && linkedElem[0]) { + val = tag.cvtArgs()[0]; + if (val !== undefined && !tag._.chging) { l = linkedElem.length; while (l--) { linkedEl = linkedElem[l]; @@ -5147,7 +5178,7 @@ if (linkedElem && linkedElem[0]) { } else if (linkedEl.type === RADIO) { linkedEl[CHECKED] = (linkedEl.value === val); } else { - linkedEl.value = val; + $(linkedEl).val(val); // Use jQuery for attrHooks - can't just set value (on select, for example) } } else if (linkedEl.contentEditable === TRUE) { linkedEl.innerHTML = val; @@ -5203,14 +5234,15 @@ function bindTo(binding, tag, linkedElem, cvtBk) { // So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, "d.e"], and we bind to the path on the returned object, exprOb.ob, as target // Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z - var bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, totry, + var bindto, pathIndex, path, lastPath, bindtoOb, $linkedElem, newTrig, oldTrig, to, l, linkCtx = binding.linkCtx, + contextCb = linkCtx._ctxCb, source = linkCtx.data, - paths = linkCtx.fn.paths; + paths = linkCtx.fn.paths[0]; tag = tag || linkedElem._jsvLkEl; - if (binding && paths && !binding.to) { + if (binding && paths && !binding.to) { oldTrig = linkedElem._jsvTr || false; if (tag) { cvtBk = tag.convertBack || cvtBk; @@ -5231,8 +5263,7 @@ function bindTo(binding, tag, linkedElem, cvtBk) { } paths = (bindto = paths._jsvto) || paths[0]; - pathIndex = paths && paths.length; - if (pathIndex && (!tag || tag.tagCtx.args.length)) { + if (pathIndex = paths && paths.length) { lastPath = paths[pathIndex - 1]; if (lastPath._jsv) { bindtoOb = lastPath; @@ -5248,15 +5279,18 @@ function bindTo(binding, tag, linkedElem, cvtBk) { lastPath ]; } else { - while ((totry = linkCtx._ctxCb(path = lastPath.split("^").join("."), source)) && (l = totry.length)) { + while ((to = contextCb(path = lastPath.split("^").join("."), source)) && (l = to.length)) { // Recursively dereference any ~foo or #bar tokens in the path. (Recursive because ~foo may be a contextual param which has // its own dependencies on other ~foo #bar components) - to = totry; - if (to._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag) - to = [to[l-3], to[l-2]]; + if (to[0]._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag) + to = to[0]; // so 'to' is the [view, expression/dependencies] for the contextual parameter + contextCb = $sub._gccb(to[0]); // getContextCallback: Move contextCb up to view where contextual parameter was assigned lastPath = to[1]; - if (lastPath._jsv) { + to = [to[0].data, to[1]]; + if (lastPath._jsv) { // computed value bindtoOb = lastPath; + bindtoOb.data = to[0]; + bindtoOb._cpCtx = contextCb; while (lastPath.sb && lastPath.sb._jsv) { path = lastPath = lastPath.sb; } @@ -5449,64 +5483,6 @@ function $unlink(to) { // Helpers //======== -function getContextCb(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc. - // TODO Consider exposing or allowing override, as public API - return function(path, object, depth) { - // TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on - // the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times - var tokens, tag, items, helper, last, nextPath, l; - if (view && path) { - if (path._jsv) { - return path._jsv.call(view.tmpl, object, view, $sub); - } - if (path.charAt(0) === "~") { - // We return new items to insert into the sequence, replacing the "~a.b.c" string: - // [helperObject 'a', "a.b.c" currentDataItem] so currentDataItem becomes the object for subsequent paths. - if (path.slice(0, 4) === "~tag") { - tag = view.ctx; - if (path.charAt(4) === ".") { - // "~tag.xxx" - tokens = path.slice(5).split("."); - tag = tag.tag; - } - if (tokens) { - return tag ? [tag, tokens.join("."), object] : []; - } - } - path = path.slice(1).split("."); - if (helper = view.hlp(last = path.shift(), true)) { - if (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [data, ctxPrmDependencies ...] - if (path.length) { - nextPath = "." + path.join("."); - last = helper[l = helper.length-1]; - if (last._jsv) { - last.sb = nextPath; - last.bnd = !!depth; - } else { - helper[l] = (last + nextPath).replace("#data.", ""); - if (last.slice(0, 5) === "#view") { - helper[l] = helper[l].slice(6); - helper.splice(l, 0, view); - } - } - } - helper.push(object); - items = helper; - } else if (path.length || $isFunction(helper)) { - items = [helper, path.join("."), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam - } - } - return items || []; - } - if (path.charAt(0) === "#") { - // We return new items to insert into the sequence, replacing the "#a.b.c" string: [view, "a.b.c" currentDataItem] - // so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes. - return path === "#data" ? [] : [view, path.replace(rViewPath, ""), object]; - } - } - }; -} - function inputAttrib(elem) { return elem.type === CHECKBOX ? elem[CHECKED] : elem.value; } @@ -6461,6 +6437,63 @@ $sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each refe return clones; }; +$sub._gccb = function(view) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc. + // TODO Consider exposing or allowing override, as public API + return function(path, object, depth) { + // TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on + // the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times + var tokens, tag, items, helper, last, nextPath, l; + if (view && path) { + if (path._jsv) { + return path._jsv.call(view.tmpl, object, view, $sub); + } + if (path.charAt(0) === "~") { + // We return new items to insert into the sequence, replacing the "~a.b.c" string: + // [helperObject 'a', "a.b.c" currentDataItem] so currentDataItem becomes the object for subsequent paths. + if (path.slice(0, 4) === "~tag") { + tag = view.ctx; + if (path.charAt(4) === ".") { + // "~tag.xxx" + tokens = path.slice(5).split("."); + tag = tag.tag; + } + if (tokens) { + return tag ? [tag, tokens.join("."), object] : []; + } + } + path = path.slice(1).split("."); + if (helper = view.hlp(last = path.shift(), true)) { + if (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [view, ctxPrmDependencies ...] + if (path.length) { + nextPath = "." + path.join("."); + last = helper[l = helper.length-1]; + if (last._jsv) { + last.sb = nextPath; + last.bnd = !!depth; + } else { + helper[l] = (last + nextPath).replace("#data.", ""); + if (last.slice(0, 5) === "#view") { + helper[l] = helper[l].slice(6); + helper.splice(l, 0, view); + } + } + } + items = [helper]; // Contextual parameter + } else if (path.length || $isFunction(helper)) { + items = [helper, path.join("."), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam + } + } + return items || []; + } + if (path.charAt(0) === "#") { + // We return new items to insert into the sequence, replacing the "#a.b.c" string: [view, "a.b.c" currentDataItem] + // so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes. + return path === "#data" ? [] : [view, path.replace(rViewPath, ""), object]; + } + } + }; +}; + //========================= // Extend $.views.settings //========================= @@ -6468,7 +6501,7 @@ $sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each refe oldAdvSet = $sub.advSet; $sub.advSet = function() { // refresh advanced settings - oldAdvSet(); + oldAdvSet.call($sub); global._jsv = $subSettingsAdvanced._jsv ? $extend(global._jsv || {}, { // create global _jsv, for accessing views, etc views: viewStore, @@ -15732,7 +15765,7 @@ return jQuery; })); },{}],3:[function(require,module,exports){ -/*! JsRender v0.9.82 (Beta): http://jsviews.com/#jsrender */ +/*! JsRender v0.9.83 (Beta): http://jsviews.com/#jsrender */ /*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ /* * Best-of-breed templating in browser or on Node.js. @@ -15778,7 +15811,7 @@ var setGlobals = $ === false; // Only set globals if script block in browser (no $ = $ && $.fn ? $ : global.jQuery; // $ is jQuery passed in by CommonJS loader (Browserify), or global jQuery. -var versionNumber = "v0.9.82", +var versionNumber = "v0.9.83", jsvStoreName, rTag, rTmplString, topView, $views, $expando, //TODO tmplFnsCache = {}, @@ -16086,9 +16119,9 @@ function getHelper(helper, isContextCb) { res = $helpers[helper]; } if (res && res._cp) { // If this helper resource is a contextual parameter, ~foo=expr - if (isContextCb) { // In a context callback for a contextual param, return the [currentData, dependencies...] array - needed for observe call + if (isContextCb) { // In a context callback for a contextual param, return the [view, dependencies...] array - needed for observe call deps = $sub._ceo(res[1].deps); // fn deps, with any exprObs cloned - deps.unshift(res[0].data); // view.data + deps.unshift(res[0]); // view deps._cp = true; return deps; } @@ -16361,7 +16394,7 @@ function renderTag(tagName, parentView, tmpl, tagCtxs, isUpdate, onError) { if (itemRet === undefined) { contentCtx = args[0]; // Default data context for wrapped block content is the first argument. Defined tag.contentCtx function to override this. if (tag.contentCtx) { - contentCtx = tag.contentCtx(contentCtx) || contentCtx; + contentCtx = tag.contentCtx(contentCtx); } itemRet = tagCtx.render(contentCtx, true) || (isUpdate ? undefined : ""); } @@ -17447,15 +17480,15 @@ function setPaths(fn, pathsArr) { i = 0, l = pathsArr.length; fn.deps = []; + fn.paths = []; // The array of path binding (array/dictionary)s for each tag/else block's args and props for (; i < l; i++) { - paths = pathsArr[i]; + fn.paths.push(paths = pathsArr[i]); for (key in paths) { - if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length) { + if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length && !paths[key].skp) { fn.deps = fn.deps.concat(paths[key]); // deps is the concatenation of the paths arrays for the different bindings } } } - fn.paths = paths; // The array of paths arrays for the different bindings } function parsedParam(args, props, ctx) { @@ -17612,7 +17645,8 @@ function parseParams(params, pathBindings, tmpl) { ) : eq // named param. Remove bindings for arg and create instead bindings array for prop - ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, bound && (bindings = bndCtx.bd = pathBindings[named] = []), path + ':') + ? (parenDepth && syntaxError(params), bindings && pathBindings.pop(), named = path, boundName = bound, paramIndex = index + all.length, + bindings && ((bindings = bndCtx.bd = pathBindings[named] = []), bindings.skp = !bound), path + ':') : path // path ? (path.split("^").join(".").replace(rPath, parsePath) @@ -17882,7 +17916,7 @@ function getTargetProps(source) { } function $fnRender(data, context, noIteration) { - var tmplElem = this.jquery && (this[0] || error('Unknown template: "' + this.selector + '"')), + var tmplElem = this.jquery && (this[0] || error('Unknown template')), // Targeted element not found for jQuery template selector such as "#myTmpl" tmpl = tmplElem.getAttribute(tmplAttr); return renderContent.call(tmpl ? $.data(tmplElem)[jsvTmpl] : $templates(tmplElem), data, context, noIteration); @@ -18151,4 +18185,4 @@ module.exports = $ ? $.templates("./test/templates/name-template.html", mkup) : }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}]},{},[4]) -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqc3ZpZXdzLmpzIiwibm9kZV9tb2R1bGVzL2pxdWVyeS9kaXN0L2pxdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9qc3JlbmRlci9qc3JlbmRlci5qcyIsInRlc3QvYnJvd3NlcmlmeS84Qi11bml0LXRlc3RzLmpzIiwidGVzdC90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdjNNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxL1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3eUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qISBqc3ZpZXdzLmpzIHYwLjkuODIgKEJldGEpIHNpbmdsZS1maWxlIHZlcnNpb246IGh0dHA6Ly9qc3ZpZXdzLmNvbS8gKi9cbi8qISBpbmNsdWRlcyBKc1JlbmRlciwgSnNPYnNlcnZhYmxlIGFuZCBKc1ZpZXdzIC0gc2VlOiBodHRwOi8vanN2aWV3cy5jb20vI2Rvd25sb2FkICovXG5cbi8qIEludGVyYWN0aXZlIGRhdGEtZHJpdmVuIHZpZXdzIHVzaW5nIEpzUmVuZGVyIHRlbXBsYXRlcyAqL1xuXG4vLzw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCBKc1JlbmRlciA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbi8qIEpzUmVuZGVyOlxuICogU2VlIGh0dHA6Ly9qc3ZpZXdzLmNvbS8janNyZW5kZXIgYW5kIGh0dHA6Ly9naXRodWIuY29tL0JvcmlzTW9vcmUvanNyZW5kZXJcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vanNoaW50IC1XMDE4LCAtVzA0MVxuXG4oZnVuY3Rpb24oZmFjdG9yeSwgZ2xvYmFsKSB7XG5cdC8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG5cdHZhciAkID0gZ2xvYmFsLmpRdWVyeTtcblxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHsgLy8gQ29tbW9uSlMgZS5nLiBCcm93c2VyaWZ5XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSAkXG5cdFx0XHQ/IGZhY3RvcnkoZ2xvYmFsLCAkKVxuXHRcdFx0OiBmdW5jdGlvbigkKSB7IC8vIElmIG5vIGdsb2JhbCBqUXVlcnksIHRha2UgalF1ZXJ5IHBhc3NlZCBhcyBwYXJhbWV0ZXI6IHJlcXVpcmUoXCJqc3ZpZXdzXCIpKGpRdWVyeSlcblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoZ2xvYmFsLCAkKTtcblx0XHRcdH07XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHsgLy8gQU1EIHNjcmlwdCBsb2FkZXIsIGUuZy4gUmVxdWlyZUpTXG5cdFx0ZGVmaW5lKFtcImpxdWVyeVwiXSwgZnVuY3Rpb24oJCkge1xuXHRcdFx0cmV0dXJuIGZhY3RvcnkoZ2xvYmFsLCAkKTtcblx0XHR9KTsgLy8gUmVxdWlyZSBqUXVlcnlcblx0fSBlbHNlIHsgLy8gQnJvd3NlciB1c2luZyBwbGFpbiA8c2NyaXB0PiB0YWdcblx0XHRmYWN0b3J5KGdsb2JhbCwgZmFsc2UpO1xuXHR9XG59IChcblxuLy8gZmFjdG9yeSAoZm9yIGpzdmlld3MuanMpXG5mdW5jdGlvbihnbG9iYWwsICQpIHtcblwidXNlIHN0cmljdFwiO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCB2YXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG52YXIgc2V0R2xvYmFscyA9ICQgPT09IGZhbHNlOyAvLyBPbmx5IHNldCBnbG9iYWxzIGlmIHNjcmlwdCBibG9jayBpbiBicm93c2VyIChub3QgQU1EIGFuZCBub3QgQ29tbW9uSlMpXG5cbiQgPSAkIHx8IGdsb2JhbC5qUXVlcnk7IC8vICQgaXMgalF1ZXJ5IHBhc3NlZCBpbiBieSBDb21tb25KUyBsb2FkZXIgKEJyb3dzZXJpZnkpLCBvciBnbG9iYWwgalF1ZXJ5LlxuXG5pZiAoISQgfHwgISQuZm4pIHtcblx0Ly8galF1ZXJ5IGlzIG5vdCBsb2FkZWQuXG5cdHRocm93IFwiSnNWaWV3cyByZXF1aXJlcyBqUXVlcnlcIjsgLy8gV2UgcmVxdWlyZSBqUXVlcnlcbn1cblxudmFyIHZlcnNpb25OdW1iZXIgPSBcInYwLjkuODJcIixcblxuXHRqc3ZTdG9yZU5hbWUsIHJUYWcsIHJUbXBsU3RyaW5nLCB0b3BWaWV3LCAkdmlld3MsICRvYnNlcnZlLCAkb2JzZXJ2YWJsZSwgJGV4cGFuZG8sXG5cbi8vVE9ET1x0dG1wbEZuc0NhY2hlID0ge30sXG5cdCRpc0Z1bmN0aW9uLCAkaXNBcnJheSwgJHRlbXBsYXRlcywgJGNvbnZlcnRlcnMsICRoZWxwZXJzLCAkdGFncywgJHN1YiwgJHN1YlNldHRpbmdzLCAkc3ViU2V0dGluZ3NBZHZhbmNlZCwgJHZpZXdzU2V0dGluZ3MsIGRlbGltT3BlbkNoYXIwLCBkZWxpbU9wZW5DaGFyMSwgZGVsaW1DbG9zZUNoYXIwLCBkZWxpbUNsb3NlQ2hhcjEsIGxpbmtDaGFyLCBzZXR0aW5nLCBiYXNlT25FcnJvcixcblxuXHRyUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHQvLyAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cblx0clBhcmFtcyA9IC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICAgICAgICAgbGZ0UHJuMCAgICAgICAgbGZ0UHJuICAgICAgICBib3VuZCAgICAgICAgICAgIHBhdGggICAgb3BlcmF0b3IgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgICAgICAgICAgICAgcGF0aDIgICAgICAgcHJuICAgIGNvbW1hICAgbGZ0UHJuMiAgIGFwb3MgcXVvdCAgICAgIHJ0UHJuIHJ0UHJuRG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuMiAgc3BhY2Vcblx0Ly8gKGxlZnQgcGFyZW4/IGZvbGxvd2VkIGJ5IChwYXRoPyBmb2xsb3dlZCBieSBvcGVyYXRvcikgb3IgKHBhdGggZm9sbG93ZWQgYnkgbGVmdCBwYXJlbj8pKSBvciBjb21tYSBvciBhcG9zIG9yIHF1b3Qgb3IgcmlnaHQgcGFyZW4gb3Igc3BhY2VcblxuXHRpc1JlbmRlckNhbGwsXG5cdHJOZXdMaW5lID0gL1sgXFx0XSooXFxyXFxufFxcbnxcXHIpL2csXG5cdHJVbmVzY2FwZVF1b3RlcyA9IC9cXFxcKFsnXCJdKS9nLFxuXHRyRXNjYXBlUXVvdGVzID0gL1snXCJcXFxcXS9nLCAvLyBFc2NhcGUgcXVvdGVzIGFuZCBcXCBjaGFyYWN0ZXJcblx0ckJ1aWxkSGFzaCA9IC8oPzpcXHgwOHxeKShvbmVycm9yOik/KD86KH4/KSgoW1xcdyRfXFwuXSspOik/KFteXFx4MDhdKykpXFx4MDgoLCk/KFteXFx4MDhdKykvZ2ksXG5cdHJUZXN0RWxzZUlmID0gL15pZlxccy8sXG5cdHJGaXJzdEVsZW0gPSAvPChcXHcrKVs+XFxzXS8sXG5cdHJBdHRyRW5jb2RlID0gL1tcXHgwMGA+PFwiJyY9XS9nLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdHJJc0h0bWwgPSAvW1xceDAwYD48XFxcIicmPV0vLFxuXHRySGFzSGFuZGxlcnMgPSAvXm9uW0EtWl18XmNvbnZlcnQoQmFjayk/JC8sXG5cdHJXcmFwcGVkSW5WaWV3TWFya2VyID0gL15cXCNcXGQrX2BbXFxzXFxTXSpcXC9cXGQrX2AkLyxcblx0ckh0bWxFbmNvZGUgPSByQXR0ckVuY29kZSxcblx0dmlld0lkID0gMCxcblx0Y2hhckVudGl0aWVzID0ge1xuXHRcdFwiJlwiOiBcIiZhbXA7XCIsXG5cdFx0XCI8XCI6IFwiJmx0O1wiLFxuXHRcdFwiPlwiOiBcIiZndDtcIixcblx0XHRcIlxceDAwXCI6IFwiJiMwO1wiLFxuXHRcdFwiJ1wiOiBcIiYjMzk7XCIsXG5cdFx0J1wiJzogXCImIzM0O1wiLFxuXHRcdFwiYFwiOiBcIiYjOTY7XCIsXG5cdFx0XCI9XCI6IFwiJiM2MTtcIlxuXHR9LFxuXHRIVE1MID0gXCJodG1sXCIsXG5cdE9CSkVDVCA9IFwib2JqZWN0XCIsXG5cdHRtcGxBdHRyID0gXCJkYXRhLWpzdi10bXBsXCIsXG5cdGpzdlRtcGwgPSBcImpzdlRtcGxcIixcblx0aW5kZXhTdHIgPSBcIkZvciAjaW5kZXggaW4gbmVzdGVkIGJsb2NrIHVzZSAjZ2V0SW5kZXgoKS5cIixcblx0JHJlbmRlciA9IHt9LFxuXG5cdGpzciA9IGdsb2JhbC5qc3JlbmRlcixcblx0anNyVG9KcSA9IGpzciAmJiAkICYmICEkLnJlbmRlciwgLy8gSnNSZW5kZXIgYWxyZWFkeSBsb2FkZWQsIHdpdGhvdXQgalF1ZXJ5LiBidXQgd2Ugd2lsbCByZS1sb2FkIGl0IG5vdyB0byBhdHRhY2ggdG8galF1ZXJ5XG5cblx0anN2U3RvcmVzID0ge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVG1wbFxuXHRcdH0sXG5cdFx0dGFnOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVGFnXG5cdFx0fSxcblx0XHR2aWV3TW9kZWw6IHtcblx0XHRcdGNvbXBpbGU6IGNvbXBpbGVWaWV3TW9kZWxcblx0XHR9LFxuXHRcdGhlbHBlcjoge30sXG5cdFx0Y29udmVydGVyOiB7fVxuXHR9O1xuXG5cdC8vIHZpZXdzIG9iamVjdCAoJC52aWV3cyBpZiBqUXVlcnkgaXMgbG9hZGVkLCBqc3JlbmRlci52aWV3cyBpZiBubyBqUXVlcnksIGUuZy4gaW4gTm9kZS5qcylcblx0JHZpZXdzID0ge1xuXHRcdGpzdmlld3M6IHZlcnNpb25OdW1iZXIsXG5cdFx0c3ViOiB7XG5cdFx0XHQvLyBzdWJzY3JpcHRpb24sIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0VmlldzogVmlldyxcblx0XHRcdEVycjogSnNWaWV3c0Vycm9yLFxuXHRcdFx0dG1wbEZuOiB0bXBsRm4sXG5cdFx0XHRwYXJzZTogcGFyc2VQYXJhbXMsXG5cdFx0XHRleHRlbmQ6ICRleHRlbmQsXG5cdFx0XHRleHRlbmRDdHg6IGV4dGVuZEN0eCxcblx0XHRcdHN5bnRheEVycjogc3ludGF4RXJyb3IsXG5cdFx0XHRvblN0b3JlOiB7fSxcblx0XHRcdGFkZFNldHRpbmc6IGFkZFNldHRpbmcsXG5cdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRhbGxvd0NvZGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0YWR2U2V0OiBub29wLCAvLyBVcGRhdGUgYWR2YW5jZWQgc2V0dGluZ3Ncblx0XHRcdF90aHM6IHRhZ0hhbmRsZXJzRnJvbVByb3BzLFxuXHRcdFx0X3RnOiBmdW5jdGlvbigpIHt9LCAvLyBDb25zdHJ1Y3RvciBmb3IgdGFnRGVmXG5cdFx0XHRfY252dDogY29udmVydFZhbCxcblx0XHRcdF90YWc6IHJlbmRlclRhZyxcblx0XHRcdF9lcjogZXJyb3IsXG5cdFx0XHRfZXJyOiBvblJlbmRlckVycm9yLFxuXHRcdFx0X2h0bWw6IGh0bWxFbmNvZGUsXG5cdFx0XHRfY3A6IHJldFZhbCwgLy8gR2V0IGNvbXBpbGVkIGNvbnRleHR1YWwgcGFyYW1ldGVycyAob3IgcHJvcGVydGllcykgfmZvbz1leHByLiBJbiBKc1JlbmRlciwgc2ltcGx5IHJldHVybnMgdmFsLlxuXHRcdFx0X3NxOiBmdW5jdGlvbih0b2tlbikge1xuXHRcdFx0XHRpZiAodG9rZW4gPT09IFwiY29uc3RydWN0b3JcIikge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0b2tlbjtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNldHRpbmdzOiB7XG5cdFx0XHRkZWxpbWl0ZXJzOiAkdmlld3NEZWxpbWl0ZXJzLFxuXHRcdFx0YWR2YW5jZWQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZVxuXHRcdFx0XHRcdD8gKFxuXHRcdFx0XHRcdFx0XHQkZXh0ZW5kKCRzdWJTZXR0aW5nc0FkdmFuY2VkLCB2YWx1ZSksXG5cdFx0XHRcdFx0XHRcdCRzdWIuYWR2U2V0KCksXG5cdFx0XHRcdFx0XHRcdCR2aWV3c1NldHRpbmdzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6ICRzdWJTZXR0aW5nc0FkdmFuY2VkO1xuXHRcdFx0XHR9XG5cdFx0fSxcblx0XHRnZXRDdHg6IHJldFZhbCwgLy8gR2V0IGN0eC5mb28gdmFsdWUuIEluIEpzUmVuZGVyLCBzaW1wbHkgcmV0dXJucyB2YWwuXG5cdFx0bWFwOiBkYXRhTWFwICAgIC8vIElmIGpzT2JzZXJ2YWJsZSBsb2FkZWQgZmlyc3QsIHVzZSB0aGF0IGRlZmluaXRpb24gb2YgZGF0YU1hcFxuXHR9O1xuXG5mdW5jdGlvbiBnZXREZXJpdmVkTWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJldCxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRwcmV2QmFzZSA9IHRhZy5iYXNlO1xuXG5cdFx0dGFnLmJhc2UgPSBiYXNlTWV0aG9kOyAvLyBXaXRoaW4gbWV0aG9kIGNhbGwsIGNhbGxpbmcgdGhpcy5iYXNlIHdpbGwgY2FsbCB0aGUgYmFzZSBtZXRob2Rcblx0XHRyZXQgPSBtZXRob2QuYXBwbHkodGFnLCBhcmd1bWVudHMpOyAvLyBDYWxsIHRoZSBtZXRob2Rcblx0XHR0YWcuYmFzZSA9IHByZXZCYXNlOyAvLyBSZXBsYWNlIHRoaXMuYmFzZSB0byBiZSB0aGUgYmFzZSBtZXRob2Qgb2YgdGhlIHByZXZpb3VzIGNhbGwsIGZvciBjaGFpbmVkIGNhbGxzXG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0TWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHQvLyBGb3IgZGVyaXZlZCBtZXRob2RzIChvciBoYW5kbGVycyBkZWNsYXJlZCBkZWNsYXJhdGl2ZWx5IGFzIGluIHt7OmZvbyBvbkNoYW5nZT1+Zm9vQ2hhbmdlZH19IHJlcGxhY2UgYnkgYSBkZXJpdmVkIG1ldGhvZCwgdG8gYWxsb3cgdXNpbmcgdGhpcy5iYXNlKC4uLilcblx0Ly8gb3IgdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSB0byBjYWxsIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLiAoRXF1aXZhbGVudCB0byB0aGlzLl9zdXBlciguLi4pIGFuZCB0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cykgaW4galF1ZXJ5IFVJKVxuXHRpZiAoJGlzRnVuY3Rpb24obWV0aG9kKSkge1xuXHRcdG1ldGhvZCA9IGdldERlcml2ZWRNZXRob2QoXG5cdFx0XHRcdCFiYXNlTWV0aG9kXG5cdFx0XHRcdFx0PyBub29wIC8vIG5vIGJhc2UgbWV0aG9kIGltcGxlbWVudGF0aW9uLCBzbyB1c2Ugbm9vcCBhcyBiYXNlIG1ldGhvZFxuXHRcdFx0XHRcdDogYmFzZU1ldGhvZC5fZFxuXHRcdFx0XHRcdFx0PyBiYXNlTWV0aG9kIC8vIGJhc2VNZXRob2QgaXMgYSBkZXJpdmVkIG1ldGhvZCwgc28gdXMgaXRcblx0XHRcdFx0XHRcdDogZ2V0RGVyaXZlZE1ldGhvZChub29wLCBiYXNlTWV0aG9kKSwgLy8gYmFzZU1ldGhvZCBpcyBub3QgZGVyaXZlZCBzbyBtYWtlIGl0cyBiYXNlIG1ldGhvZCBiZSB0aGUgbm9vcCBtZXRob2Rcblx0XHRcdFx0bWV0aG9kXG5cdFx0XHQpO1xuXHRcdG1ldGhvZC5fZCA9IDE7IC8vIEFkZCBmbGFnIHRoYXQgdGhpcyBpcyBhIGRlcml2ZWQgbWV0aG9kXG5cdH1cblx0cmV0dXJuIG1ldGhvZDtcbn1cblxuZnVuY3Rpb24gdGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHgpIHtcblx0Zm9yICh2YXIgcHJvcCBpbiB0YWdDdHgucHJvcHMpIHtcblx0XHRpZiAockhhc0hhbmRsZXJzLnRlc3QocHJvcCkpIHtcblx0XHRcdHRhZ1twcm9wXSA9IGdldE1ldGhvZCh0YWdbcHJvcF0sIHRhZ0N0eC5wcm9wc1twcm9wXSk7XG5cdFx0XHQvLyBDb3B5IG92ZXIgdGhlIG9uRm9vIHByb3BzLCBjb252ZXJ0IGFuZCBjb252ZXJ0QmFjayBmcm9tIHRhZ0N0eC5wcm9wcyB0byB0YWcgKG92ZXJyaWRlcyB2YWx1ZXMgaW4gdGFnRGVmKS5cblx0XHRcdC8vIE5vdGU6IHVuc3VwcG9ydGVkIHNjZW5hcmlvOiBpZiBoYW5kbGVycyBhcmUgZHluYW1pY2FsbHkgYWRkZWQgXm9uRm9vPWV4cHJlc3Npb24gdGhpcyB3aWxsIHdvcmssIGJ1dCBkeW5hbWljYWxseSByZW1vdmluZyB3aWxsIG5vdCB3b3JrLlxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiByZXRWYWwodmFsKSB7XG5cdHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7XG5cdHJldHVybiBcIlwiO1xufVxuXG5mdW5jdGlvbiBkYmdCcmVhayh2YWwpIHtcblx0Ly8gVXNhZ2UgZXhhbXBsZXM6IHt7ZGJnOi4uLn19LCB7ezp+ZGJnKC4uLil9fSwge3tkYmcgLi4uL319LCB7Xntmb3IgLi4uIG9uQWZ0ZXJMaW5rPX5kYmd9fSBldGMuXG5cdHRyeSB7XG5cdFx0Y29uc29sZS5sb2coXCJKc1JlbmRlciBkYmcgYnJlYWtwb2ludDogXCIgKyB2YWwpO1xuXHRcdHRocm93IFwiZGJnIGJyZWFrcG9pbnRcIjsgLy8gVG8gYnJlYWsgaGVyZSwgc3RvcCBvbiBjYXVnaHQgZXhjZXB0aW9ucy5cblx0fVxuXHRjYXRjaCAoZSkge31cblx0cmV0dXJuIHRoaXMuYmFzZSA/IHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgOiB2YWw7XG59XG5cbmZ1bmN0aW9uIEpzVmlld3NFcnJvcihtZXNzYWdlKSB7XG5cdC8vIEVycm9yIGV4Y2VwdGlvbiB0eXBlIGZvciBKc1ZpZXdzL0pzUmVuZGVyXG5cdC8vIE92ZXJyaWRlIG9mICQudmlld3Muc3ViLkVycm9yIGlzIHBvc3NpYmxlXG5cdHRoaXMubmFtZSA9ICgkLmxpbmsgPyBcIkpzVmlld3NcIiA6IFwiSnNSZW5kZXJcIikgKyBcIiBFcnJvclwiO1xuXHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IHRoaXMubmFtZTtcbn1cblxuZnVuY3Rpb24gJGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuXHRmb3IgKHZhciBuYW1lIGluIHNvdXJjZSkge1xuXHRcdHRhcmdldFtuYW1lXSA9IHNvdXJjZVtuYW1lXTtcblx0fVxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4oSnNWaWV3c0Vycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpKS5jb25zdHJ1Y3RvciA9IEpzVmlld3NFcnJvcjtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vPT09PT09PT09PT09PT09PT09PVxuLy8gdmlld3MuZGVsaW1pdGVyc1xuLy89PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uICR2aWV3c0RlbGltaXRlcnMob3BlbkNoYXJzLCBjbG9zZUNoYXJzLCBsaW5rKSB7XG5cdC8vIFNldCB0aGUgdGFnIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyBhbmQgJ2xpbmsnIGNoYXJhY3Rlci4gRGVmYXVsdCBpcyBcInt7XCIsIFwifX1cIiBhbmQgXCJeXCJcblx0Ly8gb3BlbkNoYXJzLCBjbG9zZUNoYXJzOiBvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MsIGVhY2ggd2l0aCB0d28gY2hhcmFjdGVyc1xuXHRpZiAoIW9wZW5DaGFycykge1xuXHRcdHJldHVybiAkc3ViU2V0dGluZ3MuZGVsaW1pdGVycztcblx0fVxuXHRpZiAoJGlzQXJyYXkob3BlbkNoYXJzKSkge1xuXHRcdHJldHVybiAkdmlld3NEZWxpbWl0ZXJzLmFwcGx5KCR2aWV3cywgb3BlbkNoYXJzKTtcblx0fVxuXG5cdCRzdWJTZXR0aW5ncy5kZWxpbWl0ZXJzID0gW29wZW5DaGFycywgY2xvc2VDaGFycywgbGlua0NoYXIgPSBsaW5rID8gbGluay5jaGFyQXQoMCkgOiBsaW5rQ2hhcl07XG5cblx0ZGVsaW1PcGVuQ2hhcjAgPSBvcGVuQ2hhcnMuY2hhckF0KDApOyAvLyBFc2NhcGUgdGhlIGNoYXJhY3RlcnMgLSBzaW5jZSB0aGV5IGNvdWxkIGJlIHJlZ2V4IHNwZWNpYWwgY2hhcmFjdGVyc1xuXHRkZWxpbU9wZW5DaGFyMSA9IG9wZW5DaGFycy5jaGFyQXQoMSk7XG5cdGRlbGltQ2xvc2VDaGFyMCA9IGNsb3NlQ2hhcnMuY2hhckF0KDApO1xuXHRkZWxpbUNsb3NlQ2hhcjEgPSBjbG9zZUNoYXJzLmNoYXJBdCgxKTtcblx0b3BlbkNoYXJzID0gXCJcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxOyAvLyBEZWZhdWx0IGlzIFwie157XCJcblx0Y2xvc2VDaGFycyA9IFwiXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCJcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjE7ICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgXCJ9fVwiXG5cdC8vIEJ1aWxkIHJlZ2V4IHdpdGggbmV3IGRlbGltaXRlcnNcblx0Ly8gICAgICAgICAgW3RhZyAgICAoZm9sbG93ZWQgYnkgLyBzcGFjZSBvciB9KSAgb3IgY3Z0citjb2xvbiBvciBodG1sIG9yIGNvZGVdIGZvbGxvd2VkIGJ5IHNwYWNlK3BhcmFtcyB0aGVuIGNvbnZlcnRCYWNrP1xuXHRyVGFnID0gXCIoPzooXFxcXHcrKD89W1xcXFwvXFxcXHNcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl0pKXwoXFxcXHcrKT8oOil8KD4pfChcXFxcKikpXFxcXHMqKCg/OlteXFxcXFwiXG5cdFx0KyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl18XFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCIoPyFcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjEgKyBcIikpKj8pXCI7XG5cblx0Ly8gTWFrZSByVGFnIGF2YWlsYWJsZSB0byBKc1ZpZXdzIChvciBvdGhlciBjb21wb25lbnRzKSBmb3IgcGFyc2luZyBiaW5kaW5nIGV4cHJlc3Npb25zXG5cdCRzdWIuclRhZyA9IFwiKD86XCIgKyByVGFnICsgXCIpXCI7XG5cdC8vICAgICAgICAgICAgICAgICAgICAgICAgeyBePyB7ICAgdGFnK3BhcmFtcyBzbGFzaD8gIG9yIGNsb3NpbmdUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBjb21tZW50XG5cdHJUYWcgPSBuZXcgUmVnRXhwKFwiKD86XCIgKyBvcGVuQ2hhcnMgKyByVGFnICsgXCIoXFxcXC8pP3xcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxICsgXCIoPzooPzpcXFxcLyhcXFxcdyspKVxcXFxzKnwhLS1bXFxcXHNcXFxcU10qPy0tKSlcIiArIGNsb3NlQ2hhcnMsIFwiZ1wiKTtcblxuXHQvLyBEZWZhdWx0OiAgYmluZCAgICAgdGFnTmFtZSAgICAgICAgIGN2dCAgIGNsbiBodG1sIGNvZGUgICAgcGFyYW1zICAgICAgICAgICAgc2xhc2ggICBiaW5kMiAgICAgICAgIGNsb3NlQmxrICBjb21tZW50XG5cdC8vICAgICAgLyg/OnsoXFxeKT97KD86KFxcdysoPz1bXFwvXFxzfV0pKXwoXFx3Kyk/KDopfCg+KXwoXFwqKSlcXHMqKCg/OltefV18fSg/IX0pKSo/KShcXC8pP3x7KFxcXik/eyg/Oig/OlxcLyhcXHcrKSlcXHMqfCEtLVtcXHNcXFNdKj8tLSkpfX1cblxuXHQkc3ViLnJUbXBsID0gbmV3IFJlZ0V4cChcIjwuKj58KFteXFxcXFxcXFxdfF4pW3t9XXxcIiArIG9wZW5DaGFycyArIFwiLipcIiArIGNsb3NlQ2hhcnMpO1xuXHQvLyAkc3ViLnJUbXBsIGxvb2tzIGZvciBodG1sIHRhZ3Mgb3IgeyBvciB9IGNoYXIgbm90IHByZWNlZGVkIGJ5IFxcXFwsIG9yIEpzUmVuZGVyIHRhZ3Mge3t4eHh9fS4gRWFjaCBvZiB0aGVzZSBzdHJpbmdzIGFyZSBjb25zaWRlcmVkXG5cdC8vIE5PVCB0byBiZSBqUXVlcnkgc2VsZWN0b3JzXG5cdHJldHVybiAkdmlld3NTZXR0aW5ncztcbn1cblxuLy89PT09PT09PT1cbi8vIFZpZXcuZ2V0XG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRWaWV3KGlubmVyLCB0eXBlKSB7IC8vdmlldy5nZXQoaW5uZXIsIHR5cGUpXG5cdGlmICghdHlwZSAmJiBpbm5lciAhPT0gdHJ1ZSkge1xuXHRcdC8vIHZpZXcuZ2V0KHR5cGUpXG5cdFx0dHlwZSA9IGlubmVyO1xuXHRcdGlubmVyID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dmFyIHZpZXdzLCBpLCBsLCBmb3VuZCxcblx0XHR2aWV3ID0gdGhpcyxcblx0XHRyb290ID0gIXR5cGUgfHwgdHlwZSA9PT0gXCJyb290XCI7XG5cdFx0Ly8gSWYgdHlwZSBpcyB1bmRlZmluZWQsIHJldHVybnMgcm9vdCB2aWV3ICh2aWV3IHVuZGVyIHRvcCB2aWV3KS5cblxuXHRpZiAoaW5uZXIpIHtcblx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgbmVzdGVkIG9uZXMsIGRlcHRoLWZpcnN0IC0gYW5kIHJldHVybiBmaXJzdCBvbmUgd2l0aCBnaXZlbiB0eXBlLlxuXHRcdC8vIElmIHR5cGUgaXMgdW5kZWZpbmVkLCBpLmUuIHZpZXcuZ2V0KHRydWUpLCByZXR1cm4gZmlyc3QgY2hpbGQgdmlldy5cblx0XHRmb3VuZCA9IHR5cGUgJiYgdmlldy50eXBlID09PSB0eXBlICYmIHZpZXc7XG5cdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0dmlld3MgPSB2aWV3LnZpZXdzO1xuXHRcdFx0aWYgKHZpZXcuXy51c2VLZXkpIHtcblx0XHRcdFx0Zm9yIChpIGluIHZpZXdzKSB7XG5cdFx0XHRcdFx0aWYgKGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGkgPSAwLCBsID0gdmlld3MubGVuZ3RoOyAhZm91bmQgJiYgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChyb290KSB7XG5cdFx0Ly8gRmluZCByb290IHZpZXcuICh2aWV3IHdob3NlIHBhcmVudCBpcyB0b3Agdmlldylcblx0XHR3aGlsZSAodmlldy5wYXJlbnQpIHtcblx0XHRcdGZvdW5kID0gdmlldztcblx0XHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0d2hpbGUgKHZpZXcgJiYgIWZvdW5kKSB7XG5cdFx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgcGFyZW50IG9uZXMgLSBhbmQgcmV0dXJuIGZpcnN0IG9uZSB3aXRoIGdpdmVuIHR5cGUuXG5cdFx0XHRmb3VuZCA9IHZpZXcudHlwZSA9PT0gdHlwZSA/IHZpZXcgOiB1bmRlZmluZWQ7XG5cdFx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkSW5kZXgoKSB7XG5cdHZhciB2aWV3ID0gdGhpcy5nZXQoXCJpdGVtXCIpO1xuXHRyZXR1cm4gdmlldyA/IHZpZXcuaW5kZXggOiB1bmRlZmluZWQ7XG59XG5cbmdldE5lc3RlZEluZGV4LmRlcGVuZHMgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIFt0aGlzLmdldChcIml0ZW1cIiksIFwiaW5kZXhcIl07XG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleCgpIHtcblx0cmV0dXJuIHRoaXMuaW5kZXg7XG59XG5cbmdldEluZGV4LmRlcGVuZHMgPSBcImluZGV4XCI7XG5cbi8vPT09PT09PT09PVxuLy8gVmlldy5obHBcbi8vPT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRIZWxwZXIoaGVscGVyLCBpc0NvbnRleHRDYikge1xuXHQvLyBIZWxwZXIgbWV0aG9kIGNhbGxlZCBhcyB2aWV3LmhscChrZXkpIGZyb20gY29tcGlsZWQgdGVtcGxhdGUsIGZvciBoZWxwZXJzIG9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgfmZvb1xuXHR2YXIgd3JhcHBlZCwgZGVwcyxcblx0dmlldyA9IHRoaXMsXG5cdHJlcyA9IHZpZXcuY3R4O1xuXG5cdGlmIChyZXMpIHtcblx0XHRyZXMgPSByZXNbaGVscGVyXTtcblx0fVxuXHRpZiAocmVzID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXMgPSAkaGVscGVyc1toZWxwZXJdO1xuXHR9XG5cdGlmIChyZXMgJiYgcmVzLl9jcCkgeyAvLyBJZiB0aGlzIGhlbHBlciByZXNvdXJjZSBpcyBhIGNvbnRleHR1YWwgcGFyYW1ldGVyLCB+Zm9vPWV4cHJcblx0XHRpZiAoaXNDb250ZXh0Q2IpIHsgLy8gSW4gYSBjb250ZXh0IGNhbGxiYWNrIGZvciBhIGNvbnRleHR1YWwgcGFyYW0sIHJldHVybiB0aGUgW2N1cnJlbnREYXRhLCBkZXBlbmRlbmNpZXMuLi5dIGFycmF5IC0gbmVlZGVkIGZvciBvYnNlcnZlIGNhbGxcblx0XHRcdGRlcHMgPSAkc3ViLl9jZW8ocmVzWzFdLmRlcHMpOyAgLy8gZm4gZGVwcywgd2l0aCBhbnkgZXhwck9icyBjbG9uZWRcblx0XHRcdGRlcHMudW5zaGlmdChyZXNbMF0uZGF0YSk7ICAgICAgLy8gdmlldy5kYXRhXG5cdFx0XHRkZXBzLl9jcCA9IHRydWU7XG5cdFx0XHRyZXR1cm4gZGVwcztcblx0XHR9XG5cdFx0cmVzID0gJHZpZXdzLmdldEN0eChyZXMpOyAvLyBJZiBhIGNvbnRleHR1YWwgcGFyYW0sIGJ1dCBub3QgYSBjb250ZXh0IGNhbGxiYWNrLCByZXR1cm4gZXZhbHVhdGVkIHBhcmFtIC0gZm4oZGF0YSwgdmlldywgailcblx0fVxuXG5cdGlmIChyZXMpIHtcblx0XHRpZiAoJGlzRnVuY3Rpb24ocmVzKSAmJiAhcmVzLl93cnApIHtcblx0XHRcdC8vIElmIGl0IGlzIG9mIHR5cGUgZnVuY3Rpb24sIGFuZCBub3QgYWxyZWFkeSB3cmFwcGVkLCB3ZSB3aWxsIHdyYXAgaXQsIHNvIGlmIGNhbGxlZCB3aXRoIG5vIHRoaXMgcG9pbnRlciBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuXHRcdFx0Ly8gdmlldyBhcyAndGhpcycgY29udGV4dC4gSWYgdGhlIGhlbHBlciB+Zm9vKCkgd2FzIGluIGEgZGF0YS1saW5rIGV4cHJlc3Npb24sIHRoZSB2aWV3IHdpbGwgaGF2ZSBhICd0ZW1wb3JhcnknIGxpbmtDdHggcHJvcGVydHkgdG9vLlxuXHRcdFx0Ly8gTm90ZSB0aGF0IGhlbHBlciBmdW5jdGlvbnMgb24gZGVlcGVyIHBhdGhzIHdpbGwgaGF2ZSBzcGVjaWZpYyB0aGlzIHBvaW50ZXJzLCBmcm9tIHRoZSBwcmVjZWRpbmcgcGF0aC5cblx0XHRcdC8vIEZvciBleGFtcGxlLCB+dXRpbC5mb28oKSB3aWxsIGhhdmUgdGhlIH51dGlsIG9iamVjdCBhcyAndGhpcycgcG9pbnRlclxuXHRcdFx0d3JhcHBlZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gcmVzLmFwcGx5KCghdGhpcyB8fCB0aGlzID09PSBnbG9iYWwpID8gdmlldyA6IHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHR9O1xuXHRcdFx0d3JhcHBlZC5fd3JwID0gdmlldztcblx0XHRcdCRleHRlbmQod3JhcHBlZCwgcmVzKTsgLy8gQXR0YWNoIHNhbWUgZXhwYW5kb3MgKGlmIGFueSkgdG8gdGhlIHdyYXBwZWQgZnVuY3Rpb25cblx0XHR9XG5cdH1cblx0cmV0dXJuIHdyYXBwZWQgfHwgcmVzO1xufVxuXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSh0bXBsKSB7XG5cdHJldHVybiB0bXBsICYmICh0bXBsLmZuXG5cdFx0PyB0bXBsXG5cdFx0OiB0aGlzLmdldFJzYyhcInRlbXBsYXRlc1wiLCB0bXBsKSB8fCAkdGVtcGxhdGVzKHRtcGwpKTsgLy8gbm90IHlldCBjb21waWxlZFxufVxuXG4vLz09PT09PT09PT09PT09XG4vLyB2aWV3cy5fY252dFxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb252ZXJ0VmFsKGNvbnZlcnRlciwgdmlldywgdGFnQ3R4LCBvbkVycm9yKSB7XG5cdC8vIHNlbGYgaXMgdGVtcGxhdGUgb2JqZWN0IG9yIGxpbmtDdHggb2JqZWN0XG5cdHZhciB0YWcsIHZhbHVlLFxuXHRcdC8vIGlmIHRhZ0N0eCBpcyBhbiBpbnRlZ2VyLCB0aGVuIGl0IGlzIHRoZSBrZXkgZm9yIHRoZSBjb21waWxlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGJvdW5kVGFnIHRhZ0N0eFxuXHRcdGJvdW5kVGFnID0gdHlwZW9mIHRhZ0N0eCA9PT0gXCJudW1iZXJcIiAmJiB2aWV3LnRtcGwuYm5kc1t0YWdDdHgtMV0sXG5cdFx0bGlua0N0eCA9IHZpZXcubGlua0N0eDsgLy8gRm9yIGRhdGEtbGluaz1cIntjdnQ6Li4ufVwiLi4uXG5cblx0aWYgKG9uRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhZ0N0eCA9IG9uRXJyb3IgPSB7cHJvcHM6IHt9LCBhcmdzOiBbb25FcnJvcl19O1xuXHR9IGVsc2UgaWYgKGJvdW5kVGFnKSB7XG5cdFx0dGFnQ3R4ID0gYm91bmRUYWcodmlldy5kYXRhLCB2aWV3LCAkc3ViKTtcblx0fVxuXG5cdHZhbHVlID0gdGFnQ3R4LmFyZ3NbMF07XG5cdGlmIChjb252ZXJ0ZXIgfHwgYm91bmRUYWcpIHtcblx0XHR0YWcgPSBsaW5rQ3R4ICYmIGxpbmtDdHgudGFnO1xuXHRcdGlmICghdGFnKSB7XG5cdFx0XHR0YWcgPSAkZXh0ZW5kKG5ldyAkc3ViLl90ZygpLCB7XG5cdFx0XHRcdF86IHtcblx0XHRcdFx0XHRpbmxpbmU6ICFsaW5rQ3R4LFxuXHRcdFx0XHRcdGJuZDogYm91bmRUYWcsXG5cdFx0XHRcdFx0dW5saW5rZWQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0dGFnTmFtZTogXCI6XCIsXG5cdFx0XHRcdGN2dDogY29udmVydGVyLFxuXHRcdFx0XHRmbG93OiB0cnVlLFxuXHRcdFx0XHR0YWdDdHg6IHRhZ0N0eFxuXHRcdFx0fSk7XG5cdFx0XHRpZiAobGlua0N0eCkge1xuXHRcdFx0XHRsaW5rQ3R4LnRhZyA9IHRhZztcblx0XHRcdFx0dGFnLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0fVxuXHRcdFx0dGFnQ3R4LmN0eCA9IGV4dGVuZEN0eCh0YWdDdHguY3R4LCAobGlua0N0eCA/IGxpbmtDdHgudmlldyA6IHZpZXcpLmN0eCk7XG5cdFx0fVxuXHRcdHRhZy5fZXIgPSBvbkVycm9yICYmIHZhbHVlO1xuXHRcdHRhZ0hhbmRsZXJzRnJvbVByb3BzKHRhZywgdGFnQ3R4KTtcblxuXHRcdHRhZ0N0eC52aWV3ID0gdmlldztcblxuXHRcdHRhZy5jdHggPSB0YWdDdHguY3R4IHx8IHRhZy5jdHggfHwge307XG5cdFx0dGFnQ3R4LmN0eCA9IHVuZGVmaW5lZDtcblxuXHRcdHZhbHVlID0gdGFnLmN2dEFyZ3MoY29udmVydGVyICE9PSBcInRydWVcIiAmJiBjb252ZXJ0ZXIpWzBdOyAvLyBJZiB0aGVyZSBpcyBhIGNvbnZlcnRCYWNrIGJ1dCBubyBjb252ZXJ0LCBjb252ZXJ0ZXIgd2lsbCBiZSBcInRydWVcIlxuXG5cdFx0Ly8gQ2FsbCBvblJlbmRlciAodXNlZCBieSBKc1ZpZXdzIGlmIHByZXNlbnQsIHRvIGFkZCBiaW5kaW5nIGFubm90YXRpb25zIGFyb3VuZCByZW5kZXJlZCBjb250ZW50KVxuXHRcdHZhbHVlID0gYm91bmRUYWcgJiYgdmlldy5fLm9uUmVuZGVyXG5cdFx0XHQ/IHZpZXcuXy5vblJlbmRlcih2YWx1ZSwgdmlldywgdGFnKVxuXHRcdFx0OiB2YWx1ZTtcblx0fVxuXHRyZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkID8gdmFsdWUgOiBcIlwiO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0QXJncyhjb252ZXJ0ZXIpIHtcblx0dmFyIHRhZyA9IHRoaXMsXG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eCxcblx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0YXJncyA9IHRhZ0N0eC5hcmdzO1xuXG5cdGNvbnZlcnRlciA9IGNvbnZlcnRlciB8fCB0YWcuY29udmVydDtcblx0Y29udmVydGVyID0gY29udmVydGVyICYmIChcIlwiICsgY29udmVydGVyID09PSBjb252ZXJ0ZXJcblx0XHQ/ICh2aWV3LmdldFJzYyhcImNvbnZlcnRlcnNcIiwgY29udmVydGVyKSB8fCBlcnJvcihcIlVua25vd24gY29udmVydGVyOiAnXCIgKyBjb252ZXJ0ZXIgKyBcIidcIikpXG5cdFx0OiBjb252ZXJ0ZXIpO1xuXG5cdGFyZ3MgPSAhYXJncy5sZW5ndGggJiYgIXRhZ0N0eC5pbmRleCAvLyBPbiB0aGUgb3BlbmluZyB0YWcgd2l0aCBubyBhcmdzLCBiaW5kIHRvIHRoZSBjdXJyZW50IGRhdGEgY29udGV4dFxuXHRcdD8gW3ZpZXcuZGF0YV1cblx0XHQ6IGNvbnZlcnRlclxuXHRcdFx0PyBhcmdzLnNsaWNlKCkgLy8gSWYgdGhlcmUgaXMgYSBjb252ZXJ0ZXIsIHVzZSBhIGNvcHkgb2YgdGhlIHRhZ0N0eC5hcmdzIGFycmF5IGZvciByZW5kZXJpbmcsIGFuZCByZXBsYWNlIHRoZSBhcmdzWzBdIGluXG5cdFx0XHQvLyB0aGUgY29waWVkIGFycmF5IHdpdGggdGhlIGNvbnZlcnRlZCB2YWx1ZS4gQnV0IHdlIGRvIG5vdCBtb2RpZnkgdGhlIHZhbHVlIG9mIHRhZy50YWdDdHguYXJnc1swXSAodGhlIG9yaWdpbmFsIGFyZ3MgYXJyYXkpXG5cdFx0XHQ6IGFyZ3M7IC8vIElmIG5vIGNvbnZlcnRlciwgZ2V0IHRoZSBvcmlnaW5hbCB0YWdDdHguYXJnc1xuXG5cdGlmIChjb252ZXJ0ZXIpIHtcblx0XHRpZiAoY29udmVydGVyLmRlcGVuZHMpIHtcblx0XHRcdHRhZy5kZXBlbmRzID0gJHN1Yi5nZXREZXBzKHRhZy5kZXBlbmRzLCB0YWcsIGNvbnZlcnRlci5kZXBlbmRzLCBjb252ZXJ0ZXIpO1xuXHRcdH1cblx0XHRhcmdzWzBdID0gY29udmVydGVyLmFwcGx5KHRhZywgYXJncyk7XG5cdH1cblx0cmV0dXJuIGFyZ3M7XG59XG5cbi8vPT09PT09PT09PT09PVxuLy8gdmlld3MuX3RhZ1xuLy89PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdldFJlc291cmNlKHJlc291cmNlVHlwZSwgaXRlbU5hbWUpIHtcblx0dmFyIHJlcywgc3RvcmUsXG5cdFx0dmlldyA9IHRoaXM7XG5cdHdoaWxlICgocmVzID09PSB1bmRlZmluZWQpICYmIHZpZXcpIHtcblx0XHRzdG9yZSA9IHZpZXcudG1wbCAmJiB2aWV3LnRtcGxbcmVzb3VyY2VUeXBlXTtcblx0XHRyZXMgPSBzdG9yZSAmJiBzdG9yZVtpdGVtTmFtZV07XG5cdFx0dmlldyA9IHZpZXcucGFyZW50O1xuXHR9XG5cdHJldHVybiByZXMgfHwgJHZpZXdzW3Jlc291cmNlVHlwZV1baXRlbU5hbWVdO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUYWcodGFnTmFtZSwgcGFyZW50VmlldywgdG1wbCwgdGFnQ3R4cywgaXNVcGRhdGUsIG9uRXJyb3IpIHtcblx0cGFyZW50VmlldyA9IHBhcmVudFZpZXcgfHwgdG9wVmlldztcblx0dmFyIHRhZywgdGFnXywgdGFnRGVmLCB0ZW1wbGF0ZSwgdGFncywgYXR0ciwgcGFyZW50VGFnLCBpLCBsLCBpdGVtUmV0LCB0YWdDdHgsIHRhZ0N0eEN0eCxcblx0XHRjb250ZW50LCBjYWxsSW5pdCwgbWFwRGVmLCB0aGlzTWFwLCBhcmdzLCBwcm9wcywgaW5pdGlhbFRtcGwsIHRhZ0RhdGFNYXAsIGNvbnRlbnRDdHgsXG5cdFx0cmV0ID0gXCJcIixcblx0XHRsaW5rQ3R4ID0gcGFyZW50Vmlldy5saW5rQ3R4IHx8IDAsXG5cdFx0Y3R4ID0gcGFyZW50Vmlldy5jdHgsXG5cdFx0cGFyZW50VG1wbCA9IHRtcGwgfHwgcGFyZW50Vmlldy50bXBsLFxuXHRcdC8vIGlmIHRhZ0N0eCBpcyBhbiBpbnRlZ2VyLCB0aGVuIGl0IGlzIHRoZSBrZXkgZm9yIHRoZSBjb21waWxlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGJvdW5kVGFnIHRhZ0N0eHNcblx0XHRib3VuZFRhZyA9IHR5cGVvZiB0YWdDdHhzID09PSBcIm51bWJlclwiICYmIHBhcmVudFZpZXcudG1wbC5ibmRzW3RhZ0N0eHMtMV07XG5cblx0aWYgKHRhZ05hbWUuX2lzID09PSBcInRhZ1wiKSB7XG5cdFx0dGFnID0gdGFnTmFtZTtcblx0XHR0YWdOYW1lID0gdGFnLnRhZ05hbWU7XG5cdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzO1xuXHRcdHRlbXBsYXRlID0gdGFnLnRlbXBsYXRlO1xuXHR9IGVsc2Uge1xuXHRcdHRhZ0RlZiA9IHBhcmVudFZpZXcuZ2V0UnNjKFwidGFnc1wiLCB0YWdOYW1lKSB8fCBlcnJvcihcIlVua25vd24gdGFnOiB7e1wiICsgdGFnTmFtZSArIFwifX0gXCIpO1xuXHRcdHRlbXBsYXRlID0gdGFnRGVmLnRlbXBsYXRlO1xuXHR9XG5cblx0aWYgKG9uRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldCArPSBvbkVycm9yO1xuXHRcdHRhZ0N0eHMgPSBvbkVycm9yID0gW3twcm9wczoge30sIGFyZ3M6IFtdfV07XG5cdH0gZWxzZSBpZiAoYm91bmRUYWcpIHtcblx0XHR0YWdDdHhzID0gYm91bmRUYWcocGFyZW50Vmlldy5kYXRhLCBwYXJlbnRWaWV3LCAkc3ViKTtcblx0fVxuXG5cdGwgPSB0YWdDdHhzLmxlbmd0aDtcblx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdHRhZ0N0eCA9IHRhZ0N0eHNbaV07XG5cdFx0aWYgKCFsaW5rQ3R4IHx8ICFsaW5rQ3R4LnRhZyB8fCBpICYmICFsaW5rQ3R4LnRhZy5fLmlubGluZSB8fCB0YWcuX2VyKSB7XG5cdFx0XHQvLyBJbml0aWFsaXplIHRhZ0N0eFxuXHRcdFx0Ly8gRm9yIGJsb2NrIHRhZ3MsIHRhZ0N0eC50bXBsIGlzIGFuIGludGVnZXIgPiAwXG5cdFx0XHRpZiAoY29udGVudCA9IHBhcmVudFRtcGwudG1wbHMgJiYgdGFnQ3R4LnRtcGwpIHtcblx0XHRcdFx0Y29udGVudCA9IHRhZ0N0eC5jb250ZW50ID0gcGFyZW50VG1wbC50bXBsc1tjb250ZW50IC0gMV07XG5cdFx0XHR9XG5cdFx0XHR0YWdDdHguaW5kZXggPSBpO1xuXHRcdFx0dGFnQ3R4LnRtcGwgPSBjb250ZW50OyAvLyBTZXQgdGhlIHRtcGwgcHJvcGVydHkgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2NrIHRhZ1xuXHRcdFx0dGFnQ3R4LnJlbmRlciA9IHJlbmRlckNvbnRlbnQ7XG5cdFx0XHR0YWdDdHgudmlldyA9IHBhcmVudFZpZXc7XG5cdFx0XHR0YWdDdHguY3R4ID0gZXh0ZW5kQ3R4KHRhZ0N0eC5jdHgsIGN0eCk7IC8vIENsb25lIGFuZCBleHRlbmQgcGFyZW50Vmlldy5jdHhcblx0XHR9XG5cdFx0aWYgKHRtcGwgPSB0YWdDdHgucHJvcHMudG1wbCkge1xuXHRcdFx0Ly8gSWYgdGhlIHRtcGwgcHJvcGVydHkgaXMgb3ZlcnJpZGRlbiwgc2V0IHRoZSB2YWx1ZSAod2hlbiBpbml0aWFsaXppbmcsIG9yLCBpbiBjYXNlIG9mIGJpbmRpbmc6IF50bXBsPS4uLiwgd2hlbiB1cGRhdGluZylcblx0XHRcdHRhZ0N0eC50bXBsID0gcGFyZW50Vmlldy5nZXRUbXBsKHRtcGwpO1xuXHRcdH1cblxuXHRcdGlmICghdGFnKSB7XG5cdFx0XHQvLyBUaGlzIHdpbGwgb25seSBiZSBoaXQgZm9yIGluaXRpYWwgdGFnQ3R4IChub3QgZm9yIHt7ZWxzZX19KSAtIGlmIHRoZSB0YWcgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgeWV0XG5cdFx0XHQvLyBJbnN0YW50aWF0ZSB0YWcgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0XG5cdFx0XHQvLyBJZiB0aGUgdGFnIGhhcyBub3QgYWxyZWFkeSBiZWVuIGluc3RhbnRpYXRlZCwgd2Ugd2lsbCBjcmVhdGUgYSBuZXcgaW5zdGFuY2UuXG5cdFx0XHQvLyB+dGFnIHdpbGwgYWNjZXNzIHRoZSB0YWcsIGV2ZW4gd2l0aGluIHRoZSByZW5kZXJpbmcgb2YgdGhlIHRlbXBsYXRlIGNvbnRlbnQgb2YgdGhpcyB0YWcuXG5cdFx0XHQvLyBGcm9tIGNoaWxkL2Rlc2NlbmRhbnQgdGFncywgY2FuIGFjY2VzcyB1c2luZyB+dGFnLnBhcmVudCwgb3IgfnBhcmVudFRhZ3MudGFnTmFtZVxuXHRcdFx0dGFnID0gbmV3IHRhZ0RlZi5fY3RyKCk7XG5cdFx0XHRjYWxsSW5pdCA9ICEhdGFnLmluaXQ7XG5cblx0XHRcdHRhZy5wYXJlbnQgPSBwYXJlbnRUYWcgPSBjdHggJiYgY3R4LnRhZztcblx0XHRcdHRhZy50YWdDdHhzID0gdGFnQ3R4cztcblx0XHRcdHRhZ0RhdGFNYXAgPSB0YWcuZGF0YU1hcDtcblxuXHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0dGFnLl8uaW5saW5lID0gZmFsc2U7XG5cdFx0XHRcdGxpbmtDdHgudGFnID0gdGFnO1xuXHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFnLl8uYm5kID0gYm91bmRUYWcgfHwgbGlua0N0eC5mbikge1xuXHRcdFx0XHQvLyBCb3VuZCBpZiB7Xnt0YWcuLi59fSBvciBkYXRhLWxpbms9XCJ7dGFnLi4ufVwiXG5cdFx0XHRcdHRhZy5fLmFyclZ3cyA9IHt9O1xuXHRcdFx0fSBlbHNlIGlmICh0YWcuZGF0YUJvdW5kT25seSkge1xuXHRcdFx0XHRlcnJvcihcIntee1wiICsgdGFnTmFtZSArIFwifX0gdGFnIG11c3QgYmUgZGF0YS1ib3VuZFwiKTtcblx0XHRcdH1cblx0XHRcdC8vVE9ETyBiZXR0ZXIgcGVyZiBmb3IgY2hpbGRUYWdzKCkgLSBrZWVwIGNoaWxkIHRhZy50YWdzIGFycmF5LCAoYW5kIHJlbW92ZSBjaGlsZCwgd2hlbiBkaXNwb3NlZClcblx0XHRcdC8vIHRhZy50YWdzID0gW107XG5cdFx0fVxuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cztcblx0XHR0YWdEYXRhTWFwID0gdGFnLmRhdGFNYXA7XG5cblx0XHR0YWdDdHgudGFnID0gdGFnO1xuXHRcdGlmICh0YWdEYXRhTWFwICYmIHRhZ0N0eHMpIHtcblx0XHRcdHRhZ0N0eC5tYXAgPSB0YWdDdHhzW2ldLm1hcDsgLy8gQ29weSBvdmVyIHRoZSBjb21waWxlZCBtYXAgaW5zdGFuY2UgZnJvbSB0aGUgcHJldmlvdXMgdGFnQ3R4cyB0byB0aGUgcmVmcmVzaGVkIG9uZXNcblx0XHR9XG5cdFx0aWYgKCF0YWcuZmxvdykge1xuXHRcdFx0dGFnQ3R4Q3R4ID0gdGFnQ3R4LmN0eCA9IHRhZ0N0eC5jdHggfHwge307XG5cblx0XHRcdC8vIHRhZ3MgaGFzaDogdGFnLmN0eC50YWdzLCBtZXJnZWQgd2l0aCBwYXJlbnRWaWV3LmN0eC50YWdzLFxuXHRcdFx0dGFncyA9IHRhZy5wYXJlbnRzID0gdGFnQ3R4Q3R4LnBhcmVudFRhZ3MgPSBjdHggJiYgZXh0ZW5kQ3R4KHRhZ0N0eEN0eC5wYXJlbnRUYWdzLCBjdHgucGFyZW50VGFncykgfHwge307XG5cdFx0XHRpZiAocGFyZW50VGFnKSB7XG5cdFx0XHRcdHRhZ3NbcGFyZW50VGFnLnRhZ05hbWVdID0gcGFyZW50VGFnO1xuXHRcdFx0XHQvL1RPRE8gYmV0dGVyIHBlcmYgZm9yIGNoaWxkVGFnczogcGFyZW50VGFnLnRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0fVxuXHRcdFx0dGFnc1t0YWcudGFnTmFtZV0gPSB0YWdDdHhDdHgudGFnID0gdGFnO1xuXHRcdH1cblx0fVxuXHRpZiAoISh0YWcuX2VyID0gb25FcnJvcikpIHtcblx0XHR0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eHNbMF0pO1xuXHRcdHRhZy5yZW5kZXJpbmcgPSB7fTsgLy8gUHJvdmlkZSBvYmplY3QgZm9yIHN0YXRlIGR1cmluZyByZW5kZXIgY2FsbHMgdG8gdGFnIGFuZCBlbHNlcy4gKFVzZWQgYnkge3tpZn19IGFuZCB7e2Zvcn19Li4uKVxuXHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdHRhZ0N0eCA9IHRhZy50YWdDdHggPSB0YWdDdHhzW2ldO1xuXHRcdFx0cHJvcHMgPSB0YWdDdHgucHJvcHM7XG5cdFx0XHRhcmdzID0gdGFnLmN2dEFyZ3MoKTtcblxuXHRcdFx0aWYgKG1hcERlZiA9IHByb3BzLmRhdGFNYXAgfHwgdGFnRGF0YU1hcCkge1xuXHRcdFx0XHRpZiAoYXJncy5sZW5ndGggfHwgcHJvcHMuZGF0YU1hcCkge1xuXHRcdFx0XHRcdHRoaXNNYXAgPSB0YWdDdHgubWFwO1xuXHRcdFx0XHRcdGlmICghdGhpc01hcCB8fCB0aGlzTWFwLnNyYyAhPT0gYXJnc1swXSB8fCBpc1VwZGF0ZSkge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXNNYXAgJiYgdGhpc01hcC5zcmMpIHtcblx0XHRcdFx0XHRcdFx0dGhpc01hcC51bm1hcCgpOyAvLyBvbmx5IGNhbGxlZCBpZiBvYnNlcnZhYmxlIG1hcCAtIG5vdCB3aGVuIG9ubHkgdXNlZCBpbiBKc1JlbmRlciwgZS5nLiBieSB7e3Byb3BzfX1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXNNYXAgPSB0YWdDdHgubWFwID0gbWFwRGVmLm1hcChhcmdzWzBdLCBwcm9wcywgdW5kZWZpbmVkLCAhdGFnLl8uYm5kKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXJncyA9IFt0aGlzTWFwLnRndF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRhZy5jdHggPSB0YWdDdHguY3R4O1xuXG5cdFx0XHRpZiAoIWkpIHtcblx0XHRcdFx0aWYgKGNhbGxJbml0KSB7XG5cdFx0XHRcdFx0aW5pdGlhbFRtcGwgPSB0YWcudGVtcGxhdGU7XG5cdFx0XHRcdFx0dGFnLmluaXQodGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4KTtcblx0XHRcdFx0XHRjYWxsSW5pdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobGlua0N0eCkge1xuXHRcdFx0XHRcdC8vIFNldCBhdHRyIG9uIGxpbmtDdHggdG8gZW5zdXJlIG91dHB1dHRpbmcgdG8gdGhlIGNvcnJlY3QgdGFyZ2V0IGF0dHJpYnV0ZS5cblx0XHRcdFx0XHQvLyBTZXR0aW5nIGVpdGhlciBsaW5rQ3R4LmF0dHIgb3IgdGhpcy5hdHRyIGluIHRoZSBpbml0KCkgYWxsb3dzIHBlci1pbnN0YW5jZSBjaG9pY2Ugb2YgdGFyZ2V0IGF0dHJpYi5cblx0XHRcdFx0XHRsaW5rQ3R4LmF0dHIgPSB0YWcuYXR0ciA9IGxpbmtDdHguYXR0ciB8fCB0YWcuYXR0cjtcblx0XHRcdFx0fVxuXHRcdFx0XHRhdHRyID0gdGFnLmF0dHI7XG5cdFx0XHRcdHRhZy5fLm5vVndzID0gYXR0ciAmJiBhdHRyICE9PSBIVE1MO1xuXHRcdFx0fVxuXG5cdFx0XHRpdGVtUmV0ID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHRhZy5yZW5kZXIpIHtcblx0XHRcdFx0aXRlbVJldCA9IHRhZy5yZW5kZXIuYXBwbHkodGFnLCBhcmdzKTtcblx0XHRcdFx0aWYgKHBhcmVudFZpZXcubGlua2VkICYmIGl0ZW1SZXQgJiYgdGFnLmxpbmtlZEVsZW0gJiYgIXJXcmFwcGVkSW5WaWV3TWFya2VyLnRlc3QoaXRlbVJldCkpIHtcblx0XHRcdFx0XHQvLyBXaGVuIGEgdGFnIHJlbmRlcnMgY29udGVudCBmcm9tIHRoZSByZW5kZXIgbWV0aG9kLCB3aXRoIGRhdGEgbGlua2luZywgYW5kIGhhcyBhIGxpbmtlZEVsZW0gYmluZGluZywgdGhlbiB3ZSBuZWVkIHRvIHdyYXAgd2l0aFxuXHRcdFx0XHRcdC8vIHZpZXcgbWFya2VycywgaWYgYWJzZW50LCBzbyB0aGUgY29udGVudCBpcyBhIHZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWcsIHdoaWNoIHdpbGwgY29ycmVjdGx5IGRpc3Bvc2UgYmluZGluZ3MgaWYgZGVsZXRlZC5cblx0XHRcdFx0XHRpdGVtUmV0ID0gcmVuZGVyV2l0aFZpZXdzKCQudGVtcGxhdGVzKGl0ZW1SZXQpLCBhcmdzWzBdLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcGFyZW50VmlldywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRhZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghYXJncy5sZW5ndGgpIHtcblx0XHRcdFx0YXJncyA9IFtwYXJlbnRWaWV3XTsgLy8gbm8gYXJndW1lbnRzIC0gKGUuZy4ge3tlbHNlfX0pIGdldCBkYXRhIGNvbnRleHQgZnJvbSB2aWV3LlxuXHRcdFx0fVxuXHRcdFx0aWYgKGl0ZW1SZXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250ZW50Q3R4ID0gYXJnc1swXTsgLy8gRGVmYXVsdCBkYXRhIGNvbnRleHQgZm9yIHdyYXBwZWQgYmxvY2sgY29udGVudCBpcyB0aGUgZmlyc3QgYXJndW1lbnQuIERlZmluZWQgdGFnLmNvbnRlbnRDdHggZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhpcy5cblx0XHRcdFx0aWYgKHRhZy5jb250ZW50Q3R4KSB7XG5cdFx0XHRcdFx0Y29udGVudEN0eCA9IHRhZy5jb250ZW50Q3R4KGNvbnRlbnRDdHgpIHx8IGNvbnRlbnRDdHg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aXRlbVJldCA9IHRhZ0N0eC5yZW5kZXIoY29udGVudEN0eCwgdHJ1ZSkgfHwgKGlzVXBkYXRlID8gdW5kZWZpbmVkIDogXCJcIik7XG5cdFx0XHR9XG5cdFx0XHQvLyBObyByZXR1cm4gdmFsdWUgZnJvbSByZW5kZXIsIGFuZCBubyB0ZW1wbGF0ZS9jb250ZW50IHRhZ0N0eC5yZW5kZXIoLi4uKSwgc28gcmV0dXJuIHVuZGVmaW5lZFxuXHRcdFx0cmV0ID0gcmV0ID8gcmV0ICsgKGl0ZW1SZXQgfHwgXCJcIikgOiBpdGVtUmV0OyAvLyBJZiBubyByZW5kZXJlZCBjb250ZW50LCB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkXG5cdFx0fVxuXHRcdHRhZy5yZW5kZXJpbmcgPSB1bmRlZmluZWQ7XG5cdH1cblx0dGFnLnRhZ0N0eCA9IHRhZ0N0eHNbMF07XG5cdHRhZy5jdHggPSB0YWcudGFnQ3R4LmN0eDtcblxuXHRpZiAodGFnLl8ubm9Wd3MpIHtcblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdC8vIGlubGluZSB0YWcgd2l0aCBhdHRyIHNldCB0byBcInRleHRcIiB3aWxsIGluc2VydCBIVE1MLWVuY29kZWQgY29udGVudCAtIGFzIGlmIGl0IHdhcyBlbGVtZW50LWJhc2VkIGlubmVyVGV4dFxuXHRcdFx0cmV0ID0gYXR0ciA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0PyAkY29udmVydGVycy5odG1sKHJldClcblx0XHRcdFx0OiBcIlwiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYm91bmRUYWcgJiYgcGFyZW50Vmlldy5fLm9uUmVuZGVyXG5cdFx0Ly8gQ2FsbCBvblJlbmRlciAodXNlZCBieSBKc1ZpZXdzIGlmIHByZXNlbnQsIHRvIGFkZCBiaW5kaW5nIGFubm90YXRpb25zIGFyb3VuZCByZW5kZXJlZCBjb250ZW50KVxuXHRcdD8gcGFyZW50Vmlldy5fLm9uUmVuZGVyKHJldCwgcGFyZW50VmlldywgdGFnKVxuXHRcdDogcmV0O1xufVxuXG4vLz09PT09PT09PT09PT09PT09XG4vLyBWaWV3IGNvbnN0cnVjdG9yXG4vLz09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIFZpZXcoY29udGV4dCwgdHlwZSwgcGFyZW50VmlldywgZGF0YSwgdGVtcGxhdGUsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKSB7XG5cdC8vIENvbnN0cnVjdG9yIGZvciB2aWV3IG9iamVjdCBpbiB2aWV3IGhpZXJhcmNoeS4gKEF1Z21lbnRlZCBieSBKc1ZpZXdzIGlmIEpzVmlld3MgaXMgbG9hZGVkKVxuXHR2YXIgdmlld3MsIHBhcmVudFZpZXdfLCB0YWcsIHNlbGZfLFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdGlzQXJyYXkgPSB0eXBlID09PSBcImFycmF5XCI7XG5cblx0c2VsZi5jb250ZW50ID0gY29udGVudFRtcGw7XG5cdHNlbGYudmlld3MgPSBpc0FycmF5ID8gW10gOiB7fTtcblx0c2VsZi5wYXJlbnQgPSBwYXJlbnRWaWV3O1xuXHRzZWxmLnR5cGUgPSB0eXBlIHx8IFwidG9wXCI7XG5cdHNlbGYuZGF0YSA9IGRhdGE7XG5cdHNlbGYudG1wbCA9IHRlbXBsYXRlO1xuXHQvLyBJZiB0aGUgZGF0YSBpcyBhbiBhcnJheSwgdGhpcyBpcyBhbiAnYXJyYXkgdmlldycgd2l0aCBhIHZpZXdzIGFycmF5IGZvciBlYWNoIGNoaWxkICdpdGVtIHZpZXcnXG5cdC8vIElmIHRoZSBkYXRhIGlzIG5vdCBhbiBhcnJheSwgdGhpcyBpcyBhbiAnaXRlbSB2aWV3JyB3aXRoIGEgdmlld3MgJ2hhc2gnIG9iamVjdCBmb3IgYW55IGNoaWxkIG5lc3RlZCB2aWV3c1xuXHQvLyAuXy51c2VLZXkgaXMgbm9uIHplcm8gaWYgaXMgbm90IGFuICdhcnJheSB2aWV3JyAob3duaW5nIGEgZGF0YSBhcnJheSkuIFVzZSB0aGlzIGFzIG5leHQga2V5IGZvciBhZGRpbmcgdG8gY2hpbGQgdmlld3MgaGFzaFxuXHRzZWxmXyA9IHNlbGYuXyA9IHtcblx0XHRrZXk6IDAsXG5cdFx0dXNlS2V5OiBpc0FycmF5ID8gMCA6IDEsXG5cdFx0aWQ6IFwiXCIgKyB2aWV3SWQrKyxcblx0XHRvblJlbmRlcjogb25SZW5kZXIsXG5cdFx0Ym5kczoge31cblx0fTtcblx0c2VsZi5saW5rZWQgPSAhIW9uUmVuZGVyO1xuXHRpZiAocGFyZW50Vmlldykge1xuXHRcdHZpZXdzID0gcGFyZW50Vmlldy52aWV3cztcblx0XHRwYXJlbnRWaWV3XyA9IHBhcmVudFZpZXcuXztcblx0XHRpZiAocGFyZW50Vmlld18udXNlS2V5KSB7XG5cdFx0XHQvLyBQYXJlbnQgaXMgbm90IGFuICdhcnJheSB2aWV3Jy4gQWRkIHRoaXMgdmlldyB0byBpdHMgdmlld3Mgb2JqZWN0XG5cdFx0XHQvLyBzZWxmLl9rZXkgPSBpcyB0aGUga2V5IGluIHRoZSBwYXJlbnQgdmlldyBoYXNoXG5cdFx0XHR2aWV3c1tzZWxmXy5rZXkgPSBcIl9cIiArIHBhcmVudFZpZXdfLnVzZUtleSsrXSA9IHNlbGY7XG5cdFx0XHRzZWxmLmluZGV4ID0gaW5kZXhTdHI7XG5cdFx0XHRzZWxmLmdldEluZGV4ID0gZ2V0TmVzdGVkSW5kZXg7XG5cdFx0fSBlbHNlIGlmICh2aWV3cy5sZW5ndGggPT09IChzZWxmXy5rZXkgPSBzZWxmLmluZGV4ID0ga2V5KSkgeyAvLyBQYXJlbnQgaXMgYW4gJ2FycmF5IHZpZXcnLiBBZGQgdGhpcyB2aWV3IHRvIGl0cyB2aWV3cyBhcnJheVxuXHRcdFx0dmlld3MucHVzaChzZWxmKTsgLy8gQWRkaW5nIHRvIGVuZCBvZiB2aWV3cyBhcnJheS4gKFVzaW5nIHB1c2ggd2hlbiBwb3NzaWJsZSAtIGJldHRlciBwZXJmIHRoYW4gc3BsaWNlKVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2aWV3cy5zcGxpY2Uoa2V5LCAwLCBzZWxmKTsgLy8gSW5zZXJ0aW5nIGluIHZpZXdzIGFycmF5XG5cdFx0fVxuXHRcdC8vIElmIG5vIGNvbnRleHQgd2FzIHBhc3NlZCBpbiwgdXNlIHBhcmVudCBjb250ZXh0XG5cdFx0Ly8gSWYgY29udGV4dCB3YXMgcGFzc2VkIGluLCBpdCBzaG91bGQgaGF2ZSBiZWVuIG1lcmdlZCBhbHJlYWR5IHdpdGggcGFyZW50IGNvbnRleHRcblx0XHRzZWxmLmN0eCA9IGNvbnRleHQgfHwgcGFyZW50Vmlldy5jdHg7XG5cdH0gZWxzZSB7XG5cdFx0c2VsZi5jdHggPSBjb250ZXh0O1xuXHR9XG59XG5cblZpZXcucHJvdG90eXBlID0ge1xuXHRnZXQ6IGdldFZpZXcsXG5cdGdldEluZGV4OiBnZXRJbmRleCxcblx0Z2V0UnNjOiBnZXRSZXNvdXJjZSxcblx0Z2V0VG1wbDogZ2V0VGVtcGxhdGUsXG5cdGhscDogZ2V0SGVscGVyLFxuXHRfaXM6IFwidmlld1wiXG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlZ2lzdHJhdGlvblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbXBpbGVDaGlsZFJlc291cmNlcyhwYXJlbnRUbXBsKSB7XG5cdHZhciBzdG9yZU5hbWUsIHN0b3JlTmFtZXMsIHJlc291cmNlcztcblx0Zm9yIChzdG9yZU5hbWUgaW4ganN2U3RvcmVzKSB7XG5cdFx0c3RvcmVOYW1lcyA9IHN0b3JlTmFtZSArIFwic1wiO1xuXHRcdGlmIChwYXJlbnRUbXBsW3N0b3JlTmFtZXNdKSB7XG5cdFx0XHRyZXNvdXJjZXMgPSBwYXJlbnRUbXBsW3N0b3JlTmFtZXNdOyAgICAvLyBSZXNvdXJjZXMgbm90IHlldCBjb21waWxlZFxuXHRcdFx0cGFyZW50VG1wbFtzdG9yZU5hbWVzXSA9IHt9OyAgICAgICAgICAgICAgIC8vIFJlbW92ZSB1bmNvbXBpbGVkIHJlc291cmNlc1xuXHRcdFx0JHZpZXdzW3N0b3JlTmFtZXNdKHJlc291cmNlcywgcGFyZW50VG1wbCk7IC8vIEFkZCBiYWNrIGluIHRoZSBjb21waWxlZCByZXNvdXJjZXNcblx0XHR9XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT1cbi8vIGNvbXBpbGVUYWdcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbXBpbGVUYWcobmFtZSwgdGFnRGVmLCBwYXJlbnRUbXBsKSB7XG5cdHZhciB0bXBsLCBiYXNlVGFnLCBwcm9wLFxuXHRcdGNvbXBpbGVkRGVmID0gbmV3ICRzdWIuX3RnKCk7XG5cblx0ZnVuY3Rpb24gVGFnKCkge1xuXHRcdHZhciB0YWcgPSB0aGlzO1xuXHRcdHRhZy5fID0ge1xuXHRcdFx0aW5saW5lOiB0cnVlLFxuXHRcdFx0dW5saW5rZWQ6IHRydWVcblx0XHR9O1xuXG5cdFx0dGFnLnRhZ05hbWUgPSBuYW1lO1xuXHR9XG5cblx0aWYgKCRpc0Z1bmN0aW9uKHRhZ0RlZikpIHtcblx0XHQvLyBTaW1wbGUgdGFnIGRlY2xhcmVkIGFzIGZ1bmN0aW9uLiBObyBwcmVzZW50ZXIgaW5zdGFudGF0aW9uLlxuXHRcdHRhZ0RlZiA9IHtcblx0XHRcdGRlcGVuZHM6IHRhZ0RlZi5kZXBlbmRzLFxuXHRcdFx0cmVuZGVyOiB0YWdEZWZcblx0XHR9O1xuXHR9IGVsc2UgaWYgKFwiXCIgKyB0YWdEZWYgPT09IHRhZ0RlZikge1xuXHRcdHRhZ0RlZiA9IHt0ZW1wbGF0ZTogdGFnRGVmfTtcblx0fVxuXHRpZiAoYmFzZVRhZyA9IHRhZ0RlZi5iYXNlVGFnKSB7XG5cdFx0dGFnRGVmLmZsb3cgPSAhIXRhZ0RlZi5mbG93OyAvLyBTZXQgZmxvdyBwcm9wZXJ0eSwgc28gZGVmYXVsdHMgdG8gZmFsc2UgZXZlbiBpZiBiYXNlVGFnIGhhcyBmbG93PXRydWVcblx0XHR0YWdEZWYuYmFzZVRhZyA9IGJhc2VUYWcgPSBcIlwiICsgYmFzZVRhZyA9PT0gYmFzZVRhZ1xuXHRcdFx0PyAocGFyZW50VG1wbCAmJiBwYXJlbnRUbXBsLnRhZ3NbYmFzZVRhZ10gfHwgJHRhZ3NbYmFzZVRhZ10pXG5cdFx0XHQ6IGJhc2VUYWc7XG5cblx0XHRjb21waWxlZERlZiA9ICRleHRlbmQoY29tcGlsZWREZWYsIGJhc2VUYWcpO1xuXG5cdFx0Zm9yIChwcm9wIGluIHRhZ0RlZikge1xuXHRcdFx0Y29tcGlsZWREZWZbcHJvcF0gPSBnZXRNZXRob2QoYmFzZVRhZ1twcm9wXSwgdGFnRGVmW3Byb3BdKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29tcGlsZWREZWYgPSAkZXh0ZW5kKGNvbXBpbGVkRGVmLCB0YWdEZWYpO1xuXHR9XG5cblx0Ly8gVGFnIGRlY2xhcmVkIGFzIG9iamVjdCwgdXNlZCBhcyB0aGUgcHJvdG90eXBlIGZvciB0YWcgaW5zdGFudGlhdGlvbiAoY29udHJvbC9wcmVzZW50ZXIpXG5cdGlmICgodG1wbCA9IGNvbXBpbGVkRGVmLnRlbXBsYXRlKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Y29tcGlsZWREZWYudGVtcGxhdGUgPSBcIlwiICsgdG1wbCA9PT0gdG1wbCA/ICgkdGVtcGxhdGVzW3RtcGxdIHx8ICR0ZW1wbGF0ZXModG1wbCkpIDogdG1wbDtcblx0fVxuXHRpZiAoY29tcGlsZWREZWYuaW5pdCAhPT0gZmFsc2UpIHtcblx0XHQvLyBTZXQgaW5pdDogZmFsc2Ugb24gdGFnRGVmIGlmIHlvdSB3YW50IHRvIHByb3ZpZGUganVzdCBhIHJlbmRlciBtZXRob2QsIG9yIHJlbmRlciBhbmQgdGVtcGxhdGUsIGJ1dCBubyBjb25zdHJ1Y3RvciBvciBwcm90b3R5cGUuXG5cdFx0Ly8gc28gZXF1aXZhbGVudCB0byBzZXR0aW5nIHRhZyB0byByZW5kZXIgZnVuY3Rpb24sIGV4Y2VwdCB5b3UgY2FuIGFsc28gcHJvdmlkZSBhIHRlbXBsYXRlLlxuXHRcdChUYWcucHJvdG90eXBlID0gY29tcGlsZWREZWYpLmNvbnN0cnVjdG9yID0gY29tcGlsZWREZWYuX2N0ciA9IFRhZztcblx0fVxuXG5cdGlmIChwYXJlbnRUbXBsKSB7XG5cdFx0Y29tcGlsZWREZWYuX3BhcmVudFRtcGwgPSBwYXJlbnRUbXBsO1xuXHR9XG5cdHJldHVybiBjb21waWxlZERlZjtcbn1cblxuZnVuY3Rpb24gYmFzZUFwcGx5KGFyZ3MpIHtcblx0Ly8gSW4gZGVyaXZlZCBtZXRob2QgKG9yIGhhbmRsZXIgZGVjbGFyZWQgZGVjbGFyYXRpdmVseSBhcyBpbiB7ezpmb28gb25DaGFuZ2U9fmZvb0NoYW5nZWR9fSBjYW4gY2FsbCBiYXNlIG1ldGhvZCxcblx0Ly8gdXNpbmcgdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSAoRXF1aXZhbGVudCB0byB0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cykgaW4galF1ZXJ5IFVJKVxuXHRyZXR1cm4gdGhpcy5iYXNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xufVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVRtcGxcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNvbXBpbGVUbXBsKG5hbWUsIHRtcGwsIHBhcmVudFRtcGwsIG9wdGlvbnMpIHtcblx0Ly8gdG1wbCBpcyBlaXRoZXIgYSB0ZW1wbGF0ZSBvYmplY3QsIGEgc2VsZWN0b3IgZm9yIGEgdGVtcGxhdGUgc2NyaXB0IGJsb2NrLCB0aGUgbmFtZSBvZiBhIGNvbXBpbGVkIHRlbXBsYXRlLCBvciBhIHRlbXBsYXRlIG9iamVjdFxuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gbG9va3VwVGVtcGxhdGUodmFsdWUpIHtcblx0XHQvLyBJZiB2YWx1ZSBpcyBvZiB0eXBlIHN0cmluZyAtIHRyZWF0IGFzIHNlbGVjdG9yLCBvciBuYW1lIG9mIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0Ly8gUmV0dXJuIHRoZSB0ZW1wbGF0ZSBvYmplY3QsIGlmIGFscmVhZHkgY29tcGlsZWQsIG9yIHRoZSBtYXJrdXAgc3RyaW5nXG5cdFx0dmFyIGN1cnJlbnROYW1lLCB0bXBsO1xuXHRcdGlmICgoXCJcIiArIHZhbHVlID09PSB2YWx1ZSkgfHwgdmFsdWUubm9kZVR5cGUgPiAwICYmIChlbGVtID0gdmFsdWUpKSB7XG5cdFx0XHRpZiAoIWVsZW0pIHtcblx0XHRcdFx0aWYgKC9eXFwuXFwvW15cXFxcOio/XCI8Pl0qJC8udGVzdCh2YWx1ZSkpIHtcblx0XHRcdFx0XHQvLyB0bXBsPVwiLi9zb21lL2ZpbGUuaHRtbFwiXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHRlbXBsYXRlIGlzIG5vdCBuYW1lZCwgdXNlIFwiLi9zb21lL2ZpbGUuaHRtbFwiIGFzIG5hbWUuXG5cdFx0XHRcdFx0aWYgKHRtcGwgPSAkdGVtcGxhdGVzW25hbWUgPSBuYW1lIHx8IHZhbHVlXSkge1xuXHRcdFx0XHRcdFx0dmFsdWUgPSB0bXBsO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBCUk9XU0VSLVNQRUNJRklDIENPREUgKG5vdCBvbiBOb2RlLmpzKTpcblx0XHRcdFx0XHRcdC8vIExvb2sgZm9yIHNlcnZlci1nZW5lcmF0ZWQgc2NyaXB0IGJsb2NrIHdpdGggaWQgXCIuL3NvbWUvZmlsZS5odG1sXCJcblx0XHRcdFx0XHRcdGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCQuZm4gJiYgISRzdWIuclRtcGwudGVzdCh2YWx1ZSkpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9ICQoZG9jdW1lbnQpLmZpbmQodmFsdWUpWzBdOyAvLyBpZiBqUXVlcnkgaXMgbG9hZGVkLCB0ZXN0IGZvciBzZWxlY3RvciByZXR1cm5pbmcgZWxlbWVudHMsIGFuZCBnZXQgZmlyc3QgZWxlbWVudFxuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdH0vLyBFTkQgQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0XHR9IC8vQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0XHRpZiAoZWxlbSkge1xuXHRcdFx0XHQvLyBHZW5lcmFsbHkgdGhpcyBpcyBhIHNjcmlwdCBlbGVtZW50LlxuXHRcdFx0XHQvLyBIb3dldmVyIHdlIGFsbG93IGl0IHRvIGJlIGFueSBlbGVtZW50LCBzbyB5b3UgY2FuIGZvciBleGFtcGxlIHRha2UgdGhlIGNvbnRlbnQgb2YgYSBkaXYsXG5cdFx0XHRcdC8vIHVzZSBpdCBhcyBhIHRlbXBsYXRlLCBhbmQgcmVwbGFjZSBpdCBieSB0aGUgc2FtZSBjb250ZW50IHJlbmRlcmVkIGFnYWluc3QgZGF0YS5cblx0XHRcdFx0Ly8gZS5nLiBmb3IgbGlua2luZyB0aGUgY29udGVudCBvZiBhIGRpdiB0byBhIGNvbnRhaW5lciwgYW5kIHVzaW5nIHRoZSBpbml0aWFsIGNvbnRlbnQgYXMgdGVtcGxhdGU6XG5cdFx0XHRcdC8vICQubGluayhcIiNjb250ZW50XCIsIG1vZGVsLCB7dG1wbDogXCIjY29udGVudFwifSk7XG5cdFx0XHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHRcdFx0Ly8gV2Ugd2lsbCBjb21waWxlIGEgbmV3IHRlbXBsYXRlIHVzaW5nIHRoZSBtYXJrdXAgaW4gdGhlIHNjcmlwdCBlbGVtZW50XG5cdFx0XHRcdFx0dmFsdWUgPSBlbGVtLmlubmVySFRNTDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBXZSB3aWxsIGNhY2hlIGEgc2luZ2xlIGNvcHkgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIG5hbWVcblx0XHRcdFx0XHQvLyAocmVuYW1pbmcgZnJvbSBhIHByZXZpb3VzIG5hbWUgaWYgdGhlcmUgd2FzIG9uZSkuXG5cdFx0XHRcdFx0Y3VycmVudE5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZSh0bXBsQXR0cik7XG5cdFx0XHRcdFx0aWYgKGN1cnJlbnROYW1lKSB7XG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudE5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSAkdGVtcGxhdGVzW2N1cnJlbnROYW1lXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlICR0ZW1wbGF0ZXNbY3VycmVudE5hbWVdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICgkLmZuKSB7XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gJC5kYXRhKGVsZW0pW2pzdlRtcGxdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gbmFtZSB8fCAoJC5mbiA/IGpzdlRtcGwgOiB2YWx1ZSk7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGNvbXBpbGVUbXBsKG5hbWUsIGVsZW0uaW5uZXJIVE1MLCBwYXJlbnRUbXBsLCBvcHRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFsdWUudG1wbE5hbWUgPSBuYW1lID0gbmFtZSB8fCBjdXJyZW50TmFtZTtcblx0XHRcdFx0XHRpZiAobmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0XHRcdFx0JHRlbXBsYXRlc1tuYW1lXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSh0bXBsQXR0ciwgbmFtZSk7XG5cdFx0XHRcdFx0aWYgKCQuZm4pIHtcblx0XHRcdFx0XHRcdCQuZGF0YShlbGVtLCBqc3ZUbXBsLCB2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IC8vIEVORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdGVsZW0gPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmICghdmFsdWUuZm4pIHtcblx0XHRcdHZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgbm90IGEgc3RyaW5nLiBIVE1MIGVsZW1lbnQsIG9yIGNvbXBpbGVkIHRlbXBsYXRlLCByZXR1cm4gdW5kZWZpbmVkXG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHZhciBlbGVtLCBjb21waWxlZFRtcGwsXG5cdFx0dG1wbE9yTWFya3VwID0gdG1wbCA9IHRtcGwgfHwgXCJcIjtcblxuXHQvLz09PT0gQ29tcGlsZSB0aGUgdGVtcGxhdGUgPT09PVxuXHRpZiAob3B0aW9ucyA9PT0gMCkge1xuXHRcdG9wdGlvbnMgPSB1bmRlZmluZWQ7XG5cdFx0dG1wbE9yTWFya3VwID0gbG9va3VwVGVtcGxhdGUodG1wbE9yTWFya3VwKTsgLy8gVG9wLWxldmVsIGNvbXBpbGUgc28gZG8gYSB0ZW1wbGF0ZSBsb29rdXBcblx0fVxuXG5cdC8vIElmIG9wdGlvbnMsIHRoZW4gdGhpcyB3YXMgYWxyZWFkeSBjb21waWxlZCBmcm9tIGEgKHNjcmlwdCkgZWxlbWVudCB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi5cblx0Ly8gSWYgbm90LCB0aGVuIGlmIHRtcGwgaXMgYSB0ZW1wbGF0ZSBvYmplY3QsIHVzZSBpdCBmb3Igb3B0aW9uc1xuXHRvcHRpb25zID0gb3B0aW9ucyB8fCAodG1wbC5tYXJrdXAgPyB0bXBsIDoge30pO1xuXHRvcHRpb25zLnRtcGxOYW1lID0gbmFtZTtcblx0aWYgKHBhcmVudFRtcGwpIHtcblx0XHRvcHRpb25zLl9wYXJlbnRUbXBsID0gcGFyZW50VG1wbDtcblx0fVxuXHQvLyBJZiB0bXBsIGlzIG5vdCBhIG1hcmt1cCBzdHJpbmcgb3IgYSBzZWxlY3RvciBzdHJpbmcsIHRoZW4gaXQgbXVzdCBiZSBhIHRlbXBsYXRlIG9iamVjdFxuXHQvLyBJbiB0aGF0IGNhc2UsIGdldCBpdCBmcm9tIHRoZSBtYXJrdXAgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxuXHRpZiAoIXRtcGxPck1hcmt1cCAmJiB0bXBsLm1hcmt1cCAmJiAodG1wbE9yTWFya3VwID0gbG9va3VwVGVtcGxhdGUodG1wbC5tYXJrdXApKSkge1xuXHRcdGlmICh0bXBsT3JNYXJrdXAuZm4pIHtcblx0XHRcdC8vIElmIHRoZSBzdHJpbmcgcmVmZXJlbmNlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIG9iamVjdCwgbmVlZCB0byByZWNvbXBpbGUgdG8gbWVyZ2UgYW55IG1vZGlmaWVkIG9wdGlvbnNcblx0XHRcdHRtcGxPck1hcmt1cCA9IHRtcGxPck1hcmt1cC5tYXJrdXA7XG5cdFx0fVxuXHR9XG5cdGlmICh0bXBsT3JNYXJrdXAgIT09IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0bXBsT3JNYXJrdXAuZm4gfHwgdG1wbC5mbikge1xuXHRcdFx0Ly8gdG1wbCBpcyBhbHJlYWR5IGNvbXBpbGVkLCBzbyB1c2UgaXRcblx0XHRcdGlmICh0bXBsT3JNYXJrdXAuZm4pIHtcblx0XHRcdFx0Y29tcGlsZWRUbXBsID0gdG1wbE9yTWFya3VwO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB0bXBsT3JNYXJrdXAgaXMgYSBtYXJrdXAgc3RyaW5nLCBub3QgYSBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdFx0Ly8gQ3JlYXRlIHRlbXBsYXRlIG9iamVjdFxuXHRcdFx0dG1wbCA9IHRtcGxPYmplY3QodG1wbE9yTWFya3VwLCBvcHRpb25zKTtcblx0XHRcdC8vIENvbXBpbGUgdG8gQVNUIGFuZCB0aGVuIHRvIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHR0bXBsRm4odG1wbE9yTWFya3VwLnJlcGxhY2UockVzY2FwZVF1b3RlcywgXCJcXFxcJCZcIiksIHRtcGwpO1xuXHRcdH1cblx0XHRpZiAoIWNvbXBpbGVkVG1wbCkge1xuXHRcdFx0Y29tcGlsZWRUbXBsID0gJGV4dGVuZChmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVkVG1wbC5yZW5kZXIuYXBwbHkoY29tcGlsZWRUbXBsLCBhcmd1bWVudHMpO1xuXHRcdFx0fSwgdG1wbCk7XG5cblx0XHRcdGNvbXBpbGVDaGlsZFJlc291cmNlcyhjb21waWxlZFRtcGwpO1xuXHRcdH1cblx0XHRpZiAobmFtZSAmJiAhcGFyZW50VG1wbCAmJiBuYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHQkcmVuZGVyW25hbWVdID0gY29tcGlsZWRUbXBsO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZWRUbXBsO1xuXHR9XG59XG5cbi8vPT09PSAvZW5kIG9mIGZ1bmN0aW9uIGNvbXBpbGVUbXBsID09PT1cblxuLy89PT09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVZpZXdNb2RlbFxuLy89PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VmFsKGRlZmF1bHRWYWwsIGRhdGEpIHtcblx0cmV0dXJuICQuaXNGdW5jdGlvbihkZWZhdWx0VmFsKVxuXHRcdD8gZGVmYXVsdFZhbC5jYWxsKGRhdGEpXG5cdFx0OiBkZWZhdWx0VmFsO1xufVxuXG5mdW5jdGlvbiB1bm1hcEFycmF5KG1vZGVsQXJyKSB7XG5cdFx0dmFyIGksIGFyciA9IFtdLFxuXHRcdFx0bCA9IG1vZGVsQXJyLmxlbmd0aDtcblx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdGFyci5wdXNoKG1vZGVsQXJyW2ldLnVubWFwKCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBjb21waWxlVmlld01vZGVsKG5hbWUsIHR5cGUpIHtcblx0dmFyIGksIGNvbnN0cnVjdG9yLFxuXHRcdHZpZXdNb2RlbHMgPSB0aGlzLFxuXHRcdGdldHRlcnMgPSB0eXBlLmdldHRlcnMsXG5cdFx0ZXh0ZW5kID0gdHlwZS5leHRlbmQsXG5cdFx0aWQgPSB0eXBlLmlkLFxuXHRcdHByb3RvID0gJC5leHRlbmQoe1xuXHRcdFx0X2lzOiBuYW1lIHx8IFwidW5uYW1lZFwiLFxuXHRcdFx0dW5tYXA6IHVubWFwLFxuXHRcdFx0bWVyZ2U6IG1lcmdlXG5cdFx0fSwgZXh0ZW5kKSxcblx0XHRhcmdzID0gXCJcIixcblx0XHRib2R5ID0gXCJcIixcblx0XHRsID0gZ2V0dGVycyA/IGdldHRlcnMubGVuZ3RoIDogMCxcblx0XHQkb2JzZXJ2YWJsZSA9ICQub2JzZXJ2YWJsZSxcblx0XHRnZXR0ZXJOYW1lcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIEdldE5ldyhhcmdzKSB7XG5cdFx0Y29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJncyk7XG5cdH1cblxuXHRmdW5jdGlvbiB2bSgpIHtcblx0XHRyZXR1cm4gbmV3IEdldE5ldyhhcmd1bWVudHMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gaXRlcmF0ZShkYXRhLCBhY3Rpb24pIHtcblx0XHR2YXIgaiwgZ2V0dGVyVHlwZSwgZGVmYXVsdFZhbCwgcHJvcCwgb2IsXG5cdFx0XHRtID0gZ2V0dGVycy5sZW5ndGg7XG5cdFx0Zm9yIChqPTA7IGo8bTsgaisrKSB7XG5cdFx0XHRwcm9wID0gZ2V0dGVyc1tqXTtcblx0XHRcdGdldHRlclR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAocHJvcCArIFwiXCIgIT09IHByb3ApIHtcblx0XHRcdFx0Z2V0dGVyVHlwZSA9IHByb3A7XG5cdFx0XHRcdHByb3AgPSBnZXR0ZXJUeXBlLmdldHRlcjtcblx0XHRcdH1cblx0XHRcdGlmICgob2IgPSBkYXRhW3Byb3BdKSA9PT0gdW5kZWZpbmVkICYmIGdldHRlclR5cGUgJiYgKGRlZmF1bHRWYWwgPSBnZXR0ZXJUeXBlLmRlZmF1bHRWYWwpICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0b2IgPSBnZXREZWZhdWx0VmFsKGRlZmF1bHRWYWwsIGRhdGEpO1xuXHRcdFx0fVxuXHRcdFx0YWN0aW9uKG9iLCBnZXR0ZXJUeXBlICYmIHZpZXdNb2RlbHNbZ2V0dGVyVHlwZS50eXBlXSwgcHJvcCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gbWFwKGRhdGEpIHtcblx0XHRkYXRhID0gZGF0YSArIFwiXCIgPT09IGRhdGFcblx0XHRcdD8gSlNPTi5wYXJzZShkYXRhKSAvLyBBY2NlcHQgSlNPTiBzdHJpbmdcblx0XHRcdDogZGF0YTsgICAgICAgICAgICAvLyBvciBvYmplY3QvYXJyYXlcblx0XHR2YXIgaSwgaiwgIGwsIG0sIHByb3AsXG5cdFx0XHRvYiA9IGRhdGEsXG5cdFx0XHRhcnIgPSBbXTtcblxuXHRcdGlmICgkaXNBcnJheShkYXRhKSkge1xuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgW107XG5cdFx0XHRsID0gZGF0YS5sZW5ndGg7XG5cdFx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdFx0YXJyLnB1c2godGhpcy5tYXAoZGF0YVtpXSkpO1xuXHRcdFx0fVxuXHRcdFx0YXJyLl9pcyA9IG5hbWU7XG5cdFx0XHRhcnIudW5tYXAgPSB1bm1hcDtcblx0XHRcdGFyci5tZXJnZSA9IG1lcmdlO1xuXHRcdFx0cmV0dXJuIGFycjtcblx0XHR9XG5cblx0XHRpZiAoZGF0YSkge1xuXHRcdFx0aXRlcmF0ZShkYXRhLCBmdW5jdGlvbihvYiwgdmlld01vZGVsKSB7XG5cdFx0XHRcdGlmICh2aWV3TW9kZWwpIHsgLy8gSXRlcmF0ZSB0byBidWlsZCBnZXR0ZXJzIGFyZyBhcnJheSAodmFsdWUsIG9yIG1hcHBlZCB2YWx1ZSlcblx0XHRcdFx0XHRvYiA9IHZpZXdNb2RlbC5tYXAob2IpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFyci5wdXNoKG9iKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRvYiA9IHRoaXMuYXBwbHkodGhpcywgYXJyKTsgLy8gSW5zYW50aWF0ZSB0aGlzIFZpZXcgTW9kZWwsIHBhc3NpbmcgZ2V0dGVycyBhcmdzIGFycmF5IHRvIGNvbnN0cnVjdG9yXG5cdFx0XHRmb3IgKHByb3AgaW4gZGF0YSkgeyAvLyBDb3B5IG92ZXIgYW55IG90aGVyIHByb3BlcnRpZXMuIHRoYXQgYXJlIG5vdCBnZXQvc2V0IHByb3BlcnRpZXNcblx0XHRcdFx0aWYgKHByb3AgIT09ICRleHBhbmRvICAmJiAhZ2V0dGVyTmFtZXNbcHJvcF0pIHtcblx0XHRcdFx0XHRvYltwcm9wXSA9IGRhdGFbcHJvcF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9iO1xuXHR9XG5cblx0ZnVuY3Rpb24gbWVyZ2UoZGF0YSkge1xuXHRcdGRhdGEgPSBkYXRhICsgXCJcIiA9PT0gZGF0YVxuXHRcdFx0PyBKU09OLnBhcnNlKGRhdGEpIC8vIEFjY2VwdCBKU09OIHN0cmluZ1xuXHRcdFx0OiBkYXRhOyAgICAgICAgICAgIC8vIG9yIG9iamVjdC9hcnJheVxuXHRcdHZhciBpLCBqLCBsLCBtLCBwcm9wLCBtb2QsIGZvdW5kLCBhc3NpZ25lZCwgb2IsIG5ld01vZEFycixcblx0XHRcdG1vZGVsID0gdGhpcztcblxuXHRcdGlmICgkaXNBcnJheShtb2RlbCkpIHtcblx0XHRcdGFzc2lnbmVkID0ge307XG5cdFx0XHRuZXdNb2RBcnIgPSBbXTtcblx0XHRcdGwgPSBkYXRhLmxlbmd0aDtcblx0XHRcdG0gPSBtb2RlbC5sZW5ndGg7XG5cdFx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdFx0b2IgPSBkYXRhW2ldO1xuXHRcdFx0XHRmb3VuZCA9IGZhbHNlO1xuXHRcdFx0XHRmb3IgKGo9MDsgajxtICYmICFmb3VuZDsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKGFzc2lnbmVkW2pdKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kID0gbW9kZWxbal07XG5cblx0XHRcdFx0XHRpZiAoaWQpIHtcblx0XHRcdFx0XHRcdGFzc2lnbmVkW2pdID0gZm91bmQgPSBpZCArIFwiXCIgPT09IGlkXG5cdFx0XHRcdFx0XHQ/IChvYltpZF0gJiYgKGdldHRlck5hbWVzW2lkXSA/IG1vZFtpZF0oKSA6IG1vZFtpZF0pID09PSBvYltpZF0pXG5cdFx0XHRcdFx0XHQ6IGlkKG1vZCwgb2IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZm91bmQpIHtcblx0XHRcdFx0XHRtb2QubWVyZ2Uob2IpO1xuXHRcdFx0XHRcdG5ld01vZEFyci5wdXNoKG1vZCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bmV3TW9kQXJyLnB1c2godm0ubWFwKG9iKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHQkb2JzZXJ2YWJsZShtb2RlbCkucmVmcmVzaChuZXdNb2RBcnIsIHRydWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kZWwuc3BsaWNlLmFwcGx5KG1vZGVsLCBbMCwgbW9kZWwubGVuZ3RoXS5jb25jYXQobmV3TW9kQXJyKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGl0ZXJhdGUoZGF0YSwgZnVuY3Rpb24ob2IsIHZpZXdNb2RlbCwgZ2V0dGVyKSB7XG5cdFx0XHRpZiAodmlld01vZGVsKSB7XG5cdFx0XHRcdG1vZGVsW2dldHRlcl0oKS5tZXJnZShvYik7IC8vIFVwZGF0ZSB0eXBlZCBwcm9wZXJ0eVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kZWxbZ2V0dGVyXShvYik7IC8vIFVwZGF0ZSBub24tdHlwZWQgcHJvcGVydHlcblx0XHRcdH1cblx0XHR9KTtcblx0XHRmb3IgKHByb3AgaW4gZGF0YSkge1xuXHRcdFx0aWYgKHByb3AgIT09ICRleHBhbmRvICYmICFnZXR0ZXJOYW1lc1twcm9wXSkge1xuXHRcdFx0XHRtb2RlbFtwcm9wXSA9IGRhdGFbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gdW5tYXAoKSB7XG5cdFx0dmFyIG9iLCBwcm9wLCBpLCBsLCBnZXR0ZXJUeXBlLCBhcnIsIHZhbHVlLFxuXHRcdFx0bW9kZWwgPSB0aGlzO1xuXG5cdFx0aWYgKCRpc0FycmF5KG1vZGVsKSkge1xuXHRcdFx0cmV0dXJuIHVubWFwQXJyYXkobW9kZWwpO1xuXHRcdH1cblx0XHRvYiA9IHt9O1xuXHRcdGwgPSBnZXR0ZXJzLmxlbmd0aDtcblx0XHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHRcdHByb3AgPSBnZXR0ZXJzW2ldO1xuXHRcdFx0Z2V0dGVyVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGlmIChwcm9wICsgXCJcIiAhPT0gcHJvcCkge1xuXHRcdFx0XHRnZXR0ZXJUeXBlID0gcHJvcDtcblx0XHRcdFx0cHJvcCA9IGdldHRlclR5cGUuZ2V0dGVyO1xuXHRcdFx0fVxuXHRcdFx0dmFsdWUgPSBtb2RlbFtwcm9wXSgpO1xuXHRcdFx0b2JbcHJvcF0gPSBnZXR0ZXJUeXBlICYmIHZhbHVlICYmIHZpZXdNb2RlbHNbZ2V0dGVyVHlwZS50eXBlXVxuXHRcdFx0XHQ/ICRpc0FycmF5KHZhbHVlKVxuXHRcdFx0XHRcdD8gdW5tYXBBcnJheSh2YWx1ZSlcblx0XHRcdFx0XHQ6IHZhbHVlLnVubWFwKClcblx0XHRcdFx0OiB2YWx1ZTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wIGluIG1vZGVsKSB7XG5cdFx0XHRpZiAocHJvcCAhPT0gXCJfaXNcIiAmJiAhZ2V0dGVyTmFtZXNbcHJvcF0gJiYgcHJvcCAhPT0gJGV4cGFuZG8gICYmIChwcm9wLmNoYXJBdCgwKSAhPT0gXCJfXCIgfHwgIWdldHRlck5hbWVzW3Byb3Auc2xpY2UoMSldKSAmJiAhJC5pc0Z1bmN0aW9uKG1vZGVsW3Byb3BdKSkge1xuXHRcdFx0XHRvYltwcm9wXSA9IG1vZGVsW3Byb3BdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb2I7XG5cdH1cblxuXHRHZXROZXcucHJvdG90eXBlID0gcHJvdG87XG5cblx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0KGZ1bmN0aW9uKGdldHRlcikge1xuXHRcdFx0Z2V0dGVyID0gZ2V0dGVyLmdldHRlciB8fCBnZXR0ZXI7XG5cdFx0XHRnZXR0ZXJOYW1lc1tnZXR0ZXJdID0gaSsxO1xuXHRcdFx0dmFyIHByaXZGaWVsZCA9IFwiX1wiICsgZ2V0dGVyO1xuXG5cdFx0XHRhcmdzICs9IChhcmdzID8gXCIsXCIgOiBcIlwiKSArIGdldHRlcjtcblx0XHRcdGJvZHkgKz0gXCJ0aGlzLlwiICsgcHJpdkZpZWxkICsgXCIgPSBcIiArIGdldHRlciArIFwiO1xcblwiO1xuXHRcdFx0cHJvdG9bZ2V0dGVyXSA9IHByb3RvW2dldHRlcl0gfHwgZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzW3ByaXZGaWVsZF07IC8vIElmIHRoZXJlIGlzIG5vIGFyZ3VtZW50LCB1c2UgYXMgYSBnZXR0ZXJcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoJG9ic2VydmFibGUpIHtcblx0XHRcdFx0XHQkb2JzZXJ2YWJsZSh0aGlzKS5zZXRQcm9wZXJ0eShnZXR0ZXIsIHZhbCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpc1twcml2RmllbGRdID0gdmFsO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoJG9ic2VydmFibGUpIHtcblx0XHRcdFx0cHJvdG9bZ2V0dGVyXS5zZXQgPSBwcm90b1tnZXR0ZXJdLnNldCB8fCBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0XHR0aGlzW3ByaXZGaWVsZF0gPSB2YWw7IC8vIFNldHRlciBjYWxsZWQgYnkgb2JzZXJ2YWJsZSBwcm9wZXJ0eSBjaGFuZ2Vcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9KShnZXR0ZXJzW2ldKTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yID0gbmV3IEZ1bmN0aW9uKGFyZ3MsIGJvZHkuc2xpY2UoMCwgLTEpKTtcblx0Y29uc3RydWN0b3IucHJvdG90eXBlID0gcHJvdG87XG5cdHByb3RvLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG5cblx0dm0ubWFwID0gbWFwO1xuXHR2bS5nZXR0ZXJzID0gZ2V0dGVycztcblx0dm0uZXh0ZW5kID0gZXh0ZW5kO1xuXHR2bS5pZCA9IGlkO1xuXHRyZXR1cm4gdm07XG59XG5cbmZ1bmN0aW9uIHRtcGxPYmplY3QobWFya3VwLCBvcHRpb25zKSB7XG5cdC8vIFRlbXBsYXRlIG9iamVjdCBjb25zdHJ1Y3RvclxuXHR2YXIgaHRtbFRhZyxcblx0XHR3cmFwTWFwID0gJHN1YlNldHRpbmdzQWR2YW5jZWQuX3dtIHx8IHt9LCAvLyBPbmx5IHVzZWQgaW4gSnNWaWV3cy4gT3RoZXJ3aXNlIGVtcHR5OiB7fVxuXHRcdHRtcGwgPSAkZXh0ZW5kKFxuXHRcdFx0e1xuXHRcdFx0XHR0bXBsczogW10sXG5cdFx0XHRcdGxpbmtzOiB7fSwgLy8gQ29tcGlsZWQgZnVuY3Rpb25zIGZvciBsaW5rIGV4cHJlc3Npb25zXG5cdFx0XHRcdGJuZHM6IFtdLFxuXHRcdFx0XHRfaXM6IFwidGVtcGxhdGVcIixcblx0XHRcdFx0cmVuZGVyOiByZW5kZXJDb250ZW50XG5cdFx0XHR9LFxuXHRcdFx0b3B0aW9uc1xuXHRcdCk7XG5cblx0dG1wbC5tYXJrdXAgPSBtYXJrdXA7XG5cdGlmICghb3B0aW9ucy5odG1sVGFnKSB7XG5cdFx0Ly8gU2V0IHRtcGwudGFnIHRvIHRoZSB0b3AtbGV2ZWwgSFRNTCB0YWcgdXNlZCBpbiB0aGUgdGVtcGxhdGUsIGlmIGFueS4uLlxuXHRcdGh0bWxUYWcgPSByRmlyc3RFbGVtLmV4ZWMobWFya3VwKTtcblx0XHR0bXBsLmh0bWxUYWcgPSBodG1sVGFnID8gaHRtbFRhZ1sxXS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcblx0fVxuXHRodG1sVGFnID0gd3JhcE1hcFt0bXBsLmh0bWxUYWddO1xuXHRpZiAoaHRtbFRhZyAmJiBodG1sVGFnICE9PSB3cmFwTWFwLmRpdikge1xuXHRcdC8vIFdoZW4gdXNpbmcgSnNWaWV3cywgd2UgdHJpbSB0ZW1wbGF0ZXMgd2hpY2ggYXJlIGluc2VydGVkIGludG8gSFRNTCBjb250ZXh0cyB3aGVyZSB0ZXh0IG5vZGVzIGFyZSBub3QgcmVuZGVyZWQgKGkuZS4gbm90ICdQaHJhc2luZyBDb250ZW50JykuXG5cdFx0Ly8gQ3VycmVudGx5IG5vdCB0cmltbWVkIGZvciA8bGk+IHRhZy4gKE5vdCB3b3J0aCBhZGRpbmcgcGVyZiBjb3N0KVxuXHRcdHRtcGwubWFya3VwID0gJC50cmltKHRtcGwubWFya3VwKTtcblx0fVxuXG5cdHJldHVybiB0bXBsO1xufVxuXG4vLz09PT09PT09PT09PT09XG4vLyByZWdpc3RlclN0b3JlXG4vLz09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU3RvcmUoc3RvcmVOYW1lLCBzdG9yZVNldHRpbmdzKSB7XG5cblx0ZnVuY3Rpb24gdGhlU3RvcmUobmFtZSwgaXRlbSwgcGFyZW50VG1wbCkge1xuXHRcdC8vIFRoZSBzdG9yZSBpcyBhbHNvIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGFkZCBpdGVtcyB0byB0aGUgc3RvcmUuIGUuZy4gJC50ZW1wbGF0ZXMsIG9yICQudmlld3MudGFnc1xuXG5cdFx0Ly8gRm9yIHN0b3JlIG9mIG5hbWUgJ3RoaW5nJywgQ2FsbCBhczpcblx0XHQvLyAgICAkLnZpZXdzLnRoaW5ncyhpdGVtc1ssIHBhcmVudFRtcGxdKSxcblx0XHQvLyBvciAkLnZpZXdzLnRoaW5ncyhuYW1lLCBpdGVtWywgcGFyZW50VG1wbF0pXG5cblx0XHR2YXIgb25TdG9yZSwgY29tcGlsZSwgaXRlbU5hbWUsIHRoaXNTdG9yZTtcblx0XHRpZiAobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gT0JKRUNUICYmICFuYW1lLm5vZGVUeXBlICYmICFuYW1lLm1hcmt1cCAmJiAhbmFtZS5nZXRUZ3QgJiYgIShzdG9yZU5hbWUgPT09IFwidmlld01vZGVsXCIgJiYgbmFtZS5nZXR0ZXJzIHx8IG5hbWUuZXh0ZW5kKSkge1xuXHRcdFx0Ly8gQ2FsbCB0byAkLnZpZXdzLnRoaW5ncyhpdGVtc1ssIHBhcmVudFRtcGxdKSxcblxuXHRcdFx0Ly8gQWRkaW5nIGl0ZW1zIHRvIHRoZSBzdG9yZVxuXHRcdFx0Ly8gSWYgbmFtZSBpcyBhIGhhc2gsIHRoZW4gaXRlbSBpcyBwYXJlbnRUbXBsLiBJdGVyYXRlIG92ZXIgaGFzaCBhbmQgY2FsbCBzdG9yZSBmb3Iga2V5LlxuXHRcdFx0Zm9yIChpdGVtTmFtZSBpbiBuYW1lKSB7XG5cdFx0XHRcdHRoZVN0b3JlKGl0ZW1OYW1lLCBuYW1lW2l0ZW1OYW1lXSwgaXRlbSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaXRlbSB8fCAkdmlld3M7XG5cdFx0fVxuXHRcdC8vIEFkZGluZyBhIHNpbmdsZSB1bm5hbWVkIGl0ZW0gdG8gdGhlIHN0b3JlXG5cdFx0aWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aXRlbSA9IG5hbWU7XG5cdFx0XHRuYW1lID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAobmFtZSAmJiBcIlwiICsgbmFtZSAhPT0gbmFtZSkgeyAvLyBuYW1lIG11c3QgYmUgYSBzdHJpbmdcblx0XHRcdHBhcmVudFRtcGwgPSBpdGVtO1xuXHRcdFx0aXRlbSA9IG5hbWU7XG5cdFx0XHRuYW1lID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0aGlzU3RvcmUgPSBwYXJlbnRUbXBsXG5cdFx0XHQ/IHN0b3JlTmFtZSA9PT0gXCJ2aWV3TW9kZWxcIlxuXHRcdFx0XHQ/IHBhcmVudFRtcGxcblx0XHRcdFx0OiAocGFyZW50VG1wbFtzdG9yZU5hbWVzXSA9IHBhcmVudFRtcGxbc3RvcmVOYW1lc10gfHwge30pXG5cdFx0XHQ6IHRoZVN0b3JlO1xuXHRcdGNvbXBpbGUgPSBzdG9yZVNldHRpbmdzLmNvbXBpbGU7XG5cdFx0aWYgKGl0ZW0gPT09IG51bGwpIHtcblx0XHRcdC8vIElmIGl0ZW0gaXMgbnVsbCwgZGVsZXRlIHRoaXMgZW50cnlcblx0XHRcdGlmIChuYW1lKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzU3RvcmVbbmFtZV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGl0ZW0gPSBjb21waWxlID8gY29tcGlsZS5jYWxsKHRoaXNTdG9yZSwgbmFtZSwgaXRlbSwgcGFyZW50VG1wbCwgMCkgOiBpdGVtO1xuXHRcdFx0aWYgKG5hbWUpIHtcblx0XHRcdFx0dGhpc1N0b3JlW25hbWVdID0gaXRlbTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNvbXBpbGUgJiYgaXRlbSkge1xuXHRcdFx0aXRlbS5faXMgPSBzdG9yZU5hbWU7IC8vIE9ubHkgZG8gdGhpcyBmb3IgY29tcGlsZWQgb2JqZWN0cyAodGFncywgdGVtcGxhdGVzLi4uKVxuXHRcdH1cblx0XHRpZiAoaXRlbSAmJiAob25TdG9yZSA9ICRzdWIub25TdG9yZVtzdG9yZU5hbWVdKSkge1xuXHRcdFx0Ly8gZS5nLiBKc1ZpZXdzIGludGVncmF0aW9uXG5cdFx0XHRvblN0b3JlKG5hbWUsIGl0ZW0sIGNvbXBpbGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gaXRlbTtcblx0fVxuXG5cdHZhciBzdG9yZU5hbWVzID0gc3RvcmVOYW1lICsgXCJzXCI7XG5cblx0JHZpZXdzW3N0b3JlTmFtZXNdID0gdGhlU3RvcmU7XG59XG5cbmZ1bmN0aW9uIGFkZFNldHRpbmcoc3QpIHtcblx0JHZpZXdzU2V0dGluZ3Nbc3RdID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuXHRcdFx0PyAoJHN1YlNldHRpbmdzW3N0XSA9IHZhbHVlLCAkdmlld3NTZXR0aW5ncylcblx0XHRcdDogJHN1YlNldHRpbmdzW3N0XTtcblx0fTtcbn1cblxuLy89PT09PT09PT1cbi8vIGRhdGFNYXBcbi8vPT09PT09PT09XG5cbmZ1bmN0aW9uIGRhdGFNYXAobWFwRGVmKSB7XG5cdGZ1bmN0aW9uIE1hcChzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHR0aGlzLnRndCA9IG1hcERlZi5nZXRUZ3Qoc291cmNlLCBvcHRpb25zKTtcblx0fVxuXG5cdGlmICgkaXNGdW5jdGlvbihtYXBEZWYpKSB7XG5cdFx0Ly8gU2ltcGxlIG1hcCBkZWNsYXJlZCBhcyBmdW5jdGlvblxuXHRcdG1hcERlZiA9IHtcblx0XHRcdGdldFRndDogbWFwRGVmXG5cdFx0fTtcblx0fVxuXG5cdGlmIChtYXBEZWYuYmFzZU1hcCkge1xuXHRcdG1hcERlZiA9ICRleHRlbmQoJGV4dGVuZCh7fSwgbWFwRGVmLmJhc2VNYXApLCBtYXBEZWYpO1xuXHR9XG5cblx0bWFwRGVmLm1hcCA9IGZ1bmN0aW9uKHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdHJldHVybiBuZXcgTWFwKHNvdXJjZSwgb3B0aW9ucyk7XG5cdH07XG5cdHJldHVybiBtYXBEZWY7XG59XG5cbi8vPT09PT09PT09PT09PT1cbi8vIHJlbmRlckNvbnRlbnRcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVuZGVyQ29udGVudChkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50Vmlldywga2V5LCBvblJlbmRlcikge1xuXHR2YXIgaSwgbCwgdGFnLCB0bXBsLCB0YWdDdHgsIGlzVG9wUmVuZGVyQ2FsbCwgcHJldkRhdGEsIHByZXZJbmRleCxcblx0XHR2aWV3ID0gcGFyZW50Vmlldyxcblx0XHRyZXN1bHQgPSBcIlwiO1xuXG5cdGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG5cdFx0bm9JdGVyYXRpb24gPSBjb250ZXh0OyAvLyBwYXNzaW5nIGJvb2xlYW4gYXMgc2Vjb25kIHBhcmFtIC0gbm9JdGVyYXRpb25cblx0XHRjb250ZXh0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSBPQkpFQ1QpIHtcblx0XHRjb250ZXh0ID0gdW5kZWZpbmVkOyAvLyBjb250ZXh0IG11c3QgYmUgYSBib29sZWFuIChub0l0ZXJhdGlvbikgb3IgYSBwbGFpbiBvYmplY3Rcblx0fVxuXG5cdGlmICh0YWcgPSB0aGlzLnRhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBjYWxsIGZyb20gcmVuZGVyVGFnIG9yIHRhZ0N0eC5yZW5kZXIoLi4uKVxuXHRcdHRhZ0N0eCA9IHRoaXM7XG5cdFx0dmlldyA9IHZpZXcgfHwgdGFnQ3R4LnZpZXc7XG5cdFx0dG1wbCA9IHZpZXcuZ2V0VG1wbCh0YWcudGVtcGxhdGUgfHwgdGFnQ3R4LnRtcGwpO1xuXHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0ZGF0YSA9IHZpZXc7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZS5yZW5kZXIoLi4uKSBjYWxsXG5cdFx0dG1wbCA9IHRoaXM7XG5cdH1cblxuXHRpZiAodG1wbCkge1xuXHRcdGlmICghcGFyZW50VmlldyAmJiBkYXRhICYmIGRhdGEuX2lzID09PSBcInZpZXdcIikge1xuXHRcdFx0dmlldyA9IGRhdGE7IC8vIFdoZW4gcGFzc2luZyBpbiBhIHZpZXcgdG8gcmVuZGVyIG9yIGxpbmsgKGFuZCBub3QgcGFzc2luZyBpbiBhIHBhcmVudCB2aWV3KSB1c2UgdGhlIHBhc3NlZC1pbiB2aWV3IGFzIHBhcmVudFZpZXdcblx0XHR9XG5cblx0XHRpZiAodmlldykge1xuXHRcdFx0aWYgKGRhdGEgPT09IHZpZXcpIHtcblx0XHRcdFx0Ly8gSW5oZXJpdCB0aGUgZGF0YSBmcm9tIHRoZSBwYXJlbnQgdmlldy5cblx0XHRcdFx0Ly8gVGhpcyBtYXkgYmUgdGhlIGNvbnRlbnRzIG9mIGFuIHt7aWZ9fSBibG9ja1xuXHRcdFx0XHRkYXRhID0gdmlldy5kYXRhO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlzVG9wUmVuZGVyQ2FsbCA9ICF2aWV3O1xuXHRcdGlzUmVuZGVyQ2FsbCA9IGlzUmVuZGVyQ2FsbCB8fCBpc1RvcFJlbmRlckNhbGw7XG5cdFx0aWYgKCF2aWV3KSB7XG5cdFx0XHQoY29udGV4dCA9IGNvbnRleHQgfHwge30pLnJvb3QgPSBkYXRhOyAvLyBQcm92aWRlIH5yb290IGFzIHNob3J0Y3V0IHRvIHRvcC1sZXZlbCBkYXRhLlxuXHRcdH1cblx0XHRpZiAoIWlzUmVuZGVyQ2FsbCB8fCAkc3ViU2V0dGluZ3NBZHZhbmNlZC51c2VWaWV3cyB8fCB0bXBsLnVzZVZpZXdzIHx8IHZpZXcgJiYgdmlldyAhPT0gdG9wVmlldykge1xuXHRcdFx0cmVzdWx0ID0gcmVuZGVyV2l0aFZpZXdzKHRtcGwsIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCB2aWV3LCBrZXksIG9uUmVuZGVyLCB0YWcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodmlldykgeyAvLyBJbiBhIGJsb2NrXG5cdFx0XHRcdHByZXZEYXRhID0gdmlldy5kYXRhO1xuXHRcdFx0XHRwcmV2SW5kZXggPSB2aWV3LmluZGV4O1xuXHRcdFx0XHR2aWV3LmluZGV4ID0gaW5kZXhTdHI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2aWV3ID0gdG9wVmlldztcblx0XHRcdFx0dmlldy5kYXRhID0gZGF0YTtcblx0XHRcdFx0dmlldy5jdHggPSBjb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0aWYgKCRpc0FycmF5KGRhdGEpICYmICFub0l0ZXJhdGlvbikge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciB0aGUgYXJyYXksIHdob3NlIGNoaWxkIHZpZXdzIGNvcnJlc3BvbmQgdG8gZWFjaCBkYXRhIGl0ZW0uIChOb3RlOiBpZiBrZXkgYW5kIHBhcmVudFZpZXcgYXJlIHBhc3NlZCBpblxuXHRcdFx0XHQvLyBhbG9uZyB3aXRoIHBhcmVudCB2aWV3LCB0cmVhdCBhcyBpbnNlcnQgLWUuZy4gZnJvbSB2aWV3LmFkZFZpZXdzIC0gc28gcGFyZW50VmlldyBpcyBhbHJlYWR5IHRoZSB2aWV3IGl0ZW0gZm9yIGFycmF5KVxuXHRcdFx0XHRmb3IgKGkgPSAwLCBsID0gZGF0YS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHR2aWV3LmluZGV4ID0gaTtcblx0XHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhW2ldO1xuXHRcdFx0XHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGFbaV0sIHZpZXcsICRzdWIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhO1xuXHRcdFx0XHRyZXN1bHQgKz0gdG1wbC5mbihkYXRhLCB2aWV3LCAkc3ViKTtcblx0XHRcdH1cblx0XHRcdHZpZXcuZGF0YSA9IHByZXZEYXRhO1xuXHRcdFx0dmlldy5pbmRleCA9IHByZXZJbmRleDtcblx0XHR9XG5cdFx0aWYgKGlzVG9wUmVuZGVyQ2FsbCkge1xuXHRcdFx0aXNSZW5kZXJDYWxsID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoVmlld3ModG1wbCwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHZpZXcsIGtleSwgb25SZW5kZXIsIHRhZykge1xuXHRmdW5jdGlvbiBzZXRJdGVtVmFyKGl0ZW0pIHtcblx0XHQvLyBXaGVuIGl0ZW1WYXIgaXMgc3BlY2lmaWVkLCBzZXQgbW9kaWZpZWQgY3R4IHdpdGggdXNlci1uYW1lZCB+aXRlbVxuXHRcdG5ld0N0eCA9ICRleHRlbmQoe30sIGNvbnRleHQpO1xuXHRcdG5ld0N0eFtpdGVtVmFyXSA9IGl0ZW07XG5cdH1cblxuXHQvLyBSZW5kZXIgdGVtcGxhdGUgYWdhaW5zdCBkYXRhIGFzIGEgdHJlZSBvZiBzdWJ2aWV3cyAobmVzdGVkIHJlbmRlcmVkIHRlbXBsYXRlIGluc3RhbmNlcyksIG9yIGFzIGEgc3RyaW5nICh0b3AtbGV2ZWwgdGVtcGxhdGUpLlxuXHQvLyBJZiB0aGUgZGF0YSBpcyB0aGUgcGFyZW50IHZpZXcsIHRyZWF0IGFzIG5vSXRlcmF0aW9uLCByZS1yZW5kZXIgd2l0aCB0aGUgc2FtZSBkYXRhIGNvbnRleHQuXG5cdHZhciBpLCBsLCBuZXdWaWV3LCBjaGlsZFZpZXcsIGl0ZW1SZXN1bHQsIHN3YXBDb250ZW50LCBjb250ZW50VG1wbCwgb3V0ZXJPblJlbmRlciwgdG1wbE5hbWUsIGl0ZW1WYXIsIG5ld0N0eCwgdGFnQ3R4LFxuXHRcdHJlc3VsdCA9IFwiXCI7XG5cblx0aWYgKHRhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBjYWxsIGZyb20gcmVuZGVyVGFnIG9yIHRhZ0N0eC5yZW5kZXIoLi4uKVxuXHRcdHRtcGxOYW1lID0gdGFnLnRhZ05hbWU7XG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eDtcblx0XHRjb250ZXh0ID0gY29udGV4dCA/IGV4dGVuZEN0eChjb250ZXh0LCB0YWcuY3R4KSA6IHRhZy5jdHg7XG5cblx0XHRpZiAodG1wbCA9PT0gdmlldy5jb250ZW50KSB7IC8vIHt7eHh4IHRtcGw9I2NvbnRlbnR9fVxuXHRcdFx0Y29udGVudFRtcGwgPSB0bXBsICE9PSB2aWV3LmN0eC5fd3JwIC8vIFdlIGFyZSByZW5kZXJpbmcgdGhlICNjb250ZW50XG5cdFx0XHRcdD8gdmlldy5jdHguX3dycCAvLyAjY29udGVudCB3YXMgdGhlIHRhZ0N0eC5wcm9wcy50bXBsIHdyYXBwZXIgb2YgdGhlIGJsb2NrIGNvbnRlbnQgLSBzbyB3aXRoaW4gdGhpcyB2aWV3LCAjY29udGVudCB3aWxsIG5vdyBiZSB0aGUgdmlldy5jdHguX3dycCBibG9jayBjb250ZW50XG5cdFx0XHRcdDogdW5kZWZpbmVkOyAvLyAjY29udGVudCB3YXMgdGhlIHZpZXcuY3R4Ll93cnAgYmxvY2sgY29udGVudCAtIHNvIHdpdGhpbiB0aGlzIHZpZXcsIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgI2NvbnRlbnQgdG8gd3JhcC5cblx0XHR9IGVsc2UgaWYgKHRtcGwgIT09IHRhZ0N0eC5jb250ZW50KSB7XG5cdFx0XHRpZiAodG1wbCA9PT0gdGFnLnRlbXBsYXRlKSB7IC8vIFJlbmRlcmluZyB7e3RhZ319IHRhZy50ZW1wbGF0ZSwgcmVwbGFjaW5nIGJsb2NrIGNvbnRlbnQuXG5cdFx0XHRcdGNvbnRlbnRUbXBsID0gdGFnQ3R4LnRtcGw7IC8vIFNldCAjY29udGVudCB0byBibG9jayBjb250ZW50IChvciB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgaWYgdGFnQ3R4LnByb3BzLnRtcGwgaXMgc2V0KVxuXHRcdFx0XHRjb250ZXh0Ll93cnAgPSB0YWdDdHguY29udGVudDsgLy8gUGFzcyB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgdG8gbmVzdGVkIHZpZXdzXG5cdFx0XHR9IGVsc2UgeyAvLyBSZW5kZXJpbmcgdGFnQ3R4LnByb3BzLnRtcGwgd3JhcHBlclxuXHRcdFx0XHRjb250ZW50VG1wbCA9IHRhZ0N0eC5jb250ZW50IHx8IHZpZXcuY29udGVudDsgLy8gU2V0ICNjb250ZW50IHRvIHdyYXBwZWQgYmxvY2sgY29udGVudFxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250ZW50VG1wbCA9IHZpZXcuY29udGVudDsgLy8gTmVzdGVkIHZpZXdzIGluaGVyaXQgc2FtZSB3cmFwcGVkICNjb250ZW50IHByb3BlcnR5XG5cdFx0fVxuXG5cdFx0aWYgKHRhZ0N0eC5wcm9wcy5saW5rID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gbGluaz1mYWxzZSBzZXR0aW5nIG9uIGJsb2NrIHRhZ1xuXHRcdFx0Ly8gV2Ugd2lsbCBvdmVycmlkZSBpbmhlcml0ZWQgdmFsdWUgb2YgbGluayBieSB0aGUgZXhwbGljaXQgc2V0dGluZyBsaW5rPWZhbHNlIHRha2VuIGZyb20gcHJvcHNcblx0XHRcdC8vIFRoZSBjaGlsZCB2aWV3cyBvZiBhbiB1bmxpbmtlZCB2aWV3IGFyZSBhbHNvIHVubGlua2VkLiBTbyBzZXR0aW5nIGNoaWxkIGJhY2sgdG8gdHJ1ZSB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QuXG5cdFx0XHRjb250ZXh0ID0gY29udGV4dCB8fCB7fTtcblx0XHRcdGNvbnRleHQubGluayA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtVmFyID0gdGFnQ3R4LnByb3BzLml0ZW1WYXIpIHtcblx0XHRcdGlmIChpdGVtVmFyLmNoYXJBdCgwKSAhPT0gXCJ+XCIpIHtcblx0XHRcdFx0c3ludGF4RXJyb3IoXCJVc2UgaXRlbVZhcj0nfm15SXRlbSdcIik7XG5cdFx0XHR9XG5cdFx0XHRpdGVtVmFyID0gaXRlbVZhci5zbGljZSgxKTtcblx0XHR9XG5cdH1cblxuXHRpZiAodmlldykge1xuXHRcdG9uUmVuZGVyID0gb25SZW5kZXIgfHwgdmlldy5fLm9uUmVuZGVyO1xuXHRcdGNvbnRleHQgPSBleHRlbmRDdHgoY29udGV4dCwgdmlldy5jdHgpO1xuXHR9XG5cblx0aWYgKGtleSA9PT0gdHJ1ZSkge1xuXHRcdHN3YXBDb250ZW50ID0gdHJ1ZTtcblx0XHRrZXkgPSAwO1xuXHR9XG5cblx0Ly8gSWYgbGluaz09PWZhbHNlLCBkbyBub3QgY2FsbCBvblJlbmRlciwgc28gbm8gZGF0YS1saW5raW5nIG1hcmtlciBub2Rlc1xuXHRpZiAob25SZW5kZXIgJiYgKGNvbnRleHQgJiYgY29udGV4dC5saW5rID09PSBmYWxzZSB8fCB0YWcgJiYgdGFnLl8ubm9Wd3MpKSB7XG5cdFx0b25SZW5kZXIgPSB1bmRlZmluZWQ7XG5cdH1cblx0b3V0ZXJPblJlbmRlciA9IG9uUmVuZGVyO1xuXHRpZiAob25SZW5kZXIgPT09IHRydWUpIHtcblx0XHQvLyBVc2VkIGJ5IHZpZXcucmVmcmVzaCgpLiBEb24ndCBjcmVhdGUgYSBuZXcgd3JhcHBlciB2aWV3LlxuXHRcdG91dGVyT25SZW5kZXIgPSB1bmRlZmluZWQ7XG5cdFx0b25SZW5kZXIgPSB2aWV3Ll8ub25SZW5kZXI7XG5cdH1cblx0Ly8gU2V0IGFkZGl0aW9uYWwgY29udGV4dCBvbiB2aWV3cyBjcmVhdGVkIGhlcmUsIChhcyBtb2RpZmllZCBjb250ZXh0IGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQsIGFuZCB0byBiZSBpbmhlcml0ZWQgYnkgY2hpbGQgdmlld3MpXG5cdGNvbnRleHQgPSB0bXBsLmhlbHBlcnNcblx0XHQ/IGV4dGVuZEN0eCh0bXBsLmhlbHBlcnMsIGNvbnRleHQpXG5cdFx0OiBjb250ZXh0O1xuXG5cdG5ld0N0eCA9IGNvbnRleHQ7XG5cdGlmICgkaXNBcnJheShkYXRhKSAmJiAhbm9JdGVyYXRpb24pIHtcblx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciB0aGUgYXJyYXksIHdob3NlIGNoaWxkIHZpZXdzIGNvcnJlc3BvbmQgdG8gZWFjaCBkYXRhIGl0ZW0uIChOb3RlOiBpZiBrZXkgYW5kIHZpZXcgYXJlIHBhc3NlZCBpblxuXHRcdC8vIGFsb25nIHdpdGggcGFyZW50IHZpZXcsIHRyZWF0IGFzIGluc2VydCAtZS5nLiBmcm9tIHZpZXcuYWRkVmlld3MgLSBzbyB2aWV3IGlzIGFscmVhZHkgdGhlIHZpZXcgaXRlbSBmb3IgYXJyYXkpXG5cdFx0bmV3VmlldyA9IHN3YXBDb250ZW50XG5cdFx0XHQ/IHZpZXdcblx0XHRcdDogKGtleSAhPT0gdW5kZWZpbmVkICYmIHZpZXcpXG5cdFx0XHRcdHx8IG5ldyBWaWV3KGNvbnRleHQsIFwiYXJyYXlcIiwgdmlldywgZGF0YSwgdG1wbCwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpO1xuXHRcdGlmICh2aWV3ICYmIHZpZXcuXy51c2VLZXkpIHtcblx0XHRcdC8vIFBhcmVudCBpcyBub3QgYW4gJ2FycmF5IHZpZXcnXG5cdFx0XHRuZXdWaWV3Ll8uYm5kID0gIXRhZyB8fCB0YWcuXy5ibmQgJiYgdGFnOyAvLyBGb3IgYXJyYXkgdmlld3MgdGhhdCBhcmUgZGF0YSBib3VuZCBmb3IgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLCBzZXQgdGhlXG5cdFx0XHQvLyB2aWV3Ll8uYm5kIHByb3BlcnR5IHRvIHRydWUgZm9yIHRvcC1sZXZlbCBsaW5rKCkgb3IgZGF0YS1saW5rPVwie2Zvcn1cIiwgb3IgdG8gdGhlIHRhZyBpbnN0YW5jZSBmb3IgYSBkYXRhLWJvdW5kIHRhZywgZS5nLiB7Xntmb3IgLi4ufX1cblx0XHR9XG5cdFx0aWYgKGl0ZW1WYXIpIHtcblx0XHRcdG5ld1ZpZXcuaXQgPSBpdGVtVmFyO1xuXHRcdH1cblx0XHRpdGVtVmFyID0gbmV3Vmlldy5pdDtcblx0XHRmb3IgKGkgPSAwLCBsID0gZGF0YS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIGVhY2ggZGF0YSBpdGVtLlxuXHRcdFx0aWYgKGl0ZW1WYXIpIHtcblx0XHRcdFx0c2V0SXRlbVZhcihkYXRhW2ldKTsgLy8gdXNlIG1vZGlmaWVkIGN0eCB3aXRoIHVzZXItbmFtZWQgfml0ZW1cblx0XHRcdH1cblx0XHRcdGNoaWxkVmlldyA9IG5ldyBWaWV3KG5ld0N0eCwgXCJpdGVtXCIsIG5ld1ZpZXcsIGRhdGFbaV0sIHRtcGwsIChrZXkgfHwgMCkgKyBpLCBvblJlbmRlciwgbmV3Vmlldy5jb250ZW50KTtcblxuXHRcdFx0aXRlbVJlc3VsdCA9IHRtcGwuZm4oZGF0YVtpXSwgY2hpbGRWaWV3LCAkc3ViKTtcblx0XHRcdHJlc3VsdCArPSBuZXdWaWV3Ll8ub25SZW5kZXIgPyBuZXdWaWV3Ll8ub25SZW5kZXIoaXRlbVJlc3VsdCwgY2hpbGRWaWV3KSA6IGl0ZW1SZXN1bHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHNpbmdsZXRvbiBkYXRhIG9iamVjdC4gVGhlIHR5cGUgb2YgdGhlIHZpZXcgd2lsbCBiZSB0aGUgdGFnIG5hbWUsIGUuZy4gXCJpZlwiIG9yIFwibXlUYWdcIiBleGNlcHQgZm9yXG5cdFx0Ly8gXCJpdGVtXCIsIFwiYXJyYXlcIiBhbmQgXCJkYXRhXCIgdmlld3MuIEEgXCJkYXRhXCIgdmlldyBpcyBmcm9tIHByb2dyYW1tYXRpYyByZW5kZXIob2JqZWN0KSBhZ2FpbnN0IGEgJ3NpbmdsZXRvbicuXG5cdFx0aWYgKGl0ZW1WYXIpIHtcblx0XHRcdHNldEl0ZW1WYXIoZGF0YSk7XG5cdFx0fVxuXHRcdG5ld1ZpZXcgPSBzd2FwQ29udGVudCA/IHZpZXcgOiBuZXcgVmlldyhuZXdDdHgsIHRtcGxOYW1lIHx8IFwiZGF0YVwiLCB2aWV3LCBkYXRhLCB0bXBsLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCk7XG5cdFx0aWYgKHRhZyAmJiAhdGFnLmZsb3cpIHtcblx0XHRcdG5ld1ZpZXcudGFnID0gdGFnO1xuXHRcdFx0dGFnLnZpZXcgPSBuZXdWaWV3O1xuXHRcdH1cblx0XHRyZXN1bHQgKz0gdG1wbC5mbihkYXRhLCBuZXdWaWV3LCAkc3ViKTtcblx0fVxuXHRyZXR1cm4gb3V0ZXJPblJlbmRlciA/IG91dGVyT25SZW5kZXIocmVzdWx0LCBuZXdWaWV3KSA6IHJlc3VsdDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWxkIGFuZCBjb21waWxlIHRlbXBsYXRlXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBHZW5lcmF0ZSBhIHJldXNhYmxlIGZ1bmN0aW9uIHRoYXQgd2lsbCBzZXJ2ZSB0byByZW5kZXIgYSB0ZW1wbGF0ZSBhZ2FpbnN0IGRhdGFcbi8vIChDb21waWxlIEFTVCB0aGVuIGJ1aWxkIHRlbXBsYXRlIGZ1bmN0aW9uKVxuXG5mdW5jdGlvbiBvblJlbmRlckVycm9yKGUsIHZpZXcsIGZhbGxiYWNrKSB7XG5cdHZhciBtZXNzYWdlID0gZmFsbGJhY2sgIT09IHVuZGVmaW5lZFxuXHRcdD8gJGlzRnVuY3Rpb24oZmFsbGJhY2spXG5cdFx0XHQ/IGZhbGxiYWNrLmNhbGwodmlldy5kYXRhLCBlLCB2aWV3KVxuXHRcdFx0OiBmYWxsYmFjayB8fCBcIlwiXG5cdFx0OiBcIntFcnJvcjogXCIgKyBlLm1lc3NhZ2UgKyBcIn1cIjtcblxuXHRpZiAoJHN1YlNldHRpbmdzLm9uRXJyb3IgJiYgKGZhbGxiYWNrID0gJHN1YlNldHRpbmdzLm9uRXJyb3IuY2FsbCh2aWV3LmRhdGEsIGUsIGZhbGxiYWNrICYmIG1lc3NhZ2UsIHZpZXcpKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0bWVzc2FnZSA9IGZhbGxiYWNrOyAvLyBUaGVyZSBpcyBhIHNldHRpbmdzLmRlYnVnTW9kZShoYW5kbGVyKSBvbkVycm9yIG92ZXJyaWRlLiBDYWxsIGl0LCBhbmQgdXNlIHJldHVybiB2YWx1ZSAoaWYgYW55KSB0byByZXBsYWNlIG1lc3NhZ2Vcblx0fVxuXG5cdHJldHVybiB2aWV3ICYmICF2aWV3LmxpbmtDdHggPyAkY29udmVydGVycy5odG1sKG1lc3NhZ2UpIDogbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSkge1xuXHR0aHJvdyBuZXcgJHN1Yi5FcnIobWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHN5bnRheEVycm9yKG1lc3NhZ2UpIHtcblx0ZXJyb3IoXCJTeW50YXggZXJyb3JcXG5cIiArIG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiB0bXBsRm4obWFya3VwLCB0bXBsLCBpc0xpbmtFeHByLCBjb252ZXJ0QmFjaywgaGFzRWxzZSkge1xuXHQvLyBDb21waWxlIG1hcmt1cCB0byBBU1QgKGFidHJhY3Qgc3ludGF4IHRyZWUpIHRoZW4gYnVpbGQgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIGNvZGUgZnJvbSB0aGUgQVNUIG5vZGVzXG5cdC8vIFVzZWQgZm9yIGNvbXBpbGluZyB0ZW1wbGF0ZXMsIGFuZCBhbHNvIGJ5IEpzVmlld3MgdG8gYnVpbGQgZnVuY3Rpb25zIGZvciBkYXRhIGxpbmsgZXhwcmVzc2lvbnNcblxuXHQvLz09PT0gbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cdGZ1bmN0aW9uIHB1c2hwcmVjZWRpbmdDb250ZW50KHNoaWZ0KSB7XG5cdFx0c2hpZnQgLT0gbG9jO1xuXHRcdGlmIChzaGlmdCkge1xuXHRcdFx0Y29udGVudC5wdXNoKG1hcmt1cC5zdWJzdHIobG9jLCBzaGlmdCkucmVwbGFjZShyTmV3TGluZSwgXCJcXFxcblwiKSk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gYmxvY2tUYWdDaGVjayh0YWdOYW1lLCBibG9jaykge1xuXHRcdGlmICh0YWdOYW1lKSB7XG5cdFx0XHR0YWdOYW1lICs9ICd9fSc7XG5cdFx0XHQvL1x0XHRcdCd7e2luY2x1ZGV9fSBibG9jayBoYXMge3svZm9yfX0gd2l0aCBubyBvcGVuIHt7Zm9yfX0nXG5cdFx0XHRzeW50YXhFcnJvcigoXG5cdFx0XHRcdGJsb2NrXG5cdFx0XHRcdFx0PyAne3snICsgYmxvY2sgKyAnfX0gYmxvY2sgaGFzIHt7LycgKyB0YWdOYW1lICsgJyB3aXRob3V0IHt7JyArIHRhZ05hbWVcblx0XHRcdFx0XHQ6ICdVbm1hdGNoZWQgb3IgbWlzc2luZyB7ey8nICsgdGFnTmFtZSkgKyAnLCBpbiB0ZW1wbGF0ZTpcXG4nICsgbWFya3VwKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZVRhZyhhbGwsIGJpbmQsIHRhZ05hbWUsIGNvbnZlcnRlciwgY29sb24sIGh0bWwsIGNvZGVUYWcsIHBhcmFtcywgc2xhc2gsIGJpbmQyLCBjbG9zZUJsb2NrLCBpbmRleCkge1xuLypcblxuICAgICBiaW5kICAgICB0YWdOYW1lICAgICAgICAgY3Z0ICAgY2xuIGh0bWwgY29kZSAgICBwYXJhbXMgICAgICAgICAgICBzbGFzaCAgIGJpbmQyICAgICAgICAgY2xvc2VCbGsgIGNvbW1lbnRcbi8oPzp7KFxcXik/eyg/OihcXHcrKD89W1xcL1xcc31dKSl8KFxcdyspPyg6KXwoPil8KFxcKikpXFxzKigoPzpbXn1dfH0oPyF9KSkqPykoXFwvKT98eyhcXF4pP3soPzooPzpcXC8oXFx3KykpXFxzKnwhLS1bXFxzXFxTXSo/LS0pKX19L2dcblxuKD86XG4gIHsoXFxeKT97ICAgICAgICAgICAgYmluZFxuICAoPzpcbiAgICAoXFx3KyAgICAgICAgICAgICB0YWdOYW1lXG4gICAgICAoPz1bXFwvXFxzfV0pXG4gICAgKVxuICAgIHxcbiAgICAoXFx3Kyk/KDopICAgICAgICBjb252ZXJ0ZXIgY29sb25cbiAgICB8XG4gICAgKD4pICAgICAgICAgICAgICBodG1sXG4gICAgfFxuICAgIChcXCopICAgICAgICAgICAgIGNvZGVUYWdcbiAgKVxuICBcXHMqXG4gICggICAgICAgICAgICAgICAgICBwYXJhbXNcbiAgICAoPzpbXn1dfH0oPyF9KSkqP1xuICApXG4gIChcXC8pPyAgICAgICAgICAgICAgc2xhc2hcbiAgfFxuICB7KFxcXik/eyAgICAgICAgICAgIGJpbmQyXG4gICg/OlxuICAgICg/OlxcLyhcXHcrKSlcXHMqICAgY2xvc2VCbG9ja1xuICAgIHxcbiAgICAhLS1bXFxzXFxTXSo/LS0gICAgY29tbWVudFxuICApXG4pXG59fS9nXG5cbiovXG5cdFx0aWYgKGNvZGVUYWcgJiYgYmluZCB8fCBzbGFzaCAmJiAhdGFnTmFtZSB8fCBwYXJhbXMgJiYgcGFyYW1zLnNsaWNlKC0xKSA9PT0gXCI6XCIgfHwgYmluZDIpIHtcblx0XHRcdHN5bnRheEVycm9yKGFsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQnVpbGQgYWJzdHJhY3Qgc3ludGF4IHRyZWUgKEFTVCk6IFt0YWdOYW1lLCBjb252ZXJ0ZXIsIHBhcmFtcywgY29udGVudCwgaGFzaCwgYmluZGluZ3MsIGNvbnRlbnRNYXJrdXBdXG5cdFx0aWYgKGh0bWwpIHtcblx0XHRcdGNvbG9uID0gXCI6XCI7XG5cdFx0XHRjb252ZXJ0ZXIgPSBIVE1MO1xuXHRcdH1cblx0XHRzbGFzaCA9IHNsYXNoIHx8IGlzTGlua0V4cHIgJiYgIWhhc0Vsc2U7XG5cblx0XHR2YXIgcGF0aEJpbmRpbmdzID0gKGJpbmQgfHwgaXNMaW5rRXhwcikgJiYgW1tdXSxcblx0XHRcdHByb3BzID0gXCJcIixcblx0XHRcdGFyZ3MgPSBcIlwiLFxuXHRcdFx0Y3R4UHJvcHMgPSBcIlwiLFxuXHRcdFx0cGFyYW1zQXJncyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNQcm9wcyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNDdHhQcm9wcyA9IFwiXCIsXG5cdFx0XHRvbkVycm9yID0gXCJcIixcblx0XHRcdHVzZVRyaWdnZXIgPSBcIlwiLFxuXHRcdFx0Ly8gQmxvY2sgdGFnIGlmIG5vdCBzZWxmLWNsb3NpbmcgYW5kIG5vdCB7ezp9fSBvciB7ez59fSAoc3BlY2lhbCBjYXNlKSBhbmQgbm90IGEgZGF0YS1saW5rIGV4cHJlc3Npb25cblx0XHRcdGJsb2NrID0gIXNsYXNoICYmICFjb2xvbjtcblxuXHRcdC8vPT09PSBuZXN0ZWQgaGVscGVyIGZ1bmN0aW9uID09PT1cblx0XHR0YWdOYW1lID0gdGFnTmFtZSB8fCAocGFyYW1zID0gcGFyYW1zIHx8IFwiI2RhdGFcIiwgY29sb24pOyAvLyB7ezp9fSBpcyBlcXVpdmFsZW50IHRvIHt7OiNkYXRhfX1cblx0XHRwdXNocHJlY2VkaW5nQ29udGVudChpbmRleCk7XG5cdFx0bG9jID0gaW5kZXggKyBhbGwubGVuZ3RoOyAvLyBsb2NhdGlvbiBtYXJrZXIgLSBwYXJzZWQgdXAgdG8gaGVyZVxuXHRcdGlmIChjb2RlVGFnKSB7XG5cdFx0XHRpZiAoYWxsb3dDb2RlKSB7XG5cdFx0XHRcdGNvbnRlbnQucHVzaChbXCIqXCIsIFwiXFxuXCIgKyBwYXJhbXMucmVwbGFjZSgvXjovLCBcInJldCs9IFwiKS5yZXBsYWNlKHJVbmVzY2FwZVF1b3RlcywgXCIkMVwiKSArIFwiO1xcblwiXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0YWdOYW1lKSB7XG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCJlbHNlXCIpIHtcblx0XHRcdFx0aWYgKHJUZXN0RWxzZUlmLnRlc3QocGFyYW1zKSkge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKCdmb3IgXCJ7e2Vsc2UgaWYgZXhwcn19XCIgdXNlIFwie3tlbHNlIGV4cHJ9fVwiJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aEJpbmRpbmdzID0gY3VycmVudFs3XSAmJiBbW11dO1xuXHRcdFx0XHRjdXJyZW50WzhdID0gbWFya3VwLnN1YnN0cmluZyhjdXJyZW50WzhdLCBpbmRleCk7IC8vIGNvbnRlbnRNYXJrdXAgZm9yIGJsb2NrIHRhZ1xuXHRcdFx0XHRjdXJyZW50ID0gc3RhY2sucG9wKCk7XG5cdFx0XHRcdGNvbnRlbnQgPSBjdXJyZW50WzJdO1xuXHRcdFx0XHRibG9jayA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zKSB7XG5cdFx0XHRcdC8vIHJlbW92ZSBuZXdsaW5lcyBmcm9tIHRoZSBwYXJhbXMgc3RyaW5nLCB0byBhdm9pZCBjb21waWxlZCBjb2RlIGVycm9ycyBmb3IgdW50ZXJtaW5hdGVkIHN0cmluZ3Ncblx0XHRcdFx0cGFyc2VQYXJhbXMocGFyYW1zLnJlcGxhY2Uock5ld0xpbmUsIFwiIFwiKSwgcGF0aEJpbmRpbmdzLCB0bXBsKVxuXHRcdFx0XHRcdC5yZXBsYWNlKHJCdWlsZEhhc2gsIGZ1bmN0aW9uKGFsbCwgb25lcnJvciwgaXNDdHgsIGtleSwga2V5VG9rZW4sIGtleVZhbHVlLCBhcmcsIHBhcmFtKSB7XG5cdFx0XHRcdFx0XHRrZXkgPSBcIidcIiArIGtleVRva2VuICsgXCInOlwiO1xuXHRcdFx0XHRcdFx0aWYgKGFyZykge1xuXHRcdFx0XHRcdFx0XHRhcmdzICs9IGtleVZhbHVlICsgXCIsXCI7XG5cdFx0XHRcdFx0XHRcdHBhcmFtc0FyZ3MgKz0gXCInXCIgKyBwYXJhbSArIFwiJyxcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNDdHgpIHtcblx0XHRcdFx0XHRcdFx0Y3R4UHJvcHMgKz0ga2V5ICsgJ2ouX2NwKCcgKyBrZXlWYWx1ZSArICcsXCInICsgcGFyYW0gKyAnXCIsdmlldyksJztcblx0XHRcdFx0XHRcdFx0Ly8gQ29tcGlsZWQgY29kZSBmb3IgZXZhbHVhdGluZyB0YWdDdHggb24gYSB0YWcgd2lsbCBoYXZlOiBjdHg6eydmb28nOmouX2NwKGNvbXBpbGVkRXhwciwgXCJleHByXCIsIHZpZXcpfVxuXHRcdFx0XHRcdFx0XHRwYXJhbXNDdHhQcm9wcyArPSBrZXkgKyBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvbmVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdG9uRXJyb3IgKz0ga2V5VmFsdWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAoa2V5VG9rZW4gPT09IFwidHJpZ2dlclwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0dXNlVHJpZ2dlciArPSBrZXlWYWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRwcm9wcyArPSBrZXkgKyBrZXlWYWx1ZSArIFwiLFwiO1xuXHRcdFx0XHRcdFx0XHRwYXJhbXNQcm9wcyArPSBrZXkgKyBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0XHRoYXNIYW5kbGVycyA9IGhhc0hhbmRsZXJzIHx8IHJIYXNIYW5kbGVycy50ZXN0KGtleVRva2VuKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBcIlwiO1xuXHRcdFx0XHRcdH0pLnNsaWNlKDAsIC0xKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBhdGhCaW5kaW5ncyAmJiBwYXRoQmluZGluZ3NbMF0pIHtcblx0XHRcdFx0cGF0aEJpbmRpbmdzLnBvcCgpOyAvLyBSZW1vdmUgdGhlIGJpbmRpbmdzIHRoYXQgd2FzIHByZXBhcmVkIGZvciBuZXh0IGFyZy4gKFRoZXJlIGlzIGFsd2F5cyBhbiBleHRyYSBvbmUgcmVhZHkpLlxuXHRcdFx0fVxuXG5cdFx0XHRuZXdOb2RlID0gW1xuXHRcdFx0XHRcdHRhZ05hbWUsXG5cdFx0XHRcdFx0Y29udmVydGVyIHx8ICEhY29udmVydEJhY2sgfHwgaGFzSGFuZGxlcnMgfHwgXCJcIixcblx0XHRcdFx0XHRibG9jayAmJiBbXSxcblx0XHRcdFx0XHRwYXJzZWRQYXJhbShwYXJhbXNBcmdzIHx8ICh0YWdOYW1lID09PSBcIjpcIiA/IFwiJyNkYXRhJyxcIiA6IFwiXCIpLCBwYXJhbXNQcm9wcywgcGFyYW1zQ3R4UHJvcHMpLCAvLyB7ezp9fSBlcXVpdmFsZW50IHRvIHt7OiNkYXRhfX1cblx0XHRcdFx0XHRwYXJzZWRQYXJhbShhcmdzIHx8ICh0YWdOYW1lID09PSBcIjpcIiA/IFwiZGF0YSxcIiA6IFwiXCIpLCBwcm9wcywgY3R4UHJvcHMpLFxuXHRcdFx0XHRcdG9uRXJyb3IsXG5cdFx0XHRcdFx0dXNlVHJpZ2dlcixcblx0XHRcdFx0XHRwYXRoQmluZGluZ3MgfHwgMFxuXHRcdFx0XHRdO1xuXHRcdFx0Y29udGVudC5wdXNoKG5ld05vZGUpO1xuXHRcdFx0aWYgKGJsb2NrKSB7XG5cdFx0XHRcdHN0YWNrLnB1c2goY3VycmVudCk7XG5cdFx0XHRcdGN1cnJlbnQgPSBuZXdOb2RlO1xuXHRcdFx0XHRjdXJyZW50WzhdID0gbG9jOyAvLyBTdG9yZSBjdXJyZW50IGxvY2F0aW9uIG9mIG9wZW4gdGFnLCB0byBiZSBhYmxlIHRvIGFkZCBjb250ZW50TWFya3VwIHdoZW4gd2UgcmVhY2ggY2xvc2luZyB0YWdcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGNsb3NlQmxvY2spIHtcblx0XHRcdGJsb2NrVGFnQ2hlY2soY2xvc2VCbG9jayAhPT0gY3VycmVudFswXSAmJiBjdXJyZW50WzBdICE9PSBcImVsc2VcIiAmJiBjbG9zZUJsb2NrLCBjdXJyZW50WzBdKTtcblx0XHRcdGN1cnJlbnRbOF0gPSBtYXJrdXAuc3Vic3RyaW5nKGN1cnJlbnRbOF0sIGluZGV4KTsgLy8gY29udGVudE1hcmt1cCBmb3IgYmxvY2sgdGFnXG5cdFx0XHRjdXJyZW50ID0gc3RhY2sucG9wKCk7XG5cdFx0fVxuXHRcdGJsb2NrVGFnQ2hlY2soIWN1cnJlbnQgJiYgY2xvc2VCbG9jayk7XG5cdFx0Y29udGVudCA9IGN1cnJlbnRbMl07XG5cdH1cblx0Ly89PT09IC9lbmQgb2YgbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cblx0dmFyIGksIHJlc3VsdCwgbmV3Tm9kZSwgaGFzSGFuZGxlcnMsIGJpbmRpbmdzLFxuXHRcdGFsbG93Q29kZSA9ICRzdWJTZXR0aW5ncy5hbGxvd0NvZGUgfHwgdG1wbCAmJiB0bXBsLmFsbG93Q29kZVxuXHRcdFx0fHwgJHZpZXdzU2V0dGluZ3MuYWxsb3dDb2RlID09PSB0cnVlLCAvLyBpbmNsdWRlIGRpcmVjdCBzZXR0aW5nIG9mIHNldHRpbmdzLmFsbG93Q29kZSB0cnVlIGZvciBiYWNrd2FyZCBjb21wYXQgb25seVxuXHRcdGFzdFRvcCA9IFtdLFxuXHRcdGxvYyA9IDAsXG5cdFx0c3RhY2sgPSBbXSxcblx0XHRjb250ZW50ID0gYXN0VG9wLFxuXHRcdGN1cnJlbnQgPSBbLCxhc3RUb3BdO1xuXG5cdGlmIChhbGxvd0NvZGUgJiYgdG1wbC5faXMpIHtcblx0XHR0bXBsLmFsbG93Q29kZSA9IGFsbG93Q29kZTtcblx0fVxuXG4vL1RPRE9cdHJlc3VsdCA9IHRtcGxGbnNDYWNoZVttYXJrdXBdOyAvLyBPbmx5IGNhY2hlIGlmIHRlbXBsYXRlIGlzIG5vdCBuYW1lZCBhbmQgbWFya3VwIGxlbmd0aCA8IC4uLixcbi8vYW5kIHRoZXJlIGFyZSBubyBiaW5kaW5ncyBvciBzdWJ0ZW1wbGF0ZXM/PyBDb25zaWRlciBzdGFuZGFyZCBvcHRpbWl6YXRpb24gZm9yIGRhdGEtbGluaz1cImEuYi5jXCJcbi8vXHRcdGlmIChyZXN1bHQpIHtcbi8vXHRcdFx0dG1wbC5mbiA9IHJlc3VsdDtcbi8vXHRcdH0gZWxzZSB7XG5cbi8vXHRcdHJlc3VsdCA9IG1hcmt1cDtcblx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRpZiAoY29udmVydEJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bWFya3VwID0gbWFya3VwLnNsaWNlKDAsIC1jb252ZXJ0QmFjay5sZW5ndGggLSAyKSArIGRlbGltQ2xvc2VDaGFyMDtcblx0XHR9XG5cdFx0bWFya3VwID0gZGVsaW1PcGVuQ2hhcjAgKyBtYXJrdXAgKyBkZWxpbUNsb3NlQ2hhcjE7XG5cdH1cblxuXHRibG9ja1RhZ0NoZWNrKHN0YWNrWzBdICYmIHN0YWNrWzBdWzJdLnBvcCgpWzBdKTtcblx0Ly8gQnVpbGQgdGhlIEFTVCAoYWJzdHJhY3Qgc3ludGF4IHRyZWUpIHVuZGVyIGFzdFRvcFxuXHRtYXJrdXAucmVwbGFjZShyVGFnLCBwYXJzZVRhZyk7XG5cblx0cHVzaHByZWNlZGluZ0NvbnRlbnQobWFya3VwLmxlbmd0aCk7XG5cblx0aWYgKGxvYyA9IGFzdFRvcFthc3RUb3AubGVuZ3RoIC0gMV0pIHtcblx0XHRibG9ja1RhZ0NoZWNrKFwiXCIgKyBsb2MgIT09IGxvYyAmJiAoK2xvY1s4XSA9PT0gbG9jWzhdKSAmJiBsb2NbMF0pO1xuXHR9XG4vL1x0XHRcdHJlc3VsdCA9IHRtcGxGbnNDYWNoZVttYXJrdXBdID0gYnVpbGRDb2RlKGFzdFRvcCwgdG1wbCk7XG4vL1x0XHR9XG5cblx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRyZXN1bHQgPSBidWlsZENvZGUoYXN0VG9wLCBtYXJrdXAsIGlzTGlua0V4cHIpO1xuXHRcdGJpbmRpbmdzID0gW107XG5cdFx0aSA9IGFzdFRvcC5sZW5ndGg7XG5cdFx0d2hpbGUgKGktLSkge1xuXHRcdFx0YmluZGluZ3MudW5zaGlmdChhc3RUb3BbaV1bN10pOyAgLy8gV2l0aCBkYXRhLWxpbmsgZXhwcmVzc2lvbnMsIHBhdGhCaW5kaW5ncyBhcnJheSBmb3IgdGFnQ3R4W2ldIGlzIGFzdFRvcFtpXVs3XVxuXHRcdH1cblx0XHRzZXRQYXRocyhyZXN1bHQsIGJpbmRpbmdzKTtcblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSBidWlsZENvZGUoYXN0VG9wLCB0bXBsKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzZXRQYXRocyhmbiwgcGF0aHNBcnIpIHtcblx0dmFyIGtleSwgcGF0aHMsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IHBhdGhzQXJyLmxlbmd0aDtcblx0Zm4uZGVwcyA9IFtdO1xuXHRmb3IgKDsgaSA8IGw7IGkrKykge1xuXHRcdHBhdGhzID0gcGF0aHNBcnJbaV07XG5cdFx0Zm9yIChrZXkgaW4gcGF0aHMpIHtcblx0XHRcdGlmIChrZXkgIT09IFwiX2pzdnRvXCIgJiYgcGF0aHMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBwYXRoc1trZXldLmxlbmd0aCkge1xuXHRcdFx0XHRmbi5kZXBzID0gZm4uZGVwcy5jb25jYXQocGF0aHNba2V5XSk7IC8vIGRlcHMgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHBhdGhzIGFycmF5cyBmb3IgdGhlIGRpZmZlcmVudCBiaW5kaW5nc1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRmbi5wYXRocyA9IHBhdGhzOyAvLyBUaGUgYXJyYXkgb2YgcGF0aHMgYXJyYXlzIGZvciB0aGUgZGlmZmVyZW50IGJpbmRpbmdzXG59XG5cbmZ1bmN0aW9uIHBhcnNlZFBhcmFtKGFyZ3MsIHByb3BzLCBjdHgpIHtcblx0cmV0dXJuIFthcmdzLnNsaWNlKDAsIC0xKSwgcHJvcHMuc2xpY2UoMCwgLTEpLCBjdHguc2xpY2UoMCwgLTEpXTtcbn1cblxuZnVuY3Rpb24gcGFyYW1TdHJ1Y3R1cmUocGFydHMsIHR5cGUpIHtcblx0cmV0dXJuICdcXG5cXHQnXG5cdFx0KyAodHlwZVxuXHRcdFx0PyB0eXBlICsgJzp7J1xuXHRcdFx0OiAnJylcblx0XHQrICdhcmdzOlsnICsgcGFydHNbMF0gKyAnXSdcblx0XHQrIChwYXJ0c1sxXSB8fCAhdHlwZVxuXHRcdFx0PyAnLFxcblxcdHByb3BzOnsnICsgcGFydHNbMV0gKyAnfSdcblx0XHRcdDogXCJcIilcblx0XHQrIChwYXJ0c1syXSA/ICcsXFxuXFx0Y3R4OnsnICsgcGFydHNbMl0gKyAnfScgOiBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJhbXMocGFyYW1zLCBwYXRoQmluZGluZ3MsIHRtcGwpIHtcblxuXHRmdW5jdGlvbiBwYXJzZVRva2VucyhhbGwsIGxmdFBybjAsIGxmdFBybiwgYm91bmQsIHBhdGgsIG9wZXJhdG9yLCBlcnIsIGVxLCBwYXRoMiwgcHJuLCBjb21tYSwgbGZ0UHJuMiwgYXBvcywgcXVvdCwgcnRQcm4sIHJ0UHJuRG90LCBwcm4yLCBzcGFjZSwgaW5kZXgsIGZ1bGwpIHtcblx0Ly8gLyhcXCgpKD89XFxzKlxcKCl8KD86KFsoW10pXFxzKik/KD86KFxcXj8pKCEqP1sjfl0/W1xcdyQuXl0rKT9cXHMqKChcXCtcXCt8LS0pfFxcK3wtfCYmfFxcfFxcfHw9PT18IT09fD09fCE9fDw9fD49fFs8PiUqOj9cXC9dfCg9KSlcXHMqfCghKj9bI35dP1tcXHckLl5dKykoWyhbXSk/KXwoLFxccyopfChcXCg/KVxcXFw/KD86KCcpfChcIikpfCg/OlxccyooKFspXFxdXSkoPz1cXHMqWy5eXXxcXHMqJHxbXihbXSl8WylcXF1dKShbKFtdPykpfChcXHMrKS9nLFxuXHQvLyAgIGxmdFBybjAgICAgICAgIGxmdFBybiAgICAgICAgYm91bmQgICAgICAgICAgICBwYXRoICAgIG9wZXJhdG9yIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxICAgICAgICAgICAgIHBhdGgyICAgICAgIHBybiAgICBjb21tYSAgIGxmdFBybjIgICBhcG9zIHF1b3QgICAgICBydFBybiBydFBybkRvdCAgICAgICAgICAgICAgICAgICAgICAgIHBybjIgIHNwYWNlXG5cdFx0Ly8gKGxlZnQgcGFyZW4/IGZvbGxvd2VkIGJ5IChwYXRoPyBmb2xsb3dlZCBieSBvcGVyYXRvcikgb3IgKHBhdGggZm9sbG93ZWQgYnkgcGFyZW4/KSkgb3IgY29tbWEgb3IgYXBvcyBvciBxdW90IG9yIHJpZ2h0IHBhcmVuIG9yIHNwYWNlXG5cdFx0ZnVuY3Rpb24gcGFyc2VQYXRoKGFsbFBhdGgsIG5vdCwgb2JqZWN0LCBoZWxwZXIsIHZpZXcsIHZpZXdQcm9wZXJ0eSwgcGF0aFRva2VucywgbGVhZlRva2VuKSB7XG5cdFx0XHQvL3JQYXRoID0gL14oISo/KSg/Om51bGx8dHJ1ZXxmYWxzZXxcXGRbXFxkLl0qfChbXFx3JF0rfFxcLnx+KFtcXHckXSspfCModmlld3woW1xcdyRdKykpPykoW1xcdyQuXl0qPykoPzpbLlteXShbXFx3JF0rKVxcXT8pPykkL2csXG5cdFx0XHQvLyAgICAgICAgICBub3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ICAgICBoZWxwZXIgICAgdmlldyAgdmlld1Byb3BlcnR5IHBhdGhUb2tlbnMgICAgICBsZWFmVG9rZW5cblx0XHRcdHZhciBzdWJQYXRoID0gb2JqZWN0ID09PSBcIi5cIjtcblx0XHRcdGlmIChvYmplY3QpIHtcblx0XHRcdFx0cGF0aCA9IHBhdGguc2xpY2Uobm90Lmxlbmd0aCk7XG5cdFx0XHRcdGlmICgvXlxcLj9jb25zdHJ1Y3RvciQvLnRlc3QobGVhZlRva2VufHxwYXRoKSkge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKGFsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghc3ViUGF0aCkge1xuXHRcdFx0XHRcdGFsbFBhdGggPSAoaGVscGVyXG5cdFx0XHRcdFx0XHRcdD8gJ3ZpZXcuaGxwKFwiJyArIGhlbHBlciArICdcIiknXG5cdFx0XHRcdFx0XHRcdDogdmlld1xuXHRcdFx0XHRcdFx0XHRcdD8gXCJ2aWV3XCJcblx0XHRcdFx0XHRcdFx0XHQ6IFwiZGF0YVwiKVxuXHRcdFx0XHRcdFx0KyAobGVhZlRva2VuXG5cdFx0XHRcdFx0XHRcdD8gKHZpZXdQcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdD8gXCIuXCIgKyB2aWV3UHJvcGVydHlcblx0XHRcdFx0XHRcdFx0XHQ6IGhlbHBlclxuXHRcdFx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ6ICh2aWV3ID8gXCJcIiA6IFwiLlwiICsgb2JqZWN0KVxuXHRcdFx0XHRcdFx0XHRcdCkgKyAocGF0aFRva2VucyB8fCBcIlwiKVxuXHRcdFx0XHRcdFx0XHQ6IChsZWFmVG9rZW4gPSBoZWxwZXIgPyBcIlwiIDogdmlldyA/IHZpZXdQcm9wZXJ0eSB8fCBcIlwiIDogb2JqZWN0LCBcIlwiKSk7XG5cblx0XHRcdFx0XHRhbGxQYXRoID0gYWxsUGF0aCArIChsZWFmVG9rZW4gPyBcIi5cIiArIGxlYWZUb2tlbiA6IFwiXCIpO1xuXG5cdFx0XHRcdFx0YWxsUGF0aCA9IG5vdCArIChhbGxQYXRoLnNsaWNlKDAsIDkpID09PSBcInZpZXcuZGF0YVwiXG5cdFx0XHRcdFx0XHQ/IGFsbFBhdGguc2xpY2UoNSkgLy8gY29udmVydCAjdmlldy5kYXRhLi4uIHRvIGRhdGEuLi5cblx0XHRcdFx0XHRcdDogYWxsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0YmluZHMgPSBuYW1lZCA9PT0gXCJsaW5rVG9cIiA/IChiaW5kdG8gPSBwYXRoQmluZGluZ3MuX2pzdnRvID0gcGF0aEJpbmRpbmdzLl9qc3Z0byB8fCBbXSkgOiBibmRDdHguYmQ7XG5cdFx0XHRcdFx0aWYgKHRoZU9iID0gc3ViUGF0aCAmJiBiaW5kc1tiaW5kcy5sZW5ndGgtMV0pIHtcblx0XHRcdFx0XHRcdGlmICh0aGVPYi5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICh0aGVPYi5zYikge1xuXHRcdFx0XHRcdFx0XHRcdHRoZU9iID0gdGhlT2Iuc2I7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHRoZU9iLmJuZCkge1xuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBcIl5cIiArIHBhdGguc2xpY2UoMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhlT2Iuc2IgPSBwYXRoO1xuXHRcdFx0XHRcdFx0XHR0aGVPYi5ibmQgPSB0aGVPYi5ibmQgfHwgcGF0aC5jaGFyQXQoMCkgPT09IFwiXlwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRiaW5kcy5wdXNoKHBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXRoU3RhcnRbcGFyZW5EZXB0aF0gPSBpbmRleCArIChzdWJQYXRoID8gMSA6IDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYWxsUGF0aDtcblx0XHR9XG5cblx0XHQvL2JvdW5kID0gYmluZGluZ3MgJiYgYm91bmQ7XG5cdFx0aWYgKGJvdW5kICYmICFlcSkge1xuXHRcdFx0cGF0aCA9IGJvdW5kICsgcGF0aDsgLy8gZS5nLiBzb21lLmZuKC4uLilec29tZS5wYXRoIC0gc28gaGVyZSBwYXRoIGlzIFwiXnNvbWUucGF0aFwiXG5cdFx0fVxuXHRcdG9wZXJhdG9yID0gb3BlcmF0b3IgfHwgXCJcIjtcblx0XHRsZnRQcm4gPSBsZnRQcm4gfHwgbGZ0UHJuMCB8fCBsZnRQcm4yO1xuXHRcdHBhdGggPSBwYXRoIHx8IHBhdGgyO1xuXHRcdC8vIENvdWxkIGRvIHRoaXMgLSBidXQgbm90IHdvcnRoIHBlcmYgY29zdD8/IDotXG5cdFx0Ly8gaWYgKCFwYXRoLmxhc3RJbmRleE9mKFwiI2RhdGEuXCIsIDApKSB7IHBhdGggPSBwYXRoLnNsaWNlKDYpOyB9IC8vIElmIHBhdGggc3RhcnRzIHdpdGggXCIjZGF0YS5cIiwgcmVtb3ZlIHRoYXQuXG5cdFx0cHJuID0gcHJuIHx8IHBybjIgfHwgXCJcIjtcblxuXHRcdHZhciBleHByLCBleHByRm4sIGJpbmRzLCB0aGVPYiwgbmV3T2IsXG5cdFx0XHRydFNxID0gXCIpXCI7XG5cblx0XHRpZiAocHJuID09PSBcIltcIikge1xuXHRcdFx0cHJuICA9XCJbai5fc3EoXCI7XG5cdFx0XHRydFNxID0gXCIpXVwiO1xuXHRcdH1cblxuXHRcdGlmIChlcnIgJiYgIWFwb3NlZCAmJiAhcXVvdGVkKSB7XG5cdFx0XHRzeW50YXhFcnJvcihwYXJhbXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYmluZGluZ3MgJiYgcnRQcm5Eb3QgJiYgIWFwb3NlZCAmJiAhcXVvdGVkKSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSBiaW5kaW5nIHRvIGEgcGF0aCBpbiB3aGljaCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgYnkgYSBoZWxwZXIvZGF0YSBmdW5jdGlvbi9leHByZXNzaW9uLCBlLmcuIGZvbygpXngueSBvciAoYT9iOmMpXngueVxuXHRcdFx0XHQvLyBXZSBjcmVhdGUgYSBjb21waWxlZCBmdW5jdGlvbiB0byBnZXQgdGhlIG9iamVjdCBpbnN0YW5jZSAod2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZGVwZW5kZW50IGRhdGEgb2YgdGhlIHN1YmV4cHJlc3Npb24gY2hhbmdlcywgdG8gcmV0dXJuIHRoZSBuZXcgb2JqZWN0LCBhbmQgdHJpZ2dlciByZS1iaW5kaW5nIG9mIHRoZSBzdWJzZXF1ZW50IHBhdGgpXG5cdFx0XHRcdGlmICghbmFtZWQgfHwgYm91bmROYW1lIHx8IGJpbmR0bykge1xuXHRcdFx0XHRcdGV4cHIgPSBwYXRoU3RhcnRbcGFyZW5EZXB0aCAtIDFdO1xuXHRcdFx0XHRcdGlmIChmdWxsLmxlbmd0aCAtIDEgPiBpbmRleCAtIChleHByIHx8IDApKSB7IC8vIFdlIG5lZWQgdG8gY29tcGlsZSBhIHN1YmV4cHJlc3Npb25cblx0XHRcdFx0XHRcdGV4cHIgPSBmdWxsLnNsaWNlKGV4cHIsIGluZGV4ICsgYWxsLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRpZiAoZXhwckZuICE9PSB0cnVlKSB7IC8vIElmIG5vdCByZWVudHJhbnQgY2FsbCBkdXJpbmcgY29tcGlsYXRpb25cblx0XHRcdFx0XHRcdFx0YmluZHMgPSBiaW5kdG8gfHwgYm5kU3RhY2tbcGFyZW5EZXB0aC0xXS5iZDtcblx0XHRcdFx0XHRcdFx0Ly8gSW5zZXJ0IGV4cHJPYiBvYmplY3QsIHRvIGJlIHVzZWQgZHVyaW5nIGJpbmRpbmcgdG8gcmV0dXJuIHRoZSBjb21wdXRlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0dGhlT2IgPSBiaW5kc1tiaW5kcy5sZW5ndGgtMV07XG5cdFx0XHRcdFx0XHRcdGlmICh0aGVPYiAmJiB0aGVPYi5wcm0pIHtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAodGhlT2Iuc2IgJiYgdGhlT2Iuc2IucHJtKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVPYiA9IHRoZU9iLnNiO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRuZXdPYiA9IHRoZU9iLnNiID0ge3BhdGg6IHRoZU9iLnNiLCBibmQ6IHRoZU9iLmJuZH07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0YmluZHMucHVzaChuZXdPYiA9IHtwYXRoOiBiaW5kcy5wb3AoKX0pOyAvLyBJbnNlcnQgZXhwck9iIG9iamVjdCwgdG8gYmUgdXNlZCBkdXJpbmcgYmluZGluZyB0byByZXR1cm4gdGhlIGNvbXB1dGVkIG9iamVjdFxuXHRcdFx0XHRcdFx0XHR9XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAvLyAoZS5nLiBcInNvbWUub2JqZWN0KClcIiBpbiBcInNvbWUub2JqZWN0KCkuYS5iXCIgLSB0byBiZSB1c2VkIGFzIGNvbnRleHQgZm9yIGJpbmRpbmcgdGhlIGZvbGxvd2luZyB0b2tlbnMgXCJhLmJcIilcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJ0UHJuRG90ID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGV4cHIgLy8gVGhlIHBhcmFtZXRlciBvciBmdW5jdGlvbiBzdWJleHByZXNzaW9uXG5cdFx0XHRcdFx0XHRcdCsgXCIgb25lcnJvcj0nJ1wiIC8vIHNldCBvbmVycm9yPScnIGluIG9yZGVyIHRvIHdyYXAgZ2VuZXJhdGVkIGNvZGUgd2l0aCBhIHRyeSBjYXRjaCAtIHJldHVybmluZyAnJyBhcyBvYmplY3QgaW5zdGFuY2UgaWYgdGhlcmUgaXMgYW4gZXJyb3IvbWlzc2luZyBwYXJlbnRcblx0XHRcdFx0XHRcdFx0KyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0XHRcdFx0XHRleHByRm4gPSB0bXBsTGlua3NbcnRQcm5Eb3RdO1xuXHRcdFx0XHRcdFx0aWYgKCFleHByRm4pIHtcblx0XHRcdFx0XHRcdFx0dG1wbExpbmtzW3J0UHJuRG90XSA9IHRydWU7IC8vIEZsYWcgdGhhdCB0aGlzIGV4cHJGbiAoZm9yIHJ0UHJuRG90KSBpcyBiZWluZyBjb21waWxlZFxuXHRcdFx0XHRcdFx0XHR0bXBsTGlua3NbcnRQcm5Eb3RdID0gZXhwckZuID0gdG1wbEZuKHJ0UHJuRG90LCB0bXBsLCB0cnVlKTsgLy8gQ29tcGlsZSB0aGUgZXhwcmVzc2lvbiAob3IgdXNlIGNhY2hlZCBjb3B5IGFscmVhZHkgaW4gdG1wbC5saW5rcylcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChleHByRm4gIT09IHRydWUgJiYgbmV3T2IpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgbm90IHJlZW50cmFudCBjYWxsIGR1cmluZyBjb21waWxhdGlvblxuXHRcdFx0XHRcdFx0XHRuZXdPYi5fanN2ID0gZXhwckZuO1xuXHRcdFx0XHRcdFx0XHRuZXdPYi5wcm0gPSBibmRDdHguYmQ7XG5cdFx0XHRcdFx0XHRcdG5ld09iLmJuZCA9IG5ld09iLmJuZCB8fCBuZXdPYi5wYXRoICYmIG5ld09iLnBhdGguaW5kZXhPZihcIl5cIikgPj0gMDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiAoYXBvc2VkXG5cdFx0XHRcdC8vIHdpdGhpbiBzaW5nbGUtcXVvdGVkIHN0cmluZ1xuXHRcdFx0XHQ/IChhcG9zZWQgPSAhYXBvcywgKGFwb3NlZCA/IGFsbCA6IGxmdFBybjIgKyAnXCInKSlcblx0XHRcdFx0OiBxdW90ZWRcblx0XHRcdFx0Ly8gd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5nXG5cdFx0XHRcdFx0PyAocXVvdGVkID0gIXF1b3QsIChxdW90ZWQgPyBhbGwgOiBsZnRQcm4yICsgJ1wiJykpXG5cdFx0XHRcdFx0OlxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0KGxmdFByblxuXHRcdFx0XHRcdFx0PyAocGF0aFN0YXJ0W3BhcmVuRGVwdGhdID0gaW5kZXgrKywgYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSA9IHtiZDogW119LCBsZnRQcm4pXG5cdFx0XHRcdFx0XHQ6IFwiXCIpXG5cdFx0XHRcdFx0KyAoc3BhY2Vcblx0XHRcdFx0XHRcdD8gKHBhcmVuRGVwdGhcblx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdC8vIE5ldyBhcmcgb3IgcHJvcCAtIHNvIGluc2VydCBiYWNrc3BhY2UgXFxiIChcXHgwOCkgYXMgc2VwYXJhdG9yIGZvciBuYW1lZCBwYXJhbXMsIHVzZWQgc3Vic2VxdWVudGx5IGJ5IHJCdWlsZEhhc2gsIGFuZCBwcmVwYXJlIG5ldyBiaW5kaW5ncyBhcnJheVxuXHRcdFx0XHRcdFx0XHQ6IChwYXJhbUluZGV4ID0gZnVsbC5zbGljZShwYXJhbUluZGV4LCBpbmRleCksIG5hbWVkXG5cdFx0XHRcdFx0XHRcdFx0PyAobmFtZWQgPSBib3VuZE5hbWUgPSBiaW5kdG8gPSBmYWxzZSwgXCJcXGJcIilcblx0XHRcdFx0XHRcdFx0XHQ6IFwiXFxiLFwiKSArIHBhcmFtSW5kZXggKyAocGFyYW1JbmRleCA9IGluZGV4ICsgYWxsLmxlbmd0aCwgYmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzLnB1c2goYm5kQ3R4LmJkID0gW10pLCBcIlxcYlwiKVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0OiBlcVxuXHRcdFx0XHQvLyBuYW1lZCBwYXJhbS4gUmVtb3ZlIGJpbmRpbmdzIGZvciBhcmcgYW5kIGNyZWF0ZSBpbnN0ZWFkIGJpbmRpbmdzIGFycmF5IGZvciBwcm9wXG5cdFx0XHRcdFx0XHRcdD8gKHBhcmVuRGVwdGggJiYgc3ludGF4RXJyb3IocGFyYW1zKSwgYmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzLnBvcCgpLCBuYW1lZCA9IHBhdGgsIGJvdW5kTmFtZSA9IGJvdW5kLCBwYXJhbUluZGV4ID0gaW5kZXggKyBhbGwubGVuZ3RoLCBib3VuZCAmJiAoYmluZGluZ3MgPSBibmRDdHguYmQgPSBwYXRoQmluZGluZ3NbbmFtZWRdID0gW10pLCBwYXRoICsgJzonKVxuXHRcdFx0XHRcdFx0XHQ6IHBhdGhcblx0XHRcdFx0Ly8gcGF0aFxuXHRcdFx0XHRcdFx0XHRcdD8gKHBhdGguc3BsaXQoXCJeXCIpLmpvaW4oXCIuXCIpLnJlcGxhY2UoclBhdGgsIHBhcnNlUGF0aClcblx0XHRcdFx0XHRcdFx0XHRcdCsgKHByblxuXHRcdFx0XHQvLyBzb21lLmZuY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSA9IHtiZDogW119LCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBydFNxLCBwcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3IpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3Jcblx0XHRcdFx0Ly8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdD8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdDogcnRQcm5cblx0XHRcdFx0Ly8gZnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoKHJ0UHJuID0gZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHJ0UHJuLCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBmYWxzZSwgYm5kQ3R4ID0gYm5kU3RhY2tbLS1wYXJlbkRlcHRoXSwgcnRQcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAocHJuIC8vIHJ0UHJuIGFuZCBwcm4sIGUuZyApKCBpbiAoYSkoKSBvciBhKCkoKSwgb3IgKVsgaW4gYSgpW11cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0sIGZuQ2FsbFtwYXJlbkRlcHRoXSA9IHJ0U3EsIHBybilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGNvbW1hXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHN5bnRheEVycm9yKHBhcmFtcyksIFwiLFwiKSAvLyBXZSBkb24ndCBhbGxvdyB0b3AtbGV2ZWwgbGl0ZXJhbCBhcnJheXMgb3Igb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogbGZ0UHJuMFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IChhcG9zZWQgPSBhcG9zLCBxdW90ZWQgPSBxdW90LCAnXCInKVxuXHRcdFx0XHQpKVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgbmFtZWQsIGJpbmR0bywgYm91bmROYW1lLFxuXHRcdHF1b3RlZCwgLy8gYm9vbGVhbiBmb3Igc3RyaW5nIGNvbnRlbnQgaW4gZG91YmxlIHF1b3Rlc1xuXHRcdGFwb3NlZCwgLy8gb3IgaW4gc2luZ2xlIHF1b3Rlc1xuXHRcdGJpbmRpbmdzID0gcGF0aEJpbmRpbmdzICYmIHBhdGhCaW5kaW5nc1swXSwgLy8gYmluZGluZ3MgYXJyYXkgZm9yIHRoZSBmaXJzdCBhcmdcblx0XHRibmRDdHggPSB7YmQ6IGJpbmRpbmdzfSxcblx0XHRibmRTdGFjayA9IHswOiBibmRDdHh9LFxuXHRcdHBhcmFtSW5kZXggPSAwLCAvLyBsaXN0LFxuXHRcdHRtcGxMaW5rcyA9ICh0bXBsID8gdG1wbC5saW5rcyA6IGJpbmRpbmdzICYmIChiaW5kaW5ncy5saW5rcyA9IGJpbmRpbmdzLmxpbmtzIHx8IHt9KSkgfHwgdG9wVmlldy50bXBsLmxpbmtzLFxuXHRcdC8vIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIHRyYWNraW5nIHBhdGggcGFyc2luZyBpbmNsdWRpbmcgbmVzdGVkIHBhdGhzLCBzdWNoIGFzIFwiYS5iKGNeZCArIChlKSleZlwiLCBhbmQgY2hhaW5lZCBjb21wdXRlZCBwYXRocyBzdWNoIGFzXG5cdFx0Ly8gXCJhLmIoKS5jXmQoKS5lLmYoKS5nXCIgLSB3aGljaCBoYXMgZm91ciBjaGFpbmVkIHBhdGhzLCBcImEuYigpXCIsIFwiXmMuZCgpXCIsIFwiLmUuZigpXCIgYW5kIFwiLmdcIlxuXHRcdHBhcmVuRGVwdGggPSAwLFxuXHRcdGZuQ2FsbCA9IHt9LCAvLyBXZSBhcmUgaW4gYSBmdW5jdGlvbiBjYWxsXG5cdFx0cGF0aFN0YXJ0ID0ge30sIC8vIHRyYWNrcyB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGF0aCBzdWNoIGFzIGNeZCgpIGluIHRoZSBhYm92ZSBleGFtcGxlXG5cdFx0cmVzdWx0ID0gKHBhcmFtcyArICh0bXBsID8gXCIgXCIgOiBcIlwiKSkucmVwbGFjZShyUGFyYW1zLCBwYXJzZVRva2Vucyk7XG5cblx0cmV0dXJuICFwYXJlbkRlcHRoICYmIHJlc3VsdCB8fCBzeW50YXhFcnJvcihwYXJhbXMpOyAvLyBTeW50YXggZXJyb3IgaWYgdW5iYWxhbmNlZCBwYXJlbnMgaW4gcGFyYW1zIGV4cHJlc3Npb25cbn1cblxuZnVuY3Rpb24gYnVpbGRDb2RlKGFzdCwgdG1wbCwgaXNMaW5rRXhwcikge1xuXHQvLyBCdWlsZCB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBBU1Qgbm9kZXMsIGFuZCBzZXQgYXMgcHJvcGVydHkgb24gdGhlIHBhc3NlZC1pbiB0ZW1wbGF0ZSBvYmplY3Rcblx0Ly8gVXNlZCBmb3IgY29tcGlsaW5nIHRlbXBsYXRlcywgYW5kIGFsc28gYnkgSnNWaWV3cyB0byBidWlsZCBmdW5jdGlvbnMgZm9yIGRhdGEgbGluayBleHByZXNzaW9uc1xuXHR2YXIgaSwgbm9kZSwgdGFnTmFtZSwgY29udmVydGVyLCB0YWdDdHgsIGhhc1RhZywgaGFzRW5jb2RlciwgZ2V0c1ZhbCwgaGFzQ252dCwgdXNlQ252dCwgdG1wbEJpbmRpbmdzLCBwYXRoQmluZGluZ3MsIHBhcmFtcywgYm91bmRPbkVyclN0YXJ0LCBib3VuZE9uRXJyRW5kLFxuXHRcdHRhZ1JlbmRlciwgbmVzdGVkVG1wbHMsIHRtcGxOYW1lLCBuZXN0ZWRUbXBsLCB0YWdBbmRFbHNlcywgY29udGVudCwgbWFya3VwLCBuZXh0SXNFbHNlLCBvbGRDb2RlLCBpc0Vsc2UsIGlzR2V0VmFsLCB0YWdDdHhGbiwgb25FcnJvciwgdGFnU3RhcnQsIHRyaWdnZXIsXG5cdFx0dG1wbEJpbmRpbmdLZXkgPSAwLFxuXHRcdHVzZVZpZXdzID0gJHN1YlNldHRpbmdzQWR2YW5jZWQudXNlVmlld3MgfHwgdG1wbC51c2VWaWV3cyB8fCB0bXBsLnRhZ3MgfHwgdG1wbC50ZW1wbGF0ZXMgfHwgdG1wbC5oZWxwZXJzIHx8IHRtcGwuY29udmVydGVycyxcblx0XHRjb2RlID0gXCJcIixcblx0XHR0bXBsT3B0aW9ucyA9IHt9LFxuXHRcdGwgPSBhc3QubGVuZ3RoO1xuXG5cdGlmIChcIlwiICsgdG1wbCA9PT0gdG1wbCkge1xuXHRcdHRtcGxOYW1lID0gaXNMaW5rRXhwciA/ICdkYXRhLWxpbms9XCInICsgdG1wbC5yZXBsYWNlKHJOZXdMaW5lLCBcIiBcIikuc2xpY2UoMSwgLTEpICsgJ1wiJyA6IHRtcGw7XG5cdFx0dG1wbCA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0dG1wbE5hbWUgPSB0bXBsLnRtcGxOYW1lIHx8IFwidW5uYW1lZFwiO1xuXHRcdGlmICh0bXBsLmFsbG93Q29kZSkge1xuXHRcdFx0dG1wbE9wdGlvbnMuYWxsb3dDb2RlID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHRtcGwuZGVidWcpIHtcblx0XHRcdHRtcGxPcHRpb25zLmRlYnVnID0gdHJ1ZTtcblx0XHR9XG5cdFx0dG1wbEJpbmRpbmdzID0gdG1wbC5ibmRzO1xuXHRcdG5lc3RlZFRtcGxzID0gdG1wbC50bXBscztcblx0fVxuXHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0Ly8gQVNUIG5vZGVzOiBbMDogdGFnTmFtZSwgMTogY29udmVydGVyLCAyOiBjb250ZW50LCAzOiBwYXJhbXMsIDQ6IGNvZGUsIDU6IG9uRXJyb3IsIDY6IHRyaWdnZXIsIDc6cGF0aEJpbmRpbmdzLCA4OiBjb250ZW50TWFya3VwXVxuXHRcdG5vZGUgPSBhc3RbaV07XG5cblx0XHQvLyBBZGQgbmV3bGluZSBmb3IgZWFjaCBjYWxsb3V0IHRvIHQoKSBjKCkgZXRjLiBhbmQgZWFjaCBtYXJrdXAgc3RyaW5nXG5cdFx0aWYgKFwiXCIgKyBub2RlID09PSBub2RlKSB7XG5cdFx0XHQvLyBhIG1hcmt1cCBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWRcblx0XHRcdGNvZGUgKz0gJ1xcbitcIicgKyBub2RlICsgJ1wiJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYSBjb21waWxlZCB0YWcgZXhwcmVzc2lvbiB0byBiZSBpbnNlcnRlZFxuXHRcdFx0dGFnTmFtZSA9IG5vZGVbMF07XG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCIqXCIpIHtcblx0XHRcdFx0Ly8gQ29kZSB0YWc6IHt7KiB9fVxuXHRcdFx0XHRjb2RlICs9IFwiO1xcblwiICsgbm9kZVsxXSArIFwiXFxucmV0PXJldFwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29udmVydGVyID0gbm9kZVsxXTtcblx0XHRcdFx0Y29udGVudCA9ICFpc0xpbmtFeHByICYmIG5vZGVbMl07XG5cdFx0XHRcdHRhZ0N0eCA9IHBhcmFtU3RydWN0dXJlKG5vZGVbM10sICdwYXJhbXMnKSArICd9LCcgKyBwYXJhbVN0cnVjdHVyZShwYXJhbXMgPSBub2RlWzRdKTtcblx0XHRcdFx0b25FcnJvciA9IG5vZGVbNV07XG5cdFx0XHRcdHRyaWdnZXIgPSBub2RlWzZdO1xuXHRcdFx0XHRtYXJrdXAgPSBub2RlWzhdICYmIG5vZGVbOF0ucmVwbGFjZShyVW5lc2NhcGVRdW90ZXMsIFwiJDFcIik7XG5cdFx0XHRcdGlmIChpc0Vsc2UgPSB0YWdOYW1lID09PSBcImVsc2VcIikge1xuXHRcdFx0XHRcdGlmIChwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdHBhdGhCaW5kaW5ncy5wdXNoKG5vZGVbN10pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0bXBsQmluZGluZ0tleSA9IDA7XG5cdFx0XHRcdFx0aWYgKHRtcGxCaW5kaW5ncyAmJiAocGF0aEJpbmRpbmdzID0gbm9kZVs3XSkpIHsgLy8gQXJyYXkgb2YgcGF0aHMsIG9yIGZhbHNlIGlmIG5vdCBkYXRhLWJvdW5kXG5cdFx0XHRcdFx0XHRwYXRoQmluZGluZ3MgPSBbcGF0aEJpbmRpbmdzXTtcblx0XHRcdFx0XHRcdHRtcGxCaW5kaW5nS2V5ID0gdG1wbEJpbmRpbmdzLnB1c2goMSk7IC8vIEFkZCBwbGFjZWhvbGRlciBpbiB0bXBsQmluZGluZ3MgZm9yIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHVzZVZpZXdzID0gdXNlVmlld3MgfHwgcGFyYW1zWzFdIHx8IHBhcmFtc1syXSB8fCBwYXRoQmluZGluZ3MgfHwgL3ZpZXcuKD8haW5kZXgpLy50ZXN0KHBhcmFtc1swXSk7XG5cdFx0XHRcdC8vIHVzZVZpZXdzIGlzIGZvciBwZXJmIG9wdGltaXphdGlvbi4gRm9yIHJlbmRlcigpIHdlIG9ubHkgdXNlIHZpZXdzIGlmIG5lY2Vzc2FyeSAtIGZvciB0aGUgbW9yZSBhZHZhbmNlZCBzY2VuYXJpb3MuXG5cdFx0XHRcdC8vIFdlIHVzZSB2aWV3cyBpZiB0aGVyZSBhcmUgcHJvcHMsIGNvbnRleHR1YWwgcHJvcGVydGllcyBvciBhcmdzIHdpdGggIy4uLiAob3RoZXIgdGhhbiAjaW5kZXgpIC0gYnV0IHlvdSBjYW4gZm9yY2Vcblx0XHRcdFx0Ly8gdXNpbmcgdGhlIGZ1bGwgdmlldyBpbmZyYXN0cnVjdHVyZSwgKGFuZCBwYXkgYSBwZXJmIHByaWNlKSBieSBvcHRpbmcgaW46IFNldCB1c2VWaWV3czogdHJ1ZSBvbiB0aGUgdGVtcGxhdGUsIG1hbnVhbGx5Li4uXG5cdFx0XHRcdGlmIChpc0dldFZhbCA9IHRhZ05hbWUgPT09IFwiOlwiKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnZlcnRlcikge1xuXHRcdFx0XHRcdFx0dGFnTmFtZSA9IGNvbnZlcnRlciA9PT0gSFRNTCA/IFwiPlwiIDogY29udmVydGVyICsgdGFnTmFtZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRlbnQpIHsgLy8gVE9ETyBvcHRpbWl6ZSAtIGlmIGNvbnRlbnQubGVuZ3RoID09PSAwIG9yIGlmIHRoZXJlIGlzIGEgdG1wbD1cIi4uLlwiIHNwZWNpZmllZCAtIHNldCBjb250ZW50IHRvIG51bGwgLyBkb24ndCBydW4gdGhpcyBjb21waWxhdGlvbiBjb2RlIC0gc2luY2UgY29udGVudCB3b24ndCBnZXQgdXNlZCEhXG5cdFx0XHRcdFx0XHQvLyBDcmVhdGUgdGVtcGxhdGUgb2JqZWN0IGZvciBuZXN0ZWQgdGVtcGxhdGVcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwgPSB0bXBsT2JqZWN0KG1hcmt1cCwgdG1wbE9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbC50bXBsTmFtZSA9IHRtcGxOYW1lICsgXCIvXCIgKyB0YWdOYW1lO1xuXHRcdFx0XHRcdFx0Ly8gQ29tcGlsZSB0byBBU1QgYW5kIHRoZW4gdG8gY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwudXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzIHx8IHVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0YnVpbGRDb2RlKGNvbnRlbnQsIG5lc3RlZFRtcGwpO1xuXHRcdFx0XHRcdFx0dXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbHMucHVzaChuZXN0ZWRUbXBsKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIWlzRWxzZSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBub3QgYW4gZWxzZSB0YWcuXG5cdFx0XHRcdFx0XHR0YWdBbmRFbHNlcyA9IHRhZ05hbWU7XG5cdFx0XHRcdFx0XHR1c2VWaWV3cyA9IHVzZVZpZXdzIHx8IHRhZ05hbWUgJiYgKCEkdGFnc1t0YWdOYW1lXSB8fCAhJHRhZ3NbdGFnTmFtZV0uZmxvdyk7XG5cdFx0XHRcdFx0XHQvLyBTd2l0Y2ggdG8gYSBuZXcgY29kZSBzdHJpbmcgZm9yIHRoaXMgYm91bmQgdGFnIChhbmQgaXRzIGVsc2VzLCBpZiBpdCBoYXMgYW55KSAtIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRcdG9sZENvZGUgPSBjb2RlO1xuXHRcdFx0XHRcdFx0Y29kZSA9IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBhc3RbaSArIDFdO1xuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBuZXh0SXNFbHNlICYmIG5leHRJc0Vsc2VbMF0gPT09IFwiZWxzZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZ1N0YXJ0ID0gb25FcnJvciA/IFwiO1xcbnRyeXtcXG5yZXQrPVwiIDogXCJcXG4rXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IFwiXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChpc0dldFZhbCAmJiAocGF0aEJpbmRpbmdzIHx8IHRyaWdnZXIgfHwgY29udmVydGVyICYmIGNvbnZlcnRlciAhPT0gSFRNTCkpIHtcblx0XHRcdFx0XHQvLyBGb3IgY29udmVydFZhbCB3ZSBuZWVkIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBuZXcgdGFnQ3R4KHMpXG5cdFx0XHRcdFx0dGFnQ3R4Rm4gPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIFwiIC8vIFwiICsgdG1wbE5hbWUgKyBcIiBcIiArIHRtcGxCaW5kaW5nS2V5ICsgXCIgXCIgKyB0YWdOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgXCJcXG5yZXR1cm4ge1wiICsgdGFnQ3R4ICsgXCJ9O1wiKTtcblx0XHRcdFx0XHR0YWdDdHhGbi5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdHRhZ0N0eEZuLl90YWcgPSB0YWdOYW1lO1xuXG5cdFx0XHRcdFx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0YWdDdHhGbjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzZXRQYXRocyh0YWdDdHhGbiwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHR0YWdSZW5kZXIgPSAnYyhcIicgKyBjb252ZXJ0ZXIgKyAnXCIsdmlldywnO1xuXHRcdFx0XHRcdHVzZUNudnQgPSB0cnVlO1xuXHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsXCI7XG5cdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGUgKz0gKGlzR2V0VmFsXG5cdFx0XHRcdFx0PyAoaXNMaW5rRXhwciA/IChvbkVycm9yID8gXCJ0cnl7XFxuXCIgOiBcIlwiKSArIFwicmV0dXJuIFwiIDogdGFnU3RhcnQpICsgKHVzZUNudnQgLy8gQ2FsbCBfY252dCBpZiB0aGVyZSBpcyBhIGNvbnZlcnRlcjoge3tjbnZ0OiAuLi4gfX0gb3Ige157Y252dDogLi4uIH19XG5cdFx0XHRcdFx0XHQ/ICh1c2VDbnZ0ID0gdW5kZWZpbmVkLCB1c2VWaWV3cyA9IGhhc0NudnQgPSB0cnVlLCB0YWdSZW5kZXIgKyAocGF0aEJpbmRpbmdzXG5cdFx0XHRcdFx0XHRcdD8gKCh0bXBsQmluZGluZ3NbdG1wbEJpbmRpbmdLZXkgLSAxXSA9IHRhZ0N0eEZuKSwgdG1wbEJpbmRpbmdLZXkpIC8vIFN0b3JlIHRoZSBjb21waWxlZCB0YWdDdHhGbiBpbiB0bXBsLmJuZHMsIGFuZCBwYXNzIHRoZSBrZXkgdG8gY29udmVydFZhbCgpXG5cdFx0XHRcdFx0XHRcdDogXCJ7XCIgKyB0YWdDdHggKyBcIn1cIikgKyBcIilcIilcblx0XHRcdFx0XHRcdDogdGFnTmFtZSA9PT0gXCI+XCJcblx0XHRcdFx0XHRcdFx0PyAoaGFzRW5jb2RlciA9IHRydWUsIFwiaChcIiArIHBhcmFtc1swXSArIFwiKVwiKVxuXHRcdFx0XHRcdFx0XHQ6IChnZXRzVmFsID0gdHJ1ZSwgXCIoKHY9XCIgKyBwYXJhbXNbMF0gKyAnKSE9bnVsbD92OicgKyAoaXNMaW5rRXhwciA/ICdudWxsKScgOiAnXCJcIiknKSlcblx0XHRcdFx0XHRcdFx0Ly8gTm9uIHN0cmljdCBlcXVhbGl0eSBzbyBkYXRhLWxpbms9XCJ0aXRsZXs6ZXhwcn1cIiB3aXRoIGV4cHI9bnVsbC91bmRlZmluZWQgcmVtb3ZlcyB0aXRsZSBhdHRyaWJ1dGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0OiAoaGFzVGFnID0gdHJ1ZSwgXCJcXG57dmlldzp2aWV3LHRtcGw6XCIgLy8gQWRkIHRoaXMgdGFnQ3R4IHRvIHRoZSBjb21waWxlZCBjb2RlIGZvciB0aGUgdGFnQ3R4cyB0byBiZSBwYXNzZWQgdG8gcmVuZGVyVGFnKClcblx0XHRcdFx0XHRcdCsgKGNvbnRlbnQgPyBuZXN0ZWRUbXBscy5sZW5ndGggOiBcIjBcIikgKyBcIixcIiAvLyBGb3IgYmxvY2sgdGFncywgcGFzcyBpbiB0aGUga2V5IChuZXN0ZWRUbXBscy5sZW5ndGgpIHRvIHRoZSBuZXN0ZWQgY29udGVudCB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0KyB0YWdDdHggKyBcIn0sXCIpKTtcblxuXHRcdFx0XHRpZiAodGFnQW5kRWxzZXMgJiYgIW5leHRJc0Vsc2UpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgYW4gaW5saW5lIHRhZyB3aXRob3V0IGFueSBlbHNlcywgb3IgdGhlIGxhc3Qge3tlbHNlfX0gb2YgYW4gaW5saW5lIHRhZ1xuXHRcdFx0XHRcdC8vIFdlIGNvbXBsZXRlIHRoZSBjb2RlIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRjb2RlID0gXCJbXCIgKyBjb2RlLnNsaWNlKDAsIC0xKSArIFwiXVwiO1xuXHRcdFx0XHRcdHRhZ1JlbmRlciA9ICd0KFwiJyArIHRhZ0FuZEVsc2VzICsgJ1wiLHZpZXcsdGhpcywnO1xuXHRcdFx0XHRcdGlmIChpc0xpbmtFeHByIHx8IHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGJvdW5kIHRhZyAoZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgaW5saW5lIGJvdW5kIHRhZyB7Xnt0YWcgLi4ufX0pIHNvIHdlIHN0b3JlIGEgY29tcGlsZWQgdGFnQ3R4cyBmdW5jdGlvbiBpbiB0bXAuYm5kc1xuXHRcdFx0XHRcdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgXCIgLy8gXCIgKyB0bXBsTmFtZSArIFwiIFwiICsgdG1wbEJpbmRpbmdLZXkgKyBcIiBcIiArIHRhZ0FuZEVsc2VzICsgXCJcXG5yZXR1cm4gXCIgKyBjb2RlICsgXCI7XCIpO1xuXHRcdFx0XHRcdFx0Y29kZS5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdFx0Y29kZS5fdGFnID0gdGFnQW5kRWxzZXM7XG5cdFx0XHRcdFx0XHRpZiAocGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRcdHNldFBhdGhzKHRtcGxCaW5kaW5nc1t0bXBsQmluZGluZ0tleSAtIDFdID0gY29kZSwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb2RlOyAvLyBGb3IgYSBkYXRhLWxpbmsgZXhwcmVzc2lvbiB3ZSByZXR1cm4gdGhlIGNvbXBpbGVkIHRhZ0N0eHMgZnVuY3Rpb25cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsdW5kZWZpbmVkLFwiO1xuXHRcdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgdGhlIGxhc3Qge3tlbHNlfX0gZm9yIGFuIGlubGluZSB0YWcuXG5cdFx0XHRcdFx0Ly8gRm9yIGEgYm91bmQgdGFnLCBwYXNzIHRoZSB0YWdDdHhzIGZuIGxvb2t1cCBrZXkgdG8gcmVuZGVyVGFnLlxuXHRcdFx0XHRcdC8vIEZvciBhbiB1bmJvdW5kIHRhZywgaW5jbHVkZSB0aGUgY29kZSBkaXJlY3RseSBmb3IgZXZhbHVhdGluZyB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0Y29kZSA9IG9sZENvZGUgKyB0YWdTdGFydCArIHRhZ1JlbmRlciArICh0bXBsQmluZGluZ0tleSB8fCBjb2RlKSArIFwiKVwiO1xuXHRcdFx0XHRcdHBhdGhCaW5kaW5ncyA9IDA7XG5cdFx0XHRcdFx0dGFnQW5kRWxzZXMgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvbkVycm9yKSB7XG5cdFx0XHRcdFx0dXNlVmlld3MgPSB0cnVlO1xuXHRcdFx0XHRcdGNvZGUgKz0gJztcXG59Y2F0Y2goZSl7cmV0JyArIChpc0xpbmtFeHByID8gXCJ1cm4gXCIgOiBcIis9XCIpICsgYm91bmRPbkVyclN0YXJ0ICsgJ2ouX2VycihlLHZpZXcsJyArIG9uRXJyb3IgKyAnKScgKyBib3VuZE9uRXJyRW5kICsgJzt9JyArIChpc0xpbmtFeHByID8gXCJcIiA6ICdyZXQ9cmV0Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gSW5jbHVkZSBvbmx5IHRoZSB2YXIgcmVmZXJlbmNlcyB0aGF0IGFyZSBuZWVkZWQgaW4gdGhlIGNvZGVcblx0Y29kZSA9IFwiLy8gXCIgKyB0bXBsTmFtZVxuXG5cdFx0KyBcIlxcbnZhciB2XCJcblx0XHQrIChoYXNUYWcgPyBcIix0PWouX3RhZ1wiIDogXCJcIikgICAgICAgICAgICAgICAgLy8gaGFzIHRhZ1xuXHRcdCsgKGhhc0NudnQgPyBcIixjPWouX2NudnRcIiA6IFwiXCIpICAgICAgICAgICAgICAvLyBjb252ZXJ0ZXJcblx0XHQrIChoYXNFbmNvZGVyID8gXCIsaD1qLl9odG1sXCIgOiBcIlwiKSAgICAgICAgICAgLy8gaHRtbCBjb252ZXJ0ZXJcblx0XHQrIChpc0xpbmtFeHByID8gXCI7XFxuXCIgOiAnLHJldD1cIlwiXFxuJylcblx0XHQrICh0bXBsT3B0aW9ucy5kZWJ1ZyA/IFwiZGVidWdnZXI7XCIgOiBcIlwiKVxuXHRcdCsgY29kZVxuXHRcdCsgKGlzTGlua0V4cHIgPyBcIlxcblwiIDogXCI7XFxucmV0dXJuIHJldDtcIik7XG5cblx0aWYgKCRzdWJTZXR0aW5ncy5kZWJ1Z01vZGUgIT09IGZhbHNlKSB7XG5cdFx0Y29kZSA9IFwidHJ5IHtcXG5cIiArIGNvZGUgKyBcIlxcbn1jYXRjaChlKXtcXG5yZXR1cm4gai5fZXJyKGUsIHZpZXcpO1xcbn1cIjtcblx0fVxuXG5cdHRyeSB7XG5cdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgY29kZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRzeW50YXhFcnJvcihcIkNvbXBpbGVkIHRlbXBsYXRlIGNvZGU6XFxuXFxuXCIgKyBjb2RlICsgJ1xcbjogXCInICsgZS5tZXNzYWdlICsgJ1wiJyk7XG5cdH1cblx0aWYgKHRtcGwpIHtcblx0XHR0bXBsLmZuID0gY29kZTtcblx0XHR0bXBsLnVzZVZpZXdzID0gISF1c2VWaWV3cztcblx0fVxuXHRyZXR1cm4gY29kZTtcbn1cblxuLy89PT09PT09PT09XG4vLyBVdGlsaXRpZXNcbi8vPT09PT09PT09PVxuXG4vLyBNZXJnZSBvYmplY3RzLCBpbiBwYXJ0aWN1bGFyIGNvbnRleHRzIHdoaWNoIGluaGVyaXQgZnJvbSBwYXJlbnQgY29udGV4dHNcbmZ1bmN0aW9uIGV4dGVuZEN0eChjb250ZXh0LCBwYXJlbnRDb250ZXh0KSB7XG5cdC8vIFJldHVybiBjb3B5IG9mIHBhcmVudENvbnRleHQsIHVubGVzcyBjb250ZXh0IGlzIGRlZmluZWQgYW5kIGlzIGRpZmZlcmVudCwgaW4gd2hpY2ggY2FzZSByZXR1cm4gYSBuZXcgbWVyZ2VkIGNvbnRleHRcblx0Ly8gSWYgbmVpdGhlciBjb250ZXh0IG5vciBwYXJlbnRDb250ZXh0IGFyZSBkZWZpbmVkLCByZXR1cm4gdW5kZWZpbmVkXG5cdHJldHVybiBjb250ZXh0ICYmIGNvbnRleHQgIT09IHBhcmVudENvbnRleHRcblx0XHQ/IChwYXJlbnRDb250ZXh0XG5cdFx0XHQ/ICRleHRlbmQoJGV4dGVuZCh7fSwgcGFyZW50Q29udGV4dCksIGNvbnRleHQpXG5cdFx0XHQ6IGNvbnRleHQpXG5cdFx0OiBwYXJlbnRDb250ZXh0ICYmICRleHRlbmQoe30sIHBhcmVudENvbnRleHQpO1xufVxuXG4vLyBHZXQgY2hhcmFjdGVyIGVudGl0eSBmb3IgSFRNTCBhbmQgQXR0cmlidXRlIGVuY29kaW5nXG5mdW5jdGlvbiBnZXRDaGFyRW50aXR5KGNoKSB7XG5cdHJldHVybiBjaGFyRW50aXRpZXNbY2hdIHx8IChjaGFyRW50aXRpZXNbY2hdID0gXCImI1wiICsgY2guY2hhckNvZGVBdCgwKSArIFwiO1wiKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0UHJvcHMoc291cmNlKSB7XG5cdC8vIHRoaXMgcG9pbnRlciBpcyB0aGVNYXAgLSB3aGljaCBoYXMgdGFnQ3R4LnByb3BzIHRvb1xuXHQvLyBhcmd1bWVudHM6IHRhZ0N0eC5hcmdzLlxuXHR2YXIga2V5LCBwcm9wLFxuXHRcdHByb3BzID0gW107XG5cblx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IE9CSkVDVCkge1xuXHRcdGZvciAoa2V5IGluIHNvdXJjZSkge1xuXHRcdFx0cHJvcCA9IHNvdXJjZVtrZXldO1xuXHRcdFx0aWYgKGtleSAhPT0gJGV4cGFuZG8gJiYgc291cmNlLmhhc093blByb3BlcnR5KGtleSkgJiYgISRpc0Z1bmN0aW9uKHByb3ApKSB7XG5cdFx0XHRcdHByb3BzLnB1c2goe2tleToga2V5LCBwcm9wOiBwcm9wfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wcztcbn1cblxuZnVuY3Rpb24gJGZuUmVuZGVyKGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKSB7XG5cdHZhciB0bXBsRWxlbSA9IHRoaXMuanF1ZXJ5ICYmICh0aGlzWzBdIHx8IGVycm9yKCdVbmtub3duIHRlbXBsYXRlOiBcIicgKyB0aGlzLnNlbGVjdG9yICsgJ1wiJykpLFxuXHRcdHRtcGwgPSB0bXBsRWxlbS5nZXRBdHRyaWJ1dGUodG1wbEF0dHIpO1xuXG5cdHJldHVybiByZW5kZXJDb250ZW50LmNhbGwodG1wbCA/ICQuZGF0YSh0bXBsRWxlbSlbanN2VG1wbF0gOiAkdGVtcGxhdGVzKHRtcGxFbGVtKSwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24pO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZ2lzdGVyIGNvbnZlcnRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gaHRtbEVuY29kZSh0ZXh0KSB7XG5cdC8vIEhUTUwgZW5jb2RlOiBSZXBsYWNlIDwgPiAmICcgYW5kIFwiIGJ5IGNvcnJlc3BvbmRpbmcgZW50aXRpZXMuXG5cdHJldHVybiB0ZXh0ICE9IHVuZGVmaW5lZCA/IHJJc0h0bWwudGVzdCh0ZXh0KSAmJiAoXCJcIiArIHRleHQpLnJlcGxhY2Uockh0bWxFbmNvZGUsIGdldENoYXJFbnRpdHkpIHx8IHRleHQgOiBcIlwiO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJHN1YiA9ICR2aWV3cy5zdWI7XG4kdmlld3NTZXR0aW5ncyA9ICR2aWV3cy5zZXR0aW5ncztcblxuaWYgKCEoanNyIHx8ICQgJiYgJC5yZW5kZXIpKSB7XG5cdC8vIEpzUmVuZGVyIG5vdCBhbHJlYWR5IGxvYWRlZCwgb3IgbG9hZGVkIHdpdGhvdXQgalF1ZXJ5LCBhbmQgd2UgYXJlIG5vdyBtb3ZpbmcgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVwYWNlXG5cdGZvciAoanN2U3RvcmVOYW1lIGluIGpzdlN0b3Jlcykge1xuXHRcdHJlZ2lzdGVyU3RvcmUoanN2U3RvcmVOYW1lLCBqc3ZTdG9yZXNbanN2U3RvcmVOYW1lXSk7XG5cdH1cblxuXHQkY29udmVydGVycyA9ICR2aWV3cy5jb252ZXJ0ZXJzO1xuXHQkaGVscGVycyA9ICR2aWV3cy5oZWxwZXJzO1xuXHQkdGFncyA9ICR2aWV3cy50YWdzO1xuXG5cdCRzdWIuX3RnLnByb3RvdHlwZSA9IHtcblx0XHRiYXNlQXBwbHk6IGJhc2VBcHBseSxcblx0XHRjdnRBcmdzOiBjb252ZXJ0QXJnc1xuXHR9O1xuXG5cdHRvcFZpZXcgPSAkc3ViLnRvcFZpZXcgPSBuZXcgVmlldygpO1xuXG5cdC8vQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdGlmICgkKSB7XG5cblx0XHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBqUXVlcnkgKD0gJCkgaXMgbG9hZGVkXG5cblx0XHQkLmZuLnJlbmRlciA9ICRmblJlbmRlcjtcblx0XHQkZXhwYW5kbyA9ICQuZXhwYW5kbztcblx0XHRpZiAoJC5vYnNlcnZhYmxlKSB7XG5cdFx0XHQkZXh0ZW5kKCRzdWIsICQudmlld3Muc3ViKTsgLy8ganF1ZXJ5Lm9ic2VydmFibGUuanMgd2FzIGxvYWRlZCBiZWZvcmUganNyZW5kZXIuanNcblx0XHRcdCR2aWV3cy5tYXAgPSAkLnZpZXdzLm1hcDtcblx0XHR9XG5cblx0fSBlbHNlIHtcblx0XHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBqUXVlcnkgaXMgbm90IGxvYWRlZC5cblxuXHRcdCQgPSB7fTtcblxuXHRcdGlmIChzZXRHbG9iYWxzKSB7XG5cdFx0XHRnbG9iYWwuanNyZW5kZXIgPSAkOyAvLyBXZSBhcmUgbG9hZGluZyBqc3JlbmRlci5qcyBmcm9tIGEgc2NyaXB0IGVsZW1lbnQsIG5vdCBBTUQgb3IgQ29tbW9uSlMsIHNvIHNldCBnbG9iYWxcblx0XHR9XG5cblx0XHQvLyBFcnJvciB3YXJuaW5nIGlmIGpzcmVuZGVyLmpzIGlzIHVzZWQgYXMgdGVtcGxhdGUgZW5naW5lIG9uIE5vZGUuanMgKGUuZy4gRXhwcmVzcyBvciBIYXBpLi4uKVxuXHRcdC8vIFVzZSBqc3JlbmRlci1ub2RlLmpzIGluc3RlYWQuLi5cblx0XHQkLnJlbmRlckZpbGUgPSAkLl9fZXhwcmVzcyA9ICQuY29tcGlsZSA9IGZ1bmN0aW9uKCkgeyB0aHJvdyBcIk5vZGUuanM6IHVzZSBucG0ganNyZW5kZXIsIG9yIGpzcmVuZGVyLW5vZGUuanNcIjsgfTtcblxuXHRcdC8vRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdCQuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKG9iKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIG9iID09PSBcImZ1bmN0aW9uXCI7XG5cdFx0fTtcblxuXHRcdCQuaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7XG5cdFx0XHRyZXR1cm4gKHt9LnRvU3RyaW5nKS5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIjtcblx0XHR9O1xuXG5cdFx0JHN1Yi5fanEgPSBmdW5jdGlvbihqcSkgeyAvLyBwcml2YXRlIG1ldGhvZCB0byBtb3ZlIGZyb20gSnNSZW5kZXIgQVBJcyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXNwYWNlXG5cdFx0XHRpZiAoanEgIT09ICQpIHtcblx0XHRcdFx0JGV4dGVuZChqcSwgJCk7IC8vIG1hcCBvdmVyIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lc3BhY2Vcblx0XHRcdFx0JCA9IGpxO1xuXHRcdFx0XHQkLmZuLnJlbmRlciA9ICRmblJlbmRlcjtcblx0XHRcdFx0ZGVsZXRlICQuanNyZW5kZXI7XG5cdFx0XHRcdCRleHBhbmRvID0gJC5leHBhbmRvO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQkLmpzcmVuZGVyID0gdmVyc2lvbk51bWJlcjtcblx0fVxuXHQkc3ViU2V0dGluZ3MgPSAkc3ViLnNldHRpbmdzO1xuXHQkc3ViU2V0dGluZ3MuYWxsb3dDb2RlID0gZmFsc2U7XG5cdCRpc0Z1bmN0aW9uID0gJC5pc0Z1bmN0aW9uO1xuXHQkLnJlbmRlciA9ICRyZW5kZXI7XG5cdCQudmlld3MgPSAkdmlld3M7XG5cdCQudGVtcGxhdGVzID0gJHRlbXBsYXRlcyA9ICR2aWV3cy50ZW1wbGF0ZXM7XG5cblx0Zm9yIChzZXR0aW5nIGluICRzdWJTZXR0aW5ncykge1xuXHRcdGFkZFNldHRpbmcoc2V0dGluZyk7XG5cdH1cblxuXHQoJHZpZXdzU2V0dGluZ3MuZGVidWdNb2RlID0gZnVuY3Rpb24oZGVidWdNb2RlKSB7XG5cdFx0cmV0dXJuIGRlYnVnTW9kZSA9PT0gdW5kZWZpbmVkXG5cdFx0XHQ/ICRzdWJTZXR0aW5ncy5kZWJ1Z01vZGVcblx0XHRcdDogKFxuXHRcdFx0XHQkc3ViU2V0dGluZ3MuZGVidWdNb2RlID0gZGVidWdNb2RlLFxuXHRcdFx0XHQkc3ViU2V0dGluZ3Mub25FcnJvciA9IGRlYnVnTW9kZSArIFwiXCIgPT09IGRlYnVnTW9kZVxuXHRcdFx0XHRcdD8gbmV3IEZ1bmN0aW9uKFwiXCIsIFwicmV0dXJuICdcIiArIGRlYnVnTW9kZSArIFwiJztcIiApXG5cdFx0XHRcdFx0OiAkaXNGdW5jdGlvbihkZWJ1Z01vZGUpXG5cdFx0XHRcdFx0XHQ/IGRlYnVnTW9kZVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRcdCR2aWV3c1NldHRpbmdzKTtcblx0fSkoZmFsc2UpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuXHQkc3ViU2V0dGluZ3NBZHZhbmNlZCA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZCA9IHtcblx0XHR1c2VWaWV3czogZmFsc2UsXG5cdFx0X2pzdjogZmFsc2UgLy8gRm9yIGdsb2JhbCBhY2Nlc3MgdG8gSnNWaWV3cyBzdG9yZVxuXHR9O1xuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVnaXN0ZXIgdGFncyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCR0YWdzKHtcblx0XHRcImlmXCI6IHtcblx0XHRcdHJlbmRlcjogZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIHt7aWZ9fSBhbmQgb25jZSBmb3IgZWFjaCB7e2Vsc2V9fS5cblx0XHRcdFx0Ly8gV2Ugd2lsbCB1c2UgdGhlIHRhZy5yZW5kZXJpbmcgb2JqZWN0IGZvciBjYXJyeWluZyByZW5kZXJpbmcgc3RhdGUgYWNyb3NzIHRoZSBjYWxscy5cblx0XHRcdFx0Ly8gSWYgbm90IGRvbmUgKGEgcHJldmlvdXMgYmxvY2sgaGFzIG5vdCBiZWVuIHJlbmRlcmVkKSwgbG9vayBhdCBleHByZXNzaW9uIGZvciB0aGlzIGJsb2NrIGFuZCByZW5kZXIgdGhlIGJsb2NrIGlmIGV4cHJlc3Npb24gaXMgdHJ1dGh5XG5cdFx0XHRcdC8vIE90aGVyd2lzZSByZXR1cm4gXCJcIlxuXHRcdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdFx0dGFnQ3R4ID0gc2VsZi50YWdDdHgsXG5cdFx0XHRcdFx0cmV0ID0gKHNlbGYucmVuZGVyaW5nLmRvbmUgfHwgIXZhbCAmJiAoYXJndW1lbnRzLmxlbmd0aCB8fCAhdGFnQ3R4LmluZGV4KSlcblx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0OiAoc2VsZi5yZW5kZXJpbmcuZG9uZSA9IHRydWUsIHNlbGYuc2VsZWN0ZWQgPSB0YWdDdHguaW5kZXgsXG5cdFx0XHRcdFx0XHRcdC8vIFRlc3QgaXMgc2F0aXNmaWVkLCBzbyByZW5kZXIgY29udGVudCBvbiBjdXJyZW50IGNvbnRleHQuIFdlIGNhbGwgdGFnQ3R4LnJlbmRlcigpIHJhdGhlciB0aGFuIHJldHVybiB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0Ly8gKHdoaWNoIHdvdWxkIGFsc28gcmVuZGVyIHRoZSB0bXBsL2NvbnRlbnQgb24gdGhlIGN1cnJlbnQgY29udGV4dCBidXQgd291bGQgaXRlcmF0ZSBpZiBpdCBpcyBhbiBhcnJheSlcblx0XHRcdFx0XHRcdFx0dGFnQ3R4LnJlbmRlcih0YWdDdHgudmlldywgdHJ1ZSkpOyAvLyBubyBhcmcsIHNvIHJlbmRlcnMgYWdhaW5zdCBwYXJlbnRWaWV3LmRhdGFcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH0sXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcImZvclwiOiB7XG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHQvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciB7e2Zvcn19IGFuZCBvbmNlIGZvciBlYWNoIHt7ZWxzZX19LlxuXHRcdFx0XHQvLyBXZSB3aWxsIHVzZSB0aGUgdGFnLnJlbmRlcmluZyBvYmplY3QgZm9yIGNhcnJ5aW5nIHJlbmRlcmluZyBzdGF0ZSBhY3Jvc3MgdGhlIGNhbGxzLlxuXHRcdFx0XHR2YXIgZmluYWxFbHNlID0gIWFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdFx0dGFnQ3R4ID0gc2VsZi50YWdDdHgsXG5cdFx0XHRcdFx0cmVzdWx0ID0gXCJcIixcblx0XHRcdFx0XHRkb25lID0gMDtcblxuXHRcdFx0XHRpZiAoIXNlbGYucmVuZGVyaW5nLmRvbmUpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGZpbmFsRWxzZSA/IHRhZ0N0eC52aWV3LmRhdGEgOiB2YWw7IC8vIEZvciB0aGUgZmluYWwgZWxzZSwgZGVmYXVsdHMgdG8gY3VycmVudCBkYXRhIHdpdGhvdXQgaXRlcmF0aW9uLlxuXHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gdGFnQ3R4LnJlbmRlcih2YWx1ZSwgZmluYWxFbHNlKTsgLy8gSXRlcmF0ZXMgZXhjZXB0IG9uIGZpbmFsIGVsc2UsIGlmIGRhdGEgaXMgYW4gYXJyYXkuIChVc2Uge3tpbmNsdWRlfX0gdG8gY29tcG9zZSB0ZW1wbGF0ZXMgd2l0aG91dCBhcnJheSBpdGVyYXRpb24pXG5cdFx0XHRcdFx0XHRkb25lICs9ICRpc0FycmF5KHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA6IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChzZWxmLnJlbmRlcmluZy5kb25lID0gZG9uZSkge1xuXHRcdFx0XHRcdFx0c2VsZi5zZWxlY3RlZCA9IHRhZ0N0eC5pbmRleDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gSWYgbm90aGluZyB3YXMgcmVuZGVyZWQgd2Ugd2lsbCBsb29rIGF0IHRoZSBuZXh0IHt7ZWxzZX19LiBPdGhlcndpc2UsIHdlIGFyZSBkb25lLlxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0cHJvcHM6IHtcblx0XHRcdGJhc2VUYWc6IFwiZm9yXCIsXG5cdFx0XHRkYXRhTWFwOiBkYXRhTWFwKGdldFRhcmdldFByb3BzKSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdGluY2x1ZGU6IHtcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiKlwiOiB7XG5cdFx0XHQvLyB7eyogY29kZS4uLiB9fSAtIElnbm9yZWQgaWYgdGVtcGxhdGUuYWxsb3dDb2RlIGFuZCAkLnZpZXdzLnNldHRpbmdzLmFsbG93Q29kZSBhcmUgZmFsc2UuIE90aGVyd2lzZSBpbmNsdWRlIGNvZGUgaW4gY29tcGlsZWQgdGVtcGxhdGVcblx0XHRcdHJlbmRlcjogcmV0VmFsLFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCI6KlwiOiB7XG5cdFx0XHQvLyB7ezoqIHJldHVybmVkRXhwcmVzc2lvbiB9fSAtIElnbm9yZWQgaWYgdGVtcGxhdGUuYWxsb3dDb2RlIGFuZCAkLnZpZXdzLnNldHRpbmdzLmFsbG93Q29kZSBhcmUgZmFsc2UuIE90aGVyd2lzZSBpbmNsdWRlIGNvZGUgaW4gY29tcGlsZWQgdGVtcGxhdGVcblx0XHRcdHJlbmRlcjogcmV0VmFsLFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0ZGJnOiAkaGVscGVycy5kYmcgPSAkY29udmVydGVycy5kYmcgPSBkYmdCcmVhayAvLyBSZWdpc3RlciB7e2RiZy99fSwge3tkYmc6Li4ufX0gYW5kIH5kYmcoKSB0byB0aHJvdyBhbmQgY2F0Y2gsIGFzIGJyZWFrcG9pbnRzIGZvciBkZWJ1Z2dpbmcuXG5cdH0pO1xuXG5cdCRjb252ZXJ0ZXJzKHtcblx0XHRodG1sOiBodG1sRW5jb2RlLFxuXHRcdGF0dHI6IGh0bWxFbmNvZGUsIC8vIEluY2x1ZGVzID4gZW5jb2Rpbmcgc2luY2UgckNvbnZlcnRNYXJrZXJzIGluIEpzVmlld3MgZG9lcyBub3Qgc2tpcCA+IGNoYXJhY3RlcnMgaW4gYXR0cmlidXRlIHN0cmluZ3Ncblx0XHR1cmw6IGZ1bmN0aW9uKHRleHQpIHtcblx0XHRcdC8vIFVSTCBlbmNvZGluZyBoZWxwZXIuXG5cdFx0XHRyZXR1cm4gdGV4dCAhPSB1bmRlZmluZWQgPyBlbmNvZGVVUkkoXCJcIiArIHRleHQpIDogdGV4dCA9PT0gbnVsbCA/IHRleHQgOiBcIlwiOyAvLyBudWxsIHJldHVybnMgbnVsbCwgZS5nLiB0byByZW1vdmUgYXR0cmlidXRlLiB1bmRlZmluZWQgcmV0dXJucyBcIlwiXG5cdFx0fVxuXHR9KTtcbn1cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gRGVmaW5lIGRlZmF1bHQgZGVsaW1pdGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuJHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcbiRpc0FycmF5ID0gKCR8fGpzcikuaXNBcnJheTtcbiR2aWV3c1NldHRpbmdzLmRlbGltaXRlcnMoXCJ7e1wiLCBcIn19XCIsIFwiXlwiKTtcblxuaWYgKGpzclRvSnEpIHsgLy8gTW92aW5nIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lcGFjZSAtIGNvcHkgb3ZlciB0aGUgc3RvcmVkIGl0ZW1zICh0ZW1wbGF0ZXMsIGNvbnZlcnRlcnMsIGhlbHBlcnMuLi4pXG5cdGpzci52aWV3cy5zdWIuX2pxKCQpO1xufVxuXG4vLzw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCBKc09ic2VydmFibGUgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4vKiBKc09ic2VydmFibGU6XG4gKiBTZWUgaHR0cDovL3d3dy5qc3ZpZXdzLmNvbS8janNvYnNlcnZhYmxlIGFuZCBodHRwOi8vZ2l0aHViLmNvbS9ib3Jpc21vb3JlL2pzdmlld3NcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJHZpZXdzID0gJC52aWV3cztcbiRzdWIgPSAkdmlld3Muc3ViO1xuJGlzRnVuY3Rpb24gPSAkLmlzRnVuY3Rpb247XG4kaXNBcnJheSA9ICQuaXNBcnJheTtcbiRleHBhbmRvID0gJC5leHBhbmRvO1xuaWYgKCEkLm9ic2VydmUpIHtcblxuXHR2YXIgJGV2ZW50U3BlY2lhbCA9ICQuZXZlbnQuc3BlY2lhbCxcblx0XHRzbGljZSA9IFtdLnNsaWNlLFxuXHRcdHNwbGljZSA9IFtdLnNwbGljZSxcblx0XHRjb25jYXQgPSBbXS5jb25jYXQsXG5cdFx0UEFSU0VJTlQgPSBwYXJzZUludCxcblx0XHRyTm90V2hpdGUgPSAvXFxTKy9nLFxuXHRcdHByb3BlcnR5Q2hhbmdlU3RyID0gJHN1Yi5wcm9wQ2huZyA9ICRzdWIucHJvcENobmcgfHwgXCJwcm9wZXJ0eUNoYW5nZVwiLC8vIFRoZXNlIHR3byBzZXR0aW5ncyBjYW4gYmUgb3ZlcnJpZGRlbiBvbiBzZXR0aW5ncyBhZnRlciBsb2FkaW5nXG5cdFx0YXJyYXlDaGFuZ2VTdHIgPSAkc3ViLmFyckNobmcgPSAkc3ViLmFyckNobmcgfHwgXCJhcnJheUNoYW5nZVwiLCAgICAgICAgLy8ganNSZW5kZXIsIGFuZCBwcmlvciB0byBsb2FkaW5nIGpxdWVyeS5vYnNlcnZhYmxlLmpzIGFuZC9vciBKc1ZpZXdzXG5cdFx0Y2JCaW5kaW5nc1N0b3JlID0ge30sXG5cdFx0b2JzZXJ2ZVN0ciA9IHByb3BlcnR5Q2hhbmdlU3RyICsgXCIub2JzZXJ2ZVwiLFxuXHRcdG9ic2VydmVPYmpLZXkgPSAxLFxuXHRcdG9ic2VydmVDYktleSA9IDEsXG5cdFx0b2JzZXJ2ZUlubmVyQ2JLZXkgPSAxLFxuXHRcdCRoYXNEYXRhID0gJC5oYXNEYXRhLFxuXHRcdCRkYXRhID0gJC5kYXRhLFxuXHRcdHJlbW92ZSA9IHt9LCAvLyBmbGFnIGZvciByZW1vdmVQcm9wZXJ0eVxuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdGdldENiS2V5ID0gZnVuY3Rpb24oY2IpIHtcblx0XHRyZXR1cm4gY2IuX2NJZCA9IGNiLl9jSWQgfHwgKFwiLm9ic1wiICsgb2JzZXJ2ZUNiS2V5KyspO1xuXHR9LFxuXG5cdE9iamVjdE9ic2VydmFibGUgPSBmdW5jdGlvbihucywgZGF0YSkge1xuXHRcdHRoaXMuX2RhdGEgPSBkYXRhO1xuXHRcdHRoaXMuX25zID0gbnM7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0QXJyYXlPYnNlcnZhYmxlID0gZnVuY3Rpb24obnMsIGRhdGEpIHtcblx0XHR0aGlzLl9kYXRhID0gZGF0YTtcblx0XHR0aGlzLl9ucyA9IG5zO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHdyYXBBcnJheSA9IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRyZXR1cm4gJGlzQXJyYXkoZGF0YSlcblx0XHRcdD8gW2RhdGFdXG5cdFx0XHQ6IGRhdGE7XG5cdH0sXG5cblx0cmVzb2x2ZVBhdGhPYmplY3RzID0gZnVuY3Rpb24ocGF0aHMsIHJvb3QsIGNhbGxiYWNrKSB7XG5cdFx0cGF0aHMgPSBwYXRoc1xuXHRcdFx0PyAkaXNBcnJheShwYXRocylcblx0XHRcdFx0PyBwYXRoc1xuXHRcdFx0XHQ6IFtwYXRoc11cblx0XHRcdDogW107XG5cblx0XHR2YXIgaSwgcGF0aCxcblx0XHRcdG9iamVjdCA9IHJvb3QsXG5cdFx0XHRuZXh0T2JqID0gb2JqZWN0LFxuXHRcdFx0bCA9IHBhdGhzICYmIHBhdGhzLmxlbmd0aCxcblx0XHRcdG91dCA9IFtdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0cGF0aCA9IHBhdGhzW2ldO1xuXHRcdFx0aWYgKCRpc0Z1bmN0aW9uKHBhdGgpKSB7XG5cdFx0XHRcdG91dCA9IG91dC5jb25jYXQocmVzb2x2ZVBhdGhPYmplY3RzKHBhdGguY2FsbChyb290LCByb290LCBjYWxsYmFjayksIHJvb3QpKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IGVsc2UgaWYgKFwiXCIgKyBwYXRoICE9PSBwYXRoKSB7XG5cdFx0XHRcdHJvb3QgPSBuZXh0T2JqID0gcGF0aDtcblx0XHRcdFx0aWYgKG5leHRPYmogIT09IG9iamVjdCkge1xuXHRcdFx0XHRcdG91dC5wdXNoKG9iamVjdCA9IG5leHRPYmopO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5leHRPYmogIT09IG9iamVjdCkge1xuXHRcdFx0XHRvdXQucHVzaChvYmplY3QgPSBuZXh0T2JqKTtcblx0XHRcdH1cblx0XHRcdG91dC5wdXNoKHBhdGgpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0O1xuXHR9LFxuXG5cdHJlbW92ZUNiQmluZGluZ3MgPSBmdW5jdGlvbihjYkJpbmRpbmdzLCBjYkJpbmRpbmdzSWQpIHtcblx0XHQvLyBJZiB0aGUgY2JCaW5kaW5ncyBjb2xsZWN0aW9uIGlzIGVtcHR5IHdlIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIGNiQmluZGluZ3NTdG9yZVxuXHRcdGZvciAodmFyIGNiIGluIGNiQmluZGluZ3MpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZGVsZXRlIGNiQmluZGluZ3NTdG9yZVtjYkJpbmRpbmdzSWRdOyAvLyBUaGlzIGJpbmRpbmcgY29sbGVjdGlvbiBpcyBlbXB0eSwgc28gcmVtb3ZlIGZyb20gc3RvcmVcblx0fSxcblxuXHRvbk9ic2VydmFibGVDaGFuZ2UgPSBmdW5jdGlvbihldiwgZXZlbnRBcmdzKSB7XG5cdFx0ZnVuY3Rpb24gaXNPYih2YWwpIHtcblx0XHRcdHJldHVybiB0eXBlb2YgdmFsID09PSBPQkpFQ1QgJiYgKHBhdGhzWzBdIHx8IGFsbG93QXJyYXkgJiYgJGlzQXJyYXkodmFsKSk7XG5cdFx0fVxuXG5cdFx0aWYgKCEoZXYuZGF0YSAmJiBldi5kYXRhLm9mZikpIHtcblx0XHRcdC8vIFNraXAgaWYgISFldi5kYXRhLm9mZjogLSBhIGhhbmRsZXIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgKG1heWJlIHdhcyBvbiBoYW5kbGVyIGNvbGxlY3Rpb24gYXQgY2FsbCB0aW1lIC0gdGhlbiByZW1vdmVkIGJ5IGFub3RoZXIgaGFuZGxlcilcblx0XHRcdHZhciBhbGxQYXRoLCBmaWx0ZXIsIHBhcmVudE9icyxcblx0XHRcdFx0b2xkVmFsdWUgPSBldmVudEFyZ3Mub2xkVmFsdWUsXG5cdFx0XHRcdHZhbHVlID0gZXZlbnRBcmdzLnZhbHVlLFxuXHRcdFx0XHRjdHggPSBldi5kYXRhLFxuXHRcdFx0XHRvYnNlcnZlQWxsID0gY3R4Lm9ic2VydmVBbGwsXG5cdFx0XHRcdGNiID0gY3R4LmNiLFxuXHRcdFx0XHRhbGxvd0FycmF5ID0gIWNiLm5vQXJyYXksXG5cdFx0XHRcdHBhdGhzID0gY3R4LnBhdGhzLFxuXHRcdFx0XHRucyA9IGN0eC5ucztcblxuXHRcdFx0aWYgKGV2LnR5cGUgPT09IGFycmF5Q2hhbmdlU3RyKSB7XG5cdFx0XHRcdChjYi5hcnJheSB8fCBjYikuY2FsbChjdHgsIGV2LCBldmVudEFyZ3MpOyAvLyBJZiB0aGVyZSBpcyBhbiBhcnJheUhhbmRsZXIgZXhwYW5kbyBvbiB0aGUgcmVndWxhciBoYW5kbGVyLCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIHJlZ3VsYXIgaGFuZGxlciBmb3IgYXJyYXlDaGFuZ2UgZXZlbnRzIGFsc28gLSBmb3IgZXhhbXBsZTogJC5vYnNlcnZlKGFycmF5LCBoYW5kbGVyKVxuXHRcdFx0XHQvLyBvciBvYnNlcnZlQWxsKCkgd2l0aCBhbiBhcnJheSBpbiB0aGUgZ3JhcGguIE5vdGUgdGhhdCBvbiBkYXRhLWxpbmsgYmluZGluZ3Mgd2UgZW5zdXJlIGFsd2F5cyB0byBoYXZlIGFuIGFycmF5IGhhbmRsZXIgLSAkLm5vb3AgaWYgbm9uZSBpcyBzcGVjaWZpZWQgZS5nLiBvbiB0aGUgZGF0YS1saW5rZWQgdGFnLlxuXHRcdFx0fSBlbHNlIGlmIChjdHgucHJvcCA9PT0gZXZlbnRBcmdzLnBhdGggfHwgY3R4LnByb3AgPT09IFwiKlwiKSB7XG5cdFx0XHRcdGlmIChvYnNlcnZlQWxsKSB7XG5cdFx0XHRcdFx0YWxsUGF0aCA9IG9ic2VydmVBbGwuX3BhdGggKyBcIi5cIiArIGV2ZW50QXJncy5wYXRoO1xuXHRcdFx0XHRcdGZpbHRlciA9IG9ic2VydmVBbGwuZmlsdGVyO1xuXHRcdFx0XHRcdHBhcmVudE9icyA9IFtldi50YXJnZXRdLmNvbmNhdChvYnNlcnZlQWxsLnBhcmVudHMoKSk7XG5cblx0XHRcdFx0XHRpZiAoaXNPYihvbGRWYWx1ZSkpIHtcblx0XHRcdFx0XHRcdG9ic2VydmVfYXBwbHkoYWxsb3dBcnJheSwgbnMsIFtvbGRWYWx1ZV0sIHBhdGhzLCBjYiwgdHJ1ZSwgZmlsdGVyLCBbcGFyZW50T2JzXSwgYWxsUGF0aCk7IC8vIHVub2JzZXJ2ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaXNPYih2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdG9ic2VydmVfYXBwbHkoYWxsb3dBcnJheSwgbnMsIFt2YWx1ZV0sIHBhdGhzLCBjYiwgdW5kZWZpbmVkLCBmaWx0ZXIsIFtwYXJlbnRPYnNdLCBhbGxQYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGlzT2Iob2xkVmFsdWUpKSB7IC8vIG9sZFZhbHVlIGlzIGFuIG9iamVjdCwgc28gdW5vYnNlcnZlXG5cdFx0XHRcdFx0XHRvYnNlcnZlX2FwcGx5KGFsbG93QXJyYXksIG5zLCBbb2xkVmFsdWVdLCBwYXRocywgY2IsIHRydWUpOyAvLyB1bm9ic2VydmVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGlzT2IodmFsdWUpKSB7IC8vIHZhbHVlIGlzIGFuIG9iamVjdCwgc28gb2JzZXJ2ZVxuXHRcdFx0XHRcdFx0b2JzZXJ2ZV9hcHBseShhbGxvd0FycmF5LCBucywgW3ZhbHVlXSwgcGF0aHMsIGNiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3R4LmNiKGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRvYnNlcnZlX2FwcGx5ID0gZnVuY3Rpb24oKSB7XG5cdFx0Ly8gJC5vYnNlcnZlKCksIGJ1dCBhbGxvd2luZyB5b3UgdG8gaW5jbHVkZSBhcnJheXMgd2l0aGluIHRoZSBhcmd1bWVudHMgLSB3aGljaCB5b3Ugd2FudCBmbGF0dGVuZWQuXG5cdFx0dmFyIGFyZ3MgPSBjb25jYXQuYXBwbHkoW10sIGFyZ3VtZW50cyk7IC8vIEZsYXR0ZW4gdGhlIGFyZ3VtZW50c1xuXHRcdHJldHVybiAkb2JzZXJ2ZS5hcHBseShhcmdzLnNoaWZ0KCksIGFyZ3MpO1xuXHR9LFxuXG5cdCRvYnNlcnZlQWxsID0gZnVuY3Rpb24oY2IsIGZpbHRlciwgdW5vYnNlcnZlKSB7XG5cdFx0b2JzZXJ2ZUFsbCh0aGlzLl9ucywgdGhpcy5fZGF0YSwgY2IsIGZpbHRlciwgW10sIFwicm9vdFwiLCB1bm9ic2VydmUpO1xuXHR9LFxuXG5cdCR1bm9ic2VydmVBbGwgPSBmdW5jdGlvbihjYiwgZmlsdGVyKSB7XG5cdFx0JG9ic2VydmVBbGwuY2FsbCh0aGlzLCBjYiwgZmlsdGVyLCB0cnVlKTtcblx0fSxcblxuXHRvYnNlcnZlQWxsID0gZnVuY3Rpb24obmFtZXNwYWNlLCBvYmplY3QsIGNiLCBmaWx0ZXIsIHBhcmVudE9icywgYWxsUGF0aCwgdW5vYnNlcnZlLCBvYmpNYXApIHtcblx0XHRmdW5jdGlvbiBvYnNlcnZlQXJyYXlJdGVtcyhhcnIsIHVub2JzKSB7XG5cdFx0XHRsID0gYXJyLmxlbmd0aDtcblx0XHRcdG5ld0FsbFBhdGggPSBhbGxQYXRoICsgXCJbXVwiO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRmaWx0ZXJBbmRPYnNlcnZlQWxsKGFyciwgbCwgdW5vYnMsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGZpbHRlckFuZE9ic2VydmVBbGwob2JqLCBwcm9wLCB1bm9icywgbmVzdGVkQXJyYXkpIHtcblx0XHRcdHZhciBuZXdPYmplY3QsIG5ld1BhcmVudE9icztcblx0XHRcdGlmIChwcm9wICE9PSAkZXhwYW5kbykge1xuXHRcdFx0XHRpZiAobmV3T2JqZWN0ID0gJG9ic2VydmFibGUuX2ZsdHIobmV3QWxsUGF0aCwgb2JqW3Byb3BdLCBuZXh0UGFyZW50T2JzLCBmaWx0ZXIpKSB7XG5cdFx0XHRcdFx0bmV3UGFyZW50T2JzID0gbmV4dFBhcmVudE9icy5zbGljZSgpO1xuXHRcdFx0XHRcdGlmIChuZXN0ZWRBcnJheSAmJiB1cGRhdGVkVGd0ICYmIG5ld1BhcmVudE9ic1swXSAhPT0gdXBkYXRlZFRndCkge1xuXHRcdFx0XHRcdFx0bmV3UGFyZW50T2JzLnVuc2hpZnQodXBkYXRlZFRndCk7IC8vIEZvciBhcnJheSBjaGFuZ2UgZXZlbnRzIHdoZW4gb2JzZXJ2aW5nIGFuIGFycmF5IHdoaWNoIGlzIG5vdCB0aGUgcm9vdCwgbmVlZCB0byBhZGQgdXBkYXRlZCBhcnJheSB0byBwYXJlbnRPYnNcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2JzZXJ2ZUFsbChuYW1lc3BhY2UsIG5ld09iamVjdCwgY2IsIGZpbHRlciB8fCAobmVzdGVkQXJyYXkgPyB1bmRlZmluZWQgOiAwKSwgbmV3UGFyZW50T2JzLCBuZXdBbGxQYXRoLCB1bm9icywgb2JqTWFwKTtcblx0XHRcdFx0XHQvLyBJZiBuZXN0ZWQgYXJyYXksIG5lZWQgdG8gb2JzZXJ2ZSB0aGUgYXJyYXkgdG9vIC0gc28gc2V0IGZpbHRlciB0byB1bmRlZmluZWRcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHdyYXBwZWRDYihldiwgZXZlbnRBcmdzKSB7XG5cdFx0XHQvLyBUaGlzIG9iamVjdCBpcyBjaGFuZ2luZy5cblx0XHRcdGFsbFBhdGggPSBldi5kYXRhLm9ic2VydmVBbGwuX3BhdGg7XG5cdFx0XHR1cGRhdGVkVGd0ID0gZXYudGFyZ2V0O1xuXHRcdFx0c3dpdGNoIChldmVudEFyZ3MuY2hhbmdlKSB7IC8vIG9ic2VydmVBbGwvdW5vYnNlcnZlQWxsIG9uIGFkZGVkIG9yIHJlbW92ZWQgb2JqZWN0c1xuXHRcdFx0XHRjYXNlIFwiaW5zZXJ0XCI6XG5cdFx0XHRcdFx0b2JzZXJ2ZUFycmF5SXRlbXMoZXZlbnRBcmdzLml0ZW1zKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInJlbW92ZVwiOlxuXHRcdFx0XHRcdG9ic2VydmVBcnJheUl0ZW1zKGV2ZW50QXJncy5pdGVtcywgdHJ1ZSk7IC8vIHVub2JzZXJ2ZUFsbCBvbiByZW1vdmVkIGl0ZW1zXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJzZXRcIjpcblx0XHRcdFx0XHRuZXdBbGxQYXRoID0gYWxsUGF0aCArIFwiLlwiICsgZXZlbnRBcmdzLnBhdGg7XG5cdFx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChldmVudEFyZ3MsIFwib2xkVmFsdWVcIiwgdHJ1ZSk7IC8vIHVub2JzZXJ2ZSBvbGQgdmFsdWVcblx0XHRcdFx0XHRmaWx0ZXJBbmRPYnNlcnZlQWxsKGV2ZW50QXJncywgXCJ2YWx1ZVwiKTsgLy8gb2JzZXJ2ZSBuZXcgdmFsdWVcblx0XHRcdH1cblx0XHRcdHVwZGF0ZWRUZ3QgPSB1bmRlZmluZWQ7XG5cdFx0XHRjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBPYnNlcnZlIHRoaXMgb2JqZWN0IChpbnZva2UgdGhlIGNhbGxiYWNrKVxuXHRcdH1cblxuXHRcdHZhciBsLCBpc09iamVjdCwgbmV3QWxsUGF0aCwgbmV4dFBhcmVudE9icywgdXBkYXRlZFRndCwgb2JJZCxcblx0XHRcdG5vdFJlbW92aW5nID0gIW9iak1hcCB8fCBvYmpNYXAudW4gfHwgIXVub2JzZXJ2ZTsgLy8gdHJ1ZSB1bmxlc3MgaXQgaXMgYW4gb2JzZXJ2ZUFsbCBjYWxsIChub3QgdW5vYnNlcnZlQWxsKSBhbmQgd2UgYXJlIHJlbW92aW5nIGEgbGlzdGVuZXIgKG5vdCBhZGRpbmcgb25lKVxuXG5cdFx0aWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSBPQkpFQ1QpIHtcblx0XHRcdG5leHRQYXJlbnRPYnMgPSBbb2JqZWN0XS5jb25jYXQocGFyZW50T2JzKTsgLy8gVGhlIHBhcmVudE9icyBjaGFpbiBmb3IgdGhlIG5leHQgZGVwdGggb2Ygb2JzZXJ2ZUFsbFxuXHRcdFx0aXNPYmplY3QgPSAkaXNBcnJheShvYmplY3QpID8gXCJcIiA6IFwiKlwiO1xuXHRcdFx0aWYgKG9iak1hcCAmJiBub3RSZW1vdmluZyAmJiAkaGFzRGF0YShvYmplY3QpICYmIG9iak1hcFtvYklkID0gJGRhdGEob2JqZWN0KS5vYklkXSkge1xuXHRcdFx0XHRvYmpNYXBbb2JJZF0rKztcblx0XHRcdFx0cmV0dXJuOyAvLyBUaGlzIG9iamVjdCBoYXMgYWxyZWFkeSBiZWluZyBvYnNlcnZlZC91bm9ic2VydmVkIGJ5IHRoaXMgb2JzZXJ2ZUFsbC91bm9ic2VydmVBbGwgY2FsbCAobXVzdCBiZSBhIGN5Y2xpYyBvYmplY3QgZ3JhcGgpIHNvIHNraXAsIHRvIGF2b2lkXG5cdFx0XHRcdC8vIHN0YWNrIG92ZXJmbG93L211bHRpcGxlIGluc3RhbmNlcyBvZiBsaXN0ZW5lci4gU2VlIGpzdmlld3MvcHVsbC8zMDVcblx0XHRcdFx0Ly8gTk9URSAtIFdFIERPIE5PVCBzdXBwb3J0IE9ic2VydmVBbGwgb24gZGF0YSB3aXRoIGN5Y2xpYyBncmFwaHMgd2hpY2ggaW5jbHVkZSBEVVBMSUNBVEUgUkVGRVJFTkNFUyBUTyBBUlJBWSBQUk9QRVJUSUVTIC0gc3VjaCBhcyBkYXRhLmNoaWxkcmVuID0gZGF0YS5kZXNjZW5kYW50cyA9IFtdXG5cdFx0XHR9XG5cdFx0XHRpZiAoIW9iak1hcCkge1xuXHRcdFx0XHRvYmpNYXAgPSB7dW46IHVub2JzZXJ2ZX07IC8vIE1hcCBvYmplY3QgdG8gcmVnaXN0ZXIgb2JzZXJ2ZWQgb2JqZWN0cyBmb3IgdGhpcyBvYnNlcnZlQWxsXG5cdFx0XHR9XG5cblx0XHRcdGlmIChjYikge1xuXHRcdFx0XHQvLyBPYnNlcnZlIHRoaXMgb2JqZWN0IG9yIGFycmF5IC0gYW5kIGFsc28gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIG9iamVjdCBncmFwaCwgdG8gYWRkIG9yIHJlbW92ZSBvYnNlcnZlcnMgZnJvbSB0aGUgbW9kaWZpZWQgb2JqZWN0IGdyYXBoXG5cdFx0XHRcdGlmIChpc09iamVjdCB8fCBmaWx0ZXIgIT09IDApIHtcblx0XHRcdFx0XHQvLyBJZiBhbiBvYmplY3QsIG9ic2VydmUgdGhlIG9iamVjdC4gSWYgYW4gYXJyYXksIG9ubHkgYWRkIGFycmF5Q2hhbmdlIGJpbmRpbmcgaWYgaGFzIGZpbHRlciBvciBpZiBmaWx0ZXIgaXMgdW5kZWZpbmVkICghPT0gMCkgLSB3aGljaFxuXHRcdFx0XHRcdC8vIGlzIHRoZSBjYXNlIGZvciB0b3AtbGV2ZWwgY2FsbHMgb3IgZm9yIG5lc3RlZCBhcnJheSAoYXJyYXkgaXRlbSBvZiBhbiBhcnJheSAtIGUuZy4gbWVtYmVyIG9mIDItZGltZW5zaW9uYWwgYXJyYXkpLlxuXHRcdFx0XHRcdC8vIEZvciBhcnJheSBwcm9wZXJ0aWVzIGxvd2VyIGluIHRoZSB0cmVlLCB3aXRoIG5vIGZpbHRlciwgZmlsdGVyIGlzIHNldCB0byAwIGluIGZpbHRlckFuZE9ic2VydmVBbGwsIHNvIG5vIGFycmF5Q2hhbmdlIGJpbmRpbmcgaGVyZSxcblx0XHRcdFx0XHQvLyBzaW5jZSB0aGV5IGdldCBhcnJheUNoYW5nZSBiaW5kaW5nIGFkZGVkIGR1cmluZyByZWd1bGFyICQub2JzZXJ2ZShhcnJheSAuLi4pIGJpbmRpbmcuXG5cdFx0XHRcdFx0d3JhcHBlZENiLl9jSWQgPSBnZXRDYktleShjYik7IC8vIElkZW50aWZ5IHdyYXBwZWQgY2FsbGJhY2sgd2l0aCB1bndyYXBwZWQgY2FsbGJhY2ssIHNvIHVub2JzZXJ2ZUFsbCB3aWxsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBwcmV2aW91cyBvYnNlcnZlQWxsIHdyYXBwZWQgY2FsbGJhY2ssIGlmIGlubmVyIGNhbGxiYWNrIHdhcyB0aGUgc2FtZTtcblx0XHRcdFx0XHRpZiAobm90UmVtb3ZpbmcpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZlKG5hbWVzcGFjZSwgb2JqZWN0LCBpc09iamVjdCwgd3JhcHBlZENiLCB1bm9ic2VydmUsIGZpbHRlciwgbmV4dFBhcmVudE9icywgYWxsUGF0aCk7XG5cdFx0XHRcdFx0XHRvYklkID0gJGRhdGEob2JqZWN0KS5vYklkO1xuXHRcdFx0XHRcdFx0b2JqTWFwW29iSWRdID0gKG9iak1hcFtvYklkXSB8fCAwKSArIDE7IC8vIFJlZ2lzdGVyIG9uIG1hcCBvZiBvYmplY3RzIG9ic2VydmVkL3Vub2JzZXJ2ZWQgYnkgdGhpcyBvYnNlcnZlQWxsL3Vub2JzZXJ2ZUFsbCBjYWxsXG5cdFx0XHRcdFx0XHRcdC8vLSBvciByZW1vdmUgZnJvbSBtYXAgaWYgd2UgYXJlIHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gb2JzZXJ2ZUFsbCBjYWxsLiAoQXZvaWQgZHVwcywgZm9yIGN5Y2xpYyBncmFwaHMpXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICgtLW9iak1hcFskZGF0YShvYmplY3QpLm9iSWRdKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIG1hcCBvZiBvYmplY3RzIG9ic2VydmVkL3Vub2JzZXJ2ZWQgYnkgdGhpcyBvYnNlcnZlQWxsL3Vub2JzZXJ2ZUFsbCBjYWxsXG5cdFx0XHRcdFx0XHRcdC8vLSBvciByZW1vdmUgZnJvbSBtYXAgaWYgd2UgYXJlIHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gb2JzZXJ2ZUFsbCBjYWxsLiAoQXZvaWQgZHVwcywgZm9yIGN5Y2xpYyBncmFwaHMpXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCRvYnNlcnZlKG5hbWVzcGFjZSwgb2JqZWN0LCBpc09iamVjdCwgd3JhcHBlZENiLCB1bm9ic2VydmUsIGZpbHRlciwgbmV4dFBhcmVudE9icywgYWxsUGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBObyBjYWxsYmFjay4gSnVzdCB1bm9ic2VydmUgaWYgdW5vYnNlcnZlID09PSB0cnVlLlxuXHRcdFx0XHRpZiAob2JqTWFwKSB7XG5cdFx0XHRcdFx0b2JqTWFwWyRkYXRhKG9iamVjdCkub2JJZF0gPSAxOyAvLyBSZWdpc3RlciBvbiBtYXAgb2Ygb2JqZWN0cyB1bm9ic2VydmVkIGJ5IHRoaXMgdW5vYnNlcnZlQWxsIGNhbGwuIChBdm9pZCBkdXBzLCBmb3IgY3ljbGljIGdyYXBocylcblx0XHRcdFx0fVxuXHRcdFx0XHQkb2JzZXJ2ZShuYW1lc3BhY2UsIG9iamVjdCwgaXNPYmplY3QsIHVuZGVmaW5lZCwgdW5vYnNlcnZlLCBmaWx0ZXIsIG5leHRQYXJlbnRPYnMsIGFsbFBhdGgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPYmplY3QpIHtcblx0XHRcdFx0Ly8gQ29udGludWUgc3RlcHBpbmcgdGhyb3VnaCBvYmplY3QgZ3JhcGgsIG9ic2VydmluZyBvYmplY3QgYW5kIGFycmF5c1xuXHRcdFx0XHQvLyBUbyBvdmVycmlkZSBmaWx0ZXJpbmcsIHBhc3MgaW4gZmlsdGVyIGZ1bmN0aW9uLCBvciByZXBsYWNlICQub2JzZXJ2YWJsZS5fZmx0clxuXHRcdFx0XHRmb3IgKGwgaW4gb2JqZWN0KSB7XG5cdFx0XHRcdFx0bmV3QWxsUGF0aCA9IGFsbFBhdGggKyBcIi5cIiArIGw7XG5cdFx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChvYmplY3QsIGwsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7IC8vIE9ic2VydmUgaXRlbXMgaW4gQXJyYXlcblx0XHRcdFx0b2JzZXJ2ZUFycmF5SXRlbXMob2JqZWN0LCB1bm9ic2VydmUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRzaGFsbG93RmlsdGVyID0gZnVuY3Rpb24oYWxsUGF0aCAvKiwgb2JqZWN0LCBwYXJlbnRPYnMqLykge1xuXHRcdHJldHVybiBhbGxQYXRoLmluZGV4T2YoXCIuXCIpIDwgMCAmJiBhbGxQYXRoLmluZGV4T2YoXCJbXCIpIDwgMDtcblx0fSxcblxuXHQkdW5vYnNlcnZlID0gZnVuY3Rpb24oKSB7XG5cdFx0W10ucHVzaC5jYWxsKGFyZ3VtZW50cywgdHJ1ZSk7IC8vIEFkZCB0cnVlIGFzIGFkZGl0aW9uYWwgZmluYWwgYXJndW1lbnRcblx0XHRyZXR1cm4gJG9ic2VydmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0fTtcblxuXHQkb2JzZXJ2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vICQub2JzZXJ2ZShbbmFtZXNwYWNlLCBdcm9vdCwgWzEgb3IgbW9yZSBvYmplY3RzLCBwYXRoIG9yIHBhdGggQXJyYXkgcGFyYW1zLi4uXSwgY2FsbGJhY2tbLCBjb250ZXh0Q2FsbGJhY2tdWywgdW5vYnNlcnZlXSlcblxuXHRcdGZ1bmN0aW9uIGlubmVyT2JzZXJ2ZSgpIHtcblxuXHRcdFx0ZnVuY3Rpb24gb2JzZXJ2ZU9uT2ZmKG5hbWVzcGFjZSwgcGF0aFN0ciwgaXNBcnJheUJpbmRpbmcsIG9mZikge1xuXHRcdFx0XHR2YXIgaiwgZXZEYXRhLFxuXHRcdFx0XHRcdG9iSWRFeHBhbmRvID0gJGhhc0RhdGEob2JqZWN0KSxcblx0XHRcdFx0XHRib3VuZE9iT3JBcnIgPSB3cmFwQXJyYXkob2JqZWN0KSxcblx0XHRcdFx0XHRwcm50T2JzID0gcGFyZW50T2JzLFxuXHRcdFx0XHRcdGFsbFB0aCA9IGFsbFBhdGg7XG5cblx0XHRcdFx0bmFtZXNwYWNlID0gaW5pdGlhbE5zID8gbmFtZXNwYWNlICsgXCIuXCIgKyBpbml0aWFsTnMgOiBuYW1lc3BhY2U7XG5cblx0XHRcdFx0aWYgKCF1bm9ic2VydmUgJiYgKG9mZiB8fCBpc0FycmF5QmluZGluZykpIHtcblx0XHRcdFx0XHRldmVudHMgPSBvYklkRXhwYW5kbyAmJiAkLl9kYXRhKG9iamVjdCk7XG5cdFx0XHRcdFx0ZXZlbnRzID0gZXZlbnRzICYmIGV2ZW50cy5ldmVudHM7XG5cdFx0XHRcdFx0ZXZlbnRzID0gZXZlbnRzICYmIGV2ZW50c1tpc0FycmF5QmluZGluZyA/IGFycmF5Q2hhbmdlU3RyIDogcHJvcGVydHlDaGFuZ2VTdHJdO1xuXHRcdFx0XHRcdGVsID0gZXZlbnRzICYmIGV2ZW50cy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKGVsLS0pIHsgLy8gU2tpcCBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRkYXRhID0gZXZlbnRzW2VsXSAmJiBldmVudHNbZWxdLmRhdGE7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YSAmJiAob2ZmICYmIGRhdGEubnMgIT09IGluaXRpYWxOc1xuXHRcdFx0XHRcdFx0XHQvLyBXaGVuIG9ic2VydmluZywgZG9uJ3QgdW5iaW5kIGR1cHMgdW5sZXNzIHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2Vcblx0XHRcdFx0XHRcdFx0fHwgIW9mZiAmJiBkYXRhLm5zID09PSBpbml0aWFsTnMgJiYgZGF0YS5jYiAmJiBkYXRhLmNiLl9jSWQgPT09IGNhbGxiYWNrLl9jSWQpKVxuXHRcdFx0XHRcdFx0XHQvLyBXaGVuIG9ic2VydmluZyBhbmQgZG9pbmcgYXJyYXkgYmluZGluZywgZG9uJ3QgYmluZCBkdXBzIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgKER1cHMgY2FuIGhhcHBlbiBlLmcuIHdpdGgge157Zm9yIHBlb3BsZSB+Zm9vPXBlb3BsZX19KVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh1bm9ic2VydmUgfHwgb2ZmKSB7XG5cdFx0XHRcdFx0JChib3VuZE9iT3JBcnIpLm9mZihuYW1lc3BhY2UsIG9uT2JzZXJ2YWJsZUNoYW5nZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZXZEYXRhID0gaXNBcnJheUJpbmRpbmcgPyB7fVxuXHRcdFx0XHRcdFx0OiB7XG5cdFx0XHRcdFx0XHRcdGZ1bGxQYXRoOiBwYXRoLFxuXHRcdFx0XHRcdFx0XHRwYXRoczogcGF0aFN0ciA/IFtwYXRoU3RyXSA6IFtdLFxuXHRcdFx0XHRcdFx0XHRwcm9wOiBwcm9wXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGV2RGF0YS5ucyA9IGluaXRpYWxOcztcblx0XHRcdFx0XHRldkRhdGEuY2IgPSBjYWxsYmFjaztcblxuXHRcdFx0XHRcdGlmIChhbGxQYXRoKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuIG9ic2VydmVBbGwgY2FsbFxuXHRcdFx0XHRcdFx0ZXZEYXRhLm9ic2VydmVBbGwgPSB7XG5cdFx0XHRcdFx0XHRcdF9wYXRoOiBhbGxQdGgsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IGZ1bmN0aW9uKCkgeyAvLyBTdGVwIHRocm91Z2ggcGF0aCBhbmQgcGFyZW50T2JzIHBhcmVudCBjaGFpbiwgcmVwbGFjaW5nICdbXScgYnkgJ1tuXScgYmFzZWQgb24gY3VycmVudCBpbmRleCBvZiBvYmplY3RzIGluIHBhcmVudCBhcnJheXMuXG5cdFx0XHRcdFx0XHRcdFx0aiA9IHBybnRPYnMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhbGxQdGgucmVwbGFjZSgvW1suXS9nLCBmdW5jdGlvbihhbGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGotLTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBhbGwgPT09IFwiW1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gXCJbXCIgKyAkLmluQXJyYXkocHJudE9ic1tqIC0gMV0sIHBybnRPYnNbal0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogXCIuXCI7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHBhcmVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm50T2JzOyAvLyBUaGUgY2hhaW4gb2YgcGFyZW50cyBiZXR3ZWVuIHRoZSBtb2RpZmllZCBvYmplY3QgYW5kIHRoZSByb290IG9iamVjdCB1c2VkIGluIHRoZSBvYnNlcnZlQWxsKCkgY2FsbFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRmaWx0ZXI6IGZpbHRlclxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JChib3VuZE9iT3JBcnIpLm9uKG5hbWVzcGFjZSwgbnVsbCwgZXZEYXRhLCBvbk9ic2VydmFibGVDaGFuZ2UpO1xuXHRcdFx0XHRcdGlmIChjYkJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHQvLyBBZGQgb2JqZWN0IHRvIGNiQmluZGluZ3Ncblx0XHRcdFx0XHRcdGNiQmluZGluZ3NbJGRhdGEob2JqZWN0KS5vYklkIHx8ICRkYXRhKG9iamVjdCwgXCJvYklkXCIsIG9ic2VydmVPYmpLZXkrKyldID0gb2JqZWN0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBnZXRJbm5lckNiKGV4cHJPYikge1xuXHRcdFx0XHQvLyBSZXR1cm5zIHRoZSBpbm5lckNiIHVzZWQgZm9yIHVwZGF0aW5nIGEgY29tcHV0ZWQgaW4gYSBjb21waWxlZCBleHByZXNzaW9uIChzZXR0aW5nIHRoZSBuZXcgaW5zdGFuY2UgYXMgZXhwck9iLm9iLCB1bm9ic2VydmluZyB0aGUgcHJldmlvdXMgb2JqZWN0LFxuXHRcdFx0XHQvLyBhbmQgb2JzZXJ2aW5nIHRoZSBuZXcgb25lKSwgdGhlbiBjYWxsaW5nIHRoZSBvdXRlckNCIC0gaS5lLiB0aGUgaGFuZGxlciBmb3IgdGhlIHdob2xlIGNvbXBpbGVkIGV4cHJlc3Npb24uXG5cdFx0XHRcdC8vIEluaXRpYWxpemVkIGV4cHJPYi5vYiB0byB0aGUgY3VycmVudCBvYmplY3QuXG5cdFx0XHRcdC8vIFVzZXMgdGhlIGNvbnRleHRDYiBjYWxsYmFjayB0byBleGVjdXRlIHRoZSBjb21waWxlZCBleHByT2IgdGVtcGxhdGUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHZpZXcvZGF0YSBldGMuIHRvIGdldCB0aGUgcmV0dXJuZWQgdmFsdWUsIHR5cGljYWxseSBhbiBvYmplY3Qgb3IgYXJyYXkuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGFuIGFycmF5LCByZWdpc3RlcnMgYXJyYXkgYmluZGluZ1xuXHRcdFx0XHR2YXIgb3JpZ1J0ID0gcm9vdDtcblx0XHRcdFx0Ly8gTm90ZTogRm9yIGpzdmlld3MvaXNzdWVzLzI5MiBjdHhDYiB3aWxsIG5lZWQgdmFyIGN0eENiID0gY29udGV4dENiIHx8IGZ1bmN0aW9uKGV4cHJPYiwgb3JpZ1J0KSB7cmV0dXJuIGV4cHJPYi5fanN2KG9yaWdSdCk7fTtcblxuXHRcdFx0XHRleHByT2Iub2IgPSBjb250ZXh0Q2IoZXhwck9iLCBvcmlnUnQpOyAvLyBJbml0aWFsaXplIG9iamVjdFxuXG5cdFx0XHRcdHJldHVybiBleHByT2IuY2IgPSBmdW5jdGlvbihldiwgZXZlbnRBcmdzKSB7XG5cdFx0XHRcdFx0dmFyIG9iaiA9IGV4cHJPYi5vYiwgLy8gVGhlIG9sZCBvYmplY3Rcblx0XHRcdFx0XHRcdHN1YiA9IGV4cHJPYi5zYixcblx0XHRcdFx0XHRcdG5ld09iaiA9IGNvbnRleHRDYihleHByT2IsIG9yaWdSdCk7XG5cblx0XHRcdFx0XHRpZiAobmV3T2JqICE9PSBvYmopIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2Ygb2JqID09PSBPQkpFQ1QpIHtcblx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG9iaiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChzdWIgfHwgYWxsb3dBcnJheSAmJiAkaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtvYmpdLCBzdWIsIGNhbGxiYWNrLCBjb250ZXh0Q2IsIHRydWUpOyAvLyB1bm9ic2VydmUgb24gdGhlIG9sZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZXhwck9iLm9iID0gbmV3T2JqO1xuXHRcdFx0XHRcdFx0Ly8gUHV0IHRoZSB1cGRhdGVkIG9iamVjdCBpbnN0YW5jZSBvbnRvIHRoZSBleHByT2IgaW4gdGhlIHBhdGhzIGFycmF5LCBzbyBzdWJzZXF1ZW50IHN0cmluZyBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBvYmplY3Rcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgbmV3T2JqID09PSBPQkpFQ1QpIHtcblx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG5ld09iaik7XG5cdFx0XHRcdFx0XHRcdGlmIChzdWIgfHwgYWxsb3dBcnJheSAmJiAkaXNBcnJheShuZXdPYmopKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgYXJyYXkgYmluZGluZ1xuXHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbbmV3T2JqXSwgc3ViLCBjYWxsYmFjaywgY29udGV4dENiKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBDYWxsIHRoZSBvdXRlckNiIC0gdG8gZXhlY3V0ZSB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbiB0aGF0IHRoaXMgY29tcHV0ZWQgaXMgcGFydCBvZlxuXHRcdFx0XHRcdGNhbGxiYWNrKGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBiaW5kQXJyYXkoYXJyLCB1bmJpbmQsIGlzQXJyYXksIHJlbFBhdGgpIHtcblx0XHRcdFx0aWYgKGFsbG93QXJyYXkpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY2FsbCB0byBvYnNlcnZlIHRoYXQgZG9lcyBub3QgY29tZSBmcm9tIG9ic2VydmVBbmRCaW5kICh0YWcgYmluZGluZyksIHNvIHdlIGFsbG93IGFycmF5Q2hhbmdlIGJpbmRpbmdcblx0XHRcdFx0XHR2YXIgcHJldk9iaiA9IG9iamVjdCxcblx0XHRcdFx0XHRcdHByZXZBbGxQYXRoID0gYWxsUGF0aDtcblxuXHRcdFx0XHRcdG9iamVjdCA9IGFycjtcblx0XHRcdFx0XHRpZiAocmVsUGF0aCkge1xuXHRcdFx0XHRcdFx0b2JqZWN0ID0gYXJyW3JlbFBhdGhdO1xuXHRcdFx0XHRcdFx0YWxsUGF0aCArPSBcIi5cIiArIHJlbFBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChmaWx0ZXIgJiYgb2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRvYmplY3QgPSAkb2JzZXJ2YWJsZS5fZmx0cihhbGxQYXRoLCBvYmplY3QsIHJlbFBhdGggPyBbYXJyXS5jb25jYXQocGFyZW50T2JzKSA6IHBhcmVudE9icywgZmlsdGVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9iamVjdCAmJiAoaXNBcnJheSB8fCAkaXNBcnJheShvYmplY3QpKSkge1xuXHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKGFycmF5Q2hhbmdlU3RyICsgXCIub2JzZXJ2ZVwiICsgKGNhbGxiYWNrID8gZ2V0Q2JLZXkoY2FsbGJhY2spIDogXCJcIiksIHVuZGVmaW5lZCwgdHJ1ZSwgdW5iaW5kKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2JqZWN0ID0gcHJldk9iajtcblx0XHRcdFx0XHRhbGxQYXRoID0gcHJldkFsbFBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIGksIHAsIHNraXAsIHBhcnRzLCBwcm9wLCBwYXRoLCBkZXAsIHVub2JzZXJ2ZSwgY2FsbGJhY2ssIGNiSWQsIGluSWQsIGVsLCBkYXRhLCBldmVudHMsIGNvbnRleHRDYiwgaXRlbXMsIGNiQmluZGluZ3MsXG5cdFx0XHRcdGRlcHRoLCBpbm5lckNiLCBwYXJlbnRPYnMsIGFsbFBhdGgsIGZpbHRlciwgaW5pdE5zQXJyLCBpbml0TnNBcnJMZW4sXG5cdFx0XHRcdG5zID0gb2JzZXJ2ZVN0cixcblx0XHRcdFx0cGF0aHMgPSB0aGlzICE9IDEgLy8gVXNpbmcgIT0gZm9yIElFPDEwIGJ1Zy0gc2VlIGpzdmlld3MvaXNzdWVzLzIzN1xuXHRcdFx0XHRcdD8gY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpIC8vIEZsYXR0ZW4gdGhlIGFyZ3VtZW50cyAtIHRoaXMgaXMgYSAncmVjdXJzaXZlIGNhbGwnIHdpdGggcGFyYW1zIHVzaW5nIHRoZSAnd3JhcHBlZCBhcnJheSdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gc3R5bGUgLSBzdWNoIGFzIGlubmVyT2JzZXJ2ZShbb2JqZWN0XSwgcGF0aC5wYXRoLCBbb3JpZ1Jvb3RdLCBwYXRoLnBybSwgaW5uZXJDYiwgLi4uKTtcblx0XHRcdFx0XHQ6IHNsaWNlLmNhbGwoYXJndW1lbnRzKSwgLy8gRG9uJ3QgZmxhdHRlbiAtIHRoaXMgaXMgdGhlIGZpcnN0ICd0b3AtbGV2ZWwgY2FsbCwgdG8gaW5uZXJPYnNlcnZlLmFwcGx5KDEsIHBhdGhzKVxuXHRcdFx0XHRsYXN0QXJnID0gcGF0aHMucG9wKCkgfHwgZmFsc2UsXG5cdFx0XHRcdHJvb3QgPSBwYXRocy5zaGlmdCgpLFxuXHRcdFx0XHRvYmplY3QgPSByb290LFxuXHRcdFx0XHRsID0gcGF0aHMubGVuZ3RoO1xuXG5cdFx0XHRpZiAobGFzdEFyZyArIFwiXCIgPT09IGxhc3RBcmcpIHsgLy8gSWYgbGFzdCBhcmcgaXMgYSBzdHJpbmcgdGhlbiB0aGlzIG9ic2VydmUgY2FsbCBpcyBwYXJ0IG9mIGFuIG9ic2VydmVBbGwgY2FsbCxcblx0XHRcdFx0YWxsUGF0aCA9IGxhc3RBcmc7ICAgICAgICAgIC8vIGFuZCB0aGUgbGFzdCB0aHJlZSBhcmdzIGFyZSB0aGUgcGFyZW50T2JzIGFycmF5LCB0aGUgZmlsdGVyLCBhbmQgdGhlIGFsbFBhdGggc3RyaW5nLlxuXHRcdFx0XHRwYXJlbnRPYnMgPSBwYXRocy5wb3AoKTtcblx0XHRcdFx0ZmlsdGVyID0gcGF0aHMucG9wKCk7XG5cdFx0XHRcdGxhc3RBcmcgPSAhIXBhdGhzLnBvcCgpOyAvLyB1bm9ic2VydmVcblx0XHRcdFx0bCAtPSAzO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGxhc3RBcmcgPT09ICEhbGFzdEFyZykge1xuXHRcdFx0XHR1bm9ic2VydmUgPSBsYXN0QXJnO1xuXHRcdFx0XHRsYXN0QXJnID0gcGF0aHNbbC0xXTtcblx0XHRcdFx0bGFzdEFyZyA9IGwgJiYgbGFzdEFyZyArIFwiXCIgIT09IGxhc3RBcmcgJiYgKCFsYXN0QXJnIHx8ICRpc0Z1bmN0aW9uKGxhc3RBcmcpKSA/IChsLS0sIHBhdGhzLnBvcCgpKSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHVub2JzZXJ2ZSAmJiAhbCAmJiAkaXNGdW5jdGlvbihyb290KSkge1xuXHRcdFx0XHRcdGxhc3RBcmcgPSByb290O1xuXHRcdFx0XHRcdHJvb3QgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNhbGxiYWNrID0gbGFzdEFyZztcblx0XHRcdGlmIChsICYmICRpc0Z1bmN0aW9uKHBhdGhzW2wgLSAxXSkpIHtcblx0XHRcdFx0Y29udGV4dENiID0gY2FsbGJhY2s7XG5cdFx0XHRcdGNhbGxiYWNrID0gcGF0aHMucG9wKCk7XG5cdFx0XHRcdGwtLTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHVub2JzZXJ2ZSAmJiBjYWxsYmFjayAmJiAhY2FsbGJhY2suX2NJZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZSBhIHVuaXF1ZSBuYW1lc3BhY2UgKGUuZy4gb2JzNykgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb2JzZXJ2ZSgpIGNhbGxiYWNrIHRvIGFsbG93IHVub2JzZXJ2ZSB0byByZW1vdmUgaGFuZGxlcnNcblx0XHRcdG5zICs9IGNhbGxiYWNrXG5cdFx0XHRcdD8gKChpbklkID0gY2FsbGJhY2suX2luSWQgfHwgXCJcIiksIHVub2JzZXJ2ZSlcblx0XHRcdFx0XHQ/IGNhbGxiYWNrLl9jSWQgKyBpbklkXG5cdFx0XHRcdFx0OiAoY2JJZCA9IGdldENiS2V5KGNhbGxiYWNrKSkgKyBpbklkXG5cdFx0XHRcdDogXCJcIjtcblxuXHRcdFx0aWYgKGNiSWQgJiYgIXVub2JzZXJ2ZSkge1xuXHRcdFx0XHRjYkJpbmRpbmdzID0gY2JCaW5kaW5nc1N0b3JlW2NiSWRdID0gY2JCaW5kaW5nc1N0b3JlW2NiSWRdIHx8IHt9O1xuXHRcdFx0fVxuXG5cdFx0XHRpbml0TnNBcnIgPSBpbml0aWFsTnMgJiYgaW5pdGlhbE5zLm1hdGNoKHJOb3RXaGl0ZSkgfHwgW1wiXCJdO1xuXHRcdFx0aW5pdE5zQXJyTGVuID0gaW5pdE5zQXJyLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKGluaXROc0Fyckxlbi0tKSB7XG5cdFx0XHRcdGluaXRpYWxOcyA9IGluaXROc0Fycltpbml0TnNBcnJMZW5dO1xuXHRcdFx0XHRpZiAocm9vdCAmJiAocGF0aCA9IHBhdGhzWzBdLCAhcGF0aCB8fCBwYXRoICsgXCJcIiAhPT0gcGF0aCkpIHtcblx0XHRcdFx0XHRpZiAoJGlzQXJyYXkocm9vdCkpIHtcblx0XHRcdFx0XHRcdGJpbmRBcnJheShyb290LCB1bm9ic2VydmUsIHRydWUpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodW5vYnNlcnZlKSB7XG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgb25PYnNlcnZhYmxlQ2hhbmdlIGhhbmRsZXJzIHRoYXQgd3JhcCB0aGF0IGNhbGxiYWNrXG5cdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodW5vYnNlcnZlICYmICFsICYmICFyb290KSB7IC8vIHVub2JzZXJ2ZSgpIC0gdW5vYnNlcnZlcyBhbGxcblx0XHRcdFx0XHRmb3IgKHAgaW4gY2JCaW5kaW5nc1N0b3JlKSB7XG5cdFx0XHRcdFx0XHRwID0gY2JCaW5kaW5nc1N0b3JlW3BdO1xuXHRcdFx0XHRcdFx0Zm9yIChkYXRhIGluIHApIHtcblx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gcFtkYXRhXTtcblx0XHRcdFx0XHRcdFx0aWYgKCRpc0FycmF5KG9iamVjdCkpIHtcblx0XHRcdFx0XHRcdFx0XHRiaW5kQXJyYXkob2JqZWN0LCB1bm9ic2VydmUsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIG9uT2JzZXJ2YWJsZUNoYW5nZSBoYW5kbGVycyB0aGF0IHdyYXAgdGhhdCBjYWxsYmFja1xuXHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVwdGggPSAwO1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0cGF0aCA9IHBhdGhzW2ldO1xuXHRcdFx0XHRcdGlmIChwYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2JqZWN0ID0gcm9vdDtcblx0XHRcdFx0XHRpZiAoXCJcIiArIHBhdGggPT09IHBhdGgpIHtcblx0XHRcdFx0XHRcdC8vIENvbnNpZGVyIHN1cHBvcnQgZm9yIGNvbXB1dGVkIHBhdGhzOiBqc3ZpZXdzL2lzc3Vlcy8yOTJcblx0XHRcdFx0XHRcdC8vaWYgKC9bXFwoXFxbXFwrXS8udGVzdChwYXRoKSkge1xuXHRcdFx0XHRcdFx0Ly9cdHZhciBiPXtsaW5rczp7fX0sIHQgPSAkc3ViLnRtcGxGbihcIns6XCIrcGF0aCtcIn1cIiwgYiwgdHJ1ZSksIGl0ZW1zID0gdC5wYXRoc1swXTtcblx0XHRcdFx0XHRcdC8vXHRsICs9IGl0ZW1zLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHQvL1x0c3BsaWNlLmFwcGx5KHBhdGhzLCBbaS0tLCAxXS5jb25jYXQoaXRlbXMpKTtcblx0XHRcdFx0XHRcdC8vXHRjb250aW51ZTtcblx0XHRcdFx0XHRcdC8vfVxuXHRcdFx0XHRcdFx0cGFydHMgPSBwYXRoLnNwbGl0KFwiXlwiKTtcblx0XHRcdFx0XHRcdGlmIChwYXJ0c1sxXSkge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBiaW5kIHRoZSBsZWFmLCBwbHVzIGFkZGl0aW9uYWwgbm9kZXMgYmFzZWQgb24gZGVwdGguXG5cdFx0XHRcdFx0XHRcdC8vIFwiYS5iLmNeZC5lXCIgaXMgZGVwdGggMiwgc28gbGlzdGVucyB0byBjaGFuZ2VzIG9mIGUsIHBsdXMgY2hhbmdlcyBvZiBkIGFuZCBvZiBjXG5cdFx0XHRcdFx0XHRcdGRlcHRoID0gcGFydHNbMF0uc3BsaXQoXCIuXCIpLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0cGF0aCA9IHBhcnRzLmpvaW4oXCIuXCIpO1xuXHRcdFx0XHRcdFx0XHRkZXB0aCA9IHBhdGguc3BsaXQoXCIuXCIpLmxlbmd0aCAtIGRlcHRoO1xuXHRcdFx0XHRcdFx0XHQvLyBpZiBtb3JlIHRoYW4gb25lIF4gaW4gdGhlIHBhdGgsIHRoZSBmaXJzdCBvbmUgZGV0ZXJtaW5lcyBkZXB0aFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGNvbnRleHRDYiAmJiAoaXRlbXMgPSBjb250ZXh0Q2IocGF0aCwgcm9vdCwgZGVwdGgpKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgYXJyYXkgb2Ygb2JqZWN0cyBhbmQgcGF0aHMgcmV0dXJuZWQgYnkgY29udGV4dENiIGlzIG5vbiBlbXB0eSwgaW5zZXJ0IHRoZW1cblx0XHRcdFx0XHRcdFx0Ly8gaW50byB0aGUgc2VxdWVuY2UsIHJlcGxhY2luZyB0aGUgY3VycmVudCBpdGVtIChwYXRoKS4gT3RoZXJ3aXNlIHNpbXBseSByZW1vdmUgY3VycmVudCBpdGVtIChwYXRoKVxuXHRcdFx0XHRcdFx0XHRsICs9IGl0ZW1zLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHRcdHNwbGljZS5hcHBseShwYXRocywgW2ktLSwgMV0uY29uY2F0KGl0ZW1zKSk7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCEkaXNGdW5jdGlvbihwYXRoKSkge1xuXHRcdFx0XHRcdFx0XHRpZiAocGF0aCAmJiBwYXRoLl9qc3YpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY29tcGlsZWQgZnVuY3Rpb24gZm9yIGJpbmRpbmcgdG8gYW4gb2JqZWN0IHJldHVybmVkIGJ5IGEgaGVscGVyL2RhdGEgZnVuY3Rpb24uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2V0IGN1cnJlbnQgb2JqZWN0IG9uIGV4cHJPYi5vYiwgYW5kIGdldCBpbm5lckNiIGZvciB1cGRhdGluZyB0aGUgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJDYiA9IHVub2JzZXJ2ZSA/IHBhdGguY2IgOiBnZXRJbm5lckNiKHBhdGgpO1xuXHRcdFx0XHRcdFx0XHRcdGlubmVyQ2Iubm9BcnJheSA9ICFhbGxvd0FycmF5O1xuXHRcdFx0XHRcdFx0XHRcdC8vIGlubmVyQ2IuX2N0eCA9IGNhbGxiYWNrLl9jdHg7IENvdWxkIHBhc3MgY29udGV4dCAoZS5nLiBsaW5rQ3R4KSBmb3IgdXNlIGluIGEgZGVwZW5kcyA9IGZ1bmN0aW9uKCkge30gY2FsbCwgc28gZGVwZW5kcyBpcyBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBsaW5rQ3R4J3Ncblx0XHRcdFx0XHRcdFx0XHRpbm5lckNiLl9jSWQgPSBjYWxsYmFjay5fY0lkO1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNldCB0aGUgc2FtZSBjYkJpbmRpbmdzU3RvcmUga2V5IGFzIGZvciBjYWxsYmFjaywgc28gd2hlbiBjYWxsYmFjayBpcyBkaXNwb3NlZCwgZGlzcG9zYWwgb2YgaW5uZXJDYiBoYXBwZW5zIHRvby5cblx0XHRcdFx0XHRcdFx0XHRpbm5lckNiLl9pbklkID0gaW5uZXJDYi5faW5JZCB8fCBcIi5vYkluXCIgKyBvYnNlcnZlSW5uZXJDYktleSsrO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXRoLmJuZCB8fCBwYXRoLnBybSAmJiBwYXRoLnBybS5sZW5ndGggfHwgIXBhdGguc2IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBleHByT2IgaXMgYm91bmQgZS5nLiBmb28oKV5zdWIucGF0aCwgb3IgaGFzIHBhcmFtZXRlcnMgZS5nLiBmb28oYmFyKSBvciBpcyBhIGxlYWYgb2JqZWN0IChzbyBubyBzdWIgcGF0aCkgZS5nLiBmb28oKVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gdGhlbiBvYnNlcnZlIGNoYW5nZXMgb24gdGhlIG9iamVjdCwgb3IgaXRzIHBhcmFtZXRlcnMgYW5kIHN1Yi1wYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRpbm5lck9ic2VydmUoW29iamVjdF0sIHBhdGgucGF0aCwgW29yaWdSb290XSwgcGF0aC5wcm0sIGlubmVyQ2IsIGNvbnRleHRDYiwgdW5vYnNlcnZlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhdGguc2IpIHsgLy8gc3ViUGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtwYXRoLm9iXSwgcGF0aC5zYiwgY2FsbGJhY2ssIGNvbnRleHRDYiwgdW5vYnNlcnZlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cGF0aCA9IG9yaWdSb290O1xuXHRcdFx0XHRcdFx0XHRcdG9iamVjdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvYmplY3QgPSBwYXRoOyAvLyBGb3IgdG9wLWxldmVsIGNhbGxzLCBvYmplY3RzIGluIHRoZSBwYXRocyBhcnJheSBiZWNvbWUgdGhlIG9yaWdSb290IGZvciBzdWJzZXF1ZW50IHBhdGhzLlxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwYXJ0cyA9IFtyb290ID0gcGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlIChvYmplY3QgJiYgKHByb3AgPSBwYXJ0cy5zaGlmdCgpKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iamVjdCA9PT0gT0JKRUNUKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChcIlwiICsgcHJvcCA9PT0gcHJvcCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKChwYXJ0cy5sZW5ndGggPCBkZXB0aCArIDEpICYmICFvYmplY3Qubm9kZVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEFkZCBvYnNlcnZlciBmb3IgZWFjaCB0b2tlbiBpbiBwYXRoIHN0YXJ0aW5nIGF0IGRlcHRoLCBhbmQgb24gdG8gdGhlIGxlYWZcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghdW5vYnNlcnZlICYmIChldmVudHMgPSAkaGFzRGF0YShvYmplY3QpICYmICQuX2RhdGEob2JqZWN0KSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnRzID0gZXZlbnRzLmV2ZW50cztcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnRzID0gZXZlbnRzICYmIGV2ZW50c1twcm9wZXJ0eUNoYW5nZVN0cl07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVsID0gZXZlbnRzICYmIGV2ZW50cy5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNraXAgPSAwO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoZWwtLSkgeyAvLyBTa2lwIGR1cGxpY2F0ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhID0gZXZlbnRzW2VsXS5kYXRhO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChkYXRhXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQmJiBkYXRhLm5zID09PSBpbml0aWFsTnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCYmIGRhdGEuY2IuX2NJZCA9PT0gY2FsbGJhY2suX2NJZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JiYgZGF0YS5jYi5faW5JZCA9PT0gY2FsbGJhY2suX2luSWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCYmIChkYXRhLnByb3AgPT09IHByb3AgfHwgZGF0YS5wcm9wID09PSBcIipcIiB8fCBkYXRhLnByb3AgPT09IFwiKipcIikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwID0gcGFydHMuam9pbihcIi5cIikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YS5wYXRocy5wdXNoKHApOyAvLyBXZSB3aWxsIHNraXAgdGhpcyBiaW5kaW5nLCBidXQgaWYgaXQgaXMgbm90IGEgbGVhZiBiaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBuZWVkIHRvIGtlZXAgYmluZGluZ3MgZm9yIHJlc3Qgb2YgcGF0aCwgcmVhZHkgZm9yIGlmIHRoZSBvYmplY3QgZ2V0cyBzd2FwcGVkLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2tpcCsrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc2tpcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIER1cGxpY2F0ZSBiaW5kaW5nKHMpIGZvdW5kLCBzbyBtb3ZlIG9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gb2JqZWN0W3Byb3BdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocHJvcCA9PT0gXCIqXCIgfHwgcHJvcCA9PT0gXCIqKlwiKSB7IC8vIFwiKlwiID0+IGFsbCBwcm9wZXJ0aWVzLiBcIioqXCIgPT4gYWxsIHByb3BlcnRpZXMgYW5kIHN1Yi1wcm9wZXJ0aWVzIChpLmUuIGRlZXAgb2JzZXJ2ZUFsbCBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCF1bm9ic2VydmUgJiYgZXZlbnRzICYmIGV2ZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgYmluZGluZ3MsIHNpbmNlIHRoZXkgd2lsbCBiZSBkdXBsaWNhdGVzIHdpdGggXCIqXCIgb3IgXCIqKlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zLCBcIlwiLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHByb3AgPT09IFwiKlwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zLCBcIlwiKTsgLy8gb2JzZXJ2ZSB0aGUgb2JqZWN0IGZvciBhbnkgcHJvcGVydHkgY2hhbmdlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChwIGluIG9iamVjdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gb2JzZXJ2aW5nIFwiKlwiOiBTbyAoaW4gYWRkaXRpb24gdG8gbGlzdGVuaW5nIHRvIHByb3AgY2hhbmdlLCBhYm92ZSkgbGlzdGVuIHRvIGFycmF5Y2hhbmdlIG9uIHByb3BzIG9mIHR5cGUgYXJyYXlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwICE9PSAkZXhwYW5kbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiaW5kQXJyYXkob2JqZWN0LCB1bm9ic2VydmUsIHVuZGVmaW5lZCwgcCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCQub2JzZXJ2YWJsZShpbml0aWFsTnMsIG9iamVjdClbKHVub2JzZXJ2ZSA/IFwidW5cIiA6IFwiXCIpICsgXCJvYnNlcnZlQWxsXCJdKGNhbGxiYWNrKTsgLy8gb2JzZXJ2ZSBvciB1bm9ic2VydmUgdGhlIG9iamVjdCBmb3IgYW55IHByb3BlcnR5IGNoYW5nZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwcm9wKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucyArIFwiLnBfXCIgKyBwcm9wLCBwYXJ0cy5qb2luKFwiXlwiKSk7IC8vIEJ5IHVzaW5nIFwiXlwiIHJhdGhlciB0aGFuIFwiLlwiIHdlIGVuc3VyZSB0aGF0IGRlZXAgYmluZGluZyB3aWxsIGJlIHVzZWQgb24gbmV3bHkgaW5zZXJ0ZWQgb2JqZWN0IGdyYXBoc1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoYWxsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YWxsUGF0aCArPSBcIi5cIiArIHByb3A7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHByb3AgPSBvYmplY3RbcHJvcF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKCRpc0Z1bmN0aW9uKHByb3ApKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGRlcCA9IHByb3AuZGVwZW5kcykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGNvbXB1dGVkIG9ic2VydmFibGUuIFdlIHdpbGwgb2JzZXJ2ZSBhbnkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRpbm5lck9ic2VydmUoW29iamVjdF0sIHJlc29sdmVQYXRoT2JqZWN0cyhkZXAsIG9iamVjdCwgY2FsbGJhY2spLCBjYWxsYmFjaywgY29udGV4dENiLCB1bm9ic2VydmUpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvYmplY3QgPSBwcm9wO1xuXHRcdFx0XHRcdFx0XHRpZiAodW5vYnNlcnZlICYmIG9iamVjdCA9PT0gcm9vdCAmJiAoaT5sLTIgfHwgcGF0aHNbaSsxXSArIFwiXCIgIT09IHBhdGhzW2krMV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdW5vYnNlcnZlIGFsbCBoYW5kbGVycyBvZiBvYmplY3QsIGlmIG5vdCBmb2xsb3dlZCBieSBzdHJpbmcgcGF0aC5cblx0XHRcdFx0XHRcdFx0XHQvLyBlLmcuJC51bm9ic2VydmUob2JqZWN0MSwgb2JqZWN0MiwgXCJwYXRoXCIsIG9iamVjdDMpIHdpbGwgdW5vYnNlcnZlIGFsbCBmcm9tIG9iamVjdDEgYW5kIG9iamVjdDMsIGFuZCBqdXN0IFwicGF0aFwiIGxpc3RlbmVyIGZyb20gb2JqZWN0MlxuXHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YmluZEFycmF5KG9iamVjdCwgdW5vYnNlcnZlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGNiSWQpIHtcblx0XHRcdFx0cmVtb3ZlQ2JCaW5kaW5ncyhjYkJpbmRpbmdzLCBjYklkKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIHRoZSBjYkJpbmRpbmdzIHRvIHRoZSB0b3AtbGV2ZWwgY2FsbGVyLCBhbG9uZyB3aXRoIHRoZSBjYklkXG5cdFx0XHRyZXR1cm4ge2NiSWQ6IGNiSWQsIGJuZDogY2JCaW5kaW5nc307XG5cdFx0fVxuXG5cdFx0dmFyIGluaXRpYWxOcyxcblx0XHRcdGFsbG93QXJyYXkgPSB0aGlzICE9IGZhbHNlLCAvLyBJZiB0aGlzID09PSBmYWxzZSwgdGhpcyBpcyBhIGNhbGwgZnJvbSBvYnNlcnZlQW5kQmluZCAtIGRvaW5nIGJpbmRpbmcgb2YgZGF0YWxpbmsgZXhwcmVzc2lvbnMuIFdlIGRvbid0IGJpbmRcblx0XHRcdC8vIGFycmF5Q2hhbmdlIGV2ZW50cyBpbiB0aGlzIHNjZW5hcmlvLiBJbnN0ZWFkLCB7Xntmb3J9fSBhbmQgc2ltaWxhciBkbyBzcGVjaWZpYyBhcnJheUNoYW5nZSBiaW5kaW5nIHRvIHRoZSB0YWdDdHguYXJnc1swXSB2YWx1ZSwgaW4gb25BZnRlckxpbmsuXG5cdFx0XHQvLyBOb3RlIGRlbGliZXJhdGVseSB1c2luZyB0aGlzICE9IGZhbHNlLCByYXRoZXIgdGhhbiB0aGlzICE9PSBmYWxzZSBiZWNhdXNlIG9mIElFPDEwIGJ1Zy0gc2VlIGpzdmlld3MvaXNzdWVzLzIzN1xuXHRcdFx0cGF0aHMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyksXG5cdFx0XHRvcmlnUm9vdCA9IHBhdGhzWzBdO1xuXG5cdFx0aWYgKG9yaWdSb290ICsgXCJcIiA9PT0gb3JpZ1Jvb3QgJiYgYWxsb3dBcnJheSkge1xuXHRcdFx0aW5pdGlhbE5zID0gb3JpZ1Jvb3Q7IC8vIFRoZSBmaXJzdCBhcmcgaXMgYSBuYW1lc3BhY2UsIHNpbmNlIGl0IGlzIGEgc3RyaW5nLCBhbmQgdGhpcyBjYWxsIGlzIG5vdCBmcm9tIG9ic2VydmVBbmRCaW5kXG5cdFx0XHRwYXRocy5zaGlmdCgpO1xuXHRcdFx0b3JpZ1Jvb3QgPSBwYXRoc1swXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaW5uZXJPYnNlcnZlLmFwcGx5KDEsIHBhdGhzKTtcblx0fTtcblxuXHQkb2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKG5zLCBkYXRhKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGRhdGEgPSBucztcblx0XHRcdG5zID0gXCJcIjtcblx0XHR9XG5cdFx0cmV0dXJuICRpc0FycmF5KGRhdGEpXG5cdFx0XHQ/IG5ldyBBcnJheU9ic2VydmFibGUobnMsIGRhdGEpXG5cdFx0XHQ6IG5ldyBPYmplY3RPYnNlcnZhYmxlKG5zLCBkYXRhKTtcblx0fTtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQkc3ViLmdldERlcHMgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXJncyA9IGFyZ3VtZW50cztcblx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgYXJnLCBkZXAsXG5cdFx0XHRcdGRlcHMgPSBbXSxcblx0XHRcdFx0bCA9IGFyZ3MubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRhcmcgPSBhcmdzW2wtLV07XG5cdFx0XHRcdGRlcCA9IGFyZ3NbbF07XG5cdFx0XHRcdGlmIChkZXApIHtcblx0XHRcdFx0XHRkZXBzID0gZGVwcy5jb25jYXQoJGlzRnVuY3Rpb24oZGVwKSA/IGRlcChhcmcsIGFyZykgOiBkZXApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZGVwcztcblx0XHR9O1xuXHR9O1xuXG5cdCQub2JzZXJ2YWJsZSA9ICRvYnNlcnZhYmxlO1xuXHQkb2JzZXJ2YWJsZS5fZmx0ciA9IGZ1bmN0aW9uKGFsbFBhdGgsIG9iamVjdCwgcGFyZW50T2JzLCBmaWx0ZXIpIHtcblx0XHRpZiAoZmlsdGVyICYmICRpc0Z1bmN0aW9uKGZpbHRlcilcblx0XHRcdD8gZmlsdGVyKGFsbFBhdGgsIG9iamVjdCwgcGFyZW50T2JzKVxuXHRcdFx0OiB0cnVlIC8vIFRPRE8gQ29uc2lkZXIgc3VwcG9ydGluZyBmaWx0ZXIgYmVpbmcgYSBzdHJpbmcgb3Igc3RyaW5ncyB0byBkbyBSZWdFeCBmaWx0ZXJpbmcgYmFzZWQgb24ga2V5IGFuZC9vciBhbGxQYXRoXG5cdFx0KSB7XG5cdFx0XHRvYmplY3QgPSAkaXNGdW5jdGlvbihvYmplY3QpXG5cdFx0XHRcdD8gb2JqZWN0LnNldCAmJiBvYmplY3QuY2FsbChwYXJlbnRPYnNbMF0pIC8vIEl0IGlzIGEgZ2V0dGVyL3NldHRlclxuXHRcdFx0XHQ6IG9iamVjdDtcblx0XHRcdHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSBPQkpFQ1QgJiYgb2JqZWN0O1xuXHRcdH1cblx0fTtcblxuXHQkb2JzZXJ2YWJsZS5PYmplY3QgPSBPYmplY3RPYnNlcnZhYmxlO1xuXHQkb2JzZXJ2YWJsZS5BcnJheSA9IEFycmF5T2JzZXJ2YWJsZTtcblx0JC5vYnNlcnZlID0gJG9ic2VydmFibGUub2JzZXJ2ZSA9ICRvYnNlcnZlO1xuXHQkLnVub2JzZXJ2ZSA9ICRvYnNlcnZhYmxlLnVub2JzZXJ2ZSA9ICR1bm9ic2VydmU7XG5cdCRvYnNlcnZhYmxlLl9hcHBseSA9IG9ic2VydmVfYXBwbHk7XG5cblx0T2JqZWN0T2JzZXJ2YWJsZS5wcm90b3R5cGUgPSB7XG5cdFx0X2RhdGE6IG51bGwsXG5cblx0XHRvYnNlcnZlQWxsOiAkb2JzZXJ2ZUFsbCxcblx0XHR1bm9ic2VydmVBbGw6ICR1bm9ic2VydmVBbGwsXG5cblx0XHRkYXRhOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9kYXRhO1xuXHRcdH0sXG5cblx0XHRzZXRQcm9wZXJ0eTogZnVuY3Rpb24ocGF0aCwgdmFsdWUsIG5vblN0cmljdCkge1xuXHRcdFx0cGF0aCA9IHBhdGggfHwgXCJcIjtcblx0XHRcdHZhciBrZXksIHBhaXIsIHBhcnRzLFxuXHRcdFx0XHRtdWx0aSA9IHBhdGggKyBcIlwiICE9PSBwYXRoLFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0b2JqZWN0ID0gc2VsZi5fZGF0YTtcblxuXHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRpZiAobXVsdGkpIHtcblx0XHRcdFx0XHRub25TdHJpY3QgPSB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoJGlzQXJyYXkocGF0aCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgdGhlIGFycmF5IGZvcm1hdCBnZW5lcmF0ZWQgYnkgc2VyaWFsaXplQXJyYXkuIEhvd2V2ZXIsIHRoaXMgaGFzIHRoZSBwcm9ibGVtIHRoYXQgaXQgY29lcmNlcyB0eXBlcyB0byBzdHJpbmcsXG5cdFx0XHRcdFx0XHQvLyBhbmQgZG9lcyBub3QgcHJvdmlkZSBzaW1wbGUgc3VwcG9ydCBvZiBjb252ZXJ0VG8gYW5kIGNvbnZlcnRGcm9tIGZ1bmN0aW9ucy5cblx0XHRcdFx0XHRcdGtleSA9IHBhdGgubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGtleS0tKSB7XG5cdFx0XHRcdFx0XHRcdHBhaXIgPSBwYXRoW2tleV07XG5cdFx0XHRcdFx0XHRcdHNlbGYuc2V0UHJvcGVydHkocGFpci5uYW1lLCBwYWlyLnZhbHVlLCBub25TdHJpY3QgPT09IHVuZGVmaW5lZCB8fCBub25TdHJpY3QpOyAvL0lmIG5vblN0cmljdCBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0IHRvIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIE9iamVjdCByZXByZXNlbnRhdGlvbiB3aGVyZSBwcm9wZXJ0eSBuYW1lIGlzIHBhdGggYW5kIHByb3BlcnR5IHZhbHVlIGlzIHZhbHVlLlxuXHRcdFx0XHRcdFx0Zm9yIChrZXkgaW4gcGF0aCkge1xuXHRcdFx0XHRcdFx0XHRzZWxmLnNldFByb3BlcnR5KGtleSwgcGF0aFtrZXldLCBub25TdHJpY3QpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwYXRoICE9PSAkZXhwYW5kbykge1xuXHRcdFx0XHRcdC8vIFNpbXBsZSBzaW5nbGUgcHJvcGVydHkgY2FzZS5cblx0XHRcdFx0XHRwYXJ0cyA9IHBhdGguc3BsaXQoL1suXl0vKTtcblx0XHRcdFx0XHR3aGlsZSAob2JqZWN0ICYmIHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdG9iamVjdCA9IG9iamVjdFtwYXJ0cy5zaGlmdCgpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRcdFx0c2VsZi5fc2V0UHJvcGVydHkob2JqZWN0LCBwYXJ0c1swXSwgdmFsdWUsIG5vblN0cmljdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc2VsZjtcblx0XHR9LFxuXG5cdFx0cmVtb3ZlUHJvcGVydHk6IGZ1bmN0aW9uKHBhdGgpIHtcblx0XHRcdHRoaXMuc2V0UHJvcGVydHkocGF0aCwgcmVtb3ZlKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfc2V0UHJvcGVydHk6IGZ1bmN0aW9uKGxlYWYsIHBhdGgsIHZhbHVlLCBub25TdHJpY3QpIHtcblx0XHRcdHZhciBzZXR0ZXIsIGdldHRlciwgcmVtb3ZlUHJvcCxcblx0XHRcdFx0cHJvcGVydHkgPSBwYXRoID8gbGVhZltwYXRoXSA6IGxlYWY7XG5cblx0XHRcdGlmICgkaXNGdW5jdGlvbihwcm9wZXJ0eSkpIHtcblx0XHRcdFx0aWYgKHByb3BlcnR5LnNldCkge1xuXHRcdFx0XHRcdC8vIENhc2Ugb2YgcHJvcGVydHkgc2V0dGVyL2dldHRlciAtIHdpdGggY29udmVudGlvbiB0aGF0IHByb3BlcnR5IGlzIGdldHRlciBhbmQgcHJvcGVydHkuc2V0IGlzIHNldHRlclxuXHRcdFx0XHRcdGxlYWYgPSBsZWFmLl93cnAgIC8vIENhc2Ugb2YgSnNWaWV3cyAyLXdheSBkYXRhLWxpbmtpbmcgdG8gYSBoZWxwZXIgZnVuY3Rpb24gYXMgZ2V0dGVyLCB3aXRoIGEgc2V0dGVyLlxuXHRcdFx0XHRcdFx0Ly8gVGhlIHZpZXcgd2lsbCBiZSB0aGUgdGhpcyBwb2ludGVyIGZvciBnZXR0ZXIgYW5kIHNldHRlci4gTm90ZTogdGhpcyBpcyB0aGUgb25lIHNjZW5hcmlvIHdoZXJlIHBhdGggaXMgXCJcIi5cblx0XHRcdFx0XHRcdHx8IGxlYWY7XG5cdFx0XHRcdFx0Z2V0dGVyID0gcHJvcGVydHk7XG5cdFx0XHRcdFx0c2V0dGVyID0gZ2V0dGVyLnNldCA9PT0gdHJ1ZSA/IGdldHRlciA6IGdldHRlci5zZXQ7XG5cdFx0XHRcdFx0cHJvcGVydHkgPSBnZXR0ZXIuY2FsbChsZWFmKTsgLy8gZ2V0IC0gb25seSB0cmVhdGVkIGFzIGdldHRlciBpZiBhbHNvIGEgc2V0dGVyLiBPdGhlcndpc2UgaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgb2YgdHlwZSBmdW5jdGlvbi4gU2VlIHVuaXQgdGVzdHMgJ0NhbiBvYnNlcnZlIHByb3BlcnRpZXMgb2YgdHlwZSBmdW5jdGlvbicuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BlcnR5ICE9PSB2YWx1ZSB8fCBub25TdHJpY3QgJiYgcHJvcGVydHkgIT0gdmFsdWUpIHsgLy8gT3B0aW9uYWwgbm9uLXN0cmljdCBlcXVhbGl0eSwgc2luY2Ugc2VyaWFsaXplQXJyYXksIGFuZCBmb3JtLWJhc2VkIGVkaXRvcnMgY2FuIG1hcCBudW1iZXJzIHRvIHN0cmluZ3MsIGV0Yy5cblx0XHRcdFx0Ly8gRGF0ZSBvYmplY3RzIGRvbid0IHN1cHBvcnQgIT0gY29tcGFyaXNvbi4gVHJlYXQgYXMgc3BlY2lhbCBjYXNlLlxuXHRcdFx0XHRpZiAoIShwcm9wZXJ0eSBpbnN0YW5jZW9mIERhdGUpIHx8IHByb3BlcnR5ID4gdmFsdWUgfHwgcHJvcGVydHkgPCB2YWx1ZSkge1xuXHRcdFx0XHRcdGlmIChzZXR0ZXIpIHtcblx0XHRcdFx0XHRcdHNldHRlci5jYWxsKGxlYWYsIHZhbHVlKTsgICAvL3NldFxuXHRcdFx0XHRcdFx0dmFsdWUgPSBnZXR0ZXIuY2FsbChsZWFmKTsgIC8vZ2V0IHVwZGF0ZWQgdmFsdWVcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHJlbW92ZVByb3AgPSB2YWx1ZSA9PT0gcmVtb3ZlKSB7XG5cdFx0XHRcdFx0XHRpZiAocHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgbGVhZltwYXRoXTtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gdW5kZWZpbmVkOyAvLyBJZiB2YWx1ZSB3YXMgYWxyZWFkeSB1bmRlZmluZWQsIGRvbid0IHRyaWdnZXIgaGFuZGxlciBmb3IgcmVtb3ZlUHJvcFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0bGVhZltwYXRoXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fdHJpZ2dlcihsZWFmLCB7Y2hhbmdlOiBcInNldFwiLCBwYXRoOiBwYXRoLCB2YWx1ZTogdmFsdWUsIG9sZFZhbHVlOiBwcm9wZXJ0eSwgcmVtb3ZlOiByZW1vdmVQcm9wfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdF90cmlnZ2VyOiBmdW5jdGlvbih0YXJnZXQsIGV2ZW50QXJncykge1xuXHRcdFx0JCh0YXJnZXQpLnRyaWdnZXJIYW5kbGVyKHByb3BlcnR5Q2hhbmdlU3RyICsgKHRoaXMuX25zID8gXCIuXCIgKyAvXlxcUysvLmV4ZWModGhpcy5fbnMpWzBdIDogXCJcIiksIGV2ZW50QXJncyk7IC8vIElmIHdoaXRlLXNwYWNlIHNlcGFyYXRlZCBuYW1lc3BhY2VzLCB1c2UgZmlyc3Qgb25lIG9ubHlcblx0XHR9XG5cdH07XG5cblx0QXJyYXlPYnNlcnZhYmxlLnByb3RvdHlwZSA9IHtcblx0XHRfZGF0YTogbnVsbCxcblxuXHRcdG9ic2VydmVBbGw6ICRvYnNlcnZlQWxsLFxuXHRcdHVub2JzZXJ2ZUFsbDogJHVub2JzZXJ2ZUFsbCxcblxuXHRcdGRhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2RhdGE7XG5cdFx0fSxcblxuXHRcdGluc2VydDogZnVuY3Rpb24oaW5kZXgsIGRhdGEpIHtcblx0XHRcdHZhciBfZGF0YSA9IHRoaXMuX2RhdGE7XG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRkYXRhID0gaW5kZXg7XG5cdFx0XHRcdGluZGV4ID0gX2RhdGEubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0aW5kZXggPSBQQVJTRUlOVChpbmRleCk7XG5cdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHRkYXRhID0gJGlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdO1xuXHRcdFx0XHQvLyBkYXRhIGNhbiBiZSBhIHNpbmdsZSBpdGVtIChpbmNsdWRpbmcgYSBudWxsL3VuZGVmaW5lZCB2YWx1ZSkgb3IgYW4gYXJyYXkgb2YgaXRlbXMuXG5cdFx0XHRcdC8vIE5vdGUgdGhlIHByb3ZpZGVkIGl0ZW1zIGFyZSBpbnNlcnRlZCB3aXRob3V0IGJlaW5nIGNsb25lZCwgYXMgZGlyZWN0IHJlZmVyZW5jZXMgdG8gdGhlIHByb3ZpZGVkIG9iamVjdHNcblxuXHRcdFx0XHRpZiAoZGF0YS5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9pbnNlcnQoaW5kZXgsIGRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X2luc2VydDogZnVuY3Rpb24oaW5kZXgsIGRhdGEpIHtcblx0XHRcdHZhciBfZGF0YSA9IHRoaXMuX2RhdGEsXG5cdFx0XHRcdG9sZExlbmd0aCA9IF9kYXRhLmxlbmd0aDtcblx0XHRcdGlmIChpbmRleCA+IG9sZExlbmd0aCkge1xuXHRcdFx0XHRpbmRleCA9IG9sZExlbmd0aDtcblx0XHRcdH1cblx0XHRcdHNwbGljZS5hcHBseShfZGF0YSwgW2luZGV4LCAwXS5jb25jYXQoZGF0YSkpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiBcImluc2VydFwiLCBpbmRleDogaW5kZXgsIGl0ZW1zOiBkYXRhfSwgb2xkTGVuZ3RoKTtcblx0XHR9LFxuXG5cdFx0cmVtb3ZlOiBmdW5jdGlvbihpbmRleCwgbnVtVG9SZW1vdmUpIHtcblx0XHRcdHZhciBpdGVtcyxcblx0XHRcdFx0X2RhdGEgPSB0aGlzLl9kYXRhO1xuXG5cdFx0XHRpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpbmRleCA9IF9kYXRhLmxlbmd0aCAtIDE7XG5cdFx0XHR9XG5cblx0XHRcdGluZGV4ID0gUEFSU0VJTlQoaW5kZXgpO1xuXHRcdFx0bnVtVG9SZW1vdmUgPSBudW1Ub1JlbW92ZSA/IFBBUlNFSU5UKG51bVRvUmVtb3ZlKSA6IG51bVRvUmVtb3ZlID09PSAwID8gMCA6IDE7IC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkOiByZW1vdmUgMVxuXHRcdFx0aWYgKG51bVRvUmVtb3ZlID4gMCAmJiBpbmRleCA+IC0xKSB7XG5cdFx0XHRcdGl0ZW1zID0gX2RhdGEuc2xpY2UoaW5kZXgsIGluZGV4ICsgbnVtVG9SZW1vdmUpO1xuXHRcdFx0XHRpZiAobnVtVG9SZW1vdmUgPSBpdGVtcy5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmUoaW5kZXgsIG51bVRvUmVtb3ZlLCBpdGVtcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfcmVtb3ZlOiBmdW5jdGlvbihpbmRleCwgbnVtVG9SZW1vdmUsIGl0ZW1zKSB7XG5cdFx0XHR2YXIgX2RhdGEgPSB0aGlzLl9kYXRhLFxuXHRcdFx0XHRvbGRMZW5ndGggPSBfZGF0YS5sZW5ndGg7XG5cblx0XHRcdF9kYXRhLnNwbGljZShpbmRleCwgbnVtVG9SZW1vdmUpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiBcInJlbW92ZVwiLCBpbmRleDogaW5kZXgsIGl0ZW1zOiBpdGVtc30sIG9sZExlbmd0aCk7XG5cdFx0fSxcblxuXHRcdG1vdmU6IGZ1bmN0aW9uKG9sZEluZGV4LCBuZXdJbmRleCwgbnVtVG9Nb3ZlKSB7XG5cdFx0XHRudW1Ub01vdmUgPSBudW1Ub01vdmUgPyBQQVJTRUlOVChudW1Ub01vdmUpIDogbnVtVG9Nb3ZlID09PSAwID8gMCA6IDE7IC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkOiBtb3ZlIDFcblx0XHRcdG9sZEluZGV4ID0gUEFSU0VJTlQob2xkSW5kZXgpO1xuXHRcdFx0bmV3SW5kZXggPSBQQVJTRUlOVChuZXdJbmRleCk7XG5cblx0XHRcdGlmIChudW1Ub01vdmUgPiAwICYmIG9sZEluZGV4ID4gLTEgJiYgbmV3SW5kZXggPiAtMSAmJiBvbGRJbmRleCAhPT0gbmV3SW5kZXgpIHtcblx0XHRcdFx0dGhpcy5fbW92ZShvbGRJbmRleCwgbmV3SW5kZXgsIG51bVRvTW92ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X21vdmU6IGZ1bmN0aW9uKG9sZEluZGV4LCBuZXdJbmRleCwgbnVtVG9Nb3ZlKSB7XG5cdFx0XHR2YXIgaXRlbXMsXG5cdFx0XHRcdF9kYXRhID0gdGhpcy5fZGF0YSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gX2RhdGEubGVuZ3RoLFxuXHRcdFx0XHRleGNlc3MgPSBvbGRJbmRleCArIG51bVRvTW92ZSAtIG9sZExlbmd0aDtcblx0XHRcdGlmIChleGNlc3MgPiAwKSB7XG5cdFx0XHRcdG51bVRvTW92ZSAtPSBleGNlc3M7XG5cdFx0XHR9XG5cdFx0XHRpZiAobnVtVG9Nb3ZlKSB7XG5cdFx0XHRcdGl0ZW1zID0gX2RhdGEuc3BsaWNlKG9sZEluZGV4LCBudW1Ub01vdmUpOyAvLyByZW1vdmVcblx0XHRcdFx0aWYgKG5ld0luZGV4ID4gX2RhdGEubGVuZ3RoKSB7XG5cdFx0XHRcdFx0bmV3SW5kZXggPSBfZGF0YS5sZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3BsaWNlLmFwcGx5KF9kYXRhLCBbbmV3SW5kZXgsIDBdLmNvbmNhdChpdGVtcykpOyAvL3JlLWluc2VydFxuXHRcdFx0XHR0aGlzLl90cmlnZ2VyKHtjaGFuZ2U6IFwibW92ZVwiLCBvbGRJbmRleDogb2xkSW5kZXgsIGluZGV4OiBuZXdJbmRleCwgaXRlbXM6IGl0ZW1zfSwgb2xkTGVuZ3RoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0cmVmcmVzaDogZnVuY3Rpb24obmV3SXRlbXMsIHNvcnQpIHtcblx0XHRcdGZ1bmN0aW9uIGluc2VydEFkZGVkKCkge1xuXHRcdFx0XHRpZiAoaykge1xuXHRcdFx0XHRcdHNlbGYuaW5zZXJ0KGotaywgYWRkZWRJdGVtcyk7IC8vIE5vdCBmb3VuZCBpbiBvcmlnaW5hbCBhcnJheSAtIHNvIGluc2VydFxuXHRcdFx0XHRcdGRhdGFMZW5ndGggKz0gaztcblx0XHRcdFx0XHRpICs9IGs7XG5cdFx0XHRcdFx0ayA9IDA7XG5cdFx0XHRcdFx0YWRkZWRJdGVtcyA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciByZWZyZXNoIG9wZXJhdGlvbiB3ZSBpdGVyYXRpdmVseSBzdGVwIHRocm91Z2ggdGhlIHRhcmdldCBhcnJheSBhbmQgc29ydCBieSBtb3ZlL2FkZC9yZW1vdmUgb3BlcmF0aW9ucyBvbiB0aGUgc291cmNlIGFycmF5IHVudGlsIHRoZXkgbWF0Y2hcblx0XHRcdHZhciBpLCBqLCBrLCBuZXdJdGVtLCBudW0sXG5cdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRhZGRlZEl0ZW1zID0gW10sXG5cdFx0XHRcdGRhdGEgPSBzZWxmLl9kYXRhLFxuXHRcdFx0XHRvbGRJdGVtcyA9IGRhdGEuc2xpY2UoKSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG5cdFx0XHRcdGRhdGFMZW5ndGggPSBvbGRMZW5ndGgsXG5cdFx0XHRcdG5ld0xlbmd0aCA9IG5ld0l0ZW1zLmxlbmd0aDtcblx0XHRcdHNlbGYuX3NydCA9IHRydWU7IC8vIEZsYWcgZm9yIHNvcnRpbmcgZHVyaW5nIHJlZnJlc2hcblx0XHRcdGZvciAoaj1rPTA7IGo8bmV3TGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0aWYgKChuZXdJdGVtID0gbmV3SXRlbXNbal0pID09PSBkYXRhW2ota10pIHtcblx0XHRcdFx0XHRcdGluc2VydEFkZGVkKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9yIChpPWotazsgaTxkYXRhTGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGlmIChuZXdJdGVtID09PSBkYXRhW2ldKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaTxkYXRhTGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRpbnNlcnRBZGRlZCgpO1xuXHRcdFx0XHRcdFx0bnVtID0gMDtcblx0XHRcdFx0XHRcdHdoaWxlIChudW0rKyA8IG5ld0xlbmd0aC1pICYmIG5ld0l0ZW1zW2orbnVtXSA9PT0gZGF0YVtpK251bV0pO1xuXHRcdFx0XHRcdFx0c2VsZi5tb3ZlKGksIGosIG51bSk7IC8vIEZvdW5kIG5ld0l0ZW0gaW4gb3JpZ2luYWwgYXJyYXkgLSBzbyBtb3ZlIGl0IHRvIG5ldyBwb3NpdGlvblxuXHRcdFx0XHRcdFx0aiArPSBudW0gLSAxO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRrKys7XG5cdFx0XHRcdFx0XHRhZGRlZEl0ZW1zLnB1c2gobmV3SXRlbSk7IC8vIE5vdCBmb3VuZCBpbiBvcmlnaW5hbCBhcnJheSAtIHNvIGluc2VydFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aW5zZXJ0QWRkZWQoKTtcblx0XHRcdGlmIChkYXRhTGVuZ3RoID4gaikge1xuXHRcdFx0XHRzZWxmLnJlbW92ZShqLCBkYXRhTGVuZ3RoIC0gaik7XG5cdFx0XHR9XG5cdFx0XHRzZWxmLl9zcnQgPSB1bmRlZmluZWQ7IC8vIFdlIGhhdmUgZmluaXNoZWQgc29ydCBvcGVyYXRpb25zIGR1cmluZyByZWZyZXNoXG5cdFx0XHRzZWxmLl90cmlnZ2VyKHtjaGFuZ2U6IFwicmVmcmVzaFwiLCBvbGRJdGVtczogb2xkSXRlbXN9LCBvbGRMZW5ndGgpO1xuXHRcdFx0cmV0dXJuIHNlbGY7XG5cdFx0fSxcblxuXHRcdF90cmlnZ2VyOiBmdW5jdGlvbihldmVudEFyZ3MsIG9sZExlbmd0aCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRfZGF0YSA9IHNlbGYuX2RhdGEsXG5cdFx0XHRcdGxlbmd0aCA9IF9kYXRhLmxlbmd0aCxcblx0XHRcdFx0JF9kYXRhID0gJChbX2RhdGFdKTtcblx0XHRcdGlmIChzZWxmLl9zcnQpIHtcblx0XHRcdFx0ZXZlbnRBcmdzLnJlZnJlc2ggPSB0cnVlOyAvLyBXZSBhcmUgc29ydGluZyBkdXJpbmcgcmVmcmVzaFxuXHRcdFx0fSBlbHNlIGlmIChsZW5ndGggIT09IG9sZExlbmd0aCkgeyAgLy8gV2UgaGF2ZSBmaW5pc2hlZCBzb3J0IG9wZXJhdGlvbnMgZHVyaW5nIHJlZnJlc2hcblx0XHRcdFx0JF9kYXRhLnRyaWdnZXJIYW5kbGVyKHByb3BlcnR5Q2hhbmdlU3RyLCB7Y2hhbmdlOiBcInNldFwiLCBwYXRoOiBcImxlbmd0aFwiLCB2YWx1ZTogbGVuZ3RoLCBvbGRWYWx1ZTogb2xkTGVuZ3RofSk7XG5cdFx0XHR9XG5cdFx0XHQkX2RhdGEudHJpZ2dlckhhbmRsZXIoYXJyYXlDaGFuZ2VTdHIgKyAoc2VsZi5fbnMgPyBcIi5cIiArIC9eXFxTKy8uZXhlYyhzZWxmLl9ucylbMF0gOiBcIlwiKSwgZXZlbnRBcmdzKTsgLy8gSWYgd2hpdGUtc3BhY2Ugc2VwYXJhdGVkIG5hbWVzcGFjZXMsIHVzZSBmaXJzdCBvbmUgb25seVxuXHRcdH1cblx0fTtcblxuXHQkZXZlbnRTcGVjaWFsW3Byb3BlcnR5Q2hhbmdlU3RyXSA9ICRldmVudFNwZWNpYWxbYXJyYXlDaGFuZ2VTdHJdID0ge1xuXHRcdC8vIFJlZ2lzdGVyIGEgalF1ZXJ5IHNwZWNpYWwgJ3JlbW92ZScgZXZlbnQsIHRvIGFjY2VzcyB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggaGFuZGxlcnMgYmVpbmcgcmVtb3ZlZCBieSBqUXVlcnkub2ZmKCkuXG5cdFx0Ly8gV2UgZ2V0IGRhdGEuY2IuX2NJZCBmcm9tIHRoZSBldmVudCBoYW5kbGVPYmogYW5kIGdldCB0aGUgY29ycmVzcG9uZGluZyBjYkJpbmRpbmdzIGhhc2ggZnJvbSB0aGUgY2JCaW5kaW5nc1N0b3JlLFxuXHRcdC8vIHRoZW4gcmVtb3ZlIHRoaXMgb2JqZWN0IGZyb20gdGhhdCBiaW5kaW5ncyBoYXNoIC0gaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBoYW5kbGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgY2FsbGJhY2suXG5cdFx0cmVtb3ZlOiBmdW5jdGlvbiAoaGFuZGxlT2JqKSB7XG5cdFx0XHR2YXIgY2JCaW5kaW5ncywgZm91bmQsIGV2ZW50cywgbCwgZGF0YSxcblx0XHRcdFx0ZXZEYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cdFx0XHRpZiAoKGV2RGF0YSkgJiYgKGV2RGF0YS5vZmYgPSB0cnVlLCBldkRhdGEgPSBldkRhdGEuY2IpKSB7IC8vU2V0IG9mZiA9IHRydWUgYXMgbWFya2VyIGZvciBkaXNwb3NlZCBldmVudFxuXHRcdFx0XHQvLyBHZXQgdGhlIGNiLl9jSWQgZnJvbSBoYW5kbGVPYmouZGF0YS5jYi5fY0lkXG5cdFx0XHRcdGlmIChjYkJpbmRpbmdzID0gY2JCaW5kaW5nc1N0b3JlW2V2RGF0YS5fY0lkXSkge1xuXHRcdFx0XHRcdC8vIFRoZXJlIHdlcmUgYmluZGluZ3MgZm9yIHRoaXMgY2FsbGJhY2suIElmIHRoaXMgd2FzIHRoZSBsYXN0IG9uZSwgd2UnbGwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEodGhpcykuZXZlbnRzW2hhbmRsZU9iai50eXBlXTtcblx0XHRcdFx0XHRsID0gZXZlbnRzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAobC0tICYmICFmb3VuZCkge1xuXHRcdFx0XHRcdFx0Zm91bmQgPSAoZGF0YSA9IGV2ZW50c1tsXS5kYXRhKSAmJiBkYXRhLmNiICYmIGRhdGEuY2IuX2NJZCA9PT0gZXZEYXRhLl9jSWQ7XG5cdFx0XHRcdFx0XHQvLyBGb3VuZCBhbm90aGVyIG9uZSB3aXRoIHNhbWUgY2FsbGJhY2sgKHRob3VnaCBtYXkgYmUgYSBkaWZmZXJlbnQgaW5uZXJDYWxsYmFjaylcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyB3YXMgdGhlIGxhc3QgaGFuZGxlciBmb3IgdGhpcyBjYWxsYmFjayBhbmQgb2JqZWN0LCBzbyByZW1vdmUgdGhlIGJpbmRpbmcgZW50cnlcblx0XHRcdFx0XHRcdGRlbGV0ZSBjYkJpbmRpbmdzWyRkYXRhKHRoaXMpLm9iSWRdO1xuXHRcdFx0XHRcdFx0cmVtb3ZlQ2JCaW5kaW5ncyhjYkJpbmRpbmdzLCBldkRhdGEuX2NJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdCR2aWV3cy5tYXAgPSBmdW5jdGlvbihtYXBEZWYpIHtcblx0XHRmdW5jdGlvbiBNYXAoc291cmNlLCBvcHRpb25zLCB0YXJnZXQsIHVuYm91bmQpIHtcblx0XHRcdHZhciBjaGFuZ2luZyxcblx0XHRcdFx0bWFwID0gdGhpcztcblx0XHRcdGlmICh0aGlzLnNyYykge1xuXHRcdFx0XHR0aGlzLnVubWFwKCk7IC8vIFdlIGFyZSByZS1tYXBwaW5nIGEgbmV3IHNvdXJjZVxuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IE9CSkVDVCkge1xuXHRcdFx0XHRtYXAuc3JjID0gc291cmNlO1xuXHRcdFx0XHRtYXAudGd0ID0gdGFyZ2V0IHx8IG1hcC50Z3QgfHwgW107XG5cdFx0XHRcdG1hcC5vcHRpb25zID0gb3B0aW9ucyB8fCBtYXAub3B0aW9ucztcblx0XHRcdFx0bWFwLnVwZGF0ZSgpO1xuXHRcdFx0XHRpZiAoIXVuYm91bmQpIHtcblx0XHRcdFx0XHRpZiAobWFwRGVmLm9ic1NyYykge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnNyYykub2JzZXJ2ZUFsbChtYXAub2JzID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdFx0XHRpZiAoIWNoYW5naW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdG1hcERlZi5vYnNTcmMobWFwLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgbWFwLnNyY0ZsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChtYXBEZWYub2JzVGd0ICkge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnRndCkub2JzZXJ2ZUFsbChtYXAub2J0ID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdFx0aWYgKCFjaGFuZ2luZykge1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG1hcERlZi5vYnNUZ3QobWFwLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LCBtYXAudGd0Rmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoJGlzRnVuY3Rpb24obWFwRGVmKSkge1xuXHRcdFx0Ly8gU2ltcGxlIG1hcCBkZWNsYXJlZCBhcyBmdW5jdGlvblxuXHRcdFx0bWFwRGVmID0ge1xuXHRcdFx0XHRnZXRUZ3Q6IG1hcERlZlxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAobWFwRGVmLmJhc2VNYXApIHtcblx0XHRcdG1hcERlZiA9ICQuZXh0ZW5kKHt9LCBtYXBEZWYuYmFzZU1hcCwgbWFwRGVmKTtcblx0XHR9XG5cblx0XHRtYXBEZWYubWFwID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zLCB0YXJnZXQsIHVuYm91bmQpIHtcblx0XHRcdHJldHVybiBuZXcgTWFwKHNvdXJjZSwgb3B0aW9ucywgdGFyZ2V0LCB1bmJvdW5kKTtcblx0XHR9O1xuXG5cdFx0KE1hcC5wcm90b3R5cGUgPSB7XG5cdFx0XHRzcmNGbHQ6IG1hcERlZi5zcmNGbHQgfHwgc2hhbGxvd0ZpbHRlciwgLy8gZGVmYXVsdCB0byBzaGFsbG93RmlsdGVyXG5cdFx0XHR0Z3RGbHQ6IG1hcERlZi50Z3RGbHQgfHwgc2hhbGxvd0ZpbHRlcixcblx0XHRcdHVwZGF0ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdFx0XHR2YXIgbWFwID0gdGhpcztcblx0XHRcdFx0JG9ic2VydmFibGUobWFwLnRndCkucmVmcmVzaChtYXBEZWYuZ2V0VGd0KG1hcC5zcmMsIG1hcC5vcHRpb25zID0gb3B0aW9ucyB8fCBtYXAub3B0aW9ucykpO1xuXHRcdFx0fSxcblx0XHRcdHVubWFwOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG1hcCA9IHRoaXM7XG5cdFx0XHRcdGlmIChtYXAuc3JjKSB7XG5cdFx0XHRcdFx0aWYgKG1hcC5vYnMpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC5zcmMpLnVub2JzZXJ2ZUFsbChtYXAub2JzLCBtYXAuc3JjRmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG1hcC5vYnQpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC50Z3QpLnVub2JzZXJ2ZUFsbChtYXAub2J0LCBtYXAudGd0Rmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bWFwLnNyYyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG1hcDogTWFwLFxuXHRcdFx0X2RlZjogbWFwRGVmXG5cdFx0fSkuY29uc3RydWN0b3IgPSBNYXA7XG5cblx0XHRyZXR1cm4gbWFwRGVmO1xuXHR9O1xuXG5cdCRzdWIuYWR2U2V0ID0gZnVuY3Rpb24oKSB7IC8vIHJlZnJlc2ggYWR2YW5jZWQgc2V0dGluZ3Ncblx0XHRnbG9iYWwuX2pzdiA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZC5fanN2XG5cdFx0XHQ/IHsgLy8gY3JlYXRlIGdsb2JhbCBfanN2LCBmb3IgYWNjZXNzaW5nIHZpZXdzLCBldGNcblx0XHRcdFx0XHRjYkJpbmRpbmdzOiBjYkJpbmRpbmdzU3RvcmVcblx0XHRcdFx0fVxuXHRcdFx0OiB1bmRlZmluZWQ7IC8vIEluIElFOCBjYW5ub3QgZG8gZGVsZXRlIGdsb2JhbC5fanN2XG5cdH07XG59XG5cbi8vPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IEpzVmlld3MgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4vKiBKc1ZpZXdzOlxuICogSW50ZXJhY3RpdmUgZGF0YS1kcml2ZW4gdmlld3MgdXNpbmcgdGVtcGxhdGVzIGFuZCBkYXRhLWxpbmtpbmcuXG4gKiBTZWUgaHR0cDovL3d3dy5qc3ZpZXdzLmNvbS8janN2aWV3cyBhbmQgaHR0cDovL2dpdGh1Yi5jb20vQm9yaXNNb29yZS9qc3ZpZXdzXG4gKiBDb3B5cmlnaHQgMjAxNiwgQm9yaXMgTW9vcmVcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCB2YXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiR2aWV3c1NldHRpbmdzID0gJHZpZXdzLnNldHRpbmdzO1xuJHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcbiRzdWJTZXR0aW5nc0FkdmFuY2VkID0gJHN1YlNldHRpbmdzLmFkdmFuY2VkO1xuJGNvbnZlcnRlcnMgPSAkdmlld3MuY29udmVydGVycztcbiQudGVtcGxhdGVzID0gJHRlbXBsYXRlcyA9ICR2aWV3cy50ZW1wbGF0ZXM7XG4kdGFncyA9ICR2aWV3cy50YWdzO1xuckZpcnN0RWxlbSA9IC88KD8hc2NyaXB0KShcXHcrKVs+XFxzXS87XG5cbmlmICgkLmxpbmspIHsgcmV0dXJuICQ7IH0gLy8gSnNWaWV3cyBpcyBhbHJlYWR5IGxvYWRlZFxuXG4kc3ViU2V0dGluZ3MudHJpZ2dlciA9IHRydWU7XG52YXIgYWN0aXZlQm9keSwgclRhZ0RhdGFsaW5rLCAkdmlldywgJHZpZXdzTGlua0F0dHIsIGxpbmtWaWV3c1NlbCwgd3JhcE1hcCwgdmlld1N0b3JlLCBvbGRBZHZTZXQsXG5cdGpzdkF0dHJTdHIgPSBcImRhdGEtanN2XCIsXG5cdGVsZW1lbnRDaGFuZ2VTdHIgPSBcImNoYW5nZS5qc3ZcIixcblx0b25CZWZvcmVDaGFuZ2VTdHIgPSBcIm9uQmVmb3JlQ2hhbmdlXCIsXG5cdG9uQWZ0ZXJDaGFuZ2VTdHIgPSBcIm9uQWZ0ZXJDaGFuZ2VcIixcblx0b25BZnRlckNyZWF0ZVN0ciA9IFwib25BZnRlckNyZWF0ZVwiLFxuXHRDSEVDS0VEID0gXCJjaGVja2VkXCIsXG5cdENIRUNLQk9YID0gXCJjaGVja2JveFwiLFxuXHRSQURJTyA9IFwicmFkaW9cIixcblx0Tk9ORSA9IFwibm9uZVwiLFxuXHRTQ1JJUFQgPSBcIlNDUklQVFwiLFxuXHRUUlVFID0gXCJ0cnVlXCIsXG5cdGNsb3NlU2NyaXB0ID0gJ1wiPjwvc2NyaXB0PicsXG5cdG9wZW5TY3JpcHQgPSAnPHNjcmlwdCB0eXBlPVwianN2Jyxcblx0ZGVmZXJBdHRyID0ganN2QXR0clN0ciArIFwiLWRmXCIsXG5cdGJpbmRFbHNTZWwgPSBcInNjcmlwdCxbXCIgKyBqc3ZBdHRyU3RyICsgXCJdXCIsXG5cdGZuU2V0dGVycyA9IHtcblx0XHR2YWx1ZTogXCJ2YWxcIixcblx0XHRpbnB1dDogXCJ2YWxcIixcblx0XHRodG1sOiBIVE1MLFxuXHRcdHRleHQ6IFwidGV4dFwiXG5cdH0sXG5cdHZhbHVlQmluZGluZyA9IHtmcm9tOiBcInZhbHVlXCIsIHRvOiBcInZhbHVlXCJ9LFxuXHRpc0NsZWFuQ2FsbCA9IDAsXG5cdG9sZENsZWFuRGF0YSA9ICQuY2xlYW5EYXRhLFxuXHRvbGRKc3ZEZWxpbWl0ZXJzID0gJHZpZXdzU2V0dGluZ3MuZGVsaW1pdGVycyxcblx0c2FmZUZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRxc2EgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yLFxuXG5cdC8vIGVsQ29udGVudCBtYXBzIHRhZ05hbWVzIHdoaWNoIGhhdmUgb25seSBlbGVtZW50IGNvbnRlbnQsIHNvIG1heSBub3Qgc3VwcG9ydCBzY3JpcHQgbm9kZXMuXG5cdGVsQ29udGVudCA9IHtvbDogMSwgdWw6IDEsIHRhYmxlOiAxLCB0Ym9keTogMSwgdGhlYWQ6IDEsIHRmb290OiAxLCB0cjogMSwgY29sZ3JvdXA6IDEsIGRsOiAxLCBzZWxlY3Q6IDEsIG9wdGdyb3VwOiAxLCBzdmc6IDEsIHN2Z19uczogMX0sXG5cdGJhZFBhcmVudCA9IHt0cjogXCJ0YWJsZVwifSxcblx0dm9pZEVsZW1zID0ge2JyOiAxLCBpbWc6IDEsIGlucHV0OiAxLCBocjogMSwgYXJlYTogMSwgYmFzZTogMSwgY29sOiAxLCBsaW5rOiAxLCBtZXRhOiAxLFxuXHRcdGNvbW1hbmQ6IDEsIGVtYmVkOiAxLCBrZXlnZW46IDEsIHBhcmFtOiAxLCBzb3VyY2U6IDEsIHRyYWNrOiAxLCB3YnI6IDF9LFxuXHRkaXNwbGF5U3R5bGVzID0ge30sXG5cdGJpbmRpbmdTdG9yZSA9IHt9LFxuXHRiaW5kaW5nS2V5ID0gMSxcblx0clZpZXdQYXRoID0gL14jKHZpZXdcXC4/KT8vLFxuXHRyQ29udmVydE1hcmtlcnMgPSAvKChcXC8+KXw8XFwvKFxcdyspPnwpKFxccyopKFsjXFwvXVxcZCsoPzpffChcXF4pKSlgKFxccyopKDxcXHcrKD89W1xcc1xcLz5dKSk/fFxccyooPzooPFxcdysoPz1bXFxzXFwvPl0pKXw8XFwvKFxcdyspPihcXHMqKXwoXFwvPilcXHMqfCg+KXwkKS9nLFxuXHRyT3BlblZpZXdNYXJrZXJzID0gLygjKSgpKFxcZCspKF8pL2csXG5cdHJPcGVuTWFya2VycyA9IC8oIykoKShcXGQrKShbX15dKS9nLFxuXHRyVmlld01hcmtlcnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShfKS9nLFxuXHRyT3BlblRhZ01hcmtlcnMgPSAvKCMpKCkoXFxkKykoXFxeKS9nLFxuXHRyTWFya2VyVG9rZW5zID0gLyg/OigjKXwoXFwvKSkoXFxkKykoW19eXSkoWy0rQFxcZF0rKT8vZyxcblx0clNwbGl0QmluZGluZ3MgPSAvJihcXGQrKVxcKz8vZyxcblx0Z2V0Q29tcHV0ZWRTdHlsZSA9IGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlO1xuXG4kb2JzZXJ2YWJsZSA9ICQub2JzZXJ2YWJsZTtcblxuaWYgKCEkb2JzZXJ2YWJsZSkge1xuXHQvLyBKc09ic2VydmFibGUgaXMgbm90IGxvYWRlZC5cblx0dGhyb3cgcmVxdWlyZXNTdHIgKyBcIkpzT2JzZXJ2YWJsZVwiOyAvLyBqcXVlcnkub2JzZXJ2YWJsZS5qcyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgSnNWaWV3c1xufVxuXG4kb2JzZXJ2ZSA9ICRvYnNlcnZhYmxlLm9ic2VydmU7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gRXZlbnQgaGFuZGxlcnNcbi8vPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGVsZW1DaGFuZ2VIYW5kbGVyKGV2LCBwYXJhbXMsIHNvdXJjZVZhbHVlKSB7XG5cdHZhciBzZXR0ZXIsIGNhbmNlbCwgZnJvbUF0dHIsIGxpbmtDdHgsIGN2dEJhY2ssIGNudnROYW1lLCB0YXJnZXQsICRzb3VyY2UsIHZpZXcsIGJpbmRpbmcsIG9sZExpbmtDdHgsIG9uQmVmb3JlQ2hhbmdlLCBvbkFmdGVyQ2hhbmdlLCB0YWcsIHRvLCBldmVudEFyZ3MsIGV4cHJPYixcblx0XHRzb3VyY2UgPSBldi50YXJnZXQsXG5cdFx0YmluZGluZ3MgPSBzb3VyY2UuX2pzdkJuZDtcblxuXHQvLyBfanN2Qm5kIGlzIGEgc3RyaW5nIHdpdGggdGhlIHN5bnRheDogXCImYmluZGluZ0lkMSZiaW5kaW5nSWQyXCJcblx0aWYgKGJpbmRpbmdzICYmIGV2LmNoYXIhPT1cIlwiKSB7XG5cdFx0d2hpbGUgKGJpbmRpbmcgPSByU3BsaXRCaW5kaW5ncy5leGVjKGJpbmRpbmdzKSkge1xuXHRcdFx0aWYgKGJpbmRpbmcgPSBiaW5kaW5nU3RvcmVbYmluZGluZ1sxXV0pIHtcblx0XHRcdFx0aWYgKHRvID0gYmluZGluZy50bykge1xuXHRcdFx0XHRcdC8vIFRoZSBiaW5kaW5nIGhhcyBhICd0bycgZmllbGQsIHdoaWNoIGlzIG9mIHRoZSBmb3JtIFtbdGFyZ2V0T2JqZWN0LCB0b1BhdGhdLCBjdnRCYWNrXVxuXHRcdFx0XHRcdGxpbmtDdHggPSBiaW5kaW5nLmxpbmtDdHg7XG5cdFx0XHRcdFx0dmlldyA9IGxpbmtDdHgudmlldztcblx0XHRcdFx0XHR0YWcgPSBsaW5rQ3R4LnRhZyB8fCB2aWV3LnRhZztcblx0XHRcdFx0XHQkc291cmNlID0gJChzb3VyY2UpO1xuXHRcdFx0XHRcdG9uQmVmb3JlQ2hhbmdlID0gdmlldy5obHAob25CZWZvcmVDaGFuZ2VTdHIpOyAvLyBUT0RPIENhbiB3ZSBvcHRpbWl6ZSB0aGlzIGFuZCBvdGhlciBpbnN0YW5jZXMgb2Ygc2FtZT9cblx0XHRcdFx0XHRvbkFmdGVyQ2hhbmdlID0gdmlldy5obHAob25BZnRlckNoYW5nZVN0cik7IC8vIFRPRE8gQ2FuIHdlIG9wdGltaXplIHRoaXMgYW5kIG90aGVyIGluc3RhbmNlcyBvZiBzYW1lXG5cdFx0XHRcdFx0ZnJvbUF0dHIgPSBkZWZhdWx0QXR0cihzb3VyY2UpO1xuXHRcdFx0XHRcdHNldHRlciA9IGZuU2V0dGVyc1tmcm9tQXR0cl07XG5cdFx0XHRcdFx0aWYgKHNvdXJjZVZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHNvdXJjZVZhbHVlID0gJGlzRnVuY3Rpb24oZnJvbUF0dHIpXG5cdFx0XHRcdFx0XHRcdD8gZnJvbUF0dHIoc291cmNlKVxuXHRcdFx0XHRcdFx0XHQ6IHNldHRlclxuXHRcdFx0XHRcdFx0XHRcdD8gJHNvdXJjZVtzZXR0ZXJdKClcblx0XHRcdFx0XHRcdFx0XHQ6ICRzb3VyY2UuYXR0cihmcm9tQXR0cik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNudnROYW1lID0gdG9bMV07XG5cdFx0XHRcdFx0dG8gPSB0b1swXTsgLy8gW29iamVjdCwgcGF0aF1cblx0XHRcdFx0XHR0byA9IHRvICsgXCJcIiA9PT0gdG8gPyBbbGlua0N0eC5kYXRhLCB0b10gOiB0bztcblx0XHRcdFx0XHRpZiAoY252dE5hbWUpIHtcblx0XHRcdFx0XHRcdGlmICgkaXNGdW5jdGlvbihjbnZ0TmFtZSkpIHtcblx0XHRcdFx0XHRcdFx0Y3Z0QmFjayA9IGNudnROYW1lO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y3Z0QmFjayA9IHZpZXcuZ2V0UnNjKFwiY29udmVydGVyc1wiLCBjbnZ0TmFtZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsaW5rQ3R4LmVsZW0ubm9kZU5hbWUgPT09IFwiU0VMRUNUXCIpIHtcblx0XHRcdFx0XHRcdGxpbmtDdHguZWxlbS5fanN2U2VsID0gc291cmNlVmFsdWUgPSBzb3VyY2VWYWx1ZSB8fCAobGlua0N0eC5lbGVtLm11bHRpcGxlID8gW10gOiBzb3VyY2VWYWx1ZSk7XG5cdFx0XHRcdFx0XHQvLyBkYXRhLWxpbmsgPHNlbGVjdD4gdG8gc3RyaW5nIG9yIChtdWx0aXNlbGVjdCkgYXJyYXkgb2Ygc3RyaW5nc1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoY3Z0QmFjaykge1xuXHRcdFx0XHRcdFx0c291cmNlVmFsdWUgPSBjdnRCYWNrLmNhbGwodGFnLCBzb3VyY2VWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU2V0IGxpbmtDdHggb24gdmlldywgZHluYW1pY2FsbHksIGp1c3QgZHVyaW5nIHRoaXMgaGFuZGxlciBjYWxsXG5cdFx0XHRcdFx0b2xkTGlua0N0eCA9IHZpZXcubGlua0N0eDtcblx0XHRcdFx0XHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0XHRcdGV2ZW50QXJncyA9IHtcblx0XHRcdFx0XHRcdGNoYW5nZTogXCJjaGFuZ2VcIixcblx0XHRcdFx0XHRcdG9sZFZhbHVlOiBsaW5rQ3R4Ll92YWwsXG5cdFx0XHRcdFx0XHR2YWx1ZTogc291cmNlVmFsdWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGlmICgoIW9uQmVmb3JlQ2hhbmdlIHx8ICEoY2FuY2VsID0gb25CZWZvcmVDaGFuZ2UuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKSA9PT0gZmFsc2UpKSAmJlxuXHRcdFx0XHRcdFx0XHQoIXRhZyB8fCAhdGFnLm9uQmVmb3JlQ2hhbmdlIHx8ICEoY2FuY2VsID0gdGFnLm9uQmVmb3JlQ2hhbmdlKGV2LCBldmVudEFyZ3MpID09PSBmYWxzZSkpICYmXG5cdFx0XHRcdFx0XHRcdHNvdXJjZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHRhcmdldCA9IHRvWzBdOyAvLyBbb2JqZWN0LCBwYXRoXVxuXHRcdFx0XHRcdFx0aWYgKHNvdXJjZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0YXJnZXQuX2pzdikge1xuXHRcdFx0XHRcdFx0XHRcdGV4cHJPYiA9IHRhcmdldDtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXQgPSBsaW5rQ3R4LmRhdGE7XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGV4cHJPYiAmJiBleHByT2Iuc2IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRhcmdldCA9IGxpbmtDdHguX2N0eENiKGV4cHJPYiwgdGFyZ2V0KTtcblx0XHRcdFx0XHRcdFx0XHRcdGV4cHJPYiA9IGV4cHJPYi5zYjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHRcdFx0XHRcdHRhZy5fLmNoZ2luZyA9IHRydWU7IC8vIG1hcmtlciB0byBwcmV2ZW50IHRhZyBjaGFuZ2UgZXZlbnQgdHJpZ2dlcmluZyBpdHMgb3duIHJlZnJlc2hcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQkb2JzZXJ2YWJsZSh0YXJnZXQpLnNldFByb3BlcnR5KHRvWzFdLCBzb3VyY2VWYWx1ZSk7IC8vIDJ3YXkgYmluZGluZyBjaGFuZ2UgZXZlbnQgLSBvYnNlcnZhYmx5IHVwZGF0aW5nIGJvdW5kIG9iamVjdFxuXHRcdFx0XHRcdFx0XHRpZiAob25BZnRlckNoYW5nZSkge1xuXHRcdFx0XHRcdFx0XHRcdG9uQWZ0ZXJDaGFuZ2UuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRhZy5vbkFmdGVyQ2hhbmdlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YWcub25BZnRlckNoYW5nZShldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGFnLl8uY2hnaW5nID0gdW5kZWZpbmVkOyAvLyBjbGVhciB0aGUgbWFya2VyXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bGlua0N0eC5fdmFsID0gc291cmNlVmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcGVydHlDaGFuZ2VIYW5kbGVyKGV2LCBldmVudEFyZ3MsIGxpbmtGbikge1xuXHR2YXIgYXR0ciwgc291cmNlVmFsdWUsIG5vVXBkYXRlLCBmb3JjZVVwZGF0ZSwgaGFzRXJyb3IsIG9uRXJyb3IsXG5cdFx0bGlua0N0eCA9IHRoaXMsXG5cdFx0dGFnID0gbGlua0N0eC50YWcsXG5cdFx0c291cmNlID0gbGlua0N0eC5kYXRhLFxuXHRcdHRhcmdldCA9IGxpbmtDdHguZWxlbSxcblx0XHRjdnQgPSBsaW5rQ3R4LmNvbnZlcnQsXG5cdFx0cGFyZW50RWxlbSA9IHRhcmdldC5wYXJlbnROb2RlLFxuXHRcdHZpZXcgPSBsaW5rQ3R4LnZpZXcsXG5cdFx0b2xkTGlua0N0eCA9IHZpZXcubGlua0N0eCxcblx0XHRvbkV2ZW50ID0gdmlldy5obHAob25CZWZvcmVDaGFuZ2VTdHIpO1xuXG5cdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXG5cdGlmIChwYXJlbnRFbGVtICYmICghb25FdmVudCB8fCAhKGV2ZW50QXJncyAmJiBvbkV2ZW50LmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncykgPT09IGZhbHNlKSlcblx0XHRcdC8vIElmIGRhdGEgY2hhbmdlZCwgdGhlIGV2LmRhdGEgaXMgc2V0IHRvIGJlIHRoZSBwYXRoLiBVc2UgdGhhdCB0byBmaWx0ZXIgdGhlIGhhbmRsZXIgYWN0aW9uLi4uXG5cdFx0XHQmJiAhKGV2ZW50QXJncyAmJiBldi5kYXRhLnByb3AgIT09IFwiKlwiICYmIGV2LmRhdGEucHJvcCAhPT0gZXZlbnRBcmdzLnBhdGgpKSB7XG5cblx0XHRpZiAoZXZlbnRBcmdzKSB7XG5cdFx0XHRsaW5rQ3R4LmV2ZW50QXJncyA9IGV2ZW50QXJncztcblx0XHR9XG5cdFx0aWYgKGV2ZW50QXJncyB8fCBsaW5rQ3R4Ll90b0xrKSB7XG5cdFx0XHQvLyBJZiBldmVudEFyZ3MgYXJlIGRlZmluZWQsIHRoaXMgaXMgYSBkYXRhIHVwZGF0ZVxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHRoaXMgaXMgdGhlIGluaXRpYWwgZGF0YS1saW5rIHJlbmRlcmluZyBjYWxsLiBCaW5kIG9uIHRoaXMgdGhlIGZpcnN0IHRpbWUgaXQgZ2V0IGNhbGxlZFxuXHRcdFx0bGlua0N0eC5fdG9MayA9IDA7IC8vIFJlbW92ZSBmbGFnIHRvIHNraXAgdW5uZWNjZXNzYXJ5IHJlYmluZGluZyBuZXh0IHRpbWVcblx0XHRcdGlmIChsaW5rRm4uX2VyKSB7XG5cdFx0XHRcdC8vIGRhdGEtbGluaz1cImV4cHJVc2luZ1RhZ09yQ3Z0IHdpdGggb25lcnJvcj0uLi5cIiAtIGUuZy4ge3RhZyAuLi4ge2N2dDouLi4gezouLi4gY29udmVydD0nY3Z0J1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHNvdXJjZVZhbHVlID0gbGlua0ZuKHNvdXJjZSwgdmlldyk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRoYXNFcnJvciA9IGxpbmtGbi5fZXI7XG5cdFx0XHRcdFx0b25FcnJvciA9IG9uUmVuZGVyRXJyb3IoZSx2aWV3LChuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXdcIiwgXCJyZXR1cm4gXCIgKyBoYXNFcnJvciArIFwiO1wiKSkoc291cmNlLCB2aWV3KSk7XG5cdFx0XHRcdFx0c291cmNlVmFsdWUgPSBbe3Byb3BzOiB7fSwgYXJnczogW29uRXJyb3JdfV07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gbGlua0ZuKHNvdXJjZSwgdmlldywgJHN1Yik7XG5cdFx0XHR9XG5cdFx0XHQvLyBDb21waWxlZCBsaW5rIGV4cHJlc3Npb24gZm9yIGxpbmtUYWc6IHJldHVybiB2YWx1ZSBmb3IgZGF0YS1saW5rPVwiezp4eHh9XCIgd2l0aCBubyBjdnQgb3IgY3Z0QmssIG90aGVyd2lzZSB0YWdDdHggb3IgdGFnQ3R4c1xuXG5cdFx0XHRhdHRyID0gZ2V0VGFyZ2V0VmFsKHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCB0YWcgPSBsaW5rQ3R4LnRhZyxcblx0XHRcdFx0XHRsaW5rQ3R4LmF0dHIgfHwgZGVmYXVsdEF0dHIodGFyZ2V0LCB0cnVlLCBjdnQgIT09IHVuZGVmaW5lZClcblx0XHRcdFx0KTtcblxuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHQvLyBFeGlzdGluZyB0YWcgaW5zdGFuY2Vcblx0XHRcdFx0Zm9yY2VVcGRhdGUgPSBoYXNFcnJvciB8fCB0YWcuX2VyO1xuXHRcdFx0XHQvLyBJZiB0aGUgbmV3IHRhZ0N0eHMgaGFzRXJyb3Igb3IgdGhlIHByZXZpb3VzIHRhZ0N0eHMgaGFkIGVycm9yLCB0aGVuIGZvcmNlIHVwZGF0ZVxuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IHNvdXJjZVZhbHVlWzBdID8gc291cmNlVmFsdWUgOiBbc291cmNlVmFsdWVdO1xuXHRcdFx0XHRub1VwZGF0ZSA9ICFmb3JjZVVwZGF0ZSAmJiBldmVudEFyZ3MgJiYgdGFnLm9uVXBkYXRlICYmIHRhZy5vblVwZGF0ZShldiwgZXZlbnRBcmdzLCBzb3VyY2VWYWx1ZSkgPT09IGZhbHNlO1xuXG5cdFx0XHRcdG1lcmdlQ3R4cyh0YWcsIHNvdXJjZVZhbHVlLCBmb3JjZVVwZGF0ZSk7XG5cblx0XHRcdFx0aWYgKG5vVXBkYXRlIHx8IGF0dHIgPT09IE5PTkUpIHtcblx0XHRcdFx0XHQvLyBvblVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgb3IgYXR0ciA9PT0gXCJub25lXCIsIG9yIHRoaXMgaXMgYW4gdXBkYXRlIGNvbWluZyBmcm9tIHRoZSB0YWcncyBvd24gY2hhbmdlIGV2ZW50XG5cdFx0XHRcdFx0Ly8gLSBzbyBkb24ndCByZWZyZXNoIHRoZSB0YWc6IHdlIGp1c3QgdXNlIHRoZSBuZXcgdGFnQ3R4cyBtZXJnZWQgZnJvbSB0aGUgc291cmNlVmFsdWUsXG5cdFx0XHRcdFx0Ly8gKHdoaWNoIG1heSBvcHRpb25hbGx5IGhhdmUgYmVlbiBtb2RpZmVkIGluIG9uVXBkYXRlKCkuLi4pIGFuZCB0aGVuIGJpbmQsIGFuZCB3ZSBhcmUgZG9uZVxuXHRcdFx0XHRcdGNhbGxBZnRlckxpbmsodGFnLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRvYnNlcnZlQW5kQmluZChsaW5rQ3R4LCBzb3VyY2UsIHRhcmdldCk7XG5cdFx0XHRcdFx0dmlldy5saW5rQ3R4ID0gb2xkTGlua0N0eDtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRhZy5fLmNoZ2luZykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0YWcub25VbmJpbmQpIHtcblx0XHRcdFx0XHR0YWcub25VbmJpbmQodGFnLnRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IHRhZy50YWdOYW1lID09PSBcIjpcIiAvLyBDYWxsIGNvbnZlcnRWYWwgaWYgaXQgaXMgYSB7e2N2dDouLi59fSAtIG90aGVyd2lzZSBjYWxsIHJlbmRlclRhZ1xuXHRcdFx0XHRcdD8gJHN1Yi5fY252dCh0YWcuY3Z0LCB2aWV3LCBzb3VyY2VWYWx1ZVswXSlcblx0XHRcdFx0XHQ6ICRzdWIuX3RhZyh0YWcsIHZpZXcsIHZpZXcudG1wbCwgc291cmNlVmFsdWUsIHRydWUsIG9uRXJyb3IpO1xuXHRcdFx0fSBlbHNlIGlmIChsaW5rRm4uX3RhZykge1xuXHRcdFx0XHQvLyBGb3Ige3s6IC4uLn19IHdpdGhvdXQgYSBjb252ZXJ0IG9yIGNvbnZlcnRCYWNrLCB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNvdXJjZVZhbHVlLCBhbmQgd2UgYXJlIGRvbmVcblx0XHRcdFx0Ly8gRm9yIHt7OiAuLi59fSB3aXRoIGVpdGhlciBjdnQgb3IgY3Z0QmFjayB3ZSBjYWxsIGNvbnZlcnRWYWwgdG8gZ2V0IHRoZSBzb3VyY2VWYWx1ZSBhbmQgaW5zdGFudGlhdGUgdGhlIHRhZ1xuXHRcdFx0XHQvLyBJZiBjdnQgaXMgdW5kZWZpbmVkIHRoZW4gdGhpcyBpcyBhIHRhZywgYW5kIHdlIGNhbGwgcmVuZGVyVGFnIHRvIGdldCB0aGUgcmVuZGVyZWQgY29udGVudCBhbmQgaW5zdGFudGlhdGUgdGhlIHRhZ1xuXHRcdFx0XHRjdnQgPSBjdnQgPT09IFwiXCIgPyBUUlVFIDogY3Z0OyAvLyBJZiB0aGVyZSBpcyBhIGN2dEJhY2sgYnV0IG5vIGN2dCwgc2V0IGN2dCB0byBcInRydWVcIlxuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGN2dCAvLyBDYWxsIGNvbnZlcnRWYWwgaWYgaXQgaXMgYSB7e2N2dDouLi59fSAtIG90aGVyd2lzZSBjYWxsIHJlbmRlclRhZ1xuXHRcdFx0XHRcdD8gJHN1Yi5fY252dChjdnQsIHZpZXcsIHNvdXJjZVZhbHVlWzBdIHx8IHNvdXJjZVZhbHVlKSAvLyBjb252ZXJ0VmFsXG5cdFx0XHRcdFx0OiAkc3ViLl90YWcobGlua0ZuLl90YWcsIHZpZXcsIHZpZXcudG1wbCwgc291cmNlVmFsdWUsIHRydWUsIG9uRXJyb3IpOyAvLyByZW5kZXJUYWdcblxuXHRcdFx0XHRhZGRMaW5rTWV0aG9kcyh0YWcgPSBsaW5rQ3R4LnRhZywgdHJ1ZSk7IC8vIEluIGJvdGggY29udmVydFZhbCBhbmQgcmVuZGVyVGFnIHdlIGhhdmUgaW5zdGFudGlhdGVkIGEgdGFnXG5cdFx0XHRcdGF0dHIgPSBsaW5rQ3R4LmF0dHIgfHwgYXR0cjsgLy8gbGlua0N0eC5hdHRyIG1heSBoYXZlIGJlZW4gc2V0IHRvIHRhZy5hdHRyIGR1cmluZyB0YWcgaW5zdGFudGlhdGlvbiBpbiByZW5kZXJUYWdcblx0XHRcdH1cblxuXHRcdFx0aWYgKHVwZGF0ZUNvbnRlbnQoc291cmNlVmFsdWUsIGxpbmtDdHgsIGF0dHIsIHRhZylcblx0XHRcdFx0XHQmJiBldmVudEFyZ3Ncblx0XHRcdFx0XHQmJiAob25FdmVudCA9IHZpZXcuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpKSkge1xuXHRcdFx0XHRvbkV2ZW50LmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHR9XG5cdFx0XHRsaW5rQ3R4Ll9ub1VwZCA9IDA7IC8vIEZvciBkYXRhLWxpbms9XCJeey4uLn1cIiByZW1vdmUgX25vVXBkIGZsYWcgc28gdXBkYXRlcyBvbiBzdWJzZXF1ZW50IGNhbGxzXG5cblx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0dGFnLl9lciA9IGhhc0Vycm9yO1xuXHRcdFx0XHRjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b2JzZXJ2ZUFuZEJpbmQobGlua0N0eCwgc291cmNlLCB0YXJnZXQpO1xuXG5cdFx0Ly8gUmVtb3ZlIGR5bmFtaWNhbGx5IGFkZGVkIGxpbmtDdHggZnJvbSB2aWV3XG5cdFx0dmlldy5saW5rQ3R4ID0gb2xkTGlua0N0eDtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRWYWwoc291cmNlVmFsdWUsIGxpbmtDdHgsIHRhZywgYXR0cikge1xuXHR2YXIgY3VycmVudFZhbHVlLCBzZXR0ZXIsIGNzcywgJHRhcmdldCxcblx0XHR0YXJnZXQgPSB0YWcgJiYgdGFnLnBhcmVudEVsZW0gfHwgbGlua0N0eC5lbGVtO1xuXG5cdGlmIChzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0JHRhcmdldCA9ICQodGFyZ2V0KTtcblx0XHRhdHRyID0gdGFnICYmIHRhZy5hdHRyIHx8IGF0dHI7XG5cdFx0aWYgKCRpc0Z1bmN0aW9uKHNvdXJjZVZhbHVlKSkge1xuXHRcdFx0ZXJyb3IobGlua0N0eC5leHByICsgXCI6IG1pc3NpbmcgcGFyZW5zXCIpO1xuXHRcdH1cblxuXHRcdGlmIChjc3MgPSAvXmNzcy0vLnRlc3QoYXR0cikgJiYgYXR0ci5zbGljZSg0KSkge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gJC5zdHlsZSh0YXJnZXQsIGNzcyk7XG5cdFx0XHRpZiAoK3NvdXJjZVZhbHVlID09PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0XHQvLyBPcHRpbWl6YXRpb24gZm9yIHBlcmYgb24gaW50ZWdlciB2YWx1ZXMgLSBlLmcuIGNzcy13aWR0aHs6d2lkdGgrJ3B4J31cblx0XHRcdFx0Y3VycmVudFZhbHVlID0gcGFyc2VJbnQoY3VycmVudFZhbHVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGF0dHIgIT09IFwibGlua1wiKSB7IC8vIGF0dHIgPT09IFwibGlua1wiIGlzIGZvciB0YWcgY29udHJvbHMgd2hpY2ggZG8gZGF0YSBiaW5kaW5nIGJ1dCBoYXZlIG5vIHJlbmRlcmVkIG91dHB1dCBvciB0YXJnZXRcblx0XHRcdGlmIChhdHRyID09PSBcInZhbHVlXCIpIHtcblx0XHRcdFx0aWYgKHRhcmdldC50eXBlID09PSBDSEVDS0JPWCkge1xuXHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSA9ICR0YXJnZXQucHJvcChhdHRyID0gQ0hFQ0tFRCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gUkFESU8pIHtcblx0XHRcdFx0aWYgKHRhcmdldC52YWx1ZSA9PT0gKFwiXCIgKyBzb3VyY2VWYWx1ZSkpIHtcblx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSAkdGFyZ2V0LnByb3AoQ0hFQ0tFRCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHNldHRlciA9IGZuU2V0dGVyc1thdHRyXTtcblx0XHRcdFx0Y3VycmVudFZhbHVlID0gc2V0dGVyID8gJHRhcmdldFtzZXR0ZXJdKCkgOiAkdGFyZ2V0LmF0dHIoYXR0cik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGxpbmtDdHguX3ZhbCA9IGN1cnJlbnRWYWx1ZTtcblx0fVxuXHRyZXR1cm4gYXR0cjtcbn1cblxuZnVuY3Rpb24gc2V0RGVmZXIoZWxlbSwgdmFsdWUpIHtcblx0ZWxlbS5fZGYgPSB2YWx1ZTsgLy8gVXNlIGJvdGggYW4gZXhwYW5kbyBhbmQgYW4gYXR0cmlidXRlIHRvIHRyYWNrIGRlZmVyZWQgdG9rZW5zLiBBdHRyaWJ1dGUgaXMgbmVlZGVkIGZvciBxdWVyeVNlbGVjdG9yQWxsIGZvciBnZXRWaWV3SW5mb3MgKGNoaWxkVGFncylcblx0ZWxlbVsodmFsdWUgPyBcInNldFwiIDogXCJyZW1vdmVcIikgKyBcIkF0dHJpYnV0ZVwiXShkZWZlckF0dHIsIFwiXCIpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50KHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCBhdHRyLCB0YWcpIHtcblx0Ly8gV2hlbiBjYWxsZWQgZm9yIGEgdGFnLCBlaXRoZXIgaW4gdGFnLnJlZnJlc2goKSBvciBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIoKSwgcmV0dXJucyBhIHByb21pc2UgKGFuZCBzdXBwb3J0cyBhc3luYylcblx0Ly8gV2hlbiBjYWxsZWQgKGluIHByb3BlcnR5Q2hhbmdlSGFuZGxlcikgZm9yIHRhcmdldCBIVE1MIHJldHVybnMgdHJ1ZVxuXHQvLyBXaGVuIGNhbGxlZCAoaW4gcHJvcGVydHlDaGFuZ2VIYW5kbGVyKSBmb3Igb3RoZXIgdGFyZ2V0cyByZXR1cm5zIGJvb2xlYW4gZm9yIFwiY2hhbmdlZFwiXG5cdHZhciBzZXR0ZXIsIHByZXZOb2RlLCBuZXh0Tm9kZSwgcHJvbWlzZSwgbm9kZXNUb1JlbW92ZSwgdXNlUHJvcCwgdG9rZW5zLCBpZCwgb3BlbkluZGV4LCBjbG9zZUluZGV4LCB0ZXN0RWxlbSwgbm9kZU5hbWUsIGNTdHlsZSwganN2U2VsLFxuXHRcdHJlbmRlcnMgPSBhdHRyICE9PSBOT05FICYmIHNvdXJjZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWxpbmtDdHguX25vVXBkLCAvLyBGb3IgZGF0YS1saW5rPVwiXnsuLi59XCIsIGRvbid0IHVwZGF0ZSB0aGUgZmlyc3QgdGltZSAobm8gaW5pdGlhbCByZW5kZXIpIC0gZS5nLiB0byBsZWF2ZSBzZXJ2ZXIgcmVuZGVyZWQgdmFsdWVzLlxuXHRcdHNvdXJjZSA9IGxpbmtDdHguZGF0YSxcblx0XHR0YXJnZXQgPSB0YWcgJiYgdGFnLnBhcmVudEVsZW0gfHwgbGlua0N0eC5lbGVtLFxuXHRcdHRhcmdldFBhcmVudCA9IHRhcmdldC5wYXJlbnROb2RlLFxuXHRcdCR0YXJnZXQgPSAkKHRhcmdldCksXG5cdFx0dmlldyA9IGxpbmtDdHgudmlldyxcblx0XHR0YXJnZXRWYWwgPSBsaW5rQ3R4Ll92YWwsXG5cdFx0b2xkTGlua0N0eCA9IHZpZXcubGlua0N0eCxcblx0XHQvLyBJZiBub3QgYSB0YWcgd2UgY2FuIHVzZSB0aGUgLl92YWwgb2J0YWluZWQgZnJvbSBnZXRUYXJnZXRWYWwoKVxuXHRcdC8vIGFuZCBvbmx5IHVwZGF0ZSB3aGVuIHRoZSBuZXcgdmFsdWUgKHNvdXJjZVZhbHVlKSBoYXMgY2hhbmdlZCBmcm9tIHRoZSBwcmV2aW91cyBvbmVcblx0XHRjaGFuZ2UgPSB0YWc7XG5cblx0aWYgKHRhZykge1xuXHRcdC8vIEluaXRpYWxpemUgdGhlIHRhZyB3aXRoIGVsZW1lbnQgcmVmZXJlbmNlc1xuXHRcdHRhZy5fLnVubGlua2VkID0gdHJ1ZTsgLy8gU2V0IHRvIHVubGlua2VkLCBzbyBpbml0aWFsaXphdGlvbiBpcyB0cmlnZ2VyZWQgYWZ0ZXIgcmUtcmVuZGVyaW5nLCBlLmcuIGZvciBzZXR0aW5nIGxpbmtlZEVsZW0sIGFuZCBjYWxsaW5nIG9uQmluZFxuXHRcdHRhZy5wYXJlbnRFbGVtID0gdGFnLnBhcmVudEVsZW0gfHwgKGxpbmtDdHguZXhwciB8fCB0YWcuX2VsQ250KSA/IHRhcmdldCA6IHRhcmdldFBhcmVudDtcblx0XHRwcmV2Tm9kZSA9IHRhZy5fcHJ2O1xuXHRcdG5leHROb2RlID0gdGFnLl9ueHQ7XG5cdH1cblx0aWYgKCFyZW5kZXJzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKGF0dHIgPT09IFwidmlzaWJsZVwiKSB7XG5cdFx0YXR0ciA9IFwiY3NzLWRpc3BsYXlcIjtcblx0fVxuXHRpZiAoL15jc3MtLy50ZXN0KGF0dHIpKSB7XG5cdFx0aWYgKGxpbmtDdHguYXR0ciA9PT0gXCJ2aXNpYmxlXCIpIHtcblx0XHRcdC8vIEdldCB0aGUgY3VycmVudCBkaXNwbGF5IHN0eWxlXG5cdFx0XHRjU3R5bGUgPSAodGFyZ2V0LmN1cnJlbnRTdHlsZSB8fCBnZXRDb21wdXRlZFN0eWxlLmNhbGwoZ2xvYmFsLCB0YXJnZXQsIFwiXCIpKS5kaXNwbGF5O1xuXG5cdFx0XHRpZiAoc291cmNlVmFsdWUpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIHNob3dpbmcgdGhlIGVsZW1lbnQuXG5cdFx0XHRcdC8vIEdldCB0aGUgY2FjaGVkICd2aXNpYmxlJyBkaXNwbGF5IHZhbHVlIGZyb20gdGhlIC1qc3ZkIGV4cGFuZG9cblx0XHRcdFx0c291cmNlVmFsdWUgPSB0YXJnZXQuX2pzdmRcblx0XHRcdFx0XHQvLyBPciwgaWYgbm90IHlldCBjYWNoZWQsIGdldCB0aGUgY3VycmVudCBkaXNwbGF5IHZhbHVlXG5cdFx0XHRcdFx0fHwgY1N0eWxlO1xuXHRcdFx0XHRpZiAoc291cmNlVmFsdWUgPT09IE5PTkUgJiYgIShzb3VyY2VWYWx1ZSA9IGRpc3BsYXlTdHlsZXNbbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWVdKSkge1xuXHRcdFx0XHRcdC8vIEN1cnJlbnRseSBkaXNwbGF5IHZhbHVlIGlzICdub25lJywgYW5kIHRoZSAndmlzaWJsZScgc3R5bGUgaGFzIG5vdCBiZWVuIGNhY2hlZC5cblx0XHRcdFx0XHQvLyBXZSBjcmVhdGUgYW4gZWxlbWVudCB0byBmaW5kIHRoZSBjb3JyZWN0ICd2aXNpYmxlJyBkaXNwbGF5IHN0eWxlIGZvciB0aGlzIG5vZGVOYW1lXG5cdFx0XHRcdFx0dGVzdEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5vZGVOYW1lKTtcblx0XHRcdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlc3RFbGVtKTtcblxuXHRcdFx0XHRcdC8vIEdldCB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgdGhpcyBIVE1MIHRhZyB0byB1c2UgYXMgJ3Zpc2libGUnIHN0eWxlXG5cdFx0XHRcdFx0c291cmNlVmFsdWVcblx0XHRcdFx0XHRcdC8vIGFuZCBjYWNoZSBpdCBhcyBhIGhhc2ggYWdhaW5zdCBub2RlTmFtZVxuXHRcdFx0XHRcdFx0PSBkaXNwbGF5U3R5bGVzW25vZGVOYW1lXVxuXHRcdFx0XHRcdFx0PSAodGVzdEVsZW0uY3VycmVudFN0eWxlIHx8IGdldENvbXB1dGVkU3R5bGUuY2FsbChnbG9iYWwsIHRlc3RFbGVtLCBcIlwiKSkuZGlzcGxheTtcblx0XHRcdFx0XHRkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlc3RFbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGhpZGluZyB0aGUgZWxlbWVudC5cblx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGN1cnJlbnQgZGlzcGxheSB2YWx1ZSBhcyAndmlzaWJsZScgc3R5bGUsIG9uIF9qc3ZkIGV4cGFuZG8sIGZvciB3aGVuIHdlIHNob3cgdGhlIGVsZW1lbnQgYWdhaW5cblx0XHRcdFx0dGFyZ2V0Ll9qc3ZkID0gY1N0eWxlO1xuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IE5PTkU7IC8vIEhpZGUgdGhlIGVsZW1lbnRcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHQkLnN0eWxlKHRhcmdldCwgYXR0ci5zbGljZSg0KSwgc291cmNlVmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChhdHRyICE9PSBcImxpbmtcIikgeyAvLyBhdHRyID09PSBcImxpbmtcIiBpcyBmb3IgdGFnIGNvbnRyb2xzIHdoaWNoIGRvIGRhdGEgYmluZGluZyBidXQgaGF2ZSBubyByZW5kZXJlZCBvdXRwdXQgb3IgdGFyZ2V0XG5cdFx0aWYgKC9eZGF0YS0vLnRlc3QoYXR0cikpIHtcblx0XHRcdCQuZGF0YSh0YXJnZXQsIGF0dHIuc2xpY2UoNSksIHNvdXJjZVZhbHVlKTsgLy8gU3VwcG9ydCBmb3IgYmluZGluZyB0byBkYXRhIGF0dHJpYnV0ZXM6IGRhdGEtZm9vezpleHByfTogZGF0YS1mb28gYXR0cmlidXRlIHdpbGwgYmVcblx0XHRcdC8vIGV4cHIudG9TdHJpbmcoKSwgYnV0ICQuZGF0YShlbGVtZW50LCBcImZvb1wiKSBhbmQgJChlbGVtZW50KS5kYXRhKFwiZm9vXCIpIHdpbGwgYWN0dWFsbHkgcmV0dXJuIHZhbHVlIG9mIGV4cHIsIGV2ZW4gaWYgb2YgdHlwZSBvYmplY3Rcblx0XHR9XG5cdFx0aWYgKGF0dHIgPT09IENIRUNLRUQpIHtcblx0XHRcdHVzZVByb3AgPSB0cnVlO1xuXHRcdFx0c291cmNlVmFsdWUgPSBzb3VyY2VWYWx1ZSAmJiBzb3VyY2VWYWx1ZSAhPT0gXCJmYWxzZVwiO1xuXHRcdFx0Ly8gVGhlIHN0cmluZyB2YWx1ZSBcImZhbHNlXCIgY2FuIG9jY3VyIHdpdGggZGF0YS1saW5rPVwiY2hlY2tlZHthdHRyOmV4cHJ9XCIgLSBhcyBhIHJlc3VsdCBvZiBhdHRyLCBhbmQgaGVuY2UgdXNpbmcgY29udmVydFZhbCgpXG5cdFx0XHQvLyBXZSB3aWxsIHNldCB0aGUgXCJjaGVja2VkXCIgcHJvcGVydHlcblx0XHRcdC8vIFdlIHdpbGwgY29tcGFyZSB0aGlzIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVcblx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFJBRElPKSB7XG5cdFx0XHQvLyBUaGlzIGlzIGEgc3BlY2lhbCBiaW5kaW5nIGF0dHJpYnV0ZSBmb3IgcmFkaW8gYnV0dG9ucywgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGRlZmF1bHQgJ3RvJyBiaW5kaW5nLlxuXHRcdFx0Ly8gVGhpcyBhbGxvd3MgYmluZGluZyBib3RoIHRvIHZhbHVlIChmb3IgZWFjaCBpbnB1dCkgYW5kIHRvIHRoZSBkZWZhdWx0IGNoZWNrZWQgcmFkaW8gYnV0dG9uIChmb3IgZWFjaCBpbnB1dCBpbiBuYW1lZCBncm91cCxcblx0XHRcdC8vIGUuZy4gYmluZGluZyB0byBwYXJlbnQgZGF0YSkuXG5cdFx0XHQvLyBQbGFjZSB2YWx1ZSBiaW5kaW5nIGZpcnN0OiA8aW5wdXQgdHlwZT1cInJhZGlvXCIgZGF0YS1saW5rPVwidmFsdWV7Om5hbWV9IHs6I2dldCgnZGF0YScpLmRhdGEuY3VycmVuY3k6fSBcIiAuLi4vPlxuXHRcdFx0Ly8gb3IgKGFsbG93aW5nIGFueSBvcmRlciBmb3IgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMpOlxuXHRcdFx0Ly8gPGlucHV0IHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwie3s6bmFtZX19XCIgZGF0YS1saW5rPVwiezojZ2V0KCdkYXRhJykuZGF0YS5jdXJyZW5jeTp9IHZhbHVlXns6bmFtZX1cIiAuLi4vPlxuXHRcdFx0dXNlUHJvcCA9IHRydWU7XG5cdFx0XHRhdHRyID0gQ0hFQ0tFRDtcblx0XHRcdHNvdXJjZVZhbHVlID0gdGFyZ2V0LnZhbHVlID09PSAoXCJcIiArIHNvdXJjZVZhbHVlKTtcblx0XHRcdC8vIElmIHRoZSBkYXRhIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhpcyByYWRpbyBidXR0b24gaW5wdXQsIHNldCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSB0byB0cnVlXG5cdFx0XHQvLyBPdGhlcndpc2Ugc2V0IHRoZSBjaGVja2VkIHByb3BlcnR5IHRvIGZhbHNlXG5cdFx0fSBlbHNlIGlmIChhdHRyID09PSBcInNlbGVjdGVkXCIgfHwgYXR0ciA9PT0gXCJkaXNhYmxlZFwiIHx8IGF0dHIgPT09IFwibXVsdGlwbGVcIiB8fCBhdHRyID09PSBcInJlYWRvbmx5XCIpIHtcblx0XHRcdHNvdXJjZVZhbHVlID0gKHNvdXJjZVZhbHVlICYmIHNvdXJjZVZhbHVlICE9PSBcImZhbHNlXCIpID8gYXR0ciA6IG51bGw7XG5cdFx0XHQvLyBVc2UgYXR0ciwgbm90IHByb3AsIHNvIHdoZW4gdGhlIG9wdGlvbnMgKGZvciBleGFtcGxlKSBhcmUgY2hhbmdlZCBkeW5hbWljYWxseSwgYnV0IGluY2x1ZGUgdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgdmFsdWUsXG5cdFx0XHQvLyB0aGV5IHdpbGwgc3RpbGwgYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhlIGNoYW5nZVxuXHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gXCJ2YWx1ZVwiICYmIHRhcmdldC5ub2RlTmFtZSA9PT0gXCJTRUxFQ1RcIikge1xuXHRcdFx0dGFyZ2V0Ll9qc3ZTZWwgPSAkaXNBcnJheShzb3VyY2VWYWx1ZSlcblx0XHRcdFx0PyBzb3VyY2VWYWx1ZVxuXHRcdFx0XHQ6IFwiXCIgKyBzb3VyY2VWYWx1ZTsgLy8gSWYgbm90IGFycmF5LCBjb2VyY2UgdG8gc3RyaW5nXG5cdFx0fVxuXG5cdFx0aWYgKHNldHRlciA9IGZuU2V0dGVyc1thdHRyXSkge1xuXHRcdFx0aWYgKGF0dHIgPT09IEhUTUwpIHtcblx0XHRcdFx0Ly8gU2V0IGxpbmtDdHggb24gdmlldywgZHluYW1pY2FsbHksIGp1c3QgZHVyaW5nIHRoaXMgaGFuZGxlciBjYWxsXG5cdFx0XHRcdHZpZXcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdGlmICh0YWcgJiYgdGFnLl8uaW5saW5lKSB7XG5cdFx0XHRcdFx0bm9kZXNUb1JlbW92ZSA9IHRhZy5ub2Rlcyh0cnVlKTtcblx0XHRcdFx0XHRpZiAodGFnLl9lbENudCkge1xuXHRcdFx0XHRcdFx0aWYgKHByZXZOb2RlICYmIHByZXZOb2RlICE9PSBuZXh0Tm9kZSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIHByZXZOb2RlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRyYW5zZmVyIHRoZSB2aWV3IHRva2VucyBvbiBwcmV2Tm9kZSB0byBuZXh0Tm9kZSBvZiB0aGlzICd2aWV3VG9SZWZyZXNoJ1xuXHRcdFx0XHRcdFx0XHR0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCB0YXJnZXQsIHRhZy5fdGdJZCwgXCJeXCIsIHRydWUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0b2tlbnMgPSB0YXJnZXQuX2RmKSB7IC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gbmV4dE5vZGUsIGFuZCBzbyB0aGUgdGFyZ2V0Ll9kZiBtYXkgaW5jbHVkZSB0b2tlbnMgcmVmZXJlbmNpbmdcblx0XHRcdFx0XHRcdFx0Ly8gdmlldyBhbmQgdGFnIGJpbmRpbmdzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG9wZW4gYW5kIGNsb3NlIHRva2VucyBvZiB0aGUgdXBkYXRlZCB0YWcgY29udHJvbC4gVGhleSBuZWVkIHRvIGJlIHByb2Nlc3NlZCAoZGlzcG9zZWQpXG5cdFx0XHRcdFx0XHRcdGlkID0gdGFnLl90Z0lkICsgXCJeXCI7XG5cdFx0XHRcdFx0XHRcdG9wZW5JbmRleCA9IHRva2Vucy5pbmRleE9mKFwiI1wiICsgaWQpICsgMTtcblx0XHRcdFx0XHRcdFx0Y2xvc2VJbmRleCA9IHRva2Vucy5pbmRleE9mKFwiL1wiICsgaWQpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChvcGVuSW5kZXggJiYgY2xvc2VJbmRleCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRvcGVuSW5kZXggKz0gaWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjbG9zZUluZGV4ID4gb3BlbkluZGV4KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXQsIHRva2Vucy5zbGljZSgwLCBvcGVuSW5kZXgpICsgdG9rZW5zLnNsaWNlKGNsb3NlSW5kZXgpKTtcblx0XHRcdFx0XHRcdFx0XHRcdGRpc3Bvc2VUb2tlbnModG9rZW5zLnNsaWNlKG9wZW5JbmRleCwgY2xvc2VJbmRleCkpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cHJldk5vZGUgPSBwcmV2Tm9kZVxuXHRcdFx0XHRcdFx0XHQ/IHByZXZOb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHRcdFx0XHQ6IG5leHROb2RlXG5cdFx0XHRcdFx0XHRcdFx0PyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHRcdFx0XHQ6IHRhcmdldC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIFJlbW92ZSBIVE1MIG5vZGVzXG5cdFx0XHRcdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTsgLy8gTm90ZSBpZiAhdGFnLl9lbENudCByZW1vdmluZyB0aGUgbm9kZXNUb1JlbW92ZSB3aWxsIHByb2Nlc3MgYW5kIGRpc3Bvc2UgdmlldyBhbmQgdGFnIGJpbmRpbmdzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHVwZGF0ZWQgdGFnIGNvbnRyb2xcblxuXHRcdFx0XHRcdC8vIEluc2VydCBhbmQgbGluayBuZXcgY29udGVudFxuXHRcdFx0XHRcdHByb21pc2UgPSB2aWV3Lmxpbmsodmlldy5kYXRhLCB0YXJnZXQsIHByZXZOb2RlLCBuZXh0Tm9kZSwgc291cmNlVmFsdWUsIHRhZyAmJiB7dGFnOiB0YWcuX3RnSWQsIGxhenlMaW5rOiB0YWcudGFnQ3R4LnByb3BzLmxhenlMaW5rfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZGF0YS1saW5rZWQgdmFsdWUgdGFyZ2V0aW5nIGlubmVySFRNTDogZGF0YS1saW5rPVwiaHRtbHs6ZXhwcn1cIiBvciBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJcblx0XHRcdFx0XHRyZW5kZXJzID0gcmVuZGVycyAmJiB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlO1xuXHRcdFx0XHRcdGlmIChyZW5kZXJzKSB7XG5cdFx0XHRcdFx0XHQkdGFyZ2V0LmVtcHR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChyZW5kZXJzKSB7XG5cdFx0XHRcdFx0XHRwcm9taXNlID0gdmlldy5saW5rKHNvdXJjZSwgdGFyZ2V0LCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHNvdXJjZVZhbHVlLCB0YWcgJiYge3RhZzogdGFnLl90Z0lkfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFJlbW92ZSBkeW5hbWljYWxseSBhZGRlZCBsaW5rQ3R4IGFuZCBjdHggZnJvbSB2aWV3XG5cdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoY2hhbmdlID0gY2hhbmdlIHx8IHRhcmdldFZhbCAhPT0gc291cmNlVmFsdWUpIHtcblx0XHRcdFx0XHRpZiAoYXR0ciA9PT0gXCJ0ZXh0XCIgJiYgdGFyZ2V0LmNoaWxkcmVuICYmICF0YXJnZXQuY2hpbGRyZW5bMF0pIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgY29kZSBpcyBmYXN0ZXIgdGhlbiAkdGFyZ2V0LnRleHQoKVxuXHRcdFx0XHRcdFx0aWYgKHRhcmdldC50ZXh0Q29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldC50ZXh0Q29udGVudCA9IHNvdXJjZVZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0LmlubmVyVGV4dCA9IHNvdXJjZVZhbHVlID09PSBudWxsID8gXCJcIiA6IHNvdXJjZVZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQkdGFyZ2V0W3NldHRlcl0oc291cmNlVmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoKGpzdlNlbCA9IHRhcmdldFBhcmVudC5fanN2U2VsKVxuXHRcdFx0XHRcdC8vIFNldHRpbmcgdmFsdWUgb2YgPG9wdGlvbj4gZWxlbWVudFxuXHRcdFx0XHRcdCYmIChhdHRyID09PSBcInZhbHVlXCIgfHwgISR0YXJnZXQuYXR0cihcInZhbHVlXCIpKSkgeyAvLyBTZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSwgb3Igc2V0dGluZyB0ZXh0Q29udGVudCBpZiBhdHRyaWJ1dGUgaXMgbnVsbFxuXHRcdFx0XHRcdC8vIFNldC91bnNlbGVjdCBzZWxlY3Rpb24gYmFzZWQgb24gdmFsdWUgc2V0IG9uIHBhcmVudCA8c2VsZWN0Pi4gV29ya3MgZm9yIG11bHRpc2VsZWN0IHRvb1xuXHRcdFx0XHRcdHRhcmdldC5zZWxlY3RlZCA9ICQuaW5BcnJheShcIlwiICsgc291cmNlVmFsdWUsICRpc0FycmF5KGpzdlNlbCkgPyBqc3ZTZWwgOiBbanN2U2VsXSkgPiAtMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2hhbmdlID0gY2hhbmdlIHx8IHRhcmdldFZhbCAhPT0gc291cmNlVmFsdWUpIHtcblx0XHRcdC8vIFNldHRpbmcgYW4gYXR0cmlidXRlIHRvIHVuZGVmaW5lZCBzaG91bGQgcmVtb3ZlIHRoZSBhdHRyaWJ1dGVcblx0XHRcdCR0YXJnZXRbdXNlUHJvcCA/IFwicHJvcFwiIDogXCJhdHRyXCJdKGF0dHIsIHNvdXJjZVZhbHVlID09PSB1bmRlZmluZWQgJiYgIXVzZVByb3AgPyBudWxsIDogc291cmNlVmFsdWUpO1xuXHRcdH1cblx0XHRsaW5rQ3R4Ll92YWwgPSBzb3VyY2VWYWx1ZTtcblx0fVxuXHRyZXR1cm4gcHJvbWlzZSB8fCBjaGFuZ2U7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q2hhbmdlSGFuZGxlcihldiwgZXZlbnRBcmdzKSB7XG5cdHZhciBzZWxmID0gdGhpcyxcblx0XHRvbkJlZm9yZUNoYW5nZSA9IHNlbGYuaGxwKG9uQmVmb3JlQ2hhbmdlU3RyKSxcblx0XHRvbkFmdGVyQ2hhbmdlID0gc2VsZi5obHAob25BZnRlckNoYW5nZVN0cik7XG5cdGlmICghb25CZWZvcmVDaGFuZ2UgfHwgb25CZWZvcmVDaGFuZ2UuY2FsbCh0aGlzLCBldiwgZXZlbnRBcmdzKSAhPT0gZmFsc2UpIHtcblx0XHRpZiAoZXZlbnRBcmdzKSB7XG5cdFx0XHQvLyBUaGlzIGlzIGFuIG9ic2VydmFibGUgYWN0aW9uIChub3QgYSB0cmlnZ2VyL2hhbmRsZXIgY2FsbCBmcm9tIHB1c2hWYWx1ZXMsIG9yIHNpbWlsYXIsIGZvciB3aGljaCBldmVudEFyZ3Mgd2lsbCBiZSBudWxsKVxuXHRcdFx0dmFyIGFjdGlvbiA9IGV2ZW50QXJncy5jaGFuZ2UsXG5cdFx0XHRcdGluZGV4ID0gZXZlbnRBcmdzLmluZGV4LFxuXHRcdFx0XHRpdGVtcyA9IGV2ZW50QXJncy5pdGVtcztcblx0XHRcdHNlbGYuXy5zcnQgPSBldmVudEFyZ3MucmVmcmVzaDsgLy8gdHJ1ZSBpZiBwYXJ0IG9mIGEgJ3NvcnQnIG9uIHJlZnJlc2hcblx0XHRcdHN3aXRjaCAoYWN0aW9uKSB7XG5cdFx0XHRcdGNhc2UgXCJpbnNlcnRcIjpcblx0XHRcdFx0XHRzZWxmLmFkZFZpZXdzKGluZGV4LCBpdGVtcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJyZW1vdmVcIjpcblx0XHRcdFx0XHRzZWxmLnJlbW92ZVZpZXdzKGluZGV4LCBpdGVtcy5sZW5ndGgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibW92ZVwiOlxuXHRcdFx0XHRcdHNlbGYucmVtb3ZlVmlld3MoZXZlbnRBcmdzLm9sZEluZGV4LCBpdGVtcy5sZW5ndGgsIHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIHJlbW92ZVxuXHRcdFx0XHRcdHNlbGYuYWRkVmlld3MoaW5kZXgsIGl0ZW1zKTsgLy8gcmUtaW5zZXJ0XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJyZWZyZXNoXCI6XG5cdFx0XHRcdFx0c2VsZi5fLnNydCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRzZWxmLmZpeEluZGV4KDApO1xuXHRcdFx0XHRcdC8vIE90aGVyIGNhc2VzOiAoZS5nLnVuZGVmaW5lZCwgZm9yIHNldFByb3BlcnR5IG9uIG9ic2VydmFibGUgb2JqZWN0KSBldGMuIGRvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9uQWZ0ZXJDaGFuZ2UpIHtcblx0XHRcdG9uQWZ0ZXJDaGFuZ2UuY2FsbCh0aGlzLCBldiwgZXZlbnRBcmdzKTtcblx0XHR9XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXRpbGl0aWVzIGZvciBldmVudCBoYW5kbGVyc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBzZXRBcnJheUNoYW5nZUxpbmsodmlldykge1xuXHQvLyBBZGQvcmVtb3ZlIGFycmF5Q2hhbmdlIGhhbmRsZXIgb24gdmlld1xuXHR2YXIgaGFuZGxlciwgYXJyYXlCaW5kaW5nLFxuXHRcdHR5cGUgPSB2aWV3LnR5cGUsIC8vIHVuZGVmaW5lZCBpZiB2aWV3IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRkYXRhID0gdmlldy5kYXRhLFxuXHRcdGJvdW5kID0gdmlldy5fLmJuZDsgLy8gdHJ1ZSBmb3IgdG9wLWxldmVsIGxpbmsoKSBvciBkYXRhLWxpbms9XCJ7Zm9yfVwiLCBvciB0aGUgZm9yIHRhZyBpbnN0YW5jZSBmb3Ige157Zm9yfX0gKG9yIGZvciBhbnkgY3VzdG9tIHRhZyB0aGF0IGhhcyBhbiBvbkFycmF5Q2hhbmdlIGhhbmRsZXIpXG5cblx0aWYgKCF2aWV3Ll8udXNlS2V5ICYmIGJvdW5kKSB7XG5cdFx0Ly8gVGhpcyBpcyBhbiBhcnJheSB2aWV3LiAodmlldy5fLnVzZUtleSBub3QgZGVmaW5lZCA9PiBkYXRhIGlzIGFycmF5KSwgYW5kIGlzIGRhdGEtYm91bmQgdG8gY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzXG5cblx0XHRpZiAoYXJyYXlCaW5kaW5nID0gdmlldy5fLmJuZEFycikge1xuXHRcdFx0Ly8gRmlyc3QgcmVtb3ZlIHRoZSBjdXJyZW50IGhhbmRsZXIgaWYgdGhlcmUgaXMgb25lXG5cdFx0XHQkKFthcnJheUJpbmRpbmdbMV1dKS5vZmYoYXJyYXlDaGFuZ2VTdHIsIGFycmF5QmluZGluZ1swXSk7XG5cdFx0XHR2aWV3Ll8uYm5kQXJyID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoYm91bmQgIT09ICEhYm91bmQpIHtcblx0XHRcdC8vIGJvdW5kIGlzIG5vdCBhIGJvb2xlYW4sIHNvIGl0IGlzIHRoZSBkYXRhLWxpbmtlZCB0YWcgdGhhdCAnb3ducycgdGhpcyBhcnJheSBiaW5kaW5nIC0gZS5nLiB7Xntmb3IuLi59fVxuXHRcdFx0aWYgKHR5cGUpIHtcblx0XHRcdFx0Ym91bmQuXy5hcnJWd3Nbdmlldy5fLmlkXSA9IHZpZXc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgYm91bmQuXy5hcnJWd3Nbdmlldy5fLmlkXTsgLy8gaWYgdmlldy50eXBlIGlzIHVuZGVmaW5lZCwgdmlldyBpcyBiZWluZyByZW1vdmVkXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0eXBlICYmIGRhdGEpIHtcblx0XHRcdC8vIElmIHRoaXMgdmlldyBpcyBub3QgYmVpbmcgcmVtb3ZlZCwgYnV0IHRoZSBkYXRhIGFycmF5IGhhcyBiZWVuIHJlcGxhY2VkLCB0aGVuIGJpbmQgdG8gdGhlIG5ldyBkYXRhIGFycmF5XG5cdFx0XHRoYW5kbGVyID0gZnVuY3Rpb24oZXYpIHtcblx0XHRcdFx0aWYgKCEoZXYuZGF0YSAmJiBldi5kYXRhLm9mZikpIHtcblx0XHRcdFx0XHQvLyBTa2lwIGlmICEhZXYuZGF0YS5vZmY6IC0gYSBoYW5kbGVyIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIChtYXliZSB3YXMgb24gaGFuZGxlciBjb2xsZWN0aW9uIGF0IGNhbGwgdGltZSAtIHRoZW4gcmVtb3ZlZCBieSBhbm90aGVyIGhhbmRsZXIpXG5cdFx0XHRcdFx0Ly8gSWYgdmlldy50eXBlIGlzIHVuZGVmaW5lZCwgZG8gbm90aGluZy4gKENvcnJlc3BvbmRzIHRvIGNhc2Ugd2hlcmUgdGhlcmUgaXMgYW5vdGhlciBoYW5kbGVyIG9uIHRoZSBzYW1lIGRhdGEgd2hvc2Vcblx0XHRcdFx0XHQvLyBlZmZlY3Qgd2FzIHRvIHJlbW92ZSB0aGlzIHZpZXcsIGFuZCB3aGljaCBoYXBwZW5lZCB0byBwcmVjZWRlIHRoaXMgZXZlbnQgaW4gdGhlIHRyaWdnZXIgc2VxdWVuY2UuIFNvIGFsdGhvdWdoIHRoaXNcblx0XHRcdFx0XHQvLyBldmVudCBoYXMgYmVlbiByZW1vdmVkIG5vdywgaXQgaXMgc3RpbGwgY2FsbGVkIHNpbmNlIGFscmVhZHkgb24gdGhlIHRyaWdnZXIgc2VxdWVuY2UpXG5cdFx0XHRcdFx0YXJyYXlDaGFuZ2VIYW5kbGVyLmFwcGx5KHZpZXcsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHQkKFtkYXRhXSkub24oYXJyYXlDaGFuZ2VTdHIsIGhhbmRsZXIpO1xuXHRcdFx0dmlldy5fLmJuZEFyciA9IFtoYW5kbGVyLCBkYXRhXTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdEF0dHIoZWxlbSwgdG8sIGxpbmtHZXRWYWwpIHtcblx0Ly8gdG86IHRydWUgLSBkZWZhdWx0IGF0dHJpYnV0ZSBmb3Igc2V0dGluZyBkYXRhIHZhbHVlIG9uIEhUTUwgZWxlbWVudDsgZmFsc2U6IGRlZmF1bHQgYXR0cmlidXRlIGZvciBnZXR0aW5nIHZhbHVlIGZyb20gSFRNTCBlbGVtZW50XG5cdC8vIE1lcmdlIGluIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSBiaW5kaW5ncyBmb3IgdGhpcyB0YXJnZXQgZWxlbWVudFxuXHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0YXR0ciA9XG5cdFx0XHQkc3ViU2V0dGluZ3NBZHZhbmNlZC5fZmVbbm9kZU5hbWVdIC8vIGdldCBmb3JtIGVsZW1lbnQgYmluZGluZyBzZXR0aW5ncyBmb3IgaW5wdXQgdGV4dGFyZWEgc2VsZWN0IG9yIG9wdGdyb3VwXG5cdFx0XHR8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gVFJVRSAmJiB7dG86IEhUTUwsIGZyb206IEhUTUx9OyAvLyBPciBpZiBjb250ZW50RWRpdGFibGUgc2V0IHRvIFwidHJ1ZVwiIHNldCBhdHRyIHRvIFwiaHRtbFwiXG5cdHJldHVybiBhdHRyXG5cdFx0PyAodG9cblx0XHRcdD8gKChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gUkFESU8pIC8vIEZvciByYWRpbyBidXR0b25zLCBiaW5kIGZyb20gdmFsdWUsIGJ1dCBiaW5kIHRvICdyYWRpbycgLSBzcGVjaWFsIHZhbHVlLlxuXHRcdFx0XHQ/IFJBRElPXG5cdFx0XHRcdDogYXR0ci50bylcblx0XHRcdDogYXR0ci5mcm9tKVxuXHRcdDogdG9cblx0XHRcdD8gbGlua0dldFZhbCA/IFwidGV4dFwiIDogSFRNTCAvLyBEZWZhdWx0IGlubmVyVGV4dCBmb3IgZGF0YS1saW5rPVwiYS5iLmNcIiBvciBkYXRhLWxpbms9XCJ7OmEuYi5jfVwiICh3aXRoIG9yIHdpdGhvdXQgY29udmVydGVycyktIG90aGVyd2lzZSBpbm5lckhUTUxcblx0XHRcdDogXCJcIjsgLy8gRGVmYXVsdCBpcyBub3QgdG8gYmluZCBmcm9tXG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZW5kZXJpbmcgYW5kIERPTSBpbnNlcnRpb25cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlbmRlckFuZExpbmsodmlldywgaW5kZXgsIHRtcGwsIHZpZXdzLCBkYXRhLCBjb250ZXh0LCByZWZyZXNoKSB7XG5cdHZhciBodG1sLCBsaW5rVG9Ob2RlLCBwcmV2Vmlldywgbm9kZXNUb1JlbW92ZSwgYmluZElkLFxuXHRcdHBhcmVudE5vZGUgPSB2aWV3LnBhcmVudEVsZW0sXG5cdFx0cHJldk5vZGUgPSB2aWV3Ll9wcnYsXG5cdFx0bmV4dE5vZGUgPSB2aWV3Ll9ueHQsXG5cdFx0ZWxDbnQgPSB2aWV3Ll9lbENudDtcblxuXHRpZiAocHJldk5vZGUgJiYgcHJldk5vZGUucGFyZW50Tm9kZSAhPT0gcGFyZW50Tm9kZSkge1xuXHRcdGVycm9yKFwiTWlzc2luZyBwYXJlbnROb2RlXCIpO1xuXHRcdC8vIEFiYW5kb24sIHNpbmNlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkLCBvciB3cmFwcGVyIGVsZW1lbnQgaGFzIGJlZW4gaW5zZXJ0ZWQgYmV0d2VlbiBwcmV2Tm9kZSBhbmQgcGFyZW50Tm9kZVxuXHR9XG5cblx0aWYgKHJlZnJlc2gpIHtcblx0XHRub2Rlc1RvUmVtb3ZlID0gdmlldy5ub2RlcygpO1xuXHRcdGlmIChlbENudCAmJiBwcmV2Tm9kZSAmJiBwcmV2Tm9kZSAhPT0gbmV4dE5vZGUpIHtcblx0XHRcdC8vIFRoaXMgcHJldk5vZGUgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIERPTSwgc28gdHJhbnNmZXIgdGhlIHZpZXcgdG9rZW5zIG9uIHByZXZOb2RlIHRvIG5leHROb2RlIG9mIHRoaXMgJ3ZpZXdUb1JlZnJlc2gnXG5cdFx0XHR0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnROb2RlLCB2aWV3Ll8uaWQsIFwiX1wiLCB0cnVlKTtcblx0XHR9XG5cdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXdzXG5cdFx0dmlldy5yZW1vdmVWaWV3cyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0bGlua1RvTm9kZSA9IG5leHROb2RlO1xuXG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHRwcmV2Tm9kZSA9IHByZXZOb2RlXG5cdFx0XHRcdD8gcHJldk5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdDogbmV4dE5vZGVcblx0XHRcdFx0XHQ/IG5leHROb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHRcdDogcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIEhUTUwgbm9kZXNcblx0XHQkKG5vZGVzVG9SZW1vdmUpLnJlbW92ZSgpO1xuXG5cdFx0Zm9yIChiaW5kSWQgaW4gdmlldy5fLmJuZHMpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGJpbmRpbmdzIG1heSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGFib3ZlIGluOiAkKG5vZGVzVG9SZW1vdmUpLnJlbW92ZSgpO1xuXHRcdFx0Ly8gSWYgbm90LCByZW1vdmUgdGhlbSBoZXJlOlxuXHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcoYmluZElkKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gYWRkVmlld3MuIE9ubHkgY2FsbGVkIGlmIHZpZXcgaXMgb2YgdHlwZSBcImFycmF5XCJcblx0XHRpZiAoaW5kZXgpIHtcblx0XHRcdC8vIGluZGV4IGlzIGEgbnVtYmVyLCBzbyBpbmRleGVkIHZpZXcgaW4gdmlldyBhcnJheVxuXHRcdFx0cHJldlZpZXcgPSB2aWV3c1tpbmRleCAtIDFdO1xuXHRcdFx0aWYgKCFwcmV2Vmlldykge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7IC8vIElmIHN1YnZpZXcgZm9yIHByb3ZpZGVkIGluZGV4IGRvZXMgbm90IGV4aXN0LCBkbyBub3RoaW5nXG5cdFx0XHR9XG5cdFx0XHRwcmV2Tm9kZSA9IHByZXZWaWV3Ll9ueHQ7XG5cdFx0fVxuXHRcdGlmIChlbENudCkge1xuXHRcdFx0bGlua1RvTm9kZSA9IHByZXZOb2RlO1xuXHRcdFx0cHJldk5vZGUgPSBsaW5rVG9Ob2RlXG5cdFx0XHRcdD8gbGlua1RvTm9kZS5wcmV2aW91c1NpYmxpbmcgICAgICAgICAvLyBUaGVyZSBpcyBhIGxpbmtUb05vZGUsIHNvIGluc2VydCBhZnRlciBwcmV2aW91c1NpYmxpbmcsIG9yIGF0IHRoZSBiZWdpbm5pbmdcblx0XHRcdFx0OiBwYXJlbnROb2RlLmxhc3RDaGlsZDsgICAgICAgICAgICAgIC8vIElmIG5vIHByZXZWaWV3IGFuZCBubyBwcmV2Tm9kZSwgaW5kZXggaXMgMCBhbmQgdGhlIGNvbnRhaW5lciBpcyBlbXB0eSxcblx0XHRcdFx0Ly8gc28gcHJldk5vZGUgPSBsaW5rVG9Ob2RlID0gbnVsbC4gQnV0IGlmIHByZXZWaWV3Ll9ueHQgaXMgbnVsbCB0aGVuIHdlIHNldCBwcmV2Tm9kZSB0byBwYXJlbnROb2RlLmxhc3RDaGlsZFxuXHRcdFx0XHQvLyAod2hpY2ggbXVzdCBiZSBiZWZvcmUgdGhlIHByZXZWaWV3KSBzbyB3ZSBpbnNlcnQgYWZ0ZXIgdGhhdCBub2RlIC0gYW5kIG9ubHkgbGluayB0aGUgaW5zZXJ0ZWQgbm9kZXNcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGlua1RvTm9kZSA9IHByZXZOb2RlLm5leHRTaWJsaW5nO1xuXHRcdH1cblx0fVxuXHRodG1sID0gdG1wbC5yZW5kZXIoZGF0YSwgY29udGV4dCwgdmlldy5fLnVzZUtleSAmJiByZWZyZXNoLCB2aWV3LCByZWZyZXNoIHx8IGluZGV4LCB0cnVlKTtcblx0Ly8gUGFzcyBpbiB2aWV3Ll8udXNlS2V5IGFzIHRlc3QgZm9yIG5vSXRlcmF0aW9uICh3aGljaCBjb3JyZXNwb25kcyB0byB3aGVuIHNlbGYuXy51c2VLZXkgPiAwIGFuZCBzZWxmLmRhdGEgaXMgYW4gYXJyYXkpXG5cblx0Ly8gTGluayB0aGUgbmV3IEhUTUwgbm9kZXMgdG8gdGhlIGRhdGFcblx0dmlldy5saW5rKGRhdGEsIHBhcmVudE5vZGUsIHByZXZOb2RlLCBsaW5rVG9Ob2RlLCBodG1sLCBwcmV2Vmlldyk7XG4vL30sIDApO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PVxuLy8gYWRkQmluZGluZ01hcmtlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGFkZEJpbmRpbmdNYXJrZXJzKHZhbHVlLCB2aWV3LCB0YWcpIHtcblx0Ly8gSW5zZXJ0IGJpbmRpbmcgbWFya2VycyBpbnRvIHRoZSByZW5kZXJlZCB0ZW1wbGF0ZSBvdXRwdXQsIHdoaWNoIHdpbGwgZ2V0IGNvbnZlcnRlZCB0byBhcHByb3ByaWF0ZVxuXHQvLyBkYXRhLWpzdiBhdHRyaWJ1dGVzIChlbGVtZW50LW9ubHkgY29udGVudCkgb3Igc2NyaXB0IG1hcmtlciBub2RlcyAocGhyYXNpbmcgb3IgZmxvdyBjb250ZW50KSwgaW4gY29udmVydE1hcmtlcnMsXG5cdC8vIHdpdGhpbiB2aWV3LmxpbmssIHByaW9yIHRvIGluc2VydGluZyBpbnRvIHRoZSBET00uIExpbmtpbmcgd2lsbCB0aGVuIGJpbmQgYmFzZWQgb24gdGhlc2UgbWFya2VycyBpbiB0aGUgRE9NLlxuXHQvLyBBZGRlZCB2aWV3IG1hcmtlcnM6ICNtXy4uLlZJRVcuLi4vbV9cblx0Ly8gQWRkZWQgdGFnIG1hcmtlcnM6ICNtXi4uLlRBRy4uLi4vbV5cblx0dmFyIGlkLCBlbmQ7XG5cdGlmICh0YWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgYmluZGluZyBtYXJrZXIgZm9yIGEgZGF0YS1saW5rZWQgdGFnIHteey4uLn19XG5cdFx0ZW5kID0gXCJeYFwiO1xuXHRcdGFkZExpbmtNZXRob2RzKHRhZywgdHJ1ZSk7IC8vIFRoaXMgaXMge157Pi4uLn19IG9yIHtee3RhZyAuLi59fSwge3tjdnQ6Li4ufSBvciB7Xns6Li4ufX0sIGFuZCB0YWcgd2FzIGRlZmluZWQgaW4gY29udmVydFZhbCBvciByZW5kZXJUYWdcblx0XHRpZCA9IHRhZy5fdGdJZDtcblx0XHRpZiAoIWlkKSB7XG5cdFx0XHRiaW5kaW5nU3RvcmVbaWQgPSBiaW5kaW5nS2V5KytdID0gdGFnOyAvLyBTdG9yZSB0aGUgdGFnIHRlbXBvcmFyaWx5LCByZWFkeSBmb3IgZGF0YWJpbmRpbmcuXG5cdFx0XHQvLyBEdXJpbmcgbGlua2luZywgaW4gYWRkRGF0YUJpbmRpbmcsIHRoZSB0YWcgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgbGlua0N0eCxcblx0XHRcdC8vIGFuZCB0aGVuIGluIG9ic2VydmVBbmRCaW5kLCBiaW5kaW5nU3RvcmVbYmluZElkXSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGJpbmRpbmcgaW5mby5cblx0XHRcdHRhZy5fdGdJZCA9IFwiXCIgKyBpZDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGJpbmRpbmcgbWFya2VyIGZvciBhIHZpZXdcblx0XHQvLyBBZGQgdGhlIHZpZXcgdG8gdGhlIHN0b3JlIG9mIGN1cnJlbnQgbGlua2VkIHZpZXdzXG5cdFx0ZW5kID0gXCJfYFwiO1xuXHRcdGFkZExpbmtNZXRob2RzKHZpZXdTdG9yZVtpZCA9IHZpZXcuXy5pZF0gPSB2aWV3KTtcblx0fVxuXHQvLyBFeGFtcGxlOiBcIiMyM15UaGVWYWx1ZS8yM15cIlxuXHRyZXR1cm4gXCIjXCIgKyBpZCArIGVuZFxuXHRcdCsgKHZhbHVlICE9IHVuZGVmaW5lZCA/IHZhbHVlIDogXCJcIikgLy8gRm9yIHteezpuYW1lfX0gdGhpcyBnaXZlcyB0aGUgZXF1aXZhbGVudCBzZW1hbnRpY3MgdG8gY29tcGlsZWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAodj1kYXRhLm5hbWUpIT1udWxsP3Y6XCJcIjsgdXNlZCBpbiB7ezpuYW1lfX0gb3IgZGF0YS1saW5rPVwibmFtZVwiXG5cdFx0KyBcIi9cIiArIGlkICsgZW5kO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGF0YS1saW5raW5nIGFuZCBkYXRhIGJpbmRpbmdcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vLS0tLS0tLS0tLS0tLS0tXG4vLyBvYnNlcnZlQW5kQmluZFxuLy8tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gb2JzZXJ2ZUFuZEJpbmQobGlua0N0eCwgc291cmNlLCB0YXJnZXQpIHsgLy9UT0RPPyBsaW5rRm5BcmdzKSB7O1xuXHR2YXIgYmluZGluZywgbCwgbGlua2VkRWxlbSwgZXhwckZuRGVwcywgZXhwck9iLFxuXHRcdHRhZyA9IGxpbmtDdHgudGFnLFxuXHRcdGN2dEJrID0gbGlua0N0eC5jb252ZXJ0QmFjayxcblx0XHRkZXBlbmRzID0gW10sXG5cdFx0YmluZElkID0gbGlua0N0eC5fYm5kSWQgfHwgXCJcIiArIGJpbmRpbmdLZXkrKyxcblx0XHRoYW5kbGVyID0gbGlua0N0eC5faGRsO1xuXG5cdGxpbmtDdHguX2JuZElkID0gdW5kZWZpbmVkO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBVc2UgdGhlICdkZXBlbmRzJyBwYXRocyBzZXQgb24gbGlua0N0eC50YWcgLSB3aGljaCBtYXkgaGF2ZSBiZWVuIHNldCBvbiBkZWNsYXJhdGlvblxuXHRcdC8vIG9yIGluIGV2ZW50czogaW5pdCwgcmVuZGVyLCBvbkFmdGVyTGluayBldGMuXG5cdFx0ZGVwZW5kcyA9IHRhZy5kZXBlbmRzIHx8IGRlcGVuZHM7XG5cdFx0ZGVwZW5kcyA9ICRpc0Z1bmN0aW9uKGRlcGVuZHMpID8gdGFnLmRlcGVuZHModGFnKSA6IGRlcGVuZHM7XG5cdFx0bGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtO1xuXHR9XG5cdGlmICghbGlua0N0eC5fZGVwZW5kcyB8fCAoXCJcIiArIGxpbmtDdHguX2RlcGVuZHMgIT09IFwiXCIgKyBkZXBlbmRzKSkge1xuXHRcdC8vIE9ubHkgYmluZCB0aGUgZmlyc3QgdGltZSwgb3IgaWYgdGhlIG5ldyBkZXBlbmRzICh0b1N0cmluZykgaGFzIGNoYW5nZWQgZnJvbSB3aGVuIGxhc3QgYm91bmRcblx0XHRpZiAobGlua0N0eC5fZGVwZW5kcykge1xuXHRcdFx0Ly8gVW5vYnNlcnZlIHByZXZpb3VzIGJpbmRpbmdcblx0XHRcdCRvYnNlcnZhYmxlLl9hcHBseShmYWxzZSwgW3NvdXJjZV0sIGxpbmtDdHguX2RlcGVuZHMsIGhhbmRsZXIsIHRydWUpO1xuXHRcdH1cblxuXHRcdGV4cHJGbkRlcHMgPSBsaW5rQ3R4LmZuLmRlcHMuc2xpY2UoKTsgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGRlcGVuZGVuY3kgcGF0aHMgZm9yIHRoZSBjb21waWxlZCBsaW5rQ3R4IGV4cHJlc3Npb24gLSB0byBwYXNzIHRvIG9ic2VydmUoKS4gSW4gZ2V0SW5uZXJDYigpLFxuXHRcdC8vIChhbmQgd2hlbmV2ZXIgdGhlIG9iamVjdCBpcyB1cGRhdGVkLCBpbiBpbm5lckNiKSwgd2Ugd2lsbCBzZXQgZXhwck9iLm9iIHRvIHRoZSBjdXJyZW50IG9iamVjdCByZXR1cm5lZCBieSB0aGF0IGNvbXB1dGVkIGV4cHJlc3Npb24sIGZvciB0aGlzIHZpZXcuXG5cdFx0bCA9IGV4cHJGbkRlcHMubGVuZ3RoO1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdGV4cHJPYiA9IGV4cHJGbkRlcHNbbF07XG5cdFx0XHRpZiAoZXhwck9iLl9qc3YpIHtcblx0XHRcdFx0Ly8gVGhpcyBwYXRoIGlzIGFuICdleHByT2InLCBjb3JyZXNwb25kaW5nIHRvIGEgY29tcHV0ZWQsIHJldHVybmluZyBhbiBvYmplY3QuIFdlIHJlcGxhY2UgdGhlIGV4cHJPYiBieVxuXHRcdFx0XHQvLyBhIHZpZXctYmluZGluZy1zcGVjaWZpYyBleHByT2IgaW5zdGFuY2UuIFRoZSBjdXJyZW50IG9iamVjdCB3aWxsIGJlIHN0b3JlZCBhcyBleHByT2Iub2IuXG5cdFx0XHRcdGV4cHJGbkRlcHNbbF0gPSAkZXh0ZW5kKHt9LCBleHByT2IpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGJpbmRpbmcgPSAkb2JzZXJ2YWJsZS5fYXBwbHkoXG5cdFx0XHRmYWxzZSxcblx0XHRcdFtzb3VyY2VdLFxuXHRcdFx0ZXhwckZuRGVwcywgLy8gZmxhdHRlbiB0aGUgcGF0aHMgLSB0byBnYXRoZXIgYWxsIHRoZSBkZXBlbmRlbmNpZXMgYWNyb3NzIGFyZ3MgYW5kIGJvdW5kIHBhcmFtc1xuXHRcdFx0ZGVwZW5kcyxcblx0XHRcdGhhbmRsZXIsXG5cdFx0XHRsaW5rQ3R4Ll9jdHhDYik7XG5cdFx0Ly8gVGhlIGJpbmRpbmcgcmV0dXJuZWQgYnkgJG9ic2VydmUgaGFzIGEgYm5kIGFycmF5IHdpdGggdGhlIHNvdXJjZSBvYmplY3RzIG9mIHRoZSBpbmRpdmlkdWFsIGJpbmRpbmdzLlxuXG5cdFx0YmluZGluZy5lbGVtID0gdGFyZ2V0OyAvLyBUaGUgdGFyZ2V0IG9mIGFsbCB0aGUgaW5kaXZpZHVhbCBiaW5kaW5nc1xuXHRcdGJpbmRpbmcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0YmluZGluZy5fdGdJZCA9IGJpbmRJZDtcblxuXHRcdC8vIEFkZCB0byB0aGUgX2pzdkJuZCBvbiB0aGUgdGFyZ2V0IHRoZSB2aWV3IGlkIGFuZCBiaW5kaW5nIGlkIC0gZm9yIHVuYmluZGluZyB3aGVuIHRoZSB0YXJnZXQgZWxlbWVudCBpcyByZW1vdmVkXG5cdFx0dGFyZ2V0Ll9qc3ZCbmQgPSB0YXJnZXQuX2pzdkJuZCB8fCBcIlwiO1xuXHRcdHRhcmdldC5fanN2Qm5kICs9IFwiJlwiICsgYmluZElkO1xuXHRcdGxpbmtDdHguX2RlcGVuZHMgPSBkZXBlbmRzO1xuXHRcdC8vIFN0b3JlIHRoZSBiaW5kaW5nIGtleSBvbiB0aGUgdmlldywgZm9yIGRpc3Bvc2FsIHdoZW4gdGhlIHZpZXcgaXMgcmVtb3ZlZFxuXHRcdGxpbmtDdHgudmlldy5fLmJuZHNbYmluZElkXSA9IGJpbmRJZDtcblx0XHQvLyBTdG9yZSB0aGUgYmluZGluZy5cblx0XHRiaW5kaW5nU3RvcmVbYmluZElkXSA9IGJpbmRpbmc7IC8vIE5vdGU6IElmIHRoaXMgY29ycmVzcG9uZHMgdG8gYSBkYXRhLWxpbmtlZCB0YWcsIHdlIGFyZSByZXBsYWNpbmcgdGhlXG5cdFx0Ly8gdGVtcG9yYXJpbHkgc3RvcmVkIHRhZyBieSB0aGUgc3RvcmVkIGJpbmRpbmcuIFRoZSB0YWcgd2lsbCBub3cgYmUgYXQgYmluZGluZy5saW5rQ3R4LnRhZ1xuXG5cdFx0aWYgKGxpbmtlZEVsZW0pIHtcblx0XHRcdGwgPSBsaW5rZWRFbGVtLmxlbmd0aDtcblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0bGlua2VkRWxlbVtsXS5fanN2TGtFbCA9IHRhZztcblx0XHRcdFx0YmluZFRvKGJpbmRpbmcsIHRhZywgbGlua2VkRWxlbVtsXSk7XG5cdFx0XHRcdGxpbmtlZEVsZW1bbF0uX2pzdkJuZCA9IFwiJlwiICsgYmluZGluZy5fdGdJZCArIFwiK1wiOyAvLyBBZGQgYSBcIitcIiBmb3IgY2xvbmVkIGJpbmRpbmcgLSBzbyByZW1vdmluZ1xuXHRcdFx0XHQvLyBlbGVtcyB3aXRoIGNsb25lZCBiaW5kaW5ncyB3aWxsIG5vdCByZW1vdmUgdGhlICdwYXJlbnQnIGJpbmRpbmcgZnJvbSB0aGUgYmluZGluZ1N0b3JlLlxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY3Z0QmsgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YmluZFRvKGJpbmRpbmcsIHRhZywgdGFyZ2V0LCBjdnRCayk7XG5cdFx0fVxuXG5cdFx0aWYgKHRhZykge1xuXHRcdFx0aWYgKCF0YWcuZmxvdyAmJiAhdGFnLl8uaW5saW5lKSB7XG5cdFx0XHRcdHRhcmdldC5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgKHRhcmdldC5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cil8fFwiXCIpICsgXCIjXCIgKyBiaW5kSWQgKyBcIl4vXCIgKyBiaW5kSWQgKyBcIl5cIik7XG5cdFx0XHRcdHRhZy5fdGdJZCA9IFwiXCIgKyBiaW5kSWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8vLS0tLS0tLVxuLy8gJC5saW5rXG4vLy0tLS0tLS1cblxuZnVuY3Rpb24gdG1wbExpbmsodG8sIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0cmV0dXJuICRsaW5rKHRoaXMsIHRvLCBmcm9tLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50VmlldywgcHJldk5vZGUsIG5leHROb2RlKTtcbn1cblxuZnVuY3Rpb24gJGxpbmsodG1wbE9yTGlua0V4cHIsIHRvLCBmcm9tLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50VmlldywgcHJldk5vZGUsIG5leHROb2RlKSB7XG5cdC8vIFdoZW4gbGlua2luZyBmcm9tIGEgdGVtcGxhdGUsIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkXG5cdGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG5cdFx0bm9JdGVyYXRpb24gPSBjb250ZXh0OyAvLyBwYXNzaW5nIGJvb2xlYW4gYXMgdGhpcmQgcGFyYW0gLSBub0l0ZXJhdGlvblxuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHQgIT09IFwib2JqZWN0XCIpIHtcblx0XHRjb250ZXh0ID0gdW5kZWZpbmVkOyAvLyBjb250ZXh0IG11c3QgYmUgYSBib29sZWFuIChub0l0ZXJhdGlvbikgb3IgYSBwbGFpbiBvYmplY3Rcblx0fSBlbHNlIHtcblx0XHRjb250ZXh0ID0gJGV4dGVuZCh7fSwgY29udGV4dCk7XG5cdH1cblx0aWYgKHRtcGxPckxpbmtFeHByICYmIHRvKSB7XG5cdFx0dG8gPSB0by5qcXVlcnkgPyB0byA6ICQodG8pOyAvLyB0byBpcyBhIGpxdWVyeSBvYmplY3Qgb3IgYW4gZWxlbWVudCBvciBzZWxlY3RvclxuXG5cdFx0aWYgKCFhY3RpdmVCb2R5KSB7XG5cdFx0XHRhY3RpdmVCb2R5ID0gZG9jdW1lbnQuYm9keTtcblx0XHRcdCQoYWN0aXZlQm9keSlcblx0XHRcdFx0Lm9uKGVsZW1lbnRDaGFuZ2VTdHIsIGVsZW1DaGFuZ2VIYW5kbGVyKVxuXHRcdFx0XHQub24oJ2JsdXInLCAnW2NvbnRlbnRlZGl0YWJsZV0nLCBlbGVtQ2hhbmdlSGFuZGxlcik7XG5cdFx0fVxuXG5cdFx0dmFyIGksIGssIGh0bWwsIHZ3SW5mb3MsIHZpZXcsIHBsYWNlaG9sZGVyUGFyZW50LCB0YXJnZXRFbCwgcmVmcmVzaCwgdG9wTGV2ZWxDYWxsLFxuXHRcdFx0b25SZW5kZXIgPSBhZGRCaW5kaW5nTWFya2Vycyxcblx0XHRcdHJlcGxhY2VNb2RlID0gY29udGV4dCAmJiBjb250ZXh0LnRhcmdldCA9PT0gXCJyZXBsYWNlXCIsXG5cdFx0XHRsID0gdG8ubGVuZ3RoO1xuXG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0dGFyZ2V0RWwgPSB0b1tsXTtcblxuXHRcdFx0cGFyZW50VmlldyA9IHBhcmVudFZpZXcgfHwgJHZpZXcodGFyZ2V0RWwpO1xuXG5cdFx0XHRpZiAodG9wTGV2ZWxDYWxsID0gcGFyZW50VmlldyA9PT0gdG9wVmlldykge1xuXHRcdFx0XHR0b3BWaWV3LmRhdGEgPSAodG9wVmlldy5jdHggPSBjb250ZXh0IHx8IHt9KS5yb290ID0gZnJvbTtcblx0XHRcdH1cblx0XHRcdGlmIChcIlwiICsgdG1wbE9yTGlua0V4cHIgPT09IHRtcGxPckxpbmtFeHByKSB7XG5cdFx0XHRcdC8vIHRtcGxPckxpbmtFeHByIGlzIGEgc3RyaW5nOiB0cmVhdCBhcyBkYXRhLWxpbmsgZXhwcmVzc2lvbi5cblx0XHRcdFx0YWRkRGF0YUJpbmRpbmcodG1wbE9yTGlua0V4cHIsIHRhcmdldEVsLCBwYXJlbnRWaWV3LCB1bmRlZmluZWQsIHRydWUsIGZyb20sIGNvbnRleHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHRtcGxPckxpbmtFeHByLm1hcmt1cCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGNhbGwgdG8gdGVtcGxhdGUubGluaygpXG5cdFx0XHRcdFx0aWYgKHJlcGxhY2VNb2RlKSB7XG5cdFx0XHRcdFx0XHRwbGFjZWhvbGRlclBhcmVudCA9IHRhcmdldEVsLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aHRtbCA9IHRtcGxPckxpbmtFeHByLnJlbmRlcihmcm9tLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50VmlldywgdW5kZWZpbmVkLCBvblJlbmRlcik7XG5cdFx0XHRcdFx0Ly8gVE9ETyBDb25zaWRlciBmaW5kaW5nIGEgd2F5IHRvIGJpbmQgZGF0YSAobGluaykgd2l0aGluIHRlbXBsYXRlIHdpdGhvdXQgaHRtbCBiZWluZyBkaWZmZXJlbnQgZm9yIGVhY2ggdmlldywgdGhlIEhUTUwgY2FuXG5cdFx0XHRcdFx0Ly8gYmUgZXZhbHVhdGVkIG9uY2Ugb3V0c2lkZSB0aGUgd2hpbGUgKGwtLSksIGFuZCBwdXNoZWQgaW50byBhIGRvY3VtZW50IGZyYWdtZW50LCB0aGVuIGNsb25lZCBhbmQgaW5zZXJ0ZWQgYXQgZWFjaCB0YXJnZXQuXG5cblx0XHRcdFx0XHRpZiAocGxhY2Vob2xkZXJQYXJlbnQpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgdGFyZ2V0PVwicmVwbGFjZVwiIG1vZGVcblx0XHRcdFx0XHRcdHByZXZOb2RlID0gdGFyZ2V0RWwucHJldmlvdXNTaWJsaW5nO1xuXHRcdFx0XHRcdFx0bmV4dE5vZGUgPSB0YXJnZXRFbC5uZXh0U2libGluZztcblx0XHRcdFx0XHRcdCQuY2xlYW5EYXRhKFt0YXJnZXRFbF0sIHRydWUpO1xuXHRcdFx0XHRcdFx0cGxhY2Vob2xkZXJQYXJlbnQucmVtb3ZlQ2hpbGQodGFyZ2V0RWwpO1xuXG5cdFx0XHRcdFx0XHR0YXJnZXRFbCA9IHBsYWNlaG9sZGVyUGFyZW50O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRwcmV2Tm9kZSA9IG5leHROb2RlID0gdW5kZWZpbmVkOyAvLyBXaGVuIGxpbmtpbmcgZnJvbSBhIHRlbXBsYXRlLCBwcmV2Tm9kZSBhbmQgbmV4dE5vZGUgcGFyYW1ldGVycyBhcmUgaWdub3JlZFxuXHRcdFx0XHRcdFx0JCh0YXJnZXRFbCkuZW1wdHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAodG1wbE9yTGlua0V4cHIgPT09IHRydWUgJiYgcGFyZW50VmlldyA9PT0gdG9wVmlldykge1xuXHRcdFx0XHRcdC8vICQubGluayh0cnVlLCBzZWxlY3RvciwgZGF0YSwgY3R4KSAtIHdoZXJlIHNlbGVjdG9yIHBvaW50cyB0byBlbGVtIGluIHRvcC1sZXZlbCBjb250ZW50LiAoSWYgbm90IHRvcC1sZXZlbCBjb250ZW50LCBuby1vcClcblx0XHRcdFx0XHRyZWZyZXNoID0ge2xuazogMX07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuLy8gVE9ETyBDb25zaWRlciBkZWZlcnJlZCBsaW5raW5nIEFQSSBmZWF0dXJlIG9uIHBlci10ZW1wbGF0ZSBiYXNpcyAtIHtAeyBpbnN0ZWFkIG9mIHteeyB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VlIHRoZSByZW5kZXJlZCBjb250ZW50XG4vLyBiZWZvcmUgdGhhdCBjb250ZW50IGlzIGxpbmtlZCwgd2l0aCBiZXR0ZXIgcGVyY2VpdmVkIHBlcmYuIEhhdmUgdmlldy5saW5rIHJldHVybiBhIGRlZmVycmVkLCBhbmQgcGFzcyB0aGF0IHRvIG9uQWZ0ZXJMaW5rLi4uXG4vLyBvciBzb21ldGhpbmcgYWxvbmcgdGhvc2UgbGluZXMuXG4vLyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdGlmICh0YXJnZXRFbC5fZGYgJiYgIW5leHROb2RlKSB7XG5cdFx0XHRcdFx0Ly8gV2UgYXJlIGluc2VydGluZyBuZXcgY29udGVudCBhbmQgdGhlIHRhcmdldCBlbGVtZW50IGhhcyBzb21lIGRlZmVycmVkIGJpbmRpbmcgYW5ub3RhdGlvbnMsYW5kIHRoZXJlIGlzIG5vIG5leHROb2RlLlxuXHRcdFx0XHRcdC8vIFRob3NlIHZpZXdzIG1heSBiZSBzdGFsZSB2aWV3cyAodGhhdCB3aWxsIGJlIHJlY3JlYXRlZCBpbiB0aGlzIG5ldyBsaW5raW5nIGFjdGlvbikgc28gd2Ugd2lsbCBmaXJzdCByZW1vdmUgdGhlbVxuXHRcdFx0XHRcdC8vIChpZiBub3QgYWxyZWFkeSByZW1vdmVkKS5cblx0XHRcdFx0XHR2d0luZm9zID0gdmlld0luZm9zKHRhcmdldEVsLl9kZiwgdHJ1ZSwgck9wZW5WaWV3TWFya2Vycyk7XG5cblx0XHRcdFx0XHRmb3IgKGkgPSAwLCBrID0gdndJbmZvcy5sZW5ndGg7IGkgPCBrOyBpKyspIHtcblx0XHRcdFx0XHRcdHZpZXcgPSB2d0luZm9zW2ldO1xuXHRcdFx0XHRcdFx0aWYgKCh2aWV3ID0gdmlld1N0b3JlW3ZpZXcuaWRdKSAmJiB2aWV3LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIHRoZSBfcHJ2IChwcmV2Tm9kZSkgZm9yIGEgdmlldywgcmVtb3ZlIHRoZSB2aWV3XG5cdFx0XHRcdFx0XHRcdC8vIC0gdW5sZXNzIHZpZXcuZGF0YSBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgaXQgaXMgYWxyZWFkeSBiZWluZyByZW1vdmVkXG5cdFx0XHRcdFx0XHRcdHZpZXcucGFyZW50LnJlbW92ZVZpZXdzKHZpZXcuXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNldERlZmVyKHRhcmdldEVsKTsgLy8gcmVtb3ZlIGRlZmVyIHRva2Vuc1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTGluayB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCwgc2luY2UgdGhpcyBpcyBhIGNhbGwgdG8gdGVtcGxhdGUubGluaygpLCBvciB0byAkKGVsKS5saW5rKHRydWUsIC4uLiksXG5cdFx0XHRcdHBhcmVudFZpZXcubGluayhmcm9tLCB0YXJnZXRFbCwgcHJldk5vZGUsIG5leHROb2RlLCBodG1sLCByZWZyZXNoLCBjb250ZXh0KTtcbi8vfSwgMCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodG9wTGV2ZWxDYWxsKSB7XG5cdFx0XHRcdHRvcFZpZXcuZGF0YSA9IHRvcFZpZXcuY3R4ID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdG87IC8vIEFsbG93IGNoYWluaW5nLCB0byBhdHRhY2ggZXZlbnQgaGFuZGxlcnMsIGV0Yy5cbn1cblxuLy8tLS0tLS0tLS0tXG4vLyB2aWV3Lmxpbmtcbi8vLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiB2aWV3TGluayhvdXRlckRhdGEsIHBhcmVudE5vZGUsIHByZXZOb2RlLCBuZXh0Tm9kZSwgaHRtbCwgcmVmcmVzaCwgY29udGV4dCwgdmFsaWRhdGVPbmx5KSB7XG5cdC8vIE9wdGlvbmFsbHkgaW5zZXJ0IEhUTUwgaW50byBET00gdXNpbmcgZG9jdW1lbnRGcmFnbWVudHMgKGFuZCB3cmFwcGluZyBIVE1MIGFwcHJvcHJpYXRlbHkpLlxuXHQvLyBEYXRhLWxpbmsgZXhpc3RpbmcgY29udGVudHMgb2YgcGFyZW50Tm9kZSwgb3IgdGhlIGluc2VydGVkIEhUTUwsIGlmIHByb3ZpZGVkXG5cblx0Ly8gRGVwZW5kaW5nIG9uIHRoZSBjb250ZW50IG1vZGVsIGZvciB0aGUgSFRNTCBlbGVtZW50cywgdGhlIHN0YW5kYXJkIGRhdGEtbGlua2luZyBtYXJrZXJzIGluc2VydGVkIGluIHRoZSBIVE1MIGJ5IGFkZEJpbmRpbmdNYXJrZXJzIGR1cmluZ1xuXHQvLyB0ZW1wbGF0ZSByZW5kZXJpbmcgd2lsbCBiZSBjb252ZXJ0ZWQgZWl0aGVyIHRvIHNjcmlwdCBtYXJrZXIgbm9kZXMgb3IsIGZvciBlbGVtZW50LW9ubHkgY29udGVudCBzZWN0aW9ucywgdG8gZGF0YS1qc3YgZWxlbWVudCBhbm5vdGF0aW9ucy5cblxuXHQvLyBEYXRhLWxpbmtpbmcgd2lsbCB0aGVuIGFkZCBfcHJ2IGFuZCBfbnh0IHRvIHZpZXdzLCB3aGVyZTpcblx0Ly8gICAgIF9wcnY6IFJlZmVyZW5jZXMgdGhlIHByZXZpb3VzIG5vZGUgKHNjcmlwdCBlbGVtZW50IG9mIHR5cGUgXCJqc3YxMjNcIiksIG9yIChmb3IgZWxDbnQ9dHJ1ZSksIHRoZSBmaXJzdCBlbGVtZW50IG5vZGUgaW4gdGhlIHZpZXcgKG9yIGlmIG5vbmUsIHNldCBfcHJ2ID0gX254dClcblx0Ly8gICAgIF9ueHQ6IFJlZmVyZW5jZXMgdGhlIGxhc3Qgbm9kZSAoc2NyaXB0IGVsZW1lbnQgb2YgdHlwZSBcImpzdi8xMjNcIiksIG9yIChmb3IgZWxDbnQ9dHJ1ZSksIHRoZSBuZXh0IGVsZW1lbnQgbm9kZSBhZnRlciB0aGUgdmlldy5cblxuXHQvLz09PT0gbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cdGZ1bmN0aW9uIGNvbnZlcnRNYXJrZXJzKGFsbCwgcHJlY2VkaW5nLCBzZWxmQ2xvc2UsIGNsb3NlVGFnLCBzcGFjZUJlZm9yZSwgaWQsIGJvdW5kSWQsIHNwYWNlQWZ0ZXIsIHRhZzEsIHRhZzIsIGNsb3NlVGFnMiwgc3BhY2VBZnRlckNsb3NlLCBzZWxmQ2xvc2UyLCBlbmRPcGVuVGFnKSB7XG5cdFx0Ly8gckNvbnZlcnRNYXJrZXJzID0gLyhefChcXC8+KXw8XFwvKFxcdyspPnwpKFxccyopKFsjXFwvXVxcZCsoPzpffChcXF4pKSlgKFxccyopKDxcXHcrKD89W1xcc1xcLz5dKSk/fFxccyooPzooPFxcdysoPz1bXFxzXFwvPl0pKXw8XFwvKFxcdyspPihcXHMqKXwoXFwvPilcXHMqfCg+KSkvZyxcblx0XHQvLyAgICAgICAgICAgICAgICAgcHJlYywgc2xmQ2wsIGNsc1RhZywgIHNwQmVmb3JlLCBpZCwgICAgICBibmRJZCAgc3BBZnRlcix0YWcxLCAgICAgICAgICAgICAgICAgICB0YWcyLCAgICAgICAgICAgICAgIGNsVGFnMixzYWMgIHNsZkNsMiwgZW5kT3BlblRhZ1xuXHRcdC8vIENvbnZlcnQgdGhlIG1hcmtlcnMgdGhhdCB3ZXJlIGluY2x1ZGVkIGJ5IGFkZEJpbmRpbmdNYXJrZXJzIGluIHRlbXBsYXRlIG91dHB1dCwgdG8gYXBwcm9wcmlhdGUgRE9NIGFubm90YXRpb25zOlxuXHRcdC8vIGRhdGEtanN2IGF0dHJpYnV0ZXMgKGZvciBlbGVtZW50LW9ubHkgY29udGVudCkgb3Igc2NyaXB0IG1hcmtlciBub2RlcyAod2l0aGluIHBocmFzaW5nIG9yIGZsb3cgY29udGVudCkuXG5cbi8vIFRPRE8gY29uc2lkZXIgZGV0ZWN0aW5nICdxdW90ZWQnIGNvbnRleHRzIChhdHRyaWJ1dGUgc3RyaW5ncykgc28gdGhhdCBhdHRyaWJ1dGUgZW5jb2RpbmcgZG9lcyBub3QgbmVlZCB0byBlbmNvZGUgPlxuLy8gQ3VycmVudGx5IHJBdHRyRW5jb2RlID0gL1s+PFwiJyZdL2cgaW5jbHVkZXMgJz4nIGVuY29kaW5nIGluIG9yZGVyIHRvIGF2b2lkIGVycm9uZW91cyBwYXJzaW5nIG9mIDxzcGFuIHRpdGxlPVwiJmx0O2EvPlwiPjwvc3Bhbj5cIj5cblx0XHR2YXIgZXJyb3JNc2csIGJuZElkLFxuXHRcdFx0ZW5kT2ZFbENudCA9IFwiXCI7XG5cdFx0aWYgKGVuZE9wZW5UYWcpIHtcblx0XHRcdGluVGFnID0gMDtcblx0XHRcdHJldHVybiBhbGw7XG5cdFx0fVxuXHRcdHRhZyA9IHRhZzEgfHwgdGFnMiB8fCBcIlwiO1xuXHRcdGNsb3NlVGFnID0gY2xvc2VUYWcgfHwgY2xvc2VUYWcyO1xuXHRcdHNlbGZDbG9zZSA9IHNlbGZDbG9zZSB8fCBzZWxmQ2xvc2UyO1xuXHRcdGlmIChpc1ZvaWQgJiYgIXNlbGZDbG9zZSAmJiAoICFhbGwgfHwgY2xvc2VUYWcgfHwgdGFnIHx8IGlkICYmICFpblRhZykpIHsgLy8gIWFsbCA9IGVuZCBvZiBzdHJpbmdcblx0XHRcdGlzVm9pZCA9IHVuZGVmaW5lZDtcblx0XHRcdHBhcmVudFRhZyA9IHRhZ1N0YWNrLnNoaWZ0KCk7IC8vIHByZWNlZGluZyB0YWcgd2FzIGEgdm9pZCBlbGVtZW50LCB3aXRoIG5vIGNsb3Npbmcgc2xhc2gsIHN1Y2ggYXMgPGJyPi5cblx0XHR9XG5cdFx0Y2xvc2VUYWcgPSBjbG9zZVRhZyB8fCBzZWxmQ2xvc2U7XG5cdFx0aWYgKGNsb3NlVGFnKSB7XG5cdFx0XHRpblRhZyA9IDA7XG5cdFx0XHRpc1ZvaWQgPSB1bmRlZmluZWQ7XG5cdFx0XHQvLyBUT0RPOiBzbWFydCBpbnNlcnRpb24gb2YgPHRib2R5PiAtIHRvIGJlIGNvbXBsZXRlZCBmb3Igcm9idXN0IGluc2VydGlvbiBvZiBkZWZlcnJlZCBiaW5kaW5ncyBldGMuXG5cdFx0XHQvL2lmIChjbG9zZVRhZyA9PT0gXCJ0YWJsZVwiICYmIHBhcmVudFRhZyA9PT0gXCJ0Ym9keVwiKSB7XG5cdFx0XHQvL1x0cHJlY2VkaW5nID0gXCI8L3Rib2R5PlwiICsgcHJlY2VkaW5nO1xuXHRcdFx0Ly9cdHBhcmVudFRhZyA9IFwidGFibGVcIjtcblx0XHRcdC8vXHR0YWdTdGFjay5zaGlmdCgpO1xuXHRcdFx0Ly99XG5cdFx0XHRpZiAodmFsaWRhdGUpIHtcblx0XHRcdFx0aWYgKHNlbGZDbG9zZSB8fCBzZWxmQ2xvc2UyKSB7XG5cdFx0XHRcdFx0aWYgKCF2b2lkRWxlbXNbcGFyZW50VGFnXSAmJiAhLztzdmc7fDttYXRoOy8udGVzdChcIjtcIiArIHRhZ1N0YWNrLmpvaW4oXCI7XCIpICsgXCI7XCIpKSB7XG5cdFx0XHRcdFx0XHQvLyBPbmx5IHNlbGYtY2xvc2luZyBlbGVtZW50cyBtdXN0IGJlIGxlZ2l0aW1hdGUgdm9pZCBlbGVtZW50cywgc3VjaCBhcyA8YnIvPiwgcGVyIEhUTUwgc2NoZW1hLFxuXHRcdFx0XHRcdFx0Ly8gb3IgdW5kZXIgc3ZnIG9yIG1hdGggZm9yZWlnbiBuYW1lc3BhY2UgZWxlbWVudHMuXG5cdFx0XHRcdFx0XHRlcnJvck1zZyA9IFwiJzxcIiArIHBhcmVudFRhZyArIFwiLi4uL1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh2b2lkRWxlbXNbY2xvc2VUYWddKSB7XG5cdFx0XHRcdFx0ZXJyb3JNc2cgPSBcIic8L1wiICsgY2xvc2VUYWc7IC8vIGNsb3NpbmcgdGFnIHN1Y2ggYXMgPC9pbnB1dD5cblx0XHRcdFx0fSBlbHNlIGlmICghdGFnU3RhY2subGVuZ3RoIHx8IGNsb3NlVGFnICE9PSBwYXJlbnRUYWcpIHtcblx0XHRcdFx0XHRlcnJvck1zZyA9IFwiTWlzbWF0Y2g6ICc8L1wiICsgY2xvc2VUYWc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGVycm9yTXNnKSB7XG5cdFx0XHRcdFx0c3ludGF4RXJyb3IoZXJyb3JNc2cgKyBcIj4nIGluOlxcblwiICsgaHRtbCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHByZXZFbENudCA9IGVsQ250O1xuXHRcdFx0cGFyZW50VGFnID0gdGFnU3RhY2suc2hpZnQoKTtcblx0XHRcdGVsQ250ID0gZWxDb250ZW50W3BhcmVudFRhZ107XG5cdFx0XHRjbG9zZVRhZzIgPSBjbG9zZVRhZzIgPyAoXCI8L1wiICsgY2xvc2VUYWcyICsgXCI+XCIpIDogXCJcIjtcblx0XHRcdGlmIChwcmV2RWxDbnQpIHtcblx0XHRcdFx0Ly8gSWYgdGhlcmUgYXJlIGlkcyAobWFya2VycyBzaW5jZSB0aGUgbGFzdCB0YWcpLCBtb3ZlIHRoZW0gdG8gdGhlIGRlZmVyIHN0cmluZ1xuXHRcdFx0XHRkZWZlciArPSBpZHM7XG5cdFx0XHRcdGlkcyA9IFwiXCI7XG5cdFx0XHRcdGlmICghZWxDbnQpIHtcblx0XHRcdFx0XHRlbmRPZkVsQ250ID0gY2xvc2VUYWcyICsgb3BlblNjcmlwdCArIFwiQFwiICsgZGVmZXIgKyBjbG9zZVNjcmlwdCArIChzcGFjZUFmdGVyQ2xvc2UgfHwgXCJcIik7XG5cdFx0XHRcdFx0ZGVmZXIgPSBkZWZlclN0YWNrLnNoaWZ0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXIgKz0gXCItXCI7IC8vIFdpbGwgYmUgdXNlZCBmb3Igc3RlcHBpbmcgYmFjayB0aHJvdWdoIGRlZmVycmVkIHRva2Vuc1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChlbENudCkge1xuXHRcdFx0Ly8gZWxDb250ZW50IG1hcHMgdGFnTmFtZXMgd2hpY2ggaGF2ZSBvbmx5IGVsZW1lbnQgY29udGVudCwgc28gbWF5IG5vdCBzdXBwb3J0IHNjcmlwdCBub2Rlcy5cblx0XHRcdC8vIFdlIGFyZSBpbiBlbGVtZW50LW9ubHkgY29udGVudCwgY2FuIHJlbW92ZSB3aGl0ZSBzcGFjZSwgYW5kIHVzZSBkYXRhLWpzdiBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIGFzIG1hcmtlcnNcblx0XHRcdC8vIEV4YW1wbGU6IDx0ciBkYXRhLWpzdj1cIi8yXyM2X1wiPiAtIGNsb3NlIG1hcmtlciBmb3IgdmlldyAyIGFuZCBvcGVuIG1hcmtlciBmb3IgdmlldyA2XG5cblx0XHRcdGlmIChpZCkge1xuXHRcdFx0XHQvLyBhcHBlbmQgbWFya2VyIGZvciB0aGlzIGlkLCB0byBpZHMgc3RyaW5nXG5cdFx0XHRcdGlkcyArPSBpZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHByZWNlZGluZyA9IChjbG9zZVRhZzIgfHwgc2VsZkNsb3NlMiB8fCBcIlwiKTtcblx0XHRcdH1cblx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0Ly8gVE9ETzogc21hcnQgaW5zZXJ0aW9uIG9mIDx0Ym9keT4gLSB0byBiZSBjb21wbGV0ZWQgZm9yIHJvYnVzdCBpbnNlcnRpb24gb2YgZGVmZXJyZWQgYmluZGluZ3MgZXRjLlxuXHRcdFx0XHQvL2lmICh0YWcgPT09IFwiPHRyXCIgJiYgcGFyZW50VGFnID09PSBcInRhYmxlXCIpIHtcblx0XHRcdFx0Ly9cdHRhZ1N0YWNrLnVuc2hpZnQocGFyZW50VGFnKTtcblx0XHRcdFx0Ly9cdHBhcmVudFRhZyA9IFwidGJvZHlcIjtcblx0XHRcdFx0Ly9cdHByZWNlZGluZyArPSBcIjxcIiArIHBhcmVudFRhZyArIFwiPlwiO1xuXHRcdFx0XHQvL1x0aWYgKGRlZmVyKSB7XG5cdFx0XHRcdC8vXHRcdGRlZmVyICs9IFwiK1wiOyAvLyBXaWxsIGJlIHVzZWQgZm9yIHN0ZXBwaW5nIGJhY2sgdGhyb3VnaCBkZWZlcnJlZCB0b2tlbnNcblx0XHRcdFx0Ly9cdH1cblx0XHRcdFx0Ly9cdC8vIFRPRE86IG1vdmUgdGhpcyB0byBkZXNpZ24tdGltZSB2YWxpZGF0aW9uIGNoZWNrXG5cdFx0XHRcdC8vXHQvL1x0ZXJyb3IoJ1wiJyArIHBhcmVudFRhZyArICdcIiBoYXMgaW5jb3JyZWN0IHBhcmVudCB0YWcnKTtcblx0XHRcdFx0Ly99XG5cdFx0XHRcdHByZWNlZGluZyArPSB0YWc7XG5cdFx0XHRcdGlmIChpZHMpIHtcblx0XHRcdFx0XHRwcmVjZWRpbmcgKz0gJyAnICsganN2QXR0clN0ciArICc9XCInICsgaWRzICsgJ1wiJztcblx0XHRcdFx0XHRpZHMgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdlIGFyZSBpbiBwaHJhc2luZyBvciBmbG93IGNvbnRlbnQsIHNvIHVzZSBzY3JpcHQgbWFya2VyIG5vZGVzXG5cdFx0XHQvLyBFeGFtcGxlOiA8c2NyaXB0IHR5cGU9XCJqc3YzL1wiPjwvc2NyaXB0PiAtIGRhdGEtbGlua2VkIHRhZywgY2xvc2UgbWFya2VyXG5cdFx0XHQvLyBXZSB2YWxpZGF0ZSB3aXRoIGluVGFnIHNvIG5vIHNjcmlwdCBtYXJrZXJzIGFyZSBpbnNlcnRlZCBpbiBhdHRyaWJ1dGUgY29udGV4dCBlLmcuIGZvcjpcblx0XHRcdC8vIFwiPHRhYmxlIHt7aWYgLi4ufX0uLi57ey9pZn19Li4uID5cIiBvciBcIjx0YWJsZSB7e2lmIC4uLn19Li4uPiAuLi57ey9pZn19Li4uXCJcblx0XHRcdHByZWNlZGluZyA9IGlkXG5cdFx0XHRcdD8gKHByZWNlZGluZyArIGVuZE9mRWxDbnQgKyBzcGFjZUJlZm9yZSArIChpblRhZyA/IFwiXCIgOiBvcGVuU2NyaXB0ICsgaWQgKyBjbG9zZVNjcmlwdCkrIHNwYWNlQWZ0ZXIgKyB0YWcpXG5cdFx0XHRcdDogZW5kT2ZFbENudCB8fCBhbGw7XG5cdFx0fVxuXG5cdFx0aWYgKHZhbGlkYXRlICYmIGJvdW5kSWQpIHtcblx0XHRcdGlmIChpblRhZykge1xuXHRcdFx0XHQvLyBKc1ZpZXdzIGRhdGEtbGlua2luZyB0YWdzIGFyZSBub3QgYWxsb3dlZCB3aXRoaW4gZWxlbWVudCBtYXJrdXAuXG5cdFx0XHRcdC8vIFNlZSBqc3ZpZXdzL2lzc3Vlcy8zMDNcblx0XHRcdFx0c3ludGF4RXJyb3IoJ3teeyB3aXRoaW4gZWxlbSBtYXJrdXAgKCcgKyBpblRhZyArICcgKS4gVXNlIGRhdGEtbGluaz1cIi4uLlwiJyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaWQuY2hhckF0KDApID09PSBcIiNcIikge1xuXHRcdFx0XHR0YWdTdGFjay51bnNoaWZ0KGlkLnNsaWNlKDEpKTtcblx0XHRcdH0gZWxzZSBpZiAoaWQuc2xpY2UoMSkgIT09IChibmRJZCA9IHRhZ1N0YWNrLnNoaWZ0KCkpKSB7XG5cdFx0XHRcdC8vIFNlZSBqc3ZpZXdzL2lzc3Vlcy8yMTNcblx0XHRcdFx0c3ludGF4RXJyb3IoJ0Nsb3NpbmcgdGFnIGZvciB7XnsuLi59fSB1bmRlciBkaWZmZXJlbnQgZWxlbTogPCcgKyBibmRJZCArICc+Jyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0YWcpIHtcblx0XHRcdGluVGFnID0gdGFnO1xuXHRcdFx0Ly8gSWYgdGhlcmUgYXJlIGlkcyAobWFya2VycyBzaW5jZSB0aGUgbGFzdCB0YWcpLCBtb3ZlIHRoZW0gdG8gdGhlIGRlZmVyIHN0cmluZ1xuXHRcdFx0dGFnU3RhY2sudW5zaGlmdChwYXJlbnRUYWcpO1xuXHRcdFx0cGFyZW50VGFnID0gdGFnLnNsaWNlKDEpO1xuXHRcdFx0aWYgKHZhbGlkYXRlICYmIHRhZ1N0YWNrWzBdICYmIHRhZ1N0YWNrWzBdID09PSBiYWRQYXJlbnRbcGFyZW50VGFnXSkge1xuXHRcdFx0XHQvLyBNaXNzaW5nIDx0Ym9keT5cblx0XHRcdFx0Ly8gVE9ETzogcmVwbGFjZSB0aGlzIGJ5IHNtYXJ0IGluc2VydGlvbiBvZiA8dGJvZHk+IHRhZ3Ncblx0XHRcdFx0ZXJyb3IoJ1BhcmVudCBvZiA8dHI+IG11c3QgYmUgPHRib2R5PicpO1xuXHRcdFx0fVxuXHRcdFx0aXNWb2lkID0gdm9pZEVsZW1zW3BhcmVudFRhZ107XG5cdFx0XHRpZiAoKGVsQ250ID0gZWxDb250ZW50W3BhcmVudFRhZ10pICYmICFwcmV2RWxDbnQpIHtcblx0XHRcdFx0ZGVmZXJTdGFjay51bnNoaWZ0KGRlZmVyKTtcblx0XHRcdFx0ZGVmZXIgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdFx0cHJldkVsQ250ID0gZWxDbnQ7XG4vL1RPRE8gQ29uc2lkZXIgcHJvdmlkaW5nIHZhbGlkYXRpb24gd2hpY2ggdGhyb3dzIGlmIHlvdSBwbGFjZSA8c3Bhbj4gYXMgY2hpbGQgb2YgPHRyPiwgZXRjLiAtIHNpbmNlIGlmIG5vdCBjYXVnaHQsXG4vL3RoaXMgY2FuIGNhdXNlIGVycm9ycyBzdWJzZXF1ZW50bHkgd2hpY2ggYXJlIGRpZmZpY3VsdCB0byBkZWJ1Zy5cbi8vXHRcdFx0XHRpZiAoZWxDb250ZW50W3RhZ1N0YWNrWzBdXT4yICYmICFlbENudCkge1xuLy9cdFx0XHRcdFx0ZXJyb3IocGFyZW50VGFnICsgXCIgaW4gXCIgKyB0YWdTdGFja1swXSk7XG4vL1x0XHRcdFx0fVxuXHRcdFx0aWYgKGRlZmVyICYmIGVsQ250KSB7XG5cdFx0XHRcdGRlZmVyICs9IFwiK1wiOyAvLyBXaWxsIGJlIHVzZWQgZm9yIHN0ZXBwaW5nIGJhY2sgdGhyb3VnaCBkZWZlcnJlZCB0b2tlbnNcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHByZWNlZGluZztcblx0fVxuXG5cdGZ1bmN0aW9uIHByb2Nlc3NWaWV3SW5mb3ModndJbmZvcywgdGFyZ2V0UGFyZW50KSB7XG5cdFx0Ly8gSWYgdGFyZ2V0UGFyZW50LCB3ZSBhcmUgcHJvY2Vzc2luZyB2aWV3SW5mb3MgKHdoaWNoIG1heSBpbmNsdWRlIG5hdmlnYXRpb24gdGhyb3VnaCAnKy0nIHBhdGhzKSBhbmQgaG9va2luZyB1cCB0byB0aGUgcmlnaHQgcGFyZW50RWxlbSBldGMuXG5cdFx0Ly8gKGFuZCBlbGVtIG1heSBhbHNvIGJlIGRlZmluZWQgLSB0aGUgbmV4dCBub2RlKVxuXHRcdC8vIElmIG5vIHRhcmdldFBhcmVudCwgdGhlbiB3ZSBhcmUgcHJvY2Vzc2luZyB2aWV3SW5mb3Mgb24gbmV3bHkgaW5zZXJ0ZWQgY29udGVudFxuXHRcdHZhciBkZWZlclBhdGgsIGRlZmVyQ2hhciwgYmluZENoYXIsIHBhcmVudEVsZW0sIGlkLCBvbkFmdENyLCBkZWVwLFxuXHRcdFx0YWRkZWRCaW5kRWxzID0gW107XG5cblx0XHQvLyBJbiBlbENudCBjb250ZXh0IChlbGVtZW50LW9ubHkgY29udGVudCBtb2RlbCksIHByZXZOb2RlIGlzIHRoZSBmaXJzdCBub2RlIGFmdGVyIHRoZSBvcGVuLCBuZXh0Tm9kZSBpcyB0aGUgZmlyc3Qgbm9kZSBhZnRlciB0aGUgY2xvc2UuXG5cdFx0Ly8gSWYgYm90aCBhcmUgbnVsbC91bmRlZmluZWQsIHRoZW4gb3BlbiBhbmQgY2xvc2UgYXJlIGF0IGVuZCBvZiBwYXJlbnQgY29udGVudCwgc28gdGhlIHZpZXcgaXMgZW1wdHksIGFuZCBpdHMgcGxhY2Vob2xkZXIgaXMgdGhlXG5cdFx0Ly8gJ2xhc3RDaGlsZCcgb2YgdGhlIHBhcmVudE5vZGUuIElmIHRoZXJlIGlzIGEgcHJldk5vZGUsIHRoZW4gaXQgaXMgZWl0aGVyIHRoZSBmaXJzdCBub2RlIGluIHRoZSB2aWV3LCBvciB0aGUgdmlldyBpcyBlbXB0eSBhbmRcblx0XHQvLyBpdHMgcGxhY2Vob2xkZXIgaXMgdGhlICdwcmV2aW91c1NpYmxpbmcnIG9mIHRoZSBwcmV2Tm9kZSwgd2hpY2ggaXMgYWxzbyB0aGUgbmV4dE5vZGUuXG5cdFx0aWYgKHZ3SW5mb3MpIHtcblx0XHRcdGlmICh2d0luZm9zLl90a25zLmNoYXJBdCgwKSA9PT0gXCJAXCIpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIHByb2Nlc3NpbmcgbmV3bHkgaW5zZXJ0ZWQgY29udGVudC4gVGhpcyBpcyBhIHNwZWNpYWwgc2NyaXB0IGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZCBpbiBjb252ZXJ0TWFya2VycygpIHRvIHByb2Nlc3MgZGVmZXJyZWQgYmluZGluZ3MsXG5cdFx0XHRcdC8vIGFuZCBpbnNlcnRlZCBmb2xsb3dpbmcgdGhlIHRhcmdldCBwYXJlbnQgZWxlbWVudCAtIGJlY2F1c2Ugbm8gZWxlbWVudCB0YWdzIChvdXRzaWRlIGVsQ250KSB3ZXJlIGVuY291bnRlcmVkIHRvIGNhcnJ5IHRob3NlIGJpbmRpbmcgdG9rZW5zLlxuXHRcdFx0XHQvLyBXZSB3aWxsIHN0ZXAgYmFjayBmcm9tIHRoZSBwcmVjZWRpbmcgc2libGluZyBvZiB0aGlzIGVsZW1lbnQsIGxvb2tpbmcgYXQgdGFyZ2V0UGFyZW50IGVsZW1lbnRzIHVudGlsIHdlIGZpbmQgdGhlIG9uZSB0aGF0IHRoZSBjdXJyZW50IGJpbmRpbmdcblx0XHRcdFx0Ly8gdG9rZW4gYmVsb25ncyB0by4gU2V0IGVsZW0gdG8gbnVsbCAodGhlIHNwZWNpYWwgc2NyaXB0IGVsZW1lbnQpLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIERPTS5cblx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gZWxlbS5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtKTtcblx0XHRcdFx0ZWxlbSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGxlbiA9IHZ3SW5mb3MubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGxlbi0tKSB7XG5cdFx0XHRcdHZ3SW5mbyA9IHZ3SW5mb3NbbGVuXTtcbi8vaWYgKHByZXZJZHMuaW5kZXhPZih2d0luZm8udG9rZW4pIDwgMCkgeyAvLyBUaGlzIHRva2VuIGlzIGEgbmV3bHkgY3JlYXRlZCB2aWV3IG9yIHRhZyBiaW5kaW5nXG5cdFx0XHRcdGJpbmRDaGFyID0gdndJbmZvLmNoO1xuXHRcdFx0XHRpZiAoZGVmZXJQYXRoID0gdndJbmZvLnBhdGgpIHtcblx0XHRcdFx0XHQvLyBXZSBoYXZlIGEgJ2RlZmVycmVkIHBhdGgnXG5cdFx0XHRcdFx0aiA9IGRlZmVyUGF0aC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdHdoaWxlIChkZWZlckNoYXIgPSBkZWZlclBhdGguY2hhckF0KGotLSkpIHtcblx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgXCIrXCIgYW5kXCItXCIgY2hhcmFjdGVycyB0byBuYXZpZ2F0ZSB0aGUgcGF0aCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBwYXJlbnQgbm9kZSB3aGVyZSB0aGUgZGVmZXJyZWQgYmluZGluZ3Mgb2N1cnJlZFxuXHRcdFx0XHRcdFx0aWYgKGRlZmVyQ2hhciA9PT0gXCIrXCIpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGRlZmVyUGF0aC5jaGFyQXQoaikgPT09IFwiLVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0ai0tO1xuXHRcdFx0XHRcdFx0XHRcdHRhcmdldFBhcmVudCA9IHRhcmdldFBhcmVudC5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0UGFyZW50ID0gdGFyZ2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldFBhcmVudCA9IHRhcmdldFBhcmVudC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBOb3RlOiBDYW4gdXNlIHByZXZpb3VzU2libGluZyBhbmQgbGFzdENoaWxkLCBub3QgcHJldmlvdXNFbGVtZW50U2libGluZyBhbmQgbGFzdEVsZW1lbnRDaGlsZCxcblx0XHRcdFx0XHRcdC8vIHNpbmNlIHdlIGhhdmUgcmVtb3ZlZCB3aGl0ZSBzcGFjZSB3aXRoaW4gZWxDbnQuIEhlbmNlIHN1cHBvcnQgSUUgPCA5XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChiaW5kQ2hhciA9PT0gXCJeXCIpIHtcblx0XHRcdFx0XHRpZiAodGFnID0gYmluZGluZ1N0b3JlW2lkID0gdndJbmZvLmlkXSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGJpbmRpbmcgbWF5IGhhdmUgYmVlbiBkZWxldGVkLCBmb3IgZXhhbXBsZSBpbiBhIGRpZmZlcmVudCBoYW5kbGVyIHRvIGFuIGFycmF5IGNvbGxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSB0YWcgYmluZGluZ1xuXHRcdFx0XHRcdFx0ZGVlcCA9IHRhcmdldFBhcmVudCAmJiAoIWVsZW0gfHwgZWxlbS5wYXJlbnROb2RlICE9PSB0YXJnZXRQYXJlbnQpOyAvLyBXZSBhcmUgc3RlcHBpbmcgYmFjayBsb29raW5nIGZvciB0aGUgcmlnaHQgdGFyZ2V0UGFyZW50LFxuXHRcdFx0XHRcdFx0Ly8gb3Igd2UgYXJlIGxpbmtpbmcgZXhpc3RpbmcgY29udGVudCBhbmQgdGhpcyBlbGVtZW50IGlzIGluIGVsQ250LCBub3QgYW4gaW1tZWRpYXRlIGNoaWxkIG9mIHRoZSB0YXJnZXRQYXJlbnQuXG5cdFx0XHRcdFx0XHRpZiAoIWVsZW0gfHwgZGVlcCkge1xuXHRcdFx0XHRcdFx0XHR0YWcucGFyZW50RWxlbSA9IHRhcmdldFBhcmVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICh2d0luZm8uZWxDbnQgJiYgZGVlcCkge1xuXHRcdFx0XHRcdFx0XHQvLyBXaXRoIGVsZW1lbnQgb25seSBjb250ZW50LCBpZiB0aGVyZSBpcyBubyBmb2xsb3dpbmcgZWxlbWVudCwgb3IgaWYgdGhlIGJpbmRpbmcgaXMgZGVlcGVyIHRoYW4gdGhlIGZvbGxvd2luZyBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdC8vIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhlIG9wZW4gb3IgY2xvc2UgdG9rZW4gYXMgYSBkZWZlcnJlZCBiaW5kaW5nIGFubm90YXRpb24gb24gdGhlIHBhcmVudFxuXHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRQYXJlbnQsICh2d0luZm8ub3BlbiA/IFwiI1wiIDogXCIvXCIpICsgaWQgKyBiaW5kQ2hhciArICh0YXJnZXRQYXJlbnQuX2RmIHx8IFwiXCIpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYW4gb3BlbiBvciBjbG9zZSBtYXJrZXIgZm9yIGEgZGF0YS1saW5rZWQgdGFnIHteey4uLn19LiBBZGQgaXQgdG8gYmluZEVscy5cblx0XHRcdFx0XHRcdGFkZGVkQmluZEVscy5wdXNoKFtkZWVwID8gbnVsbCA6IGVsZW0sIHZ3SW5mb10pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh2aWV3ID0gdmlld1N0b3JlW2lkID0gdndJbmZvLmlkXSkge1xuXHRcdFx0XHRcdC8vIFRoZSB2aWV3IG1heSBoYXZlIGJlZW4gZGVsZXRlZCwgZm9yIGV4YW1wbGUgaW4gYSBkaWZmZXJlbnQgaGFuZGxlciB0byBhbiBhcnJheSBjb2xsZWN0aW9uQ2hhbmdlIGV2ZW50XG5cdFx0XHRcdFx0aWYgKCF2aWV3LnBhcmVudEVsZW0pIHtcblx0XHRcdFx0XHRcdC8vIElmIHZpZXcgaXMgbm90IGFscmVhZHkgZXh0ZW5kZWQgZm9yIEpzVmlld3MsIGV4dGVuZCBhbmQgaW5pdGlhbGl6ZSB0aGUgdmlldyBvYmplY3QgY3JlYXRlZCBpbiBKc1JlbmRlciwgYXMgYSBKc1ZpZXdzIHZpZXdcblx0XHRcdFx0XHRcdHZpZXcucGFyZW50RWxlbSA9IHRhcmdldFBhcmVudCB8fCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSB8fCBwYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0dmlldy5fLm9uUmVuZGVyID0gYWRkQmluZGluZ01hcmtlcnM7XG5cdFx0XHRcdFx0XHR2aWV3Ll8ub25BcnJheUNoYW5nZSA9IGFycmF5Q2hhbmdlSGFuZGxlcjtcblx0XHRcdFx0XHRcdHNldEFycmF5Q2hhbmdlTGluayh2aWV3KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGFyZW50RWxlbSA9IHZpZXcucGFyZW50RWxlbTtcblx0XHRcdFx0XHRpZiAodndJbmZvLm9wZW4pIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYW4gJ29wZW4gdmlldycgbm9kZSAocHJlY2VkaW5nIHNjcmlwdCBtYXJrZXIgbm9kZSxcblx0XHRcdFx0XHRcdC8vIG9yIGlmIGVsQ250LCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgdmlldywgd2l0aCBhIGRhdGEtanN2IGFubm90YXRpb24pIGZvciBiaW5kaW5nXG5cdFx0XHRcdFx0XHR2aWV3Ll9lbENudCA9IHZ3SW5mby5lbENudDtcblx0XHRcdFx0XHRcdGlmICh0YXJnZXRQYXJlbnQgJiYgIWVsZW0pIHtcblx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0UGFyZW50LCBcIiNcIiArIGlkICsgYmluZENoYXIgKyAodGFyZ2V0UGFyZW50Ll9kZiB8fCBcIlwiKSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBObyB0YXJnZXRQYXJlbnQsIHNvIHRoZXJlIGlzIGEgLl9ueHQgZWxlbSAoYW5kIHRoaXMgaXMgcHJvY2Vzc2luZyB0b2tlbnMgb24gdGhlIGVsZW0pXG5cdFx0XHRcdFx0XHRcdGlmICghdmlldy5fcHJ2KSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgcmVtb3ZlU3ViU3RyKHBhcmVudEVsZW0uX2RmLCBcIiNcIiArIGlkICsgYmluZENoYXIpKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR2aWV3Ll9wcnYgPSBlbGVtO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgJ2Nsb3NlIHZpZXcnIG1hcmtlciBub2RlIGZvciBiaW5kaW5nXG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0UGFyZW50ICYmICghZWxlbSB8fCBlbGVtLnBhcmVudE5vZGUgIT09IHRhcmdldFBhcmVudCkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhlcmUgaXMgbm8gLl9ueHQgc28gYWRkIHRva2VuIHRvIF9kZi4gSXQgaXMgZGVmZXJyZWQuXG5cdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldFBhcmVudCwgXCIvXCIgKyBpZCArIGJpbmRDaGFyICsgKHRhcmdldFBhcmVudC5fZGYgfHwgXCJcIikpO1xuXHRcdFx0XHRcdFx0XHR2aWV3Ll9ueHQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsZW0pIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyB2aWV3IGRpZCBub3QgaGF2ZSBhIC5fbnh0LCBidXQgaGFzIG9uZSBub3csIHNvIHRva2VuIG1heSBiZSBpbiBfZGYsIGFuZCBtdXN0IGJlIHJlbW92ZWQuIChObyBsb25nZXIgZGVmZXJyZWQpXG5cdFx0XHRcdFx0XHRcdGlmICghdmlldy5fbnh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgcmVtb3ZlU3ViU3RyKHBhcmVudEVsZW0uX2RmLCBcIi9cIiArIGlkICsgYmluZENoYXIpKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR2aWV3Ll9ueHQgPSBlbGVtO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG9uQWZ0Q3IgPSB2aWV3LmN0eCAmJiB2aWV3LmN0eFtvbkFmdGVyQ3JlYXRlU3RyXSB8fCBvbkFmdGVyQ3JlYXRlKSB7XG5cdFx0XHRcdFx0XHRcdG9uQWZ0Q3IuY2FsbCh2aWV3LmN0eC50YWcsIHZpZXcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cbi8vfVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsZW4gPSBhZGRlZEJpbmRFbHMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGxlbi0tKSB7XG5cdFx0XHRcdC8vIFRoZXNlIHdlcmUgYWRkZWQgaW4gcmV2ZXJzZSBvcmRlciB0byBhZGRlZEJpbmRFbHMuIFdlIHB1c2ggdGhlbSBpbiBCaW5kRWxzIGluIHRoZSBjb3JyZWN0IG9yZGVyLlxuXHRcdFx0XHRiaW5kRWxzLnB1c2goYWRkZWRCaW5kRWxzW2xlbl0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gIXZ3SW5mb3MgfHwgdndJbmZvcy5lbENudDtcblx0fVxuXG5cdGZ1bmN0aW9uIGdldFZpZXdJbmZvcyh2d0luZm9zKSB7XG5cdFx0Ly8gVXNlZCBieSB2aWV3LmNoaWxkVGFncygpIGFuZCB0YWcuY2hpbGRUYWdzKClcblx0XHQvLyBTaW1pbGFyIHRvIHByb2Nlc3NWaWV3SW5mb3MgaW4gaG93IGl0IHN0ZXBzIHRocm91Z2ggYmluZGluZ3MgdG8gZmluZCB0YWdzLiBPbmx5IGZpbmRzIGRhdGEtbGlua2VkIHRhZ3MuXG5cdFx0dmFyIGxldmVsLCBwYXJlbnRUYWcsIG5hbWVkO1xuXG5cdFx0aWYgKHZ3SW5mb3MpIHtcblx0XHRcdGxlbiA9IHZ3SW5mb3MubGVuZ3RoO1xuXHRcdFx0Zm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7XG5cdFx0XHRcdHZ3SW5mbyA9IHZ3SW5mb3Nbal07XG5cdFx0XHRcdC8vIFRoaXMgaXMgYW4gb3BlbiBtYXJrZXIgZm9yIGEgZGF0YS1saW5rZWQgdGFnIHteey4uLn19LCB3aXRoaW4gdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyB3aG9zZSBpZCBpcyBnZXQuaWQuIEFkZCBpdCB0byBiaW5kRWxzLlxuXHRcdFx0XHQvLyBOb3RlIC0gaWYgYmluZGluZ1N0b3JlW3Z3SW5mby5pZF0uX2lzID09PSBcInRhZ1wiIHRoZW4gZ2V0Vmlld0luZm9zIGlzIGJlaW5nIGNhbGxlZCB0b28gc29vbiAtIGR1cmluZyBmaXJzdCBsaW5raW5nIHBhc3Ncblx0XHRcdFx0cGFyZW50VGFnID0gdGFnID0gYmluZGluZ1N0b3JlW3Z3SW5mby5pZF0ubGlua0N0eC50YWc7XG5cdFx0XHRcdG5hbWVkID0gdGFnLnRhZ05hbWUgPT09IHRhZ05hbWU7XG5cdFx0XHRcdGlmICghdGFnLmZsb3cgfHwgbmFtZWQpIHtcblx0XHRcdFx0XHRpZiAoIWRlZXApIHtcblx0XHRcdFx0XHRcdGxldmVsID0gMTtcblx0XHRcdFx0XHRcdHdoaWxlIChwYXJlbnRUYWcgPSBwYXJlbnRUYWcucGFyZW50KSB7XG5cdFx0XHRcdFx0XHRcdGxldmVsKys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0YWdEZXB0aCA9IHRhZ0RlcHRoIHx8IGxldmVsOyAvLyBUaGUgbGV2ZWwgb2YgdGhlIGZpcnN0IHRhZyBlbmNvdW50ZXJlZC5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKChkZWVwIHx8IGxldmVsID09PSB0YWdEZXB0aCkgJiYgKCF0YWdOYW1lIHx8IG5hbWVkKSkge1xuXHRcdFx0XHRcdFx0Ly8gRmlsdGVyIG9uIHRvcC1sZXZlbCBvciB0YWdOYW1lIGFzIGFwcHJvcHJpYXRlXG5cdFx0XHRcdFx0XHR0YWdzLnB1c2godGFnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBkYXRhTGluaygpIHtcblx0XHQvLz09PT09PT09PT09PT09PT0gRGF0YS1saW5rIGFuZCBmaXh1cCBvZiBkYXRhLWpzdiBhbm5vdGF0aW9ucyA9PT09PT09PT09PT09PT09XG5cdFx0dmFyIGosIGluZGV4LFxuXHRcdFx0dG9rZW5zID0gXCJcIixcblx0XHRcdHdyYXAgPSB7fSxcblx0XHRcdHNlbGVjdG9yID0gbGlua1ZpZXdzU2VsICsgKGdldCA/IFwiLFtcIiArIGRlZmVyQXR0ciArIFwiXVwiIDogXCJcIik7XG5cdFx0XHQvLyBJZiBhIGNoaWxkVGFncygpIGNhbGwsIGdldCA9IFwiLFtcIiArIGRlZmVyQXR0ciArIFwiXVwiIC0gc2luY2Ugd2UgbmVlZCB0byBpbmNsdWRlIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIC5fZGYgZXhwYW5kbyBmb3IgZGVmZXJyZWQgdG9rZW5zXG5cblx0XHRlbGVtcyA9IHFzYSA/IHBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikgOiAkKHNlbGVjdG9yLCBwYXJlbnROb2RlKS5nZXQoKTtcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdFx0Ly8gVGhlIHByZXZOb2RlIHdpbGwgYmUgaW4gdGhlIHJldHVybmVkIHF1ZXJ5LCBzaW5jZSB3ZSBjYWxsZWQgbWFya1ByZXZPck5leHROb2RlKCkgb24gaXQuXG5cdFx0Ly8gQnV0IGl0IG1heSBoYXZlIGNvbnRhaW5lZCBub2RlcyB0aGF0IHNhdGlzZnkgdGhlIHNlbGVjdG9yIGFsc28uXG5cdFx0aWYgKHByZXZOb2RlICYmIHByZXZOb2RlLmlubmVySFRNTCkge1xuXHRcdFx0Ly8gRmluZCB0aGUgbGFzdCBjb250YWluZWQgbm9kZSBvZiBwcmV2Tm9kZSwgdG8gdXNlIGFzIHRoZSBwcmV2Tm9kZSAtIHNvIHdlIG9ubHkgbGluayBzdWJzZXF1ZW50IGVsZW1zIGluIHRoZSBxdWVyeVxuXHRcdFx0cHJldk5vZGVzID0gcXNhID8gcHJldk5vZGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikgOiAkKHNlbGVjdG9yLCBwcmV2Tm9kZSkuZ2V0KCk7XG5cdFx0XHRwcmV2Tm9kZSA9IHByZXZOb2Rlcy5sZW5ndGggPyBwcmV2Tm9kZXNbcHJldk5vZGVzLmxlbmd0aCAtIDFdIDogcHJldk5vZGU7XG5cdFx0fVxuXG5cdFx0dGFnRGVwdGggPSAwO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdGVsZW0gPSBlbGVtc1tpXTtcblx0XHRcdGlmIChwcmV2Tm9kZSAmJiAhZm91bmQpIHtcblx0XHRcdFx0Ly8gSWYgcHJldk5vZGUgaXMgc2V0LCBub3QgZmFsc2UsIHNraXAgbGlua2luZy4gSWYgdGhpcyBlbGVtZW50IGlzIHRoZSBwcmV2Tm9kZSwgc2V0IHRvIGZhbHNlIHNvIHN1YnNlcXVlbnQgZWxlbWVudHMgd2lsbCBsaW5rLlxuXHRcdFx0XHRmb3VuZCA9IChlbGVtID09PSBwcmV2Tm9kZSk7XG5cdFx0XHR9IGVsc2UgaWYgKG5leHROb2RlICYmIGVsZW0gPT09IG5leHROb2RlKSB7XG5cdFx0XHRcdC8vIElmIG5leHROb2RlIGlzIHNldCB0aGVuIGJyZWFrIHdoZW4gd2UgZ2V0IHRvIG5leHROb2RlXG5cdFx0XHRcdGlmIChnZXQpIHtcblx0XHRcdFx0XHR0b2tlbnMgKz0gbWFya2VyTm9kZUluZm8oZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9IGVsc2UgaWYgKGVsZW0ucGFyZW50Tm9kZSkge1xuXHRcdFx0XHQvLyBlbGVtIGhhcyBub3QgYmVlbiByZW1vdmVkIGZyb20gRE9NXG5cdFx0XHRcdGlmIChnZXQpIHtcblx0XHRcdFx0XHR0b2tlbnMgKz0gbWFya2VyTm9kZUluZm8oZWxlbSk7XG5cdFx0XHRcdFx0aWYgKGVsZW0uX2RmKSB7XG5cdFx0XHRcdFx0XHRqID0gaSArIDE7XG5cdFx0XHRcdFx0XHR3aGlsZSAoaiA8IGwgJiYgZWxlbS5jb250YWlucyhlbGVtc1tqXSkpIHtcblx0XHRcdFx0XHRcdFx0aisrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gQWRkIGRlZmVyZWQgdG9rZW5zIGFmdGVyIGFueSB0b2tlbnMgb24gZGVzY2VuZGFudCBlbGVtZW50cyBvZiB0aGlzIG9uZVxuXHRcdFx0XHRcdFx0d3JhcFtqLTFdID0gZWxlbS5fZGY7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh3cmFwW2ldKSB7XG5cdFx0XHRcdFx0XHR0b2tlbnMgKz0gd3JhcFtpXSB8fCBcIlwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoaXNMaW5rICYmICh2d0luZm8gPSB2aWV3SW5mb3MoZWxlbSwgdW5kZWZpbmVkLCByVmlld01hcmtlcnMpKSAmJiAodndJbmZvID0gdndJbmZvWzBdKSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhpcyBpcyBhIGxpbmsodHJ1ZU9yU3RyaW5nIC4uLikgY2FsbCB3ZSB3aWxsIGF2b2lkIHJlLWJpbmRpbmcgdG8gZWxlbXMgdGhhdCBhcmUgd2l0aGluIHRlbXBsYXRlLXJlbmRlcmVkIHZpZXdzXG5cdFx0XHRcdFx0XHRza2lwID0gc2tpcCA/ICh2d0luZm8uaWQgIT09IHNraXAgJiYgc2tpcCkgOiB2d0luZm8ub3BlbiAmJiB2d0luZm8uaWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghc2tpcCAmJiBwcm9jZXNzSW5mb3Modmlld0luZm9zKGVsZW0pKVxuXHRcdFx0XHRcdFx0Ly8gSWYgYSBsaW5rKCkgY2FsbCwgcHJvY2Vzc1ZpZXdJbmZvcygpIGFkZHMgYmluZGluZ3MgdG8gYmluZEVscywgYW5kIHJldHVybnMgdHJ1ZSBmb3Igbm9uLXNjcmlwdCBub2RlcywgZm9yIGFkZGluZyBkYXRhLWxpbmsgYmluZGluZ3Ncblx0XHRcdFx0XHRcdC8vIElmIGEgY2hpbGRUYWdzKCkgY2FsbCwgZ2V0Vmlld0luZm9zIHJldHVybnMgYXJyYXkgb2YgdGFnIGJpbmRpbmdzLlxuXHRcdFx0XHRcdFx0XHQmJiBlbGVtLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikpIHtcblx0XHRcdFx0XHRcdGJpbmRFbHMucHVzaChbZWxlbV0pOyAvLyBBIGRhdGEtbGlua2VkIGVsZW1lbnQgc28gYWRkIHRvIGJpbmRFbHMgdG9vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldCkge1xuXHRcdFx0dG9rZW5zICs9IHBhcmVudE5vZGUuX2RmIHx8IFwiXCI7XG5cdFx0XHRpZiAoaW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIiNcIiArIGdldC5pZCkgKyAxKSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBsb29raW5nIGZvciB2aWV3LmNoaWxkVGFncygpIG9yIHRhZy5jaGlsZFRhZ3MoKSAtIHNvIHN0YXJ0IGFmdGVyIHRoZSBvcGVuIHRva2VuIG9mIHRoZSBwYXJlbnQgdmlldyBvciB0YWcuXG5cdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZShpbmRleCArIGdldC5pZC5sZW5ndGgpO1xuXHRcdFx0fVxuXHRcdFx0aW5kZXggPSB0b2tlbnMuaW5kZXhPZihcIi9cIiArIGdldC5pZCk7XG5cdFx0XHRpZiAoaW5kZXggKyAxKSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBsb29raW5nIGZvciB2aWV3LmNoaWxkVGFncygpIG9yIHRhZy5jaGlsZFRhZ3MoKSAtIHNvIGRvbid0IGxvb2sgYmV5b25kIHRoZSBjbG9zZSB0b2tlbiBvZiB0aGUgcGFyZW50IHZpZXcgb3IgdGFnLlxuXHRcdFx0XHR0b2tlbnMgPSB0b2tlbnMuc2xpY2UoMCwgaW5kZXgpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQ2FsbCBnZXRWaWV3SW5mb3MgdG8gYWRkIHRoZSBmb3VuZCBjaGlsZFRhZ3MgdG8gdGhlIHRhZ3MgYXJyYXlcblx0XHRcdGdldFZpZXdJbmZvcyh2aWV3SW5mb3ModG9rZW5zLCB1bmRlZmluZWQsIHJPcGVuVGFnTWFya2VycykpO1xuXHRcdH1cblxuXHRcdGlmIChodG1sID09PSB1bmRlZmluZWQgJiYgcGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpKSB7XG5cdFx0XHRiaW5kRWxzLnB1c2goW3BhcmVudE5vZGVdKTsgLy8gU3VwcG9ydCBkYXRhLWxpbmtpbmcgdG9wLWxldmVsIGVsZW1lbnQgZGlyZWN0bHkgKG5vdCB3aXRoaW4gYSBkYXRhLWxpbmtlZCBjb250YWluZXIpXG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRlbXBvcmFyeSBtYXJrZXIgc2NyaXB0IG5vZGVzIHRoZXkgd2VyZSBhZGRlZCBieSBtYXJrUHJldk9yTmV4dE5vZGVcblx0XHR1bm1hcmtQcmV2T3JOZXh0Tm9kZShwcmV2Tm9kZSwgZWxDbnQpO1xuXHRcdHVubWFya1ByZXZPck5leHROb2RlKG5leHROb2RlLCBlbENudCk7XG5cblx0XHRpZiAoZ2V0KSB7XG5cdFx0XHRpZiAobGF6eUxpbmspIHtcblx0XHRcdFx0bGF6eUxpbmsucmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuOyAvLyBXZSBoYXZlIGFkZGVkIGNoaWxkVGFncyB0byB0aGUgdGFncyBhcnJheSwgc28gd2UgYXJlIGRvbmVcblx0XHR9XG5cblx0XHRpZiAoZWxDbnQgJiYgZGVmZXIgKyBpZHMpIHtcblx0XHRcdC8vIFRoZXJlIGFyZSBzb21lIHZpZXdzIHdpdGggZWxDbnQsIGZvciB3aGljaCB0aGUgb3BlbiBvciBjbG9zZSBkaWQgbm90IHByZWNlZGUgYW55IEhUTUwgdGFnIC0gc28gdGhleSBoYXZlIG5vdCBiZWVuIHByb2Nlc3NlZCB5ZXRcblx0XHRcdGVsZW0gPSBuZXh0Tm9kZTtcblx0XHRcdGlmIChkZWZlcikge1xuXHRcdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0XHRwcm9jZXNzVmlld0luZm9zKHZpZXdJbmZvcyhkZWZlciArIFwiK1wiLCB0cnVlKSwgbmV4dE5vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHByb2Nlc3NWaWV3SW5mb3Modmlld0luZm9zKGRlZmVyLCB0cnVlKSwgcGFyZW50Tm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHByb2Nlc3NWaWV3SW5mb3Modmlld0luZm9zKGlkcywgdHJ1ZSksIHBhcmVudE5vZGUpO1xuXHRcdFx0Ly8gSWYgdGhlcmUgd2VyZSBhbnkgdG9rZW5zIG9uIG5leHROb2RlIHdoaWNoIGhhdmUgbm93IGJlZW4gYXNzb2NpYXRlZCB3aXRoIGluc2VydGVkIEhUTUwgdGFncywgcmVtb3ZlIHRoZW0gZnJvbSBuZXh0Tm9kZVxuXHRcdFx0aWYgKG5leHROb2RlKSB7XG5cdFx0XHRcdHRva2VucyA9IG5leHROb2RlLmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKTtcblx0XHRcdFx0aWYgKGwgPSB0b2tlbnMuaW5kZXhPZihwcmV2SWRzKSArIDEpIHtcblx0XHRcdFx0XHR0b2tlbnMgPSB0b2tlbnMuc2xpY2UobCArIHByZXZJZHMubGVuZ3RoIC0gMSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bmV4dE5vZGUuc2V0QXR0cmlidXRlKGpzdkF0dHJTdHIsIGlkcyArIHRva2Vucyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly89PT09PT09PT09PT09PT09IEJpbmQgdGhlIGRhdGEtbGlua2VkIGVsZW1lbnRzIGFuZCB0YWdzID09PT09PT09PT09PT09PT1cblx0XHRsID0gYmluZEVscy5sZW5ndGg7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0ZWxlbSA9IGJpbmRFbHNbaV07XG5cdFx0XHRsaW5rSW5mbyA9IGVsZW1bMV07XG5cdFx0XHRlbGVtID0gZWxlbVswXTtcblx0XHRcdGlmIChsaW5rSW5mbykge1xuXHRcdFx0XHRpZiAodGFnID0gYmluZGluZ1N0b3JlW2xpbmtJbmZvLmlkXSkge1xuXHRcdFx0XHRcdGlmIChsaW5rQ3R4ID0gdGFnLmxpbmtDdHgpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSB0YWcgbWF5IGhhdmUgYmVlbiBzdG9yZWQgdGVtcG9yYXJpbHkgb24gdGhlIGJpbmRpbmdTdG9yZSAtIG9yIG1heSBoYXZlIGFscmVhZHkgYmVlbiByZXBsYWNlZCBieSB0aGUgYWN0dWFsIGJpbmRpbmdcblx0XHRcdFx0XHRcdHRhZyA9IGxpbmtDdHgudGFnO1xuXHRcdFx0XHRcdFx0dGFnLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobGlua0luZm8ub3Blbikge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhbiAnb3BlbiBsaW5rZWQgdGFnJyBiaW5kaW5nIGFubm90YXRpb24gZm9yIGEgZGF0YS1saW5rZWQgdGFnIHteey4uLn19XG5cdFx0XHRcdFx0XHRpZiAoZWxlbSkge1xuXHRcdFx0XHRcdFx0XHR0YWcucGFyZW50RWxlbSA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRcdFx0dGFnLl9wcnYgPSBlbGVtO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGFnLl9lbENudCA9IGxpbmtJbmZvLmVsQ250O1xuXHRcdFx0XHRcdFx0Ly8gV2UgZGF0YS1saW5rIGRlcHRoLWZpcnN0IChcIm9uIHRoZSB3YXkgaW5cIiksIHdoaWNoIGlzIGJldHRlciBmb3IgcGVyZiAtIGFuZCBhbGxvd3Mgc2V0dGluZyBwYXJlbnQgdGFncyBldGMuXG5cdFx0XHRcdFx0XHR2aWV3ID0gdGFnLnRhZ0N0eC52aWV3O1xuXHRcdFx0XHRcdFx0YWRkRGF0YUJpbmRpbmcodW5kZWZpbmVkLCB0YWcuX3BydiwgdmlldywgbGlua0luZm8uaWQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0YWcuX254dCA9IGVsZW07XG5cdFx0XHRcdFx0XHRpZiAodGFnLl8udW5saW5rZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhICdjbG9zZSBsaW5rZWQgdGFnJyBiaW5kaW5nIGFubm90YXRpb25cblx0XHRcdFx0XHRcdFx0Ly8gQWRkIGRhdGEgYmluZGluZ1xuXHRcdFx0XHRcdFx0XHR0YWdDdHggPSB0YWcudGFnQ3R4O1xuXHRcdFx0XHRcdFx0XHR2aWV3ID0gdGFnQ3R4LnZpZXc7XG5cdFx0XHRcdFx0XHRcdGNhbGxBZnRlckxpbmsodGFnKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFkZCBkYXRhIGJpbmRpbmcgZm9yIGEgZGF0YS1saW5rZWQgZWxlbWVudCAod2l0aCBkYXRhLWxpbmsgYXR0cmlidXRlKVxuXHRcdFx0XHRhZGREYXRhQmluZGluZyhlbGVtLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0ciksIGVsZW0sICR2aWV3KGVsZW0pLCB1bmRlZmluZWQsIGlzTGluaywgb3V0ZXJEYXRhLCBjb250ZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGxhenlMaW5rKSB7XG5cdFx0XHRsYXp5TGluay5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cdC8vPT09PSAvZW5kIG9mIG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXG5cdHZhciBpblRhZywgbGlua0N0eCwgdGFnLCBpLCBsLCBqLCBsZW4sIGVsZW1zLCBlbGVtLCB2aWV3LCB2d0luZm8sIGxpbmtJbmZvLCBwcmV2Tm9kZXMsIHRva2VuLCBwcmV2VmlldywgbmV4dFZpZXcsXG5cdFx0bm9kZSwgdGFncywgZGVlcCwgdGFnTmFtZSwgdGFnQ3R4LCB2YWxpZGF0ZSwgdGFnRGVwdGgsIGRlcHRoLCBmcmFnbWVudCwgY29waWVkTm9kZSwgZmlyc3RUYWcsIHBhcmVudFRhZyxcblx0XHRpc1ZvaWQsIHdyYXBwZXIsIGRpdiwgdG9rZW5zLCBlbENudCwgcHJldkVsQ250LCBodG1sVGFnLCBpZHMsIHByZXZJZHMsIGZvdW5kLCBza2lwLCBsYXp5TGluaywgaXNMaW5rLCBnZXQsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0dGhpc0lkID0gc2VsZi5fLmlkICsgXCJfXCIsXG5cdFx0ZGVmZXIgPSBcIlwiLFxuXHRcdC8vIFRoZSBtYXJrZXIgaWRzIGZvciB3aGljaCBubyB0YWcgd2FzIGVuY291bnRlcmVkIChlbXB0eSB2aWV3cyBvciBmaW5hbCBjbG9zaW5nIG1hcmtlcnMpIHdoaWNoIHdlIGNhcnJ5IG92ZXIgdG8gY29udGFpbmVyIHRhZ1xuXHRcdGJpbmRFbHMgPSBbXSxcblx0XHR0YWdTdGFjayA9IFtdLFxuXHRcdGRlZmVyU3RhY2sgPSBbXSxcblx0XHRvbkFmdGVyQ3JlYXRlID0gc2VsZi5obHAob25BZnRlckNyZWF0ZVN0ciksXG5cdFx0cHJvY2Vzc0luZm9zID0gcHJvY2Vzc1ZpZXdJbmZvcztcblxuXHRpZiAocmVmcmVzaCkge1xuXHRcdGxhenlMaW5rID0gcmVmcmVzaC5sYXp5TGluayAmJiAkLkRlZmVycmVkKCk7XG5cdFx0aWYgKHJlZnJlc2gudG1wbCkge1xuXHRcdFx0Ly8gcmVmcmVzaCBpcyB0aGUgcHJldlZpZXcsIHBhc3NlZCBpbiBmcm9tIGFkZFZpZXdzKClcblx0XHRcdHByZXZWaWV3ID0gXCIvXCIgKyByZWZyZXNoLl8uaWQgKyBcIl9cIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aXNMaW5rID0gcmVmcmVzaC5sbms7IC8vIFRvcC1sZXZlbCBsaW5raW5nXG5cdFx0XHRpZiAocmVmcmVzaC50YWcpIHtcblx0XHRcdFx0dGhpc0lkID0gcmVmcmVzaC50YWcgKyBcIl5cIjtcblx0XHRcdFx0cmVmcmVzaCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZ2V0ID0gcmVmcmVzaC5nZXQpIHtcblx0XHRcdFx0cHJvY2Vzc0luZm9zID0gZ2V0Vmlld0luZm9zO1xuXHRcdFx0XHR0YWdzID0gZ2V0LnRhZ3M7XG5cdFx0XHRcdGRlZXAgPSBnZXQuZGVlcDtcblx0XHRcdFx0dGFnTmFtZSA9IGdldC5uYW1lO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZWZyZXNoID0gcmVmcmVzaCA9PT0gdHJ1ZTtcblx0fVxuXG5cdHBhcmVudE5vZGUgPSBwYXJlbnROb2RlXG5cdFx0PyAoXCJcIiArIHBhcmVudE5vZGUgPT09IHBhcmVudE5vZGVcblx0XHRcdD8gJChwYXJlbnROb2RlKVswXSAgLy8gSXQgaXMgYSBzdHJpbmcsIHNvIHRyZWF0IGFzIHNlbGVjdG9yXG5cdFx0XHQ6IHBhcmVudE5vZGUuanF1ZXJ5XG5cdFx0XHRcdD8gcGFyZW50Tm9kZVswXSAvLyBBIGpRdWVyeSBvYmplY3QgLSB0YWtlIGZpcnN0IGVsZW1lbnQuXG5cdFx0XHRcdDogcGFyZW50Tm9kZSlcblx0XHQ6IChzZWxmLnBhcmVudEVsZW0gICAgICAvLyB2aWV3LmxpbmsoKVxuXHRcdFx0fHwgZG9jdW1lbnQuYm9keSk7ICAvLyBsaW5rKG51bGwsIGRhdGEpIHRvIGxpbmsgdGhlIHdob2xlIGRvY3VtZW50XG5cblx0dmFsaWRhdGUgPSAhJHN1YlNldHRpbmdzQWR2YW5jZWQubm9WYWxpZGF0ZSAmJiBwYXJlbnROb2RlLmNvbnRlbnRFZGl0YWJsZSAhPT0gVFJVRTtcblx0cGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdGVsQ250ID0gISFlbENvbnRlbnRbcGFyZW50VGFnXTtcblxuXHRwcmV2Tm9kZSA9IHByZXZOb2RlICYmIG1hcmtQcmV2T3JOZXh0Tm9kZShwcmV2Tm9kZSwgZWxDbnQpO1xuXHRuZXh0Tm9kZSA9IG5leHROb2RlICYmIG1hcmtQcmV2T3JOZXh0Tm9kZShuZXh0Tm9kZSwgZWxDbnQpIHx8IG51bGw7XG5cblx0aWYgKGh0bWwgIT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly89PT09PT09PT09PT09PT09IEluc2VydCBodG1sIGludG8gRE9NIHVzaW5nIGRvY3VtZW50RnJhZ21lbnRzIChhbmQgd3JhcHBpbmcgSFRNTCBhcHByb3ByaWF0ZWx5KS4gPT09PT09PT09PT09PT09PVxuXHRcdC8vIEFsc28gY29udmVydCBtYXJrZXJzIHRvIERPTSBhbm5vdGF0aW9ucywgYmFzZWQgb24gY29udGVudCBtb2RlbC5cblx0XHQvLyBDb3JyZXNwb25kcyB0byBuZXh0Tm9kZSA/ICQobmV4dE5vZGUpLmJlZm9yZShodG1sKSA6ICQocGFyZW50Tm9kZSkuaHRtbChodG1sKTtcblx0XHQvLyBidXQgYWxsb3dzIGluc2VydGlvbiB0byB3cmFwIGNvcnJlY3RseSBldmVuIHdpdGggaW5zZXJ0ZWQgc2NyaXB0IG5vZGVzLiBqUXVlcnkgdmVyc2lvbiB3aWxsIGZhaWwgZS5nLiB1bmRlciB0Ym9keSBvciBzZWxlY3QuXG5cdFx0Ly8gVGhpcyB2ZXJzaW9uIHNob3VsZCBhbHNvIGJlIHNsaWdodGx5IGZhc3RlclxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0d3JhcHBlciA9IGRpdjtcblx0XHRwcmV2SWRzID0gaWRzID0gXCJcIjtcblx0XHRodG1sVGFnID0gcGFyZW50Tm9kZS5uYW1lc3BhY2VVUkkgPT09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiA/IFwic3ZnX25zXCIgOiAoZmlyc3RUYWcgPSByRmlyc3RFbGVtLmV4ZWMoaHRtbCkpICYmIGZpcnN0VGFnWzFdIHx8IFwiXCI7XG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHQvLyBOb3cgbG9vayBmb3IgZm9sbG93aW5nIHZpZXcsIGFuZCBmaW5kIGl0cyB0b2tlbnMsIG9yIGlmIG5vdCBmb3VuZCwgZ2V0IHRoZSBwYXJlbnROb2RlLl9kZiB0b2tlbnNcblx0XHRcdG5vZGUgPSBuZXh0Tm9kZTtcblx0XHRcdHdoaWxlIChub2RlICYmICEobmV4dFZpZXcgPSB2aWV3SW5mb3Mobm9kZSkpKSB7XG5cdFx0XHRcdG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRva2VucyA9IG5leHRWaWV3ID8gbmV4dFZpZXcuX3RrbnMgOiBwYXJlbnROb2RlLl9kZikge1xuXHRcdFx0XHR0b2tlbiA9IHByZXZWaWV3IHx8IFwiXCI7XG5cdFx0XHRcdGlmIChyZWZyZXNoIHx8ICFwcmV2Vmlldykge1xuXHRcdFx0XHRcdHRva2VuICs9IFwiI1wiICsgdGhpc0lkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGogPSB0b2tlbnMuaW5kZXhPZih0b2tlbik7XG5cdFx0XHRcdGlmIChqICsgMSkge1xuXHRcdFx0XHRcdGogKz0gdG9rZW4ubGVuZ3RoO1xuXHRcdFx0XHRcdC8vIFRyYW5zZmVyIHRoZSBpbml0aWFsIHRva2VucyB0byBpbnNlcnRlZCBub2RlcywgYnkgc2V0dGluZyB0aGVtIGFzIHRoZSBpZHMgdmFyaWFibGUsIHBpY2tlZCB1cCBpbiBjb252ZXJ0TWFya2Vyc1xuXHRcdFx0XHRcdHByZXZJZHMgPSBpZHMgPSB0b2tlbnMuc2xpY2UoMCwgaik7XG5cdFx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKGopO1xuXHRcdFx0XHRcdGlmIChuZXh0Vmlldykge1xuXHRcdFx0XHRcdFx0bm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgdG9rZW5zKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2V0RGVmZXIocGFyZW50Tm9kZSwgdG9rZW5zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLz09PT09PT09PT09PT09PT0gQ29udmVydCB0aGUgbWFya2VycyB0byBET00gYW5ub3RhdGlvbnMsIGJhc2VkIG9uIGNvbnRlbnQgbW9kZWwuID09PT09PT09PT09PT09PT1cbi8vXHRcdFx0b2xkRWxDbnQgPSBlbENudDtcblx0XHRpc1ZvaWQgPSB1bmRlZmluZWQ7XG5cdFx0aHRtbCA9IChcIlwiICsgaHRtbCkucmVwbGFjZShyQ29udmVydE1hcmtlcnMsIGNvbnZlcnRNYXJrZXJzKTtcbi8vXHRcdFx0aWYgKCEhb2xkRWxDbnQgIT09ICEhZWxDbnQpIHtcbi8vXHRcdFx0XHRlcnJvcihcIlBhcnNlOiBcIiArIGh0bWwpOyAvLyBQYXJzZSBlcnJvci4gQ29udGVudCBub3Qgd2VsbC1mb3JtZWQ/XG4vL1x0XHRcdH1cblx0XHRpZiAodmFsaWRhdGUgJiYgdGFnU3RhY2subGVuZ3RoKSB7XG5cdFx0XHRzeW50YXhFcnJvcihcIk1pc21hdGNoZWQgJzxcIiArIHBhcmVudFRhZyArIFwiLi4uPicgaW46XFxuXCIgKyBodG1sKTsgLy8gVW5tYXRjaGVkIHRhZ1xuXHRcdH1cblx0XHRpZiAodmFsaWRhdGVPbmx5KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIEFwcGVuZCB3cmFwcGVyIGVsZW1lbnQgdG8gZG9jIGZyYWdtZW50XG5cdFx0c2FmZUZyYWdtZW50LmFwcGVuZENoaWxkKGRpdik7XG5cblx0XHQvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzXG5cdFx0Ly8gQ29ycmVzcG9uZHMgdG8galF1ZXJ5ICQobmV4dE5vZGUpLmJlZm9yZShodG1sKSBvciAkKHBhcmVudE5vZGUpLmh0bWwoaHRtbCk7XG5cdFx0Ly8gYnV0IHN1cHBvcnRzIHN2ZyBlbGVtZW50cywgYW5kIG90aGVyIGZlYXR1cmVzIG1pc3NpbmcgZnJvbSBqUXVlcnkgdmVyc2lvbiAoYW5kIHRoaXMgdmVyc2lvbiBzaG91bGQgYWxzbyBiZSBzbGlnaHRseSBmYXN0ZXIpXG5cdFx0aHRtbFRhZyA9IHdyYXBNYXBbaHRtbFRhZ10gfHwgd3JhcE1hcC5kaXY7XG5cdFx0ZGVwdGggPSBodG1sVGFnWzBdO1xuXHRcdHdyYXBwZXIuaW5uZXJIVE1MID0gaHRtbFRhZ1sxXSArIGh0bWwgKyBodG1sVGFnWzJdO1xuXHRcdHdoaWxlIChkZXB0aC0tKSB7XG5cdFx0XHR3cmFwcGVyID0gd3JhcHBlci5sYXN0Q2hpbGQ7XG5cdFx0fVxuXHRcdHNhZmVGcmFnbWVudC5yZW1vdmVDaGlsZChkaXYpO1xuXHRcdGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdHdoaWxlIChjb3BpZWROb2RlID0gd3JhcHBlci5maXJzdENoaWxkKSB7XG5cdFx0XHRmcmFnbWVudC5hcHBlbmRDaGlsZChjb3BpZWROb2RlKTtcblx0XHR9XG5cdFx0Ly8gSW5zZXJ0IGludG8gdGhlIERPTVxuXHRcdHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCBuZXh0Tm9kZSk7XG5cdH1cblxuXHRpZiAobGF6eUxpbmspIHtcblx0XHRzZXRUaW1lb3V0KGRhdGFMaW5rLCAwKTtcblx0fSBlbHNlIHtcblx0XHRkYXRhTGluaygpO1xuXHR9XG5cblx0cmV0dXJuIGxhenlMaW5rICYmIGxhenlMaW5rLnByb21pc2UoKTtcbn1cblxuZnVuY3Rpb24gYWRkRGF0YUJpbmRpbmcobGlua01hcmt1cCwgbm9kZSwgY3VycmVudFZpZXcsIGJvdW5kVGFnSWQsIGlzTGluaywgZGF0YSwgY29udGV4dCkge1xuXHQvLyBBZGQgZGF0YSBiaW5kaW5nIGZvciBkYXRhLWxpbmtlZCBlbGVtZW50cyBvciB7XnsuLi59fSBkYXRhLWxpbmtlZCB0YWdzXG5cdHZhciB0bXBsLCB0b2tlbnMsIGF0dHIsIGNvbnZlcnRCYWNrLCB0YWdFeHByLCBsaW5rRm4sIGxpbmtDdHgsIHRhZywgclRhZ0luZGV4LCBoYXNFbHNlLCBsYXN0SW5kZXgsXG5cdFx0bGlua0V4cHJlc3Npb25zID0gW107XG5cblx0aWYgKGJvdW5kVGFnSWQpIHtcblx0XHQvLyBib3VuZFRhZ0lkIGlzIGEgc3RyaW5nIGZvciB7XnsuLi59fSBkYXRhLWxpbmtlZCB0YWcuIFNvIG9ubHkgb25lIGxpbmtUYWcgaW4gbGlua01hcmt1cFxuXHRcdC8vIGRhdGEgYW5kIGNvbnRleHQgcGFyYW1ldGVycyBhcmUgdW5kZWZpbmVkXG5cdFx0dGFnID0gYmluZGluZ1N0b3JlW2JvdW5kVGFnSWRdO1xuXHRcdHRhZyA9IHRhZy5saW5rQ3R4ID8gdGFnLmxpbmtDdHgudGFnIDogdGFnO1xuXG5cdFx0bGlua0N0eCA9IHRhZy5saW5rQ3R4IHx8IHtcblx0XHRcdHR5cGU6IFwiaW5saW5lXCIsXG5cdFx0XHRkYXRhOiBjdXJyZW50Vmlldy5kYXRhLCAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2Vcblx0XHRcdGVsZW06IHRhZy5fZWxDbnQgPyB0YWcucGFyZW50RWxlbSA6IG5vZGUsIC8vIHRhcmdldFxuXHRcdFx0dmlldzogY3VycmVudFZpZXcsXG5cdFx0XHRjdHg6IGN1cnJlbnRWaWV3LmN0eCxcblx0XHRcdGF0dHI6IEhUTUwsIC8vIFNjcmlwdCBtYXJrZXIgbm9kZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB7XnsgYW5kIGFsd2F5cyB0YXJnZXQgSFRNTC5cblx0XHRcdGZuOiB0YWcuXy5ibmQsXG5cdFx0XHR0YWc6IHRhZyxcblx0XHRcdC8vIFBhc3MgdGhlIGJvdW5kVGFnSWQgaW4gdGhlIGxpbmtDdHgsIHNvIHRoYXQgaXQgY2FuIGJlIHBpY2tlZCB1cCBpbiBvYnNlcnZlQW5kQmluZFxuXHRcdFx0X2JuZElkOiBib3VuZFRhZ0lkXG5cdFx0fTtcblx0XHRiaW5kRGF0YUxpbmtUYXJnZXQobGlua0N0eCwgbGlua0N0eC5mbik7XG5cdH0gZWxzZSBpZiAobGlua01hcmt1cCAmJiBub2RlKSB7XG5cdFx0Ly8gSWYgaXNMaW5rIHRoZW4gdGhpcyBpcyBhIHRvcC1sZXZlbCBsaW5raW5nOiAubGluayhleHByZXNzaW9uLCB0YXJnZXQsIGRhdGEsIC4uLi4pIG9yXG5cdFx0Ly8gLmxpbmsodHJ1ZSwgdGFyZ2V0LCBkYXRhLCAuLi4uKSBzY2VuYXJpbyAtIGFuZCBkYXRhIGFuZCBjb250ZXh0IGFyZSBwYXNzZWQgaW4gc2VwYXJhdGVseSBmcm9tIHRoZSB2aWV3XG5cdFx0ZGF0YSA9IGlzTGluayA/IGRhdGEgOiBjdXJyZW50Vmlldy5kYXRhO1xuXG5cdFx0Ly8gQ29tcGlsZWQgbGlua0ZuIGV4cHJlc3Npb25zIGNvdWxkIGJlIHN0b3JlZCBpbiB0aGUgdG1wbC5saW5rcyBhcnJheSBvZiB0aGUgdGVtcGxhdGVcblx0XHQvLyBUT0RPIC0gY29uc2lkZXIgYWxzbyBjYWNoaW5nIGdsb2JhbGx5IHNvIHRoYXQgaWYge3s6Zm9vfX0gb3IgZGF0YS1saW5rPVwiZm9vXCIgb2NjdXJzIGluIGRpZmZlcmVudCBwbGFjZXMsXG5cdFx0Ly8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZvciB0aGlzIGlzIGNhY2hlZCBhbmQgb25seSBjb21waWxlZCBvbmNlLi4uXG5cdFx0Ly9saW5rcyA9IGN1cnJlbnRWaWV3LmxpbmtzIHx8IGN1cnJlbnRWaWV3LnRtcGwubGlua3M7XG5cblx0XHR0bXBsID0gY3VycmVudFZpZXcudG1wbDtcblxuLy9cdFx0XHRpZiAoIShsaW5rVGFncyA9IGxpbmtzW2xpbmtNYXJrdXBdKSkge1xuXHRcdC8vIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhpcyB2aWV3IHRlbXBsYXRlIGhhcyBiZWVuIGxpbmtlZCwgc28gd2UgY29tcGlsZSB0aGUgZGF0YS1saW5rIGV4cHJlc3Npb25zLCBhbmQgc3RvcmUgdGhlbSBvbiB0aGUgdGVtcGxhdGUuXG5cblx0XHRsaW5rTWFya3VwID0gbm9ybWFsaXplTGlua1RhZyhsaW5rTWFya3VwLCBkZWZhdWx0QXR0cihub2RlKSk7XG5cdFx0bGFzdEluZGV4ID0gclRhZ0RhdGFsaW5rLmxhc3RJbmRleCA9IDA7XG5cdFx0d2hpbGUgKHRva2VucyA9IHJUYWdEYXRhbGluay5leGVjKGxpbmtNYXJrdXApKSB7IC8vIFRPRE8gcmVxdWlyZSB9IHRvIGJlIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJCwgYW5kIHJlbW92ZSB0aGUgXFx9KCFcXH0pIG9wdGlvbi5cblx0XHRcdGxpbmtFeHByZXNzaW9ucy5wdXNoKHRva2Vucyk7XG5cdFx0XHRsYXN0SW5kZXggPSByVGFnRGF0YWxpbmsubGFzdEluZGV4O1xuXHRcdH1cblx0XHRpZiAobGFzdEluZGV4IDwgbGlua01hcmt1cC5sZW5ndGgpIHtcblx0XHRcdHN5bnRheEVycm9yKGxpbmtNYXJrdXApO1xuXHRcdH1cblx0XHR3aGlsZSAodG9rZW5zID0gbGlua0V4cHJlc3Npb25zLnNoaWZ0KCkpIHtcblx0XHRcdC8vIEl0ZXJhdGUgb3ZlciB0aGUgZGF0YS1saW5rIGV4cHJlc3Npb25zLCBmb3IgZGlmZmVyZW50IHRhcmdldCBhdHRycyxcblx0XHRcdC8vIGUuZy4gPGlucHV0IGRhdGEtbGluaz1cIns6Zmlyc3ROYW1lOn0gdGl0bGV7Pn5kZXNjcmlwdGlvbihmaXJzdE5hbWUsIGxhc3ROYW1lKX1cIlxuXHRcdFx0Ly8gdG9rZW5zOiBbYWxsLCBhdHRyLCBiaW5kT25seSwgdGFnRXhwciwgdGFnTmFtZSwgY29udmVydGVyLCBjb2xvbiwgaHRtbCwgY29tbWVudCwgY29kZSwgcGFyYW1zXVxuXHRcdFx0clRhZ0luZGV4ID0gclRhZ0RhdGFsaW5rLmxhc3RJbmRleDtcblx0XHRcdGF0dHIgPSB0b2tlbnNbMV07XG5cdFx0XHR0YWdFeHByID0gdG9rZW5zWzNdO1xuXHRcdFx0d2hpbGUgKGxpbmtFeHByZXNzaW9uc1swXSAmJiBsaW5rRXhwcmVzc2lvbnNbMF1bNF0gPT09IFwiZWxzZVwiKSB7IC8vIElmIHRoaXMgaXMge3NvbWVUYWcuLi59IGFuZCBpcyBmb2xsb3dlZCBieSBhbiB7ZWxzZS4uLn0gYWRkIHRvIHRhZ0V4cHJcblx0XHRcdFx0dGFnRXhwciArPSBkZWxpbUNsb3NlQ2hhcjEgKyBkZWxpbU9wZW5DaGFyMCArIGxpbmtFeHByZXNzaW9ucy5zaGlmdCgpWzNdO1xuXHRcdFx0XHRoYXNFbHNlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChoYXNFbHNlKSB7IC8vIElmIGFuIHtlbHNlfSBoYXMgYmVlbiBhZGRlZCwgbmVlZCBhbHNvIHRvIGFkZCBjbG9zaW5nIHt7L3NvbWVUYWd9fVxuXHRcdFx0XHR0YWdFeHByICs9IGRlbGltQ2xvc2VDaGFyMSArIGRlbGltT3BlbkNoYXIwICsgZGVsaW1PcGVuQ2hhcjEgKyBcIi9cIiArIHRva2Vuc1s0XSArIGRlbGltQ2xvc2VDaGFyMDtcblx0XHRcdH1cblx0XHRcdGxpbmtDdHggPSB7XG5cdFx0XHRcdHR5cGU6IGlzTGluayA/IFwidG9wXCIgOiBcImxpbmtcIixcblx0XHRcdFx0ZGF0YTogZGF0YSwgLy8gc291cmNlXG5cdFx0XHRcdGVsZW06IG5vZGUsIC8vIHRhcmdldFxuXHRcdFx0XHR2aWV3OiBjdXJyZW50Vmlldyxcblx0XHRcdFx0Y3R4OiBjb250ZXh0LFxuXHRcdFx0XHRhdHRyOiBhdHRyLFxuXHRcdFx0XHRpc0xrOiBpc0xpbmssIC8vIHRvcC1sZXZlbCBsaW5raW5nP1xuXHRcdFx0XHRfdG9MayA6IDEsIC8vIEZsYWcgdG8gZGF0YS1saW5rIG9uIGluaXRpYWwgZGF0YS1saW5rIGNhbGwgcmVuZGVyaW5nIGNhbGxcblx0XHRcdFx0X25vVXBkIDogdG9rZW5zWzJdIC8vIEZsYWcgZm9yIGRhdGEtbGluaz1cIl57Li4ufVwiIHNvIG9uIGluaXRpYWwgZGF0YS1saW5rIGNhbGwgd2lsbCBiaW5kLCBidXQgbm90IHJlbmRlcilcblx0XHRcdH07XG5cblx0XHRcdGNvbnZlcnRCYWNrID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHRva2Vuc1s2XSkge1xuXHRcdFx0XHRjb252ZXJ0QmFjayA9IHRva2Vuc1sxMF0gfHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRsaW5rQ3R4LmNvbnZlcnQgPSB0b2tlbnNbNV0gfHwgXCJcIjtcblx0XHRcdFx0aWYgKCFhdHRyICYmIGNvbnZlcnRCYWNrICE9PSB1bmRlZmluZWQgJiYgZGVmYXVsdEF0dHIobm9kZSkpIHtcblx0XHRcdFx0XHQvLyBEZWZhdWx0IHRhcmdldCwgc28gYWxsb3cgMiB3YXkgYmluZGluZ1xuXHRcdFx0XHRcdGxpbmtDdHguY29udmVydEJhY2sgPSBjb252ZXJ0QmFjayA9IGNvbnZlcnRCYWNrLnNsaWNlKDEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBDb21waWxlIHRoZSBsaW5rRm4gZXhwcmVzc2lvbiB3aGljaCBldmFsdWF0ZXMgYW5kIGJpbmRzIGEgZGF0YS1saW5rIGV4cHJlc3Npb25cblx0XHRcdC8vIFRPRE8gLSBvcHRpbWl6ZSBmb3IgdGhlIGNhc2Ugb2Ygc2ltcGxlIGRhdGEgcGF0aCB3aXRoIG5vIGNvbnZlcnNpb24sIGhlbHBlcnMsIGV0Yy46XG5cdFx0XHQvLyAgICAgaS5lLiBkYXRhLWxpbms9XCJhLmIuY1wiLiBBdm9pZCBjcmVhdGluZyBuZXcgaW5zdGFuY2VzIG9mIEZ1bmN0aW9uIGV2ZXJ5IHRpbWUuIENhbiB1c2UgYSBkZWZhdWx0IGZ1bmN0aW9uIGZvciBhbGwgb2YgdGhlc2UuLi5cblxuXHRcdFx0bGlua0N0eC5leHByID0gYXR0ciArIHRhZ0V4cHI7XG5cdFx0XHRsaW5rRm4gPSB0bXBsLmxpbmtzW3RhZ0V4cHJdO1xuXHRcdFx0aWYgKCFsaW5rRm4pIHtcblx0XHRcdFx0dG1wbC5saW5rc1t0YWdFeHByXSA9IGxpbmtGbiA9ICRzdWIudG1wbEZuKHRhZ0V4cHIsIHRtcGwsIHRydWUsIGNvbnZlcnRCYWNrLCBoYXNFbHNlKTtcblx0XHRcdH1cblx0XHRcdGxpbmtDdHguZm4gPSBsaW5rRm47XG5cdFx0XHRiaW5kRGF0YUxpbmtUYXJnZXQobGlua0N0eCwgbGlua0ZuKTtcblx0XHRcdC8vIFdlIHN0b3JlIHJUYWdJbmRleCBpbiBsb2NhbCBzY29wZSwgc2luY2UgdGhpcyBhZGREYXRhQmluZGluZyBtZXRob2QgY2FuIHNvbWV0aW1lcyBiZSBjYWxsZWQgcmVjdXJzaXZlbHksXG5cdFx0XHQvLyBhbmQgZWFjaCBpcyB1c2luZyB0aGUgc2FtZSByVGFnRGF0YWxpbmsgaW5zdGFuY2UuXG5cdFx0XHRyVGFnRGF0YWxpbmsubGFzdEluZGV4ID0gclRhZ0luZGV4O1xuXHRcdH1cbi8vXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBiaW5kRGF0YUxpbmtUYXJnZXQobGlua0N0eCwgbGlua0ZuKSB7XG5cdC8vIEFkZCBkYXRhIGxpbmsgYmluZGluZ3MgZm9yIGEgbGluayBleHByZXNzaW9uIGluIGRhdGEtbGluayBhdHRyaWJ1dGUgbWFya3VwXG5cdGZ1bmN0aW9uIGhhbmRsZXIoZXYsIGV2ZW50QXJncykge1xuXHRcdHByb3BlcnR5Q2hhbmdlSGFuZGxlci5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MsIGxpbmtGbik7XG5cdFx0Ly8gSWYgdGhlIGxpbmsgZXhwcmVzc2lvbiB1c2VzIGEgY3VzdG9tIHRhZywgdGhlIHByb3BlcnR5Q2hhbmdlSGFuZGxlciBjYWxsIHdpbGwgY2FsbCByZW5kZXJUYWcsIHdoaWNoIHdpbGwgc2V0IHRhZ0N0eCBvbiBsaW5rQ3R4XG5cdH1cblx0aGFuZGxlci5ub0FycmF5ID0gdHJ1ZTtcblx0aWYgKGxpbmtDdHguaXNMaykge1xuXHRcdC8vIFRvcC1sZXZlbCBsaW5raW5nOiAubGluayhleHByZXNzaW9uT3JUcnVlLCBkYXRhLCBjb250ZXh0KSAtIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGEgdmlldyBmb3IgdGhlIGxpbmtpbmcsIHdpdGggdGhlIGRhdGEgYW5kIGN0eFxuXHRcdC8vIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSB0YXJnZXQuIE5vdGUgdGhhdCB0aGlzIHZpZXcgaXMgbm90IGEgc3RhbmRhcmQgZGF0YS1saW5rZWQgdmlldywgc28gaXQgd2lsbFxuXHRcdC8vIGJlIGRpc3Bvc2VkIG9ubHkgd2hlbiBpdHMgcGFyZW50IHZpZXcgaXMgZGlzcG9zZWQuXG5cdFx0YWRkTGlua01ldGhvZHMobGlua0N0eC52aWV3ID0gbmV3ICRzdWIuVmlldyhcblx0XHRcdCRzdWIuZXh0ZW5kQ3R4KGxpbmtDdHguY3R4LCBsaW5rQ3R4LnZpZXcuY3R4KSxcblx0XHRcdFwibGlua1wiLCBsaW5rQ3R4LnZpZXcsIGxpbmtDdHguZGF0YSwgbGlua0N0eC5leHByLCB1bmRlZmluZWQsIGFkZEJpbmRpbmdNYXJrZXJzKSk7XG5cdH1cblx0bGlua0N0eC5fY3R4Q2IgPSBnZXRDb250ZXh0Q2IobGlua0N0eC52aWV3KTsgLy8gX2N0eENiIGlzIGZvciBmaWx0ZXJpbmcvYXBwZW5kaW5nIHRvIGRlcGVuZGVuY3kgcGF0aHM6IGZ1bmN0aW9uKHBhdGgsIG9iamVjdCkgeyByZXR1cm4gWyhvYmplY3R8cGF0aCkqXX1cblx0bGlua0N0eC5faGRsID0gaGFuZGxlcjtcblx0Ly8gaGFuZGxlci5fY3R4ID0gbGlua0N0eDsgQ291bGQgcGFzcyBsaW5rQ3R4IGZvciB1c2UgaW4gYSBkZXBlbmRzID0gZnVuY3Rpb24oKSB7fSBjYWxsLCBzbyBkZXBlbmRzIGlzIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGxpbmtDdHgnc1xuXHRoYW5kbGVyKHRydWUpO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PVxuLy8gRGF0YS1saW5raW5nIGhlbHBlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlbW92ZVN1YlN0cihzdHIsIHN1YnN0cikge1xuXHR2YXIgaztcblx0cmV0dXJuIHN0clxuXHRcdD8gKGsgPSBzdHIuaW5kZXhPZihzdWJzdHIpLFxuXHRcdFx0KGsgKyAxXG5cdFx0XHRcdD8gc3RyLnNsaWNlKDAsIGspICsgc3RyLnNsaWNlKGsgKyBzdWJzdHIubGVuZ3RoKVxuXHRcdFx0XHQ6IHN0cikpXG5cdFx0OiBcIlwiO1xufVxuXG5mdW5jdGlvbiBtYXJrZXJOb2RlSW5mbyhub2RlKSB7XG5cdHJldHVybiBub2RlICYmXG5cdFx0KFwiXCIgKyBub2RlID09PSBub2RlXG5cdFx0XHQ/IG5vZGVcblx0XHRcdDogbm9kZS50YWdOYW1lID09PSBTQ1JJUFRcblx0XHRcdFx0PyBub2RlLnR5cGUuc2xpY2UoMylcblx0XHRcdFx0OiBub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpIHx8IFwiXCIpO1xufVxuXG5mdW5jdGlvbiB2aWV3SW5mb3Mobm9kZSwgaXNWYWwsIHJCaW5kaW5nKSB7XG5cdC8vIFRlc3Qgd2hldGhlciBub2RlIGlzIGEgc2NyaXB0IG1hcmtlciBub2RlLCBhbmQgaWYgc28sIHJldHVybiBtZXRhZGF0YVxuXHRmdW5jdGlvbiBnZXRJbmZvcyhhbGwsIG9wZW4sIGNsb3NlLCBpZCwgY2gsIGVsUGF0aCkge1xuXHRcdGluZm9zLnB1c2goe1xuXHRcdFx0ZWxDbnQ6IGVsQ250LFxuXHRcdFx0aWQ6IGlkLFxuXHRcdFx0Y2g6IGNoLFxuXHRcdFx0b3Blbjogb3Blbixcblx0XHRcdGNsb3NlOiBjbG9zZSxcblx0XHRcdHBhdGg6IGVsUGF0aCxcblx0XHRcdHRva2VuOiBhbGxcblx0XHR9KTtcblx0fVxuXHR2YXIgZWxDbnQsIHRva2Vucyxcblx0XHRpbmZvcyA9IFtdO1xuXHRpZiAodG9rZW5zID0gaXNWYWwgPyBub2RlIDogbWFya2VyTm9kZUluZm8obm9kZSkpIHtcblx0XHRlbENudCA9IGluZm9zLmVsQ250ID0gbm9kZS50YWdOYW1lICE9PSBTQ1JJUFQ7XG5cdFx0ZWxDbnQgPSB0b2tlbnMuY2hhckF0KDApID09PSBcIkBcIiB8fCBlbENudDtcblx0XHRpbmZvcy5fdGtucyA9IHRva2Vucztcblx0XHQvLyByTWFya2VyVG9rZW5zID0gLyg/OigjKXwoXFwvKSkoXFxkKykoW19eXSkoWy0rQFxcZF0rKT8vZztcblx0XHR0b2tlbnMucmVwbGFjZShyQmluZGluZyB8fCByTWFya2VyVG9rZW5zLCBnZXRJbmZvcyk7XG5cdFx0cmV0dXJuIGluZm9zO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVubWFya1ByZXZPck5leHROb2RlKG5vZGUsIGVsQ250KSB7XG5cdGlmIChub2RlKSB7XG5cdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJqc3ZcIikge1xuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdH0gZWxzZSBpZiAoZWxDbnQgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpID09PSBcIlwiKSB7XG5cdFx0XHRub2RlLnJlbW92ZUF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cik7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIG1hcmtQcmV2T3JOZXh0Tm9kZShub2RlLCBlbENudCkge1xuXHR2YXIgbWFya2VyID0gbm9kZTtcblx0d2hpbGUgKGVsQ250ICYmIG1hcmtlciAmJiBtYXJrZXIubm9kZVR5cGUgIT09IDEpIHtcblx0XHRtYXJrZXIgPSBtYXJrZXIucHJldmlvdXNTaWJsaW5nO1xuXHR9XG5cdGlmIChtYXJrZXIpIHtcblx0XHRpZiAobWFya2VyLm5vZGVUeXBlICE9PSAxKSB7XG5cdFx0XHQvLyBGb3IgdGV4dCBub2Rlcywgd2Ugd2lsbCBhZGQgYSBzY3JpcHQgbm9kZSBiZWZvcmVcblx0XHRcdG1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoU0NSSVBUKTtcblx0XHRcdG1hcmtlci50eXBlID0gXCJqc3ZcIjtcblx0XHRcdG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFya2VyLCBub2RlKTtcblx0XHR9IGVsc2UgaWYgKCFtYXJrZXJOb2RlSW5mbyhtYXJrZXIpICYmICFtYXJrZXIuZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0Ly8gRm9yIGVsZW1lbnQgbm9kZXMsIHdlIHdpbGwgYWRkIGEgZGF0YS1saW5rIGF0dHJpYnV0ZSAodW5sZXNzIHRoZXJlIGlzIGFscmVhZHkgb25lKVxuXHRcdFx0Ly8gc28gdGhhdCB0aGlzIG5vZGUgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgbm9kZSBsaW5raW5nIHByb2Nlc3MuXG5cdFx0XHRtYXJrZXIuc2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyLCBcIlwiKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1hcmtlcjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGlua1RhZyhsaW5rTWFya3VwLCB0d293YXkpIHtcblx0bGlua01hcmt1cCA9ICQudHJpbShsaW5rTWFya3VwKS5yZXBsYWNlKHJFc2NhcGVRdW90ZXMsIFwiXFxcXCQmXCIpO1xuXHRyZXR1cm4gbGlua01hcmt1cC5zbGljZSgtMSkgIT09IGRlbGltQ2xvc2VDaGFyMFxuXHQvLyBJZiBzaW1wbGlmaWVkIHN5bnRheCBpcyB1c2VkOiBkYXRhLWxpbms9XCJleHByZXNzaW9uXCIsIGNvbnZlcnQgdG8gZGF0YS1saW5rPVwiezpleHByZXNzaW9ufVwiLFxuXHQvLyBvciBmb3IgaW5wdXRzLCBkYXRhLWxpbms9XCJ7OmV4cHJlc3Npb246fVwiIGZvciAoZGVmYXVsdCkgdHdvLXdheSBiaW5kaW5nXG5cdFx0PyBsaW5rTWFya3VwID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGxpbmtNYXJrdXAgKyAodHdvd2F5ID8gXCI6XCIgOiBcIlwiKSArIGRlbGltQ2xvc2VDaGFyMFxuXHRcdDogbGlua01hcmt1cDtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1ldGhvZHMgZm9yIHZpZXdzIGFuZCB0YWdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncykge1xuXHR2YXIgbGlua2VkRWxlbSwgZGlzcGxheUVsZW0sIGxpbmtlZEVsLCB2YWwsIGwsIGxpbmtlZFRhZywgb2xkVHJpZywgbmV3VHJpZywgdGFnUHJvcHMsIHByb3BzRXhwciwgbGlua2VkRWxlbVZpZXcsIHByb3AsIHByb3BEZWYsXG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eCxcblx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0cHJvcHMgPSB0YWdDdHgucHJvcHMsXG5cdFx0bGlua0N0eCA9IHRhZy5saW5rQ3R4O1xuXG5cdGlmICh0YWcuXy51bmxpbmtlZCkgeyAvLyBGaXJzdCBjYWxsIHRvIG9uQWZ0ZXJMaW5rLCBvciBmaXJzdCBjYWxsIGFmdGVyIG9uVXBkYXRlOiB1cGRhdGVDb250ZW50LiBJbml0aWFsaXplIGFuZCBjYWxsIG9uQmluZCBhbmQgc2V0IHByb3BlcnRpZXNcblx0XHRpZiAodGFnLmxpbmtlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gbGlua2VkRWxlbWVudDogLSBzZWxlY3RvciBmb3IgaWRlbnRpZnlpbmcgbGlua2VkIGVsZW1lbnQgaW4gdGVtcGxhdGUvcmVuZGVyZWQgY29udGVudFxuXHRcdFx0dGFnLmxpbmtlZEVsZW0gPSB0YWcuXy5pbmxpbmUgPyB0YWcuY29udGVudHModHJ1ZSwgdGFnLmxpbmtlZEVsZW1lbnQgfHwgXCIqXCIpLmZpcnN0KCkgOiAkKGxpbmtDdHguZWxlbSk7XG5cdFx0fVxuXHRcdGlmICh0YWcub25CaW5kKSB7XG5cdFx0XHR0YWcub25CaW5kKHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHRhZy5vbkFmdGVyTGluaykge1xuXHRcdHRhZy5vbkFmdGVyTGluayh0YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgsIGV2LCBldmVudEFyZ3MpO1xuXHR9XG5cblx0bGlua2VkRWxlbSA9IHRhZy50YXJnZXRUYWcgPyB0YWcudGFyZ2V0VGFnLmxpbmtlZEVsZW0gOiB0YWcubGlua2VkRWxlbTtcblx0ZGlzcGxheUVsZW0gPSB0YWcuZGlzcGxheUVsZW0gfHwgbGlua2VkRWxlbTtcblxuaWYgKGxpbmtlZEVsZW0gJiYgbGlua2VkRWxlbVswXSkge1xuXHRcdGlmICghdGFnLl8uY2hnaW5nKSB7XG5cdFx0XHR2YWwgPSB0YWcuY3Z0QXJncygpWzBdO1xuXHRcdFx0bCA9IGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRsaW5rZWRFbCA9IGxpbmtlZEVsZW1bbF07XG5cdFx0XHRcdGlmICh0YWcuXy51bmxpbmtlZCAmJiBsaW5rZWRFbCAhPT0gbGlua0N0eC5lbGVtKSB7XG5cdFx0XHRcdFx0bGlua2VkVGFnID0gbGlua2VkRWwuX2pzdkxrRWw7XG5cdFx0XHRcdFx0aWYgKHRhZy5fLmlubGluZSAmJiAoIWxpbmtlZFRhZyB8fCBsaW5rZWRUYWcgIT09IHRhZyAmJiBsaW5rZWRUYWcudGFyZ2V0VGFnICE9PSB0YWcpKSB7XG5cdFx0XHRcdFx0XHQvLyBGb3IgZGF0YS1saW5rZWQgdGFncywgaWRlbnRpZnkgdGhlIGxpbmtlZEVsIHdpdGggdGhlIHRhZywgZm9yIFwidG9cIiBiaW5kaW5nXG5cdFx0XHRcdFx0XHQvLyAoRm9yIGRhdGEtbGlua2VkIGVsZW1lbnRzLCBpZiBub3QgeWV0IGJvdW5kLCB3ZSBpZGVudGlmeSBsYXRlciB3aGVuIHRoZSBsaW5rQ3R4LmVsZW0gaXMgYm91bmQpXG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5fanN2TGtFbCA9IHRhZztcblx0XHRcdFx0XHRcdGJpbmRUbyhiaW5kaW5nU3RvcmVbdGFnLl90Z0lkXSwgdGFnLCBsaW5rZWRFbCk7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbC5fanN2Qm5kID0gXCImXCIgKyB0YWcuX3RnSWQgKyBcIitcIjsgLy8gQWRkIGEgXCIrXCIgZm9yIGNsb25lZCBiaW5kaW5nIC0gc28gcmVtb3Zpbmdcblx0XHRcdFx0XHRcdC8vIGVsZW1zIHdpdGggY2xvbmVkIGJpbmRpbmdzIHdpbGwgbm90IHJlbW92ZSB0aGUgJ3BhcmVudCcgYmluZGluZyBmcm9tIHRoZSBiaW5kaW5nU3RvcmUuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChsaW5rZWRFbC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRpZiAobGlua2VkRWwudHlwZSA9PT0gQ0hFQ0tCT1gpIHtcblx0XHRcdFx0XHRcdFx0bGlua2VkRWxbQ0hFQ0tFRF0gPSB2YWwgJiYgdmFsICE9PSBcImZhbHNlXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpbmtlZEVsLnR5cGUgPT09IFJBRElPKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVsW0NIRUNLRURdID0gKGxpbmtlZEVsLnZhbHVlID09PSB2YWwpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bGlua2VkRWwudmFsdWUgPSB2YWw7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChsaW5rZWRFbC5jb250ZW50RWRpdGFibGUgPT09IFRSVUUpIHtcblx0XHRcdFx0XHRcdGxpbmtlZEVsLmlubmVySFRNTCA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bGlua0N0eC5fdmFsID0gdmFsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcm9wcy5uYW1lKSB7XG5cdFx0XHRcdFx0bGlua2VkRWwubmFtZSA9IGxpbmtlZEVsLm5hbWUgfHwgcHJvcHMubmFtZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodGFnLnNldFNpemUpIHtcblx0XHRcdGlmIChwcm9wcy5oZWlnaHQpIHtcblx0XHRcdFx0ZGlzcGxheUVsZW0uaGVpZ2h0KHByb3BzLmhlaWdodCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJvcHMud2lkdGgpIHtcblx0XHRcdFx0ZGlzcGxheUVsZW0ud2lkdGgocHJvcHMud2lkdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAocHJvcHMudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGlzcGxheUVsZW0uYXR0cihcInRpdGxlXCIsIHByb3BzLnRpdGxlKTtcblx0XHR9XG5cdFx0aWYgKHByb3BzW1wiY2xhc3NcIl0pIHtcblx0XHRcdC8vIFRoaXMgY29kZSBzdXBwb3J0cyBkeW5hbWljIGJpbmRpbmcgdG8gY2xhc3MgLSB3aGVyZSBpdCBhZGRzIHRoZSBjbGFzcyBpZiBhYnNlbnQsIGFuZCByZW1vdmVzL2FkZHMgaWYgYSBwcmV2aW91cyB2YWx1ZSBpcyBwcmVzZW50XG5cdFx0XHRpZiAoZXZlbnRBcmdzICYmIGRpc3BsYXlFbGVtLmhhc0NsYXNzKGV2ZW50QXJncy5vbGRWYWx1ZSkpIHtcblx0XHRcdFx0ZGlzcGxheUVsZW0ucmVtb3ZlQ2xhc3MoZXZlbnRBcmdzLm9sZFZhbHVlKTtcblx0XHRcdH1cblx0XHRcdGRpc3BsYXlFbGVtLmFkZENsYXNzKHByb3BzW1wiY2xhc3NcIl0pO1xuXHRcdH1cblx0XHRpZiAocHJvcHMuaWQpIHtcblx0XHRcdGxpbmtlZEVsZW1bMF0uaWQgPSBwcm9wcy5pZDtcblx0XHR9XG5cdH1cblx0dGFnLl8udW5saW5rZWQgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzeW5jRWxlbUNoYW5nZUhhbmRsZXIoZXYpIHtcblx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRlbGVtQ2hhbmdlSGFuZGxlcihldik7XG5cdH0sIDApO1xufVxuXG5mdW5jdGlvbiBiaW5kRWxDaGFuZ2UoJGVsZW0sIHRyaWcsIG9ub2ZmKSB7XG5cdGlmICh0cmlnKSB7XG5cdFx0dHJpZyA9IFwiXCIgKyB0cmlnID09PSB0cmlnID8gdHJpZyA6IFwia2V5ZG93blwiOyAvLyBTZXQgdHJpZ2dlciB0byAodHJ1ZSB8fCB0cnVleSBub24tc3RyaW5nIChlLmcuIDEpIHx8ICdrZXlkb3duJyk6IEdldCAna2V5ZG93bicgd2l0aCBhc3luY1xuXHRcdCRlbGVtW29ub2ZmXSh0cmlnLCB0cmlnID09PSBcImtleWRvd25cIiA/IGFzeW5jRWxlbUNoYW5nZUhhbmRsZXIgOiBlbGVtQ2hhbmdlSGFuZGxlcik7XG5cdH1cbn1cblxuZnVuY3Rpb24gYmluZFRvKGJpbmRpbmcsIHRhZywgbGlua2VkRWxlbSwgY3Z0QmspIHtcblx0Ly8gVHdvLXdheSBiaW5kaW5nLlxuXHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcudG9bMV0gdG8gYmUgdGhlIGN2dEJhY2ssIGFuZCBiaW5kaW5nLnRvWzBdIHRvIGJlIGVpdGhlciB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0LCBvciBbb2JqZWN0LCBwYXRoXSB3aGVyZSB0aGUgdGFyZ2V0IGlzIHRoZSBwYXRoIG9uIHRoZSBwcm92aWRlZCBvYmplY3QuXG5cdC8vIFNvIGZvciBhIGNvbXB1dGVkIHBhdGggd2l0aCBhbiBvYmplY3QgY2FsbDogYS5iLmdldE9iamVjdCgpLmQuZSwgdGhlbiB3ZSBzZXQgdG9bMF0gdG8gYmUgW2V4cHJPYiwgXCJkLmVcIl0sIGFuZCB3ZSBiaW5kIHRvIHRoZSBwYXRoIG9uIHRoZSByZXR1cm5lZCBvYmplY3QsIGV4cHJPYi5vYiwgYXMgdGFyZ2V0XG5cdC8vIE90aGVyd2lzZSBvdXIgdGFyZ2V0IGlzIHRoZSBmaXJzdCBwYXRoLCBwYXRoc1swXSwgd2hpY2ggd2Ugd2lsbCBjb252ZXJ0IHdpdGggY29udGV4dENiKCkgZm9yIHBhdGhzIGxpa2UgfmEuYi5jIG9yICN4LnkuelxuXG5cdHZhciBiaW5kdG8sIHBhdGhJbmRleCwgcGF0aCwgbGFzdFBhdGgsIGJpbmR0b09iLCAkbGlua2VkRWxlbSwgbmV3VHJpZywgb2xkVHJpZywgdG8sIGwsIHRvdHJ5LFxuXHRcdGxpbmtDdHggPSBiaW5kaW5nLmxpbmtDdHgsXG5cdFx0c291cmNlID0gbGlua0N0eC5kYXRhLFxuXHRcdHBhdGhzID0gbGlua0N0eC5mbi5wYXRocztcblxuXHR0YWcgPSB0YWcgfHwgbGlua2VkRWxlbS5fanN2TGtFbDtcblxuXHRcdGlmIChiaW5kaW5nICYmIHBhdGhzICYmICFiaW5kaW5nLnRvKSB7XG5cdFx0b2xkVHJpZyA9IGxpbmtlZEVsZW0uX2pzdlRyIHx8IGZhbHNlO1xuXHRcdGlmICh0YWcpIHtcblx0XHRcdGN2dEJrID0gdGFnLmNvbnZlcnRCYWNrIHx8IGN2dEJrO1xuXHRcdFx0bmV3VHJpZyA9IHRhZy50YWdDdHgucHJvcHMudHJpZ2dlcjtcblx0XHR9XG5cdFx0bmV3VHJpZyA9IG5ld1RyaWcgPT09IHVuZGVmaW5lZCA/ICRzdWJTZXR0aW5ncy50cmlnZ2VyIDogbmV3VHJpZztcblx0XHQvLyBUcmlnZ2VyIGlzIG5vb3AgZXhjZXB0IGZvciB0ZXh0IGJveCwgdGV4dGFyZWEsIGNvbnRlbnRlZGl0YWJsZS4uLlxuXHRcdG5ld1RyaWcgPSBuZXdUcmlnICYmIChsaW5rZWRFbGVtLnRhZ05hbWUgPT09IFwiSU5QVVRcIiAmJiBsaW5rZWRFbGVtLnR5cGUgIT09IENIRUNLQk9YICYmIGxpbmtlZEVsZW0udHlwZSAhPT0gUkFESU8gfHwgbGlua2VkRWxlbS50eXBlID09PSBcInRleHRhcmVhXCIgfHwgbGlua2VkRWxlbS5jb250ZW50RWRpdGFibGUgPT09IFRSVUUpICYmIG5ld1RyaWcgfHwgZmFsc2U7XG5cblx0XHRpZiAob2xkVHJpZyAhPT0gbmV3VHJpZykge1xuXHRcdFx0JGxpbmtlZEVsZW0gPSAkKGxpbmtlZEVsZW0pO1xuXHRcdFx0YmluZEVsQ2hhbmdlKCRsaW5rZWRFbGVtLCBvbGRUcmlnLCBcIm9mZlwiKTtcblx0XHRcdGJpbmRFbENoYW5nZShcblx0XHRcdFx0JGxpbmtlZEVsZW0sXG5cdFx0XHRcdGxpbmtlZEVsZW0uX2pzdlRyID0gbmV3VHJpZyxcblx0XHRcdFx0XCJvblwiXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHBhdGhzID0gKGJpbmR0byA9IHBhdGhzLl9qc3Z0bykgfHwgcGF0aHNbMF07XG5cdFx0cGF0aEluZGV4ID0gcGF0aHMgJiYgcGF0aHMubGVuZ3RoO1xuXHRcdGlmIChwYXRoSW5kZXggJiYgKCF0YWcgfHwgdGFnLnRhZ0N0eC5hcmdzLmxlbmd0aCkpIHtcblx0XHRcdGxhc3RQYXRoID0gcGF0aHNbcGF0aEluZGV4IC0gMV07XG5cdFx0XHRpZiAobGFzdFBhdGguX2pzdikge1xuXHRcdFx0XHRiaW5kdG9PYiA9IGxhc3RQYXRoO1xuXHRcdFx0XHR3aGlsZSAobGFzdFBhdGguc2IgJiYgbGFzdFBhdGguc2IuX2pzdikge1xuXHRcdFx0XHRcdHBhdGggPSBsYXN0UGF0aCA9IGxhc3RQYXRoLnNiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGggPSBsYXN0UGF0aC5zYiB8fCBwYXRoICYmIHBhdGgucGF0aDtcblx0XHRcdFx0bGFzdFBhdGggPSBwYXRoID8gcGF0aC5zbGljZSgxKSA6IGJpbmR0b09iLnBhdGg7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHR0byA9IFtcblx0XHRcdFx0XHRcdGJpbmR0b09iLCAvLyAnZXhwck9iJyBmb3IgdGhpcyBleHByZXNzaW9uIGFuZCB2aWV3LWJpbmRpbmcuIFNvIGJpbmR0b09iLm9iIGlzIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IGV4cHJlc3Npb24uXG5cdFx0XHRcdFx0XHRsYXN0UGF0aFxuXHRcdFx0XHRcdF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoKHRvdHJ5ID0gbGlua0N0eC5fY3R4Q2IocGF0aCA9IGxhc3RQYXRoLnNwbGl0KFwiXlwiKS5qb2luKFwiLlwiKSwgc291cmNlKSkgJiYgKGwgPSB0b3RyeS5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0Ly8gUmVjdXJzaXZlbHkgZGVyZWZlcmVuY2UgYW55IH5mb28gb3IgI2JhciB0b2tlbnMgaW4gdGhlIHBhdGguIChSZWN1cnNpdmUgYmVjYXVzZSB+Zm9vIG1heSBiZSBhIGNvbnRleHR1YWwgcGFyYW0gd2hpY2ggaGFzXG5cdFx0XHRcdFx0Ly8gaXRzIG93biBkZXBlbmRlbmNpZXMgb24gb3RoZXIgfmZvbyAjYmFyIGNvbXBvbmVudHMpXG5cdFx0XHRcdFx0dG8gPSB0b3RyeTtcblx0XHRcdFx0XHRpZiAodG8uX2NwKSB7IC8vIFR3by13YXkgYmluZGluZyB0byBhIGNvbnRleHR1YWwgcGFyYW1ldGVyIHJlZmVyZW5jZSwgfmZvbyAoZGVjbGFyZWQgYXMgfmZvbz1leHByIG9uIGEgcGFyZW50IHRhZylcblx0XHRcdFx0XHRcdHRvID0gW3RvW2wtM10sIHRvW2wtMl1dO1xuXHRcdFx0XHRcdFx0bGFzdFBhdGggPSB0b1sxXTtcblx0XHRcdFx0XHRcdGlmIChsYXN0UGF0aC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdGJpbmR0b09iID0gbGFzdFBhdGg7XG5cdFx0XHRcdFx0XHRcdHdoaWxlIChsYXN0UGF0aC5zYiAmJiBsYXN0UGF0aC5zYi5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoID0gbGFzdFBhdGguc2I7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoLnNiIHx8IHBhdGggJiYgcGF0aC5wYXRoO1xuXHRcdFx0XHRcdFx0XHRsYXN0UGF0aCA9IHBhdGggPyBwYXRoLnNsaWNlKDEpIDogYmluZHRvT2IucGF0aDtcblx0XHRcdFx0XHRcdFx0dG8gPSBbXG5cdFx0XHRcdFx0XHRcdFx0YmluZHRvT2IsIC8vICdleHByT2InIGZvciB0aGlzIGV4cHJlc3Npb24gYW5kIHZpZXctYmluZGluZy4gU28gYmluZHRvT2Iub2IgaXMgY3VycmVudCBvYmplY3QgcmV0dXJuZWQgYnkgZXhwcmVzc2lvbi5cblx0XHRcdFx0XHRcdFx0XHRsYXN0UGF0aFxuXHRcdFx0XHRcdFx0XHRdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7IC8vIFR3by13YXkgYmluZGluZyB0byBhIGhlbHBlciAtIGUuZy4gfmFkZHJlc3Muc3RyZWV0LCBvciBjb21wdXRlZCwgZS5nLiB+ZnVsbE5hbWUoKSwgb3IgdmlldyBwcm9wZXJ0eSBlLmcuICNkYXRhLmZvb1xuXHRcdFx0XHRcdFx0dG8gPSBsPjJcblx0XHRcdFx0XHRcdFx0PyBbdG9bbC0zXSwgdG9bbC0yXV0gLy8gV2l0aCBwYXRoOiBbb2JqZWN0LCBwYXRoXVxuXHRcdFx0XHRcdFx0XHQ6IFt0b1tsLTJdXTsgICAgICAgICAvLyBObyBwYXRoLCAoZS5nLiBbZnVuY3Rpb25dIGZvciBjb21wdXRlZCB3aXRoIHNldHRlcilcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c291cmNlID0gdG9bMF07XG5cdFx0XHRcdFx0bGFzdFBhdGggPSB0b1sxXTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0byA9IHRvIHx8IFtzb3VyY2UsIHBhdGhdOyAvLyBUd28gd2F5IGJpbmRpbmcgdG8gYW4gb2JqZWN0IChuZWl0aGVyIH5mb28gbm9yICNiYXIpXG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRvID0gW107XG5cdFx0fVxuXHRcdGJpbmRpbmcudG8gPSBbXG5cdFx0XHR0byxcblx0XHRcdGN2dEJrXG5cdFx0XTtcblx0fVxufVxuXG5mdW5jdGlvbiBtZXJnZUN0eHModGFnLCBuZXdDdHhzLCByZXBsYWNlKSB7IC8vIE1lcmdlIHVwZGF0ZWQgdGFnQ3R4cyBpbnRvIHRhZy50YWdDdHhzXG5cdHZhciB0YWdDdHgsIG5ld1RhZ0N0eCxcblx0XHR2aWV3ID0gdGFnLnRhZ0N0eC52aWV3LFxuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cyB8fCBbdGFnLnRhZ0N0eF0sXG5cdFx0bCA9IHRhZ0N0eHMubGVuZ3RoLFxuXHRcdHJlZnJlc2ggPSAhbmV3Q3R4cztcblxuXHRuZXdDdHhzID0gbmV3Q3R4cyB8fCB0YWcuXy5ibmQuY2FsbCh2aWV3LnRtcGwsICh0YWcubGlua0N0eCB8fCB2aWV3KS5kYXRhLCB2aWV3LCAkc3ViKTtcblxuXHRpZiAocmVwbGFjZSkge1xuXHRcdC8vIFJlcGxhY2UgcHJldmlvdXMgdGFnQ3R4cyBieSBuZXcgb25lcywgcmF0aGVyIHRoYW4gbWVyZ2luZ1xuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cyA9IG5ld0N0eHM7XG5cdFx0dGFnLnRhZ0N0eCA9IHRhZ0N0eHNbMF07XG5cdH0gZWxzZSB7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0dGFnQ3R4ID0gdGFnQ3R4c1tsXTtcblx0XHRcdG5ld1RhZ0N0eCA9IG5ld0N0eHNbbF07XG5cdFx0XHQkb2JzZXJ2YWJsZSh0YWdDdHgucHJvcHMpLnNldFByb3BlcnR5KG5ld1RhZ0N0eC5wcm9wcyk7XG5cdFx0XHQkZXh0ZW5kKHRhZ0N0eC5jdHgsIG5ld1RhZ0N0eC5jdHgpOyAvLyBXZSBkb24ndCBzdXBwb3J0IHByb3BhZ2F0aW5nIGN0eCB2YXJpYWJsZXMsIH5mb28sIG9ic2VydmFibHksIHRvIG5lc3RlZCB2aWV3cy4gU28gZXh0ZW5kLCBub3Qgc2V0UHJvcGVydHkuLi5cblx0XHRcdHRhZ0N0eC5hcmdzID0gbmV3VGFnQ3R4LmFyZ3M7XG5cdFx0XHRpZiAocmVmcmVzaCkge1xuXHRcdFx0XHR0YWdDdHgudG1wbCA9IG5ld1RhZ0N0eC50bXBsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQkc3ViLl90aHModGFnLCB0YWdDdHhzWzBdKTsgLy8gdGFnSGFuZGxlcnNGcm9tUHJvcHNcblx0cmV0dXJuIHRhZ0N0eHM7XG59XG5cbi8vPT09PT09PT09XG4vLyBEaXNwb3NhbFxuLy89PT09PT09PT1cblxuZnVuY3Rpb24gY2xlYW4oZWxlbXMpIHtcblx0Ly8gUmVtb3ZlIGRhdGEtbGluayBiaW5kaW5ncywgb3IgY29udGFpbmVkIHZpZXdzXG5cdHZhciBsLCBlbGVtLCBiaW5kaW5ncyxcblx0XHRlbGVtQXJyYXkgPSBbXSxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0aSA9IGxlbjtcblx0d2hpbGUgKGktLSkge1xuXHRcdC8vIENvcHkgaW50byBhbiBhcnJheSwgc28gdGhhdCBkZWxldGlvbiBvZiBub2RlcyBmcm9tIERPTSB3aWxsIG5vdCBjYXVzZSBvdXIgJ2knIGNvdW50ZXIgdG8gZ2V0IHNoaWZ0ZWRcblx0XHQvLyAoTm90ZTogVGhpcyBzZWVtcyBhcyBmYXN0IG9yIGZhc3RlciB0aGFuIGVsZW1BcnJheSA9IFtdLnNsaWNlLmNhbGwoZWxlbXMpOyAuLi4pXG5cdFx0ZWxlbUFycmF5LnB1c2goZWxlbXNbaV0pO1xuXHR9XG5cdGkgPSBsZW47XG5cdHdoaWxlIChpLS0pIHtcblx0XHRlbGVtID0gZWxlbUFycmF5W2ldO1xuXHRcdGlmIChlbGVtLnBhcmVudE5vZGUpIHtcblx0XHRcdC8vIEhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG5cdFx0XHRpZiAoYmluZGluZ3MgPSBlbGVtLl9qc3ZCbmQpIHtcblx0XHRcdFx0Ly8gR2V0IHByb3BlcnR5Q2hhbmdlIGJpbmRpbmdzIGZvciB0aGlzIGVsZW1lbnRcblx0XHRcdFx0Ly8gVGhpcyBtYXkgYmUgYW4gZWxlbWVudCB3aXRoIGRhdGEtbGluaywgb3IgdGhlIG9wZW5pbmcgc2NyaXB0IG1hcmtlciBub2RlIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fVxuXHRcdFx0XHQvLyBiaW5kaW5ncyBpcyBhIHN0cmluZyB3aXRoIHRoZSBzeW50YXg6IFwiKCZiaW5kaW5nSWQpKlwiXG5cdFx0XHRcdGJpbmRpbmdzID0gYmluZGluZ3Muc2xpY2UoMSkuc3BsaXQoXCImXCIpO1xuXHRcdFx0XHRlbGVtLl9qc3ZCbmQgPSBcIlwiO1xuXHRcdFx0XHRsID0gYmluZGluZ3MubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGFzc29jaWF0ZWQgYmluZGluZ3Ncblx0XHRcdFx0XHRyZW1vdmVWaWV3QmluZGluZyhiaW5kaW5nc1tsXSwgZWxlbS5fanN2TGtFbCwgZWxlbSk7IC8vIHVuYmluZCBiaW5kaW5ncyB3aXRoIHRoaXMgYmluZGluZ0lkIG9uIHRoaXMgdmlld1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRkaXNwb3NlVG9rZW5zKG1hcmtlck5vZGVJbmZvKGVsZW0pICsgKGVsZW0uX2RmIHx8IFwiXCIpKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlVmlld0JpbmRpbmcoYmluZElkLCBsaW5rZWRFbGVtVGFnLCBlbGVtKSB7XG5cdC8vIFVuYmluZFxuXHR2YXIgb2JqSWQsIGxpbmtDdHgsIHRhZywgb2JqZWN0LCBvYnNJZCwgdGFnQ3R4cywgbCwgbWFwLCAkbGlua2VkRWxlbSwgbGlua2VkRWxlbSwgdHJpZ2dlciwgdmlldywgdGFyZ2V0VGFnLFxuXHRcdGJpbmRpbmcgPSBiaW5kaW5nU3RvcmVbYmluZElkXTtcblxuXHRpZiAobGlua2VkRWxlbVRhZykge1xuXHRcdGxpbmtlZEVsZW1UYWcgPSBsaW5rZWRFbGVtVGFnLnRhcmdldFRhZyB8fCBsaW5rZWRFbGVtVGFnO1xuXHRcdGVsZW0uX2pzdkxrRWwgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoYmluZGluZykge1xuXHRcdGRlbGV0ZSBiaW5kaW5nU3RvcmVbYmluZElkXTsgLy8gRGVsZXRlIGFscmVhZHksIHNvIGNhbGwgdG8gb25EaXNwb3NlIGhhbmRsZXIgYmVsb3cgY2Fubm90IHRyaWdnZXIgcmVjdXJzaXZlIGRlbGV0aW9uICh0aHJvdWdoIHJlY3Vyc2l2ZSBjYWxsIHRvIGpRdWVyeSBjbGVhbkRhdGEpXG5cdFx0Zm9yIChvYmpJZCBpbiBiaW5kaW5nLmJuZCkge1xuXHRcdFx0b2JqZWN0ID0gYmluZGluZy5ibmRbb2JqSWRdO1xuXHRcdFx0b2JzSWQgPSBiaW5kaW5nLmNiSWQ7XG5cdFx0XHRpZiAoJGlzQXJyYXkob2JqZWN0KSkge1xuXHRcdFx0XHQkKFtvYmplY3RdKS5vZmYoYXJyYXlDaGFuZ2VTdHIgKyBvYnNJZCkub2ZmKHByb3BlcnR5Q2hhbmdlU3RyICsgb2JzSWQpOyAvLyBUaGVyZSBtYXkgYmUgZWl0aGVyIG9yIGJvdGggb2YgYXJyYXlDaGFuZ2UgYW5kIHByb3BlcnR5Q2hhbmdlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkKG9iamVjdCkub2ZmKHByb3BlcnR5Q2hhbmdlU3RyICsgb2JzSWQpO1xuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIGJpbmRpbmcuYm5kW29iaklkXTtcblx0XHR9XG5cblx0XHRpZiAobGlua0N0eCA9IGJpbmRpbmcubGlua0N0eCkge1xuXHRcdFx0aWYgKHRhZyA9IGxpbmtDdHgudGFnKSB7XG5cdFx0XHRcdGlmICh0YWdDdHhzID0gdGFnLnRhZ0N0eHMpIHtcblx0XHRcdFx0XHRsID0gdGFnQ3R4cy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdFx0aWYgKG1hcCA9IHRhZ0N0eHNbbF0ubWFwKSB7XG5cdFx0XHRcdFx0XHRcdG1hcC51bm1hcCgpOyAvL3Vub2JzZXJ2ZVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQkbGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtO1xuXG5cdFx0XHRcdGlmICh0YWcub25VbmJpbmQpIHtcblx0XHRcdFx0XHR0YWcub25VbmJpbmQodGFnLnRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRhZy5vbkRpc3Bvc2UpIHtcblx0XHRcdFx0XHR0YWcub25EaXNwb3NlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXRhZy5fZWxDbnQpIHtcblx0XHRcdFx0XHRpZiAodGFnLl9wcnYpIHtcblx0XHRcdFx0XHRcdHRhZy5fcHJ2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFnLl9wcnYpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGFnLl9ueHQpIHtcblx0XHRcdFx0XHRcdHRhZy5fbnh0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFnLl9ueHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGlua2VkRWxlbSA9ICRsaW5rZWRFbGVtICYmICRsaW5rZWRFbGVtWzBdIHx8IGxpbmtDdHguZWxlbTtcblxuXHRcdFx0aWYgKHRyaWdnZXIgPSBsaW5rZWRFbGVtICYmIGxpbmtlZEVsZW0uX2pzdlRyKSB7XG5cdFx0XHRcdGJpbmRFbENoYW5nZSgkbGlua2VkRWxlbSB8fCAkKGxpbmtlZEVsZW0pLCB0cmlnZ2VyLCBcIm9mZlwiKTtcblx0XHRcdFx0bGlua2VkRWxlbS5fanN2VHIgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHR2aWV3ID0gbGlua0N0eC52aWV3O1xuXHRcdFx0aWYgKHZpZXcudHlwZSA9PT0gXCJsaW5rXCIpIHtcblx0XHRcdFx0dmlldy5wYXJlbnQucmVtb3ZlVmlld3Modmlldy5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTsgLy8gQSBcImxpbmtcIiB2aWV3IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmluZGluZywgc28gc2hvdWxkIGJlIGRpc3Bvc2VkIHdpdGggYmluZGluZy5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSB2aWV3Ll8uYm5kc1tiaW5kSWRdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRkZWxldGUgY2JCaW5kaW5nc1N0b3JlW2JpbmRpbmcuY2JJZF07XG5cdH1cbn1cblxuZnVuY3Rpb24gJHVubGluayh0bykge1xuXHRpZiAodG8pIHtcblx0XHR0byA9IHRvLmpxdWVyeSA/IHRvIDogJCh0byk7XG5cdFx0dG8uZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbm5lclZpZXc7XG5cdFx0XHQvL1RPRE8gZml4IHRoaXMgZm9yIGJldHRlciBwZXJmLiBSYXRoZXIgdGhhdCBjYWxsaW5nIGlubmVyIHZpZXcgbXVsdGlwbGUgdGltZXMgd2hpY2ggZG9lcyBxdWVyeVNlbGVjdG9yQWxsIGVhY2ggdGltZSwgY29uc2lkZXIgYSBzaW5nbGUgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0Ly8gb3Igc2ltcGx5IGNhbGwgdmlldy5yZW1vdmVWaWV3cygpIG9uIHRoZSB0b3AtbGV2ZWwgdmlld3MgdW5kZXIgdGhlIHRhcmdldCAndG8nIG5vZGUsIHRoZW4gY2xlYW4oLi4uKVxuXHRcdFx0d2hpbGUgKChpbm5lclZpZXcgPSAkdmlldyh0aGlzLCB0cnVlKSkgJiYgaW5uZXJWaWV3LnBhcmVudCkge1xuXHRcdFx0XHRpbm5lclZpZXcucGFyZW50LnJlbW92ZVZpZXdzKGlubmVyVmlldy5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdGNsZWFuKHRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpKTtcblx0XHR9KTtcblx0XHRjbGVhbih0byk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQ2FsbCB0byAkLnVubGluaygpIGlzIGVxdWl2YWxlbnQgdG8gJC51bmxpbmsodHJ1ZSwgXCJib2R5XCIpXG5cdFx0aWYgKGFjdGl2ZUJvZHkpIHtcblx0XHRcdCQoYWN0aXZlQm9keSlcblx0XHRcdFx0Lm9mZihlbGVtZW50Q2hhbmdlU3RyLCBlbGVtQ2hhbmdlSGFuZGxlcilcblx0XHRcdFx0Lm9mZignYmx1cicsICdbY29udGVudGVkaXRhYmxlXScsIGVsZW1DaGFuZ2VIYW5kbGVyKTtcblx0XHRcdGFjdGl2ZUJvZHkgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHRvcFZpZXcucmVtb3ZlVmlld3MoKTtcblx0XHRjbGVhbihkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSk7XG5cdH1cbn1cblxuLy89PT09PT09PVxuLy8gSGVscGVyc1xuLy89PT09PT09PVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0Q2IodmlldykgeyAvLyBSZXR1cm4gYSBjYWxsYmFjayBmb3IgYWNjZXNzaW5nIHRoZSBjb250ZXh0IG9mIGEgdGVtcGxhdGUvZGF0YS1saW5rIGV4cHJlc3Npb24gLSBhbmQgY29udmVydGluZyB+Zm9vLCAjZm9vIGV0Yy5cblx0Ly8gVE9ETyBDb25zaWRlciBleHBvc2luZyBvciBhbGxvd2luZyBvdmVycmlkZSwgYXMgcHVibGljIEFQSVxuXHRyZXR1cm4gZnVuY3Rpb24ocGF0aCwgb2JqZWN0LCBkZXB0aCkge1xuXHRcdC8vIFRPRE8gY29uc2lkZXIgb25seSBjYWxsaW5nIHRoZSBjb250ZXh0Q2Igb24gdGhlIGluaXRpYWwgdG9rZW4gaW4gcGF0aCAnfmEuYi5jJyBhbmQgbm90IGNhbGxpbmcgYWdhaW4gb25cblx0XHQvLyB0aGUgaW5kaXZpZHVhbCB0b2tlbnMsICdhJywgJ2InLCAnYycuLi4gQ3VycmVudGx5IGl0IGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lc1xuXHRcdHZhciB0b2tlbnMsIHRhZywgaXRlbXMsIGhlbHBlciwgbGFzdCwgbmV4dFBhdGgsIGw7XG5cdFx0aWYgKHZpZXcgJiYgcGF0aCkge1xuXHRcdFx0aWYgKHBhdGguX2pzdikge1xuXHRcdFx0XHRyZXR1cm4gcGF0aC5fanN2LmNhbGwodmlldy50bXBsLCBvYmplY3QsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhdGguY2hhckF0KDApID09PSBcIn5cIikge1xuXHRcdFx0XHQvLyBXZSByZXR1cm4gbmV3IGl0ZW1zIHRvIGluc2VydCBpbnRvIHRoZSBzZXF1ZW5jZSwgcmVwbGFjaW5nIHRoZSBcIn5hLmIuY1wiIHN0cmluZzpcblx0XHRcdFx0Ly8gW2hlbHBlck9iamVjdCAnYScsIFwiYS5iLmNcIiBjdXJyZW50RGF0YUl0ZW1dIHNvIGN1cnJlbnREYXRhSXRlbSBiZWNvbWVzIHRoZSBvYmplY3QgZm9yIHN1YnNlcXVlbnQgcGF0aHMuXG5cdFx0XHRcdGlmIChwYXRoLnNsaWNlKDAsIDQpID09PSBcIn50YWdcIikge1xuXHRcdFx0XHRcdHRhZyA9IHZpZXcuY3R4O1xuXHRcdFx0XHRcdGlmIChwYXRoLmNoYXJBdCg0KSA9PT0gXCIuXCIpIHtcblx0XHRcdFx0XHRcdC8vIFwifnRhZy54eHhcIlxuXHRcdFx0XHRcdFx0dG9rZW5zID0gcGF0aC5zbGljZSg1KS5zcGxpdChcIi5cIik7XG5cdFx0XHRcdFx0XHR0YWcgPSB0YWcudGFnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodG9rZW5zKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGFnID8gW3RhZywgdG9rZW5zLmpvaW4oXCIuXCIpLCBvYmplY3RdIDogW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGggPSBwYXRoLnNsaWNlKDEpLnNwbGl0KFwiLlwiKTtcblx0XHRcdFx0aWYgKGhlbHBlciA9IHZpZXcuaGxwKGxhc3QgPSBwYXRoLnNoaWZ0KCksIHRydWUpKSB7XG5cdFx0XHRcdFx0aWYgKGhlbHBlci5fY3ApIHsgIC8vIGhlbHBlciBmb3IgKGNvbnRleHR1YWwgcGFyYW1ldGVyIH5mb289Li4uKSBpcyBhbiBhcnJheSAtIFtkYXRhLCBjdHhQcm1EZXBlbmRlbmNpZXMgLi4uXVxuXHRcdFx0XHRcdFx0aWYgKHBhdGgubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdG5leHRQYXRoID0gXCIuXCIgKyBwYXRoLmpvaW4oXCIuXCIpO1xuXHRcdFx0XHRcdFx0XHRsYXN0ID0gaGVscGVyW2wgPSBoZWxwZXIubGVuZ3RoLTFdO1xuXHRcdFx0XHRcdFx0XHRpZiAobGFzdC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdFx0bGFzdC5zYiA9IG5leHRQYXRoO1xuXHRcdFx0XHRcdFx0XHRcdGxhc3QuYm5kID0gISFkZXB0aDtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRoZWxwZXJbbF0gPSAobGFzdCArIG5leHRQYXRoKS5yZXBsYWNlKFwiI2RhdGEuXCIsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChsYXN0LnNsaWNlKDAsIDUpID09PSBcIiN2aWV3XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGhlbHBlcltsXSA9IGhlbHBlcltsXS5zbGljZSg2KTtcblx0XHRcdFx0XHRcdFx0XHRcdGhlbHBlci5zcGxpY2UobCwgMCwgdmlldyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRoZWxwZXIucHVzaChvYmplY3QpO1xuXHRcdFx0XHRcdFx0aXRlbXMgPSBoZWxwZXI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChwYXRoLmxlbmd0aCB8fCAkaXNGdW5jdGlvbihoZWxwZXIpKSB7XG5cdFx0XHRcdFx0XHRpdGVtcyA9IFtoZWxwZXIsIHBhdGguam9pbihcIi5cIiksIG9iamVjdF07IC8vIDJ3YXkgYmluZG5nIG9uIH5mb28uaGVscGVyTGVhZlByb3BlcnR5IG9yIH5jb21wdXRlZCgpIG9yIH5jb250ZXh0dWFsUGFyYW1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGl0ZW1zIHx8IFtdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhdGguY2hhckF0KDApID09PSBcIiNcIikge1xuXHRcdFx0XHQvLyBXZSByZXR1cm4gbmV3IGl0ZW1zIHRvIGluc2VydCBpbnRvIHRoZSBzZXF1ZW5jZSwgcmVwbGFjaW5nIHRoZSBcIiNhLmIuY1wiIHN0cmluZzogW3ZpZXcsIFwiYS5iLmNcIiBjdXJyZW50RGF0YUl0ZW1dXG5cdFx0XHRcdC8vIHNvIGN1cnJlbnREYXRhSXRlbSBiZWNvbWVzIHRoZSBvYmplY3QgZm9yIHN1YnNlcXVlbnQgcGF0aHMuIFRoZSAndHJ1ZScgZmxhZyBtYWtlcyB0aGUgcGF0aHMgYmluZCBvbmx5IHRvIGxlYWYgY2hhbmdlcy5cblx0XHRcdFx0cmV0dXJuIHBhdGggPT09IFwiI2RhdGFcIiA/IFtdIDogW3ZpZXcsIHBhdGgucmVwbGFjZShyVmlld1BhdGgsIFwiXCIpLCBvYmplY3RdO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gaW5wdXRBdHRyaWIoZWxlbSkge1xuXHRyZXR1cm4gZWxlbS50eXBlID09PSBDSEVDS0JPWCA/IGVsZW1bQ0hFQ0tFRF0gOiBlbGVtLnZhbHVlO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy89PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzUmVuZGVyIGludGVncmF0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PVxuXG4kc3ViLm9uU3RvcmUudGVtcGxhdGUgPSBmdW5jdGlvbihuYW1lLCBpdGVtKSB7XG5cdGl0ZW0ubGluayA9IHRtcGxMaW5rO1xuXHRpZiAobmFtZSkge1xuXHRcdCQubGlua1tuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRtcGxMaW5rLmFwcGx5KGl0ZW0sIGFyZ3VtZW50cyk7XG5cdFx0fTtcblx0fVxufTtcblxuJHN1Yi52aWV3SW5mb3MgPSB2aWV3SW5mb3M7IC8vIEV4cG9zZSB2aWV3SW5mb3MoKSBhcyBwdWJsaWMgaGVscGVyIG1ldGhvZFxuXG4vLyBEZWZpbmUgSnNWaWV3cyB2ZXJzaW9uIG9mIGRlbGltaXRlcnMoKSwgYW5kIGluaXRpYWxpemVcbigkdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzID0gZnVuY3Rpb24oKSB7XG5cdC8vIFJ1biBkZWxpbWl0ZXJzIGluaXRpYWxpemF0aW9uIGluIGNvbnRleHQgb2YganNyZW5kZXIuanNcblx0dmFyIHJldCA9IG9sZEpzdkRlbGltaXRlcnMuYXBwbHkoMCwgYXJndW1lbnRzKTtcblxuXHRpZiAob2xkSnN2RGVsaW1pdGVycyAhPT0gJHZpZXdzRGVsaW1pdGVycykge1xuXHRcdC8vIElmIEpzUmVuZGVyIHdhcyBsb2FkZWQgYmVmb3JlIEpzVmlld3MsIHRoZW4gbmVlZCBhbHNvIHRvIGluaXRpYWxpemUgYW5kIHNldCBnbG9iYWxzIGluIHRoYXQgSnNSZW5kZXIgaW5zdGFuY2Vcblx0XHRyZXQgPSAkdmlld3NEZWxpbWl0ZXJzLmFwcGx5KDAsIGFyZ3VtZW50cyk7XG5cdH1cblxuXHQvLyBEYXRhLWxpbmtpbmcgbXVzdCB1c2UgbmV3IGRlbGltaXRlcnNcblx0clRhZ0RhdGFsaW5rID0gbmV3IFJlZ0V4cChcIig/Ol58XFxcXHMqKShbXFxcXHctXSopKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpPyhcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMSArICRzdWIuclRhZyArIFwiKDpcXFxcdyopP1xcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiKVwiLCBcImdcIik7XG5cdHJldHVybiByZXQ7XG59KSgpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuJHN1Yi5hZGRTZXR0aW5nKFwidHJpZ2dlclwiKTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFkZGl0aW9uYWwgbWVtYmVycyBmb3IgbGlua2VkIHZpZXdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiB0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnRFbGVtLCBpZCwgdmlld09yVGFnQ2hhciwgcmVmcmVzaCkge1xuXHQvLyBUcmFuc2ZlciB0b2tlbnMgb24gcHJldk5vZGUgb2Ygdmlld1RvUmVtb3ZlL3ZpZXdUb1JlZnJlc2ggdG8gbmV4dE5vZGUgb3IgcGFyZW50RWxlbS5fZGZcblx0dmFyIGksIGwsIHZ3SW5mb3MsIHZ3SW5mbywgdmlld09yVGFnLCB2aWV3SWQsIHRva2Vucyxcblx0XHRwcmVjZWRpbmdMZW5ndGggPSAwLFxuXHRcdGVtcHR5VmlldyA9IHByZXZOb2RlID09PSBuZXh0Tm9kZTtcblxuXHRpZiAocHJldk5vZGUpIHtcblx0XHQvLyBwcmV2Tm9kZSBpcyBlaXRoZXIgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXdPclRhZywgb3IgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHZ3SW5mb3MgdG9rZW5zIHN0cmluZ1xuXHRcdHZ3SW5mb3MgPSB2aWV3SW5mb3MocHJldk5vZGUpIHx8IFtdO1xuXHRcdGZvciAoaSA9IDAsIGwgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gU3RlcCB0aHJvdWdoIHZpZXdzIG9yIHRhZ3Mgb24gdGhlIHByZXZOb2RlXG5cdFx0XHR2d0luZm8gPSB2d0luZm9zW2ldO1xuXHRcdFx0dmlld0lkID0gdndJbmZvLmlkO1xuXHRcdFx0aWYgKHZpZXdJZCA9PT0gaWQgJiYgdndJbmZvLmNoID09PSB2aWV3T3JUYWdDaGFyKSB7XG5cdFx0XHRcdGlmIChyZWZyZXNoKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyB2aWV3T3JUYWdUb1JlZnJlc2gsIHRoaXMgaXMgdGhlIGxhc3Qgdmlld09yVGFnIHRvIHByb2Nlc3MuLi5cblx0XHRcdFx0XHRsID0gMDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIHZpZXdPclRhZ1RvUmVtb3ZlLCBzbyB3ZSBhcmUgZG9uZS4uLlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWVtcHR5Vmlldykge1xuXHRcdFx0XHR2aWV3T3JUYWcgPSB2d0luZm8uY2ggPT09IFwiX1wiXG5cdFx0XHRcdFx0PyB2aWV3U3RvcmVbdmlld0lkXVxuXHRcdFx0XHRcdDogYmluZGluZ1N0b3JlW3ZpZXdJZF0ubGlua0N0eC50YWc7XG5cdFx0XHRcdGlmICh2d0luZm8ub3Blbikge1xuXHRcdFx0XHRcdC8vIEEgXCIjbVwiIHRva2VuXG5cdFx0XHRcdFx0dmlld09yVGFnLl9wcnYgPSBuZXh0Tm9kZTtcblx0XHRcdFx0fSBlbHNlIGlmICh2d0luZm8uY2xvc2UpIHtcblx0XHRcdFx0XHQvLyBBIFwiL21cIiB0b2tlblxuXHRcdFx0XHRcdHZpZXdPclRhZy5fbnh0ID0gbmV4dE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHByZWNlZGluZ0xlbmd0aCArPSB2aWV3SWQubGVuZ3RoICsgMjtcblx0XHR9XG5cblx0XHRpZiAocHJlY2VkaW5nTGVuZ3RoKSB7XG5cdFx0XHRwcmV2Tm9kZS5zZXRBdHRyaWJ1dGUoanN2QXR0clN0ciwgcHJldk5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpLnNsaWNlKHByZWNlZGluZ0xlbmd0aCkpO1xuXHRcdH1cblx0XHR0b2tlbnMgPSBuZXh0Tm9kZSA/IG5leHROb2RlLmdldEF0dHJpYnV0ZShqc3ZBdHRyU3RyKSA6IHBhcmVudEVsZW0uX2RmO1xuXHRcdGlmIChsID0gdG9rZW5zLmluZGV4T2YoXCIvXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpICsgMSkge1xuXHRcdFx0dG9rZW5zID0gdndJbmZvcy5fdGtucy5zbGljZSgwLCBwcmVjZWRpbmdMZW5ndGgpICsgdG9rZW5zLnNsaWNlKGwgKyAocmVmcmVzaCA/IC0xIDogaWQubGVuZ3RoICsgMSkpO1xuXHRcdH1cblx0XHRpZiAodG9rZW5zKSB7XG5cdFx0XHRpZiAobmV4dE5vZGUpIHtcblx0XHRcdFx0Ly8gSWYgdmlld09yVGFnVG9SZW1vdmUgd2FzIGFuIGVtcHR5IHZpZXdPclRhZywgd2Ugd2lsbCByZW1vdmUgYm90aCAjbiBhbmQgL25cblx0XHRcdFx0Ly8gKGFuZCBhbnkgaW50ZXJ2ZW5pbmcgdG9rZW5zKSBmcm9tIHRoZSBuZXh0Tm9kZSAoPT09IHByZXZOb2RlKVxuXHRcdFx0XHQvLyBJZiB2aWV3T3JUYWdUb1JlbW92ZSB3YXMgbm90IGVtcHR5LCB3ZSB3aWxsIHRha2UgdG9rZW5zIHByZWNlZGluZyAjbiBmcm9tIHByZXZOb2RlLFxuXHRcdFx0XHQvLyBhbmQgY29uY2F0ZW5hdGUgd2l0aCB0b2tlbnMgZm9sbG93aW5nIC9uIG9uIG5leHROb2RlXG5cdFx0XHRcdG5leHROb2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCB0b2tlbnMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgdG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gIXByZXZOb2RlLCBzbyB0aGVyZSBtYXkgYmUgYSBkZWZlcnJlZCBub2RlcyB0b2tlbiBvbiB0aGUgcGFyZW50RWxlbS4gUmVtb3ZlIGl0LlxuXHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIjXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpKTtcblx0XHRpZiAoIXJlZnJlc2ggJiYgIW5leHROb2RlKSB7XG5cdFx0XHQvLyBJZiB0aGlzIHZpZXdPclRhZyBpcyBiZWluZyByZW1vdmVkLCBhbmQgdGhlcmUgd2FzIG5vIC5ueHQsIHJlbW92ZSBjbG9zaW5nIHRva2VuIGZyb20gZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCByZW1vdmVTdWJTdHIocGFyZW50RWxlbS5fZGYsIFwiL1wiICsgaWQgKyB2aWV3T3JUYWdDaGFyKSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRpc3Bvc2VUb2tlbnModG9rZW5zKSB7XG5cdHZhciBpLCBsLCB2d0l0ZW0sIHZ3SW5mb3M7XG5cdGlmICh2d0luZm9zID0gdmlld0luZm9zKHRva2VucywgdHJ1ZSwgck9wZW5NYXJrZXJzKSkge1xuXHRcdGZvciAoaSA9IDAsIGwgPSB2d0luZm9zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dndJdGVtID0gdndJbmZvc1tpXTtcblx0XHRcdGlmICh2d0l0ZW0uY2ggPT09IFwiX1wiKSB7XG5cdFx0XHRcdGlmICgodndJdGVtID0gdmlld1N0b3JlW3Z3SXRlbS5pZF0pICYmIHZ3SXRlbS50eXBlKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhpcyBpcyB0aGUgX3BydiAocHJldk5vZGUpIGZvciBhIHZpZXcsIHJlbW92ZSB0aGUgdmlld1xuXHRcdFx0XHRcdC8vIC0gdW5sZXNzIHZpZXcudHlwZSBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgaXQgaXMgYWxyZWFkeSBiZWluZyByZW1vdmVkXG5cdFx0XHRcdFx0dndJdGVtLnBhcmVudC5yZW1vdmVWaWV3cyh2d0l0ZW0uXy5rZXksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKHZ3SXRlbS5pZCk7IC8vIHVuYmluZCBiaW5kaW5ncyB3aXRoIHRoaXMgYmluZGluZ0lkIG9uIHRoaXMgdmlld1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQWRkIGxpbmsgbWV0aG9kcyB0byBkYXRhLWxpbmtlZCB2aWV3IG9yIHRhZ1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIGFkZExpbmtNZXRob2RzKHRhZ09yVmlldywgaXNUYWcpIHtcblxuXHR0YWdPclZpZXcuY29udGVudHMgPSBmdW5jdGlvbihkZWVwLCBzZWxlY3QpIHtcblx0XHQvLyBGb3IgYSB2aWV3IG9yIGEgdGFnLCByZXR1cm4galF1ZXJ5IG9iamVjdCB3aXRoIHRoZSBjb250ZW50IG5vZGVzLFxuXHRcdGlmIChkZWVwICE9PSAhIWRlZXApIHtcblx0XHRcdC8vIGRlZXAgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgY29udGVudHMoc2VsZWN0b3IpXG5cdFx0XHRzZWxlY3QgPSBkZWVwO1xuXHRcdFx0ZGVlcCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dmFyIGZpbHRlcmVkLFxuXHRcdFx0bm9kZXMgPSAkKHRoaXMubm9kZXMoKSk7XG5cdFx0aWYgKG5vZGVzWzBdKSB7XG5cdFx0XHRmaWx0ZXJlZCA9IHNlbGVjdCA/IG5vZGVzLmZpbHRlcihzZWxlY3QpIDogbm9kZXM7XG5cdFx0XHRub2RlcyA9IGRlZXAgJiYgc2VsZWN0ID8gZmlsdGVyZWQuYWRkKG5vZGVzLmZpbmQoc2VsZWN0KSkgOiBmaWx0ZXJlZDtcblx0XHR9XG5cdFx0cmV0dXJuIG5vZGVzO1xuXHR9O1xuXG5cdHRhZ09yVmlldy5ub2RlcyA9IGZ1bmN0aW9uKHdpdGhNYXJrZXJzLCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0XHQvLyBGb3IgYSB2aWV3IG9yIGEgdGFnLCByZXR1cm4gdG9wLWxldmVsIG5vZGVzXG5cdFx0Ly8gRG8gbm90IHJldHVybiBhbnkgc2NyaXB0IG1hcmtlciBub2RlcywgdW5sZXNzIHdpdGhNYXJrZXJzIGlzIHRydWVcblx0XHQvLyBPcHRpb25hbGx5IGxpbWl0IHJhbmdlLCBieSBwYXNzaW5nIGluIHByZXZOb2RlIG9yIG5leHROb2RlIHBhcmFtZXRlcnNcblxuXHRcdHZhciBub2RlLFxuXHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRlbENudCA9IHNlbGYuX2VsQ250LFxuXHRcdFx0cHJldklzRmlyc3ROb2RlID0gIXByZXZOb2RlICYmIGVsQ250LFxuXHRcdFx0bm9kZXMgPSBbXTtcblxuXHRcdHByZXZOb2RlID0gcHJldk5vZGUgfHwgc2VsZi5fcHJ2O1xuXHRcdG5leHROb2RlID0gbmV4dE5vZGUgfHwgc2VsZi5fbnh0O1xuXG5cdFx0bm9kZSA9IHByZXZJc0ZpcnN0Tm9kZVxuXHRcdFx0PyAocHJldk5vZGUgPT09IHNlbGYuX254dFxuXHRcdFx0XHQ/IHNlbGYucGFyZW50RWxlbS5sYXN0U2libGluZ1xuXHRcdFx0XHQ6IHByZXZOb2RlKVxuXHRcdFx0OiAoc2VsZi5fLmlubGluZSA9PT0gZmFsc2Vcblx0XHRcdFx0PyBwcmV2Tm9kZSB8fCBzZWxmLmxpbmtDdHguZWxlbS5maXJzdENoaWxkXG5cdFx0XHRcdDogcHJldk5vZGUgJiYgcHJldk5vZGUubmV4dFNpYmxpbmcpO1xuXG5cdFx0d2hpbGUgKG5vZGUgJiYgKCFuZXh0Tm9kZSB8fCBub2RlICE9PSBuZXh0Tm9kZSkpIHtcblx0XHRcdGlmICh3aXRoTWFya2VycyB8fCBlbENudCB8fCBub2RlLnRhZ05hbWUgIT09IFNDUklQVCkge1xuXHRcdFx0XHQvLyBBbGwgdGhlIHRvcC1sZXZlbCBub2RlcyBpbiB0aGUgdmlld1xuXHRcdFx0XHQvLyAoZXhjZXB0IHNjcmlwdCBtYXJrZXIgbm9kZXMsIHVubGVzcyB3aXRoTWFya2VycyA9IHRydWUpXG5cdFx0XHRcdC8vIChOb3RlOiBJZiBhIHNjcmlwdCBtYXJrZXIgbm9kZSwgdmlld0luZm8uZWxDbnQgdW5kZWZpbmVkKVxuXHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHRcdHJldHVybiBub2Rlcztcblx0fTtcblxuXHR0YWdPclZpZXcuY2hpbGRUYWdzID0gZnVuY3Rpb24oZGVlcCwgdGFnTmFtZSkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiBjaGlsZCB0YWdzIC0gYXQgYW55IGRlcHRoLCBvciBhcyBpbW1lZGlhdGUgY2hpbGRyZW4gb25seS5cblx0XHRpZiAoZGVlcCAhPT0gISFkZWVwKSB7XG5cdFx0XHQvLyBkZWVwIG5vdCBib29sZWFuLCBzbyB0aGlzIGlzIGNoaWxkVGFncyh0YWdOYW1lKSAtIHdoaWNoIGxvb2tzIGZvciB0b3AtbGV2ZWwgdGFncyBvZiBnaXZlbiB0YWdOYW1lXG5cdFx0XHR0YWdOYW1lID0gZGVlcDtcblx0XHRcdGRlZXAgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0dmlldyA9IHNlbGYubGluayA/IHNlbGYgOiBzZWxmLnRhZ0N0eC52aWV3LCAvLyB0aGlzIG1heSBiZSBhIHZpZXcgb3IgYSB0YWcuIElmIGEgdGFnLCBnZXQgdGhlIHZpZXcgZnJvbSB0YWcudmlldy50YWdDdHhcblx0XHRcdHByZXZOb2RlID0gc2VsZi5fcHJ2LFxuXHRcdFx0ZWxDbnQgPSBzZWxmLl9lbENudCxcblx0XHRcdHRhZ3MgPSBbXTtcblxuXHRcdHZpZXcubGluayhcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHNlbGYucGFyZW50RWxlbSxcblx0XHRcdGVsQ250ID8gcHJldk5vZGUgJiYgcHJldk5vZGUucHJldmlvdXNTaWJsaW5nIDogcHJldk5vZGUsXG5cdFx0XHRzZWxmLl9ueHQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR7Z2V0Ontcblx0XHRcdFx0dGFnczogdGFncyxcblx0XHRcdFx0ZGVlcDogZGVlcCxcblx0XHRcdFx0bmFtZTogdGFnTmFtZSxcblx0XHRcdFx0aWQ6IHNlbGYubGluayA/IHNlbGYuXy5pZCArIFwiX1wiIDogc2VsZi5fdGdJZCArIFwiXlwiXG5cdFx0XHR9fVxuXHRcdCk7XG5cdFx0cmV0dXJuIHRhZ3M7XG5cdH07XG5cblx0dGFnT3JWaWV3LnJlZnJlc2ggPSBmdW5jdGlvbihzb3VyY2VWYWx1ZSkge1xuXHRcdHZhciBwcm9taXNlLCBhdHRyLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGxpbmtDdHggPSB0YWcubGlua0N0eCxcblx0XHRcdHZpZXcgPSB0YWcudGFnQ3R4LnZpZXc7XG5cblx0XHRpZiAodGFnLmRpc3Bvc2VkKSB7IGVycm9yKFwiUmVtb3ZlZCB0YWdcIik7IH1cblx0XHRpZiAoc291cmNlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c291cmNlVmFsdWUgPSAkc3ViLl90YWcodGFnLCB2aWV3LCB2aWV3LnRtcGwsIG1lcmdlQ3R4cyh0YWcpLCB0cnVlKTsgLy8gR2V0IHJlbmRlcmVkIEhUTUwgZm9yIHRhZywgYmFzZWQgb24gcmVmcmVzaGVkIHRhZ0N0eHNcblx0XHR9XG5cdFx0aWYgKHNvdXJjZVZhbHVlICsgXCJcIiA9PT0gc291cmNlVmFsdWUpIHtcblx0XHRcdC8vIElmIG5vIHJlbmRlcmVkIGNvbnRlbnQsIHNvdXJjZVZhbHVlIHdpbGwgbm90IGJlIGEgc3RyaW5nIChjYW4gYmUgMCBvciB1bmRlZmluZWQpXG5cdFx0XHRpZiAodGFnLm9uVW5iaW5kKSB7XG5cdFx0XHRcdHRhZy5vblVuYmluZCh0YWcudGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4KTtcblx0XHRcdH1cblx0XHRcdGF0dHIgPSB0YWcuXy5pbmxpbmUgPyBIVE1MIDogKGxpbmtDdHguYXR0ciB8fCBkZWZhdWx0QXR0cih0YWcucGFyZW50RWxlbSwgdHJ1ZSkpO1xuXHRcdFx0cHJvbWlzZSA9IHVwZGF0ZUNvbnRlbnQoc291cmNlVmFsdWUsIGxpbmtDdHgsIGF0dHIsIHRhZyk7XG5cdFx0fVxuXG5cdFx0Y2FsbEFmdGVyTGluayh0YWcpO1xuXHRcdHJldHVybiBwcm9taXNlIHx8IHRhZztcblx0fTtcblxuXHR0YWdPclZpZXcudXBkYXRlID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHR2YXIgbGlua2VkRWxlbSA9IHRoaXMubGlua2VkRWxlbTtcblx0XHRpZiAobGlua2VkRWxlbSkge1xuXHRcdFx0ZWxlbUNoYW5nZUhhbmRsZXIoe1xuXHRcdFx0XHR0YXJnZXQ6IGxpbmtlZEVsZW1bMF1cblx0XHRcdH0sIHVuZGVmaW5lZCwgdmFsdWUpO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoaXNUYWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgVEFHXG5cdFx0dGFnT3JWaWV3LmRvbUNoYW5nZSA9IGZ1bmN0aW9uKCkgeyAvLyBkb21DaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnRcblx0XHRcdHZhciBlbGVtID0gdGhpcy5wYXJlbnRFbGVtLFxuXHRcdFx0XHRoYXNMaXN0ZW5lciA9ICQuaGFzRGF0YShlbGVtKSAmJiAkLl9kYXRhKGVsZW0pLmV2ZW50cyxcblx0XHRcdFx0ZG9tQ2hhbmdlTm90aWZpY2F0aW9uID0gXCJqc3YtZG9tY2hhbmdlXCI7XG5cblx0XHRcdGlmIChoYXNMaXN0ZW5lciAmJiBoYXNMaXN0ZW5lcltkb21DaGFuZ2VOb3RpZmljYXRpb25dKSB7XG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciBoYW5kbGVyIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBsaXN0ZW5pbmcgZm9yIHRoaXMgZXZlbnQuIChOb3RlIHVzaW5nIHRyaWdnZXJIYW5kbGVyIC0gc28gbm8gZXZlbnQgYnViYmxpbmcuKVxuXHRcdFx0XHQkKGVsZW0pLnRyaWdnZXJIYW5kbGVyKGRvbUNoYW5nZU5vdGlmaWNhdGlvbiwgYXJndW1lbnRzKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRoaXMgaXMgYSBWSUVXXG5cdFx0Ly8gTm90ZTogYSBsaW5rZWQgdmlldyB3aWxsIGFsc28sIGFmdGVyIGxpbmtpbmcgaGF2ZSBub2Rlc1tdLCBfcHJ2IChwcmV2Tm9kZSksIF9ueHQgKG5leHROb2RlKSAuLi5cblx0XHR0YWdPclZpZXcuYWRkVmlld3MgPSBmdW5jdGlvbihpbmRleCwgZGF0YUl0ZW1zKSB7XG5cdFx0XHQvLyBpZiB2aWV3IGlzIG5vdCBhbiBhcnJheSB2aWV3LCBkbyBub3RoaW5nXG5cdFx0XHR2YXIgaSwgdmlld3NDb3VudCxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdGl0ZW1zQ291bnQgPSBkYXRhSXRlbXMubGVuZ3RoLFxuXHRcdFx0XHR2aWV3cyA9IHNlbGYudmlld3M7XG5cblx0XHRcdGlmICghc2VsZi5fLnVzZUtleSAmJiBpdGVtc0NvdW50KSB7XG5cdFx0XHRcdC8vIHZpZXcgaXMgb2YgdHlwZSBcImFycmF5XCJcblx0XHRcdFx0dmlld3NDb3VudCA9IHZpZXdzLmxlbmd0aCArIGl0ZW1zQ291bnQ7XG5cblx0XHRcdFx0aWYgKHZpZXdzQ291bnQgPT09IHNlbGYuZGF0YS5sZW5ndGggLy8gSWYgdmlld3Mgbm90IGFscmVhZHkgc3luY2VkIHRvIGFycmF5IChlLmcuIHRyaWdnZXJlZCBieSBhcnJheS5sZW5ndGggcHJvcGVydHlDaGFuZ2UgLSBqc3ZpZXdzL2lzc3Vlcy8zMDEpXG5cdFx0XHRcdFx0XHQmJiByZW5kZXJBbmRMaW5rKHNlbGYsIGluZGV4LCBzZWxmLnRtcGwsIHZpZXdzLCBkYXRhSXRlbXMsIHNlbGYuY3R4KSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRpZiAoIXNlbGYuXy5zcnQpIHsgLy8gTm90IHBhcnQgb2YgYSAnc29ydCcgb24gcmVmcmVzaFxuXHRcdFx0XHRcdFx0c2VsZi5maXhJbmRleChpbmRleCArIGl0ZW1zQ291bnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0YWdPclZpZXcucmVtb3ZlVmlld3MgPSBmdW5jdGlvbihpbmRleCwgaXRlbXNDb3VudCwga2VlcE5vZGVzLCBpc01vdmUpIHtcblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoKSByZW1vdmVzIGFsbCB0aGUgY2hpbGQgdmlld3Ncblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoaW5kZXgpIHJlbW92ZXMgdGhlIGNoaWxkIHZpZXcgd2l0aCBzcGVjaWZpZWQgaW5kZXggb3Iga2V5XG5cdFx0XHQvLyB2aWV3LnJlbW92ZVZpZXdzKGluZGV4LCBjb3VudCkgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG51bW1iZXIgb2YgY2hpbGQgdmlld3MsIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleFxuXHRcdFx0ZnVuY3Rpb24gcmVtb3ZlVmlldyhpbmRleCkge1xuXHRcdFx0XHR2YXIgaWQsIGJpbmRJZCwgcGFyZW50RWxlbSwgcHJldk5vZGUsIG5leHROb2RlLCBub2Rlc1RvUmVtb3ZlLFxuXHRcdFx0XHRcdHZpZXdUb1JlbW92ZSA9IHZpZXdzW2luZGV4XTtcblxuXHRcdFx0XHRpZiAodmlld1RvUmVtb3ZlICYmIHZpZXdUb1JlbW92ZS5saW5rKSB7XG5cdFx0XHRcdFx0aWQgPSB2aWV3VG9SZW1vdmUuXy5pZDtcblx0XHRcdFx0XHRpZiAoIWtlZXBOb2Rlcykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBIVE1MIG5vZGVzIGZyb20gdGhlIERPTSwgdW5sZXNzIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgaW5jbHVkaW5nIG5vZGVzIG9mIGNoaWxkIHZpZXdzXG5cdFx0XHRcdFx0XHRub2Rlc1RvUmVtb3ZlID0gdmlld1RvUmVtb3ZlLm5vZGVzKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXdzLCB3aXRob3V0IHJlbW92aW5nIG5vZGVzXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlLnJlbW92ZVZpZXdzKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcblxuXHRcdFx0XHRcdHZpZXdUb1JlbW92ZS50eXBlID0gdW5kZWZpbmVkOyAvLyBTZXQgdHlwZSB0byB1bmRlZmluZWQ6IHVzZWQgYXMgYSBmbGFnIHRoYXQgdGhpcyB2aWV3IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHRwcmV2Tm9kZSA9IHZpZXdUb1JlbW92ZS5fcHJ2O1xuXHRcdFx0XHRcdG5leHROb2RlID0gdmlld1RvUmVtb3ZlLl9ueHQ7XG5cdFx0XHRcdFx0cGFyZW50RWxlbSA9IHZpZXdUb1JlbW92ZS5wYXJlbnRFbGVtO1xuXHRcdFx0XHRcdC8vIElmIHByZXZOb2RlIGFuZCBuZXh0Tm9kZSBhcmUgdGhlIHNhbWUsIHRoZSB2aWV3IGlzIGVtcHR5XG5cdFx0XHRcdFx0aWYgKCFrZWVwTm9kZXMpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgSFRNTCBub2RlcyBmcm9tIHRoZSBET00sIHVubGVzcyB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIGluY2x1ZGluZyBub2RlcyBvZiBjaGlsZCB2aWV3c1xuXHRcdFx0XHRcdFx0aWYgKHZpZXdUb1JlbW92ZS5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaWYga2VlcE5vZGVzIGlzIGZhbHNlIChhbmQgdHJhbnNmZXJyaW5nIG9mIHRva2VucyBoYXMgbm90IGFscmVhZHkgYmVlbiBkb25lIGF0IGEgaGlnaGVyIGxldmVsKVxuXHRcdFx0XHRcdFx0XHQvLyB0aGVuIHRyYW5zZmVyIHRva2VucyBmcm9tIHByZXZOb2RlIHdoaWNoIGlzIGJlaW5nIHJlbW92ZWQsIHRvIG5leHROb2RlLlxuXHRcdFx0XHRcdFx0XHR0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnRFbGVtLCBpZCwgXCJfXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCF2aWV3VG9SZW1vdmUuX2VsQ250KSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRwcmV2Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHByZXZOb2RlKTsgLy8gKHByZXZOb2RlLnBhcmVudE5vZGUgaXMgcGFyZW50RWxlbSwgZXhjZXB0IGlmIGpRdWVyeSBNb2JpbGUgb3Igc2ltaWxhciBoYXMgaW5zZXJ0ZWQgYW4gaW50ZXJtZWRpYXRlIHdyYXBwZXJcblx0XHRcdFx0XHRcdFx0bmV4dE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsodmlld1RvUmVtb3ZlKTtcblx0XHRcdFx0XHRmb3IgKGJpbmRJZCBpbiB2aWV3VG9SZW1vdmUuXy5ibmRzKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3QmluZGluZyhiaW5kSWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkZWxldGUgdmlld1N0b3JlW2lkXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY3VycmVudCwgdmlldywgdmlld3NDb3VudCxcblx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdGlzQXJyYXkgPSAhc2VsZi5fLnVzZUtleSxcblx0XHRcdFx0dmlld3MgPSBzZWxmLnZpZXdzO1xuXG5cdFx0XHRpZiAoaXNBcnJheSkge1xuXHRcdFx0XHR2aWV3c0NvdW50ID0gdmlld3MubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIGFsbCBjaGlsZCB2aWV3c1xuXHRcdFx0XHRpZiAoaXNBcnJheSkge1xuXHRcdFx0XHRcdC8vIHZpZXdzIGFuZCBkYXRhIGFyZSBhcnJheXNcblx0XHRcdFx0XHRjdXJyZW50ID0gdmlld3NDb3VudDtcblx0XHRcdFx0XHR3aGlsZSAoY3VycmVudC0tKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGN1cnJlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZWxmLnZpZXdzID0gW107XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdmlld3MgYW5kIGRhdGEgYXJlIG9iamVjdHNcblx0XHRcdFx0XHRmb3IgKHZpZXcgaW4gdmlld3MpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBieSBrZXlcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXcodmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGYudmlld3MgPSB7fTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGl0ZW1zQ291bnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgcGFyZW50VmlldyBpcyBkYXRhIGFycmF5IHZpZXcuXG5cdFx0XHRcdFx0XHQvLyBTZXQgaXRlbXNDb3VudCB0byAxLCB0byByZW1vdmUgdGhpcyBpdGVtXG5cdFx0XHRcdFx0XHRpdGVtc0NvdW50ID0gMTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXcgd2l0aCBrZXkgJ2luZGV4J1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyhpbmRleCk7XG5cdFx0XHRcdFx0XHRkZWxldGUgdmlld3NbaW5kZXhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaXNBcnJheSAmJiBpdGVtc0NvdW50XG5cdFx0XHRcdFx0JiYgKGlzTW92ZSB8fCB2aWV3c0NvdW50IC0gaXRlbXNDb3VudCA9PT0gc2VsZi5kYXRhLmxlbmd0aCkpIHsgLy8gSWYgdmlld3Mgbm90IGFscmVhZHkgc3luY2VkIHRvIGFycmF5IChlLmcuIHRyaWdnZXJlZCBieSBhcnJheS5sZW5ndGggcHJvcGVydHlDaGFuZ2UgLSBqc3ZpZXdzL2lzc3Vlcy8zMDEpXG5cdFx0XHRcdFx0Y3VycmVudCA9IGluZGV4ICsgaXRlbXNDb3VudDtcblx0XHRcdFx0XHQvLyBSZW1vdmUgaW5kZXhlZCBpdGVtcyAocGFyZW50VmlldyBpcyBkYXRhIGFycmF5IHZpZXcpO1xuXHRcdFx0XHRcdHdoaWxlIChjdXJyZW50LS0gPiBpbmRleCkge1xuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyhjdXJyZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmlld3Muc3BsaWNlKGluZGV4LCBpdGVtc0NvdW50KTtcblx0XHRcdFx0XHRpZiAoIXNlbGYuXy5zb3J0KSB7XG5cdFx0XHRcdFx0XHRzZWxmLmZpeEluZGV4KGluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0cGFyZW50ID0gc2VsZi5wYXJlbnQ7XG5cblx0XHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdFx0cmVuZGVyQW5kTGluayhzZWxmLCBzZWxmLmluZGV4LCBzZWxmLnRtcGwsIHBhcmVudC52aWV3cywgc2VsZi5kYXRhLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsoc2VsZik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5maXhJbmRleCA9IGZ1bmN0aW9uKGZyb21JbmRleCkge1xuXHRcdFx0Ly8gRml4dXAgaW5kZXggb24gZm9sbG93aW5nIHZpZXcgaXRlbXMuLi5cblx0XHRcdHZhciB2aWV3cyA9IHRoaXMudmlld3MsXG5cdFx0XHRcdGluZGV4ID0gdmlld3MubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGZyb21JbmRleCA8IGluZGV4LS0pIHtcblx0XHRcdFx0aWYgKHZpZXdzW2luZGV4XS5pbmRleCAhPT0gaW5kZXgpIHtcblx0XHRcdFx0XHQkb2JzZXJ2YWJsZSh2aWV3c1tpbmRleF0pLnNldFByb3BlcnR5KFwiaW5kZXhcIiwgaW5kZXgpO1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgZml4aW5nIHVwIGluZGV4LCBidXQgbm90IGtleSwgYW5kIG5vdCBpbmRleCBvbiBjaGlsZCB2aWV3cy4gRnJvbSBjaGlsZCB2aWV3cywgdXNlIHZpZXcuZ2V0SW5kZXgoKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5saW5rID0gdmlld0xpbms7XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzVmlld3Mtc3BlY2lmaWMgY29udmVydGVyc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT1cblxuJGNvbnZlcnRlcnMubWVyZ2UgPSBmdW5jdGlvbih2YWwpIHtcblx0Ly8gU3BlY2lhbCBjb252ZXJ0ZXIgdXNlZCBpbiBkYXRhLWxpbmtpbmcgdG8gc3BhY2Utc2VwYXJhdGVkIGxpc3RzLCBzdWNoIGFzIGNsYXNzTmFtZTpcblx0Ly8gQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdG9nZ2xlIHNlbWFudGljcyAtIGFuZCBoYXMgbm8gZWZmZWN0IGlmIHRvZ2dsZSBzdHJpbmcgaXMgbm90IHNwZWNpZmllZFxuXHQvLyBkYXRhLWxpbms9XCJjbGFzc3ttZXJnZTpib29sRXhwciB0b2dnbGU9Y2xhc3NOYW1lfVwiXG5cdHZhciByZWd1bGFyRXhwcmVzc2lvbixcblx0XHRjdXJyZW50VmFsdWUgPSB0aGlzLmxpbmtDdHguX3ZhbCB8fCBcIlwiLFxuXHRcdHRvZ2dsZSA9IHRoaXMudGFnQ3R4LnByb3BzLnRvZ2dsZTtcblxuXHRpZiAodG9nZ2xlKSB7XG5cdFx0Ly8gV2UgYXJlIHRvZ2dsaW5nIHRoZSBjbGFzcyBzcGVjaWZpZWQgYnkgdGhlIHRvZ2dsZSBwcm9wZXJ0eSxcblx0XHQvLyBhbmQgdGhlIGJvb2xlYW4gdmFsIGJpbmRpbmcgaXMgZHJpdmluZyB0aGUgaW5zZXJ0L3JlbW92ZSB0b2dnbGVcblxuXHRcdHJlZ3VsYXJFeHByZXNzaW9uID0gdG9nZ2xlLnJlcGxhY2UoL1tcXFxcXiQufD8qKygpW3tdL2csIFwiXFxcXCQmXCIpO1xuXHRcdC8vIEVzY2FwZSBhbnkgcmVndWxhciBleHByZXNzaW9uIHNwZWNpYWwgY2hhcmFjdGVycyAobWV0YWNoYXJhY3RlcnMpIHdpdGhpbiB0aGUgdG9nZ2xlIHN0cmluZ1xuXHRcdHJlZ3VsYXJFeHByZXNzaW9uID0gXCIoXFxcXHMoPz1cIiArIHJlZ3VsYXJFeHByZXNzaW9uICsgXCIkKXwoXFxcXHMpfF4pKFwiICsgcmVndWxhckV4cHJlc3Npb24gKyBcIihcXFxcc3wkKSlcIjtcblx0XHQvLyBFeGFtcGxlOiAvKFxccyg/PW15Y2xhc3MkKXwoXFxzKXxeKT8obXljbGFzcyhcXHN8JCkpLyAtIHNvIG1hdGNoZXMgKFwiIG15Y2xhc3NcIiBvciBcIiBcIiBvciBeICkgZm9sbG93ZWQgYnkgKFwibXljbGFzcyBcIiBvciBcIm15Y2xhc3MkXCIpIHdoZXJlIF4vJCBhcmUgYmVnaW5uaW5nL2VuZCBvZiBzdHJpbmdcblx0XHRjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKHJlZ3VsYXJFeHByZXNzaW9uKSwgXCIkMlwiKTtcblx0XHR2YWwgPSBjdXJyZW50VmFsdWUgKyAodmFsID8gKGN1cnJlbnRWYWx1ZSAmJiBcIiBcIikgKyB0b2dnbGUgOiBcIlwiKTtcblx0fVxuXHRyZXR1cm4gdmFsO1xufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEpzVmlld3Mtc3BlY2lmaWMgdGFnc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24ga2VlcFBhcmVudERhdGFDdHgodmFsKSB7XG5cdHJldHVybiB0aGlzLnRhZ0N0eC52aWV3OyAvLyBSZXR1cm4gdGhlIHBhcmVudCB2aWV3IGFzIGRhdGEgY29udGV4dCBmb3IgcmVuZGVyaW5nIGJsb2NrIGNvbnRlbnRcbn1cblxuJHRhZ3Moe1xuXHRvbjoge1xuXHRcdGF0dHI6IE5PTkUsXG5cdFx0aW5pdDogZnVuY3Rpb24odGFnQ3R4KSB7XG5cdFx0XHR2YXIgY29udGVudCxcblx0XHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGFyZ3MgPSB0YWdDdHguYXJncywgLy8gW2V2ZW50cyxdIFtzZWxlY3RvcixdIGhhbmRsZXJcblx0XHRcdFx0bCA9IGFyZ3MubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKDsgaTxsICYmICEkaXNGdW5jdGlvbihhcmdzW2ldKTsgaSsrKTsgLy8gSGFuZGxlciBpcyBmaXJzdCBhcmcgb2YgdHlwZSBmdW5jdGlvblxuXHRcdFx0dGFnLl9oaSA9IGw+aSAmJiBpKzE7IC8vIGhhbmRsZXIgaW5kZXhcblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0aWYgKCEkc3ViLnJUbXBsLmV4ZWMoY29udGVudCA9IHRhZ0N0eC50bXBsLm1hcmt1cCkpIHtcblx0XHRcdFx0XHQvLyBJbmxpbmUge157b259fSB0YWcgd2l0aCBubyBjb250ZW50IChvciBleHRlcm5hbCB0ZW1wbGF0ZSBjb250ZW50KSBvciB3aXRoIGNvbnRlbnQgY29udGFpbmluZ1xuXHRcdFx0XHRcdC8vIG5vIEhUTUwgb3IgSnNSZW5kZXIgdGFnczogV2Ugd2lsbCB3cmFwIHRoZSAodGV4dCkgY29udGVudCwgb3IgdGhlIG9wZXJhdGlvbiBuYW1lIGluIGEgPGJ1dHRvbj4gZWxlbWVudFxuXHRcdFx0XHRcdC8vIChPdGhlcndpc2Ugd2Ugd2lsbCBhdHRhY2ggdGhlIGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQgY29udGVudCBhZnRlciBkYXRhLWxpbmtpbmcpXG5cdFx0XHRcdFx0dGFnLnRlbXBsYXRlID0gXCI8YnV0dG9uPlwiICsgKCQudHJpbShjb250ZW50KSB8fCB0YWdDdHgucGFyYW1zLmFyZ3NbaV0gfHwgXCJub29wXCIpICsgXCI8L2J1dHRvbj5cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YWcuYXR0ciA9IEhUTUw7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbkFmdGVyTGluazogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0XHR2YXIgaGFuZGxlciwgcGFyYW1zLCBmaW5kLCBhY3RpdmVFbGVtLFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHRpID0gdGFnLl9oaSxcblx0XHRcdFx0YXJncyA9IHRhZ0N0eC5hcmdzLCAvLyBbZXZlbnRzLF0gW3NlbGVjdG9yLF0gaGFuZGxlclxuXHRcdFx0XHRsID0gYXJncy5sZW5ndGgsXG5cdFx0XHRcdHByb3BzID0gdGFnQ3R4LnByb3BzLFxuXHRcdFx0XHRkYXRhID0gcHJvcHMuZGF0YSxcblx0XHRcdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdFx0XHRjb250ZXh0T2IgPSBwcm9wcy5jb250ZXh0OyAvLyBDb250ZXh0ICgndGhpcycgcG9pbnRlcikgZm9yIGF0dGFjaGVkIGhhbmRsZXJcblxuXHRcdFx0aWYgKGkpIHsgLy8gVGhlcmUgaXMgYSBoYW5kbGVyXG5cdFx0XHRcdGhhbmRsZXIgPSBhcmdzW2ktMV07XG5cdFx0XHRcdHBhcmFtcyA9IGFyZ3Muc2xpY2UoaSk7IC8vIFN1YnNlcXVlbnQgYXJncyBhcmUgcGFyYW1zXG5cdFx0XHRcdGFyZ3MgPSBhcmdzLnNsaWNlKDAsIGktMSk7IC8vIFByZWNlZGluZyBhcmdzIChpZiBhbnkpIGFyZSBldmVudHMgYW5kIHNlbGVjdG9yXG5cdFx0XHRcdHRhZy5fc2VsID0gYXJnc1sxXTsgLy8gU2VsZWN0b3IgZm9yIGRlc2NlbmRhbnQgZWxlbWVudHMgLSBmb3IgZGVsZWdhdGVkIGV2ZW50cyBvbiB0aG9zZSBlbGVtZW50cywgZGVsZWdhdGluZyB0byB0aGUgYWN0aXZlRWxlbVxuXG5cdFx0XHRcdGFjdGl2ZUVsZW0gPSB0YWcuYWN0aXZlRWxlbSA9IHRhZy5hY3RpdmVFbGVtIHx8ICQodGFnLl8uaW5saW5lXG5cdFx0XHRcdFx0PyAodGFnLl9zZWwgPSBhcmdzWzFdIHx8IFwiKlwiLCB0YWcucGFyZW50RWxlbSlcblx0XHRcdFx0XHQvLyBJZiBpbmxpbmUsIGF0dGFjaCB0byBjaGlsZCBlbGVtZW50cyBvZiB0YWcgcGFyZW50IGVsZW1lbnQgKGZpbHRlcmVkIGJ5IHNlbGVjdG9yIGFyZ3VtZW50IGlmIHByb3ZpZGVkLlxuXHRcdFx0XHRcdC8vIChJbiBoYW5kbGVyIHdlJ2xsIGZpbHRlciBvdXQgZXZlbnRzIGZyb20gc2libGluZyBlbGVtZW50cyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRhZy4pXG5cdFx0XHRcdFx0Ly8gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSBkZWxlZ2F0ZWQgcGF0dGVybiB3aGVyZSB0aGUgYXR0YWNoZWQgZXZlbnQgd29ya3MgZXZlbiBmb3IgYWRkZWQgZWxlbWVudHMgc2F0aXNmeWluZyB0aGUgc2VsZWN0b3Jcblx0XHRcdFx0XHQ6IGxpbmtDdHguZWxlbSk7XG5cblx0XHRcdFx0aWYgKCFjb250ZXh0T2IpIHtcblx0XHRcdFx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBwcmVjZWRpbmcgb2JqZWN0IChjb250ZXh0IG9iamVjdCkgb2YgaGFuZGxlciAod2hpY2ggaXMgdGhlIGxhc3QgYXJnKSwgY29tcGlsZSBmdW5jdGlvblxuXHRcdFx0XHRcdC8vIHRvIHJldHVybiB0aGF0IGNvbnRleHQgb2JqZWN0LCBhbmQgcnVuIGNvbXBpbGVkIGZ1bmN0aW9uIGFnYWluc3QgZGF0YVxuXHRcdFx0XHRcdGNvbnRleHRPYiA9IC9eKC4qKVtcXC5eXVtcXHckXSskLy5leGVjKHRhZ0N0eC5wYXJhbXMuYXJncy5zbGljZSgtcGFyYW1zLmxlbmd0aCAtIDEpWzBdKTtcblx0XHRcdFx0XHRjb250ZXh0T2IgPSBjb250ZXh0T2IgJiYgJHN1Yi50bXBsRm4oZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGNvbnRleHRPYlsxXSArIGRlbGltQ2xvc2VDaGFyMCwgdmlldy50bXBsLCB0cnVlKShsaW5rQ3R4LmRhdGEsIHZpZXcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRhZy5fZXZzKSB7XG5cdFx0XHRcdFx0dGFnLm9uVW5iaW5kKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY3RpdmVFbGVtLm9uKFxuXHRcdFx0XHRcdHRhZy5fZXZzID0gYXJnc1swXSB8fCBcImNsaWNrXCIsIC8vIGV2ZW50cyBkZWZhdWx0cyB0byBcImNsaWNrXCJcblx0XHRcdFx0XHR0YWcuX3NlbCxcblx0XHRcdFx0XHRkYXRhID09IHVuZGVmaW5lZCA/IG51bGwgOiBkYXRhLFxuXHRcdFx0XHRcdHRhZy5faGxyID0gZnVuY3Rpb24gaG5kbHIoZXYpIHtcblx0XHRcdFx0XHRcdHZhciBub2RlcywgbGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRmb3VuZCA9ICF0YWcuXy5pbmxpbmU7XG5cblx0XHRcdFx0XHRcdGlmICghZm91bmQpIHsgLy8gSWYgaW5saW5lLCBmaWx0ZXIgb3V0IGV2ZW50cyBmcm9tIHNpYmxpbmcgZWxlbWVudHMgcHJlY2VkaW5nIG9yIGZvbGxvd2luZyB0YWcuXG5cdFx0XHRcdFx0XHRcdG5vZGVzID0gdGFnLmNvbnRlbnRzKFwiKlwiKTtcblx0XHRcdFx0XHRcdFx0bCA9IG5vZGVzLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCFmb3VuZCAmJiBsLS0pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobm9kZXNbbF0uY29udGFpbnMoZXYudGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGZvdW5kKSB7IC8vIHRhcmdldCBlbGVtIGlzIGluZGVlZCB3aXRoaW4gdGhlIHRhZywgc28gY2FsbCB0aGUge29ufSBoYW5kbGVyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBoYW5kbGVyLmFwcGx5KGNvbnRleHRPYiB8fCBsaW5rQ3R4LmRhdGEsIFtdLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0XHRwYXJhbXMsIC8vIGUuZy4gcGFyMSwgcGFyMlxuXHRcdFx0XHRcdFx0XHRcdGV2LFxuXHRcdFx0XHRcdFx0XHRcdHtjaGFuZ2U6IGV2LnR5cGUsIHZpZXc6IHZpZXcsIGxpbmtDdHg6IGxpbmtDdHh9LFxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgLy8gSWYgdHJpZ2dlcmluZyBldmVudCAoZS5nLiBqc3YtZG9tY2hhbmdlKSBoYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgZXYsIHBhc3MgdGhlbSB0b29cblx0XHRcdFx0XHRcdFx0KSk7XG5cdFx0XHRcdFx0XHRcdC8vIGZvciB7b24gJ2NsaWNrJyBoYW5kbGVyIHBhcjEgcGFyMn0gdXNlIGhhbmRsZXIocGFyMSwgcGFyMiwgZXYsIGRvbWNoYW5nZUV2ZW50QXJncylcblx0XHRcdFx0XHRcdFx0Ly8gZm9yIHtvbiAnanN2LWRvbWNoYW5nZScgaGFuZGxlciBwYXIxIHBhcjJ9IHVzZSBoYW5kbGVyKHBhcjEsIHBhcjIsIGV2LCBkb21jaGFuZ2VFdmVudEFyZ3MsIHRhZ0N0eCwgbGlua0N0eCwgb2JzZXJ2YWJsZUV2ZW50QXJncylcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblVwZGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRvblVuYmluZDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHRpZiAoc2VsZi5hY3RpdmVFbGVtKSB7XG5cdFx0XHRcdHNlbGYuYWN0aXZlRWxlbS5vZmYoc2VsZi5fZXZzLCBzZWxmLl9zZWwsIHNlbGYuX2hscik7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRmbG93OiB0cnVlLFxuXHRcdGNvbnRlbnRDdHg6IGtlZXBQYXJlbnREYXRhQ3R4LFxuXHRcdGRhdGFCb3VuZE9ubHk6IHRydWVcblx0fSxcblx0cmFkaW9ncm91cDoge1xuXHRcdGluaXQ6IGZ1bmN0aW9uKHRhZ0N0eCkge1xuXHRcdFx0dGhpcy5uYW1lID0gdGFnQ3R4LnByb3BzLm5hbWUgfHwgKFwianN2XCIgKyBNYXRoLnJhbmRvbSgpKTtcblx0XHR9LFxuXHRcdG9uQmluZDogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0XHR2YXIgZG9tQ2huZ0NudG5yLFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHQkbGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtID0gKHRhZy5fLmlubGluZSA/IHRhZy5jb250ZW50cyh0cnVlLCBcImlucHV0W3R5cGU9cmFkaW9dXCIpIDogJChsaW5rQ3R4LmVsZW0pLmZpbmQoXCJpbnB1dFt0eXBlPXJhZGlvXVwiKSksXG5cdFx0XHRcdGwgPSAkbGlua2VkRWxlbS5sZW5ndGg7XG5cblx0XHRcdGlmICh0YWcuXy5pbmxpbmUpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgb3duZWQgYnkgKHJlbmRlcmVkIGJ5KSB0aGlzIHRhZyAobm90IGJ5IGEgY2hpbGRUYWcgc3VjaCBhcyB7Xntmb3J9fSlcblx0XHRcdFx0Ly8gdXNlIGl0IGFzIGNvbnRhaW5lciBmb3IgZGV0ZWN0aW5nIGRvbSBjaGFuZ2VzXG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IHRhZy5jb250ZW50cyhcIipcIilbMF07XG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IGRvbUNobmdDbnRuciAmJiAkLnZpZXcoZG9tQ2huZ0NudG5yKS5jdHgudGFnID09PSB0YWcucGFyZW50ID8gZG9tQ2huZ0NudG5yIDogdGFnLnBhcmVudEVsZW07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkb21DaG5nQ250bnIgPSBsaW5rQ3R4LmVsZW07XG5cdFx0XHR9XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdC8vIENvbmZpZ3VyZSB0aGUgbmFtZSBmb3IgZWFjaCByYWRpbyBpbnB1dCBlbGVtZW50XG5cdFx0XHRcdCRsaW5rZWRFbGVtW2xdLm5hbWUgPSAkbGlua2VkRWxlbVtsXS5uYW1lIHx8IHRhZy5uYW1lO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRXN0YWJsaXNoIGEgZG9tY2hhbmdlIGxpc3RlbmVyIGluIGNhc2UgdGhpcyByYWRpb2dyb3VwIHdyYXBzIGEge157Zm9yfX0gb3Ige157aWZ9fSBvciBzaW1pbGFyIHdoaWNoIG1pZ2h0IGR5bmFtaWNhbGx5IGluc2VydCBuZXcgcmFkaW8gaW5wdXQgZWxlbWVudHNcblx0XHRcdCQoZG9tQ2huZ0NudG5yKS5vbihcImpzdi1kb21jaGFuZ2VcIiwgZnVuY3Rpb24oZXYsIGZvck9ySWZUYWdDdHgpIHtcblx0XHRcdFx0dmFyIGxpbmtlZEVsZW0sXG5cdFx0XHRcdFx0cGFyZW50VGFncyA9IGZvck9ySWZUYWdDdHguY3R4LnBhcmVudFRhZ3M7XG5cdFx0XHRcdGlmICghdGFnLl8uaW5saW5lIHx8IGRvbUNobmdDbnRuciAhPT0gdGFnLnBhcmVudEVsZW0gLy8gVGhlIGRvbUNobmdDbnRuciBpcyBzcGVjaWZpYyB0byB0aGlzIHRhZ1xuXHRcdFx0XHRcdC8vIFRoZSBkb21DaG5nQ250bnIgaXMgdGhlIHBhcmVudEVsZW0gb2YgdGhpcyB0YWcsIHNvIG5lZWQgdG8gbWFrZSBzdXJlIGRvbSBjaGFuZ2UgZXZlbnQgaXMgZm9yXG5cdFx0XHRcdFx0Ly8gYSBjb250ZW50IGNoYW5nZSB3aXRoaW4gdGhpcyB0YWcsIG5vdCBvdXRzaWRlIGl0LlxuXHRcdFx0XHRcdHx8IHBhcmVudFRhZ3MgJiYgcGFyZW50VGFnc1t0YWcudGFnTmFtZV0gPT09IHRhZykge1xuXHRcdFx0XHRcdC8vIENvbnRlbnRzIGhhdmUgY2hhbmdlZCBzbyByZWNyZWF0ZSAkbGlua2VkRWxlbSBmb3IgdGhlIHJhZGlvIGlucHV0IGVsZW1lbnRzIChpbmNsdWRpbmcgcG9zc2libGUgbmV3IG9uZSBqdXN0IGluc2VydGVkKVxuXHRcdFx0XHRcdCRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW0gPSB0YWcuY29udGVudHModHJ1ZSwgXCJpbnB1dFt0eXBlPXJhZGlvXVwiKTtcblx0XHRcdFx0XHRsID0gJGxpbmtlZEVsZW0ubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdC8vIENvbmZpZ3VyZSBiaW5kaW5nICBhbmQgbmFtZSBmb3IgZWFjaCByYWRpbyBpbnB1dCBlbGVtZW50XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtID0gJGxpbmtlZEVsZW1bbF07XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5uYW1lID0gbGlua2VkRWxlbS5uYW1lIHx8IHRhZy5uYW1lO1xuXHRcdFx0XHRcdFx0YmluZFRvKGJpbmRpbmdTdG9yZVt0YWcuX3RnSWRdLCB0YWcsIGxpbmtlZEVsZW0pO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5fanN2Qm5kID0gXCImXCIgKyB0YWcuX3RnSWQgKyBcIitcIjtcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0uY2hlY2tlZCA9IHRhZy5jdnRBcmdzKClbMF0gPT09IGxpbmtlZEVsZW0udmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdG9uVXBkYXRlOiBmdW5jdGlvbihldiwgZXZlbnRBcmdzLCB0YWdDdHhzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHJlcmVuZGVyXG5cdFx0fSxcblx0XHRjb250ZW50Q3R4OiBrZWVwUGFyZW50RGF0YUN0eCxcblx0XHRkYXRhQm91bmRPbmx5OiB0cnVlXG5cdH1cbn0pO1xuXG4kZXh0ZW5kKCR0YWdzW1wiZm9yXCJdLCB7XG5cdC8vb25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIG5ld1RhZ0N0eHMpIHtcblx0XHQvL0NvbnNpZGVyIGFkZGluZyBmaWx0ZXJpbmcgZm9yIHBlcmYgb3B0aW1pemF0aW9uLiBIb3dldmVyIHRoZSBiZWxvdyBwcmV2ZW50cyB1cGRhdGUgb24gc29tZSBzY2VuYXJpb3Mgd2hpY2ggX3Nob3VsZF8gdXBkYXRlIC0gbmFtZWx5IHdoZW4gdGhlcmUgaXMgYW5vdGhlciBhcnJheSBvbiB3aGljaCBmb3IgYWxzbyBkZXBlbmRzLlxuXHRcdC8vdmFyIGksIGwsIHRjaSwgcHJldkFyZztcblx0XHQvL2ZvciAodGNpID0gMDsgKHByZXZBcmcgPSB0aGlzLnRhZ0N0eHNbdGNpXSkgJiYgcHJldkFyZy5hcmdzLmxlbmd0aDsgdGNpKyspIHtcblx0XHQvL1x0aWYgKHByZXZBcmcuYXJnc1swXSAhPT0gbmV3VGFnQ3R4c1t0Y2ldLmFyZ3NbMF0pIHtcblx0XHQvL1x0XHRyZXR1cm4gdHJ1ZTtcblx0XHQvL1x0fVxuXHRcdC8vfVxuXHRcdC8vcmV0dXJuIGZhbHNlO1xuXHQvL30sXG5cdG9uQXJyYXlDaGFuZ2U6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIHRhZ0N0eCwgbGlua0N0eCkge1xuXHRcdHZhciBhcnJheVZpZXcsXG5cdFx0XHR0YXJnZXQgPSBldi50YXJnZXQsXG5cdFx0XHR0YXJnZXRMZW5ndGggPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGNoYW5nZSA9IGV2ZW50QXJncy5jaGFuZ2U7XG5cdFx0aWYgKHRhZy5fLm5vVndzIC8vIENoaWxkIHZpZXdzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0YXJnZXQgaXMgbm90IGh0bWwgLSBlLmcuIGRhdGEtbGluaz1cInRpdGxle2ZvciAuLi59XCJcblx0XHRcdHx8IHRhZy50YWdDdHhzWzFdICYmICggLy8gVGhlcmUgaXMgYW4ge3tlbHNlfX1cblx0XHRcdFx0Y2hhbmdlID09PSBcImluc2VydFwiICYmIHRhcmdldExlbmd0aCA9PT0gZXZlbnRBcmdzLml0ZW1zLmxlbmd0aCAvLyBpbnNlcnRpbmcsIGFuZCBuZXcgbGVuZ3RoIGlzIHNhbWUgYXMgaW5zZXJ0ZWQgbGVuZ3RoLCBzbyBnb2luZyBmcm9tIDAgdG8gblxuXHRcdFx0XHR8fCBjaGFuZ2UgPT09IFwicmVtb3ZlXCIgJiYgIXRhcmdldExlbmd0aCAvLyByZW1vdmluZyAsIGFuZCBuZXcgbGVuZ3RoIDAsIHNvIGdvaW5nIGZyb20gbiB0byAwXG5cdFx0XHQpKSB7XG5cdFx0XHR0YWcucmVmcmVzaCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGFycmF5VmlldyBpbiB0YWcuXy5hcnJWd3MpIHtcblx0XHRcdFx0YXJyYXlWaWV3ID0gdGFnLl8uYXJyVndzW2FycmF5Vmlld107XG5cdFx0XHRcdGlmIChhcnJheVZpZXcuZGF0YSA9PT0gdGFyZ2V0KSB7XG5cdFx0XHRcdFx0YXJyYXlWaWV3Ll8ub25BcnJheUNoYW5nZS5hcHBseShhcnJheVZpZXcsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGFnLmRvbUNoYW5nZSh0YWdDdHgsIGxpbmtDdHgsIGV2ZW50QXJncyk7XG5cdFx0ZXYuZG9uZSA9IHRydWU7XG5cdH0sXG5cdG9uQWZ0ZXJMaW5rOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHR2YXIgaSwgYXJySGFuZGxlciwgYXJyQmluZGluZywgZGF0YSxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRhcnJheUJpbmRpbmdzID0gdGFnLl9hcnMgfHwge30sXG5cdFx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHMsXG5cdFx0XHRsID0gdGFnQ3R4cy5sZW5ndGgsXG5cdFx0XHRzZWxlY3RlZCA9IHRhZy5zZWxlY3RlZCB8fCAwO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8PSBzZWxlY3RlZDsgaSsrKSB7XG5cdFx0XHR0YWdDdHggPSB0YWdDdHhzW2ldOyAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRhZ0N0eHMgdXAgdG8gc2VsZWN0ZWRcblx0XHRcdGRhdGEgPSB0YWdDdHgubWFwXG5cdFx0XHRcdD8gdGFnQ3R4Lm1hcC50Z3QgICAgICAgIC8vICdkYXRhJyBpcyBtYXBwZWQgZGF0YVxuXHRcdFx0XHQ6IHRhZ0N0eC5hcmdzLmxlbmd0aFxuXHRcdFx0XHRcdD8gdGFnQ3R4LmFyZ3NbMF0gICAgLy8gb3IgYXJnc1swXVxuXHRcdFx0XHRcdDogdGFnQ3R4LnZpZXcuZGF0YTsgLy8gb3IgZGVmYXVsdHMgdG8gY3VycmVudCBkYXRhLlxuXG5cdFx0XHRpZiAoKGFyckJpbmRpbmcgPSBhcnJheUJpbmRpbmdzW2ldKSAmJiBkYXRhICE9PSBhcnJCaW5kaW5nWzBdKSB7IC8vIElzIHRoZXJlIHByZXZpb3VzIGFycmF5IGRhdGEgb24gdGhpcyB0YWdDdHgsIGRpZmZlcmVudCBmcm9tIG5ldyBkYXRhXG5cdFx0XHRcdCRvYnNlcnZlKGFyckJpbmRpbmdbMF0sIGFyckJpbmRpbmdbMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZSBwcmV2aW91cyBhcnJheVxuXHRcdFx0XHRkZWxldGUgYXJyYXlCaW5kaW5nc1tpXTtcblx0XHRcdH1cblx0XHRcdGlmICghYXJyYXlCaW5kaW5nc1tpXSAmJiAkaXNBcnJheShkYXRhKSkge1xuXHRcdFx0XHQkb2JzZXJ2ZShkYXRhLCBhcnJIYW5kbGVyID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdHZhciB0YWdDdCA9IHRhZ0N0eDtcblx0XHRcdFx0XHR0YWcub25BcnJheUNoYW5nZShldiwgZXZlbnRBcmdzLCB0YWdDdCwgbGlua0N0eCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhcnJheUJpbmRpbmdzW2ldID0gW2RhdGEsIGFyckhhbmRsZXJdOyAvLyBTdG9yZSBhcnJheSBkYXRhIGFuZCBhcnJheUNoYW5nZUhhbmRsZXIgb24gdGFnLl9hcnNbaV1cblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChpID0gc2VsZWN0ZWQgKyAxOyBpIDwgbDsgaSsrKSB7IC8vIElmIHRoZXJlIHdlcmUgcHJldmlvdXMgYmluZGluZ3Mgb24gbGF0ZXIgdGFnQ3R4cywgcmVtb3ZlIHRoZW1cblx0XHRcdGlmIChhcnJCaW5kaW5nID0gYXJyYXlCaW5kaW5nc1tpXSkge1xuXHRcdFx0XHQkb2JzZXJ2ZShhcnJCaW5kaW5nWzBdLCBhcnJCaW5kaW5nWzFdLCB0cnVlKTsgLy91bm9ic2VydmUgcHJldmlvdXMgYmluZGluZ1xuXHRcdFx0XHRkZWxldGUgYXJyYXlCaW5kaW5nc1tpXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGFnLl9hcnMgPSBhcnJheUJpbmRpbmdzO1xuXHR9LFxuXHRvbkRpc3Bvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsLCB0YWcgPSB0aGlzO1xuXHRcdGZvciAobCBpbiB0YWcuX2Fycykge1xuXHRcdFx0JG9ic2VydmUodGFnLl9hcnNbbF1bMF0sIHRhZy5fYXJzW2xdWzFdLCB0cnVlKTsgLy91bm9ic2VydmVcblx0XHR9XG5cdH1cbn0pO1xuXG4kZXh0ZW5kKCR0YWdzW1wiaWZcIl0sIHtcblx0b25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIG5ld1RhZ0N0eHMpIHtcblx0XHR2YXIgdGNpLCBwcmV2QXJnLCBkaWZmZXJlbnQ7XG5cdFx0Zm9yICh0Y2kgPSAwOyAocHJldkFyZyA9IHRoaXMudGFnQ3R4c1t0Y2ldKTsgdGNpKyspIHtcblx0XHRcdGRpZmZlcmVudCA9IHByZXZBcmcucHJvcHMudG1wbCAhPT0gbmV3VGFnQ3R4c1t0Y2ldLnByb3BzLnRtcGwgfHwgcHJldkFyZy5hcmdzLmxlbmd0aCAmJiAhKHByZXZBcmcgPSBwcmV2QXJnLmFyZ3NbMF0pICE9PSAhbmV3VGFnQ3R4c1t0Y2ldLmFyZ3NbMF07XG5cdFx0XHRpZiAoKCF0aGlzLmNvbnZlcnQgJiYgISFwcmV2QXJnKSB8fCBkaWZmZXJlbnQpIHtcblx0XHRcdFx0cmV0dXJuIGRpZmZlcmVudDtcblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgbm90IGEgY2hhbmdlIG9mIHRlbXBsYXRlLCBhbmQgdGhlcmUgaXMgbm8gY29udmVydGVyLCBhbmQgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBib3RoIHRydXRoeSwgcmV0dXJuIGZhbHNlIHRvIGNhbmNlbCB1cGRhdGUuXG5cdFx0XHRcdC8vIChFdmVuIGlmIHZhbHVlcyBvbiBsYXRlciBlbHNlcyBhcmUgZGlmZmVyZW50LCB3ZSBzdGlsbCBkb24ndCB3YW50IHRvIHVwZGF0ZSwgc2luY2UgcmVuZGVyZWQgb3V0cHV0IHdvdWxkIGJlIHVuY2hhbmdlZClcblx0XHRcdFx0Ly8gSWYgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBkaWZmZXJlbnQsIHJldHVybiB0cnVlLCB0byB1cGRhdGVcblx0XHRcdFx0Ly8gSWYgbmV3QXJnIGFuZCBwcmV2QXJnIGFyZSBib3RoIGZhbHNleSwgbW92ZSB0byB0aGUgbmV4dCB7e2Vsc2UgLi4ufX1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gQm9vbGVhbiB2YWx1ZSBvZiBhbGwgYXJncyBhcmUgdW5jaGFuZ2VkIChmYWxzZXkpLCBzbyByZXR1cm4gZmFsc2UgdG8gY2FuY2VsIHVwZGF0ZVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0b25BZnRlckxpbms6IGZ1bmN0aW9uKHRhZ0N0eCwgbGlua0N0eCwgY3R4LCBldiwgZXZlbnRBcmdzKSB7XG5cdFx0aWYgKGV2ZW50QXJncykge1xuXHRcdFx0dGhpcy5kb21DaGFuZ2UodGFnQ3R4LCBsaW5rQ3R4LCBldmVudEFyZ3MpO1xuXHRcdH1cblx0fVxufSk7XG5cbmZ1bmN0aW9uIG9ic2VydmVQcm9wcyhtYXAsIGV2LCBldmVudEFyZ3MpIHtcblx0aWYgKGV2ZW50QXJncy5jaGFuZ2UgPT09IFwic2V0XCIpIHtcblx0XHR2YXIgdGFyZ2V0ID0gbWFwLnRndCxcblx0XHRcdGwgPSB0YXJnZXQubGVuZ3RoO1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdGlmICh0YXJnZXRbbF0ua2V5ID09PSBldmVudEFyZ3MucGF0aCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGwgPT09IC0xKSB7XG5cdFx0XHRpZiAoZXZlbnRBcmdzLnBhdGggJiYgIWV2ZW50QXJncy5yZW1vdmUpIHtcblx0XHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5pbnNlcnQoe2tleTogZXZlbnRBcmdzLnBhdGgsIHByb3A6IGV2ZW50QXJncy52YWx1ZX0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZXZlbnRBcmdzLnJlbW92ZSkge1xuXHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5yZW1vdmUobCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRvYnNlcnZhYmxlKHRhcmdldFtsXSkuc2V0UHJvcGVydHkoXCJwcm9wXCIsIGV2ZW50QXJncy52YWx1ZSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIG9ic2VydmVNYXBwZWRQcm9wcyhtYXAsIGV2LCBldmVudEFyZ3MpIHtcblx0dmFyIGl0ZW0sXG5cdFx0c291cmNlID0gbWFwLnNyYyxcblx0XHRjaGFuZ2UgPSBldmVudEFyZ3MuY2hhbmdlO1xuXG5cdGlmIChjaGFuZ2UgPT09IFwic2V0XCIpIHtcblx0XHRpZiAoZXZlbnRBcmdzLnBhdGggPT09IFwicHJvcFwiKSB7XG5cdFx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnNldFByb3BlcnR5KGV2LnRhcmdldC5rZXksIGV2ZW50QXJncy52YWx1ZSk7XG5cdFx0fSBlbHNlIHsgLy8gcGF0aCA9PT0gXCJrZXlcIlxuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5yZW1vdmVQcm9wZXJ0eShldmVudEFyZ3Mub2xkVmFsdWUpOyAvLyBXaGVuIGtleSBpcyBtb2RpZmllZCBvYnNlcnZhYmx5LCByZW1vdmUgb2xkIG9uZSBhbmQgc2V0IG5ldyBvbmVcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoZXZlbnRBcmdzLnZhbHVlLCBldi50YXJnZXQucHJvcCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGNoYW5nZSA9PT0gXCJyZW1vdmVcIikge1xuXHRcdGl0ZW0gPSBldmVudEFyZ3MuaXRlbXNbMF07XG5cdFx0JG9ic2VydmFibGUoc291cmNlKS5yZW1vdmVQcm9wZXJ0eShpdGVtLmtleSk7XG5cdFx0ZGVsZXRlIHNvdXJjZVtpdGVtLmtleV07XG5cdH0gZWxzZSBpZiAoY2hhbmdlID09PSBcImluc2VydFwiKSB7XG5cdFx0aXRlbSA9IGV2ZW50QXJncy5pdGVtc1swXTtcblx0XHRpZiAoaXRlbS5rZXkpIHtcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoaXRlbS5rZXksIGl0ZW0ucHJvcCk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHNoYWxsb3dBcnJheUZpbHRlcihhbGxQYXRoIC8qLCBvYmplY3QsIHBhcmVudE9icyovKSB7IC8vIEZpbHRlciB1c2VkIGJ5IHt7cHJvcHN9fSBmb3IgdGhlIG1hcHBlZFByb3BzIHRhcmdldCBhcnJheVxuXHRyZXR1cm4gYWxsUGF0aC5pbmRleE9mKFwiLlwiKSA8IDA7XG59XG5cbiR0YWdzKFwicHJvcHNcIiwge1xuXHRiYXNlVGFnOiBcImZvclwiLFxuXHRkYXRhTWFwOiAkdmlld3MubWFwKHtcblx0XHRnZXRUZ3Q6ICR0YWdzLnByb3BzLmRhdGFNYXAuZ2V0VGd0LFxuXHRcdG9ic1NyYzogb2JzZXJ2ZVByb3BzLFxuXHRcdG9ic1RndDogb2JzZXJ2ZU1hcHBlZFByb3BzLFxuXHRcdHRndEZsdDogc2hhbGxvd0FycmF5RmlsdGVyXG5cdH0pLFxuXHRmbG93OiB0cnVlXG59KTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCBqUXVlcnkgbmFtZXNwYWNlXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kZXh0ZW5kKCQsIHtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09XG5cdC8vIGpRdWVyeSAkLnZpZXcoKSBwbHVnaW5cblx0Ly89PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHZpZXc6ICR2aWV3ID0gZnVuY3Rpb24obm9kZSwgaW5uZXIsIHR5cGUpIHtcblx0XHQvLyAkLnZpZXcoKSByZXR1cm5zIHRvcCB2aWV3XG5cdFx0Ly8gJC52aWV3KG5vZGUpIHJldHVybnMgdmlldyB0aGF0IGNvbnRhaW5zIG5vZGVcblx0XHQvLyAkLnZpZXcoc2VsZWN0b3IpIHJldHVybnMgdmlldyB0aGF0IGNvbnRhaW5zIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnRcblx0XHQvLyAkLnZpZXcobm9kZU9yU2VsZWN0b3IsIHR5cGUpIHJldHVybnMgbmVhcmVzdCBjb250YWluaW5nIHZpZXcgb2YgZ2l2ZW4gdHlwZVxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgXCJyb290XCIpIHJldHVybnMgcm9vdCBjb250YWluaW5nIHZpZXcgKGNoaWxkIG9mIHRvcCB2aWV3KVxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgdHJ1ZSwgdHlwZSkgcmV0dXJucyBuZWFyZXN0IGlubmVyIChjb250YWluZWQpIHZpZXcgb2YgZ2l2ZW4gdHlwZVxuXG5cdFx0ZnVuY3Rpb24gZ2V0SW5uZXJWaWV3KG5kLCBpc1ZsKSB7XG5cdFx0XHRpZiAobmQpIHtcblx0XHRcdFx0dndJbmZvcyA9IHZpZXdJbmZvcyhuZCwgaXNWbCwgck9wZW5WaWV3TWFya2Vycyk7XG5cdFx0XHRcdGZvciAoaiA9IDAsIGsgPSB2d0luZm9zLmxlbmd0aDsgaiA8IGs7IGorKykge1xuXHRcdFx0XHRcdGlmICgodmlldyA9IHZpZXdTdG9yZVt2d0luZm9zW2pdLmlkXSkgJiYgKHZpZXcgPSB2aWV3ICYmIHR5cGUgPyB2aWV3LmdldCh0cnVlLCB0eXBlKSA6IHZpZXcpKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5uZXIgIT09ICEhaW5uZXIpIHtcblx0XHRcdC8vIGlubmVyIG5vdCBib29sZWFuLCBzbyB0aGlzIGlzIHZpZXcobm9kZU9yU2VsZWN0b3IsIHR5cGUpXG5cdFx0XHR0eXBlID0gaW5uZXI7XG5cdFx0XHRpbm5lciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dmFyIHZpZXcsIHZ3SW5mb3MsIGksIGosIGssIGwsIGVsZW1zLFxuXHRcdFx0bGV2ZWwgPSAwLFxuXHRcdFx0Ym9keSA9IGRvY3VtZW50LmJvZHk7XG5cblx0XHRpZiAobm9kZSAmJiBub2RlICE9PSBib2R5ICYmIHRvcFZpZXcuXy51c2VLZXkgPiAxKSB7XG5cdFx0XHQvLyBQZXJmIG9wdGltaXphdGlvbiBmb3IgY29tbW9uIGNhc2VzXG5cblx0XHRcdG5vZGUgPSBcIlwiICsgbm9kZSA9PT0gbm9kZVxuXHRcdFx0XHQ/ICQobm9kZSlbMF1cblx0XHRcdFx0OiBub2RlLmpxdWVyeVxuXHRcdFx0XHRcdD8gbm9kZVswXVxuXHRcdFx0XHRcdDogbm9kZTtcblxuXHRcdFx0aWYgKG5vZGUpIHtcblx0XHRcdFx0aWYgKGlubmVyKSB7XG5cdFx0XHRcdFx0Z2V0SW5uZXJWaWV3KG5vZGUuX2RmLCB0cnVlKTtcblx0XHRcdFx0XHRpZiAoIXZpZXcpIHtcblx0XHRcdFx0XHRcdC8vIFRyZWF0IHN1cHBsaWVkIG5vZGUgYXMgYSBjb250YWluZXIgZWxlbWVudCBhbmQgcmV0dXJuIHRoZSBmaXJzdCB2aWV3IGVuY291bnRlcmVkLlxuXHRcdFx0XHRcdFx0ZWxlbXMgPSBxc2EgPyBub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoYmluZEVsc1NlbCkgOiAkKGJpbmRFbHNTZWwsIG5vZGUpLmdldCgpO1xuXHRcdFx0XHRcdFx0bCA9IGVsZW1zLmxlbmd0aDtcblx0XHRcdFx0XHRcdGZvciAoaSA9IDA7ICF2aWV3ICYmIGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0Z2V0SW5uZXJWaWV3KGVsZW1zW2ldKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZpZXc7XG5cdFx0XHRcdH1cblx0XHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0XHQvLyBNb3ZlIGJhY2sgdGhyb3VnaCBzaWJsaW5ncyBhbmQgdXAgdGhyb3VnaCBwYXJlbnRzIHRvIGZpbmQgcHJlY2VkaW5nIG5vZGUgd2hpY2ggaXMgYSBfcHJ2IChwcmV2Tm9kZSlcblx0XHRcdFx0XHQvLyBzY3JpcHQgbWFya2VyIG5vZGUgZm9yIGEgbm9uLWVsZW1lbnQtY29udGVudCB2aWV3LCBvciBhIF9wcnYgKGZpcnN0IG5vZGUpIGZvciBhbiBlbENudCB2aWV3XG5cdFx0XHRcdFx0aWYgKHZ3SW5mb3MgPSB2aWV3SW5mb3Mobm9kZSwgdW5kZWZpbmVkLCByVmlld01hcmtlcnMpKSB7XG5cdFx0XHRcdFx0XHRsID0gdndJbmZvcy5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdFx0XHRcdHZpZXcgPSB2d0luZm9zW2xdO1xuXHRcdFx0XHRcdFx0XHRpZiAodmlldy5vcGVuKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGxldmVsIDwgMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmlldyA9IHZpZXdTdG9yZVt2aWV3LmlkXTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB2aWV3ICYmIHR5cGUgPyB2aWV3LmdldCh0eXBlKSA6IHZpZXcgfHwgdG9wVmlldztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bGV2ZWwtLTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBsZXZlbCBzdGFydHMgYXQgemVyby4gSWYgd2UgaGl0IGEgdmlldy5jbG9zZSwgdGhlbiB3ZSBtb3ZlIGxldmVsIHRvIDEsIGFuZCB3ZSBkb24ndCByZXR1cm4gYSB2aWV3IHVudGlsXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgYXJlIGJhY2sgYXQgbGV2ZWwgemVybyAob3IgYSBwYXJlbnQgdmlldyB3aXRoIGxldmVsIDwgMClcblx0XHRcdFx0XHRcdFx0XHRsZXZlbCsrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZyB8fCBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRvcFZpZXc7XG5cdH0sXG5cblx0bGluazogJGxpbmssXG5cdHVubGluazogJHVubGluayxcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PVxuXHQvLyBvdmVycmlkZSAkLmNsZWFuRGF0YVxuXHQvLz09PT09PT09PT09PT09PT09PT09PVxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKGVsZW1zKSB7XG5cdFx0aWYgKGVsZW1zLmxlbmd0aCAmJiBpc0NsZWFuQ2FsbCkge1xuXHRcdFx0Ly8gUmVtb3ZlIEpzVmlld3MgYmluZGluZ3MuIEFsc28sIHJlbW92ZSBmcm9tIHRoZSBET00gYW55IGNvcnJlc3BvbmRpbmcgc2NyaXB0IG1hcmtlciBub2Rlc1xuXHRcdFx0Y2xlYW4oZWxlbXMpO1xuXHRcdH1cblx0XHRvbGRDbGVhbkRhdGEuYXBwbHkoJCwgYXJndW1lbnRzKTtcblx0fVxufSk7XG5cbi8vIFBvc3NpYmxlIGZ1dHVyZSBhZGRpdGlvbiAtIGUuZy4gZm9yIGNrZWRpdG9yIHRhZyBjb250cm9sXG4vLyR2aWV3cy51dGlsaXR5ID0ge1xuLy9cdHZhbGlkYXRlOiBmdW5jdGlvbihodG1sKSB7XG4vL1x0XHR0cnkge1xuLy9cdFx0XHR0b3BWaWV3LmxpbmsodW5kZWZpbmVkLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaHRtbCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIDEpO1xuLy9cdFx0fVxuLy9cdFx0Y2F0Y2ggKGUpIHtcbi8vXHRcdFx0cmV0dXJuIGUubWVzc2FnZTtcbi8vXHRcdH1cbi8vXHR9XG4vL307XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIGpRdWVyeSBpbnN0YW5jZSBwbHVnaW5zXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJGV4dGVuZCgkLmZuLCB7XG5cdGxpbms6IGZ1bmN0aW9uKGV4cHIsIGZyb20sIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBwcmV2Tm9kZSwgbmV4dE5vZGUpIHtcblx0XHRyZXR1cm4gJGxpbmsoZXhwciwgdGhpcywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSk7XG5cdH0sXG5cdHVubGluazogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICR1bmxpbmsodGhpcyk7XG5cdH0sXG5cdHZpZXc6IGZ1bmN0aW9uKGlubmVyLCB0eXBlKSB7XG5cdFx0cmV0dXJuICR2aWV3KHRoaXNbMF0sIGlubmVyLCB0eXBlKTtcblx0fVxufSk7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPdmVycmlkZSBqUXVlcnkgbWV0aG9kcyB0aGF0IGNhbGwgb3VyIG92ZXJyaWRkZW4gY2xlYW5EYXRhLCBmb3IgZGlzcG9zYWwgZXRjLlxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJC5lYWNoKFtIVE1MLCBcInJlcGxhY2VXaXRoXCIsIFwiZW1wdHlcIiwgXCJyZW1vdmVcIl0sIGZ1bmN0aW9uKGksIG5hbWUpIHtcblx0dmFyIG9sZEZuID0gJC5mbltuYW1lXTtcblx0JC5mbltuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciByZXN1bHQ7XG5cdFx0aXNDbGVhbkNhbGwgPSAxOyAvLyBNYWtlIHN1cmUgY2xlYW5EYXRhIGRvZXMgZGlzcG9zYWwgb25seSB3aGVuIGNvbWluZyBmcm9tIHRoZXNlIGNhbGxzLlxuXHRcdHRyeSB7XG5cdFx0XHRyZXN1bHQgPSBvbGRGbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdH1cblx0XHRmaW5hbGx5IHtcblx0XHRcdGlzQ2xlYW5DYWxsID0gMDtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcbn0pO1xuXG4vLz09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIHRvcFZpZXdcbi8vPT09PT09PT09PT09PT09XG5cbmFkZExpbmtNZXRob2RzKCRleHRlbmQodG9wVmlldyA9ICRzdWIudG9wVmlldywge3RtcGw6IHtsaW5rczoge319fSkpO1xuXG52aWV3U3RvcmUgPSB7MDogdG9wVmlld307IC8vIFRvcC1sZXZlbCB2aWV3XG4vLz09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kICQudmlld3Ncbi8vPT09PT09PT09PT09PT09XG5cbiR2aWV3cy5nZXRDdHggPSBmdW5jdGlvbihwYXJhbSkgeyAvLyBSZXR1cm4gdmFsdWUgb2YgY3R4LmZvbywgaW5jbHVkaW5nIGZvciBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMsIH5mb289ZXhwclxuXHRpZiAocGFyYW0gJiYgcGFyYW0uX2NwKSB7IC8vIElmIHRoaXMgaGVscGVyIHJlc291cmNlIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIsIH5mb289ZXhwclxuXHRcdHBhcmFtID0gIHBhcmFtWzFdKHBhcmFtWzBdLmRhdGEsIHBhcmFtWzBdLCAkc3ViKTtcblx0fVxuXHRyZXR1cm4gcGFyYW07XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCAkLnZpZXdzLnN1YlxuLy89PT09PT09PT09PT09PT09PT09XG5cbiRzdWIuX2NwID0gZnVuY3Rpb24ocGFyYW1WYWwsIHBhcmFtcywgdmlldykgeyAvLyBHZXQgY29tcGlsZWQgY29udGV4dHVhbCBwYXJhbWV0ZXJzIChvciBwcm9wZXJ0aWVzKSB+Zm9vPWV4cHIuXG5cdGlmICh2aWV3LmxpbmtlZCkgeyAvLyBJbiBKc1ZpZXdzLCByZXR1cm5zIFt2aWV3LCBsaW5rRm5dIHdoZXJlIGxpbmtGbiBpcyBjb21waWxlZCBmdW5jdGlvbiBmb3IgZXhwcmVzc2lvblxuXHRcdHBhcmFtcyA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBwYXJhbXMgKyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0dmFyIHRtcGwgPSB2aWV3LnRtcGwsXG5cdFx0XHRsaW5rcyA9IHRvcFZpZXcudG1wbC5saW5rcywgLy8gVXNlIHRvcFZpZXcgbGlua3MsIGFzIGZvciBjb21waWxlZCB0b3AtbGV2ZWwgbGlua2luZyBleHByZXNzaW9ucy4gVG8gZG8gLSBzaG91bGQgdGhpcyBldmVyIGdldCBkaXNwb3NlZD9cblx0XHRcdGxpbmtGbiA9IGxpbmtzW3BhcmFtc107XG5cdFx0aWYgKCFsaW5rRm4pIHtcblx0XHRcdGxpbmtzW3BhcmFtc10gPSBsaW5rRm4gPSAkc3ViLnRtcGxGbihwYXJhbXMsIHRtcGwsIHRydWUpO1xuXHRcdH1cblx0XHRwYXJhbVZhbCA9IFt2aWV3LCBsaW5rRm5dO1xuXHRcdHBhcmFtVmFsLl9jcCA9IHRydWU7IC8vIEZsYWcgdGhhdCB0aGlzIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXJcblx0fVxuXHRyZXR1cm4gcGFyYW1WYWw7IC8vIEluIEpzUmVuZGVyIHJldHVybnMgZXZhbHVhdGVkIGV4cHJlc3Npb25cbn07XG5cbiRzdWIuX2NlbyA9IGZ1bmN0aW9uIGNsb25lRXhwck9iamVjdHMob2JzKSB7ICAvLyBDbG9uZSBleHByT2JzIHNvIHRoYXQgZWFjaCByZWZlcmVuY2VkIGNvbnRleHR1YWwgcGFyYW1ldGVyIH5mb28gdXNlcyBpdHMgb3duIGV4cHJPYiBpbnN0YW5jZXNcblx0dmFyIG9iLFxuXHRcdGNsb25lcyA9IG9icyxcblx0XHRsID0gb2JzLmxlbmd0aDtcblx0aWYgKGwpIHtcblx0XHRjbG9uZXMgPSBbXTtcblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRvYiA9IG9ic1tsXTtcblx0XHRcdGlmIChvYi5fanN2KSB7XG5cdFx0XHRcdG9iID0gJGV4dGVuZCh7fSwgb2IpOyAgICAgICAgICAgICAgLy8gSWYgYW4gZXhwck9iLCBjbG9uZSBpdC4gSWYgYSBzdHJpbmcsIGtlZXAgYXMgaXNcblx0XHRcdFx0b2IucHJtID0gY2xvbmVFeHByT2JqZWN0cyhvYi5wcm0pOyAvLyBSZWN1cnNpdmVseSBjbG9uZSBleHByT2JzIGluIHBhcmFtZXRlcnMsIHRvb1xuXHRcdFx0fVxuXHRcdFx0Y2xvbmVzLnVuc2hpZnQob2IpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY2xvbmVzO1xufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgJC52aWV3cy5zZXR0aW5nc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09XG5cbm9sZEFkdlNldCA9ICRzdWIuYWR2U2V0O1xuXG4kc3ViLmFkdlNldCA9IGZ1bmN0aW9uKCkgeyAvLyByZWZyZXNoIGFkdmFuY2VkIHNldHRpbmdzXG5cdG9sZEFkdlNldCgpO1xuXHRnbG9iYWwuX2pzdiA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl9qc3Zcblx0XHQ/ICRleHRlbmQoZ2xvYmFsLl9qc3YgfHwge30sIHsgLy8gY3JlYXRlIGdsb2JhbCBfanN2LCBmb3IgYWNjZXNzaW5nIHZpZXdzLCBldGNcblx0XHRcdFx0dmlld3M6IHZpZXdTdG9yZSxcblx0XHRcdFx0YmluZGluZ3M6IGJpbmRpbmdTdG9yZVxuXHRcdFx0fSlcblx0XHQ6IHVuZGVmaW5lZDsgLy8gSW4gSUU4IGNhbm5vdCBkbyBkZWxldGUgZ2xvYmFsLl9qc3Zcblx0JHZpZXdzTGlua0F0dHIgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5saW5rQXR0cjtcblx0bGlua1ZpZXdzU2VsID0gYmluZEVsc1NlbCArIFwiLFtcIiArICR2aWV3c0xpbmtBdHRyICsgXCJdXCI7XG5cdHdyYXBNYXAgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5fd207XG5cdHdyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjtcblx0d3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcblx0d3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG59O1xuXG4kdmlld3NTZXR0aW5ncy5hZHZhbmNlZCh7XG5cdGxpbmtBdHRyOiBcImRhdGEtbGlua1wiLFxuXHR1c2VWaWV3czogZmFsc2UsXG5cdG5vVmFsaWRhdGU6IGZhbHNlLFxuXHQvLyB3cmFwTWFwIHByb3ZpZGUgYXBwcm9wcmlhdGUgd3JhcHBlcnMgZm9yIGluc2VydGluZyBpbm5lckhUTUwsIHVzZWQgaW4gaW5zZXJ0QmVmb3JlXG5cdC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApXG5cdC8vIFRPRE8gaW52ZXN0aWdhdGUgd2hldGhlciBtb3JlIHJlY2VudCBqUXVlcnkgaW1wbGVtZW50YXRpb24gdXNpbmcgd3JhcE1hcCBpbiBkb21NYW5pcC8kKCkuaHRtbCgpIGV0Yy4gaXMgYmV0dGVyIG9wdGltaXplZCBub3cuLi5cblx0X3dtOiB7XG5cdFx0b3B0aW9uOiBbMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCJdLFxuXHRcdGxlZ2VuZDogWzEsIFwiPGZpZWxkc2V0PlwiLCBcIjwvZmllbGRzZXQ+XCJdLFxuXHRcdGFyZWE6IFsxLCBcIjxtYXA+XCIsIFwiPC9tYXA+XCJdLFxuXHRcdHBhcmFtOiBbMSwgXCI8b2JqZWN0PlwiLCBcIjwvb2JqZWN0PlwiXSxcblx0XHR0aGVhZDogWzEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCJdLFxuXHRcdHRyOiBbMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIl0sXG5cdFx0dGQ6IFszLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiXSxcblx0XHRjb2w6IFsyLCBcIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiXSxcblx0XHRzdmdfbnM6IFsxLCBcIjxzdmc+XCIsIFwiPC9zdmc+XCJdLFxuXHRcdC8vIElFNi04IGNhbid0IHNlcmlhbGl6ZSBsaW5rLCBzY3JpcHQsIHN0eWxlLCBvciBhbnkgaHRtbDUgKE5vU2NvcGUpIHRhZ3MsXG5cdFx0Ly8gdW5sZXNzIHdyYXBwZWQgaW4gYSBkaXYgd2l0aCBub24tYnJlYWtpbmcgY2hhcmFjdGVycyBpbiBmcm9udCBvZiBpdC5cblx0XHRkaXY6ICQuc3VwcG9ydC5odG1sU2VyaWFsaXplID8gWzAsIFwiXCIsIFwiXCJdIDogWzEsIFwiWDxkaXY+XCIsIFwiPC9kaXY+XCJdXG5cdH0sXG5cdF9mZToge1xuXHRcdGlucHV0OiB7XG5cdFx0XHRmcm9tOiBpbnB1dEF0dHJpYiwgdG86IFwidmFsdWVcIlxuXHRcdH0sXG5cdFx0dGV4dGFyZWE6IHZhbHVlQmluZGluZyxcblx0XHRzZWxlY3Q6IHZhbHVlQmluZGluZyxcblx0XHRvcHRncm91cDoge1xuXHRcdFx0dG86IFwibGFiZWxcIlxuXHRcdH1cblx0fVxufSk7XG5cbnJldHVybiAkO1xufSwgd2luZG93KSk7XG4iLCIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjIuMS40XG4gKiBodHRwOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IDIwMDUsIDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNS0wNC0yOFQxNjowMVpcbiAqL1xuXG4oZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcblxuXHRpZiAoIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiICkge1xuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0odHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBTdXBwb3J0OiBGaXJlZm94IDE4K1xuLy8gQ2FuJ3QgYmUgaW4gc3RyaWN0IG1vZGUsIHNldmVyYWwgbGlicyBpbmNsdWRpbmcgQVNQLk5FVCB0cmFjZVxuLy8gdGhlIHN0YWNrIHZpYSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmXG4vLyB5b3UgdHJ5IHRvIHRyYWNlIHRocm91Z2ggXCJ1c2Ugc3RyaWN0XCIgY2FsbCBjaGFpbnMuICgjMTMzMzUpXG4vL1xuXG52YXIgYXJyID0gW107XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgc3VwcG9ydCA9IHt9O1xuXG5cblxudmFyXG5cdC8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveClcblx0ZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQsXG5cblx0dmVyc2lvbiA9IFwiMi4xLjRcIixcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xXG5cdC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUFxuXHRydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZyxcblxuXHQvLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmdcblx0cm1zUHJlZml4ID0gL14tbXMtLyxcblx0cmRhc2hBbHBoYSA9IC8tKFtcXGRhLXpdKS9naSxcblxuXHQvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5cdGZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7XG5cdFx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuXHR9O1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3Jcblx0c2VsZWN0b3I6IFwiXCIsXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXHRcdHJldHVybiBudW0gIT0gbnVsbCA/XG5cblx0XHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRcdCggbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXSApIDpcblxuXHRcdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdFx0c2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2tcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXG5cdHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkge1xuXG5cdFx0Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXRcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XG5cblx0XHQvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKVxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcblx0XHRyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuXHRcdC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LlxuXHQvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpc1xuXHQvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9KSk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTtcblx0fSxcblxuXHRlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkge1xuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNBcnJheShzcmMpID8gc3JjIDogW107XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09IFwiZnVuY3Rpb25cIjtcblx0fSxcblxuXHRpc0FycmF5OiBBcnJheS5pc0FycmF5LFxuXG5cdGlzV2luZG93OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH0sXG5cblx0aXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChudWxsfHRydWV8ZmFsc2V8XCJcIilcblx0XHQvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzIChcIjB4Li4uXCIpXG5cdFx0Ly8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOXG5cdFx0Ly8gYWRkaW5nIDEgY29ycmVjdHMgbG9zcyBvZiBwcmVjaXNpb24gZnJvbSBwYXJzZUZsb2F0ICgjMTUxMDApXG5cdFx0cmV0dXJuICFqUXVlcnkuaXNBcnJheSggb2JqICkgJiYgKG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApICsgMSkgPj0gMDtcblx0fSxcblxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdC8vIE5vdCBwbGFpbiBvYmplY3RzOlxuXHRcdC8vIC0gQW55IG9iamVjdCBvciB2YWx1ZSB3aG9zZSBpbnRlcm5hbCBbW0NsYXNzXV0gcHJvcGVydHkgaXMgbm90IFwiW29iamVjdCBPYmplY3RdXCJcblx0XHQvLyAtIERPTSBub2Rlc1xuXHRcdC8vIC0gd2luZG93XG5cdFx0aWYgKCBqUXVlcnkudHlwZSggb2JqICkgIT09IFwib2JqZWN0XCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCBvYmouY29uc3RydWN0b3IgJiZcblx0XHRcdFx0IWhhc093bi5jYWxsKCBvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCBcImlzUHJvdG90eXBlT2ZcIiApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBmdW5jdGlvbiBoYXNuJ3QgcmV0dXJuZWQgYWxyZWFkeSwgd2UncmUgY29uZmlkZW50IHRoYXRcblx0XHQvLyB8b2JqfCBpcyBhIHBsYWluIG9iamVjdCwgY3JlYXRlZCBieSB7fSBvciBjb25zdHJ1Y3RlZCB3aXRoIG5ldyBPYmplY3Rcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0XHR9XG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjAsIGlPUzw2IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdFx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRcdGNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdFx0dHlwZW9mIG9iajtcblx0fSxcblxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dFxuXHRnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHtcblx0XHR2YXIgc2NyaXB0LFxuXHRcdFx0aW5kaXJlY3QgPSBldmFsO1xuXG5cdFx0Y29kZSA9IGpRdWVyeS50cmltKCBjb2RlICk7XG5cblx0XHRpZiAoIGNvZGUgKSB7XG5cdFx0XHQvLyBJZiB0aGUgY29kZSBpbmNsdWRlcyBhIHZhbGlkLCBwcm9sb2d1ZSBwb3NpdGlvblxuXHRcdFx0Ly8gc3RyaWN0IG1vZGUgcHJhZ21hLCBleGVjdXRlIGNvZGUgYnkgaW5qZWN0aW5nIGFcblx0XHRcdC8vIHNjcmlwdCB0YWcgaW50byB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpZiAoIGNvZGUuaW5kZXhPZihcInVzZSBzdHJpY3RcIikgPT09IDEgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBhdm9pZCB0aGUgRE9NIG5vZGUgY3JlYXRpb24sIGluc2VydGlvblxuXHRcdFx0Ly8gYW5kIHJlbW92YWwgYnkgdXNpbmcgYW4gaW5kaXJlY3QgZ2xvYmFsIGV2YWxcblx0XHRcdFx0aW5kaXJlY3QoIGNvZGUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3Milcblx0Y2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkge1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xuXHR9LFxuXG5cdG5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0fSxcblxuXHQvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrLCBhcmdzICkge1xuXHRcdHZhciB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aCxcblx0XHRcdGlzQXJyYXkgPSBpc0FycmF5bGlrZSggb2JqICk7XG5cblx0XHRpZiAoIGFyZ3MgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXkgKSB7XG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2suYXBwbHkoIG9ialsgaSBdLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGlzQXJyYXkgKSB7XG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7XG5cblx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMVxuXHR0cmltOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cblx0XHRcdFwiXCIgOlxuXHRcdFx0KCB0ZXh0ICsgXCJcIiApLnJlcGxhY2UoIHJ0cmltLCBcIlwiICk7XG5cdH0sXG5cblx0Ly8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XG5cdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XG5cblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBpc0FycmF5bGlrZSggT2JqZWN0KGFycikgKSApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsXG5cdFx0XHRcdFx0dHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkge1xuXHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcblx0XHRcdGogPSAwLFxuXHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07XG5cdFx0fVxuXG5cdFx0Zmlyc3QubGVuZ3RoID0gaTtcblxuXHRcdHJldHVybiBmaXJzdDtcblx0fSxcblxuXHRncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7XG5cdFx0dmFyIGNhbGxiYWNrSW52ZXJzZSxcblx0XHRcdG1hdGNoZXMgPSBbXSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0Y2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0O1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xuXHRcdC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG5cdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRjYWxsYmFja0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTtcblx0XHRcdGlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHtcblx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBlbGVtc1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkge1xuXHRcdHZhciB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0aXNBcnJheSA9IGlzQXJyYXlsaWtlKCBlbGVtcyApLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsXG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gZWxlbXMgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0XHRyZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7XG5cdH0sXG5cblx0Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzXG5cdGd1aWQ6IDEsXG5cblx0Ly8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55XG5cdC8vIGFyZ3VtZW50cy5cblx0cHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcblx0XHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRcdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0bXAgPSBmblsgY29udGV4dCBdO1xuXHRcdFx0Y29udGV4dCA9IGZuO1xuXHRcdFx0Zm4gPSB0bXA7XG5cdFx0fVxuXG5cdFx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0XHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBTaW11bGF0ZWQgYmluZFxuXHRcdGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTtcblx0XHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdFx0fTtcblxuXHRcdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRcdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9LFxuXG5cdG5vdzogRGF0ZS5ub3csXG5cblx0Ly8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyXG5cdC8vIHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuXG5cdHN1cHBvcnQ6IHN1cHBvcnRcbn0pO1xuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvclwiLnNwbGl0KFwiIFwiKSwgZnVuY3Rpb24oaSwgbmFtZSkge1xuXHRjbGFzczJ0eXBlWyBcIltvYmplY3QgXCIgKyBuYW1lICsgXCJdXCIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbn0pO1xuXG5mdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IGlPUyA4LjIgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cblx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoIG9iai5ub2RlVHlwZSA9PT0gMSAmJiBsZW5ndGggKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMi4wLXByZVxuICogaHR0cDovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE0LTEyLTE2XG4gKi9cbihmdW5jdGlvbiggd2luZG93ICkge1xuXG52YXIgaSxcblx0c3VwcG9ydCxcblx0RXhwcixcblx0Z2V0VGV4dCxcblx0aXNYTUwsXG5cdHRva2VuaXplLFxuXHRjb21waWxlLFxuXHRzZWxlY3QsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXG5cdC8vIExvY2FsIGRvY3VtZW50IHZhcnNcblx0c2V0RG9jdW1lbnQsXG5cdGRvY3VtZW50LFxuXHRkb2NFbGVtLFxuXHRkb2N1bWVudElzSFRNTCxcblx0cmJ1Z2d5UVNBLFxuXHRyYnVnZ3lNYXRjaGVzLFxuXHRtYXRjaGVzLFxuXHRjb250YWlucyxcblxuXHQvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhXG5cdGV4cGFuZG8gPSBcInNpenpsZVwiICsgMSAqIG5ldyBEYXRlKCksXG5cdHByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCxcblx0ZGlycnVucyA9IDAsXG5cdGRvbmUgPSAwLFxuXHRjbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0dG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fSxcblxuXHQvLyBHZW5lcmFsLXB1cnBvc2UgY29uc3RhbnRzXG5cdE1BWF9ORUdBVElWRSA9IDEgPDwgMzEsXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHA6Ly9qc3BlcmYuY29tL3Rob3ItaW5kZXhvZi12cy1mb3IvNVxuXHRpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7XG5cdFx0dmFyIGkgPSAwLFxuXHRcdFx0bGVuID0gbGlzdC5sZW5ndGg7XG5cdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRpZiAoIGxpc3RbaV0gPT09IGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gLTE7XG5cdH0sXG5cblx0Ym9vbGVhbnMgPSBcImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkXCIsXG5cblx0Ly8gUmVndWxhciBleHByZXNzaW9uc1xuXG5cdC8vIFdoaXRlc3BhY2UgY2hhcmFjdGVycyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXN5bnRheC8jY2hhcmFjdGVyc1xuXHRjaGFyYWN0ZXJFbmNvZGluZyA9IFwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFxcXHgwMC1cXFxceGEwXSkrXCIsXG5cblx0Ly8gTG9vc2VseSBtb2RlbGVkIG9uIENTUyBpZGVudGlmaWVyIGNoYXJhY3RlcnNcblx0Ly8gQW4gdW5xdW90ZWQgdmFsdWUgc2hvdWxkIGJlIGEgQ1NTIGlkZW50aWZpZXIgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0Ly8gUHJvcGVyIHN5bnRheDogaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI3ZhbHVlLWRlZi1pZGVudGlmaWVyXG5cdGlkZW50aWZpZXIgPSBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCBcIndcIiwgXCJ3I1wiICksXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKSg/OlxcXFwoKFwiICtcblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXHRcdC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2KVxuXHRcdFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiICsgYXR0cmlidXRlcyArIFwiKSopfFwiICtcblx0XHQvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpXG5cdFx0XCIuKlwiICtcblx0XHRcIilcXFxcKXwpXCIsXG5cblx0Ly8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlclxuXHRyd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcIitcIiwgXCJnXCIgKSxcblx0cnRyaW0gPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblxuXHRyYXR0cmlidXRlUXVvdGVzID0gbmV3IFJlZ0V4cCggXCI9XCIgKyB3aGl0ZXNwYWNlICsgXCIqKFteXFxcXF0nXFxcIl0qPylcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcXVwiLCBcImdcIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0XCJJRFwiOiBuZXcgUmVnRXhwKCBcIl4jKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggXCJ3XCIsIFwidypcIiApICsgXCIpXCIgKSxcblx0XHRcIkFUVFJcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBhdHRyaWJ1dGVzICksXG5cdFx0XCJQU0VVRE9cIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBwc2V1ZG9zICksXG5cdFx0XCJDSElMRFwiOiBuZXcgUmVnRXhwKCBcIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcXFwoXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooXFxcXGQrKXwpKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfClcIiwgXCJpXCIgKSxcblx0XHRcImJvb2xcIjogbmV3IFJlZ0V4cCggXCJeKD86XCIgKyBib29sZWFucyArIFwiKSRcIiwgXCJpXCIgKSxcblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdHJuYXRpdmUgPSAvXltee10rXFx7XFxzKlxcW25hdGl2ZSBcXHcvLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cdHJlc2NhcGUgPSAvJ3xcXFxcL2csXG5cblx0Ly8gQ1NTIGVzY2FwZXMgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVyc1xuXHRydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCBcIlxcXFxcXFxcKFtcXFxcZGEtZl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3woXCIgKyB3aGl0ZXNwYWNlICsgXCIpfC4pXCIsIFwiaWdcIiApLFxuXHRmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7XG5cdFx0dmFyIGhpZ2ggPSBcIjB4XCIgKyBlc2NhcGVkIC0gMHgxMDAwMDtcblx0XHQvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludFxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjRcblx0XHQvLyBXb3JrYXJvdW5kIGVycm9uZW91cyBudW1lcmljIGludGVycHJldGF0aW9uIG9mICtcIjB4XCJcblx0XHRyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/XG5cdFx0XHRlc2NhcGVkIDpcblx0XHRcdGhpZ2ggPCAwID9cblx0XHRcdFx0Ly8gQk1QIGNvZGVwb2ludFxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFx0Ly8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpXG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXNcblx0Ly8gU2VlIHNldERvY3VtZW50KClcblx0Ly8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgXCJQZXJtaXNzaW9uIERlbmllZFwiXG5cdC8vIGVycm9yIGluIElFXG5cdHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblx0XHRzZXREb2N1bWVudCgpO1xuXHR9O1xuXG4vLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxpc3QgKVxudHJ5IHtcblx0cHVzaC5hcHBseShcblx0XHQoYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7IGFwcGx5OiBhcnIubGVuZ3RoID9cblxuXHRcdC8vIExldmVyYWdlIHNsaWNlIGlmIHBvc3NpYmxlXG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0cHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHQvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGhcblx0XHRcdHdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge31cblx0XHRcdHRhcmdldC5sZW5ndGggPSBqIC0gMTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBtYXRjaCwgZWxlbSwgbSwgbm9kZVR5cGUsXG5cdFx0Ly8gUVNBIHZhcnNcblx0XHRpLCBncm91cHMsIG9sZCwgbmlkLCBuZXdDb250ZXh0LCBuZXdTZWxlY3RvcjtcblxuXHRpZiAoICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblxuXHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cdG5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZTtcblxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdGlmICggIXNlZWQgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cblx0XHQvLyBUcnkgdG8gc2hvcnRjdXQgZmluZCBvcGVyYXRpb25zIHdoZW4gcG9zc2libGUgKGUuZy4sIG5vdCB1bmRlciBEb2N1bWVudEZyYWdtZW50KVxuXHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiI0lEXCIpXG5cdFx0XHRpZiAoIChtID0gbWF0Y2hbMV0pICkge1xuXHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnNcblx0XHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50IChqUXVlcnkgIzY5NjMpXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSwgT3BlcmEsIGFuZCBXZWJraXQgcmV0dXJuIGl0ZW1zXG5cdFx0XHRcdFx0XHQvLyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ29udGV4dCBpcyBub3QgYSBkb2N1bWVudFxuXHRcdFx0XHRcdGlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0gY29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRjb250YWlucyggY29udGV4dCwgZWxlbSApICYmIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiVEFHXCIpXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsyXSApIHtcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gU3BlZWQtdXA6IFNpenpsZShcIi5DTEFTU1wiKVxuXHRcdFx0fSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkgJiYgc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBRU0EgcGF0aFxuXHRcdGlmICggc3VwcG9ydC5xc2EgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHtcblx0XHRcdG5pZCA9IG9sZCA9IGV4cGFuZG87XG5cdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdG5ld1NlbGVjdG9yID0gbm9kZVR5cGUgIT09IDEgJiYgc2VsZWN0b3I7XG5cblx0XHRcdC8vIHFTQSB3b3JrcyBzdHJhbmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmllc1xuXHRcdFx0Ly8gV2UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgYnkgc3BlY2lmeWluZyBhbiBleHRyYSBJRCBvbiB0aGUgcm9vdFxuXHRcdFx0Ly8gYW5kIHdvcmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpXG5cdFx0XHQvLyBJRSA4IGRvZXNuJ3Qgd29yayBvbiBvYmplY3QgZWxlbWVudHNcblx0XHRcdGlmICggbm9kZVR5cGUgPT09IDEgJiYgY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXHRcdFx0XHRncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblxuXHRcdFx0XHRpZiAoIChvbGQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpKSApIHtcblx0XHRcdFx0XHRuaWQgPSBvbGQucmVwbGFjZSggcmVzY2FwZSwgXCJcXFxcJCZcIiApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRleHQuc2V0QXR0cmlidXRlKCBcImlkXCIsIG5pZCApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5pZCA9IFwiW2lkPSdcIiArIG5pZCArIFwiJ10gXCI7XG5cblx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdGdyb3Vwc1tpXSA9IG5pZCArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0O1xuXHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKFwiLFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBuZXdTZWxlY3RvciApIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaChxc2FFcnJvcikge1xuXHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdGlmICggIW9sZCApIHtcblx0XHRcdFx0XHRcdGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtGdW5jdGlvbihzdHJpbmcsIE9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1bHRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KCBmbiApIHtcblx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gISFmbiggZGl2ICk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cdFx0Ly8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0XG5cdFx0aWYgKCBkaXYucGFyZW50Tm9kZSApIHtcblx0XHRcdGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBkaXYgKTtcblx0XHR9XG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRkaXYgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGF0dHJzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3NcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGJcbiAqL1xuZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkge1xuXHR2YXIgY3VyID0gYiAmJiBhLFxuXHRcdGRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHQoIH5iLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApIC1cblx0XHRcdCggfmEuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICk7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkge1xuXHRcdGFyZ3VtZW50ID0gK2FyZ3VtZW50O1xuXHRcdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7XG5cdHJldHVybiBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnRleHQ7XG59XG5cbi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlXG5zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTtcblxuLyoqXG4gKiBEZXRlY3RzIFhNTCBub2Rlc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGVcbiAqL1xuaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0Ly8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdFxuXHQvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMylcblx0dmFyIGRvY3VtZW50RWxlbWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1lbnQ7XG5cdHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09IFwiSFRNTFwiIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqL1xuc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHtcblx0dmFyIGhhc0NvbXBhcmUsIHBhcmVudCxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gSWYgbm8gZG9jdW1lbnQgYW5kIGRvY3VtZW50RWxlbWVudCBpcyBhdmFpbGFibGUsIHJldHVyblxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFNldCBvdXIgZG9jdW1lbnRcblx0ZG9jdW1lbnQgPSBkb2M7XG5cdGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRwYXJlbnQgPSBkb2MuZGVmYXVsdFZpZXc7XG5cblx0Ly8gU3VwcG9ydDogSUU+OFxuXHQvLyBJZiBpZnJhbWUgZG9jdW1lbnQgaXMgYXNzaWduZWQgdG8gXCJkb2N1bWVudFwiIHZhcmlhYmxlIGFuZCBpZiBpZnJhbWUgaGFzIGJlZW4gcmVsb2FkZWQsXG5cdC8vIElFIHdpbGwgdGhyb3cgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gYWNjZXNzaW5nIFwiZG9jdW1lbnRcIiB2YXJpYWJsZSwgc2VlIGpRdWVyeSAjMTM5MzZcblx0Ly8gSUU2LTggZG8gbm90IHN1cHBvcnQgdGhlIGRlZmF1bHRWaWV3IHByb3BlcnR5IHNvIHBhcmVudCB3aWxsIGJlIHVuZGVmaW5lZFxuXHRpZiAoIHBhcmVudCAmJiBwYXJlbnQgIT09IHBhcmVudC50b3AgKSB7XG5cdFx0Ly8gSUUxMSBkb2VzIG5vdCBoYXZlIGF0dGFjaEV2ZW50LCBzbyBhbGwgbXVzdCBzdWZmZXJcblx0XHRpZiAoIHBhcmVudC5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0cGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7XG5cdFx0fSBlbHNlIGlmICggcGFyZW50LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0cGFyZW50LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBTdXBwb3J0IHRlc3RzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvYyApO1xuXG5cdC8qIEF0dHJpYnV0ZXNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFN1cHBvcnQ6IElFPDhcblx0Ly8gVmVyaWZ5IHRoYXQgZ2V0QXR0cmlidXRlIHJlYWxseSByZXR1cm5zIGF0dHJpYnV0ZXMgYW5kIG5vdCBwcm9wZXJ0aWVzXG5cdC8vIChleGNlcHRpbmcgSUU4IGJvb2xlYW5zKVxuXHRzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkaXYuY2xhc3NOYW1lID0gXCJpXCI7XG5cdFx0cmV0dXJuICFkaXYuZ2V0QXR0cmlidXRlKFwiY2xhc3NOYW1lXCIpO1xuXHR9KTtcblxuXHQvKiBnZXRFbGVtZW50KHMpQnkqXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzXG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkaXYuYXBwZW5kQ2hpbGQoIGRvYy5jcmVhdGVDb21tZW50KFwiXCIpICk7XG5cdFx0cmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8MTBcblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lXG5cdC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pZCA9IGV4cGFuZG87XG5cdFx0cmV0dXJuICFkb2MuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvYy5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gSUQgZmluZCBhbmQgZmlsdGVyXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHQvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJuc1xuXHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzXG5cdFx0XHRcdHJldHVybiBtICYmIG0ucGFyZW50Tm9kZSA/IFsgbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gU3VwcG9ydDogSUU2Lzdcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0ZGVsZXRlIEV4cHIuZmluZFtcIklEXCJdO1xuXG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShcImlkXCIpO1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH1cblxuXHQvLyBUYWdcblx0RXhwci5maW5kW1wiVEFHXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA/XG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROXG5cdFx0XHR9IGVsc2UgaWYgKCBzdXBwb3J0LnFzYSApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdHRtcCA9IFtdLFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0Ly8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvb1xuXHRcdFx0XHRyZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHNcblx0XHRcdGlmICggdGFnID09PSBcIipcIiApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0dG1wLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdG1wO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0fTtcblxuXHQvLyBDbGFzc1xuXHRFeHByLmZpbmRbXCJDTEFTU1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkge1xuXHRcdGlmICggZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTMzNzhcblx0cmJ1Z2d5UVNBID0gW107XG5cblx0aWYgKCAoc3VwcG9ydC5xc2EgPSBybmF0aXZlLnRlc3QoIGRvYy5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcZl0nIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW3NlbGVjdGVkXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86dmFsdWV8XCIgKyBib29sZWFucyArIFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjIrLCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuNytcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCBcIltpZH49XCIgKyBleHBhbmRvICsgXCItXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIn49XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCI6Y2hlY2tlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCtcblx0XHRcdC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzY4NTFcblx0XHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlsc1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiYSNcIiArIGV4cGFuZG8gKyBcIisqXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiLiMuK1srfl1cIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdFx0Ly8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25tZW50XG5cdFx0XHR2YXIgaW5wdXQgPSBkb2MuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9mIG5hbWUgYXR0cmlidXRlXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW25hbWU9ZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJuYW1lXCIgKyB3aGl0ZXNwYWNlICsgXCIqWypeJHwhfl0/PVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0c1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZW5hYmxlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3Ncblx0XHRcdGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiKiw6eFwiKTtcblx0XHRcdHJidWdneVFTQS5wdXNoKFwiLC4qOlwiKTtcblx0XHR9KTtcblx0fVxuXG5cdGlmICggKHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gcm5hdGl2ZS50ZXN0KCAobWF0Y2hlcyA9IGRvY0VsZW0ubWF0Y2hlcyB8fFxuXHRcdGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yKSApKSApIHtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZGl2LCBcImRpdlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZGl2LCBcIltzIT0nJ106eFwiICk7XG5cdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIFwiIT1cIiwgcHNldWRvcyApO1xuXHRcdH0pO1xuXHR9XG5cblx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbihcInxcIikgKTtcblx0cmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbihcInxcIikgKTtcblxuXHQvKiBDb250YWluc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cdGhhc0NvbXBhcmUgPSBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24gKTtcblxuXHQvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcblx0Ly8gUHVycG9zZWZ1bGx5IGRvZXMgbm90IGltcGxlbWVudCBpbmNsdXNpdmUgZGVzY2VuZGVudFxuXHQvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxuXHRjb250YWlucyA9IGhhc0NvbXBhcmUgfHwgcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgP1xuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSxcblx0XHRcdFx0YnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG5cdFx0XHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0YWRvd24uY29udGFpbnMgP1xuXHRcdFx0XHRcdGFkb3duLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2XG5cdFx0XHQpKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdGlmICggYiApIHtcblx0XHRcdFx0d2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBiID09PSBhICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHQvKiBTb3J0aW5nXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nXG5cdHNvcnRPcmRlciA9IGhhc0NvbXBhcmUgP1xuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugd2Uga25vdyB0aGV5IGFyZSBkaXNjb25uZWN0ZWRcblx0XHRcdDE7XG5cblx0XHQvLyBEaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRpZiAoIGNvbXBhcmUgJiAxIHx8XG5cdFx0XHQoIXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0aWYgKCBhID09PSBkb2MgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2MgfHwgYi5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBiKSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyXG5cdFx0XHRyZXR1cm4gc29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fSA6XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxuXHRcdFx0YnVwID0gYi5wYXJlbnROb2RlLFxuXHRcdFx0YXAgPSBbIGEgXSxcblx0XHRcdGJwID0gWyBiIF07XG5cblx0XHQvLyBQYXJlbnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRzIG9yIGRpc2Nvbm5lY3RlZFxuXHRcdGlmICggIWF1cCB8fCAhYnVwICkge1xuXHRcdFx0cmV0dXJuIGEgPT09IGRvYyA/IC0xIDpcblx0XHRcdFx0YiA9PT0gZG9jID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jO1xufTtcblxuU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7XG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdC8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZFxuXHRleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCBcIj0nJDEnXVwiICk7XG5cblx0aWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdCggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiZcblx0XHQoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cdFx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcblx0XHRcdFx0XHQvLyBmcmFnbWVudCBpbiBJRSA5XG5cdFx0XHRcdFx0ZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7fVxuXHR9XG5cblx0cmV0dXJuIFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDtcbn07XG5cblNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7XG59O1xuXG5TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXHRcdC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID9cblx0XHR2YWwgOlxuXHRcdHN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6XG5cdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcbn07XG5cblNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdHRocm93IG5ldyBFcnJvciggXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIiArIG1zZyApO1xufTtcblxuLyoqXG4gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzXG4gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0c1xuICovXG5TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRkdXBsaWNhdGVzID0gW10sXG5cdFx0aiA9IDAsXG5cdFx0aSA9IDA7XG5cblx0Ly8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZVxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTtcblx0cmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkge1xuXHRcdFx0XHRqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0cmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNVxuXHRzb3J0SW5wdXQgPSBudWxsO1xuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtXG4gKi9cbmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9kZSxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGkgPSAwLFxuXHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRpZiAoICFub2RlVHlwZSApIHtcblx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdHdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkge1xuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcblx0XHRcdHJldCArPSBnZXRUZXh0KCBub2RlICk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xuXHRcdC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVyeSAjMTExNTMpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRyZXQgKz0gZ2V0VGV4dCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHR9XG5cdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5FeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbM10gPSAoIG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzJdID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdG1hdGNoWzNdID0gXCIgXCIgKyBtYXRjaFszXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzFdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWzNdICkge1xuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRFxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXG5cdFx0XHRcdG1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSBcImV2ZW5cIiB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApICk7XG5cdFx0XHRcdG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdHZhciBleGNlc3MsXG5cdFx0XHRcdHVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwcltcIkNISUxEXCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0bWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiZcblx0XHRcdFx0Ly8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdChleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0XHRtYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09IFwiKlwiID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQocGF0dGVybiA9IG5ldyBSZWdFeHAoIFwiKF58XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkpICYmXG5cdFx0XHRcdGNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIgKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIj1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiE9XCIgPyByZXN1bHQgIT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJePVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIio9XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIkPVwiID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ+PVwiID8gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ8PVwiID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIiA6XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7XG5cdFx0XHR2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSBcIm50aFwiLFxuXHRcdFx0XHRmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gXCJsYXN0XCIsXG5cdFx0XHRcdG9mVHlwZSA9IHdoYXQgPT09IFwib2YtdHlwZVwiO1xuXG5cdFx0XHRyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/XG5cblx0XHRcdFx0Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKVxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gOlxuXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBkaWZmLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGU7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6IG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHQvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXhcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IHBhcmVudFsgZXhwYW5kbyBdIHx8IChwYXJlbnRbIGV4cGFuZG8gXSA9IHt9KTtcblx0XHRcdFx0XHRcdFx0Y2FjaGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWzBdID09PSBkaXJydW5zICYmIGNhY2hlWzFdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMl07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVucyApIHtcblx0XHRcdFx0XHRcdFx0ZGlmZiA9IGNhY2hlWzFdO1xuXG5cdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoICggb2ZUeXBlID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmICsrZGlmZiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdChub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KSlbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZVxuXHRcdFx0XHRcdFx0ZGlmZiAtPSBsYXN0O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIHBzZXVkbzogXCIgKyBwc2V1ZG8gKTtcblxuXHRcdFx0Ly8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdFxuXHRcdFx0Ly8gYXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb25cblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcblx0XHRcdGlmICggZm5bIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0cmV0dXJuIGZuKCBhcmd1bWVudCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXNcblx0XHRcdGlmICggZm4ubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sIFwiXCIsIGFyZ3VtZW50IF07XG5cdFx0XHRcdHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdFx0XHRcdHZhciBpZHgsXG5cdFx0XHRcdFx0XHRcdG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSxcblx0XHRcdFx0XHRcdFx0aSA9IG1hdGNoZWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlkeCA9IGluZGV4T2YoIHNlZWQsIG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblx0XHQvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3Ncblx0XHRcIm5vdFwiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcblx0XHRcdC8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG5cdFx0XHQvLyBzcGFjZXMgYXMgY29tYmluYXRvcnNcblx0XHRcdHZhciBpbnB1dCA9IFtdLFxuXHRcdFx0XHRyZXN1bHRzID0gW10sXG5cdFx0XHRcdG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICkgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/XG5cdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdHNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pIDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFswXSA9IGVsZW07XG5cdFx0XHRcdFx0bWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApO1xuXHRcdFx0XHRcdC8vIERvbid0IGtlZXAgdGhlIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImNvbnRhaW5zXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gXCJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yXG5cdFx0Ly8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWVcblx0XHQvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLFxuXHRcdC8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCItXCIuXG5cdFx0Ly8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdFx0Ly8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS5cIlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRcImxhbmdcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHtcblx0XHRcdC8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJcblx0XHRcdGlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCBcIlwiKSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIGxhbmc6IFwiICsgbGFuZyApO1xuXHRcdFx0fVxuXHRcdFx0bGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgZWxlbUxhbmc7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID9cblx0XHRcdFx0XHRcdGVsZW0ubGFuZyA6XG5cdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSkgKSB7XG5cblx0XHRcdFx0XHRcdGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgXCItXCIgKSA9PT0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gTWlzY2VsbGFuZW91c1xuXHRcdFwidGFyZ2V0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdFwicm9vdFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2NFbGVtO1xuXHRcdH0sXG5cblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTtcblx0XHR9LFxuXG5cdFx0Ly8gQm9vbGVhbiBwcm9wZXJ0aWVzXG5cdFx0XCJlbmFibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlO1xuXHRcdH0sXG5cblx0XHRcImRpc2FibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdFwiY2hlY2tlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCk7XG5cdFx0fSxcblxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0XG5cdFx0XHQvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5XG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBDb250ZW50c1xuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVkb1xuXHRcdFx0Ly8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLFxuXHRcdFx0Ly8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjogNzsgZXRjLilcblx0XHRcdC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPCA2ICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3NbXCJlbXB0eVwiXSggZWxlbSApO1xuXHRcdH0sXG5cblx0XHQvLyBFbGVtZW50L2lucHV0IHR5cGVzXG5cdFx0XCJoZWFkZXJcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiaW5wdXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gXCJidXR0b25cIiB8fCBuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgYXR0cjtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRlbGVtLnR5cGUgPT09IFwidGV4dFwiICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OFxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdFwiZmlyc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9KSxcblxuXHRcdFwibGFzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHJldHVybiBbIGxlbmd0aCAtIDEgXTtcblx0XHR9KSxcblxuXHRcdFwiZXFcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0cmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJldmVuXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJvZGRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImx0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgLS1pID49IDA7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwiZ3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyArK2kgPCBsZW5ndGg7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3NbXCJudGhcIl0gPSBFeHByLnBzZXVkb3NbXCJlcVwiXTtcblxuLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3NcbmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7XG59XG5mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApO1xufVxuXG4vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnNcbmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fVxuc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XG5FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpO1xuXG50b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0aWYgKCBtYXRjaCApIHtcblx0XHRcdFx0Ly8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWRcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKHRva2VucyA9IFtdKSApO1xuXHRcdH1cblxuXHRcdG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdC8vIENvbWJpbmF0b3JzXG5cdFx0aWYgKCAobWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdC8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZVxuXHRcdFx0XHR0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKVxuXHRcdFx0fSk7XG5cdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZpbHRlcnNcblx0XHRmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkge1xuXHRcdFx0aWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fFxuXHRcdFx0XHQobWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkpKSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdG1hdGNoZXM6IG1hdGNoXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRyZXR1cm4gcGFyc2VPbmx5ID9cblx0XHRzb0Zhci5sZW5ndGggOlxuXHRcdHNvRmFyID9cblx0XHRcdFNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6XG5cdFx0XHQvLyBDYWNoZSB0aGUgdG9rZW5zXG5cdFx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn07XG5cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0c2VsZWN0b3IgPSBcIlwiO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7XG5cdH1cblx0cmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkge1xuXHR2YXIgZGlyID0gY29tYmluYXRvci5kaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgb3V0ZXJDYWNoZSxcblx0XHRcdFx0bmV3Q2FjaGUgPSBbIGRpcnJ1bnMsIGRvbmVOYW1lIF07XG5cblx0XHRcdC8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGRpciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTtcblx0XHRcdFx0XHRcdGlmICggKG9sZENhY2hlID0gb3V0ZXJDYWNoZVsgZGlyIF0pICYmXG5cdFx0XHRcdFx0XHRcdG9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0cmV0dXJuIChuZXdDYWNoZVsgMiBdID0gb2xkQ2FjaGVbIDIgXSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBSZXVzZSBuZXdjYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGVbIGRpciBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbMF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmXG5cdFx0XHRcdFx0XHQodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbdGVtcF0gPSAhKHJlc3VsdHNbdGVtcF0gPSBlbGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlW1wiIFwiXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3Rvcihcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9KVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kW1wiVEFHXCJdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIEtlZXAgYGlgIGEgc3RyaW5nIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBzbyBgbWF0Y2hlZENvdW50YCB3aWxsIGJlIFwiMDBcIiBiZWxvd1xuXHRcdFx0Ly8gU3VwcG9ydDogSUU8OSwgU2FmYXJpXG5cdFx0XHQvLyBUb2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogXCJsZW5ndGhcIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWRcblx0XHRcdGZvciAoIDsgaSAhPT0gbGVuICYmIChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoIChtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzW2orK10pICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgbm8gc2VlZCBhbmQgb25seSBvbmUgZ3JvdXBcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBUYWtlIGEgc2hvcnRjdXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdHN1cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0XHRcdEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7XG5cblx0XHRcdGNvbnRleHQgPSAoIEV4cHIuZmluZFtcIklEXCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHJbXCJuZWVkc0NvbnRleHRcIl0udGVzdCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG9rZW4gPSB0b2tlbnNbaV07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggKGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSkgKSB7XG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoIChzZWVkID0gZmluZChcblx0XHRcdFx0XHR0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHRcdFx0XHQpKSApIHtcblxuXHRcdFx0XHRcdC8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVybiBlYXJseVxuXHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoIGksIDEgKTtcblx0XHRcdFx0XHRzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApO1xuXHRcdFx0XHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDb21waWxlIGFuZCBleGVjdXRlIGEgZmlsdGVyaW5nIGZ1bmN0aW9uIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcblx0Ly8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZVxuXHQoIGNvbXBpbGVkIHx8IGNvbXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApICkoXG5cdFx0c2VlZCxcblx0XHRjb250ZXh0LFxuXHRcdCFkb2N1bWVudElzSFRNTCxcblx0XHRyZXN1bHRzLFxuXHRcdHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0KTtcblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTb3J0IHN0YWJpbGl0eVxuc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdChcIlwiKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKFwiXCIpID09PSBleHBhbmRvO1xuXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrXG4vLyBBbHdheXMgYXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uXG5zdXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSAhIWhhc0R1cGxpY2F0ZTtcblxuLy8gSW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0IGRvY3VtZW50XG5zZXREb2N1bWVudCgpO1xuXG4vLyBTdXBwb3J0OiBXZWJraXQ8NTM3LjMyIC0gU2FmYXJpIDYuMC4zL0Nocm9tZSAyNSAoZml4ZWQgaW4gQ2hyb21lIDI3KVxuLy8gRGV0YWNoZWQgbm9kZXMgY29uZm91bmRpbmdseSBmb2xsb3cgKmVhY2ggb3RoZXIqXG5zdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZGl2MSApIHtcblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpICkgJiAxO1xufSk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGEgaHJlZj0nIyc+PC9hPlwiO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGlucHV0Lz5cIjtcblx0ZGl2LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0cmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xualF1ZXJ5LmV4cHJbXCI6XCJdID0galF1ZXJ5LmV4cHIucHNldWRvcztcbmpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5cblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxudmFyIHJzaW5nbGVUYWcgPSAoL148KFxcdyspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvKTtcblxuXG5cbnZhciByaXNTaW1wbGUgPSAvXi5bXjojXFxbXFwuLF0qJC87XG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHQvKiBqc2hpbnQgLVcwMTggKi9cblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9KTtcblxuXHR9XG5cblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0pO1xuXG5cdH1cblxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0aWYgKCByaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG5cdFx0fVxuXG5cdFx0cXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyApO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+PSAwICkgIT09IG5vdDtcblx0fSk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRyZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgP1xuXHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXSA6XG5cdFx0alF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHRcdH0pKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pICk7XG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHQvLyBOZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29udGV4dCApIGJlY29tZXMgJCggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yIClcblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7XG5cdFx0cmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciA/IHRoaXMuc2VsZWN0b3IgKyBcIiBcIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSkgKTtcblx0fSxcblx0aXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gISF3aW5ub3coXG5cdFx0XHR0aGlzLFxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0XG5cdFx0XHQvLyBzbyAkKFwicDpmaXJzdFwiKS5pcyhcInA6bGFzdFwiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gXCJwXCIuXG5cdFx0XHR0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0c2VsZWN0b3IgfHwgW10sXG5cdFx0XHRmYWxzZVxuXHRcdCkubGVuZ3RoO1xuXHR9XG59KTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxuXHQvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0cnF1aWNrRXhwciA9IC9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKnwjKFtcXHctXSopKSQvLFxuXG5cdGluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHR2YXIgbWF0Y2gsIGVsZW07XG5cblx0XHQvLyBIQU5ETEU6ICQoXCJcIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSlcblx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbMF0gPT09IFwiPFwiICYmIHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmIHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXHRcdFx0XHQvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVja1xuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcblx0XHRcdGlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsxXSApIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsxXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsxXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkge1xuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsyXSApO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQmxhY2tiZXJyeSA0LjZcblx0XHRcdFx0XHQvLyBnRUJJRCByZXR1cm5zIG5vZGVzIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKCM2OTYzKVxuXHRcdFx0XHRcdGlmICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0XHQvLyBJbmplY3QgdGhlIGVsZW1lbnQgZGlyZWN0bHkgaW50byB0aGUgalF1ZXJ5IG9iamVjdFxuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdFx0dGhpc1swXSA9IGVsZW07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gdGhpc1swXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIHJvb3RqUXVlcnkucmVhZHkgIT09IFwidW5kZWZpbmVkXCIgP1xuXHRcdFx0XHRyb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0Ly8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRzZWxlY3RvciggalF1ZXJ5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yO1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXHQvLyBNZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldFxuXHRndWFyYW50ZWVkVW5pcXVlID0ge1xuXHRcdGNoaWxkcmVuOiB0cnVlLFxuXHRcdGNvbnRlbnRzOiB0cnVlLFxuXHRcdG5leHQ6IHRydWUsXG5cdFx0cHJldjogdHJ1ZVxuXHR9O1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0ZGlyOiBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbWF0Y2hlZDtcblx0fSxcblxuXHRzaWJsaW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IFtdO1xuXG5cdFx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0XHRtYXRjaGVkLnB1c2goIG4gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlZDtcblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0Y2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHtcblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRtYXRjaGVkID0gW10sXG5cdFx0XHRwb3MgPSBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApIHx8IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6XG5cdFx0XHRcdDA7XG5cblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRmb3IgKCBjdXIgPSB0aGlzW2ldOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKHBvcyA/XG5cdFx0XHRcdFx0cG9zLmluZGV4KGN1cikgPiAtMSA6XG5cblx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykpICkge1xuXG5cdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlKFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoc2VsZWN0b3IpXG5cdFx0KTtcblx0fVxufSk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHR3aGlsZSAoIChjdXIgPSBjdXJbZGlyXSkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goe1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiwgdW50aWwgKTtcblx0fSxcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWUoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59KTtcbnZhciBybm90d2hpdGUgPSAoL1xcUysvZyk7XG5cblxuXG4vLyBTdHJpbmcgdG8gT2JqZWN0IG9wdGlvbnMgZm9ybWF0IGNhY2hlXG52YXIgb3B0aW9uc0NhY2hlID0ge307XG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzIGFuZCBzdG9yZSBpbiBjYWNoZVxuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9KTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHQoIG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdIHx8IGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBMYXN0IGZpcmUgdmFsdWUgKGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMpXG5cdFx0bWVtb3J5LFxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblx0XHQvLyBGaXJzdCBjYWxsYmFjayB0byBmaXJlICh1c2VkIGludGVybmFsbHkgYnkgYWRkIGFuZCBmaXJlV2l0aClcblx0XHRmaXJpbmdTdGFydCxcblx0XHQvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmdcblx0XHRmaXJpbmdMZW5ndGgsXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgcmVtb3ZlIGlmIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCxcblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblx0XHQvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0c3RhY2sgPSAhb3B0aW9ucy5vbmNlICYmIFtdLFxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdFx0bWVtb3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0YTtcblx0XHRcdGZpcmVkID0gdHJ1ZTtcblx0XHRcdGZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwgMDtcblx0XHRcdGZpcmluZ1N0YXJ0ID0gMDtcblx0XHRcdGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0ZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgbGlzdCAmJiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0aDsgZmlyaW5nSW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBkYXRhWyAwIF0sIGRhdGFbIDEgXSApID09PSBmYWxzZSAmJiBvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZpcmluZyA9IGZhbHNlO1xuXHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRpZiAoIHN0YWNrICkge1xuXHRcdFx0XHRcdGlmICggc3RhY2subGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0ZmlyZSggc3RhY2suc2hpZnQoKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzZWxmLmRpc2FibGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXHRcdFx0Ly8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdFxuXHRcdFx0YWRkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdC8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJyZW50IGxlbmd0aFxuXHRcdFx0XHRcdHZhciBzdGFydCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdChmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0dmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJnICk7XG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goIGFyZyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSkoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdC8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlXG5cdFx0XHRcdFx0Ly8gY3VycmVudCBmaXJpbmcgYmF0Y2g/XG5cdFx0XHRcdFx0aWYgKCBmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDtcblx0XHRcdFx0XHQvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVuXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdheVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1lbW9yeSApIHtcblx0XHRcdFx0XHRcdGZpcmluZ1N0YXJ0ID0gc3RhcnQ7XG5cdFx0XHRcdFx0XHRmaXJlKCBtZW1vcnkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaW5kZXg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGZpcmluZyApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0xlbmd0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZpcmluZ0xlbmd0aC0tO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID8galF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6ICEhKCBsaXN0ICYmIGxpc3QubGVuZ3RoICk7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdGZpcmluZ0xlbmd0aCA9IDA7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlXG5cdFx0XHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHQvLyBJcyBpdCBkaXNhYmxlZD9cblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFsaXN0O1xuXHRcdFx0fSxcblx0XHRcdC8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGVcblx0XHRcdGxvY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzdGFjayA9IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICkge1xuXHRcdFx0XHRcdHNlbGYuZGlzYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIElzIGl0IGxvY2tlZD9cblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhc3RhY2s7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHtcblx0XHRcdFx0XHRhcmdzID0gYXJncyB8fCBbXTtcblx0XHRcdFx0XHRhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdO1xuXHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0c3RhY2sucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRmaXJlKCBhcmdzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5qUXVlcnkuZXh0ZW5kKHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksIFwicmVqZWN0ZWRcIiBdLFxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyhcIm1lbW9yeVwiKSBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBqUXVlcnkuaXNGdW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTtcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsxXSBdKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywgZm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0pLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07XG5cblx0XHRcdC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsxXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0Ly8gc3RhdGUgPSBbIHJlc29sdmVkIHwgcmVqZWN0ZWQgXVxuXHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cblx0XHRcdFx0Ly8gWyByZWplY3RfbGlzdCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7IHByb2dyZXNzX2xpc3QubG9ja1xuXHRcdFx0XHR9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVmZXJyZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXVxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fTtcblx0XHRcdGRlZmVycmVkWyB0dXBsZVswXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0pO1xuXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXG5cdFx0cHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApO1xuXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxuXHRcdGlmICggZnVuYyApIHtcblx0XHRcdGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGRvbmUhXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xuXHR9LFxuXG5cdC8vIERlZmVycmVkIGhlbHBlclxuXHR3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCxcblxuXHRcdFx0Ly8gdGhlIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlc1xuXHRcdFx0cmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZC4gSWYgcmVzb2x2ZVZhbHVlcyBjb25zaXN0IG9mIG9ubHkgYSBzaW5nbGUgRGVmZXJyZWQsIGp1c3QgdXNlIHRoYXQuXG5cdFx0XHRkZWZlcnJlZCA9IHJlbWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIFVwZGF0ZSBmdW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2YWx1ZXNcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4dHMsIHZhbHVlcyApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRjb250ZXh0c1sgaSBdID0gdGhpcztcblx0XHRcdFx0XHR2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoIHZhbHVlcyA9PT0gcHJvZ3Jlc3NWYWx1ZXMgKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fSxcblxuXHRcdFx0cHJvZ3Jlc3NWYWx1ZXMsIHByb2dyZXNzQ29udGV4dHMsIHJlc29sdmVDb250ZXh0cztcblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWRcblx0XHRpZiAoIGxlbmd0aCA+IDEgKSB7XG5cdFx0XHRwcm9ncmVzc1ZhbHVlcyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0LmRvbmUoIHVwZGF0ZUZ1bmMoIGksIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApIClcblx0XHRcdFx0XHRcdC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKVxuXHRcdFx0XHRcdFx0LnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9ncmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LS1yZW1haW5pbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyXG5cdFx0aWYgKCAhcmVtYWluaW5nICkge1xuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cbn0pO1xuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdDtcblxualF1ZXJ5LmZuLnJlYWR5ID0gZnVuY3Rpb24oIGZuICkge1xuXHQvLyBBZGQgdGhlIGNhbGxiYWNrXG5cdGpRdWVyeS5yZWFkeS5wcm9taXNlKCkuZG9uZSggZm4gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoe1xuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnRcblx0aG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHtcblx0XHRpZiAoIGhvbGQgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHRcdH1cblx0fSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cblx0XHQvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHNcblx0XHRpZiAoIGpRdWVyeS5mbi50cmlnZ2VySGFuZGxlciApIHtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VySGFuZGxlciggXCJyZWFkeVwiICk7XG5cdFx0XHRqUXVlcnkoIGRvY3VtZW50ICkub2ZmKCBcInJlYWR5XCIgKTtcblx0XHR9XG5cdH1cbn0pO1xuXG4vKipcbiAqIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQsIGZhbHNlICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG5qUXVlcnkucmVhZHkucHJvbWlzZSA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cdGlmICggIXJlYWR5TGlzdCApIHtcblxuXHRcdHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Ly8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG5cdFx0Ly8gV2Ugb25jZSB0cmllZCB0byB1c2UgcmVhZHlTdGF0ZSBcImludGVyYWN0aXZlXCIgaGVyZSwgYnV0IGl0IGNhdXNlZCBpc3N1ZXMgbGlrZSB0aGUgb25lXG5cdFx0Ly8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNVxuXHRcdGlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiICkge1xuXHRcdFx0Ly8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5XG5cdFx0XHRzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQsIGZhbHNlICk7XG5cblx0XHRcdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlYWR5TGlzdC5wcm9taXNlKCBvYmogKTtcbn07XG5cbi8vIEtpY2sgb2ZmIHRoZSBET00gcmVhZHkgY2hlY2sgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdFxualF1ZXJ5LnJlYWR5LnByb21pc2UoKTtcblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBqUXVlcnkuYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggalF1ZXJ5LnR5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRqUXVlcnkuYWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVtpXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApO1xuXHRcdH1cblxuXHQvLyBTZXRzIG9uZSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0Zm4oIGVsZW1zW2ldLCBrZXksIHJhdyA/IHZhbHVlIDogdmFsdWUuY2FsbCggZWxlbXNbaV0sIGksIGZuKCBlbGVtc1tpXSwga2V5ICkgKSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjaGFpbmFibGUgP1xuXHRcdGVsZW1zIDpcblxuXHRcdC8vIEdldHNcblx0XHRidWxrID9cblx0XHRcdGZuLmNhbGwoIGVsZW1zICkgOlxuXHRcdFx0bGVuID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcblxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBvYmplY3QgY2FuIGhhdmUgZGF0YVxuICovXG5qUXVlcnkuYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblx0Ly8gQWNjZXB0cyBvbmx5OlxuXHQvLyAgLSBOb2RlXG5cdC8vICAgIC0gTm9kZS5FTEVNRU5UX05PREVcblx0Ly8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREVcblx0Ly8gIC0gT2JqZWN0XG5cdC8vICAgIC0gQW55XG5cdC8qIGpzaGludCAtVzAxOCAqL1xuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cbmZ1bmN0aW9uIERhdGEoKSB7XG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NCxcblx0Ly8gT2xkIFdlYktpdCBkb2VzIG5vdCBoYXZlIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucy9mcmVlemUgbWV0aG9kLFxuXHQvLyByZXR1cm4gbmV3IGVtcHR5IG9iamVjdCBpbnN0ZWFkIHdpdGggbm8gW1tzZXRdXSBhY2Nlc3NvclxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMuY2FjaGUgPSB7fSwgMCwge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXHR9KTtcblxuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcbkRhdGEuYWNjZXB0cyA9IGpRdWVyeS5hY2NlcHREYXRhO1xuXG5EYXRhLnByb3RvdHlwZSA9IHtcblx0a2V5OiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHQvLyBBbHdheXMgcmV0dXJuIHRoZSBrZXkgZm9yIGEgZnJvemVuIG9iamVjdC5cblx0XHRpZiAoICFEYXRhLmFjY2VwdHMoIG93bmVyICkgKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgZGVzY3JpcHRvciA9IHt9LFxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIG93bmVyIG9iamVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlIGtleVxuXHRcdFx0dW5sb2NrID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0Ly8gSWYgbm90LCBjcmVhdGUgb25lXG5cdFx0aWYgKCAhdW5sb2NrICkge1xuXHRcdFx0dW5sb2NrID0gRGF0YS51aWQrKztcblxuXHRcdFx0Ly8gU2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUsIG5vbi13cml0YWJsZSBwcm9wZXJ0eVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB7IHZhbHVlOiB1bmxvY2sgfTtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIG93bmVyLCBkZXNjcmlwdG9yICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NFxuXHRcdFx0Ly8gRmFsbGJhY2sgdG8gYSBsZXNzIHNlY3VyZSBkZWZpbml0aW9uXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0ZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB1bmxvY2s7XG5cdFx0XHRcdGpRdWVyeS5leHRlbmQoIG93bmVyLCBkZXNjcmlwdG9yICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoZSBjYWNoZSBvYmplY3Rcblx0XHRpZiAoICF0aGlzLmNhY2hlWyB1bmxvY2sgXSApIHtcblx0XHRcdHRoaXMuY2FjaGVbIHVubG9jayBdID0ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVubG9jaztcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Ly8gVGhlcmUgbWF5IGJlIGFuIHVubG9jayBhc3NpZ25lZCB0byB0aGlzIG5vZGUsXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyBcIm93bmVyXCIsIGNyZWF0ZSBvbmUgaW5saW5lXG5cdFx0XHQvLyBhbmQgc2V0IHRoZSB1bmxvY2sgYXMgdGhvdWdoIGFuIG93bmVyIGVudHJ5IGhhZCBhbHdheXMgZXhpc3RlZFxuXHRcdFx0dW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGVbIHVubG9jayBdO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgZGF0YSBdID0gdmFsdWU7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIHsgcHJvcGVydGllcyB9IF0gYXJnc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBGcmVzaCBhc3NpZ25tZW50cyBieSBvYmplY3QgYXJlIHNoYWxsb3cgY29waWVkXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXHRcdFx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLmNhY2hlWyB1bmxvY2sgXSwgZGF0YSApO1xuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBjb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGNhY2hlWyBwcm9wIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdC8vIEVpdGhlciBhIHZhbGlkIGNhY2hlIGlzIGZvdW5kLCBvciB3aWxsIGJlIGNyZWF0ZWQuXG5cdFx0Ly8gTmV3IGNhY2hlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSB1bmxvY2sgcmV0dXJuZWQsXG5cdFx0Ly8gYWxsb3dpbmcgZGlyZWN0IGFjY2VzcyB0byB0aGUgbmV3bHkgY3JlYXRlZFxuXHRcdC8vIGVtcHR5IGRhdGEgb2JqZWN0LiBBIHZhbGlkIG93bmVyIG9iamVjdCBtdXN0IGJlIHByb3ZpZGVkLlxuXHRcdHZhciBjYWNoZSA9IHRoaXMuY2FjaGVbIHRoaXMua2V5KCBvd25lciApIF07XG5cblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0Y2FjaGUgOiBjYWNoZVsga2V5IF07XG5cdH0sXG5cdGFjY2VzczogZnVuY3Rpb24oIG93bmVyLCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBzdG9yZWQ7XG5cdFx0Ly8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZFxuXHRcdC8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZFxuXHRcdC8vXG5cdFx0Ly8gVGFrZSB0aGUgXCJyZWFkXCIgcGF0aCBhbmQgYWxsb3cgdGhlIGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lXG5cdFx0Ly8gd2hpY2ggdmFsdWUgdG8gcmV0dXJuLCByZXNwZWN0aXZlbHkgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBUaGUgZW50aXJlIGNhY2hlIG9iamVjdFxuXHRcdC8vICAgMi4gVGhlIGRhdGEgc3RvcmVkIGF0IHRoZSBrZXlcblx0XHQvL1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KChrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgKSB7XG5cblx0XHRcdHN0b3JlZCA9IHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cblx0XHRcdHJldHVybiBzdG9yZWQgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHN0b3JlZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVsQ2FzZShrZXkpICk7XG5cdFx0fVxuXG5cdFx0Ly8gWypdV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLCBuYW1lLCBjYW1lbCxcblx0XHRcdHVubG9jayA9IHRoaXMua2V5KCBvd25lciApLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlWyB1bmxvY2sgXTtcblxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLmNhY2hlWyB1bmxvY2sgXSA9IHt9O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCBrZXkgKSApIHtcblx0XHRcdFx0Ly8gSWYgXCJuYW1lXCIgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLlxuXHRcdFx0XHQvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoXCJrZXlcIiwgXCJ2YWxcIikgc2lnbmF0dXJlLFxuXHRcdFx0XHQvLyBrZXlzIHdpbGwgYmUgY29udmVydGVkIHRvIGNhbWVsQ2FzZS5cblx0XHRcdFx0Ly8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmVcblx0XHRcdFx0Ly8gYm90aCBwbGFpbiBrZXkgYW5kIGNhbWVsQ2FzZSBrZXkuICMxMjc4NlxuXHRcdFx0XHQvLyBUaGlzIHdpbGwgb25seSBwZW5hbGl6ZSB0aGUgYXJyYXkgYXJndW1lbnQgcGF0aC5cblx0XHRcdFx0bmFtZSA9IGtleS5jb25jYXQoIGtleS5tYXAoIGpRdWVyeS5jYW1lbENhc2UgKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2FtZWwgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblx0XHRcdFx0Ly8gVHJ5IHRoZSBzdHJpbmcgYXMgYSBrZXkgYmVmb3JlIGFueSBtYW5pcHVsYXRpb25cblx0XHRcdFx0aWYgKCBrZXkgaW4gY2FjaGUgKSB7XG5cdFx0XHRcdFx0bmFtZSA9IFsga2V5LCBjYW1lbCBdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRcdG5hbWUgPSBjYW1lbDtcblx0XHRcdFx0XHRuYW1lID0gbmFtZSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0XHRbIG5hbWUgXSA6ICggbmFtZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW10gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpID0gbmFtZS5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBuYW1lWyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHRyZXR1cm4gIWpRdWVyeS5pc0VtcHR5T2JqZWN0KFxuXHRcdFx0dGhpcy5jYWNoZVsgb3duZXJbIHRoaXMuZXhwYW5kbyBdIF0gfHwge31cblx0XHQpO1xuXHR9LFxuXHRkaXNjYXJkOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0aWYgKCBvd25lclsgdGhpcy5leHBhbmRvIF0gKSB7XG5cdFx0XHRkZWxldGUgdGhpcy5jYWNoZVsgb3duZXJbIHRoaXMuZXhwYW5kbyBdIF07XG5cdFx0fVxuXHR9XG59O1xudmFyIGRhdGFfcHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhX3VzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gLyhbQS1aXSkvZztcblxuZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHtcblx0dmFyIG5hbWU7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQxXCIgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhID09PSBcInRydWVcIiA/IHRydWUgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwiZmFsc2VcIiA/IGZhbHNlIDpcblx0XHRcdFx0XHRkYXRhID09PSBcIm51bGxcIiA/IG51bGwgOlxuXHRcdFx0XHRcdC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nXG5cdFx0XHRcdFx0K2RhdGEgKyBcIlwiID09PSBkYXRhID8gK2RhdGEgOlxuXHRcdFx0XHRcdHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOlxuXHRcdFx0XHRcdGRhdGE7XG5cdFx0XHR9IGNhdGNoKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhX3VzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YV91c2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhX3ByaXYuaGFzRGF0YSggZWxlbSApO1xuXHR9LFxuXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhX3VzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YV91c2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFfcHJpdiBtZXRob2RzLCB0aGVzZSBjYW4gYmUgZGVwcmVjYXRlZC5cblx0X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHR2YXIgaSwgbmFtZSwgZGF0YSxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdGhpcy5sZW5ndGggKSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhX3ByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMStcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoNSkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YV9wcml2LnNldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH1cblxuXHRcdC8vIFNldHMgbXVsdGlwbGUgdmFsdWVzXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YV91c2VyLnNldCggdGhpcywga2V5ICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YSxcblx0XHRcdFx0Y2FtZWxLZXkgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIHdpdGggdGhlIGtleSBhcy1pc1xuXHRcdFx0XHRkYXRhID0gZGF0YV91c2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyB3aXRoIHRoZSBrZXkgY2FtZWxpemVkXG5cdFx0XHRcdGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtLCBjYW1lbEtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gXCJkaXNjb3ZlclwiIHRoZSBkYXRhIGluXG5cdFx0XHRcdC8vIEhUTUw1IGN1c3RvbSBkYXRhLSogYXR0cnNcblx0XHRcdFx0ZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBjYW1lbEtleSwgdW5kZWZpbmVkICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQvLyBGaXJzdCwgYXR0ZW1wdCB0byBzdG9yZSBhIGNvcHkgb3IgcmVmZXJlbmNlIG9mIGFueVxuXHRcdFx0XHQvLyBkYXRhIHRoYXQgbWlnaHQndmUgYmVlbiBzdG9yZSB3aXRoIGEgY2FtZWxDYXNlZCBrZXkuXG5cdFx0XHRcdHZhciBkYXRhID0gZGF0YV91c2VyLmdldCggdGhpcywgY2FtZWxLZXkgKTtcblxuXHRcdFx0XHQvLyBGb3IgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZSBpbnRlcm9wLCB3ZSBoYXZlIHRvXG5cdFx0XHRcdC8vIHN0b3JlIHByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIGluIGEgY2FtZWxDYXNlIGZvcm0uXG5cdFx0XHRcdC8vIFRoaXMgbWlnaHQgbm90IGFwcGx5IHRvIGFsbCBwcm9wZXJ0aWVzLi4uKlxuXHRcdFx0XHRkYXRhX3VzZXIuc2V0KCB0aGlzLCBjYW1lbEtleSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyAqLi4uIEluIHRoZSBjYXNlIG9mIHByb3BlcnRpZXMgdGhhdCBtaWdodCBfYWN0dWFsbHlfXG5cdFx0XHRcdC8vIGhhdmUgZGFzaGVzLCB3ZSBuZWVkIHRvIGFsc28gc3RvcmUgYSBjb3B5IG9mIHRoYXRcblx0XHRcdFx0Ly8gdW5jaGFuZ2VkIHByb3BlcnR5LlxuXHRcdFx0XHRpZiAoIGtleS5pbmRleE9mKFwiLVwiKSAhPT0gLTEgJiYgZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGRhdGFfdXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YV91c2VyLnJlbW92ZSggdGhpcywga2V5ICk7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5cbmpRdWVyeS5leHRlbmQoe1xuXHRxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHF1ZXVlO1xuXG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0dHlwZSA9ICggdHlwZSB8fCBcImZ4XCIgKSArIFwicXVldWVcIjtcblx0XHRcdHF1ZXVlID0gZGF0YV9wcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFfcHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwge1xuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKS5hZGQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0pXG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBzZXR0ZXIgPSAyO1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGRhdGEgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IFwiZnhcIjtcblx0XHRcdHNldHRlci0tO1xuXHRcdH1cblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbMF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTtcblxuXHRcdFx0XHQvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVswXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH0sXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0pO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YV9wcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArIFwicXVldWVIb29rc1wiICk7XG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdHRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzb2x2ZSgpO1xuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcblx0fVxufSk7XG52YXIgcG51bSA9ICgvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLykuc291cmNlO1xuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblx0XHQvLyBpc0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXHRcdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcIm5vbmVcIiB8fCAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0fTtcblxudmFyIHJjaGVja2FibGVUeXBlID0gKC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pKTtcblxuXG5cbihmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IFNhZmFyaTw9NS4xXG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBTYWZhcmk8PTUuMSwgQW5kcm9pZDw0LjJcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRTw9MTErXG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG59KSgpO1xudmFyIHN0cnVuZGVmaW5lZCA9IHR5cGVvZiB1bmRlZmluZWQ7XG5cblxuXG5zdXBwb3J0LmZvY3VzaW5CdWJibGVzID0gXCJvbmZvY3VzaW5cIiBpbiB3aW5kb3c7XG5cblxudmFyXG5cdHJrZXlFdmVudCA9IC9ea2V5Lyxcblx0cm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLyxcblx0cmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpJC87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXG5cdFx0aWYgKCAhaGFuZGxlci5ndWlkICkge1xuXHRcdFx0aGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKztcblx0XHR9XG5cblx0XHQvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0XG5cdFx0aWYgKCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0aWYgKCAhKGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IHN0cnVuZGVmaW5lZCAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsxXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnNcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGVcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblxuXHRcdFx0Ly8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRoYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3JpZ1R5cGU6IG9yaWdUeXBlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyLFxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXG5cdFx0XHRcdHNlbGVjdG9yOiBzZWxlY3Rvcixcblx0XHRcdFx0bmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSxcblx0XHRcdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oXCIuXCIpXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xuXG5cdFx0XHQvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdFxuXHRcdFx0aWYgKCAhKGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFfcHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YV9wcml2LmdldCggZWxlbSApO1xuXG5cdFx0aWYgKCAhZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsxXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnRcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gfHwgW107XG5cdFx0XHR0bXAgPSB0bXBbMl0gJiYgbmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbihcIlxcXFwuKD86LipcXFxcLnwpXCIpICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIGV2ZW50c1sgdHlwZSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkXG5cdFx0aWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7XG5cdFx0XHRkZWxldGUgZWxlbURhdGEuaGFuZGxlO1xuXHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgXCJldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsXG5cdFx0XHRldmVudFBhdGggPSBbIGVsZW0gfHwgZG9jdW1lbnQgXSxcblx0XHRcdHR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwidHlwZVwiICkgPyBldmVudC50eXBlIDogZXZlbnQsXG5cdFx0XHRuYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcIm5hbWVzcGFjZVwiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoXCIuXCIpIDogW107XG5cblx0XHRjdXIgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKFwiLlwiKSA+PSAwICkge1xuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoXCIuXCIpO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoXCI6XCIpIDwgMCAmJiBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nXG5cdFx0ZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRldmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQgKTtcblxuXHRcdC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSlcblx0XHRldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMztcblx0XHRldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oXCIuXCIpO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZV9yZSA9IGV2ZW50Lm5hbWVzcGFjZSA/XG5cdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKFwiXFxcXC4oPzouKlxcXFwufClcIikgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSlcblx0XHQvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KVxuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoIChjdXIgPSBldmVudFBhdGhbaSsrXSkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFfcHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJiBkYXRhX3ByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UpICYmXG5cdFx0XHRcdGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LlxuXHRcdFx0XHQvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlbGVtWyB0eXBlIF0gKSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaixcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFfcHJpdi5nZXQoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1swXSA9IGV2ZW50O1xuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0pICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkge1xuXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xuXHRcdFx0XHRcdGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTtcblxuXHRcdFx0XHRcdHJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVyIClcblx0XHRcdFx0XHRcdFx0LmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChldmVudC5yZXN1bHQgPSByZXQpID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIG1hdGNoZXMsIHNlbCwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCxcblx0XHRcdGN1ciA9IGV2ZW50LnRhcmdldDtcblxuXHRcdC8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnNcblx0XHQvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAoIzEzMTgwKVxuXHRcdC8vIEF2b2lkIG5vbi1sZWZ0LWNsaWNrIGJ1YmJsaW5nIGluIEZpcmVmb3ggKCMzODYxKVxuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJiBjdXIubm9kZVR5cGUgJiYgKCFldmVudC5idXR0b24gfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgcHJvY2VzcyBjbGlja3Mgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2NSwgIzExMzgyLCAjMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLmRpc2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09IFwiY2xpY2tcIiApIHtcblx0XHRcdFx0XHRtYXRjaGVzID0gW107XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKVxuXHRcdFx0XHRcdFx0c2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgXCIgXCI7XG5cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID9cblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+PSAwIDpcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlcyB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50XG5cdHByb3BzOiBcImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaFwiLnNwbGl0KFwiIFwiKSxcblxuXHRmaXhIb29rczoge30sXG5cblx0a2V5SG9va3M6IHtcblx0XHRwcm9wczogXCJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlXCIuc3BsaXQoXCIgXCIpLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzXG5cdFx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50LndoaWNoID0gb3JpZ2luYWwuY2hhckNvZGUgIT0gbnVsbCA/IG9yaWdpbmFsLmNoYXJDb2RlIDogb3JpZ2luYWwua2V5Q29kZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV2ZW50O1xuXHRcdH1cblx0fSxcblxuXHRtb3VzZUhvb2tzOiB7XG5cdFx0cHJvcHM6IFwiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50XCIuc3BsaXQoXCIgXCIpLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblx0XHRcdHZhciBldmVudERvYywgZG9jLCBib2R5LFxuXHRcdFx0XHRidXR0b24gPSBvcmlnaW5hbC5idXR0b247XG5cblx0XHRcdC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGVcblx0XHRcdGlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG5cdFx0XHRcdGRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDtcblx0XHRcdFx0Ym9keSA9IGV2ZW50RG9jLmJvZHk7XG5cblx0XHRcdFx0ZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApO1xuXHRcdFx0XHRldmVudC5wYWdlWSA9IG9yaWdpbmFsLmNsaWVudFkgKyAoIGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50VG9wICB8fCBib2R5ICYmIGJvZHkuY2xpZW50VG9wICB8fCAwICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRcdC8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0XG5cdFx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7XG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzXG5cdFx0dmFyIGksIHByb3AsIGNvcHksXG5cdFx0XHR0eXBlID0gZXZlbnQudHlwZSxcblx0XHRcdG9yaWdpbmFsRXZlbnQgPSBldmVudCxcblx0XHRcdGZpeEhvb2sgPSB0aGlzLmZpeEhvb2tzWyB0eXBlIF07XG5cblx0XHRpZiAoICFmaXhIb29rICkge1xuXHRcdFx0dGhpcy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9vayA9XG5cdFx0XHRcdHJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91c2VIb29rcyA6XG5cdFx0XHRcdHJrZXlFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLmtleUhvb2tzIDpcblx0XHRcdFx0e307XG5cdFx0fVxuXHRcdGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7XG5cblx0XHRldmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcblxuXHRcdGkgPSBjb3B5Lmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHByb3AgPSBjb3B5WyBpIF07XG5cdFx0XHRldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IENvcmRvdmEgMi41IChXZWJLaXQpICgjMTMyNTUpXG5cdFx0Ly8gQWxsIGV2ZW50cyBzaG91bGQgaGF2ZSBhIHRhcmdldDsgQ29yZG92YSBkZXZpY2VyZWFkeSBkb2Vzbid0XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDYuMCssIENocm9tZTwyOFxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0aWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZml4SG9vay5maWx0ZXIgPyBmaXhIb29rLmZpbHRlciggZXZlbnQsIG9yaWdpbmFsRXZlbnQgKSA6IGV2ZW50O1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cdFx0XHQvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkXG5cdFx0XHRub0J1YmJsZTogdHJ1ZVxuXHRcdH0sXG5cdFx0Zm9jdXM6IHtcblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblx0XHRcdC8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiAmJiB0aGlzLmNsaWNrICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5jbGljaygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50LCBidWJibGUgKSB7XG5cdFx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lLlxuXHRcdC8vIEZha2Ugb3JpZ2luYWxFdmVudCB0byBhdm9pZCBkb25vcidzIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGlmIHRoZVxuXHRcdC8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLlxuXHRcdHZhciBlID0galF1ZXJ5LmV4dGVuZChcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcblx0XHRcdGV2ZW50LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZSxcblx0XHRcdFx0b3JpZ2luYWxFdmVudDoge31cblx0XHRcdH1cblx0XHQpO1xuXHRcdGlmICggYnViYmxlICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmNhbGwoIGVsZW0sIGUgKTtcblx0XHR9XG5cdFx0aWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7XG5cdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuXHRcdGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlLCBmYWxzZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHtcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gRXZlbnQgb2JqZWN0XG5cdGlmICggc3JjICYmIHNyYy50eXBlICkge1xuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcblx0XHR0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG5cdFx0Ly8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fFxuXHRcdFx0XHRzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wXG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHQvLyBFdmVudCB0eXBlXG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gc3JjO1xuXHR9XG5cblx0Ly8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3Rcblx0aWYgKCBwcm9wcyApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcblx0dGhpcy50aW1lU3RhbXAgPSBzcmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBqUXVlcnkubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnN0b3BQcm9wYWdhdGlvbiApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gU3VwcG9ydDogQ2hyb21lIDE1K1xualF1ZXJ5LmVhY2goe1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkpICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaVxuLy8gQ3JlYXRlIFwiYnViYmxpbmdcIiBmb2N1cyBhbmQgYmx1ciBldmVudHNcbmlmICggIXN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgKSB7XG5cdGpRdWVyeS5lYWNoKHsgZm9jdXM6IFwiZm9jdXNpblwiLCBibHVyOiBcImZvY3Vzb3V0XCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblxuXHRcdC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0XG5cdFx0dmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICksIHRydWUgKTtcblx0XHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7XG5cdFx0XHR9LFxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFfcHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIC8qSU5URVJOQUwqLyBvbmUgKSB7XG5cdFx0dmFyIG9yaWdGbiwgdHlwZTtcblxuXHRcdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApXG5cdFx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub24oIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cdFx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRcdG9yaWdGbiA9IGZuO1xuXHRcdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mb1xuXHRcdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0fTtcblx0XHRcdC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuXG5cdFx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdFx0fSk7XG5cdH0sXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxuXHRcdFx0aGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqO1xuXHRcdFx0alF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZihcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6IGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApXG5cdFx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0pO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWzBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSk7XG5cblxudmFyXG5cdHJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcXHc6XSspW14+XSopXFwvPi9naSxcblx0cnRhZ05hbWUgPSAvPChbXFx3Ol0rKS8sXG5cdHJodG1sID0gLzx8JiM/XFx3KzsvLFxuXHRybm9Jbm5lcmh0bWwgPSAvPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLFxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyc2NyaXB0VHlwZSA9IC9eJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksXG5cdHJzY3JpcHRUeXBlTWFza2VkID0gL150cnVlXFwvKC4qKS8sXG5cdHJjbGVhblNjcmlwdCA9IC9eXFxzKjwhKD86XFxbQ0RBVEFcXFt8LS0pfCg/OlxcXVxcXXwtLSk+XFxzKiQvZyxcblxuXHQvLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxuXHR3cmFwTWFwID0ge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0XHR0aGVhZDogWyAxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiIF0sXG5cdFx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0XHR0cjogWyAyLCBcIjx0YWJsZT48dGJvZHk+XCIsIFwiPC90Ym9keT48L3RhYmxlPlwiIF0sXG5cdFx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXG5cdFx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG5cdH07XG5cbi8vIFN1cHBvcnQ6IElFOVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cbi8vIFN1cHBvcnQ6IDEueCBjb21wYXRpYmlsaXR5XG4vLyBNYW5pcHVsYXRpbmcgdGFibGVzIHJlcXVpcmVzIGEgdGJvZHlcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0cmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRqUXVlcnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgXCJ0clwiICkgP1xuXG5cdFx0ZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRib2R5XCIpWzBdIHx8XG5cdFx0XHRlbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRib2R5XCIpICkgOlxuXHRcdGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9IChlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IG51bGwpICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0dmFyIG1hdGNoID0gcnNjcmlwdFR5cGVNYXNrZWQuZXhlYyggZWxlbS50eXBlICk7XG5cblx0aWYgKCBtYXRjaCApIHtcblx0XHRlbGVtLnR5cGUgPSBtYXRjaFsgMSBdO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKFwidHlwZVwiKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFfcHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLCBcImdsb2JhbEV2YWxcIiwgIXJlZkVsZW1lbnRzIHx8IGRhdGFfcHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFfcHJpdi5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRwZGF0YU9sZCA9IGRhdGFfcHJpdi5hY2Nlc3MoIHNyYyApO1xuXHRcdHBkYXRhQ3VyID0gZGF0YV9wcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YV91c2VyLmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHVkYXRhT2xkID0gZGF0YV91c2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFfdXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cdHZhciByZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lID8gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIHx8IFwiKlwiICkgOlxuXHRcdFx0Y29udGV4dC5xdWVyeVNlbGVjdG9yQWxsID8gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHRbXTtcblxuXHRyZXR1cm4gdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVyeS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgP1xuXHRcdGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIHJldCApIDpcblx0XHRyZXQ7XG59XG5cbi8vIEZpeCBJRSBidWdzLCBzZWUgc3VwcG9ydCB0ZXN0c1xuZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLlxuXHRpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblx0XHRkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDtcblxuXHQvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEZpeCBJRSBjbG9uaW5nIGlzc3Vlc1xuXHRcdGlmICggIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgJiYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiZcblx0XHRcdFx0IWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHA6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMlxuXHRcdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApO1xuXHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZpeElucHV0KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmVcblx0XHRpZiAoIGRhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0XHRzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApO1xuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgXCJzY3JpcHRcIiApO1xuXHRcdGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCBcInNjcmlwdFwiICkgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXRcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0sXG5cblx0YnVpbGRGcmFnbWVudDogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24gKSB7XG5cdFx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBjb250YWlucywgaixcblx0XHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0XHRub2RlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0XHRpZiAoIGpRdWVyeS50eXBlKCBlbGVtICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXQsIFBoYW50b21KU1xuXHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHRcdH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XG5cdFx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgKTtcblxuXHRcdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHR3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDtcblx0XHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgZWxlbS5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRcdGogPSB3cmFwWyAwIF07XG5cdFx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFF0V2ViS2l0LCBQaGFudG9tSlNcblx0XHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHRcdC8vIFJlbWVtYmVyIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyXG5cdFx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKCMxMjM5Milcblx0XHRcdFx0XHR0bXAudGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRcdGZyYWdtZW50LnRleHRDb250ZW50ID0gXCJcIjtcblxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKGVsZW0gPSBub2Rlc1sgaSsrIF0pICkge1xuXG5cdFx0XHQvLyAjNDA4NyAtIElmIG9yaWdpbiBhbmQgZGVzdGluYXRpb24gZWxlbWVudHMgYXJlIHRoZSBzYW1lLCBhbmQgdGhpcyBpc1xuXHRcdFx0Ly8gdGhhdCBlbGVtZW50LCBkbyBub3QgZG8gYW55dGhpbmdcblx0XHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSAhPT0gLTEgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gdG1wWyBqKysgXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZyYWdtZW50O1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLCBrZXksXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWwsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKGVsZW0gPSBlbGVtc1sgaSBdKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGtleSA9IGVsZW1bIGRhdGFfcHJpdi5leHBhbmRvIF07XG5cblx0XHRcdFx0aWYgKCBrZXkgJiYgKGRhdGEgPSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBkYXRhX3ByaXYuY2FjaGVbIGtleSBdICkge1xuXHRcdFx0XHRcdFx0Ly8gRGlzY2FyZCBhbnkgcmVtYWluaW5nIGBwcml2YXRlYCBkYXRhXG5cdFx0XHRcdFx0XHRkZWxldGUgZGF0YV9wcml2LmNhY2hlWyBrZXkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIERpc2NhcmQgYW55IHJlbWFpbmluZyBgdXNlcmAgZGF0YVxuXHRcdFx0ZGVsZXRlIGRhdGFfdXNlci5jYWNoZVsgZWxlbVsgZGF0YV91c2VyLmV4cGFuZG8gXSBdO1xuXHRcdH1cblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGFwcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRwcmVwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0YWZ0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdFx0dmFyIGVsZW0sXG5cdFx0XHRlbGVtcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKSA6IHRoaXMsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCAha2VlcERhdGEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtICkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcblx0XHR9KTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUxcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF0gfHwge307XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXJnID0gYXJndW1lbnRzWyAwIF07XG5cblx0XHQvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnRcblx0XHR0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0YXJnID0gdGhpcy5wYXJlbnROb2RlO1xuXG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApO1xuXG5cdFx0XHRpZiAoIGFyZyApIHtcblx0XHRcdFx0YXJnLnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRm9yY2UgcmVtb3ZhbCBpZiB0aGVyZSB3YXMgbm8gbmV3IGNvbnRlbnQgKGUuZy4sIGZyb20gZW1wdHkgYXJndW1lbnRzKVxuXHRcdHJldHVybiBhcmcgJiYgKGFyZy5sZW5ndGggfHwgYXJnLm5vZGVUeXBlKSA/IHRoaXMgOiB0aGlzLnJlbW92ZSgpO1xuXHR9LFxuXG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTtcblx0fSxcblxuXHRkb21NYW5pcDogZnVuY3Rpb24oIGFyZ3MsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdGFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7XG5cblx0XHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHNldCA9IHRoaXMsXG5cdFx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0XHRpZiAoIGlzRnVuY3Rpb24gfHxcblx0XHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0XHR2YXIgc2VsZiA9IHNldC5lcSggaW5kZXggKTtcblx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYuZG9tTWFuaXAoIGFyZ3MsIGNhbGxiYWNrICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIGwgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsIHRoaXMgKTtcblx0XHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdFx0ZnJhZ21lbnQgPSBmaXJzdDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBmaXJzdCApIHtcblx0XHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0XHRoYXNTY3JpcHRzID0gc2NyaXB0cy5sZW5ndGg7XG5cblx0XHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbSBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdFx0Ly8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS5cblx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRcdGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXRcblx0XHRcdFx0XHRcdFx0Ly8galF1ZXJ5Lm1lcmdlIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93c1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y2FsbGJhY2suY2FsbCggdGhpc1sgaSBdLCBub2RlLCBpICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdFx0ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDtcblxuXHRcdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0XHQvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0aW9uXG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgXCJcIiApICYmXG5cdFx0XHRcdFx0XHRcdCFkYXRhX3ByaXYuYWNjZXNzKCBub2RlLCBcImdsb2JhbEV2YWxcIiApICYmIGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudFxuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZWFjaCh7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFF0V2ViS2l0XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzXG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0pO1xuXG5cbnZhciBpZnJhbWUsXG5cdGVsZW1kaXNwbGF5ID0ge307XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5IG9mIGEgZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgRG9jdW1lbnQgb2JqZWN0XG4gKi9cbi8vIENhbGxlZCBvbmx5IGZyb20gd2l0aGluIGRlZmF1bHREaXNwbGF5XG5mdW5jdGlvbiBhY3R1YWxEaXNwbGF5KCBuYW1lLCBkb2MgKSB7XG5cdHZhciBzdHlsZSxcblx0XHRlbGVtID0galF1ZXJ5KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSApICkuYXBwZW5kVG8oIGRvYy5ib2R5ICksXG5cblx0XHQvLyBnZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSBtaWdodCBiZSByZWxpYWJseSB1c2VkIG9ubHkgb24gYXR0YWNoZWQgZWxlbWVudFxuXHRcdGRpc3BsYXkgPSB3aW5kb3cuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUgJiYgKCBzdHlsZSA9IHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSggZWxlbVsgMCBdICkgKSA/XG5cblx0XHRcdC8vIFVzZSBvZiB0aGlzIG1ldGhvZCBpcyBhIHRlbXBvcmFyeSBmaXggKG1vcmUgbGlrZSBvcHRpbWl6YXRpb24pIHVudGlsIHNvbWV0aGluZyBiZXR0ZXIgY29tZXMgYWxvbmcsXG5cdFx0XHQvLyBzaW5jZSBpdCB3YXMgcmVtb3ZlZCBmcm9tIHNwZWNpZmljYXRpb24gYW5kIHN1cHBvcnRlZCBvbmx5IGluIEZGXG5cdFx0XHRzdHlsZS5kaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbVsgMCBdLCBcImRpc3BsYXlcIiApO1xuXG5cdC8vIFdlIGRvbid0IGhhdmUgYW55IGRhdGEgc3RvcmVkIG9uIHRoZSBlbGVtZW50LFxuXHQvLyBzbyB1c2UgXCJkZXRhY2hcIiBtZXRob2QgYXMgZmFzdCB3YXkgdG8gZ2V0IHJpZCBvZiB0aGUgZWxlbWVudFxuXHRlbGVtLmRldGFjaCgpO1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG4vKipcbiAqIFRyeSB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZGlzcGxheSB2YWx1ZSBvZiBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbm9kZU5hbWVcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkge1xuXHR2YXIgZG9jID0gZG9jdW1lbnQsXG5cdFx0ZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdO1xuXG5cdGlmICggIWRpc3BsYXkgKSB7XG5cdFx0ZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTtcblxuXHRcdC8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxzLCByZWFkIGZyb20gaW5zaWRlIGFuIGlmcmFtZVxuXHRcdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgfHwgIWRpc3BsYXkgKSB7XG5cblx0XHRcdC8vIFVzZSB0aGUgYWxyZWFkeS1jcmVhdGVkIGlmcmFtZSBpZiBwb3NzaWJsZVxuXHRcdFx0aWZyYW1lID0gKGlmcmFtZSB8fCBqUXVlcnkoIFwiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPlwiICkpLmFwcGVuZFRvKCBkb2MuZG9jdW1lbnRFbGVtZW50ICk7XG5cblx0XHRcdC8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxldG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZVxuXHRcdFx0ZG9jID0gaWZyYW1lWyAwIF0uY29udGVudERvY3VtZW50O1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRVxuXHRcdFx0ZG9jLndyaXRlKCk7XG5cdFx0XHRkb2MuY2xvc2UoKTtcblxuXHRcdFx0ZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTtcblx0XHRcdGlmcmFtZS5kZXRhY2goKTtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSB0aGUgY29ycmVjdCBkZWZhdWx0IGRpc3BsYXlcblx0XHRlbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7XG5cdH1cblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cbnZhciBybWFyZ2luID0gKC9ebWFyZ2luLyk7XG5cbnZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKTtcblxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdC8vIFN1cHBvcnQ6IElFPD0xMSssIEZpcmVmb3g8PTMwKyAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0aWYgKCBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcub3BlbmVyICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFOVxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG9ubHkgbmVlZGVkIGZvciAuY3NzKCdmaWx0ZXInKSAoIzEyNTM3KVxuXHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXHR9XG5cblx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdGlmICggcmV0ID09PSBcIlwiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogaU9TIDwgNlxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBpT1MgPCA2IChhdCBsZWFzdCkgcmV0dXJucyBwZXJjZW50YWdlIGZvciBhIGxhcmdlciBzZXQgb2YgdmFsdWVzLCBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzXG5cdFx0Ly8gdGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOiBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xuXHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0c3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0O1xuXHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmV0ICE9PSB1bmRlZmluZWQgP1xuXHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAodGhpcy5nZXQgPSBob29rRm4pLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxuKGZ1bmN0aW9uKCkge1xuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsXG5cdFx0ZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gXCJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweDtcIiArXG5cdFx0XCJwb3NpdGlvbjphYnNvbHV0ZVwiO1xuXHRjb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCkge1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFuZHJvaWQgMi4zXG5cdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFwiLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7XCIgK1xuXHRcdFx0XCJib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjElO3RvcDoxJTtcIiArXG5cdFx0XHRcImJvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NHB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHR2YXIgZGl2U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICk7XG5cdFx0cGl4ZWxQb3NpdGlvblZhbCA9IGRpdlN0eWxlLnRvcCAhPT0gXCIxJVwiO1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gZGl2U3R5bGUud2lkdGggPT09IFwiNHB4XCI7XG5cblx0XHRkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IG5vZGUuanMganNkb21cblx0Ly8gRG9uJ3QgYXNzdW1lIHRoYXQgZ2V0Q29tcHV0ZWRTdHlsZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBnbG9iYWwgb2JqZWN0XG5cdGlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdFx0cGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gVGhpcyB0ZXN0IGlzIGV4ZWN1dGVkIG9ubHkgb25jZSBidXQgd2Ugc3RpbGwgZG8gbWVtb2l6aW5nXG5cdFx0XHRcdC8vIHNpbmNlIHdlIGNhbiB1c2UgdGhlIGJveFNpemluZ1JlbGlhYmxlIHByZS1jb21wdXRpbmcuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHRlc3Qgd2FzIGFscmVhZHkgcGVyZm9ybWVkLCB0aG91Z2guXG5cdFx0XHRcdGNvbXB1dGVQaXhlbFBvc2l0aW9uQW5kQm94U2l6aW5nUmVsaWFibGUoKTtcblx0XHRcdFx0cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7XG5cdFx0XHR9LFxuXHRcdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGJveFNpemluZ1JlbGlhYmxlVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdFx0Y29tcHV0ZVBpeGVsUG9zaXRpb25BbmRCb3hTaXppbmdSZWxpYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHRcdH0sXG5cdFx0XHRyZWxpYWJsZU1hcmdpblJpZ2h0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5XG5cdFx0XHRcdC8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gKCMzMzMzKVxuXHRcdFx0XHQvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHRcblx0XHRcdFx0Ly8gVGhpcyBzdXBwb3J0IGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBzbyBubyBtZW1vaXppbmcgaXMgbmVlZGVkLlxuXHRcdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHRcdG1hcmdpbkRpdiA9IGRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gUmVzZXQgQ1NTOiBib3gtc2l6aW5nOyBkaXNwbGF5OyBtYXJnaW47IGJvcmRlcjsgcGFkZGluZ1xuXHRcdFx0XHRtYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PDI5LCBBbmRyb2lkIDIuM1xuXHRcdFx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XHRcdFwiLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtcIiArXG5cdFx0XHRcdFx0XCJib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowXCI7XG5cdFx0XHRcdG1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0XHRkaXYuc3R5bGUud2lkdGggPSBcIjFweFwiO1xuXHRcdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdFx0XHRyZXQgPSAhcGFyc2VGbG9hdCggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApLm1hcmdpblJpZ2h0ICk7XG5cblx0XHRcdFx0ZG9jRWxlbS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cdFx0XHRcdGRpdi5yZW1vdmVDaGlsZCggbWFyZ2luRGl2ICk7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufSkoKTtcblxuXG4vLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zLlxualF1ZXJ5LnN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7XG5cdHZhciByZXQsIG5hbWUsXG5cdFx0b2xkID0ge307XG5cblx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XG5cdH1cblxuXHRyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApO1xuXG5cdC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufTtcblxuXG52YXJcblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZSBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cm51bXNwbGl0ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSguKikkXCIsIFwiaVwiICksXG5cdHJyZWxOdW0gPSBuZXcgUmVnRXhwKCBcIl4oWystXSk9KFwiICsgcG51bSArIFwiKVwiLCBcImlcIiApLFxuXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk9cIiwgXCJNb3pcIiwgXCJtc1wiIF07XG5cbi8vIFJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBzdHlsZSwgbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gc3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSxcblx0XHRvcmlnTmFtZSA9IG5hbWUsXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIHN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9yaWdOYW1lO1xufVxuXG5mdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXHR2YXIgbWF0Y2hlcyA9IHJudW1zcGxpdC5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMiBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkge1xuXHR2YXIgaSA9IGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgP1xuXHRcdC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvblxuXHRcdDQgOlxuXHRcdC8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXNcblx0XHRuYW1lID09PSBcIndpZHRoXCIgPyAxIDogMCxcblxuXHRcdHZhbCA9IDA7XG5cblx0Zm9yICggOyBpIDwgNDsgaSArPSAyICkge1xuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXRcblx0XHRpZiAoIGV4dHJhID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdGlmICggaXNCb3JkZXJCb3ggKSB7XG5cdFx0XHQvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnRcblx0XHRcdGlmICggZXh0cmEgPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmdcblx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3IgcGFkZGluZywgc28gYWRkIGJvcmRlclxuXHRcdFx0aWYgKCBleHRyYSAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICkge1xuXG5cdC8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBib3JkZXItYm94IHZhbHVlXG5cdHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSxcblx0XHR2YWwgPSBuYW1lID09PSBcIndpZHRoXCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQsXG5cdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0aXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdC8vIFNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZFxuXHQvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODVcblx0Ly8gTWF0aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxNjY4XG5cdGlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7XG5cdFx0Ly8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5XG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHRpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7XG5cdFx0XHR2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gQ29tcHV0ZWQgdW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi5cblx0XHRpZiAoIHJudW1ub25weC50ZXN0KHZhbCkgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzXG5cdFx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJlxuXHRcdFx0KCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTtcblxuXHRcdC8vIE5vcm1hbGl6ZSBcIlwiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmFcblx0XHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXHR9XG5cblx0Ly8gVXNlIHRoZSBhY3RpdmUgYm94LXNpemluZyBtb2RlbCB0byBhZGQvc3VidHJhY3QgaXJyZWxldmFudCBzdHlsZXNcblx0cmV0dXJuICggdmFsICtcblx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdGVsZW0sXG5cdFx0XHRuYW1lLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlc1xuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVuLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiICk7XG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cdFx0XHQvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzXG5cdFx0XHQvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90XG5cdFx0XHRpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmVcblx0XHRcdC8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzXG5cdFx0XHQvLyBmb3Igc3VjaCBhbiBlbGVtZW50XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbiggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBcIm9sZGRpc3BsYXlcIiwgZGVmYXVsdERpc3BsYXkoZWxlbS5ub2RlTmFtZSkgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTtcblxuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiB8fCAhaGlkZGVuICkge1xuXHRcdFx0XHRkYXRhX3ByaXYuc2V0KCBlbGVtLCBcIm9sZGRpc3BsYXlcIiwgaGlkZGVuID8gZGlzcGxheSA6IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcFxuXHQvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0aWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0gfHwgXCJcIiA6IFwibm9uZVwiO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cdC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eVxuXHRjc3NIb29rczoge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHlcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xuXHRcdFx0XHRcdHJldHVybiByZXQgPT09IFwiXCIgPyBcIjFcIiA6IHJldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCBcInB4XCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllc1xuXHRjc3NOdW1iZXI6IHtcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7XG5cdFx0XCJmbG9hdFwiOiBcImNzc0Zsb2F0XCJcblx0fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBvcmlnTmFtZSApICk7XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkge1xuXHRcdFx0XHR2YWx1ZSA9ICggcmV0WzFdICsgMSApICogcmV0WzJdICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7XG5cdFx0XHRcdC8vIEZpeGVzIGJ1ZyAjOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIsIGFkZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm51bWJlclwiICYmICFqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkge1xuXHRcdFx0XHR2YWx1ZSArPSBcInB4XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0XHRcdC8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXNcblx0XHRcdGlmICggIXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlICYmIHZhbHVlID09PSBcIlwiICYmIG5hbWUuaW5kZXhPZiggXCJiYWNrZ3JvdW5kXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IFwiaW5oZXJpdFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWVcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoXCJzZXRcIiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBlbGVtLnN0eWxlLCBvcmlnTmFtZSApICk7XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZWFjaChbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHQvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW1cblx0XHRcdFx0Ly8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXRcblx0XHRcdFx0cmV0dXJuIHJkaXNwbGF5c3dhcC50ZXN0KCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApICkgJiYgZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCA/XG5cdFx0XHRcdFx0alF1ZXJ5LnN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIGV4dHJhID9cblx0XHRcdFx0YXVnbWVudFdpZHRoT3JIZWlnaHQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGV4dHJhLFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCkgOiAwXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xualF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7IFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiIH0sXG5cdFx0XHRcdGN1ckNTUywgWyBlbGVtLCBcIm1hcmdpblJpZ2h0XCIgXSApO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goe1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gQXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoXCIgXCIpIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHtcblx0XHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyO1xuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZXMsIGxlbixcblx0XHRcdFx0bWFwID0ge30sXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzLCB0cnVlICk7XG5cdH0sXG5cdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcyApO1xuXHR9LFxuXHR0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHtcblx0XHRpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufSk7XG5cblxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xuXHRyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApO1xufVxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XG5cblR3ZWVuLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxuXHRpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7XG5cdFx0dGhpcy5lbGVtID0gZWxlbTtcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xuXHRcdHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8IFwic3dpbmdcIjtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdGlmICggdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiZcblx0XHRcdFx0KCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5XG5cdFx0XHQvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLlxuXHRcdFx0Ly8gU2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7XG5cdFx0XHQvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzIFwicm90YXRlKDFyYWQpXCIgYXJlIHJldHVybmVkIGFzLWlzLlxuXHRcdFx0cmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgXCJcIiApO1xuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0Ly8gVXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQuXG5cdFx0XHQvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuXG5cdFx0XHQvLyBVc2UgLnN0eWxlIGlmIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlLlxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIFN1cHBvcnQ6IElFOVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fVxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgQ29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIHRpbWVySWQsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRyZnhudW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLyxcblx0YW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXHR0d2VlbmVycyA9IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApLFxuXHRcdFx0XHR0YXJnZXQgPSB0d2Vlbi5jdXIoKSxcblx0XHRcdFx0cGFydHMgPSByZnhudW0uZXhlYyggdmFsdWUgKSxcblx0XHRcdFx0dW5pdCA9IHBhcnRzICYmIHBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICksXG5cblx0XHRcdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRcdFx0c3RhcnQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSBcInB4XCIgJiYgK3RhcmdldCApICYmXG5cdFx0XHRcdFx0cmZ4bnVtLmV4ZWMoIGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHByb3AgKSApLFxuXHRcdFx0XHRzY2FsZSA9IDEsXG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAyMDtcblxuXHRcdFx0aWYgKCBzdGFydCAmJiBzdGFydFsgMyBdICE9PSB1bml0ICkge1xuXHRcdFx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0XHRcdHVuaXQgPSB1bml0IHx8IHN0YXJ0WyAzIF07XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdFx0XHRwYXJ0cyA9IHBhcnRzIHx8IFtdO1xuXG5cdFx0XHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0XHRcdHN0YXJ0ID0gK3RhcmdldCB8fCAxO1xuXG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHQvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKi5cblx0XHRcdFx0XHQvLyBVc2Ugc3RyaW5nIGZvciBkb3VibGluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xuXHRcdFx0XHRcdHNjYWxlID0gc2NhbGUgfHwgXCIuNVwiO1xuXG5cdFx0XHRcdFx0Ly8gQWRqdXN0IGFuZCBhcHBseVxuXHRcdFx0XHRcdHN0YXJ0ID0gc3RhcnQgLyBzY2FsZTtcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0ICsgdW5pdCApO1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSBzY2FsZSwgdG9sZXJhdGluZyB6ZXJvIG9yIE5hTiBmcm9tIHR3ZWVuLmN1cigpLFxuXHRcdFx0XHQvLyBicmVhayB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdoXG5cdFx0XHRcdH0gd2hpbGUgKCBzY2FsZSAhPT0gKHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9ucyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdHdlZW4gcHJvcGVydGllc1xuXHRcdFx0aWYgKCBwYXJ0cyApIHtcblx0XHRcdFx0c3RhcnQgPSB0d2Vlbi5zdGFydCA9ICtzdGFydCB8fCArdGFyZ2V0IHx8IDA7XG5cdFx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0XHQvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb25cblx0XHRcdFx0dHdlZW4uZW5kID0gcGFydHNbIDEgXSA/XG5cdFx0XHRcdFx0c3RhcnQgKyAoIHBhcnRzWyAxIF0gKyAxICkgKiBwYXJ0c1sgMiBdIDpcblx0XHRcdFx0XHQrcGFydHNbIDIgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9O1xuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSk7XG5cdHJldHVybiAoIGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7XG59XG5cbi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xuXHR2YXIgd2hpY2gsXG5cdFx0aSA9IDAsXG5cdFx0YXR0cnMgPSB7IGhlaWdodDogdHlwZSB9O1xuXG5cdC8vIElmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcyxcblx0Ly8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92ZXIgTGVmdCBhbmQgUmlnaHRcblx0aW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7XG5cdGZvciAoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggdHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggdHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAodHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSkgKSB7XG5cblx0XHRcdC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkge1xuXHQvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCB0d2VlbiwgaG9va3MsIG9sZGZpcmUsIGRpc3BsYXksIGNoZWNrRGlzcGxheSxcblx0XHRhbmltID0gdGhpcyxcblx0XHRvcmlnID0ge30sXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlLFxuXHRcdGhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW4oIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sIFwiZnhzaG93XCIgKTtcblxuXHQvLyBIYW5kbGUgcXVldWU6IGZhbHNlIHByb21pc2VzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcblx0XHRcdFx0aG9va3MudW5xdWV1ZWQtLTtcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCBcImZ4XCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8vIEhlaWdodC93aWR0aCBvdmVyZmxvdyBwYXNzXG5cdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiaGVpZ2h0XCIgaW4gcHJvcHMgfHwgXCJ3aWR0aFwiIGluIHByb3BzICkgKSB7XG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTktMTAgZG8gbm90XG5cdFx0Ly8gY2hhbmdlIHRoZSBvdmVyZmxvdyBhdHRyaWJ1dGUgd2hlbiBvdmVyZmxvd1ggYW5kXG5cdFx0Ly8gb3ZlcmZsb3dZIGFyZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWVcblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoXG5cdFx0Ly8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZFxuXHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXG5cdFx0Ly8gVGVzdCBkZWZhdWx0IGRpc3BsYXkgaWYgZGlzcGxheSBpcyBjdXJyZW50bHkgXCJub25lXCJcblx0XHRjaGVja0Rpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/XG5cdFx0XHRkYXRhX3ByaXYuZ2V0KCBlbGVtLCBcIm9sZGRpc3BsYXlcIiApIHx8IGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgOiBkaXNwbGF5O1xuXG5cdFx0aWYgKCBjaGVja0Rpc3BsYXkgPT09IFwiaW5saW5lXCIgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJmbG9hdFwiICkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0c3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBvcHRzLm92ZXJmbG93ICkge1xuXHRcdHN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcblx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gc2hvdy9oaWRlIHBhc3Ncblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy5leGVjKCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBsZWZ0IG92ZXIgZnJvbSBhIHN0b3BwZWQgaGlkZSBvciBzaG93IGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRoIHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlblxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcInNob3dcIiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblxuXHRcdC8vIEFueSBub24tZnggdmFsdWUgc3RvcHMgdXMgZnJvbSByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWVcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlzcGxheSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRpZiAoICFqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YVNob3cgPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7fSApO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIHN0YXRlIGlmIGl0cyB0b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9nZ2xlKCkgdG8gXCJyZXZlcnNlXCJcblx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47XG5cdFx0fVxuXHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0alF1ZXJ5KCBlbGVtICkuc2hvdygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeSggZWxlbSApLmhpZGUoKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgcHJvcDtcblxuXHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdHR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7XG5cblx0XHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0XHRkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRcdHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRcdHR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gXCJ3aWR0aFwiIHx8IHByb3AgPT09IFwiaGVpZ2h0XCIgPyAxIDogMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHQvLyBJZiB0aGlzIGlzIGEgbm9vcCBsaWtlIC5oaWRlKCkuaGlkZSgpLCByZXN0b3JlIGFuIG92ZXJ3cml0dGVuIGRpc3BsYXkgdmFsdWVcblx0fSBlbHNlIGlmICggKGRpc3BsYXkgPT09IFwibm9uZVwiID8gZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXkpID09PSBcImlubGluZVwiICkge1xuXHRcdHN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5O1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkge1xuXHR2YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzO1xuXG5cdC8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzc1xuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcblx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTtcblx0XHRlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07XG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBhbmltYXRpb25QcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHRcdC8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5Nylcblx0XHRcdFx0dGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLFxuXHRcdFx0XHRwZXJjZW50ID0gMSAtIHRlbXAsXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0pO1xuXG5cdFx0XHRpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2Uoe1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdHByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLFxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgeyBzcGVjaWFsRWFzaW5nOiB7fSB9LCBvcHRpb25zICksXG5cdFx0XHRvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsXG5cdFx0XHRvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcblx0XHRcdHR3ZWVuczogW10sXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHtcblx0XHRcdFx0dmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7XG5cdFx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHRcdH0sXG5cdFx0XHRzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHtcblx0XHRcdFx0dmFyIGluZGV4ID0gMCxcblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSksXG5cdFx0cHJvcHMgPSBhbmltYXRpb24ucHJvcHM7XG5cblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7XG5cdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSlcblx0KTtcblxuXHQvLyBhdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcblx0XHQuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApXG5cdFx0LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7XG5cdFx0XHRjYWxsYmFjayA9IHByb3BzO1xuXHRcdFx0cHJvcHMgPSBbIFwiKlwiIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BzID0gcHJvcHMuc3BsaXQoXCIgXCIpO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XG5cdFx0XHR0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdHR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH0sXG5cblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XG5cdFx0aWYgKCBwcmVwZW5kICkge1xuXHRcdFx0YW5pbWF0aW9uUHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhbmltYXRpb25QcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59KTtcblxualF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkge1xuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XG5cdFx0Y29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHxcblx0XHRcdGpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09IFwibnVtYmVyXCIgPyBvcHQuZHVyYXRpb24gOlxuXHRcdG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF0gOiBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW4gKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBkYXRhX3ByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBkYXRhX3ByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiAodHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSkgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFfcHJpdi5nZXQoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZWFjaChbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0pO1xuXG4vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zXG5qUXVlcnkuZWFjaCh7XG5cdHNsaWRlRG93bjogZ2VuRngoXCJzaG93XCIpLFxuXHRzbGlkZVVwOiBnZW5GeChcImhpZGVcIiksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeChcInRvZ2dsZVwiKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59KTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBqUXVlcnkubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cdFx0Ly8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkXG5cdFx0aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7XG5cdFx0XHR0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5meC5zdG9wKCk7XG5cdH1cblx0ZnhOb3cgPSB1bmRlZmluZWQ7XG59O1xuXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XG5cdGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTtcblx0aWYgKCB0aW1lcigpICkge1xuXHRcdGpRdWVyeS5meC5zdGFydCgpO1xuXHR9IGVsc2Uge1xuXHRcdGpRdWVyeS50aW1lcnMucG9wKCk7XG5cdH1cbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xuXG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCAhdGltZXJJZCApIHtcblx0XHR0aW1lcklkID0gc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0Y2xlYXJJbnRlcnZhbCggdGltZXJJZCApO1xuXHR0aW1lcklkID0gbnVsbDtcbn07XG5cbmpRdWVyeS5meC5zcGVlZHMgPSB7XG5cdHNsb3c6IDYwMCxcblx0ZmFzdDogMjAwLFxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxuLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5L1xualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdGNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0pO1xufTtcblxuXG4oZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogaU9TPD01LjEsIEFuZHJvaWQ8PTQuMitcblx0Ly8gRGVmYXVsdCB2YWx1ZSBmb3IgYSBjaGVja2JveCBzaG91bGQgYmUgXCJvblwiXG5cdHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSBcIlwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPD0yLjNcblx0Ly8gT3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmUgaW5jb3JyZWN0bHkgbWFya2VkIGFzIGRpc2FibGVkXG5cdHNlbGVjdC5kaXNhYmxlZCA9IHRydWU7XG5cdHN1cHBvcnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSkoKTtcblxuXG52YXIgbm9kZUhvb2ssIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gc3RydW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBhdHRyaWJ1dGVzIGFyZSBsb3dlcmNhc2Vcblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogbm9kZUhvb2sgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0Ly8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWRcblx0XHRcdHJldHVybiByZXQgPT0gbnVsbCA/XG5cdFx0XHRcdHVuZGVmaW5lZCA6XG5cdFx0XHRcdHJldDtcblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLCBwcm9wTmFtZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKG5hbWUgPSBhdHRyTmFtZXNbaSsrXSkgKSB7XG5cdFx0XHRcdHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXG5cdFx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgKCMxMDg3MClcblx0XHRcdFx0aWYgKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0XHQvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZVxuXHRcdFx0XHRcdGVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSk7XG5cblxuXG5cbnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRwcm9wRml4OiB7XG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXG5cdFx0XCJjbGFzc1wiOiBcImNsYXNzTmFtZVwiXG5cdH0sXG5cblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLCBub3R4bWwsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7XG5cblx0XHRpZiAoIG5vdHhtbCApIHtcblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm4gaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0cmV0IDpcblx0XHRcdFx0KCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgP1xuXHRcdFx0XHRyZXQgOlxuXHRcdFx0XHRlbGVtWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BIb29rczoge1xuXHRcdHRhYkluZGV4OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5oYXNBdHRyaWJ1dGUoIFwidGFiaW5kZXhcIiApIHx8IHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0uaHJlZiA/XG5cdFx0XHRcdFx0ZWxlbS50YWJJbmRleCA6XG5cdFx0XHRcdFx0LTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHtcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaChbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSk7XG5cblxuXG5cbnZhciByY2xhc3MgPSAvW1xcdFxcclxcblxcZl0vZztcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRwcm9jZWVkID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9jZWVkICkge1xuXHRcdFx0Ly8gVGhlIGRpc2p1bmN0aW9uIGhlcmUgaXMgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSByZW1vdmVDbGFzcylcblx0XHRcdGNsYXNzZXMgPSAoIHZhbHVlIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgP1xuXHRcdFx0XHRcdCggXCIgXCIgKyBlbGVtLmNsYXNzTmFtZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApIDpcblx0XHRcdFx0XHRcIiBcIlxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXp6ICsgXCIgXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gb25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0galF1ZXJ5LnRyaW0oIGN1ciApO1xuXHRcdFx0XHRcdGlmICggZWxlbS5jbGFzc05hbWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmNsYXNzTmFtZSA9IGZpbmFsVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdHByb2NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGg7XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoIHByb2NlZWQgKSB7XG5cdFx0XHRjbGFzc2VzID0gKCB2YWx1ZSB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXTtcblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIGVsZW0uY2xhc3NOYW1lID9cblx0XHRcdFx0XHQoIFwiIFwiICsgZWxlbS5jbGFzc05hbWUgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKSA6XG5cdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXNcblx0XHRcdFx0XHRcdHdoaWxlICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApID49IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gdmFsdWUgPyBqUXVlcnkudHJpbSggY3VyICkgOiBcIlwiO1xuXHRcdFx0XHRcdGlmICggZWxlbS5jbGFzc05hbWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmNsYXNzTmFtZSA9IGZpbmFsVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0Ly8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcblx0XHRcdFx0dmFyIGNsYXNzTmFtZSxcblx0XHRcdFx0XHRpID0gMCxcblx0XHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdFx0Y2xhc3NOYW1lcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0XHR3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IHN0cnVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0aWYgKCB0aGlzLmNsYXNzTmFtZSApIHtcblx0XHRcdFx0XHQvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YV9wcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIHRoaXMuY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gXCJcIiA6IGRhdGFfcHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIjtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRpZiAoIHRoaXNbaV0ubm9kZVR5cGUgPT09IDEgJiYgKFwiIFwiICsgdGhpc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZShyY2xhc3MsIFwiIFwiKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+PSAwICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0pO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZztcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLFxuXHRcdFx0ZWxlbSA9IHRoaXNbMF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgXCJ2YWx1ZVwiICkpICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0cmV0dXJuIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdC8vIEhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXNcblx0XHRcdFx0XHRyZXQucmVwbGFjZShycmV0dXJuLCBcIlwiKSA6XG5cdFx0XHRcdFx0Ly8gSGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyXG5cdFx0XHRcdFx0cmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgXCJcIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ1xuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dmFsID0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsICs9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0dmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKFwic2V0XCIgaW4gaG9va3MpIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCBcInZhbHVlXCIgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdHZhbEhvb2tzOiB7XG5cdFx0b3B0aW9uOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTEwLTExK1xuXHRcdFx0XHRcdC8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OClcblx0XHRcdFx0XHRqUXVlcnkudHJpbSggalF1ZXJ5LnRleHQoIGVsZW0gKSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIgfHwgaW5kZXggPCAwLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCxcblx0XHRcdFx0XHRpID0gaW5kZXggPCAwID9cblx0XHRcdFx0XHRcdG1heCA6XG5cdFx0XHRcdFx0XHRvbmUgPyBpbmRleCA6IDA7XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBJRTYtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQoIHN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJpYnV0ZSggXCJkaXNhYmxlZFwiICkgPT09IG51bGwgKSAmJlxuXHRcdFx0XHRcdFx0XHQoICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fCAhalF1ZXJ5Lm5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggKG9wdGlvbi5zZWxlY3RlZCA9IGpRdWVyeS5pbkFycmF5KCBvcHRpb24udmFsdWUsIHZhbHVlcyApID49IDApICkge1xuXHRcdFx0XHRcdFx0b3B0aW9uU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldFxuXHRcdFx0XHRpZiAoICFvcHRpb25TZXQgKSB7XG5cdFx0XHRcdFx0ZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDAgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59KTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxuXG5cbmpRdWVyeS5lYWNoKCAoXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnVcIikuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblxuXHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHR0aGlzLnRyaWdnZXIoIG5hbWUgKTtcblx0fTtcbn0pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0aG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkge1xuXHRcdHJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApO1xuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cdFx0Ly8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKVxuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6IHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59KTtcblxuXG52YXIgbm9uY2UgPSBqUXVlcnkubm93KCk7XG5cbnZhciBycXVlcnkgPSAoL1xcPy8pO1xuXG5cblxuLy8gU3VwcG9ydDogQW5kcm9pZCAyLjNcbi8vIFdvcmthcm91bmQgZmFpbHVyZSB0byBzdHJpbmctY2FzdCBudWxsIGlucHV0XG5qUXVlcnkucGFyc2VKU09OID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHJldHVybiBKU09OLnBhcnNlKCBkYXRhICsgXCJcIiApO1xufTtcblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbCwgdG1wO1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdHRyeSB7XG5cdFx0dG1wID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdHhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHR4bWwgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKS5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIGRhdGEgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJ0cyA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblx0cnVybCA9IC9eKFtcXHcuKy1dKzopKD86XFwvXFwvKD86W15cXC8/I10qQHwpKFteXFwvPyM6XSopKD86OihcXGQrKXwpfCkvLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gRG9jdW1lbnQgbG9jYXRpb25cblx0YWpheExvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWYsXG5cblx0Ly8gU2VnbWVudCBsb2NhdGlvbiBpbnRvIHBhcnRzXG5cdGFqYXhMb2NQYXJ0cyA9IHJ1cmwuZXhlYyggYWpheExvY2F0aW9uLnRvTG93ZXJDYXNlKCkgKSB8fCBbXTtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKGRhdGFUeXBlID0gZGF0YVR5cGVzW2krK10pICkge1xuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWzBdID09PSBcIitcIiApIHtcblx0XHRcdFx0XHRkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgXCIqXCI7XG5cdFx0XHRcdFx0KHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmICFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblx0XHRcdFx0b3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7XG5cdFx0XHRcdHJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKGRlZXAgPSB7fSkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XG5cdFx0fVxuXHR9XG5cdGlmICggZGVlcCApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcbiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpXG4gKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHtcblxuXHR2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsXG5cdFx0Y29udGVudHMgPSBzLmNvbnRlbnRzLFxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzO1xuXG5cdC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzXG5cdHdoaWxlICggZGF0YVR5cGVzWyAwIF0gPT09IFwiKlwiICkge1xuXHRcdGRhdGFUeXBlcy5zaGlmdCgpO1xuXHRcdGlmICggY3QgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1swXSBdICkge1xuXHRcdFx0XHRmaW5hbERhdGFUeXBlID0gdHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICFmaXJzdERhdGFUeXBlICkge1xuXHRcdFx0XHRmaXJzdERhdGFUeXBlID0gdHlwZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0Ly8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0b1xuXHRcdFx0aWYgKCBjdXJyZW50ID09PSBcIipcIiApIHtcblxuXHRcdFx0XHRjdXJyZW50ID0gcHJldjtcblxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxuXHRcdFx0fSBlbHNlIGlmICggcHJldiAhPT0gXCIqXCIgJiYgcHJldiAhPT0gY3VycmVudCApIHtcblxuXHRcdFx0XHQvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlclxuXHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbIFwiKiBcIiArIGN1cnJlbnQgXTtcblxuXHRcdFx0XHQvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpclxuXHRcdFx0XHRpZiAoICFjb252ICkge1xuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudFxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dFxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlcnNbIFwiKiBcIiArIHRtcFsgMCBdIF07XG5cdFx0XHRcdFx0XHRcdGlmICggY29udiApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHNbIFwidGhyb3dzXCIgXSApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7IHN0YXRlOiBcInBhcnNlcmVycm9yXCIsIGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudCB9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogYWpheExvY2F0aW9uLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggYWpheExvY1BhcnRzWyAxIF0gKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC94bWwvLFxuXHRcdFx0aHRtbDogL2h0bWwvLFxuXHRcdFx0anNvbjogL2pzb24vXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IGpRdWVyeS5wYXJzZUpTT04sXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyIHRyYW5zcG9ydCxcblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblx0XHRcdC8vIENyb3NzLWRvbWFpbiBkZXRlY3Rpb24gdmFyc1xuXHRcdFx0cGFydHMsXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXHRcdFx0Ly8gTG9vcCB2YXJpYWJsZVxuXHRcdFx0aSxcblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXHRcdFx0Ly8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvblxuXHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/XG5cdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cdFx0XHQvLyBEZWZlcnJlZHNcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLFxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cdFx0XHQvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNlKVxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcblx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSxcblx0XHRcdC8vIFRoZSBqcVhIUiBzdGF0ZVxuXHRcdFx0c3RhdGUgPSAwLFxuXHRcdFx0Ly8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlXG5cdFx0XHRzdHJBYm9ydCA9IFwiY2FuY2VsZWRcIixcblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnMgPSB7fTtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdHZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2sgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXNcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkO1xuXHRcdGpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lO1xuXHRcdGpxWEhSLmVycm9yID0ganFYSFIuZmFpbDtcblxuXHRcdC8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKVxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGFqYXhMb2NhdGlvbiApICsgXCJcIiApLnJlcGxhY2UoIHJoYXNoLCBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCBycHJvdG9jb2wsIGFqYXhMb2NQYXJ0c1sgMSBdICsgXCIvL1wiICk7XG5cblx0XHQvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCAjMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0galF1ZXJ5LnRyaW0oIHMuZGF0YVR5cGUgfHwgXCIqXCIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB3ZSBoYXZlIGEgcHJvdG9jb2w6aG9zdDpwb3J0IG1pc21hdGNoXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHRwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwudG9Mb3dlckNhc2UoKSApO1xuXHRcdFx0cy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJlxuXHRcdFx0XHQoIHBhcnRzWyAxIF0gIT09IGFqYXhMb2NQYXJ0c1sgMSBdIHx8IHBhcnRzWyAyIF0gIT09IGFqYXhMb2NQYXJ0c1sgMiBdIHx8XG5cdFx0XHRcdFx0KCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gXCI4MFwiIDogXCI0NDNcIiApICkgIT09XG5cdFx0XHRcdFx0XHQoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09IFwiaHR0cDpcIiA/IFwiODBcIiA6IFwiNDQzXCIgKSApIClcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nXG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXG5cdFx0aW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxuXHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoXCJhamF4U3RhcnRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybDtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGEgKTtcblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRzLnVybCA9IHJ0cy50ZXN0KCBjYWNoZVVSTCApID9cblxuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVlXG5cdFx0XHRcdFx0Y2FjaGVVUkwucmVwbGFjZSggcnRzLCBcIiQxXz1cIiArIG5vbmNlKysgKSA6XG5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0aGUgZW5kXG5cdFx0XHRcdFx0Y2FjaGVVUkwgKyAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgbm9uY2UrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU1vZGlmaWVkLVNpbmNlXCIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTm9uZS1NYXRjaFwiLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudFxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJDb250ZW50LVR5cGVcIiwgcy5jb250ZW50VHlwZSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcblx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKFxuXHRcdFx0XCJBY2NlcHRcIixcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdICsgKCBzLmRhdGFUeXBlc1sgMCBdICE9PSBcIipcIiA/IFwiLCBcIiArIGFsbFR5cGVzICsgXCI7IHE9MC4wMVwiIDogXCJcIiApIDpcblx0XHRcdFx0cy5hY2NlcHRzWyBcIipcIiBdXG5cdFx0KTtcblxuXHRcdC8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvblxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0XG5cdFx0aWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkge1xuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHtcblx0XHRcdGpxWEhSWyBpIF0oIHNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEdldCB0cmFuc3BvcnRcblx0XHR0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydFxuXHRcdGlmICggIXRyYW5zcG9ydCApIHtcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSAxO1xuXG5cdFx0XHQvLyBTZW5kIGdsb2JhbCBldmVudFxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFNlbmRcIiwgWyBqcVhIUiwgcyBdICk7XG5cdFx0XHR9XG5cdFx0XHQvLyBUaW1lb3V0XG5cdFx0XHRpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHtcblx0XHRcdFx0dGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydChcInRpbWVvdXRcIik7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRzdGF0ZSA9IDE7XG5cdFx0XHRcdHRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBleGNlcHRpb24gYXMgZXJyb3IgaWYgbm90IGRvbmVcblx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XG5cdFx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdFx0Ly8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIENhbGxlZCBvbmNlXG5cdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXRlIGlzIFwiZG9uZVwiIG5vd1xuXHRcdFx0c3RhdGUgPSAyO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiTGFzdC1Nb2RpZmllZFwiKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiZXRhZ1wiKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoXCJhamF4U3RvcFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblx0XHQvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZFxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoe1xuXHRcdFx0dXJsOiB1cmwsXG5cdFx0XHR0eXBlOiBtZXRob2QsXG5cdFx0XHRkYXRhVHlwZTogdHlwZSxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFja1xuXHRcdH0pO1xuXHR9O1xufSk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KHtcblx0XHR1cmw6IHVybCxcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSk7XG59O1xuXG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwuY2FsbCh0aGlzLCBpKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcChmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xuXG5cdFx0XHRcdHdoaWxlICggZWxlbS5maXJzdEVsZW1lbnRDaGlsZCApIHtcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbGVtO1xuXHRcdFx0fSkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHdyYXA6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJib2R5XCIgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApO1xuXHRcdFx0fVxuXHRcdH0pLmVuZCgpO1xuXHR9XG59KTtcblxuXG5qUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMlxuXHQvLyBPcGVyYSByZXBvcnRzIG9mZnNldFdpZHRocyBhbmQgb2Zmc2V0SGVpZ2h0cyBsZXNzIHRoYW4gemVybyBvbiBzb21lIGVsZW1lbnRzXG5cdHJldHVybiBlbGVtLm9mZnNldFdpZHRoIDw9IDAgJiYgZWxlbS5vZmZzZXRIZWlnaHQgPD0gMDtcbn07XG5qUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApO1xufTtcblxuXG5cblxudmFyIHIyMCA9IC8lMjAvZyxcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggb2JqICkgKSB7XG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG5cdFx0XHRcdGFkZCggcHJlZml4LCB2ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiID8gaSA6IFwiXCIgKSArIFwiXVwiLCB2LCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0fSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyBuYW1lICsgXCJdXCIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlXG5cdFx0XHR2YWx1ZSA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApID8gdmFsdWUoKSA6ICggdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSApO1xuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTtcblx0XHR9O1xuXG5cdC8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuXG5cdGlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHR0cmFkaXRpb25hbCA9IGpRdWVyeS5hamF4U2V0dGluZ3MgJiYgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDtcblx0fVxuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9KTtcblxuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0c2VyaWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTtcblx0fSxcblx0c2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHtcblx0XHRcdC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yIFwiZWxlbWVudHNcIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHNcblx0XHRcdHZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCBcImVsZW1lbnRzXCIgKTtcblx0XHRcdHJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzO1xuXHRcdH0pXG5cdFx0LmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSlcblx0XHQubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRyZXR1cm4gdmFsID09IG51bGwgP1xuXHRcdFx0XHRudWxsIDpcblx0XHRcdFx0alF1ZXJ5LmlzQXJyYXkoIHZhbCApID9cblx0XHRcdFx0XHRqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHR7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0fSkuZ2V0KCk7XG5cdH1cbn0pO1xuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoKCBlICkge31cbn07XG5cbnZhciB4aHJJZCA9IDAsXG5cdHhockNhbGxiYWNrcyA9IHt9LFxuXHR4aHJTdWNjZXNzU3RhdHVzID0ge1xuXHRcdC8vIGZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXHRcdC8vIFN1cHBvcnQ6IElFOVxuXHRcdC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxuXHRcdDEyMjM6IDIwNFxuXHR9LFxuXHR4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpO1xuXG4vLyBTdXBwb3J0OiBJRTlcbi8vIE9wZW4gcmVxdWVzdHMgbXVzdCBiZSBtYW51YWxseSBhYm9ydGVkIG9uIHVubG9hZCAoIzUyODApXG4vLyBTZWUgaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMjg1Njc0NiBmb3IgbW9yZSBpbmZvXG5pZiAoIHdpbmRvdy5hdHRhY2hFdmVudCApIHtcblx0d2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIGZ1bmN0aW9uKCkge1xuXHRcdGZvciAoIHZhciBrZXkgaW4geGhyQ2FsbGJhY2tzICkge1xuXHRcdFx0eGhyQ2FsbGJhY2tzWyBrZXkgXSgpO1xuXHRcdH1cblx0fSk7XG59XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCksXG5cdFx0XHRcdFx0aWQgPSArK3hocklkO1xuXG5cdFx0XHRcdHhoci5vcGVuKCBvcHRpb25zLnR5cGUsIG9wdGlvbnMudXJsLCBvcHRpb25zLmFzeW5jLCBvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3JkICk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBoZWFkZXJzXG5cdFx0XHRcdGZvciAoIGkgaW4gaGVhZGVycyApIHtcblx0XHRcdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB4aHJDYWxsYmFja3NbIGlkIF07XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0geGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gZmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBBY2Nlc3NpbmcgYmluYXJ5LWRhdGEgcmVzcG9uc2VUZXh0IHRocm93cyBhbiBleGNlcHRpb25cblx0XHRcdFx0XHRcdFx0XHRcdC8vICgjMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCA9PT0gXCJzdHJpbmdcIiA/IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogeGhyLnJlc3BvbnNlVGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0fSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdHhoci5vbmVycm9yID0gY2FsbGJhY2soXCJlcnJvclwiKTtcblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0geGhyQ2FsbGJhY2tzWyBpZCBdID0gY2FsbGJhY2soXCJhYm9ydFwiKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIERvIHNlbmQgdGhlIHJlcXVlc3QgKHRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbilcblx0XHRcdFx0XHR4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8fCBudWxsICk7XG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0pO1xuXG5cblxuXG4vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZVxualF1ZXJ5LmFqYXhTZXR1cCh7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIlxuXHR9LFxuXHRjb250ZW50czoge1xuXHRcdHNjcmlwdDogLyg/OmphdmF8ZWNtYSlzY3JpcHQvXG5cdH0sXG5cdGNvbnZlcnRlcnM6IHtcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTtcblx0XHRcdHJldHVybiB0ZXh0O1xuXHRcdH1cblx0fVxufSk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59KTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHNcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeShcIjxzY3JpcHQ+XCIpLnByb3Aoe1xuXHRcdFx0XHRcdGFzeW5jOiB0cnVlLFxuXHRcdFx0XHRcdGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCxcblx0XHRcdFx0XHRzcmM6IHMudXJsXG5cdFx0XHRcdH0pLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59KTtcblxuXG5cblxudmFyIG9sZENhbGxiYWNrcyA9IFtdLFxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vO1xuXG4vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzXG5qUXVlcnkuYWpheFNldHVwKHtcblx0anNvbnA6IFwiY2FsbGJhY2tcIixcblx0anNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UrKyApICk7XG5cdFx0dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7XG5cdFx0cmV0dXJuIGNhbGxiYWNrO1xuXHR9XG59KTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiAhKCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKS5pbmRleE9mKFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpICYmIHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzW1wic2NyaXB0IGpzb25cIl0gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkge1xuXHRcdFx0XHRqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArIFwiIHdhcyBub3QgY2FsbGVkXCIgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdO1xuXHRcdH07XG5cblx0XHQvLyBmb3JjZSBqc29uIGRhdGFUeXBlXG5cdFx0cy5kYXRhVHlwZXNbIDAgXSA9IFwianNvblwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja1xuXHRcdG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTtcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50cztcblx0XHR9O1xuXG5cdFx0Ly8gQ2xlYW4tdXAgZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpXG5cdFx0anFYSFIuYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gUmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblx0XHRcdFx0Ly8gbWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBzYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkge1xuXHRcdFx0XHRvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkO1xuXHRcdH0pO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0pO1xuXG5cblxuXG4vLyBkYXRhOiBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRrZWVwU2NyaXB0cyA9IGNvbnRleHQ7XG5cdFx0Y29udGV4dCA9IGZhbHNlO1xuXHR9XG5cdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdHZhciBwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKSxcblx0XHRzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdO1xuXG5cdC8vIFNpbmdsZSB0YWdcblx0aWYgKCBwYXJzZWQgKSB7XG5cdFx0cmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbMV0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2RcbnZhciBfbG9hZCA9IGpRdWVyeS5mbi5sb2FkO1xuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHRpZiAoIHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIgJiYgX2xvYWQgKSB7XG5cdFx0cmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxuXG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoXCIgXCIpO1xuXG5cdGlmICggb2ZmID49IDAgKSB7XG5cdFx0c2VsZWN0b3IgPSBqUXVlcnkudHJpbSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XG5cblx0XHQvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xuXHRcdHBhcmFtcyA9IHVuZGVmaW5lZDtcblxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXG5cdH0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiICkge1xuXHRcdHR5cGUgPSBcIlBPU1RcIjtcblx0fVxuXG5cdC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0XG5cdGlmICggc2VsZi5sZW5ndGggPiAwICkge1xuXHRcdGpRdWVyeS5hamF4KHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBpZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkXG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSkuZG9uZShmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeShcIjxkaXY+XCIpLmFwcGVuZCggalF1ZXJ5LnBhcnNlSFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdFxuXHRcdFx0XHRyZXNwb25zZVRleHQgKTtcblxuXHRcdH0pLmNvbXBsZXRlKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggY2FsbGJhY2ssIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuXG5cblxuLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHNcbmpRdWVyeS5lYWNoKCBbIFwiYWpheFN0YXJ0XCIsIFwiYWpheFN0b3BcIiwgXCJhamF4Q29tcGxldGVcIiwgXCJhamF4RXJyb3JcIiwgXCJhamF4U3VjY2Vzc1wiLCBcImFqYXhTZW5kXCIgXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSk7XG5cblxuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTtcblx0fSkubGVuZ3RoO1xufTtcblxuXG5cblxudmFyIGRvY0VsZW0gPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4vKipcbiAqIEdldHMgYSB3aW5kb3cgZnJvbSBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kZWZhdWx0Vmlldztcbn1cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKFwiYXV0b1wiKSA+IC0xO1xuXG5cdFx0Ly8gTmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXJcblx0XHQvLyB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcblx0XHRpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkge1xuXHRcdFx0Y3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7XG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XG5cdFx0XHRjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwO1xuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7XG5cdFx0fVxuXHRcdGlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoIFwidXNpbmdcIiBpbiBvcHRpb25zICkge1xuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1ckVsZW0uY3NzKCBwcm9wcyApO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dmFyIGRvY0VsZW0sIHdpbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LFxuXHRcdFx0ZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRpZiAoICFkb2MgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHQvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGVcblx0XHRpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHtcblx0XHRcdHJldHVybiBib3g7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogQmxhY2tCZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBob25lKVxuXHRcdC8vIElmIHdlIGRvbid0IGhhdmUgZ0JDUiwganVzdCB1c2UgMCwwIHJhdGhlciB0aGFuIGVycm9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09IHN0cnVuZGVmaW5lZCApIHtcblx0XHRcdGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0fVxuXHRcdHdpbiA9IGdldFdpbmRvdyggZG9jICk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogYm94LnRvcCArIHdpbi5wYWdlWU9mZnNldCAtIGRvY0VsZW0uY2xpZW50VG9wLFxuXHRcdFx0bGVmdDogYm94LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQgLSBkb2NFbGVtLmNsaWVudExlZnRcblx0XHR9O1xuXHR9LFxuXG5cdHBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICF0aGlzWyAwIF0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIG9mZnNldFBhcmVudCwgb2Zmc2V0LFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBGaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNhdXNlIGl0IGlzIGl0cyBvbmx5IG9mZnNldCBwYXJlbnRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cdFx0XHQvLyBBc3N1bWUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlzIHRoZXJlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWRcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnRcblx0XHRcdG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7XG5cblx0XHRcdC8vIEdldCBjb3JyZWN0IG9mZnNldHNcblx0XHRcdG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7XG5cdFx0XHRpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCBcImh0bWxcIiApICkge1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVyc1xuXHRcdFx0cGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRwYXJlbnRPZmZzZXQubGVmdCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCB8fCBkb2NFbGVtO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudCwgXCJodG1sXCIgKSAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTtcblx0XHR9KTtcblx0fVxufSk7XG5cbi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIiB9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkge1xuXHR2YXIgdG9wID0gXCJwYWdlWU9mZnNldFwiID09PSBwcm9wO1xuXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcblx0XHRcdHZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTtcblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/IHdpblsgcHJvcCBdIDogZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IHdpbmRvdy5wYWdlWE9mZnNldCxcblx0XHRcdFx0XHR0b3AgPyB2YWwgOiB3aW5kb3cucGFnZVlPZmZzZXRcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGgsIG51bGwgKTtcblx0fTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmk8NyssIENocm9tZTwzNytcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTI4MFxuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXHRcdFx0XHQvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXRcblx0XHRcdFx0cmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID9cblx0XHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn0pO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXHRcdC8vIE1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aFxuXHRcdGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBtYXJnaW4sIHZhbHVlICkge1xuXHRcdFx0dmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gXCJib29sZWFuXCIgKSxcblx0XHRcdFx0ZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJnaW4gPT09IHRydWUgfHwgdmFsdWUgPT09IHRydWUgPyBcIm1hcmdpblwiIDogXCJib3JkZXJcIiApO1xuXG5cdFx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBkb2M7XG5cblx0XHRcdFx0aWYgKCBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblx0XHRcdFx0XHQvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZVxuXHRcdFx0XHRcdC8vIGlzbid0IGEgd2hvbGUgbG90IHdlIGNhbiBkby4gU2VlIHB1bGwgcmVxdWVzdCBhdCB0aGlzIFVSTCBmb3IgZGlzY3Vzc2lvbjpcblx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NFxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTtcblx0XHR9O1xuXHR9KTtcbn0pO1xuXG5cbi8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5qUXVlcnkuZm4uc2l6ZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5sZW5ndGg7XG59O1xuXG5qUXVlcnkuZm4uYW5kU2VsZiA9IGpRdWVyeS5mbi5hZGRCYWNrO1xuXG5cblxuXG4vLyBSZWdpc3RlciBhcyBhIG5hbWVkIEFNRCBtb2R1bGUsIHNpbmNlIGpRdWVyeSBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXJcbi8vIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsIGJ1dCBub3QgdmlhIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXRcbi8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdFxuLy8gd2F5IHRvIHJlZ2lzdGVyLiBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9kdWxlIG5hbWVzIGFyZVxuLy8gZGVyaXZlZCBmcm9tIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlXG4vLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHNcbi8vIHRvIGNhbGwgbm9Db25mbGljdCB0byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay5cblxuLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGRcbi8vIGRlY2xhcmUgdGhlbXNlbHZlcyBhcyBhbm9ueW1vdXMgbW9kdWxlcywgYW5kIGF2b2lkIHNldHRpbmcgYSBnbG9iYWwgaWYgYW5cbi8vIEFNRCBsb2FkZXIgaXMgcHJlc2VudC4galF1ZXJ5IGlzIGEgc3BlY2lhbCBjYXNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uXG5cbmlmICggdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgKSB7XG5cdGRlZmluZSggXCJqcXVlcnlcIiwgW10sIGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnk7XG5cdH0pO1xufVxuXG5cblxuXG52YXJcblx0Ly8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxuXG5cdC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF8kID0gd2luZG93LiQ7XG5cbmpRdWVyeS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oIGRlZXAgKSB7XG5cdGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cuJCA9IF8kO1xuXHR9XG5cblx0aWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnk7XG59O1xuXG4vLyBFeHBvc2UgalF1ZXJ5IGFuZCAkIGlkZW50aWZpZXJzLCBldmVuIGluIEFNRFxuLy8gKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KVxuaWYgKCB0eXBlb2Ygbm9HbG9iYWwgPT09IHN0cnVuZGVmaW5lZCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xuXG59KSk7XG4iLCIvKiEgSnNSZW5kZXIgdjAuOS44MiAoQmV0YSk6IGh0dHA6Ly9qc3ZpZXdzLmNvbS8janNyZW5kZXIgKi9cbi8qISAqKlZFUlNJT04gRk9SIFdFQioqIChGb3IgTk9ERS5KUyBzZWUgaHR0cDovL2pzdmlld3MuY29tL2Rvd25sb2FkL2pzcmVuZGVyLW5vZGUuanMpICovXG4vKlxuICogQmVzdC1vZi1icmVlZCB0ZW1wbGF0aW5nIGluIGJyb3dzZXIgb3Igb24gTm9kZS5qcy5cbiAqIERvZXMgbm90IHJlcXVpcmUgalF1ZXJ5LCBvciBIVE1MIERPTVxuICogSW50ZWdyYXRlcyB3aXRoIEpzVmlld3MgKGh0dHA6Ly9qc3ZpZXdzLmNvbS8janN2aWV3cylcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNiwgQm9yaXMgTW9vcmVcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4vL2pzaGludCAtVzAxOCwgLVcwNDFcblxuKGZ1bmN0aW9uKGZhY3RvcnksIGdsb2JhbCkge1xuXHQvLyBnbG9iYWwgdmFyIGlzIHRoZSB0aGlzIG9iamVjdCwgd2hpY2ggaXMgd2luZG93IHdoZW4gcnVubmluZyBpbiB0aGUgdXN1YWwgYnJvd3NlciBlbnZpcm9ubWVudFxuXHR2YXIgJCA9IGdsb2JhbC5qUXVlcnk7XG5cblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7IC8vIENvbW1vbkpTIGUuZy4gQnJvd3NlcmlmeVxuXHRcdG1vZHVsZS5leHBvcnRzID0gJFxuXHRcdFx0PyBmYWN0b3J5KGdsb2JhbCwgJClcblx0XHRcdDogZnVuY3Rpb24oJCkgeyAvLyBJZiBubyBnbG9iYWwgalF1ZXJ5LCB0YWtlIG9wdGlvbmFsIGpRdWVyeSBwYXNzZWQgYXMgcGFyYW1ldGVyOiByZXF1aXJlKCdqc3JlbmRlcicpKGpRdWVyeSlcblx0XHRcdFx0aWYgKCQgJiYgISQuZm4pIHtcblx0XHRcdFx0XHR0aHJvdyBcIlByb3ZpZGUgalF1ZXJ5IG9yIG51bGxcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdFx0fTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgeyAvLyBBTUQgc2NyaXB0IGxvYWRlciwgZS5nLiBSZXF1aXJlSlNcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwpO1xuXHRcdH0pO1xuXHR9IGVsc2UgeyAvLyBCcm93c2VyIHVzaW5nIHBsYWluIDxzY3JpcHQ+IHRhZ1xuXHRcdGZhY3RvcnkoZ2xvYmFsLCBmYWxzZSk7XG5cdH1cbn0gKFxuXG4vLyBmYWN0b3J5IChmb3IganNyZW5kZXIuanMpXG5mdW5jdGlvbihnbG9iYWwsICQpIHtcblwidXNlIHN0cmljdFwiO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCB2YXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG52YXIgc2V0R2xvYmFscyA9ICQgPT09IGZhbHNlOyAvLyBPbmx5IHNldCBnbG9iYWxzIGlmIHNjcmlwdCBibG9jayBpbiBicm93c2VyIChub3QgQU1EIGFuZCBub3QgQ29tbW9uSlMpXG5cbiQgPSAkICYmICQuZm4gPyAkIDogZ2xvYmFsLmpRdWVyeTsgLy8gJCBpcyBqUXVlcnkgcGFzc2VkIGluIGJ5IENvbW1vbkpTIGxvYWRlciAoQnJvd3NlcmlmeSksIG9yIGdsb2JhbCBqUXVlcnkuXG5cbnZhciB2ZXJzaW9uTnVtYmVyID0gXCJ2MC45LjgyXCIsXG5cdGpzdlN0b3JlTmFtZSwgclRhZywgclRtcGxTdHJpbmcsIHRvcFZpZXcsICR2aWV3cyxcdCRleHBhbmRvLFxuXG4vL1RPRE9cdHRtcGxGbnNDYWNoZSA9IHt9LFxuXHQkaXNGdW5jdGlvbiwgJGlzQXJyYXksICR0ZW1wbGF0ZXMsICRjb252ZXJ0ZXJzLCAkaGVscGVycywgJHRhZ3MsICRzdWIsICRzdWJTZXR0aW5ncywgJHN1YlNldHRpbmdzQWR2YW5jZWQsICR2aWV3c1NldHRpbmdzLCBkZWxpbU9wZW5DaGFyMCwgZGVsaW1PcGVuQ2hhcjEsIGRlbGltQ2xvc2VDaGFyMCwgZGVsaW1DbG9zZUNoYXIxLCBsaW5rQ2hhciwgc2V0dGluZywgYmFzZU9uRXJyb3IsXG5cblx0clBhdGggPSAvXighKj8pKD86bnVsbHx0cnVlfGZhbHNlfFxcZFtcXGQuXSp8KFtcXHckXSt8XFwufH4oW1xcdyRdKyl8Iyh2aWV3fChbXFx3JF0rKSk/KShbXFx3JC5eXSo/KSg/OlsuW15dKFtcXHckXSspXFxdPyk/KSQvZyxcblx0Ly8gICAgICAgIG5vdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgICAgIGhlbHBlciAgICB2aWV3ICB2aWV3UHJvcGVydHkgcGF0aFRva2VucyAgICAgIGxlYWZUb2tlblxuXG5cdHJQYXJhbXMgPSAvKFxcKCkoPz1cXHMqXFwoKXwoPzooWyhbXSlcXHMqKT8oPzooXFxePykoISo/WyN+XT9bXFx3JC5eXSspP1xccyooKFxcK1xcK3wtLSl8XFwrfC18JiZ8XFx8XFx8fD09PXwhPT18PT18IT18PD18Pj18Wzw+JSo6P1xcL118KD0pKVxccyp8KCEqP1sjfl0/W1xcdyQuXl0rKShbKFtdKT8pfCgsXFxzKil8KFxcKD8pXFxcXD8oPzooJyl8KFwiKSl8KD86XFxzKigoWylcXF1dKSg/PVxccypbLl5dfFxccyokfFteKFtdKXxbKVxcXV0pKFsoW10/KSl8KFxccyspL2csXG5cdC8vICAgICAgICAgIGxmdFBybjAgICAgICAgIGxmdFBybiAgICAgICAgYm91bmQgICAgICAgICAgICBwYXRoICAgIG9wZXJhdG9yIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxICAgICAgICAgICAgIHBhdGgyICAgICAgIHBybiAgICBjb21tYSAgIGxmdFBybjIgICBhcG9zIHF1b3QgICAgICBydFBybiBydFBybkRvdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBybjIgIHNwYWNlXG5cdC8vIChsZWZ0IHBhcmVuPyBmb2xsb3dlZCBieSAocGF0aD8gZm9sbG93ZWQgYnkgb3BlcmF0b3IpIG9yIChwYXRoIGZvbGxvd2VkIGJ5IGxlZnQgcGFyZW4/KSkgb3IgY29tbWEgb3IgYXBvcyBvciBxdW90IG9yIHJpZ2h0IHBhcmVuIG9yIHNwYWNlXG5cblx0aXNSZW5kZXJDYWxsLFxuXHRyTmV3TGluZSA9IC9bIFxcdF0qKFxcclxcbnxcXG58XFxyKS9nLFxuXHRyVW5lc2NhcGVRdW90ZXMgPSAvXFxcXChbJ1wiXSkvZyxcblx0ckVzY2FwZVF1b3RlcyA9IC9bJ1wiXFxcXF0vZywgLy8gRXNjYXBlIHF1b3RlcyBhbmQgXFwgY2hhcmFjdGVyXG5cdHJCdWlsZEhhc2ggPSAvKD86XFx4MDh8Xikob25lcnJvcjopPyg/Oih+PykoKFtcXHckX1xcLl0rKTopPyhbXlxceDA4XSspKVxceDA4KCwpPyhbXlxceDA4XSspL2dpLFxuXHRyVGVzdEVsc2VJZiA9IC9eaWZcXHMvLFxuXHRyRmlyc3RFbGVtID0gLzwoXFx3KylbPlxcc10vLFxuXHRyQXR0ckVuY29kZSA9IC9bXFx4MDBgPjxcIicmPV0vZywgLy8gSW5jbHVkZXMgPiBlbmNvZGluZyBzaW5jZSByQ29udmVydE1hcmtlcnMgaW4gSnNWaWV3cyBkb2VzIG5vdCBza2lwID4gY2hhcmFjdGVycyBpbiBhdHRyaWJ1dGUgc3RyaW5nc1xuXHRySXNIdG1sID0gL1tcXHgwMGA+PFxcXCInJj1dLyxcblx0ckhhc0hhbmRsZXJzID0gL15vbltBLVpdfF5jb252ZXJ0KEJhY2spPyQvLFxuXHRyV3JhcHBlZEluVmlld01hcmtlciA9IC9eXFwjXFxkK19gW1xcc1xcU10qXFwvXFxkK19gJC8sXG5cdHJIdG1sRW5jb2RlID0gckF0dHJFbmNvZGUsXG5cdHZpZXdJZCA9IDAsXG5cdGNoYXJFbnRpdGllcyA9IHtcblx0XHRcIiZcIjogXCImYW1wO1wiLFxuXHRcdFwiPFwiOiBcIiZsdDtcIixcblx0XHRcIj5cIjogXCImZ3Q7XCIsXG5cdFx0XCJcXHgwMFwiOiBcIiYjMDtcIixcblx0XHRcIidcIjogXCImIzM5O1wiLFxuXHRcdCdcIic6IFwiJiMzNDtcIixcblx0XHRcImBcIjogXCImIzk2O1wiLFxuXHRcdFwiPVwiOiBcIiYjNjE7XCJcblx0fSxcblx0SFRNTCA9IFwiaHRtbFwiLFxuXHRPQkpFQ1QgPSBcIm9iamVjdFwiLFxuXHR0bXBsQXR0ciA9IFwiZGF0YS1qc3YtdG1wbFwiLFxuXHRqc3ZUbXBsID0gXCJqc3ZUbXBsXCIsXG5cdGluZGV4U3RyID0gXCJGb3IgI2luZGV4IGluIG5lc3RlZCBibG9jayB1c2UgI2dldEluZGV4KCkuXCIsXG5cdCRyZW5kZXIgPSB7fSxcblxuXHRqc3IgPSBnbG9iYWwuanNyZW5kZXIsXG5cdGpzclRvSnEgPSBqc3IgJiYgJCAmJiAhJC5yZW5kZXIsIC8vIEpzUmVuZGVyIGFscmVhZHkgbG9hZGVkLCB3aXRob3V0IGpRdWVyeS4gYnV0IHdlIHdpbGwgcmUtbG9hZCBpdCBub3cgdG8gYXR0YWNoIHRvIGpRdWVyeVxuXG5cdGpzdlN0b3JlcyA9IHtcblx0XHR0ZW1wbGF0ZToge1xuXHRcdFx0Y29tcGlsZTogY29tcGlsZVRtcGxcblx0XHR9LFxuXHRcdHRhZzoge1xuXHRcdFx0Y29tcGlsZTogY29tcGlsZVRhZ1xuXHRcdH0sXG5cdFx0dmlld01vZGVsOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVmlld01vZGVsXG5cdFx0fSxcblx0XHRoZWxwZXI6IHt9LFxuXHRcdGNvbnZlcnRlcjoge31cblx0fTtcblxuXHQvLyB2aWV3cyBvYmplY3QgKCQudmlld3MgaWYgalF1ZXJ5IGlzIGxvYWRlZCwganNyZW5kZXIudmlld3MgaWYgbm8galF1ZXJ5LCBlLmcuIGluIE5vZGUuanMpXG5cdCR2aWV3cyA9IHtcblx0XHRqc3ZpZXdzOiB2ZXJzaW9uTnVtYmVyLFxuXHRcdHN1Yjoge1xuXHRcdFx0Ly8gc3Vic2NyaXB0aW9uLCBlLmcuIEpzVmlld3MgaW50ZWdyYXRpb25cblx0XHRcdFZpZXc6IFZpZXcsXG5cdFx0XHRFcnI6IEpzVmlld3NFcnJvcixcblx0XHRcdHRtcGxGbjogdG1wbEZuLFxuXHRcdFx0cGFyc2U6IHBhcnNlUGFyYW1zLFxuXHRcdFx0ZXh0ZW5kOiAkZXh0ZW5kLFxuXHRcdFx0ZXh0ZW5kQ3R4OiBleHRlbmRDdHgsXG5cdFx0XHRzeW50YXhFcnI6IHN5bnRheEVycm9yLFxuXHRcdFx0b25TdG9yZToge30sXG5cdFx0XHRhZGRTZXR0aW5nOiBhZGRTZXR0aW5nLFxuXHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0YWxsb3dDb2RlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdGFkdlNldDogbm9vcCwgLy8gVXBkYXRlIGFkdmFuY2VkIHNldHRpbmdzXG5cdFx0XHRfdGhzOiB0YWdIYW5kbGVyc0Zyb21Qcm9wcyxcblx0XHRcdF90ZzogZnVuY3Rpb24oKSB7fSwgLy8gQ29uc3RydWN0b3IgZm9yIHRhZ0RlZlxuXHRcdFx0X2NudnQ6IGNvbnZlcnRWYWwsXG5cdFx0XHRfdGFnOiByZW5kZXJUYWcsXG5cdFx0XHRfZXI6IGVycm9yLFxuXHRcdFx0X2Vycjogb25SZW5kZXJFcnJvcixcblx0XHRcdF9odG1sOiBodG1sRW5jb2RlLFxuXHRcdFx0X2NwOiByZXRWYWwsIC8vIEdldCBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMgKG9yIHByb3BlcnRpZXMpIH5mb289ZXhwci4gSW4gSnNSZW5kZXIsIHNpbXBseSByZXR1cm5zIHZhbC5cblx0XHRcdF9zcTogZnVuY3Rpb24odG9rZW4pIHtcblx0XHRcdFx0aWYgKHRva2VuID09PSBcImNvbnN0cnVjdG9yXCIpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZXR0aW5nczoge1xuXHRcdFx0ZGVsaW1pdGVyczogJHZpZXdzRGVsaW1pdGVycyxcblx0XHRcdGFkdmFuY2VkOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWVcblx0XHRcdFx0XHQ/IChcblx0XHRcdFx0XHRcdFx0JGV4dGVuZCgkc3ViU2V0dGluZ3NBZHZhbmNlZCwgdmFsdWUpLFxuXHRcdFx0XHRcdFx0XHQkc3ViLmFkdlNldCgpLFxuXHRcdFx0XHRcdFx0XHQkdmlld3NTZXR0aW5nc1xuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0OiAkc3ViU2V0dGluZ3NBZHZhbmNlZDtcblx0XHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0Q3R4OiByZXRWYWwsIC8vIEdldCBjdHguZm9vIHZhbHVlLiBJbiBKc1JlbmRlciwgc2ltcGx5IHJldHVybnMgdmFsLlxuXHRcdG1hcDogZGF0YU1hcCAgICAvLyBJZiBqc09ic2VydmFibGUgbG9hZGVkIGZpcnN0LCB1c2UgdGhhdCBkZWZpbml0aW9uIG9mIGRhdGFNYXBcblx0fTtcblxuZnVuY3Rpb24gZ2V0RGVyaXZlZE1ldGhvZChiYXNlTWV0aG9kLCBtZXRob2QpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdHZhciByZXQsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0cHJldkJhc2UgPSB0YWcuYmFzZTtcblxuXHRcdHRhZy5iYXNlID0gYmFzZU1ldGhvZDsgLy8gV2l0aGluIG1ldGhvZCBjYWxsLCBjYWxsaW5nIHRoaXMuYmFzZSB3aWxsIGNhbGwgdGhlIGJhc2UgbWV0aG9kXG5cdFx0cmV0ID0gbWV0aG9kLmFwcGx5KHRhZywgYXJndW1lbnRzKTsgLy8gQ2FsbCB0aGUgbWV0aG9kXG5cdFx0dGFnLmJhc2UgPSBwcmV2QmFzZTsgLy8gUmVwbGFjZSB0aGlzLmJhc2UgdG8gYmUgdGhlIGJhc2UgbWV0aG9kIG9mIHRoZSBwcmV2aW91cyBjYWxsLCBmb3IgY2hhaW5lZCBjYWxsc1xuXHRcdHJldHVybiByZXQ7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldE1ldGhvZChiYXNlTWV0aG9kLCBtZXRob2QpIHtcblx0Ly8gRm9yIGRlcml2ZWQgbWV0aG9kcyAob3IgaGFuZGxlcnMgZGVjbGFyZWQgZGVjbGFyYXRpdmVseSBhcyBpbiB7ezpmb28gb25DaGFuZ2U9fmZvb0NoYW5nZWR9fSByZXBsYWNlIGJ5IGEgZGVyaXZlZCBtZXRob2QsIHRvIGFsbG93IHVzaW5nIHRoaXMuYmFzZSguLi4pXG5cdC8vIG9yIHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgdG8gY2FsbCB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbi4gKEVxdWl2YWxlbnQgdG8gdGhpcy5fc3VwZXIoLi4uKSBhbmQgdGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpIGluIGpRdWVyeSBVSSlcblx0aWYgKCRpc0Z1bmN0aW9uKG1ldGhvZCkpIHtcblx0XHRtZXRob2QgPSBnZXREZXJpdmVkTWV0aG9kKFxuXHRcdFx0XHQhYmFzZU1ldGhvZFxuXHRcdFx0XHRcdD8gbm9vcCAvLyBubyBiYXNlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiwgc28gdXNlIG5vb3AgYXMgYmFzZSBtZXRob2Rcblx0XHRcdFx0XHQ6IGJhc2VNZXRob2QuX2Rcblx0XHRcdFx0XHRcdD8gYmFzZU1ldGhvZCAvLyBiYXNlTWV0aG9kIGlzIGEgZGVyaXZlZCBtZXRob2QsIHNvIHVzIGl0XG5cdFx0XHRcdFx0XHQ6IGdldERlcml2ZWRNZXRob2Qobm9vcCwgYmFzZU1ldGhvZCksIC8vIGJhc2VNZXRob2QgaXMgbm90IGRlcml2ZWQgc28gbWFrZSBpdHMgYmFzZSBtZXRob2QgYmUgdGhlIG5vb3AgbWV0aG9kXG5cdFx0XHRcdG1ldGhvZFxuXHRcdFx0KTtcblx0XHRtZXRob2QuX2QgPSAxOyAvLyBBZGQgZmxhZyB0aGF0IHRoaXMgaXMgYSBkZXJpdmVkIG1ldGhvZFxuXHR9XG5cdHJldHVybiBtZXRob2Q7XG59XG5cbmZ1bmN0aW9uIHRhZ0hhbmRsZXJzRnJvbVByb3BzKHRhZywgdGFnQ3R4KSB7XG5cdGZvciAodmFyIHByb3AgaW4gdGFnQ3R4LnByb3BzKSB7XG5cdFx0aWYgKHJIYXNIYW5kbGVycy50ZXN0KHByb3ApKSB7XG5cdFx0XHR0YWdbcHJvcF0gPSBnZXRNZXRob2QodGFnW3Byb3BdLCB0YWdDdHgucHJvcHNbcHJvcF0pO1xuXHRcdFx0Ly8gQ29weSBvdmVyIHRoZSBvbkZvbyBwcm9wcywgY29udmVydCBhbmQgY29udmVydEJhY2sgZnJvbSB0YWdDdHgucHJvcHMgdG8gdGFnIChvdmVycmlkZXMgdmFsdWVzIGluIHRhZ0RlZikuXG5cdFx0XHQvLyBOb3RlOiB1bnN1cHBvcnRlZCBzY2VuYXJpbzogaWYgaGFuZGxlcnMgYXJlIGR5bmFtaWNhbGx5IGFkZGVkIF5vbkZvbz1leHByZXNzaW9uIHRoaXMgd2lsbCB3b3JrLCBidXQgZHluYW1pY2FsbHkgcmVtb3Zpbmcgd2lsbCBub3Qgd29yay5cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcmV0VmFsKHZhbCkge1xuXHRyZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBub29wKCkge1xuXHRyZXR1cm4gXCJcIjtcbn1cblxuZnVuY3Rpb24gZGJnQnJlYWsodmFsKSB7XG5cdC8vIFVzYWdlIGV4YW1wbGVzOiB7e2RiZzouLi59fSwge3s6fmRiZyguLi4pfX0sIHt7ZGJnIC4uLi99fSwge157Zm9yIC4uLiBvbkFmdGVyTGluaz1+ZGJnfX0gZXRjLlxuXHR0cnkge1xuXHRcdGNvbnNvbGUubG9nKFwiSnNSZW5kZXIgZGJnIGJyZWFrcG9pbnQ6IFwiICsgdmFsKTtcblx0XHR0aHJvdyBcImRiZyBicmVha3BvaW50XCI7IC8vIFRvIGJyZWFrIGhlcmUsIHN0b3Agb24gY2F1Z2h0IGV4Y2VwdGlvbnMuXG5cdH1cblx0Y2F0Y2ggKGUpIHt9XG5cdHJldHVybiB0aGlzLmJhc2UgPyB0aGlzLmJhc2VBcHBseShhcmd1bWVudHMpIDogdmFsO1xufVxuXG5mdW5jdGlvbiBKc1ZpZXdzRXJyb3IobWVzc2FnZSkge1xuXHQvLyBFcnJvciBleGNlcHRpb24gdHlwZSBmb3IgSnNWaWV3cy9Kc1JlbmRlclxuXHQvLyBPdmVycmlkZSBvZiAkLnZpZXdzLnN1Yi5FcnJvciBpcyBwb3NzaWJsZVxuXHR0aGlzLm5hbWUgPSAoJC5saW5rID8gXCJKc1ZpZXdzXCIgOiBcIkpzUmVuZGVyXCIpICsgXCIgRXJyb3JcIjtcblx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCB0aGlzLm5hbWU7XG59XG5cbmZ1bmN0aW9uICRleHRlbmQodGFyZ2V0LCBzb3VyY2UpIHtcblx0Zm9yICh2YXIgbmFtZSBpbiBzb3VyY2UpIHtcblx0XHR0YXJnZXRbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG5cdH1cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuKEpzVmlld3NFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKSkuY29uc3RydWN0b3IgPSBKc1ZpZXdzRXJyb3I7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PT09PT1cbi8vIHZpZXdzLmRlbGltaXRlcnNcbi8vPT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiAkdmlld3NEZWxpbWl0ZXJzKG9wZW5DaGFycywgY2xvc2VDaGFycywgbGluaykge1xuXHQvLyBTZXQgdGhlIHRhZyBvcGVuaW5nIGFuZCBjbG9zaW5nIGRlbGltaXRlcnMgYW5kICdsaW5rJyBjaGFyYWN0ZXIuIERlZmF1bHQgaXMgXCJ7e1wiLCBcIn19XCIgYW5kIFwiXlwiXG5cdC8vIG9wZW5DaGFycywgY2xvc2VDaGFyczogb3BlbmluZyBhbmQgY2xvc2luZyBzdHJpbmdzLCBlYWNoIHdpdGggdHdvIGNoYXJhY3RlcnNcblx0aWYgKCFvcGVuQ2hhcnMpIHtcblx0XHRyZXR1cm4gJHN1YlNldHRpbmdzLmRlbGltaXRlcnM7XG5cdH1cblx0aWYgKCRpc0FycmF5KG9wZW5DaGFycykpIHtcblx0XHRyZXR1cm4gJHZpZXdzRGVsaW1pdGVycy5hcHBseSgkdmlld3MsIG9wZW5DaGFycyk7XG5cdH1cblxuXHQkc3ViU2V0dGluZ3MuZGVsaW1pdGVycyA9IFtvcGVuQ2hhcnMsIGNsb3NlQ2hhcnMsIGxpbmtDaGFyID0gbGluayA/IGxpbmsuY2hhckF0KDApIDogbGlua0NoYXJdO1xuXG5cdGRlbGltT3BlbkNoYXIwID0gb3BlbkNoYXJzLmNoYXJBdCgwKTsgLy8gRXNjYXBlIHRoZSBjaGFyYWN0ZXJzIC0gc2luY2UgdGhleSBjb3VsZCBiZSByZWdleCBzcGVjaWFsIGNoYXJhY3RlcnNcblx0ZGVsaW1PcGVuQ2hhcjEgPSBvcGVuQ2hhcnMuY2hhckF0KDEpO1xuXHRkZWxpbUNsb3NlQ2hhcjAgPSBjbG9zZUNoYXJzLmNoYXJBdCgwKTtcblx0ZGVsaW1DbG9zZUNoYXIxID0gY2xvc2VDaGFycy5jaGFyQXQoMSk7XG5cdG9wZW5DaGFycyA9IFwiXFxcXFwiICsgZGVsaW1PcGVuQ2hhcjAgKyBcIihcXFxcXCIgKyBsaW5rQ2hhciArIFwiKT9cXFxcXCIgKyBkZWxpbU9wZW5DaGFyMTsgLy8gRGVmYXVsdCBpcyBcIntee1wiXG5cdGNsb3NlQ2hhcnMgPSBcIlxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIxOyAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFwifX1cIlxuXHQvLyBCdWlsZCByZWdleCB3aXRoIG5ldyBkZWxpbWl0ZXJzXG5cdC8vICAgICAgICAgIFt0YWcgICAgKGZvbGxvd2VkIGJ5IC8gc3BhY2Ugb3IgfSkgIG9yIGN2dHIrY29sb24gb3IgaHRtbCBvciBjb2RlXSBmb2xsb3dlZCBieSBzcGFjZStwYXJhbXMgdGhlbiBjb252ZXJ0QmFjaz9cblx0clRhZyA9IFwiKD86KFxcXFx3Kyg/PVtcXFxcL1xcXFxzXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCJdKSl8KFxcXFx3Kyk/KDopfCg+KXwoXFxcXCopKVxcXFxzKigoPzpbXlxcXFxcIlxuXHRcdCsgZGVsaW1DbG9zZUNoYXIwICsgXCJdfFxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiKD8hXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIxICsgXCIpKSo/KVwiO1xuXG5cdC8vIE1ha2UgclRhZyBhdmFpbGFibGUgdG8gSnNWaWV3cyAob3Igb3RoZXIgY29tcG9uZW50cykgZm9yIHBhcnNpbmcgYmluZGluZyBleHByZXNzaW9uc1xuXHQkc3ViLnJUYWcgPSBcIig/OlwiICsgclRhZyArIFwiKVwiO1xuXHQvLyAgICAgICAgICAgICAgICAgICAgICAgIHsgXj8geyAgIHRhZytwYXJhbXMgc2xhc2g/ICBvciBjbG9zaW5nVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgY29tbWVudFxuXHRyVGFnID0gbmV3IFJlZ0V4cChcIig/OlwiICsgb3BlbkNoYXJzICsgclRhZyArIFwiKFxcXFwvKT98XFxcXFwiICsgZGVsaW1PcGVuQ2hhcjAgKyBcIihcXFxcXCIgKyBsaW5rQ2hhciArIFwiKT9cXFxcXCIgKyBkZWxpbU9wZW5DaGFyMSArIFwiKD86KD86XFxcXC8oXFxcXHcrKSlcXFxccyp8IS0tW1xcXFxzXFxcXFNdKj8tLSkpXCIgKyBjbG9zZUNoYXJzLCBcImdcIik7XG5cblx0Ly8gRGVmYXVsdDogIGJpbmQgICAgIHRhZ05hbWUgICAgICAgICBjdnQgICBjbG4gaHRtbCBjb2RlICAgIHBhcmFtcyAgICAgICAgICAgIHNsYXNoICAgYmluZDIgICAgICAgICBjbG9zZUJsayAgY29tbWVudFxuXHQvLyAgICAgIC8oPzp7KFxcXik/eyg/OihcXHcrKD89W1xcL1xcc31dKSl8KFxcdyspPyg6KXwoPil8KFxcKikpXFxzKigoPzpbXn1dfH0oPyF9KSkqPykoXFwvKT98eyhcXF4pP3soPzooPzpcXC8oXFx3KykpXFxzKnwhLS1bXFxzXFxTXSo/LS0pKX19XG5cblx0JHN1Yi5yVG1wbCA9IG5ldyBSZWdFeHAoXCI8Lio+fChbXlxcXFxcXFxcXXxeKVt7fV18XCIgKyBvcGVuQ2hhcnMgKyBcIi4qXCIgKyBjbG9zZUNoYXJzKTtcblx0Ly8gJHN1Yi5yVG1wbCBsb29rcyBmb3IgaHRtbCB0YWdzIG9yIHsgb3IgfSBjaGFyIG5vdCBwcmVjZWRlZCBieSBcXFxcLCBvciBKc1JlbmRlciB0YWdzIHt7eHh4fX0uIEVhY2ggb2YgdGhlc2Ugc3RyaW5ncyBhcmUgY29uc2lkZXJlZFxuXHQvLyBOT1QgdG8gYmUgalF1ZXJ5IHNlbGVjdG9yc1xuXHRyZXR1cm4gJHZpZXdzU2V0dGluZ3M7XG59XG5cbi8vPT09PT09PT09XG4vLyBWaWV3LmdldFxuLy89PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0Vmlldyhpbm5lciwgdHlwZSkgeyAvL3ZpZXcuZ2V0KGlubmVyLCB0eXBlKVxuXHRpZiAoIXR5cGUgJiYgaW5uZXIgIT09IHRydWUpIHtcblx0XHQvLyB2aWV3LmdldCh0eXBlKVxuXHRcdHR5cGUgPSBpbm5lcjtcblx0XHRpbm5lciA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdHZhciB2aWV3cywgaSwgbCwgZm91bmQsXG5cdFx0dmlldyA9IHRoaXMsXG5cdFx0cm9vdCA9ICF0eXBlIHx8IHR5cGUgPT09IFwicm9vdFwiO1xuXHRcdC8vIElmIHR5cGUgaXMgdW5kZWZpbmVkLCByZXR1cm5zIHJvb3QgdmlldyAodmlldyB1bmRlciB0b3AgdmlldykuXG5cblx0aWYgKGlubmVyKSB7XG5cdFx0Ly8gR28gdGhyb3VnaCB2aWV3cyAtIHRoaXMgb25lLCBhbmQgYWxsIG5lc3RlZCBvbmVzLCBkZXB0aC1maXJzdCAtIGFuZCByZXR1cm4gZmlyc3Qgb25lIHdpdGggZ2l2ZW4gdHlwZS5cblx0XHQvLyBJZiB0eXBlIGlzIHVuZGVmaW5lZCwgaS5lLiB2aWV3LmdldCh0cnVlKSwgcmV0dXJuIGZpcnN0IGNoaWxkIHZpZXcuXG5cdFx0Zm91bmQgPSB0eXBlICYmIHZpZXcudHlwZSA9PT0gdHlwZSAmJiB2aWV3O1xuXHRcdGlmICghZm91bmQpIHtcblx0XHRcdHZpZXdzID0gdmlldy52aWV3cztcblx0XHRcdGlmICh2aWV3Ll8udXNlS2V5KSB7XG5cdFx0XHRcdGZvciAoaSBpbiB2aWV3cykge1xuXHRcdFx0XHRcdGlmIChmb3VuZCA9IHR5cGUgPyB2aWV3c1tpXS5nZXQoaW5uZXIsIHR5cGUpIDogdmlld3NbaV0pIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IHZpZXdzLmxlbmd0aDsgIWZvdW5kICYmIGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRmb3VuZCA9IHR5cGUgPyB2aWV3c1tpXS5nZXQoaW5uZXIsIHR5cGUpIDogdmlld3NbaV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAocm9vdCkge1xuXHRcdC8vIEZpbmQgcm9vdCB2aWV3LiAodmlldyB3aG9zZSBwYXJlbnQgaXMgdG9wIHZpZXcpXG5cdFx0d2hpbGUgKHZpZXcucGFyZW50KSB7XG5cdFx0XHRmb3VuZCA9IHZpZXc7XG5cdFx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHdoaWxlICh2aWV3ICYmICFmb3VuZCkge1xuXHRcdFx0Ly8gR28gdGhyb3VnaCB2aWV3cyAtIHRoaXMgb25lLCBhbmQgYWxsIHBhcmVudCBvbmVzIC0gYW5kIHJldHVybiBmaXJzdCBvbmUgd2l0aCBnaXZlbiB0eXBlLlxuXHRcdFx0Zm91bmQgPSB2aWV3LnR5cGUgPT09IHR5cGUgPyB2aWV3IDogdW5kZWZpbmVkO1xuXHRcdFx0dmlldyA9IHZpZXcucGFyZW50O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZm91bmQ7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZEluZGV4KCkge1xuXHR2YXIgdmlldyA9IHRoaXMuZ2V0KFwiaXRlbVwiKTtcblx0cmV0dXJuIHZpZXcgPyB2aWV3LmluZGV4IDogdW5kZWZpbmVkO1xufVxuXG5nZXROZXN0ZWRJbmRleC5kZXBlbmRzID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBbdGhpcy5nZXQoXCJpdGVtXCIpLCBcImluZGV4XCJdO1xufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXgoKSB7XG5cdHJldHVybiB0aGlzLmluZGV4O1xufVxuXG5nZXRJbmRleC5kZXBlbmRzID0gXCJpbmRleFwiO1xuXG4vLz09PT09PT09PT1cbi8vIFZpZXcuaGxwXG4vLz09PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0SGVscGVyKGhlbHBlciwgaXNDb250ZXh0Q2IpIHtcblx0Ly8gSGVscGVyIG1ldGhvZCBjYWxsZWQgYXMgdmlldy5obHAoa2V5KSBmcm9tIGNvbXBpbGVkIHRlbXBsYXRlLCBmb3IgaGVscGVycyBvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIH5mb29cblx0dmFyIHdyYXBwZWQsIGRlcHMsXG5cdHZpZXcgPSB0aGlzLFxuXHRyZXMgPSB2aWV3LmN0eDtcblxuXHRpZiAocmVzKSB7XG5cdFx0cmVzID0gcmVzW2hlbHBlcl07XG5cdH1cblx0aWYgKHJlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmVzID0gJGhlbHBlcnNbaGVscGVyXTtcblx0fVxuXHRpZiAocmVzICYmIHJlcy5fY3ApIHsgLy8gSWYgdGhpcyBoZWxwZXIgcmVzb3VyY2UgaXMgYSBjb250ZXh0dWFsIHBhcmFtZXRlciwgfmZvbz1leHByXG5cdFx0aWYgKGlzQ29udGV4dENiKSB7IC8vIEluIGEgY29udGV4dCBjYWxsYmFjayBmb3IgYSBjb250ZXh0dWFsIHBhcmFtLCByZXR1cm4gdGhlIFtjdXJyZW50RGF0YSwgZGVwZW5kZW5jaWVzLi4uXSBhcnJheSAtIG5lZWRlZCBmb3Igb2JzZXJ2ZSBjYWxsXG5cdFx0XHRkZXBzID0gJHN1Yi5fY2VvKHJlc1sxXS5kZXBzKTsgIC8vIGZuIGRlcHMsIHdpdGggYW55IGV4cHJPYnMgY2xvbmVkXG5cdFx0XHRkZXBzLnVuc2hpZnQocmVzWzBdLmRhdGEpOyAgICAgIC8vIHZpZXcuZGF0YVxuXHRcdFx0ZGVwcy5fY3AgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIGRlcHM7XG5cdFx0fVxuXHRcdHJlcyA9ICR2aWV3cy5nZXRDdHgocmVzKTsgLy8gSWYgYSBjb250ZXh0dWFsIHBhcmFtLCBidXQgbm90IGEgY29udGV4dCBjYWxsYmFjaywgcmV0dXJuIGV2YWx1YXRlZCBwYXJhbSAtIGZuKGRhdGEsIHZpZXcsIGopXG5cdH1cblxuXHRpZiAocmVzKSB7XG5cdFx0aWYgKCRpc0Z1bmN0aW9uKHJlcykgJiYgIXJlcy5fd3JwKSB7XG5cdFx0XHQvLyBJZiBpdCBpcyBvZiB0eXBlIGZ1bmN0aW9uLCBhbmQgbm90IGFscmVhZHkgd3JhcHBlZCwgd2Ugd2lsbCB3cmFwIGl0LCBzbyBpZiBjYWxsZWQgd2l0aCBubyB0aGlzIHBvaW50ZXIgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcblx0XHRcdC8vIHZpZXcgYXMgJ3RoaXMnIGNvbnRleHQuIElmIHRoZSBoZWxwZXIgfmZvbygpIHdhcyBpbiBhIGRhdGEtbGluayBleHByZXNzaW9uLCB0aGUgdmlldyB3aWxsIGhhdmUgYSAndGVtcG9yYXJ5JyBsaW5rQ3R4IHByb3BlcnR5IHRvby5cblx0XHRcdC8vIE5vdGUgdGhhdCBoZWxwZXIgZnVuY3Rpb25zIG9uIGRlZXBlciBwYXRocyB3aWxsIGhhdmUgc3BlY2lmaWMgdGhpcyBwb2ludGVycywgZnJvbSB0aGUgcHJlY2VkaW5nIHBhdGguXG5cdFx0XHQvLyBGb3IgZXhhbXBsZSwgfnV0aWwuZm9vKCkgd2lsbCBoYXZlIHRoZSB+dXRpbCBvYmplY3QgYXMgJ3RoaXMnIHBvaW50ZXJcblx0XHRcdHdyYXBwZWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHJlcy5hcHBseSgoIXRoaXMgfHwgdGhpcyA9PT0gZ2xvYmFsKSA/IHZpZXcgOiB0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcblx0XHRcdHdyYXBwZWQuX3dycCA9IHZpZXc7XG5cdFx0XHQkZXh0ZW5kKHdyYXBwZWQsIHJlcyk7IC8vIEF0dGFjaCBzYW1lIGV4cGFuZG9zIChpZiBhbnkpIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uXG5cdFx0fVxuXHR9XG5cdHJldHVybiB3cmFwcGVkIHx8IHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0VGVtcGxhdGUodG1wbCkge1xuXHRyZXR1cm4gdG1wbCAmJiAodG1wbC5mblxuXHRcdD8gdG1wbFxuXHRcdDogdGhpcy5nZXRSc2MoXCJ0ZW1wbGF0ZXNcIiwgdG1wbCkgfHwgJHRlbXBsYXRlcyh0bXBsKSk7IC8vIG5vdCB5ZXQgY29tcGlsZWRcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gdmlld3MuX2NudnRcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29udmVydFZhbChjb252ZXJ0ZXIsIHZpZXcsIHRhZ0N0eCwgb25FcnJvcikge1xuXHQvLyBzZWxmIGlzIHRlbXBsYXRlIG9iamVjdCBvciBsaW5rQ3R4IG9iamVjdFxuXHR2YXIgdGFnLCB2YWx1ZSxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhcblx0XHRib3VuZFRhZyA9IHR5cGVvZiB0YWdDdHggPT09IFwibnVtYmVyXCIgJiYgdmlldy50bXBsLmJuZHNbdGFnQ3R4LTFdLFxuXHRcdGxpbmtDdHggPSB2aWV3LmxpbmtDdHg7IC8vIEZvciBkYXRhLWxpbms9XCJ7Y3Z0Oi4uLn1cIi4uLlxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YWdDdHggPSBvbkVycm9yID0ge3Byb3BzOiB7fSwgYXJnczogW29uRXJyb3JdfTtcblx0fSBlbHNlIGlmIChib3VuZFRhZykge1xuXHRcdHRhZ0N0eCA9IGJvdW5kVGFnKHZpZXcuZGF0YSwgdmlldywgJHN1Yik7XG5cdH1cblxuXHR2YWx1ZSA9IHRhZ0N0eC5hcmdzWzBdO1xuXHRpZiAoY29udmVydGVyIHx8IGJvdW5kVGFnKSB7XG5cdFx0dGFnID0gbGlua0N0eCAmJiBsaW5rQ3R4LnRhZztcblx0XHRpZiAoIXRhZykge1xuXHRcdFx0dGFnID0gJGV4dGVuZChuZXcgJHN1Yi5fdGcoKSwge1xuXHRcdFx0XHRfOiB7XG5cdFx0XHRcdFx0aW5saW5lOiAhbGlua0N0eCxcblx0XHRcdFx0XHRibmQ6IGJvdW5kVGFnLFxuXHRcdFx0XHRcdHVubGlua2VkOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRhZ05hbWU6IFwiOlwiLFxuXHRcdFx0XHRjdnQ6IGNvbnZlcnRlcixcblx0XHRcdFx0ZmxvdzogdHJ1ZSxcblx0XHRcdFx0dGFnQ3R4OiB0YWdDdHhcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0bGlua0N0eC50YWcgPSB0YWc7XG5cdFx0XHRcdHRhZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdH1cblx0XHRcdHRhZ0N0eC5jdHggPSBleHRlbmRDdHgodGFnQ3R4LmN0eCwgKGxpbmtDdHggPyBsaW5rQ3R4LnZpZXcgOiB2aWV3KS5jdHgpO1xuXHRcdH1cblx0XHR0YWcuX2VyID0gb25FcnJvciAmJiB2YWx1ZTtcblx0XHR0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eCk7XG5cblx0XHR0YWdDdHgudmlldyA9IHZpZXc7XG5cblx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eCB8fCB0YWcuY3R4IHx8IHt9O1xuXHRcdHRhZ0N0eC5jdHggPSB1bmRlZmluZWQ7XG5cblx0XHR2YWx1ZSA9IHRhZy5jdnRBcmdzKGNvbnZlcnRlciAhPT0gXCJ0cnVlXCIgJiYgY29udmVydGVyKVswXTsgLy8gSWYgdGhlcmUgaXMgYSBjb252ZXJ0QmFjayBidXQgbm8gY29udmVydCwgY29udmVydGVyIHdpbGwgYmUgXCJ0cnVlXCJcblxuXHRcdC8vIENhbGwgb25SZW5kZXIgKHVzZWQgYnkgSnNWaWV3cyBpZiBwcmVzZW50LCB0byBhZGQgYmluZGluZyBhbm5vdGF0aW9ucyBhcm91bmQgcmVuZGVyZWQgY29udGVudClcblx0XHR2YWx1ZSA9IGJvdW5kVGFnICYmIHZpZXcuXy5vblJlbmRlclxuXHRcdFx0PyB2aWV3Ll8ub25SZW5kZXIodmFsdWUsIHZpZXcsIHRhZylcblx0XHRcdDogdmFsdWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9IHVuZGVmaW5lZCA/IHZhbHVlIDogXCJcIjtcbn1cblxuZnVuY3Rpb24gY29udmVydEFyZ3MoY29udmVydGVyKSB7XG5cdHZhciB0YWcgPSB0aGlzLFxuXHRcdHRhZ0N0eCA9IHRhZy50YWdDdHgsXG5cdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdGFyZ3MgPSB0YWdDdHguYXJncztcblxuXHRjb252ZXJ0ZXIgPSBjb252ZXJ0ZXIgfHwgdGFnLmNvbnZlcnQ7XG5cdGNvbnZlcnRlciA9IGNvbnZlcnRlciAmJiAoXCJcIiArIGNvbnZlcnRlciA9PT0gY29udmVydGVyXG5cdFx0PyAodmlldy5nZXRSc2MoXCJjb252ZXJ0ZXJzXCIsIGNvbnZlcnRlcikgfHwgZXJyb3IoXCJVbmtub3duIGNvbnZlcnRlcjogJ1wiICsgY29udmVydGVyICsgXCInXCIpKVxuXHRcdDogY29udmVydGVyKTtcblxuXHRhcmdzID0gIWFyZ3MubGVuZ3RoICYmICF0YWdDdHguaW5kZXggLy8gT24gdGhlIG9wZW5pbmcgdGFnIHdpdGggbm8gYXJncywgYmluZCB0byB0aGUgY3VycmVudCBkYXRhIGNvbnRleHRcblx0XHQ/IFt2aWV3LmRhdGFdXG5cdFx0OiBjb252ZXJ0ZXJcblx0XHRcdD8gYXJncy5zbGljZSgpIC8vIElmIHRoZXJlIGlzIGEgY29udmVydGVyLCB1c2UgYSBjb3B5IG9mIHRoZSB0YWdDdHguYXJncyBhcnJheSBmb3IgcmVuZGVyaW5nLCBhbmQgcmVwbGFjZSB0aGUgYXJnc1swXSBpblxuXHRcdFx0Ly8gdGhlIGNvcGllZCBhcnJheSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUuIEJ1dCB3ZSBkbyBub3QgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0YWcudGFnQ3R4LmFyZ3NbMF0gKHRoZSBvcmlnaW5hbCBhcmdzIGFycmF5KVxuXHRcdFx0OiBhcmdzOyAvLyBJZiBubyBjb252ZXJ0ZXIsIGdldCB0aGUgb3JpZ2luYWwgdGFnQ3R4LmFyZ3NcblxuXHRpZiAoY29udmVydGVyKSB7XG5cdFx0aWYgKGNvbnZlcnRlci5kZXBlbmRzKSB7XG5cdFx0XHR0YWcuZGVwZW5kcyA9ICRzdWIuZ2V0RGVwcyh0YWcuZGVwZW5kcywgdGFnLCBjb252ZXJ0ZXIuZGVwZW5kcywgY29udmVydGVyKTtcblx0XHR9XG5cdFx0YXJnc1swXSA9IGNvbnZlcnRlci5hcHBseSh0YWcsIGFyZ3MpO1xuXHR9XG5cdHJldHVybiBhcmdzO1xufVxuXG4vLz09PT09PT09PT09PT1cbi8vIHZpZXdzLl90YWdcbi8vPT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZVR5cGUsIGl0ZW1OYW1lKSB7XG5cdHZhciByZXMsIHN0b3JlLFxuXHRcdHZpZXcgPSB0aGlzO1xuXHR3aGlsZSAoKHJlcyA9PT0gdW5kZWZpbmVkKSAmJiB2aWV3KSB7XG5cdFx0c3RvcmUgPSB2aWV3LnRtcGwgJiYgdmlldy50bXBsW3Jlc291cmNlVHlwZV07XG5cdFx0cmVzID0gc3RvcmUgJiYgc3RvcmVbaXRlbU5hbWVdO1xuXHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0fVxuXHRyZXR1cm4gcmVzIHx8ICR2aWV3c1tyZXNvdXJjZVR5cGVdW2l0ZW1OYW1lXTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyVGFnKHRhZ05hbWUsIHBhcmVudFZpZXcsIHRtcGwsIHRhZ0N0eHMsIGlzVXBkYXRlLCBvbkVycm9yKSB7XG5cdHBhcmVudFZpZXcgPSBwYXJlbnRWaWV3IHx8IHRvcFZpZXc7XG5cdHZhciB0YWcsIHRhZ18sIHRhZ0RlZiwgdGVtcGxhdGUsIHRhZ3MsIGF0dHIsIHBhcmVudFRhZywgaSwgbCwgaXRlbVJldCwgdGFnQ3R4LCB0YWdDdHhDdHgsXG5cdFx0Y29udGVudCwgY2FsbEluaXQsIG1hcERlZiwgdGhpc01hcCwgYXJncywgcHJvcHMsIGluaXRpYWxUbXBsLCB0YWdEYXRhTWFwLCBjb250ZW50Q3R4LFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0bGlua0N0eCA9IHBhcmVudFZpZXcubGlua0N0eCB8fCAwLFxuXHRcdGN0eCA9IHBhcmVudFZpZXcuY3R4LFxuXHRcdHBhcmVudFRtcGwgPSB0bXBsIHx8IHBhcmVudFZpZXcudG1wbCxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhzXG5cdFx0Ym91bmRUYWcgPSB0eXBlb2YgdGFnQ3R4cyA9PT0gXCJudW1iZXJcIiAmJiBwYXJlbnRWaWV3LnRtcGwuYm5kc1t0YWdDdHhzLTFdO1xuXG5cdGlmICh0YWdOYW1lLl9pcyA9PT0gXCJ0YWdcIikge1xuXHRcdHRhZyA9IHRhZ05hbWU7XG5cdFx0dGFnTmFtZSA9IHRhZy50YWdOYW1lO1xuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cztcblx0XHR0ZW1wbGF0ZSA9IHRhZy50ZW1wbGF0ZTtcblx0fSBlbHNlIHtcblx0XHR0YWdEZWYgPSBwYXJlbnRWaWV3LmdldFJzYyhcInRhZ3NcIiwgdGFnTmFtZSkgfHwgZXJyb3IoXCJVbmtub3duIHRhZzoge3tcIiArIHRhZ05hbWUgKyBcIn19IFwiKTtcblx0XHR0ZW1wbGF0ZSA9IHRhZ0RlZi50ZW1wbGF0ZTtcblx0fVxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXQgKz0gb25FcnJvcjtcblx0XHR0YWdDdHhzID0gb25FcnJvciA9IFt7cHJvcHM6IHt9LCBhcmdzOiBbXX1dO1xuXHR9IGVsc2UgaWYgKGJvdW5kVGFnKSB7XG5cdFx0dGFnQ3R4cyA9IGJvdW5kVGFnKHBhcmVudFZpZXcuZGF0YSwgcGFyZW50VmlldywgJHN1Yik7XG5cdH1cblxuXHRsID0gdGFnQ3R4cy5sZW5ndGg7XG5cdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHR0YWdDdHggPSB0YWdDdHhzW2ldO1xuXHRcdGlmICghbGlua0N0eCB8fCAhbGlua0N0eC50YWcgfHwgaSAmJiAhbGlua0N0eC50YWcuXy5pbmxpbmUgfHwgdGFnLl9lcikge1xuXHRcdFx0Ly8gSW5pdGlhbGl6ZSB0YWdDdHhcblx0XHRcdC8vIEZvciBibG9jayB0YWdzLCB0YWdDdHgudG1wbCBpcyBhbiBpbnRlZ2VyID4gMFxuXHRcdFx0aWYgKGNvbnRlbnQgPSBwYXJlbnRUbXBsLnRtcGxzICYmIHRhZ0N0eC50bXBsKSB7XG5cdFx0XHRcdGNvbnRlbnQgPSB0YWdDdHguY29udGVudCA9IHBhcmVudFRtcGwudG1wbHNbY29udGVudCAtIDFdO1xuXHRcdFx0fVxuXHRcdFx0dGFnQ3R4LmluZGV4ID0gaTtcblx0XHRcdHRhZ0N0eC50bXBsID0gY29udGVudDsgLy8gU2V0IHRoZSB0bXBsIHByb3BlcnR5IHRvIHRoZSBjb250ZW50IG9mIHRoZSBibG9jayB0YWdcblx0XHRcdHRhZ0N0eC5yZW5kZXIgPSByZW5kZXJDb250ZW50O1xuXHRcdFx0dGFnQ3R4LnZpZXcgPSBwYXJlbnRWaWV3O1xuXHRcdFx0dGFnQ3R4LmN0eCA9IGV4dGVuZEN0eCh0YWdDdHguY3R4LCBjdHgpOyAvLyBDbG9uZSBhbmQgZXh0ZW5kIHBhcmVudFZpZXcuY3R4XG5cdFx0fVxuXHRcdGlmICh0bXBsID0gdGFnQ3R4LnByb3BzLnRtcGwpIHtcblx0XHRcdC8vIElmIHRoZSB0bXBsIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4sIHNldCB0aGUgdmFsdWUgKHdoZW4gaW5pdGlhbGl6aW5nLCBvciwgaW4gY2FzZSBvZiBiaW5kaW5nOiBedG1wbD0uLi4sIHdoZW4gdXBkYXRpbmcpXG5cdFx0XHR0YWdDdHgudG1wbCA9IHBhcmVudFZpZXcuZ2V0VG1wbCh0bXBsKTtcblx0XHR9XG5cblx0XHRpZiAoIXRhZykge1xuXHRcdFx0Ly8gVGhpcyB3aWxsIG9ubHkgYmUgaGl0IGZvciBpbml0aWFsIHRhZ0N0eCAobm90IGZvciB7e2Vsc2V9fSkgLSBpZiB0aGUgdGFnIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0IHlldFxuXHRcdFx0Ly8gSW5zdGFudGlhdGUgdGFnIGlmIGl0IGRvZXMgbm90IHlldCBleGlzdFxuXHRcdFx0Ly8gSWYgdGhlIHRhZyBoYXMgbm90IGFscmVhZHkgYmVlbiBpbnN0YW50aWF0ZWQsIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGluc3RhbmNlLlxuXHRcdFx0Ly8gfnRhZyB3aWxsIGFjY2VzcyB0aGUgdGFnLCBldmVuIHdpdGhpbiB0aGUgcmVuZGVyaW5nIG9mIHRoZSB0ZW1wbGF0ZSBjb250ZW50IG9mIHRoaXMgdGFnLlxuXHRcdFx0Ly8gRnJvbSBjaGlsZC9kZXNjZW5kYW50IHRhZ3MsIGNhbiBhY2Nlc3MgdXNpbmcgfnRhZy5wYXJlbnQsIG9yIH5wYXJlbnRUYWdzLnRhZ05hbWVcblx0XHRcdHRhZyA9IG5ldyB0YWdEZWYuX2N0cigpO1xuXHRcdFx0Y2FsbEluaXQgPSAhIXRhZy5pbml0O1xuXG5cdFx0XHR0YWcucGFyZW50ID0gcGFyZW50VGFnID0gY3R4ICYmIGN0eC50YWc7XG5cdFx0XHR0YWcudGFnQ3R4cyA9IHRhZ0N0eHM7XG5cdFx0XHR0YWdEYXRhTWFwID0gdGFnLmRhdGFNYXA7XG5cblx0XHRcdGlmIChsaW5rQ3R4KSB7XG5cdFx0XHRcdHRhZy5fLmlubGluZSA9IGZhbHNlO1xuXHRcdFx0XHRsaW5rQ3R4LnRhZyA9IHRhZztcblx0XHRcdFx0dGFnLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZy5fLmJuZCA9IGJvdW5kVGFnIHx8IGxpbmtDdHguZm4pIHtcblx0XHRcdFx0Ly8gQm91bmQgaWYge157dGFnLi4ufX0gb3IgZGF0YS1saW5rPVwie3RhZy4uLn1cIlxuXHRcdFx0XHR0YWcuXy5hcnJWd3MgPSB7fTtcblx0XHRcdH0gZWxzZSBpZiAodGFnLmRhdGFCb3VuZE9ubHkpIHtcblx0XHRcdFx0ZXJyb3IoXCJ7XntcIiArIHRhZ05hbWUgKyBcIn19IHRhZyBtdXN0IGJlIGRhdGEtYm91bmRcIik7XG5cdFx0XHR9XG5cdFx0XHQvL1RPRE8gYmV0dGVyIHBlcmYgZm9yIGNoaWxkVGFncygpIC0ga2VlcCBjaGlsZCB0YWcudGFncyBhcnJheSwgKGFuZCByZW1vdmUgY2hpbGQsIHdoZW4gZGlzcG9zZWQpXG5cdFx0XHQvLyB0YWcudGFncyA9IFtdO1xuXHRcdH1cblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHM7XG5cdFx0dGFnRGF0YU1hcCA9IHRhZy5kYXRhTWFwO1xuXG5cdFx0dGFnQ3R4LnRhZyA9IHRhZztcblx0XHRpZiAodGFnRGF0YU1hcCAmJiB0YWdDdHhzKSB7XG5cdFx0XHR0YWdDdHgubWFwID0gdGFnQ3R4c1tpXS5tYXA7IC8vIENvcHkgb3ZlciB0aGUgY29tcGlsZWQgbWFwIGluc3RhbmNlIGZyb20gdGhlIHByZXZpb3VzIHRhZ0N0eHMgdG8gdGhlIHJlZnJlc2hlZCBvbmVzXG5cdFx0fVxuXHRcdGlmICghdGFnLmZsb3cpIHtcblx0XHRcdHRhZ0N0eEN0eCA9IHRhZ0N0eC5jdHggPSB0YWdDdHguY3R4IHx8IHt9O1xuXG5cdFx0XHQvLyB0YWdzIGhhc2g6IHRhZy5jdHgudGFncywgbWVyZ2VkIHdpdGggcGFyZW50Vmlldy5jdHgudGFncyxcblx0XHRcdHRhZ3MgPSB0YWcucGFyZW50cyA9IHRhZ0N0eEN0eC5wYXJlbnRUYWdzID0gY3R4ICYmIGV4dGVuZEN0eCh0YWdDdHhDdHgucGFyZW50VGFncywgY3R4LnBhcmVudFRhZ3MpIHx8IHt9O1xuXHRcdFx0aWYgKHBhcmVudFRhZykge1xuXHRcdFx0XHR0YWdzW3BhcmVudFRhZy50YWdOYW1lXSA9IHBhcmVudFRhZztcblx0XHRcdFx0Ly9UT0RPIGJldHRlciBwZXJmIGZvciBjaGlsZFRhZ3M6IHBhcmVudFRhZy50YWdzLnB1c2godGFnKTtcblx0XHRcdH1cblx0XHRcdHRhZ3NbdGFnLnRhZ05hbWVdID0gdGFnQ3R4Q3R4LnRhZyA9IHRhZztcblx0XHR9XG5cdH1cblx0aWYgKCEodGFnLl9lciA9IG9uRXJyb3IpKSB7XG5cdFx0dGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHhzWzBdKTtcblx0XHR0YWcucmVuZGVyaW5nID0ge307IC8vIFByb3ZpZGUgb2JqZWN0IGZvciBzdGF0ZSBkdXJpbmcgcmVuZGVyIGNhbGxzIHRvIHRhZyBhbmQgZWxzZXMuIChVc2VkIGJ5IHt7aWZ9fSBhbmQge3tmb3J9fS4uLilcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR0YWdDdHggPSB0YWcudGFnQ3R4ID0gdGFnQ3R4c1tpXTtcblx0XHRcdHByb3BzID0gdGFnQ3R4LnByb3BzO1xuXHRcdFx0YXJncyA9IHRhZy5jdnRBcmdzKCk7XG5cblx0XHRcdGlmIChtYXBEZWYgPSBwcm9wcy5kYXRhTWFwIHx8IHRhZ0RhdGFNYXApIHtcblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoIHx8IHByb3BzLmRhdGFNYXApIHtcblx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcDtcblx0XHRcdFx0XHRpZiAoIXRoaXNNYXAgfHwgdGhpc01hcC5zcmMgIT09IGFyZ3NbMF0gfHwgaXNVcGRhdGUpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzTWFwICYmIHRoaXNNYXAuc3JjKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXNNYXAudW5tYXAoKTsgLy8gb25seSBjYWxsZWQgaWYgb2JzZXJ2YWJsZSBtYXAgLSBub3Qgd2hlbiBvbmx5IHVzZWQgaW4gSnNSZW5kZXIsIGUuZy4gYnkge3twcm9wc319XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcCA9IG1hcERlZi5tYXAoYXJnc1swXSwgcHJvcHMsIHVuZGVmaW5lZCwgIXRhZy5fLmJuZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFyZ3MgPSBbdGhpc01hcC50Z3RdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eDtcblxuXHRcdFx0aWYgKCFpKSB7XG5cdFx0XHRcdGlmIChjYWxsSW5pdCkge1xuXHRcdFx0XHRcdGluaXRpYWxUbXBsID0gdGFnLnRlbXBsYXRlO1xuXHRcdFx0XHRcdHRhZy5pbml0KHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCk7XG5cdFx0XHRcdFx0Y2FsbEluaXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0XHQvLyBTZXQgYXR0ciBvbiBsaW5rQ3R4IHRvIGVuc3VyZSBvdXRwdXR0aW5nIHRvIHRoZSBjb3JyZWN0IHRhcmdldCBhdHRyaWJ1dGUuXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyBlaXRoZXIgbGlua0N0eC5hdHRyIG9yIHRoaXMuYXR0ciBpbiB0aGUgaW5pdCgpIGFsbG93cyBwZXItaW5zdGFuY2UgY2hvaWNlIG9mIHRhcmdldCBhdHRyaWIuXG5cdFx0XHRcdFx0bGlua0N0eC5hdHRyID0gdGFnLmF0dHIgPSBsaW5rQ3R4LmF0dHIgfHwgdGFnLmF0dHI7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXR0ciA9IHRhZy5hdHRyO1xuXHRcdFx0XHR0YWcuXy5ub1Z3cyA9IGF0dHIgJiYgYXR0ciAhPT0gSFRNTDtcblx0XHRcdH1cblxuXHRcdFx0aXRlbVJldCA9IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0YWcucmVuZGVyKSB7XG5cdFx0XHRcdGl0ZW1SZXQgPSB0YWcucmVuZGVyLmFwcGx5KHRhZywgYXJncyk7XG5cdFx0XHRcdGlmIChwYXJlbnRWaWV3LmxpbmtlZCAmJiBpdGVtUmV0ICYmIHRhZy5saW5rZWRFbGVtICYmICFyV3JhcHBlZEluVmlld01hcmtlci50ZXN0KGl0ZW1SZXQpKSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBhIHRhZyByZW5kZXJzIGNvbnRlbnQgZnJvbSB0aGUgcmVuZGVyIG1ldGhvZCwgd2l0aCBkYXRhIGxpbmtpbmcsIGFuZCBoYXMgYSBsaW5rZWRFbGVtIGJpbmRpbmcsIHRoZW4gd2UgbmVlZCB0byB3cmFwIHdpdGhcblx0XHRcdFx0XHQvLyB2aWV3IG1hcmtlcnMsIGlmIGFic2VudCwgc28gdGhlIGNvbnRlbnQgaXMgYSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFnLCB3aGljaCB3aWxsIGNvcnJlY3RseSBkaXNwb3NlIGJpbmRpbmdzIGlmIGRlbGV0ZWQuXG5cdFx0XHRcdFx0aXRlbVJldCA9IHJlbmRlcldpdGhWaWV3cygkLnRlbXBsYXRlcyhpdGVtUmV0KSwgYXJnc1swXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0YWcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWFyZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdGFyZ3MgPSBbcGFyZW50Vmlld107IC8vIG5vIGFyZ3VtZW50cyAtIChlLmcuIHt7ZWxzZX19KSBnZXQgZGF0YSBjb250ZXh0IGZyb20gdmlldy5cblx0XHRcdH1cblx0XHRcdGlmIChpdGVtUmV0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGVudEN0eCA9IGFyZ3NbMF07IC8vIERlZmF1bHQgZGF0YSBjb250ZXh0IGZvciB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBEZWZpbmVkIHRhZy5jb250ZW50Q3R4IGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoaXMuXG5cdFx0XHRcdGlmICh0YWcuY29udGVudEN0eCkge1xuXHRcdFx0XHRcdGNvbnRlbnRDdHggPSB0YWcuY29udGVudEN0eChjb250ZW50Q3R4KSB8fCBjb250ZW50Q3R4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGl0ZW1SZXQgPSB0YWdDdHgucmVuZGVyKGNvbnRlbnRDdHgsIHRydWUpIHx8IChpc1VwZGF0ZSA/IHVuZGVmaW5lZCA6IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm8gcmV0dXJuIHZhbHVlIGZyb20gcmVuZGVyLCBhbmQgbm8gdGVtcGxhdGUvY29udGVudCB0YWdDdHgucmVuZGVyKC4uLiksIHNvIHJldHVybiB1bmRlZmluZWRcblx0XHRcdHJldCA9IHJldCA/IHJldCArIChpdGVtUmV0IHx8IFwiXCIpIDogaXRlbVJldDsgLy8gSWYgbm8gcmVuZGVyZWQgY29udGVudCwgdGhpcyB3aWxsIGJlIHVuZGVmaW5lZFxuXHRcdH1cblx0XHR0YWcucmVuZGVyaW5nID0gdW5kZWZpbmVkO1xuXHR9XG5cdHRhZy50YWdDdHggPSB0YWdDdHhzWzBdO1xuXHR0YWcuY3R4ID0gdGFnLnRhZ0N0eC5jdHg7XG5cblx0aWYgKHRhZy5fLm5vVndzKSB7XG5cdFx0XHRpZiAodGFnLl8uaW5saW5lKSB7XG5cdFx0XHQvLyBpbmxpbmUgdGFnIHdpdGggYXR0ciBzZXQgdG8gXCJ0ZXh0XCIgd2lsbCBpbnNlcnQgSFRNTC1lbmNvZGVkIGNvbnRlbnQgLSBhcyBpZiBpdCB3YXMgZWxlbWVudC1iYXNlZCBpbm5lclRleHRcblx0XHRcdHJldCA9IGF0dHIgPT09IFwidGV4dFwiXG5cdFx0XHRcdD8gJGNvbnZlcnRlcnMuaHRtbChyZXQpXG5cdFx0XHRcdDogXCJcIjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGJvdW5kVGFnICYmIHBhcmVudFZpZXcuXy5vblJlbmRlclxuXHRcdC8vIENhbGwgb25SZW5kZXIgKHVzZWQgYnkgSnNWaWV3cyBpZiBwcmVzZW50LCB0byBhZGQgYmluZGluZyBhbm5vdGF0aW9ucyBhcm91bmQgcmVuZGVyZWQgY29udGVudClcblx0XHQ/IHBhcmVudFZpZXcuXy5vblJlbmRlcihyZXQsIHBhcmVudFZpZXcsIHRhZylcblx0XHQ6IHJldDtcbn1cblxuLy89PT09PT09PT09PT09PT09PVxuLy8gVmlldyBjb25zdHJ1Y3RvclxuLy89PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBWaWV3KGNvbnRleHQsIHR5cGUsIHBhcmVudFZpZXcsIGRhdGEsIHRlbXBsYXRlLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCkge1xuXHQvLyBDb25zdHJ1Y3RvciBmb3IgdmlldyBvYmplY3QgaW4gdmlldyBoaWVyYXJjaHkuIChBdWdtZW50ZWQgYnkgSnNWaWV3cyBpZiBKc1ZpZXdzIGlzIGxvYWRlZClcblx0dmFyIHZpZXdzLCBwYXJlbnRWaWV3XywgdGFnLCBzZWxmXyxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRpc0FycmF5ID0gdHlwZSA9PT0gXCJhcnJheVwiO1xuXG5cdHNlbGYuY29udGVudCA9IGNvbnRlbnRUbXBsO1xuXHRzZWxmLnZpZXdzID0gaXNBcnJheSA/IFtdIDoge307XG5cdHNlbGYucGFyZW50ID0gcGFyZW50Vmlldztcblx0c2VsZi50eXBlID0gdHlwZSB8fCBcInRvcFwiO1xuXHRzZWxmLmRhdGEgPSBkYXRhO1xuXHRzZWxmLnRtcGwgPSB0ZW1wbGF0ZTtcblx0Ly8gSWYgdGhlIGRhdGEgaXMgYW4gYXJyYXksIHRoaXMgaXMgYW4gJ2FycmF5IHZpZXcnIHdpdGggYSB2aWV3cyBhcnJheSBmb3IgZWFjaCBjaGlsZCAnaXRlbSB2aWV3J1xuXHQvLyBJZiB0aGUgZGF0YSBpcyBub3QgYW4gYXJyYXksIHRoaXMgaXMgYW4gJ2l0ZW0gdmlldycgd2l0aCBhIHZpZXdzICdoYXNoJyBvYmplY3QgZm9yIGFueSBjaGlsZCBuZXN0ZWQgdmlld3Ncblx0Ly8gLl8udXNlS2V5IGlzIG5vbiB6ZXJvIGlmIGlzIG5vdCBhbiAnYXJyYXkgdmlldycgKG93bmluZyBhIGRhdGEgYXJyYXkpLiBVc2UgdGhpcyBhcyBuZXh0IGtleSBmb3IgYWRkaW5nIHRvIGNoaWxkIHZpZXdzIGhhc2hcblx0c2VsZl8gPSBzZWxmLl8gPSB7XG5cdFx0a2V5OiAwLFxuXHRcdHVzZUtleTogaXNBcnJheSA/IDAgOiAxLFxuXHRcdGlkOiBcIlwiICsgdmlld0lkKyssXG5cdFx0b25SZW5kZXI6IG9uUmVuZGVyLFxuXHRcdGJuZHM6IHt9XG5cdH07XG5cdHNlbGYubGlua2VkID0gISFvblJlbmRlcjtcblx0aWYgKHBhcmVudFZpZXcpIHtcblx0XHR2aWV3cyA9IHBhcmVudFZpZXcudmlld3M7XG5cdFx0cGFyZW50Vmlld18gPSBwYXJlbnRWaWV3Ll87XG5cdFx0aWYgKHBhcmVudFZpZXdfLnVzZUtleSkge1xuXHRcdFx0Ly8gUGFyZW50IGlzIG5vdCBhbiAnYXJyYXkgdmlldycuIEFkZCB0aGlzIHZpZXcgdG8gaXRzIHZpZXdzIG9iamVjdFxuXHRcdFx0Ly8gc2VsZi5fa2V5ID0gaXMgdGhlIGtleSBpbiB0aGUgcGFyZW50IHZpZXcgaGFzaFxuXHRcdFx0dmlld3Nbc2VsZl8ua2V5ID0gXCJfXCIgKyBwYXJlbnRWaWV3Xy51c2VLZXkrK10gPSBzZWxmO1xuXHRcdFx0c2VsZi5pbmRleCA9IGluZGV4U3RyO1xuXHRcdFx0c2VsZi5nZXRJbmRleCA9IGdldE5lc3RlZEluZGV4O1xuXHRcdH0gZWxzZSBpZiAodmlld3MubGVuZ3RoID09PSAoc2VsZl8ua2V5ID0gc2VsZi5pbmRleCA9IGtleSkpIHsgLy8gUGFyZW50IGlzIGFuICdhcnJheSB2aWV3Jy4gQWRkIHRoaXMgdmlldyB0byBpdHMgdmlld3MgYXJyYXlcblx0XHRcdHZpZXdzLnB1c2goc2VsZik7IC8vIEFkZGluZyB0byBlbmQgb2Ygdmlld3MgYXJyYXkuIChVc2luZyBwdXNoIHdoZW4gcG9zc2libGUgLSBiZXR0ZXIgcGVyZiB0aGFuIHNwbGljZSlcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmlld3Muc3BsaWNlKGtleSwgMCwgc2VsZik7IC8vIEluc2VydGluZyBpbiB2aWV3cyBhcnJheVxuXHRcdH1cblx0XHQvLyBJZiBubyBjb250ZXh0IHdhcyBwYXNzZWQgaW4sIHVzZSBwYXJlbnQgY29udGV4dFxuXHRcdC8vIElmIGNvbnRleHQgd2FzIHBhc3NlZCBpbiwgaXQgc2hvdWxkIGhhdmUgYmVlbiBtZXJnZWQgYWxyZWFkeSB3aXRoIHBhcmVudCBjb250ZXh0XG5cdFx0c2VsZi5jdHggPSBjb250ZXh0IHx8IHBhcmVudFZpZXcuY3R4O1xuXHR9IGVsc2Uge1xuXHRcdHNlbGYuY3R4ID0gY29udGV4dDtcblx0fVxufVxuXG5WaWV3LnByb3RvdHlwZSA9IHtcblx0Z2V0OiBnZXRWaWV3LFxuXHRnZXRJbmRleDogZ2V0SW5kZXgsXG5cdGdldFJzYzogZ2V0UmVzb3VyY2UsXG5cdGdldFRtcGw6IGdldFRlbXBsYXRlLFxuXHRobHA6IGdldEhlbHBlcixcblx0X2lzOiBcInZpZXdcIlxufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZWdpc3RyYXRpb25cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb21waWxlQ2hpbGRSZXNvdXJjZXMocGFyZW50VG1wbCkge1xuXHR2YXIgc3RvcmVOYW1lLCBzdG9yZU5hbWVzLCByZXNvdXJjZXM7XG5cdGZvciAoc3RvcmVOYW1lIGluIGpzdlN0b3Jlcykge1xuXHRcdHN0b3JlTmFtZXMgPSBzdG9yZU5hbWUgKyBcInNcIjtcblx0XHRpZiAocGFyZW50VG1wbFtzdG9yZU5hbWVzXSkge1xuXHRcdFx0cmVzb3VyY2VzID0gcGFyZW50VG1wbFtzdG9yZU5hbWVzXTsgICAgLy8gUmVzb3VyY2VzIG5vdCB5ZXQgY29tcGlsZWRcblx0XHRcdHBhcmVudFRtcGxbc3RvcmVOYW1lc10gPSB7fTsgICAgICAgICAgICAgICAvLyBSZW1vdmUgdW5jb21waWxlZCByZXNvdXJjZXNcblx0XHRcdCR2aWV3c1tzdG9yZU5hbWVzXShyZXNvdXJjZXMsIHBhcmVudFRtcGwpOyAvLyBBZGQgYmFjayBpbiB0aGUgY29tcGlsZWQgcmVzb3VyY2VzXG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBjb21waWxlVGFnXG4vLz09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb21waWxlVGFnKG5hbWUsIHRhZ0RlZiwgcGFyZW50VG1wbCkge1xuXHR2YXIgdG1wbCwgYmFzZVRhZywgcHJvcCxcblx0XHRjb21waWxlZERlZiA9IG5ldyAkc3ViLl90ZygpO1xuXG5cdGZ1bmN0aW9uIFRhZygpIHtcblx0XHR2YXIgdGFnID0gdGhpcztcblx0XHR0YWcuXyA9IHtcblx0XHRcdGlubGluZTogdHJ1ZSxcblx0XHRcdHVubGlua2VkOiB0cnVlXG5cdFx0fTtcblxuXHRcdHRhZy50YWdOYW1lID0gbmFtZTtcblx0fVxuXG5cdGlmICgkaXNGdW5jdGlvbih0YWdEZWYpKSB7XG5cdFx0Ly8gU2ltcGxlIHRhZyBkZWNsYXJlZCBhcyBmdW5jdGlvbi4gTm8gcHJlc2VudGVyIGluc3RhbnRhdGlvbi5cblx0XHR0YWdEZWYgPSB7XG5cdFx0XHRkZXBlbmRzOiB0YWdEZWYuZGVwZW5kcyxcblx0XHRcdHJlbmRlcjogdGFnRGVmXG5cdFx0fTtcblx0fSBlbHNlIGlmIChcIlwiICsgdGFnRGVmID09PSB0YWdEZWYpIHtcblx0XHR0YWdEZWYgPSB7dGVtcGxhdGU6IHRhZ0RlZn07XG5cdH1cblx0aWYgKGJhc2VUYWcgPSB0YWdEZWYuYmFzZVRhZykge1xuXHRcdHRhZ0RlZi5mbG93ID0gISF0YWdEZWYuZmxvdzsgLy8gU2V0IGZsb3cgcHJvcGVydHksIHNvIGRlZmF1bHRzIHRvIGZhbHNlIGV2ZW4gaWYgYmFzZVRhZyBoYXMgZmxvdz10cnVlXG5cdFx0dGFnRGVmLmJhc2VUYWcgPSBiYXNlVGFnID0gXCJcIiArIGJhc2VUYWcgPT09IGJhc2VUYWdcblx0XHRcdD8gKHBhcmVudFRtcGwgJiYgcGFyZW50VG1wbC50YWdzW2Jhc2VUYWddIHx8ICR0YWdzW2Jhc2VUYWddKVxuXHRcdFx0OiBiYXNlVGFnO1xuXG5cdFx0Y29tcGlsZWREZWYgPSAkZXh0ZW5kKGNvbXBpbGVkRGVmLCBiYXNlVGFnKTtcblxuXHRcdGZvciAocHJvcCBpbiB0YWdEZWYpIHtcblx0XHRcdGNvbXBpbGVkRGVmW3Byb3BdID0gZ2V0TWV0aG9kKGJhc2VUYWdbcHJvcF0sIHRhZ0RlZltwcm9wXSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbXBpbGVkRGVmID0gJGV4dGVuZChjb21waWxlZERlZiwgdGFnRGVmKTtcblx0fVxuXG5cdC8vIFRhZyBkZWNsYXJlZCBhcyBvYmplY3QsIHVzZWQgYXMgdGhlIHByb3RvdHlwZSBmb3IgdGFnIGluc3RhbnRpYXRpb24gKGNvbnRyb2wvcHJlc2VudGVyKVxuXHRpZiAoKHRtcGwgPSBjb21waWxlZERlZi50ZW1wbGF0ZSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdGNvbXBpbGVkRGVmLnRlbXBsYXRlID0gXCJcIiArIHRtcGwgPT09IHRtcGwgPyAoJHRlbXBsYXRlc1t0bXBsXSB8fCAkdGVtcGxhdGVzKHRtcGwpKSA6IHRtcGw7XG5cdH1cblx0aWYgKGNvbXBpbGVkRGVmLmluaXQgIT09IGZhbHNlKSB7XG5cdFx0Ly8gU2V0IGluaXQ6IGZhbHNlIG9uIHRhZ0RlZiBpZiB5b3Ugd2FudCB0byBwcm92aWRlIGp1c3QgYSByZW5kZXIgbWV0aG9kLCBvciByZW5kZXIgYW5kIHRlbXBsYXRlLCBidXQgbm8gY29uc3RydWN0b3Igb3IgcHJvdG90eXBlLlxuXHRcdC8vIHNvIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0YWcgdG8gcmVuZGVyIGZ1bmN0aW9uLCBleGNlcHQgeW91IGNhbiBhbHNvIHByb3ZpZGUgYSB0ZW1wbGF0ZS5cblx0XHQoVGFnLnByb3RvdHlwZSA9IGNvbXBpbGVkRGVmKS5jb25zdHJ1Y3RvciA9IGNvbXBpbGVkRGVmLl9jdHIgPSBUYWc7XG5cdH1cblxuXHRpZiAocGFyZW50VG1wbCkge1xuXHRcdGNvbXBpbGVkRGVmLl9wYXJlbnRUbXBsID0gcGFyZW50VG1wbDtcblx0fVxuXHRyZXR1cm4gY29tcGlsZWREZWY7XG59XG5cbmZ1bmN0aW9uIGJhc2VBcHBseShhcmdzKSB7XG5cdC8vIEluIGRlcml2ZWQgbWV0aG9kIChvciBoYW5kbGVyIGRlY2xhcmVkIGRlY2xhcmF0aXZlbHkgYXMgaW4ge3s6Zm9vIG9uQ2hhbmdlPX5mb29DaGFuZ2VkfX0gY2FuIGNhbGwgYmFzZSBtZXRob2QsXG5cdC8vIHVzaW5nIHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgKEVxdWl2YWxlbnQgdG8gdGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpIGluIGpRdWVyeSBVSSlcblx0cmV0dXJuIHRoaXMuYmFzZS5hcHBseSh0aGlzLCBhcmdzKTtcbn1cblxuLy89PT09PT09PT09PT09PT1cbi8vIGNvbXBpbGVUbXBsXG4vLz09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb21waWxlVG1wbChuYW1lLCB0bXBsLCBwYXJlbnRUbXBsLCBvcHRpb25zKSB7XG5cdC8vIHRtcGwgaXMgZWl0aGVyIGEgdGVtcGxhdGUgb2JqZWN0LCBhIHNlbGVjdG9yIGZvciBhIHRlbXBsYXRlIHNjcmlwdCBibG9jaywgdGhlIG5hbWUgb2YgYSBjb21waWxlZCB0ZW1wbGF0ZSwgb3IgYSB0ZW1wbGF0ZSBvYmplY3RcblxuXHQvLz09PT0gbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cdGZ1bmN0aW9uIGxvb2t1cFRlbXBsYXRlKHZhbHVlKSB7XG5cdFx0Ly8gSWYgdmFsdWUgaXMgb2YgdHlwZSBzdHJpbmcgLSB0cmVhdCBhcyBzZWxlY3Rvciwgb3IgbmFtZSBvZiBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdC8vIFJldHVybiB0aGUgdGVtcGxhdGUgb2JqZWN0LCBpZiBhbHJlYWR5IGNvbXBpbGVkLCBvciB0aGUgbWFya3VwIHN0cmluZ1xuXHRcdHZhciBjdXJyZW50TmFtZSwgdG1wbDtcblx0XHRpZiAoKFwiXCIgKyB2YWx1ZSA9PT0gdmFsdWUpIHx8IHZhbHVlLm5vZGVUeXBlID4gMCAmJiAoZWxlbSA9IHZhbHVlKSkge1xuXHRcdFx0aWYgKCFlbGVtKSB7XG5cdFx0XHRcdGlmICgvXlxcLlxcL1teXFxcXDoqP1wiPD5dKiQvLnRlc3QodmFsdWUpKSB7XG5cdFx0XHRcdFx0Ly8gdG1wbD1cIi4vc29tZS9maWxlLmh0bWxcIlxuXHRcdFx0XHRcdC8vIElmIHRoZSB0ZW1wbGF0ZSBpcyBub3QgbmFtZWQsIHVzZSBcIi4vc29tZS9maWxlLmh0bWxcIiBhcyBuYW1lLlxuXHRcdFx0XHRcdGlmICh0bXBsID0gJHRlbXBsYXRlc1tuYW1lID0gbmFtZSB8fCB2YWx1ZV0pIHtcblx0XHRcdFx0XHRcdHZhbHVlID0gdG1wbDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gQlJPV1NFUi1TUEVDSUZJQyBDT0RFIChub3Qgb24gTm9kZS5qcyk6XG5cdFx0XHRcdFx0XHQvLyBMb29rIGZvciBzZXJ2ZXItZ2VuZXJhdGVkIHNjcmlwdCBibG9jayB3aXRoIGlkIFwiLi9zb21lL2ZpbGUuaHRtbFwiXG5cdFx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICgkLmZuICYmICEkc3ViLnJUbXBsLnRlc3QodmFsdWUpKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGVsZW0gPSAkKGRvY3VtZW50KS5maW5kKHZhbHVlKVswXTsgLy8gaWYgalF1ZXJ5IGlzIGxvYWRlZCwgdGVzdCBmb3Igc2VsZWN0b3IgcmV0dXJuaW5nIGVsZW1lbnRzLCBhbmQgZ2V0IGZpcnN0IGVsZW1lbnRcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0XHR9Ly8gRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0fSAvL0JST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0aWYgKGVsZW0pIHtcblx0XHRcdFx0Ly8gR2VuZXJhbGx5IHRoaXMgaXMgYSBzY3JpcHQgZWxlbWVudC5cblx0XHRcdFx0Ly8gSG93ZXZlciB3ZSBhbGxvdyBpdCB0byBiZSBhbnkgZWxlbWVudCwgc28geW91IGNhbiBmb3IgZXhhbXBsZSB0YWtlIHRoZSBjb250ZW50IG9mIGEgZGl2LFxuXHRcdFx0XHQvLyB1c2UgaXQgYXMgYSB0ZW1wbGF0ZSwgYW5kIHJlcGxhY2UgaXQgYnkgdGhlIHNhbWUgY29udGVudCByZW5kZXJlZCBhZ2FpbnN0IGRhdGEuXG5cdFx0XHRcdC8vIGUuZy4gZm9yIGxpbmtpbmcgdGhlIGNvbnRlbnQgb2YgYSBkaXYgdG8gYSBjb250YWluZXIsIGFuZCB1c2luZyB0aGUgaW5pdGlhbCBjb250ZW50IGFzIHRlbXBsYXRlOlxuXHRcdFx0XHQvLyAkLmxpbmsoXCIjY29udGVudFwiLCBtb2RlbCwge3RtcGw6IFwiI2NvbnRlbnRcIn0pO1xuXHRcdFx0XHRpZiAob3B0aW9ucykge1xuXHRcdFx0XHRcdC8vIFdlIHdpbGwgY29tcGlsZSBhIG5ldyB0ZW1wbGF0ZSB1c2luZyB0aGUgbWFya3VwIGluIHRoZSBzY3JpcHQgZWxlbWVudFxuXHRcdFx0XHRcdHZhbHVlID0gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gV2Ugd2lsbCBjYWNoZSBhIHNpbmdsZSBjb3B5IG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSwgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBuYW1lXG5cdFx0XHRcdFx0Ly8gKHJlbmFtaW5nIGZyb20gYSBwcmV2aW91cyBuYW1lIGlmIHRoZXJlIHdhcyBvbmUpLlxuXHRcdFx0XHRcdGN1cnJlbnROYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUodG1wbEF0dHIpO1xuXHRcdFx0XHRcdGlmIChjdXJyZW50TmFtZSkge1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnROYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gJHRlbXBsYXRlc1tjdXJyZW50TmFtZV07XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSAkdGVtcGxhdGVzW2N1cnJlbnROYW1lXTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoJC5mbikge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9ICQuZGF0YShlbGVtKVtqc3ZUbXBsXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bmFtZSA9IG5hbWUgfHwgKCQuZm4gPyBqc3ZUbXBsIDogdmFsdWUpO1xuXHRcdFx0XHRcdFx0dmFsdWUgPSBjb21waWxlVG1wbChuYW1lLCBlbGVtLmlubmVySFRNTCwgcGFyZW50VG1wbCwgb3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhbHVlLnRtcGxOYW1lID0gbmFtZSA9IG5hbWUgfHwgY3VycmVudE5hbWU7XG5cdFx0XHRcdFx0aWYgKG5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdFx0XHRcdCR0ZW1wbGF0ZXNbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUodG1wbEF0dHIsIG5hbWUpO1xuXHRcdFx0XHRcdGlmICgkLmZuKSB7XG5cdFx0XHRcdFx0XHQkLmRhdGEoZWxlbSwganN2VG1wbCwgdmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSAvLyBFTkQgQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0XHRlbGVtID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoIXZhbHVlLmZuKSB7XG5cdFx0XHR2YWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdC8vIElmIHZhbHVlIGlzIG5vdCBhIHN0cmluZy4gSFRNTCBlbGVtZW50LCBvciBjb21waWxlZCB0ZW1wbGF0ZSwgcmV0dXJuIHVuZGVmaW5lZFxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHR2YXIgZWxlbSwgY29tcGlsZWRUbXBsLFxuXHRcdHRtcGxPck1hcmt1cCA9IHRtcGwgPSB0bXBsIHx8IFwiXCI7XG5cblx0Ly89PT09IENvbXBpbGUgdGhlIHRlbXBsYXRlID09PT1cblx0aWYgKG9wdGlvbnMgPT09IDApIHtcblx0XHRvcHRpb25zID0gdW5kZWZpbmVkO1xuXHRcdHRtcGxPck1hcmt1cCA9IGxvb2t1cFRlbXBsYXRlKHRtcGxPck1hcmt1cCk7IC8vIFRvcC1sZXZlbCBjb21waWxlIHNvIGRvIGEgdGVtcGxhdGUgbG9va3VwXG5cdH1cblxuXHQvLyBJZiBvcHRpb25zLCB0aGVuIHRoaXMgd2FzIGFscmVhZHkgY29tcGlsZWQgZnJvbSBhIChzY3JpcHQpIGVsZW1lbnQgdGVtcGxhdGUgZGVjbGFyYXRpb24uXG5cdC8vIElmIG5vdCwgdGhlbiBpZiB0bXBsIGlzIGEgdGVtcGxhdGUgb2JqZWN0LCB1c2UgaXQgZm9yIG9wdGlvbnNcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwgKHRtcGwubWFya3VwID8gdG1wbCA6IHt9KTtcblx0b3B0aW9ucy50bXBsTmFtZSA9IG5hbWU7XG5cdGlmIChwYXJlbnRUbXBsKSB7XG5cdFx0b3B0aW9ucy5fcGFyZW50VG1wbCA9IHBhcmVudFRtcGw7XG5cdH1cblx0Ly8gSWYgdG1wbCBpcyBub3QgYSBtYXJrdXAgc3RyaW5nIG9yIGEgc2VsZWN0b3Igc3RyaW5nLCB0aGVuIGl0IG11c3QgYmUgYSB0ZW1wbGF0ZSBvYmplY3Rcblx0Ly8gSW4gdGhhdCBjYXNlLCBnZXQgaXQgZnJvbSB0aGUgbWFya3VwIHByb3BlcnR5IG9mIHRoZSBvYmplY3Rcblx0aWYgKCF0bXBsT3JNYXJrdXAgJiYgdG1wbC5tYXJrdXAgJiYgKHRtcGxPck1hcmt1cCA9IGxvb2t1cFRlbXBsYXRlKHRtcGwubWFya3VwKSkpIHtcblx0XHRpZiAodG1wbE9yTWFya3VwLmZuKSB7XG5cdFx0XHQvLyBJZiB0aGUgc3RyaW5nIHJlZmVyZW5jZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBvYmplY3QsIG5lZWQgdG8gcmVjb21waWxlIHRvIG1lcmdlIGFueSBtb2RpZmllZCBvcHRpb25zXG5cdFx0XHR0bXBsT3JNYXJrdXAgPSB0bXBsT3JNYXJrdXAubWFya3VwO1xuXHRcdH1cblx0fVxuXHRpZiAodG1wbE9yTWFya3VwICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAodG1wbE9yTWFya3VwLmZuIHx8IHRtcGwuZm4pIHtcblx0XHRcdC8vIHRtcGwgaXMgYWxyZWFkeSBjb21waWxlZCwgc28gdXNlIGl0XG5cdFx0XHRpZiAodG1wbE9yTWFya3VwLmZuKSB7XG5cdFx0XHRcdGNvbXBpbGVkVG1wbCA9IHRtcGxPck1hcmt1cDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdG1wbE9yTWFya3VwIGlzIGEgbWFya3VwIHN0cmluZywgbm90IGEgY29tcGlsZWQgdGVtcGxhdGVcblx0XHRcdC8vIENyZWF0ZSB0ZW1wbGF0ZSBvYmplY3Rcblx0XHRcdHRtcGwgPSB0bXBsT2JqZWN0KHRtcGxPck1hcmt1cCwgb3B0aW9ucyk7XG5cdFx0XHQvLyBDb21waWxlIHRvIEFTVCBhbmQgdGhlbiB0byBjb21waWxlZCBmdW5jdGlvblxuXHRcdFx0dG1wbEZuKHRtcGxPck1hcmt1cC5yZXBsYWNlKHJFc2NhcGVRdW90ZXMsIFwiXFxcXCQmXCIpLCB0bXBsKTtcblx0XHR9XG5cdFx0aWYgKCFjb21waWxlZFRtcGwpIHtcblx0XHRcdGNvbXBpbGVkVG1wbCA9ICRleHRlbmQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBjb21waWxlZFRtcGwucmVuZGVyLmFwcGx5KGNvbXBpbGVkVG1wbCwgYXJndW1lbnRzKTtcblx0XHRcdH0sIHRtcGwpO1xuXG5cdFx0XHRjb21waWxlQ2hpbGRSZXNvdXJjZXMoY29tcGlsZWRUbXBsKTtcblx0XHR9XG5cdFx0aWYgKG5hbWUgJiYgIXBhcmVudFRtcGwgJiYgbmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0JHJlbmRlcltuYW1lXSA9IGNvbXBpbGVkVG1wbDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbXBpbGVkVG1wbDtcblx0fVxufVxuXG4vLz09PT0gL2VuZCBvZiBmdW5jdGlvbiBjb21waWxlVG1wbCA9PT09XG5cbi8vPT09PT09PT09PT09PT09PT1cbi8vIGNvbXBpbGVWaWV3TW9kZWxcbi8vPT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbChkZWZhdWx0VmFsLCBkYXRhKSB7XG5cdHJldHVybiAkLmlzRnVuY3Rpb24oZGVmYXVsdFZhbClcblx0XHQ/IGRlZmF1bHRWYWwuY2FsbChkYXRhKVxuXHRcdDogZGVmYXVsdFZhbDtcbn1cblxuZnVuY3Rpb24gdW5tYXBBcnJheShtb2RlbEFycikge1xuXHRcdHZhciBpLCBhcnIgPSBbXSxcblx0XHRcdGwgPSBtb2RlbEFyci5sZW5ndGg7XG5cdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRhcnIucHVzaChtb2RlbEFycltpXS51bm1hcCgpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gY29tcGlsZVZpZXdNb2RlbChuYW1lLCB0eXBlKSB7XG5cdHZhciBpLCBjb25zdHJ1Y3Rvcixcblx0XHR2aWV3TW9kZWxzID0gdGhpcyxcblx0XHRnZXR0ZXJzID0gdHlwZS5nZXR0ZXJzLFxuXHRcdGV4dGVuZCA9IHR5cGUuZXh0ZW5kLFxuXHRcdGlkID0gdHlwZS5pZCxcblx0XHRwcm90byA9ICQuZXh0ZW5kKHtcblx0XHRcdF9pczogbmFtZSB8fCBcInVubmFtZWRcIixcblx0XHRcdHVubWFwOiB1bm1hcCxcblx0XHRcdG1lcmdlOiBtZXJnZVxuXHRcdH0sIGV4dGVuZCksXG5cdFx0YXJncyA9IFwiXCIsXG5cdFx0Ym9keSA9IFwiXCIsXG5cdFx0bCA9IGdldHRlcnMgPyBnZXR0ZXJzLmxlbmd0aCA6IDAsXG5cdFx0JG9ic2VydmFibGUgPSAkLm9ic2VydmFibGUsXG5cdFx0Z2V0dGVyTmFtZXMgPSB7fTtcblxuXHRmdW5jdGlvbiBHZXROZXcoYXJncykge1xuXHRcdGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHR9XG5cblx0ZnVuY3Rpb24gdm0oKSB7XG5cdFx0cmV0dXJuIG5ldyBHZXROZXcoYXJndW1lbnRzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGl0ZXJhdGUoZGF0YSwgYWN0aW9uKSB7XG5cdFx0dmFyIGosIGdldHRlclR5cGUsIGRlZmF1bHRWYWwsIHByb3AsIG9iLFxuXHRcdFx0bSA9IGdldHRlcnMubGVuZ3RoO1xuXHRcdGZvciAoaj0wOyBqPG07IGorKykge1xuXHRcdFx0cHJvcCA9IGdldHRlcnNbal07XG5cdFx0XHRnZXR0ZXJUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHByb3AgKyBcIlwiICE9PSBwcm9wKSB7XG5cdFx0XHRcdGdldHRlclR5cGUgPSBwcm9wO1xuXHRcdFx0XHRwcm9wID0gZ2V0dGVyVHlwZS5nZXR0ZXI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoKG9iID0gZGF0YVtwcm9wXSkgPT09IHVuZGVmaW5lZCAmJiBnZXR0ZXJUeXBlICYmIChkZWZhdWx0VmFsID0gZ2V0dGVyVHlwZS5kZWZhdWx0VmFsKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG9iID0gZ2V0RGVmYXVsdFZhbChkZWZhdWx0VmFsLCBkYXRhKTtcblx0XHRcdH1cblx0XHRcdGFjdGlvbihvYiwgZ2V0dGVyVHlwZSAmJiB2aWV3TW9kZWxzW2dldHRlclR5cGUudHlwZV0sIHByb3ApO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIG1hcChkYXRhKSB7XG5cdFx0ZGF0YSA9IGRhdGEgKyBcIlwiID09PSBkYXRhXG5cdFx0XHQ/IEpTT04ucGFyc2UoZGF0YSkgLy8gQWNjZXB0IEpTT04gc3RyaW5nXG5cdFx0XHQ6IGRhdGE7ICAgICAgICAgICAgLy8gb3Igb2JqZWN0L2FycmF5XG5cdFx0dmFyIGksIGosICBsLCBtLCBwcm9wLFxuXHRcdFx0b2IgPSBkYXRhLFxuXHRcdFx0YXJyID0gW107XG5cblx0XHRpZiAoJGlzQXJyYXkoZGF0YSkpIHtcblx0XHRcdGRhdGEgPSBkYXRhIHx8IFtdO1xuXHRcdFx0bCA9IGRhdGEubGVuZ3RoO1xuXHRcdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRcdGFyci5wdXNoKHRoaXMubWFwKGRhdGFbaV0pKTtcblx0XHRcdH1cblx0XHRcdGFyci5faXMgPSBuYW1lO1xuXHRcdFx0YXJyLnVubWFwID0gdW5tYXA7XG5cdFx0XHRhcnIubWVyZ2UgPSBtZXJnZTtcblx0XHRcdHJldHVybiBhcnI7XG5cdFx0fVxuXG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGl0ZXJhdGUoZGF0YSwgZnVuY3Rpb24ob2IsIHZpZXdNb2RlbCkge1xuXHRcdFx0XHRpZiAodmlld01vZGVsKSB7IC8vIEl0ZXJhdGUgdG8gYnVpbGQgZ2V0dGVycyBhcmcgYXJyYXkgKHZhbHVlLCBvciBtYXBwZWQgdmFsdWUpXG5cdFx0XHRcdFx0b2IgPSB2aWV3TW9kZWwubWFwKG9iKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhcnIucHVzaChvYik7XG5cdFx0XHR9KTtcblxuXHRcdFx0b2IgPSB0aGlzLmFwcGx5KHRoaXMsIGFycik7IC8vIEluc2FudGlhdGUgdGhpcyBWaWV3IE1vZGVsLCBwYXNzaW5nIGdldHRlcnMgYXJncyBhcnJheSB0byBjb25zdHJ1Y3RvclxuXHRcdFx0Zm9yIChwcm9wIGluIGRhdGEpIHsgLy8gQ29weSBvdmVyIGFueSBvdGhlciBwcm9wZXJ0aWVzLiB0aGF0IGFyZSBub3QgZ2V0L3NldCBwcm9wZXJ0aWVzXG5cdFx0XHRcdGlmIChwcm9wICE9PSAkZXhwYW5kbyAgJiYgIWdldHRlck5hbWVzW3Byb3BdKSB7XG5cdFx0XHRcdFx0b2JbcHJvcF0gPSBkYXRhW3Byb3BdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvYjtcblx0fVxuXG5cdGZ1bmN0aW9uIG1lcmdlKGRhdGEpIHtcblx0XHRkYXRhID0gZGF0YSArIFwiXCIgPT09IGRhdGFcblx0XHRcdD8gSlNPTi5wYXJzZShkYXRhKSAvLyBBY2NlcHQgSlNPTiBzdHJpbmdcblx0XHRcdDogZGF0YTsgICAgICAgICAgICAvLyBvciBvYmplY3QvYXJyYXlcblx0XHR2YXIgaSwgaiwgbCwgbSwgcHJvcCwgbW9kLCBmb3VuZCwgYXNzaWduZWQsIG9iLCBuZXdNb2RBcnIsXG5cdFx0XHRtb2RlbCA9IHRoaXM7XG5cblx0XHRpZiAoJGlzQXJyYXkobW9kZWwpKSB7XG5cdFx0XHRhc3NpZ25lZCA9IHt9O1xuXHRcdFx0bmV3TW9kQXJyID0gW107XG5cdFx0XHRsID0gZGF0YS5sZW5ndGg7XG5cdFx0XHRtID0gbW9kZWwubGVuZ3RoO1xuXHRcdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRcdG9iID0gZGF0YVtpXTtcblx0XHRcdFx0Zm91bmQgPSBmYWxzZTtcblx0XHRcdFx0Zm9yIChqPTA7IGo8bSAmJiAhZm91bmQ7IGorKykge1xuXHRcdFx0XHRcdGlmIChhc3NpZ25lZFtqXSkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZCA9IG1vZGVsW2pdO1xuXG5cdFx0XHRcdFx0aWYgKGlkKSB7XG5cdFx0XHRcdFx0XHRhc3NpZ25lZFtqXSA9IGZvdW5kID0gaWQgKyBcIlwiID09PSBpZFxuXHRcdFx0XHRcdFx0PyAob2JbaWRdICYmIChnZXR0ZXJOYW1lc1tpZF0gPyBtb2RbaWRdKCkgOiBtb2RbaWRdKSA9PT0gb2JbaWRdKVxuXHRcdFx0XHRcdFx0OiBpZChtb2QsIG9iKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGZvdW5kKSB7XG5cdFx0XHRcdFx0bW9kLm1lcmdlKG9iKTtcblx0XHRcdFx0XHRuZXdNb2RBcnIucHVzaChtb2QpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5ld01vZEFyci5wdXNoKHZtLm1hcChvYikpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoJG9ic2VydmFibGUpIHtcblx0XHRcdFx0JG9ic2VydmFibGUobW9kZWwpLnJlZnJlc2gobmV3TW9kQXJyLCB0cnVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1vZGVsLnNwbGljZS5hcHBseShtb2RlbCwgWzAsIG1vZGVsLmxlbmd0aF0uY29uY2F0KG5ld01vZEFycikpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpdGVyYXRlKGRhdGEsIGZ1bmN0aW9uKG9iLCB2aWV3TW9kZWwsIGdldHRlcikge1xuXHRcdFx0aWYgKHZpZXdNb2RlbCkge1xuXHRcdFx0XHRtb2RlbFtnZXR0ZXJdKCkubWVyZ2Uob2IpOyAvLyBVcGRhdGUgdHlwZWQgcHJvcGVydHlcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1vZGVsW2dldHRlcl0ob2IpOyAvLyBVcGRhdGUgbm9uLXR5cGVkIHByb3BlcnR5XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Zm9yIChwcm9wIGluIGRhdGEpIHtcblx0XHRcdGlmIChwcm9wICE9PSAkZXhwYW5kbyAmJiAhZ2V0dGVyTmFtZXNbcHJvcF0pIHtcblx0XHRcdFx0bW9kZWxbcHJvcF0gPSBkYXRhW3Byb3BdO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHVubWFwKCkge1xuXHRcdHZhciBvYiwgcHJvcCwgaSwgbCwgZ2V0dGVyVHlwZSwgYXJyLCB2YWx1ZSxcblx0XHRcdG1vZGVsID0gdGhpcztcblxuXHRcdGlmICgkaXNBcnJheShtb2RlbCkpIHtcblx0XHRcdHJldHVybiB1bm1hcEFycmF5KG1vZGVsKTtcblx0XHR9XG5cdFx0b2IgPSB7fTtcblx0XHRsID0gZ2V0dGVycy5sZW5ndGg7XG5cdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRwcm9wID0gZ2V0dGVyc1tpXTtcblx0XHRcdGdldHRlclR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAocHJvcCArIFwiXCIgIT09IHByb3ApIHtcblx0XHRcdFx0Z2V0dGVyVHlwZSA9IHByb3A7XG5cdFx0XHRcdHByb3AgPSBnZXR0ZXJUeXBlLmdldHRlcjtcblx0XHRcdH1cblx0XHRcdHZhbHVlID0gbW9kZWxbcHJvcF0oKTtcblx0XHRcdG9iW3Byb3BdID0gZ2V0dGVyVHlwZSAmJiB2YWx1ZSAmJiB2aWV3TW9kZWxzW2dldHRlclR5cGUudHlwZV1cblx0XHRcdFx0PyAkaXNBcnJheSh2YWx1ZSlcblx0XHRcdFx0XHQ/IHVubWFwQXJyYXkodmFsdWUpXG5cdFx0XHRcdFx0OiB2YWx1ZS51bm1hcCgpXG5cdFx0XHRcdDogdmFsdWU7XG5cdFx0fVxuXHRcdGZvciAocHJvcCBpbiBtb2RlbCkge1xuXHRcdFx0aWYgKHByb3AgIT09IFwiX2lzXCIgJiYgIWdldHRlck5hbWVzW3Byb3BdICYmIHByb3AgIT09ICRleHBhbmRvICAmJiAocHJvcC5jaGFyQXQoMCkgIT09IFwiX1wiIHx8ICFnZXR0ZXJOYW1lc1twcm9wLnNsaWNlKDEpXSkgJiYgISQuaXNGdW5jdGlvbihtb2RlbFtwcm9wXSkpIHtcblx0XHRcdFx0b2JbcHJvcF0gPSBtb2RlbFtwcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9iO1xuXHR9XG5cblx0R2V0TmV3LnByb3RvdHlwZSA9IHByb3RvO1xuXG5cdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdChmdW5jdGlvbihnZXR0ZXIpIHtcblx0XHRcdGdldHRlciA9IGdldHRlci5nZXR0ZXIgfHwgZ2V0dGVyO1xuXHRcdFx0Z2V0dGVyTmFtZXNbZ2V0dGVyXSA9IGkrMTtcblx0XHRcdHZhciBwcml2RmllbGQgPSBcIl9cIiArIGdldHRlcjtcblxuXHRcdFx0YXJncyArPSAoYXJncyA/IFwiLFwiIDogXCJcIikgKyBnZXR0ZXI7XG5cdFx0XHRib2R5ICs9IFwidGhpcy5cIiArIHByaXZGaWVsZCArIFwiID0gXCIgKyBnZXR0ZXIgKyBcIjtcXG5cIjtcblx0XHRcdHByb3RvW2dldHRlcl0gPSBwcm90b1tnZXR0ZXJdIHx8IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpc1twcml2RmllbGRdOyAvLyBJZiB0aGVyZSBpcyBubyBhcmd1bWVudCwgdXNlIGFzIGEgZ2V0dGVyXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdFx0JG9ic2VydmFibGUodGhpcykuc2V0UHJvcGVydHkoZ2V0dGVyLCB2YWwpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXNbcHJpdkZpZWxkXSA9IHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdHByb3RvW2dldHRlcl0uc2V0ID0gcHJvdG9bZ2V0dGVyXS5zZXQgfHwgZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdFx0dGhpc1twcml2RmllbGRdID0gdmFsOyAvLyBTZXR0ZXIgY2FsbGVkIGJ5IG9ic2VydmFibGUgcHJvcGVydHkgY2hhbmdlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSkoZ2V0dGVyc1tpXSk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvciA9IG5ldyBGdW5jdGlvbihhcmdzLCBib2R5LnNsaWNlKDAsIC0xKSk7XG5cdGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IHByb3RvO1xuXHRwcm90by5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuXG5cdHZtLm1hcCA9IG1hcDtcblx0dm0uZ2V0dGVycyA9IGdldHRlcnM7XG5cdHZtLmV4dGVuZCA9IGV4dGVuZDtcblx0dm0uaWQgPSBpZDtcblx0cmV0dXJuIHZtO1xufVxuXG5mdW5jdGlvbiB0bXBsT2JqZWN0KG1hcmt1cCwgb3B0aW9ucykge1xuXHQvLyBUZW1wbGF0ZSBvYmplY3QgY29uc3RydWN0b3Jcblx0dmFyIGh0bWxUYWcsXG5cdFx0d3JhcE1hcCA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl93bSB8fCB7fSwgLy8gT25seSB1c2VkIGluIEpzVmlld3MuIE90aGVyd2lzZSBlbXB0eToge31cblx0XHR0bXBsID0gJGV4dGVuZChcblx0XHRcdHtcblx0XHRcdFx0dG1wbHM6IFtdLFxuXHRcdFx0XHRsaW5rczoge30sIC8vIENvbXBpbGVkIGZ1bmN0aW9ucyBmb3IgbGluayBleHByZXNzaW9uc1xuXHRcdFx0XHRibmRzOiBbXSxcblx0XHRcdFx0X2lzOiBcInRlbXBsYXRlXCIsXG5cdFx0XHRcdHJlbmRlcjogcmVuZGVyQ29udGVudFxuXHRcdFx0fSxcblx0XHRcdG9wdGlvbnNcblx0XHQpO1xuXG5cdHRtcGwubWFya3VwID0gbWFya3VwO1xuXHRpZiAoIW9wdGlvbnMuaHRtbFRhZykge1xuXHRcdC8vIFNldCB0bXBsLnRhZyB0byB0aGUgdG9wLWxldmVsIEhUTUwgdGFnIHVzZWQgaW4gdGhlIHRlbXBsYXRlLCBpZiBhbnkuLi5cblx0XHRodG1sVGFnID0gckZpcnN0RWxlbS5leGVjKG1hcmt1cCk7XG5cdFx0dG1wbC5odG1sVGFnID0gaHRtbFRhZyA/IGh0bWxUYWdbMV0udG9Mb3dlckNhc2UoKSA6IFwiXCI7XG5cdH1cblx0aHRtbFRhZyA9IHdyYXBNYXBbdG1wbC5odG1sVGFnXTtcblx0aWYgKGh0bWxUYWcgJiYgaHRtbFRhZyAhPT0gd3JhcE1hcC5kaXYpIHtcblx0XHQvLyBXaGVuIHVzaW5nIEpzVmlld3MsIHdlIHRyaW0gdGVtcGxhdGVzIHdoaWNoIGFyZSBpbnNlcnRlZCBpbnRvIEhUTUwgY29udGV4dHMgd2hlcmUgdGV4dCBub2RlcyBhcmUgbm90IHJlbmRlcmVkIChpLmUuIG5vdCAnUGhyYXNpbmcgQ29udGVudCcpLlxuXHRcdC8vIEN1cnJlbnRseSBub3QgdHJpbW1lZCBmb3IgPGxpPiB0YWcuIChOb3Qgd29ydGggYWRkaW5nIHBlcmYgY29zdClcblx0XHR0bXBsLm1hcmt1cCA9ICQudHJpbSh0bXBsLm1hcmt1cCk7XG5cdH1cblxuXHRyZXR1cm4gdG1wbDtcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gcmVnaXN0ZXJTdG9yZVxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZWdpc3RlclN0b3JlKHN0b3JlTmFtZSwgc3RvcmVTZXR0aW5ncykge1xuXG5cdGZ1bmN0aW9uIHRoZVN0b3JlKG5hbWUsIGl0ZW0sIHBhcmVudFRtcGwpIHtcblx0XHQvLyBUaGUgc3RvcmUgaXMgYWxzbyB0aGUgZnVuY3Rpb24gdXNlZCB0byBhZGQgaXRlbXMgdG8gdGhlIHN0b3JlLiBlLmcuICQudGVtcGxhdGVzLCBvciAkLnZpZXdzLnRhZ3NcblxuXHRcdC8vIEZvciBzdG9yZSBvZiBuYW1lICd0aGluZycsIENhbGwgYXM6XG5cdFx0Ly8gICAgJC52aWV3cy50aGluZ3MoaXRlbXNbLCBwYXJlbnRUbXBsXSksXG5cdFx0Ly8gb3IgJC52aWV3cy50aGluZ3MobmFtZSwgaXRlbVssIHBhcmVudFRtcGxdKVxuXG5cdFx0dmFyIG9uU3RvcmUsIGNvbXBpbGUsIGl0ZW1OYW1lLCB0aGlzU3RvcmU7XG5cdFx0aWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09IE9CSkVDVCAmJiAhbmFtZS5ub2RlVHlwZSAmJiAhbmFtZS5tYXJrdXAgJiYgIW5hbWUuZ2V0VGd0ICYmICEoc3RvcmVOYW1lID09PSBcInZpZXdNb2RlbFwiICYmIG5hbWUuZ2V0dGVycyB8fCBuYW1lLmV4dGVuZCkpIHtcblx0XHRcdC8vIENhbGwgdG8gJC52aWV3cy50aGluZ3MoaXRlbXNbLCBwYXJlbnRUbXBsXSksXG5cblx0XHRcdC8vIEFkZGluZyBpdGVtcyB0byB0aGUgc3RvcmVcblx0XHRcdC8vIElmIG5hbWUgaXMgYSBoYXNoLCB0aGVuIGl0ZW0gaXMgcGFyZW50VG1wbC4gSXRlcmF0ZSBvdmVyIGhhc2ggYW5kIGNhbGwgc3RvcmUgZm9yIGtleS5cblx0XHRcdGZvciAoaXRlbU5hbWUgaW4gbmFtZSkge1xuXHRcdFx0XHR0aGVTdG9yZShpdGVtTmFtZSwgbmFtZVtpdGVtTmFtZV0sIGl0ZW0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGl0ZW0gfHwgJHZpZXdzO1xuXHRcdH1cblx0XHQvLyBBZGRpbmcgYSBzaW5nbGUgdW5uYW1lZCBpdGVtIHRvIHRoZSBzdG9yZVxuXHRcdGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGl0ZW0gPSBuYW1lO1xuXHRcdFx0bmFtZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKG5hbWUgJiYgXCJcIiArIG5hbWUgIT09IG5hbWUpIHsgLy8gbmFtZSBtdXN0IGJlIGEgc3RyaW5nXG5cdFx0XHRwYXJlbnRUbXBsID0gaXRlbTtcblx0XHRcdGl0ZW0gPSBuYW1lO1xuXHRcdFx0bmFtZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dGhpc1N0b3JlID0gcGFyZW50VG1wbFxuXHRcdFx0PyBzdG9yZU5hbWUgPT09IFwidmlld01vZGVsXCJcblx0XHRcdFx0PyBwYXJlbnRUbXBsXG5cdFx0XHRcdDogKHBhcmVudFRtcGxbc3RvcmVOYW1lc10gPSBwYXJlbnRUbXBsW3N0b3JlTmFtZXNdIHx8IHt9KVxuXHRcdFx0OiB0aGVTdG9yZTtcblx0XHRjb21waWxlID0gc3RvcmVTZXR0aW5ncy5jb21waWxlO1xuXHRcdGlmIChpdGVtID09PSBudWxsKSB7XG5cdFx0XHQvLyBJZiBpdGVtIGlzIG51bGwsIGRlbGV0ZSB0aGlzIGVudHJ5XG5cdFx0XHRpZiAobmFtZSkge1xuXHRcdFx0XHRkZWxldGUgdGhpc1N0b3JlW25hbWVdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpdGVtID0gY29tcGlsZSA/IGNvbXBpbGUuY2FsbCh0aGlzU3RvcmUsIG5hbWUsIGl0ZW0sIHBhcmVudFRtcGwsIDApIDogaXRlbTtcblx0XHRcdGlmIChuYW1lKSB7XG5cdFx0XHRcdHRoaXNTdG9yZVtuYW1lXSA9IGl0ZW07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjb21waWxlICYmIGl0ZW0pIHtcblx0XHRcdGl0ZW0uX2lzID0gc3RvcmVOYW1lOyAvLyBPbmx5IGRvIHRoaXMgZm9yIGNvbXBpbGVkIG9iamVjdHMgKHRhZ3MsIHRlbXBsYXRlcy4uLilcblx0XHR9XG5cdFx0aWYgKGl0ZW0gJiYgKG9uU3RvcmUgPSAkc3ViLm9uU3RvcmVbc3RvcmVOYW1lXSkpIHtcblx0XHRcdC8vIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0b25TdG9yZShuYW1lLCBpdGVtLCBjb21waWxlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGl0ZW07XG5cdH1cblxuXHR2YXIgc3RvcmVOYW1lcyA9IHN0b3JlTmFtZSArIFwic1wiO1xuXG5cdCR2aWV3c1tzdG9yZU5hbWVzXSA9IHRoZVN0b3JlO1xufVxuXG5mdW5jdGlvbiBhZGRTZXR0aW5nKHN0KSB7XG5cdCR2aWV3c1NldHRpbmdzW3N0XSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcblx0XHRcdD8gKCRzdWJTZXR0aW5nc1tzdF0gPSB2YWx1ZSwgJHZpZXdzU2V0dGluZ3MpXG5cdFx0XHQ6ICRzdWJTZXR0aW5nc1tzdF07XG5cdH07XG59XG5cbi8vPT09PT09PT09XG4vLyBkYXRhTWFwXG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBkYXRhTWFwKG1hcERlZikge1xuXHRmdW5jdGlvbiBNYXAoc291cmNlLCBvcHRpb25zKSB7XG5cdFx0dGhpcy50Z3QgPSBtYXBEZWYuZ2V0VGd0KHNvdXJjZSwgb3B0aW9ucyk7XG5cdH1cblxuXHRpZiAoJGlzRnVuY3Rpb24obWFwRGVmKSkge1xuXHRcdC8vIFNpbXBsZSBtYXAgZGVjbGFyZWQgYXMgZnVuY3Rpb25cblx0XHRtYXBEZWYgPSB7XG5cdFx0XHRnZXRUZ3Q6IG1hcERlZlxuXHRcdH07XG5cdH1cblxuXHRpZiAobWFwRGVmLmJhc2VNYXApIHtcblx0XHRtYXBEZWYgPSAkZXh0ZW5kKCRleHRlbmQoe30sIG1hcERlZi5iYXNlTWFwKSwgbWFwRGVmKTtcblx0fVxuXG5cdG1hcERlZi5tYXAgPSBmdW5jdGlvbihzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gbmV3IE1hcChzb3VyY2UsIG9wdGlvbnMpO1xuXHR9O1xuXHRyZXR1cm4gbWFwRGVmO1xufVxuXG4vLz09PT09PT09PT09PT09XG4vLyByZW5kZXJDb250ZW50XG4vLz09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIGtleSwgb25SZW5kZXIpIHtcblx0dmFyIGksIGwsIHRhZywgdG1wbCwgdGFnQ3R4LCBpc1RvcFJlbmRlckNhbGwsIHByZXZEYXRhLCBwcmV2SW5kZXgsXG5cdFx0dmlldyA9IHBhcmVudFZpZXcsXG5cdFx0cmVzdWx0ID0gXCJcIjtcblxuXHRpZiAoY29udGV4dCA9PT0gdHJ1ZSkge1xuXHRcdG5vSXRlcmF0aW9uID0gY29udGV4dDsgLy8gcGFzc2luZyBib29sZWFuIGFzIHNlY29uZCBwYXJhbSAtIG5vSXRlcmF0aW9uXG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICh0eXBlb2YgY29udGV4dCAhPT0gT0JKRUNUKSB7XG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDsgLy8gY29udGV4dCBtdXN0IGJlIGEgYm9vbGVhbiAobm9JdGVyYXRpb24pIG9yIGEgcGxhaW4gb2JqZWN0XG5cdH1cblxuXHRpZiAodGFnID0gdGhpcy50YWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgY2FsbCBmcm9tIHJlbmRlclRhZyBvciB0YWdDdHgucmVuZGVyKC4uLilcblx0XHR0YWdDdHggPSB0aGlzO1xuXHRcdHZpZXcgPSB2aWV3IHx8IHRhZ0N0eC52aWV3O1xuXHRcdHRtcGwgPSB2aWV3LmdldFRtcGwodGFnLnRlbXBsYXRlIHx8IHRhZ0N0eC50bXBsKTtcblx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdGRhdGEgPSB2aWV3O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBUaGlzIGlzIGEgdGVtcGxhdGUucmVuZGVyKC4uLikgY2FsbFxuXHRcdHRtcGwgPSB0aGlzO1xuXHR9XG5cblx0aWYgKHRtcGwpIHtcblx0XHRpZiAoIXBhcmVudFZpZXcgJiYgZGF0YSAmJiBkYXRhLl9pcyA9PT0gXCJ2aWV3XCIpIHtcblx0XHRcdHZpZXcgPSBkYXRhOyAvLyBXaGVuIHBhc3NpbmcgaW4gYSB2aWV3IHRvIHJlbmRlciBvciBsaW5rIChhbmQgbm90IHBhc3NpbmcgaW4gYSBwYXJlbnQgdmlldykgdXNlIHRoZSBwYXNzZWQtaW4gdmlldyBhcyBwYXJlbnRWaWV3XG5cdFx0fVxuXG5cdFx0aWYgKHZpZXcpIHtcblx0XHRcdGlmIChkYXRhID09PSB2aWV3KSB7XG5cdFx0XHRcdC8vIEluaGVyaXQgdGhlIGRhdGEgZnJvbSB0aGUgcGFyZW50IHZpZXcuXG5cdFx0XHRcdC8vIFRoaXMgbWF5IGJlIHRoZSBjb250ZW50cyBvZiBhbiB7e2lmfX0gYmxvY2tcblx0XHRcdFx0ZGF0YSA9IHZpZXcuZGF0YTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpc1RvcFJlbmRlckNhbGwgPSAhdmlldztcblx0XHRpc1JlbmRlckNhbGwgPSBpc1JlbmRlckNhbGwgfHwgaXNUb3BSZW5kZXJDYWxsO1xuXHRcdGlmICghdmlldykge1xuXHRcdFx0KGNvbnRleHQgPSBjb250ZXh0IHx8IHt9KS5yb290ID0gZGF0YTsgLy8gUHJvdmlkZSB+cm9vdCBhcyBzaG9ydGN1dCB0byB0b3AtbGV2ZWwgZGF0YS5cblx0XHR9XG5cdFx0aWYgKCFpc1JlbmRlckNhbGwgfHwgJHN1YlNldHRpbmdzQWR2YW5jZWQudXNlVmlld3MgfHwgdG1wbC51c2VWaWV3cyB8fCB2aWV3ICYmIHZpZXcgIT09IHRvcFZpZXcpIHtcblx0XHRcdHJlc3VsdCA9IHJlbmRlcldpdGhWaWV3cyh0bXBsLCBkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgdmlldywga2V5LCBvblJlbmRlciwgdGFnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHZpZXcpIHsgLy8gSW4gYSBibG9ja1xuXHRcdFx0XHRwcmV2RGF0YSA9IHZpZXcuZGF0YTtcblx0XHRcdFx0cHJldkluZGV4ID0gdmlldy5pbmRleDtcblx0XHRcdFx0dmlldy5pbmRleCA9IGluZGV4U3RyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmlldyA9IHRvcFZpZXc7XG5cdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGE7XG5cdFx0XHRcdHZpZXcuY3R4ID0gY29udGV4dDtcblx0XHRcdH1cblx0XHRcdGlmICgkaXNBcnJheShkYXRhKSAmJiAhbm9JdGVyYXRpb24pIHtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgdGhlIGFycmF5LCB3aG9zZSBjaGlsZCB2aWV3cyBjb3JyZXNwb25kIHRvIGVhY2ggZGF0YSBpdGVtLiAoTm90ZTogaWYga2V5IGFuZCBwYXJlbnRWaWV3IGFyZSBwYXNzZWQgaW5cblx0XHRcdFx0Ly8gYWxvbmcgd2l0aCBwYXJlbnQgdmlldywgdHJlYXQgYXMgaW5zZXJ0IC1lLmcuIGZyb20gdmlldy5hZGRWaWV3cyAtIHNvIHBhcmVudFZpZXcgaXMgYWxyZWFkeSB0aGUgdmlldyBpdGVtIGZvciBhcnJheSlcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IGRhdGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0dmlldy5pbmRleCA9IGk7XG5cdFx0XHRcdFx0dmlldy5kYXRhID0gZGF0YVtpXTtcblx0XHRcdFx0XHRyZXN1bHQgKz0gdG1wbC5mbihkYXRhW2ldLCB2aWV3LCAkc3ViKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmlldy5kYXRhID0gZGF0YTtcblx0XHRcdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YSwgdmlldywgJHN1Yik7XG5cdFx0XHR9XG5cdFx0XHR2aWV3LmRhdGEgPSBwcmV2RGF0YTtcblx0XHRcdHZpZXcuaW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0fVxuXHRcdGlmIChpc1RvcFJlbmRlckNhbGwpIHtcblx0XHRcdGlzUmVuZGVyQ2FsbCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aFZpZXdzKHRtcGwsIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCB2aWV3LCBrZXksIG9uUmVuZGVyLCB0YWcpIHtcblx0ZnVuY3Rpb24gc2V0SXRlbVZhcihpdGVtKSB7XG5cdFx0Ly8gV2hlbiBpdGVtVmFyIGlzIHNwZWNpZmllZCwgc2V0IG1vZGlmaWVkIGN0eCB3aXRoIHVzZXItbmFtZWQgfml0ZW1cblx0XHRuZXdDdHggPSAkZXh0ZW5kKHt9LCBjb250ZXh0KTtcblx0XHRuZXdDdHhbaXRlbVZhcl0gPSBpdGVtO1xuXHR9XG5cblx0Ly8gUmVuZGVyIHRlbXBsYXRlIGFnYWluc3QgZGF0YSBhcyBhIHRyZWUgb2Ygc3Vidmlld3MgKG5lc3RlZCByZW5kZXJlZCB0ZW1wbGF0ZSBpbnN0YW5jZXMpLCBvciBhcyBhIHN0cmluZyAodG9wLWxldmVsIHRlbXBsYXRlKS5cblx0Ly8gSWYgdGhlIGRhdGEgaXMgdGhlIHBhcmVudCB2aWV3LCB0cmVhdCBhcyBub0l0ZXJhdGlvbiwgcmUtcmVuZGVyIHdpdGggdGhlIHNhbWUgZGF0YSBjb250ZXh0LlxuXHR2YXIgaSwgbCwgbmV3VmlldywgY2hpbGRWaWV3LCBpdGVtUmVzdWx0LCBzd2FwQ29udGVudCwgY29udGVudFRtcGwsIG91dGVyT25SZW5kZXIsIHRtcGxOYW1lLCBpdGVtVmFyLCBuZXdDdHgsIHRhZ0N0eCxcblx0XHRyZXN1bHQgPSBcIlwiO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgY2FsbCBmcm9tIHJlbmRlclRhZyBvciB0YWdDdHgucmVuZGVyKC4uLilcblx0XHR0bXBsTmFtZSA9IHRhZy50YWdOYW1lO1xuXHRcdHRhZ0N0eCA9IHRhZy50YWdDdHg7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgPyBleHRlbmRDdHgoY29udGV4dCwgdGFnLmN0eCkgOiB0YWcuY3R4O1xuXG5cdFx0aWYgKHRtcGwgPT09IHZpZXcuY29udGVudCkgeyAvLyB7e3h4eCB0bXBsPSNjb250ZW50fX1cblx0XHRcdGNvbnRlbnRUbXBsID0gdG1wbCAhPT0gdmlldy5jdHguX3dycCAvLyBXZSBhcmUgcmVuZGVyaW5nIHRoZSAjY29udGVudFxuXHRcdFx0XHQ/IHZpZXcuY3R4Ll93cnAgLy8gI2NvbnRlbnQgd2FzIHRoZSB0YWdDdHgucHJvcHMudG1wbCB3cmFwcGVyIG9mIHRoZSBibG9jayBjb250ZW50IC0gc28gd2l0aGluIHRoaXMgdmlldywgI2NvbnRlbnQgd2lsbCBub3cgYmUgdGhlIHZpZXcuY3R4Ll93cnAgYmxvY2sgY29udGVudFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDsgLy8gI2NvbnRlbnQgd2FzIHRoZSB2aWV3LmN0eC5fd3JwIGJsb2NrIGNvbnRlbnQgLSBzbyB3aXRoaW4gdGhpcyB2aWV3LCB0aGVyZSBpcyBubyBsb25nZXIgYW55ICNjb250ZW50IHRvIHdyYXAuXG5cdFx0fSBlbHNlIGlmICh0bXBsICE9PSB0YWdDdHguY29udGVudCkge1xuXHRcdFx0aWYgKHRtcGwgPT09IHRhZy50ZW1wbGF0ZSkgeyAvLyBSZW5kZXJpbmcge3t0YWd9fSB0YWcudGVtcGxhdGUsIHJlcGxhY2luZyBibG9jayBjb250ZW50LlxuXHRcdFx0XHRjb250ZW50VG1wbCA9IHRhZ0N0eC50bXBsOyAvLyBTZXQgI2NvbnRlbnQgdG8gYmxvY2sgY29udGVudCAob3Igd3JhcHBlZCBibG9jayBjb250ZW50IGlmIHRhZ0N0eC5wcm9wcy50bXBsIGlzIHNldClcblx0XHRcdFx0Y29udGV4dC5fd3JwID0gdGFnQ3R4LmNvbnRlbnQ7IC8vIFBhc3Mgd3JhcHBlZCBibG9jayBjb250ZW50IHRvIG5lc3RlZCB2aWV3c1xuXHRcdFx0fSBlbHNlIHsgLy8gUmVuZGVyaW5nIHRhZ0N0eC5wcm9wcy50bXBsIHdyYXBwZXJcblx0XHRcdFx0Y29udGVudFRtcGwgPSB0YWdDdHguY29udGVudCB8fCB2aWV3LmNvbnRlbnQ7IC8vIFNldCAjY29udGVudCB0byB3cmFwcGVkIGJsb2NrIGNvbnRlbnRcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGVudFRtcGwgPSB2aWV3LmNvbnRlbnQ7IC8vIE5lc3RlZCB2aWV3cyBpbmhlcml0IHNhbWUgd3JhcHBlZCAjY29udGVudCBwcm9wZXJ0eVxuXHRcdH1cblxuXHRcdGlmICh0YWdDdHgucHJvcHMubGluayA9PT0gZmFsc2UpIHtcblx0XHRcdC8vIGxpbms9ZmFsc2Ugc2V0dGluZyBvbiBibG9jayB0YWdcblx0XHRcdC8vIFdlIHdpbGwgb3ZlcnJpZGUgaW5oZXJpdGVkIHZhbHVlIG9mIGxpbmsgYnkgdGhlIGV4cGxpY2l0IHNldHRpbmcgbGluaz1mYWxzZSB0YWtlbiBmcm9tIHByb3BzXG5cdFx0XHQvLyBUaGUgY2hpbGQgdmlld3Mgb2YgYW4gdW5saW5rZWQgdmlldyBhcmUgYWxzbyB1bmxpbmtlZC4gU28gc2V0dGluZyBjaGlsZCBiYWNrIHRvIHRydWUgd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0LlxuXHRcdFx0Y29udGV4dCA9IGNvbnRleHQgfHwge307XG5cdFx0XHRjb250ZXh0LmxpbmsgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbVZhciA9IHRhZ0N0eC5wcm9wcy5pdGVtVmFyKSB7XG5cdFx0XHRpZiAoaXRlbVZhci5jaGFyQXQoMCkgIT09IFwiflwiKSB7XG5cdFx0XHRcdHN5bnRheEVycm9yKFwiVXNlIGl0ZW1WYXI9J35teUl0ZW0nXCIpO1xuXHRcdFx0fVxuXHRcdFx0aXRlbVZhciA9IGl0ZW1WYXIuc2xpY2UoMSk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHZpZXcpIHtcblx0XHRvblJlbmRlciA9IG9uUmVuZGVyIHx8IHZpZXcuXy5vblJlbmRlcjtcblx0XHRjb250ZXh0ID0gZXh0ZW5kQ3R4KGNvbnRleHQsIHZpZXcuY3R4KTtcblx0fVxuXG5cdGlmIChrZXkgPT09IHRydWUpIHtcblx0XHRzd2FwQ29udGVudCA9IHRydWU7XG5cdFx0a2V5ID0gMDtcblx0fVxuXG5cdC8vIElmIGxpbms9PT1mYWxzZSwgZG8gbm90IGNhbGwgb25SZW5kZXIsIHNvIG5vIGRhdGEtbGlua2luZyBtYXJrZXIgbm9kZXNcblx0aWYgKG9uUmVuZGVyICYmIChjb250ZXh0ICYmIGNvbnRleHQubGluayA9PT0gZmFsc2UgfHwgdGFnICYmIHRhZy5fLm5vVndzKSkge1xuXHRcdG9uUmVuZGVyID0gdW5kZWZpbmVkO1xuXHR9XG5cdG91dGVyT25SZW5kZXIgPSBvblJlbmRlcjtcblx0aWYgKG9uUmVuZGVyID09PSB0cnVlKSB7XG5cdFx0Ly8gVXNlZCBieSB2aWV3LnJlZnJlc2goKS4gRG9uJ3QgY3JlYXRlIGEgbmV3IHdyYXBwZXIgdmlldy5cblx0XHRvdXRlck9uUmVuZGVyID0gdW5kZWZpbmVkO1xuXHRcdG9uUmVuZGVyID0gdmlldy5fLm9uUmVuZGVyO1xuXHR9XG5cdC8vIFNldCBhZGRpdGlvbmFsIGNvbnRleHQgb24gdmlld3MgY3JlYXRlZCBoZXJlLCAoYXMgbW9kaWZpZWQgY29udGV4dCBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50LCBhbmQgdG8gYmUgaW5oZXJpdGVkIGJ5IGNoaWxkIHZpZXdzKVxuXHRjb250ZXh0ID0gdG1wbC5oZWxwZXJzXG5cdFx0PyBleHRlbmRDdHgodG1wbC5oZWxwZXJzLCBjb250ZXh0KVxuXHRcdDogY29udGV4dDtcblxuXHRuZXdDdHggPSBjb250ZXh0O1xuXHRpZiAoJGlzQXJyYXkoZGF0YSkgJiYgIW5vSXRlcmF0aW9uKSB7XG5cdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgdGhlIGFycmF5LCB3aG9zZSBjaGlsZCB2aWV3cyBjb3JyZXNwb25kIHRvIGVhY2ggZGF0YSBpdGVtLiAoTm90ZTogaWYga2V5IGFuZCB2aWV3IGFyZSBwYXNzZWQgaW5cblx0XHQvLyBhbG9uZyB3aXRoIHBhcmVudCB2aWV3LCB0cmVhdCBhcyBpbnNlcnQgLWUuZy4gZnJvbSB2aWV3LmFkZFZpZXdzIC0gc28gdmlldyBpcyBhbHJlYWR5IHRoZSB2aWV3IGl0ZW0gZm9yIGFycmF5KVxuXHRcdG5ld1ZpZXcgPSBzd2FwQ29udGVudFxuXHRcdFx0PyB2aWV3XG5cdFx0XHQ6IChrZXkgIT09IHVuZGVmaW5lZCAmJiB2aWV3KVxuXHRcdFx0XHR8fCBuZXcgVmlldyhjb250ZXh0LCBcImFycmF5XCIsIHZpZXcsIGRhdGEsIHRtcGwsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKTtcblx0XHRpZiAodmlldyAmJiB2aWV3Ll8udXNlS2V5KSB7XG5cdFx0XHQvLyBQYXJlbnQgaXMgbm90IGFuICdhcnJheSB2aWV3J1xuXHRcdFx0bmV3Vmlldy5fLmJuZCA9ICF0YWcgfHwgdGFnLl8uYm5kICYmIHRhZzsgLy8gRm9yIGFycmF5IHZpZXdzIHRoYXQgYXJlIGRhdGEgYm91bmQgZm9yIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cywgc2V0IHRoZVxuXHRcdFx0Ly8gdmlldy5fLmJuZCBwcm9wZXJ0eSB0byB0cnVlIGZvciB0b3AtbGV2ZWwgbGluaygpIG9yIGRhdGEtbGluaz1cIntmb3J9XCIsIG9yIHRvIHRoZSB0YWcgaW5zdGFuY2UgZm9yIGEgZGF0YS1ib3VuZCB0YWcsIGUuZy4ge157Zm9yIC4uLn19XG5cdFx0fVxuXHRcdGlmIChpdGVtVmFyKSB7XG5cdFx0XHRuZXdWaWV3Lml0ID0gaXRlbVZhcjtcblx0XHR9XG5cdFx0aXRlbVZhciA9IG5ld1ZpZXcuaXQ7XG5cdFx0Zm9yIChpID0gMCwgbCA9IGRhdGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciBlYWNoIGRhdGEgaXRlbS5cblx0XHRcdGlmIChpdGVtVmFyKSB7XG5cdFx0XHRcdHNldEl0ZW1WYXIoZGF0YVtpXSk7IC8vIHVzZSBtb2RpZmllZCBjdHggd2l0aCB1c2VyLW5hbWVkIH5pdGVtXG5cdFx0XHR9XG5cdFx0XHRjaGlsZFZpZXcgPSBuZXcgVmlldyhuZXdDdHgsIFwiaXRlbVwiLCBuZXdWaWV3LCBkYXRhW2ldLCB0bXBsLCAoa2V5IHx8IDApICsgaSwgb25SZW5kZXIsIG5ld1ZpZXcuY29udGVudCk7XG5cblx0XHRcdGl0ZW1SZXN1bHQgPSB0bXBsLmZuKGRhdGFbaV0sIGNoaWxkVmlldywgJHN1Yik7XG5cdFx0XHRyZXN1bHQgKz0gbmV3Vmlldy5fLm9uUmVuZGVyID8gbmV3Vmlldy5fLm9uUmVuZGVyKGl0ZW1SZXN1bHQsIGNoaWxkVmlldykgOiBpdGVtUmVzdWx0O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciBzaW5nbGV0b24gZGF0YSBvYmplY3QuIFRoZSB0eXBlIG9mIHRoZSB2aWV3IHdpbGwgYmUgdGhlIHRhZyBuYW1lLCBlLmcuIFwiaWZcIiBvciBcIm15VGFnXCIgZXhjZXB0IGZvclxuXHRcdC8vIFwiaXRlbVwiLCBcImFycmF5XCIgYW5kIFwiZGF0YVwiIHZpZXdzLiBBIFwiZGF0YVwiIHZpZXcgaXMgZnJvbSBwcm9ncmFtbWF0aWMgcmVuZGVyKG9iamVjdCkgYWdhaW5zdCBhICdzaW5nbGV0b24nLlxuXHRcdGlmIChpdGVtVmFyKSB7XG5cdFx0XHRzZXRJdGVtVmFyKGRhdGEpO1xuXHRcdH1cblx0XHRuZXdWaWV3ID0gc3dhcENvbnRlbnQgPyB2aWV3IDogbmV3IFZpZXcobmV3Q3R4LCB0bXBsTmFtZSB8fCBcImRhdGFcIiwgdmlldywgZGF0YSwgdG1wbCwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpO1xuXHRcdGlmICh0YWcgJiYgIXRhZy5mbG93KSB7XG5cdFx0XHRuZXdWaWV3LnRhZyA9IHRhZztcblx0XHRcdHRhZy52aWV3ID0gbmV3Vmlldztcblx0XHR9XG5cdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YSwgbmV3VmlldywgJHN1Yik7XG5cdH1cblx0cmV0dXJuIG91dGVyT25SZW5kZXIgPyBvdXRlck9uUmVuZGVyKHJlc3VsdCwgbmV3VmlldykgOiByZXN1bHQ7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCdWlsZCBhbmQgY29tcGlsZSB0ZW1wbGF0ZVxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gR2VuZXJhdGUgYSByZXVzYWJsZSBmdW5jdGlvbiB0aGF0IHdpbGwgc2VydmUgdG8gcmVuZGVyIGEgdGVtcGxhdGUgYWdhaW5zdCBkYXRhXG4vLyAoQ29tcGlsZSBBU1QgdGhlbiBidWlsZCB0ZW1wbGF0ZSBmdW5jdGlvbilcblxuZnVuY3Rpb24gb25SZW5kZXJFcnJvcihlLCB2aWV3LCBmYWxsYmFjaykge1xuXHR2YXIgbWVzc2FnZSA9IGZhbGxiYWNrICE9PSB1bmRlZmluZWRcblx0XHQ/ICRpc0Z1bmN0aW9uKGZhbGxiYWNrKVxuXHRcdFx0PyBmYWxsYmFjay5jYWxsKHZpZXcuZGF0YSwgZSwgdmlldylcblx0XHRcdDogZmFsbGJhY2sgfHwgXCJcIlxuXHRcdDogXCJ7RXJyb3I6IFwiICsgZS5tZXNzYWdlICsgXCJ9XCI7XG5cblx0aWYgKCRzdWJTZXR0aW5ncy5vbkVycm9yICYmIChmYWxsYmFjayA9ICRzdWJTZXR0aW5ncy5vbkVycm9yLmNhbGwodmlldy5kYXRhLCBlLCBmYWxsYmFjayAmJiBtZXNzYWdlLCB2aWV3KSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdG1lc3NhZ2UgPSBmYWxsYmFjazsgLy8gVGhlcmUgaXMgYSBzZXR0aW5ncy5kZWJ1Z01vZGUoaGFuZGxlcikgb25FcnJvciBvdmVycmlkZS4gQ2FsbCBpdCwgYW5kIHVzZSByZXR1cm4gdmFsdWUgKGlmIGFueSkgdG8gcmVwbGFjZSBtZXNzYWdlXG5cdH1cblxuXHRyZXR1cm4gdmlldyAmJiAhdmlldy5saW5rQ3R4ID8gJGNvbnZlcnRlcnMuaHRtbChtZXNzYWdlKSA6IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGVycm9yKG1lc3NhZ2UpIHtcblx0dGhyb3cgbmV3ICRzdWIuRXJyKG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBzeW50YXhFcnJvcihtZXNzYWdlKSB7XG5cdGVycm9yKFwiU3ludGF4IGVycm9yXFxuXCIgKyBtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gdG1wbEZuKG1hcmt1cCwgdG1wbCwgaXNMaW5rRXhwciwgY29udmVydEJhY2ssIGhhc0Vsc2UpIHtcblx0Ly8gQ29tcGlsZSBtYXJrdXAgdG8gQVNUIChhYnRyYWN0IHN5bnRheCB0cmVlKSB0aGVuIGJ1aWxkIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBjb2RlIGZyb20gdGhlIEFTVCBub2Rlc1xuXHQvLyBVc2VkIGZvciBjb21waWxpbmcgdGVtcGxhdGVzLCBhbmQgYWxzbyBieSBKc1ZpZXdzIHRvIGJ1aWxkIGZ1bmN0aW9ucyBmb3IgZGF0YSBsaW5rIGV4cHJlc3Npb25zXG5cblx0Ly89PT09IG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXHRmdW5jdGlvbiBwdXNocHJlY2VkaW5nQ29udGVudChzaGlmdCkge1xuXHRcdHNoaWZ0IC09IGxvYztcblx0XHRpZiAoc2hpZnQpIHtcblx0XHRcdGNvbnRlbnQucHVzaChtYXJrdXAuc3Vic3RyKGxvYywgc2hpZnQpLnJlcGxhY2Uock5ld0xpbmUsIFwiXFxcXG5cIikpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGJsb2NrVGFnQ2hlY2sodGFnTmFtZSwgYmxvY2spIHtcblx0XHRpZiAodGFnTmFtZSkge1xuXHRcdFx0dGFnTmFtZSArPSAnfX0nO1xuXHRcdFx0Ly9cdFx0XHQne3tpbmNsdWRlfX0gYmxvY2sgaGFzIHt7L2Zvcn19IHdpdGggbm8gb3BlbiB7e2Zvcn19J1xuXHRcdFx0c3ludGF4RXJyb3IoKFxuXHRcdFx0XHRibG9ja1xuXHRcdFx0XHRcdD8gJ3t7JyArIGJsb2NrICsgJ319IGJsb2NrIGhhcyB7ey8nICsgdGFnTmFtZSArICcgd2l0aG91dCB7eycgKyB0YWdOYW1lXG5cdFx0XHRcdFx0OiAnVW5tYXRjaGVkIG9yIG1pc3Npbmcge3svJyArIHRhZ05hbWUpICsgJywgaW4gdGVtcGxhdGU6XFxuJyArIG1hcmt1cCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VUYWcoYWxsLCBiaW5kLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIGNvbG9uLCBodG1sLCBjb2RlVGFnLCBwYXJhbXMsIHNsYXNoLCBiaW5kMiwgY2xvc2VCbG9jaywgaW5kZXgpIHtcbi8qXG5cbiAgICAgYmluZCAgICAgdGFnTmFtZSAgICAgICAgIGN2dCAgIGNsbiBodG1sIGNvZGUgICAgcGFyYW1zICAgICAgICAgICAgc2xhc2ggICBiaW5kMiAgICAgICAgIGNsb3NlQmxrICBjb21tZW50XG4vKD86eyhcXF4pP3soPzooXFx3Kyg/PVtcXC9cXHN9XSkpfChcXHcrKT8oOil8KD4pfChcXCopKVxccyooKD86W159XXx9KD8hfSkpKj8pKFxcLyk/fHsoXFxeKT97KD86KD86XFwvKFxcdyspKVxccyp8IS0tW1xcc1xcU10qPy0tKSl9fS9nXG5cbig/OlxuICB7KFxcXik/eyAgICAgICAgICAgIGJpbmRcbiAgKD86XG4gICAgKFxcdysgICAgICAgICAgICAgdGFnTmFtZVxuICAgICAgKD89W1xcL1xcc31dKVxuICAgIClcbiAgICB8XG4gICAgKFxcdyspPyg6KSAgICAgICAgY29udmVydGVyIGNvbG9uXG4gICAgfFxuICAgICg+KSAgICAgICAgICAgICAgaHRtbFxuICAgIHxcbiAgICAoXFwqKSAgICAgICAgICAgICBjb2RlVGFnXG4gIClcbiAgXFxzKlxuICAoICAgICAgICAgICAgICAgICAgcGFyYW1zXG4gICAgKD86W159XXx9KD8hfSkpKj9cbiAgKVxuICAoXFwvKT8gICAgICAgICAgICAgIHNsYXNoXG4gIHxcbiAgeyhcXF4pP3sgICAgICAgICAgICBiaW5kMlxuICAoPzpcbiAgICAoPzpcXC8oXFx3KykpXFxzKiAgIGNsb3NlQmxvY2tcbiAgICB8XG4gICAgIS0tW1xcc1xcU10qPy0tICAgIGNvbW1lbnRcbiAgKVxuKVxufX0vZ1xuXG4qL1xuXHRcdGlmIChjb2RlVGFnICYmIGJpbmQgfHwgc2xhc2ggJiYgIXRhZ05hbWUgfHwgcGFyYW1zICYmIHBhcmFtcy5zbGljZSgtMSkgPT09IFwiOlwiIHx8IGJpbmQyKSB7XG5cdFx0XHRzeW50YXhFcnJvcihhbGwpO1xuXHRcdH1cblxuXHRcdC8vIEJ1aWxkIGFic3RyYWN0IHN5bnRheCB0cmVlIChBU1QpOiBbdGFnTmFtZSwgY29udmVydGVyLCBwYXJhbXMsIGNvbnRlbnQsIGhhc2gsIGJpbmRpbmdzLCBjb250ZW50TWFya3VwXVxuXHRcdGlmIChodG1sKSB7XG5cdFx0XHRjb2xvbiA9IFwiOlwiO1xuXHRcdFx0Y29udmVydGVyID0gSFRNTDtcblx0XHR9XG5cdFx0c2xhc2ggPSBzbGFzaCB8fCBpc0xpbmtFeHByICYmICFoYXNFbHNlO1xuXG5cdFx0dmFyIHBhdGhCaW5kaW5ncyA9IChiaW5kIHx8IGlzTGlua0V4cHIpICYmIFtbXV0sXG5cdFx0XHRwcm9wcyA9IFwiXCIsXG5cdFx0XHRhcmdzID0gXCJcIixcblx0XHRcdGN0eFByb3BzID0gXCJcIixcblx0XHRcdHBhcmFtc0FyZ3MgPSBcIlwiLFxuXHRcdFx0cGFyYW1zUHJvcHMgPSBcIlwiLFxuXHRcdFx0cGFyYW1zQ3R4UHJvcHMgPSBcIlwiLFxuXHRcdFx0b25FcnJvciA9IFwiXCIsXG5cdFx0XHR1c2VUcmlnZ2VyID0gXCJcIixcblx0XHRcdC8vIEJsb2NrIHRhZyBpZiBub3Qgc2VsZi1jbG9zaW5nIGFuZCBub3Qge3s6fX0gb3Ige3s+fX0gKHNwZWNpYWwgY2FzZSkgYW5kIG5vdCBhIGRhdGEtbGluayBleHByZXNzaW9uXG5cdFx0XHRibG9jayA9ICFzbGFzaCAmJiAhY29sb247XG5cblx0XHQvLz09PT0gbmVzdGVkIGhlbHBlciBmdW5jdGlvbiA9PT09XG5cdFx0dGFnTmFtZSA9IHRhZ05hbWUgfHwgKHBhcmFtcyA9IHBhcmFtcyB8fCBcIiNkYXRhXCIsIGNvbG9uKTsgLy8ge3s6fX0gaXMgZXF1aXZhbGVudCB0byB7ezojZGF0YX19XG5cdFx0cHVzaHByZWNlZGluZ0NvbnRlbnQoaW5kZXgpO1xuXHRcdGxvYyA9IGluZGV4ICsgYWxsLmxlbmd0aDsgLy8gbG9jYXRpb24gbWFya2VyIC0gcGFyc2VkIHVwIHRvIGhlcmVcblx0XHRpZiAoY29kZVRhZykge1xuXHRcdFx0aWYgKGFsbG93Q29kZSkge1xuXHRcdFx0XHRjb250ZW50LnB1c2goW1wiKlwiLCBcIlxcblwiICsgcGFyYW1zLnJlcGxhY2UoL146LywgXCJyZXQrPSBcIikucmVwbGFjZShyVW5lc2NhcGVRdW90ZXMsIFwiJDFcIikgKyBcIjtcXG5cIl0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGFnTmFtZSkge1xuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwiZWxzZVwiKSB7XG5cdFx0XHRcdGlmIChyVGVzdEVsc2VJZi50ZXN0KHBhcmFtcykpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcignZm9yIFwie3tlbHNlIGlmIGV4cHJ9fVwiIHVzZSBcInt7ZWxzZSBleHByfX1cIicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGhCaW5kaW5ncyA9IGN1cnJlbnRbN10gJiYgW1tdXTtcblx0XHRcdFx0Y3VycmVudFs4XSA9IG1hcmt1cC5zdWJzdHJpbmcoY3VycmVudFs4XSwgaW5kZXgpOyAvLyBjb250ZW50TWFya3VwIGZvciBibG9jayB0YWdcblx0XHRcdFx0Y3VycmVudCA9IHN0YWNrLnBvcCgpO1xuXHRcdFx0XHRjb250ZW50ID0gY3VycmVudFsyXTtcblx0XHRcdFx0YmxvY2sgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcykge1xuXHRcdFx0XHQvLyByZW1vdmUgbmV3bGluZXMgZnJvbSB0aGUgcGFyYW1zIHN0cmluZywgdG8gYXZvaWQgY29tcGlsZWQgY29kZSBlcnJvcnMgZm9yIHVudGVybWluYXRlZCBzdHJpbmdzXG5cdFx0XHRcdHBhcnNlUGFyYW1zKHBhcmFtcy5yZXBsYWNlKHJOZXdMaW5lLCBcIiBcIiksIHBhdGhCaW5kaW5ncywgdG1wbClcblx0XHRcdFx0XHQucmVwbGFjZShyQnVpbGRIYXNoLCBmdW5jdGlvbihhbGwsIG9uZXJyb3IsIGlzQ3R4LCBrZXksIGtleVRva2VuLCBrZXlWYWx1ZSwgYXJnLCBwYXJhbSkge1xuXHRcdFx0XHRcdFx0a2V5ID0gXCInXCIgKyBrZXlUb2tlbiArIFwiJzpcIjtcblx0XHRcdFx0XHRcdGlmIChhcmcpIHtcblx0XHRcdFx0XHRcdFx0YXJncyArPSBrZXlWYWx1ZSArIFwiLFwiO1xuXHRcdFx0XHRcdFx0XHRwYXJhbXNBcmdzICs9IFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGlzQ3R4KSB7XG5cdFx0XHRcdFx0XHRcdGN0eFByb3BzICs9IGtleSArICdqLl9jcCgnICsga2V5VmFsdWUgKyAnLFwiJyArIHBhcmFtICsgJ1wiLHZpZXcpLCc7XG5cdFx0XHRcdFx0XHRcdC8vIENvbXBpbGVkIGNvZGUgZm9yIGV2YWx1YXRpbmcgdGFnQ3R4IG9uIGEgdGFnIHdpbGwgaGF2ZTogY3R4OnsnZm9vJzpqLl9jcChjb21waWxlZEV4cHIsIFwiZXhwclwiLCB2aWV3KX1cblx0XHRcdFx0XHRcdFx0cGFyYW1zQ3R4UHJvcHMgKz0ga2V5ICsgXCInXCIgKyBwYXJhbSArIFwiJyxcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob25lcnJvcikge1xuXHRcdFx0XHRcdFx0XHRvbkVycm9yICs9IGtleVZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0aWYgKGtleVRva2VuID09PSBcInRyaWdnZXJcIikge1xuXHRcdFx0XHRcdFx0XHRcdHVzZVRyaWdnZXIgKz0ga2V5VmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cHJvcHMgKz0ga2V5ICsga2V5VmFsdWUgKyBcIixcIjtcblx0XHRcdFx0XHRcdFx0cGFyYW1zUHJvcHMgKz0ga2V5ICsgXCInXCIgKyBwYXJhbSArIFwiJyxcIjtcblx0XHRcdFx0XHRcdFx0aGFzSGFuZGxlcnMgPSBoYXNIYW5kbGVycyB8fCBySGFzSGFuZGxlcnMudGVzdChrZXlUb2tlbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRcdFx0XHR9KS5zbGljZSgwLCAtMSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwYXRoQmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzWzBdKSB7XG5cdFx0XHRcdHBhdGhCaW5kaW5ncy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBiaW5kaW5ncyB0aGF0IHdhcyBwcmVwYXJlZCBmb3IgbmV4dCBhcmcuIChUaGVyZSBpcyBhbHdheXMgYW4gZXh0cmEgb25lIHJlYWR5KS5cblx0XHRcdH1cblxuXHRcdFx0bmV3Tm9kZSA9IFtcblx0XHRcdFx0XHR0YWdOYW1lLFxuXHRcdFx0XHRcdGNvbnZlcnRlciB8fCAhIWNvbnZlcnRCYWNrIHx8IGhhc0hhbmRsZXJzIHx8IFwiXCIsXG5cdFx0XHRcdFx0YmxvY2sgJiYgW10sXG5cdFx0XHRcdFx0cGFyc2VkUGFyYW0ocGFyYW1zQXJncyB8fCAodGFnTmFtZSA9PT0gXCI6XCIgPyBcIicjZGF0YScsXCIgOiBcIlwiKSwgcGFyYW1zUHJvcHMsIHBhcmFtc0N0eFByb3BzKSwgLy8ge3s6fX0gZXF1aXZhbGVudCB0byB7ezojZGF0YX19XG5cdFx0XHRcdFx0cGFyc2VkUGFyYW0oYXJncyB8fCAodGFnTmFtZSA9PT0gXCI6XCIgPyBcImRhdGEsXCIgOiBcIlwiKSwgcHJvcHMsIGN0eFByb3BzKSxcblx0XHRcdFx0XHRvbkVycm9yLFxuXHRcdFx0XHRcdHVzZVRyaWdnZXIsXG5cdFx0XHRcdFx0cGF0aEJpbmRpbmdzIHx8IDBcblx0XHRcdFx0XTtcblx0XHRcdGNvbnRlbnQucHVzaChuZXdOb2RlKTtcblx0XHRcdGlmIChibG9jaykge1xuXHRcdFx0XHRzdGFjay5wdXNoKGN1cnJlbnQpO1xuXHRcdFx0XHRjdXJyZW50ID0gbmV3Tm9kZTtcblx0XHRcdFx0Y3VycmVudFs4XSA9IGxvYzsgLy8gU3RvcmUgY3VycmVudCBsb2NhdGlvbiBvZiBvcGVuIHRhZywgdG8gYmUgYWJsZSB0byBhZGQgY29udGVudE1hcmt1cCB3aGVuIHdlIHJlYWNoIGNsb3NpbmcgdGFnXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjbG9zZUJsb2NrKSB7XG5cdFx0XHRibG9ja1RhZ0NoZWNrKGNsb3NlQmxvY2sgIT09IGN1cnJlbnRbMF0gJiYgY3VycmVudFswXSAhPT0gXCJlbHNlXCIgJiYgY2xvc2VCbG9jaywgY3VycmVudFswXSk7XG5cdFx0XHRjdXJyZW50WzhdID0gbWFya3VwLnN1YnN0cmluZyhjdXJyZW50WzhdLCBpbmRleCk7IC8vIGNvbnRlbnRNYXJrdXAgZm9yIGJsb2NrIHRhZ1xuXHRcdFx0Y3VycmVudCA9IHN0YWNrLnBvcCgpO1xuXHRcdH1cblx0XHRibG9ja1RhZ0NoZWNrKCFjdXJyZW50ICYmIGNsb3NlQmxvY2spO1xuXHRcdGNvbnRlbnQgPSBjdXJyZW50WzJdO1xuXHR9XG5cdC8vPT09PSAvZW5kIG9mIG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXG5cdHZhciBpLCByZXN1bHQsIG5ld05vZGUsIGhhc0hhbmRsZXJzLCBiaW5kaW5ncyxcblx0XHRhbGxvd0NvZGUgPSAkc3ViU2V0dGluZ3MuYWxsb3dDb2RlIHx8IHRtcGwgJiYgdG1wbC5hbGxvd0NvZGVcblx0XHRcdHx8ICR2aWV3c1NldHRpbmdzLmFsbG93Q29kZSA9PT0gdHJ1ZSwgLy8gaW5jbHVkZSBkaXJlY3Qgc2V0dGluZyBvZiBzZXR0aW5ncy5hbGxvd0NvZGUgdHJ1ZSBmb3IgYmFja3dhcmQgY29tcGF0IG9ubHlcblx0XHRhc3RUb3AgPSBbXSxcblx0XHRsb2MgPSAwLFxuXHRcdHN0YWNrID0gW10sXG5cdFx0Y29udGVudCA9IGFzdFRvcCxcblx0XHRjdXJyZW50ID0gWywsYXN0VG9wXTtcblxuXHRpZiAoYWxsb3dDb2RlICYmIHRtcGwuX2lzKSB7XG5cdFx0dG1wbC5hbGxvd0NvZGUgPSBhbGxvd0NvZGU7XG5cdH1cblxuLy9UT0RPXHRyZXN1bHQgPSB0bXBsRm5zQ2FjaGVbbWFya3VwXTsgLy8gT25seSBjYWNoZSBpZiB0ZW1wbGF0ZSBpcyBub3QgbmFtZWQgYW5kIG1hcmt1cCBsZW5ndGggPCAuLi4sXG4vL2FuZCB0aGVyZSBhcmUgbm8gYmluZGluZ3Mgb3Igc3VidGVtcGxhdGVzPz8gQ29uc2lkZXIgc3RhbmRhcmQgb3B0aW1pemF0aW9uIGZvciBkYXRhLWxpbms9XCJhLmIuY1wiXG4vL1x0XHRpZiAocmVzdWx0KSB7XG4vL1x0XHRcdHRtcGwuZm4gPSByZXN1bHQ7XG4vL1x0XHR9IGVsc2Uge1xuXG4vL1x0XHRyZXN1bHQgPSBtYXJrdXA7XG5cdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0aWYgKGNvbnZlcnRCYWNrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG1hcmt1cCA9IG1hcmt1cC5zbGljZSgwLCAtY29udmVydEJhY2subGVuZ3RoIC0gMikgKyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0fVxuXHRcdG1hcmt1cCA9IGRlbGltT3BlbkNoYXIwICsgbWFya3VwICsgZGVsaW1DbG9zZUNoYXIxO1xuXHR9XG5cblx0YmxvY2tUYWdDaGVjayhzdGFja1swXSAmJiBzdGFja1swXVsyXS5wb3AoKVswXSk7XG5cdC8vIEJ1aWxkIHRoZSBBU1QgKGFic3RyYWN0IHN5bnRheCB0cmVlKSB1bmRlciBhc3RUb3Bcblx0bWFya3VwLnJlcGxhY2UoclRhZywgcGFyc2VUYWcpO1xuXG5cdHB1c2hwcmVjZWRpbmdDb250ZW50KG1hcmt1cC5sZW5ndGgpO1xuXG5cdGlmIChsb2MgPSBhc3RUb3BbYXN0VG9wLmxlbmd0aCAtIDFdKSB7XG5cdFx0YmxvY2tUYWdDaGVjayhcIlwiICsgbG9jICE9PSBsb2MgJiYgKCtsb2NbOF0gPT09IGxvY1s4XSkgJiYgbG9jWzBdKTtcblx0fVxuLy9cdFx0XHRyZXN1bHQgPSB0bXBsRm5zQ2FjaGVbbWFya3VwXSA9IGJ1aWxkQ29kZShhc3RUb3AsIHRtcGwpO1xuLy9cdFx0fVxuXG5cdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0cmVzdWx0ID0gYnVpbGRDb2RlKGFzdFRvcCwgbWFya3VwLCBpc0xpbmtFeHByKTtcblx0XHRiaW5kaW5ncyA9IFtdO1xuXHRcdGkgPSBhc3RUb3AubGVuZ3RoO1xuXHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdGJpbmRpbmdzLnVuc2hpZnQoYXN0VG9wW2ldWzddKTsgIC8vIFdpdGggZGF0YS1saW5rIGV4cHJlc3Npb25zLCBwYXRoQmluZGluZ3MgYXJyYXkgZm9yIHRhZ0N0eFtpXSBpcyBhc3RUb3BbaV1bN11cblx0XHR9XG5cdFx0c2V0UGF0aHMocmVzdWx0LCBiaW5kaW5ncyk7XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gYnVpbGRDb2RlKGFzdFRvcCwgdG1wbCk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2V0UGF0aHMoZm4sIHBhdGhzQXJyKSB7XG5cdHZhciBrZXksIHBhdGhzLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBwYXRoc0Fyci5sZW5ndGg7XG5cdGZuLmRlcHMgPSBbXTtcblx0Zm9yICg7IGkgPCBsOyBpKyspIHtcblx0XHRwYXRocyA9IHBhdGhzQXJyW2ldO1xuXHRcdGZvciAoa2V5IGluIHBhdGhzKSB7XG5cdFx0XHRpZiAoa2V5ICE9PSBcIl9qc3Z0b1wiICYmIHBhdGhzLmhhc093blByb3BlcnR5KGtleSkgJiYgcGF0aHNba2V5XS5sZW5ndGgpIHtcblx0XHRcdFx0Zm4uZGVwcyA9IGZuLmRlcHMuY29uY2F0KHBhdGhzW2tleV0pOyAvLyBkZXBzIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBwYXRocyBhcnJheXMgZm9yIHRoZSBkaWZmZXJlbnQgYmluZGluZ3Ncblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Zm4ucGF0aHMgPSBwYXRoczsgLy8gVGhlIGFycmF5IG9mIHBhdGhzIGFycmF5cyBmb3IgdGhlIGRpZmZlcmVudCBiaW5kaW5nc1xufVxuXG5mdW5jdGlvbiBwYXJzZWRQYXJhbShhcmdzLCBwcm9wcywgY3R4KSB7XG5cdHJldHVybiBbYXJncy5zbGljZSgwLCAtMSksIHByb3BzLnNsaWNlKDAsIC0xKSwgY3R4LnNsaWNlKDAsIC0xKV07XG59XG5cbmZ1bmN0aW9uIHBhcmFtU3RydWN0dXJlKHBhcnRzLCB0eXBlKSB7XG5cdHJldHVybiAnXFxuXFx0J1xuXHRcdCsgKHR5cGVcblx0XHRcdD8gdHlwZSArICc6eydcblx0XHRcdDogJycpXG5cdFx0KyAnYXJnczpbJyArIHBhcnRzWzBdICsgJ10nXG5cdFx0KyAocGFydHNbMV0gfHwgIXR5cGVcblx0XHRcdD8gJyxcXG5cXHRwcm9wczp7JyArIHBhcnRzWzFdICsgJ30nXG5cdFx0XHQ6IFwiXCIpXG5cdFx0KyAocGFydHNbMl0gPyAnLFxcblxcdGN0eDp7JyArIHBhcnRzWzJdICsgJ30nIDogXCJcIik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zKHBhcmFtcywgcGF0aEJpbmRpbmdzLCB0bXBsKSB7XG5cblx0ZnVuY3Rpb24gcGFyc2VUb2tlbnMoYWxsLCBsZnRQcm4wLCBsZnRQcm4sIGJvdW5kLCBwYXRoLCBvcGVyYXRvciwgZXJyLCBlcSwgcGF0aDIsIHBybiwgY29tbWEsIGxmdFBybjIsIGFwb3MsIHF1b3QsIHJ0UHJuLCBydFBybkRvdCwgcHJuMiwgc3BhY2UsIGluZGV4LCBmdWxsKSB7XG5cdC8vIC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICBsZnRQcm4wICAgICAgICBsZnRQcm4gICAgICAgIGJvdW5kICAgICAgICAgICAgcGF0aCAgICBvcGVyYXRvciBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcSAgICAgICAgICAgICBwYXRoMiAgICAgICBwcm4gICAgY29tbWEgICBsZnRQcm4yICAgYXBvcyBxdW90ICAgICAgcnRQcm4gcnRQcm5Eb3QgICAgICAgICAgICAgICAgICAgICAgICBwcm4yICBzcGFjZVxuXHRcdC8vIChsZWZ0IHBhcmVuPyBmb2xsb3dlZCBieSAocGF0aD8gZm9sbG93ZWQgYnkgb3BlcmF0b3IpIG9yIChwYXRoIGZvbGxvd2VkIGJ5IHBhcmVuPykpIG9yIGNvbW1hIG9yIGFwb3Mgb3IgcXVvdCBvciByaWdodCBwYXJlbiBvciBzcGFjZVxuXHRcdGZ1bmN0aW9uIHBhcnNlUGF0aChhbGxQYXRoLCBub3QsIG9iamVjdCwgaGVscGVyLCB2aWV3LCB2aWV3UHJvcGVydHksIHBhdGhUb2tlbnMsIGxlYWZUb2tlbikge1xuXHRcdFx0Ly9yUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHRcdFx0Ly8gICAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cdFx0XHR2YXIgc3ViUGF0aCA9IG9iamVjdCA9PT0gXCIuXCI7XG5cdFx0XHRpZiAob2JqZWN0KSB7XG5cdFx0XHRcdHBhdGggPSBwYXRoLnNsaWNlKG5vdC5sZW5ndGgpO1xuXHRcdFx0XHRpZiAoL15cXC4/Y29uc3RydWN0b3IkLy50ZXN0KGxlYWZUb2tlbnx8cGF0aCkpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihhbGxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXN1YlBhdGgpIHtcblx0XHRcdFx0XHRhbGxQYXRoID0gKGhlbHBlclxuXHRcdFx0XHRcdFx0XHQ/ICd2aWV3LmhscChcIicgKyBoZWxwZXIgKyAnXCIpJ1xuXHRcdFx0XHRcdFx0XHQ6IHZpZXdcblx0XHRcdFx0XHRcdFx0XHQ/IFwidmlld1wiXG5cdFx0XHRcdFx0XHRcdFx0OiBcImRhdGFcIilcblx0XHRcdFx0XHRcdCsgKGxlYWZUb2tlblxuXHRcdFx0XHRcdFx0XHQ/ICh2aWV3UHJvcGVydHlcblx0XHRcdFx0XHRcdFx0XHQ/IFwiLlwiICsgdmlld1Byb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0OiBoZWxwZXJcblx0XHRcdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0OiAodmlldyA/IFwiXCIgOiBcIi5cIiArIG9iamVjdClcblx0XHRcdFx0XHRcdFx0XHQpICsgKHBhdGhUb2tlbnMgfHwgXCJcIilcblx0XHRcdFx0XHRcdFx0OiAobGVhZlRva2VuID0gaGVscGVyID8gXCJcIiA6IHZpZXcgPyB2aWV3UHJvcGVydHkgfHwgXCJcIiA6IG9iamVjdCwgXCJcIikpO1xuXG5cdFx0XHRcdFx0YWxsUGF0aCA9IGFsbFBhdGggKyAobGVhZlRva2VuID8gXCIuXCIgKyBsZWFmVG9rZW4gOiBcIlwiKTtcblxuXHRcdFx0XHRcdGFsbFBhdGggPSBub3QgKyAoYWxsUGF0aC5zbGljZSgwLCA5KSA9PT0gXCJ2aWV3LmRhdGFcIlxuXHRcdFx0XHRcdFx0PyBhbGxQYXRoLnNsaWNlKDUpIC8vIGNvbnZlcnQgI3ZpZXcuZGF0YS4uLiB0byBkYXRhLi4uXG5cdFx0XHRcdFx0XHQ6IGFsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChiaW5kaW5ncykge1xuXHRcdFx0XHRcdGJpbmRzID0gbmFtZWQgPT09IFwibGlua1RvXCIgPyAoYmluZHRvID0gcGF0aEJpbmRpbmdzLl9qc3Z0byA9IHBhdGhCaW5kaW5ncy5fanN2dG8gfHwgW10pIDogYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdGlmICh0aGVPYiA9IHN1YlBhdGggJiYgYmluZHNbYmluZHMubGVuZ3RoLTFdKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhlT2IuX2pzdikge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAodGhlT2Iuc2IpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGVPYiA9IHRoZU9iLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0aGVPYi5ibmQpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoID0gXCJeXCIgKyBwYXRoLnNsaWNlKDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoZU9iLnNiID0gcGF0aDtcblx0XHRcdFx0XHRcdFx0dGhlT2IuYm5kID0gdGhlT2IuYm5kIHx8IHBhdGguY2hhckF0KDApID09PSBcIl5cIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YmluZHMucHVzaChwYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGF0aFN0YXJ0W3BhcmVuRGVwdGhdID0gaW5kZXggKyAoc3ViUGF0aCA/IDEgOiAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFsbFBhdGg7XG5cdFx0fVxuXG5cdFx0Ly9ib3VuZCA9IGJpbmRpbmdzICYmIGJvdW5kO1xuXHRcdGlmIChib3VuZCAmJiAhZXEpIHtcblx0XHRcdHBhdGggPSBib3VuZCArIHBhdGg7IC8vIGUuZy4gc29tZS5mbiguLi4pXnNvbWUucGF0aCAtIHNvIGhlcmUgcGF0aCBpcyBcIl5zb21lLnBhdGhcIlxuXHRcdH1cblx0XHRvcGVyYXRvciA9IG9wZXJhdG9yIHx8IFwiXCI7XG5cdFx0bGZ0UHJuID0gbGZ0UHJuIHx8IGxmdFBybjAgfHwgbGZ0UHJuMjtcblx0XHRwYXRoID0gcGF0aCB8fCBwYXRoMjtcblx0XHQvLyBDb3VsZCBkbyB0aGlzIC0gYnV0IG5vdCB3b3J0aCBwZXJmIGNvc3Q/PyA6LVxuXHRcdC8vIGlmICghcGF0aC5sYXN0SW5kZXhPZihcIiNkYXRhLlwiLCAwKSkgeyBwYXRoID0gcGF0aC5zbGljZSg2KTsgfSAvLyBJZiBwYXRoIHN0YXJ0cyB3aXRoIFwiI2RhdGEuXCIsIHJlbW92ZSB0aGF0LlxuXHRcdHBybiA9IHBybiB8fCBwcm4yIHx8IFwiXCI7XG5cblx0XHR2YXIgZXhwciwgZXhwckZuLCBiaW5kcywgdGhlT2IsIG5ld09iLFxuXHRcdFx0cnRTcSA9IFwiKVwiO1xuXG5cdFx0aWYgKHBybiA9PT0gXCJbXCIpIHtcblx0XHRcdHBybiAgPVwiW2ouX3NxKFwiO1xuXHRcdFx0cnRTcSA9IFwiKV1cIjtcblx0XHR9XG5cblx0XHRpZiAoZXJyICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0c3ludGF4RXJyb3IocGFyYW1zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGJpbmRpbmdzICYmIHJ0UHJuRG90ICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgYmluZGluZyB0byBhIHBhdGggaW4gd2hpY2ggYW4gb2JqZWN0IGlzIHJldHVybmVkIGJ5IGEgaGVscGVyL2RhdGEgZnVuY3Rpb24vZXhwcmVzc2lvbiwgZS5nLiBmb28oKV54Lnkgb3IgKGE/YjpjKV54Lnlcblx0XHRcdFx0Ly8gV2UgY3JlYXRlIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gZ2V0IHRoZSBvYmplY3QgaW5zdGFuY2UgKHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGRlcGVuZGVudCBkYXRhIG9mIHRoZSBzdWJleHByZXNzaW9uIGNoYW5nZXMsIHRvIHJldHVybiB0aGUgbmV3IG9iamVjdCwgYW5kIHRyaWdnZXIgcmUtYmluZGluZyBvZiB0aGUgc3Vic2VxdWVudCBwYXRoKVxuXHRcdFx0XHRpZiAoIW5hbWVkIHx8IGJvdW5kTmFtZSB8fCBiaW5kdG8pIHtcblx0XHRcdFx0XHRleHByID0gcGF0aFN0YXJ0W3BhcmVuRGVwdGggLSAxXTtcblx0XHRcdFx0XHRpZiAoZnVsbC5sZW5ndGggLSAxID4gaW5kZXggLSAoZXhwciB8fCAwKSkgeyAvLyBXZSBuZWVkIHRvIGNvbXBpbGUgYSBzdWJleHByZXNzaW9uXG5cdFx0XHRcdFx0XHRleHByID0gZnVsbC5zbGljZShleHByLCBpbmRleCArIGFsbC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0aWYgKGV4cHJGbiAhPT0gdHJ1ZSkgeyAvLyBJZiBub3QgcmVlbnRyYW50IGNhbGwgZHVyaW5nIGNvbXBpbGF0aW9uXG5cdFx0XHRcdFx0XHRcdGJpbmRzID0gYmluZHRvIHx8IGJuZFN0YWNrW3BhcmVuRGVwdGgtMV0uYmQ7XG5cdFx0XHRcdFx0XHRcdC8vIEluc2VydCBleHByT2Igb2JqZWN0LCB0byBiZSB1c2VkIGR1cmluZyBiaW5kaW5nIHRvIHJldHVybiB0aGUgY29tcHV0ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdHRoZU9iID0gYmluZHNbYmluZHMubGVuZ3RoLTFdO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhlT2IgJiYgdGhlT2IucHJtKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKHRoZU9iLnNiICYmIHRoZU9iLnNiLnBybSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhlT2IgPSB0aGVPYi5zYjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bmV3T2IgPSB0aGVPYi5zYiA9IHtwYXRoOiB0aGVPYi5zYiwgYm5kOiB0aGVPYi5ibmR9O1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGJpbmRzLnB1c2gobmV3T2IgPSB7cGF0aDogYmluZHMucG9wKCl9KTsgLy8gSW5zZXJ0IGV4cHJPYiBvYmplY3QsIHRvIGJlIHVzZWQgZHVyaW5nIGJpbmRpbmcgdG8gcmV0dXJuIHRoZSBjb21wdXRlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgLy8gKGUuZy4gXCJzb21lLm9iamVjdCgpXCIgaW4gXCJzb21lLm9iamVjdCgpLmEuYlwiIC0gdG8gYmUgdXNlZCBhcyBjb250ZXh0IGZvciBiaW5kaW5nIHRoZSBmb2xsb3dpbmcgdG9rZW5zIFwiYS5iXCIpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRydFBybkRvdCA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBleHByIC8vIFRoZSBwYXJhbWV0ZXIgb3IgZnVuY3Rpb24gc3ViZXhwcmVzc2lvblxuXHRcdFx0XHRcdFx0XHQrIFwiIG9uZXJyb3I9JydcIiAvLyBzZXQgb25lcnJvcj0nJyBpbiBvcmRlciB0byB3cmFwIGdlbmVyYXRlZCBjb2RlIHdpdGggYSB0cnkgY2F0Y2ggLSByZXR1cm5pbmcgJycgYXMgb2JqZWN0IGluc3RhbmNlIGlmIHRoZXJlIGlzIGFuIGVycm9yL21pc3NpbmcgcGFyZW50XG5cdFx0XHRcdFx0XHRcdCsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0XHRcdFx0ZXhwckZuID0gdG1wbExpbmtzW3J0UHJuRG90XTtcblx0XHRcdFx0XHRcdGlmICghZXhwckZuKSB7XG5cdFx0XHRcdFx0XHRcdHRtcGxMaW5rc1tydFBybkRvdF0gPSB0cnVlOyAvLyBGbGFnIHRoYXQgdGhpcyBleHByRm4gKGZvciBydFBybkRvdCkgaXMgYmVpbmcgY29tcGlsZWRcblx0XHRcdFx0XHRcdFx0dG1wbExpbmtzW3J0UHJuRG90XSA9IGV4cHJGbiA9IHRtcGxGbihydFBybkRvdCwgdG1wbCwgdHJ1ZSk7IC8vIENvbXBpbGUgdGhlIGV4cHJlc3Npb24gKG9yIHVzZSBjYWNoZWQgY29weSBhbHJlYWR5IGluIHRtcGwubGlua3MpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoZXhwckZuICE9PSB0cnVlICYmIG5ld09iKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIG5vdCByZWVudHJhbnQgY2FsbCBkdXJpbmcgY29tcGlsYXRpb25cblx0XHRcdFx0XHRcdFx0bmV3T2IuX2pzdiA9IGV4cHJGbjtcblx0XHRcdFx0XHRcdFx0bmV3T2IucHJtID0gYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdFx0XHRuZXdPYi5ibmQgPSBuZXdPYi5ibmQgfHwgbmV3T2IucGF0aCAmJiBuZXdPYi5wYXRoLmluZGV4T2YoXCJeXCIpID49IDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKGFwb3NlZFxuXHRcdFx0XHQvLyB3aXRoaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmdcblx0XHRcdFx0PyAoYXBvc2VkID0gIWFwb3MsIChhcG9zZWQgPyBhbGwgOiBsZnRQcm4yICsgJ1wiJykpXG5cdFx0XHRcdDogcXVvdGVkXG5cdFx0XHRcdC8vIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ1xuXHRcdFx0XHRcdD8gKHF1b3RlZCA9ICFxdW90LCAocXVvdGVkID8gYWxsIDogbGZ0UHJuMiArICdcIicpKVxuXHRcdFx0XHRcdDpcblx0XHRcdFx0KFxuXHRcdFx0XHRcdChsZnRQcm5cblx0XHRcdFx0XHRcdD8gKHBhdGhTdGFydFtwYXJlbkRlcHRoXSA9IGluZGV4KyssIGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0gPSB7YmQ6IFtdfSwgbGZ0UHJuKVxuXHRcdFx0XHRcdFx0OiBcIlwiKVxuXHRcdFx0XHRcdCsgKHNwYWNlXG5cdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoXG5cdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHQvLyBOZXcgYXJnIG9yIHByb3AgLSBzbyBpbnNlcnQgYmFja3NwYWNlIFxcYiAoXFx4MDgpIGFzIHNlcGFyYXRvciBmb3IgbmFtZWQgcGFyYW1zLCB1c2VkIHN1YnNlcXVlbnRseSBieSByQnVpbGRIYXNoLCBhbmQgcHJlcGFyZSBuZXcgYmluZGluZ3MgYXJyYXlcblx0XHRcdFx0XHRcdFx0OiAocGFyYW1JbmRleCA9IGZ1bGwuc2xpY2UocGFyYW1JbmRleCwgaW5kZXgpLCBuYW1lZFxuXHRcdFx0XHRcdFx0XHRcdD8gKG5hbWVkID0gYm91bmROYW1lID0gYmluZHRvID0gZmFsc2UsIFwiXFxiXCIpXG5cdFx0XHRcdFx0XHRcdFx0OiBcIlxcYixcIikgKyBwYXJhbUluZGV4ICsgKHBhcmFtSW5kZXggPSBpbmRleCArIGFsbC5sZW5ndGgsIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wdXNoKGJuZEN0eC5iZCA9IFtdKSwgXCJcXGJcIilcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogZXFcblx0XHRcdFx0Ly8gbmFtZWQgcGFyYW0uIFJlbW92ZSBiaW5kaW5ncyBmb3IgYXJnIGFuZCBjcmVhdGUgaW5zdGVhZCBiaW5kaW5ncyBhcnJheSBmb3IgcHJvcFxuXHRcdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoICYmIHN5bnRheEVycm9yKHBhcmFtcyksIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wb3AoKSwgbmFtZWQgPSBwYXRoLCBib3VuZE5hbWUgPSBib3VuZCwgcGFyYW1JbmRleCA9IGluZGV4ICsgYWxsLmxlbmd0aCwgYm91bmQgJiYgKGJpbmRpbmdzID0gYm5kQ3R4LmJkID0gcGF0aEJpbmRpbmdzW25hbWVkXSA9IFtdKSwgcGF0aCArICc6Jylcblx0XHRcdFx0XHRcdFx0OiBwYXRoXG5cdFx0XHRcdC8vIHBhdGhcblx0XHRcdFx0XHRcdFx0XHQ/IChwYXRoLnNwbGl0KFwiXlwiKS5qb2luKFwiLlwiKS5yZXBsYWNlKHJQYXRoLCBwYXJzZVBhdGgpXG5cdFx0XHRcdFx0XHRcdFx0XHQrIChwcm5cblx0XHRcdFx0Ly8gc29tZS5mbmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0gPSB7YmQ6IFtdfSwgZm5DYWxsW3BhcmVuRGVwdGhdID0gcnRTcSwgcHJuKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IG9wZXJhdG9yKVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQ6IG9wZXJhdG9yXG5cdFx0XHRcdC8vIG9wZXJhdG9yXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IG9wZXJhdG9yXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IHJ0UHJuXG5cdFx0XHRcdC8vIGZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gKChydFBybiA9IGZuQ2FsbFtwYXJlbkRlcHRoXSB8fCBydFBybiwgZm5DYWxsW3BhcmVuRGVwdGhdID0gZmFsc2UsIGJuZEN0eCA9IGJuZFN0YWNrWy0tcGFyZW5EZXB0aF0sIHJ0UHJuKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgKHBybiAvLyBydFBybiBhbmQgcHJuLCBlLmcgKSggaW4gKGEpKCkgb3IgYSgpKCksIG9yIClbIGluIGEoKVtdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChibmRDdHggPSBibmRTdGFja1srK3BhcmVuRGVwdGhdLCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBydFNxLCBwcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBjb21tYVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGZuQ2FsbFtwYXJlbkRlcHRoXSB8fCBzeW50YXhFcnJvcihwYXJhbXMpLCBcIixcIikgLy8gV2UgZG9uJ3QgYWxsb3cgdG9wLWxldmVsIGxpdGVyYWwgYXJyYXlzIG9yIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGxmdFBybjBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiAoYXBvc2VkID0gYXBvcywgcXVvdGVkID0gcXVvdCwgJ1wiJylcblx0XHRcdFx0KSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIG5hbWVkLCBiaW5kdG8sIGJvdW5kTmFtZSxcblx0XHRxdW90ZWQsIC8vIGJvb2xlYW4gZm9yIHN0cmluZyBjb250ZW50IGluIGRvdWJsZSBxdW90ZXNcblx0XHRhcG9zZWQsIC8vIG9yIGluIHNpbmdsZSBxdW90ZXNcblx0XHRiaW5kaW5ncyA9IHBhdGhCaW5kaW5ncyAmJiBwYXRoQmluZGluZ3NbMF0sIC8vIGJpbmRpbmdzIGFycmF5IGZvciB0aGUgZmlyc3QgYXJnXG5cdFx0Ym5kQ3R4ID0ge2JkOiBiaW5kaW5nc30sXG5cdFx0Ym5kU3RhY2sgPSB7MDogYm5kQ3R4fSxcblx0XHRwYXJhbUluZGV4ID0gMCwgLy8gbGlzdCxcblx0XHR0bXBsTGlua3MgPSAodG1wbCA/IHRtcGwubGlua3MgOiBiaW5kaW5ncyAmJiAoYmluZGluZ3MubGlua3MgPSBiaW5kaW5ncy5saW5rcyB8fCB7fSkpIHx8IHRvcFZpZXcudG1wbC5saW5rcyxcblx0XHQvLyBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGZvciB0cmFja2luZyBwYXRoIHBhcnNpbmcgaW5jbHVkaW5nIG5lc3RlZCBwYXRocywgc3VjaCBhcyBcImEuYihjXmQgKyAoZSkpXmZcIiwgYW5kIGNoYWluZWQgY29tcHV0ZWQgcGF0aHMgc3VjaCBhc1xuXHRcdC8vIFwiYS5iKCkuY15kKCkuZS5mKCkuZ1wiIC0gd2hpY2ggaGFzIGZvdXIgY2hhaW5lZCBwYXRocywgXCJhLmIoKVwiLCBcIl5jLmQoKVwiLCBcIi5lLmYoKVwiIGFuZCBcIi5nXCJcblx0XHRwYXJlbkRlcHRoID0gMCxcblx0XHRmbkNhbGwgPSB7fSwgLy8gV2UgYXJlIGluIGEgZnVuY3Rpb24gY2FsbFxuXHRcdHBhdGhTdGFydCA9IHt9LCAvLyB0cmFja3MgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHBhdGggc3VjaCBhcyBjXmQoKSBpbiB0aGUgYWJvdmUgZXhhbXBsZVxuXHRcdHJlc3VsdCA9IChwYXJhbXMgKyAodG1wbCA/IFwiIFwiIDogXCJcIikpLnJlcGxhY2UoclBhcmFtcywgcGFyc2VUb2tlbnMpO1xuXG5cdHJldHVybiAhcGFyZW5EZXB0aCAmJiByZXN1bHQgfHwgc3ludGF4RXJyb3IocGFyYW1zKTsgLy8gU3ludGF4IGVycm9yIGlmIHVuYmFsYW5jZWQgcGFyZW5zIGluIHBhcmFtcyBleHByZXNzaW9uXG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29kZShhc3QsIHRtcGwsIGlzTGlua0V4cHIpIHtcblx0Ly8gQnVpbGQgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIGNvZGUgZnJvbSB0aGUgQVNUIG5vZGVzLCBhbmQgc2V0IGFzIHByb3BlcnR5IG9uIHRoZSBwYXNzZWQtaW4gdGVtcGxhdGUgb2JqZWN0XG5cdC8vIFVzZWQgZm9yIGNvbXBpbGluZyB0ZW1wbGF0ZXMsIGFuZCBhbHNvIGJ5IEpzVmlld3MgdG8gYnVpbGQgZnVuY3Rpb25zIGZvciBkYXRhIGxpbmsgZXhwcmVzc2lvbnNcblx0dmFyIGksIG5vZGUsIHRhZ05hbWUsIGNvbnZlcnRlciwgdGFnQ3R4LCBoYXNUYWcsIGhhc0VuY29kZXIsIGdldHNWYWwsIGhhc0NudnQsIHVzZUNudnQsIHRtcGxCaW5kaW5ncywgcGF0aEJpbmRpbmdzLCBwYXJhbXMsIGJvdW5kT25FcnJTdGFydCwgYm91bmRPbkVyckVuZCxcblx0XHR0YWdSZW5kZXIsIG5lc3RlZFRtcGxzLCB0bXBsTmFtZSwgbmVzdGVkVG1wbCwgdGFnQW5kRWxzZXMsIGNvbnRlbnQsIG1hcmt1cCwgbmV4dElzRWxzZSwgb2xkQ29kZSwgaXNFbHNlLCBpc0dldFZhbCwgdGFnQ3R4Rm4sIG9uRXJyb3IsIHRhZ1N0YXJ0LCB0cmlnZ2VyLFxuXHRcdHRtcGxCaW5kaW5nS2V5ID0gMCxcblx0XHR1c2VWaWV3cyA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLnVzZVZpZXdzIHx8IHRtcGwudXNlVmlld3MgfHwgdG1wbC50YWdzIHx8IHRtcGwudGVtcGxhdGVzIHx8IHRtcGwuaGVscGVycyB8fCB0bXBsLmNvbnZlcnRlcnMsXG5cdFx0Y29kZSA9IFwiXCIsXG5cdFx0dG1wbE9wdGlvbnMgPSB7fSxcblx0XHRsID0gYXN0Lmxlbmd0aDtcblxuXHRpZiAoXCJcIiArIHRtcGwgPT09IHRtcGwpIHtcblx0XHR0bXBsTmFtZSA9IGlzTGlua0V4cHIgPyAnZGF0YS1saW5rPVwiJyArIHRtcGwucmVwbGFjZShyTmV3TGluZSwgXCIgXCIpLnNsaWNlKDEsIC0xKSArICdcIicgOiB0bXBsO1xuXHRcdHRtcGwgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHRtcGxOYW1lID0gdG1wbC50bXBsTmFtZSB8fCBcInVubmFtZWRcIjtcblx0XHRpZiAodG1wbC5hbGxvd0NvZGUpIHtcblx0XHRcdHRtcGxPcHRpb25zLmFsbG93Q29kZSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmICh0bXBsLmRlYnVnKSB7XG5cdFx0XHR0bXBsT3B0aW9ucy5kZWJ1ZyA9IHRydWU7XG5cdFx0fVxuXHRcdHRtcGxCaW5kaW5ncyA9IHRtcGwuYm5kcztcblx0XHRuZXN0ZWRUbXBscyA9IHRtcGwudG1wbHM7XG5cdH1cblx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdC8vIEFTVCBub2RlczogWzA6IHRhZ05hbWUsIDE6IGNvbnZlcnRlciwgMjogY29udGVudCwgMzogcGFyYW1zLCA0OiBjb2RlLCA1OiBvbkVycm9yLCA2OiB0cmlnZ2VyLCA3OnBhdGhCaW5kaW5ncywgODogY29udGVudE1hcmt1cF1cblx0XHRub2RlID0gYXN0W2ldO1xuXG5cdFx0Ly8gQWRkIG5ld2xpbmUgZm9yIGVhY2ggY2FsbG91dCB0byB0KCkgYygpIGV0Yy4gYW5kIGVhY2ggbWFya3VwIHN0cmluZ1xuXHRcdGlmIChcIlwiICsgbm9kZSA9PT0gbm9kZSkge1xuXHRcdFx0Ly8gYSBtYXJrdXAgc3RyaW5nIHRvIGJlIGluc2VydGVkXG5cdFx0XHRjb2RlICs9ICdcXG4rXCInICsgbm9kZSArICdcIic7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGEgY29tcGlsZWQgdGFnIGV4cHJlc3Npb24gdG8gYmUgaW5zZXJ0ZWRcblx0XHRcdHRhZ05hbWUgPSBub2RlWzBdO1xuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwiKlwiKSB7XG5cdFx0XHRcdC8vIENvZGUgdGFnOiB7eyogfX1cblx0XHRcdFx0Y29kZSArPSBcIjtcXG5cIiArIG5vZGVbMV0gKyBcIlxcbnJldD1yZXRcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnZlcnRlciA9IG5vZGVbMV07XG5cdFx0XHRcdGNvbnRlbnQgPSAhaXNMaW5rRXhwciAmJiBub2RlWzJdO1xuXHRcdFx0XHR0YWdDdHggPSBwYXJhbVN0cnVjdHVyZShub2RlWzNdLCAncGFyYW1zJykgKyAnfSwnICsgcGFyYW1TdHJ1Y3R1cmUocGFyYW1zID0gbm9kZVs0XSk7XG5cdFx0XHRcdG9uRXJyb3IgPSBub2RlWzVdO1xuXHRcdFx0XHR0cmlnZ2VyID0gbm9kZVs2XTtcblx0XHRcdFx0bWFya3VwID0gbm9kZVs4XSAmJiBub2RlWzhdLnJlcGxhY2UoclVuZXNjYXBlUXVvdGVzLCBcIiQxXCIpO1xuXHRcdFx0XHRpZiAoaXNFbHNlID0gdGFnTmFtZSA9PT0gXCJlbHNlXCIpIHtcblx0XHRcdFx0XHRpZiAocGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRwYXRoQmluZGluZ3MucHVzaChub2RlWzddKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dG1wbEJpbmRpbmdLZXkgPSAwO1xuXHRcdFx0XHRcdGlmICh0bXBsQmluZGluZ3MgJiYgKHBhdGhCaW5kaW5ncyA9IG5vZGVbN10pKSB7IC8vIEFycmF5IG9mIHBhdGhzLCBvciBmYWxzZSBpZiBub3QgZGF0YS1ib3VuZFxuXHRcdFx0XHRcdFx0cGF0aEJpbmRpbmdzID0gW3BhdGhCaW5kaW5nc107XG5cdFx0XHRcdFx0XHR0bXBsQmluZGluZ0tleSA9IHRtcGxCaW5kaW5ncy5wdXNoKDEpOyAvLyBBZGQgcGxhY2Vob2xkZXIgaW4gdG1wbEJpbmRpbmdzIGZvciBjb21waWxlZCBmdW5jdGlvblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR1c2VWaWV3cyA9IHVzZVZpZXdzIHx8IHBhcmFtc1sxXSB8fCBwYXJhbXNbMl0gfHwgcGF0aEJpbmRpbmdzIHx8IC92aWV3Lig/IWluZGV4KS8udGVzdChwYXJhbXNbMF0pO1xuXHRcdFx0XHQvLyB1c2VWaWV3cyBpcyBmb3IgcGVyZiBvcHRpbWl6YXRpb24uIEZvciByZW5kZXIoKSB3ZSBvbmx5IHVzZSB2aWV3cyBpZiBuZWNlc3NhcnkgLSBmb3IgdGhlIG1vcmUgYWR2YW5jZWQgc2NlbmFyaW9zLlxuXHRcdFx0XHQvLyBXZSB1c2Ugdmlld3MgaWYgdGhlcmUgYXJlIHByb3BzLCBjb250ZXh0dWFsIHByb3BlcnRpZXMgb3IgYXJncyB3aXRoICMuLi4gKG90aGVyIHRoYW4gI2luZGV4KSAtIGJ1dCB5b3UgY2FuIGZvcmNlXG5cdFx0XHRcdC8vIHVzaW5nIHRoZSBmdWxsIHZpZXcgaW5mcmFzdHJ1Y3R1cmUsIChhbmQgcGF5IGEgcGVyZiBwcmljZSkgYnkgb3B0aW5nIGluOiBTZXQgdXNlVmlld3M6IHRydWUgb24gdGhlIHRlbXBsYXRlLCBtYW51YWxseS4uLlxuXHRcdFx0XHRpZiAoaXNHZXRWYWwgPSB0YWdOYW1lID09PSBcIjpcIikge1xuXHRcdFx0XHRcdGlmIChjb252ZXJ0ZXIpIHtcblx0XHRcdFx0XHRcdHRhZ05hbWUgPSBjb252ZXJ0ZXIgPT09IEhUTUwgPyBcIj5cIiA6IGNvbnZlcnRlciArIHRhZ05hbWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChjb250ZW50KSB7IC8vIFRPRE8gb3B0aW1pemUgLSBpZiBjb250ZW50Lmxlbmd0aCA9PT0gMCBvciBpZiB0aGVyZSBpcyBhIHRtcGw9XCIuLi5cIiBzcGVjaWZpZWQgLSBzZXQgY29udGVudCB0byBudWxsIC8gZG9uJ3QgcnVuIHRoaXMgY29tcGlsYXRpb24gY29kZSAtIHNpbmNlIGNvbnRlbnQgd29uJ3QgZ2V0IHVzZWQhIVxuXHRcdFx0XHRcdFx0Ly8gQ3JlYXRlIHRlbXBsYXRlIG9iamVjdCBmb3IgbmVzdGVkIHRlbXBsYXRlXG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBsID0gdG1wbE9iamVjdChtYXJrdXAsIHRtcGxPcHRpb25zKTtcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwudG1wbE5hbWUgPSB0bXBsTmFtZSArIFwiL1wiICsgdGFnTmFtZTtcblx0XHRcdFx0XHRcdC8vIENvbXBpbGUgdG8gQVNUIGFuZCB0aGVuIHRvIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBsLnVzZVZpZXdzID0gbmVzdGVkVG1wbC51c2VWaWV3cyB8fCB1c2VWaWV3cztcblx0XHRcdFx0XHRcdGJ1aWxkQ29kZShjb250ZW50LCBuZXN0ZWRUbXBsKTtcblx0XHRcdFx0XHRcdHVzZVZpZXdzID0gbmVzdGVkVG1wbC51c2VWaWV3cztcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGxzLnB1c2gobmVzdGVkVG1wbCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFpc0Vsc2UpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgbm90IGFuIGVsc2UgdGFnLlxuXHRcdFx0XHRcdFx0dGFnQW5kRWxzZXMgPSB0YWdOYW1lO1xuXHRcdFx0XHRcdFx0dXNlVmlld3MgPSB1c2VWaWV3cyB8fCB0YWdOYW1lICYmICghJHRhZ3NbdGFnTmFtZV0gfHwgISR0YWdzW3RhZ05hbWVdLmZsb3cpO1xuXHRcdFx0XHRcdFx0Ly8gU3dpdGNoIHRvIGEgbmV3IGNvZGUgc3RyaW5nIGZvciB0aGlzIGJvdW5kIHRhZyAoYW5kIGl0cyBlbHNlcywgaWYgaXQgaGFzIGFueSkgLSBmb3IgcmV0dXJuaW5nIHRoZSB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0XHRvbGRDb2RlID0gY29kZTtcblx0XHRcdFx0XHRcdGNvZGUgPSBcIlwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXh0SXNFbHNlID0gYXN0W2kgKyAxXTtcblx0XHRcdFx0XHRuZXh0SXNFbHNlID0gbmV4dElzRWxzZSAmJiBuZXh0SXNFbHNlWzBdID09PSBcImVsc2VcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YWdTdGFydCA9IG9uRXJyb3IgPyBcIjtcXG50cnl7XFxucmV0Kz1cIiA6IFwiXFxuK1wiO1xuXHRcdFx0XHRib3VuZE9uRXJyU3RhcnQgPSBcIlwiO1xuXHRcdFx0XHRib3VuZE9uRXJyRW5kID0gXCJcIjtcblxuXHRcdFx0XHRpZiAoaXNHZXRWYWwgJiYgKHBhdGhCaW5kaW5ncyB8fCB0cmlnZ2VyIHx8IGNvbnZlcnRlciAmJiBjb252ZXJ0ZXIgIT09IEhUTUwpKSB7XG5cdFx0XHRcdFx0Ly8gRm9yIGNvbnZlcnRWYWwgd2UgbmVlZCBhIGNvbXBpbGVkIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgbmV3IHRhZ0N0eChzKVxuXHRcdFx0XHRcdHRhZ0N0eEZuID0gbmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3LGosdVwiLCBcIiAvLyBcIiArIHRtcGxOYW1lICsgXCIgXCIgKyB0bXBsQmluZGluZ0tleSArIFwiIFwiICsgdGFnTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrIFwiXFxucmV0dXJuIHtcIiArIHRhZ0N0eCArIFwifTtcIik7XG5cdFx0XHRcdFx0dGFnQ3R4Rm4uX2VyID0gb25FcnJvcjtcblx0XHRcdFx0XHR0YWdDdHhGbi5fdGFnID0gdGFnTmFtZTtcblxuXHRcdFx0XHRcdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGFnQ3R4Rm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2V0UGF0aHModGFnQ3R4Rm4sIHBhdGhCaW5kaW5ncyk7XG5cdFx0XHRcdFx0dGFnUmVuZGVyID0gJ2MoXCInICsgY29udmVydGVyICsgJ1wiLHZpZXcsJztcblx0XHRcdFx0XHR1c2VDbnZ0ID0gdHJ1ZTtcblx0XHRcdFx0XHRib3VuZE9uRXJyU3RhcnQgPSB0YWdSZW5kZXIgKyB0bXBsQmluZGluZ0tleSArIFwiLFwiO1xuXHRcdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIilcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb2RlICs9IChpc0dldFZhbFxuXHRcdFx0XHRcdD8gKGlzTGlua0V4cHIgPyAob25FcnJvciA/IFwidHJ5e1xcblwiIDogXCJcIikgKyBcInJldHVybiBcIiA6IHRhZ1N0YXJ0KSArICh1c2VDbnZ0IC8vIENhbGwgX2NudnQgaWYgdGhlcmUgaXMgYSBjb252ZXJ0ZXI6IHt7Y252dDogLi4uIH19IG9yIHtee2NudnQ6IC4uLiB9fVxuXHRcdFx0XHRcdFx0PyAodXNlQ252dCA9IHVuZGVmaW5lZCwgdXNlVmlld3MgPSBoYXNDbnZ0ID0gdHJ1ZSwgdGFnUmVuZGVyICsgKHBhdGhCaW5kaW5nc1xuXHRcdFx0XHRcdFx0XHQ/ICgodG1wbEJpbmRpbmdzW3RtcGxCaW5kaW5nS2V5IC0gMV0gPSB0YWdDdHhGbiksIHRtcGxCaW5kaW5nS2V5KSAvLyBTdG9yZSB0aGUgY29tcGlsZWQgdGFnQ3R4Rm4gaW4gdG1wbC5ibmRzLCBhbmQgcGFzcyB0aGUga2V5IHRvIGNvbnZlcnRWYWwoKVxuXHRcdFx0XHRcdFx0XHQ6IFwie1wiICsgdGFnQ3R4ICsgXCJ9XCIpICsgXCIpXCIpXG5cdFx0XHRcdFx0XHQ6IHRhZ05hbWUgPT09IFwiPlwiXG5cdFx0XHRcdFx0XHRcdD8gKGhhc0VuY29kZXIgPSB0cnVlLCBcImgoXCIgKyBwYXJhbXNbMF0gKyBcIilcIilcblx0XHRcdFx0XHRcdFx0OiAoZ2V0c1ZhbCA9IHRydWUsIFwiKCh2PVwiICsgcGFyYW1zWzBdICsgJykhPW51bGw/djonICsgKGlzTGlua0V4cHIgPyAnbnVsbCknIDogJ1wiXCIpJykpXG5cdFx0XHRcdFx0XHRcdC8vIE5vbiBzdHJpY3QgZXF1YWxpdHkgc28gZGF0YS1saW5rPVwidGl0bGV7OmV4cHJ9XCIgd2l0aCBleHByPW51bGwvdW5kZWZpbmVkIHJlbW92ZXMgdGl0bGUgYXR0cmlidXRlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdDogKGhhc1RhZyA9IHRydWUsIFwiXFxue3ZpZXc6dmlldyx0bXBsOlwiIC8vIEFkZCB0aGlzIHRhZ0N0eCB0byB0aGUgY29tcGlsZWQgY29kZSBmb3IgdGhlIHRhZ0N0eHMgdG8gYmUgcGFzc2VkIHRvIHJlbmRlclRhZygpXG5cdFx0XHRcdFx0XHQrIChjb250ZW50ID8gbmVzdGVkVG1wbHMubGVuZ3RoIDogXCIwXCIpICsgXCIsXCIgLy8gRm9yIGJsb2NrIHRhZ3MsIHBhc3MgaW4gdGhlIGtleSAobmVzdGVkVG1wbHMubGVuZ3RoKSB0byB0aGUgbmVzdGVkIGNvbnRlbnQgdGVtcGxhdGVcblx0XHRcdFx0XHRcdCsgdGFnQ3R4ICsgXCJ9LFwiKSk7XG5cblx0XHRcdFx0aWYgKHRhZ0FuZEVsc2VzICYmICFuZXh0SXNFbHNlKSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGRhdGEtbGluayBleHByZXNzaW9uIG9yIGFuIGlubGluZSB0YWcgd2l0aG91dCBhbnkgZWxzZXMsIG9yIHRoZSBsYXN0IHt7ZWxzZX19IG9mIGFuIGlubGluZSB0YWdcblx0XHRcdFx0XHQvLyBXZSBjb21wbGV0ZSB0aGUgY29kZSBmb3IgcmV0dXJuaW5nIHRoZSB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0Y29kZSA9IFwiW1wiICsgY29kZS5zbGljZSgwLCAtMSkgKyBcIl1cIjtcblx0XHRcdFx0XHR0YWdSZW5kZXIgPSAndChcIicgKyB0YWdBbmRFbHNlcyArICdcIix2aWV3LHRoaXMsJztcblx0XHRcdFx0XHRpZiAoaXNMaW5rRXhwciB8fCBwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBib3VuZCB0YWcgKGRhdGEtbGluayBleHByZXNzaW9uIG9yIGlubGluZSBib3VuZCB0YWcge157dGFnIC4uLn19KSBzbyB3ZSBzdG9yZSBhIGNvbXBpbGVkIHRhZ0N0eHMgZnVuY3Rpb24gaW4gdG1wLmJuZHNcblx0XHRcdFx0XHRcdGNvZGUgPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIFwiIC8vIFwiICsgdG1wbE5hbWUgKyBcIiBcIiArIHRtcGxCaW5kaW5nS2V5ICsgXCIgXCIgKyB0YWdBbmRFbHNlcyArIFwiXFxucmV0dXJuIFwiICsgY29kZSArIFwiO1wiKTtcblx0XHRcdFx0XHRcdGNvZGUuX2VyID0gb25FcnJvcjtcblx0XHRcdFx0XHRcdGNvZGUuX3RhZyA9IHRhZ0FuZEVsc2VzO1xuXHRcdFx0XHRcdFx0aWYgKHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0XHRzZXRQYXRocyh0bXBsQmluZGluZ3NbdG1wbEJpbmRpbmdLZXkgLSAxXSA9IGNvZGUsIHBhdGhCaW5kaW5ncyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gY29kZTsgLy8gRm9yIGEgZGF0YS1saW5rIGV4cHJlc3Npb24gd2UgcmV0dXJuIHRoZSBjb21waWxlZCB0YWdDdHhzIGZ1bmN0aW9uXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRib3VuZE9uRXJyU3RhcnQgPSB0YWdSZW5kZXIgKyB0bXBsQmluZGluZ0tleSArIFwiLHVuZGVmaW5lZCxcIjtcblx0XHRcdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIilcIjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBUaGlzIGlzIHRoZSBsYXN0IHt7ZWxzZX19IGZvciBhbiBpbmxpbmUgdGFnLlxuXHRcdFx0XHRcdC8vIEZvciBhIGJvdW5kIHRhZywgcGFzcyB0aGUgdGFnQ3R4cyBmbiBsb29rdXAga2V5IHRvIHJlbmRlclRhZy5cblx0XHRcdFx0XHQvLyBGb3IgYW4gdW5ib3VuZCB0YWcsIGluY2x1ZGUgdGhlIGNvZGUgZGlyZWN0bHkgZm9yIGV2YWx1YXRpbmcgdGFnQ3R4cyBhcnJheVxuXHRcdFx0XHRcdGNvZGUgPSBvbGRDb2RlICsgdGFnU3RhcnQgKyB0YWdSZW5kZXIgKyAodG1wbEJpbmRpbmdLZXkgfHwgY29kZSkgKyBcIilcIjtcblx0XHRcdFx0XHRwYXRoQmluZGluZ3MgPSAwO1xuXHRcdFx0XHRcdHRhZ0FuZEVsc2VzID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob25FcnJvcikge1xuXHRcdFx0XHRcdHVzZVZpZXdzID0gdHJ1ZTtcblx0XHRcdFx0XHRjb2RlICs9ICc7XFxufWNhdGNoKGUpe3JldCcgKyAoaXNMaW5rRXhwciA/IFwidXJuIFwiIDogXCIrPVwiKSArIGJvdW5kT25FcnJTdGFydCArICdqLl9lcnIoZSx2aWV3LCcgKyBvbkVycm9yICsgJyknICsgYm91bmRPbkVyckVuZCArICc7fScgKyAoaXNMaW5rRXhwciA/IFwiXCIgOiAncmV0PXJldCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIEluY2x1ZGUgb25seSB0aGUgdmFyIHJlZmVyZW5jZXMgdGhhdCBhcmUgbmVlZGVkIGluIHRoZSBjb2RlXG5cdGNvZGUgPSBcIi8vIFwiICsgdG1wbE5hbWVcblxuXHRcdCsgXCJcXG52YXIgdlwiXG5cdFx0KyAoaGFzVGFnID8gXCIsdD1qLl90YWdcIiA6IFwiXCIpICAgICAgICAgICAgICAgIC8vIGhhcyB0YWdcblx0XHQrIChoYXNDbnZ0ID8gXCIsYz1qLl9jbnZ0XCIgOiBcIlwiKSAgICAgICAgICAgICAgLy8gY29udmVydGVyXG5cdFx0KyAoaGFzRW5jb2RlciA/IFwiLGg9ai5faHRtbFwiIDogXCJcIikgICAgICAgICAgIC8vIGh0bWwgY29udmVydGVyXG5cdFx0KyAoaXNMaW5rRXhwciA/IFwiO1xcblwiIDogJyxyZXQ9XCJcIlxcbicpXG5cdFx0KyAodG1wbE9wdGlvbnMuZGVidWcgPyBcImRlYnVnZ2VyO1wiIDogXCJcIilcblx0XHQrIGNvZGVcblx0XHQrIChpc0xpbmtFeHByID8gXCJcXG5cIiA6IFwiO1xcbnJldHVybiByZXQ7XCIpO1xuXG5cdGlmICgkc3ViU2V0dGluZ3MuZGVidWdNb2RlICE9PSBmYWxzZSkge1xuXHRcdGNvZGUgPSBcInRyeSB7XFxuXCIgKyBjb2RlICsgXCJcXG59Y2F0Y2goZSl7XFxucmV0dXJuIGouX2VycihlLCB2aWV3KTtcXG59XCI7XG5cdH1cblxuXHR0cnkge1xuXHRcdGNvZGUgPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIGNvZGUpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0c3ludGF4RXJyb3IoXCJDb21waWxlZCB0ZW1wbGF0ZSBjb2RlOlxcblxcblwiICsgY29kZSArICdcXG46IFwiJyArIGUubWVzc2FnZSArICdcIicpO1xuXHR9XG5cdGlmICh0bXBsKSB7XG5cdFx0dG1wbC5mbiA9IGNvZGU7XG5cdFx0dG1wbC51c2VWaWV3cyA9ICEhdXNlVmlld3M7XG5cdH1cblx0cmV0dXJuIGNvZGU7XG59XG5cbi8vPT09PT09PT09PVxuLy8gVXRpbGl0aWVzXG4vLz09PT09PT09PT1cblxuLy8gTWVyZ2Ugb2JqZWN0cywgaW4gcGFydGljdWxhciBjb250ZXh0cyB3aGljaCBpbmhlcml0IGZyb20gcGFyZW50IGNvbnRleHRzXG5mdW5jdGlvbiBleHRlbmRDdHgoY29udGV4dCwgcGFyZW50Q29udGV4dCkge1xuXHQvLyBSZXR1cm4gY29weSBvZiBwYXJlbnRDb250ZXh0LCB1bmxlc3MgY29udGV4dCBpcyBkZWZpbmVkIGFuZCBpcyBkaWZmZXJlbnQsIGluIHdoaWNoIGNhc2UgcmV0dXJuIGEgbmV3IG1lcmdlZCBjb250ZXh0XG5cdC8vIElmIG5laXRoZXIgY29udGV4dCBub3IgcGFyZW50Q29udGV4dCBhcmUgZGVmaW5lZCwgcmV0dXJuIHVuZGVmaW5lZFxuXHRyZXR1cm4gY29udGV4dCAmJiBjb250ZXh0ICE9PSBwYXJlbnRDb250ZXh0XG5cdFx0PyAocGFyZW50Q29udGV4dFxuXHRcdFx0PyAkZXh0ZW5kKCRleHRlbmQoe30sIHBhcmVudENvbnRleHQpLCBjb250ZXh0KVxuXHRcdFx0OiBjb250ZXh0KVxuXHRcdDogcGFyZW50Q29udGV4dCAmJiAkZXh0ZW5kKHt9LCBwYXJlbnRDb250ZXh0KTtcbn1cblxuLy8gR2V0IGNoYXJhY3RlciBlbnRpdHkgZm9yIEhUTUwgYW5kIEF0dHJpYnV0ZSBlbmNvZGluZ1xuZnVuY3Rpb24gZ2V0Q2hhckVudGl0eShjaCkge1xuXHRyZXR1cm4gY2hhckVudGl0aWVzW2NoXSB8fCAoY2hhckVudGl0aWVzW2NoXSA9IFwiJiNcIiArIGNoLmNoYXJDb2RlQXQoMCkgKyBcIjtcIik7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldFByb3BzKHNvdXJjZSkge1xuXHQvLyB0aGlzIHBvaW50ZXIgaXMgdGhlTWFwIC0gd2hpY2ggaGFzIHRhZ0N0eC5wcm9wcyB0b29cblx0Ly8gYXJndW1lbnRzOiB0YWdDdHguYXJncy5cblx0dmFyIGtleSwgcHJvcCxcblx0XHRwcm9wcyA9IFtdO1xuXG5cdGlmICh0eXBlb2Ygc291cmNlID09PSBPQkpFQ1QpIHtcblx0XHRmb3IgKGtleSBpbiBzb3VyY2UpIHtcblx0XHRcdHByb3AgPSBzb3VyY2Vba2V5XTtcblx0XHRcdGlmIChrZXkgIT09ICRleHBhbmRvICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICEkaXNGdW5jdGlvbihwcm9wKSkge1xuXHRcdFx0XHRwcm9wcy5wdXNoKHtrZXk6IGtleSwgcHJvcDogcHJvcH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcHM7XG59XG5cbmZ1bmN0aW9uICRmblJlbmRlcihkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbikge1xuXHR2YXIgdG1wbEVsZW0gPSB0aGlzLmpxdWVyeSAmJiAodGhpc1swXSB8fCBlcnJvcignVW5rbm93biB0ZW1wbGF0ZTogXCInICsgdGhpcy5zZWxlY3RvciArICdcIicpKSxcblx0XHR0bXBsID0gdG1wbEVsZW0uZ2V0QXR0cmlidXRlKHRtcGxBdHRyKTtcblxuXHRyZXR1cm4gcmVuZGVyQ29udGVudC5jYWxsKHRtcGwgPyAkLmRhdGEodG1wbEVsZW0pW2pzdlRtcGxdIDogJHRlbXBsYXRlcyh0bXBsRWxlbSksIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWdpc3RlciBjb252ZXJ0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGh0bWxFbmNvZGUodGV4dCkge1xuXHQvLyBIVE1MIGVuY29kZTogUmVwbGFjZSA8ID4gJiAnIGFuZCBcIiBieSBjb3JyZXNwb25kaW5nIGVudGl0aWVzLlxuXHRyZXR1cm4gdGV4dCAhPSB1bmRlZmluZWQgPyBySXNIdG1sLnRlc3QodGV4dCkgJiYgKFwiXCIgKyB0ZXh0KS5yZXBsYWNlKHJIdG1sRW5jb2RlLCBnZXRDaGFyRW50aXR5KSB8fCB0ZXh0IDogXCJcIjtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRzdWIgPSAkdmlld3Muc3ViO1xuJHZpZXdzU2V0dGluZ3MgPSAkdmlld3Muc2V0dGluZ3M7XG5cbmlmICghKGpzciB8fCAkICYmICQucmVuZGVyKSkge1xuXHQvLyBKc1JlbmRlciBub3QgYWxyZWFkeSBsb2FkZWQsIG9yIGxvYWRlZCB3aXRob3V0IGpRdWVyeSwgYW5kIHdlIGFyZSBub3cgbW92aW5nIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lcGFjZVxuXHRmb3IgKGpzdlN0b3JlTmFtZSBpbiBqc3ZTdG9yZXMpIHtcblx0XHRyZWdpc3RlclN0b3JlKGpzdlN0b3JlTmFtZSwganN2U3RvcmVzW2pzdlN0b3JlTmFtZV0pO1xuXHR9XG5cblx0JGNvbnZlcnRlcnMgPSAkdmlld3MuY29udmVydGVycztcblx0JGhlbHBlcnMgPSAkdmlld3MuaGVscGVycztcblx0JHRhZ3MgPSAkdmlld3MudGFncztcblxuXHQkc3ViLl90Zy5wcm90b3R5cGUgPSB7XG5cdFx0YmFzZUFwcGx5OiBiYXNlQXBwbHksXG5cdFx0Y3Z0QXJnczogY29udmVydEFyZ3Ncblx0fTtcblxuXHR0b3BWaWV3ID0gJHN1Yi50b3BWaWV3ID0gbmV3IFZpZXcoKTtcblxuXHQvL0JST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRpZiAoJCkge1xuXG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5ICg9ICQpIGlzIGxvYWRlZFxuXG5cdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0JGV4cGFuZG8gPSAkLmV4cGFuZG87XG5cdFx0aWYgKCQub2JzZXJ2YWJsZSkge1xuXHRcdFx0JGV4dGVuZCgkc3ViLCAkLnZpZXdzLnN1Yik7IC8vIGpxdWVyeS5vYnNlcnZhYmxlLmpzIHdhcyBsb2FkZWQgYmVmb3JlIGpzcmVuZGVyLmpzXG5cdFx0XHQkdmlld3MubWFwID0gJC52aWV3cy5tYXA7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5IGlzIG5vdCBsb2FkZWQuXG5cblx0XHQkID0ge307XG5cblx0XHRpZiAoc2V0R2xvYmFscykge1xuXHRcdFx0Z2xvYmFsLmpzcmVuZGVyID0gJDsgLy8gV2UgYXJlIGxvYWRpbmcganNyZW5kZXIuanMgZnJvbSBhIHNjcmlwdCBlbGVtZW50LCBub3QgQU1EIG9yIENvbW1vbkpTLCBzbyBzZXQgZ2xvYmFsXG5cdFx0fVxuXG5cdFx0Ly8gRXJyb3Igd2FybmluZyBpZiBqc3JlbmRlci5qcyBpcyB1c2VkIGFzIHRlbXBsYXRlIGVuZ2luZSBvbiBOb2RlLmpzIChlLmcuIEV4cHJlc3Mgb3IgSGFwaS4uLilcblx0XHQvLyBVc2UganNyZW5kZXItbm9kZS5qcyBpbnN0ZWFkLi4uXG5cdFx0JC5yZW5kZXJGaWxlID0gJC5fX2V4cHJlc3MgPSAkLmNvbXBpbGUgPSBmdW5jdGlvbigpIHsgdGhyb3cgXCJOb2RlLmpzOiB1c2UgbnBtIGpzcmVuZGVyLCBvciBqc3JlbmRlci1ub2RlLmpzXCI7IH07XG5cblx0XHQvL0VORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHQkLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihvYikge1xuXHRcdFx0cmV0dXJuIHR5cGVvZiBvYiA9PT0gXCJmdW5jdGlvblwiO1xuXHRcdH07XG5cblx0XHQkLmlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0cmV0dXJuICh7fS50b1N0cmluZykuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCI7XG5cdFx0fTtcblxuXHRcdCRzdWIuX2pxID0gZnVuY3Rpb24oanEpIHsgLy8gcHJpdmF0ZSBtZXRob2QgdG8gbW92ZSBmcm9tIEpzUmVuZGVyIEFQSXMgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVzcGFjZVxuXHRcdFx0aWYgKGpxICE9PSAkKSB7XG5cdFx0XHRcdCRleHRlbmQoanEsICQpOyAvLyBtYXAgb3ZlciBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXNwYWNlXG5cdFx0XHRcdCQgPSBqcTtcblx0XHRcdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0XHRcdGRlbGV0ZSAkLmpzcmVuZGVyO1xuXHRcdFx0XHQkZXhwYW5kbyA9ICQuZXhwYW5kbztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0JC5qc3JlbmRlciA9IHZlcnNpb25OdW1iZXI7XG5cdH1cblx0JHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcblx0JHN1YlNldHRpbmdzLmFsbG93Q29kZSA9IGZhbHNlO1xuXHQkaXNGdW5jdGlvbiA9ICQuaXNGdW5jdGlvbjtcblx0JC5yZW5kZXIgPSAkcmVuZGVyO1xuXHQkLnZpZXdzID0gJHZpZXdzO1xuXHQkLnRlbXBsYXRlcyA9ICR0ZW1wbGF0ZXMgPSAkdmlld3MudGVtcGxhdGVzO1xuXG5cdGZvciAoc2V0dGluZyBpbiAkc3ViU2V0dGluZ3MpIHtcblx0XHRhZGRTZXR0aW5nKHNldHRpbmcpO1xuXHR9XG5cblx0KCR2aWV3c1NldHRpbmdzLmRlYnVnTW9kZSA9IGZ1bmN0aW9uKGRlYnVnTW9kZSkge1xuXHRcdHJldHVybiBkZWJ1Z01vZGUgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyAkc3ViU2V0dGluZ3MuZGVidWdNb2RlXG5cdFx0XHQ6IChcblx0XHRcdFx0JHN1YlNldHRpbmdzLmRlYnVnTW9kZSA9IGRlYnVnTW9kZSxcblx0XHRcdFx0JHN1YlNldHRpbmdzLm9uRXJyb3IgPSBkZWJ1Z01vZGUgKyBcIlwiID09PSBkZWJ1Z01vZGVcblx0XHRcdFx0XHQ/IG5ldyBGdW5jdGlvbihcIlwiLCBcInJldHVybiAnXCIgKyBkZWJ1Z01vZGUgKyBcIic7XCIgKVxuXHRcdFx0XHRcdDogJGlzRnVuY3Rpb24oZGVidWdNb2RlKVxuXHRcdFx0XHRcdFx0PyBkZWJ1Z01vZGVcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0XHQkdmlld3NTZXR0aW5ncyk7XG5cdH0pKGZhbHNlKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cblx0JHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQgPSB7XG5cdFx0dXNlVmlld3M6IGZhbHNlLFxuXHRcdF9qc3Y6IGZhbHNlIC8vIEZvciBnbG9iYWwgYWNjZXNzIHRvIEpzVmlld3Mgc3RvcmVcblx0fTtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZ2lzdGVyIHRhZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQkdGFncyh7XG5cdFx0XCJpZlwiOiB7XG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHQvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciB7e2lmfX0gYW5kIG9uY2UgZm9yIGVhY2gge3tlbHNlfX0uXG5cdFx0XHRcdC8vIFdlIHdpbGwgdXNlIHRoZSB0YWcucmVuZGVyaW5nIG9iamVjdCBmb3IgY2FycnlpbmcgcmVuZGVyaW5nIHN0YXRlIGFjcm9zcyB0aGUgY2FsbHMuXG5cdFx0XHRcdC8vIElmIG5vdCBkb25lIChhIHByZXZpb3VzIGJsb2NrIGhhcyBub3QgYmVlbiByZW5kZXJlZCksIGxvb2sgYXQgZXhwcmVzc2lvbiBmb3IgdGhpcyBibG9jayBhbmQgcmVuZGVyIHRoZSBibG9jayBpZiBleHByZXNzaW9uIGlzIHRydXRoeVxuXHRcdFx0XHQvLyBPdGhlcndpc2UgcmV0dXJuIFwiXCJcblx0XHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJldCA9IChzZWxmLnJlbmRlcmluZy5kb25lIHx8ICF2YWwgJiYgKGFyZ3VtZW50cy5sZW5ndGggfHwgIXRhZ0N0eC5pbmRleCkpXG5cdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0XHRcdDogKHNlbGYucmVuZGVyaW5nLmRvbmUgPSB0cnVlLCBzZWxmLnNlbGVjdGVkID0gdGFnQ3R4LmluZGV4LFxuXHRcdFx0XHRcdFx0XHQvLyBUZXN0IGlzIHNhdGlzZmllZCwgc28gcmVuZGVyIGNvbnRlbnQgb24gY3VycmVudCBjb250ZXh0LiBXZSBjYWxsIHRhZ0N0eC5yZW5kZXIoKSByYXRoZXIgdGhhbiByZXR1cm4gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdC8vICh3aGljaCB3b3VsZCBhbHNvIHJlbmRlciB0aGUgdG1wbC9jb250ZW50IG9uIHRoZSBjdXJyZW50IGNvbnRleHQgYnV0IHdvdWxkIGl0ZXJhdGUgaWYgaXQgaXMgYW4gYXJyYXkpXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eC5yZW5kZXIodGFnQ3R4LnZpZXcsIHRydWUpKTsgLy8gbm8gYXJnLCBzbyByZW5kZXJzIGFnYWluc3QgcGFyZW50Vmlldy5kYXRhXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9LFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCJmb3JcIjoge1xuXHRcdFx0cmVuZGVyOiBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0Ly8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3Ige3tmb3J9fSBhbmQgb25jZSBmb3IgZWFjaCB7e2Vsc2V9fS5cblx0XHRcdFx0Ly8gV2Ugd2lsbCB1c2UgdGhlIHRhZy5yZW5kZXJpbmcgb2JqZWN0IGZvciBjYXJyeWluZyByZW5kZXJpbmcgc3RhdGUgYWNyb3NzIHRoZSBjYWxscy5cblx0XHRcdFx0dmFyIGZpbmFsRWxzZSA9ICFhcmd1bWVudHMubGVuZ3RoLFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJlc3VsdCA9IFwiXCIsXG5cdFx0XHRcdFx0ZG9uZSA9IDA7XG5cblx0XHRcdFx0aWYgKCFzZWxmLnJlbmRlcmluZy5kb25lKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBmaW5hbEVsc2UgPyB0YWdDdHgudmlldy5kYXRhIDogdmFsOyAvLyBGb3IgdGhlIGZpbmFsIGVsc2UsIGRlZmF1bHRzIHRvIGN1cnJlbnQgZGF0YSB3aXRob3V0IGl0ZXJhdGlvbi5cblx0XHRcdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IHRhZ0N0eC5yZW5kZXIodmFsdWUsIGZpbmFsRWxzZSk7IC8vIEl0ZXJhdGVzIGV4Y2VwdCBvbiBmaW5hbCBlbHNlLCBpZiBkYXRhIGlzIGFuIGFycmF5LiAoVXNlIHt7aW5jbHVkZX19IHRvIGNvbXBvc2UgdGVtcGxhdGVzIHdpdGhvdXQgYXJyYXkgaXRlcmF0aW9uKVxuXHRcdFx0XHRcdFx0ZG9uZSArPSAkaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc2VsZi5yZW5kZXJpbmcuZG9uZSA9IGRvbmUpIHtcblx0XHRcdFx0XHRcdHNlbGYuc2VsZWN0ZWQgPSB0YWdDdHguaW5kZXg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIElmIG5vdGhpbmcgd2FzIHJlbmRlcmVkIHdlIHdpbGwgbG9vayBhdCB0aGUgbmV4dCB7e2Vsc2V9fS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZG9uZS5cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdHByb3BzOiB7XG5cdFx0XHRiYXNlVGFnOiBcImZvclwiLFxuXHRcdFx0ZGF0YU1hcDogZGF0YU1hcChnZXRUYXJnZXRQcm9wcyksXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRpbmNsdWRlOiB7XG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcIipcIjoge1xuXHRcdFx0Ly8ge3sqIGNvZGUuLi4gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiOipcIjoge1xuXHRcdFx0Ly8ge3s6KiByZXR1cm5lZEV4cHJlc3Npb24gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdGRiZzogJGhlbHBlcnMuZGJnID0gJGNvbnZlcnRlcnMuZGJnID0gZGJnQnJlYWsgLy8gUmVnaXN0ZXIge3tkYmcvfX0sIHt7ZGJnOi4uLn19IGFuZCB+ZGJnKCkgdG8gdGhyb3cgYW5kIGNhdGNoLCBhcyBicmVha3BvaW50cyBmb3IgZGVidWdnaW5nLlxuXHR9KTtcblxuXHQkY29udmVydGVycyh7XG5cdFx0aHRtbDogaHRtbEVuY29kZSxcblx0XHRhdHRyOiBodG1sRW5jb2RlLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdFx0dXJsOiBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0XHQvLyBVUkwgZW5jb2RpbmcgaGVscGVyLlxuXHRcdFx0cmV0dXJuIHRleHQgIT0gdW5kZWZpbmVkID8gZW5jb2RlVVJJKFwiXCIgKyB0ZXh0KSA6IHRleHQgPT09IG51bGwgPyB0ZXh0IDogXCJcIjsgLy8gbnVsbCByZXR1cm5zIG51bGwsIGUuZy4gdG8gcmVtb3ZlIGF0dHJpYnV0ZS4gdW5kZWZpbmVkIHJldHVybnMgXCJcIlxuXHRcdH1cblx0fSk7XG59XG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IERlZmluZSBkZWZhdWx0IGRlbGltaXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiRzdWJTZXR0aW5ncyA9ICRzdWIuc2V0dGluZ3M7XG4kaXNBcnJheSA9ICgkfHxqc3IpLmlzQXJyYXk7XG4kdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzKFwie3tcIiwgXCJ9fVwiLCBcIl5cIik7XG5cbmlmIChqc3JUb0pxKSB7IC8vIE1vdmluZyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXBhY2UgLSBjb3B5IG92ZXIgdGhlIHN0b3JlZCBpdGVtcyAodGVtcGxhdGVzLCBjb252ZXJ0ZXJzLCBoZWxwZXJzLi4uKVxuXHRqc3Iudmlld3Muc3ViLl9qcSgkKTtcbn1cbnJldHVybiAkIHx8IGpzcjtcbn0sIHdpbmRvdykpO1xuIiwiLypnbG9iYWwgUVVuaXQsIHRlc3QsIGVxdWFsLCBvayovXG4oZnVuY3Rpb24odW5kZWZpbmVkKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuYnJvd3NlcmlmeS5kb25lLmVpZ2h0QiA9IHRydWU7XG5cblFVbml0Lm1vZHVsZShcIkJyb3dzZXJpZnkgLSBjbGllbnQgY29kZVwiKTtcblxudmFyIGlzSUU4ID0gd2luZG93LmF0dGFjaEV2ZW50ICYmICF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcjtcblxuaWYgKCFpc0lFOCkge1xuXG50ZXN0KFwiTm8galF1ZXJ5IGdsb2JhbDogcmVxdWlyZSgnanNyZW5kZXInKSByZXF1aXJlKCdqc3ZpZXdzJylcIiwgZnVuY3Rpb24oKSB7XG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gSGlkZSBRVW5pdCBnbG9iYWwgalF1ZXJ5IGFuZCBhbnkgcHJldmlvdXMgZ2xvYmFsIGpzcmVuZGVyLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdHZhciBqUXVlcnkgPSBnbG9iYWwualF1ZXJ5LCBqc3IgPSBnbG9iYWwuanNyZW5kZXI7XG5cdGdsb2JhbC5qUXVlcnkgPSBnbG9iYWwuanNyZW5kZXIgPSB1bmRlZmluZWQ7XG5cblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBcnJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0dmFyIGRhdGEgPSB7bmFtZTogXCJKb1wifTtcblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBY3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxudmFyICRqcSA9IHJlcXVpcmUoJ2pxdWVyeScpO1xudmFyICRqc3IgPSByZXF1aXJlKCdqc3JlbmRlcicpKCRqcSk7IC8vIFVubmVjZXNzYXJ5IGxvYWRpbmcgb2YgYWRkaXRpb25hbCBqc3JlbmRlciBpbnN0YW5jZSAoVGVzdCBjYXNlKVxudmFyICRqc3IgPSByZXF1aXJlKCcuLi8uLi8nKSgkanEpOyAvLyBQcm92aWRlIGpRdWVyeSwgc28gJGpzciA9PT0gJGpxIGlzIGxvY2FsIGpRdWVyeSBuYW1lc3BhY2VcblxuXHQvLyBVc2UgcmVxdWlyZSB0byBnZXQgc2VydmVyIHRlbXBsYXRlLCB0aGFua3MgdG8gQnJvd3NlcmlmeSBidW5kbGUgdGhhdCB1c2VkIGpzcmVuZGVyL3RtcGxpZnkgdHJhbnNmb3JtXG5cdHZhciB0bXBsID0gcmVxdWlyZSgnLi4vdGVtcGxhdGVzL25hbWUtdGVtcGxhdGUuaHRtbCcpKCRqc3IpOyAvLyBQcm92aWRlICRqc3JcblxuXHR2YXIgcmVzdWx0ID0gdG1wbChkYXRhKTtcblxuXHQkanNyLm9ic2VydmUoZGF0YSwgXCJuYW1lXCIsIGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MpIHtcblx0XHRyZXN1bHQgKz0gXCIgXCIgKyBldmVudEFyZ3MudmFsdWU7XG5cdH0pXG5cdCRqc3Iub2JzZXJ2YWJsZShkYXRhKS5zZXRQcm9wZXJ0eShcIm5hbWVcIiwgXCJuZXcgbmFtZVwiKTsgLy8gcmVzdWx0ID09PSBcIm5ldyBuYW1lXCJcblxuXHRyZXN1bHQgKz0gXCIgXCIgKyAoJGpzciAhPT0galF1ZXJ5ICYmICRqc3IgPT09ICRqcSk7XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBc3NlcnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdGVxdWFsKHJlc3VsdCwgXCJOYW1lOiBKbyAobmFtZS10ZW1wbGF0ZS5odG1sKSBuZXcgbmFtZSB0cnVlXCIsIFwicmVzdWx0OiBObyBqUXVlcnkgZ2xvYmFsOiByZXF1aXJlKCdqc3ZpZXdzJylcIik7XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBSZXNldCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0Z2xvYmFsLmpRdWVyeSA9IGpRdWVyeTsgLy8gUmVwbGFjZSBRVW5pdCBnbG9iYWwgalF1ZXJ5XG5cdGdsb2JhbC5qc3JlbmRlciA9IGpzcjsgLy8gUmVwbGFjZSBhbnkgcHJldmlvdXMgZ2xvYmFsIGpzcmVuZGVyXG59KTtcbn1cbn0pKCk7XG4iLCJ2YXIgdG1wbFJlZnMgPSBbXSxcbiAgbWt1cCA9ICdOYW1lOiB7ezpuYW1lfX0gKG5hbWUtdGVtcGxhdGUuaHRtbCknLFxuICAkID0gZ2xvYmFsLmpzcmVuZGVyIHx8IGdsb2JhbC5qUXVlcnk7XG5cbm1vZHVsZS5leHBvcnRzID0gJCA/ICQudGVtcGxhdGVzKFwiLi90ZXN0L3RlbXBsYXRlcy9uYW1lLXRlbXBsYXRlLmh0bWxcIiwgbWt1cCkgOlxuICBmdW5jdGlvbigkKSB7XG4gICAgaWYgKCEkIHx8ICEkLnZpZXdzKSB7dGhyb3cgXCJSZXF1aXJlcyBqc3JlbmRlci9qUXVlcnlcIjt9XG4gICAgd2hpbGUgKHRtcGxSZWZzLmxlbmd0aCkge1xuICAgICAgdG1wbFJlZnMucG9wKCkoJCk7IC8vIGNvbXBpbGUgbmVzdGVkIHRlbXBsYXRlXG4gICAgfVxuXG4gICAgcmV0dXJuICQudGVtcGxhdGVzKFwiLi90ZXN0L3RlbXBsYXRlcy9uYW1lLXRlbXBsYXRlLmh0bWxcIiwgbWt1cClcbiAgfTsiXX0= +//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqc3ZpZXdzLmpzIiwibm9kZV9tb2R1bGVzL2pxdWVyeS9kaXN0L2pxdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9qc3JlbmRlci9qc3JlbmRlci5qcyIsInRlc3QvYnJvd3NlcmlmeS84Qi11bml0LXRlc3RzLmpzIiwidGVzdC90ZW1wbGF0ZXMvbmFtZS10ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeDVNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxL1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzl5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyohIGpzdmlld3MuanMgdjAuOS44MyAoQmV0YSkgc2luZ2xlLWZpbGUgdmVyc2lvbjogaHR0cDovL2pzdmlld3MuY29tLyAqL1xuLyohIGluY2x1ZGVzIEpzUmVuZGVyLCBKc09ic2VydmFibGUgYW5kIEpzVmlld3MgLSBzZWU6IGh0dHA6Ly9qc3ZpZXdzLmNvbS8jZG93bmxvYWQgKi9cblxuLyogSW50ZXJhY3RpdmUgZGF0YS1kcml2ZW4gdmlld3MgdXNpbmcgSnNSZW5kZXIgdGVtcGxhdGVzICovXG5cbi8vPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IEpzUmVuZGVyID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuLyogSnNSZW5kZXI6XG4gKiBTZWUgaHR0cDovL2pzdmlld3MuY29tLyNqc3JlbmRlciBhbmQgaHR0cDovL2dpdGh1Yi5jb20vQm9yaXNNb29yZS9qc3JlbmRlclxuICogQ29weXJpZ2h0IDIwMTYsIEJvcmlzIE1vb3JlXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuLy9qc2hpbnQgLVcwMTgsIC1XMDQxXG5cbihmdW5jdGlvbihmYWN0b3J5LCBnbG9iYWwpIHtcblx0Ly8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcblx0dmFyICQgPSBnbG9iYWwualF1ZXJ5O1xuXG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikgeyAvLyBDb21tb25KUyBlLmcuIEJyb3dzZXJpZnlcblx0XHRtb2R1bGUuZXhwb3J0cyA9ICRcblx0XHRcdD8gZmFjdG9yeShnbG9iYWwsICQpXG5cdFx0XHQ6IGZ1bmN0aW9uKCQpIHsgLy8gSWYgbm8gZ2xvYmFsIGpRdWVyeSwgdGFrZSBqUXVlcnkgcGFzc2VkIGFzIHBhcmFtZXRlcjogcmVxdWlyZShcImpzdmlld3NcIikoalF1ZXJ5KVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdFx0fTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgeyAvLyBBTUQgc2NyaXB0IGxvYWRlciwgZS5nLiBSZXF1aXJlSlNcblx0XHRkZWZpbmUoW1wianF1ZXJ5XCJdLCBmdW5jdGlvbigkKSB7XG5cdFx0XHRyZXR1cm4gZmFjdG9yeShnbG9iYWwsICQpO1xuXHRcdH0pOyAvLyBSZXF1aXJlIGpRdWVyeVxuXHR9IGVsc2UgeyAvLyBCcm93c2VyIHVzaW5nIHBsYWluIDxzY3JpcHQ+IHRhZ1xuXHRcdGZhY3RvcnkoZ2xvYmFsLCBmYWxzZSk7XG5cdH1cbn0gKFxuXG4vLyBmYWN0b3J5IChmb3IganN2aWV3cy5qcylcbmZ1bmN0aW9uKGdsb2JhbCwgJCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcbnZhciBzZXRHbG9iYWxzID0gJCA9PT0gZmFsc2U7IC8vIE9ubHkgc2V0IGdsb2JhbHMgaWYgc2NyaXB0IGJsb2NrIGluIGJyb3dzZXIgKG5vdCBBTUQgYW5kIG5vdCBDb21tb25KUylcblxuJCA9ICQgfHwgZ2xvYmFsLmpRdWVyeTsgLy8gJCBpcyBqUXVlcnkgcGFzc2VkIGluIGJ5IENvbW1vbkpTIGxvYWRlciAoQnJvd3NlcmlmeSksIG9yIGdsb2JhbCBqUXVlcnkuXG5cbmlmICghJCB8fCAhJC5mbikge1xuXHQvLyBqUXVlcnkgaXMgbm90IGxvYWRlZC5cblx0dGhyb3cgXCJKc1ZpZXdzIHJlcXVpcmVzIGpRdWVyeVwiOyAvLyBXZSByZXF1aXJlIGpRdWVyeVxufVxuXG52YXIgdmVyc2lvbk51bWJlciA9IFwidjAuOS44M1wiLFxuXG5cdGpzdlN0b3JlTmFtZSwgclRhZywgclRtcGxTdHJpbmcsIHRvcFZpZXcsICR2aWV3cywgJG9ic2VydmUsICRvYnNlcnZhYmxlLCAkZXhwYW5kbyxcblxuLy9UT0RPXHR0bXBsRm5zQ2FjaGUgPSB7fSxcblx0JGlzRnVuY3Rpb24sICRpc0FycmF5LCAkdGVtcGxhdGVzLCAkY29udmVydGVycywgJGhlbHBlcnMsICR0YWdzLCAkc3ViLCAkc3ViU2V0dGluZ3MsICRzdWJTZXR0aW5nc0FkdmFuY2VkLCAkdmlld3NTZXR0aW5ncywgZGVsaW1PcGVuQ2hhcjAsIGRlbGltT3BlbkNoYXIxLCBkZWxpbUNsb3NlQ2hhcjAsIGRlbGltQ2xvc2VDaGFyMSwgbGlua0NoYXIsIHNldHRpbmcsIGJhc2VPbkVycm9yLFxuXG5cdHJQYXRoID0gL14oISo/KSg/Om51bGx8dHJ1ZXxmYWxzZXxcXGRbXFxkLl0qfChbXFx3JF0rfFxcLnx+KFtcXHckXSspfCModmlld3woW1xcdyRdKykpPykoW1xcdyQuXl0qPykoPzpbLlteXShbXFx3JF0rKVxcXT8pPykkL2csXG5cdC8vICAgICAgICBub3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ICAgICBoZWxwZXIgICAgdmlldyAgdmlld1Byb3BlcnR5IHBhdGhUb2tlbnMgICAgICBsZWFmVG9rZW5cblxuXHRyUGFyYW1zID0gLyhcXCgpKD89XFxzKlxcKCl8KD86KFsoW10pXFxzKik/KD86KFxcXj8pKCEqP1sjfl0/W1xcdyQuXl0rKT9cXHMqKChcXCtcXCt8LS0pfFxcK3wtfCYmfFxcfFxcfHw9PT18IT09fD09fCE9fDw9fD49fFs8PiUqOj9cXC9dfCg9KSlcXHMqfCghKj9bI35dP1tcXHckLl5dKykoWyhbXSk/KXwoLFxccyopfChcXCg/KVxcXFw/KD86KCcpfChcIikpfCg/OlxccyooKFspXFxdXSkoPz1cXHMqWy5eXXxcXHMqJHxbXihbXSl8WylcXF1dKShbKFtdPykpfChcXHMrKS9nLFxuXHQvLyAgICAgICAgICBsZnRQcm4wICAgICAgICBsZnRQcm4gICAgICAgIGJvdW5kICAgICAgICAgICAgcGF0aCAgICBvcGVyYXRvciBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcSAgICAgICAgICAgICBwYXRoMiAgICAgICBwcm4gICAgY29tbWEgICBsZnRQcm4yICAgYXBvcyBxdW90ICAgICAgcnRQcm4gcnRQcm5Eb3QgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm4yICBzcGFjZVxuXHQvLyAobGVmdCBwYXJlbj8gZm9sbG93ZWQgYnkgKHBhdGg/IGZvbGxvd2VkIGJ5IG9wZXJhdG9yKSBvciAocGF0aCBmb2xsb3dlZCBieSBsZWZ0IHBhcmVuPykpIG9yIGNvbW1hIG9yIGFwb3Mgb3IgcXVvdCBvciByaWdodCBwYXJlbiBvciBzcGFjZVxuXG5cdGlzUmVuZGVyQ2FsbCxcblx0ck5ld0xpbmUgPSAvWyBcXHRdKihcXHJcXG58XFxufFxccikvZyxcblx0clVuZXNjYXBlUXVvdGVzID0gL1xcXFwoWydcIl0pL2csXG5cdHJFc2NhcGVRdW90ZXMgPSAvWydcIlxcXFxdL2csIC8vIEVzY2FwZSBxdW90ZXMgYW5kIFxcIGNoYXJhY3RlclxuXHRyQnVpbGRIYXNoID0gLyg/OlxceDA4fF4pKG9uZXJyb3I6KT8oPzoofj8pKChbXFx3JF9cXC5dKyk6KT8oW15cXHgwOF0rKSlcXHgwOCgsKT8oW15cXHgwOF0rKS9naSxcblx0clRlc3RFbHNlSWYgPSAvXmlmXFxzLyxcblx0ckZpcnN0RWxlbSA9IC88KFxcdyspWz5cXHNdLyxcblx0ckF0dHJFbmNvZGUgPSAvW1xceDAwYD48XCInJj1dL2csIC8vIEluY2x1ZGVzID4gZW5jb2Rpbmcgc2luY2UgckNvbnZlcnRNYXJrZXJzIGluIEpzVmlld3MgZG9lcyBub3Qgc2tpcCA+IGNoYXJhY3RlcnMgaW4gYXR0cmlidXRlIHN0cmluZ3Ncblx0cklzSHRtbCA9IC9bXFx4MDBgPjxcXFwiJyY9XS8sXG5cdHJIYXNIYW5kbGVycyA9IC9eb25bQS1aXXxeY29udmVydChCYWNrKT8kLyxcblx0cldyYXBwZWRJblZpZXdNYXJrZXIgPSAvXlxcI1xcZCtfYFtcXHNcXFNdKlxcL1xcZCtfYCQvLFxuXHRySHRtbEVuY29kZSA9IHJBdHRyRW5jb2RlLFxuXHR2aWV3SWQgPSAwLFxuXHRjaGFyRW50aXRpZXMgPSB7XG5cdFx0XCImXCI6IFwiJmFtcDtcIixcblx0XHRcIjxcIjogXCImbHQ7XCIsXG5cdFx0XCI+XCI6IFwiJmd0O1wiLFxuXHRcdFwiXFx4MDBcIjogXCImIzA7XCIsXG5cdFx0XCInXCI6IFwiJiMzOTtcIixcblx0XHQnXCInOiBcIiYjMzQ7XCIsXG5cdFx0XCJgXCI6IFwiJiM5NjtcIixcblx0XHRcIj1cIjogXCImIzYxO1wiXG5cdH0sXG5cdEhUTUwgPSBcImh0bWxcIixcblx0T0JKRUNUID0gXCJvYmplY3RcIixcblx0dG1wbEF0dHIgPSBcImRhdGEtanN2LXRtcGxcIixcblx0anN2VG1wbCA9IFwianN2VG1wbFwiLFxuXHRpbmRleFN0ciA9IFwiRm9yICNpbmRleCBpbiBuZXN0ZWQgYmxvY2sgdXNlICNnZXRJbmRleCgpLlwiLFxuXHQkcmVuZGVyID0ge30sXG5cblx0anNyID0gZ2xvYmFsLmpzcmVuZGVyLFxuXHRqc3JUb0pxID0ganNyICYmICQgJiYgISQucmVuZGVyLCAvLyBKc1JlbmRlciBhbHJlYWR5IGxvYWRlZCwgd2l0aG91dCBqUXVlcnkuIGJ1dCB3ZSB3aWxsIHJlLWxvYWQgaXQgbm93IHRvIGF0dGFjaCB0byBqUXVlcnlcblxuXHRqc3ZTdG9yZXMgPSB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdGNvbXBpbGU6IGNvbXBpbGVUbXBsXG5cdFx0fSxcblx0XHR0YWc6IHtcblx0XHRcdGNvbXBpbGU6IGNvbXBpbGVUYWdcblx0XHR9LFxuXHRcdHZpZXdNb2RlbDoge1xuXHRcdFx0Y29tcGlsZTogY29tcGlsZVZpZXdNb2RlbFxuXHRcdH0sXG5cdFx0aGVscGVyOiB7fSxcblx0XHRjb252ZXJ0ZXI6IHt9XG5cdH07XG5cblx0Ly8gdmlld3Mgb2JqZWN0ICgkLnZpZXdzIGlmIGpRdWVyeSBpcyBsb2FkZWQsIGpzcmVuZGVyLnZpZXdzIGlmIG5vIGpRdWVyeSwgZS5nLiBpbiBOb2RlLmpzKVxuXHQkdmlld3MgPSB7XG5cdFx0anN2aWV3czogdmVyc2lvbk51bWJlcixcblx0XHRzdWI6IHtcblx0XHRcdC8vIHN1YnNjcmlwdGlvbiwgZS5nLiBKc1ZpZXdzIGludGVncmF0aW9uXG5cdFx0XHRWaWV3OiBWaWV3LFxuXHRcdFx0RXJyOiBKc1ZpZXdzRXJyb3IsXG5cdFx0XHR0bXBsRm46IHRtcGxGbixcblx0XHRcdHBhcnNlOiBwYXJzZVBhcmFtcyxcblx0XHRcdGV4dGVuZDogJGV4dGVuZCxcblx0XHRcdGV4dGVuZEN0eDogZXh0ZW5kQ3R4LFxuXHRcdFx0c3ludGF4RXJyOiBzeW50YXhFcnJvcixcblx0XHRcdG9uU3RvcmU6IHt9LFxuXHRcdFx0YWRkU2V0dGluZzogYWRkU2V0dGluZyxcblx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdGFsbG93Q29kZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRhZHZTZXQ6IG5vb3AsIC8vIFVwZGF0ZSBhZHZhbmNlZCBzZXR0aW5nc1xuXHRcdFx0X3RoczogdGFnSGFuZGxlcnNGcm9tUHJvcHMsXG5cdFx0XHRfdGc6IGZ1bmN0aW9uKCkge30sIC8vIENvbnN0cnVjdG9yIGZvciB0YWdEZWZcblx0XHRcdF9jbnZ0OiBjb252ZXJ0VmFsLFxuXHRcdFx0X3RhZzogcmVuZGVyVGFnLFxuXHRcdFx0X2VyOiBlcnJvcixcblx0XHRcdF9lcnI6IG9uUmVuZGVyRXJyb3IsXG5cdFx0XHRfaHRtbDogaHRtbEVuY29kZSxcblx0XHRcdF9jcDogcmV0VmFsLCAvLyBHZXQgY29tcGlsZWQgY29udGV4dHVhbCBwYXJhbWV0ZXJzIChvciBwcm9wZXJ0aWVzKSB+Zm9vPWV4cHIuIEluIEpzUmVuZGVyLCBzaW1wbHkgcmV0dXJucyB2YWwuXG5cdFx0XHRfc3E6IGZ1bmN0aW9uKHRva2VuKSB7XG5cdFx0XHRcdGlmICh0b2tlbiA9PT0gXCJjb25zdHJ1Y3RvclwiKSB7XG5cdFx0XHRcdFx0c3ludGF4RXJyb3IoXCJcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRva2VuO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2V0dGluZ3M6IHtcblx0XHRcdGRlbGltaXRlcnM6ICR2aWV3c0RlbGltaXRlcnMsXG5cdFx0XHRhZHZhbmNlZDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdFx0PyAoXG5cdFx0XHRcdFx0XHRcdCRleHRlbmQoJHN1YlNldHRpbmdzQWR2YW5jZWQsIHZhbHVlKSxcblx0XHRcdFx0XHRcdFx0JHN1Yi5hZHZTZXQoKSxcblx0XHRcdFx0XHRcdFx0JHZpZXdzU2V0dGluZ3Ncblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogJHN1YlNldHRpbmdzQWR2YW5jZWQ7XG5cdFx0XHRcdH1cblx0XHR9LFxuXHRcdGdldEN0eDogcmV0VmFsLCAvLyBHZXQgY3R4LmZvbyB2YWx1ZS4gSW4gSnNSZW5kZXIsIHNpbXBseSByZXR1cm5zIHZhbC5cblx0XHRtYXA6IGRhdGFNYXAgICAgLy8gSWYganNPYnNlcnZhYmxlIGxvYWRlZCBmaXJzdCwgdXNlIHRoYXQgZGVmaW5pdGlvbiBvZiBkYXRhTWFwXG5cdH07XG5cbmZ1bmN0aW9uIGdldERlcml2ZWRNZXRob2QoYmFzZU1ldGhvZCwgbWV0aG9kKSB7XG5cdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHR2YXIgcmV0LFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdHByZXZCYXNlID0gdGFnLmJhc2U7XG5cblx0XHR0YWcuYmFzZSA9IGJhc2VNZXRob2Q7IC8vIFdpdGhpbiBtZXRob2QgY2FsbCwgY2FsbGluZyB0aGlzLmJhc2Ugd2lsbCBjYWxsIHRoZSBiYXNlIG1ldGhvZFxuXHRcdHJldCA9IG1ldGhvZC5hcHBseSh0YWcsIGFyZ3VtZW50cyk7IC8vIENhbGwgdGhlIG1ldGhvZFxuXHRcdHRhZy5iYXNlID0gcHJldkJhc2U7IC8vIFJlcGxhY2UgdGhpcy5iYXNlIHRvIGJlIHRoZSBiYXNlIG1ldGhvZCBvZiB0aGUgcHJldmlvdXMgY2FsbCwgZm9yIGNoYWluZWQgY2FsbHNcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRNZXRob2QoYmFzZU1ldGhvZCwgbWV0aG9kKSB7XG5cdC8vIEZvciBkZXJpdmVkIG1ldGhvZHMgKG9yIGhhbmRsZXJzIGRlY2xhcmVkIGRlY2xhcmF0aXZlbHkgYXMgaW4ge3s6Zm9vIG9uQ2hhbmdlPX5mb29DaGFuZ2VkfX0gcmVwbGFjZSBieSBhIGRlcml2ZWQgbWV0aG9kLCB0byBhbGxvdyB1c2luZyB0aGlzLmJhc2UoLi4uKVxuXHQvLyBvciB0aGlzLmJhc2VBcHBseShhcmd1bWVudHMpIHRvIGNhbGwgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24uIChFcXVpdmFsZW50IHRvIHRoaXMuX3N1cGVyKC4uLikgYW5kIHRoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSBpbiBqUXVlcnkgVUkpXG5cdGlmICgkaXNGdW5jdGlvbihtZXRob2QpKSB7XG5cdFx0bWV0aG9kID0gZ2V0RGVyaXZlZE1ldGhvZChcblx0XHRcdFx0IWJhc2VNZXRob2Rcblx0XHRcdFx0XHQ/IG5vb3AgLy8gbm8gYmFzZSBtZXRob2QgaW1wbGVtZW50YXRpb24sIHNvIHVzZSBub29wIGFzIGJhc2UgbWV0aG9kXG5cdFx0XHRcdFx0OiBiYXNlTWV0aG9kLl9kXG5cdFx0XHRcdFx0XHQ/IGJhc2VNZXRob2QgLy8gYmFzZU1ldGhvZCBpcyBhIGRlcml2ZWQgbWV0aG9kLCBzbyB1cyBpdFxuXHRcdFx0XHRcdFx0OiBnZXREZXJpdmVkTWV0aG9kKG5vb3AsIGJhc2VNZXRob2QpLCAvLyBiYXNlTWV0aG9kIGlzIG5vdCBkZXJpdmVkIHNvIG1ha2UgaXRzIGJhc2UgbWV0aG9kIGJlIHRoZSBub29wIG1ldGhvZFxuXHRcdFx0XHRtZXRob2Rcblx0XHRcdCk7XG5cdFx0bWV0aG9kLl9kID0gMTsgLy8gQWRkIGZsYWcgdGhhdCB0aGlzIGlzIGEgZGVyaXZlZCBtZXRob2Rcblx0fVxuXHRyZXR1cm4gbWV0aG9kO1xufVxuXG5mdW5jdGlvbiB0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eCkge1xuXHRmb3IgKHZhciBwcm9wIGluIHRhZ0N0eC5wcm9wcykge1xuXHRcdGlmIChySGFzSGFuZGxlcnMudGVzdChwcm9wKSkge1xuXHRcdFx0dGFnW3Byb3BdID0gZ2V0TWV0aG9kKHRhZ1twcm9wXSwgdGFnQ3R4LnByb3BzW3Byb3BdKTtcblx0XHRcdC8vIENvcHkgb3ZlciB0aGUgb25Gb28gcHJvcHMsIGNvbnZlcnQgYW5kIGNvbnZlcnRCYWNrIGZyb20gdGFnQ3R4LnByb3BzIHRvIHRhZyAob3ZlcnJpZGVzIHZhbHVlcyBpbiB0YWdEZWYpLlxuXHRcdFx0Ly8gTm90ZTogdW5zdXBwb3J0ZWQgc2NlbmFyaW86IGlmIGhhbmRsZXJzIGFyZSBkeW5hbWljYWxseSBhZGRlZCBeb25Gb289ZXhwcmVzc2lvbiB0aGlzIHdpbGwgd29yaywgYnV0IGR5bmFtaWNhbGx5IHJlbW92aW5nIHdpbGwgbm90IHdvcmsuXG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJldFZhbCh2YWwpIHtcblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHtcblx0cmV0dXJuIFwiXCI7XG59XG5cbmZ1bmN0aW9uIGRiZ0JyZWFrKHZhbCkge1xuXHQvLyBVc2FnZSBleGFtcGxlczoge3tkYmc6Li4ufX0sIHt7On5kYmcoLi4uKX19LCB7e2RiZyAuLi4vfX0sIHtee2ZvciAuLi4gb25BZnRlckxpbms9fmRiZ319IGV0Yy5cblx0dHJ5IHtcblx0XHRjb25zb2xlLmxvZyhcIkpzUmVuZGVyIGRiZyBicmVha3BvaW50OiBcIiArIHZhbCk7XG5cdFx0dGhyb3cgXCJkYmcgYnJlYWtwb2ludFwiOyAvLyBUbyBicmVhayBoZXJlLCBzdG9wIG9uIGNhdWdodCBleGNlcHRpb25zLlxuXHR9XG5cdGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gdGhpcy5iYXNlID8gdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSA6IHZhbDtcbn1cblxuZnVuY3Rpb24gSnNWaWV3c0Vycm9yKG1lc3NhZ2UpIHtcblx0Ly8gRXJyb3IgZXhjZXB0aW9uIHR5cGUgZm9yIEpzVmlld3MvSnNSZW5kZXJcblx0Ly8gT3ZlcnJpZGUgb2YgJC52aWV3cy5zdWIuRXJyb3IgaXMgcG9zc2libGVcblx0dGhpcy5uYW1lID0gKCQubGluayA/IFwiSnNWaWV3c1wiIDogXCJKc1JlbmRlclwiKSArIFwiIEVycm9yXCI7XG5cdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgdGhpcy5uYW1lO1xufVxuXG5mdW5jdGlvbiAkZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG5cdGZvciAodmFyIG5hbWUgaW4gc291cmNlKSB7XG5cdFx0dGFyZ2V0W25hbWVdID0gc291cmNlW25hbWVdO1xuXHR9XG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbihKc1ZpZXdzRXJyb3IucHJvdG90eXBlID0gbmV3IEVycm9yKCkpLmNvbnN0cnVjdG9yID0gSnNWaWV3c0Vycm9yO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFRvcC1sZXZlbCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy89PT09PT09PT09PT09PT09PT09XG4vLyB2aWV3cy5kZWxpbWl0ZXJzXG4vLz09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gJHZpZXdzRGVsaW1pdGVycyhvcGVuQ2hhcnMsIGNsb3NlQ2hhcnMsIGxpbmspIHtcblx0Ly8gU2V0IHRoZSB0YWcgb3BlbmluZyBhbmQgY2xvc2luZyBkZWxpbWl0ZXJzIGFuZCAnbGluaycgY2hhcmFjdGVyLiBEZWZhdWx0IGlzIFwie3tcIiwgXCJ9fVwiIGFuZCBcIl5cIlxuXHQvLyBvcGVuQ2hhcnMsIGNsb3NlQ2hhcnM6IG9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyaW5ncywgZWFjaCB3aXRoIHR3byBjaGFyYWN0ZXJzXG5cdGlmICghb3BlbkNoYXJzKSB7XG5cdFx0cmV0dXJuICRzdWJTZXR0aW5ncy5kZWxpbWl0ZXJzO1xuXHR9XG5cdGlmICgkaXNBcnJheShvcGVuQ2hhcnMpKSB7XG5cdFx0cmV0dXJuICR2aWV3c0RlbGltaXRlcnMuYXBwbHkoJHZpZXdzLCBvcGVuQ2hhcnMpO1xuXHR9XG5cblx0JHN1YlNldHRpbmdzLmRlbGltaXRlcnMgPSBbb3BlbkNoYXJzLCBjbG9zZUNoYXJzLCBsaW5rQ2hhciA9IGxpbmsgPyBsaW5rLmNoYXJBdCgwKSA6IGxpbmtDaGFyXTtcblxuXHRkZWxpbU9wZW5DaGFyMCA9IG9wZW5DaGFycy5jaGFyQXQoMCk7IC8vIEVzY2FwZSB0aGUgY2hhcmFjdGVycyAtIHNpbmNlIHRoZXkgY291bGQgYmUgcmVnZXggc3BlY2lhbCBjaGFyYWN0ZXJzXG5cdGRlbGltT3BlbkNoYXIxID0gb3BlbkNoYXJzLmNoYXJBdCgxKTtcblx0ZGVsaW1DbG9zZUNoYXIwID0gY2xvc2VDaGFycy5jaGFyQXQoMCk7XG5cdGRlbGltQ2xvc2VDaGFyMSA9IGNsb3NlQ2hhcnMuY2hhckF0KDEpO1xuXHRvcGVuQ2hhcnMgPSBcIlxcXFxcIiArIGRlbGltT3BlbkNoYXIwICsgXCIoXFxcXFwiICsgbGlua0NoYXIgKyBcIik/XFxcXFwiICsgZGVsaW1PcGVuQ2hhcjE7IC8vIERlZmF1bHQgaXMgXCJ7XntcIlxuXHRjbG9zZUNoYXJzID0gXCJcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIlxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMTsgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBcIn19XCJcblx0Ly8gQnVpbGQgcmVnZXggd2l0aCBuZXcgZGVsaW1pdGVyc1xuXHQvLyAgICAgICAgICBbdGFnICAgIChmb2xsb3dlZCBieSAvIHNwYWNlIG9yIH0pICBvciBjdnRyK2NvbG9uIG9yIGh0bWwgb3IgY29kZV0gZm9sbG93ZWQgYnkgc3BhY2UrcGFyYW1zIHRoZW4gY29udmVydEJhY2s/XG5cdHJUYWcgPSBcIig/OihcXFxcdysoPz1bXFxcXC9cXFxcc1xcXFxcIiArIGRlbGltQ2xvc2VDaGFyMCArIFwiXSkpfChcXFxcdyspPyg6KXwoPil8KFxcXFwqKSlcXFxccyooKD86W15cXFxcXCJcblx0XHQrIGRlbGltQ2xvc2VDaGFyMCArIFwiXXxcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIig/IVxcXFxcIiArIGRlbGltQ2xvc2VDaGFyMSArIFwiKSkqPylcIjtcblxuXHQvLyBNYWtlIHJUYWcgYXZhaWxhYmxlIHRvIEpzVmlld3MgKG9yIG90aGVyIGNvbXBvbmVudHMpIGZvciBwYXJzaW5nIGJpbmRpbmcgZXhwcmVzc2lvbnNcblx0JHN1Yi5yVGFnID0gXCIoPzpcIiArIHJUYWcgKyBcIilcIjtcblx0Ly8gICAgICAgICAgICAgICAgICAgICAgICB7IF4/IHsgICB0YWcrcGFyYW1zIHNsYXNoPyAgb3IgY2xvc2luZ1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNvbW1lbnRcblx0clRhZyA9IG5ldyBSZWdFeHAoXCIoPzpcIiArIG9wZW5DaGFycyArIHJUYWcgKyBcIihcXFxcLyk/fFxcXFxcIiArIGRlbGltT3BlbkNoYXIwICsgXCIoXFxcXFwiICsgbGlua0NoYXIgKyBcIik/XFxcXFwiICsgZGVsaW1PcGVuQ2hhcjEgKyBcIig/Oig/OlxcXFwvKFxcXFx3KykpXFxcXHMqfCEtLVtcXFxcc1xcXFxTXSo/LS0pKVwiICsgY2xvc2VDaGFycywgXCJnXCIpO1xuXG5cdC8vIERlZmF1bHQ6ICBiaW5kICAgICB0YWdOYW1lICAgICAgICAgY3Z0ICAgY2xuIGh0bWwgY29kZSAgICBwYXJhbXMgICAgICAgICAgICBzbGFzaCAgIGJpbmQyICAgICAgICAgY2xvc2VCbGsgIGNvbW1lbnRcblx0Ly8gICAgICAvKD86eyhcXF4pP3soPzooXFx3Kyg/PVtcXC9cXHN9XSkpfChcXHcrKT8oOil8KD4pfChcXCopKVxccyooKD86W159XXx9KD8hfSkpKj8pKFxcLyk/fHsoXFxeKT97KD86KD86XFwvKFxcdyspKVxccyp8IS0tW1xcc1xcU10qPy0tKSl9fVxuXG5cdCRzdWIuclRtcGwgPSBuZXcgUmVnRXhwKFwiPC4qPnwoW15cXFxcXFxcXF18Xilbe31dfFwiICsgb3BlbkNoYXJzICsgXCIuKlwiICsgY2xvc2VDaGFycyk7XG5cdC8vICRzdWIuclRtcGwgbG9va3MgZm9yIGh0bWwgdGFncyBvciB7IG9yIH0gY2hhciBub3QgcHJlY2VkZWQgYnkgXFxcXCwgb3IgSnNSZW5kZXIgdGFncyB7e3h4eH19LiBFYWNoIG9mIHRoZXNlIHN0cmluZ3MgYXJlIGNvbnNpZGVyZWRcblx0Ly8gTk9UIHRvIGJlIGpRdWVyeSBzZWxlY3RvcnNcblx0cmV0dXJuICR2aWV3c1NldHRpbmdzO1xufVxuXG4vLz09PT09PT09PVxuLy8gVmlldy5nZXRcbi8vPT09PT09PT09XG5cbmZ1bmN0aW9uIGdldFZpZXcoaW5uZXIsIHR5cGUpIHsgLy92aWV3LmdldChpbm5lciwgdHlwZSlcblx0aWYgKCF0eXBlICYmIGlubmVyICE9PSB0cnVlKSB7XG5cdFx0Ly8gdmlldy5nZXQodHlwZSlcblx0XHR0eXBlID0gaW5uZXI7XG5cdFx0aW5uZXIgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHR2YXIgdmlld3MsIGksIGwsIGZvdW5kLFxuXHRcdHZpZXcgPSB0aGlzLFxuXHRcdHJvb3QgPSAhdHlwZSB8fCB0eXBlID09PSBcInJvb3RcIjtcblx0XHQvLyBJZiB0eXBlIGlzIHVuZGVmaW5lZCwgcmV0dXJucyByb290IHZpZXcgKHZpZXcgdW5kZXIgdG9wIHZpZXcpLlxuXG5cdGlmIChpbm5lcikge1xuXHRcdC8vIEdvIHRocm91Z2ggdmlld3MgLSB0aGlzIG9uZSwgYW5kIGFsbCBuZXN0ZWQgb25lcywgZGVwdGgtZmlyc3QgLSBhbmQgcmV0dXJuIGZpcnN0IG9uZSB3aXRoIGdpdmVuIHR5cGUuXG5cdFx0Ly8gSWYgdHlwZSBpcyB1bmRlZmluZWQsIGkuZS4gdmlldy5nZXQodHJ1ZSksIHJldHVybiBmaXJzdCBjaGlsZCB2aWV3LlxuXHRcdGZvdW5kID0gdHlwZSAmJiB2aWV3LnR5cGUgPT09IHR5cGUgJiYgdmlldztcblx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHR2aWV3cyA9IHZpZXcudmlld3M7XG5cdFx0XHRpZiAodmlldy5fLnVzZUtleSkge1xuXHRcdFx0XHRmb3IgKGkgaW4gdmlld3MpIHtcblx0XHRcdFx0XHRpZiAoZm91bmQgPSB0eXBlID8gdmlld3NbaV0uZ2V0KGlubmVyLCB0eXBlKSA6IHZpZXdzW2ldKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoaSA9IDAsIGwgPSB2aWV3cy5sZW5ndGg7ICFmb3VuZCAmJiBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0Zm91bmQgPSB0eXBlID8gdmlld3NbaV0uZ2V0KGlubmVyLCB0eXBlKSA6IHZpZXdzW2ldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHJvb3QpIHtcblx0XHQvLyBGaW5kIHJvb3Qgdmlldy4gKHZpZXcgd2hvc2UgcGFyZW50IGlzIHRvcCB2aWV3KVxuXHRcdHdoaWxlICh2aWV3LnBhcmVudCkge1xuXHRcdFx0Zm91bmQgPSB2aWV3O1xuXHRcdFx0dmlldyA9IHZpZXcucGFyZW50O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR3aGlsZSAodmlldyAmJiAhZm91bmQpIHtcblx0XHRcdC8vIEdvIHRocm91Z2ggdmlld3MgLSB0aGlzIG9uZSwgYW5kIGFsbCBwYXJlbnQgb25lcyAtIGFuZCByZXR1cm4gZmlyc3Qgb25lIHdpdGggZ2l2ZW4gdHlwZS5cblx0XHRcdGZvdW5kID0gdmlldy50eXBlID09PSB0eXBlID8gdmlldyA6IHVuZGVmaW5lZDtcblx0XHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBnZXROZXN0ZWRJbmRleCgpIHtcblx0dmFyIHZpZXcgPSB0aGlzLmdldChcIml0ZW1cIik7XG5cdHJldHVybiB2aWV3ID8gdmlldy5pbmRleCA6IHVuZGVmaW5lZDtcbn1cblxuZ2V0TmVzdGVkSW5kZXguZGVwZW5kcyA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gW3RoaXMuZ2V0KFwiaXRlbVwiKSwgXCJpbmRleFwiXTtcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4KCkge1xuXHRyZXR1cm4gdGhpcy5pbmRleDtcbn1cblxuZ2V0SW5kZXguZGVwZW5kcyA9IFwiaW5kZXhcIjtcblxuLy89PT09PT09PT09XG4vLyBWaWV3LmhscFxuLy89PT09PT09PT09XG5cbmZ1bmN0aW9uIGdldEhlbHBlcihoZWxwZXIsIGlzQ29udGV4dENiKSB7XG5cdC8vIEhlbHBlciBtZXRob2QgY2FsbGVkIGFzIHZpZXcuaGxwKGtleSkgZnJvbSBjb21waWxlZCB0ZW1wbGF0ZSwgZm9yIGhlbHBlcnMgb3IgdGVtcGxhdGUgcGFyYW1ldGVycyB+Zm9vXG5cdHZhciB3cmFwcGVkLCBkZXBzLFxuXHR2aWV3ID0gdGhpcyxcblx0cmVzID0gdmlldy5jdHg7XG5cblx0aWYgKHJlcykge1xuXHRcdHJlcyA9IHJlc1toZWxwZXJdO1xuXHR9XG5cdGlmIChyZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJlcyA9ICRoZWxwZXJzW2hlbHBlcl07XG5cdH1cblx0aWYgKHJlcyAmJiByZXMuX2NwKSB7IC8vIElmIHRoaXMgaGVscGVyIHJlc291cmNlIGlzIGEgY29udGV4dHVhbCBwYXJhbWV0ZXIsIH5mb289ZXhwclxuXHRcdGlmIChpc0NvbnRleHRDYikgeyAgLy8gSW4gYSBjb250ZXh0IGNhbGxiYWNrIGZvciBhIGNvbnRleHR1YWwgcGFyYW0sIHJldHVybiB0aGUgW3ZpZXcsIGRlcGVuZGVuY2llcy4uLl0gYXJyYXkgLSBuZWVkZWQgZm9yIG9ic2VydmUgY2FsbFxuXHRcdFx0ZGVwcyA9ICRzdWIuX2NlbyhyZXNbMV0uZGVwcyk7ICAvLyBmbiBkZXBzLCB3aXRoIGFueSBleHByT2JzIGNsb25lZFxuXHRcdFx0ZGVwcy51bnNoaWZ0KHJlc1swXSk7ICAgICAgICAgICAvLyB2aWV3XG5cdFx0XHRkZXBzLl9jcCA9IHRydWU7XG5cdFx0XHRyZXR1cm4gZGVwcztcblx0XHR9XG5cdFx0cmVzID0gJHZpZXdzLmdldEN0eChyZXMpOyAvLyBJZiBhIGNvbnRleHR1YWwgcGFyYW0sIGJ1dCBub3QgYSBjb250ZXh0IGNhbGxiYWNrLCByZXR1cm4gZXZhbHVhdGVkIHBhcmFtIC0gZm4oZGF0YSwgdmlldywgailcblx0fVxuXG5cdGlmIChyZXMpIHtcblx0XHRpZiAoJGlzRnVuY3Rpb24ocmVzKSAmJiAhcmVzLl93cnApIHtcblx0XHRcdC8vIElmIGl0IGlzIG9mIHR5cGUgZnVuY3Rpb24sIGFuZCBub3QgYWxyZWFkeSB3cmFwcGVkLCB3ZSB3aWxsIHdyYXAgaXQsIHNvIGlmIGNhbGxlZCB3aXRoIG5vIHRoaXMgcG9pbnRlciBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuXHRcdFx0Ly8gdmlldyBhcyAndGhpcycgY29udGV4dC4gSWYgdGhlIGhlbHBlciB+Zm9vKCkgd2FzIGluIGEgZGF0YS1saW5rIGV4cHJlc3Npb24sIHRoZSB2aWV3IHdpbGwgaGF2ZSBhICd0ZW1wb3JhcnknIGxpbmtDdHggcHJvcGVydHkgdG9vLlxuXHRcdFx0Ly8gTm90ZSB0aGF0IGhlbHBlciBmdW5jdGlvbnMgb24gZGVlcGVyIHBhdGhzIHdpbGwgaGF2ZSBzcGVjaWZpYyB0aGlzIHBvaW50ZXJzLCBmcm9tIHRoZSBwcmVjZWRpbmcgcGF0aC5cblx0XHRcdC8vIEZvciBleGFtcGxlLCB+dXRpbC5mb28oKSB3aWxsIGhhdmUgdGhlIH51dGlsIG9iamVjdCBhcyAndGhpcycgcG9pbnRlclxuXHRcdFx0d3JhcHBlZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gcmVzLmFwcGx5KCghdGhpcyB8fCB0aGlzID09PSBnbG9iYWwpID8gdmlldyA6IHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHR9O1xuXHRcdFx0d3JhcHBlZC5fd3JwID0gdmlldztcblx0XHRcdCRleHRlbmQod3JhcHBlZCwgcmVzKTsgLy8gQXR0YWNoIHNhbWUgZXhwYW5kb3MgKGlmIGFueSkgdG8gdGhlIHdyYXBwZWQgZnVuY3Rpb25cblx0XHR9XG5cdH1cblx0cmV0dXJuIHdyYXBwZWQgfHwgcmVzO1xufVxuXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSh0bXBsKSB7XG5cdHJldHVybiB0bXBsICYmICh0bXBsLmZuXG5cdFx0PyB0bXBsXG5cdFx0OiB0aGlzLmdldFJzYyhcInRlbXBsYXRlc1wiLCB0bXBsKSB8fCAkdGVtcGxhdGVzKHRtcGwpKTsgLy8gbm90IHlldCBjb21waWxlZFxufVxuXG4vLz09PT09PT09PT09PT09XG4vLyB2aWV3cy5fY252dFxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb252ZXJ0VmFsKGNvbnZlcnRlciwgdmlldywgdGFnQ3R4LCBvbkVycm9yKSB7XG5cdC8vIHNlbGYgaXMgdGVtcGxhdGUgb2JqZWN0IG9yIGxpbmtDdHggb2JqZWN0XG5cdHZhciB0YWcsIHZhbHVlLFxuXHRcdC8vIGlmIHRhZ0N0eCBpcyBhbiBpbnRlZ2VyLCB0aGVuIGl0IGlzIHRoZSBrZXkgZm9yIHRoZSBjb21waWxlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGJvdW5kVGFnIHRhZ0N0eFxuXHRcdGJvdW5kVGFnID0gdHlwZW9mIHRhZ0N0eCA9PT0gXCJudW1iZXJcIiAmJiB2aWV3LnRtcGwuYm5kc1t0YWdDdHgtMV0sXG5cdFx0bGlua0N0eCA9IHZpZXcubGlua0N0eDsgLy8gRm9yIGRhdGEtbGluaz1cIntjdnQ6Li4ufVwiLi4uXG5cblx0aWYgKG9uRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhZ0N0eCA9IG9uRXJyb3IgPSB7cHJvcHM6IHt9LCBhcmdzOiBbb25FcnJvcl19O1xuXHR9IGVsc2UgaWYgKGJvdW5kVGFnKSB7XG5cdFx0dGFnQ3R4ID0gYm91bmRUYWcodmlldy5kYXRhLCB2aWV3LCAkc3ViKTtcblx0fVxuXG5cdHZhbHVlID0gdGFnQ3R4LmFyZ3NbMF07XG5cdGlmIChjb252ZXJ0ZXIgfHwgYm91bmRUYWcpIHtcblx0XHR0YWcgPSBsaW5rQ3R4ICYmIGxpbmtDdHgudGFnO1xuXHRcdGlmICghdGFnKSB7XG5cdFx0XHR0YWcgPSAkZXh0ZW5kKG5ldyAkc3ViLl90ZygpLCB7XG5cdFx0XHRcdF86IHtcblx0XHRcdFx0XHRpbmxpbmU6ICFsaW5rQ3R4LFxuXHRcdFx0XHRcdGJuZDogYm91bmRUYWcsXG5cdFx0XHRcdFx0dW5saW5rZWQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0dGFnTmFtZTogXCI6XCIsXG5cdFx0XHRcdGN2dDogY29udmVydGVyLFxuXHRcdFx0XHRmbG93OiB0cnVlLFxuXHRcdFx0XHR0YWdDdHg6IHRhZ0N0eFxuXHRcdFx0fSk7XG5cdFx0XHRpZiAobGlua0N0eCkge1xuXHRcdFx0XHRsaW5rQ3R4LnRhZyA9IHRhZztcblx0XHRcdFx0dGFnLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0fVxuXHRcdFx0dGFnQ3R4LmN0eCA9IGV4dGVuZEN0eCh0YWdDdHguY3R4LCAobGlua0N0eCA/IGxpbmtDdHgudmlldyA6IHZpZXcpLmN0eCk7XG5cdFx0fVxuXHRcdHRhZy5fZXIgPSBvbkVycm9yICYmIHZhbHVlO1xuXHRcdHRhZ0hhbmRsZXJzRnJvbVByb3BzKHRhZywgdGFnQ3R4KTtcblxuXHRcdHRhZ0N0eC52aWV3ID0gdmlldztcblxuXHRcdHRhZy5jdHggPSB0YWdDdHguY3R4IHx8IHRhZy5jdHggfHwge307XG5cdFx0dGFnQ3R4LmN0eCA9IHVuZGVmaW5lZDtcblxuXHRcdHZhbHVlID0gdGFnLmN2dEFyZ3MoY29udmVydGVyICE9PSBcInRydWVcIiAmJiBjb252ZXJ0ZXIpWzBdOyAvLyBJZiB0aGVyZSBpcyBhIGNvbnZlcnRCYWNrIGJ1dCBubyBjb252ZXJ0LCBjb252ZXJ0ZXIgd2lsbCBiZSBcInRydWVcIlxuXG5cdFx0Ly8gQ2FsbCBvblJlbmRlciAodXNlZCBieSBKc1ZpZXdzIGlmIHByZXNlbnQsIHRvIGFkZCBiaW5kaW5nIGFubm90YXRpb25zIGFyb3VuZCByZW5kZXJlZCBjb250ZW50KVxuXHRcdHZhbHVlID0gYm91bmRUYWcgJiYgdmlldy5fLm9uUmVuZGVyXG5cdFx0XHQ/IHZpZXcuXy5vblJlbmRlcih2YWx1ZSwgdmlldywgdGFnKVxuXHRcdFx0OiB2YWx1ZTtcblx0fVxuXHRyZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkID8gdmFsdWUgOiBcIlwiO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0QXJncyhjb252ZXJ0ZXIpIHtcblx0dmFyIHRhZyA9IHRoaXMsXG5cdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eCxcblx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0YXJncyA9IHRhZ0N0eC5hcmdzO1xuXG5cdGNvbnZlcnRlciA9IGNvbnZlcnRlciB8fCB0YWcuY29udmVydDtcblx0Y29udmVydGVyID0gY29udmVydGVyICYmIChcIlwiICsgY29udmVydGVyID09PSBjb252ZXJ0ZXJcblx0XHQ/ICh2aWV3LmdldFJzYyhcImNvbnZlcnRlcnNcIiwgY29udmVydGVyKSB8fCBlcnJvcihcIlVua25vd24gY29udmVydGVyOiAnXCIgKyBjb252ZXJ0ZXIgKyBcIidcIikpXG5cdFx0OiBjb252ZXJ0ZXIpO1xuXG5cdGFyZ3MgPSAhYXJncy5sZW5ndGggJiYgIXRhZ0N0eC5pbmRleCAvLyBPbiB0aGUgb3BlbmluZyB0YWcgd2l0aCBubyBhcmdzLCBiaW5kIHRvIHRoZSBjdXJyZW50IGRhdGEgY29udGV4dFxuXHRcdD8gW3ZpZXcuZGF0YV1cblx0XHQ6IGNvbnZlcnRlclxuXHRcdFx0PyBhcmdzLnNsaWNlKCkgLy8gSWYgdGhlcmUgaXMgYSBjb252ZXJ0ZXIsIHVzZSBhIGNvcHkgb2YgdGhlIHRhZ0N0eC5hcmdzIGFycmF5IGZvciByZW5kZXJpbmcsIGFuZCByZXBsYWNlIHRoZSBhcmdzWzBdIGluXG5cdFx0XHQvLyB0aGUgY29waWVkIGFycmF5IHdpdGggdGhlIGNvbnZlcnRlZCB2YWx1ZS4gQnV0IHdlIGRvIG5vdCBtb2RpZnkgdGhlIHZhbHVlIG9mIHRhZy50YWdDdHguYXJnc1swXSAodGhlIG9yaWdpbmFsIGFyZ3MgYXJyYXkpXG5cdFx0XHQ6IGFyZ3M7IC8vIElmIG5vIGNvbnZlcnRlciwgZ2V0IHRoZSBvcmlnaW5hbCB0YWdDdHguYXJnc1xuXG5cdGlmIChjb252ZXJ0ZXIpIHtcblx0XHRpZiAoY29udmVydGVyLmRlcGVuZHMpIHtcblx0XHRcdHRhZy5kZXBlbmRzID0gJHN1Yi5nZXREZXBzKHRhZy5kZXBlbmRzLCB0YWcsIGNvbnZlcnRlci5kZXBlbmRzLCBjb252ZXJ0ZXIpO1xuXHRcdH1cblx0XHRhcmdzWzBdID0gY29udmVydGVyLmFwcGx5KHRhZywgYXJncyk7XG5cdH1cblx0cmV0dXJuIGFyZ3M7XG59XG5cbi8vPT09PT09PT09PT09PVxuLy8gdmlld3MuX3RhZ1xuLy89PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdldFJlc291cmNlKHJlc291cmNlVHlwZSwgaXRlbU5hbWUpIHtcblx0dmFyIHJlcywgc3RvcmUsXG5cdFx0dmlldyA9IHRoaXM7XG5cdHdoaWxlICgocmVzID09PSB1bmRlZmluZWQpICYmIHZpZXcpIHtcblx0XHRzdG9yZSA9IHZpZXcudG1wbCAmJiB2aWV3LnRtcGxbcmVzb3VyY2VUeXBlXTtcblx0XHRyZXMgPSBzdG9yZSAmJiBzdG9yZVtpdGVtTmFtZV07XG5cdFx0dmlldyA9IHZpZXcucGFyZW50O1xuXHR9XG5cdHJldHVybiByZXMgfHwgJHZpZXdzW3Jlc291cmNlVHlwZV1baXRlbU5hbWVdO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUYWcodGFnTmFtZSwgcGFyZW50VmlldywgdG1wbCwgdGFnQ3R4cywgaXNVcGRhdGUsIG9uRXJyb3IpIHtcblx0cGFyZW50VmlldyA9IHBhcmVudFZpZXcgfHwgdG9wVmlldztcblx0dmFyIHRhZywgdGFnXywgdGFnRGVmLCB0ZW1wbGF0ZSwgdGFncywgYXR0ciwgcGFyZW50VGFnLCBpLCBsLCBpdGVtUmV0LCB0YWdDdHgsIHRhZ0N0eEN0eCxcblx0XHRjb250ZW50LCBjYWxsSW5pdCwgbWFwRGVmLCB0aGlzTWFwLCBhcmdzLCBwcm9wcywgaW5pdGlhbFRtcGwsIHRhZ0RhdGFNYXAsIGNvbnRlbnRDdHgsXG5cdFx0cmV0ID0gXCJcIixcblx0XHRsaW5rQ3R4ID0gcGFyZW50Vmlldy5saW5rQ3R4IHx8IDAsXG5cdFx0Y3R4ID0gcGFyZW50Vmlldy5jdHgsXG5cdFx0cGFyZW50VG1wbCA9IHRtcGwgfHwgcGFyZW50Vmlldy50bXBsLFxuXHRcdC8vIGlmIHRhZ0N0eCBpcyBhbiBpbnRlZ2VyLCB0aGVuIGl0IGlzIHRoZSBrZXkgZm9yIHRoZSBjb21waWxlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGJvdW5kVGFnIHRhZ0N0eHNcblx0XHRib3VuZFRhZyA9IHR5cGVvZiB0YWdDdHhzID09PSBcIm51bWJlclwiICYmIHBhcmVudFZpZXcudG1wbC5ibmRzW3RhZ0N0eHMtMV07XG5cblx0aWYgKHRhZ05hbWUuX2lzID09PSBcInRhZ1wiKSB7XG5cdFx0dGFnID0gdGFnTmFtZTtcblx0XHR0YWdOYW1lID0gdGFnLnRhZ05hbWU7XG5cdFx0dGFnQ3R4cyA9IHRhZy50YWdDdHhzO1xuXHRcdHRlbXBsYXRlID0gdGFnLnRlbXBsYXRlO1xuXHR9IGVsc2Uge1xuXHRcdHRhZ0RlZiA9IHBhcmVudFZpZXcuZ2V0UnNjKFwidGFnc1wiLCB0YWdOYW1lKSB8fCBlcnJvcihcIlVua25vd24gdGFnOiB7e1wiICsgdGFnTmFtZSArIFwifX0gXCIpO1xuXHRcdHRlbXBsYXRlID0gdGFnRGVmLnRlbXBsYXRlO1xuXHR9XG5cblx0aWYgKG9uRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldCArPSBvbkVycm9yO1xuXHRcdHRhZ0N0eHMgPSBvbkVycm9yID0gW3twcm9wczoge30sIGFyZ3M6IFtdfV07XG5cdH0gZWxzZSBpZiAoYm91bmRUYWcpIHtcblx0XHR0YWdDdHhzID0gYm91bmRUYWcocGFyZW50Vmlldy5kYXRhLCBwYXJlbnRWaWV3LCAkc3ViKTtcblx0fVxuXG5cdGwgPSB0YWdDdHhzLmxlbmd0aDtcblx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdHRhZ0N0eCA9IHRhZ0N0eHNbaV07XG5cdFx0aWYgKCFsaW5rQ3R4IHx8ICFsaW5rQ3R4LnRhZyB8fCBpICYmICFsaW5rQ3R4LnRhZy5fLmlubGluZSB8fCB0YWcuX2VyKSB7XG5cdFx0XHQvLyBJbml0aWFsaXplIHRhZ0N0eFxuXHRcdFx0Ly8gRm9yIGJsb2NrIHRhZ3MsIHRhZ0N0eC50bXBsIGlzIGFuIGludGVnZXIgPiAwXG5cdFx0XHRpZiAoY29udGVudCA9IHBhcmVudFRtcGwudG1wbHMgJiYgdGFnQ3R4LnRtcGwpIHtcblx0XHRcdFx0Y29udGVudCA9IHRhZ0N0eC5jb250ZW50ID0gcGFyZW50VG1wbC50bXBsc1tjb250ZW50IC0gMV07XG5cdFx0XHR9XG5cdFx0XHR0YWdDdHguaW5kZXggPSBpO1xuXHRcdFx0dGFnQ3R4LnRtcGwgPSBjb250ZW50OyAvLyBTZXQgdGhlIHRtcGwgcHJvcGVydHkgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2NrIHRhZ1xuXHRcdFx0dGFnQ3R4LnJlbmRlciA9IHJlbmRlckNvbnRlbnQ7XG5cdFx0XHR0YWdDdHgudmlldyA9IHBhcmVudFZpZXc7XG5cdFx0XHR0YWdDdHguY3R4ID0gZXh0ZW5kQ3R4KHRhZ0N0eC5jdHgsIGN0eCk7IC8vIENsb25lIGFuZCBleHRlbmQgcGFyZW50Vmlldy5jdHhcblx0XHR9XG5cdFx0aWYgKHRtcGwgPSB0YWdDdHgucHJvcHMudG1wbCkge1xuXHRcdFx0Ly8gSWYgdGhlIHRtcGwgcHJvcGVydHkgaXMgb3ZlcnJpZGRlbiwgc2V0IHRoZSB2YWx1ZSAod2hlbiBpbml0aWFsaXppbmcsIG9yLCBpbiBjYXNlIG9mIGJpbmRpbmc6IF50bXBsPS4uLiwgd2hlbiB1cGRhdGluZylcblx0XHRcdHRhZ0N0eC50bXBsID0gcGFyZW50Vmlldy5nZXRUbXBsKHRtcGwpO1xuXHRcdH1cblxuXHRcdGlmICghdGFnKSB7XG5cdFx0XHQvLyBUaGlzIHdpbGwgb25seSBiZSBoaXQgZm9yIGluaXRpYWwgdGFnQ3R4IChub3QgZm9yIHt7ZWxzZX19KSAtIGlmIHRoZSB0YWcgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgeWV0XG5cdFx0XHQvLyBJbnN0YW50aWF0ZSB0YWcgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0XG5cdFx0XHQvLyBJZiB0aGUgdGFnIGhhcyBub3QgYWxyZWFkeSBiZWVuIGluc3RhbnRpYXRlZCwgd2Ugd2lsbCBjcmVhdGUgYSBuZXcgaW5zdGFuY2UuXG5cdFx0XHQvLyB+dGFnIHdpbGwgYWNjZXNzIHRoZSB0YWcsIGV2ZW4gd2l0aGluIHRoZSByZW5kZXJpbmcgb2YgdGhlIHRlbXBsYXRlIGNvbnRlbnQgb2YgdGhpcyB0YWcuXG5cdFx0XHQvLyBGcm9tIGNoaWxkL2Rlc2NlbmRhbnQgdGFncywgY2FuIGFjY2VzcyB1c2luZyB+dGFnLnBhcmVudCwgb3IgfnBhcmVudFRhZ3MudGFnTmFtZVxuXHRcdFx0dGFnID0gbmV3IHRhZ0RlZi5fY3RyKCk7XG5cdFx0XHRjYWxsSW5pdCA9ICEhdGFnLmluaXQ7XG5cblx0XHRcdHRhZy5wYXJlbnQgPSBwYXJlbnRUYWcgPSBjdHggJiYgY3R4LnRhZztcblx0XHRcdHRhZy50YWdDdHhzID0gdGFnQ3R4cztcblx0XHRcdHRhZ0RhdGFNYXAgPSB0YWcuZGF0YU1hcDtcblxuXHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0dGFnLl8uaW5saW5lID0gZmFsc2U7XG5cdFx0XHRcdGxpbmtDdHgudGFnID0gdGFnO1xuXHRcdFx0XHR0YWcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFnLl8uYm5kID0gYm91bmRUYWcgfHwgbGlua0N0eC5mbikge1xuXHRcdFx0XHQvLyBCb3VuZCBpZiB7Xnt0YWcuLi59fSBvciBkYXRhLWxpbms9XCJ7dGFnLi4ufVwiXG5cdFx0XHRcdHRhZy5fLmFyclZ3cyA9IHt9O1xuXHRcdFx0fSBlbHNlIGlmICh0YWcuZGF0YUJvdW5kT25seSkge1xuXHRcdFx0XHRlcnJvcihcIntee1wiICsgdGFnTmFtZSArIFwifX0gdGFnIG11c3QgYmUgZGF0YS1ib3VuZFwiKTtcblx0XHRcdH1cblx0XHRcdC8vVE9ETyBiZXR0ZXIgcGVyZiBmb3IgY2hpbGRUYWdzKCkgLSBrZWVwIGNoaWxkIHRhZy50YWdzIGFycmF5LCAoYW5kIHJlbW92ZSBjaGlsZCwgd2hlbiBkaXNwb3NlZClcblx0XHRcdC8vIHRhZy50YWdzID0gW107XG5cdFx0fVxuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cztcblx0XHR0YWdEYXRhTWFwID0gdGFnLmRhdGFNYXA7XG5cblx0XHR0YWdDdHgudGFnID0gdGFnO1xuXHRcdGlmICh0YWdEYXRhTWFwICYmIHRhZ0N0eHMpIHtcblx0XHRcdHRhZ0N0eC5tYXAgPSB0YWdDdHhzW2ldLm1hcDsgLy8gQ29weSBvdmVyIHRoZSBjb21waWxlZCBtYXAgaW5zdGFuY2UgZnJvbSB0aGUgcHJldmlvdXMgdGFnQ3R4cyB0byB0aGUgcmVmcmVzaGVkIG9uZXNcblx0XHR9XG5cdFx0aWYgKCF0YWcuZmxvdykge1xuXHRcdFx0dGFnQ3R4Q3R4ID0gdGFnQ3R4LmN0eCA9IHRhZ0N0eC5jdHggfHwge307XG5cblx0XHRcdC8vIHRhZ3MgaGFzaDogdGFnLmN0eC50YWdzLCBtZXJnZWQgd2l0aCBwYXJlbnRWaWV3LmN0eC50YWdzLFxuXHRcdFx0dGFncyA9IHRhZy5wYXJlbnRzID0gdGFnQ3R4Q3R4LnBhcmVudFRhZ3MgPSBjdHggJiYgZXh0ZW5kQ3R4KHRhZ0N0eEN0eC5wYXJlbnRUYWdzLCBjdHgucGFyZW50VGFncykgfHwge307XG5cdFx0XHRpZiAocGFyZW50VGFnKSB7XG5cdFx0XHRcdHRhZ3NbcGFyZW50VGFnLnRhZ05hbWVdID0gcGFyZW50VGFnO1xuXHRcdFx0XHQvL1RPRE8gYmV0dGVyIHBlcmYgZm9yIGNoaWxkVGFnczogcGFyZW50VGFnLnRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0fVxuXHRcdFx0dGFnc1t0YWcudGFnTmFtZV0gPSB0YWdDdHhDdHgudGFnID0gdGFnO1xuXHRcdH1cblx0fVxuXHRpZiAoISh0YWcuX2VyID0gb25FcnJvcikpIHtcblx0XHR0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eHNbMF0pO1xuXHRcdHRhZy5yZW5kZXJpbmcgPSB7fTsgLy8gUHJvdmlkZSBvYmplY3QgZm9yIHN0YXRlIGR1cmluZyByZW5kZXIgY2FsbHMgdG8gdGFnIGFuZCBlbHNlcy4gKFVzZWQgYnkge3tpZn19IGFuZCB7e2Zvcn19Li4uKVxuXHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdHRhZ0N0eCA9IHRhZy50YWdDdHggPSB0YWdDdHhzW2ldO1xuXHRcdFx0cHJvcHMgPSB0YWdDdHgucHJvcHM7XG5cdFx0XHRhcmdzID0gdGFnLmN2dEFyZ3MoKTtcblxuXHRcdFx0aWYgKG1hcERlZiA9IHByb3BzLmRhdGFNYXAgfHwgdGFnRGF0YU1hcCkge1xuXHRcdFx0XHRpZiAoYXJncy5sZW5ndGggfHwgcHJvcHMuZGF0YU1hcCkge1xuXHRcdFx0XHRcdHRoaXNNYXAgPSB0YWdDdHgubWFwO1xuXHRcdFx0XHRcdGlmICghdGhpc01hcCB8fCB0aGlzTWFwLnNyYyAhPT0gYXJnc1swXSB8fCBpc1VwZGF0ZSkge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXNNYXAgJiYgdGhpc01hcC5zcmMpIHtcblx0XHRcdFx0XHRcdFx0dGhpc01hcC51bm1hcCgpOyAvLyBvbmx5IGNhbGxlZCBpZiBvYnNlcnZhYmxlIG1hcCAtIG5vdCB3aGVuIG9ubHkgdXNlZCBpbiBKc1JlbmRlciwgZS5nLiBieSB7e3Byb3BzfX1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXNNYXAgPSB0YWdDdHgubWFwID0gbWFwRGVmLm1hcChhcmdzWzBdLCBwcm9wcywgdW5kZWZpbmVkLCAhdGFnLl8uYm5kKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXJncyA9IFt0aGlzTWFwLnRndF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRhZy5jdHggPSB0YWdDdHguY3R4O1xuXG5cdFx0XHRpZiAoIWkpIHtcblx0XHRcdFx0aWYgKGNhbGxJbml0KSB7XG5cdFx0XHRcdFx0aW5pdGlhbFRtcGwgPSB0YWcudGVtcGxhdGU7XG5cdFx0XHRcdFx0dGFnLmluaXQodGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4KTtcblx0XHRcdFx0XHRjYWxsSW5pdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobGlua0N0eCkge1xuXHRcdFx0XHRcdC8vIFNldCBhdHRyIG9uIGxpbmtDdHggdG8gZW5zdXJlIG91dHB1dHRpbmcgdG8gdGhlIGNvcnJlY3QgdGFyZ2V0IGF0dHJpYnV0ZS5cblx0XHRcdFx0XHQvLyBTZXR0aW5nIGVpdGhlciBsaW5rQ3R4LmF0dHIgb3IgdGhpcy5hdHRyIGluIHRoZSBpbml0KCkgYWxsb3dzIHBlci1pbnN0YW5jZSBjaG9pY2Ugb2YgdGFyZ2V0IGF0dHJpYi5cblx0XHRcdFx0XHRsaW5rQ3R4LmF0dHIgPSB0YWcuYXR0ciA9IGxpbmtDdHguYXR0ciB8fCB0YWcuYXR0cjtcblx0XHRcdFx0fVxuXHRcdFx0XHRhdHRyID0gdGFnLmF0dHI7XG5cdFx0XHRcdHRhZy5fLm5vVndzID0gYXR0ciAmJiBhdHRyICE9PSBIVE1MO1xuXHRcdFx0fVxuXG5cdFx0XHRpdGVtUmV0ID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHRhZy5yZW5kZXIpIHtcblx0XHRcdFx0aXRlbVJldCA9IHRhZy5yZW5kZXIuYXBwbHkodGFnLCBhcmdzKTtcblx0XHRcdFx0aWYgKHBhcmVudFZpZXcubGlua2VkICYmIGl0ZW1SZXQgJiYgdGFnLmxpbmtlZEVsZW0gJiYgIXJXcmFwcGVkSW5WaWV3TWFya2VyLnRlc3QoaXRlbVJldCkpIHtcblx0XHRcdFx0XHQvLyBXaGVuIGEgdGFnIHJlbmRlcnMgY29udGVudCBmcm9tIHRoZSByZW5kZXIgbWV0aG9kLCB3aXRoIGRhdGEgbGlua2luZywgYW5kIGhhcyBhIGxpbmtlZEVsZW0gYmluZGluZywgdGhlbiB3ZSBuZWVkIHRvIHdyYXAgd2l0aFxuXHRcdFx0XHRcdC8vIHZpZXcgbWFya2VycywgaWYgYWJzZW50LCBzbyB0aGUgY29udGVudCBpcyBhIHZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWcsIHdoaWNoIHdpbGwgY29ycmVjdGx5IGRpc3Bvc2UgYmluZGluZ3MgaWYgZGVsZXRlZC5cblx0XHRcdFx0XHRpdGVtUmV0ID0gcmVuZGVyV2l0aFZpZXdzKCQudGVtcGxhdGVzKGl0ZW1SZXQpLCBhcmdzWzBdLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcGFyZW50VmlldywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRhZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghYXJncy5sZW5ndGgpIHtcblx0XHRcdFx0YXJncyA9IFtwYXJlbnRWaWV3XTsgLy8gbm8gYXJndW1lbnRzIC0gKGUuZy4ge3tlbHNlfX0pIGdldCBkYXRhIGNvbnRleHQgZnJvbSB2aWV3LlxuXHRcdFx0fVxuXHRcdFx0aWYgKGl0ZW1SZXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250ZW50Q3R4ID0gYXJnc1swXTsgLy8gRGVmYXVsdCBkYXRhIGNvbnRleHQgZm9yIHdyYXBwZWQgYmxvY2sgY29udGVudCBpcyB0aGUgZmlyc3QgYXJndW1lbnQuIERlZmluZWQgdGFnLmNvbnRlbnRDdHggZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhpcy5cblx0XHRcdFx0aWYgKHRhZy5jb250ZW50Q3R4KSB7XG5cdFx0XHRcdFx0Y29udGVudEN0eCA9IHRhZy5jb250ZW50Q3R4KGNvbnRlbnRDdHgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGl0ZW1SZXQgPSB0YWdDdHgucmVuZGVyKGNvbnRlbnRDdHgsIHRydWUpIHx8IChpc1VwZGF0ZSA/IHVuZGVmaW5lZCA6IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm8gcmV0dXJuIHZhbHVlIGZyb20gcmVuZGVyLCBhbmQgbm8gdGVtcGxhdGUvY29udGVudCB0YWdDdHgucmVuZGVyKC4uLiksIHNvIHJldHVybiB1bmRlZmluZWRcblx0XHRcdHJldCA9IHJldCA/IHJldCArIChpdGVtUmV0IHx8IFwiXCIpIDogaXRlbVJldDsgLy8gSWYgbm8gcmVuZGVyZWQgY29udGVudCwgdGhpcyB3aWxsIGJlIHVuZGVmaW5lZFxuXHRcdH1cblx0XHR0YWcucmVuZGVyaW5nID0gdW5kZWZpbmVkO1xuXHR9XG5cdHRhZy50YWdDdHggPSB0YWdDdHhzWzBdO1xuXHR0YWcuY3R4ID0gdGFnLnRhZ0N0eC5jdHg7XG5cblx0aWYgKHRhZy5fLm5vVndzKSB7XG5cdFx0XHRpZiAodGFnLl8uaW5saW5lKSB7XG5cdFx0XHQvLyBpbmxpbmUgdGFnIHdpdGggYXR0ciBzZXQgdG8gXCJ0ZXh0XCIgd2lsbCBpbnNlcnQgSFRNTC1lbmNvZGVkIGNvbnRlbnQgLSBhcyBpZiBpdCB3YXMgZWxlbWVudC1iYXNlZCBpbm5lclRleHRcblx0XHRcdHJldCA9IGF0dHIgPT09IFwidGV4dFwiXG5cdFx0XHRcdD8gJGNvbnZlcnRlcnMuaHRtbChyZXQpXG5cdFx0XHRcdDogXCJcIjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGJvdW5kVGFnICYmIHBhcmVudFZpZXcuXy5vblJlbmRlclxuXHRcdC8vIENhbGwgb25SZW5kZXIgKHVzZWQgYnkgSnNWaWV3cyBpZiBwcmVzZW50LCB0byBhZGQgYmluZGluZyBhbm5vdGF0aW9ucyBhcm91bmQgcmVuZGVyZWQgY29udGVudClcblx0XHQ/IHBhcmVudFZpZXcuXy5vblJlbmRlcihyZXQsIHBhcmVudFZpZXcsIHRhZylcblx0XHQ6IHJldDtcbn1cblxuLy89PT09PT09PT09PT09PT09PVxuLy8gVmlldyBjb25zdHJ1Y3RvclxuLy89PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBWaWV3KGNvbnRleHQsIHR5cGUsIHBhcmVudFZpZXcsIGRhdGEsIHRlbXBsYXRlLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCkge1xuXHQvLyBDb25zdHJ1Y3RvciBmb3IgdmlldyBvYmplY3QgaW4gdmlldyBoaWVyYXJjaHkuIChBdWdtZW50ZWQgYnkgSnNWaWV3cyBpZiBKc1ZpZXdzIGlzIGxvYWRlZClcblx0dmFyIHZpZXdzLCBwYXJlbnRWaWV3XywgdGFnLCBzZWxmXyxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRpc0FycmF5ID0gdHlwZSA9PT0gXCJhcnJheVwiO1xuXG5cdHNlbGYuY29udGVudCA9IGNvbnRlbnRUbXBsO1xuXHRzZWxmLnZpZXdzID0gaXNBcnJheSA/IFtdIDoge307XG5cdHNlbGYucGFyZW50ID0gcGFyZW50Vmlldztcblx0c2VsZi50eXBlID0gdHlwZSB8fCBcInRvcFwiO1xuXHRzZWxmLmRhdGEgPSBkYXRhO1xuXHRzZWxmLnRtcGwgPSB0ZW1wbGF0ZTtcblx0Ly8gSWYgdGhlIGRhdGEgaXMgYW4gYXJyYXksIHRoaXMgaXMgYW4gJ2FycmF5IHZpZXcnIHdpdGggYSB2aWV3cyBhcnJheSBmb3IgZWFjaCBjaGlsZCAnaXRlbSB2aWV3J1xuXHQvLyBJZiB0aGUgZGF0YSBpcyBub3QgYW4gYXJyYXksIHRoaXMgaXMgYW4gJ2l0ZW0gdmlldycgd2l0aCBhIHZpZXdzICdoYXNoJyBvYmplY3QgZm9yIGFueSBjaGlsZCBuZXN0ZWQgdmlld3Ncblx0Ly8gLl8udXNlS2V5IGlzIG5vbiB6ZXJvIGlmIGlzIG5vdCBhbiAnYXJyYXkgdmlldycgKG93bmluZyBhIGRhdGEgYXJyYXkpLiBVc2UgdGhpcyBhcyBuZXh0IGtleSBmb3IgYWRkaW5nIHRvIGNoaWxkIHZpZXdzIGhhc2hcblx0c2VsZl8gPSBzZWxmLl8gPSB7XG5cdFx0a2V5OiAwLFxuXHRcdHVzZUtleTogaXNBcnJheSA/IDAgOiAxLFxuXHRcdGlkOiBcIlwiICsgdmlld0lkKyssXG5cdFx0b25SZW5kZXI6IG9uUmVuZGVyLFxuXHRcdGJuZHM6IHt9XG5cdH07XG5cdHNlbGYubGlua2VkID0gISFvblJlbmRlcjtcblx0aWYgKHBhcmVudFZpZXcpIHtcblx0XHR2aWV3cyA9IHBhcmVudFZpZXcudmlld3M7XG5cdFx0cGFyZW50Vmlld18gPSBwYXJlbnRWaWV3Ll87XG5cdFx0aWYgKHBhcmVudFZpZXdfLnVzZUtleSkge1xuXHRcdFx0Ly8gUGFyZW50IGlzIG5vdCBhbiAnYXJyYXkgdmlldycuIEFkZCB0aGlzIHZpZXcgdG8gaXRzIHZpZXdzIG9iamVjdFxuXHRcdFx0Ly8gc2VsZi5fa2V5ID0gaXMgdGhlIGtleSBpbiB0aGUgcGFyZW50IHZpZXcgaGFzaFxuXHRcdFx0dmlld3Nbc2VsZl8ua2V5ID0gXCJfXCIgKyBwYXJlbnRWaWV3Xy51c2VLZXkrK10gPSBzZWxmO1xuXHRcdFx0c2VsZi5pbmRleCA9IGluZGV4U3RyO1xuXHRcdFx0c2VsZi5nZXRJbmRleCA9IGdldE5lc3RlZEluZGV4O1xuXHRcdH0gZWxzZSBpZiAodmlld3MubGVuZ3RoID09PSAoc2VsZl8ua2V5ID0gc2VsZi5pbmRleCA9IGtleSkpIHsgLy8gUGFyZW50IGlzIGFuICdhcnJheSB2aWV3Jy4gQWRkIHRoaXMgdmlldyB0byBpdHMgdmlld3MgYXJyYXlcblx0XHRcdHZpZXdzLnB1c2goc2VsZik7IC8vIEFkZGluZyB0byBlbmQgb2Ygdmlld3MgYXJyYXkuIChVc2luZyBwdXNoIHdoZW4gcG9zc2libGUgLSBiZXR0ZXIgcGVyZiB0aGFuIHNwbGljZSlcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmlld3Muc3BsaWNlKGtleSwgMCwgc2VsZik7IC8vIEluc2VydGluZyBpbiB2aWV3cyBhcnJheVxuXHRcdH1cblx0XHQvLyBJZiBubyBjb250ZXh0IHdhcyBwYXNzZWQgaW4sIHVzZSBwYXJlbnQgY29udGV4dFxuXHRcdC8vIElmIGNvbnRleHQgd2FzIHBhc3NlZCBpbiwgaXQgc2hvdWxkIGhhdmUgYmVlbiBtZXJnZWQgYWxyZWFkeSB3aXRoIHBhcmVudCBjb250ZXh0XG5cdFx0c2VsZi5jdHggPSBjb250ZXh0IHx8IHBhcmVudFZpZXcuY3R4O1xuXHR9IGVsc2Uge1xuXHRcdHNlbGYuY3R4ID0gY29udGV4dDtcblx0fVxufVxuXG5WaWV3LnByb3RvdHlwZSA9IHtcblx0Z2V0OiBnZXRWaWV3LFxuXHRnZXRJbmRleDogZ2V0SW5kZXgsXG5cdGdldFJzYzogZ2V0UmVzb3VyY2UsXG5cdGdldFRtcGw6IGdldFRlbXBsYXRlLFxuXHRobHA6IGdldEhlbHBlcixcblx0X2lzOiBcInZpZXdcIlxufTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZWdpc3RyYXRpb25cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb21waWxlQ2hpbGRSZXNvdXJjZXMocGFyZW50VG1wbCkge1xuXHR2YXIgc3RvcmVOYW1lLCBzdG9yZU5hbWVzLCByZXNvdXJjZXM7XG5cdGZvciAoc3RvcmVOYW1lIGluIGpzdlN0b3Jlcykge1xuXHRcdHN0b3JlTmFtZXMgPSBzdG9yZU5hbWUgKyBcInNcIjtcblx0XHRpZiAocGFyZW50VG1wbFtzdG9yZU5hbWVzXSkge1xuXHRcdFx0cmVzb3VyY2VzID0gcGFyZW50VG1wbFtzdG9yZU5hbWVzXTsgICAgLy8gUmVzb3VyY2VzIG5vdCB5ZXQgY29tcGlsZWRcblx0XHRcdHBhcmVudFRtcGxbc3RvcmVOYW1lc10gPSB7fTsgICAgICAgICAgICAgICAvLyBSZW1vdmUgdW5jb21waWxlZCByZXNvdXJjZXNcblx0XHRcdCR2aWV3c1tzdG9yZU5hbWVzXShyZXNvdXJjZXMsIHBhcmVudFRtcGwpOyAvLyBBZGQgYmFjayBpbiB0aGUgY29tcGlsZWQgcmVzb3VyY2VzXG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBjb21waWxlVGFnXG4vLz09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb21waWxlVGFnKG5hbWUsIHRhZ0RlZiwgcGFyZW50VG1wbCkge1xuXHR2YXIgdG1wbCwgYmFzZVRhZywgcHJvcCxcblx0XHRjb21waWxlZERlZiA9IG5ldyAkc3ViLl90ZygpO1xuXG5cdGZ1bmN0aW9uIFRhZygpIHtcblx0XHR2YXIgdGFnID0gdGhpcztcblx0XHR0YWcuXyA9IHtcblx0XHRcdGlubGluZTogdHJ1ZSxcblx0XHRcdHVubGlua2VkOiB0cnVlXG5cdFx0fTtcblxuXHRcdHRhZy50YWdOYW1lID0gbmFtZTtcblx0fVxuXG5cdGlmICgkaXNGdW5jdGlvbih0YWdEZWYpKSB7XG5cdFx0Ly8gU2ltcGxlIHRhZyBkZWNsYXJlZCBhcyBmdW5jdGlvbi4gTm8gcHJlc2VudGVyIGluc3RhbnRhdGlvbi5cblx0XHR0YWdEZWYgPSB7XG5cdFx0XHRkZXBlbmRzOiB0YWdEZWYuZGVwZW5kcyxcblx0XHRcdHJlbmRlcjogdGFnRGVmXG5cdFx0fTtcblx0fSBlbHNlIGlmIChcIlwiICsgdGFnRGVmID09PSB0YWdEZWYpIHtcblx0XHR0YWdEZWYgPSB7dGVtcGxhdGU6IHRhZ0RlZn07XG5cdH1cblx0aWYgKGJhc2VUYWcgPSB0YWdEZWYuYmFzZVRhZykge1xuXHRcdHRhZ0RlZi5mbG93ID0gISF0YWdEZWYuZmxvdzsgLy8gU2V0IGZsb3cgcHJvcGVydHksIHNvIGRlZmF1bHRzIHRvIGZhbHNlIGV2ZW4gaWYgYmFzZVRhZyBoYXMgZmxvdz10cnVlXG5cdFx0dGFnRGVmLmJhc2VUYWcgPSBiYXNlVGFnID0gXCJcIiArIGJhc2VUYWcgPT09IGJhc2VUYWdcblx0XHRcdD8gKHBhcmVudFRtcGwgJiYgcGFyZW50VG1wbC50YWdzW2Jhc2VUYWddIHx8ICR0YWdzW2Jhc2VUYWddKVxuXHRcdFx0OiBiYXNlVGFnO1xuXG5cdFx0Y29tcGlsZWREZWYgPSAkZXh0ZW5kKGNvbXBpbGVkRGVmLCBiYXNlVGFnKTtcblxuXHRcdGZvciAocHJvcCBpbiB0YWdEZWYpIHtcblx0XHRcdGNvbXBpbGVkRGVmW3Byb3BdID0gZ2V0TWV0aG9kKGJhc2VUYWdbcHJvcF0sIHRhZ0RlZltwcm9wXSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbXBpbGVkRGVmID0gJGV4dGVuZChjb21waWxlZERlZiwgdGFnRGVmKTtcblx0fVxuXG5cdC8vIFRhZyBkZWNsYXJlZCBhcyBvYmplY3QsIHVzZWQgYXMgdGhlIHByb3RvdHlwZSBmb3IgdGFnIGluc3RhbnRpYXRpb24gKGNvbnRyb2wvcHJlc2VudGVyKVxuXHRpZiAoKHRtcGwgPSBjb21waWxlZERlZi50ZW1wbGF0ZSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdGNvbXBpbGVkRGVmLnRlbXBsYXRlID0gXCJcIiArIHRtcGwgPT09IHRtcGwgPyAoJHRlbXBsYXRlc1t0bXBsXSB8fCAkdGVtcGxhdGVzKHRtcGwpKSA6IHRtcGw7XG5cdH1cblx0aWYgKGNvbXBpbGVkRGVmLmluaXQgIT09IGZhbHNlKSB7XG5cdFx0Ly8gU2V0IGluaXQ6IGZhbHNlIG9uIHRhZ0RlZiBpZiB5b3Ugd2FudCB0byBwcm92aWRlIGp1c3QgYSByZW5kZXIgbWV0aG9kLCBvciByZW5kZXIgYW5kIHRlbXBsYXRlLCBidXQgbm8gY29uc3RydWN0b3Igb3IgcHJvdG90eXBlLlxuXHRcdC8vIHNvIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0YWcgdG8gcmVuZGVyIGZ1bmN0aW9uLCBleGNlcHQgeW91IGNhbiBhbHNvIHByb3ZpZGUgYSB0ZW1wbGF0ZS5cblx0XHQoVGFnLnByb3RvdHlwZSA9IGNvbXBpbGVkRGVmKS5jb25zdHJ1Y3RvciA9IGNvbXBpbGVkRGVmLl9jdHIgPSBUYWc7XG5cdH1cblxuXHRpZiAocGFyZW50VG1wbCkge1xuXHRcdGNvbXBpbGVkRGVmLl9wYXJlbnRUbXBsID0gcGFyZW50VG1wbDtcblx0fVxuXHRyZXR1cm4gY29tcGlsZWREZWY7XG59XG5cbmZ1bmN0aW9uIGJhc2VBcHBseShhcmdzKSB7XG5cdC8vIEluIGRlcml2ZWQgbWV0aG9kIChvciBoYW5kbGVyIGRlY2xhcmVkIGRlY2xhcmF0aXZlbHkgYXMgaW4ge3s6Zm9vIG9uQ2hhbmdlPX5mb29DaGFuZ2VkfX0gY2FuIGNhbGwgYmFzZSBtZXRob2QsXG5cdC8vIHVzaW5nIHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgKEVxdWl2YWxlbnQgdG8gdGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpIGluIGpRdWVyeSBVSSlcblx0cmV0dXJuIHRoaXMuYmFzZS5hcHBseSh0aGlzLCBhcmdzKTtcbn1cblxuLy89PT09PT09PT09PT09PT1cbi8vIGNvbXBpbGVUbXBsXG4vLz09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjb21waWxlVG1wbChuYW1lLCB0bXBsLCBwYXJlbnRUbXBsLCBvcHRpb25zKSB7XG5cdC8vIHRtcGwgaXMgZWl0aGVyIGEgdGVtcGxhdGUgb2JqZWN0LCBhIHNlbGVjdG9yIGZvciBhIHRlbXBsYXRlIHNjcmlwdCBibG9jaywgdGhlIG5hbWUgb2YgYSBjb21waWxlZCB0ZW1wbGF0ZSwgb3IgYSB0ZW1wbGF0ZSBvYmplY3RcblxuXHQvLz09PT0gbmVzdGVkIGZ1bmN0aW9ucyA9PT09XG5cdGZ1bmN0aW9uIGxvb2t1cFRlbXBsYXRlKHZhbHVlKSB7XG5cdFx0Ly8gSWYgdmFsdWUgaXMgb2YgdHlwZSBzdHJpbmcgLSB0cmVhdCBhcyBzZWxlY3Rvciwgb3IgbmFtZSBvZiBjb21waWxlZCB0ZW1wbGF0ZVxuXHRcdC8vIFJldHVybiB0aGUgdGVtcGxhdGUgb2JqZWN0LCBpZiBhbHJlYWR5IGNvbXBpbGVkLCBvciB0aGUgbWFya3VwIHN0cmluZ1xuXHRcdHZhciBjdXJyZW50TmFtZSwgdG1wbDtcblx0XHRpZiAoKFwiXCIgKyB2YWx1ZSA9PT0gdmFsdWUpIHx8IHZhbHVlLm5vZGVUeXBlID4gMCAmJiAoZWxlbSA9IHZhbHVlKSkge1xuXHRcdFx0aWYgKCFlbGVtKSB7XG5cdFx0XHRcdGlmICgvXlxcLlxcL1teXFxcXDoqP1wiPD5dKiQvLnRlc3QodmFsdWUpKSB7XG5cdFx0XHRcdFx0Ly8gdG1wbD1cIi4vc29tZS9maWxlLmh0bWxcIlxuXHRcdFx0XHRcdC8vIElmIHRoZSB0ZW1wbGF0ZSBpcyBub3QgbmFtZWQsIHVzZSBcIi4vc29tZS9maWxlLmh0bWxcIiBhcyBuYW1lLlxuXHRcdFx0XHRcdGlmICh0bXBsID0gJHRlbXBsYXRlc1tuYW1lID0gbmFtZSB8fCB2YWx1ZV0pIHtcblx0XHRcdFx0XHRcdHZhbHVlID0gdG1wbDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gQlJPV1NFUi1TUEVDSUZJQyBDT0RFIChub3Qgb24gTm9kZS5qcyk6XG5cdFx0XHRcdFx0XHQvLyBMb29rIGZvciBzZXJ2ZXItZ2VuZXJhdGVkIHNjcmlwdCBibG9jayB3aXRoIGlkIFwiLi9zb21lL2ZpbGUuaHRtbFwiXG5cdFx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICgkLmZuICYmICEkc3ViLnJUbXBsLnRlc3QodmFsdWUpKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGVsZW0gPSAkKGRvY3VtZW50KS5maW5kKHZhbHVlKVswXTsgLy8gaWYgalF1ZXJ5IGlzIGxvYWRlZCwgdGVzdCBmb3Igc2VsZWN0b3IgcmV0dXJuaW5nIGVsZW1lbnRzLCBhbmQgZ2V0IGZpcnN0IGVsZW1lbnRcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0XHR9Ly8gRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0fSAvL0JST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0aWYgKGVsZW0pIHtcblx0XHRcdFx0Ly8gR2VuZXJhbGx5IHRoaXMgaXMgYSBzY3JpcHQgZWxlbWVudC5cblx0XHRcdFx0Ly8gSG93ZXZlciB3ZSBhbGxvdyBpdCB0byBiZSBhbnkgZWxlbWVudCwgc28geW91IGNhbiBmb3IgZXhhbXBsZSB0YWtlIHRoZSBjb250ZW50IG9mIGEgZGl2LFxuXHRcdFx0XHQvLyB1c2UgaXQgYXMgYSB0ZW1wbGF0ZSwgYW5kIHJlcGxhY2UgaXQgYnkgdGhlIHNhbWUgY29udGVudCByZW5kZXJlZCBhZ2FpbnN0IGRhdGEuXG5cdFx0XHRcdC8vIGUuZy4gZm9yIGxpbmtpbmcgdGhlIGNvbnRlbnQgb2YgYSBkaXYgdG8gYSBjb250YWluZXIsIGFuZCB1c2luZyB0aGUgaW5pdGlhbCBjb250ZW50IGFzIHRlbXBsYXRlOlxuXHRcdFx0XHQvLyAkLmxpbmsoXCIjY29udGVudFwiLCBtb2RlbCwge3RtcGw6IFwiI2NvbnRlbnRcIn0pO1xuXHRcdFx0XHRpZiAob3B0aW9ucykge1xuXHRcdFx0XHRcdC8vIFdlIHdpbGwgY29tcGlsZSBhIG5ldyB0ZW1wbGF0ZSB1c2luZyB0aGUgbWFya3VwIGluIHRoZSBzY3JpcHQgZWxlbWVudFxuXHRcdFx0XHRcdHZhbHVlID0gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gV2Ugd2lsbCBjYWNoZSBhIHNpbmdsZSBjb3B5IG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSwgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBuYW1lXG5cdFx0XHRcdFx0Ly8gKHJlbmFtaW5nIGZyb20gYSBwcmV2aW91cyBuYW1lIGlmIHRoZXJlIHdhcyBvbmUpLlxuXHRcdFx0XHRcdGN1cnJlbnROYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUodG1wbEF0dHIpO1xuXHRcdFx0XHRcdGlmIChjdXJyZW50TmFtZSkge1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnROYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gJHRlbXBsYXRlc1tjdXJyZW50TmFtZV07XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSAkdGVtcGxhdGVzW2N1cnJlbnROYW1lXTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoJC5mbikge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9ICQuZGF0YShlbGVtKVtqc3ZUbXBsXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bmFtZSA9IG5hbWUgfHwgKCQuZm4gPyBqc3ZUbXBsIDogdmFsdWUpO1xuXHRcdFx0XHRcdFx0dmFsdWUgPSBjb21waWxlVG1wbChuYW1lLCBlbGVtLmlubmVySFRNTCwgcGFyZW50VG1wbCwgb3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhbHVlLnRtcGxOYW1lID0gbmFtZSA9IG5hbWUgfHwgY3VycmVudE5hbWU7XG5cdFx0XHRcdFx0aWYgKG5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdFx0XHRcdCR0ZW1wbGF0ZXNbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUodG1wbEF0dHIsIG5hbWUpO1xuXHRcdFx0XHRcdGlmICgkLmZuKSB7XG5cdFx0XHRcdFx0XHQkLmRhdGEoZWxlbSwganN2VG1wbCwgdmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSAvLyBFTkQgQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdFx0XHRlbGVtID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoIXZhbHVlLmZuKSB7XG5cdFx0XHR2YWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdC8vIElmIHZhbHVlIGlzIG5vdCBhIHN0cmluZy4gSFRNTCBlbGVtZW50LCBvciBjb21waWxlZCB0ZW1wbGF0ZSwgcmV0dXJuIHVuZGVmaW5lZFxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHR2YXIgZWxlbSwgY29tcGlsZWRUbXBsLFxuXHRcdHRtcGxPck1hcmt1cCA9IHRtcGwgPSB0bXBsIHx8IFwiXCI7XG5cblx0Ly89PT09IENvbXBpbGUgdGhlIHRlbXBsYXRlID09PT1cblx0aWYgKG9wdGlvbnMgPT09IDApIHtcblx0XHRvcHRpb25zID0gdW5kZWZpbmVkO1xuXHRcdHRtcGxPck1hcmt1cCA9IGxvb2t1cFRlbXBsYXRlKHRtcGxPck1hcmt1cCk7IC8vIFRvcC1sZXZlbCBjb21waWxlIHNvIGRvIGEgdGVtcGxhdGUgbG9va3VwXG5cdH1cblxuXHQvLyBJZiBvcHRpb25zLCB0aGVuIHRoaXMgd2FzIGFscmVhZHkgY29tcGlsZWQgZnJvbSBhIChzY3JpcHQpIGVsZW1lbnQgdGVtcGxhdGUgZGVjbGFyYXRpb24uXG5cdC8vIElmIG5vdCwgdGhlbiBpZiB0bXBsIGlzIGEgdGVtcGxhdGUgb2JqZWN0LCB1c2UgaXQgZm9yIG9wdGlvbnNcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwgKHRtcGwubWFya3VwID8gdG1wbCA6IHt9KTtcblx0b3B0aW9ucy50bXBsTmFtZSA9IG5hbWU7XG5cdGlmIChwYXJlbnRUbXBsKSB7XG5cdFx0b3B0aW9ucy5fcGFyZW50VG1wbCA9IHBhcmVudFRtcGw7XG5cdH1cblx0Ly8gSWYgdG1wbCBpcyBub3QgYSBtYXJrdXAgc3RyaW5nIG9yIGEgc2VsZWN0b3Igc3RyaW5nLCB0aGVuIGl0IG11c3QgYmUgYSB0ZW1wbGF0ZSBvYmplY3Rcblx0Ly8gSW4gdGhhdCBjYXNlLCBnZXQgaXQgZnJvbSB0aGUgbWFya3VwIHByb3BlcnR5IG9mIHRoZSBvYmplY3Rcblx0aWYgKCF0bXBsT3JNYXJrdXAgJiYgdG1wbC5tYXJrdXAgJiYgKHRtcGxPck1hcmt1cCA9IGxvb2t1cFRlbXBsYXRlKHRtcGwubWFya3VwKSkpIHtcblx0XHRpZiAodG1wbE9yTWFya3VwLmZuKSB7XG5cdFx0XHQvLyBJZiB0aGUgc3RyaW5nIHJlZmVyZW5jZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBvYmplY3QsIG5lZWQgdG8gcmVjb21waWxlIHRvIG1lcmdlIGFueSBtb2RpZmllZCBvcHRpb25zXG5cdFx0XHR0bXBsT3JNYXJrdXAgPSB0bXBsT3JNYXJrdXAubWFya3VwO1xuXHRcdH1cblx0fVxuXHRpZiAodG1wbE9yTWFya3VwICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAodG1wbE9yTWFya3VwLmZuIHx8IHRtcGwuZm4pIHtcblx0XHRcdC8vIHRtcGwgaXMgYWxyZWFkeSBjb21waWxlZCwgc28gdXNlIGl0XG5cdFx0XHRpZiAodG1wbE9yTWFya3VwLmZuKSB7XG5cdFx0XHRcdGNvbXBpbGVkVG1wbCA9IHRtcGxPck1hcmt1cDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdG1wbE9yTWFya3VwIGlzIGEgbWFya3VwIHN0cmluZywgbm90IGEgY29tcGlsZWQgdGVtcGxhdGVcblx0XHRcdC8vIENyZWF0ZSB0ZW1wbGF0ZSBvYmplY3Rcblx0XHRcdHRtcGwgPSB0bXBsT2JqZWN0KHRtcGxPck1hcmt1cCwgb3B0aW9ucyk7XG5cdFx0XHQvLyBDb21waWxlIHRvIEFTVCBhbmQgdGhlbiB0byBjb21waWxlZCBmdW5jdGlvblxuXHRcdFx0dG1wbEZuKHRtcGxPck1hcmt1cC5yZXBsYWNlKHJFc2NhcGVRdW90ZXMsIFwiXFxcXCQmXCIpLCB0bXBsKTtcblx0XHR9XG5cdFx0aWYgKCFjb21waWxlZFRtcGwpIHtcblx0XHRcdGNvbXBpbGVkVG1wbCA9ICRleHRlbmQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBjb21waWxlZFRtcGwucmVuZGVyLmFwcGx5KGNvbXBpbGVkVG1wbCwgYXJndW1lbnRzKTtcblx0XHRcdH0sIHRtcGwpO1xuXG5cdFx0XHRjb21waWxlQ2hpbGRSZXNvdXJjZXMoY29tcGlsZWRUbXBsKTtcblx0XHR9XG5cdFx0aWYgKG5hbWUgJiYgIXBhcmVudFRtcGwgJiYgbmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0JHJlbmRlcltuYW1lXSA9IGNvbXBpbGVkVG1wbDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbXBpbGVkVG1wbDtcblx0fVxufVxuXG4vLz09PT0gL2VuZCBvZiBmdW5jdGlvbiBjb21waWxlVG1wbCA9PT09XG5cbi8vPT09PT09PT09PT09PT09PT1cbi8vIGNvbXBpbGVWaWV3TW9kZWxcbi8vPT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbChkZWZhdWx0VmFsLCBkYXRhKSB7XG5cdHJldHVybiAkLmlzRnVuY3Rpb24oZGVmYXVsdFZhbClcblx0XHQ/IGRlZmF1bHRWYWwuY2FsbChkYXRhKVxuXHRcdDogZGVmYXVsdFZhbDtcbn1cblxuZnVuY3Rpb24gdW5tYXBBcnJheShtb2RlbEFycikge1xuXHRcdHZhciBpLCBhcnIgPSBbXSxcblx0XHRcdGwgPSBtb2RlbEFyci5sZW5ndGg7XG5cdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRhcnIucHVzaChtb2RlbEFycltpXS51bm1hcCgpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gY29tcGlsZVZpZXdNb2RlbChuYW1lLCB0eXBlKSB7XG5cdHZhciBpLCBjb25zdHJ1Y3Rvcixcblx0XHR2aWV3TW9kZWxzID0gdGhpcyxcblx0XHRnZXR0ZXJzID0gdHlwZS5nZXR0ZXJzLFxuXHRcdGV4dGVuZCA9IHR5cGUuZXh0ZW5kLFxuXHRcdGlkID0gdHlwZS5pZCxcblx0XHRwcm90byA9ICQuZXh0ZW5kKHtcblx0XHRcdF9pczogbmFtZSB8fCBcInVubmFtZWRcIixcblx0XHRcdHVubWFwOiB1bm1hcCxcblx0XHRcdG1lcmdlOiBtZXJnZVxuXHRcdH0sIGV4dGVuZCksXG5cdFx0YXJncyA9IFwiXCIsXG5cdFx0Ym9keSA9IFwiXCIsXG5cdFx0bCA9IGdldHRlcnMgPyBnZXR0ZXJzLmxlbmd0aCA6IDAsXG5cdFx0JG9ic2VydmFibGUgPSAkLm9ic2VydmFibGUsXG5cdFx0Z2V0dGVyTmFtZXMgPSB7fTtcblxuXHRmdW5jdGlvbiBHZXROZXcoYXJncykge1xuXHRcdGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHR9XG5cblx0ZnVuY3Rpb24gdm0oKSB7XG5cdFx0cmV0dXJuIG5ldyBHZXROZXcoYXJndW1lbnRzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGl0ZXJhdGUoZGF0YSwgYWN0aW9uKSB7XG5cdFx0dmFyIGosIGdldHRlclR5cGUsIGRlZmF1bHRWYWwsIHByb3AsIG9iLFxuXHRcdFx0bSA9IGdldHRlcnMubGVuZ3RoO1xuXHRcdGZvciAoaj0wOyBqPG07IGorKykge1xuXHRcdFx0cHJvcCA9IGdldHRlcnNbal07XG5cdFx0XHRnZXR0ZXJUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHByb3AgKyBcIlwiICE9PSBwcm9wKSB7XG5cdFx0XHRcdGdldHRlclR5cGUgPSBwcm9wO1xuXHRcdFx0XHRwcm9wID0gZ2V0dGVyVHlwZS5nZXR0ZXI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoKG9iID0gZGF0YVtwcm9wXSkgPT09IHVuZGVmaW5lZCAmJiBnZXR0ZXJUeXBlICYmIChkZWZhdWx0VmFsID0gZ2V0dGVyVHlwZS5kZWZhdWx0VmFsKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG9iID0gZ2V0RGVmYXVsdFZhbChkZWZhdWx0VmFsLCBkYXRhKTtcblx0XHRcdH1cblx0XHRcdGFjdGlvbihvYiwgZ2V0dGVyVHlwZSAmJiB2aWV3TW9kZWxzW2dldHRlclR5cGUudHlwZV0sIHByb3ApO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIG1hcChkYXRhKSB7XG5cdFx0ZGF0YSA9IGRhdGEgKyBcIlwiID09PSBkYXRhXG5cdFx0XHQ/IEpTT04ucGFyc2UoZGF0YSkgLy8gQWNjZXB0IEpTT04gc3RyaW5nXG5cdFx0XHQ6IGRhdGE7ICAgICAgICAgICAgLy8gb3Igb2JqZWN0L2FycmF5XG5cdFx0dmFyIGksIGosICBsLCBtLCBwcm9wLFxuXHRcdFx0b2IgPSBkYXRhLFxuXHRcdFx0YXJyID0gW107XG5cblx0XHRpZiAoJGlzQXJyYXkoZGF0YSkpIHtcblx0XHRcdGRhdGEgPSBkYXRhIHx8IFtdO1xuXHRcdFx0bCA9IGRhdGEubGVuZ3RoO1xuXHRcdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRcdGFyci5wdXNoKHRoaXMubWFwKGRhdGFbaV0pKTtcblx0XHRcdH1cblx0XHRcdGFyci5faXMgPSBuYW1lO1xuXHRcdFx0YXJyLnVubWFwID0gdW5tYXA7XG5cdFx0XHRhcnIubWVyZ2UgPSBtZXJnZTtcblx0XHRcdHJldHVybiBhcnI7XG5cdFx0fVxuXG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGl0ZXJhdGUoZGF0YSwgZnVuY3Rpb24ob2IsIHZpZXdNb2RlbCkge1xuXHRcdFx0XHRpZiAodmlld01vZGVsKSB7IC8vIEl0ZXJhdGUgdG8gYnVpbGQgZ2V0dGVycyBhcmcgYXJyYXkgKHZhbHVlLCBvciBtYXBwZWQgdmFsdWUpXG5cdFx0XHRcdFx0b2IgPSB2aWV3TW9kZWwubWFwKG9iKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhcnIucHVzaChvYik7XG5cdFx0XHR9KTtcblxuXHRcdFx0b2IgPSB0aGlzLmFwcGx5KHRoaXMsIGFycik7IC8vIEluc2FudGlhdGUgdGhpcyBWaWV3IE1vZGVsLCBwYXNzaW5nIGdldHRlcnMgYXJncyBhcnJheSB0byBjb25zdHJ1Y3RvclxuXHRcdFx0Zm9yIChwcm9wIGluIGRhdGEpIHsgLy8gQ29weSBvdmVyIGFueSBvdGhlciBwcm9wZXJ0aWVzLiB0aGF0IGFyZSBub3QgZ2V0L3NldCBwcm9wZXJ0aWVzXG5cdFx0XHRcdGlmIChwcm9wICE9PSAkZXhwYW5kbyAgJiYgIWdldHRlck5hbWVzW3Byb3BdKSB7XG5cdFx0XHRcdFx0b2JbcHJvcF0gPSBkYXRhW3Byb3BdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvYjtcblx0fVxuXG5cdGZ1bmN0aW9uIG1lcmdlKGRhdGEpIHtcblx0XHRkYXRhID0gZGF0YSArIFwiXCIgPT09IGRhdGFcblx0XHRcdD8gSlNPTi5wYXJzZShkYXRhKSAvLyBBY2NlcHQgSlNPTiBzdHJpbmdcblx0XHRcdDogZGF0YTsgICAgICAgICAgICAvLyBvciBvYmplY3QvYXJyYXlcblx0XHR2YXIgaSwgaiwgbCwgbSwgcHJvcCwgbW9kLCBmb3VuZCwgYXNzaWduZWQsIG9iLCBuZXdNb2RBcnIsXG5cdFx0XHRtb2RlbCA9IHRoaXM7XG5cblx0XHRpZiAoJGlzQXJyYXkobW9kZWwpKSB7XG5cdFx0XHRhc3NpZ25lZCA9IHt9O1xuXHRcdFx0bmV3TW9kQXJyID0gW107XG5cdFx0XHRsID0gZGF0YS5sZW5ndGg7XG5cdFx0XHRtID0gbW9kZWwubGVuZ3RoO1xuXHRcdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRcdG9iID0gZGF0YVtpXTtcblx0XHRcdFx0Zm91bmQgPSBmYWxzZTtcblx0XHRcdFx0Zm9yIChqPTA7IGo8bSAmJiAhZm91bmQ7IGorKykge1xuXHRcdFx0XHRcdGlmIChhc3NpZ25lZFtqXSkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZCA9IG1vZGVsW2pdO1xuXG5cdFx0XHRcdFx0aWYgKGlkKSB7XG5cdFx0XHRcdFx0XHRhc3NpZ25lZFtqXSA9IGZvdW5kID0gaWQgKyBcIlwiID09PSBpZFxuXHRcdFx0XHRcdFx0PyAob2JbaWRdICYmIChnZXR0ZXJOYW1lc1tpZF0gPyBtb2RbaWRdKCkgOiBtb2RbaWRdKSA9PT0gb2JbaWRdKVxuXHRcdFx0XHRcdFx0OiBpZChtb2QsIG9iKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGZvdW5kKSB7XG5cdFx0XHRcdFx0bW9kLm1lcmdlKG9iKTtcblx0XHRcdFx0XHRuZXdNb2RBcnIucHVzaChtb2QpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5ld01vZEFyci5wdXNoKHZtLm1hcChvYikpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoJG9ic2VydmFibGUpIHtcblx0XHRcdFx0JG9ic2VydmFibGUobW9kZWwpLnJlZnJlc2gobmV3TW9kQXJyLCB0cnVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1vZGVsLnNwbGljZS5hcHBseShtb2RlbCwgWzAsIG1vZGVsLmxlbmd0aF0uY29uY2F0KG5ld01vZEFycikpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpdGVyYXRlKGRhdGEsIGZ1bmN0aW9uKG9iLCB2aWV3TW9kZWwsIGdldHRlcikge1xuXHRcdFx0aWYgKHZpZXdNb2RlbCkge1xuXHRcdFx0XHRtb2RlbFtnZXR0ZXJdKCkubWVyZ2Uob2IpOyAvLyBVcGRhdGUgdHlwZWQgcHJvcGVydHlcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1vZGVsW2dldHRlcl0ob2IpOyAvLyBVcGRhdGUgbm9uLXR5cGVkIHByb3BlcnR5XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Zm9yIChwcm9wIGluIGRhdGEpIHtcblx0XHRcdGlmIChwcm9wICE9PSAkZXhwYW5kbyAmJiAhZ2V0dGVyTmFtZXNbcHJvcF0pIHtcblx0XHRcdFx0bW9kZWxbcHJvcF0gPSBkYXRhW3Byb3BdO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHVubWFwKCkge1xuXHRcdHZhciBvYiwgcHJvcCwgaSwgbCwgZ2V0dGVyVHlwZSwgYXJyLCB2YWx1ZSxcblx0XHRcdG1vZGVsID0gdGhpcztcblxuXHRcdGlmICgkaXNBcnJheShtb2RlbCkpIHtcblx0XHRcdHJldHVybiB1bm1hcEFycmF5KG1vZGVsKTtcblx0XHR9XG5cdFx0b2IgPSB7fTtcblx0XHRsID0gZ2V0dGVycy5sZW5ndGg7XG5cdFx0Zm9yIChpPTA7IGk8bDsgaSsrKSB7XG5cdFx0XHRwcm9wID0gZ2V0dGVyc1tpXTtcblx0XHRcdGdldHRlclR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAocHJvcCArIFwiXCIgIT09IHByb3ApIHtcblx0XHRcdFx0Z2V0dGVyVHlwZSA9IHByb3A7XG5cdFx0XHRcdHByb3AgPSBnZXR0ZXJUeXBlLmdldHRlcjtcblx0XHRcdH1cblx0XHRcdHZhbHVlID0gbW9kZWxbcHJvcF0oKTtcblx0XHRcdG9iW3Byb3BdID0gZ2V0dGVyVHlwZSAmJiB2YWx1ZSAmJiB2aWV3TW9kZWxzW2dldHRlclR5cGUudHlwZV1cblx0XHRcdFx0PyAkaXNBcnJheSh2YWx1ZSlcblx0XHRcdFx0XHQ/IHVubWFwQXJyYXkodmFsdWUpXG5cdFx0XHRcdFx0OiB2YWx1ZS51bm1hcCgpXG5cdFx0XHRcdDogdmFsdWU7XG5cdFx0fVxuXHRcdGZvciAocHJvcCBpbiBtb2RlbCkge1xuXHRcdFx0aWYgKHByb3AgIT09IFwiX2lzXCIgJiYgIWdldHRlck5hbWVzW3Byb3BdICYmIHByb3AgIT09ICRleHBhbmRvICAmJiAocHJvcC5jaGFyQXQoMCkgIT09IFwiX1wiIHx8ICFnZXR0ZXJOYW1lc1twcm9wLnNsaWNlKDEpXSkgJiYgISQuaXNGdW5jdGlvbihtb2RlbFtwcm9wXSkpIHtcblx0XHRcdFx0b2JbcHJvcF0gPSBtb2RlbFtwcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9iO1xuXHR9XG5cblx0R2V0TmV3LnByb3RvdHlwZSA9IHByb3RvO1xuXG5cdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdChmdW5jdGlvbihnZXR0ZXIpIHtcblx0XHRcdGdldHRlciA9IGdldHRlci5nZXR0ZXIgfHwgZ2V0dGVyO1xuXHRcdFx0Z2V0dGVyTmFtZXNbZ2V0dGVyXSA9IGkrMTtcblx0XHRcdHZhciBwcml2RmllbGQgPSBcIl9cIiArIGdldHRlcjtcblxuXHRcdFx0YXJncyArPSAoYXJncyA/IFwiLFwiIDogXCJcIikgKyBnZXR0ZXI7XG5cdFx0XHRib2R5ICs9IFwidGhpcy5cIiArIHByaXZGaWVsZCArIFwiID0gXCIgKyBnZXR0ZXIgKyBcIjtcXG5cIjtcblx0XHRcdHByb3RvW2dldHRlcl0gPSBwcm90b1tnZXR0ZXJdIHx8IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpc1twcml2RmllbGRdOyAvLyBJZiB0aGVyZSBpcyBubyBhcmd1bWVudCwgdXNlIGFzIGEgZ2V0dGVyXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdFx0JG9ic2VydmFibGUodGhpcykuc2V0UHJvcGVydHkoZ2V0dGVyLCB2YWwpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXNbcHJpdkZpZWxkXSA9IHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdHByb3RvW2dldHRlcl0uc2V0ID0gcHJvdG9bZ2V0dGVyXS5zZXQgfHwgZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdFx0dGhpc1twcml2RmllbGRdID0gdmFsOyAvLyBTZXR0ZXIgY2FsbGVkIGJ5IG9ic2VydmFibGUgcHJvcGVydHkgY2hhbmdlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSkoZ2V0dGVyc1tpXSk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvciA9IG5ldyBGdW5jdGlvbihhcmdzLCBib2R5LnNsaWNlKDAsIC0xKSk7XG5cdGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IHByb3RvO1xuXHRwcm90by5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuXG5cdHZtLm1hcCA9IG1hcDtcblx0dm0uZ2V0dGVycyA9IGdldHRlcnM7XG5cdHZtLmV4dGVuZCA9IGV4dGVuZDtcblx0dm0uaWQgPSBpZDtcblx0cmV0dXJuIHZtO1xufVxuXG5mdW5jdGlvbiB0bXBsT2JqZWN0KG1hcmt1cCwgb3B0aW9ucykge1xuXHQvLyBUZW1wbGF0ZSBvYmplY3QgY29uc3RydWN0b3Jcblx0dmFyIGh0bWxUYWcsXG5cdFx0d3JhcE1hcCA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl93bSB8fCB7fSwgLy8gT25seSB1c2VkIGluIEpzVmlld3MuIE90aGVyd2lzZSBlbXB0eToge31cblx0XHR0bXBsID0gJGV4dGVuZChcblx0XHRcdHtcblx0XHRcdFx0dG1wbHM6IFtdLFxuXHRcdFx0XHRsaW5rczoge30sIC8vIENvbXBpbGVkIGZ1bmN0aW9ucyBmb3IgbGluayBleHByZXNzaW9uc1xuXHRcdFx0XHRibmRzOiBbXSxcblx0XHRcdFx0X2lzOiBcInRlbXBsYXRlXCIsXG5cdFx0XHRcdHJlbmRlcjogcmVuZGVyQ29udGVudFxuXHRcdFx0fSxcblx0XHRcdG9wdGlvbnNcblx0XHQpO1xuXG5cdHRtcGwubWFya3VwID0gbWFya3VwO1xuXHRpZiAoIW9wdGlvbnMuaHRtbFRhZykge1xuXHRcdC8vIFNldCB0bXBsLnRhZyB0byB0aGUgdG9wLWxldmVsIEhUTUwgdGFnIHVzZWQgaW4gdGhlIHRlbXBsYXRlLCBpZiBhbnkuLi5cblx0XHRodG1sVGFnID0gckZpcnN0RWxlbS5leGVjKG1hcmt1cCk7XG5cdFx0dG1wbC5odG1sVGFnID0gaHRtbFRhZyA/IGh0bWxUYWdbMV0udG9Mb3dlckNhc2UoKSA6IFwiXCI7XG5cdH1cblx0aHRtbFRhZyA9IHdyYXBNYXBbdG1wbC5odG1sVGFnXTtcblx0aWYgKGh0bWxUYWcgJiYgaHRtbFRhZyAhPT0gd3JhcE1hcC5kaXYpIHtcblx0XHQvLyBXaGVuIHVzaW5nIEpzVmlld3MsIHdlIHRyaW0gdGVtcGxhdGVzIHdoaWNoIGFyZSBpbnNlcnRlZCBpbnRvIEhUTUwgY29udGV4dHMgd2hlcmUgdGV4dCBub2RlcyBhcmUgbm90IHJlbmRlcmVkIChpLmUuIG5vdCAnUGhyYXNpbmcgQ29udGVudCcpLlxuXHRcdC8vIEN1cnJlbnRseSBub3QgdHJpbW1lZCBmb3IgPGxpPiB0YWcuIChOb3Qgd29ydGggYWRkaW5nIHBlcmYgY29zdClcblx0XHR0bXBsLm1hcmt1cCA9ICQudHJpbSh0bXBsLm1hcmt1cCk7XG5cdH1cblxuXHRyZXR1cm4gdG1wbDtcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gcmVnaXN0ZXJTdG9yZVxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZWdpc3RlclN0b3JlKHN0b3JlTmFtZSwgc3RvcmVTZXR0aW5ncykge1xuXG5cdGZ1bmN0aW9uIHRoZVN0b3JlKG5hbWUsIGl0ZW0sIHBhcmVudFRtcGwpIHtcblx0XHQvLyBUaGUgc3RvcmUgaXMgYWxzbyB0aGUgZnVuY3Rpb24gdXNlZCB0byBhZGQgaXRlbXMgdG8gdGhlIHN0b3JlLiBlLmcuICQudGVtcGxhdGVzLCBvciAkLnZpZXdzLnRhZ3NcblxuXHRcdC8vIEZvciBzdG9yZSBvZiBuYW1lICd0aGluZycsIENhbGwgYXM6XG5cdFx0Ly8gICAgJC52aWV3cy50aGluZ3MoaXRlbXNbLCBwYXJlbnRUbXBsXSksXG5cdFx0Ly8gb3IgJC52aWV3cy50aGluZ3MobmFtZSwgaXRlbVssIHBhcmVudFRtcGxdKVxuXG5cdFx0dmFyIG9uU3RvcmUsIGNvbXBpbGUsIGl0ZW1OYW1lLCB0aGlzU3RvcmU7XG5cdFx0aWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09IE9CSkVDVCAmJiAhbmFtZS5ub2RlVHlwZSAmJiAhbmFtZS5tYXJrdXAgJiYgIW5hbWUuZ2V0VGd0ICYmICEoc3RvcmVOYW1lID09PSBcInZpZXdNb2RlbFwiICYmIG5hbWUuZ2V0dGVycyB8fCBuYW1lLmV4dGVuZCkpIHtcblx0XHRcdC8vIENhbGwgdG8gJC52aWV3cy50aGluZ3MoaXRlbXNbLCBwYXJlbnRUbXBsXSksXG5cblx0XHRcdC8vIEFkZGluZyBpdGVtcyB0byB0aGUgc3RvcmVcblx0XHRcdC8vIElmIG5hbWUgaXMgYSBoYXNoLCB0aGVuIGl0ZW0gaXMgcGFyZW50VG1wbC4gSXRlcmF0ZSBvdmVyIGhhc2ggYW5kIGNhbGwgc3RvcmUgZm9yIGtleS5cblx0XHRcdGZvciAoaXRlbU5hbWUgaW4gbmFtZSkge1xuXHRcdFx0XHR0aGVTdG9yZShpdGVtTmFtZSwgbmFtZVtpdGVtTmFtZV0sIGl0ZW0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGl0ZW0gfHwgJHZpZXdzO1xuXHRcdH1cblx0XHQvLyBBZGRpbmcgYSBzaW5nbGUgdW5uYW1lZCBpdGVtIHRvIHRoZSBzdG9yZVxuXHRcdGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGl0ZW0gPSBuYW1lO1xuXHRcdFx0bmFtZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKG5hbWUgJiYgXCJcIiArIG5hbWUgIT09IG5hbWUpIHsgLy8gbmFtZSBtdXN0IGJlIGEgc3RyaW5nXG5cdFx0XHRwYXJlbnRUbXBsID0gaXRlbTtcblx0XHRcdGl0ZW0gPSBuYW1lO1xuXHRcdFx0bmFtZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dGhpc1N0b3JlID0gcGFyZW50VG1wbFxuXHRcdFx0PyBzdG9yZU5hbWUgPT09IFwidmlld01vZGVsXCJcblx0XHRcdFx0PyBwYXJlbnRUbXBsXG5cdFx0XHRcdDogKHBhcmVudFRtcGxbc3RvcmVOYW1lc10gPSBwYXJlbnRUbXBsW3N0b3JlTmFtZXNdIHx8IHt9KVxuXHRcdFx0OiB0aGVTdG9yZTtcblx0XHRjb21waWxlID0gc3RvcmVTZXR0aW5ncy5jb21waWxlO1xuXHRcdGlmIChpdGVtID09PSBudWxsKSB7XG5cdFx0XHQvLyBJZiBpdGVtIGlzIG51bGwsIGRlbGV0ZSB0aGlzIGVudHJ5XG5cdFx0XHRpZiAobmFtZSkge1xuXHRcdFx0XHRkZWxldGUgdGhpc1N0b3JlW25hbWVdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpdGVtID0gY29tcGlsZSA/IGNvbXBpbGUuY2FsbCh0aGlzU3RvcmUsIG5hbWUsIGl0ZW0sIHBhcmVudFRtcGwsIDApIDogaXRlbTtcblx0XHRcdGlmIChuYW1lKSB7XG5cdFx0XHRcdHRoaXNTdG9yZVtuYW1lXSA9IGl0ZW07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChjb21waWxlICYmIGl0ZW0pIHtcblx0XHRcdGl0ZW0uX2lzID0gc3RvcmVOYW1lOyAvLyBPbmx5IGRvIHRoaXMgZm9yIGNvbXBpbGVkIG9iamVjdHMgKHRhZ3MsIHRlbXBsYXRlcy4uLilcblx0XHR9XG5cdFx0aWYgKGl0ZW0gJiYgKG9uU3RvcmUgPSAkc3ViLm9uU3RvcmVbc3RvcmVOYW1lXSkpIHtcblx0XHRcdC8vIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0b25TdG9yZShuYW1lLCBpdGVtLCBjb21waWxlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGl0ZW07XG5cdH1cblxuXHR2YXIgc3RvcmVOYW1lcyA9IHN0b3JlTmFtZSArIFwic1wiO1xuXG5cdCR2aWV3c1tzdG9yZU5hbWVzXSA9IHRoZVN0b3JlO1xufVxuXG5mdW5jdGlvbiBhZGRTZXR0aW5nKHN0KSB7XG5cdCR2aWV3c1NldHRpbmdzW3N0XSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcblx0XHRcdD8gKCRzdWJTZXR0aW5nc1tzdF0gPSB2YWx1ZSwgJHZpZXdzU2V0dGluZ3MpXG5cdFx0XHQ6ICRzdWJTZXR0aW5nc1tzdF07XG5cdH07XG59XG5cbi8vPT09PT09PT09XG4vLyBkYXRhTWFwXG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBkYXRhTWFwKG1hcERlZikge1xuXHRmdW5jdGlvbiBNYXAoc291cmNlLCBvcHRpb25zKSB7XG5cdFx0dGhpcy50Z3QgPSBtYXBEZWYuZ2V0VGd0KHNvdXJjZSwgb3B0aW9ucyk7XG5cdH1cblxuXHRpZiAoJGlzRnVuY3Rpb24obWFwRGVmKSkge1xuXHRcdC8vIFNpbXBsZSBtYXAgZGVjbGFyZWQgYXMgZnVuY3Rpb25cblx0XHRtYXBEZWYgPSB7XG5cdFx0XHRnZXRUZ3Q6IG1hcERlZlxuXHRcdH07XG5cdH1cblxuXHRpZiAobWFwRGVmLmJhc2VNYXApIHtcblx0XHRtYXBEZWYgPSAkZXh0ZW5kKCRleHRlbmQoe30sIG1hcERlZi5iYXNlTWFwKSwgbWFwRGVmKTtcblx0fVxuXG5cdG1hcERlZi5tYXAgPSBmdW5jdGlvbihzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gbmV3IE1hcChzb3VyY2UsIG9wdGlvbnMpO1xuXHR9O1xuXHRyZXR1cm4gbWFwRGVmO1xufVxuXG4vLz09PT09PT09PT09PT09XG4vLyByZW5kZXJDb250ZW50XG4vLz09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIGtleSwgb25SZW5kZXIpIHtcblx0dmFyIGksIGwsIHRhZywgdG1wbCwgdGFnQ3R4LCBpc1RvcFJlbmRlckNhbGwsIHByZXZEYXRhLCBwcmV2SW5kZXgsXG5cdFx0dmlldyA9IHBhcmVudFZpZXcsXG5cdFx0cmVzdWx0ID0gXCJcIjtcblxuXHRpZiAoY29udGV4dCA9PT0gdHJ1ZSkge1xuXHRcdG5vSXRlcmF0aW9uID0gY29udGV4dDsgLy8gcGFzc2luZyBib29sZWFuIGFzIHNlY29uZCBwYXJhbSAtIG5vSXRlcmF0aW9uXG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICh0eXBlb2YgY29udGV4dCAhPT0gT0JKRUNUKSB7XG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDsgLy8gY29udGV4dCBtdXN0IGJlIGEgYm9vbGVhbiAobm9JdGVyYXRpb24pIG9yIGEgcGxhaW4gb2JqZWN0XG5cdH1cblxuXHRpZiAodGFnID0gdGhpcy50YWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgY2FsbCBmcm9tIHJlbmRlclRhZyBvciB0YWdDdHgucmVuZGVyKC4uLilcblx0XHR0YWdDdHggPSB0aGlzO1xuXHRcdHZpZXcgPSB2aWV3IHx8IHRhZ0N0eC52aWV3O1xuXHRcdHRtcGwgPSB2aWV3LmdldFRtcGwodGFnLnRlbXBsYXRlIHx8IHRhZ0N0eC50bXBsKTtcblx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdGRhdGEgPSB2aWV3O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBUaGlzIGlzIGEgdGVtcGxhdGUucmVuZGVyKC4uLikgY2FsbFxuXHRcdHRtcGwgPSB0aGlzO1xuXHR9XG5cblx0aWYgKHRtcGwpIHtcblx0XHRpZiAoIXBhcmVudFZpZXcgJiYgZGF0YSAmJiBkYXRhLl9pcyA9PT0gXCJ2aWV3XCIpIHtcblx0XHRcdHZpZXcgPSBkYXRhOyAvLyBXaGVuIHBhc3NpbmcgaW4gYSB2aWV3IHRvIHJlbmRlciBvciBsaW5rIChhbmQgbm90IHBhc3NpbmcgaW4gYSBwYXJlbnQgdmlldykgdXNlIHRoZSBwYXNzZWQtaW4gdmlldyBhcyBwYXJlbnRWaWV3XG5cdFx0fVxuXG5cdFx0aWYgKHZpZXcpIHtcblx0XHRcdGlmIChkYXRhID09PSB2aWV3KSB7XG5cdFx0XHRcdC8vIEluaGVyaXQgdGhlIGRhdGEgZnJvbSB0aGUgcGFyZW50IHZpZXcuXG5cdFx0XHRcdC8vIFRoaXMgbWF5IGJlIHRoZSBjb250ZW50cyBvZiBhbiB7e2lmfX0gYmxvY2tcblx0XHRcdFx0ZGF0YSA9IHZpZXcuZGF0YTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpc1RvcFJlbmRlckNhbGwgPSAhdmlldztcblx0XHRpc1JlbmRlckNhbGwgPSBpc1JlbmRlckNhbGwgfHwgaXNUb3BSZW5kZXJDYWxsO1xuXHRcdGlmICghdmlldykge1xuXHRcdFx0KGNvbnRleHQgPSBjb250ZXh0IHx8IHt9KS5yb290ID0gZGF0YTsgLy8gUHJvdmlkZSB+cm9vdCBhcyBzaG9ydGN1dCB0byB0b3AtbGV2ZWwgZGF0YS5cblx0XHR9XG5cdFx0aWYgKCFpc1JlbmRlckNhbGwgfHwgJHN1YlNldHRpbmdzQWR2YW5jZWQudXNlVmlld3MgfHwgdG1wbC51c2VWaWV3cyB8fCB2aWV3ICYmIHZpZXcgIT09IHRvcFZpZXcpIHtcblx0XHRcdHJlc3VsdCA9IHJlbmRlcldpdGhWaWV3cyh0bXBsLCBkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgdmlldywga2V5LCBvblJlbmRlciwgdGFnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHZpZXcpIHsgLy8gSW4gYSBibG9ja1xuXHRcdFx0XHRwcmV2RGF0YSA9IHZpZXcuZGF0YTtcblx0XHRcdFx0cHJldkluZGV4ID0gdmlldy5pbmRleDtcblx0XHRcdFx0dmlldy5pbmRleCA9IGluZGV4U3RyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmlldyA9IHRvcFZpZXc7XG5cdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGE7XG5cdFx0XHRcdHZpZXcuY3R4ID0gY29udGV4dDtcblx0XHRcdH1cblx0XHRcdGlmICgkaXNBcnJheShkYXRhKSAmJiAhbm9JdGVyYXRpb24pIHtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgdGhlIGFycmF5LCB3aG9zZSBjaGlsZCB2aWV3cyBjb3JyZXNwb25kIHRvIGVhY2ggZGF0YSBpdGVtLiAoTm90ZTogaWYga2V5IGFuZCBwYXJlbnRWaWV3IGFyZSBwYXNzZWQgaW5cblx0XHRcdFx0Ly8gYWxvbmcgd2l0aCBwYXJlbnQgdmlldywgdHJlYXQgYXMgaW5zZXJ0IC1lLmcuIGZyb20gdmlldy5hZGRWaWV3cyAtIHNvIHBhcmVudFZpZXcgaXMgYWxyZWFkeSB0aGUgdmlldyBpdGVtIGZvciBhcnJheSlcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IGRhdGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0dmlldy5pbmRleCA9IGk7XG5cdFx0XHRcdFx0dmlldy5kYXRhID0gZGF0YVtpXTtcblx0XHRcdFx0XHRyZXN1bHQgKz0gdG1wbC5mbihkYXRhW2ldLCB2aWV3LCAkc3ViKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmlldy5kYXRhID0gZGF0YTtcblx0XHRcdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YSwgdmlldywgJHN1Yik7XG5cdFx0XHR9XG5cdFx0XHR2aWV3LmRhdGEgPSBwcmV2RGF0YTtcblx0XHRcdHZpZXcuaW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0fVxuXHRcdGlmIChpc1RvcFJlbmRlckNhbGwpIHtcblx0XHRcdGlzUmVuZGVyQ2FsbCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aFZpZXdzKHRtcGwsIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCB2aWV3LCBrZXksIG9uUmVuZGVyLCB0YWcpIHtcblx0ZnVuY3Rpb24gc2V0SXRlbVZhcihpdGVtKSB7XG5cdFx0Ly8gV2hlbiBpdGVtVmFyIGlzIHNwZWNpZmllZCwgc2V0IG1vZGlmaWVkIGN0eCB3aXRoIHVzZXItbmFtZWQgfml0ZW1cblx0XHRuZXdDdHggPSAkZXh0ZW5kKHt9LCBjb250ZXh0KTtcblx0XHRuZXdDdHhbaXRlbVZhcl0gPSBpdGVtO1xuXHR9XG5cblx0Ly8gUmVuZGVyIHRlbXBsYXRlIGFnYWluc3QgZGF0YSBhcyBhIHRyZWUgb2Ygc3Vidmlld3MgKG5lc3RlZCByZW5kZXJlZCB0ZW1wbGF0ZSBpbnN0YW5jZXMpLCBvciBhcyBhIHN0cmluZyAodG9wLWxldmVsIHRlbXBsYXRlKS5cblx0Ly8gSWYgdGhlIGRhdGEgaXMgdGhlIHBhcmVudCB2aWV3LCB0cmVhdCBhcyBub0l0ZXJhdGlvbiwgcmUtcmVuZGVyIHdpdGggdGhlIHNhbWUgZGF0YSBjb250ZXh0LlxuXHR2YXIgaSwgbCwgbmV3VmlldywgY2hpbGRWaWV3LCBpdGVtUmVzdWx0LCBzd2FwQ29udGVudCwgY29udGVudFRtcGwsIG91dGVyT25SZW5kZXIsIHRtcGxOYW1lLCBpdGVtVmFyLCBuZXdDdHgsIHRhZ0N0eCxcblx0XHRyZXN1bHQgPSBcIlwiO1xuXG5cdGlmICh0YWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgY2FsbCBmcm9tIHJlbmRlclRhZyBvciB0YWdDdHgucmVuZGVyKC4uLilcblx0XHR0bXBsTmFtZSA9IHRhZy50YWdOYW1lO1xuXHRcdHRhZ0N0eCA9IHRhZy50YWdDdHg7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgPyBleHRlbmRDdHgoY29udGV4dCwgdGFnLmN0eCkgOiB0YWcuY3R4O1xuXG5cdFx0aWYgKHRtcGwgPT09IHZpZXcuY29udGVudCkgeyAvLyB7e3h4eCB0bXBsPSNjb250ZW50fX1cblx0XHRcdGNvbnRlbnRUbXBsID0gdG1wbCAhPT0gdmlldy5jdHguX3dycCAvLyBXZSBhcmUgcmVuZGVyaW5nIHRoZSAjY29udGVudFxuXHRcdFx0XHQ/IHZpZXcuY3R4Ll93cnAgLy8gI2NvbnRlbnQgd2FzIHRoZSB0YWdDdHgucHJvcHMudG1wbCB3cmFwcGVyIG9mIHRoZSBibG9jayBjb250ZW50IC0gc28gd2l0aGluIHRoaXMgdmlldywgI2NvbnRlbnQgd2lsbCBub3cgYmUgdGhlIHZpZXcuY3R4Ll93cnAgYmxvY2sgY29udGVudFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDsgLy8gI2NvbnRlbnQgd2FzIHRoZSB2aWV3LmN0eC5fd3JwIGJsb2NrIGNvbnRlbnQgLSBzbyB3aXRoaW4gdGhpcyB2aWV3LCB0aGVyZSBpcyBubyBsb25nZXIgYW55ICNjb250ZW50IHRvIHdyYXAuXG5cdFx0fSBlbHNlIGlmICh0bXBsICE9PSB0YWdDdHguY29udGVudCkge1xuXHRcdFx0aWYgKHRtcGwgPT09IHRhZy50ZW1wbGF0ZSkgeyAvLyBSZW5kZXJpbmcge3t0YWd9fSB0YWcudGVtcGxhdGUsIHJlcGxhY2luZyBibG9jayBjb250ZW50LlxuXHRcdFx0XHRjb250ZW50VG1wbCA9IHRhZ0N0eC50bXBsOyAvLyBTZXQgI2NvbnRlbnQgdG8gYmxvY2sgY29udGVudCAob3Igd3JhcHBlZCBibG9jayBjb250ZW50IGlmIHRhZ0N0eC5wcm9wcy50bXBsIGlzIHNldClcblx0XHRcdFx0Y29udGV4dC5fd3JwID0gdGFnQ3R4LmNvbnRlbnQ7IC8vIFBhc3Mgd3JhcHBlZCBibG9jayBjb250ZW50IHRvIG5lc3RlZCB2aWV3c1xuXHRcdFx0fSBlbHNlIHsgLy8gUmVuZGVyaW5nIHRhZ0N0eC5wcm9wcy50bXBsIHdyYXBwZXJcblx0XHRcdFx0Y29udGVudFRtcGwgPSB0YWdDdHguY29udGVudCB8fCB2aWV3LmNvbnRlbnQ7IC8vIFNldCAjY29udGVudCB0byB3cmFwcGVkIGJsb2NrIGNvbnRlbnRcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGVudFRtcGwgPSB2aWV3LmNvbnRlbnQ7IC8vIE5lc3RlZCB2aWV3cyBpbmhlcml0IHNhbWUgd3JhcHBlZCAjY29udGVudCBwcm9wZXJ0eVxuXHRcdH1cblxuXHRcdGlmICh0YWdDdHgucHJvcHMubGluayA9PT0gZmFsc2UpIHtcblx0XHRcdC8vIGxpbms9ZmFsc2Ugc2V0dGluZyBvbiBibG9jayB0YWdcblx0XHRcdC8vIFdlIHdpbGwgb3ZlcnJpZGUgaW5oZXJpdGVkIHZhbHVlIG9mIGxpbmsgYnkgdGhlIGV4cGxpY2l0IHNldHRpbmcgbGluaz1mYWxzZSB0YWtlbiBmcm9tIHByb3BzXG5cdFx0XHQvLyBUaGUgY2hpbGQgdmlld3Mgb2YgYW4gdW5saW5rZWQgdmlldyBhcmUgYWxzbyB1bmxpbmtlZC4gU28gc2V0dGluZyBjaGlsZCBiYWNrIHRvIHRydWUgd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0LlxuXHRcdFx0Y29udGV4dCA9IGNvbnRleHQgfHwge307XG5cdFx0XHRjb250ZXh0LmxpbmsgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbVZhciA9IHRhZ0N0eC5wcm9wcy5pdGVtVmFyKSB7XG5cdFx0XHRpZiAoaXRlbVZhci5jaGFyQXQoMCkgIT09IFwiflwiKSB7XG5cdFx0XHRcdHN5bnRheEVycm9yKFwiVXNlIGl0ZW1WYXI9J35teUl0ZW0nXCIpO1xuXHRcdFx0fVxuXHRcdFx0aXRlbVZhciA9IGl0ZW1WYXIuc2xpY2UoMSk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHZpZXcpIHtcblx0XHRvblJlbmRlciA9IG9uUmVuZGVyIHx8IHZpZXcuXy5vblJlbmRlcjtcblx0XHRjb250ZXh0ID0gZXh0ZW5kQ3R4KGNvbnRleHQsIHZpZXcuY3R4KTtcblx0fVxuXG5cdGlmIChrZXkgPT09IHRydWUpIHtcblx0XHRzd2FwQ29udGVudCA9IHRydWU7XG5cdFx0a2V5ID0gMDtcblx0fVxuXG5cdC8vIElmIGxpbms9PT1mYWxzZSwgZG8gbm90IGNhbGwgb25SZW5kZXIsIHNvIG5vIGRhdGEtbGlua2luZyBtYXJrZXIgbm9kZXNcblx0aWYgKG9uUmVuZGVyICYmIChjb250ZXh0ICYmIGNvbnRleHQubGluayA9PT0gZmFsc2UgfHwgdGFnICYmIHRhZy5fLm5vVndzKSkge1xuXHRcdG9uUmVuZGVyID0gdW5kZWZpbmVkO1xuXHR9XG5cdG91dGVyT25SZW5kZXIgPSBvblJlbmRlcjtcblx0aWYgKG9uUmVuZGVyID09PSB0cnVlKSB7XG5cdFx0Ly8gVXNlZCBieSB2aWV3LnJlZnJlc2goKS4gRG9uJ3QgY3JlYXRlIGEgbmV3IHdyYXBwZXIgdmlldy5cblx0XHRvdXRlck9uUmVuZGVyID0gdW5kZWZpbmVkO1xuXHRcdG9uUmVuZGVyID0gdmlldy5fLm9uUmVuZGVyO1xuXHR9XG5cdC8vIFNldCBhZGRpdGlvbmFsIGNvbnRleHQgb24gdmlld3MgY3JlYXRlZCBoZXJlLCAoYXMgbW9kaWZpZWQgY29udGV4dCBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50LCBhbmQgdG8gYmUgaW5oZXJpdGVkIGJ5IGNoaWxkIHZpZXdzKVxuXHRjb250ZXh0ID0gdG1wbC5oZWxwZXJzXG5cdFx0PyBleHRlbmRDdHgodG1wbC5oZWxwZXJzLCBjb250ZXh0KVxuXHRcdDogY29udGV4dDtcblxuXHRuZXdDdHggPSBjb250ZXh0O1xuXHRpZiAoJGlzQXJyYXkoZGF0YSkgJiYgIW5vSXRlcmF0aW9uKSB7XG5cdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgdGhlIGFycmF5LCB3aG9zZSBjaGlsZCB2aWV3cyBjb3JyZXNwb25kIHRvIGVhY2ggZGF0YSBpdGVtLiAoTm90ZTogaWYga2V5IGFuZCB2aWV3IGFyZSBwYXNzZWQgaW5cblx0XHQvLyBhbG9uZyB3aXRoIHBhcmVudCB2aWV3LCB0cmVhdCBhcyBpbnNlcnQgLWUuZy4gZnJvbSB2aWV3LmFkZFZpZXdzIC0gc28gdmlldyBpcyBhbHJlYWR5IHRoZSB2aWV3IGl0ZW0gZm9yIGFycmF5KVxuXHRcdG5ld1ZpZXcgPSBzd2FwQ29udGVudFxuXHRcdFx0PyB2aWV3XG5cdFx0XHQ6IChrZXkgIT09IHVuZGVmaW5lZCAmJiB2aWV3KVxuXHRcdFx0XHR8fCBuZXcgVmlldyhjb250ZXh0LCBcImFycmF5XCIsIHZpZXcsIGRhdGEsIHRtcGwsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKTtcblx0XHRpZiAodmlldyAmJiB2aWV3Ll8udXNlS2V5KSB7XG5cdFx0XHQvLyBQYXJlbnQgaXMgbm90IGFuICdhcnJheSB2aWV3J1xuXHRcdFx0bmV3Vmlldy5fLmJuZCA9ICF0YWcgfHwgdGFnLl8uYm5kICYmIHRhZzsgLy8gRm9yIGFycmF5IHZpZXdzIHRoYXQgYXJlIGRhdGEgYm91bmQgZm9yIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cywgc2V0IHRoZVxuXHRcdFx0Ly8gdmlldy5fLmJuZCBwcm9wZXJ0eSB0byB0cnVlIGZvciB0b3AtbGV2ZWwgbGluaygpIG9yIGRhdGEtbGluaz1cIntmb3J9XCIsIG9yIHRvIHRoZSB0YWcgaW5zdGFuY2UgZm9yIGEgZGF0YS1ib3VuZCB0YWcsIGUuZy4ge157Zm9yIC4uLn19XG5cdFx0fVxuXHRcdGlmIChpdGVtVmFyKSB7XG5cdFx0XHRuZXdWaWV3Lml0ID0gaXRlbVZhcjtcblx0XHR9XG5cdFx0aXRlbVZhciA9IG5ld1ZpZXcuaXQ7XG5cdFx0Zm9yIChpID0gMCwgbCA9IGRhdGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciBlYWNoIGRhdGEgaXRlbS5cblx0XHRcdGlmIChpdGVtVmFyKSB7XG5cdFx0XHRcdHNldEl0ZW1WYXIoZGF0YVtpXSk7IC8vIHVzZSBtb2RpZmllZCBjdHggd2l0aCB1c2VyLW5hbWVkIH5pdGVtXG5cdFx0XHR9XG5cdFx0XHRjaGlsZFZpZXcgPSBuZXcgVmlldyhuZXdDdHgsIFwiaXRlbVwiLCBuZXdWaWV3LCBkYXRhW2ldLCB0bXBsLCAoa2V5IHx8IDApICsgaSwgb25SZW5kZXIsIG5ld1ZpZXcuY29udGVudCk7XG5cblx0XHRcdGl0ZW1SZXN1bHQgPSB0bXBsLmZuKGRhdGFbaV0sIGNoaWxkVmlldywgJHN1Yik7XG5cdFx0XHRyZXN1bHQgKz0gbmV3Vmlldy5fLm9uUmVuZGVyID8gbmV3Vmlldy5fLm9uUmVuZGVyKGl0ZW1SZXN1bHQsIGNoaWxkVmlldykgOiBpdGVtUmVzdWx0O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBDcmVhdGUgYSB2aWV3IGZvciBzaW5nbGV0b24gZGF0YSBvYmplY3QuIFRoZSB0eXBlIG9mIHRoZSB2aWV3IHdpbGwgYmUgdGhlIHRhZyBuYW1lLCBlLmcuIFwiaWZcIiBvciBcIm15VGFnXCIgZXhjZXB0IGZvclxuXHRcdC8vIFwiaXRlbVwiLCBcImFycmF5XCIgYW5kIFwiZGF0YVwiIHZpZXdzLiBBIFwiZGF0YVwiIHZpZXcgaXMgZnJvbSBwcm9ncmFtbWF0aWMgcmVuZGVyKG9iamVjdCkgYWdhaW5zdCBhICdzaW5nbGV0b24nLlxuXHRcdGlmIChpdGVtVmFyKSB7XG5cdFx0XHRzZXRJdGVtVmFyKGRhdGEpO1xuXHRcdH1cblx0XHRuZXdWaWV3ID0gc3dhcENvbnRlbnQgPyB2aWV3IDogbmV3IFZpZXcobmV3Q3R4LCB0bXBsTmFtZSB8fCBcImRhdGFcIiwgdmlldywgZGF0YSwgdG1wbCwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpO1xuXHRcdGlmICh0YWcgJiYgIXRhZy5mbG93KSB7XG5cdFx0XHRuZXdWaWV3LnRhZyA9IHRhZztcblx0XHRcdHRhZy52aWV3ID0gbmV3Vmlldztcblx0XHR9XG5cdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YSwgbmV3VmlldywgJHN1Yik7XG5cdH1cblx0cmV0dXJuIG91dGVyT25SZW5kZXIgPyBvdXRlck9uUmVuZGVyKHJlc3VsdCwgbmV3VmlldykgOiByZXN1bHQ7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCdWlsZCBhbmQgY29tcGlsZSB0ZW1wbGF0ZVxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gR2VuZXJhdGUgYSByZXVzYWJsZSBmdW5jdGlvbiB0aGF0IHdpbGwgc2VydmUgdG8gcmVuZGVyIGEgdGVtcGxhdGUgYWdhaW5zdCBkYXRhXG4vLyAoQ29tcGlsZSBBU1QgdGhlbiBidWlsZCB0ZW1wbGF0ZSBmdW5jdGlvbilcblxuZnVuY3Rpb24gb25SZW5kZXJFcnJvcihlLCB2aWV3LCBmYWxsYmFjaykge1xuXHR2YXIgbWVzc2FnZSA9IGZhbGxiYWNrICE9PSB1bmRlZmluZWRcblx0XHQ/ICRpc0Z1bmN0aW9uKGZhbGxiYWNrKVxuXHRcdFx0PyBmYWxsYmFjay5jYWxsKHZpZXcuZGF0YSwgZSwgdmlldylcblx0XHRcdDogZmFsbGJhY2sgfHwgXCJcIlxuXHRcdDogXCJ7RXJyb3I6IFwiICsgZS5tZXNzYWdlICsgXCJ9XCI7XG5cblx0aWYgKCRzdWJTZXR0aW5ncy5vbkVycm9yICYmIChmYWxsYmFjayA9ICRzdWJTZXR0aW5ncy5vbkVycm9yLmNhbGwodmlldy5kYXRhLCBlLCBmYWxsYmFjayAmJiBtZXNzYWdlLCB2aWV3KSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdG1lc3NhZ2UgPSBmYWxsYmFjazsgLy8gVGhlcmUgaXMgYSBzZXR0aW5ncy5kZWJ1Z01vZGUoaGFuZGxlcikgb25FcnJvciBvdmVycmlkZS4gQ2FsbCBpdCwgYW5kIHVzZSByZXR1cm4gdmFsdWUgKGlmIGFueSkgdG8gcmVwbGFjZSBtZXNzYWdlXG5cdH1cblxuXHRyZXR1cm4gdmlldyAmJiAhdmlldy5saW5rQ3R4ID8gJGNvbnZlcnRlcnMuaHRtbChtZXNzYWdlKSA6IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGVycm9yKG1lc3NhZ2UpIHtcblx0dGhyb3cgbmV3ICRzdWIuRXJyKG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBzeW50YXhFcnJvcihtZXNzYWdlKSB7XG5cdGVycm9yKFwiU3ludGF4IGVycm9yXFxuXCIgKyBtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gdG1wbEZuKG1hcmt1cCwgdG1wbCwgaXNMaW5rRXhwciwgY29udmVydEJhY2ssIGhhc0Vsc2UpIHtcblx0Ly8gQ29tcGlsZSBtYXJrdXAgdG8gQVNUIChhYnRyYWN0IHN5bnRheCB0cmVlKSB0aGVuIGJ1aWxkIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBjb2RlIGZyb20gdGhlIEFTVCBub2Rlc1xuXHQvLyBVc2VkIGZvciBjb21waWxpbmcgdGVtcGxhdGVzLCBhbmQgYWxzbyBieSBKc1ZpZXdzIHRvIGJ1aWxkIGZ1bmN0aW9ucyBmb3IgZGF0YSBsaW5rIGV4cHJlc3Npb25zXG5cblx0Ly89PT09IG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXHRmdW5jdGlvbiBwdXNocHJlY2VkaW5nQ29udGVudChzaGlmdCkge1xuXHRcdHNoaWZ0IC09IGxvYztcblx0XHRpZiAoc2hpZnQpIHtcblx0XHRcdGNvbnRlbnQucHVzaChtYXJrdXAuc3Vic3RyKGxvYywgc2hpZnQpLnJlcGxhY2Uock5ld0xpbmUsIFwiXFxcXG5cIikpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGJsb2NrVGFnQ2hlY2sodGFnTmFtZSwgYmxvY2spIHtcblx0XHRpZiAodGFnTmFtZSkge1xuXHRcdFx0dGFnTmFtZSArPSAnfX0nO1xuXHRcdFx0Ly9cdFx0XHQne3tpbmNsdWRlfX0gYmxvY2sgaGFzIHt7L2Zvcn19IHdpdGggbm8gb3BlbiB7e2Zvcn19J1xuXHRcdFx0c3ludGF4RXJyb3IoKFxuXHRcdFx0XHRibG9ja1xuXHRcdFx0XHRcdD8gJ3t7JyArIGJsb2NrICsgJ319IGJsb2NrIGhhcyB7ey8nICsgdGFnTmFtZSArICcgd2l0aG91dCB7eycgKyB0YWdOYW1lXG5cdFx0XHRcdFx0OiAnVW5tYXRjaGVkIG9yIG1pc3Npbmcge3svJyArIHRhZ05hbWUpICsgJywgaW4gdGVtcGxhdGU6XFxuJyArIG1hcmt1cCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VUYWcoYWxsLCBiaW5kLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIGNvbG9uLCBodG1sLCBjb2RlVGFnLCBwYXJhbXMsIHNsYXNoLCBiaW5kMiwgY2xvc2VCbG9jaywgaW5kZXgpIHtcbi8qXG5cbiAgICAgYmluZCAgICAgdGFnTmFtZSAgICAgICAgIGN2dCAgIGNsbiBodG1sIGNvZGUgICAgcGFyYW1zICAgICAgICAgICAgc2xhc2ggICBiaW5kMiAgICAgICAgIGNsb3NlQmxrICBjb21tZW50XG4vKD86eyhcXF4pP3soPzooXFx3Kyg/PVtcXC9cXHN9XSkpfChcXHcrKT8oOil8KD4pfChcXCopKVxccyooKD86W159XXx9KD8hfSkpKj8pKFxcLyk/fHsoXFxeKT97KD86KD86XFwvKFxcdyspKVxccyp8IS0tW1xcc1xcU10qPy0tKSl9fS9nXG5cbig/OlxuICB7KFxcXik/eyAgICAgICAgICAgIGJpbmRcbiAgKD86XG4gICAgKFxcdysgICAgICAgICAgICAgdGFnTmFtZVxuICAgICAgKD89W1xcL1xcc31dKVxuICAgIClcbiAgICB8XG4gICAgKFxcdyspPyg6KSAgICAgICAgY29udmVydGVyIGNvbG9uXG4gICAgfFxuICAgICg+KSAgICAgICAgICAgICAgaHRtbFxuICAgIHxcbiAgICAoXFwqKSAgICAgICAgICAgICBjb2RlVGFnXG4gIClcbiAgXFxzKlxuICAoICAgICAgICAgICAgICAgICAgcGFyYW1zXG4gICAgKD86W159XXx9KD8hfSkpKj9cbiAgKVxuICAoXFwvKT8gICAgICAgICAgICAgIHNsYXNoXG4gIHxcbiAgeyhcXF4pP3sgICAgICAgICAgICBiaW5kMlxuICAoPzpcbiAgICAoPzpcXC8oXFx3KykpXFxzKiAgIGNsb3NlQmxvY2tcbiAgICB8XG4gICAgIS0tW1xcc1xcU10qPy0tICAgIGNvbW1lbnRcbiAgKVxuKVxufX0vZ1xuXG4qL1xuXHRcdGlmIChjb2RlVGFnICYmIGJpbmQgfHwgc2xhc2ggJiYgIXRhZ05hbWUgfHwgcGFyYW1zICYmIHBhcmFtcy5zbGljZSgtMSkgPT09IFwiOlwiIHx8IGJpbmQyKSB7XG5cdFx0XHRzeW50YXhFcnJvcihhbGwpO1xuXHRcdH1cblxuXHRcdC8vIEJ1aWxkIGFic3RyYWN0IHN5bnRheCB0cmVlIChBU1QpOiBbdGFnTmFtZSwgY29udmVydGVyLCBwYXJhbXMsIGNvbnRlbnQsIGhhc2gsIGJpbmRpbmdzLCBjb250ZW50TWFya3VwXVxuXHRcdGlmIChodG1sKSB7XG5cdFx0XHRjb2xvbiA9IFwiOlwiO1xuXHRcdFx0Y29udmVydGVyID0gSFRNTDtcblx0XHR9XG5cdFx0c2xhc2ggPSBzbGFzaCB8fCBpc0xpbmtFeHByICYmICFoYXNFbHNlO1xuXG5cdFx0dmFyIHBhdGhCaW5kaW5ncyA9IChiaW5kIHx8IGlzTGlua0V4cHIpICYmIFtbXV0sXG5cdFx0XHRwcm9wcyA9IFwiXCIsXG5cdFx0XHRhcmdzID0gXCJcIixcblx0XHRcdGN0eFByb3BzID0gXCJcIixcblx0XHRcdHBhcmFtc0FyZ3MgPSBcIlwiLFxuXHRcdFx0cGFyYW1zUHJvcHMgPSBcIlwiLFxuXHRcdFx0cGFyYW1zQ3R4UHJvcHMgPSBcIlwiLFxuXHRcdFx0b25FcnJvciA9IFwiXCIsXG5cdFx0XHR1c2VUcmlnZ2VyID0gXCJcIixcblx0XHRcdC8vIEJsb2NrIHRhZyBpZiBub3Qgc2VsZi1jbG9zaW5nIGFuZCBub3Qge3s6fX0gb3Ige3s+fX0gKHNwZWNpYWwgY2FzZSkgYW5kIG5vdCBhIGRhdGEtbGluayBleHByZXNzaW9uXG5cdFx0XHRibG9jayA9ICFzbGFzaCAmJiAhY29sb247XG5cblx0XHQvLz09PT0gbmVzdGVkIGhlbHBlciBmdW5jdGlvbiA9PT09XG5cdFx0dGFnTmFtZSA9IHRhZ05hbWUgfHwgKHBhcmFtcyA9IHBhcmFtcyB8fCBcIiNkYXRhXCIsIGNvbG9uKTsgLy8ge3s6fX0gaXMgZXF1aXZhbGVudCB0byB7ezojZGF0YX19XG5cdFx0cHVzaHByZWNlZGluZ0NvbnRlbnQoaW5kZXgpO1xuXHRcdGxvYyA9IGluZGV4ICsgYWxsLmxlbmd0aDsgLy8gbG9jYXRpb24gbWFya2VyIC0gcGFyc2VkIHVwIHRvIGhlcmVcblx0XHRpZiAoY29kZVRhZykge1xuXHRcdFx0aWYgKGFsbG93Q29kZSkge1xuXHRcdFx0XHRjb250ZW50LnB1c2goW1wiKlwiLCBcIlxcblwiICsgcGFyYW1zLnJlcGxhY2UoL146LywgXCJyZXQrPSBcIikucmVwbGFjZShyVW5lc2NhcGVRdW90ZXMsIFwiJDFcIikgKyBcIjtcXG5cIl0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGFnTmFtZSkge1xuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwiZWxzZVwiKSB7XG5cdFx0XHRcdGlmIChyVGVzdEVsc2VJZi50ZXN0KHBhcmFtcykpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcignZm9yIFwie3tlbHNlIGlmIGV4cHJ9fVwiIHVzZSBcInt7ZWxzZSBleHByfX1cIicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGhCaW5kaW5ncyA9IGN1cnJlbnRbN10gJiYgW1tdXTtcblx0XHRcdFx0Y3VycmVudFs4XSA9IG1hcmt1cC5zdWJzdHJpbmcoY3VycmVudFs4XSwgaW5kZXgpOyAvLyBjb250ZW50TWFya3VwIGZvciBibG9jayB0YWdcblx0XHRcdFx0Y3VycmVudCA9IHN0YWNrLnBvcCgpO1xuXHRcdFx0XHRjb250ZW50ID0gY3VycmVudFsyXTtcblx0XHRcdFx0YmxvY2sgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcykge1xuXHRcdFx0XHQvLyByZW1vdmUgbmV3bGluZXMgZnJvbSB0aGUgcGFyYW1zIHN0cmluZywgdG8gYXZvaWQgY29tcGlsZWQgY29kZSBlcnJvcnMgZm9yIHVudGVybWluYXRlZCBzdHJpbmdzXG5cdFx0XHRcdHBhcnNlUGFyYW1zKHBhcmFtcy5yZXBsYWNlKHJOZXdMaW5lLCBcIiBcIiksIHBhdGhCaW5kaW5ncywgdG1wbClcblx0XHRcdFx0XHQucmVwbGFjZShyQnVpbGRIYXNoLCBmdW5jdGlvbihhbGwsIG9uZXJyb3IsIGlzQ3R4LCBrZXksIGtleVRva2VuLCBrZXlWYWx1ZSwgYXJnLCBwYXJhbSkge1xuXHRcdFx0XHRcdFx0a2V5ID0gXCInXCIgKyBrZXlUb2tlbiArIFwiJzpcIjtcblx0XHRcdFx0XHRcdGlmIChhcmcpIHtcblx0XHRcdFx0XHRcdFx0YXJncyArPSBrZXlWYWx1ZSArIFwiLFwiO1xuXHRcdFx0XHRcdFx0XHRwYXJhbXNBcmdzICs9IFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGlzQ3R4KSB7XG5cdFx0XHRcdFx0XHRcdGN0eFByb3BzICs9IGtleSArICdqLl9jcCgnICsga2V5VmFsdWUgKyAnLFwiJyArIHBhcmFtICsgJ1wiLHZpZXcpLCc7XG5cdFx0XHRcdFx0XHRcdC8vIENvbXBpbGVkIGNvZGUgZm9yIGV2YWx1YXRpbmcgdGFnQ3R4IG9uIGEgdGFnIHdpbGwgaGF2ZTogY3R4OnsnZm9vJzpqLl9jcChjb21waWxlZEV4cHIsIFwiZXhwclwiLCB2aWV3KX1cblx0XHRcdFx0XHRcdFx0cGFyYW1zQ3R4UHJvcHMgKz0ga2V5ICsgXCInXCIgKyBwYXJhbSArIFwiJyxcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob25lcnJvcikge1xuXHRcdFx0XHRcdFx0XHRvbkVycm9yICs9IGtleVZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0aWYgKGtleVRva2VuID09PSBcInRyaWdnZXJcIikge1xuXHRcdFx0XHRcdFx0XHRcdHVzZVRyaWdnZXIgKz0ga2V5VmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cHJvcHMgKz0ga2V5ICsga2V5VmFsdWUgKyBcIixcIjtcblx0XHRcdFx0XHRcdFx0cGFyYW1zUHJvcHMgKz0ga2V5ICsgXCInXCIgKyBwYXJhbSArIFwiJyxcIjtcblx0XHRcdFx0XHRcdFx0aGFzSGFuZGxlcnMgPSBoYXNIYW5kbGVycyB8fCBySGFzSGFuZGxlcnMudGVzdChrZXlUb2tlbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRcdFx0XHR9KS5zbGljZSgwLCAtMSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwYXRoQmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzWzBdKSB7XG5cdFx0XHRcdHBhdGhCaW5kaW5ncy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBiaW5kaW5ncyB0aGF0IHdhcyBwcmVwYXJlZCBmb3IgbmV4dCBhcmcuIChUaGVyZSBpcyBhbHdheXMgYW4gZXh0cmEgb25lIHJlYWR5KS5cblx0XHRcdH1cblxuXHRcdFx0bmV3Tm9kZSA9IFtcblx0XHRcdFx0XHR0YWdOYW1lLFxuXHRcdFx0XHRcdGNvbnZlcnRlciB8fCAhIWNvbnZlcnRCYWNrIHx8IGhhc0hhbmRsZXJzIHx8IFwiXCIsXG5cdFx0XHRcdFx0YmxvY2sgJiYgW10sXG5cdFx0XHRcdFx0cGFyc2VkUGFyYW0ocGFyYW1zQXJncyB8fCAodGFnTmFtZSA9PT0gXCI6XCIgPyBcIicjZGF0YScsXCIgOiBcIlwiKSwgcGFyYW1zUHJvcHMsIHBhcmFtc0N0eFByb3BzKSwgLy8ge3s6fX0gZXF1aXZhbGVudCB0byB7ezojZGF0YX19XG5cdFx0XHRcdFx0cGFyc2VkUGFyYW0oYXJncyB8fCAodGFnTmFtZSA9PT0gXCI6XCIgPyBcImRhdGEsXCIgOiBcIlwiKSwgcHJvcHMsIGN0eFByb3BzKSxcblx0XHRcdFx0XHRvbkVycm9yLFxuXHRcdFx0XHRcdHVzZVRyaWdnZXIsXG5cdFx0XHRcdFx0cGF0aEJpbmRpbmdzIHx8IDBcblx0XHRcdFx0XTtcblx0XHRcdGNvbnRlbnQucHVzaChuZXdOb2RlKTtcblx0XHRcdGlmIChibG9jaykge1xuXHRcdFx0XHRzdGFjay5wdXNoKGN1cnJlbnQpO1xuXHRcdFx0XHRjdXJyZW50ID0gbmV3Tm9kZTtcblx0XHRcdFx0Y3VycmVudFs4XSA9IGxvYzsgLy8gU3RvcmUgY3VycmVudCBsb2NhdGlvbiBvZiBvcGVuIHRhZywgdG8gYmUgYWJsZSB0byBhZGQgY29udGVudE1hcmt1cCB3aGVuIHdlIHJlYWNoIGNsb3NpbmcgdGFnXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjbG9zZUJsb2NrKSB7XG5cdFx0XHRibG9ja1RhZ0NoZWNrKGNsb3NlQmxvY2sgIT09IGN1cnJlbnRbMF0gJiYgY3VycmVudFswXSAhPT0gXCJlbHNlXCIgJiYgY2xvc2VCbG9jaywgY3VycmVudFswXSk7XG5cdFx0XHRjdXJyZW50WzhdID0gbWFya3VwLnN1YnN0cmluZyhjdXJyZW50WzhdLCBpbmRleCk7IC8vIGNvbnRlbnRNYXJrdXAgZm9yIGJsb2NrIHRhZ1xuXHRcdFx0Y3VycmVudCA9IHN0YWNrLnBvcCgpO1xuXHRcdH1cblx0XHRibG9ja1RhZ0NoZWNrKCFjdXJyZW50ICYmIGNsb3NlQmxvY2spO1xuXHRcdGNvbnRlbnQgPSBjdXJyZW50WzJdO1xuXHR9XG5cdC8vPT09PSAvZW5kIG9mIG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXG5cdHZhciBpLCByZXN1bHQsIG5ld05vZGUsIGhhc0hhbmRsZXJzLCBiaW5kaW5ncyxcblx0XHRhbGxvd0NvZGUgPSAkc3ViU2V0dGluZ3MuYWxsb3dDb2RlIHx8IHRtcGwgJiYgdG1wbC5hbGxvd0NvZGVcblx0XHRcdHx8ICR2aWV3c1NldHRpbmdzLmFsbG93Q29kZSA9PT0gdHJ1ZSwgLy8gaW5jbHVkZSBkaXJlY3Qgc2V0dGluZyBvZiBzZXR0aW5ncy5hbGxvd0NvZGUgdHJ1ZSBmb3IgYmFja3dhcmQgY29tcGF0IG9ubHlcblx0XHRhc3RUb3AgPSBbXSxcblx0XHRsb2MgPSAwLFxuXHRcdHN0YWNrID0gW10sXG5cdFx0Y29udGVudCA9IGFzdFRvcCxcblx0XHRjdXJyZW50ID0gWywsYXN0VG9wXTtcblxuXHRpZiAoYWxsb3dDb2RlICYmIHRtcGwuX2lzKSB7XG5cdFx0dG1wbC5hbGxvd0NvZGUgPSBhbGxvd0NvZGU7XG5cdH1cblxuLy9UT0RPXHRyZXN1bHQgPSB0bXBsRm5zQ2FjaGVbbWFya3VwXTsgLy8gT25seSBjYWNoZSBpZiB0ZW1wbGF0ZSBpcyBub3QgbmFtZWQgYW5kIG1hcmt1cCBsZW5ndGggPCAuLi4sXG4vL2FuZCB0aGVyZSBhcmUgbm8gYmluZGluZ3Mgb3Igc3VidGVtcGxhdGVzPz8gQ29uc2lkZXIgc3RhbmRhcmQgb3B0aW1pemF0aW9uIGZvciBkYXRhLWxpbms9XCJhLmIuY1wiXG4vL1x0XHRpZiAocmVzdWx0KSB7XG4vL1x0XHRcdHRtcGwuZm4gPSByZXN1bHQ7XG4vL1x0XHR9IGVsc2Uge1xuXG4vL1x0XHRyZXN1bHQgPSBtYXJrdXA7XG5cdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0aWYgKGNvbnZlcnRCYWNrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG1hcmt1cCA9IG1hcmt1cC5zbGljZSgwLCAtY29udmVydEJhY2subGVuZ3RoIC0gMikgKyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0fVxuXHRcdG1hcmt1cCA9IGRlbGltT3BlbkNoYXIwICsgbWFya3VwICsgZGVsaW1DbG9zZUNoYXIxO1xuXHR9XG5cblx0YmxvY2tUYWdDaGVjayhzdGFja1swXSAmJiBzdGFja1swXVsyXS5wb3AoKVswXSk7XG5cdC8vIEJ1aWxkIHRoZSBBU1QgKGFic3RyYWN0IHN5bnRheCB0cmVlKSB1bmRlciBhc3RUb3Bcblx0bWFya3VwLnJlcGxhY2UoclRhZywgcGFyc2VUYWcpO1xuXG5cdHB1c2hwcmVjZWRpbmdDb250ZW50KG1hcmt1cC5sZW5ndGgpO1xuXG5cdGlmIChsb2MgPSBhc3RUb3BbYXN0VG9wLmxlbmd0aCAtIDFdKSB7XG5cdFx0YmxvY2tUYWdDaGVjayhcIlwiICsgbG9jICE9PSBsb2MgJiYgKCtsb2NbOF0gPT09IGxvY1s4XSkgJiYgbG9jWzBdKTtcblx0fVxuLy9cdFx0XHRyZXN1bHQgPSB0bXBsRm5zQ2FjaGVbbWFya3VwXSA9IGJ1aWxkQ29kZShhc3RUb3AsIHRtcGwpO1xuLy9cdFx0fVxuXG5cdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0cmVzdWx0ID0gYnVpbGRDb2RlKGFzdFRvcCwgbWFya3VwLCBpc0xpbmtFeHByKTtcblx0XHRiaW5kaW5ncyA9IFtdO1xuXHRcdGkgPSBhc3RUb3AubGVuZ3RoO1xuXHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdGJpbmRpbmdzLnVuc2hpZnQoYXN0VG9wW2ldWzddKTsgIC8vIFdpdGggZGF0YS1saW5rIGV4cHJlc3Npb25zLCBwYXRoQmluZGluZ3MgYXJyYXkgZm9yIHRhZ0N0eFtpXSBpcyBhc3RUb3BbaV1bN11cblx0XHR9XG5cdFx0c2V0UGF0aHMocmVzdWx0LCBiaW5kaW5ncyk7XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gYnVpbGRDb2RlKGFzdFRvcCwgdG1wbCk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2V0UGF0aHMoZm4sIHBhdGhzQXJyKSB7XG5cdHZhciBrZXksIHBhdGhzLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBwYXRoc0Fyci5sZW5ndGg7XG5cdGZuLmRlcHMgPSBbXTtcblx0Zm4ucGF0aHMgPSBbXTsgLy8gVGhlIGFycmF5IG9mIHBhdGggYmluZGluZyAoYXJyYXkvZGljdGlvbmFyeSlzIGZvciBlYWNoIHRhZy9lbHNlIGJsb2NrJ3MgYXJncyBhbmQgcHJvcHNcblx0Zm9yICg7IGkgPCBsOyBpKyspIHtcblx0XHRmbi5wYXRocy5wdXNoKHBhdGhzID0gcGF0aHNBcnJbaV0pO1xuXHRcdGZvciAoa2V5IGluIHBhdGhzKSB7XG5cdFx0XHRpZiAoa2V5ICE9PSBcIl9qc3Z0b1wiICYmIHBhdGhzLmhhc093blByb3BlcnR5KGtleSkgJiYgcGF0aHNba2V5XS5sZW5ndGggJiYgIXBhdGhzW2tleV0uc2twKSB7XG5cdFx0XHRcdGZuLmRlcHMgPSBmbi5kZXBzLmNvbmNhdChwYXRoc1trZXldKTsgLy8gZGVwcyBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgcGF0aHMgYXJyYXlzIGZvciB0aGUgZGlmZmVyZW50IGJpbmRpbmdzXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHBhcnNlZFBhcmFtKGFyZ3MsIHByb3BzLCBjdHgpIHtcblx0cmV0dXJuIFthcmdzLnNsaWNlKDAsIC0xKSwgcHJvcHMuc2xpY2UoMCwgLTEpLCBjdHguc2xpY2UoMCwgLTEpXTtcbn1cblxuZnVuY3Rpb24gcGFyYW1TdHJ1Y3R1cmUocGFydHMsIHR5cGUpIHtcblx0cmV0dXJuICdcXG5cXHQnXG5cdFx0KyAodHlwZVxuXHRcdFx0PyB0eXBlICsgJzp7J1xuXHRcdFx0OiAnJylcblx0XHQrICdhcmdzOlsnICsgcGFydHNbMF0gKyAnXSdcblx0XHQrIChwYXJ0c1sxXSB8fCAhdHlwZVxuXHRcdFx0PyAnLFxcblxcdHByb3BzOnsnICsgcGFydHNbMV0gKyAnfSdcblx0XHRcdDogXCJcIilcblx0XHQrIChwYXJ0c1syXSA/ICcsXFxuXFx0Y3R4OnsnICsgcGFydHNbMl0gKyAnfScgOiBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJhbXMocGFyYW1zLCBwYXRoQmluZGluZ3MsIHRtcGwpIHtcblxuXHRmdW5jdGlvbiBwYXJzZVRva2VucyhhbGwsIGxmdFBybjAsIGxmdFBybiwgYm91bmQsIHBhdGgsIG9wZXJhdG9yLCBlcnIsIGVxLCBwYXRoMiwgcHJuLCBjb21tYSwgbGZ0UHJuMiwgYXBvcywgcXVvdCwgcnRQcm4sIHJ0UHJuRG90LCBwcm4yLCBzcGFjZSwgaW5kZXgsIGZ1bGwpIHtcblx0Ly8gLyhcXCgpKD89XFxzKlxcKCl8KD86KFsoW10pXFxzKik/KD86KFxcXj8pKCEqP1sjfl0/W1xcdyQuXl0rKT9cXHMqKChcXCtcXCt8LS0pfFxcK3wtfCYmfFxcfFxcfHw9PT18IT09fD09fCE9fDw9fD49fFs8PiUqOj9cXC9dfCg9KSlcXHMqfCghKj9bI35dP1tcXHckLl5dKykoWyhbXSk/KXwoLFxccyopfChcXCg/KVxcXFw/KD86KCcpfChcIikpfCg/OlxccyooKFspXFxdXSkoPz1cXHMqWy5eXXxcXHMqJHxbXihbXSl8WylcXF1dKShbKFtdPykpfChcXHMrKS9nLFxuXHQvLyAgIGxmdFBybjAgICAgICAgIGxmdFBybiAgICAgICAgYm91bmQgICAgICAgICAgICBwYXRoICAgIG9wZXJhdG9yIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxICAgICAgICAgICAgIHBhdGgyICAgICAgIHBybiAgICBjb21tYSAgIGxmdFBybjIgICBhcG9zIHF1b3QgICAgICBydFBybiBydFBybkRvdCAgICAgICAgICAgICAgICAgICAgICAgIHBybjIgIHNwYWNlXG5cdFx0Ly8gKGxlZnQgcGFyZW4/IGZvbGxvd2VkIGJ5IChwYXRoPyBmb2xsb3dlZCBieSBvcGVyYXRvcikgb3IgKHBhdGggZm9sbG93ZWQgYnkgcGFyZW4/KSkgb3IgY29tbWEgb3IgYXBvcyBvciBxdW90IG9yIHJpZ2h0IHBhcmVuIG9yIHNwYWNlXG5cdFx0ZnVuY3Rpb24gcGFyc2VQYXRoKGFsbFBhdGgsIG5vdCwgb2JqZWN0LCBoZWxwZXIsIHZpZXcsIHZpZXdQcm9wZXJ0eSwgcGF0aFRva2VucywgbGVhZlRva2VuKSB7XG5cdFx0XHQvL3JQYXRoID0gL14oISo/KSg/Om51bGx8dHJ1ZXxmYWxzZXxcXGRbXFxkLl0qfChbXFx3JF0rfFxcLnx+KFtcXHckXSspfCModmlld3woW1xcdyRdKykpPykoW1xcdyQuXl0qPykoPzpbLlteXShbXFx3JF0rKVxcXT8pPykkL2csXG5cdFx0XHQvLyAgICAgICAgICBub3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ICAgICBoZWxwZXIgICAgdmlldyAgdmlld1Byb3BlcnR5IHBhdGhUb2tlbnMgICAgICBsZWFmVG9rZW5cblx0XHRcdHZhciBzdWJQYXRoID0gb2JqZWN0ID09PSBcIi5cIjtcblx0XHRcdGlmIChvYmplY3QpIHtcblx0XHRcdFx0cGF0aCA9IHBhdGguc2xpY2Uobm90Lmxlbmd0aCk7XG5cdFx0XHRcdGlmICgvXlxcLj9jb25zdHJ1Y3RvciQvLnRlc3QobGVhZlRva2VufHxwYXRoKSkge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKGFsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghc3ViUGF0aCkge1xuXHRcdFx0XHRcdGFsbFBhdGggPSAoaGVscGVyXG5cdFx0XHRcdFx0XHRcdD8gJ3ZpZXcuaGxwKFwiJyArIGhlbHBlciArICdcIiknXG5cdFx0XHRcdFx0XHRcdDogdmlld1xuXHRcdFx0XHRcdFx0XHRcdD8gXCJ2aWV3XCJcblx0XHRcdFx0XHRcdFx0XHQ6IFwiZGF0YVwiKVxuXHRcdFx0XHRcdFx0KyAobGVhZlRva2VuXG5cdFx0XHRcdFx0XHRcdD8gKHZpZXdQcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdD8gXCIuXCIgKyB2aWV3UHJvcGVydHlcblx0XHRcdFx0XHRcdFx0XHQ6IGhlbHBlclxuXHRcdFx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ6ICh2aWV3ID8gXCJcIiA6IFwiLlwiICsgb2JqZWN0KVxuXHRcdFx0XHRcdFx0XHRcdCkgKyAocGF0aFRva2VucyB8fCBcIlwiKVxuXHRcdFx0XHRcdFx0XHQ6IChsZWFmVG9rZW4gPSBoZWxwZXIgPyBcIlwiIDogdmlldyA/IHZpZXdQcm9wZXJ0eSB8fCBcIlwiIDogb2JqZWN0LCBcIlwiKSk7XG5cblx0XHRcdFx0XHRhbGxQYXRoID0gYWxsUGF0aCArIChsZWFmVG9rZW4gPyBcIi5cIiArIGxlYWZUb2tlbiA6IFwiXCIpO1xuXG5cdFx0XHRcdFx0YWxsUGF0aCA9IG5vdCArIChhbGxQYXRoLnNsaWNlKDAsIDkpID09PSBcInZpZXcuZGF0YVwiXG5cdFx0XHRcdFx0XHQ/IGFsbFBhdGguc2xpY2UoNSkgLy8gY29udmVydCAjdmlldy5kYXRhLi4uIHRvIGRhdGEuLi5cblx0XHRcdFx0XHRcdDogYWxsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0YmluZHMgPSBuYW1lZCA9PT0gXCJsaW5rVG9cIiA/IChiaW5kdG8gPSBwYXRoQmluZGluZ3MuX2pzdnRvID0gcGF0aEJpbmRpbmdzLl9qc3Z0byB8fCBbXSkgOiBibmRDdHguYmQ7XG5cdFx0XHRcdFx0aWYgKHRoZU9iID0gc3ViUGF0aCAmJiBiaW5kc1tiaW5kcy5sZW5ndGgtMV0pIHtcblx0XHRcdFx0XHRcdGlmICh0aGVPYi5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICh0aGVPYi5zYikge1xuXHRcdFx0XHRcdFx0XHRcdHRoZU9iID0gdGhlT2Iuc2I7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHRoZU9iLmJuZCkge1xuXHRcdFx0XHRcdFx0XHRcdHBhdGggPSBcIl5cIiArIHBhdGguc2xpY2UoMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhlT2Iuc2IgPSBwYXRoO1xuXHRcdFx0XHRcdFx0XHR0aGVPYi5ibmQgPSB0aGVPYi5ibmQgfHwgcGF0aC5jaGFyQXQoMCkgPT09IFwiXlwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRiaW5kcy5wdXNoKHBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXRoU3RhcnRbcGFyZW5EZXB0aF0gPSBpbmRleCArIChzdWJQYXRoID8gMSA6IDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYWxsUGF0aDtcblx0XHR9XG5cblx0XHQvL2JvdW5kID0gYmluZGluZ3MgJiYgYm91bmQ7XG5cdFx0aWYgKGJvdW5kICYmICFlcSkge1xuXHRcdFx0cGF0aCA9IGJvdW5kICsgcGF0aDsgLy8gZS5nLiBzb21lLmZuKC4uLilec29tZS5wYXRoIC0gc28gaGVyZSBwYXRoIGlzIFwiXnNvbWUucGF0aFwiXG5cdFx0fVxuXHRcdG9wZXJhdG9yID0gb3BlcmF0b3IgfHwgXCJcIjtcblx0XHRsZnRQcm4gPSBsZnRQcm4gfHwgbGZ0UHJuMCB8fCBsZnRQcm4yO1xuXHRcdHBhdGggPSBwYXRoIHx8IHBhdGgyO1xuXHRcdC8vIENvdWxkIGRvIHRoaXMgLSBidXQgbm90IHdvcnRoIHBlcmYgY29zdD8/IDotXG5cdFx0Ly8gaWYgKCFwYXRoLmxhc3RJbmRleE9mKFwiI2RhdGEuXCIsIDApKSB7IHBhdGggPSBwYXRoLnNsaWNlKDYpOyB9IC8vIElmIHBhdGggc3RhcnRzIHdpdGggXCIjZGF0YS5cIiwgcmVtb3ZlIHRoYXQuXG5cdFx0cHJuID0gcHJuIHx8IHBybjIgfHwgXCJcIjtcblxuXHRcdHZhciBleHByLCBleHByRm4sIGJpbmRzLCB0aGVPYiwgbmV3T2IsXG5cdFx0XHRydFNxID0gXCIpXCI7XG5cblx0XHRpZiAocHJuID09PSBcIltcIikge1xuXHRcdFx0cHJuICA9XCJbai5fc3EoXCI7XG5cdFx0XHRydFNxID0gXCIpXVwiO1xuXHRcdH1cblxuXHRcdGlmIChlcnIgJiYgIWFwb3NlZCAmJiAhcXVvdGVkKSB7XG5cdFx0XHRzeW50YXhFcnJvcihwYXJhbXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYmluZGluZ3MgJiYgcnRQcm5Eb3QgJiYgIWFwb3NlZCAmJiAhcXVvdGVkKSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSBiaW5kaW5nIHRvIGEgcGF0aCBpbiB3aGljaCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgYnkgYSBoZWxwZXIvZGF0YSBmdW5jdGlvbi9leHByZXNzaW9uLCBlLmcuIGZvbygpXngueSBvciAoYT9iOmMpXngueVxuXHRcdFx0XHQvLyBXZSBjcmVhdGUgYSBjb21waWxlZCBmdW5jdGlvbiB0byBnZXQgdGhlIG9iamVjdCBpbnN0YW5jZSAod2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZGVwZW5kZW50IGRhdGEgb2YgdGhlIHN1YmV4cHJlc3Npb24gY2hhbmdlcywgdG8gcmV0dXJuIHRoZSBuZXcgb2JqZWN0LCBhbmQgdHJpZ2dlciByZS1iaW5kaW5nIG9mIHRoZSBzdWJzZXF1ZW50IHBhdGgpXG5cdFx0XHRcdGlmICghbmFtZWQgfHwgYm91bmROYW1lIHx8IGJpbmR0bykge1xuXHRcdFx0XHRcdGV4cHIgPSBwYXRoU3RhcnRbcGFyZW5EZXB0aCAtIDFdO1xuXHRcdFx0XHRcdGlmIChmdWxsLmxlbmd0aCAtIDEgPiBpbmRleCAtIChleHByIHx8IDApKSB7IC8vIFdlIG5lZWQgdG8gY29tcGlsZSBhIHN1YmV4cHJlc3Npb25cblx0XHRcdFx0XHRcdGV4cHIgPSBmdWxsLnNsaWNlKGV4cHIsIGluZGV4ICsgYWxsLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRpZiAoZXhwckZuICE9PSB0cnVlKSB7IC8vIElmIG5vdCByZWVudHJhbnQgY2FsbCBkdXJpbmcgY29tcGlsYXRpb25cblx0XHRcdFx0XHRcdFx0YmluZHMgPSBiaW5kdG8gfHwgYm5kU3RhY2tbcGFyZW5EZXB0aC0xXS5iZDtcblx0XHRcdFx0XHRcdFx0Ly8gSW5zZXJ0IGV4cHJPYiBvYmplY3QsIHRvIGJlIHVzZWQgZHVyaW5nIGJpbmRpbmcgdG8gcmV0dXJuIHRoZSBjb21wdXRlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0dGhlT2IgPSBiaW5kc1tiaW5kcy5sZW5ndGgtMV07XG5cdFx0XHRcdFx0XHRcdGlmICh0aGVPYiAmJiB0aGVPYi5wcm0pIHtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAodGhlT2Iuc2IgJiYgdGhlT2Iuc2IucHJtKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVPYiA9IHRoZU9iLnNiO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRuZXdPYiA9IHRoZU9iLnNiID0ge3BhdGg6IHRoZU9iLnNiLCBibmQ6IHRoZU9iLmJuZH07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0YmluZHMucHVzaChuZXdPYiA9IHtwYXRoOiBiaW5kcy5wb3AoKX0pOyAvLyBJbnNlcnQgZXhwck9iIG9iamVjdCwgdG8gYmUgdXNlZCBkdXJpbmcgYmluZGluZyB0byByZXR1cm4gdGhlIGNvbXB1dGVkIG9iamVjdFxuXHRcdFx0XHRcdFx0XHR9XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAvLyAoZS5nLiBcInNvbWUub2JqZWN0KClcIiBpbiBcInNvbWUub2JqZWN0KCkuYS5iXCIgLSB0byBiZSB1c2VkIGFzIGNvbnRleHQgZm9yIGJpbmRpbmcgdGhlIGZvbGxvd2luZyB0b2tlbnMgXCJhLmJcIilcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJ0UHJuRG90ID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIGV4cHIgLy8gVGhlIHBhcmFtZXRlciBvciBmdW5jdGlvbiBzdWJleHByZXNzaW9uXG5cdFx0XHRcdFx0XHRcdCsgXCIgb25lcnJvcj0nJ1wiIC8vIHNldCBvbmVycm9yPScnIGluIG9yZGVyIHRvIHdyYXAgZ2VuZXJhdGVkIGNvZGUgd2l0aCBhIHRyeSBjYXRjaCAtIHJldHVybmluZyAnJyBhcyBvYmplY3QgaW5zdGFuY2UgaWYgdGhlcmUgaXMgYW4gZXJyb3IvbWlzc2luZyBwYXJlbnRcblx0XHRcdFx0XHRcdFx0KyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0XHRcdFx0XHRleHByRm4gPSB0bXBsTGlua3NbcnRQcm5Eb3RdO1xuXHRcdFx0XHRcdFx0aWYgKCFleHByRm4pIHtcblx0XHRcdFx0XHRcdFx0dG1wbExpbmtzW3J0UHJuRG90XSA9IHRydWU7IC8vIEZsYWcgdGhhdCB0aGlzIGV4cHJGbiAoZm9yIHJ0UHJuRG90KSBpcyBiZWluZyBjb21waWxlZFxuXHRcdFx0XHRcdFx0XHR0bXBsTGlua3NbcnRQcm5Eb3RdID0gZXhwckZuID0gdG1wbEZuKHJ0UHJuRG90LCB0bXBsLCB0cnVlKTsgLy8gQ29tcGlsZSB0aGUgZXhwcmVzc2lvbiAob3IgdXNlIGNhY2hlZCBjb3B5IGFscmVhZHkgaW4gdG1wbC5saW5rcylcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChleHByRm4gIT09IHRydWUgJiYgbmV3T2IpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgbm90IHJlZW50cmFudCBjYWxsIGR1cmluZyBjb21waWxhdGlvblxuXHRcdFx0XHRcdFx0XHRuZXdPYi5fanN2ID0gZXhwckZuO1xuXHRcdFx0XHRcdFx0XHRuZXdPYi5wcm0gPSBibmRDdHguYmQ7XG5cdFx0XHRcdFx0XHRcdG5ld09iLmJuZCA9IG5ld09iLmJuZCB8fCBuZXdPYi5wYXRoICYmIG5ld09iLnBhdGguaW5kZXhPZihcIl5cIikgPj0gMDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiAoYXBvc2VkXG5cdFx0XHRcdC8vIHdpdGhpbiBzaW5nbGUtcXVvdGVkIHN0cmluZ1xuXHRcdFx0XHQ/IChhcG9zZWQgPSAhYXBvcywgKGFwb3NlZCA/IGFsbCA6IGxmdFBybjIgKyAnXCInKSlcblx0XHRcdFx0OiBxdW90ZWRcblx0XHRcdFx0Ly8gd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5nXG5cdFx0XHRcdFx0PyAocXVvdGVkID0gIXF1b3QsIChxdW90ZWQgPyBhbGwgOiBsZnRQcm4yICsgJ1wiJykpXG5cdFx0XHRcdFx0OlxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0KGxmdFByblxuXHRcdFx0XHRcdFx0PyAocGF0aFN0YXJ0W3BhcmVuRGVwdGhdID0gaW5kZXgrKywgYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSA9IHtiZDogW119LCBsZnRQcm4pXG5cdFx0XHRcdFx0XHQ6IFwiXCIpXG5cdFx0XHRcdFx0KyAoc3BhY2Vcblx0XHRcdFx0XHRcdD8gKHBhcmVuRGVwdGhcblx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdC8vIE5ldyBhcmcgb3IgcHJvcCAtIHNvIGluc2VydCBiYWNrc3BhY2UgXFxiIChcXHgwOCkgYXMgc2VwYXJhdG9yIGZvciBuYW1lZCBwYXJhbXMsIHVzZWQgc3Vic2VxdWVudGx5IGJ5IHJCdWlsZEhhc2gsIGFuZCBwcmVwYXJlIG5ldyBiaW5kaW5ncyBhcnJheVxuXHRcdFx0XHRcdFx0XHQ6IChwYXJhbUluZGV4ID0gZnVsbC5zbGljZShwYXJhbUluZGV4LCBpbmRleCksIG5hbWVkXG5cdFx0XHRcdFx0XHRcdFx0PyAobmFtZWQgPSBib3VuZE5hbWUgPSBiaW5kdG8gPSBmYWxzZSwgXCJcXGJcIilcblx0XHRcdFx0XHRcdFx0XHQ6IFwiXFxiLFwiKSArIHBhcmFtSW5kZXggKyAocGFyYW1JbmRleCA9IGluZGV4ICsgYWxsLmxlbmd0aCwgYmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzLnB1c2goYm5kQ3R4LmJkID0gW10pLCBcIlxcYlwiKVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0OiBlcVxuXHRcdFx0XHQvLyBuYW1lZCBwYXJhbS4gUmVtb3ZlIGJpbmRpbmdzIGZvciBhcmcgYW5kIGNyZWF0ZSBpbnN0ZWFkIGJpbmRpbmdzIGFycmF5IGZvciBwcm9wXG5cdFx0XHRcdFx0XHRcdD8gKHBhcmVuRGVwdGggJiYgc3ludGF4RXJyb3IocGFyYW1zKSwgYmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzLnBvcCgpLCBuYW1lZCA9IHBhdGgsIGJvdW5kTmFtZSA9IGJvdW5kLCBwYXJhbUluZGV4ID0gaW5kZXggKyBhbGwubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0YmluZGluZ3MgJiYgKChiaW5kaW5ncyA9IGJuZEN0eC5iZCA9IHBhdGhCaW5kaW5nc1tuYW1lZF0gPSBbXSksIGJpbmRpbmdzLnNrcCA9ICFib3VuZCksIHBhdGggKyAnOicpXG5cdFx0XHRcdFx0XHRcdDogcGF0aFxuXHRcdFx0XHQvLyBwYXRoXG5cdFx0XHRcdFx0XHRcdFx0PyAocGF0aC5zcGxpdChcIl5cIikuam9pbihcIi5cIikucmVwbGFjZShyUGF0aCwgcGFyc2VQYXRoKVxuXHRcdFx0XHRcdFx0XHRcdFx0KyAocHJuXG5cdFx0XHRcdC8vIHNvbWUuZm5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChibmRDdHggPSBibmRTdGFja1srK3BhcmVuRGVwdGhdID0ge2JkOiBbXX0sIGZuQ2FsbFtwYXJlbkRlcHRoXSA9IHJ0U3EsIHBybilcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBvcGVyYXRvcilcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0OiBvcGVyYXRvclxuXHRcdFx0XHQvLyBvcGVyYXRvclxuXHRcdFx0XHRcdFx0XHRcdFx0PyBvcGVyYXRvclxuXHRcdFx0XHRcdFx0XHRcdFx0OiBydFByblxuXHRcdFx0XHQvLyBmdW5jdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/ICgocnRQcm4gPSBmbkNhbGxbcGFyZW5EZXB0aF0gfHwgcnRQcm4sIGZuQ2FsbFtwYXJlbkRlcHRoXSA9IGZhbHNlLCBibmRDdHggPSBibmRTdGFja1stLXBhcmVuRGVwdGhdLCBydFBybilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIChwcm4gLy8gcnRQcm4gYW5kIHBybiwgZS5nICkoIGluIChhKSgpIG9yIGEoKSgpLCBvciApWyBpbiBhKClbXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSwgZm5DYWxsW3BhcmVuRGVwdGhdID0gcnRTcSwgcHJuKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBcIlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogY29tbWFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChmbkNhbGxbcGFyZW5EZXB0aF0gfHwgc3ludGF4RXJyb3IocGFyYW1zKSwgXCIsXCIpIC8vIFdlIGRvbid0IGFsbG93IHRvcC1sZXZlbCBsaXRlcmFsIGFycmF5cyBvciBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBsZnRQcm4wXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogKGFwb3NlZCA9IGFwb3MsIHF1b3RlZCA9IHF1b3QsICdcIicpXG5cdFx0XHRcdCkpXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHZhciBuYW1lZCwgYmluZHRvLCBib3VuZE5hbWUsXG5cdFx0cXVvdGVkLCAvLyBib29sZWFuIGZvciBzdHJpbmcgY29udGVudCBpbiBkb3VibGUgcXVvdGVzXG5cdFx0YXBvc2VkLCAvLyBvciBpbiBzaW5nbGUgcXVvdGVzXG5cdFx0YmluZGluZ3MgPSBwYXRoQmluZGluZ3MgJiYgcGF0aEJpbmRpbmdzWzBdLCAvLyBiaW5kaW5ncyBhcnJheSBmb3IgdGhlIGZpcnN0IGFyZ1xuXHRcdGJuZEN0eCA9IHtiZDogYmluZGluZ3N9LFxuXHRcdGJuZFN0YWNrID0gezA6IGJuZEN0eH0sXG5cdFx0cGFyYW1JbmRleCA9IDAsIC8vIGxpc3QsXG5cdFx0dG1wbExpbmtzID0gKHRtcGwgPyB0bXBsLmxpbmtzIDogYmluZGluZ3MgJiYgKGJpbmRpbmdzLmxpbmtzID0gYmluZGluZ3MubGlua3MgfHwge30pKSB8fCB0b3BWaWV3LnRtcGwubGlua3MsXG5cdFx0Ly8gVGhlIGZvbGxvd2luZyBhcmUgdXNlZCBmb3IgdHJhY2tpbmcgcGF0aCBwYXJzaW5nIGluY2x1ZGluZyBuZXN0ZWQgcGF0aHMsIHN1Y2ggYXMgXCJhLmIoY15kICsgKGUpKV5mXCIsIGFuZCBjaGFpbmVkIGNvbXB1dGVkIHBhdGhzIHN1Y2ggYXNcblx0XHQvLyBcImEuYigpLmNeZCgpLmUuZigpLmdcIiAtIHdoaWNoIGhhcyBmb3VyIGNoYWluZWQgcGF0aHMsIFwiYS5iKClcIiwgXCJeYy5kKClcIiwgXCIuZS5mKClcIiBhbmQgXCIuZ1wiXG5cdFx0cGFyZW5EZXB0aCA9IDAsXG5cdFx0Zm5DYWxsID0ge30sIC8vIFdlIGFyZSBpbiBhIGZ1bmN0aW9uIGNhbGxcblx0XHRwYXRoU3RhcnQgPSB7fSwgLy8gdHJhY2tzIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBwYXRoIHN1Y2ggYXMgY15kKCkgaW4gdGhlIGFib3ZlIGV4YW1wbGVcblx0XHRyZXN1bHQgPSAocGFyYW1zICsgKHRtcGwgPyBcIiBcIiA6IFwiXCIpKS5yZXBsYWNlKHJQYXJhbXMsIHBhcnNlVG9rZW5zKTtcblxuXHRyZXR1cm4gIXBhcmVuRGVwdGggJiYgcmVzdWx0IHx8IHN5bnRheEVycm9yKHBhcmFtcyk7IC8vIFN5bnRheCBlcnJvciBpZiB1bmJhbGFuY2VkIHBhcmVucyBpbiBwYXJhbXMgZXhwcmVzc2lvblxufVxuXG5mdW5jdGlvbiBidWlsZENvZGUoYXN0LCB0bXBsLCBpc0xpbmtFeHByKSB7XG5cdC8vIEJ1aWxkIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBjb2RlIGZyb20gdGhlIEFTVCBub2RlcywgYW5kIHNldCBhcyBwcm9wZXJ0eSBvbiB0aGUgcGFzc2VkLWluIHRlbXBsYXRlIG9iamVjdFxuXHQvLyBVc2VkIGZvciBjb21waWxpbmcgdGVtcGxhdGVzLCBhbmQgYWxzbyBieSBKc1ZpZXdzIHRvIGJ1aWxkIGZ1bmN0aW9ucyBmb3IgZGF0YSBsaW5rIGV4cHJlc3Npb25zXG5cdHZhciBpLCBub2RlLCB0YWdOYW1lLCBjb252ZXJ0ZXIsIHRhZ0N0eCwgaGFzVGFnLCBoYXNFbmNvZGVyLCBnZXRzVmFsLCBoYXNDbnZ0LCB1c2VDbnZ0LCB0bXBsQmluZGluZ3MsIHBhdGhCaW5kaW5ncywgcGFyYW1zLCBib3VuZE9uRXJyU3RhcnQsIGJvdW5kT25FcnJFbmQsXG5cdFx0dGFnUmVuZGVyLCBuZXN0ZWRUbXBscywgdG1wbE5hbWUsIG5lc3RlZFRtcGwsIHRhZ0FuZEVsc2VzLCBjb250ZW50LCBtYXJrdXAsIG5leHRJc0Vsc2UsIG9sZENvZGUsIGlzRWxzZSwgaXNHZXRWYWwsIHRhZ0N0eEZuLCBvbkVycm9yLCB0YWdTdGFydCwgdHJpZ2dlcixcblx0XHR0bXBsQmluZGluZ0tleSA9IDAsXG5cdFx0dXNlVmlld3MgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC51c2VWaWV3cyB8fCB0bXBsLnVzZVZpZXdzIHx8IHRtcGwudGFncyB8fCB0bXBsLnRlbXBsYXRlcyB8fCB0bXBsLmhlbHBlcnMgfHwgdG1wbC5jb252ZXJ0ZXJzLFxuXHRcdGNvZGUgPSBcIlwiLFxuXHRcdHRtcGxPcHRpb25zID0ge30sXG5cdFx0bCA9IGFzdC5sZW5ndGg7XG5cblx0aWYgKFwiXCIgKyB0bXBsID09PSB0bXBsKSB7XG5cdFx0dG1wbE5hbWUgPSBpc0xpbmtFeHByID8gJ2RhdGEtbGluaz1cIicgKyB0bXBsLnJlcGxhY2Uock5ld0xpbmUsIFwiIFwiKS5zbGljZSgxLCAtMSkgKyAnXCInIDogdG1wbDtcblx0XHR0bXBsID0gMDtcblx0fSBlbHNlIHtcblx0XHR0bXBsTmFtZSA9IHRtcGwudG1wbE5hbWUgfHwgXCJ1bm5hbWVkXCI7XG5cdFx0aWYgKHRtcGwuYWxsb3dDb2RlKSB7XG5cdFx0XHR0bXBsT3B0aW9ucy5hbGxvd0NvZGUgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAodG1wbC5kZWJ1Zykge1xuXHRcdFx0dG1wbE9wdGlvbnMuZGVidWcgPSB0cnVlO1xuXHRcdH1cblx0XHR0bXBsQmluZGluZ3MgPSB0bXBsLmJuZHM7XG5cdFx0bmVzdGVkVG1wbHMgPSB0bXBsLnRtcGxzO1xuXHR9XG5cdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHQvLyBBU1Qgbm9kZXM6IFswOiB0YWdOYW1lLCAxOiBjb252ZXJ0ZXIsIDI6IGNvbnRlbnQsIDM6IHBhcmFtcywgNDogY29kZSwgNTogb25FcnJvciwgNjogdHJpZ2dlciwgNzpwYXRoQmluZGluZ3MsIDg6IGNvbnRlbnRNYXJrdXBdXG5cdFx0bm9kZSA9IGFzdFtpXTtcblxuXHRcdC8vIEFkZCBuZXdsaW5lIGZvciBlYWNoIGNhbGxvdXQgdG8gdCgpIGMoKSBldGMuIGFuZCBlYWNoIG1hcmt1cCBzdHJpbmdcblx0XHRpZiAoXCJcIiArIG5vZGUgPT09IG5vZGUpIHtcblx0XHRcdC8vIGEgbWFya3VwIHN0cmluZyB0byBiZSBpbnNlcnRlZFxuXHRcdFx0Y29kZSArPSAnXFxuK1wiJyArIG5vZGUgKyAnXCInO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBhIGNvbXBpbGVkIHRhZyBleHByZXNzaW9uIHRvIGJlIGluc2VydGVkXG5cdFx0XHR0YWdOYW1lID0gbm9kZVswXTtcblx0XHRcdGlmICh0YWdOYW1lID09PSBcIipcIikge1xuXHRcdFx0XHQvLyBDb2RlIHRhZzoge3sqIH19XG5cdFx0XHRcdGNvZGUgKz0gXCI7XFxuXCIgKyBub2RlWzFdICsgXCJcXG5yZXQ9cmV0XCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb252ZXJ0ZXIgPSBub2RlWzFdO1xuXHRcdFx0XHRjb250ZW50ID0gIWlzTGlua0V4cHIgJiYgbm9kZVsyXTtcblx0XHRcdFx0dGFnQ3R4ID0gcGFyYW1TdHJ1Y3R1cmUobm9kZVszXSwgJ3BhcmFtcycpICsgJ30sJyArIHBhcmFtU3RydWN0dXJlKHBhcmFtcyA9IG5vZGVbNF0pO1xuXHRcdFx0XHRvbkVycm9yID0gbm9kZVs1XTtcblx0XHRcdFx0dHJpZ2dlciA9IG5vZGVbNl07XG5cdFx0XHRcdG1hcmt1cCA9IG5vZGVbOF0gJiYgbm9kZVs4XS5yZXBsYWNlKHJVbmVzY2FwZVF1b3RlcywgXCIkMVwiKTtcblx0XHRcdFx0aWYgKGlzRWxzZSA9IHRhZ05hbWUgPT09IFwiZWxzZVwiKSB7XG5cdFx0XHRcdFx0aWYgKHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0cGF0aEJpbmRpbmdzLnB1c2gobm9kZVs3XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRtcGxCaW5kaW5nS2V5ID0gMDtcblx0XHRcdFx0XHRpZiAodG1wbEJpbmRpbmdzICYmIChwYXRoQmluZGluZ3MgPSBub2RlWzddKSkgeyAvLyBBcnJheSBvZiBwYXRocywgb3IgZmFsc2UgaWYgbm90IGRhdGEtYm91bmRcblx0XHRcdFx0XHRcdHBhdGhCaW5kaW5ncyA9IFtwYXRoQmluZGluZ3NdO1xuXHRcdFx0XHRcdFx0dG1wbEJpbmRpbmdLZXkgPSB0bXBsQmluZGluZ3MucHVzaCgxKTsgLy8gQWRkIHBsYWNlaG9sZGVyIGluIHRtcGxCaW5kaW5ncyBmb3IgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dXNlVmlld3MgPSB1c2VWaWV3cyB8fCBwYXJhbXNbMV0gfHwgcGFyYW1zWzJdIHx8IHBhdGhCaW5kaW5ncyB8fCAvdmlldy4oPyFpbmRleCkvLnRlc3QocGFyYW1zWzBdKTtcblx0XHRcdFx0Ly8gdXNlVmlld3MgaXMgZm9yIHBlcmYgb3B0aW1pemF0aW9uLiBGb3IgcmVuZGVyKCkgd2Ugb25seSB1c2Ugdmlld3MgaWYgbmVjZXNzYXJ5IC0gZm9yIHRoZSBtb3JlIGFkdmFuY2VkIHNjZW5hcmlvcy5cblx0XHRcdFx0Ly8gV2UgdXNlIHZpZXdzIGlmIHRoZXJlIGFyZSBwcm9wcywgY29udGV4dHVhbCBwcm9wZXJ0aWVzIG9yIGFyZ3Mgd2l0aCAjLi4uIChvdGhlciB0aGFuICNpbmRleCkgLSBidXQgeW91IGNhbiBmb3JjZVxuXHRcdFx0XHQvLyB1c2luZyB0aGUgZnVsbCB2aWV3IGluZnJhc3RydWN0dXJlLCAoYW5kIHBheSBhIHBlcmYgcHJpY2UpIGJ5IG9wdGluZyBpbjogU2V0IHVzZVZpZXdzOiB0cnVlIG9uIHRoZSB0ZW1wbGF0ZSwgbWFudWFsbHkuLi5cblx0XHRcdFx0aWYgKGlzR2V0VmFsID0gdGFnTmFtZSA9PT0gXCI6XCIpIHtcblx0XHRcdFx0XHRpZiAoY29udmVydGVyKSB7XG5cdFx0XHRcdFx0XHR0YWdOYW1lID0gY29udmVydGVyID09PSBIVE1MID8gXCI+XCIgOiBjb252ZXJ0ZXIgKyB0YWdOYW1lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoY29udGVudCkgeyAvLyBUT0RPIG9wdGltaXplIC0gaWYgY29udGVudC5sZW5ndGggPT09IDAgb3IgaWYgdGhlcmUgaXMgYSB0bXBsPVwiLi4uXCIgc3BlY2lmaWVkIC0gc2V0IGNvbnRlbnQgdG8gbnVsbCAvIGRvbid0IHJ1biB0aGlzIGNvbXBpbGF0aW9uIGNvZGUgLSBzaW5jZSBjb250ZW50IHdvbid0IGdldCB1c2VkISFcblx0XHRcdFx0XHRcdC8vIENyZWF0ZSB0ZW1wbGF0ZSBvYmplY3QgZm9yIG5lc3RlZCB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbCA9IHRtcGxPYmplY3QobWFya3VwLCB0bXBsT3B0aW9ucyk7XG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBsLnRtcGxOYW1lID0gdG1wbE5hbWUgKyBcIi9cIiArIHRhZ05hbWU7XG5cdFx0XHRcdFx0XHQvLyBDb21waWxlIHRvIEFTVCBhbmQgdGhlbiB0byBjb21waWxlZCBmdW5jdGlvblxuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbC51c2VWaWV3cyA9IG5lc3RlZFRtcGwudXNlVmlld3MgfHwgdXNlVmlld3M7XG5cdFx0XHRcdFx0XHRidWlsZENvZGUoY29udGVudCwgbmVzdGVkVG1wbCk7XG5cdFx0XHRcdFx0XHR1c2VWaWV3cyA9IG5lc3RlZFRtcGwudXNlVmlld3M7XG5cdFx0XHRcdFx0XHRuZXN0ZWRUbXBscy5wdXNoKG5lc3RlZFRtcGwpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghaXNFbHNlKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIG5vdCBhbiBlbHNlIHRhZy5cblx0XHRcdFx0XHRcdHRhZ0FuZEVsc2VzID0gdGFnTmFtZTtcblx0XHRcdFx0XHRcdHVzZVZpZXdzID0gdXNlVmlld3MgfHwgdGFnTmFtZSAmJiAoISR0YWdzW3RhZ05hbWVdIHx8ICEkdGFnc1t0YWdOYW1lXS5mbG93KTtcblx0XHRcdFx0XHRcdC8vIFN3aXRjaCB0byBhIG5ldyBjb2RlIHN0cmluZyBmb3IgdGhpcyBib3VuZCB0YWcgKGFuZCBpdHMgZWxzZXMsIGlmIGl0IGhhcyBhbnkpIC0gZm9yIHJldHVybmluZyB0aGUgdGFnQ3R4cyBhcnJheVxuXHRcdFx0XHRcdFx0b2xkQ29kZSA9IGNvZGU7XG5cdFx0XHRcdFx0XHRjb2RlID0gXCJcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bmV4dElzRWxzZSA9IGFzdFtpICsgMV07XG5cdFx0XHRcdFx0bmV4dElzRWxzZSA9IG5leHRJc0Vsc2UgJiYgbmV4dElzRWxzZVswXSA9PT0gXCJlbHNlXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGFnU3RhcnQgPSBvbkVycm9yID8gXCI7XFxudHJ5e1xcbnJldCs9XCIgOiBcIlxcbitcIjtcblx0XHRcdFx0Ym91bmRPbkVyclN0YXJ0ID0gXCJcIjtcblx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKGlzR2V0VmFsICYmIChwYXRoQmluZGluZ3MgfHwgdHJpZ2dlciB8fCBjb252ZXJ0ZXIgJiYgY29udmVydGVyICE9PSBIVE1MKSkge1xuXHRcdFx0XHRcdC8vIEZvciBjb252ZXJ0VmFsIHdlIG5lZWQgYSBjb21waWxlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIG5ldyB0YWdDdHgocylcblx0XHRcdFx0XHR0YWdDdHhGbiA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgXCIgLy8gXCIgKyB0bXBsTmFtZSArIFwiIFwiICsgdG1wbEJpbmRpbmdLZXkgKyBcIiBcIiArIHRhZ05hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KyBcIlxcbnJldHVybiB7XCIgKyB0YWdDdHggKyBcIn07XCIpO1xuXHRcdFx0XHRcdHRhZ0N0eEZuLl9lciA9IG9uRXJyb3I7XG5cdFx0XHRcdFx0dGFnQ3R4Rm4uX3RhZyA9IHRhZ05hbWU7XG5cblx0XHRcdFx0XHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRhZ0N0eEZuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNldFBhdGhzKHRhZ0N0eEZuLCBwYXRoQmluZGluZ3MpO1xuXHRcdFx0XHRcdHRhZ1JlbmRlciA9ICdjKFwiJyArIGNvbnZlcnRlciArICdcIix2aWV3LCc7XG5cdFx0XHRcdFx0dXNlQ252dCA9IHRydWU7XG5cdFx0XHRcdFx0Ym91bmRPbkVyclN0YXJ0ID0gdGFnUmVuZGVyICsgdG1wbEJpbmRpbmdLZXkgKyBcIixcIjtcblx0XHRcdFx0XHRib3VuZE9uRXJyRW5kID0gXCIpXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29kZSArPSAoaXNHZXRWYWxcblx0XHRcdFx0XHQ/IChpc0xpbmtFeHByID8gKG9uRXJyb3IgPyBcInRyeXtcXG5cIiA6IFwiXCIpICsgXCJyZXR1cm4gXCIgOiB0YWdTdGFydCkgKyAodXNlQ252dCAvLyBDYWxsIF9jbnZ0IGlmIHRoZXJlIGlzIGEgY29udmVydGVyOiB7e2NudnQ6IC4uLiB9fSBvciB7XntjbnZ0OiAuLi4gfX1cblx0XHRcdFx0XHRcdD8gKHVzZUNudnQgPSB1bmRlZmluZWQsIHVzZVZpZXdzID0gaGFzQ252dCA9IHRydWUsIHRhZ1JlbmRlciArIChwYXRoQmluZGluZ3Ncblx0XHRcdFx0XHRcdFx0PyAoKHRtcGxCaW5kaW5nc1t0bXBsQmluZGluZ0tleSAtIDFdID0gdGFnQ3R4Rm4pLCB0bXBsQmluZGluZ0tleSkgLy8gU3RvcmUgdGhlIGNvbXBpbGVkIHRhZ0N0eEZuIGluIHRtcGwuYm5kcywgYW5kIHBhc3MgdGhlIGtleSB0byBjb252ZXJ0VmFsKClcblx0XHRcdFx0XHRcdFx0OiBcIntcIiArIHRhZ0N0eCArIFwifVwiKSArIFwiKVwiKVxuXHRcdFx0XHRcdFx0OiB0YWdOYW1lID09PSBcIj5cIlxuXHRcdFx0XHRcdFx0XHQ/IChoYXNFbmNvZGVyID0gdHJ1ZSwgXCJoKFwiICsgcGFyYW1zWzBdICsgXCIpXCIpXG5cdFx0XHRcdFx0XHRcdDogKGdldHNWYWwgPSB0cnVlLCBcIigodj1cIiArIHBhcmFtc1swXSArICcpIT1udWxsP3Y6JyArIChpc0xpbmtFeHByID8gJ251bGwpJyA6ICdcIlwiKScpKVxuXHRcdFx0XHRcdFx0XHQvLyBOb24gc3RyaWN0IGVxdWFsaXR5IHNvIGRhdGEtbGluaz1cInRpdGxlezpleHByfVwiIHdpdGggZXhwcj1udWxsL3VuZGVmaW5lZCByZW1vdmVzIHRpdGxlIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQ6IChoYXNUYWcgPSB0cnVlLCBcIlxcbnt2aWV3OnZpZXcsdG1wbDpcIiAvLyBBZGQgdGhpcyB0YWdDdHggdG8gdGhlIGNvbXBpbGVkIGNvZGUgZm9yIHRoZSB0YWdDdHhzIHRvIGJlIHBhc3NlZCB0byByZW5kZXJUYWcoKVxuXHRcdFx0XHRcdFx0KyAoY29udGVudCA/IG5lc3RlZFRtcGxzLmxlbmd0aCA6IFwiMFwiKSArIFwiLFwiIC8vIEZvciBibG9jayB0YWdzLCBwYXNzIGluIHRoZSBrZXkgKG5lc3RlZFRtcGxzLmxlbmd0aCkgdG8gdGhlIG5lc3RlZCBjb250ZW50IHRlbXBsYXRlXG5cdFx0XHRcdFx0XHQrIHRhZ0N0eCArIFwifSxcIikpO1xuXG5cdFx0XHRcdGlmICh0YWdBbmRFbHNlcyAmJiAhbmV4dElzRWxzZSkge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBkYXRhLWxpbmsgZXhwcmVzc2lvbiBvciBhbiBpbmxpbmUgdGFnIHdpdGhvdXQgYW55IGVsc2VzLCBvciB0aGUgbGFzdCB7e2Vsc2V9fSBvZiBhbiBpbmxpbmUgdGFnXG5cdFx0XHRcdFx0Ly8gV2UgY29tcGxldGUgdGhlIGNvZGUgZm9yIHJldHVybmluZyB0aGUgdGFnQ3R4cyBhcnJheVxuXHRcdFx0XHRcdGNvZGUgPSBcIltcIiArIGNvZGUuc2xpY2UoMCwgLTEpICsgXCJdXCI7XG5cdFx0XHRcdFx0dGFnUmVuZGVyID0gJ3QoXCInICsgdGFnQW5kRWxzZXMgKyAnXCIsdmlldyx0aGlzLCc7XG5cdFx0XHRcdFx0aWYgKGlzTGlua0V4cHIgfHwgcGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgYm91bmQgdGFnIChkYXRhLWxpbmsgZXhwcmVzc2lvbiBvciBpbmxpbmUgYm91bmQgdGFnIHtee3RhZyAuLi59fSkgc28gd2Ugc3RvcmUgYSBjb21waWxlZCB0YWdDdHhzIGZ1bmN0aW9uIGluIHRtcC5ibmRzXG5cdFx0XHRcdFx0XHRjb2RlID0gbmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3LGosdVwiLCBcIiAvLyBcIiArIHRtcGxOYW1lICsgXCIgXCIgKyB0bXBsQmluZGluZ0tleSArIFwiIFwiICsgdGFnQW5kRWxzZXMgKyBcIlxcbnJldHVybiBcIiArIGNvZGUgKyBcIjtcIik7XG5cdFx0XHRcdFx0XHRjb2RlLl9lciA9IG9uRXJyb3I7XG5cdFx0XHRcdFx0XHRjb2RlLl90YWcgPSB0YWdBbmRFbHNlcztcblx0XHRcdFx0XHRcdGlmIChwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdFx0c2V0UGF0aHModG1wbEJpbmRpbmdzW3RtcGxCaW5kaW5nS2V5IC0gMV0gPSBjb2RlLCBwYXRoQmluZGluZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvZGU7IC8vIEZvciBhIGRhdGEtbGluayBleHByZXNzaW9uIHdlIHJldHVybiB0aGUgY29tcGlsZWQgdGFnQ3R4cyBmdW5jdGlvblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ym91bmRPbkVyclN0YXJ0ID0gdGFnUmVuZGVyICsgdG1wbEJpbmRpbmdLZXkgKyBcIix1bmRlZmluZWQsXCI7XG5cdFx0XHRcdFx0XHRib3VuZE9uRXJyRW5kID0gXCIpXCI7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyB0aGUgbGFzdCB7e2Vsc2V9fSBmb3IgYW4gaW5saW5lIHRhZy5cblx0XHRcdFx0XHQvLyBGb3IgYSBib3VuZCB0YWcsIHBhc3MgdGhlIHRhZ0N0eHMgZm4gbG9va3VwIGtleSB0byByZW5kZXJUYWcuXG5cdFx0XHRcdFx0Ly8gRm9yIGFuIHVuYm91bmQgdGFnLCBpbmNsdWRlIHRoZSBjb2RlIGRpcmVjdGx5IGZvciBldmFsdWF0aW5nIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRjb2RlID0gb2xkQ29kZSArIHRhZ1N0YXJ0ICsgdGFnUmVuZGVyICsgKHRtcGxCaW5kaW5nS2V5IHx8IGNvZGUpICsgXCIpXCI7XG5cdFx0XHRcdFx0cGF0aEJpbmRpbmdzID0gMDtcblx0XHRcdFx0XHR0YWdBbmRFbHNlcyA9IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9uRXJyb3IpIHtcblx0XHRcdFx0XHR1c2VWaWV3cyA9IHRydWU7XG5cdFx0XHRcdFx0Y29kZSArPSAnO1xcbn1jYXRjaChlKXtyZXQnICsgKGlzTGlua0V4cHIgPyBcInVybiBcIiA6IFwiKz1cIikgKyBib3VuZE9uRXJyU3RhcnQgKyAnai5fZXJyKGUsdmlldywnICsgb25FcnJvciArICcpJyArIGJvdW5kT25FcnJFbmQgKyAnO30nICsgKGlzTGlua0V4cHIgPyBcIlwiIDogJ3JldD1yZXQnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvLyBJbmNsdWRlIG9ubHkgdGhlIHZhciByZWZlcmVuY2VzIHRoYXQgYXJlIG5lZWRlZCBpbiB0aGUgY29kZVxuXHRjb2RlID0gXCIvLyBcIiArIHRtcGxOYW1lXG5cblx0XHQrIFwiXFxudmFyIHZcIlxuXHRcdCsgKGhhc1RhZyA/IFwiLHQ9ai5fdGFnXCIgOiBcIlwiKSAgICAgICAgICAgICAgICAvLyBoYXMgdGFnXG5cdFx0KyAoaGFzQ252dCA/IFwiLGM9ai5fY252dFwiIDogXCJcIikgICAgICAgICAgICAgIC8vIGNvbnZlcnRlclxuXHRcdCsgKGhhc0VuY29kZXIgPyBcIixoPWouX2h0bWxcIiA6IFwiXCIpICAgICAgICAgICAvLyBodG1sIGNvbnZlcnRlclxuXHRcdCsgKGlzTGlua0V4cHIgPyBcIjtcXG5cIiA6ICcscmV0PVwiXCJcXG4nKVxuXHRcdCsgKHRtcGxPcHRpb25zLmRlYnVnID8gXCJkZWJ1Z2dlcjtcIiA6IFwiXCIpXG5cdFx0KyBjb2RlXG5cdFx0KyAoaXNMaW5rRXhwciA/IFwiXFxuXCIgOiBcIjtcXG5yZXR1cm4gcmV0O1wiKTtcblxuXHRpZiAoJHN1YlNldHRpbmdzLmRlYnVnTW9kZSAhPT0gZmFsc2UpIHtcblx0XHRjb2RlID0gXCJ0cnkge1xcblwiICsgY29kZSArIFwiXFxufWNhdGNoKGUpe1xcbnJldHVybiBqLl9lcnIoZSwgdmlldyk7XFxufVwiO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRjb2RlID0gbmV3IEZ1bmN0aW9uKFwiZGF0YSx2aWV3LGosdVwiLCBjb2RlKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHN5bnRheEVycm9yKFwiQ29tcGlsZWQgdGVtcGxhdGUgY29kZTpcXG5cXG5cIiArIGNvZGUgKyAnXFxuOiBcIicgKyBlLm1lc3NhZ2UgKyAnXCInKTtcblx0fVxuXHRpZiAodG1wbCkge1xuXHRcdHRtcGwuZm4gPSBjb2RlO1xuXHRcdHRtcGwudXNlVmlld3MgPSAhIXVzZVZpZXdzO1xuXHR9XG5cdHJldHVybiBjb2RlO1xufVxuXG4vLz09PT09PT09PT1cbi8vIFV0aWxpdGllc1xuLy89PT09PT09PT09XG5cbi8vIE1lcmdlIG9iamVjdHMsIGluIHBhcnRpY3VsYXIgY29udGV4dHMgd2hpY2ggaW5oZXJpdCBmcm9tIHBhcmVudCBjb250ZXh0c1xuZnVuY3Rpb24gZXh0ZW5kQ3R4KGNvbnRleHQsIHBhcmVudENvbnRleHQpIHtcblx0Ly8gUmV0dXJuIGNvcHkgb2YgcGFyZW50Q29udGV4dCwgdW5sZXNzIGNvbnRleHQgaXMgZGVmaW5lZCBhbmQgaXMgZGlmZmVyZW50LCBpbiB3aGljaCBjYXNlIHJldHVybiBhIG5ldyBtZXJnZWQgY29udGV4dFxuXHQvLyBJZiBuZWl0aGVyIGNvbnRleHQgbm9yIHBhcmVudENvbnRleHQgYXJlIGRlZmluZWQsIHJldHVybiB1bmRlZmluZWRcblx0cmV0dXJuIGNvbnRleHQgJiYgY29udGV4dCAhPT0gcGFyZW50Q29udGV4dFxuXHRcdD8gKHBhcmVudENvbnRleHRcblx0XHRcdD8gJGV4dGVuZCgkZXh0ZW5kKHt9LCBwYXJlbnRDb250ZXh0KSwgY29udGV4dClcblx0XHRcdDogY29udGV4dClcblx0XHQ6IHBhcmVudENvbnRleHQgJiYgJGV4dGVuZCh7fSwgcGFyZW50Q29udGV4dCk7XG59XG5cbi8vIEdldCBjaGFyYWN0ZXIgZW50aXR5IGZvciBIVE1MIGFuZCBBdHRyaWJ1dGUgZW5jb2RpbmdcbmZ1bmN0aW9uIGdldENoYXJFbnRpdHkoY2gpIHtcblx0cmV0dXJuIGNoYXJFbnRpdGllc1tjaF0gfHwgKGNoYXJFbnRpdGllc1tjaF0gPSBcIiYjXCIgKyBjaC5jaGFyQ29kZUF0KDApICsgXCI7XCIpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRQcm9wcyhzb3VyY2UpIHtcblx0Ly8gdGhpcyBwb2ludGVyIGlzIHRoZU1hcCAtIHdoaWNoIGhhcyB0YWdDdHgucHJvcHMgdG9vXG5cdC8vIGFyZ3VtZW50czogdGFnQ3R4LmFyZ3MuXG5cdHZhciBrZXksIHByb3AsXG5cdFx0cHJvcHMgPSBbXTtcblxuXHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gT0JKRUNUKSB7XG5cdFx0Zm9yIChrZXkgaW4gc291cmNlKSB7XG5cdFx0XHRwcm9wID0gc291cmNlW2tleV07XG5cdFx0XHRpZiAoa2V5ICE9PSAkZXhwYW5kbyAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhJGlzRnVuY3Rpb24ocHJvcCkpIHtcblx0XHRcdFx0cHJvcHMucHVzaCh7a2V5OiBrZXksIHByb3A6IHByb3B9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BzO1xufVxuXG5mdW5jdGlvbiAkZm5SZW5kZXIoZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24pIHtcblx0dmFyIHRtcGxFbGVtID0gdGhpcy5qcXVlcnkgJiYgKHRoaXNbMF0gfHwgZXJyb3IoJ1Vua25vd24gdGVtcGxhdGUnKSksIC8vIFRhcmdldGVkIGVsZW1lbnQgbm90IGZvdW5kIGZvciBqUXVlcnkgdGVtcGxhdGUgc2VsZWN0b3Igc3VjaCBhcyBcIiNteVRtcGxcIlxuXHRcdHRtcGwgPSB0bXBsRWxlbS5nZXRBdHRyaWJ1dGUodG1wbEF0dHIpO1xuXG5cdHJldHVybiByZW5kZXJDb250ZW50LmNhbGwodG1wbCA/ICQuZGF0YSh0bXBsRWxlbSlbanN2VG1wbF0gOiAkdGVtcGxhdGVzKHRtcGxFbGVtKSwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24pO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZ2lzdGVyIGNvbnZlcnRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gaHRtbEVuY29kZSh0ZXh0KSB7XG5cdC8vIEhUTUwgZW5jb2RlOiBSZXBsYWNlIDwgPiAmICcgYW5kIFwiIGJ5IGNvcnJlc3BvbmRpbmcgZW50aXRpZXMuXG5cdHJldHVybiB0ZXh0ICE9IHVuZGVmaW5lZCA/IHJJc0h0bWwudGVzdCh0ZXh0KSAmJiAoXCJcIiArIHRleHQpLnJlcGxhY2Uockh0bWxFbmNvZGUsIGdldENoYXJFbnRpdHkpIHx8IHRleHQgOiBcIlwiO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJHN1YiA9ICR2aWV3cy5zdWI7XG4kdmlld3NTZXR0aW5ncyA9ICR2aWV3cy5zZXR0aW5ncztcblxuaWYgKCEoanNyIHx8ICQgJiYgJC5yZW5kZXIpKSB7XG5cdC8vIEpzUmVuZGVyIG5vdCBhbHJlYWR5IGxvYWRlZCwgb3IgbG9hZGVkIHdpdGhvdXQgalF1ZXJ5LCBhbmQgd2UgYXJlIG5vdyBtb3ZpbmcgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVwYWNlXG5cdGZvciAoanN2U3RvcmVOYW1lIGluIGpzdlN0b3Jlcykge1xuXHRcdHJlZ2lzdGVyU3RvcmUoanN2U3RvcmVOYW1lLCBqc3ZTdG9yZXNbanN2U3RvcmVOYW1lXSk7XG5cdH1cblxuXHQkY29udmVydGVycyA9ICR2aWV3cy5jb252ZXJ0ZXJzO1xuXHQkaGVscGVycyA9ICR2aWV3cy5oZWxwZXJzO1xuXHQkdGFncyA9ICR2aWV3cy50YWdzO1xuXG5cdCRzdWIuX3RnLnByb3RvdHlwZSA9IHtcblx0XHRiYXNlQXBwbHk6IGJhc2VBcHBseSxcblx0XHRjdnRBcmdzOiBjb252ZXJ0QXJnc1xuXHR9O1xuXG5cdHRvcFZpZXcgPSAkc3ViLnRvcFZpZXcgPSBuZXcgVmlldygpO1xuXG5cdC8vQlJPV1NFUi1TUEVDSUZJQyBDT0RFXG5cdGlmICgkKSB7XG5cblx0XHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBqUXVlcnkgKD0gJCkgaXMgbG9hZGVkXG5cblx0XHQkLmZuLnJlbmRlciA9ICRmblJlbmRlcjtcblx0XHQkZXhwYW5kbyA9ICQuZXhwYW5kbztcblx0XHRpZiAoJC5vYnNlcnZhYmxlKSB7XG5cdFx0XHQkZXh0ZW5kKCRzdWIsICQudmlld3Muc3ViKTsgLy8ganF1ZXJ5Lm9ic2VydmFibGUuanMgd2FzIGxvYWRlZCBiZWZvcmUganNyZW5kZXIuanNcblx0XHRcdCR2aWV3cy5tYXAgPSAkLnZpZXdzLm1hcDtcblx0XHR9XG5cblx0fSBlbHNlIHtcblx0XHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBqUXVlcnkgaXMgbm90IGxvYWRlZC5cblxuXHRcdCQgPSB7fTtcblxuXHRcdGlmIChzZXRHbG9iYWxzKSB7XG5cdFx0XHRnbG9iYWwuanNyZW5kZXIgPSAkOyAvLyBXZSBhcmUgbG9hZGluZyBqc3JlbmRlci5qcyBmcm9tIGEgc2NyaXB0IGVsZW1lbnQsIG5vdCBBTUQgb3IgQ29tbW9uSlMsIHNvIHNldCBnbG9iYWxcblx0XHR9XG5cblx0XHQvLyBFcnJvciB3YXJuaW5nIGlmIGpzcmVuZGVyLmpzIGlzIHVzZWQgYXMgdGVtcGxhdGUgZW5naW5lIG9uIE5vZGUuanMgKGUuZy4gRXhwcmVzcyBvciBIYXBpLi4uKVxuXHRcdC8vIFVzZSBqc3JlbmRlci1ub2RlLmpzIGluc3RlYWQuLi5cblx0XHQkLnJlbmRlckZpbGUgPSAkLl9fZXhwcmVzcyA9ICQuY29tcGlsZSA9IGZ1bmN0aW9uKCkgeyB0aHJvdyBcIk5vZGUuanM6IHVzZSBucG0ganNyZW5kZXIsIG9yIGpzcmVuZGVyLW5vZGUuanNcIjsgfTtcblxuXHRcdC8vRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdCQuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKG9iKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIG9iID09PSBcImZ1bmN0aW9uXCI7XG5cdFx0fTtcblxuXHRcdCQuaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7XG5cdFx0XHRyZXR1cm4gKHt9LnRvU3RyaW5nKS5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIjtcblx0XHR9O1xuXG5cdFx0JHN1Yi5fanEgPSBmdW5jdGlvbihqcSkgeyAvLyBwcml2YXRlIG1ldGhvZCB0byBtb3ZlIGZyb20gSnNSZW5kZXIgQVBJcyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXNwYWNlXG5cdFx0XHRpZiAoanEgIT09ICQpIHtcblx0XHRcdFx0JGV4dGVuZChqcSwgJCk7IC8vIG1hcCBvdmVyIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lc3BhY2Vcblx0XHRcdFx0JCA9IGpxO1xuXHRcdFx0XHQkLmZuLnJlbmRlciA9ICRmblJlbmRlcjtcblx0XHRcdFx0ZGVsZXRlICQuanNyZW5kZXI7XG5cdFx0XHRcdCRleHBhbmRvID0gJC5leHBhbmRvO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQkLmpzcmVuZGVyID0gdmVyc2lvbk51bWJlcjtcblx0fVxuXHQkc3ViU2V0dGluZ3MgPSAkc3ViLnNldHRpbmdzO1xuXHQkc3ViU2V0dGluZ3MuYWxsb3dDb2RlID0gZmFsc2U7XG5cdCRpc0Z1bmN0aW9uID0gJC5pc0Z1bmN0aW9uO1xuXHQkLnJlbmRlciA9ICRyZW5kZXI7XG5cdCQudmlld3MgPSAkdmlld3M7XG5cdCQudGVtcGxhdGVzID0gJHRlbXBsYXRlcyA9ICR2aWV3cy50ZW1wbGF0ZXM7XG5cblx0Zm9yIChzZXR0aW5nIGluICRzdWJTZXR0aW5ncykge1xuXHRcdGFkZFNldHRpbmcoc2V0dGluZyk7XG5cdH1cblxuXHQoJHZpZXdzU2V0dGluZ3MuZGVidWdNb2RlID0gZnVuY3Rpb24oZGVidWdNb2RlKSB7XG5cdFx0cmV0dXJuIGRlYnVnTW9kZSA9PT0gdW5kZWZpbmVkXG5cdFx0XHQ/ICRzdWJTZXR0aW5ncy5kZWJ1Z01vZGVcblx0XHRcdDogKFxuXHRcdFx0XHQkc3ViU2V0dGluZ3MuZGVidWdNb2RlID0gZGVidWdNb2RlLFxuXHRcdFx0XHQkc3ViU2V0dGluZ3Mub25FcnJvciA9IGRlYnVnTW9kZSArIFwiXCIgPT09IGRlYnVnTW9kZVxuXHRcdFx0XHRcdD8gbmV3IEZ1bmN0aW9uKFwiXCIsIFwicmV0dXJuICdcIiArIGRlYnVnTW9kZSArIFwiJztcIiApXG5cdFx0XHRcdFx0OiAkaXNGdW5jdGlvbihkZWJ1Z01vZGUpXG5cdFx0XHRcdFx0XHQ/IGRlYnVnTW9kZVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRcdCR2aWV3c1NldHRpbmdzKTtcblx0fSkoZmFsc2UpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuXHQkc3ViU2V0dGluZ3NBZHZhbmNlZCA9ICRzdWJTZXR0aW5ncy5hZHZhbmNlZCA9IHtcblx0XHR1c2VWaWV3czogZmFsc2UsXG5cdFx0X2pzdjogZmFsc2UgLy8gRm9yIGdsb2JhbCBhY2Nlc3MgdG8gSnNWaWV3cyBzdG9yZVxuXHR9O1xuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVnaXN0ZXIgdGFncyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCR0YWdzKHtcblx0XHRcImlmXCI6IHtcblx0XHRcdHJlbmRlcjogZnVuY3Rpb24odmFsKSB7XG5cdFx0XHRcdC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIHt7aWZ9fSBhbmQgb25jZSBmb3IgZWFjaCB7e2Vsc2V9fS5cblx0XHRcdFx0Ly8gV2Ugd2lsbCB1c2UgdGhlIHRhZy5yZW5kZXJpbmcgb2JqZWN0IGZvciBjYXJyeWluZyByZW5kZXJpbmcgc3RhdGUgYWNyb3NzIHRoZSBjYWxscy5cblx0XHRcdFx0Ly8gSWYgbm90IGRvbmUgKGEgcHJldmlvdXMgYmxvY2sgaGFzIG5vdCBiZWVuIHJlbmRlcmVkKSwgbG9vayBhdCBleHByZXNzaW9uIGZvciB0aGlzIGJsb2NrIGFuZCByZW5kZXIgdGhlIGJsb2NrIGlmIGV4cHJlc3Npb24gaXMgdHJ1dGh5XG5cdFx0XHRcdC8vIE90aGVyd2lzZSByZXR1cm4gXCJcIlxuXHRcdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdFx0dGFnQ3R4ID0gc2VsZi50YWdDdHgsXG5cdFx0XHRcdFx0cmV0ID0gKHNlbGYucmVuZGVyaW5nLmRvbmUgfHwgIXZhbCAmJiAoYXJndW1lbnRzLmxlbmd0aCB8fCAhdGFnQ3R4LmluZGV4KSlcblx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0OiAoc2VsZi5yZW5kZXJpbmcuZG9uZSA9IHRydWUsIHNlbGYuc2VsZWN0ZWQgPSB0YWdDdHguaW5kZXgsXG5cdFx0XHRcdFx0XHRcdC8vIFRlc3QgaXMgc2F0aXNmaWVkLCBzbyByZW5kZXIgY29udGVudCBvbiBjdXJyZW50IGNvbnRleHQuIFdlIGNhbGwgdGFnQ3R4LnJlbmRlcigpIHJhdGhlciB0aGFuIHJldHVybiB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0Ly8gKHdoaWNoIHdvdWxkIGFsc28gcmVuZGVyIHRoZSB0bXBsL2NvbnRlbnQgb24gdGhlIGN1cnJlbnQgY29udGV4dCBidXQgd291bGQgaXRlcmF0ZSBpZiBpdCBpcyBhbiBhcnJheSlcblx0XHRcdFx0XHRcdFx0dGFnQ3R4LnJlbmRlcih0YWdDdHgudmlldywgdHJ1ZSkpOyAvLyBubyBhcmcsIHNvIHJlbmRlcnMgYWdhaW5zdCBwYXJlbnRWaWV3LmRhdGFcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH0sXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcImZvclwiOiB7XG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHQvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciB7e2Zvcn19IGFuZCBvbmNlIGZvciBlYWNoIHt7ZWxzZX19LlxuXHRcdFx0XHQvLyBXZSB3aWxsIHVzZSB0aGUgdGFnLnJlbmRlcmluZyBvYmplY3QgZm9yIGNhcnJ5aW5nIHJlbmRlcmluZyBzdGF0ZSBhY3Jvc3MgdGhlIGNhbGxzLlxuXHRcdFx0XHR2YXIgZmluYWxFbHNlID0gIWFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0c2VsZiA9IHRoaXMsXG5cdFx0XHRcdFx0dGFnQ3R4ID0gc2VsZi50YWdDdHgsXG5cdFx0XHRcdFx0cmVzdWx0ID0gXCJcIixcblx0XHRcdFx0XHRkb25lID0gMDtcblxuXHRcdFx0XHRpZiAoIXNlbGYucmVuZGVyaW5nLmRvbmUpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGZpbmFsRWxzZSA/IHRhZ0N0eC52aWV3LmRhdGEgOiB2YWw7IC8vIEZvciB0aGUgZmluYWwgZWxzZSwgZGVmYXVsdHMgdG8gY3VycmVudCBkYXRhIHdpdGhvdXQgaXRlcmF0aW9uLlxuXHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gdGFnQ3R4LnJlbmRlcih2YWx1ZSwgZmluYWxFbHNlKTsgLy8gSXRlcmF0ZXMgZXhjZXB0IG9uIGZpbmFsIGVsc2UsIGlmIGRhdGEgaXMgYW4gYXJyYXkuIChVc2Uge3tpbmNsdWRlfX0gdG8gY29tcG9zZSB0ZW1wbGF0ZXMgd2l0aG91dCBhcnJheSBpdGVyYXRpb24pXG5cdFx0XHRcdFx0XHRkb25lICs9ICRpc0FycmF5KHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA6IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChzZWxmLnJlbmRlcmluZy5kb25lID0gZG9uZSkge1xuXHRcdFx0XHRcdFx0c2VsZi5zZWxlY3RlZCA9IHRhZ0N0eC5pbmRleDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gSWYgbm90aGluZyB3YXMgcmVuZGVyZWQgd2Ugd2lsbCBsb29rIGF0IHRoZSBuZXh0IHt7ZWxzZX19LiBPdGhlcndpc2UsIHdlIGFyZSBkb25lLlxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0cHJvcHM6IHtcblx0XHRcdGJhc2VUYWc6IFwiZm9yXCIsXG5cdFx0XHRkYXRhTWFwOiBkYXRhTWFwKGdldFRhcmdldFByb3BzKSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdGluY2x1ZGU6IHtcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiKlwiOiB7XG5cdFx0XHQvLyB7eyogY29kZS4uLiB9fSAtIElnbm9yZWQgaWYgdGVtcGxhdGUuYWxsb3dDb2RlIGFuZCAkLnZpZXdzLnNldHRpbmdzLmFsbG93Q29kZSBhcmUgZmFsc2UuIE90aGVyd2lzZSBpbmNsdWRlIGNvZGUgaW4gY29tcGlsZWQgdGVtcGxhdGVcblx0XHRcdHJlbmRlcjogcmV0VmFsLFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCI6KlwiOiB7XG5cdFx0XHQvLyB7ezoqIHJldHVybmVkRXhwcmVzc2lvbiB9fSAtIElnbm9yZWQgaWYgdGVtcGxhdGUuYWxsb3dDb2RlIGFuZCAkLnZpZXdzLnNldHRpbmdzLmFsbG93Q29kZSBhcmUgZmFsc2UuIE90aGVyd2lzZSBpbmNsdWRlIGNvZGUgaW4gY29tcGlsZWQgdGVtcGxhdGVcblx0XHRcdHJlbmRlcjogcmV0VmFsLFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0ZGJnOiAkaGVscGVycy5kYmcgPSAkY29udmVydGVycy5kYmcgPSBkYmdCcmVhayAvLyBSZWdpc3RlciB7e2RiZy99fSwge3tkYmc6Li4ufX0gYW5kIH5kYmcoKSB0byB0aHJvdyBhbmQgY2F0Y2gsIGFzIGJyZWFrcG9pbnRzIGZvciBkZWJ1Z2dpbmcuXG5cdH0pO1xuXG5cdCRjb252ZXJ0ZXJzKHtcblx0XHRodG1sOiBodG1sRW5jb2RlLFxuXHRcdGF0dHI6IGh0bWxFbmNvZGUsIC8vIEluY2x1ZGVzID4gZW5jb2Rpbmcgc2luY2UgckNvbnZlcnRNYXJrZXJzIGluIEpzVmlld3MgZG9lcyBub3Qgc2tpcCA+IGNoYXJhY3RlcnMgaW4gYXR0cmlidXRlIHN0cmluZ3Ncblx0XHR1cmw6IGZ1bmN0aW9uKHRleHQpIHtcblx0XHRcdC8vIFVSTCBlbmNvZGluZyBoZWxwZXIuXG5cdFx0XHRyZXR1cm4gdGV4dCAhPSB1bmRlZmluZWQgPyBlbmNvZGVVUkkoXCJcIiArIHRleHQpIDogdGV4dCA9PT0gbnVsbCA/IHRleHQgOiBcIlwiOyAvLyBudWxsIHJldHVybnMgbnVsbCwgZS5nLiB0byByZW1vdmUgYXR0cmlidXRlLiB1bmRlZmluZWQgcmV0dXJucyBcIlwiXG5cdFx0fVxuXHR9KTtcbn1cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gRGVmaW5lIGRlZmF1bHQgZGVsaW1pdGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuJHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcbiRpc0FycmF5ID0gKCR8fGpzcikuaXNBcnJheTtcbiR2aWV3c1NldHRpbmdzLmRlbGltaXRlcnMoXCJ7e1wiLCBcIn19XCIsIFwiXlwiKTtcblxuaWYgKGpzclRvSnEpIHsgLy8gTW92aW5nIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lcGFjZSAtIGNvcHkgb3ZlciB0aGUgc3RvcmVkIGl0ZW1zICh0ZW1wbGF0ZXMsIGNvbnZlcnRlcnMsIGhlbHBlcnMuLi4pXG5cdGpzci52aWV3cy5zdWIuX2pxKCQpO1xufVxuXG4vLzw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCBKc09ic2VydmFibGUgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4vKiBKc09ic2VydmFibGU6XG4gKiBTZWUgaHR0cDovL3d3dy5qc3ZpZXdzLmNvbS8janNvYnNlcnZhYmxlIGFuZCBodHRwOi8vZ2l0aHViLmNvbS9ib3Jpc21vb3JlL2pzdmlld3NcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJHZpZXdzID0gJC52aWV3cztcbiRzdWIgPSAkdmlld3Muc3ViO1xuJGlzRnVuY3Rpb24gPSAkLmlzRnVuY3Rpb247XG4kaXNBcnJheSA9ICQuaXNBcnJheTtcbiRleHBhbmRvID0gJC5leHBhbmRvO1xuaWYgKCEkLm9ic2VydmUpIHtcblxuXHR2YXIgJGV2ZW50U3BlY2lhbCA9ICQuZXZlbnQuc3BlY2lhbCxcblx0XHRzbGljZSA9IFtdLnNsaWNlLFxuXHRcdHNwbGljZSA9IFtdLnNwbGljZSxcblx0XHRjb25jYXQgPSBbXS5jb25jYXQsXG5cdFx0UEFSU0VJTlQgPSBwYXJzZUludCxcblx0XHRyTm90V2hpdGUgPSAvXFxTKy9nLFxuXHRcdHByb3BlcnR5Q2hhbmdlU3RyID0gJHN1Yi5wcm9wQ2huZyA9ICRzdWIucHJvcENobmcgfHwgXCJwcm9wZXJ0eUNoYW5nZVwiLC8vIFRoZXNlIHR3byBzZXR0aW5ncyBjYW4gYmUgb3ZlcnJpZGRlbiBvbiBzZXR0aW5ncyBhZnRlciBsb2FkaW5nXG5cdFx0YXJyYXlDaGFuZ2VTdHIgPSAkc3ViLmFyckNobmcgPSAkc3ViLmFyckNobmcgfHwgXCJhcnJheUNoYW5nZVwiLCAgICAgICAgLy8ganNSZW5kZXIsIGFuZCBwcmlvciB0byBsb2FkaW5nIGpxdWVyeS5vYnNlcnZhYmxlLmpzIGFuZC9vciBKc1ZpZXdzXG5cdFx0Y2JCaW5kaW5nc1N0b3JlID0ge30sXG5cdFx0b2JzZXJ2ZVN0ciA9IHByb3BlcnR5Q2hhbmdlU3RyICsgXCIub2JzZXJ2ZVwiLFxuXHRcdG9ic2VydmVPYmpLZXkgPSAxLFxuXHRcdG9ic2VydmVDYktleSA9IDEsXG5cdFx0b2JzZXJ2ZUlubmVyQ2JLZXkgPSAxLFxuXHRcdCRoYXNEYXRhID0gJC5oYXNEYXRhLFxuXHRcdCRkYXRhID0gJC5kYXRhLFxuXHRcdHJlbW92ZSA9IHt9LCAvLyBmbGFnIGZvciByZW1vdmVQcm9wZXJ0eVxuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdGdldENiS2V5ID0gZnVuY3Rpb24oY2IpIHtcblx0XHRyZXR1cm4gY2IuX2NJZCA9IGNiLl9jSWQgfHwgKFwiLm9ic1wiICsgb2JzZXJ2ZUNiS2V5KyspO1xuXHR9LFxuXG5cdE9iamVjdE9ic2VydmFibGUgPSBmdW5jdGlvbihucywgZGF0YSkge1xuXHRcdHRoaXMuX2RhdGEgPSBkYXRhO1xuXHRcdHRoaXMuX25zID0gbnM7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0QXJyYXlPYnNlcnZhYmxlID0gZnVuY3Rpb24obnMsIGRhdGEpIHtcblx0XHR0aGlzLl9kYXRhID0gZGF0YTtcblx0XHR0aGlzLl9ucyA9IG5zO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHdyYXBBcnJheSA9IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRyZXR1cm4gJGlzQXJyYXkoZGF0YSlcblx0XHRcdD8gW2RhdGFdXG5cdFx0XHQ6IGRhdGE7XG5cdH0sXG5cblx0cmVzb2x2ZVBhdGhPYmplY3RzID0gZnVuY3Rpb24ocGF0aHMsIHJvb3QsIGNhbGxiYWNrKSB7XG5cdFx0cGF0aHMgPSBwYXRoc1xuXHRcdFx0PyAkaXNBcnJheShwYXRocylcblx0XHRcdFx0PyBwYXRoc1xuXHRcdFx0XHQ6IFtwYXRoc11cblx0XHRcdDogW107XG5cblx0XHR2YXIgaSwgcGF0aCxcblx0XHRcdG9iamVjdCA9IHJvb3QsXG5cdFx0XHRuZXh0T2JqID0gb2JqZWN0LFxuXHRcdFx0bCA9IHBhdGhzICYmIHBhdGhzLmxlbmd0aCxcblx0XHRcdG91dCA9IFtdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0cGF0aCA9IHBhdGhzW2ldO1xuXHRcdFx0aWYgKCRpc0Z1bmN0aW9uKHBhdGgpKSB7XG5cdFx0XHRcdG91dCA9IG91dC5jb25jYXQocmVzb2x2ZVBhdGhPYmplY3RzKHBhdGguY2FsbChyb290LCByb290LCBjYWxsYmFjayksIHJvb3QpKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IGVsc2UgaWYgKFwiXCIgKyBwYXRoICE9PSBwYXRoKSB7XG5cdFx0XHRcdHJvb3QgPSBuZXh0T2JqID0gcGF0aDtcblx0XHRcdFx0aWYgKG5leHRPYmogIT09IG9iamVjdCkge1xuXHRcdFx0XHRcdG91dC5wdXNoKG9iamVjdCA9IG5leHRPYmopO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5leHRPYmogIT09IG9iamVjdCkge1xuXHRcdFx0XHRvdXQucHVzaChvYmplY3QgPSBuZXh0T2JqKTtcblx0XHRcdH1cblx0XHRcdG91dC5wdXNoKHBhdGgpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0O1xuXHR9LFxuXG5cdHJlbW92ZUNiQmluZGluZ3MgPSBmdW5jdGlvbihjYkJpbmRpbmdzLCBjYkJpbmRpbmdzSWQpIHtcblx0XHQvLyBJZiB0aGUgY2JCaW5kaW5ncyBjb2xsZWN0aW9uIGlzIGVtcHR5IHdlIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIGNiQmluZGluZ3NTdG9yZVxuXHRcdGZvciAodmFyIGNiIGluIGNiQmluZGluZ3MpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZGVsZXRlIGNiQmluZGluZ3NTdG9yZVtjYkJpbmRpbmdzSWRdOyAvLyBUaGlzIGJpbmRpbmcgY29sbGVjdGlvbiBpcyBlbXB0eSwgc28gcmVtb3ZlIGZyb20gc3RvcmVcblx0fSxcblxuXHRvbk9ic2VydmFibGVDaGFuZ2UgPSBmdW5jdGlvbihldiwgZXZlbnRBcmdzKSB7XG5cdFx0ZnVuY3Rpb24gaXNPYih2YWwpIHtcblx0XHRcdHJldHVybiB0eXBlb2YgdmFsID09PSBPQkpFQ1QgJiYgKHBhdGhzWzBdIHx8IGFsbG93QXJyYXkgJiYgJGlzQXJyYXkodmFsKSk7XG5cdFx0fVxuXG5cdFx0aWYgKCEoZXYuZGF0YSAmJiBldi5kYXRhLm9mZikpIHtcblx0XHRcdC8vIFNraXAgaWYgISFldi5kYXRhLm9mZjogLSBhIGhhbmRsZXIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgKG1heWJlIHdhcyBvbiBoYW5kbGVyIGNvbGxlY3Rpb24gYXQgY2FsbCB0aW1lIC0gdGhlbiByZW1vdmVkIGJ5IGFub3RoZXIgaGFuZGxlcilcblx0XHRcdHZhciBhbGxQYXRoLCBmaWx0ZXIsIHBhcmVudE9icyxcblx0XHRcdFx0b2xkVmFsdWUgPSBldmVudEFyZ3Mub2xkVmFsdWUsXG5cdFx0XHRcdHZhbHVlID0gZXZlbnRBcmdzLnZhbHVlLFxuXHRcdFx0XHRjdHggPSBldi5kYXRhLFxuXHRcdFx0XHRvYnNlcnZlQWxsID0gY3R4Lm9ic2VydmVBbGwsXG5cdFx0XHRcdGNiID0gY3R4LmNiLFxuXHRcdFx0XHRhbGxvd0FycmF5ID0gIWNiLm5vQXJyYXksXG5cdFx0XHRcdHBhdGhzID0gY3R4LnBhdGhzLFxuXHRcdFx0XHRucyA9IGN0eC5ucztcblxuXHRcdFx0aWYgKGV2LnR5cGUgPT09IGFycmF5Q2hhbmdlU3RyKSB7XG5cdFx0XHRcdChjYi5hcnJheSB8fCBjYikuY2FsbChjdHgsIGV2LCBldmVudEFyZ3MpOyAvLyBJZiB0aGVyZSBpcyBhbiBhcnJheUhhbmRsZXIgZXhwYW5kbyBvbiB0aGUgcmVndWxhciBoYW5kbGVyLCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIHJlZ3VsYXIgaGFuZGxlciBmb3IgYXJyYXlDaGFuZ2UgZXZlbnRzIGFsc28gLSBmb3IgZXhhbXBsZTogJC5vYnNlcnZlKGFycmF5LCBoYW5kbGVyKVxuXHRcdFx0XHQvLyBvciBvYnNlcnZlQWxsKCkgd2l0aCBhbiBhcnJheSBpbiB0aGUgZ3JhcGguIE5vdGUgdGhhdCBvbiBkYXRhLWxpbmsgYmluZGluZ3Mgd2UgZW5zdXJlIGFsd2F5cyB0byBoYXZlIGFuIGFycmF5IGhhbmRsZXIgLSAkLm5vb3AgaWYgbm9uZSBpcyBzcGVjaWZpZWQgZS5nLiBvbiB0aGUgZGF0YS1saW5rZWQgdGFnLlxuXHRcdFx0fSBlbHNlIGlmIChjdHgucHJvcCA9PT0gZXZlbnRBcmdzLnBhdGggfHwgY3R4LnByb3AgPT09IFwiKlwiKSB7XG5cdFx0XHRcdGlmIChvYnNlcnZlQWxsKSB7XG5cdFx0XHRcdFx0YWxsUGF0aCA9IG9ic2VydmVBbGwuX3BhdGggKyBcIi5cIiArIGV2ZW50QXJncy5wYXRoO1xuXHRcdFx0XHRcdGZpbHRlciA9IG9ic2VydmVBbGwuZmlsdGVyO1xuXHRcdFx0XHRcdHBhcmVudE9icyA9IFtldi50YXJnZXRdLmNvbmNhdChvYnNlcnZlQWxsLnBhcmVudHMoKSk7XG5cblx0XHRcdFx0XHRpZiAoaXNPYihvbGRWYWx1ZSkpIHtcblx0XHRcdFx0XHRcdG9ic2VydmVfYXBwbHkoYWxsb3dBcnJheSwgbnMsIFtvbGRWYWx1ZV0sIHBhdGhzLCBjYiwgdHJ1ZSwgZmlsdGVyLCBbcGFyZW50T2JzXSwgYWxsUGF0aCk7IC8vIHVub2JzZXJ2ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaXNPYih2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdG9ic2VydmVfYXBwbHkoYWxsb3dBcnJheSwgbnMsIFt2YWx1ZV0sIHBhdGhzLCBjYiwgdW5kZWZpbmVkLCBmaWx0ZXIsIFtwYXJlbnRPYnNdLCBhbGxQYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGlzT2Iob2xkVmFsdWUpKSB7IC8vIG9sZFZhbHVlIGlzIGFuIG9iamVjdCwgc28gdW5vYnNlcnZlXG5cdFx0XHRcdFx0XHRvYnNlcnZlX2FwcGx5KGFsbG93QXJyYXksIG5zLCBbb2xkVmFsdWVdLCBwYXRocywgY2IsIHRydWUpOyAvLyB1bm9ic2VydmVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGlzT2IodmFsdWUpKSB7IC8vIHZhbHVlIGlzIGFuIG9iamVjdCwgc28gb2JzZXJ2ZVxuXHRcdFx0XHRcdFx0b2JzZXJ2ZV9hcHBseShhbGxvd0FycmF5LCBucywgW3ZhbHVlXSwgcGF0aHMsIGNiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3R4LmNiKGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRvYnNlcnZlX2FwcGx5ID0gZnVuY3Rpb24oKSB7XG5cdFx0Ly8gJC5vYnNlcnZlKCksIGJ1dCBhbGxvd2luZyB5b3UgdG8gaW5jbHVkZSBhcnJheXMgd2l0aGluIHRoZSBhcmd1bWVudHMgLSB3aGljaCB5b3Ugd2FudCBmbGF0dGVuZWQuXG5cdFx0dmFyIGFyZ3MgPSBjb25jYXQuYXBwbHkoW10sIGFyZ3VtZW50cyk7IC8vIEZsYXR0ZW4gdGhlIGFyZ3VtZW50c1xuXHRcdHJldHVybiAkb2JzZXJ2ZS5hcHBseShhcmdzLnNoaWZ0KCksIGFyZ3MpO1xuXHR9LFxuXG5cdCRvYnNlcnZlQWxsID0gZnVuY3Rpb24oY2IsIGZpbHRlciwgdW5vYnNlcnZlKSB7XG5cdFx0b2JzZXJ2ZUFsbCh0aGlzLl9ucywgdGhpcy5fZGF0YSwgY2IsIGZpbHRlciwgW10sIFwicm9vdFwiLCB1bm9ic2VydmUpO1xuXHR9LFxuXG5cdCR1bm9ic2VydmVBbGwgPSBmdW5jdGlvbihjYiwgZmlsdGVyKSB7XG5cdFx0JG9ic2VydmVBbGwuY2FsbCh0aGlzLCBjYiwgZmlsdGVyLCB0cnVlKTtcblx0fSxcblxuXHRvYnNlcnZlQWxsID0gZnVuY3Rpb24obmFtZXNwYWNlLCBvYmplY3QsIGNiLCBmaWx0ZXIsIHBhcmVudE9icywgYWxsUGF0aCwgdW5vYnNlcnZlLCBvYmpNYXApIHtcblx0XHRmdW5jdGlvbiBvYnNlcnZlQXJyYXlJdGVtcyhhcnIsIHVub2JzKSB7XG5cdFx0XHRsID0gYXJyLmxlbmd0aDtcblx0XHRcdG5ld0FsbFBhdGggPSBhbGxQYXRoICsgXCJbXVwiO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRmaWx0ZXJBbmRPYnNlcnZlQWxsKGFyciwgbCwgdW5vYnMsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGZpbHRlckFuZE9ic2VydmVBbGwob2JqLCBwcm9wLCB1bm9icywgbmVzdGVkQXJyYXkpIHtcblx0XHRcdHZhciBuZXdPYmplY3QsIG5ld1BhcmVudE9icztcblx0XHRcdGlmIChwcm9wICE9PSAkZXhwYW5kbykge1xuXHRcdFx0XHRpZiAobmV3T2JqZWN0ID0gJG9ic2VydmFibGUuX2ZsdHIobmV3QWxsUGF0aCwgb2JqW3Byb3BdLCBuZXh0UGFyZW50T2JzLCBmaWx0ZXIpKSB7XG5cdFx0XHRcdFx0bmV3UGFyZW50T2JzID0gbmV4dFBhcmVudE9icy5zbGljZSgpO1xuXHRcdFx0XHRcdGlmIChuZXN0ZWRBcnJheSAmJiB1cGRhdGVkVGd0ICYmIG5ld1BhcmVudE9ic1swXSAhPT0gdXBkYXRlZFRndCkge1xuXHRcdFx0XHRcdFx0bmV3UGFyZW50T2JzLnVuc2hpZnQodXBkYXRlZFRndCk7IC8vIEZvciBhcnJheSBjaGFuZ2UgZXZlbnRzIHdoZW4gb2JzZXJ2aW5nIGFuIGFycmF5IHdoaWNoIGlzIG5vdCB0aGUgcm9vdCwgbmVlZCB0byBhZGQgdXBkYXRlZCBhcnJheSB0byBwYXJlbnRPYnNcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2JzZXJ2ZUFsbChuYW1lc3BhY2UsIG5ld09iamVjdCwgY2IsIGZpbHRlciB8fCAobmVzdGVkQXJyYXkgPyB1bmRlZmluZWQgOiAwKSwgbmV3UGFyZW50T2JzLCBuZXdBbGxQYXRoLCB1bm9icywgb2JqTWFwKTtcblx0XHRcdFx0XHQvLyBJZiBuZXN0ZWQgYXJyYXksIG5lZWQgdG8gb2JzZXJ2ZSB0aGUgYXJyYXkgdG9vIC0gc28gc2V0IGZpbHRlciB0byB1bmRlZmluZWRcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHdyYXBwZWRDYihldiwgZXZlbnRBcmdzKSB7XG5cdFx0XHQvLyBUaGlzIG9iamVjdCBpcyBjaGFuZ2luZy5cblx0XHRcdGFsbFBhdGggPSBldi5kYXRhLm9ic2VydmVBbGwuX3BhdGg7XG5cdFx0XHR1cGRhdGVkVGd0ID0gZXYudGFyZ2V0O1xuXHRcdFx0c3dpdGNoIChldmVudEFyZ3MuY2hhbmdlKSB7IC8vIG9ic2VydmVBbGwvdW5vYnNlcnZlQWxsIG9uIGFkZGVkIG9yIHJlbW92ZWQgb2JqZWN0c1xuXHRcdFx0XHRjYXNlIFwiaW5zZXJ0XCI6XG5cdFx0XHRcdFx0b2JzZXJ2ZUFycmF5SXRlbXMoZXZlbnRBcmdzLml0ZW1zKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcInJlbW92ZVwiOlxuXHRcdFx0XHRcdG9ic2VydmVBcnJheUl0ZW1zKGV2ZW50QXJncy5pdGVtcywgdHJ1ZSk7IC8vIHVub2JzZXJ2ZUFsbCBvbiByZW1vdmVkIGl0ZW1zXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJzZXRcIjpcblx0XHRcdFx0XHRuZXdBbGxQYXRoID0gYWxsUGF0aCArIFwiLlwiICsgZXZlbnRBcmdzLnBhdGg7XG5cdFx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChldmVudEFyZ3MsIFwib2xkVmFsdWVcIiwgdHJ1ZSk7IC8vIHVub2JzZXJ2ZSBvbGQgdmFsdWVcblx0XHRcdFx0XHRmaWx0ZXJBbmRPYnNlcnZlQWxsKGV2ZW50QXJncywgXCJ2YWx1ZVwiKTsgLy8gb2JzZXJ2ZSBuZXcgdmFsdWVcblx0XHRcdH1cblx0XHRcdHVwZGF0ZWRUZ3QgPSB1bmRlZmluZWQ7XG5cdFx0XHRjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBPYnNlcnZlIHRoaXMgb2JqZWN0IChpbnZva2UgdGhlIGNhbGxiYWNrKVxuXHRcdH1cblxuXHRcdHZhciBsLCBpc09iamVjdCwgbmV3QWxsUGF0aCwgbmV4dFBhcmVudE9icywgdXBkYXRlZFRndCwgb2JJZCxcblx0XHRcdG5vdFJlbW92aW5nID0gIW9iak1hcCB8fCBvYmpNYXAudW4gfHwgIXVub2JzZXJ2ZTsgLy8gdHJ1ZSB1bmxlc3MgaXQgaXMgYW4gb2JzZXJ2ZUFsbCBjYWxsIChub3QgdW5vYnNlcnZlQWxsKSBhbmQgd2UgYXJlIHJlbW92aW5nIGEgbGlzdGVuZXIgKG5vdCBhZGRpbmcgb25lKVxuXG5cdFx0aWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSBPQkpFQ1QpIHtcblx0XHRcdG5leHRQYXJlbnRPYnMgPSBbb2JqZWN0XS5jb25jYXQocGFyZW50T2JzKTsgLy8gVGhlIHBhcmVudE9icyBjaGFpbiBmb3IgdGhlIG5leHQgZGVwdGggb2Ygb2JzZXJ2ZUFsbFxuXHRcdFx0aXNPYmplY3QgPSAkaXNBcnJheShvYmplY3QpID8gXCJcIiA6IFwiKlwiO1xuXHRcdFx0aWYgKG9iak1hcCAmJiBub3RSZW1vdmluZyAmJiAkaGFzRGF0YShvYmplY3QpICYmIG9iak1hcFtvYklkID0gJGRhdGEob2JqZWN0KS5vYklkXSkge1xuXHRcdFx0XHRvYmpNYXBbb2JJZF0rKztcblx0XHRcdFx0cmV0dXJuOyAvLyBUaGlzIG9iamVjdCBoYXMgYWxyZWFkeSBiZWluZyBvYnNlcnZlZC91bm9ic2VydmVkIGJ5IHRoaXMgb2JzZXJ2ZUFsbC91bm9ic2VydmVBbGwgY2FsbCAobXVzdCBiZSBhIGN5Y2xpYyBvYmplY3QgZ3JhcGgpIHNvIHNraXAsIHRvIGF2b2lkXG5cdFx0XHRcdC8vIHN0YWNrIG92ZXJmbG93L211bHRpcGxlIGluc3RhbmNlcyBvZiBsaXN0ZW5lci4gU2VlIGpzdmlld3MvcHVsbC8zMDVcblx0XHRcdFx0Ly8gTk9URSAtIFdFIERPIE5PVCBzdXBwb3J0IE9ic2VydmVBbGwgb24gZGF0YSB3aXRoIGN5Y2xpYyBncmFwaHMgd2hpY2ggaW5jbHVkZSBEVVBMSUNBVEUgUkVGRVJFTkNFUyBUTyBBUlJBWSBQUk9QRVJUSUVTIC0gc3VjaCBhcyBkYXRhLmNoaWxkcmVuID0gZGF0YS5kZXNjZW5kYW50cyA9IFtdXG5cdFx0XHR9XG5cdFx0XHRpZiAoIW9iak1hcCkge1xuXHRcdFx0XHRvYmpNYXAgPSB7dW46IHVub2JzZXJ2ZX07IC8vIE1hcCBvYmplY3QgdG8gcmVnaXN0ZXIgb2JzZXJ2ZWQgb2JqZWN0cyBmb3IgdGhpcyBvYnNlcnZlQWxsXG5cdFx0XHR9XG5cblx0XHRcdGlmIChjYikge1xuXHRcdFx0XHQvLyBPYnNlcnZlIHRoaXMgb2JqZWN0IG9yIGFycmF5IC0gYW5kIGFsc28gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIG9iamVjdCBncmFwaCwgdG8gYWRkIG9yIHJlbW92ZSBvYnNlcnZlcnMgZnJvbSB0aGUgbW9kaWZpZWQgb2JqZWN0IGdyYXBoXG5cdFx0XHRcdGlmIChpc09iamVjdCB8fCBmaWx0ZXIgIT09IDApIHtcblx0XHRcdFx0XHQvLyBJZiBhbiBvYmplY3QsIG9ic2VydmUgdGhlIG9iamVjdC4gSWYgYW4gYXJyYXksIG9ubHkgYWRkIGFycmF5Q2hhbmdlIGJpbmRpbmcgaWYgaGFzIGZpbHRlciBvciBpZiBmaWx0ZXIgaXMgdW5kZWZpbmVkICghPT0gMCkgLSB3aGljaFxuXHRcdFx0XHRcdC8vIGlzIHRoZSBjYXNlIGZvciB0b3AtbGV2ZWwgY2FsbHMgb3IgZm9yIG5lc3RlZCBhcnJheSAoYXJyYXkgaXRlbSBvZiBhbiBhcnJheSAtIGUuZy4gbWVtYmVyIG9mIDItZGltZW5zaW9uYWwgYXJyYXkpLlxuXHRcdFx0XHRcdC8vIEZvciBhcnJheSBwcm9wZXJ0aWVzIGxvd2VyIGluIHRoZSB0cmVlLCB3aXRoIG5vIGZpbHRlciwgZmlsdGVyIGlzIHNldCB0byAwIGluIGZpbHRlckFuZE9ic2VydmVBbGwsIHNvIG5vIGFycmF5Q2hhbmdlIGJpbmRpbmcgaGVyZSxcblx0XHRcdFx0XHQvLyBzaW5jZSB0aGV5IGdldCBhcnJheUNoYW5nZSBiaW5kaW5nIGFkZGVkIGR1cmluZyByZWd1bGFyICQub2JzZXJ2ZShhcnJheSAuLi4pIGJpbmRpbmcuXG5cdFx0XHRcdFx0d3JhcHBlZENiLl9jSWQgPSBnZXRDYktleShjYik7IC8vIElkZW50aWZ5IHdyYXBwZWQgY2FsbGJhY2sgd2l0aCB1bndyYXBwZWQgY2FsbGJhY2ssIHNvIHVub2JzZXJ2ZUFsbCB3aWxsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBwcmV2aW91cyBvYnNlcnZlQWxsIHdyYXBwZWQgY2FsbGJhY2ssIGlmIGlubmVyIGNhbGxiYWNrIHdhcyB0aGUgc2FtZTtcblx0XHRcdFx0XHRpZiAobm90UmVtb3ZpbmcpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZlKG5hbWVzcGFjZSwgb2JqZWN0LCBpc09iamVjdCwgd3JhcHBlZENiLCB1bm9ic2VydmUsIGZpbHRlciwgbmV4dFBhcmVudE9icywgYWxsUGF0aCk7XG5cdFx0XHRcdFx0XHRvYklkID0gJGRhdGEob2JqZWN0KS5vYklkO1xuXHRcdFx0XHRcdFx0b2JqTWFwW29iSWRdID0gKG9iak1hcFtvYklkXSB8fCAwKSArIDE7IC8vIFJlZ2lzdGVyIG9uIG1hcCBvZiBvYmplY3RzIG9ic2VydmVkL3Vub2JzZXJ2ZWQgYnkgdGhpcyBvYnNlcnZlQWxsL3Vub2JzZXJ2ZUFsbCBjYWxsXG5cdFx0XHRcdFx0XHRcdC8vLSBvciByZW1vdmUgZnJvbSBtYXAgaWYgd2UgYXJlIHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gb2JzZXJ2ZUFsbCBjYWxsLiAoQXZvaWQgZHVwcywgZm9yIGN5Y2xpYyBncmFwaHMpXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICgtLW9iak1hcFskZGF0YShvYmplY3QpLm9iSWRdKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIG1hcCBvZiBvYmplY3RzIG9ic2VydmVkL3Vub2JzZXJ2ZWQgYnkgdGhpcyBvYnNlcnZlQWxsL3Vub2JzZXJ2ZUFsbCBjYWxsXG5cdFx0XHRcdFx0XHRcdC8vLSBvciByZW1vdmUgZnJvbSBtYXAgaWYgd2UgYXJlIHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gb2JzZXJ2ZUFsbCBjYWxsLiAoQXZvaWQgZHVwcywgZm9yIGN5Y2xpYyBncmFwaHMpXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCRvYnNlcnZlKG5hbWVzcGFjZSwgb2JqZWN0LCBpc09iamVjdCwgd3JhcHBlZENiLCB1bm9ic2VydmUsIGZpbHRlciwgbmV4dFBhcmVudE9icywgYWxsUGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBObyBjYWxsYmFjay4gSnVzdCB1bm9ic2VydmUgaWYgdW5vYnNlcnZlID09PSB0cnVlLlxuXHRcdFx0XHRpZiAob2JqTWFwKSB7XG5cdFx0XHRcdFx0b2JqTWFwWyRkYXRhKG9iamVjdCkub2JJZF0gPSAxOyAvLyBSZWdpc3RlciBvbiBtYXAgb2Ygb2JqZWN0cyB1bm9ic2VydmVkIGJ5IHRoaXMgdW5vYnNlcnZlQWxsIGNhbGwuIChBdm9pZCBkdXBzLCBmb3IgY3ljbGljIGdyYXBocylcblx0XHRcdFx0fVxuXHRcdFx0XHQkb2JzZXJ2ZShuYW1lc3BhY2UsIG9iamVjdCwgaXNPYmplY3QsIHVuZGVmaW5lZCwgdW5vYnNlcnZlLCBmaWx0ZXIsIG5leHRQYXJlbnRPYnMsIGFsbFBhdGgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPYmplY3QpIHtcblx0XHRcdFx0Ly8gQ29udGludWUgc3RlcHBpbmcgdGhyb3VnaCBvYmplY3QgZ3JhcGgsIG9ic2VydmluZyBvYmplY3QgYW5kIGFycmF5c1xuXHRcdFx0XHQvLyBUbyBvdmVycmlkZSBmaWx0ZXJpbmcsIHBhc3MgaW4gZmlsdGVyIGZ1bmN0aW9uLCBvciByZXBsYWNlICQub2JzZXJ2YWJsZS5fZmx0clxuXHRcdFx0XHRmb3IgKGwgaW4gb2JqZWN0KSB7XG5cdFx0XHRcdFx0bmV3QWxsUGF0aCA9IGFsbFBhdGggKyBcIi5cIiArIGw7XG5cdFx0XHRcdFx0ZmlsdGVyQW5kT2JzZXJ2ZUFsbChvYmplY3QsIGwsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7IC8vIE9ic2VydmUgaXRlbXMgaW4gQXJyYXlcblx0XHRcdFx0b2JzZXJ2ZUFycmF5SXRlbXMob2JqZWN0LCB1bm9ic2VydmUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRzaGFsbG93RmlsdGVyID0gZnVuY3Rpb24oYWxsUGF0aCAvKiwgb2JqZWN0LCBwYXJlbnRPYnMqLykge1xuXHRcdHJldHVybiBhbGxQYXRoLmluZGV4T2YoXCIuXCIpIDwgMCAmJiBhbGxQYXRoLmluZGV4T2YoXCJbXCIpIDwgMDtcblx0fSxcblxuXHQkdW5vYnNlcnZlID0gZnVuY3Rpb24oKSB7XG5cdFx0W10ucHVzaC5jYWxsKGFyZ3VtZW50cywgdHJ1ZSk7IC8vIEFkZCB0cnVlIGFzIGFkZGl0aW9uYWwgZmluYWwgYXJndW1lbnRcblx0XHRyZXR1cm4gJG9ic2VydmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0fTtcblxuXHQkb2JzZXJ2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vICQub2JzZXJ2ZShbbmFtZXNwYWNlLCBdcm9vdCwgWzEgb3IgbW9yZSBvYmplY3RzLCBwYXRoIG9yIHBhdGggQXJyYXkgcGFyYW1zLi4uXSwgY2FsbGJhY2tbLCBjb250ZXh0Q2FsbGJhY2tdWywgdW5vYnNlcnZlXSlcblxuXHRcdGZ1bmN0aW9uIGlubmVyT2JzZXJ2ZSgpIHtcblxuXHRcdFx0ZnVuY3Rpb24gb2JzZXJ2ZU9uT2ZmKG5hbWVzcGFjZSwgcGF0aFN0ciwgaXNBcnJheUJpbmRpbmcsIG9mZikge1xuXHRcdFx0XHR2YXIgaiwgZXZEYXRhLFxuXHRcdFx0XHRcdG9iSWRFeHBhbmRvID0gJGhhc0RhdGEob2JqZWN0KSxcblx0XHRcdFx0XHRib3VuZE9iT3JBcnIgPSB3cmFwQXJyYXkob2JqZWN0KSxcblx0XHRcdFx0XHRwcm50T2JzID0gcGFyZW50T2JzLFxuXHRcdFx0XHRcdGFsbFB0aCA9IGFsbFBhdGg7XG5cblx0XHRcdFx0bmFtZXNwYWNlID0gaW5pdGlhbE5zID8gbmFtZXNwYWNlICsgXCIuXCIgKyBpbml0aWFsTnMgOiBuYW1lc3BhY2U7XG5cblx0XHRcdFx0aWYgKCF1bm9ic2VydmUgJiYgKG9mZiB8fCBpc0FycmF5QmluZGluZykpIHtcblx0XHRcdFx0XHRldmVudHMgPSBvYklkRXhwYW5kbyAmJiAkLl9kYXRhKG9iamVjdCk7XG5cdFx0XHRcdFx0ZXZlbnRzID0gZXZlbnRzICYmIGV2ZW50cy5ldmVudHM7XG5cdFx0XHRcdFx0ZXZlbnRzID0gZXZlbnRzICYmIGV2ZW50c1tpc0FycmF5QmluZGluZyA/IGFycmF5Q2hhbmdlU3RyIDogcHJvcGVydHlDaGFuZ2VTdHJdO1xuXHRcdFx0XHRcdGVsID0gZXZlbnRzICYmIGV2ZW50cy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKGVsLS0pIHsgLy8gU2tpcCBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRkYXRhID0gZXZlbnRzW2VsXSAmJiBldmVudHNbZWxdLmRhdGE7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YSAmJiAob2ZmICYmIGRhdGEubnMgIT09IGluaXRpYWxOc1xuXHRcdFx0XHRcdFx0XHQvLyBXaGVuIG9ic2VydmluZywgZG9uJ3QgdW5iaW5kIGR1cHMgdW5sZXNzIHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2Vcblx0XHRcdFx0XHRcdFx0fHwgIW9mZiAmJiBkYXRhLm5zID09PSBpbml0aWFsTnMgJiYgZGF0YS5jYiAmJiBkYXRhLmNiLl9jSWQgPT09IGNhbGxiYWNrLl9jSWQpKVxuXHRcdFx0XHRcdFx0XHQvLyBXaGVuIG9ic2VydmluZyBhbmQgZG9pbmcgYXJyYXkgYmluZGluZywgZG9uJ3QgYmluZCBkdXBzIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgKER1cHMgY2FuIGhhcHBlbiBlLmcuIHdpdGgge157Zm9yIHBlb3BsZSB+Zm9vPXBlb3BsZX19KVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh1bm9ic2VydmUgfHwgb2ZmKSB7XG5cdFx0XHRcdFx0JChib3VuZE9iT3JBcnIpLm9mZihuYW1lc3BhY2UsIG9uT2JzZXJ2YWJsZUNoYW5nZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZXZEYXRhID0gaXNBcnJheUJpbmRpbmcgPyB7fVxuXHRcdFx0XHRcdFx0OiB7XG5cdFx0XHRcdFx0XHRcdGZ1bGxQYXRoOiBwYXRoLFxuXHRcdFx0XHRcdFx0XHRwYXRoczogcGF0aFN0ciA/IFtwYXRoU3RyXSA6IFtdLFxuXHRcdFx0XHRcdFx0XHRwcm9wOiBwcm9wXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGV2RGF0YS5ucyA9IGluaXRpYWxOcztcblx0XHRcdFx0XHRldkRhdGEuY2IgPSBjYWxsYmFjaztcblxuXHRcdFx0XHRcdGlmIChhbGxQYXRoKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuIG9ic2VydmVBbGwgY2FsbFxuXHRcdFx0XHRcdFx0ZXZEYXRhLm9ic2VydmVBbGwgPSB7XG5cdFx0XHRcdFx0XHRcdF9wYXRoOiBhbGxQdGgsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IGZ1bmN0aW9uKCkgeyAvLyBTdGVwIHRocm91Z2ggcGF0aCBhbmQgcGFyZW50T2JzIHBhcmVudCBjaGFpbiwgcmVwbGFjaW5nICdbXScgYnkgJ1tuXScgYmFzZWQgb24gY3VycmVudCBpbmRleCBvZiBvYmplY3RzIGluIHBhcmVudCBhcnJheXMuXG5cdFx0XHRcdFx0XHRcdFx0aiA9IHBybnRPYnMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhbGxQdGgucmVwbGFjZSgvW1suXS9nLCBmdW5jdGlvbihhbGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGotLTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBhbGwgPT09IFwiW1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gXCJbXCIgKyAkLmluQXJyYXkocHJudE9ic1tqIC0gMV0sIHBybnRPYnNbal0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogXCIuXCI7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHBhcmVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm50T2JzOyAvLyBUaGUgY2hhaW4gb2YgcGFyZW50cyBiZXR3ZWVuIHRoZSBtb2RpZmllZCBvYmplY3QgYW5kIHRoZSByb290IG9iamVjdCB1c2VkIGluIHRoZSBvYnNlcnZlQWxsKCkgY2FsbFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRmaWx0ZXI6IGZpbHRlclxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JChib3VuZE9iT3JBcnIpLm9uKG5hbWVzcGFjZSwgbnVsbCwgZXZEYXRhLCBvbk9ic2VydmFibGVDaGFuZ2UpO1xuXHRcdFx0XHRcdGlmIChjYkJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHQvLyBBZGQgb2JqZWN0IHRvIGNiQmluZGluZ3Ncblx0XHRcdFx0XHRcdGNiQmluZGluZ3NbJGRhdGEob2JqZWN0KS5vYklkIHx8ICRkYXRhKG9iamVjdCwgXCJvYklkXCIsIG9ic2VydmVPYmpLZXkrKyldID0gb2JqZWN0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBnZXRJbm5lckNiKGV4cHJPYikge1xuXHRcdFx0XHQvLyBSZXR1cm5zIHRoZSBpbm5lckNiIHVzZWQgZm9yIHVwZGF0aW5nIGEgY29tcHV0ZWQgaW4gYSBjb21waWxlZCBleHByZXNzaW9uIChzZXR0aW5nIHRoZSBuZXcgaW5zdGFuY2UgYXMgZXhwck9iLm9iLCB1bm9ic2VydmluZyB0aGUgcHJldmlvdXMgb2JqZWN0LFxuXHRcdFx0XHQvLyBhbmQgb2JzZXJ2aW5nIHRoZSBuZXcgb25lKSwgdGhlbiBjYWxsaW5nIHRoZSBvdXRlckNCIC0gaS5lLiB0aGUgaGFuZGxlciBmb3IgdGhlIHdob2xlIGNvbXBpbGVkIGV4cHJlc3Npb24uXG5cdFx0XHRcdC8vIEluaXRpYWxpemVkIGV4cHJPYi5vYiB0byB0aGUgY3VycmVudCBvYmplY3QuXG5cdFx0XHRcdC8vIFVzZXMgdGhlIGNvbnRleHRDYiBjYWxsYmFjayB0byBleGVjdXRlIHRoZSBjb21waWxlZCBleHByT2IgdGVtcGxhdGUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHZpZXcvZGF0YSBldGMuIHRvIGdldCB0aGUgcmV0dXJuZWQgdmFsdWUsIHR5cGljYWxseSBhbiBvYmplY3Qgb3IgYXJyYXkuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGFuIGFycmF5LCByZWdpc3RlcnMgYXJyYXkgYmluZGluZ1xuXHRcdFx0XHR2YXIgb3JpZ1J0ID0gcm9vdDtcblx0XHRcdFx0Ly8gTm90ZTogRm9yIGpzdmlld3MvaXNzdWVzLzI5MiBjdHhDYiB3aWxsIG5lZWQgdmFyIGN0eENiID0gY29udGV4dENiIHx8IGZ1bmN0aW9uKGV4cHJPYiwgb3JpZ1J0KSB7cmV0dXJuIGV4cHJPYi5fanN2KG9yaWdSdCk7fTtcblxuXHRcdFx0XHRleHByT2Iub2IgPSBjb250ZXh0Q2IoZXhwck9iLCBvcmlnUnQpOyAvLyBJbml0aWFsaXplIG9iamVjdFxuXG5cdFx0XHRcdHJldHVybiBleHByT2IuY2IgPSBmdW5jdGlvbihldiwgZXZlbnRBcmdzKSB7XG5cdFx0XHRcdFx0dmFyIG9iaiA9IGV4cHJPYi5vYiwgLy8gVGhlIG9sZCBvYmplY3Rcblx0XHRcdFx0XHRcdHN1YiA9IGV4cHJPYi5zYixcblx0XHRcdFx0XHRcdG5ld09iaiA9IGNvbnRleHRDYihleHByT2IsIG9yaWdSdCk7XG5cblx0XHRcdFx0XHRpZiAobmV3T2JqICE9PSBvYmopIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2Ygb2JqID09PSBPQkpFQ1QpIHtcblx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG9iaiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChzdWIgfHwgYWxsb3dBcnJheSAmJiAkaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtvYmpdLCBzdWIsIGNhbGxiYWNrLCBjb250ZXh0Q2IsIHRydWUpOyAvLyB1bm9ic2VydmUgb24gdGhlIG9sZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZXhwck9iLm9iID0gbmV3T2JqO1xuXHRcdFx0XHRcdFx0Ly8gUHV0IHRoZSB1cGRhdGVkIG9iamVjdCBpbnN0YW5jZSBvbnRvIHRoZSBleHByT2IgaW4gdGhlIHBhdGhzIGFycmF5LCBzbyBzdWJzZXF1ZW50IHN0cmluZyBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBvYmplY3Rcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgbmV3T2JqID09PSBPQkpFQ1QpIHtcblx0XHRcdFx0XHRcdFx0YmluZEFycmF5KG5ld09iaik7XG5cdFx0XHRcdFx0XHRcdGlmIChzdWIgfHwgYWxsb3dBcnJheSAmJiAkaXNBcnJheShuZXdPYmopKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgYXJyYXkgYmluZGluZ1xuXHRcdFx0XHRcdFx0XHRcdGlubmVyT2JzZXJ2ZShbbmV3T2JqXSwgc3ViLCBjYWxsYmFjaywgY29udGV4dENiKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBDYWxsIHRoZSBvdXRlckNiIC0gdG8gZXhlY3V0ZSB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbiB0aGF0IHRoaXMgY29tcHV0ZWQgaXMgcGFydCBvZlxuXHRcdFx0XHRcdGNhbGxiYWNrKGV2LCBldmVudEFyZ3MpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBiaW5kQXJyYXkoYXJyLCB1bmJpbmQsIGlzQXJyYXksIHJlbFBhdGgpIHtcblx0XHRcdFx0aWYgKGFsbG93QXJyYXkpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY2FsbCB0byBvYnNlcnZlIHRoYXQgZG9lcyBub3QgY29tZSBmcm9tIG9ic2VydmVBbmRCaW5kICh0YWcgYmluZGluZyksIHNvIHdlIGFsbG93IGFycmF5Q2hhbmdlIGJpbmRpbmdcblx0XHRcdFx0XHR2YXIgcHJldk9iaiA9IG9iamVjdCxcblx0XHRcdFx0XHRcdHByZXZBbGxQYXRoID0gYWxsUGF0aDtcblxuXHRcdFx0XHRcdG9iamVjdCA9IGFycjtcblx0XHRcdFx0XHRpZiAocmVsUGF0aCkge1xuXHRcdFx0XHRcdFx0b2JqZWN0ID0gYXJyW3JlbFBhdGhdO1xuXHRcdFx0XHRcdFx0YWxsUGF0aCArPSBcIi5cIiArIHJlbFBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChmaWx0ZXIgJiYgb2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRvYmplY3QgPSAkb2JzZXJ2YWJsZS5fZmx0cihhbGxQYXRoLCBvYmplY3QsIHJlbFBhdGggPyBbYXJyXS5jb25jYXQocGFyZW50T2JzKSA6IHBhcmVudE9icywgZmlsdGVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9iamVjdCAmJiAoaXNBcnJheSB8fCAkaXNBcnJheShvYmplY3QpKSkge1xuXHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKGFycmF5Q2hhbmdlU3RyICsgXCIub2JzZXJ2ZVwiICsgKGNhbGxiYWNrID8gZ2V0Q2JLZXkoY2FsbGJhY2spIDogXCJcIiksIHVuZGVmaW5lZCwgdHJ1ZSwgdW5iaW5kKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2JqZWN0ID0gcHJldk9iajtcblx0XHRcdFx0XHRhbGxQYXRoID0gcHJldkFsbFBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIGksIHAsIHNraXAsIHBhcnRzLCBwcm9wLCBwYXRoLCBkZXAsIHVub2JzZXJ2ZSwgY2FsbGJhY2ssIGNiSWQsIGluSWQsIGVsLCBkYXRhLCBldmVudHMsIGNvbnRleHRDYiwgaW5uZXJDb250ZXh0Q2IsXG5cdFx0XHRcdGl0ZW1zLCBjYkJpbmRpbmdzLCBkZXB0aCwgaW5uZXJDYiwgcGFyZW50T2JzLCBhbGxQYXRoLCBmaWx0ZXIsIGluaXROc0FyciwgaW5pdE5zQXJyTGVuLFxuXHRcdFx0XHRucyA9IG9ic2VydmVTdHIsXG5cdFx0XHRcdHBhdGhzID0gdGhpcyAhPSAxIC8vIFVzaW5nICE9IGZvciBJRTwxMCBidWctIHNlZSBqc3ZpZXdzL2lzc3Vlcy8yMzdcblx0XHRcdFx0XHQ/IGNvbmNhdC5hcHBseShbXSwgYXJndW1lbnRzKSAvLyBGbGF0dGVuIHRoZSBhcmd1bWVudHMgLSB0aGlzIGlzIGEgJ3JlY3Vyc2l2ZSBjYWxsJyB3aXRoIHBhcmFtcyB1c2luZyB0aGUgJ3dyYXBwZWQgYXJyYXknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHN0eWxlIC0gc3VjaCBhcyBpbm5lck9ic2VydmUoW29iamVjdF0sIHBhdGgucGF0aCwgW29yaWdSb290XSwgcGF0aC5wcm0sIGlubmVyQ2IsIC4uLik7XG5cdFx0XHRcdFx0OiBzbGljZS5jYWxsKGFyZ3VtZW50cyksIC8vIERvbid0IGZsYXR0ZW4gLSB0aGlzIGlzIHRoZSBmaXJzdCAndG9wLWxldmVsIGNhbGwsIHRvIGlubmVyT2JzZXJ2ZS5hcHBseSgxLCBwYXRocylcblx0XHRcdFx0bGFzdEFyZyA9IHBhdGhzLnBvcCgpIHx8IGZhbHNlLFxuXHRcdFx0XHRyb290ID0gcGF0aHMuc2hpZnQoKSxcblx0XHRcdFx0b2JqZWN0ID0gcm9vdCxcblx0XHRcdFx0bCA9IHBhdGhzLmxlbmd0aDtcblxuXHRcdFx0aWYgKGxhc3RBcmcgKyBcIlwiID09PSBsYXN0QXJnKSB7IC8vIElmIGxhc3QgYXJnIGlzIGEgc3RyaW5nIHRoZW4gdGhpcyBvYnNlcnZlIGNhbGwgaXMgcGFydCBvZiBhbiBvYnNlcnZlQWxsIGNhbGwsXG5cdFx0XHRcdGFsbFBhdGggPSBsYXN0QXJnOyAgICAgICAgICAvLyBhbmQgdGhlIGxhc3QgdGhyZWUgYXJncyBhcmUgdGhlIHBhcmVudE9icyBhcnJheSwgdGhlIGZpbHRlciwgYW5kIHRoZSBhbGxQYXRoIHN0cmluZy5cblx0XHRcdFx0cGFyZW50T2JzID0gcGF0aHMucG9wKCk7XG5cdFx0XHRcdGZpbHRlciA9IHBhdGhzLnBvcCgpO1xuXHRcdFx0XHRsYXN0QXJnID0gISFwYXRocy5wb3AoKTsgLy8gdW5vYnNlcnZlXG5cdFx0XHRcdGwgLT0gMztcblx0XHRcdH1cblx0XHRcdGlmIChsYXN0QXJnID09PSAhIWxhc3RBcmcpIHtcblx0XHRcdFx0dW5vYnNlcnZlID0gbGFzdEFyZztcblx0XHRcdFx0bGFzdEFyZyA9IHBhdGhzW2wtMV07XG5cdFx0XHRcdGxhc3RBcmcgPSBsICYmIGxhc3RBcmcgKyBcIlwiICE9PSBsYXN0QXJnICYmICghbGFzdEFyZyB8fCAkaXNGdW5jdGlvbihsYXN0QXJnKSkgPyAobC0tLCBwYXRocy5wb3AoKSkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICh1bm9ic2VydmUgJiYgIWwgJiYgJGlzRnVuY3Rpb24ocm9vdCkpIHtcblx0XHRcdFx0XHRsYXN0QXJnID0gcm9vdDtcblx0XHRcdFx0XHRyb290ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjYWxsYmFjayA9IGxhc3RBcmc7XG5cdFx0XHRpZiAobCAmJiAkaXNGdW5jdGlvbihwYXRoc1tsIC0gMV0pKSB7XG5cdFx0XHRcdGlubmVyQ29udGV4dENiID0gY29udGV4dENiID0gY2FsbGJhY2s7XG5cdFx0XHRcdGNhbGxiYWNrID0gcGF0aHMucG9wKCk7XG5cdFx0XHRcdGwtLTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHVub2JzZXJ2ZSAmJiBjYWxsYmFjayAmJiAhY2FsbGJhY2suX2NJZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZSBhIHVuaXF1ZSBuYW1lc3BhY2UgKGUuZy4gb2JzNykgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb2JzZXJ2ZSgpIGNhbGxiYWNrIHRvIGFsbG93IHVub2JzZXJ2ZSB0byByZW1vdmUgaGFuZGxlcnNcblx0XHRcdG5zICs9IGNhbGxiYWNrXG5cdFx0XHRcdD8gKChpbklkID0gY2FsbGJhY2suX2luSWQgfHwgXCJcIiksIHVub2JzZXJ2ZSlcblx0XHRcdFx0XHQ/IGNhbGxiYWNrLl9jSWQgKyBpbklkXG5cdFx0XHRcdFx0OiAoY2JJZCA9IGdldENiS2V5KGNhbGxiYWNrKSkgKyBpbklkXG5cdFx0XHRcdDogXCJcIjtcblxuXHRcdFx0aWYgKGNiSWQgJiYgIXVub2JzZXJ2ZSkge1xuXHRcdFx0XHRjYkJpbmRpbmdzID0gY2JCaW5kaW5nc1N0b3JlW2NiSWRdID0gY2JCaW5kaW5nc1N0b3JlW2NiSWRdIHx8IHt9O1xuXHRcdFx0fVxuXG5cdFx0XHRpbml0TnNBcnIgPSBpbml0aWFsTnMgJiYgaW5pdGlhbE5zLm1hdGNoKHJOb3RXaGl0ZSkgfHwgW1wiXCJdO1xuXHRcdFx0aW5pdE5zQXJyTGVuID0gaW5pdE5zQXJyLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKGluaXROc0Fyckxlbi0tKSB7XG5cdFx0XHRcdGluaXRpYWxOcyA9IGluaXROc0Fycltpbml0TnNBcnJMZW5dO1xuXHRcdFx0XHRpZiAocm9vdCAmJiAocGF0aCA9IHBhdGhzWzBdLCAhcGF0aCB8fCBwYXRoICsgXCJcIiAhPT0gcGF0aCkpIHtcblx0XHRcdFx0XHRpZiAoJGlzQXJyYXkocm9vdCkpIHtcblx0XHRcdFx0XHRcdGJpbmRBcnJheShyb290LCB1bm9ic2VydmUsIHRydWUpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodW5vYnNlcnZlKSB7XG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgb25PYnNlcnZhYmxlQ2hhbmdlIGhhbmRsZXJzIHRoYXQgd3JhcCB0aGF0IGNhbGxiYWNrXG5cdFx0XHRcdFx0XHRvYnNlcnZlT25PZmYobnMsIFwiXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodW5vYnNlcnZlICYmICFsICYmICFyb290KSB7IC8vIHVub2JzZXJ2ZSgpIC0gdW5vYnNlcnZlcyBhbGxcblx0XHRcdFx0XHRmb3IgKHAgaW4gY2JCaW5kaW5nc1N0b3JlKSB7XG5cdFx0XHRcdFx0XHRwID0gY2JCaW5kaW5nc1N0b3JlW3BdO1xuXHRcdFx0XHRcdFx0Zm9yIChkYXRhIGluIHApIHtcblx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gcFtkYXRhXTtcblx0XHRcdFx0XHRcdFx0aWYgKCRpc0FycmF5KG9iamVjdCkpIHtcblx0XHRcdFx0XHRcdFx0XHRiaW5kQXJyYXkob2JqZWN0LCB1bm9ic2VydmUsIHVub2JzZXJ2ZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIG9uT2JzZXJ2YWJsZUNoYW5nZSBoYW5kbGVycyB0aGF0IHdyYXAgdGhhdCBjYWxsYmFja1xuXHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVwdGggPSAwO1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0cGF0aCA9IHBhdGhzW2ldO1xuXHRcdFx0XHRcdGlmIChwYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5fY3ApIHsgLy8gQ29udGV4dHVhbCBwYXJhbWV0ZXJcblx0XHRcdFx0XHRcdGNvbnRleHRDYiA9ICRzdWIuX2djY2IocGF0aFswXSk7ICAgLy8gZ2V0Q29udGV4dENiOiBHZXQgY29udGV4dCBjYWxsYmFjayBmb3IgdGhlIGNvbnRleHR1YWwgdmlldyAod2hlcmUgY29udGV4dHVhbCBwYXJhbSBldmFsdWF0ZWQvYXNzaWduZWQpXG5cdFx0XHRcdFx0XHRvcmlnUm9vdCA9IHJvb3QgPSBwYXRoWzBdLmRhdGE7ICAgIC8vIENvbnRleHR1YWwgZGF0YVxuXHRcdFx0XHRcdFx0cGF0aCA9IHBhdGhbMV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9iamVjdCA9IHJvb3Q7XG5cdFx0XHRcdFx0aWYgKFwiXCIgKyBwYXRoID09PSBwYXRoKSB7XG5cdFx0XHRcdFx0XHQvLyBDb25zaWRlciBzdXBwb3J0IGZvciBjb21wdXRlZCBwYXRoczoganN2aWV3cy9pc3N1ZXMvMjkyXG5cdFx0XHRcdFx0XHQvL2lmICgvW1xcKFxcW1xcK10vLnRlc3QocGF0aCkpIHtcblx0XHRcdFx0XHRcdC8vXHR2YXIgYj17bGlua3M6e319LCB0ID0gJHN1Yi50bXBsRm4oXCJ7OlwiK3BhdGgrXCJ9XCIsIGIsIHRydWUpLCBpdGVtcyA9IHQucGF0aHNbMF07XG5cdFx0XHRcdFx0XHQvL1x0bCArPSBpdGVtcy5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0Ly9cdHNwbGljZS5hcHBseShwYXRocywgW2ktLSwgMV0uY29uY2F0KGl0ZW1zKSk7XG5cdFx0XHRcdFx0XHQvL1x0Y29udGludWU7XG5cdFx0XHRcdFx0XHQvL31cblx0XHRcdFx0XHRcdHBhcnRzID0gcGF0aC5zcGxpdChcIl5cIik7XG5cdFx0XHRcdFx0XHRpZiAocGFydHNbMV0pIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgYmluZCB0aGUgbGVhZiwgcGx1cyBhZGRpdGlvbmFsIG5vZGVzIGJhc2VkIG9uIGRlcHRoLlxuXHRcdFx0XHRcdFx0XHQvLyBcImEuYi5jXmQuZVwiIGlzIGRlcHRoIDIsIHNvIGxpc3RlbnMgdG8gY2hhbmdlcyBvZiBlLCBwbHVzIGNoYW5nZXMgb2YgZCBhbmQgb2YgY1xuXHRcdFx0XHRcdFx0XHRkZXB0aCA9IHBhcnRzWzBdLnNwbGl0KFwiLlwiKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdHBhdGggPSBwYXJ0cy5qb2luKFwiLlwiKTtcblx0XHRcdFx0XHRcdFx0ZGVwdGggPSBwYXRoLnNwbGl0KFwiLlwiKS5sZW5ndGggLSBkZXB0aDtcblx0XHRcdFx0XHRcdFx0Ly8gaWYgbW9yZSB0aGFuIG9uZSBeIGluIHRoZSBwYXRoLCB0aGUgZmlyc3Qgb25lIGRldGVybWluZXMgZGVwdGhcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChjb250ZXh0Q2IpIHtcblx0XHRcdFx0XHRcdFx0aXRlbXMgPSBjb250ZXh0Q2IocGF0aCwgcm9vdCwgZGVwdGgpO1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0Q2IgPSBpbm5lckNvbnRleHRDYjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChpdGVtcykge1xuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgYXJyYXkgb2Ygb2JqZWN0cyBhbmQgcGF0aHMgcmV0dXJuZWQgYnkgY29udGV4dENiIGlzIG5vbiBlbXB0eSwgaW5zZXJ0IHRoZW1cblx0XHRcdFx0XHRcdFx0Ly8gaW50byB0aGUgc2VxdWVuY2UsIHJlcGxhY2luZyB0aGUgY3VycmVudCBpdGVtIChwYXRoKS4gT3RoZXJ3aXNlIHNpbXBseSByZW1vdmUgY3VycmVudCBpdGVtIChwYXRoKVxuXHRcdFx0XHRcdFx0XHRsICs9IGl0ZW1zLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHRcdHNwbGljZS5hcHBseShwYXRocywgW2ktLSwgMV0uY29uY2F0KGl0ZW1zKSk7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCEkaXNGdW5jdGlvbihwYXRoKSkge1xuXHRcdFx0XHRcdFx0XHRpZiAocGF0aCAmJiBwYXRoLl9qc3YpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgY29tcGlsZWQgZnVuY3Rpb24gZm9yIGJpbmRpbmcgdG8gYW4gb2JqZWN0IHJldHVybmVkIGJ5IGEgaGVscGVyL2RhdGEgZnVuY3Rpb24uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2V0IGN1cnJlbnQgb2JqZWN0IG9uIGV4cHJPYi5vYiwgYW5kIGdldCBpbm5lckNiIGZvciB1cGRhdGluZyB0aGUgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdFx0aW5uZXJDYiA9IHVub2JzZXJ2ZSA/IHBhdGguY2IgOiBnZXRJbm5lckNiKHBhdGgpO1xuXHRcdFx0XHRcdFx0XHRcdGlubmVyQ2Iubm9BcnJheSA9ICFhbGxvd0FycmF5O1xuXHRcdFx0XHRcdFx0XHRcdC8vIGlubmVyQ2IuX2N0eCA9IGNhbGxiYWNrLl9jdHg7IENvdWxkIHBhc3MgY29udGV4dCAoZS5nLiBsaW5rQ3R4KSBmb3IgdXNlIGluIGEgZGVwZW5kcyA9IGZ1bmN0aW9uKCkge30gY2FsbCwgc28gZGVwZW5kcyBpcyBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBsaW5rQ3R4J3Ncblx0XHRcdFx0XHRcdFx0XHRpbm5lckNiLl9jSWQgPSBjYWxsYmFjay5fY0lkO1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNldCB0aGUgc2FtZSBjYkJpbmRpbmdzU3RvcmUga2V5IGFzIGZvciBjYWxsYmFjaywgc28gd2hlbiBjYWxsYmFjayBpcyBkaXNwb3NlZCwgZGlzcG9zYWwgb2YgaW5uZXJDYiBoYXBwZW5zIHRvby5cblx0XHRcdFx0XHRcdFx0XHRpbm5lckNiLl9pbklkID0gaW5uZXJDYi5faW5JZCB8fCBcIi5vYkluXCIgKyBvYnNlcnZlSW5uZXJDYktleSsrO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXRoLmJuZCB8fCBwYXRoLnBybSAmJiBwYXRoLnBybS5sZW5ndGggfHwgIXBhdGguc2IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBleHByT2IgaXMgYm91bmQgZS5nLiBmb28oKV5zdWIucGF0aCwgb3IgaGFzIHBhcmFtZXRlcnMgZS5nLiBmb28oYmFyKSBvciBpcyBhIGxlYWYgb2JqZWN0IChzbyBubyBzdWIgcGF0aCkgZS5nLiBmb28oKVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gdGhlbiBvYnNlcnZlIGNoYW5nZXMgb24gdGhlIG9iamVjdCwgb3IgaXRzIHBhcmFtZXRlcnMgYW5kIHN1Yi1wYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRpbm5lck9ic2VydmUoW29iamVjdF0sIHBhdGgucGF0aCwgW29yaWdSb290XSwgcGF0aC5wcm0sIGlubmVyQ2IsIGNvbnRleHRDYiwgdW5vYnNlcnZlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhdGguc2IpIHsgLy8gc3ViUGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJPYnNlcnZlKFtwYXRoLm9iXSwgcGF0aC5zYiwgY2FsbGJhY2ssIGNvbnRleHRDYiwgdW5vYnNlcnZlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cGF0aCA9IG9yaWdSb290O1xuXHRcdFx0XHRcdFx0XHRcdG9iamVjdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvYmplY3QgPSBwYXRoOyAvLyBGb3IgdG9wLWxldmVsIGNhbGxzLCBvYmplY3RzIGluIHRoZSBwYXRocyBhcnJheSBiZWNvbWUgdGhlIG9yaWdSb290IGZvciBzdWJzZXF1ZW50IHBhdGhzLlxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwYXJ0cyA9IFtyb290ID0gcGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlIChvYmplY3QgJiYgKHByb3AgPSBwYXJ0cy5zaGlmdCgpKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iamVjdCA9PT0gT0JKRUNUKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChcIlwiICsgcHJvcCA9PT0gcHJvcCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKChwYXJ0cy5sZW5ndGggPCBkZXB0aCArIDEpICYmICFvYmplY3Qubm9kZVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEFkZCBvYnNlcnZlciBmb3IgZWFjaCB0b2tlbiBpbiBwYXRoIHN0YXJ0aW5nIGF0IGRlcHRoLCBhbmQgb24gdG8gdGhlIGxlYWZcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghdW5vYnNlcnZlICYmIChldmVudHMgPSAkaGFzRGF0YShvYmplY3QpICYmICQuX2RhdGEob2JqZWN0KSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnRzID0gZXZlbnRzLmV2ZW50cztcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnRzID0gZXZlbnRzICYmIGV2ZW50c1twcm9wZXJ0eUNoYW5nZVN0cl07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVsID0gZXZlbnRzICYmIGV2ZW50cy5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNraXAgPSAwO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoZWwtLSkgeyAvLyBTa2lwIGR1cGxpY2F0ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhID0gZXZlbnRzW2VsXS5kYXRhO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChkYXRhXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQmJiBkYXRhLm5zID09PSBpbml0aWFsTnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCYmIGRhdGEuY2IuX2NJZCA9PT0gY2FsbGJhY2suX2NJZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JiYgZGF0YS5jYi5faW5JZCA9PT0gY2FsbGJhY2suX2luSWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCYmIChkYXRhLnByb3AgPT09IHByb3AgfHwgZGF0YS5wcm9wID09PSBcIipcIiB8fCBkYXRhLnByb3AgPT09IFwiKipcIikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwID0gcGFydHMuam9pbihcIi5cIikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YS5wYXRocy5wdXNoKHApOyAvLyBXZSB3aWxsIHNraXAgdGhpcyBiaW5kaW5nLCBidXQgaWYgaXQgaXMgbm90IGEgbGVhZiBiaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBuZWVkIHRvIGtlZXAgYmluZGluZ3MgZm9yIHJlc3Qgb2YgcGF0aCwgcmVhZHkgZm9yIGlmIHRoZSBvYmplY3QgZ2V0cyBzd2FwcGVkLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2tpcCsrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc2tpcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIER1cGxpY2F0ZSBiaW5kaW5nKHMpIGZvdW5kLCBzbyBtb3ZlIG9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0ID0gb2JqZWN0W3Byb3BdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocHJvcCA9PT0gXCIqXCIgfHwgcHJvcCA9PT0gXCIqKlwiKSB7IC8vIFwiKlwiID0+IGFsbCBwcm9wZXJ0aWVzLiBcIioqXCIgPT4gYWxsIHByb3BlcnRpZXMgYW5kIHN1Yi1wcm9wZXJ0aWVzIChpLmUuIGRlZXAgb2JzZXJ2ZUFsbCBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCF1bm9ic2VydmUgJiYgZXZlbnRzICYmIGV2ZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgYmluZGluZ3MsIHNpbmNlIHRoZXkgd2lsbCBiZSBkdXBsaWNhdGVzIHdpdGggXCIqXCIgb3IgXCIqKlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zLCBcIlwiLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHByb3AgPT09IFwiKlwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JzZXJ2ZU9uT2ZmKG5zLCBcIlwiKTsgLy8gb2JzZXJ2ZSB0aGUgb2JqZWN0IGZvciBhbnkgcHJvcGVydHkgY2hhbmdlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChwIGluIG9iamVjdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gb2JzZXJ2aW5nIFwiKlwiOiBTbyAoaW4gYWRkaXRpb24gdG8gbGlzdGVuaW5nIHRvIHByb3AgY2hhbmdlLCBhYm92ZSkgbGlzdGVuIHRvIGFycmF5Y2hhbmdlIG9uIHByb3BzIG9mIHR5cGUgYXJyYXlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwICE9PSAkZXhwYW5kbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiaW5kQXJyYXkob2JqZWN0LCB1bm9ic2VydmUsIHVuZGVmaW5lZCwgcCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCQub2JzZXJ2YWJsZShpbml0aWFsTnMsIG9iamVjdClbKHVub2JzZXJ2ZSA/IFwidW5cIiA6IFwiXCIpICsgXCJvYnNlcnZlQWxsXCJdKGNhbGxiYWNrKTsgLy8gb2JzZXJ2ZSBvciB1bm9ic2VydmUgdGhlIG9iamVjdCBmb3IgYW55IHByb3BlcnR5IGNoYW5nZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwcm9wKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucyArIFwiLnBfXCIgKyBwcm9wLCBwYXJ0cy5qb2luKFwiXlwiKSk7IC8vIEJ5IHVzaW5nIFwiXlwiIHJhdGhlciB0aGFuIFwiLlwiIHdlIGVuc3VyZSB0aGF0IGRlZXAgYmluZGluZyB3aWxsIGJlIHVzZWQgb24gbmV3bHkgaW5zZXJ0ZWQgb2JqZWN0IGdyYXBoc1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoYWxsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YWxsUGF0aCArPSBcIi5cIiArIHByb3A7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHByb3AgPSBvYmplY3RbcHJvcF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKCRpc0Z1bmN0aW9uKHByb3ApKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGRlcCA9IHByb3AuZGVwZW5kcykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGNvbXB1dGVkIG9ic2VydmFibGUuIFdlIHdpbGwgb2JzZXJ2ZSBhbnkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRpbm5lck9ic2VydmUoW29iamVjdF0sIHJlc29sdmVQYXRoT2JqZWN0cyhkZXAsIG9iamVjdCwgY2FsbGJhY2spLCBjYWxsYmFjaywgY29udGV4dENiLCB1bm9ic2VydmUpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvYmplY3QgPSBwcm9wO1xuXHRcdFx0XHRcdFx0XHRpZiAodW5vYnNlcnZlICYmIG9iamVjdCA9PT0gcm9vdCAmJiAoaT5sLTIgfHwgcGF0aHNbaSsxXSArIFwiXCIgIT09IHBhdGhzW2krMV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdW5vYnNlcnZlIGFsbCBoYW5kbGVycyBvZiBvYmplY3QsIGlmIG5vdCBmb2xsb3dlZCBieSBzdHJpbmcgcGF0aC5cblx0XHRcdFx0XHRcdFx0XHQvLyBlLmcuJC51bm9ic2VydmUob2JqZWN0MSwgb2JqZWN0MiwgXCJwYXRoXCIsIG9iamVjdDMpIHdpbGwgdW5vYnNlcnZlIGFsbCBmcm9tIG9iamVjdDEgYW5kIG9iamVjdDMsIGFuZCBqdXN0IFwicGF0aFwiIGxpc3RlbmVyIGZyb20gb2JqZWN0MlxuXHRcdFx0XHRcdFx0XHRcdG9ic2VydmVPbk9mZihucywgXCJcIik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YmluZEFycmF5KG9iamVjdCwgdW5vYnNlcnZlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGNiSWQpIHtcblx0XHRcdFx0cmVtb3ZlQ2JCaW5kaW5ncyhjYkJpbmRpbmdzLCBjYklkKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIHRoZSBjYkJpbmRpbmdzIHRvIHRoZSB0b3AtbGV2ZWwgY2FsbGVyLCBhbG9uZyB3aXRoIHRoZSBjYklkXG5cdFx0XHRyZXR1cm4ge2NiSWQ6IGNiSWQsIGJuZDogY2JCaW5kaW5nc307XG5cdFx0fVxuXG5cdFx0dmFyIGluaXRpYWxOcyxcblx0XHRcdGFsbG93QXJyYXkgPSB0aGlzICE9IGZhbHNlLCAvLyBJZiB0aGlzID09PSBmYWxzZSwgdGhpcyBpcyBhIGNhbGwgZnJvbSBvYnNlcnZlQW5kQmluZCAtIGRvaW5nIGJpbmRpbmcgb2YgZGF0YWxpbmsgZXhwcmVzc2lvbnMuIFdlIGRvbid0IGJpbmRcblx0XHRcdC8vIGFycmF5Q2hhbmdlIGV2ZW50cyBpbiB0aGlzIHNjZW5hcmlvLiBJbnN0ZWFkLCB7Xntmb3J9fSBhbmQgc2ltaWxhciBkbyBzcGVjaWZpYyBhcnJheUNoYW5nZSBiaW5kaW5nIHRvIHRoZSB0YWdDdHguYXJnc1swXSB2YWx1ZSwgaW4gb25BZnRlckxpbmsuXG5cdFx0XHQvLyBOb3RlIGRlbGliZXJhdGVseSB1c2luZyB0aGlzICE9IGZhbHNlLCByYXRoZXIgdGhhbiB0aGlzICE9PSBmYWxzZSBiZWNhdXNlIG9mIElFPDEwIGJ1Zy0gc2VlIGpzdmlld3MvaXNzdWVzLzIzN1xuXHRcdFx0cGF0aHMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyksXG5cdFx0XHRvcmlnUm9vdCA9IHBhdGhzWzBdO1xuXG5cdFx0aWYgKG9yaWdSb290ICsgXCJcIiA9PT0gb3JpZ1Jvb3QgJiYgYWxsb3dBcnJheSkge1xuXHRcdFx0aW5pdGlhbE5zID0gb3JpZ1Jvb3Q7IC8vIFRoZSBmaXJzdCBhcmcgaXMgYSBuYW1lc3BhY2UsIHNpbmNlIGl0IGlzIGEgc3RyaW5nLCBhbmQgdGhpcyBjYWxsIGlzIG5vdCBmcm9tIG9ic2VydmVBbmRCaW5kXG5cdFx0XHRwYXRocy5zaGlmdCgpO1xuXHRcdFx0b3JpZ1Jvb3QgPSBwYXRoc1swXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaW5uZXJPYnNlcnZlLmFwcGx5KDEsIHBhdGhzKTtcblx0fTtcblxuXHQkb2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKG5zLCBkYXRhKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGRhdGEgPSBucztcblx0XHRcdG5zID0gXCJcIjtcblx0XHR9XG5cdFx0cmV0dXJuICRpc0FycmF5KGRhdGEpXG5cdFx0XHQ/IG5ldyBBcnJheU9ic2VydmFibGUobnMsIGRhdGEpXG5cdFx0XHQ6IG5ldyBPYmplY3RPYnNlcnZhYmxlKG5zLCBkYXRhKTtcblx0fTtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQkc3ViLmdldERlcHMgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXJncyA9IGFyZ3VtZW50cztcblx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgYXJnLCBkZXAsXG5cdFx0XHRcdGRlcHMgPSBbXSxcblx0XHRcdFx0bCA9IGFyZ3MubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRhcmcgPSBhcmdzW2wtLV07XG5cdFx0XHRcdGRlcCA9IGFyZ3NbbF07XG5cdFx0XHRcdGlmIChkZXApIHtcblx0XHRcdFx0XHRkZXBzID0gZGVwcy5jb25jYXQoJGlzRnVuY3Rpb24oZGVwKSA/IGRlcChhcmcsIGFyZykgOiBkZXApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZGVwcztcblx0XHR9O1xuXHR9O1xuXG5cdCQub2JzZXJ2YWJsZSA9ICRvYnNlcnZhYmxlO1xuXHQkb2JzZXJ2YWJsZS5fZmx0ciA9IGZ1bmN0aW9uKGFsbFBhdGgsIG9iamVjdCwgcGFyZW50T2JzLCBmaWx0ZXIpIHtcblx0XHRpZiAoZmlsdGVyICYmICRpc0Z1bmN0aW9uKGZpbHRlcilcblx0XHRcdD8gZmlsdGVyKGFsbFBhdGgsIG9iamVjdCwgcGFyZW50T2JzKVxuXHRcdFx0OiB0cnVlIC8vIFRPRE8gQ29uc2lkZXIgc3VwcG9ydGluZyBmaWx0ZXIgYmVpbmcgYSBzdHJpbmcgb3Igc3RyaW5ncyB0byBkbyBSZWdFeCBmaWx0ZXJpbmcgYmFzZWQgb24ga2V5IGFuZC9vciBhbGxQYXRoXG5cdFx0KSB7XG5cdFx0XHRvYmplY3QgPSAkaXNGdW5jdGlvbihvYmplY3QpXG5cdFx0XHRcdD8gb2JqZWN0LnNldCAmJiBvYmplY3QuY2FsbChwYXJlbnRPYnNbMF0pIC8vIEl0IGlzIGEgZ2V0dGVyL3NldHRlclxuXHRcdFx0XHQ6IG9iamVjdDtcblx0XHRcdHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSBPQkpFQ1QgJiYgb2JqZWN0O1xuXHRcdH1cblx0fTtcblxuXHQkb2JzZXJ2YWJsZS5PYmplY3QgPSBPYmplY3RPYnNlcnZhYmxlO1xuXHQkb2JzZXJ2YWJsZS5BcnJheSA9IEFycmF5T2JzZXJ2YWJsZTtcblx0JC5vYnNlcnZlID0gJG9ic2VydmFibGUub2JzZXJ2ZSA9ICRvYnNlcnZlO1xuXHQkLnVub2JzZXJ2ZSA9ICRvYnNlcnZhYmxlLnVub2JzZXJ2ZSA9ICR1bm9ic2VydmU7XG5cdCRvYnNlcnZhYmxlLl9hcHBseSA9IG9ic2VydmVfYXBwbHk7XG5cblx0T2JqZWN0T2JzZXJ2YWJsZS5wcm90b3R5cGUgPSB7XG5cdFx0X2RhdGE6IG51bGwsXG5cblx0XHRvYnNlcnZlQWxsOiAkb2JzZXJ2ZUFsbCxcblx0XHR1bm9ic2VydmVBbGw6ICR1bm9ic2VydmVBbGwsXG5cblx0XHRkYXRhOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9kYXRhO1xuXHRcdH0sXG5cblx0XHRzZXRQcm9wZXJ0eTogZnVuY3Rpb24ocGF0aCwgdmFsdWUsIG5vblN0cmljdCkge1xuXHRcdFx0cGF0aCA9IHBhdGggfHwgXCJcIjtcblx0XHRcdHZhciBrZXksIHBhaXIsIHBhcnRzLFxuXHRcdFx0XHRtdWx0aSA9IHBhdGggKyBcIlwiICE9PSBwYXRoLFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0b2JqZWN0ID0gc2VsZi5fZGF0YTtcblxuXHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRpZiAobXVsdGkpIHtcblx0XHRcdFx0XHRub25TdHJpY3QgPSB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoJGlzQXJyYXkocGF0aCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgdGhlIGFycmF5IGZvcm1hdCBnZW5lcmF0ZWQgYnkgc2VyaWFsaXplQXJyYXkuIEhvd2V2ZXIsIHRoaXMgaGFzIHRoZSBwcm9ibGVtIHRoYXQgaXQgY29lcmNlcyB0eXBlcyB0byBzdHJpbmcsXG5cdFx0XHRcdFx0XHQvLyBhbmQgZG9lcyBub3QgcHJvdmlkZSBzaW1wbGUgc3VwcG9ydCBvZiBjb252ZXJ0VG8gYW5kIGNvbnZlcnRGcm9tIGZ1bmN0aW9ucy5cblx0XHRcdFx0XHRcdGtleSA9IHBhdGgubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGtleS0tKSB7XG5cdFx0XHRcdFx0XHRcdHBhaXIgPSBwYXRoW2tleV07XG5cdFx0XHRcdFx0XHRcdHNlbGYuc2V0UHJvcGVydHkocGFpci5uYW1lLCBwYWlyLnZhbHVlLCBub25TdHJpY3QgPT09IHVuZGVmaW5lZCB8fCBub25TdHJpY3QpOyAvL0lmIG5vblN0cmljdCBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0IHRvIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIE9iamVjdCByZXByZXNlbnRhdGlvbiB3aGVyZSBwcm9wZXJ0eSBuYW1lIGlzIHBhdGggYW5kIHByb3BlcnR5IHZhbHVlIGlzIHZhbHVlLlxuXHRcdFx0XHRcdFx0Zm9yIChrZXkgaW4gcGF0aCkge1xuXHRcdFx0XHRcdFx0XHRzZWxmLnNldFByb3BlcnR5KGtleSwgcGF0aFtrZXldLCBub25TdHJpY3QpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwYXRoICE9PSAkZXhwYW5kbykge1xuXHRcdFx0XHRcdC8vIFNpbXBsZSBzaW5nbGUgcHJvcGVydHkgY2FzZS5cblx0XHRcdFx0XHRwYXJ0cyA9IHBhdGguc3BsaXQoL1suXl0vKTtcblx0XHRcdFx0XHR3aGlsZSAob2JqZWN0ICYmIHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdG9iamVjdCA9IG9iamVjdFtwYXJ0cy5zaGlmdCgpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0XHRcdFx0c2VsZi5fc2V0UHJvcGVydHkob2JqZWN0LCBwYXJ0c1swXSwgdmFsdWUsIG5vblN0cmljdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc2VsZjtcblx0XHR9LFxuXG5cdFx0cmVtb3ZlUHJvcGVydHk6IGZ1bmN0aW9uKHBhdGgpIHtcblx0XHRcdHRoaXMuc2V0UHJvcGVydHkocGF0aCwgcmVtb3ZlKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfc2V0UHJvcGVydHk6IGZ1bmN0aW9uKGxlYWYsIHBhdGgsIHZhbHVlLCBub25TdHJpY3QpIHtcblx0XHRcdHZhciBzZXR0ZXIsIGdldHRlciwgcmVtb3ZlUHJvcCxcblx0XHRcdFx0cHJvcGVydHkgPSBwYXRoID8gbGVhZltwYXRoXSA6IGxlYWY7XG5cblx0XHRcdGlmICgkaXNGdW5jdGlvbihwcm9wZXJ0eSkpIHtcblx0XHRcdFx0aWYgKHByb3BlcnR5LnNldCkge1xuXHRcdFx0XHRcdC8vIENhc2Ugb2YgcHJvcGVydHkgc2V0dGVyL2dldHRlciAtIHdpdGggY29udmVudGlvbiB0aGF0IHByb3BlcnR5IGlzIGdldHRlciBhbmQgcHJvcGVydHkuc2V0IGlzIHNldHRlclxuXHRcdFx0XHRcdGxlYWYgPSBsZWFmLl93cnAgIC8vIENhc2Ugb2YgSnNWaWV3cyAyLXdheSBkYXRhLWxpbmtpbmcgdG8gYSBoZWxwZXIgZnVuY3Rpb24gYXMgZ2V0dGVyLCB3aXRoIGEgc2V0dGVyLlxuXHRcdFx0XHRcdFx0Ly8gVGhlIHZpZXcgd2lsbCBiZSB0aGUgdGhpcyBwb2ludGVyIGZvciBnZXR0ZXIgYW5kIHNldHRlci4gTm90ZTogdGhpcyBpcyB0aGUgb25lIHNjZW5hcmlvIHdoZXJlIHBhdGggaXMgXCJcIi5cblx0XHRcdFx0XHRcdHx8IGxlYWY7XG5cdFx0XHRcdFx0Z2V0dGVyID0gcHJvcGVydHk7XG5cdFx0XHRcdFx0c2V0dGVyID0gZ2V0dGVyLnNldCA9PT0gdHJ1ZSA/IGdldHRlciA6IGdldHRlci5zZXQ7XG5cdFx0XHRcdFx0cHJvcGVydHkgPSBnZXR0ZXIuY2FsbChsZWFmKTsgLy8gZ2V0IC0gb25seSB0cmVhdGVkIGFzIGdldHRlciBpZiBhbHNvIGEgc2V0dGVyLiBPdGhlcndpc2UgaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgb2YgdHlwZSBmdW5jdGlvbi4gU2VlIHVuaXQgdGVzdHMgJ0NhbiBvYnNlcnZlIHByb3BlcnRpZXMgb2YgdHlwZSBmdW5jdGlvbicuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BlcnR5ICE9PSB2YWx1ZSB8fCBub25TdHJpY3QgJiYgcHJvcGVydHkgIT0gdmFsdWUpIHsgLy8gT3B0aW9uYWwgbm9uLXN0cmljdCBlcXVhbGl0eSwgc2luY2Ugc2VyaWFsaXplQXJyYXksIGFuZCBmb3JtLWJhc2VkIGVkaXRvcnMgY2FuIG1hcCBudW1iZXJzIHRvIHN0cmluZ3MsIGV0Yy5cblx0XHRcdFx0Ly8gRGF0ZSBvYmplY3RzIGRvbid0IHN1cHBvcnQgIT0gY29tcGFyaXNvbi4gVHJlYXQgYXMgc3BlY2lhbCBjYXNlLlxuXHRcdFx0XHRpZiAoIShwcm9wZXJ0eSBpbnN0YW5jZW9mIERhdGUpIHx8IHByb3BlcnR5ID4gdmFsdWUgfHwgcHJvcGVydHkgPCB2YWx1ZSkge1xuXHRcdFx0XHRcdGlmIChzZXR0ZXIpIHtcblx0XHRcdFx0XHRcdHNldHRlci5jYWxsKGxlYWYsIHZhbHVlKTsgICAvL3NldFxuXHRcdFx0XHRcdFx0dmFsdWUgPSBnZXR0ZXIuY2FsbChsZWFmKTsgIC8vZ2V0IHVwZGF0ZWQgdmFsdWVcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHJlbW92ZVByb3AgPSB2YWx1ZSA9PT0gcmVtb3ZlKSB7XG5cdFx0XHRcdFx0XHRpZiAocHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgbGVhZltwYXRoXTtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gdW5kZWZpbmVkOyAvLyBJZiB2YWx1ZSB3YXMgYWxyZWFkeSB1bmRlZmluZWQsIGRvbid0IHRyaWdnZXIgaGFuZGxlciBmb3IgcmVtb3ZlUHJvcFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0bGVhZltwYXRoXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fdHJpZ2dlcihsZWFmLCB7Y2hhbmdlOiBcInNldFwiLCBwYXRoOiBwYXRoLCB2YWx1ZTogdmFsdWUsIG9sZFZhbHVlOiBwcm9wZXJ0eSwgcmVtb3ZlOiByZW1vdmVQcm9wfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdF90cmlnZ2VyOiBmdW5jdGlvbih0YXJnZXQsIGV2ZW50QXJncykge1xuXHRcdFx0JCh0YXJnZXQpLnRyaWdnZXJIYW5kbGVyKHByb3BlcnR5Q2hhbmdlU3RyICsgKHRoaXMuX25zID8gXCIuXCIgKyAvXlxcUysvLmV4ZWModGhpcy5fbnMpWzBdIDogXCJcIiksIGV2ZW50QXJncyk7IC8vIElmIHdoaXRlLXNwYWNlIHNlcGFyYXRlZCBuYW1lc3BhY2VzLCB1c2UgZmlyc3Qgb25lIG9ubHlcblx0XHR9XG5cdH07XG5cblx0QXJyYXlPYnNlcnZhYmxlLnByb3RvdHlwZSA9IHtcblx0XHRfZGF0YTogbnVsbCxcblxuXHRcdG9ic2VydmVBbGw6ICRvYnNlcnZlQWxsLFxuXHRcdHVub2JzZXJ2ZUFsbDogJHVub2JzZXJ2ZUFsbCxcblxuXHRcdGRhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2RhdGE7XG5cdFx0fSxcblxuXHRcdGluc2VydDogZnVuY3Rpb24oaW5kZXgsIGRhdGEpIHtcblx0XHRcdHZhciBfZGF0YSA9IHRoaXMuX2RhdGE7XG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRkYXRhID0gaW5kZXg7XG5cdFx0XHRcdGluZGV4ID0gX2RhdGEubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0aW5kZXggPSBQQVJTRUlOVChpbmRleCk7XG5cdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHRkYXRhID0gJGlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdO1xuXHRcdFx0XHQvLyBkYXRhIGNhbiBiZSBhIHNpbmdsZSBpdGVtIChpbmNsdWRpbmcgYSBudWxsL3VuZGVmaW5lZCB2YWx1ZSkgb3IgYW4gYXJyYXkgb2YgaXRlbXMuXG5cdFx0XHRcdC8vIE5vdGUgdGhlIHByb3ZpZGVkIGl0ZW1zIGFyZSBpbnNlcnRlZCB3aXRob3V0IGJlaW5nIGNsb25lZCwgYXMgZGlyZWN0IHJlZmVyZW5jZXMgdG8gdGhlIHByb3ZpZGVkIG9iamVjdHNcblxuXHRcdFx0XHRpZiAoZGF0YS5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9pbnNlcnQoaW5kZXgsIGRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X2luc2VydDogZnVuY3Rpb24oaW5kZXgsIGRhdGEpIHtcblx0XHRcdHZhciBfZGF0YSA9IHRoaXMuX2RhdGEsXG5cdFx0XHRcdG9sZExlbmd0aCA9IF9kYXRhLmxlbmd0aDtcblx0XHRcdGlmIChpbmRleCA+IG9sZExlbmd0aCkge1xuXHRcdFx0XHRpbmRleCA9IG9sZExlbmd0aDtcblx0XHRcdH1cblx0XHRcdHNwbGljZS5hcHBseShfZGF0YSwgW2luZGV4LCAwXS5jb25jYXQoZGF0YSkpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiBcImluc2VydFwiLCBpbmRleDogaW5kZXgsIGl0ZW1zOiBkYXRhfSwgb2xkTGVuZ3RoKTtcblx0XHR9LFxuXG5cdFx0cmVtb3ZlOiBmdW5jdGlvbihpbmRleCwgbnVtVG9SZW1vdmUpIHtcblx0XHRcdHZhciBpdGVtcyxcblx0XHRcdFx0X2RhdGEgPSB0aGlzLl9kYXRhO1xuXG5cdFx0XHRpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpbmRleCA9IF9kYXRhLmxlbmd0aCAtIDE7XG5cdFx0XHR9XG5cblx0XHRcdGluZGV4ID0gUEFSU0VJTlQoaW5kZXgpO1xuXHRcdFx0bnVtVG9SZW1vdmUgPSBudW1Ub1JlbW92ZSA/IFBBUlNFSU5UKG51bVRvUmVtb3ZlKSA6IG51bVRvUmVtb3ZlID09PSAwID8gMCA6IDE7IC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkOiByZW1vdmUgMVxuXHRcdFx0aWYgKG51bVRvUmVtb3ZlID4gMCAmJiBpbmRleCA+IC0xKSB7XG5cdFx0XHRcdGl0ZW1zID0gX2RhdGEuc2xpY2UoaW5kZXgsIGluZGV4ICsgbnVtVG9SZW1vdmUpO1xuXHRcdFx0XHRpZiAobnVtVG9SZW1vdmUgPSBpdGVtcy5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmUoaW5kZXgsIG51bVRvUmVtb3ZlLCBpdGVtcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHRfcmVtb3ZlOiBmdW5jdGlvbihpbmRleCwgbnVtVG9SZW1vdmUsIGl0ZW1zKSB7XG5cdFx0XHR2YXIgX2RhdGEgPSB0aGlzLl9kYXRhLFxuXHRcdFx0XHRvbGRMZW5ndGggPSBfZGF0YS5sZW5ndGg7XG5cblx0XHRcdF9kYXRhLnNwbGljZShpbmRleCwgbnVtVG9SZW1vdmUpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiBcInJlbW92ZVwiLCBpbmRleDogaW5kZXgsIGl0ZW1zOiBpdGVtc30sIG9sZExlbmd0aCk7XG5cdFx0fSxcblxuXHRcdG1vdmU6IGZ1bmN0aW9uKG9sZEluZGV4LCBuZXdJbmRleCwgbnVtVG9Nb3ZlKSB7XG5cdFx0XHRudW1Ub01vdmUgPSBudW1Ub01vdmUgPyBQQVJTRUlOVChudW1Ub01vdmUpIDogbnVtVG9Nb3ZlID09PSAwID8gMCA6IDE7IC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkOiBtb3ZlIDFcblx0XHRcdG9sZEluZGV4ID0gUEFSU0VJTlQob2xkSW5kZXgpO1xuXHRcdFx0bmV3SW5kZXggPSBQQVJTRUlOVChuZXdJbmRleCk7XG5cblx0XHRcdGlmIChudW1Ub01vdmUgPiAwICYmIG9sZEluZGV4ID4gLTEgJiYgbmV3SW5kZXggPiAtMSAmJiBvbGRJbmRleCAhPT0gbmV3SW5kZXgpIHtcblx0XHRcdFx0dGhpcy5fbW92ZShvbGRJbmRleCwgbmV3SW5kZXgsIG51bVRvTW92ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0X21vdmU6IGZ1bmN0aW9uKG9sZEluZGV4LCBuZXdJbmRleCwgbnVtVG9Nb3ZlKSB7XG5cdFx0XHR2YXIgaXRlbXMsXG5cdFx0XHRcdF9kYXRhID0gdGhpcy5fZGF0YSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gX2RhdGEubGVuZ3RoLFxuXHRcdFx0XHRleGNlc3MgPSBvbGRJbmRleCArIG51bVRvTW92ZSAtIG9sZExlbmd0aDtcblx0XHRcdGlmIChleGNlc3MgPiAwKSB7XG5cdFx0XHRcdG51bVRvTW92ZSAtPSBleGNlc3M7XG5cdFx0XHR9XG5cdFx0XHRpZiAobnVtVG9Nb3ZlKSB7XG5cdFx0XHRcdGl0ZW1zID0gX2RhdGEuc3BsaWNlKG9sZEluZGV4LCBudW1Ub01vdmUpOyAvLyByZW1vdmVcblx0XHRcdFx0aWYgKG5ld0luZGV4ID4gX2RhdGEubGVuZ3RoKSB7XG5cdFx0XHRcdFx0bmV3SW5kZXggPSBfZGF0YS5sZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3BsaWNlLmFwcGx5KF9kYXRhLCBbbmV3SW5kZXgsIDBdLmNvbmNhdChpdGVtcykpOyAvL3JlLWluc2VydFxuXHRcdFx0XHR0aGlzLl90cmlnZ2VyKHtjaGFuZ2U6IFwibW92ZVwiLCBvbGRJbmRleDogb2xkSW5kZXgsIGluZGV4OiBuZXdJbmRleCwgaXRlbXM6IGl0ZW1zfSwgb2xkTGVuZ3RoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0cmVmcmVzaDogZnVuY3Rpb24obmV3SXRlbXMsIHNvcnQpIHtcblx0XHRcdGZ1bmN0aW9uIGluc2VydEFkZGVkKCkge1xuXHRcdFx0XHRpZiAoaykge1xuXHRcdFx0XHRcdHNlbGYuaW5zZXJ0KGotaywgYWRkZWRJdGVtcyk7IC8vIE5vdCBmb3VuZCBpbiBvcmlnaW5hbCBhcnJheSAtIHNvIGluc2VydFxuXHRcdFx0XHRcdGRhdGFMZW5ndGggKz0gaztcblx0XHRcdFx0XHRpICs9IGs7XG5cdFx0XHRcdFx0ayA9IDA7XG5cdFx0XHRcdFx0YWRkZWRJdGVtcyA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciByZWZyZXNoIG9wZXJhdGlvbiB3ZSBpdGVyYXRpdmVseSBzdGVwIHRocm91Z2ggdGhlIHRhcmdldCBhcnJheSBhbmQgc29ydCBieSBtb3ZlL2FkZC9yZW1vdmUgb3BlcmF0aW9ucyBvbiB0aGUgc291cmNlIGFycmF5IHVudGlsIHRoZXkgbWF0Y2hcblx0XHRcdHZhciBpLCBqLCBrLCBuZXdJdGVtLCBudW0sXG5cdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRhZGRlZEl0ZW1zID0gW10sXG5cdFx0XHRcdGRhdGEgPSBzZWxmLl9kYXRhLFxuXHRcdFx0XHRvbGRJdGVtcyA9IGRhdGEuc2xpY2UoKSxcblx0XHRcdFx0b2xkTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG5cdFx0XHRcdGRhdGFMZW5ndGggPSBvbGRMZW5ndGgsXG5cdFx0XHRcdG5ld0xlbmd0aCA9IG5ld0l0ZW1zLmxlbmd0aDtcblx0XHRcdHNlbGYuX3NydCA9IHRydWU7IC8vIEZsYWcgZm9yIHNvcnRpbmcgZHVyaW5nIHJlZnJlc2hcblx0XHRcdGZvciAoaj1rPTA7IGo8bmV3TGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0aWYgKChuZXdJdGVtID0gbmV3SXRlbXNbal0pID09PSBkYXRhW2ota10pIHtcblx0XHRcdFx0XHRcdGluc2VydEFkZGVkKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9yIChpPWotazsgaTxkYXRhTGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGlmIChuZXdJdGVtID09PSBkYXRhW2ldKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaTxkYXRhTGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRpbnNlcnRBZGRlZCgpO1xuXHRcdFx0XHRcdFx0bnVtID0gMDtcblx0XHRcdFx0XHRcdHdoaWxlIChudW0rKyA8IG5ld0xlbmd0aC1pICYmIG5ld0l0ZW1zW2orbnVtXSA9PT0gZGF0YVtpK251bV0pO1xuXHRcdFx0XHRcdFx0c2VsZi5tb3ZlKGksIGosIG51bSk7IC8vIEZvdW5kIG5ld0l0ZW0gaW4gb3JpZ2luYWwgYXJyYXkgLSBzbyBtb3ZlIGl0IHRvIG5ldyBwb3NpdGlvblxuXHRcdFx0XHRcdFx0aiArPSBudW0gLSAxO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRrKys7XG5cdFx0XHRcdFx0XHRhZGRlZEl0ZW1zLnB1c2gobmV3SXRlbSk7IC8vIE5vdCBmb3VuZCBpbiBvcmlnaW5hbCBhcnJheSAtIHNvIGluc2VydFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aW5zZXJ0QWRkZWQoKTtcblx0XHRcdGlmIChkYXRhTGVuZ3RoID4gaikge1xuXHRcdFx0XHRzZWxmLnJlbW92ZShqLCBkYXRhTGVuZ3RoIC0gaik7XG5cdFx0XHR9XG5cdFx0XHRzZWxmLl9zcnQgPSB1bmRlZmluZWQ7IC8vIFdlIGhhdmUgZmluaXNoZWQgc29ydCBvcGVyYXRpb25zIGR1cmluZyByZWZyZXNoXG5cdFx0XHRzZWxmLl90cmlnZ2VyKHtjaGFuZ2U6IFwicmVmcmVzaFwiLCBvbGRJdGVtczogb2xkSXRlbXN9LCBvbGRMZW5ndGgpO1xuXHRcdFx0cmV0dXJuIHNlbGY7XG5cdFx0fSxcblxuXHRcdF90cmlnZ2VyOiBmdW5jdGlvbihldmVudEFyZ3MsIG9sZExlbmd0aCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRfZGF0YSA9IHNlbGYuX2RhdGEsXG5cdFx0XHRcdGxlbmd0aCA9IF9kYXRhLmxlbmd0aCxcblx0XHRcdFx0JF9kYXRhID0gJChbX2RhdGFdKTtcblx0XHRcdGlmIChzZWxmLl9zcnQpIHtcblx0XHRcdFx0ZXZlbnRBcmdzLnJlZnJlc2ggPSB0cnVlOyAvLyBXZSBhcmUgc29ydGluZyBkdXJpbmcgcmVmcmVzaFxuXHRcdFx0fSBlbHNlIGlmIChsZW5ndGggIT09IG9sZExlbmd0aCkgeyAgLy8gV2UgaGF2ZSBmaW5pc2hlZCBzb3J0IG9wZXJhdGlvbnMgZHVyaW5nIHJlZnJlc2hcblx0XHRcdFx0JF9kYXRhLnRyaWdnZXJIYW5kbGVyKHByb3BlcnR5Q2hhbmdlU3RyLCB7Y2hhbmdlOiBcInNldFwiLCBwYXRoOiBcImxlbmd0aFwiLCB2YWx1ZTogbGVuZ3RoLCBvbGRWYWx1ZTogb2xkTGVuZ3RofSk7XG5cdFx0XHR9XG5cdFx0XHQkX2RhdGEudHJpZ2dlckhhbmRsZXIoYXJyYXlDaGFuZ2VTdHIgKyAoc2VsZi5fbnMgPyBcIi5cIiArIC9eXFxTKy8uZXhlYyhzZWxmLl9ucylbMF0gOiBcIlwiKSwgZXZlbnRBcmdzKTsgLy8gSWYgd2hpdGUtc3BhY2Ugc2VwYXJhdGVkIG5hbWVzcGFjZXMsIHVzZSBmaXJzdCBvbmUgb25seVxuXHRcdH1cblx0fTtcblxuXHQkZXZlbnRTcGVjaWFsW3Byb3BlcnR5Q2hhbmdlU3RyXSA9ICRldmVudFNwZWNpYWxbYXJyYXlDaGFuZ2VTdHJdID0ge1xuXHRcdC8vIFJlZ2lzdGVyIGEgalF1ZXJ5IHNwZWNpYWwgJ3JlbW92ZScgZXZlbnQsIHRvIGFjY2VzcyB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggaGFuZGxlcnMgYmVpbmcgcmVtb3ZlZCBieSBqUXVlcnkub2ZmKCkuXG5cdFx0Ly8gV2UgZ2V0IGRhdGEuY2IuX2NJZCBmcm9tIHRoZSBldmVudCBoYW5kbGVPYmogYW5kIGdldCB0aGUgY29ycmVzcG9uZGluZyBjYkJpbmRpbmdzIGhhc2ggZnJvbSB0aGUgY2JCaW5kaW5nc1N0b3JlLFxuXHRcdC8vIHRoZW4gcmVtb3ZlIHRoaXMgb2JqZWN0IGZyb20gdGhhdCBiaW5kaW5ncyBoYXNoIC0gaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBoYW5kbGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgY2FsbGJhY2suXG5cdFx0cmVtb3ZlOiBmdW5jdGlvbiAoaGFuZGxlT2JqKSB7XG5cdFx0XHR2YXIgY2JCaW5kaW5ncywgZm91bmQsIGV2ZW50cywgbCwgZGF0YSxcblx0XHRcdFx0ZXZEYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cdFx0XHRpZiAoKGV2RGF0YSkgJiYgKGV2RGF0YS5vZmYgPSB0cnVlLCBldkRhdGEgPSBldkRhdGEuY2IpKSB7IC8vU2V0IG9mZiA9IHRydWUgYXMgbWFya2VyIGZvciBkaXNwb3NlZCBldmVudFxuXHRcdFx0XHQvLyBHZXQgdGhlIGNiLl9jSWQgZnJvbSBoYW5kbGVPYmouZGF0YS5jYi5fY0lkXG5cdFx0XHRcdGlmIChjYkJpbmRpbmdzID0gY2JCaW5kaW5nc1N0b3JlW2V2RGF0YS5fY0lkXSkge1xuXHRcdFx0XHRcdC8vIFRoZXJlIHdlcmUgYmluZGluZ3MgZm9yIHRoaXMgY2FsbGJhY2suIElmIHRoaXMgd2FzIHRoZSBsYXN0IG9uZSwgd2UnbGwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEodGhpcykuZXZlbnRzW2hhbmRsZU9iai50eXBlXTtcblx0XHRcdFx0XHRsID0gZXZlbnRzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAobC0tICYmICFmb3VuZCkge1xuXHRcdFx0XHRcdFx0Zm91bmQgPSAoZGF0YSA9IGV2ZW50c1tsXS5kYXRhKSAmJiBkYXRhLmNiICYmIGRhdGEuY2IuX2NJZCA9PT0gZXZEYXRhLl9jSWQ7XG5cdFx0XHRcdFx0XHQvLyBGb3VuZCBhbm90aGVyIG9uZSB3aXRoIHNhbWUgY2FsbGJhY2sgKHRob3VnaCBtYXkgYmUgYSBkaWZmZXJlbnQgaW5uZXJDYWxsYmFjaylcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyB3YXMgdGhlIGxhc3QgaGFuZGxlciBmb3IgdGhpcyBjYWxsYmFjayBhbmQgb2JqZWN0LCBzbyByZW1vdmUgdGhlIGJpbmRpbmcgZW50cnlcblx0XHRcdFx0XHRcdGRlbGV0ZSBjYkJpbmRpbmdzWyRkYXRhKHRoaXMpLm9iSWRdO1xuXHRcdFx0XHRcdFx0cmVtb3ZlQ2JCaW5kaW5ncyhjYkJpbmRpbmdzLCBldkRhdGEuX2NJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdCR2aWV3cy5tYXAgPSBmdW5jdGlvbihtYXBEZWYpIHtcblx0XHRmdW5jdGlvbiBNYXAoc291cmNlLCBvcHRpb25zLCB0YXJnZXQsIHVuYm91bmQpIHtcblx0XHRcdHZhciBjaGFuZ2luZyxcblx0XHRcdFx0bWFwID0gdGhpcztcblx0XHRcdGlmICh0aGlzLnNyYykge1xuXHRcdFx0XHR0aGlzLnVubWFwKCk7IC8vIFdlIGFyZSByZS1tYXBwaW5nIGEgbmV3IHNvdXJjZVxuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IE9CSkVDVCkge1xuXHRcdFx0XHRtYXAuc3JjID0gc291cmNlO1xuXHRcdFx0XHRtYXAudGd0ID0gdGFyZ2V0IHx8IG1hcC50Z3QgfHwgW107XG5cdFx0XHRcdG1hcC5vcHRpb25zID0gb3B0aW9ucyB8fCBtYXAub3B0aW9ucztcblx0XHRcdFx0bWFwLnVwZGF0ZSgpO1xuXHRcdFx0XHRpZiAoIXVuYm91bmQpIHtcblx0XHRcdFx0XHRpZiAobWFwRGVmLm9ic1NyYykge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnNyYykub2JzZXJ2ZUFsbChtYXAub2JzID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdFx0XHRpZiAoIWNoYW5naW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdG1hcERlZi5vYnNTcmMobWFwLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgbWFwLnNyY0ZsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChtYXBEZWYub2JzVGd0ICkge1xuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUobWFwLnRndCkub2JzZXJ2ZUFsbChtYXAub2J0ID0gZnVuY3Rpb24oZXYsIGV2ZW50QXJncykge1xuXHRcdFx0XHRcdFx0aWYgKCFjaGFuZ2luZykge1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2luZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG1hcERlZi5vYnNUZ3QobWFwLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdFx0Y2hhbmdpbmcgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LCBtYXAudGd0Rmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoJGlzRnVuY3Rpb24obWFwRGVmKSkge1xuXHRcdFx0Ly8gU2ltcGxlIG1hcCBkZWNsYXJlZCBhcyBmdW5jdGlvblxuXHRcdFx0bWFwRGVmID0ge1xuXHRcdFx0XHRnZXRUZ3Q6IG1hcERlZlxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAobWFwRGVmLmJhc2VNYXApIHtcblx0XHRcdG1hcERlZiA9ICQuZXh0ZW5kKHt9LCBtYXBEZWYuYmFzZU1hcCwgbWFwRGVmKTtcblx0XHR9XG5cblx0XHRtYXBEZWYubWFwID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zLCB0YXJnZXQsIHVuYm91bmQpIHtcblx0XHRcdHJldHVybiBuZXcgTWFwKHNvdXJjZSwgb3B0aW9ucywgdGFyZ2V0LCB1bmJvdW5kKTtcblx0XHR9O1xuXG5cdFx0KE1hcC5wcm90b3R5cGUgPSB7XG5cdFx0XHRzcmNGbHQ6IG1hcERlZi5zcmNGbHQgfHwgc2hhbGxvd0ZpbHRlciwgLy8gZGVmYXVsdCB0byBzaGFsbG93RmlsdGVyXG5cdFx0XHR0Z3RGbHQ6IG1hcERlZi50Z3RGbHQgfHwgc2hhbGxvd0ZpbHRlcixcblx0XHRcdHVwZGF0ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdFx0XHR2YXIgbWFwID0gdGhpcztcblx0XHRcdFx0JG9ic2VydmFibGUobWFwLnRndCkucmVmcmVzaChtYXBEZWYuZ2V0VGd0KG1hcC5zcmMsIG1hcC5vcHRpb25zID0gb3B0aW9ucyB8fCBtYXAub3B0aW9ucykpO1xuXHRcdFx0fSxcblx0XHRcdHVubWFwOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG1hcCA9IHRoaXM7XG5cdFx0XHRcdGlmIChtYXAuc3JjKSB7XG5cdFx0XHRcdFx0aWYgKG1hcC5vYnMpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC5zcmMpLnVub2JzZXJ2ZUFsbChtYXAub2JzLCBtYXAuc3JjRmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG1hcC5vYnQpIHtcblx0XHRcdFx0XHRcdCRvYnNlcnZhYmxlKG1hcC50Z3QpLnVub2JzZXJ2ZUFsbChtYXAub2J0LCBtYXAudGd0Rmx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bWFwLnNyYyA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG1hcDogTWFwLFxuXHRcdFx0X2RlZjogbWFwRGVmXG5cdFx0fSkuY29uc3RydWN0b3IgPSBNYXA7XG5cblx0XHRyZXR1cm4gbWFwRGVmO1xuXHR9O1xuXG5cdCRzdWIuYWR2U2V0ID0gZnVuY3Rpb24oKSB7IC8vIHJlZnJlc2ggYWR2YW5jZWQgc2V0dGluZ3Ncblx0XHQkc3ViLl9nY2NiID0gdGhpcy5fZ2NjYjsgLy8gZ2V0Q29udGV4dENhbGxiYWNrIG1ldGhvZFxuXHRcdGdsb2JhbC5fanN2ID0gJHN1YlNldHRpbmdzLmFkdmFuY2VkLl9qc3Zcblx0XHRcdD8geyAvLyBjcmVhdGUgZ2xvYmFsIF9qc3YsIGZvciBhY2Nlc3Npbmcgdmlld3MsIGV0Y1xuXHRcdFx0XHRcdGNiQmluZGluZ3M6IGNiQmluZGluZ3NTdG9yZVxuXHRcdFx0XHR9XG5cdFx0XHQ6IHVuZGVmaW5lZDsgLy8gSW4gSUU4IGNhbm5vdCBkbyBkZWxldGUgZ2xvYmFsLl9qc3Zcblx0fTtcbn1cblxuLy88PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwgSnNWaWV3cyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbi8qIEpzVmlld3M6XG4gKiBJbnRlcmFjdGl2ZSBkYXRhLWRyaXZlbiB2aWV3cyB1c2luZyB0ZW1wbGF0ZXMgYW5kIGRhdGEtbGlua2luZy5cbiAqIFNlZSBodHRwOi8vd3d3Lmpzdmlld3MuY29tLyNqc3ZpZXdzIGFuZCBodHRwOi8vZ2l0aHViLmNvbS9Cb3Jpc01vb3JlL2pzdmlld3NcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuJHZpZXdzU2V0dGluZ3MgPSAkdmlld3Muc2V0dGluZ3M7XG4kc3ViU2V0dGluZ3MgPSAkc3ViLnNldHRpbmdzO1xuJHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQ7XG4kY29udmVydGVycyA9ICR2aWV3cy5jb252ZXJ0ZXJzO1xuJC50ZW1wbGF0ZXMgPSAkdGVtcGxhdGVzID0gJHZpZXdzLnRlbXBsYXRlcztcbiR0YWdzID0gJHZpZXdzLnRhZ3M7XG5yRmlyc3RFbGVtID0gLzwoPyFzY3JpcHQpKFxcdyspWz5cXHNdLztcblxuaWYgKCQubGluaykgeyByZXR1cm4gJDsgfSAvLyBKc1ZpZXdzIGlzIGFscmVhZHkgbG9hZGVkXG5cbiRzdWJTZXR0aW5ncy50cmlnZ2VyID0gdHJ1ZTtcbnZhciBhY3RpdmVCb2R5LCByVGFnRGF0YWxpbmssICR2aWV3LCAkdmlld3NMaW5rQXR0ciwgbGlua1ZpZXdzU2VsLCB3cmFwTWFwLCB2aWV3U3RvcmUsIG9sZEFkdlNldCxcblx0anN2QXR0clN0ciA9IFwiZGF0YS1qc3ZcIixcblx0ZWxlbWVudENoYW5nZVN0ciA9IFwiY2hhbmdlLmpzdlwiLFxuXHRvbkJlZm9yZUNoYW5nZVN0ciA9IFwib25CZWZvcmVDaGFuZ2VcIixcblx0b25BZnRlckNoYW5nZVN0ciA9IFwib25BZnRlckNoYW5nZVwiLFxuXHRvbkFmdGVyQ3JlYXRlU3RyID0gXCJvbkFmdGVyQ3JlYXRlXCIsXG5cdENIRUNLRUQgPSBcImNoZWNrZWRcIixcblx0Q0hFQ0tCT1ggPSBcImNoZWNrYm94XCIsXG5cdFJBRElPID0gXCJyYWRpb1wiLFxuXHROT05FID0gXCJub25lXCIsXG5cdFNDUklQVCA9IFwiU0NSSVBUXCIsXG5cdFRSVUUgPSBcInRydWVcIixcblx0Y2xvc2VTY3JpcHQgPSAnXCI+PC9zY3JpcHQ+Jyxcblx0b3BlblNjcmlwdCA9ICc8c2NyaXB0IHR5cGU9XCJqc3YnLFxuXHRkZWZlckF0dHIgPSBqc3ZBdHRyU3RyICsgXCItZGZcIixcblx0YmluZEVsc1NlbCA9IFwic2NyaXB0LFtcIiArIGpzdkF0dHJTdHIgKyBcIl1cIixcblx0Zm5TZXR0ZXJzID0ge1xuXHRcdHZhbHVlOiBcInZhbFwiLFxuXHRcdGlucHV0OiBcInZhbFwiLFxuXHRcdGh0bWw6IEhUTUwsXG5cdFx0dGV4dDogXCJ0ZXh0XCJcblx0fSxcblx0dmFsdWVCaW5kaW5nID0ge2Zyb206IFwidmFsdWVcIiwgdG86IFwidmFsdWVcIn0sXG5cdGlzQ2xlYW5DYWxsID0gMCxcblx0b2xkQ2xlYW5EYXRhID0gJC5jbGVhbkRhdGEsXG5cdG9sZEpzdkRlbGltaXRlcnMgPSAkdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzLFxuXHRzYWZlRnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdHFzYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IsXG5cblx0Ly8gZWxDb250ZW50IG1hcHMgdGFnTmFtZXMgd2hpY2ggaGF2ZSBvbmx5IGVsZW1lbnQgY29udGVudCwgc28gbWF5IG5vdCBzdXBwb3J0IHNjcmlwdCBub2Rlcy5cblx0ZWxDb250ZW50ID0ge29sOiAxLCB1bDogMSwgdGFibGU6IDEsIHRib2R5OiAxLCB0aGVhZDogMSwgdGZvb3Q6IDEsIHRyOiAxLCBjb2xncm91cDogMSwgZGw6IDEsIHNlbGVjdDogMSwgb3B0Z3JvdXA6IDEsIHN2ZzogMSwgc3ZnX25zOiAxfSxcblx0YmFkUGFyZW50ID0ge3RyOiBcInRhYmxlXCJ9LFxuXHR2b2lkRWxlbXMgPSB7YnI6IDEsIGltZzogMSwgaW5wdXQ6IDEsIGhyOiAxLCBhcmVhOiAxLCBiYXNlOiAxLCBjb2w6IDEsIGxpbms6IDEsIG1ldGE6IDEsXG5cdFx0Y29tbWFuZDogMSwgZW1iZWQ6IDEsIGtleWdlbjogMSwgcGFyYW06IDEsIHNvdXJjZTogMSwgdHJhY2s6IDEsIHdicjogMX0sXG5cdGRpc3BsYXlTdHlsZXMgPSB7fSxcblx0YmluZGluZ1N0b3JlID0ge30sXG5cdGJpbmRpbmdLZXkgPSAxLFxuXHRyVmlld1BhdGggPSAvXiModmlld1xcLj8pPy8sXG5cdHJDb252ZXJ0TWFya2VycyA9IC8oKFxcLz4pfDxcXC8oXFx3Kyk+fCkoXFxzKikoWyNcXC9dXFxkKyg/Ol98KFxcXikpKWAoXFxzKikoPFxcdysoPz1bXFxzXFwvPl0pKT98XFxzKig/Oig8XFx3Kyg/PVtcXHNcXC8+XSkpfDxcXC8oXFx3Kyk+KFxccyopfChcXC8+KVxccyp8KD4pfCQpL2csXG5cdHJPcGVuVmlld01hcmtlcnMgPSAvKCMpKCkoXFxkKykoXykvZyxcblx0ck9wZW5NYXJrZXJzID0gLygjKSgpKFxcZCspKFtfXl0pL2csXG5cdHJWaWV3TWFya2VycyA9IC8oPzooIyl8KFxcLykpKFxcZCspKF8pL2csXG5cdHJPcGVuVGFnTWFya2VycyA9IC8oIykoKShcXGQrKShcXF4pL2csXG5cdHJNYXJrZXJUb2tlbnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShbX15dKShbLStAXFxkXSspPy9nLFxuXHRyU3BsaXRCaW5kaW5ncyA9IC8mKFxcZCspXFwrPy9nLFxuXHRnZXRDb21wdXRlZFN0eWxlID0gZ2xvYmFsLmdldENvbXB1dGVkU3R5bGU7XG5cbiRvYnNlcnZhYmxlID0gJC5vYnNlcnZhYmxlO1xuXG5pZiAoISRvYnNlcnZhYmxlKSB7XG5cdC8vIEpzT2JzZXJ2YWJsZSBpcyBub3QgbG9hZGVkLlxuXHR0aHJvdyByZXF1aXJlc1N0ciArIFwiSnNPYnNlcnZhYmxlXCI7IC8vIGpxdWVyeS5vYnNlcnZhYmxlLmpzIG11c3QgYmUgbG9hZGVkIGJlZm9yZSBKc1ZpZXdzXG59XG5cbiRvYnNlcnZlID0gJG9ic2VydmFibGUub2JzZXJ2ZTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBFdmVudCBoYW5kbGVyc1xuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZWxlbUNoYW5nZUhhbmRsZXIoZXYsIHBhcmFtcywgc291cmNlVmFsdWUpIHtcblx0dmFyIHNldHRlciwgY2FuY2VsLCBmcm9tQXR0ciwgbGlua0N0eCwgY3Z0QmFjaywgY252dE5hbWUsIHRhcmdldCwgJHNvdXJjZSwgdmlldywgYmluZGluZyxcblx0XHRvbGRMaW5rQ3R4LCBvbkJlZm9yZUNoYW5nZSwgb25BZnRlckNoYW5nZSwgdGFnLCB0bywgZXZlbnRBcmdzLCBleHByT2IsIGNvbnRleHRDYixcblx0XHRzb3VyY2UgPSBldi50YXJnZXQsXG5cdFx0YmluZGluZ3MgPSBzb3VyY2UuX2pzdkJuZDtcblxuXHQvLyBfanN2Qm5kIGlzIGEgc3RyaW5nIHdpdGggdGhlIHN5bnRheDogXCImYmluZGluZ0lkMSZiaW5kaW5nSWQyXCJcblx0d2hpbGUgKGJpbmRpbmcgPSByU3BsaXRCaW5kaW5ncy5leGVjKGJpbmRpbmdzKSkge1xuXHRcdGlmIChiaW5kaW5nID0gYmluZGluZ1N0b3JlW2JpbmRpbmdbMV1dKSB7XG5cdFx0XHRpZiAodG8gPSBiaW5kaW5nLnRvKSB7XG5cdFx0XHRcdC8vIFRoZSBiaW5kaW5nIGhhcyBhICd0bycgZmllbGQsIHdoaWNoIGlzIG9mIHRoZSBmb3JtIFtbdGFyZ2V0T2JqZWN0LCB0b1BhdGhdLCBjdnRCYWNrXVxuXHRcdFx0XHRsaW5rQ3R4ID0gYmluZGluZy5saW5rQ3R4O1xuXHRcdFx0XHR2aWV3ID0gbGlua0N0eC52aWV3O1xuXHRcdFx0XHR0YWcgPSBsaW5rQ3R4LnRhZyB8fCB2aWV3LnRhZztcblx0XHRcdFx0JHNvdXJjZSA9ICQoc291cmNlKTtcblx0XHRcdFx0b25CZWZvcmVDaGFuZ2UgPSB2aWV3LmhscChvbkJlZm9yZUNoYW5nZVN0cik7IC8vIFRPRE8gQ2FuIHdlIG9wdGltaXplIHRoaXMgYW5kIG90aGVyIGluc3RhbmNlcyBvZiBzYW1lP1xuXHRcdFx0XHRvbkFmdGVyQ2hhbmdlID0gdmlldy5obHAob25BZnRlckNoYW5nZVN0cik7IC8vIFRPRE8gQ2FuIHdlIG9wdGltaXplIHRoaXMgYW5kIG90aGVyIGluc3RhbmNlcyBvZiBzYW1lXG5cdFx0XHRcdGZyb21BdHRyID0gZGVmYXVsdEF0dHIoc291cmNlKTtcblx0XHRcdFx0c2V0dGVyID0gZm5TZXR0ZXJzW2Zyb21BdHRyXTtcblx0XHRcdFx0aWYgKHNvdXJjZVZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRzb3VyY2VWYWx1ZSA9ICRpc0Z1bmN0aW9uKGZyb21BdHRyKVxuXHRcdFx0XHRcdFx0PyBmcm9tQXR0cihzb3VyY2UpXG5cdFx0XHRcdFx0XHQ6IHNldHRlclxuXHRcdFx0XHRcdFx0XHQ/ICRzb3VyY2Vbc2V0dGVyXSgpXG5cdFx0XHRcdFx0XHRcdDogJHNvdXJjZS5hdHRyKGZyb21BdHRyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjbnZ0TmFtZSA9IHRvWzFdO1xuXHRcdFx0XHR0byA9IHRvWzBdOyAvLyBbb2JqZWN0LCBwYXRoXVxuXHRcdFx0XHR0byA9IHRvICsgXCJcIiA9PT0gdG8gPyBbbGlua0N0eC5kYXRhLCB0b10gOiB0bztcblx0XHRcdFx0aWYgKGNudnROYW1lKSB7XG5cdFx0XHRcdFx0aWYgKCRpc0Z1bmN0aW9uKGNudnROYW1lKSkge1xuXHRcdFx0XHRcdFx0Y3Z0QmFjayA9IGNudnROYW1lO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjdnRCYWNrID0gdmlldy5nZXRSc2MoXCJjb252ZXJ0ZXJzXCIsIGNudnROYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGxpbmtDdHguZWxlbS5ub2RlTmFtZSA9PT0gXCJTRUxFQ1RcIikge1xuXHRcdFx0XHRcdGxpbmtDdHguZWxlbS5fanN2U2VsID0gc291cmNlVmFsdWUgPSBzb3VyY2VWYWx1ZSB8fCAobGlua0N0eC5lbGVtLm11bHRpcGxlID8gW10gOiBzb3VyY2VWYWx1ZSk7XG5cdFx0XHRcdFx0Ly8gZGF0YS1saW5rIDxzZWxlY3Q+IHRvIHN0cmluZyBvciAobXVsdGlzZWxlY3QpIGFycmF5IG9mIHN0cmluZ3Ncblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY3Z0QmFjaykge1xuXHRcdFx0XHRcdHNvdXJjZVZhbHVlID0gY3Z0QmFjay5jYWxsKHRhZywgc291cmNlVmFsdWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGxpbmtDdHggb24gdmlldywgZHluYW1pY2FsbHksIGp1c3QgZHVyaW5nIHRoaXMgaGFuZGxlciBjYWxsXG5cdFx0XHRcdG9sZExpbmtDdHggPSB2aWV3LmxpbmtDdHg7XG5cdFx0XHRcdHZpZXcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdGV2ZW50QXJncyA9IHtcblx0XHRcdFx0XHRjaGFuZ2U6IFwiY2hhbmdlXCIsXG5cdFx0XHRcdFx0b2xkVmFsdWU6IGxpbmtDdHguX3ZhbCxcblx0XHRcdFx0XHR2YWx1ZTogc291cmNlVmFsdWVcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKCghb25CZWZvcmVDaGFuZ2UgfHwgIShjYW5jZWwgPSBvbkJlZm9yZUNoYW5nZS5jYWxsKGxpbmtDdHgsIGV2LCBldmVudEFyZ3MpID09PSBmYWxzZSkpICYmXG5cdFx0XHRcdFx0XHQoIXRhZyB8fCAhdGFnLm9uQmVmb3JlQ2hhbmdlIHx8ICEoY2FuY2VsID0gdGFnLm9uQmVmb3JlQ2hhbmdlKGV2LCBldmVudEFyZ3MpID09PSBmYWxzZSkpICYmXG5cdFx0XHRcdFx0XHRzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGFyZ2V0ID0gdG9bMF07IC8vIFtvYmplY3QsIHBhdGhdXG5cdFx0XHRcdFx0aWYgKHNvdXJjZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0Ll9qc3YpIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dENiID0gbGlua0N0eC5fY3R4Q2I7IC8vIFRoaXMgaXMgYSBjb21wdXRlZCB2YWx1ZVxuXHRcdFx0XHRcdFx0XHRleHByT2IgPSB0YXJnZXQ7XG5cdFx0XHRcdFx0XHRcdHRhcmdldCA9IGxpbmtDdHguZGF0YTtcblx0XHRcdFx0XHRcdFx0aWYgKGV4cHJPYi5fY3BDdHgpIHsgLy8gQ29tcHV0ZWQgdmFsdWUgZm9yIGEgY29udGV4dHVhbCBwYXJhbWV0ZXJcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXQgPSBleHByT2IuZGF0YTsgLy8gVGhlIGRhdGEgZm9yIHRoZSBjb250ZXh0dWFsIHZpZXcgKHdoZXJlIGNvbnRleHR1YWwgcGFyYW0gZXhwcmVzc2lvbiBldmFsdWF0ZWQvYXNzaWduZWQpXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dENiID0gZXhwck9iLl9jcEN0eDsgLy8gQ29udGV4dCBjYWxsYmFjayBmb3IgY29udGV4dHVhbCB2aWV3XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0d2hpbGUgKGV4cHJPYiAmJiBleHByT2Iuc2IpIHsgLy8gU3RlcCB0aHJvdWdoIGNoYWluZWQgY29tcHV0ZWQgdmFsdWVzIHRvIGxlYWYgb25lLi4uXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gY29udGV4dENiKGV4cHJPYiwgdGFyZ2V0KTtcblx0XHRcdFx0XHRcdFx0XHRleHByT2IgPSBleHByT2Iuc2I7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0XHRcdFx0dGFnLl8uY2hnaW5nID0gdHJ1ZTsgLy8gbWFya2VyIHRvIHByZXZlbnQgdGFnIGNoYW5nZSBldmVudCB0cmlnZ2VyaW5nIGl0cyBvd24gcmVmcmVzaFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0JG9ic2VydmFibGUodGFyZ2V0KS5zZXRQcm9wZXJ0eSh0b1sxXSwgc291cmNlVmFsdWUpOyAvLyAyd2F5IGJpbmRpbmcgY2hhbmdlIGV2ZW50IC0gb2JzZXJ2YWJseSB1cGRhdGluZyBib3VuZCBvYmplY3Rcblx0XHRcdFx0XHRcdGlmIChvbkFmdGVyQ2hhbmdlKSB7XG5cdFx0XHRcdFx0XHRcdG9uQWZ0ZXJDaGFuZ2UuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRhZy5vbkFmdGVyQ2hhbmdlKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFnLm9uQWZ0ZXJDaGFuZ2UoZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGFnLl8uY2hnaW5nID0gdW5kZWZpbmVkOyAvLyBjbGVhciB0aGUgbWFya2VyXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRsaW5rQ3R4Ll92YWwgPSBzb3VyY2VWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dmlldy5saW5rQ3R4ID0gb2xkTGlua0N0eDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcGVydHlDaGFuZ2VIYW5kbGVyKGV2LCBldmVudEFyZ3MsIGxpbmtGbikge1xuXHR2YXIgYXR0ciwgc291cmNlVmFsdWUsIG5vVXBkYXRlLCBmb3JjZVVwZGF0ZSwgaGFzRXJyb3IsIG9uRXJyb3IsXG5cdFx0bGlua0N0eCA9IHRoaXMsXG5cdFx0dGFnID0gbGlua0N0eC50YWcsXG5cdFx0c291cmNlID0gbGlua0N0eC5kYXRhLFxuXHRcdHRhcmdldCA9IGxpbmtDdHguZWxlbSxcblx0XHRjdnQgPSBsaW5rQ3R4LmNvbnZlcnQsXG5cdFx0cGFyZW50RWxlbSA9IHRhcmdldC5wYXJlbnROb2RlLFxuXHRcdHZpZXcgPSBsaW5rQ3R4LnZpZXcsXG5cdFx0b2xkTGlua0N0eCA9IHZpZXcubGlua0N0eCxcblx0XHRvbkV2ZW50ID0gdmlldy5obHAob25CZWZvcmVDaGFuZ2VTdHIpO1xuXG5cdC8vIFNldCBsaW5rQ3R4IG9uIHZpZXcsIGR5bmFtaWNhbGx5LCBqdXN0IGR1cmluZyB0aGlzIGhhbmRsZXIgY2FsbFxuXHR2aWV3LmxpbmtDdHggPSBsaW5rQ3R4O1xuXG5cdGlmIChwYXJlbnRFbGVtICYmICghb25FdmVudCB8fCAhKGV2ZW50QXJncyAmJiBvbkV2ZW50LmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncykgPT09IGZhbHNlKSlcblx0XHRcdC8vIElmIGRhdGEgY2hhbmdlZCwgdGhlIGV2LmRhdGEgaXMgc2V0IHRvIGJlIHRoZSBwYXRoLiBVc2UgdGhhdCB0byBmaWx0ZXIgdGhlIGhhbmRsZXIgYWN0aW9uLi4uXG5cdFx0XHQmJiAhKGV2ZW50QXJncyAmJiBldi5kYXRhLnByb3AgIT09IFwiKlwiICYmIGV2LmRhdGEucHJvcCAhPT0gZXZlbnRBcmdzLnBhdGgpKSB7XG5cblx0XHRpZiAoZXZlbnRBcmdzKSB7XG5cdFx0XHRsaW5rQ3R4LmV2ZW50QXJncyA9IGV2ZW50QXJncztcblx0XHR9XG5cdFx0aWYgKGV2ZW50QXJncyB8fCBsaW5rQ3R4Ll90b0xrKSB7XG5cdFx0XHQvLyBJZiBldmVudEFyZ3MgYXJlIGRlZmluZWQsIHRoaXMgaXMgYSBkYXRhIHVwZGF0ZVxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHRoaXMgaXMgdGhlIGluaXRpYWwgZGF0YS1saW5rIHJlbmRlcmluZyBjYWxsLiBCaW5kIG9uIHRoaXMgdGhlIGZpcnN0IHRpbWUgaXQgZ2V0IGNhbGxlZFxuXHRcdFx0bGlua0N0eC5fdG9MayA9IDA7IC8vIFJlbW92ZSBmbGFnIHRvIHNraXAgdW5uZWNjZXNzYXJ5IHJlYmluZGluZyBuZXh0IHRpbWVcblx0XHRcdGlmIChsaW5rRm4uX2VyKSB7XG5cdFx0XHRcdC8vIGRhdGEtbGluaz1cImV4cHJVc2luZ1RhZ09yQ3Z0IHdpdGggb25lcnJvcj0uLi5cIiAtIGUuZy4ge3RhZyAuLi4ge2N2dDouLi4gezouLi4gY29udmVydD0nY3Z0J1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHNvdXJjZVZhbHVlID0gbGlua0ZuKHNvdXJjZSwgdmlldyk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRoYXNFcnJvciA9IGxpbmtGbi5fZXI7XG5cdFx0XHRcdFx0b25FcnJvciA9IG9uUmVuZGVyRXJyb3IoZSx2aWV3LChuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXdcIiwgXCJyZXR1cm4gXCIgKyBoYXNFcnJvciArIFwiO1wiKSkoc291cmNlLCB2aWV3KSk7XG5cdFx0XHRcdFx0c291cmNlVmFsdWUgPSBbe3Byb3BzOiB7fSwgYXJnczogW29uRXJyb3JdfV07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNvdXJjZVZhbHVlID0gbGlua0ZuKHNvdXJjZSwgdmlldywgJHN1Yik7XG5cdFx0XHR9XG5cdFx0XHQvLyBDb21waWxlZCBsaW5rIGV4cHJlc3Npb24gZm9yIGxpbmtUYWc6IHJldHVybiB2YWx1ZSBmb3IgZGF0YS1saW5rPVwiezp4eHh9XCIgd2l0aCBubyBjdnQgb3IgY3Z0QmssIG90aGVyd2lzZSB0YWdDdHggb3IgdGFnQ3R4c1xuXG5cdFx0XHRhdHRyID0gZ2V0VGFyZ2V0VmFsKHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCB0YWcgPSBsaW5rQ3R4LnRhZyxcblx0XHRcdFx0XHRsaW5rQ3R4LmF0dHIgfHwgZGVmYXVsdEF0dHIodGFyZ2V0LCB0cnVlLCBjdnQgIT09IHVuZGVmaW5lZClcblx0XHRcdFx0KTtcblxuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHQvLyBFeGlzdGluZyB0YWcgaW5zdGFuY2Vcblx0XHRcdFx0Zm9yY2VVcGRhdGUgPSBoYXNFcnJvciB8fCB0YWcuX2VyO1xuXHRcdFx0XHQvLyBJZiB0aGUgbmV3IHRhZ0N0eHMgaGFzRXJyb3Igb3IgdGhlIHByZXZpb3VzIHRhZ0N0eHMgaGFkIGVycm9yLCB0aGVuIGZvcmNlIHVwZGF0ZVxuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IHNvdXJjZVZhbHVlWzBdID8gc291cmNlVmFsdWUgOiBbc291cmNlVmFsdWVdO1xuXHRcdFx0XHRub1VwZGF0ZSA9ICFmb3JjZVVwZGF0ZSAmJiBldmVudEFyZ3MgJiYgdGFnLm9uVXBkYXRlICYmIHRhZy5vblVwZGF0ZShldiwgZXZlbnRBcmdzLCBzb3VyY2VWYWx1ZSkgPT09IGZhbHNlO1xuXG5cdFx0XHRcdG1lcmdlQ3R4cyh0YWcsIHNvdXJjZVZhbHVlLCBmb3JjZVVwZGF0ZSk7XG5cblx0XHRcdFx0aWYgKG5vVXBkYXRlIHx8IGF0dHIgPT09IE5PTkUpIHtcblx0XHRcdFx0XHQvLyBvblVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgb3IgYXR0ciA9PT0gXCJub25lXCIsIG9yIHRoaXMgaXMgYW4gdXBkYXRlIGNvbWluZyBmcm9tIHRoZSB0YWcncyBvd24gY2hhbmdlIGV2ZW50XG5cdFx0XHRcdFx0Ly8gLSBzbyBkb24ndCByZWZyZXNoIHRoZSB0YWc6IHdlIGp1c3QgdXNlIHRoZSBuZXcgdGFnQ3R4cyBtZXJnZWQgZnJvbSB0aGUgc291cmNlVmFsdWUsXG5cdFx0XHRcdFx0Ly8gKHdoaWNoIG1heSBvcHRpb25hbGx5IGhhdmUgYmVlbiBtb2RpZmVkIGluIG9uVXBkYXRlKCkuLi4pIGFuZCB0aGVuIGJpbmQsIGFuZCB3ZSBhcmUgZG9uZVxuXHRcdFx0XHRcdGNhbGxBZnRlckxpbmsodGFnLCBldiwgZXZlbnRBcmdzKTtcblx0XHRcdFx0XHRvYnNlcnZlQW5kQmluZChsaW5rQ3R4LCBzb3VyY2UsIHRhcmdldCk7XG5cdFx0XHRcdFx0dmlldy5saW5rQ3R4ID0gb2xkTGlua0N0eDtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRhZy5fLmNoZ2luZykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0YWcub25VbmJpbmQpIHtcblx0XHRcdFx0XHR0YWcub25VbmJpbmQodGFnLnRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IHRhZy50YWdOYW1lID09PSBcIjpcIiAvLyBDYWxsIGNvbnZlcnRWYWwgaWYgaXQgaXMgYSB7e2N2dDouLi59fSAtIG90aGVyd2lzZSBjYWxsIHJlbmRlclRhZ1xuXHRcdFx0XHRcdD8gJHN1Yi5fY252dCh0YWcuY3Z0LCB2aWV3LCBzb3VyY2VWYWx1ZVswXSlcblx0XHRcdFx0XHQ6ICRzdWIuX3RhZyh0YWcsIHZpZXcsIHZpZXcudG1wbCwgc291cmNlVmFsdWUsIHRydWUsIG9uRXJyb3IpO1xuXHRcdFx0fSBlbHNlIGlmIChsaW5rRm4uX3RhZykge1xuXHRcdFx0XHQvLyBGb3Ige3s6IC4uLn19IHdpdGhvdXQgYSBjb252ZXJ0IG9yIGNvbnZlcnRCYWNrLCB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNvdXJjZVZhbHVlLCBhbmQgd2UgYXJlIGRvbmVcblx0XHRcdFx0Ly8gRm9yIHt7OiAuLi59fSB3aXRoIGVpdGhlciBjdnQgb3IgY3Z0QmFjayB3ZSBjYWxsIGNvbnZlcnRWYWwgdG8gZ2V0IHRoZSBzb3VyY2VWYWx1ZSBhbmQgaW5zdGFudGlhdGUgdGhlIHRhZ1xuXHRcdFx0XHQvLyBJZiBjdnQgaXMgdW5kZWZpbmVkIHRoZW4gdGhpcyBpcyBhIHRhZywgYW5kIHdlIGNhbGwgcmVuZGVyVGFnIHRvIGdldCB0aGUgcmVuZGVyZWQgY29udGVudCBhbmQgaW5zdGFudGlhdGUgdGhlIHRhZ1xuXHRcdFx0XHRjdnQgPSBjdnQgPT09IFwiXCIgPyBUUlVFIDogY3Z0OyAvLyBJZiB0aGVyZSBpcyBhIGN2dEJhY2sgYnV0IG5vIGN2dCwgc2V0IGN2dCB0byBcInRydWVcIlxuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IGN2dCAvLyBDYWxsIGNvbnZlcnRWYWwgaWYgaXQgaXMgYSB7e2N2dDouLi59fSAtIG90aGVyd2lzZSBjYWxsIHJlbmRlclRhZ1xuXHRcdFx0XHRcdD8gJHN1Yi5fY252dChjdnQsIHZpZXcsIHNvdXJjZVZhbHVlWzBdIHx8IHNvdXJjZVZhbHVlKSAvLyBjb252ZXJ0VmFsXG5cdFx0XHRcdFx0OiAkc3ViLl90YWcobGlua0ZuLl90YWcsIHZpZXcsIHZpZXcudG1wbCwgc291cmNlVmFsdWUsIHRydWUsIG9uRXJyb3IpOyAvLyByZW5kZXJUYWdcblxuXHRcdFx0XHRhZGRMaW5rTWV0aG9kcyh0YWcgPSBsaW5rQ3R4LnRhZywgdHJ1ZSk7IC8vIEluIGJvdGggY29udmVydFZhbCBhbmQgcmVuZGVyVGFnIHdlIGhhdmUgaW5zdGFudGlhdGVkIGEgdGFnXG5cdFx0XHRcdGF0dHIgPSBsaW5rQ3R4LmF0dHIgfHwgYXR0cjsgLy8gbGlua0N0eC5hdHRyIG1heSBoYXZlIGJlZW4gc2V0IHRvIHRhZy5hdHRyIGR1cmluZyB0YWcgaW5zdGFudGlhdGlvbiBpbiByZW5kZXJUYWdcblx0XHRcdH1cblxuXHRcdFx0aWYgKHVwZGF0ZUNvbnRlbnQoc291cmNlVmFsdWUsIGxpbmtDdHgsIGF0dHIsIHRhZylcblx0XHRcdFx0XHQmJiBldmVudEFyZ3Ncblx0XHRcdFx0XHQmJiAob25FdmVudCA9IHZpZXcuaGxwKG9uQWZ0ZXJDaGFuZ2VTdHIpKSkge1xuXHRcdFx0XHRvbkV2ZW50LmNhbGwobGlua0N0eCwgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHR9XG5cdFx0XHRsaW5rQ3R4Ll9ub1VwZCA9IDA7IC8vIEZvciBkYXRhLWxpbms9XCJeey4uLn1cIiByZW1vdmUgX25vVXBkIGZsYWcgc28gdXBkYXRlcyBvbiBzdWJzZXF1ZW50IGNhbGxzXG5cblx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0dGFnLl9lciA9IGhhc0Vycm9yO1xuXHRcdFx0XHRjYWxsQWZ0ZXJMaW5rKHRhZywgZXYsIGV2ZW50QXJncyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b2JzZXJ2ZUFuZEJpbmQobGlua0N0eCwgc291cmNlLCB0YXJnZXQpO1xuXG5cdFx0Ly8gUmVtb3ZlIGR5bmFtaWNhbGx5IGFkZGVkIGxpbmtDdHggZnJvbSB2aWV3XG5cdFx0dmlldy5saW5rQ3R4ID0gb2xkTGlua0N0eDtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRWYWwoc291cmNlVmFsdWUsIGxpbmtDdHgsIHRhZywgYXR0cikge1xuXHR2YXIgY3VycmVudFZhbHVlLCBzZXR0ZXIsIGNzcywgJHRhcmdldCxcblx0XHR0YXJnZXQgPSB0YWcgJiYgdGFnLnBhcmVudEVsZW0gfHwgbGlua0N0eC5lbGVtO1xuXG5cdGlmIChzb3VyY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0JHRhcmdldCA9ICQodGFyZ2V0KTtcblx0XHRhdHRyID0gdGFnICYmIHRhZy5hdHRyIHx8IGF0dHI7XG5cdFx0aWYgKCRpc0Z1bmN0aW9uKHNvdXJjZVZhbHVlKSkge1xuXHRcdFx0ZXJyb3IobGlua0N0eC5leHByICsgXCI6IG1pc3NpbmcgcGFyZW5zXCIpO1xuXHRcdH1cblxuXHRcdGlmIChjc3MgPSAvXmNzcy0vLnRlc3QoYXR0cikgJiYgYXR0ci5zbGljZSg0KSkge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gJC5zdHlsZSh0YXJnZXQsIGNzcyk7XG5cdFx0XHRpZiAoK3NvdXJjZVZhbHVlID09PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0XHQvLyBPcHRpbWl6YXRpb24gZm9yIHBlcmYgb24gaW50ZWdlciB2YWx1ZXMgLSBlLmcuIGNzcy13aWR0aHs6d2lkdGgrJ3B4J31cblx0XHRcdFx0Y3VycmVudFZhbHVlID0gcGFyc2VJbnQoY3VycmVudFZhbHVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGF0dHIgIT09IFwibGlua1wiKSB7IC8vIGF0dHIgPT09IFwibGlua1wiIGlzIGZvciB0YWcgY29udHJvbHMgd2hpY2ggZG8gZGF0YSBiaW5kaW5nIGJ1dCBoYXZlIG5vIHJlbmRlcmVkIG91dHB1dCBvciB0YXJnZXRcblx0XHRcdGlmIChhdHRyID09PSBcInZhbHVlXCIpIHtcblx0XHRcdFx0aWYgKHRhcmdldC50eXBlID09PSBDSEVDS0JPWCkge1xuXHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSA9ICR0YXJnZXQucHJvcChhdHRyID0gQ0hFQ0tFRCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gUkFESU8pIHtcblx0XHRcdFx0aWYgKHRhcmdldC52YWx1ZSA9PT0gKFwiXCIgKyBzb3VyY2VWYWx1ZSkpIHtcblx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSAkdGFyZ2V0LnByb3AoQ0hFQ0tFRCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHNldHRlciA9IGZuU2V0dGVyc1thdHRyXTtcblx0XHRcdFx0Y3VycmVudFZhbHVlID0gc2V0dGVyID8gJHRhcmdldFtzZXR0ZXJdKCkgOiAkdGFyZ2V0LmF0dHIoYXR0cik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGxpbmtDdHguX3ZhbCA9IGN1cnJlbnRWYWx1ZTtcblx0fVxuXHRyZXR1cm4gYXR0cjtcbn1cblxuZnVuY3Rpb24gc2V0RGVmZXIoZWxlbSwgdmFsdWUpIHtcblx0ZWxlbS5fZGYgPSB2YWx1ZTsgLy8gVXNlIGJvdGggYW4gZXhwYW5kbyBhbmQgYW4gYXR0cmlidXRlIHRvIHRyYWNrIGRlZmVyZWQgdG9rZW5zLiBBdHRyaWJ1dGUgaXMgbmVlZGVkIGZvciBxdWVyeVNlbGVjdG9yQWxsIGZvciBnZXRWaWV3SW5mb3MgKGNoaWxkVGFncylcblx0ZWxlbVsodmFsdWUgPyBcInNldFwiIDogXCJyZW1vdmVcIikgKyBcIkF0dHJpYnV0ZVwiXShkZWZlckF0dHIsIFwiXCIpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50KHNvdXJjZVZhbHVlLCBsaW5rQ3R4LCBhdHRyLCB0YWcpIHtcblx0Ly8gV2hlbiBjYWxsZWQgZm9yIGEgdGFnLCBlaXRoZXIgaW4gdGFnLnJlZnJlc2goKSBvciBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIoKSwgcmV0dXJucyBhIHByb21pc2UgKGFuZCBzdXBwb3J0cyBhc3luYylcblx0Ly8gV2hlbiBjYWxsZWQgKGluIHByb3BlcnR5Q2hhbmdlSGFuZGxlcikgZm9yIHRhcmdldCBIVE1MIHJldHVybnMgdHJ1ZVxuXHQvLyBXaGVuIGNhbGxlZCAoaW4gcHJvcGVydHlDaGFuZ2VIYW5kbGVyKSBmb3Igb3RoZXIgdGFyZ2V0cyByZXR1cm5zIGJvb2xlYW4gZm9yIFwiY2hhbmdlZFwiXG5cdHZhciBzZXR0ZXIsIHByZXZOb2RlLCBuZXh0Tm9kZSwgcHJvbWlzZSwgbm9kZXNUb1JlbW92ZSwgdXNlUHJvcCwgdG9rZW5zLCBpZCwgb3BlbkluZGV4LCBjbG9zZUluZGV4LCB0ZXN0RWxlbSwgbm9kZU5hbWUsIGNTdHlsZSwganN2U2VsLFxuXHRcdHJlbmRlcnMgPSBhdHRyICE9PSBOT05FICYmIHNvdXJjZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWxpbmtDdHguX25vVXBkLCAvLyBGb3IgZGF0YS1saW5rPVwiXnsuLi59XCIsIGRvbid0IHVwZGF0ZSB0aGUgZmlyc3QgdGltZSAobm8gaW5pdGlhbCByZW5kZXIpIC0gZS5nLiB0byBsZWF2ZSBzZXJ2ZXIgcmVuZGVyZWQgdmFsdWVzLlxuXHRcdHNvdXJjZSA9IGxpbmtDdHguZGF0YSxcblx0XHR0YXJnZXQgPSB0YWcgJiYgdGFnLnBhcmVudEVsZW0gfHwgbGlua0N0eC5lbGVtLFxuXHRcdHRhcmdldFBhcmVudCA9IHRhcmdldC5wYXJlbnROb2RlLFxuXHRcdCR0YXJnZXQgPSAkKHRhcmdldCksXG5cdFx0dmlldyA9IGxpbmtDdHgudmlldyxcblx0XHR0YXJnZXRWYWwgPSBsaW5rQ3R4Ll92YWwsXG5cdFx0b2xkTGlua0N0eCA9IHZpZXcubGlua0N0eCxcblx0XHQvLyBJZiBub3QgYSB0YWcgd2UgY2FuIHVzZSB0aGUgLl92YWwgb2J0YWluZWQgZnJvbSBnZXRUYXJnZXRWYWwoKVxuXHRcdC8vIGFuZCBvbmx5IHVwZGF0ZSB3aGVuIHRoZSBuZXcgdmFsdWUgKHNvdXJjZVZhbHVlKSBoYXMgY2hhbmdlZCBmcm9tIHRoZSBwcmV2aW91cyBvbmVcblx0XHRjaGFuZ2UgPSB0YWc7XG5cblx0aWYgKHRhZykge1xuXHRcdC8vIEluaXRpYWxpemUgdGhlIHRhZyB3aXRoIGVsZW1lbnQgcmVmZXJlbmNlc1xuXHRcdHRhZy5fLnVubGlua2VkID0gdHJ1ZTsgLy8gU2V0IHRvIHVubGlua2VkLCBzbyBpbml0aWFsaXphdGlvbiBpcyB0cmlnZ2VyZWQgYWZ0ZXIgcmUtcmVuZGVyaW5nLCBlLmcuIGZvciBzZXR0aW5nIGxpbmtlZEVsZW0sIGFuZCBjYWxsaW5nIG9uQmluZFxuXHRcdHRhZy5wYXJlbnRFbGVtID0gdGFnLnBhcmVudEVsZW0gfHwgKGxpbmtDdHguZXhwciB8fCB0YWcuX2VsQ250KSA/IHRhcmdldCA6IHRhcmdldFBhcmVudDtcblx0XHRwcmV2Tm9kZSA9IHRhZy5fcHJ2O1xuXHRcdG5leHROb2RlID0gdGFnLl9ueHQ7XG5cdH1cblx0aWYgKCFyZW5kZXJzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKGF0dHIgPT09IFwidmlzaWJsZVwiKSB7XG5cdFx0YXR0ciA9IFwiY3NzLWRpc3BsYXlcIjtcblx0fVxuXHRpZiAoL15jc3MtLy50ZXN0KGF0dHIpKSB7XG5cdFx0aWYgKGxpbmtDdHguYXR0ciA9PT0gXCJ2aXNpYmxlXCIpIHtcblx0XHRcdC8vIEdldCB0aGUgY3VycmVudCBkaXNwbGF5IHN0eWxlXG5cdFx0XHRjU3R5bGUgPSAodGFyZ2V0LmN1cnJlbnRTdHlsZSB8fCBnZXRDb21wdXRlZFN0eWxlLmNhbGwoZ2xvYmFsLCB0YXJnZXQsIFwiXCIpKS5kaXNwbGF5O1xuXG5cdFx0XHRpZiAoc291cmNlVmFsdWUpIHtcblx0XHRcdFx0Ly8gV2UgYXJlIHNob3dpbmcgdGhlIGVsZW1lbnQuXG5cdFx0XHRcdC8vIEdldCB0aGUgY2FjaGVkICd2aXNpYmxlJyBkaXNwbGF5IHZhbHVlIGZyb20gdGhlIC1qc3ZkIGV4cGFuZG9cblx0XHRcdFx0c291cmNlVmFsdWUgPSB0YXJnZXQuX2pzdmRcblx0XHRcdFx0XHQvLyBPciwgaWYgbm90IHlldCBjYWNoZWQsIGdldCB0aGUgY3VycmVudCBkaXNwbGF5IHZhbHVlXG5cdFx0XHRcdFx0fHwgY1N0eWxlO1xuXHRcdFx0XHRpZiAoc291cmNlVmFsdWUgPT09IE5PTkUgJiYgIShzb3VyY2VWYWx1ZSA9IGRpc3BsYXlTdHlsZXNbbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWVdKSkge1xuXHRcdFx0XHRcdC8vIEN1cnJlbnRseSBkaXNwbGF5IHZhbHVlIGlzICdub25lJywgYW5kIHRoZSAndmlzaWJsZScgc3R5bGUgaGFzIG5vdCBiZWVuIGNhY2hlZC5cblx0XHRcdFx0XHQvLyBXZSBjcmVhdGUgYW4gZWxlbWVudCB0byBmaW5kIHRoZSBjb3JyZWN0ICd2aXNpYmxlJyBkaXNwbGF5IHN0eWxlIGZvciB0aGlzIG5vZGVOYW1lXG5cdFx0XHRcdFx0dGVzdEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5vZGVOYW1lKTtcblx0XHRcdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlc3RFbGVtKTtcblxuXHRcdFx0XHRcdC8vIEdldCB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgdGhpcyBIVE1MIHRhZyB0byB1c2UgYXMgJ3Zpc2libGUnIHN0eWxlXG5cdFx0XHRcdFx0c291cmNlVmFsdWVcblx0XHRcdFx0XHRcdC8vIGFuZCBjYWNoZSBpdCBhcyBhIGhhc2ggYWdhaW5zdCBub2RlTmFtZVxuXHRcdFx0XHRcdFx0PSBkaXNwbGF5U3R5bGVzW25vZGVOYW1lXVxuXHRcdFx0XHRcdFx0PSAodGVzdEVsZW0uY3VycmVudFN0eWxlIHx8IGdldENvbXB1dGVkU3R5bGUuY2FsbChnbG9iYWwsIHRlc3RFbGVtLCBcIlwiKSkuZGlzcGxheTtcblx0XHRcdFx0XHRkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlc3RFbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gV2UgYXJlIGhpZGluZyB0aGUgZWxlbWVudC5cblx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGN1cnJlbnQgZGlzcGxheSB2YWx1ZSBhcyAndmlzaWJsZScgc3R5bGUsIG9uIF9qc3ZkIGV4cGFuZG8sIGZvciB3aGVuIHdlIHNob3cgdGhlIGVsZW1lbnQgYWdhaW5cblx0XHRcdFx0dGFyZ2V0Ll9qc3ZkID0gY1N0eWxlO1xuXHRcdFx0XHRzb3VyY2VWYWx1ZSA9IE5PTkU7IC8vIEhpZGUgdGhlIGVsZW1lbnRcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNoYW5nZSA9IGNoYW5nZSB8fCB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlKSB7XG5cdFx0XHQkLnN0eWxlKHRhcmdldCwgYXR0ci5zbGljZSg0KSwgc291cmNlVmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChhdHRyICE9PSBcImxpbmtcIikgeyAvLyBhdHRyID09PSBcImxpbmtcIiBpcyBmb3IgdGFnIGNvbnRyb2xzIHdoaWNoIGRvIGRhdGEgYmluZGluZyBidXQgaGF2ZSBubyByZW5kZXJlZCBvdXRwdXQgb3IgdGFyZ2V0XG5cdFx0aWYgKC9eZGF0YS0vLnRlc3QoYXR0cikpIHtcblx0XHRcdCQuZGF0YSh0YXJnZXQsIGF0dHIuc2xpY2UoNSksIHNvdXJjZVZhbHVlKTsgLy8gU3VwcG9ydCBmb3IgYmluZGluZyB0byBkYXRhIGF0dHJpYnV0ZXM6IGRhdGEtZm9vezpleHByfTogZGF0YS1mb28gYXR0cmlidXRlIHdpbGwgYmVcblx0XHRcdC8vIGV4cHIudG9TdHJpbmcoKSwgYnV0ICQuZGF0YShlbGVtZW50LCBcImZvb1wiKSBhbmQgJChlbGVtZW50KS5kYXRhKFwiZm9vXCIpIHdpbGwgYWN0dWFsbHkgcmV0dXJuIHZhbHVlIG9mIGV4cHIsIGV2ZW4gaWYgb2YgdHlwZSBvYmplY3Rcblx0XHR9XG5cdFx0aWYgKGF0dHIgPT09IENIRUNLRUQpIHtcblx0XHRcdHVzZVByb3AgPSB0cnVlO1xuXHRcdFx0c291cmNlVmFsdWUgPSBzb3VyY2VWYWx1ZSAmJiBzb3VyY2VWYWx1ZSAhPT0gXCJmYWxzZVwiO1xuXHRcdFx0Ly8gVGhlIHN0cmluZyB2YWx1ZSBcImZhbHNlXCIgY2FuIG9jY3VyIHdpdGggZGF0YS1saW5rPVwiY2hlY2tlZHthdHRyOmV4cHJ9XCIgLSBhcyBhIHJlc3VsdCBvZiBhdHRyLCBhbmQgaGVuY2UgdXNpbmcgY29udmVydFZhbCgpXG5cdFx0XHQvLyBXZSB3aWxsIHNldCB0aGUgXCJjaGVja2VkXCIgcHJvcGVydHlcblx0XHRcdC8vIFdlIHdpbGwgY29tcGFyZSB0aGlzIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVcblx0XHR9IGVsc2UgaWYgKGF0dHIgPT09IFJBRElPKSB7XG5cdFx0XHQvLyBUaGlzIGlzIGEgc3BlY2lhbCBiaW5kaW5nIGF0dHJpYnV0ZSBmb3IgcmFkaW8gYnV0dG9ucywgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGRlZmF1bHQgJ3RvJyBiaW5kaW5nLlxuXHRcdFx0Ly8gVGhpcyBhbGxvd3MgYmluZGluZyBib3RoIHRvIHZhbHVlIChmb3IgZWFjaCBpbnB1dCkgYW5kIHRvIHRoZSBkZWZhdWx0IGNoZWNrZWQgcmFkaW8gYnV0dG9uIChmb3IgZWFjaCBpbnB1dCBpbiBuYW1lZCBncm91cCxcblx0XHRcdC8vIGUuZy4gYmluZGluZyB0byBwYXJlbnQgZGF0YSkuXG5cdFx0XHQvLyBQbGFjZSB2YWx1ZSBiaW5kaW5nIGZpcnN0OiA8aW5wdXQgdHlwZT1cInJhZGlvXCIgZGF0YS1saW5rPVwidmFsdWV7Om5hbWV9IHs6I2dldCgnZGF0YScpLmRhdGEuY3VycmVuY3k6fSBcIiAuLi4vPlxuXHRcdFx0Ly8gb3IgKGFsbG93aW5nIGFueSBvcmRlciBmb3IgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMpOlxuXHRcdFx0Ly8gPGlucHV0IHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwie3s6bmFtZX19XCIgZGF0YS1saW5rPVwiezojZ2V0KCdkYXRhJykuZGF0YS5jdXJyZW5jeTp9IHZhbHVlXns6bmFtZX1cIiAuLi4vPlxuXHRcdFx0dXNlUHJvcCA9IHRydWU7XG5cdFx0XHRhdHRyID0gQ0hFQ0tFRDtcblx0XHRcdHNvdXJjZVZhbHVlID0gdGFyZ2V0LnZhbHVlID09PSAoXCJcIiArIHNvdXJjZVZhbHVlKTtcblx0XHRcdC8vIElmIHRoZSBkYXRhIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhpcyByYWRpbyBidXR0b24gaW5wdXQsIHNldCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSB0byB0cnVlXG5cdFx0XHQvLyBPdGhlcndpc2Ugc2V0IHRoZSBjaGVja2VkIHByb3BlcnR5IHRvIGZhbHNlXG5cdFx0fSBlbHNlIGlmIChhdHRyID09PSBcInNlbGVjdGVkXCIgfHwgYXR0ciA9PT0gXCJkaXNhYmxlZFwiIHx8IGF0dHIgPT09IFwibXVsdGlwbGVcIiB8fCBhdHRyID09PSBcInJlYWRvbmx5XCIpIHtcblx0XHRcdHNvdXJjZVZhbHVlID0gKHNvdXJjZVZhbHVlICYmIHNvdXJjZVZhbHVlICE9PSBcImZhbHNlXCIpID8gYXR0ciA6IG51bGw7XG5cdFx0XHQvLyBVc2UgYXR0ciwgbm90IHByb3AsIHNvIHdoZW4gdGhlIG9wdGlvbnMgKGZvciBleGFtcGxlKSBhcmUgY2hhbmdlZCBkeW5hbWljYWxseSwgYnV0IGluY2x1ZGUgdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgdmFsdWUsXG5cdFx0XHQvLyB0aGV5IHdpbGwgc3RpbGwgYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhlIGNoYW5nZVxuXHRcdH0gZWxzZSBpZiAoYXR0ciA9PT0gXCJ2YWx1ZVwiICYmIHRhcmdldC5ub2RlTmFtZSA9PT0gXCJTRUxFQ1RcIikge1xuXHRcdFx0dGFyZ2V0Ll9qc3ZTZWwgPSAkaXNBcnJheShzb3VyY2VWYWx1ZSlcblx0XHRcdFx0PyBzb3VyY2VWYWx1ZVxuXHRcdFx0XHQ6IFwiXCIgKyBzb3VyY2VWYWx1ZTsgLy8gSWYgbm90IGFycmF5LCBjb2VyY2UgdG8gc3RyaW5nXG5cdFx0fVxuXG5cdFx0aWYgKHNldHRlciA9IGZuU2V0dGVyc1thdHRyXSkge1xuXHRcdFx0aWYgKGF0dHIgPT09IEhUTUwpIHtcblx0XHRcdFx0Ly8gU2V0IGxpbmtDdHggb24gdmlldywgZHluYW1pY2FsbHksIGp1c3QgZHVyaW5nIHRoaXMgaGFuZGxlciBjYWxsXG5cdFx0XHRcdHZpZXcubGlua0N0eCA9IGxpbmtDdHg7XG5cdFx0XHRcdGlmICh0YWcgJiYgdGFnLl8uaW5saW5lKSB7XG5cdFx0XHRcdFx0bm9kZXNUb1JlbW92ZSA9IHRhZy5ub2Rlcyh0cnVlKTtcblx0XHRcdFx0XHRpZiAodGFnLl9lbENudCkge1xuXHRcdFx0XHRcdFx0aWYgKHByZXZOb2RlICYmIHByZXZOb2RlICE9PSBuZXh0Tm9kZSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIHByZXZOb2RlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRyYW5zZmVyIHRoZSB2aWV3IHRva2VucyBvbiBwcmV2Tm9kZSB0byBuZXh0Tm9kZSBvZiB0aGlzICd2aWV3VG9SZWZyZXNoJ1xuXHRcdFx0XHRcdFx0XHR0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCB0YXJnZXQsIHRhZy5fdGdJZCwgXCJeXCIsIHRydWUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0b2tlbnMgPSB0YXJnZXQuX2RmKSB7IC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gbmV4dE5vZGUsIGFuZCBzbyB0aGUgdGFyZ2V0Ll9kZiBtYXkgaW5jbHVkZSB0b2tlbnMgcmVmZXJlbmNpbmdcblx0XHRcdFx0XHRcdFx0Ly8gdmlldyBhbmQgdGFnIGJpbmRpbmdzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG9wZW4gYW5kIGNsb3NlIHRva2VucyBvZiB0aGUgdXBkYXRlZCB0YWcgY29udHJvbC4gVGhleSBuZWVkIHRvIGJlIHByb2Nlc3NlZCAoZGlzcG9zZWQpXG5cdFx0XHRcdFx0XHRcdGlkID0gdGFnLl90Z0lkICsgXCJeXCI7XG5cdFx0XHRcdFx0XHRcdG9wZW5JbmRleCA9IHRva2Vucy5pbmRleE9mKFwiI1wiICsgaWQpICsgMTtcblx0XHRcdFx0XHRcdFx0Y2xvc2VJbmRleCA9IHRva2Vucy5pbmRleE9mKFwiL1wiICsgaWQpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChvcGVuSW5kZXggJiYgY2xvc2VJbmRleCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRvcGVuSW5kZXggKz0gaWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjbG9zZUluZGV4ID4gb3BlbkluZGV4KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXQsIHRva2Vucy5zbGljZSgwLCBvcGVuSW5kZXgpICsgdG9rZW5zLnNsaWNlKGNsb3NlSW5kZXgpKTtcblx0XHRcdFx0XHRcdFx0XHRcdGRpc3Bvc2VUb2tlbnModG9rZW5zLnNsaWNlKG9wZW5JbmRleCwgY2xvc2VJbmRleCkpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cHJldk5vZGUgPSBwcmV2Tm9kZVxuXHRcdFx0XHRcdFx0XHQ/IHByZXZOb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHRcdFx0XHQ6IG5leHROb2RlXG5cdFx0XHRcdFx0XHRcdFx0PyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmdcblx0XHRcdFx0XHRcdFx0XHQ6IHRhcmdldC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIFJlbW92ZSBIVE1MIG5vZGVzXG5cdFx0XHRcdFx0JChub2Rlc1RvUmVtb3ZlKS5yZW1vdmUoKTsgLy8gTm90ZSBpZiAhdGFnLl9lbENudCByZW1vdmluZyB0aGUgbm9kZXNUb1JlbW92ZSB3aWxsIHByb2Nlc3MgYW5kIGRpc3Bvc2UgdmlldyBhbmQgdGFnIGJpbmRpbmdzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHVwZGF0ZWQgdGFnIGNvbnRyb2xcblxuXHRcdFx0XHRcdC8vIEluc2VydCBhbmQgbGluayBuZXcgY29udGVudFxuXHRcdFx0XHRcdHByb21pc2UgPSB2aWV3Lmxpbmsodmlldy5kYXRhLCB0YXJnZXQsIHByZXZOb2RlLCBuZXh0Tm9kZSwgc291cmNlVmFsdWUsIHRhZyAmJiB7dGFnOiB0YWcuX3RnSWQsIGxhenlMaW5rOiB0YWcudGFnQ3R4LnByb3BzLmxhenlMaW5rfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZGF0YS1saW5rZWQgdmFsdWUgdGFyZ2V0aW5nIGlubmVySFRNTDogZGF0YS1saW5rPVwiaHRtbHs6ZXhwcn1cIiBvciBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJcblx0XHRcdFx0XHRyZW5kZXJzID0gcmVuZGVycyAmJiB0YXJnZXRWYWwgIT09IHNvdXJjZVZhbHVlO1xuXHRcdFx0XHRcdGlmIChyZW5kZXJzKSB7XG5cdFx0XHRcdFx0XHQkdGFyZ2V0LmVtcHR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChyZW5kZXJzKSB7XG5cdFx0XHRcdFx0XHRwcm9taXNlID0gdmlldy5saW5rKHNvdXJjZSwgdGFyZ2V0LCBwcmV2Tm9kZSwgbmV4dE5vZGUsIHNvdXJjZVZhbHVlLCB0YWcgJiYge3RhZzogdGFnLl90Z0lkfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFJlbW92ZSBkeW5hbWljYWxseSBhZGRlZCBsaW5rQ3R4IGFuZCBjdHggZnJvbSB2aWV3XG5cdFx0XHRcdHZpZXcubGlua0N0eCA9IG9sZExpbmtDdHg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoY2hhbmdlID0gY2hhbmdlIHx8IHRhcmdldFZhbCAhPT0gc291cmNlVmFsdWUpIHtcblx0XHRcdFx0XHRpZiAoYXR0ciA9PT0gXCJ0ZXh0XCIgJiYgdGFyZ2V0LmNoaWxkcmVuICYmICF0YXJnZXQuY2hpbGRyZW5bMF0pIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgY29kZSBpcyBmYXN0ZXIgdGhlbiAkdGFyZ2V0LnRleHQoKVxuXHRcdFx0XHRcdFx0aWYgKHRhcmdldC50ZXh0Q29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldC50ZXh0Q29udGVudCA9IHNvdXJjZVZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0LmlubmVyVGV4dCA9IHNvdXJjZVZhbHVlID09PSBudWxsID8gXCJcIiA6IHNvdXJjZVZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQkdGFyZ2V0W3NldHRlcl0oc291cmNlVmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoKGpzdlNlbCA9IHRhcmdldFBhcmVudC5fanN2U2VsKVxuXHRcdFx0XHRcdC8vIFNldHRpbmcgdmFsdWUgb2YgPG9wdGlvbj4gZWxlbWVudFxuXHRcdFx0XHRcdCYmIChhdHRyID09PSBcInZhbHVlXCIgfHwgISR0YXJnZXQuYXR0cihcInZhbHVlXCIpKSkgeyAvLyBTZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSwgb3Igc2V0dGluZyB0ZXh0Q29udGVudCBpZiBhdHRyaWJ1dGUgaXMgbnVsbFxuXHRcdFx0XHRcdC8vIFNldC91bnNlbGVjdCBzZWxlY3Rpb24gYmFzZWQgb24gdmFsdWUgc2V0IG9uIHBhcmVudCA8c2VsZWN0Pi4gV29ya3MgZm9yIG11bHRpc2VsZWN0IHRvb1xuXHRcdFx0XHRcdHRhcmdldC5zZWxlY3RlZCA9ICQuaW5BcnJheShcIlwiICsgc291cmNlVmFsdWUsICRpc0FycmF5KGpzdlNlbCkgPyBqc3ZTZWwgOiBbanN2U2VsXSkgPiAtMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2hhbmdlID0gY2hhbmdlIHx8IHRhcmdldFZhbCAhPT0gc291cmNlVmFsdWUpIHtcblx0XHRcdC8vIFNldHRpbmcgYW4gYXR0cmlidXRlIHRvIHVuZGVmaW5lZCBzaG91bGQgcmVtb3ZlIHRoZSBhdHRyaWJ1dGVcblx0XHRcdCR0YXJnZXRbdXNlUHJvcCA/IFwicHJvcFwiIDogXCJhdHRyXCJdKGF0dHIsIHNvdXJjZVZhbHVlID09PSB1bmRlZmluZWQgJiYgIXVzZVByb3AgPyBudWxsIDogc291cmNlVmFsdWUpO1xuXHRcdH1cblx0XHRsaW5rQ3R4Ll92YWwgPSBzb3VyY2VWYWx1ZTtcblx0fVxuXHRyZXR1cm4gcHJvbWlzZSB8fCBjaGFuZ2U7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q2hhbmdlSGFuZGxlcihldiwgZXZlbnRBcmdzKSB7XG5cdHZhciBzZWxmID0gdGhpcyxcblx0XHRvbkJlZm9yZUNoYW5nZSA9IHNlbGYuaGxwKG9uQmVmb3JlQ2hhbmdlU3RyKSxcblx0XHRvbkFmdGVyQ2hhbmdlID0gc2VsZi5obHAob25BZnRlckNoYW5nZVN0cik7XG5cdGlmICghb25CZWZvcmVDaGFuZ2UgfHwgb25CZWZvcmVDaGFuZ2UuY2FsbCh0aGlzLCBldiwgZXZlbnRBcmdzKSAhPT0gZmFsc2UpIHtcblx0XHRpZiAoZXZlbnRBcmdzKSB7XG5cdFx0XHQvLyBUaGlzIGlzIGFuIG9ic2VydmFibGUgYWN0aW9uIChub3QgYSB0cmlnZ2VyL2hhbmRsZXIgY2FsbCBmcm9tIHB1c2hWYWx1ZXMsIG9yIHNpbWlsYXIsIGZvciB3aGljaCBldmVudEFyZ3Mgd2lsbCBiZSBudWxsKVxuXHRcdFx0dmFyIGFjdGlvbiA9IGV2ZW50QXJncy5jaGFuZ2UsXG5cdFx0XHRcdGluZGV4ID0gZXZlbnRBcmdzLmluZGV4LFxuXHRcdFx0XHRpdGVtcyA9IGV2ZW50QXJncy5pdGVtcztcblx0XHRcdHNlbGYuXy5zcnQgPSBldmVudEFyZ3MucmVmcmVzaDsgLy8gdHJ1ZSBpZiBwYXJ0IG9mIGEgJ3NvcnQnIG9uIHJlZnJlc2hcblx0XHRcdHN3aXRjaCAoYWN0aW9uKSB7XG5cdFx0XHRcdGNhc2UgXCJpbnNlcnRcIjpcblx0XHRcdFx0XHRzZWxmLmFkZFZpZXdzKGluZGV4LCBpdGVtcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJyZW1vdmVcIjpcblx0XHRcdFx0XHRzZWxmLnJlbW92ZVZpZXdzKGluZGV4LCBpdGVtcy5sZW5ndGgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibW92ZVwiOlxuXHRcdFx0XHRcdHNlbGYucmVtb3ZlVmlld3MoZXZlbnRBcmdzLm9sZEluZGV4LCBpdGVtcy5sZW5ndGgsIHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIHJlbW92ZVxuXHRcdFx0XHRcdHNlbGYuYWRkVmlld3MoaW5kZXgsIGl0ZW1zKTsgLy8gcmUtaW5zZXJ0XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJyZWZyZXNoXCI6XG5cdFx0XHRcdFx0c2VsZi5fLnNydCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRzZWxmLmZpeEluZGV4KDApO1xuXHRcdFx0XHRcdC8vIE90aGVyIGNhc2VzOiAoZS5nLnVuZGVmaW5lZCwgZm9yIHNldFByb3BlcnR5IG9uIG9ic2VydmFibGUgb2JqZWN0KSBldGMuIGRvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9uQWZ0ZXJDaGFuZ2UpIHtcblx0XHRcdG9uQWZ0ZXJDaGFuZ2UuY2FsbCh0aGlzLCBldiwgZXZlbnRBcmdzKTtcblx0XHR9XG5cdH1cbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXRpbGl0aWVzIGZvciBldmVudCBoYW5kbGVyc1xuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBzZXRBcnJheUNoYW5nZUxpbmsodmlldykge1xuXHQvLyBBZGQvcmVtb3ZlIGFycmF5Q2hhbmdlIGhhbmRsZXIgb24gdmlld1xuXHR2YXIgaGFuZGxlciwgYXJyYXlCaW5kaW5nLFxuXHRcdHR5cGUgPSB2aWV3LnR5cGUsIC8vIHVuZGVmaW5lZCBpZiB2aWV3IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRkYXRhID0gdmlldy5kYXRhLFxuXHRcdGJvdW5kID0gdmlldy5fLmJuZDsgLy8gdHJ1ZSBmb3IgdG9wLWxldmVsIGxpbmsoKSBvciBkYXRhLWxpbms9XCJ7Zm9yfVwiLCBvciB0aGUgZm9yIHRhZyBpbnN0YW5jZSBmb3Ige157Zm9yfX0gKG9yIGZvciBhbnkgY3VzdG9tIHRhZyB0aGF0IGhhcyBhbiBvbkFycmF5Q2hhbmdlIGhhbmRsZXIpXG5cblx0aWYgKCF2aWV3Ll8udXNlS2V5ICYmIGJvdW5kKSB7XG5cdFx0Ly8gVGhpcyBpcyBhbiBhcnJheSB2aWV3LiAodmlldy5fLnVzZUtleSBub3QgZGVmaW5lZCA9PiBkYXRhIGlzIGFycmF5KSwgYW5kIGlzIGRhdGEtYm91bmQgdG8gY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzXG5cblx0XHRpZiAoYXJyYXlCaW5kaW5nID0gdmlldy5fLmJuZEFycikge1xuXHRcdFx0Ly8gRmlyc3QgcmVtb3ZlIHRoZSBjdXJyZW50IGhhbmRsZXIgaWYgdGhlcmUgaXMgb25lXG5cdFx0XHQkKFthcnJheUJpbmRpbmdbMV1dKS5vZmYoYXJyYXlDaGFuZ2VTdHIsIGFycmF5QmluZGluZ1swXSk7XG5cdFx0XHR2aWV3Ll8uYm5kQXJyID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoYm91bmQgIT09ICEhYm91bmQpIHtcblx0XHRcdC8vIGJvdW5kIGlzIG5vdCBhIGJvb2xlYW4sIHNvIGl0IGlzIHRoZSBkYXRhLWxpbmtlZCB0YWcgdGhhdCAnb3ducycgdGhpcyBhcnJheSBiaW5kaW5nIC0gZS5nLiB7Xntmb3IuLi59fVxuXHRcdFx0aWYgKHR5cGUpIHtcblx0XHRcdFx0Ym91bmQuXy5hcnJWd3Nbdmlldy5fLmlkXSA9IHZpZXc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgYm91bmQuXy5hcnJWd3Nbdmlldy5fLmlkXTsgLy8gaWYgdmlldy50eXBlIGlzIHVuZGVmaW5lZCwgdmlldyBpcyBiZWluZyByZW1vdmVkXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0eXBlICYmIGRhdGEpIHtcblx0XHRcdC8vIElmIHRoaXMgdmlldyBpcyBub3QgYmVpbmcgcmVtb3ZlZCwgYnV0IHRoZSBkYXRhIGFycmF5IGhhcyBiZWVuIHJlcGxhY2VkLCB0aGVuIGJpbmQgdG8gdGhlIG5ldyBkYXRhIGFycmF5XG5cdFx0XHRoYW5kbGVyID0gZnVuY3Rpb24oZXYpIHtcblx0XHRcdFx0aWYgKCEoZXYuZGF0YSAmJiBldi5kYXRhLm9mZikpIHtcblx0XHRcdFx0XHQvLyBTa2lwIGlmICEhZXYuZGF0YS5vZmY6IC0gYSBoYW5kbGVyIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIChtYXliZSB3YXMgb24gaGFuZGxlciBjb2xsZWN0aW9uIGF0IGNhbGwgdGltZSAtIHRoZW4gcmVtb3ZlZCBieSBhbm90aGVyIGhhbmRsZXIpXG5cdFx0XHRcdFx0Ly8gSWYgdmlldy50eXBlIGlzIHVuZGVmaW5lZCwgZG8gbm90aGluZy4gKENvcnJlc3BvbmRzIHRvIGNhc2Ugd2hlcmUgdGhlcmUgaXMgYW5vdGhlciBoYW5kbGVyIG9uIHRoZSBzYW1lIGRhdGEgd2hvc2Vcblx0XHRcdFx0XHQvLyBlZmZlY3Qgd2FzIHRvIHJlbW92ZSB0aGlzIHZpZXcsIGFuZCB3aGljaCBoYXBwZW5lZCB0byBwcmVjZWRlIHRoaXMgZXZlbnQgaW4gdGhlIHRyaWdnZXIgc2VxdWVuY2UuIFNvIGFsdGhvdWdoIHRoaXNcblx0XHRcdFx0XHQvLyBldmVudCBoYXMgYmVlbiByZW1vdmVkIG5vdywgaXQgaXMgc3RpbGwgY2FsbGVkIHNpbmNlIGFscmVhZHkgb24gdGhlIHRyaWdnZXIgc2VxdWVuY2UpXG5cdFx0XHRcdFx0YXJyYXlDaGFuZ2VIYW5kbGVyLmFwcGx5KHZpZXcsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHQkKFtkYXRhXSkub24oYXJyYXlDaGFuZ2VTdHIsIGhhbmRsZXIpO1xuXHRcdFx0dmlldy5fLmJuZEFyciA9IFtoYW5kbGVyLCBkYXRhXTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdEF0dHIoZWxlbSwgdG8sIGxpbmtHZXRWYWwpIHtcblx0Ly8gdG86IHRydWUgLSBkZWZhdWx0IGF0dHJpYnV0ZSBmb3Igc2V0dGluZyBkYXRhIHZhbHVlIG9uIEhUTUwgZWxlbWVudDsgZmFsc2U6IGRlZmF1bHQgYXR0cmlidXRlIGZvciBnZXR0aW5nIHZhbHVlIGZyb20gSFRNTCBlbGVtZW50XG5cdC8vIE1lcmdlIGluIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSBiaW5kaW5ncyBmb3IgdGhpcyB0YXJnZXQgZWxlbWVudFxuXHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0YXR0ciA9XG5cdFx0XHQkc3ViU2V0dGluZ3NBZHZhbmNlZC5fZmVbbm9kZU5hbWVdIC8vIGdldCBmb3JtIGVsZW1lbnQgYmluZGluZyBzZXR0aW5ncyBmb3IgaW5wdXQgdGV4dGFyZWEgc2VsZWN0IG9yIG9wdGdyb3VwXG5cdFx0XHR8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gVFJVRSAmJiB7dG86IEhUTUwsIGZyb206IEhUTUx9OyAvLyBPciBpZiBjb250ZW50RWRpdGFibGUgc2V0IHRvIFwidHJ1ZVwiIHNldCBhdHRyIHRvIFwiaHRtbFwiXG5cdHJldHVybiBhdHRyXG5cdFx0PyAodG9cblx0XHRcdD8gKChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gUkFESU8pIC8vIEZvciByYWRpbyBidXR0b25zLCBiaW5kIGZyb20gdmFsdWUsIGJ1dCBiaW5kIHRvICdyYWRpbycgLSBzcGVjaWFsIHZhbHVlLlxuXHRcdFx0XHQ/IFJBRElPXG5cdFx0XHRcdDogYXR0ci50bylcblx0XHRcdDogYXR0ci5mcm9tKVxuXHRcdDogdG9cblx0XHRcdD8gbGlua0dldFZhbCA/IFwidGV4dFwiIDogSFRNTCAvLyBEZWZhdWx0IGlubmVyVGV4dCBmb3IgZGF0YS1saW5rPVwiYS5iLmNcIiBvciBkYXRhLWxpbms9XCJ7OmEuYi5jfVwiICh3aXRoIG9yIHdpdGhvdXQgY29udmVydGVycyktIG90aGVyd2lzZSBpbm5lckhUTUxcblx0XHRcdDogXCJcIjsgLy8gRGVmYXVsdCBpcyBub3QgdG8gYmluZCBmcm9tXG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZW5kZXJpbmcgYW5kIERPTSBpbnNlcnRpb25cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJlbmRlckFuZExpbmsodmlldywgaW5kZXgsIHRtcGwsIHZpZXdzLCBkYXRhLCBjb250ZXh0LCByZWZyZXNoKSB7XG5cdHZhciBodG1sLCBsaW5rVG9Ob2RlLCBwcmV2Vmlldywgbm9kZXNUb1JlbW92ZSwgYmluZElkLFxuXHRcdHBhcmVudE5vZGUgPSB2aWV3LnBhcmVudEVsZW0sXG5cdFx0cHJldk5vZGUgPSB2aWV3Ll9wcnYsXG5cdFx0bmV4dE5vZGUgPSB2aWV3Ll9ueHQsXG5cdFx0ZWxDbnQgPSB2aWV3Ll9lbENudDtcblxuXHRpZiAocHJldk5vZGUgJiYgcHJldk5vZGUucGFyZW50Tm9kZSAhPT0gcGFyZW50Tm9kZSkge1xuXHRcdGVycm9yKFwiTWlzc2luZyBwYXJlbnROb2RlXCIpO1xuXHRcdC8vIEFiYW5kb24sIHNpbmNlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkLCBvciB3cmFwcGVyIGVsZW1lbnQgaGFzIGJlZW4gaW5zZXJ0ZWQgYmV0d2VlbiBwcmV2Tm9kZSBhbmQgcGFyZW50Tm9kZVxuXHR9XG5cblx0aWYgKHJlZnJlc2gpIHtcblx0XHRub2Rlc1RvUmVtb3ZlID0gdmlldy5ub2RlcygpO1xuXHRcdGlmIChlbENudCAmJiBwcmV2Tm9kZSAmJiBwcmV2Tm9kZSAhPT0gbmV4dE5vZGUpIHtcblx0XHRcdC8vIFRoaXMgcHJldk5vZGUgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIERPTSwgc28gdHJhbnNmZXIgdGhlIHZpZXcgdG9rZW5zIG9uIHByZXZOb2RlIHRvIG5leHROb2RlIG9mIHRoaXMgJ3ZpZXdUb1JlZnJlc2gnXG5cdFx0XHR0cmFuc2ZlclZpZXdUb2tlbnMocHJldk5vZGUsIG5leHROb2RlLCBwYXJlbnROb2RlLCB2aWV3Ll8uaWQsIFwiX1wiLCB0cnVlKTtcblx0XHR9XG5cdFx0Ly8gUmVtb3ZlIGNoaWxkIHZpZXdzXG5cdFx0dmlldy5yZW1vdmVWaWV3cyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0bGlua1RvTm9kZSA9IG5leHROb2RlO1xuXG5cdFx0aWYgKGVsQ250KSB7XG5cdFx0XHRwcmV2Tm9kZSA9IHByZXZOb2RlXG5cdFx0XHRcdD8gcHJldk5vZGUucHJldmlvdXNTaWJsaW5nXG5cdFx0XHRcdDogbmV4dE5vZGVcblx0XHRcdFx0XHQ/IG5leHROb2RlLnByZXZpb3VzU2libGluZ1xuXHRcdFx0XHRcdDogcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIEhUTUwgbm9kZXNcblx0XHQkKG5vZGVzVG9SZW1vdmUpLnJlbW92ZSgpO1xuXG5cdFx0Zm9yIChiaW5kSWQgaW4gdmlldy5fLmJuZHMpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGJpbmRpbmdzIG1heSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGFib3ZlIGluOiAkKG5vZGVzVG9SZW1vdmUpLnJlbW92ZSgpO1xuXHRcdFx0Ly8gSWYgbm90LCByZW1vdmUgdGhlbSBoZXJlOlxuXHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcoYmluZElkKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gYWRkVmlld3MuIE9ubHkgY2FsbGVkIGlmIHZpZXcgaXMgb2YgdHlwZSBcImFycmF5XCJcblx0XHRpZiAoaW5kZXgpIHtcblx0XHRcdC8vIGluZGV4IGlzIGEgbnVtYmVyLCBzbyBpbmRleGVkIHZpZXcgaW4gdmlldyBhcnJheVxuXHRcdFx0cHJldlZpZXcgPSB2aWV3c1tpbmRleCAtIDFdO1xuXHRcdFx0aWYgKCFwcmV2Vmlldykge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7IC8vIElmIHN1YnZpZXcgZm9yIHByb3ZpZGVkIGluZGV4IGRvZXMgbm90IGV4aXN0LCBkbyBub3RoaW5nXG5cdFx0XHR9XG5cdFx0XHRwcmV2Tm9kZSA9IHByZXZWaWV3Ll9ueHQ7XG5cdFx0fVxuXHRcdGlmIChlbENudCkge1xuXHRcdFx0bGlua1RvTm9kZSA9IHByZXZOb2RlO1xuXHRcdFx0cHJldk5vZGUgPSBsaW5rVG9Ob2RlXG5cdFx0XHRcdD8gbGlua1RvTm9kZS5wcmV2aW91c1NpYmxpbmcgICAgICAgICAvLyBUaGVyZSBpcyBhIGxpbmtUb05vZGUsIHNvIGluc2VydCBhZnRlciBwcmV2aW91c1NpYmxpbmcsIG9yIGF0IHRoZSBiZWdpbm5pbmdcblx0XHRcdFx0OiBwYXJlbnROb2RlLmxhc3RDaGlsZDsgICAgICAgICAgICAgIC8vIElmIG5vIHByZXZWaWV3IGFuZCBubyBwcmV2Tm9kZSwgaW5kZXggaXMgMCBhbmQgdGhlIGNvbnRhaW5lciBpcyBlbXB0eSxcblx0XHRcdFx0Ly8gc28gcHJldk5vZGUgPSBsaW5rVG9Ob2RlID0gbnVsbC4gQnV0IGlmIHByZXZWaWV3Ll9ueHQgaXMgbnVsbCB0aGVuIHdlIHNldCBwcmV2Tm9kZSB0byBwYXJlbnROb2RlLmxhc3RDaGlsZFxuXHRcdFx0XHQvLyAod2hpY2ggbXVzdCBiZSBiZWZvcmUgdGhlIHByZXZWaWV3KSBzbyB3ZSBpbnNlcnQgYWZ0ZXIgdGhhdCBub2RlIC0gYW5kIG9ubHkgbGluayB0aGUgaW5zZXJ0ZWQgbm9kZXNcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGlua1RvTm9kZSA9IHByZXZOb2RlLm5leHRTaWJsaW5nO1xuXHRcdH1cblx0fVxuXHRodG1sID0gdG1wbC5yZW5kZXIoZGF0YSwgY29udGV4dCwgdmlldy5fLnVzZUtleSAmJiByZWZyZXNoLCB2aWV3LCByZWZyZXNoIHx8IGluZGV4LCB0cnVlKTtcblx0Ly8gUGFzcyBpbiB2aWV3Ll8udXNlS2V5IGFzIHRlc3QgZm9yIG5vSXRlcmF0aW9uICh3aGljaCBjb3JyZXNwb25kcyB0byB3aGVuIHNlbGYuXy51c2VLZXkgPiAwIGFuZCBzZWxmLmRhdGEgaXMgYW4gYXJyYXkpXG5cblx0Ly8gTGluayB0aGUgbmV3IEhUTUwgbm9kZXMgdG8gdGhlIGRhdGFcblx0dmlldy5saW5rKGRhdGEsIHBhcmVudE5vZGUsIHByZXZOb2RlLCBsaW5rVG9Ob2RlLCBodG1sLCBwcmV2Vmlldyk7XG4vL30sIDApO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PVxuLy8gYWRkQmluZGluZ01hcmtlcnNcbi8vPT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGFkZEJpbmRpbmdNYXJrZXJzKHZhbHVlLCB2aWV3LCB0YWcpIHtcblx0Ly8gSW5zZXJ0IGJpbmRpbmcgbWFya2VycyBpbnRvIHRoZSByZW5kZXJlZCB0ZW1wbGF0ZSBvdXRwdXQsIHdoaWNoIHdpbGwgZ2V0IGNvbnZlcnRlZCB0byBhcHByb3ByaWF0ZVxuXHQvLyBkYXRhLWpzdiBhdHRyaWJ1dGVzIChlbGVtZW50LW9ubHkgY29udGVudCkgb3Igc2NyaXB0IG1hcmtlciBub2RlcyAocGhyYXNpbmcgb3IgZmxvdyBjb250ZW50KSwgaW4gY29udmVydE1hcmtlcnMsXG5cdC8vIHdpdGhpbiB2aWV3LmxpbmssIHByaW9yIHRvIGluc2VydGluZyBpbnRvIHRoZSBET00uIExpbmtpbmcgd2lsbCB0aGVuIGJpbmQgYmFzZWQgb24gdGhlc2UgbWFya2VycyBpbiB0aGUgRE9NLlxuXHQvLyBBZGRlZCB2aWV3IG1hcmtlcnM6ICNtXy4uLlZJRVcuLi4vbV9cblx0Ly8gQWRkZWQgdGFnIG1hcmtlcnM6ICNtXi4uLlRBRy4uLi4vbV5cblx0dmFyIGlkLCBlbmQ7XG5cdGlmICh0YWcpIHtcblx0XHQvLyBUaGlzIGlzIGEgYmluZGluZyBtYXJrZXIgZm9yIGEgZGF0YS1saW5rZWQgdGFnIHteey4uLn19XG5cdFx0ZW5kID0gXCJeYFwiO1xuXHRcdGFkZExpbmtNZXRob2RzKHRhZywgdHJ1ZSk7IC8vIFRoaXMgaXMge157Pi4uLn19IG9yIHtee3RhZyAuLi59fSwge3tjdnQ6Li4ufSBvciB7Xns6Li4ufX0sIGFuZCB0YWcgd2FzIGRlZmluZWQgaW4gY29udmVydFZhbCBvciByZW5kZXJUYWdcblx0XHRpZCA9IHRhZy5fdGdJZDtcblx0XHRpZiAoIWlkKSB7XG5cdFx0XHRiaW5kaW5nU3RvcmVbaWQgPSBiaW5kaW5nS2V5KytdID0gdGFnOyAvLyBTdG9yZSB0aGUgdGFnIHRlbXBvcmFyaWx5LCByZWFkeSBmb3IgZGF0YWJpbmRpbmcuXG5cdFx0XHQvLyBEdXJpbmcgbGlua2luZywgaW4gYWRkRGF0YUJpbmRpbmcsIHRoZSB0YWcgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgbGlua0N0eCxcblx0XHRcdC8vIGFuZCB0aGVuIGluIG9ic2VydmVBbmRCaW5kLCBiaW5kaW5nU3RvcmVbYmluZElkXSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGJpbmRpbmcgaW5mby5cblx0XHRcdHRhZy5fdGdJZCA9IFwiXCIgKyBpZDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGJpbmRpbmcgbWFya2VyIGZvciBhIHZpZXdcblx0XHQvLyBBZGQgdGhlIHZpZXcgdG8gdGhlIHN0b3JlIG9mIGN1cnJlbnQgbGlua2VkIHZpZXdzXG5cdFx0ZW5kID0gXCJfYFwiO1xuXHRcdGFkZExpbmtNZXRob2RzKHZpZXdTdG9yZVtpZCA9IHZpZXcuXy5pZF0gPSB2aWV3KTtcblx0fVxuXHQvLyBFeGFtcGxlOiBcIiMyM15UaGVWYWx1ZS8yM15cIlxuXHRyZXR1cm4gXCIjXCIgKyBpZCArIGVuZFxuXHRcdCsgKHZhbHVlICE9IHVuZGVmaW5lZCA/IHZhbHVlIDogXCJcIikgLy8gRm9yIHteezpuYW1lfX0gdGhpcyBnaXZlcyB0aGUgZXF1aXZhbGVudCBzZW1hbnRpY3MgdG8gY29tcGlsZWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAodj1kYXRhLm5hbWUpIT1udWxsP3Y6XCJcIjsgdXNlZCBpbiB7ezpuYW1lfX0gb3IgZGF0YS1saW5rPVwibmFtZVwiXG5cdFx0KyBcIi9cIiArIGlkICsgZW5kO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGF0YS1saW5raW5nIGFuZCBkYXRhIGJpbmRpbmdcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vLS0tLS0tLS0tLS0tLS0tXG4vLyBvYnNlcnZlQW5kQmluZFxuLy8tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gb2JzZXJ2ZUFuZEJpbmQobGlua0N0eCwgc291cmNlLCB0YXJnZXQpIHtcblx0dmFyIGJpbmRpbmcsIGwsIGssIGxpbmtlZEVsZW0sIGV4cHJGbkRlcHMsIGV4cHJPYiwgcHJvcCwgcHJvcERlcHMsXG5cdFx0dGFnID0gbGlua0N0eC50YWcsXG5cdFx0Y3Z0QmsgPSBsaW5rQ3R4LmNvbnZlcnRCYWNrLFxuXHRcdGRlcGVuZHMgPSBbXSxcblx0XHRiaW5kSWQgPSBsaW5rQ3R4Ll9ibmRJZCB8fCBcIlwiICsgYmluZGluZ0tleSsrLFxuXHRcdGhhbmRsZXIgPSBsaW5rQ3R4Ll9oZGw7XG5cblx0bGlua0N0eC5fYm5kSWQgPSB1bmRlZmluZWQ7XG5cblx0aWYgKHRhZykge1xuXHRcdC8vIFVzZSB0aGUgJ2RlcGVuZHMnIHBhdGhzIHNldCBvbiBsaW5rQ3R4LnRhZyAtIHdoaWNoIG1heSBoYXZlIGJlZW4gc2V0IG9uIGRlY2xhcmF0aW9uXG5cdFx0Ly8gb3IgaW4gZXZlbnRzOiBpbml0LCByZW5kZXIsIG9uQWZ0ZXJMaW5rIGV0Yy5cblx0XHRkZXBlbmRzID0gdGFnLmRlcGVuZHMgfHwgZGVwZW5kcztcblx0XHRkZXBlbmRzID0gJGlzRnVuY3Rpb24oZGVwZW5kcykgPyB0YWcuZGVwZW5kcyh0YWcpIDogZGVwZW5kcztcblx0XHRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW07XG5cdH1cblx0aWYgKCFsaW5rQ3R4Ll9kZXBlbmRzIHx8IChcIlwiICsgbGlua0N0eC5fZGVwZW5kcyAhPT0gXCJcIiArIGRlcGVuZHMpKSB7XG5cdFx0Ly8gT25seSBiaW5kIHRoZSBmaXJzdCB0aW1lLCBvciBpZiB0aGUgbmV3IGRlcGVuZHMgKHRvU3RyaW5nKSBoYXMgY2hhbmdlZCBmcm9tIHdoZW4gbGFzdCBib3VuZFxuXHRcdGlmIChsaW5rQ3R4Ll9kZXBlbmRzKSB7XG5cdFx0XHQvLyBVbm9ic2VydmUgcHJldmlvdXMgYmluZGluZ1xuXHRcdFx0JG9ic2VydmFibGUuX2FwcGx5KGZhbHNlLCBbc291cmNlXSwgbGlua0N0eC5fZGVwZW5kcywgaGFuZGxlciwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0ZXhwckZuRGVwcyA9IGxpbmtDdHguZm4uZGVwcy5zbGljZSgpOyAvLyBNYWtlIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBwYXRocyBmb3IgdGhlIGNvbXBpbGVkIGxpbmtDdHggZXhwcmVzc2lvbiAtIHRvIHBhc3MgdG8gb2JzZXJ2ZSgpLiBJbiBnZXRJbm5lckNiKCksXG5cdFx0Ly8gKGFuZCB3aGVuZXZlciB0aGUgb2JqZWN0IGlzIHVwZGF0ZWQsIGluIGlubmVyQ2IpLCB3ZSB3aWxsIHNldCBleHByT2Iub2IgdG8gdGhlIGN1cnJlbnQgb2JqZWN0IHJldHVybmVkIGJ5IHRoYXQgY29tcHV0ZWQgZXhwcmVzc2lvbiwgZm9yIHRoaXMgdmlldy5cblxuXHRcdGlmICh0YWcgJiYgdGFnLmJvdW5kUHJvcHMpIHtcblx0XHRcdC8vIEFkZCBkZXBlbmRlbmN5IHBhdGhzIGZvciBkZWNsYXJlZCBib3VuZFByb3BzIChzbyBubyBuZWVkIHRvIHdyaXRoIF5teXByb3A9Li4uIHRvIGdldCBiaW5kaW5nKSBhbmQgZm9yIGxpbmtlZFByb3AgdG9vIGlmIHRoZXJlIGlzIG9uZVxuXHRcdFx0bCA9IHRhZy5ib3VuZFByb3BzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0cHJvcCA9IHRhZy5ib3VuZFByb3BzW2xdO1xuXHRcdFx0XHRrID0gdGFnLl8uYm5kLnBhdGhzLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKGstLSkge1xuXHRcdFx0XHRcdHByb3BEZXBzID0gdGFnLl8uYm5kLnBhdGhzW2tdW3Byb3BdO1xuXHRcdFx0XHRcdGlmIChwcm9wRGVwcyAmJiBwcm9wRGVwcy5za3ApIHsgLy8gTm90IGFscmVhZHkgYSBib3VuZCBwcm9wIF5wcm9wPWV4cHJlc3Npb247XG5cdFx0XHRcdFx0XHRleHByRm5EZXBzID0gZXhwckZuRGVwcy5jb25jYXQocHJvcERlcHMpOyAvLyBBZGQgZGVwZW5kZW5jaWVzIGZvciB0aGlzIHByb3AgZXhwcmVzc2lvblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGwgPSBleHByRm5EZXBzLmxlbmd0aDtcblx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRleHByT2IgPSBleHByRm5EZXBzW2xdO1xuXHRcdFx0aWYgKGV4cHJPYi5fanN2KSB7XG5cdFx0XHRcdC8vIFRoaXMgcGF0aCBpcyBhbiAnZXhwck9iJywgY29ycmVzcG9uZGluZyB0byBhIGNvbXB1dGVkLCByZXR1cm5pbmcgYW4gb2JqZWN0LiBXZSByZXBsYWNlIHRoZSBleHByT2IgYnlcblx0XHRcdFx0Ly8gYSB2aWV3LWJpbmRpbmctc3BlY2lmaWMgZXhwck9iIGluc3RhbmNlLiBUaGUgY3VycmVudCBvYmplY3Qgd2lsbCBiZSBzdG9yZWQgYXMgZXhwck9iLm9iLlxuXHRcdFx0XHRleHByRm5EZXBzW2xdID0gJGV4dGVuZCh7fSwgZXhwck9iKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRiaW5kaW5nID0gJG9ic2VydmFibGUuX2FwcGx5KFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRbc291cmNlXSxcblx0XHRcdGV4cHJGbkRlcHMsIC8vIGZsYXR0ZW4gdGhlIHBhdGhzIC0gdG8gZ2F0aGVyIGFsbCB0aGUgZGVwZW5kZW5jaWVzIGFjcm9zcyBhcmdzIGFuZCBib3VuZCBwYXJhbXNcblx0XHRcdGRlcGVuZHMsXG5cdFx0XHRoYW5kbGVyLFxuXHRcdFx0bGlua0N0eC5fY3R4Q2IpO1xuXHRcdC8vIFRoZSBiaW5kaW5nIHJldHVybmVkIGJ5ICRvYnNlcnZlIGhhcyBhIGJuZCBhcnJheSB3aXRoIHRoZSBzb3VyY2Ugb2JqZWN0cyBvZiB0aGUgaW5kaXZpZHVhbCBiaW5kaW5ncy5cblxuXHRcdGJpbmRpbmcuZWxlbSA9IHRhcmdldDsgLy8gVGhlIHRhcmdldCBvZiBhbGwgdGhlIGluZGl2aWR1YWwgYmluZGluZ3Ncblx0XHRiaW5kaW5nLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdGJpbmRpbmcuX3RnSWQgPSBiaW5kSWQ7XG5cblx0XHQvLyBBZGQgdG8gdGhlIF9qc3ZCbmQgb24gdGhlIHRhcmdldCB0aGUgdmlldyBpZCBhbmQgYmluZGluZyBpZCAtIGZvciB1bmJpbmRpbmcgd2hlbiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgcmVtb3ZlZFxuXHRcdHRhcmdldC5fanN2Qm5kID0gdGFyZ2V0Ll9qc3ZCbmQgfHwgXCJcIjtcblx0XHR0YXJnZXQuX2pzdkJuZCArPSBcIiZcIiArIGJpbmRJZDtcblx0XHRsaW5rQ3R4Ll9kZXBlbmRzID0gZGVwZW5kcztcblx0XHQvLyBTdG9yZSB0aGUgYmluZGluZyBrZXkgb24gdGhlIHZpZXcsIGZvciBkaXNwb3NhbCB3aGVuIHRoZSB2aWV3IGlzIHJlbW92ZWRcblx0XHRsaW5rQ3R4LnZpZXcuXy5ibmRzW2JpbmRJZF0gPSBiaW5kSWQ7XG5cdFx0Ly8gU3RvcmUgdGhlIGJpbmRpbmcuXG5cdFx0YmluZGluZ1N0b3JlW2JpbmRJZF0gPSBiaW5kaW5nOyAvLyBOb3RlOiBJZiB0aGlzIGNvcnJlc3BvbmRzIHRvIGEgZGF0YS1saW5rZWQgdGFnLCB3ZSBhcmUgcmVwbGFjaW5nIHRoZVxuXHRcdC8vIHRlbXBvcmFyaWx5IHN0b3JlZCB0YWcgYnkgdGhlIHN0b3JlZCBiaW5kaW5nLiBUaGUgdGFnIHdpbGwgbm93IGJlIGF0IGJpbmRpbmcubGlua0N0eC50YWdcblxuXHRcdGlmIChsaW5rZWRFbGVtKSB7XG5cdFx0XHRsID0gbGlua2VkRWxlbS5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdGxpbmtlZEVsZW1bbF0uX2pzdkxrRWwgPSB0YWc7XG5cdFx0XHRcdGJpbmRUbyhiaW5kaW5nLCB0YWcsIGxpbmtlZEVsZW1bbF0pO1xuXHRcdFx0XHRsaW5rZWRFbGVtW2xdLl9qc3ZCbmQgPSBcIiZcIiArIGJpbmRpbmcuX3RnSWQgKyBcIitcIjsgLy8gQWRkIGEgXCIrXCIgZm9yIGNsb25lZCBiaW5kaW5nIC0gc28gcmVtb3Zpbmdcblx0XHRcdFx0Ly8gZWxlbXMgd2l0aCBjbG9uZWQgYmluZGluZ3Mgd2lsbCBub3QgcmVtb3ZlIHRoZSAncGFyZW50JyBiaW5kaW5nIGZyb20gdGhlIGJpbmRpbmdTdG9yZS5cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGN2dEJrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGJpbmRUbyhiaW5kaW5nLCB0YWcsIHRhcmdldCwgY3Z0QmspO1xuXHRcdH1cblxuXHRcdGlmICh0YWcpIHtcblx0XHRcdGlmICghdGFnLmZsb3cgJiYgIXRhZy5fLmlubGluZSkge1xuXHRcdFx0XHR0YXJnZXQuc2V0QXR0cmlidXRlKGpzdkF0dHJTdHIsICh0YXJnZXQuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpfHxcIlwiKSArIFwiI1wiICsgYmluZElkICsgXCJeL1wiICsgYmluZElkICsgXCJeXCIpO1xuXHRcdFx0XHR0YWcuX3RnSWQgPSBcIlwiICsgYmluZElkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vLy0tLS0tLS1cbi8vICQubGlua1xuLy8tLS0tLS0tXG5cbmZ1bmN0aW9uIHRtcGxMaW5rKHRvLCBmcm9tLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50VmlldywgcHJldk5vZGUsIG5leHROb2RlKSB7XG5cdHJldHVybiAkbGluayh0aGlzLCB0bywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSk7XG59XG5cbmZ1bmN0aW9uICRsaW5rKHRtcGxPckxpbmtFeHByLCB0bywgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHQvLyBXaGVuIGxpbmtpbmcgZnJvbSBhIHRlbXBsYXRlLCBwcmV2Tm9kZSBhbmQgbmV4dE5vZGUgcGFyYW1ldGVycyBhcmUgaWdub3JlZFxuXHRpZiAoY29udGV4dCA9PT0gdHJ1ZSkge1xuXHRcdG5vSXRlcmF0aW9uID0gY29udGV4dDsgLy8gcGFzc2luZyBib29sZWFuIGFzIHRoaXJkIHBhcmFtIC0gbm9JdGVyYXRpb25cblx0XHRjb250ZXh0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0Y29udGV4dCA9IHVuZGVmaW5lZDsgLy8gY29udGV4dCBtdXN0IGJlIGEgYm9vbGVhbiAobm9JdGVyYXRpb24pIG9yIGEgcGxhaW4gb2JqZWN0XG5cdH0gZWxzZSB7XG5cdFx0Y29udGV4dCA9ICRleHRlbmQoe30sIGNvbnRleHQpO1xuXHR9XG5cdGlmICh0bXBsT3JMaW5rRXhwciAmJiB0bykge1xuXHRcdHRvID0gdG8uanF1ZXJ5ID8gdG8gOiAkKHRvKTsgLy8gdG8gaXMgYSBqcXVlcnkgb2JqZWN0IG9yIGFuIGVsZW1lbnQgb3Igc2VsZWN0b3JcblxuXHRcdGlmICghYWN0aXZlQm9keSkge1xuXHRcdFx0YWN0aXZlQm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdFx0XHQkKGFjdGl2ZUJvZHkpXG5cdFx0XHRcdC5vbihlbGVtZW50Q2hhbmdlU3RyLCBlbGVtQ2hhbmdlSGFuZGxlcilcblx0XHRcdFx0Lm9uKCdibHVyJywgJ1tjb250ZW50ZWRpdGFibGVdJywgZWxlbUNoYW5nZUhhbmRsZXIpO1xuXHRcdH1cblxuXHRcdHZhciBpLCBrLCBodG1sLCB2d0luZm9zLCB2aWV3LCBwbGFjZWhvbGRlclBhcmVudCwgdGFyZ2V0RWwsIHJlZnJlc2gsIHRvcExldmVsQ2FsbCxcblx0XHRcdG9uUmVuZGVyID0gYWRkQmluZGluZ01hcmtlcnMsXG5cdFx0XHRyZXBsYWNlTW9kZSA9IGNvbnRleHQgJiYgY29udGV4dC50YXJnZXQgPT09IFwicmVwbGFjZVwiLFxuXHRcdFx0bCA9IHRvLmxlbmd0aDtcblxuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdHRhcmdldEVsID0gdG9bbF07XG5cblx0XHRcdHBhcmVudFZpZXcgPSBwYXJlbnRWaWV3IHx8ICR2aWV3KHRhcmdldEVsKTtcblxuXHRcdFx0aWYgKHRvcExldmVsQ2FsbCA9IHBhcmVudFZpZXcgPT09IHRvcFZpZXcpIHtcblx0XHRcdFx0dG9wVmlldy5kYXRhID0gKHRvcFZpZXcuY3R4ID0gY29udGV4dCB8fCB7fSkucm9vdCA9IGZyb207XG5cdFx0XHR9XG5cdFx0XHRpZiAoXCJcIiArIHRtcGxPckxpbmtFeHByID09PSB0bXBsT3JMaW5rRXhwcikge1xuXHRcdFx0XHQvLyB0bXBsT3JMaW5rRXhwciBpcyBhIHN0cmluZzogdHJlYXQgYXMgZGF0YS1saW5rIGV4cHJlc3Npb24uXG5cdFx0XHRcdGFkZERhdGFCaW5kaW5nKHRtcGxPckxpbmtFeHByLCB0YXJnZXRFbCwgcGFyZW50VmlldywgdW5kZWZpbmVkLCB0cnVlLCBmcm9tLCBjb250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICh0bXBsT3JMaW5rRXhwci5tYXJrdXAgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBjYWxsIHRvIHRlbXBsYXRlLmxpbmsoKVxuXHRcdFx0XHRcdGlmIChyZXBsYWNlTW9kZSkge1xuXHRcdFx0XHRcdFx0cGxhY2Vob2xkZXJQYXJlbnQgPSB0YXJnZXRFbC5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGh0bWwgPSB0bXBsT3JMaW5rRXhwci5yZW5kZXIoZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgb25SZW5kZXIpO1xuXHRcdFx0XHRcdC8vIFRPRE8gQ29uc2lkZXIgZmluZGluZyBhIHdheSB0byBiaW5kIGRhdGEgKGxpbmspIHdpdGhpbiB0ZW1wbGF0ZSB3aXRob3V0IGh0bWwgYmVpbmcgZGlmZmVyZW50IGZvciBlYWNoIHZpZXcsIHRoZSBIVE1MIGNhblxuXHRcdFx0XHRcdC8vIGJlIGV2YWx1YXRlZCBvbmNlIG91dHNpZGUgdGhlIHdoaWxlIChsLS0pLCBhbmQgcHVzaGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCwgdGhlbiBjbG9uZWQgYW5kIGluc2VydGVkIGF0IGVhY2ggdGFyZ2V0LlxuXG5cdFx0XHRcdFx0aWYgKHBsYWNlaG9sZGVyUGFyZW50KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIHRhcmdldD1cInJlcGxhY2VcIiBtb2RlXG5cdFx0XHRcdFx0XHRwcmV2Tm9kZSA9IHRhcmdldEVsLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0XHRcdG5leHROb2RlID0gdGFyZ2V0RWwubmV4dFNpYmxpbmc7XG5cdFx0XHRcdFx0XHQkLmNsZWFuRGF0YShbdGFyZ2V0RWxdLCB0cnVlKTtcblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyUGFyZW50LnJlbW92ZUNoaWxkKHRhcmdldEVsKTtcblxuXHRcdFx0XHRcdFx0dGFyZ2V0RWwgPSBwbGFjZWhvbGRlclBhcmVudDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cHJldk5vZGUgPSBuZXh0Tm9kZSA9IHVuZGVmaW5lZDsgLy8gV2hlbiBsaW5raW5nIGZyb20gYSB0ZW1wbGF0ZSwgcHJldk5vZGUgYW5kIG5leHROb2RlIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWRcblx0XHRcdFx0XHRcdCQodGFyZ2V0RWwpLmVtcHR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHRtcGxPckxpbmtFeHByID09PSB0cnVlICYmIHBhcmVudFZpZXcgPT09IHRvcFZpZXcpIHtcblx0XHRcdFx0XHQvLyAkLmxpbmsodHJ1ZSwgc2VsZWN0b3IsIGRhdGEsIGN0eCkgLSB3aGVyZSBzZWxlY3RvciBwb2ludHMgdG8gZWxlbSBpbiB0b3AtbGV2ZWwgY29udGVudC4gKElmIG5vdCB0b3AtbGV2ZWwgY29udGVudCwgbm8tb3ApXG5cdFx0XHRcdFx0cmVmcmVzaCA9IHtsbms6IDF9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cbi8vIFRPRE8gQ29uc2lkZXIgZGVmZXJyZWQgbGlua2luZyBBUEkgZmVhdHVyZSBvbiBwZXItdGVtcGxhdGUgYmFzaXMgLSB7QHsgaW5zdGVhZCBvZiB7Xnsgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUgcmVuZGVyZWQgY29udGVudFxuLy8gYmVmb3JlIHRoYXQgY29udGVudCBpcyBsaW5rZWQsIHdpdGggYmV0dGVyIHBlcmNlaXZlZCBwZXJmLiBIYXZlIHZpZXcubGluayByZXR1cm4gYSBkZWZlcnJlZCwgYW5kIHBhc3MgdGhhdCB0byBvbkFmdGVyTGluay4uLlxuLy8gb3Igc29tZXRoaW5nIGFsb25nIHRob3NlIGxpbmVzLlxuLy8gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRpZiAodGFyZ2V0RWwuX2RmICYmICFuZXh0Tm9kZSkge1xuXHRcdFx0XHRcdC8vIFdlIGFyZSBpbnNlcnRpbmcgbmV3IGNvbnRlbnQgYW5kIHRoZSB0YXJnZXQgZWxlbWVudCBoYXMgc29tZSBkZWZlcnJlZCBiaW5kaW5nIGFubm90YXRpb25zLGFuZCB0aGVyZSBpcyBubyBuZXh0Tm9kZS5cblx0XHRcdFx0XHQvLyBUaG9zZSB2aWV3cyBtYXkgYmUgc3RhbGUgdmlld3MgKHRoYXQgd2lsbCBiZSByZWNyZWF0ZWQgaW4gdGhpcyBuZXcgbGlua2luZyBhY3Rpb24pIHNvIHdlIHdpbGwgZmlyc3QgcmVtb3ZlIHRoZW1cblx0XHRcdFx0XHQvLyAoaWYgbm90IGFscmVhZHkgcmVtb3ZlZCkuXG5cdFx0XHRcdFx0dndJbmZvcyA9IHZpZXdJbmZvcyh0YXJnZXRFbC5fZGYsIHRydWUsIHJPcGVuVmlld01hcmtlcnMpO1xuXG5cdFx0XHRcdFx0Zm9yIChpID0gMCwgayA9IHZ3SW5mb3MubGVuZ3RoOyBpIDwgazsgaSsrKSB7XG5cdFx0XHRcdFx0XHR2aWV3ID0gdndJbmZvc1tpXTtcblx0XHRcdFx0XHRcdGlmICgodmlldyA9IHZpZXdTdG9yZVt2aWV3LmlkXSkgJiYgdmlldy5kYXRhICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhpcyBpcyB0aGUgX3BydiAocHJldk5vZGUpIGZvciBhIHZpZXcsIHJlbW92ZSB0aGUgdmlld1xuXHRcdFx0XHRcdFx0XHQvLyAtIHVubGVzcyB2aWV3LmRhdGEgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIGFscmVhZHkgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0XHRcdFx0XHR2aWV3LnBhcmVudC5yZW1vdmVWaWV3cyh2aWV3Ll8ua2V5LCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRFbCk7IC8vIHJlbW92ZSBkZWZlciB0b2tlbnNcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIExpbmsgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQsIHNpbmNlIHRoaXMgaXMgYSBjYWxsIHRvIHRlbXBsYXRlLmxpbmsoKSwgb3IgdG8gJChlbCkubGluayh0cnVlLCAuLi4pLFxuXHRcdFx0XHRwYXJlbnRWaWV3LmxpbmsoZnJvbSwgdGFyZ2V0RWwsIHByZXZOb2RlLCBuZXh0Tm9kZSwgaHRtbCwgcmVmcmVzaCwgY29udGV4dCk7XG4vL30sIDApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRvcExldmVsQ2FsbCkge1xuXHRcdFx0XHR0b3BWaWV3LmRhdGEgPSB0b3BWaWV3LmN0eCA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRvOyAvLyBBbGxvdyBjaGFpbmluZywgdG8gYXR0YWNoIGV2ZW50IGhhbmRsZXJzLCBldGMuXG59XG5cbi8vLS0tLS0tLS0tLVxuLy8gdmlldy5saW5rXG4vLy0tLS0tLS0tLS1cblxuZnVuY3Rpb24gdmlld0xpbmsob3V0ZXJEYXRhLCBwYXJlbnROb2RlLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIGh0bWwsIHJlZnJlc2gsIGNvbnRleHQsIHZhbGlkYXRlT25seSkge1xuXHQvLyBPcHRpb25hbGx5IGluc2VydCBIVE1MIGludG8gRE9NIHVzaW5nIGRvY3VtZW50RnJhZ21lbnRzIChhbmQgd3JhcHBpbmcgSFRNTCBhcHByb3ByaWF0ZWx5KS5cblx0Ly8gRGF0YS1saW5rIGV4aXN0aW5nIGNvbnRlbnRzIG9mIHBhcmVudE5vZGUsIG9yIHRoZSBpbnNlcnRlZCBIVE1MLCBpZiBwcm92aWRlZFxuXG5cdC8vIERlcGVuZGluZyBvbiB0aGUgY29udGVudCBtb2RlbCBmb3IgdGhlIEhUTUwgZWxlbWVudHMsIHRoZSBzdGFuZGFyZCBkYXRhLWxpbmtpbmcgbWFya2VycyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBieSBhZGRCaW5kaW5nTWFya2VycyBkdXJpbmdcblx0Ly8gdGVtcGxhdGUgcmVuZGVyaW5nIHdpbGwgYmUgY29udmVydGVkIGVpdGhlciB0byBzY3JpcHQgbWFya2VyIG5vZGVzIG9yLCBmb3IgZWxlbWVudC1vbmx5IGNvbnRlbnQgc2VjdGlvbnMsIHRvIGRhdGEtanN2IGVsZW1lbnQgYW5ub3RhdGlvbnMuXG5cblx0Ly8gRGF0YS1saW5raW5nIHdpbGwgdGhlbiBhZGQgX3BydiBhbmQgX254dCB0byB2aWV3cywgd2hlcmU6XG5cdC8vICAgICBfcHJ2OiBSZWZlcmVuY2VzIHRoZSBwcmV2aW91cyBub2RlIChzY3JpcHQgZWxlbWVudCBvZiB0eXBlIFwianN2MTIzXCIpLCBvciAoZm9yIGVsQ250PXRydWUpLCB0aGUgZmlyc3QgZWxlbWVudCBub2RlIGluIHRoZSB2aWV3IChvciBpZiBub25lLCBzZXQgX3BydiA9IF9ueHQpXG5cdC8vICAgICBfbnh0OiBSZWZlcmVuY2VzIHRoZSBsYXN0IG5vZGUgKHNjcmlwdCBlbGVtZW50IG9mIHR5cGUgXCJqc3YvMTIzXCIpLCBvciAoZm9yIGVsQ250PXRydWUpLCB0aGUgbmV4dCBlbGVtZW50IG5vZGUgYWZ0ZXIgdGhlIHZpZXcuXG5cblx0Ly89PT09IG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXHRmdW5jdGlvbiBjb252ZXJ0TWFya2VycyhhbGwsIHByZWNlZGluZywgc2VsZkNsb3NlLCBjbG9zZVRhZywgc3BhY2VCZWZvcmUsIGlkLCBib3VuZElkLCBzcGFjZUFmdGVyLCB0YWcxLCB0YWcyLCBjbG9zZVRhZzIsIHNwYWNlQWZ0ZXJDbG9zZSwgc2VsZkNsb3NlMiwgZW5kT3BlblRhZykge1xuXHRcdC8vIHJDb252ZXJ0TWFya2VycyA9IC8oXnwoXFwvPil8PFxcLyhcXHcrKT58KShcXHMqKShbI1xcL11cXGQrKD86X3woXFxeKSkpYChcXHMqKSg8XFx3Kyg/PVtcXHNcXC8+XSkpP3xcXHMqKD86KDxcXHcrKD89W1xcc1xcLz5dKSl8PFxcLyhcXHcrKT4oXFxzKil8KFxcLz4pXFxzKnwoPikpL2csXG5cdFx0Ly8gICAgICAgICAgICAgICAgIHByZWMsIHNsZkNsLCBjbHNUYWcsICBzcEJlZm9yZSwgaWQsICAgICAgYm5kSWQgIHNwQWZ0ZXIsdGFnMSwgICAgICAgICAgICAgICAgICAgdGFnMiwgICAgICAgICAgICAgICBjbFRhZzIsc2FjICBzbGZDbDIsIGVuZE9wZW5UYWdcblx0XHQvLyBDb252ZXJ0IHRoZSBtYXJrZXJzIHRoYXQgd2VyZSBpbmNsdWRlZCBieSBhZGRCaW5kaW5nTWFya2VycyBpbiB0ZW1wbGF0ZSBvdXRwdXQsIHRvIGFwcHJvcHJpYXRlIERPTSBhbm5vdGF0aW9uczpcblx0XHQvLyBkYXRhLWpzdiBhdHRyaWJ1dGVzIChmb3IgZWxlbWVudC1vbmx5IGNvbnRlbnQpIG9yIHNjcmlwdCBtYXJrZXIgbm9kZXMgKHdpdGhpbiBwaHJhc2luZyBvciBmbG93IGNvbnRlbnQpLlxuXG4vLyBUT0RPIGNvbnNpZGVyIGRldGVjdGluZyAncXVvdGVkJyBjb250ZXh0cyAoYXR0cmlidXRlIHN0cmluZ3MpIHNvIHRoYXQgYXR0cmlidXRlIGVuY29kaW5nIGRvZXMgbm90IG5lZWQgdG8gZW5jb2RlID5cbi8vIEN1cnJlbnRseSByQXR0ckVuY29kZSA9IC9bPjxcIicmXS9nIGluY2x1ZGVzICc+JyBlbmNvZGluZyBpbiBvcmRlciB0byBhdm9pZCBlcnJvbmVvdXMgcGFyc2luZyBvZiA8c3BhbiB0aXRsZT1cIiZsdDthLz5cIj48L3NwYW4+XCI+XG5cdFx0dmFyIGVycm9yTXNnLCBibmRJZCxcblx0XHRcdGVuZE9mRWxDbnQgPSBcIlwiO1xuXHRcdGlmIChlbmRPcGVuVGFnKSB7XG5cdFx0XHRpblRhZyA9IDA7XG5cdFx0XHRyZXR1cm4gYWxsO1xuXHRcdH1cblx0XHR0YWcgPSB0YWcxIHx8IHRhZzIgfHwgXCJcIjtcblx0XHRjbG9zZVRhZyA9IGNsb3NlVGFnIHx8IGNsb3NlVGFnMjtcblx0XHRzZWxmQ2xvc2UgPSBzZWxmQ2xvc2UgfHwgc2VsZkNsb3NlMjtcblx0XHRpZiAoaXNWb2lkICYmICFzZWxmQ2xvc2UgJiYgKCAhYWxsIHx8IGNsb3NlVGFnIHx8IHRhZyB8fCBpZCAmJiAhaW5UYWcpKSB7IC8vICFhbGwgPSBlbmQgb2Ygc3RyaW5nXG5cdFx0XHRpc1ZvaWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRwYXJlbnRUYWcgPSB0YWdTdGFjay5zaGlmdCgpOyAvLyBwcmVjZWRpbmcgdGFnIHdhcyBhIHZvaWQgZWxlbWVudCwgd2l0aCBubyBjbG9zaW5nIHNsYXNoLCBzdWNoIGFzIDxicj4uXG5cdFx0fVxuXHRcdGNsb3NlVGFnID0gY2xvc2VUYWcgfHwgc2VsZkNsb3NlO1xuXHRcdGlmIChjbG9zZVRhZykge1xuXHRcdFx0aW5UYWcgPSAwO1xuXHRcdFx0aXNWb2lkID0gdW5kZWZpbmVkO1xuXHRcdFx0Ly8gVE9ETzogc21hcnQgaW5zZXJ0aW9uIG9mIDx0Ym9keT4gLSB0byBiZSBjb21wbGV0ZWQgZm9yIHJvYnVzdCBpbnNlcnRpb24gb2YgZGVmZXJyZWQgYmluZGluZ3MgZXRjLlxuXHRcdFx0Ly9pZiAoY2xvc2VUYWcgPT09IFwidGFibGVcIiAmJiBwYXJlbnRUYWcgPT09IFwidGJvZHlcIikge1xuXHRcdFx0Ly9cdHByZWNlZGluZyA9IFwiPC90Ym9keT5cIiArIHByZWNlZGluZztcblx0XHRcdC8vXHRwYXJlbnRUYWcgPSBcInRhYmxlXCI7XG5cdFx0XHQvL1x0dGFnU3RhY2suc2hpZnQoKTtcblx0XHRcdC8vfVxuXHRcdFx0aWYgKHZhbGlkYXRlKSB7XG5cdFx0XHRcdGlmIChzZWxmQ2xvc2UgfHwgc2VsZkNsb3NlMikge1xuXHRcdFx0XHRcdGlmICghdm9pZEVsZW1zW3BhcmVudFRhZ10gJiYgIS87c3ZnO3w7bWF0aDsvLnRlc3QoXCI7XCIgKyB0YWdTdGFjay5qb2luKFwiO1wiKSArIFwiO1wiKSkge1xuXHRcdFx0XHRcdFx0Ly8gT25seSBzZWxmLWNsb3NpbmcgZWxlbWVudHMgbXVzdCBiZSBsZWdpdGltYXRlIHZvaWQgZWxlbWVudHMsIHN1Y2ggYXMgPGJyLz4sIHBlciBIVE1MIHNjaGVtYSxcblx0XHRcdFx0XHRcdC8vIG9yIHVuZGVyIHN2ZyBvciBtYXRoIGZvcmVpZ24gbmFtZXNwYWNlIGVsZW1lbnRzLlxuXHRcdFx0XHRcdFx0ZXJyb3JNc2cgPSBcIic8XCIgKyBwYXJlbnRUYWcgKyBcIi4uLi9cIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAodm9pZEVsZW1zW2Nsb3NlVGFnXSkge1xuXHRcdFx0XHRcdGVycm9yTXNnID0gXCInPC9cIiArIGNsb3NlVGFnOyAvLyBjbG9zaW5nIHRhZyBzdWNoIGFzIDwvaW5wdXQ+XG5cdFx0XHRcdH0gZWxzZSBpZiAoIXRhZ1N0YWNrLmxlbmd0aCB8fCBjbG9zZVRhZyAhPT0gcGFyZW50VGFnKSB7XG5cdFx0XHRcdFx0ZXJyb3JNc2cgPSBcIk1pc21hdGNoOiAnPC9cIiArIGNsb3NlVGFnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChlcnJvck1zZykge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKGVycm9yTXNnICsgXCI+JyBpbjpcXG5cIiArIGh0bWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwcmV2RWxDbnQgPSBlbENudDtcblx0XHRcdHBhcmVudFRhZyA9IHRhZ1N0YWNrLnNoaWZ0KCk7XG5cdFx0XHRlbENudCA9IGVsQ29udGVudFtwYXJlbnRUYWddO1xuXHRcdFx0Y2xvc2VUYWcyID0gY2xvc2VUYWcyID8gKFwiPC9cIiArIGNsb3NlVGFnMiArIFwiPlwiKSA6IFwiXCI7XG5cdFx0XHRpZiAocHJldkVsQ250KSB7XG5cdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBpZHMgKG1hcmtlcnMgc2luY2UgdGhlIGxhc3QgdGFnKSwgbW92ZSB0aGVtIHRvIHRoZSBkZWZlciBzdHJpbmdcblx0XHRcdFx0ZGVmZXIgKz0gaWRzO1xuXHRcdFx0XHRpZHMgPSBcIlwiO1xuXHRcdFx0XHRpZiAoIWVsQ250KSB7XG5cdFx0XHRcdFx0ZW5kT2ZFbENudCA9IGNsb3NlVGFnMiArIG9wZW5TY3JpcHQgKyBcIkBcIiArIGRlZmVyICsgY2xvc2VTY3JpcHQgKyAoc3BhY2VBZnRlckNsb3NlIHx8IFwiXCIpO1xuXHRcdFx0XHRcdGRlZmVyID0gZGVmZXJTdGFjay5zaGlmdCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVyICs9IFwiLVwiOyAvLyBXaWxsIGJlIHVzZWQgZm9yIHN0ZXBwaW5nIGJhY2sgdGhyb3VnaCBkZWZlcnJlZCB0b2tlbnNcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoZWxDbnQpIHtcblx0XHRcdC8vIGVsQ29udGVudCBtYXBzIHRhZ05hbWVzIHdoaWNoIGhhdmUgb25seSBlbGVtZW50IGNvbnRlbnQsIHNvIG1heSBub3Qgc3VwcG9ydCBzY3JpcHQgbm9kZXMuXG5cdFx0XHQvLyBXZSBhcmUgaW4gZWxlbWVudC1vbmx5IGNvbnRlbnQsIGNhbiByZW1vdmUgd2hpdGUgc3BhY2UsIGFuZCB1c2UgZGF0YS1qc3YgYXR0cmlidXRlcyBvbiBlbGVtZW50cyBhcyBtYXJrZXJzXG5cdFx0XHQvLyBFeGFtcGxlOiA8dHIgZGF0YS1qc3Y9XCIvMl8jNl9cIj4gLSBjbG9zZSBtYXJrZXIgZm9yIHZpZXcgMiBhbmQgb3BlbiBtYXJrZXIgZm9yIHZpZXcgNlxuXG5cdFx0XHRpZiAoaWQpIHtcblx0XHRcdFx0Ly8gYXBwZW5kIG1hcmtlciBmb3IgdGhpcyBpZCwgdG8gaWRzIHN0cmluZ1xuXHRcdFx0XHRpZHMgKz0gaWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcmVjZWRpbmcgPSAoY2xvc2VUYWcyIHx8IHNlbGZDbG9zZTIgfHwgXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFnKSB7XG5cdFx0XHRcdC8vIFRPRE86IHNtYXJ0IGluc2VydGlvbiBvZiA8dGJvZHk+IC0gdG8gYmUgY29tcGxldGVkIGZvciByb2J1c3QgaW5zZXJ0aW9uIG9mIGRlZmVycmVkIGJpbmRpbmdzIGV0Yy5cblx0XHRcdFx0Ly9pZiAodGFnID09PSBcIjx0clwiICYmIHBhcmVudFRhZyA9PT0gXCJ0YWJsZVwiKSB7XG5cdFx0XHRcdC8vXHR0YWdTdGFjay51bnNoaWZ0KHBhcmVudFRhZyk7XG5cdFx0XHRcdC8vXHRwYXJlbnRUYWcgPSBcInRib2R5XCI7XG5cdFx0XHRcdC8vXHRwcmVjZWRpbmcgKz0gXCI8XCIgKyBwYXJlbnRUYWcgKyBcIj5cIjtcblx0XHRcdFx0Ly9cdGlmIChkZWZlcikge1xuXHRcdFx0XHQvL1x0XHRkZWZlciArPSBcIitcIjsgLy8gV2lsbCBiZSB1c2VkIGZvciBzdGVwcGluZyBiYWNrIHRocm91Z2ggZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHRcdC8vXHR9XG5cdFx0XHRcdC8vXHQvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gZGVzaWduLXRpbWUgdmFsaWRhdGlvbiBjaGVja1xuXHRcdFx0XHQvL1x0Ly9cdGVycm9yKCdcIicgKyBwYXJlbnRUYWcgKyAnXCIgaGFzIGluY29ycmVjdCBwYXJlbnQgdGFnJyk7XG5cdFx0XHRcdC8vfVxuXHRcdFx0XHRwcmVjZWRpbmcgKz0gdGFnO1xuXHRcdFx0XHRpZiAoaWRzKSB7XG5cdFx0XHRcdFx0cHJlY2VkaW5nICs9ICcgJyArIGpzdkF0dHJTdHIgKyAnPVwiJyArIGlkcyArICdcIic7XG5cdFx0XHRcdFx0aWRzID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBhcmUgaW4gcGhyYXNpbmcgb3IgZmxvdyBjb250ZW50LCBzbyB1c2Ugc2NyaXB0IG1hcmtlciBub2Rlc1xuXHRcdFx0Ly8gRXhhbXBsZTogPHNjcmlwdCB0eXBlPVwianN2My9cIj48L3NjcmlwdD4gLSBkYXRhLWxpbmtlZCB0YWcsIGNsb3NlIG1hcmtlclxuXHRcdFx0Ly8gV2UgdmFsaWRhdGUgd2l0aCBpblRhZyBzbyBubyBzY3JpcHQgbWFya2VycyBhcmUgaW5zZXJ0ZWQgaW4gYXR0cmlidXRlIGNvbnRleHQgZS5nLiBmb3I6XG5cdFx0XHQvLyBcIjx0YWJsZSB7e2lmIC4uLn19Li4ue3svaWZ9fS4uLiA+XCIgb3IgXCI8dGFibGUge3tpZiAuLi59fS4uLj4gLi4ue3svaWZ9fS4uLlwiXG5cdFx0XHRwcmVjZWRpbmcgPSBpZFxuXHRcdFx0XHQ/IChwcmVjZWRpbmcgKyBlbmRPZkVsQ250ICsgc3BhY2VCZWZvcmUgKyAoaW5UYWcgPyBcIlwiIDogb3BlblNjcmlwdCArIGlkICsgY2xvc2VTY3JpcHQpKyBzcGFjZUFmdGVyICsgdGFnKVxuXHRcdFx0XHQ6IGVuZE9mRWxDbnQgfHwgYWxsO1xuXHRcdH1cblxuXHRcdGlmICh2YWxpZGF0ZSAmJiBib3VuZElkKSB7XG5cdFx0XHRpZiAoaW5UYWcpIHtcblx0XHRcdFx0Ly8gSnNWaWV3cyBkYXRhLWxpbmtpbmcgdGFncyBhcmUgbm90IGFsbG93ZWQgd2l0aGluIGVsZW1lbnQgbWFya3VwLlxuXHRcdFx0XHQvLyBTZWUganN2aWV3cy9pc3N1ZXMvMzAzXG5cdFx0XHRcdHN5bnRheEVycm9yKCd7Xnsgd2l0aGluIGVsZW0gbWFya3VwICgnICsgaW5UYWcgKyAnICkuIFVzZSBkYXRhLWxpbms9XCIuLi5cIicpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlkLmNoYXJBdCgwKSA9PT0gXCIjXCIpIHtcblx0XHRcdFx0dGFnU3RhY2sudW5zaGlmdChpZC5zbGljZSgxKSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlkLnNsaWNlKDEpICE9PSAoYm5kSWQgPSB0YWdTdGFjay5zaGlmdCgpKSkge1xuXHRcdFx0XHQvLyBTZWUganN2aWV3cy9pc3N1ZXMvMjEzXG5cdFx0XHRcdHN5bnRheEVycm9yKCdDbG9zaW5nIHRhZyBmb3Ige157Li4ufX0gdW5kZXIgZGlmZmVyZW50IGVsZW06IDwnICsgYm5kSWQgKyAnPicpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodGFnKSB7XG5cdFx0XHRpblRhZyA9IHRhZztcblx0XHRcdC8vIElmIHRoZXJlIGFyZSBpZHMgKG1hcmtlcnMgc2luY2UgdGhlIGxhc3QgdGFnKSwgbW92ZSB0aGVtIHRvIHRoZSBkZWZlciBzdHJpbmdcblx0XHRcdHRhZ1N0YWNrLnVuc2hpZnQocGFyZW50VGFnKTtcblx0XHRcdHBhcmVudFRhZyA9IHRhZy5zbGljZSgxKTtcblx0XHRcdGlmICh2YWxpZGF0ZSAmJiB0YWdTdGFja1swXSAmJiB0YWdTdGFja1swXSA9PT0gYmFkUGFyZW50W3BhcmVudFRhZ10pIHtcblx0XHRcdFx0Ly8gTWlzc2luZyA8dGJvZHk+XG5cdFx0XHRcdC8vIFRPRE86IHJlcGxhY2UgdGhpcyBieSBzbWFydCBpbnNlcnRpb24gb2YgPHRib2R5PiB0YWdzXG5cdFx0XHRcdGVycm9yKCdQYXJlbnQgb2YgPHRyPiBtdXN0IGJlIDx0Ym9keT4nKTtcblx0XHRcdH1cblx0XHRcdGlzVm9pZCA9IHZvaWRFbGVtc1twYXJlbnRUYWddO1xuXHRcdFx0aWYgKChlbENudCA9IGVsQ29udGVudFtwYXJlbnRUYWddKSAmJiAhcHJldkVsQ250KSB7XG5cdFx0XHRcdGRlZmVyU3RhY2sudW5zaGlmdChkZWZlcik7XG5cdFx0XHRcdGRlZmVyID0gXCJcIjtcblx0XHRcdH1cblx0XHRcdHByZXZFbENudCA9IGVsQ250O1xuLy9UT0RPIENvbnNpZGVyIHByb3ZpZGluZyB2YWxpZGF0aW9uIHdoaWNoIHRocm93cyBpZiB5b3UgcGxhY2UgPHNwYW4+IGFzIGNoaWxkIG9mIDx0cj4sIGV0Yy4gLSBzaW5jZSBpZiBub3QgY2F1Z2h0LFxuLy90aGlzIGNhbiBjYXVzZSBlcnJvcnMgc3Vic2VxdWVudGx5IHdoaWNoIGFyZSBkaWZmaWN1bHQgdG8gZGVidWcuXG4vL1x0XHRcdFx0aWYgKGVsQ29udGVudFt0YWdTdGFja1swXV0+MiAmJiAhZWxDbnQpIHtcbi8vXHRcdFx0XHRcdGVycm9yKHBhcmVudFRhZyArIFwiIGluIFwiICsgdGFnU3RhY2tbMF0pO1xuLy9cdFx0XHRcdH1cblx0XHRcdGlmIChkZWZlciAmJiBlbENudCkge1xuXHRcdFx0XHRkZWZlciArPSBcIitcIjsgLy8gV2lsbCBiZSB1c2VkIGZvciBzdGVwcGluZyBiYWNrIHRocm91Z2ggZGVmZXJyZWQgdG9rZW5zXG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBwcmVjZWRpbmc7XG5cdH1cblxuXHRmdW5jdGlvbiBwcm9jZXNzVmlld0luZm9zKHZ3SW5mb3MsIHRhcmdldFBhcmVudCkge1xuXHRcdC8vIElmIHRhcmdldFBhcmVudCwgd2UgYXJlIHByb2Nlc3Npbmcgdmlld0luZm9zICh3aGljaCBtYXkgaW5jbHVkZSBuYXZpZ2F0aW9uIHRocm91Z2ggJystJyBwYXRocykgYW5kIGhvb2tpbmcgdXAgdG8gdGhlIHJpZ2h0IHBhcmVudEVsZW0gZXRjLlxuXHRcdC8vIChhbmQgZWxlbSBtYXkgYWxzbyBiZSBkZWZpbmVkIC0gdGhlIG5leHQgbm9kZSlcblx0XHQvLyBJZiBubyB0YXJnZXRQYXJlbnQsIHRoZW4gd2UgYXJlIHByb2Nlc3Npbmcgdmlld0luZm9zIG9uIG5ld2x5IGluc2VydGVkIGNvbnRlbnRcblx0XHR2YXIgZGVmZXJQYXRoLCBkZWZlckNoYXIsIGJpbmRDaGFyLCBwYXJlbnRFbGVtLCBpZCwgb25BZnRDciwgZGVlcCxcblx0XHRcdGFkZGVkQmluZEVscyA9IFtdO1xuXG5cdFx0Ly8gSW4gZWxDbnQgY29udGV4dCAoZWxlbWVudC1vbmx5IGNvbnRlbnQgbW9kZWwpLCBwcmV2Tm9kZSBpcyB0aGUgZmlyc3Qgbm9kZSBhZnRlciB0aGUgb3BlbiwgbmV4dE5vZGUgaXMgdGhlIGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIGNsb3NlLlxuXHRcdC8vIElmIGJvdGggYXJlIG51bGwvdW5kZWZpbmVkLCB0aGVuIG9wZW4gYW5kIGNsb3NlIGFyZSBhdCBlbmQgb2YgcGFyZW50IGNvbnRlbnQsIHNvIHRoZSB2aWV3IGlzIGVtcHR5LCBhbmQgaXRzIHBsYWNlaG9sZGVyIGlzIHRoZVxuXHRcdC8vICdsYXN0Q2hpbGQnIG9mIHRoZSBwYXJlbnROb2RlLiBJZiB0aGVyZSBpcyBhIHByZXZOb2RlLCB0aGVuIGl0IGlzIGVpdGhlciB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgdmlldywgb3IgdGhlIHZpZXcgaXMgZW1wdHkgYW5kXG5cdFx0Ly8gaXRzIHBsYWNlaG9sZGVyIGlzIHRoZSAncHJldmlvdXNTaWJsaW5nJyBvZiB0aGUgcHJldk5vZGUsIHdoaWNoIGlzIGFsc28gdGhlIG5leHROb2RlLlxuXHRcdGlmICh2d0luZm9zKSB7XG5cdFx0XHRpZiAodndJbmZvcy5fdGtucy5jaGFyQXQoMCkgPT09IFwiQFwiKSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBwcm9jZXNzaW5nIG5ld2x5IGluc2VydGVkIGNvbnRlbnQuIFRoaXMgaXMgYSBzcGVjaWFsIHNjcmlwdCBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQgaW4gY29udmVydE1hcmtlcnMoKSB0byBwcm9jZXNzIGRlZmVycmVkIGJpbmRpbmdzLFxuXHRcdFx0XHQvLyBhbmQgaW5zZXJ0ZWQgZm9sbG93aW5nIHRoZSB0YXJnZXQgcGFyZW50IGVsZW1lbnQgLSBiZWNhdXNlIG5vIGVsZW1lbnQgdGFncyAob3V0c2lkZSBlbENudCkgd2VyZSBlbmNvdW50ZXJlZCB0byBjYXJyeSB0aG9zZSBiaW5kaW5nIHRva2Vucy5cblx0XHRcdFx0Ly8gV2Ugd2lsbCBzdGVwIGJhY2sgZnJvbSB0aGUgcHJlY2VkaW5nIHNpYmxpbmcgb2YgdGhpcyBlbGVtZW50LCBsb29raW5nIGF0IHRhcmdldFBhcmVudCBlbGVtZW50cyB1bnRpbCB3ZSBmaW5kIHRoZSBvbmUgdGhhdCB0aGUgY3VycmVudCBiaW5kaW5nXG5cdFx0XHRcdC8vIHRva2VuIGJlbG9uZ3MgdG8uIFNldCBlbGVtIHRvIG51bGwgKHRoZSBzcGVjaWFsIHNjcmlwdCBlbGVtZW50KSwgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBET00uXG5cdFx0XHRcdHRhcmdldFBhcmVudCA9IGVsZW0ucHJldmlvdXNTaWJsaW5nO1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbSk7XG5cdFx0XHRcdGVsZW0gPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRsZW4gPSB2d0luZm9zLmxlbmd0aDtcblx0XHRcdHdoaWxlIChsZW4tLSkge1xuXHRcdFx0XHR2d0luZm8gPSB2d0luZm9zW2xlbl07XG4vL2lmIChwcmV2SWRzLmluZGV4T2YodndJbmZvLnRva2VuKSA8IDApIHsgLy8gVGhpcyB0b2tlbiBpcyBhIG5ld2x5IGNyZWF0ZWQgdmlldyBvciB0YWcgYmluZGluZ1xuXHRcdFx0XHRiaW5kQ2hhciA9IHZ3SW5mby5jaDtcblx0XHRcdFx0aWYgKGRlZmVyUGF0aCA9IHZ3SW5mby5wYXRoKSB7XG5cdFx0XHRcdFx0Ly8gV2UgaGF2ZSBhICdkZWZlcnJlZCBwYXRoJ1xuXHRcdFx0XHRcdGogPSBkZWZlclBhdGgubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHR3aGlsZSAoZGVmZXJDaGFyID0gZGVmZXJQYXRoLmNoYXJBdChqLS0pKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2UgdGhlIFwiK1wiIGFuZFwiLVwiIGNoYXJhY3RlcnMgdG8gbmF2aWdhdGUgdGhlIHBhdGggYmFjayB0byB0aGUgb3JpZ2luYWwgcGFyZW50IG5vZGUgd2hlcmUgdGhlIGRlZmVycmVkIGJpbmRpbmdzIG9jdXJyZWRcblx0XHRcdFx0XHRcdGlmIChkZWZlckNoYXIgPT09IFwiK1wiKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChkZWZlclBhdGguY2hhckF0KGopID09PSBcIi1cIikge1xuXHRcdFx0XHRcdFx0XHRcdGotLTtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXRQYXJlbnQucHJldmlvdXNTaWJsaW5nO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRhcmdldFBhcmVudCA9IHRhcmdldFBhcmVudC5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRQYXJlbnQgPSB0YXJnZXRQYXJlbnQubGFzdENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gTm90ZTogQ2FuIHVzZSBwcmV2aW91c1NpYmxpbmcgYW5kIGxhc3RDaGlsZCwgbm90IHByZXZpb3VzRWxlbWVudFNpYmxpbmcgYW5kIGxhc3RFbGVtZW50Q2hpbGQsXG5cdFx0XHRcdFx0XHQvLyBzaW5jZSB3ZSBoYXZlIHJlbW92ZWQgd2hpdGUgc3BhY2Ugd2l0aGluIGVsQ250LiBIZW5jZSBzdXBwb3J0IElFIDwgOVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYmluZENoYXIgPT09IFwiXlwiKSB7XG5cdFx0XHRcdFx0aWYgKHRhZyA9IGJpbmRpbmdTdG9yZVtpZCA9IHZ3SW5mby5pZF0pIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBiaW5kaW5nIG1heSBoYXZlIGJlZW4gZGVsZXRlZCwgZm9yIGV4YW1wbGUgaW4gYSBkaWZmZXJlbnQgaGFuZGxlciB0byBhbiBhcnJheSBjb2xsZWN0aW9uQ2hhbmdlIGV2ZW50XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgdGFnIGJpbmRpbmdcblx0XHRcdFx0XHRcdGRlZXAgPSB0YXJnZXRQYXJlbnQgJiYgKCFlbGVtIHx8IGVsZW0ucGFyZW50Tm9kZSAhPT0gdGFyZ2V0UGFyZW50KTsgLy8gV2UgYXJlIHN0ZXBwaW5nIGJhY2sgbG9va2luZyBmb3IgdGhlIHJpZ2h0IHRhcmdldFBhcmVudCxcblx0XHRcdFx0XHRcdC8vIG9yIHdlIGFyZSBsaW5raW5nIGV4aXN0aW5nIGNvbnRlbnQgYW5kIHRoaXMgZWxlbWVudCBpcyBpbiBlbENudCwgbm90IGFuIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgdGFyZ2V0UGFyZW50LlxuXHRcdFx0XHRcdFx0aWYgKCFlbGVtIHx8IGRlZXApIHtcblx0XHRcdFx0XHRcdFx0dGFnLnBhcmVudEVsZW0gPSB0YXJnZXRQYXJlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodndJbmZvLmVsQ250ICYmIGRlZXApIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2l0aCBlbGVtZW50IG9ubHkgY29udGVudCwgaWYgdGhlcmUgaXMgbm8gZm9sbG93aW5nIGVsZW1lbnQsIG9yIGlmIHRoZSBiaW5kaW5nIGlzIGRlZXBlciB0aGFuIHRoZSBmb2xsb3dpbmcgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHQvLyB0aGVuIHdlIG5lZWQgdG8gc2V0IHRoZSBvcGVuIG9yIGNsb3NlIHRva2VuIGFzIGEgZGVmZXJyZWQgYmluZGluZyBhbm5vdGF0aW9uIG9uIHRoZSBwYXJlbnRcblx0XHRcdFx0XHRcdFx0c2V0RGVmZXIodGFyZ2V0UGFyZW50LCAodndJbmZvLm9wZW4gPyBcIiNcIiA6IFwiL1wiKSArIGlkICsgYmluZENoYXIgKyAodGFyZ2V0UGFyZW50Ll9kZiB8fCBcIlwiKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuIG9wZW4gb3IgY2xvc2UgbWFya2VyIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fS4gQWRkIGl0IHRvIGJpbmRFbHMuXG5cdFx0XHRcdFx0XHRhZGRlZEJpbmRFbHMucHVzaChbZGVlcCA/IG51bGwgOiBlbGVtLCB2d0luZm9dKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAodmlldyA9IHZpZXdTdG9yZVtpZCA9IHZ3SW5mby5pZF0pIHtcblx0XHRcdFx0XHQvLyBUaGUgdmlldyBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQsIGZvciBleGFtcGxlIGluIGEgZGlmZmVyZW50IGhhbmRsZXIgdG8gYW4gYXJyYXkgY29sbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0XHRcdGlmICghdmlldy5wYXJlbnRFbGVtKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB2aWV3IGlzIG5vdCBhbHJlYWR5IGV4dGVuZGVkIGZvciBKc1ZpZXdzLCBleHRlbmQgYW5kIGluaXRpYWxpemUgdGhlIHZpZXcgb2JqZWN0IGNyZWF0ZWQgaW4gSnNSZW5kZXIsIGFzIGEgSnNWaWV3cyB2aWV3XG5cdFx0XHRcdFx0XHR2aWV3LnBhcmVudEVsZW0gPSB0YXJnZXRQYXJlbnQgfHwgZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgfHwgcGFyZW50Tm9kZTtcblx0XHRcdFx0XHRcdHZpZXcuXy5vblJlbmRlciA9IGFkZEJpbmRpbmdNYXJrZXJzO1xuXHRcdFx0XHRcdFx0dmlldy5fLm9uQXJyYXlDaGFuZ2UgPSBhcnJheUNoYW5nZUhhbmRsZXI7XG5cdFx0XHRcdFx0XHRzZXRBcnJheUNoYW5nZUxpbmsodmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBhcmVudEVsZW0gPSB2aWV3LnBhcmVudEVsZW07XG5cdFx0XHRcdFx0aWYgKHZ3SW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGFuICdvcGVuIHZpZXcnIG5vZGUgKHByZWNlZGluZyBzY3JpcHQgbWFya2VyIG5vZGUsXG5cdFx0XHRcdFx0XHQvLyBvciBpZiBlbENudCwgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHZpZXcsIHdpdGggYSBkYXRhLWpzdiBhbm5vdGF0aW9uKSBmb3IgYmluZGluZ1xuXHRcdFx0XHRcdFx0dmlldy5fZWxDbnQgPSB2d0luZm8uZWxDbnQ7XG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0UGFyZW50ICYmICFlbGVtKSB7XG5cdFx0XHRcdFx0XHRcdHNldERlZmVyKHRhcmdldFBhcmVudCwgXCIjXCIgKyBpZCArIGJpbmRDaGFyICsgKHRhcmdldFBhcmVudC5fZGYgfHwgXCJcIikpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gTm8gdGFyZ2V0UGFyZW50LCBzbyB0aGVyZSBpcyBhIC5fbnh0IGVsZW0gKGFuZCB0aGlzIGlzIHByb2Nlc3NpbmcgdG9rZW5zIG9uIHRoZSBlbGVtKVxuXHRcdFx0XHRcdFx0XHRpZiAoIXZpZXcuX3Bydikge1xuXHRcdFx0XHRcdFx0XHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIjXCIgKyBpZCArIGJpbmRDaGFyKSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dmlldy5fcHJ2ID0gZWxlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhICdjbG9zZSB2aWV3JyBtYXJrZXIgbm9kZSBmb3IgYmluZGluZ1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFBhcmVudCAmJiAoIWVsZW0gfHwgZWxlbS5wYXJlbnROb2RlICE9PSB0YXJnZXRQYXJlbnQpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRoZXJlIGlzIG5vIC5fbnh0IHNvIGFkZCB0b2tlbiB0byBfZGYuIEl0IGlzIGRlZmVycmVkLlxuXHRcdFx0XHRcdFx0XHRzZXREZWZlcih0YXJnZXRQYXJlbnQsIFwiL1wiICsgaWQgKyBiaW5kQ2hhciArICh0YXJnZXRQYXJlbnQuX2RmIHx8IFwiXCIpKTtcblx0XHRcdFx0XHRcdFx0dmlldy5fbnh0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChlbGVtKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgdmlldyBkaWQgbm90IGhhdmUgYSAuX254dCwgYnV0IGhhcyBvbmUgbm93LCBzbyB0b2tlbiBtYXkgYmUgaW4gX2RmLCBhbmQgbXVzdCBiZSByZW1vdmVkLiAoTm8gbG9uZ2VyIGRlZmVycmVkKVxuXHRcdFx0XHRcdFx0XHRpZiAoIXZpZXcuX254dCkge1xuXHRcdFx0XHRcdFx0XHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIvXCIgKyBpZCArIGJpbmRDaGFyKSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dmlldy5fbnh0ID0gZWxlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChvbkFmdENyID0gdmlldy5jdHggJiYgdmlldy5jdHhbb25BZnRlckNyZWF0ZVN0cl0gfHwgb25BZnRlckNyZWF0ZSkge1xuXHRcdFx0XHRcdFx0XHRvbkFmdENyLmNhbGwodmlldy5jdHgudGFnLCB2aWV3KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG4vL31cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGVuID0gYWRkZWRCaW5kRWxzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChsZW4tLSkge1xuXHRcdFx0XHQvLyBUaGVzZSB3ZXJlIGFkZGVkIGluIHJldmVyc2Ugb3JkZXIgdG8gYWRkZWRCaW5kRWxzLiBXZSBwdXNoIHRoZW0gaW4gQmluZEVscyBpbiB0aGUgY29ycmVjdCBvcmRlci5cblx0XHRcdFx0YmluZEVscy5wdXNoKGFkZGVkQmluZEVsc1tsZW5dKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuICF2d0luZm9zIHx8IHZ3SW5mb3MuZWxDbnQ7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRWaWV3SW5mb3ModndJbmZvcykge1xuXHRcdC8vIFVzZWQgYnkgdmlldy5jaGlsZFRhZ3MoKSBhbmQgdGFnLmNoaWxkVGFncygpXG5cdFx0Ly8gU2ltaWxhciB0byBwcm9jZXNzVmlld0luZm9zIGluIGhvdyBpdCBzdGVwcyB0aHJvdWdoIGJpbmRpbmdzIHRvIGZpbmQgdGFncy4gT25seSBmaW5kcyBkYXRhLWxpbmtlZCB0YWdzLlxuXHRcdHZhciBsZXZlbCwgcGFyZW50VGFnLCBuYW1lZDtcblxuXHRcdGlmICh2d0luZm9zKSB7XG5cdFx0XHRsZW4gPSB2d0luZm9zLmxlbmd0aDtcblx0XHRcdGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuXHRcdFx0XHR2d0luZm8gPSB2d0luZm9zW2pdO1xuXHRcdFx0XHQvLyBUaGlzIGlzIGFuIG9wZW4gbWFya2VyIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fSwgd2l0aGluIHRoZSBjb250ZW50IG9mIHRoZSB0YWcgd2hvc2UgaWQgaXMgZ2V0LmlkLiBBZGQgaXQgdG8gYmluZEVscy5cblx0XHRcdFx0Ly8gTm90ZSAtIGlmIGJpbmRpbmdTdG9yZVt2d0luZm8uaWRdLl9pcyA9PT0gXCJ0YWdcIiB0aGVuIGdldFZpZXdJbmZvcyBpcyBiZWluZyBjYWxsZWQgdG9vIHNvb24gLSBkdXJpbmcgZmlyc3QgbGlua2luZyBwYXNzXG5cdFx0XHRcdHBhcmVudFRhZyA9IHRhZyA9IGJpbmRpbmdTdG9yZVt2d0luZm8uaWRdLmxpbmtDdHgudGFnO1xuXHRcdFx0XHRuYW1lZCA9IHRhZy50YWdOYW1lID09PSB0YWdOYW1lO1xuXHRcdFx0XHRpZiAoIXRhZy5mbG93IHx8IG5hbWVkKSB7XG5cdFx0XHRcdFx0aWYgKCFkZWVwKSB7XG5cdFx0XHRcdFx0XHRsZXZlbCA9IDE7XG5cdFx0XHRcdFx0XHR3aGlsZSAocGFyZW50VGFnID0gcGFyZW50VGFnLnBhcmVudCkge1xuXHRcdFx0XHRcdFx0XHRsZXZlbCsrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGFnRGVwdGggPSB0YWdEZXB0aCB8fCBsZXZlbDsgLy8gVGhlIGxldmVsIG9mIHRoZSBmaXJzdCB0YWcgZW5jb3VudGVyZWQuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICgoZGVlcCB8fCBsZXZlbCA9PT0gdGFnRGVwdGgpICYmICghdGFnTmFtZSB8fCBuYW1lZCkpIHtcblx0XHRcdFx0XHRcdC8vIEZpbHRlciBvbiB0b3AtbGV2ZWwgb3IgdGFnTmFtZSBhcyBhcHByb3ByaWF0ZVxuXHRcdFx0XHRcdFx0dGFncy5wdXNoKHRhZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gZGF0YUxpbmsoKSB7XG5cdFx0Ly89PT09PT09PT09PT09PT09IERhdGEtbGluayBhbmQgZml4dXAgb2YgZGF0YS1qc3YgYW5ub3RhdGlvbnMgPT09PT09PT09PT09PT09PVxuXHRcdHZhciBqLCBpbmRleCxcblx0XHRcdHRva2VucyA9IFwiXCIsXG5cdFx0XHR3cmFwID0ge30sXG5cdFx0XHRzZWxlY3RvciA9IGxpbmtWaWV3c1NlbCArIChnZXQgPyBcIixbXCIgKyBkZWZlckF0dHIgKyBcIl1cIiA6IFwiXCIpO1xuXHRcdFx0Ly8gSWYgYSBjaGlsZFRhZ3MoKSBjYWxsLCBnZXQgPSBcIixbXCIgKyBkZWZlckF0dHIgKyBcIl1cIiAtIHNpbmNlIHdlIG5lZWQgdG8gaW5jbHVkZSBlbGVtZW50cyB0aGF0IGhhdmUgYSAuX2RmIGV4cGFuZG8gZm9yIGRlZmVycmVkIHRva2Vuc1xuXG5cdFx0ZWxlbXMgPSBxc2EgPyBwYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpIDogJChzZWxlY3RvciwgcGFyZW50Tm9kZSkuZ2V0KCk7XG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdC8vIFRoZSBwcmV2Tm9kZSB3aWxsIGJlIGluIHRoZSByZXR1cm5lZCBxdWVyeSwgc2luY2Ugd2UgY2FsbGVkIG1hcmtQcmV2T3JOZXh0Tm9kZSgpIG9uIGl0LlxuXHRcdC8vIEJ1dCBpdCBtYXkgaGF2ZSBjb250YWluZWQgbm9kZXMgdGhhdCBzYXRpc2Z5IHRoZSBzZWxlY3RvciBhbHNvLlxuXHRcdGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5pbm5lckhUTUwpIHtcblx0XHRcdC8vIEZpbmQgdGhlIGxhc3QgY29udGFpbmVkIG5vZGUgb2YgcHJldk5vZGUsIHRvIHVzZSBhcyB0aGUgcHJldk5vZGUgLSBzbyB3ZSBvbmx5IGxpbmsgc3Vic2VxdWVudCBlbGVtcyBpbiB0aGUgcXVlcnlcblx0XHRcdHByZXZOb2RlcyA9IHFzYSA/IHByZXZOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpIDogJChzZWxlY3RvciwgcHJldk5vZGUpLmdldCgpO1xuXHRcdFx0cHJldk5vZGUgPSBwcmV2Tm9kZXMubGVuZ3RoID8gcHJldk5vZGVzW3ByZXZOb2Rlcy5sZW5ndGggLSAxXSA6IHByZXZOb2RlO1xuXHRcdH1cblxuXHRcdHRhZ0RlcHRoID0gMDtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRlbGVtID0gZWxlbXNbaV07XG5cdFx0XHRpZiAocHJldk5vZGUgJiYgIWZvdW5kKSB7XG5cdFx0XHRcdC8vIElmIHByZXZOb2RlIGlzIHNldCwgbm90IGZhbHNlLCBza2lwIGxpbmtpbmcuIElmIHRoaXMgZWxlbWVudCBpcyB0aGUgcHJldk5vZGUsIHNldCB0byBmYWxzZSBzbyBzdWJzZXF1ZW50IGVsZW1lbnRzIHdpbGwgbGluay5cblx0XHRcdFx0Zm91bmQgPSAoZWxlbSA9PT0gcHJldk5vZGUpO1xuXHRcdFx0fSBlbHNlIGlmIChuZXh0Tm9kZSAmJiBlbGVtID09PSBuZXh0Tm9kZSkge1xuXHRcdFx0XHQvLyBJZiBuZXh0Tm9kZSBpcyBzZXQgdGhlbiBicmVhayB3aGVuIHdlIGdldCB0byBuZXh0Tm9kZVxuXHRcdFx0XHRpZiAoZ2V0KSB7XG5cdFx0XHRcdFx0dG9rZW5zICs9IG1hcmtlck5vZGVJbmZvKGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fSBlbHNlIGlmIChlbGVtLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0Ly8gZWxlbSBoYXMgbm90IGJlZW4gcmVtb3ZlZCBmcm9tIERPTVxuXHRcdFx0XHRpZiAoZ2V0KSB7XG5cdFx0XHRcdFx0dG9rZW5zICs9IG1hcmtlck5vZGVJbmZvKGVsZW0pO1xuXHRcdFx0XHRcdGlmIChlbGVtLl9kZikge1xuXHRcdFx0XHRcdFx0aiA9IGkgKyAxO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGogPCBsICYmIGVsZW0uY29udGFpbnMoZWxlbXNbal0pKSB7XG5cdFx0XHRcdFx0XHRcdGorKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIEFkZCBkZWZlcmVkIHRva2VucyBhZnRlciBhbnkgdG9rZW5zIG9uIGRlc2NlbmRhbnQgZWxlbWVudHMgb2YgdGhpcyBvbmVcblx0XHRcdFx0XHRcdHdyYXBbai0xXSA9IGVsZW0uX2RmO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAod3JhcFtpXSkge1xuXHRcdFx0XHRcdFx0dG9rZW5zICs9IHdyYXBbaV0gfHwgXCJcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGlzTGluayAmJiAodndJbmZvID0gdmlld0luZm9zKGVsZW0sIHVuZGVmaW5lZCwgclZpZXdNYXJrZXJzKSkgJiYgKHZ3SW5mbyA9IHZ3SW5mb1swXSkpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoaXMgaXMgYSBsaW5rKHRydWVPclN0cmluZyAuLi4pIGNhbGwgd2Ugd2lsbCBhdm9pZCByZS1iaW5kaW5nIHRvIGVsZW1zIHRoYXQgYXJlIHdpdGhpbiB0ZW1wbGF0ZS1yZW5kZXJlZCB2aWV3c1xuXHRcdFx0XHRcdFx0c2tpcCA9IHNraXAgPyAodndJbmZvLmlkICE9PSBza2lwICYmIHNraXApIDogdndJbmZvLm9wZW4gJiYgdndJbmZvLmlkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXNraXAgJiYgcHJvY2Vzc0luZm9zKHZpZXdJbmZvcyhlbGVtKSlcblx0XHRcdFx0XHRcdC8vIElmIGEgbGluaygpIGNhbGwsIHByb2Nlc3NWaWV3SW5mb3MoKSBhZGRzIGJpbmRpbmdzIHRvIGJpbmRFbHMsIGFuZCByZXR1cm5zIHRydWUgZm9yIG5vbi1zY3JpcHQgbm9kZXMsIGZvciBhZGRpbmcgZGF0YS1saW5rIGJpbmRpbmdzXG5cdFx0XHRcdFx0XHQvLyBJZiBhIGNoaWxkVGFncygpIGNhbGwsIGdldFZpZXdJbmZvcyByZXR1cm5zIGFycmF5IG9mIHRhZyBiaW5kaW5ncy5cblx0XHRcdFx0XHRcdFx0JiYgZWxlbS5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpKSB7XG5cdFx0XHRcdFx0XHRiaW5kRWxzLnB1c2goW2VsZW1dKTsgLy8gQSBkYXRhLWxpbmtlZCBlbGVtZW50IHNvIGFkZCB0byBiaW5kRWxzIHRvb1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXQpIHtcblx0XHRcdHRva2VucyArPSBwYXJlbnROb2RlLl9kZiB8fCBcIlwiO1xuXHRcdFx0aWYgKGluZGV4ID0gdG9rZW5zLmluZGV4T2YoXCIjXCIgKyBnZXQuaWQpICsgMSkge1xuXHRcdFx0XHQvLyBXZSBhcmUgbG9va2luZyBmb3Igdmlldy5jaGlsZFRhZ3MoKSBvciB0YWcuY2hpbGRUYWdzKCkgLSBzbyBzdGFydCBhZnRlciB0aGUgb3BlbiB0b2tlbiBvZiB0aGUgcGFyZW50IHZpZXcgb3IgdGFnLlxuXHRcdFx0XHR0b2tlbnMgPSB0b2tlbnMuc2xpY2UoaW5kZXggKyBnZXQuaWQubGVuZ3RoKTtcblx0XHRcdH1cblx0XHRcdGluZGV4ID0gdG9rZW5zLmluZGV4T2YoXCIvXCIgKyBnZXQuaWQpO1xuXHRcdFx0aWYgKGluZGV4ICsgMSkge1xuXHRcdFx0XHQvLyBXZSBhcmUgbG9va2luZyBmb3Igdmlldy5jaGlsZFRhZ3MoKSBvciB0YWcuY2hpbGRUYWdzKCkgLSBzbyBkb24ndCBsb29rIGJleW9uZCB0aGUgY2xvc2UgdG9rZW4gb2YgdGhlIHBhcmVudCB2aWV3IG9yIHRhZy5cblx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKDAsIGluZGV4KTtcblx0XHRcdH1cblx0XHRcdC8vIENhbGwgZ2V0Vmlld0luZm9zIHRvIGFkZCB0aGUgZm91bmQgY2hpbGRUYWdzIHRvIHRoZSB0YWdzIGFycmF5XG5cdFx0XHRnZXRWaWV3SW5mb3Modmlld0luZm9zKHRva2VucywgdW5kZWZpbmVkLCByT3BlblRhZ01hcmtlcnMpKTtcblx0XHR9XG5cblx0XHRpZiAoaHRtbCA9PT0gdW5kZWZpbmVkICYmIHBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKSkge1xuXHRcdFx0YmluZEVscy5wdXNoKFtwYXJlbnROb2RlXSk7IC8vIFN1cHBvcnQgZGF0YS1saW5raW5nIHRvcC1sZXZlbCBlbGVtZW50IGRpcmVjdGx5IChub3Qgd2l0aGluIGEgZGF0YS1saW5rZWQgY29udGFpbmVyKVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0ZW1wb3JhcnkgbWFya2VyIHNjcmlwdCBub2RlcyB0aGV5IHdlcmUgYWRkZWQgYnkgbWFya1ByZXZPck5leHROb2RlXG5cdFx0dW5tYXJrUHJldk9yTmV4dE5vZGUocHJldk5vZGUsIGVsQ250KTtcblx0XHR1bm1hcmtQcmV2T3JOZXh0Tm9kZShuZXh0Tm9kZSwgZWxDbnQpO1xuXG5cdFx0aWYgKGdldCkge1xuXHRcdFx0aWYgKGxhenlMaW5rKSB7XG5cdFx0XHRcdGxhenlMaW5rLnJlc29sdmUoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjsgLy8gV2UgaGF2ZSBhZGRlZCBjaGlsZFRhZ3MgdG8gdGhlIHRhZ3MgYXJyYXksIHNvIHdlIGFyZSBkb25lXG5cdFx0fVxuXG5cdFx0aWYgKGVsQ250ICYmIGRlZmVyICsgaWRzKSB7XG5cdFx0XHQvLyBUaGVyZSBhcmUgc29tZSB2aWV3cyB3aXRoIGVsQ250LCBmb3Igd2hpY2ggdGhlIG9wZW4gb3IgY2xvc2UgZGlkIG5vdCBwcmVjZWRlIGFueSBIVE1MIHRhZyAtIHNvIHRoZXkgaGF2ZSBub3QgYmVlbiBwcm9jZXNzZWQgeWV0XG5cdFx0XHRlbGVtID0gbmV4dE5vZGU7XG5cdFx0XHRpZiAoZGVmZXIpIHtcblx0XHRcdFx0aWYgKG5leHROb2RlKSB7XG5cdFx0XHRcdFx0cHJvY2Vzc1ZpZXdJbmZvcyh2aWV3SW5mb3MoZGVmZXIgKyBcIitcIiwgdHJ1ZSksIG5leHROb2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwcm9jZXNzVmlld0luZm9zKHZpZXdJbmZvcyhkZWZlciwgdHJ1ZSksIHBhcmVudE5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwcm9jZXNzVmlld0luZm9zKHZpZXdJbmZvcyhpZHMsIHRydWUpLCBwYXJlbnROb2RlKTtcblx0XHRcdC8vIElmIHRoZXJlIHdlcmUgYW55IHRva2VucyBvbiBuZXh0Tm9kZSB3aGljaCBoYXZlIG5vdyBiZWVuIGFzc29jaWF0ZWQgd2l0aCBpbnNlcnRlZCBIVE1MIHRhZ3MsIHJlbW92ZSB0aGVtIGZyb20gbmV4dE5vZGVcblx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHR0b2tlbnMgPSBuZXh0Tm9kZS5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cik7XG5cdFx0XHRcdGlmIChsID0gdG9rZW5zLmluZGV4T2YocHJldklkcykgKyAxKSB7XG5cdFx0XHRcdFx0dG9rZW5zID0gdG9rZW5zLnNsaWNlKGwgKyBwcmV2SWRzLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5leHROb2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCBpZHMgKyB0b2tlbnMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vPT09PT09PT09PT09PT09PSBCaW5kIHRoZSBkYXRhLWxpbmtlZCBlbGVtZW50cyBhbmQgdGFncyA9PT09PT09PT09PT09PT09XG5cdFx0bCA9IGJpbmRFbHMubGVuZ3RoO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdGVsZW0gPSBiaW5kRWxzW2ldO1xuXHRcdFx0bGlua0luZm8gPSBlbGVtWzFdO1xuXHRcdFx0ZWxlbSA9IGVsZW1bMF07XG5cdFx0XHRpZiAobGlua0luZm8pIHtcblx0XHRcdFx0aWYgKHRhZyA9IGJpbmRpbmdTdG9yZVtsaW5rSW5mby5pZF0pIHtcblx0XHRcdFx0XHRpZiAobGlua0N0eCA9IHRhZy5saW5rQ3R4KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgdGFnIG1heSBoYXZlIGJlZW4gc3RvcmVkIHRlbXBvcmFyaWx5IG9uIHRoZSBiaW5kaW5nU3RvcmUgLSBvciBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVwbGFjZWQgYnkgdGhlIGFjdHVhbCBiaW5kaW5nXG5cdFx0XHRcdFx0XHR0YWcgPSBsaW5rQ3R4LnRhZztcblx0XHRcdFx0XHRcdHRhZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGxpbmtJbmZvLm9wZW4pIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYW4gJ29wZW4gbGlua2VkIHRhZycgYmluZGluZyBhbm5vdGF0aW9uIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fVxuXHRcdFx0XHRcdFx0aWYgKGVsZW0pIHtcblx0XHRcdFx0XHRcdFx0dGFnLnBhcmVudEVsZW0gPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHRcdHRhZy5fcHJ2ID0gZWxlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRhZy5fZWxDbnQgPSBsaW5rSW5mby5lbENudDtcblx0XHRcdFx0XHRcdC8vIFdlIGRhdGEtbGluayBkZXB0aC1maXJzdCAoXCJvbiB0aGUgd2F5IGluXCIpLCB3aGljaCBpcyBiZXR0ZXIgZm9yIHBlcmYgLSBhbmQgYWxsb3dzIHNldHRpbmcgcGFyZW50IHRhZ3MgZXRjLlxuXHRcdFx0XHRcdFx0dmlldyA9IHRhZy50YWdDdHgudmlldztcblx0XHRcdFx0XHRcdGFkZERhdGFCaW5kaW5nKHVuZGVmaW5lZCwgdGFnLl9wcnYsIHZpZXcsIGxpbmtJbmZvLmlkKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGFnLl9ueHQgPSBlbGVtO1xuXHRcdFx0XHRcdFx0aWYgKHRhZy5fLnVubGlua2VkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSAnY2xvc2UgbGlua2VkIHRhZycgYmluZGluZyBhbm5vdGF0aW9uXG5cdFx0XHRcdFx0XHRcdC8vIEFkZCBkYXRhIGJpbmRpbmdcblx0XHRcdFx0XHRcdFx0dGFnQ3R4ID0gdGFnLnRhZ0N0eDtcblx0XHRcdFx0XHRcdFx0dmlldyA9IHRhZ0N0eC52aWV3O1xuXHRcdFx0XHRcdFx0XHRjYWxsQWZ0ZXJMaW5rKHRhZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBZGQgZGF0YSBiaW5kaW5nIGZvciBhIGRhdGEtbGlua2VkIGVsZW1lbnQgKHdpdGggZGF0YS1saW5rIGF0dHJpYnV0ZSlcblx0XHRcdFx0YWRkRGF0YUJpbmRpbmcoZWxlbS5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpLCBlbGVtLCAkdmlldyhlbGVtKSwgdW5kZWZpbmVkLCBpc0xpbmssIG91dGVyRGF0YSwgY29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChsYXp5TGluaykge1xuXHRcdFx0bGF6eUxpbmsucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXHQvLz09PT0gL2VuZCBvZiBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblxuXHR2YXIgaW5UYWcsIGxpbmtDdHgsIHRhZywgaSwgbCwgaiwgbGVuLCBlbGVtcywgZWxlbSwgdmlldywgdndJbmZvLCBsaW5rSW5mbywgcHJldk5vZGVzLCB0b2tlbiwgcHJldlZpZXcsIG5leHRWaWV3LFxuXHRcdG5vZGUsIHRhZ3MsIGRlZXAsIHRhZ05hbWUsIHRhZ0N0eCwgdmFsaWRhdGUsIHRhZ0RlcHRoLCBkZXB0aCwgZnJhZ21lbnQsIGNvcGllZE5vZGUsIGZpcnN0VGFnLCBwYXJlbnRUYWcsXG5cdFx0aXNWb2lkLCB3cmFwcGVyLCBkaXYsIHRva2VucywgZWxDbnQsIHByZXZFbENudCwgaHRtbFRhZywgaWRzLCBwcmV2SWRzLCBmb3VuZCwgc2tpcCwgbGF6eUxpbmssIGlzTGluaywgZ2V0LFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdHRoaXNJZCA9IHNlbGYuXy5pZCArIFwiX1wiLFxuXHRcdGRlZmVyID0gXCJcIixcblx0XHQvLyBUaGUgbWFya2VyIGlkcyBmb3Igd2hpY2ggbm8gdGFnIHdhcyBlbmNvdW50ZXJlZCAoZW1wdHkgdmlld3Mgb3IgZmluYWwgY2xvc2luZyBtYXJrZXJzKSB3aGljaCB3ZSBjYXJyeSBvdmVyIHRvIGNvbnRhaW5lciB0YWdcblx0XHRiaW5kRWxzID0gW10sXG5cdFx0dGFnU3RhY2sgPSBbXSxcblx0XHRkZWZlclN0YWNrID0gW10sXG5cdFx0b25BZnRlckNyZWF0ZSA9IHNlbGYuaGxwKG9uQWZ0ZXJDcmVhdGVTdHIpLFxuXHRcdHByb2Nlc3NJbmZvcyA9IHByb2Nlc3NWaWV3SW5mb3M7XG5cblx0aWYgKHJlZnJlc2gpIHtcblx0XHRsYXp5TGluayA9IHJlZnJlc2gubGF6eUxpbmsgJiYgJC5EZWZlcnJlZCgpO1xuXHRcdGlmIChyZWZyZXNoLnRtcGwpIHtcblx0XHRcdC8vIHJlZnJlc2ggaXMgdGhlIHByZXZWaWV3LCBwYXNzZWQgaW4gZnJvbSBhZGRWaWV3cygpXG5cdFx0XHRwcmV2VmlldyA9IFwiL1wiICsgcmVmcmVzaC5fLmlkICsgXCJfXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlzTGluayA9IHJlZnJlc2gubG5rOyAvLyBUb3AtbGV2ZWwgbGlua2luZ1xuXHRcdFx0aWYgKHJlZnJlc2gudGFnKSB7XG5cdFx0XHRcdHRoaXNJZCA9IHJlZnJlc2gudGFnICsgXCJeXCI7XG5cdFx0XHRcdHJlZnJlc2ggPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGdldCA9IHJlZnJlc2guZ2V0KSB7XG5cdFx0XHRcdHByb2Nlc3NJbmZvcyA9IGdldFZpZXdJbmZvcztcblx0XHRcdFx0dGFncyA9IGdldC50YWdzO1xuXHRcdFx0XHRkZWVwID0gZ2V0LmRlZXA7XG5cdFx0XHRcdHRhZ05hbWUgPSBnZXQubmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVmcmVzaCA9IHJlZnJlc2ggPT09IHRydWU7XG5cdH1cblxuXHRwYXJlbnROb2RlID0gcGFyZW50Tm9kZVxuXHRcdD8gKFwiXCIgKyBwYXJlbnROb2RlID09PSBwYXJlbnROb2RlXG5cdFx0XHQ/ICQocGFyZW50Tm9kZSlbMF0gIC8vIEl0IGlzIGEgc3RyaW5nLCBzbyB0cmVhdCBhcyBzZWxlY3RvclxuXHRcdFx0OiBwYXJlbnROb2RlLmpxdWVyeVxuXHRcdFx0XHQ/IHBhcmVudE5vZGVbMF0gLy8gQSBqUXVlcnkgb2JqZWN0IC0gdGFrZSBmaXJzdCBlbGVtZW50LlxuXHRcdFx0XHQ6IHBhcmVudE5vZGUpXG5cdFx0OiAoc2VsZi5wYXJlbnRFbGVtICAgICAgLy8gdmlldy5saW5rKClcblx0XHRcdHx8IGRvY3VtZW50LmJvZHkpOyAgLy8gbGluayhudWxsLCBkYXRhKSB0byBsaW5rIHRoZSB3aG9sZSBkb2N1bWVudFxuXG5cdHZhbGlkYXRlID0gISRzdWJTZXR0aW5nc0FkdmFuY2VkLm5vVmFsaWRhdGUgJiYgcGFyZW50Tm9kZS5jb250ZW50RWRpdGFibGUgIT09IFRSVUU7XG5cdHBhcmVudFRhZyA9IHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRlbENudCA9ICEhZWxDb250ZW50W3BhcmVudFRhZ107XG5cblx0cHJldk5vZGUgPSBwcmV2Tm9kZSAmJiBtYXJrUHJldk9yTmV4dE5vZGUocHJldk5vZGUsIGVsQ250KTtcblx0bmV4dE5vZGUgPSBuZXh0Tm9kZSAmJiBtYXJrUHJldk9yTmV4dE5vZGUobmV4dE5vZGUsIGVsQ250KSB8fCBudWxsO1xuXG5cdGlmIChodG1sICE9IHVuZGVmaW5lZCkge1xuXHRcdC8vPT09PT09PT09PT09PT09PSBJbnNlcnQgaHRtbCBpbnRvIERPTSB1c2luZyBkb2N1bWVudEZyYWdtZW50cyAoYW5kIHdyYXBwaW5nIEhUTUwgYXBwcm9wcmlhdGVseSkuID09PT09PT09PT09PT09PT1cblx0XHQvLyBBbHNvIGNvbnZlcnQgbWFya2VycyB0byBET00gYW5ub3RhdGlvbnMsIGJhc2VkIG9uIGNvbnRlbnQgbW9kZWwuXG5cdFx0Ly8gQ29ycmVzcG9uZHMgdG8gbmV4dE5vZGUgPyAkKG5leHROb2RlKS5iZWZvcmUoaHRtbCkgOiAkKHBhcmVudE5vZGUpLmh0bWwoaHRtbCk7XG5cdFx0Ly8gYnV0IGFsbG93cyBpbnNlcnRpb24gdG8gd3JhcCBjb3JyZWN0bHkgZXZlbiB3aXRoIGluc2VydGVkIHNjcmlwdCBub2Rlcy4galF1ZXJ5IHZlcnNpb24gd2lsbCBmYWlsIGUuZy4gdW5kZXIgdGJvZHkgb3Igc2VsZWN0LlxuXHRcdC8vIFRoaXMgdmVyc2lvbiBzaG91bGQgYWxzbyBiZSBzbGlnaHRseSBmYXN0ZXJcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHdyYXBwZXIgPSBkaXY7XG5cdFx0cHJldklkcyA9IGlkcyA9IFwiXCI7XG5cdFx0aHRtbFRhZyA9IHBhcmVudE5vZGUubmFtZXNwYWNlVVJJID09PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgPyBcInN2Z19uc1wiIDogKGZpcnN0VGFnID0gckZpcnN0RWxlbS5leGVjKGh0bWwpKSAmJiBmaXJzdFRhZ1sxXSB8fCBcIlwiO1xuXHRcdGlmIChlbENudCkge1xuXHRcdFx0Ly8gTm93IGxvb2sgZm9yIGZvbGxvd2luZyB2aWV3LCBhbmQgZmluZCBpdHMgdG9rZW5zLCBvciBpZiBub3QgZm91bmQsIGdldCB0aGUgcGFyZW50Tm9kZS5fZGYgdG9rZW5zXG5cdFx0XHRub2RlID0gbmV4dE5vZGU7XG5cdFx0XHR3aGlsZSAobm9kZSAmJiAhKG5leHRWaWV3ID0gdmlld0luZm9zKG5vZGUpKSkge1xuXHRcdFx0XHRub2RlID0gbm9kZS5uZXh0U2libGluZztcblx0XHRcdH1cblx0XHRcdGlmICh0b2tlbnMgPSBuZXh0VmlldyA/IG5leHRWaWV3Ll90a25zIDogcGFyZW50Tm9kZS5fZGYpIHtcblx0XHRcdFx0dG9rZW4gPSBwcmV2VmlldyB8fCBcIlwiO1xuXHRcdFx0XHRpZiAocmVmcmVzaCB8fCAhcHJldlZpZXcpIHtcblx0XHRcdFx0XHR0b2tlbiArPSBcIiNcIiArIHRoaXNJZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRqID0gdG9rZW5zLmluZGV4T2YodG9rZW4pO1xuXHRcdFx0XHRpZiAoaiArIDEpIHtcblx0XHRcdFx0XHRqICs9IHRva2VuLmxlbmd0aDtcblx0XHRcdFx0XHQvLyBUcmFuc2ZlciB0aGUgaW5pdGlhbCB0b2tlbnMgdG8gaW5zZXJ0ZWQgbm9kZXMsIGJ5IHNldHRpbmcgdGhlbSBhcyB0aGUgaWRzIHZhcmlhYmxlLCBwaWNrZWQgdXAgaW4gY29udmVydE1hcmtlcnNcblx0XHRcdFx0XHRwcmV2SWRzID0gaWRzID0gdG9rZW5zLnNsaWNlKDAsIGopO1xuXHRcdFx0XHRcdHRva2VucyA9IHRva2Vucy5zbGljZShqKTtcblx0XHRcdFx0XHRpZiAobmV4dFZpZXcpIHtcblx0XHRcdFx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKGpzdkF0dHJTdHIsIHRva2Vucyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNldERlZmVyKHBhcmVudE5vZGUsIHRva2Vucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly89PT09PT09PT09PT09PT09IENvbnZlcnQgdGhlIG1hcmtlcnMgdG8gRE9NIGFubm90YXRpb25zLCBiYXNlZCBvbiBjb250ZW50IG1vZGVsLiA9PT09PT09PT09PT09PT09XG4vL1x0XHRcdG9sZEVsQ250ID0gZWxDbnQ7XG5cdFx0aXNWb2lkID0gdW5kZWZpbmVkO1xuXHRcdGh0bWwgPSAoXCJcIiArIGh0bWwpLnJlcGxhY2UockNvbnZlcnRNYXJrZXJzLCBjb252ZXJ0TWFya2Vycyk7XG4vL1x0XHRcdGlmICghIW9sZEVsQ250ICE9PSAhIWVsQ250KSB7XG4vL1x0XHRcdFx0ZXJyb3IoXCJQYXJzZTogXCIgKyBodG1sKTsgLy8gUGFyc2UgZXJyb3IuIENvbnRlbnQgbm90IHdlbGwtZm9ybWVkP1xuLy9cdFx0XHR9XG5cdFx0aWYgKHZhbGlkYXRlICYmIHRhZ1N0YWNrLmxlbmd0aCkge1xuXHRcdFx0c3ludGF4RXJyb3IoXCJNaXNtYXRjaGVkICc8XCIgKyBwYXJlbnRUYWcgKyBcIi4uLj4nIGluOlxcblwiICsgaHRtbCk7IC8vIFVubWF0Y2hlZCB0YWdcblx0XHR9XG5cdFx0aWYgKHZhbGlkYXRlT25seSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBBcHBlbmQgd3JhcHBlciBlbGVtZW50IHRvIGRvYyBmcmFnbWVudFxuXHRcdHNhZmVGcmFnbWVudC5hcHBlbmRDaGlsZChkaXYpO1xuXG5cdFx0Ly8gR28gdG8gaHRtbCBhbmQgYmFjaywgdGhlbiBwZWVsIG9mZiBleHRyYSB3cmFwcGVyc1xuXHRcdC8vIENvcnJlc3BvbmRzIHRvIGpRdWVyeSAkKG5leHROb2RlKS5iZWZvcmUoaHRtbCkgb3IgJChwYXJlbnROb2RlKS5odG1sKGh0bWwpO1xuXHRcdC8vIGJ1dCBzdXBwb3J0cyBzdmcgZWxlbWVudHMsIGFuZCBvdGhlciBmZWF0dXJlcyBtaXNzaW5nIGZyb20galF1ZXJ5IHZlcnNpb24gKGFuZCB0aGlzIHZlcnNpb24gc2hvdWxkIGFsc28gYmUgc2xpZ2h0bHkgZmFzdGVyKVxuXHRcdGh0bWxUYWcgPSB3cmFwTWFwW2h0bWxUYWddIHx8IHdyYXBNYXAuZGl2O1xuXHRcdGRlcHRoID0gaHRtbFRhZ1swXTtcblx0XHR3cmFwcGVyLmlubmVySFRNTCA9IGh0bWxUYWdbMV0gKyBodG1sICsgaHRtbFRhZ1syXTtcblx0XHR3aGlsZSAoZGVwdGgtLSkge1xuXHRcdFx0d3JhcHBlciA9IHdyYXBwZXIubGFzdENoaWxkO1xuXHRcdH1cblx0XHRzYWZlRnJhZ21lbnQucmVtb3ZlQ2hpbGQoZGl2KTtcblx0XHRmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblx0XHR3aGlsZSAoY29waWVkTm9kZSA9IHdyYXBwZXIuZmlyc3RDaGlsZCkge1xuXHRcdFx0ZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY29waWVkTm9kZSk7XG5cdFx0fVxuXHRcdC8vIEluc2VydCBpbnRvIHRoZSBET01cblx0XHRwYXJlbnROb2RlLmluc2VydEJlZm9yZShmcmFnbWVudCwgbmV4dE5vZGUpO1xuXHR9XG5cblx0aWYgKGxhenlMaW5rKSB7XG5cdFx0c2V0VGltZW91dChkYXRhTGluaywgMCk7XG5cdH0gZWxzZSB7XG5cdFx0ZGF0YUxpbmsoKTtcblx0fVxuXG5cdHJldHVybiBsYXp5TGluayAmJiBsYXp5TGluay5wcm9taXNlKCk7XG59XG5cbmZ1bmN0aW9uIGFkZERhdGFCaW5kaW5nKGxpbmtNYXJrdXAsIG5vZGUsIGN1cnJlbnRWaWV3LCBib3VuZFRhZ0lkLCBpc0xpbmssIGRhdGEsIGNvbnRleHQpIHtcblx0Ly8gQWRkIGRhdGEgYmluZGluZyBmb3IgZGF0YS1saW5rZWQgZWxlbWVudHMgb3Ige157Li4ufX0gZGF0YS1saW5rZWQgdGFnc1xuXHR2YXIgdG1wbCwgdG9rZW5zLCBhdHRyLCBjb252ZXJ0QmFjaywgdGFnRXhwciwgbGlua0ZuLCBsaW5rQ3R4LCB0YWcsIHJUYWdJbmRleCwgaGFzRWxzZSwgbGFzdEluZGV4LFxuXHRcdGxpbmtFeHByZXNzaW9ucyA9IFtdO1xuXG5cdGlmIChib3VuZFRhZ0lkKSB7XG5cdFx0Ly8gYm91bmRUYWdJZCBpcyBhIHN0cmluZyBmb3Ige157Li4ufX0gZGF0YS1saW5rZWQgdGFnLiBTbyBvbmx5IG9uZSBsaW5rVGFnIGluIGxpbmtNYXJrdXBcblx0XHQvLyBkYXRhIGFuZCBjb250ZXh0IHBhcmFtZXRlcnMgYXJlIHVuZGVmaW5lZFxuXHRcdHRhZyA9IGJpbmRpbmdTdG9yZVtib3VuZFRhZ0lkXTtcblx0XHR0YWcgPSB0YWcubGlua0N0eCA/IHRhZy5saW5rQ3R4LnRhZyA6IHRhZztcblxuXHRcdGxpbmtDdHggPSB0YWcubGlua0N0eCB8fCB7XG5cdFx0XHR0eXBlOiBcImlubGluZVwiLFxuXHRcdFx0ZGF0YTogY3VycmVudFZpZXcuZGF0YSwgICAgICAgICAgICAgICAgICAgLy8gc291cmNlXG5cdFx0XHRlbGVtOiB0YWcuX2VsQ250ID8gdGFnLnBhcmVudEVsZW0gOiBub2RlLCAvLyB0YXJnZXRcblx0XHRcdHZpZXc6IGN1cnJlbnRWaWV3LFxuXHRcdFx0Y3R4OiBjdXJyZW50Vmlldy5jdHgsXG5cdFx0XHRhdHRyOiBIVE1MLCAvLyBTY3JpcHQgbWFya2VyIG5vZGVzIGFyZSBhc3NvY2lhdGVkIHdpdGgge157IGFuZCBhbHdheXMgdGFyZ2V0IEhUTUwuXG5cdFx0XHRmbjogdGFnLl8uYm5kLFxuXHRcdFx0dGFnOiB0YWcsXG5cdFx0XHQvLyBQYXNzIHRoZSBib3VuZFRhZ0lkIGluIHRoZSBsaW5rQ3R4LCBzbyB0aGF0IGl0IGNhbiBiZSBwaWNrZWQgdXAgaW4gb2JzZXJ2ZUFuZEJpbmRcblx0XHRcdF9ibmRJZDogYm91bmRUYWdJZFxuXHRcdH07XG5cdFx0YmluZERhdGFMaW5rVGFyZ2V0KGxpbmtDdHgsIGxpbmtDdHguZm4pO1xuXHR9IGVsc2UgaWYgKGxpbmtNYXJrdXAgJiYgbm9kZSkge1xuXHRcdC8vIElmIGlzTGluayB0aGVuIHRoaXMgaXMgYSB0b3AtbGV2ZWwgbGlua2luZzogLmxpbmsoZXhwcmVzc2lvbiwgdGFyZ2V0LCBkYXRhLCAuLi4uKSBvclxuXHRcdC8vIC5saW5rKHRydWUsIHRhcmdldCwgZGF0YSwgLi4uLikgc2NlbmFyaW8gLSBhbmQgZGF0YSBhbmQgY29udGV4dCBhcmUgcGFzc2VkIGluIHNlcGFyYXRlbHkgZnJvbSB0aGUgdmlld1xuXHRcdGRhdGEgPSBpc0xpbmsgPyBkYXRhIDogY3VycmVudFZpZXcuZGF0YTtcblxuXHRcdC8vIENvbXBpbGVkIGxpbmtGbiBleHByZXNzaW9ucyBjb3VsZCBiZSBzdG9yZWQgaW4gdGhlIHRtcGwubGlua3MgYXJyYXkgb2YgdGhlIHRlbXBsYXRlXG5cdFx0Ly8gVE9ETyAtIGNvbnNpZGVyIGFsc28gY2FjaGluZyBnbG9iYWxseSBzbyB0aGF0IGlmIHt7OmZvb319IG9yIGRhdGEtbGluaz1cImZvb1wiIG9jY3VycyBpbiBkaWZmZXJlbnQgcGxhY2VzLFxuXHRcdC8vIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmb3IgdGhpcyBpcyBjYWNoZWQgYW5kIG9ubHkgY29tcGlsZWQgb25jZS4uLlxuXHRcdC8vbGlua3MgPSBjdXJyZW50Vmlldy5saW5rcyB8fCBjdXJyZW50Vmlldy50bXBsLmxpbmtzO1xuXG5cdFx0dG1wbCA9IGN1cnJlbnRWaWV3LnRtcGw7XG5cbi8vXHRcdFx0aWYgKCEobGlua1RhZ3MgPSBsaW5rc1tsaW5rTWFya3VwXSkpIHtcblx0XHQvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoaXMgdmlldyB0ZW1wbGF0ZSBoYXMgYmVlbiBsaW5rZWQsIHNvIHdlIGNvbXBpbGUgdGhlIGRhdGEtbGluayBleHByZXNzaW9ucywgYW5kIHN0b3JlIHRoZW0gb24gdGhlIHRlbXBsYXRlLlxuXG5cdFx0bGlua01hcmt1cCA9IG5vcm1hbGl6ZUxpbmtUYWcobGlua01hcmt1cCwgZGVmYXVsdEF0dHIobm9kZSkpO1xuXHRcdGxhc3RJbmRleCA9IHJUYWdEYXRhbGluay5sYXN0SW5kZXggPSAwO1xuXHRcdHdoaWxlICh0b2tlbnMgPSByVGFnRGF0YWxpbmsuZXhlYyhsaW5rTWFya3VwKSkgeyAvLyBUT0RPIHJlcXVpcmUgfSB0byBiZSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICQsIGFuZCByZW1vdmUgdGhlIFxcfSghXFx9KSBvcHRpb24uXG5cdFx0XHRsaW5rRXhwcmVzc2lvbnMucHVzaCh0b2tlbnMpO1xuXHRcdFx0bGFzdEluZGV4ID0gclRhZ0RhdGFsaW5rLmxhc3RJbmRleDtcblx0XHR9XG5cdFx0aWYgKGxhc3RJbmRleCA8IGxpbmtNYXJrdXAubGVuZ3RoKSB7XG5cdFx0XHRzeW50YXhFcnJvcihsaW5rTWFya3VwKTtcblx0XHR9XG5cdFx0d2hpbGUgKHRva2VucyA9IGxpbmtFeHByZXNzaW9ucy5zaGlmdCgpKSB7XG5cdFx0XHQvLyBJdGVyYXRlIG92ZXIgdGhlIGRhdGEtbGluayBleHByZXNzaW9ucywgZm9yIGRpZmZlcmVudCB0YXJnZXQgYXR0cnMsXG5cdFx0XHQvLyBlLmcuIDxpbnB1dCBkYXRhLWxpbms9XCJ7OmZpcnN0TmFtZTp9IHRpdGxlez5+ZGVzY3JpcHRpb24oZmlyc3ROYW1lLCBsYXN0TmFtZSl9XCJcblx0XHRcdC8vIHRva2VuczogW2FsbCwgYXR0ciwgYmluZE9ubHksIHRhZ0V4cHIsIHRhZ05hbWUsIGNvbnZlcnRlciwgY29sb24sIGh0bWwsIGNvbW1lbnQsIGNvZGUsIHBhcmFtc11cblx0XHRcdHJUYWdJbmRleCA9IHJUYWdEYXRhbGluay5sYXN0SW5kZXg7XG5cdFx0XHRhdHRyID0gdG9rZW5zWzFdO1xuXHRcdFx0dGFnRXhwciA9IHRva2Vuc1szXTtcblx0XHRcdHdoaWxlIChsaW5rRXhwcmVzc2lvbnNbMF0gJiYgbGlua0V4cHJlc3Npb25zWzBdWzRdID09PSBcImVsc2VcIikgeyAvLyBJZiB0aGlzIGlzIHtzb21lVGFnLi4ufSBhbmQgaXMgZm9sbG93ZWQgYnkgYW4ge2Vsc2UuLi59IGFkZCB0byB0YWdFeHByXG5cdFx0XHRcdHRhZ0V4cHIgKz0gZGVsaW1DbG9zZUNoYXIxICsgZGVsaW1PcGVuQ2hhcjAgKyBsaW5rRXhwcmVzc2lvbnMuc2hpZnQoKVszXTtcblx0XHRcdFx0aGFzRWxzZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaGFzRWxzZSkgeyAvLyBJZiBhbiB7ZWxzZX0gaGFzIGJlZW4gYWRkZWQsIG5lZWQgYWxzbyB0byBhZGQgY2xvc2luZyB7ey9zb21lVGFnfX1cblx0XHRcdFx0dGFnRXhwciArPSBkZWxpbUNsb3NlQ2hhcjEgKyBkZWxpbU9wZW5DaGFyMCArIGRlbGltT3BlbkNoYXIxICsgXCIvXCIgKyB0b2tlbnNbNF0gKyBkZWxpbUNsb3NlQ2hhcjA7XG5cdFx0XHR9XG5cdFx0XHRsaW5rQ3R4ID0ge1xuXHRcdFx0XHR0eXBlOiBpc0xpbmsgPyBcInRvcFwiIDogXCJsaW5rXCIsXG5cdFx0XHRcdGRhdGE6IGRhdGEsIC8vIHNvdXJjZVxuXHRcdFx0XHRlbGVtOiBub2RlLCAvLyB0YXJnZXRcblx0XHRcdFx0dmlldzogY3VycmVudFZpZXcsXG5cdFx0XHRcdGN0eDogY29udGV4dCxcblx0XHRcdFx0YXR0cjogYXR0cixcblx0XHRcdFx0aXNMazogaXNMaW5rLCAvLyB0b3AtbGV2ZWwgbGlua2luZz9cblx0XHRcdFx0X3RvTGsgOiAxLCAvLyBGbGFnIHRvIGRhdGEtbGluayBvbiBpbml0aWFsIGRhdGEtbGluayBjYWxsIHJlbmRlcmluZyBjYWxsXG5cdFx0XHRcdF9ub1VwZCA6IHRva2Vuc1syXSAvLyBGbGFnIGZvciBkYXRhLWxpbms9XCJeey4uLn1cIiBzbyBvbiBpbml0aWFsIGRhdGEtbGluayBjYWxsIHdpbGwgYmluZCwgYnV0IG5vdCByZW5kZXIpXG5cdFx0XHR9O1xuXG5cdFx0XHRjb252ZXJ0QmFjayA9IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0b2tlbnNbNl0pIHtcblx0XHRcdFx0Y29udmVydEJhY2sgPSB0b2tlbnNbMTBdIHx8IHVuZGVmaW5lZDtcblx0XHRcdFx0bGlua0N0eC5jb252ZXJ0ID0gdG9rZW5zWzVdIHx8IFwiXCI7XG5cdFx0XHRcdGlmICghYXR0ciAmJiBjb252ZXJ0QmFjayAhPT0gdW5kZWZpbmVkICYmIGRlZmF1bHRBdHRyKG5vZGUpKSB7XG5cdFx0XHRcdFx0Ly8gRGVmYXVsdCB0YXJnZXQsIHNvIGFsbG93IDIgd2F5IGJpbmRpbmdcblx0XHRcdFx0XHRsaW5rQ3R4LmNvbnZlcnRCYWNrID0gY29udmVydEJhY2sgPSBjb252ZXJ0QmFjay5zbGljZSgxKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gQ29tcGlsZSB0aGUgbGlua0ZuIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIGFuZCBiaW5kcyBhIGRhdGEtbGluayBleHByZXNzaW9uXG5cdFx0XHQvLyBUT0RPIC0gb3B0aW1pemUgZm9yIHRoZSBjYXNlIG9mIHNpbXBsZSBkYXRhIHBhdGggd2l0aCBubyBjb252ZXJzaW9uLCBoZWxwZXJzLCBldGMuOlxuXHRcdFx0Ly8gICAgIGkuZS4gZGF0YS1saW5rPVwiYS5iLmNcIi4gQXZvaWQgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyBvZiBGdW5jdGlvbiBldmVyeSB0aW1lLiBDYW4gdXNlIGEgZGVmYXVsdCBmdW5jdGlvbiBmb3IgYWxsIG9mIHRoZXNlLi4uXG5cblx0XHRcdGxpbmtDdHguZXhwciA9IGF0dHIgKyB0YWdFeHByO1xuXHRcdFx0bGlua0ZuID0gdG1wbC5saW5rc1t0YWdFeHByXTtcblx0XHRcdGlmICghbGlua0ZuKSB7XG5cdFx0XHRcdHRtcGwubGlua3NbdGFnRXhwcl0gPSBsaW5rRm4gPSAkc3ViLnRtcGxGbih0YWdFeHByLCB0bXBsLCB0cnVlLCBjb252ZXJ0QmFjaywgaGFzRWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRsaW5rQ3R4LmZuID0gbGlua0ZuO1xuXHRcdFx0YmluZERhdGFMaW5rVGFyZ2V0KGxpbmtDdHgsIGxpbmtGbik7XG5cdFx0XHQvLyBXZSBzdG9yZSByVGFnSW5kZXggaW4gbG9jYWwgc2NvcGUsIHNpbmNlIHRoaXMgYWRkRGF0YUJpbmRpbmcgbWV0aG9kIGNhbiBzb21ldGltZXMgYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5LFxuXHRcdFx0Ly8gYW5kIGVhY2ggaXMgdXNpbmcgdGhlIHNhbWUgclRhZ0RhdGFsaW5rIGluc3RhbmNlLlxuXHRcdFx0clRhZ0RhdGFsaW5rLmxhc3RJbmRleCA9IHJUYWdJbmRleDtcblx0XHR9XG4vL1x0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYmluZERhdGFMaW5rVGFyZ2V0KGxpbmtDdHgsIGxpbmtGbikge1xuXHQvLyBBZGQgZGF0YSBsaW5rIGJpbmRpbmdzIGZvciBhIGxpbmsgZXhwcmVzc2lvbiBpbiBkYXRhLWxpbmsgYXR0cmlidXRlIG1hcmt1cFxuXHRmdW5jdGlvbiBoYW5kbGVyKGV2LCBldmVudEFyZ3MpIHtcblx0XHRwcm9wZXJ0eUNoYW5nZUhhbmRsZXIuY2FsbChsaW5rQ3R4LCBldiwgZXZlbnRBcmdzLCBsaW5rRm4pO1xuXHRcdC8vIElmIHRoZSBsaW5rIGV4cHJlc3Npb24gdXNlcyBhIGN1c3RvbSB0YWcsIHRoZSBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIgY2FsbCB3aWxsIGNhbGwgcmVuZGVyVGFnLCB3aGljaCB3aWxsIHNldCB0YWdDdHggb24gbGlua0N0eFxuXHR9XG5cdGhhbmRsZXIubm9BcnJheSA9IHRydWU7XG5cdGlmIChsaW5rQ3R4LmlzTGspIHtcblx0XHQvLyBUb3AtbGV2ZWwgbGlua2luZzogLmxpbmsoZXhwcmVzc2lvbk9yVHJ1ZSwgZGF0YSwgY29udGV4dCkgLSBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHZpZXcgZm9yIHRoZSBsaW5raW5nLCB3aXRoIHRoZSBkYXRhIGFuZCBjdHhcblx0XHQvLyB3aGljaCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgdGFyZ2V0LiBOb3RlIHRoYXQgdGhpcyB2aWV3IGlzIG5vdCBhIHN0YW5kYXJkIGRhdGEtbGlua2VkIHZpZXcsIHNvIGl0IHdpbGxcblx0XHQvLyBiZSBkaXNwb3NlZCBvbmx5IHdoZW4gaXRzIHBhcmVudCB2aWV3IGlzIGRpc3Bvc2VkLlxuXHRcdGFkZExpbmtNZXRob2RzKGxpbmtDdHgudmlldyA9IG5ldyAkc3ViLlZpZXcoXG5cdFx0XHQkc3ViLmV4dGVuZEN0eChsaW5rQ3R4LmN0eCwgbGlua0N0eC52aWV3LmN0eCksXG5cdFx0XHRcImxpbmtcIiwgbGlua0N0eC52aWV3LCBsaW5rQ3R4LmRhdGEsIGxpbmtDdHguZXhwciwgdW5kZWZpbmVkLCBhZGRCaW5kaW5nTWFya2VycykpO1xuXHR9XG5cdGxpbmtDdHguX2N0eENiID0gJHN1Yi5fZ2NjYihsaW5rQ3R4LnZpZXcpOyAvLyBnZXRDb250ZXh0Q2FsbGJhY2s6IF9jdHhDYiwgZm9yIGZpbHRlcmluZy9hcHBlbmRpbmcgdG8gZGVwZW5kZW5jeSBwYXRoczogZnVuY3Rpb24ocGF0aCwgb2JqZWN0KSB7IHJldHVybiBbKG9iamVjdHxwYXRoKSpdfVxuXHRsaW5rQ3R4Ll9oZGwgPSBoYW5kbGVyO1xuXHQvLyBoYW5kbGVyLl9jdHggPSBsaW5rQ3R4OyBDb3VsZCBwYXNzIGxpbmtDdHggZm9yIHVzZSBpbiBhIGRlcGVuZHMgPSBmdW5jdGlvbigpIHt9IGNhbGwsIHNvIGRlcGVuZHMgaXMgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgbGlua0N0eCdzXG5cdGhhbmRsZXIodHJ1ZSk7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09XG4vLyBEYXRhLWxpbmtpbmcgaGVscGVyc1xuLy89PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVtb3ZlU3ViU3RyKHN0ciwgc3Vic3RyKSB7XG5cdHZhciBrO1xuXHRyZXR1cm4gc3RyXG5cdFx0PyAoayA9IHN0ci5pbmRleE9mKHN1YnN0ciksXG5cdFx0XHQoayArIDFcblx0XHRcdFx0PyBzdHIuc2xpY2UoMCwgaykgKyBzdHIuc2xpY2UoayArIHN1YnN0ci5sZW5ndGgpXG5cdFx0XHRcdDogc3RyKSlcblx0XHQ6IFwiXCI7XG59XG5cbmZ1bmN0aW9uIG1hcmtlck5vZGVJbmZvKG5vZGUpIHtcblx0cmV0dXJuIG5vZGUgJiZcblx0XHQoXCJcIiArIG5vZGUgPT09IG5vZGVcblx0XHRcdD8gbm9kZVxuXHRcdFx0OiBub2RlLnRhZ05hbWUgPT09IFNDUklQVFxuXHRcdFx0XHQ/IG5vZGUudHlwZS5zbGljZSgzKVxuXHRcdFx0XHQ6IG5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cikgfHwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHZpZXdJbmZvcyhub2RlLCBpc1ZhbCwgckJpbmRpbmcpIHtcblx0Ly8gVGVzdCB3aGV0aGVyIG5vZGUgaXMgYSBzY3JpcHQgbWFya2VyIG5vZGUsIGFuZCBpZiBzbywgcmV0dXJuIG1ldGFkYXRhXG5cdGZ1bmN0aW9uIGdldEluZm9zKGFsbCwgb3BlbiwgY2xvc2UsIGlkLCBjaCwgZWxQYXRoKSB7XG5cdFx0aW5mb3MucHVzaCh7XG5cdFx0XHRlbENudDogZWxDbnQsXG5cdFx0XHRpZDogaWQsXG5cdFx0XHRjaDogY2gsXG5cdFx0XHRvcGVuOiBvcGVuLFxuXHRcdFx0Y2xvc2U6IGNsb3NlLFxuXHRcdFx0cGF0aDogZWxQYXRoLFxuXHRcdFx0dG9rZW46IGFsbFxuXHRcdH0pO1xuXHR9XG5cdHZhciBlbENudCwgdG9rZW5zLFxuXHRcdGluZm9zID0gW107XG5cdGlmICh0b2tlbnMgPSBpc1ZhbCA/IG5vZGUgOiBtYXJrZXJOb2RlSW5mbyhub2RlKSkge1xuXHRcdGVsQ250ID0gaW5mb3MuZWxDbnQgPSBub2RlLnRhZ05hbWUgIT09IFNDUklQVDtcblx0XHRlbENudCA9IHRva2Vucy5jaGFyQXQoMCkgPT09IFwiQFwiIHx8IGVsQ250O1xuXHRcdGluZm9zLl90a25zID0gdG9rZW5zO1xuXHRcdC8vIHJNYXJrZXJUb2tlbnMgPSAvKD86KCMpfChcXC8pKShcXGQrKShbX15dKShbLStAXFxkXSspPy9nO1xuXHRcdHRva2Vucy5yZXBsYWNlKHJCaW5kaW5nIHx8IHJNYXJrZXJUb2tlbnMsIGdldEluZm9zKTtcblx0XHRyZXR1cm4gaW5mb3M7XG5cdH1cbn1cblxuZnVuY3Rpb24gdW5tYXJrUHJldk9yTmV4dE5vZGUobm9kZSwgZWxDbnQpIHtcblx0aWYgKG5vZGUpIHtcblx0XHRpZiAobm9kZS50eXBlID09PSBcImpzdlwiKSB7XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG5cdFx0fSBlbHNlIGlmIChlbENudCAmJiBub2RlLmdldEF0dHJpYnV0ZSgkdmlld3NMaW5rQXR0cikgPT09IFwiXCIpIHtcblx0XHRcdG5vZGUucmVtb3ZlQXR0cmlidXRlKCR2aWV3c0xpbmtBdHRyKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbWFya1ByZXZPck5leHROb2RlKG5vZGUsIGVsQ250KSB7XG5cdHZhciBtYXJrZXIgPSBub2RlO1xuXHR3aGlsZSAoZWxDbnQgJiYgbWFya2VyICYmIG1hcmtlci5ub2RlVHlwZSAhPT0gMSkge1xuXHRcdG1hcmtlciA9IG1hcmtlci5wcmV2aW91c1NpYmxpbmc7XG5cdH1cblx0aWYgKG1hcmtlcikge1xuXHRcdGlmIChtYXJrZXIubm9kZVR5cGUgIT09IDEpIHtcblx0XHRcdC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSB3aWxsIGFkZCBhIHNjcmlwdCBub2RlIGJlZm9yZVxuXHRcdFx0bWFya2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChTQ1JJUFQpO1xuXHRcdFx0bWFya2VyLnR5cGUgPSBcImpzdlwiO1xuXHRcdFx0bm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShtYXJrZXIsIG5vZGUpO1xuXHRcdH0gZWxzZSBpZiAoIW1hcmtlck5vZGVJbmZvKG1hcmtlcikgJiYgIW1hcmtlci5nZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIpKSB7XG5cdFx0XHQvLyBGb3IgZWxlbWVudCBub2Rlcywgd2Ugd2lsbCBhZGQgYSBkYXRhLWxpbmsgYXR0cmlidXRlICh1bmxlc3MgdGhlcmUgaXMgYWxyZWFkeSBvbmUpXG5cdFx0XHQvLyBzbyB0aGF0IHRoaXMgbm9kZSBnZXRzIGluY2x1ZGVkIGluIHRoZSBub2RlIGxpbmtpbmcgcHJvY2Vzcy5cblx0XHRcdG1hcmtlci5zZXRBdHRyaWJ1dGUoJHZpZXdzTGlua0F0dHIsIFwiXCIpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWFya2VyO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMaW5rVGFnKGxpbmtNYXJrdXAsIHR3b3dheSkge1xuXHRsaW5rTWFya3VwID0gJC50cmltKGxpbmtNYXJrdXApLnJlcGxhY2UockVzY2FwZVF1b3RlcywgXCJcXFxcJCZcIik7XG5cdHJldHVybiBsaW5rTWFya3VwLnNsaWNlKC0xKSAhPT0gZGVsaW1DbG9zZUNoYXIwXG5cdC8vIElmIHNpbXBsaWZpZWQgc3ludGF4IGlzIHVzZWQ6IGRhdGEtbGluaz1cImV4cHJlc3Npb25cIiwgY29udmVydCB0byBkYXRhLWxpbms9XCJ7OmV4cHJlc3Npb259XCIsXG5cdC8vIG9yIGZvciBpbnB1dHMsIGRhdGEtbGluaz1cIns6ZXhwcmVzc2lvbjp9XCIgZm9yIChkZWZhdWx0KSB0d28td2F5IGJpbmRpbmdcblx0XHQ/IGxpbmtNYXJrdXAgPSBkZWxpbU9wZW5DaGFyMSArIFwiOlwiICsgbGlua01hcmt1cCArICh0d293YXkgPyBcIjpcIiA6IFwiXCIpICsgZGVsaW1DbG9zZUNoYXIwXG5cdFx0OiBsaW5rTWFya3VwO1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTWV0aG9kcyBmb3Igdmlld3MgYW5kIHRhZ3Ncbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNhbGxBZnRlckxpbmsodGFnLCBldiwgZXZlbnRBcmdzKSB7XG5cdHZhciBsaW5rZWRFbGVtLCBkaXNwbGF5RWxlbSwgbGlua2VkRWwsIHZhbCwgbCwgbGlua2VkVGFnLCBvbGRUcmlnLCBuZXdUcmlnLCB0YWdQcm9wcywgcHJvcHNFeHByLCBsaW5rZWRFbGVtVmlldywgcHJvcCwgcHJvcERlZixcblx0XHR0YWdDdHggPSB0YWcudGFnQ3R4LFxuXHRcdHZpZXcgPSB0YWdDdHgudmlldyxcblx0XHRwcm9wcyA9IHRhZ0N0eC5wcm9wcyxcblx0XHRsaW5rQ3R4ID0gdGFnLmxpbmtDdHg7XG5cblx0aWYgKHRhZy5fLnVubGlua2VkKSB7IC8vIEZpcnN0IGNhbGwgdG8gb25BZnRlckxpbmssIG9yIGZpcnN0IGNhbGwgYWZ0ZXIgb25VcGRhdGU6IHVwZGF0ZUNvbnRlbnQuIEluaXRpYWxpemUgYW5kIGNhbGwgb25CaW5kIGFuZCBzZXQgcHJvcGVydGllc1xuXHRcdGlmICh0YWcubGlua2VkRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBsaW5rZWRFbGVtZW50OiAtIHNlbGVjdG9yIGZvciBpZGVudGlmeWluZyBsaW5rZWQgZWxlbWVudCBpbiB0ZW1wbGF0ZS9yZW5kZXJlZCBjb250ZW50XG5cdFx0XHR0YWcubGlua2VkRWxlbSA9IHRhZy5fLmlubGluZSA/IHRhZy5jb250ZW50cyh0cnVlLCB0YWcubGlua2VkRWxlbWVudCB8fCBcIipcIikuZmlyc3QoKSA6ICQobGlua0N0eC5lbGVtKTtcblx0XHR9XG5cdFx0aWYgKHRhZy5vbkJpbmQpIHtcblx0XHRcdHRhZy5vbkJpbmQodGFnQ3R4LCBsaW5rQ3R4LCB0YWcuY3R4LCBldiwgZXZlbnRBcmdzKTtcblx0XHR9XG5cdH1cblxuXHRpZiAodGFnLm9uQWZ0ZXJMaW5rKSB7XG5cdFx0dGFnLm9uQWZ0ZXJMaW5rKHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgZXYsIGV2ZW50QXJncyk7XG5cdH1cblxuXHRsaW5rZWRFbGVtID0gdGFnLnRhcmdldFRhZyA/IHRhZy50YXJnZXRUYWcubGlua2VkRWxlbSA6IHRhZy5saW5rZWRFbGVtO1xuXHRkaXNwbGF5RWxlbSA9IHRhZy5kaXNwbGF5RWxlbSB8fCBsaW5rZWRFbGVtO1xuXG5cdGlmIChsaW5rZWRFbGVtICYmIGxpbmtlZEVsZW1bMF0pIHtcblx0XHR2YWwgPSB0YWcuY3Z0QXJncygpWzBdO1xuXHRcdGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiAhdGFnLl8uY2hnaW5nKSB7XG5cdFx0XHRsID0gbGlua2VkRWxlbS5sZW5ndGg7XG5cdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdGxpbmtlZEVsID0gbGlua2VkRWxlbVtsXTtcblx0XHRcdFx0aWYgKHRhZy5fLnVubGlua2VkICYmIGxpbmtlZEVsICE9PSBsaW5rQ3R4LmVsZW0pIHtcblx0XHRcdFx0XHRsaW5rZWRUYWcgPSBsaW5rZWRFbC5fanN2TGtFbDtcblx0XHRcdFx0XHRpZiAodGFnLl8uaW5saW5lICYmICghbGlua2VkVGFnIHx8IGxpbmtlZFRhZyAhPT0gdGFnICYmIGxpbmtlZFRhZy50YXJnZXRUYWcgIT09IHRhZykpIHtcblx0XHRcdFx0XHRcdC8vIEZvciBkYXRhLWxpbmtlZCB0YWdzLCBpZGVudGlmeSB0aGUgbGlua2VkRWwgd2l0aCB0aGUgdGFnLCBmb3IgXCJ0b1wiIGJpbmRpbmdcblx0XHRcdFx0XHRcdC8vIChGb3IgZGF0YS1saW5rZWQgZWxlbWVudHMsIGlmIG5vdCB5ZXQgYm91bmQsIHdlIGlkZW50aWZ5IGxhdGVyIHdoZW4gdGhlIGxpbmtDdHguZWxlbSBpcyBib3VuZClcblx0XHRcdFx0XHRcdGxpbmtlZEVsLl9qc3ZMa0VsID0gdGFnO1xuXHRcdFx0XHRcdFx0YmluZFRvKGJpbmRpbmdTdG9yZVt0YWcuX3RnSWRdLCB0YWcsIGxpbmtlZEVsKTtcblx0XHRcdFx0XHRcdGxpbmtlZEVsLl9qc3ZCbmQgPSBcIiZcIiArIHRhZy5fdGdJZCArIFwiK1wiOyAvLyBBZGQgYSBcIitcIiBmb3IgY2xvbmVkIGJpbmRpbmcgLSBzbyByZW1vdmluZ1xuXHRcdFx0XHRcdFx0Ly8gZWxlbXMgd2l0aCBjbG9uZWQgYmluZGluZ3Mgd2lsbCBub3QgcmVtb3ZlIHRoZSAncGFyZW50JyBiaW5kaW5nIGZyb20gdGhlIGJpbmRpbmdTdG9yZS5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtlZEVsLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGlmIChsaW5rZWRFbC50eXBlID09PSBDSEVDS0JPWCkge1xuXHRcdFx0XHRcdFx0XHRsaW5rZWRFbFtDSEVDS0VEXSA9IHZhbCAmJiB2YWwgIT09IFwiZmFsc2VcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobGlua2VkRWwudHlwZSA9PT0gUkFESU8pIHtcblx0XHRcdFx0XHRcdFx0bGlua2VkRWxbQ0hFQ0tFRF0gPSAobGlua2VkRWwudmFsdWUgPT09IHZhbCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQkKGxpbmtlZEVsKS52YWwodmFsKTsgLy8gVXNlIGpRdWVyeSBmb3IgYXR0ckhvb2tzIC0gY2FuJ3QganVzdCBzZXQgdmFsdWUgKG9uIHNlbGVjdCwgZm9yIGV4YW1wbGUpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChsaW5rZWRFbC5jb250ZW50RWRpdGFibGUgPT09IFRSVUUpIHtcblx0XHRcdFx0XHRcdGxpbmtlZEVsLmlubmVySFRNTCA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bGlua0N0eC5fdmFsID0gdmFsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcm9wcy5uYW1lKSB7XG5cdFx0XHRcdFx0bGlua2VkRWwubmFtZSA9IGxpbmtlZEVsLm5hbWUgfHwgcHJvcHMubmFtZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodGFnLnNldFNpemUpIHtcblx0XHRcdGlmIChwcm9wcy5oZWlnaHQpIHtcblx0XHRcdFx0ZGlzcGxheUVsZW0uaGVpZ2h0KHByb3BzLmhlaWdodCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJvcHMud2lkdGgpIHtcblx0XHRcdFx0ZGlzcGxheUVsZW0ud2lkdGgocHJvcHMud2lkdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAocHJvcHMudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGlzcGxheUVsZW0uYXR0cihcInRpdGxlXCIsIHByb3BzLnRpdGxlKTtcblx0XHR9XG5cdFx0aWYgKHByb3BzW1wiY2xhc3NcIl0pIHtcblx0XHRcdC8vIFRoaXMgY29kZSBzdXBwb3J0cyBkeW5hbWljIGJpbmRpbmcgdG8gY2xhc3MgLSB3aGVyZSBpdCBhZGRzIHRoZSBjbGFzcyBpZiBhYnNlbnQsIGFuZCByZW1vdmVzL2FkZHMgaWYgYSBwcmV2aW91cyB2YWx1ZSBpcyBwcmVzZW50XG5cdFx0XHRpZiAoZXZlbnRBcmdzICYmIGRpc3BsYXlFbGVtLmhhc0NsYXNzKGV2ZW50QXJncy5vbGRWYWx1ZSkpIHtcblx0XHRcdFx0ZGlzcGxheUVsZW0ucmVtb3ZlQ2xhc3MoZXZlbnRBcmdzLm9sZFZhbHVlKTtcblx0XHRcdH1cblx0XHRcdGRpc3BsYXlFbGVtLmFkZENsYXNzKHByb3BzW1wiY2xhc3NcIl0pO1xuXHRcdH1cblx0XHRpZiAocHJvcHMuaWQpIHtcblx0XHRcdGxpbmtlZEVsZW1bMF0uaWQgPSBwcm9wcy5pZDtcblx0XHR9XG5cdH1cblx0dGFnLl8udW5saW5rZWQgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzeW5jRWxlbUNoYW5nZUhhbmRsZXIoZXYpIHtcblx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRlbGVtQ2hhbmdlSGFuZGxlcihldik7XG5cdH0sIDApO1xufVxuXG5mdW5jdGlvbiBiaW5kRWxDaGFuZ2UoJGVsZW0sIHRyaWcsIG9ub2ZmKSB7XG5cdGlmICh0cmlnKSB7XG5cdFx0dHJpZyA9IFwiXCIgKyB0cmlnID09PSB0cmlnID8gdHJpZyA6IFwia2V5ZG93blwiOyAvLyBTZXQgdHJpZ2dlciB0byAodHJ1ZSB8fCB0cnVleSBub24tc3RyaW5nIChlLmcuIDEpIHx8ICdrZXlkb3duJyk6IEdldCAna2V5ZG93bicgd2l0aCBhc3luY1xuXHRcdCRlbGVtW29ub2ZmXSh0cmlnLCB0cmlnID09PSBcImtleWRvd25cIiA/IGFzeW5jRWxlbUNoYW5nZUhhbmRsZXIgOiBlbGVtQ2hhbmdlSGFuZGxlcik7XG5cdH1cbn1cblxuZnVuY3Rpb24gYmluZFRvKGJpbmRpbmcsIHRhZywgbGlua2VkRWxlbSwgY3Z0QmspIHtcblx0Ly8gVHdvLXdheSBiaW5kaW5nLlxuXHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcudG9bMV0gdG8gYmUgdGhlIGN2dEJhY2ssIGFuZCBiaW5kaW5nLnRvWzBdIHRvIGJlIGVpdGhlciB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0LCBvciBbb2JqZWN0LCBwYXRoXSB3aGVyZSB0aGUgdGFyZ2V0IGlzIHRoZSBwYXRoIG9uIHRoZSBwcm92aWRlZCBvYmplY3QuXG5cdC8vIFNvIGZvciBhIGNvbXB1dGVkIHBhdGggd2l0aCBhbiBvYmplY3QgY2FsbDogYS5iLmdldE9iamVjdCgpLmQuZSwgdGhlbiB3ZSBzZXQgdG9bMF0gdG8gYmUgW2V4cHJPYiwgXCJkLmVcIl0sIGFuZCB3ZSBiaW5kIHRvIHRoZSBwYXRoIG9uIHRoZSByZXR1cm5lZCBvYmplY3QsIGV4cHJPYi5vYiwgYXMgdGFyZ2V0XG5cdC8vIE90aGVyd2lzZSBvdXIgdGFyZ2V0IGlzIHRoZSBmaXJzdCBwYXRoLCBwYXRoc1swXSwgd2hpY2ggd2Ugd2lsbCBjb252ZXJ0IHdpdGggY29udGV4dENiKCkgZm9yIHBhdGhzIGxpa2UgfmEuYi5jIG9yICN4LnkuelxuXG5cdHZhciBiaW5kdG8sIHBhdGhJbmRleCwgcGF0aCwgbGFzdFBhdGgsIGJpbmR0b09iLCAkbGlua2VkRWxlbSwgbmV3VHJpZywgb2xkVHJpZywgdG8sIGwsXG5cdFx0bGlua0N0eCA9IGJpbmRpbmcubGlua0N0eCxcblx0XHRjb250ZXh0Q2IgPSBsaW5rQ3R4Ll9jdHhDYixcblx0XHRzb3VyY2UgPSBsaW5rQ3R4LmRhdGEsXG5cdFx0cGF0aHMgPSBsaW5rQ3R4LmZuLnBhdGhzWzBdO1xuXG5cdHRhZyA9IHRhZyB8fCBsaW5rZWRFbGVtLl9qc3ZMa0VsO1xuXG5cdGlmIChiaW5kaW5nICYmIHBhdGhzICYmICFiaW5kaW5nLnRvKSB7XG5cdFx0b2xkVHJpZyA9IGxpbmtlZEVsZW0uX2pzdlRyIHx8IGZhbHNlO1xuXHRcdGlmICh0YWcpIHtcblx0XHRcdGN2dEJrID0gdGFnLmNvbnZlcnRCYWNrIHx8IGN2dEJrO1xuXHRcdFx0bmV3VHJpZyA9IHRhZy50YWdDdHgucHJvcHMudHJpZ2dlcjtcblx0XHR9XG5cdFx0bmV3VHJpZyA9IG5ld1RyaWcgPT09IHVuZGVmaW5lZCA/ICRzdWJTZXR0aW5ncy50cmlnZ2VyIDogbmV3VHJpZztcblx0XHQvLyBUcmlnZ2VyIGlzIG5vb3AgZXhjZXB0IGZvciB0ZXh0IGJveCwgdGV4dGFyZWEsIGNvbnRlbnRlZGl0YWJsZS4uLlxuXHRcdG5ld1RyaWcgPSBuZXdUcmlnICYmIChsaW5rZWRFbGVtLnRhZ05hbWUgPT09IFwiSU5QVVRcIiAmJiBsaW5rZWRFbGVtLnR5cGUgIT09IENIRUNLQk9YICYmIGxpbmtlZEVsZW0udHlwZSAhPT0gUkFESU8gfHwgbGlua2VkRWxlbS50eXBlID09PSBcInRleHRhcmVhXCIgfHwgbGlua2VkRWxlbS5jb250ZW50RWRpdGFibGUgPT09IFRSVUUpICYmIG5ld1RyaWcgfHwgZmFsc2U7XG5cblx0XHRpZiAob2xkVHJpZyAhPT0gbmV3VHJpZykge1xuXHRcdFx0JGxpbmtlZEVsZW0gPSAkKGxpbmtlZEVsZW0pO1xuXHRcdFx0YmluZEVsQ2hhbmdlKCRsaW5rZWRFbGVtLCBvbGRUcmlnLCBcIm9mZlwiKTtcblx0XHRcdGJpbmRFbENoYW5nZShcblx0XHRcdFx0JGxpbmtlZEVsZW0sXG5cdFx0XHRcdGxpbmtlZEVsZW0uX2pzdlRyID0gbmV3VHJpZyxcblx0XHRcdFx0XCJvblwiXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHBhdGhzID0gKGJpbmR0byA9IHBhdGhzLl9qc3Z0bykgfHwgcGF0aHNbMF07XG5cdFx0aWYgKHBhdGhJbmRleCA9IHBhdGhzICYmIHBhdGhzLmxlbmd0aCkge1xuXHRcdFx0bGFzdFBhdGggPSBwYXRoc1twYXRoSW5kZXggLSAxXTtcblx0XHRcdGlmIChsYXN0UGF0aC5fanN2KSB7XG5cdFx0XHRcdGJpbmR0b09iID0gbGFzdFBhdGg7XG5cdFx0XHRcdHdoaWxlIChsYXN0UGF0aC5zYiAmJiBsYXN0UGF0aC5zYi5fanN2KSB7XG5cdFx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoID0gbGFzdFBhdGguc2I7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoLnNiIHx8IHBhdGggJiYgcGF0aC5wYXRoO1xuXHRcdFx0XHRsYXN0UGF0aCA9IHBhdGggPyBwYXRoLnNsaWNlKDEpIDogYmluZHRvT2IucGF0aDtcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoKSB7XG5cdFx0XHRcdHRvID0gW1xuXHRcdFx0XHRcdFx0YmluZHRvT2IsIC8vICdleHByT2InIGZvciB0aGlzIGV4cHJlc3Npb24gYW5kIHZpZXctYmluZGluZy4gU28gYmluZHRvT2Iub2IgaXMgY3VycmVudCBvYmplY3QgcmV0dXJuZWQgYnkgZXhwcmVzc2lvbi5cblx0XHRcdFx0XHRcdGxhc3RQYXRoXG5cdFx0XHRcdFx0XTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlICgodG8gPSBjb250ZXh0Q2IocGF0aCA9IGxhc3RQYXRoLnNwbGl0KFwiXlwiKS5qb2luKFwiLlwiKSwgc291cmNlKSkgJiYgKGwgPSB0by5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0Ly8gUmVjdXJzaXZlbHkgZGVyZWZlcmVuY2UgYW55IH5mb28gb3IgI2JhciB0b2tlbnMgaW4gdGhlIHBhdGguIChSZWN1cnNpdmUgYmVjYXVzZSB+Zm9vIG1heSBiZSBhIGNvbnRleHR1YWwgcGFyYW0gd2hpY2ggaGFzXG5cdFx0XHRcdFx0Ly8gaXRzIG93biBkZXBlbmRlbmNpZXMgb24gb3RoZXIgfmZvbyAjYmFyIGNvbXBvbmVudHMpXG5cdFx0XHRcdFx0aWYgKHRvWzBdLl9jcCkgeyAvLyBUd28td2F5IGJpbmRpbmcgdG8gYSBjb250ZXh0dWFsIHBhcmFtZXRlciByZWZlcmVuY2UsIH5mb28gKGRlY2xhcmVkIGFzIH5mb289ZXhwciBvbiBhIHBhcmVudCB0YWcpXG5cdFx0XHRcdFx0XHR0byA9IHRvWzBdOyAgICAvLyBzbyAndG8nIGlzIHRoZSBbdmlldywgZXhwcmVzc2lvbi9kZXBlbmRlbmNpZXNdIGZvciB0aGUgY29udGV4dHVhbCBwYXJhbWV0ZXJcblx0XHRcdFx0XHRcdGNvbnRleHRDYiA9ICRzdWIuX2djY2IodG9bMF0pOyAvLyBnZXRDb250ZXh0Q2FsbGJhY2s6IE1vdmUgY29udGV4dENiIHVwIHRvIHZpZXcgd2hlcmUgY29udGV4dHVhbCBwYXJhbWV0ZXIgd2FzIGFzc2lnbmVkXG5cdFx0XHRcdFx0XHRsYXN0UGF0aCA9IHRvWzFdO1xuXHRcdFx0XHRcdFx0dG8gPSBbdG9bMF0uZGF0YSwgdG9bMV1dO1xuXHRcdFx0XHRcdFx0aWYgKGxhc3RQYXRoLl9qc3YpIHsgLy8gY29tcHV0ZWQgdmFsdWVcblx0XHRcdFx0XHRcdFx0YmluZHRvT2IgPSBsYXN0UGF0aDtcblx0XHRcdFx0XHRcdFx0YmluZHRvT2IuZGF0YSA9IHRvWzBdO1xuXHRcdFx0XHRcdFx0XHRiaW5kdG9PYi5fY3BDdHggPSBjb250ZXh0Q2I7XG5cdFx0XHRcdFx0XHRcdHdoaWxlIChsYXN0UGF0aC5zYiAmJiBsYXN0UGF0aC5zYi5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoID0gbGFzdFBhdGguc2I7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cGF0aCA9IGxhc3RQYXRoLnNiIHx8IHBhdGggJiYgcGF0aC5wYXRoO1xuXHRcdFx0XHRcdFx0XHRsYXN0UGF0aCA9IHBhdGggPyBwYXRoLnNsaWNlKDEpIDogYmluZHRvT2IucGF0aDtcblx0XHRcdFx0XHRcdFx0dG8gPSBbXG5cdFx0XHRcdFx0XHRcdFx0YmluZHRvT2IsIC8vICdleHByT2InIGZvciB0aGlzIGV4cHJlc3Npb24gYW5kIHZpZXctYmluZGluZy4gU28gYmluZHRvT2Iub2IgaXMgY3VycmVudCBvYmplY3QgcmV0dXJuZWQgYnkgZXhwcmVzc2lvbi5cblx0XHRcdFx0XHRcdFx0XHRsYXN0UGF0aFxuXHRcdFx0XHRcdFx0XHRdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7IC8vIFR3by13YXkgYmluZGluZyB0byBhIGhlbHBlciAtIGUuZy4gfmFkZHJlc3Muc3RyZWV0LCBvciBjb21wdXRlZCwgZS5nLiB+ZnVsbE5hbWUoKSwgb3IgdmlldyBwcm9wZXJ0eSBlLmcuICNkYXRhLmZvb1xuXHRcdFx0XHRcdFx0dG8gPSBsPjJcblx0XHRcdFx0XHRcdFx0PyBbdG9bbC0zXSwgdG9bbC0yXV0gLy8gV2l0aCBwYXRoOiBbb2JqZWN0LCBwYXRoXVxuXHRcdFx0XHRcdFx0XHQ6IFt0b1tsLTJdXTsgICAgICAgICAvLyBObyBwYXRoLCAoZS5nLiBbZnVuY3Rpb25dIGZvciBjb21wdXRlZCB3aXRoIHNldHRlcilcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c291cmNlID0gdG9bMF07XG5cdFx0XHRcdFx0bGFzdFBhdGggPSB0b1sxXTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0byA9IHRvIHx8IFtzb3VyY2UsIHBhdGhdOyAvLyBUd28gd2F5IGJpbmRpbmcgdG8gYW4gb2JqZWN0IChuZWl0aGVyIH5mb28gbm9yICNiYXIpXG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRvID0gW107XG5cdFx0fVxuXHRcdGJpbmRpbmcudG8gPSBbXG5cdFx0XHR0byxcblx0XHRcdGN2dEJrXG5cdFx0XTtcblx0fVxufVxuXG5mdW5jdGlvbiBtZXJnZUN0eHModGFnLCBuZXdDdHhzLCByZXBsYWNlKSB7IC8vIE1lcmdlIHVwZGF0ZWQgdGFnQ3R4cyBpbnRvIHRhZy50YWdDdHhzXG5cdHZhciB0YWdDdHgsIG5ld1RhZ0N0eCxcblx0XHR2aWV3ID0gdGFnLnRhZ0N0eC52aWV3LFxuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cyB8fCBbdGFnLnRhZ0N0eF0sXG5cdFx0bCA9IHRhZ0N0eHMubGVuZ3RoLFxuXHRcdHJlZnJlc2ggPSAhbmV3Q3R4cztcblxuXHRuZXdDdHhzID0gbmV3Q3R4cyB8fCB0YWcuXy5ibmQuY2FsbCh2aWV3LnRtcGwsICh0YWcubGlua0N0eCB8fCB2aWV3KS5kYXRhLCB2aWV3LCAkc3ViKTtcblxuXHRpZiAocmVwbGFjZSkge1xuXHRcdC8vIFJlcGxhY2UgcHJldmlvdXMgdGFnQ3R4cyBieSBuZXcgb25lcywgcmF0aGVyIHRoYW4gbWVyZ2luZ1xuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cyA9IG5ld0N0eHM7XG5cdFx0dGFnLnRhZ0N0eCA9IHRhZ0N0eHNbMF07XG5cdH0gZWxzZSB7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0dGFnQ3R4ID0gdGFnQ3R4c1tsXTtcblx0XHRcdG5ld1RhZ0N0eCA9IG5ld0N0eHNbbF07XG5cdFx0XHQkb2JzZXJ2YWJsZSh0YWdDdHgucHJvcHMpLnNldFByb3BlcnR5KG5ld1RhZ0N0eC5wcm9wcyk7XG5cdFx0XHQkZXh0ZW5kKHRhZ0N0eC5jdHgsIG5ld1RhZ0N0eC5jdHgpOyAvLyBXZSBkb24ndCBzdXBwb3J0IHByb3BhZ2F0aW5nIGN0eCB2YXJpYWJsZXMsIH5mb28sIG9ic2VydmFibHksIHRvIG5lc3RlZCB2aWV3cy4gU28gZXh0ZW5kLCBub3Qgc2V0UHJvcGVydHkuLi5cblx0XHRcdHRhZ0N0eC5hcmdzID0gbmV3VGFnQ3R4LmFyZ3M7XG5cdFx0XHRpZiAocmVmcmVzaCkge1xuXHRcdFx0XHR0YWdDdHgudG1wbCA9IG5ld1RhZ0N0eC50bXBsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQkc3ViLl90aHModGFnLCB0YWdDdHhzWzBdKTsgLy8gdGFnSGFuZGxlcnNGcm9tUHJvcHNcblx0cmV0dXJuIHRhZ0N0eHM7XG59XG5cbi8vPT09PT09PT09XG4vLyBEaXNwb3NhbFxuLy89PT09PT09PT1cblxuZnVuY3Rpb24gY2xlYW4oZWxlbXMpIHtcblx0Ly8gUmVtb3ZlIGRhdGEtbGluayBiaW5kaW5ncywgb3IgY29udGFpbmVkIHZpZXdzXG5cdHZhciBsLCBlbGVtLCBiaW5kaW5ncyxcblx0XHRlbGVtQXJyYXkgPSBbXSxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0aSA9IGxlbjtcblx0d2hpbGUgKGktLSkge1xuXHRcdC8vIENvcHkgaW50byBhbiBhcnJheSwgc28gdGhhdCBkZWxldGlvbiBvZiBub2RlcyBmcm9tIERPTSB3aWxsIG5vdCBjYXVzZSBvdXIgJ2knIGNvdW50ZXIgdG8gZ2V0IHNoaWZ0ZWRcblx0XHQvLyAoTm90ZTogVGhpcyBzZWVtcyBhcyBmYXN0IG9yIGZhc3RlciB0aGFuIGVsZW1BcnJheSA9IFtdLnNsaWNlLmNhbGwoZWxlbXMpOyAuLi4pXG5cdFx0ZWxlbUFycmF5LnB1c2goZWxlbXNbaV0pO1xuXHR9XG5cdGkgPSBsZW47XG5cdHdoaWxlIChpLS0pIHtcblx0XHRlbGVtID0gZWxlbUFycmF5W2ldO1xuXHRcdGlmIChlbGVtLnBhcmVudE5vZGUpIHtcblx0XHRcdC8vIEhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG5cdFx0XHRpZiAoYmluZGluZ3MgPSBlbGVtLl9qc3ZCbmQpIHtcblx0XHRcdFx0Ly8gR2V0IHByb3BlcnR5Q2hhbmdlIGJpbmRpbmdzIGZvciB0aGlzIGVsZW1lbnRcblx0XHRcdFx0Ly8gVGhpcyBtYXkgYmUgYW4gZWxlbWVudCB3aXRoIGRhdGEtbGluaywgb3IgdGhlIG9wZW5pbmcgc2NyaXB0IG1hcmtlciBub2RlIGZvciBhIGRhdGEtbGlua2VkIHRhZyB7XnsuLi59fVxuXHRcdFx0XHQvLyBiaW5kaW5ncyBpcyBhIHN0cmluZyB3aXRoIHRoZSBzeW50YXg6IFwiKCZiaW5kaW5nSWQpKlwiXG5cdFx0XHRcdGJpbmRpbmdzID0gYmluZGluZ3Muc2xpY2UoMSkuc3BsaXQoXCImXCIpO1xuXHRcdFx0XHRlbGVtLl9qc3ZCbmQgPSBcIlwiO1xuXHRcdFx0XHRsID0gYmluZGluZ3MubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAobC0tKSB7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGFzc29jaWF0ZWQgYmluZGluZ3Ncblx0XHRcdFx0XHRyZW1vdmVWaWV3QmluZGluZyhiaW5kaW5nc1tsXSwgZWxlbS5fanN2TGtFbCwgZWxlbSk7IC8vIHVuYmluZCBiaW5kaW5ncyB3aXRoIHRoaXMgYmluZGluZ0lkIG9uIHRoaXMgdmlld1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRkaXNwb3NlVG9rZW5zKG1hcmtlck5vZGVJbmZvKGVsZW0pICsgKGVsZW0uX2RmIHx8IFwiXCIpKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlVmlld0JpbmRpbmcoYmluZElkLCBsaW5rZWRFbGVtVGFnLCBlbGVtKSB7XG5cdC8vIFVuYmluZFxuXHR2YXIgb2JqSWQsIGxpbmtDdHgsIHRhZywgb2JqZWN0LCBvYnNJZCwgdGFnQ3R4cywgbCwgbWFwLCAkbGlua2VkRWxlbSwgbGlua2VkRWxlbSwgdHJpZ2dlciwgdmlldywgdGFyZ2V0VGFnLFxuXHRcdGJpbmRpbmcgPSBiaW5kaW5nU3RvcmVbYmluZElkXTtcblxuXHRpZiAobGlua2VkRWxlbVRhZykge1xuXHRcdGxpbmtlZEVsZW1UYWcgPSBsaW5rZWRFbGVtVGFnLnRhcmdldFRhZyB8fCBsaW5rZWRFbGVtVGFnO1xuXHRcdGVsZW0uX2pzdkxrRWwgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoYmluZGluZykge1xuXHRcdGRlbGV0ZSBiaW5kaW5nU3RvcmVbYmluZElkXTsgLy8gRGVsZXRlIGFscmVhZHksIHNvIGNhbGwgdG8gb25EaXNwb3NlIGhhbmRsZXIgYmVsb3cgY2Fubm90IHRyaWdnZXIgcmVjdXJzaXZlIGRlbGV0aW9uICh0aHJvdWdoIHJlY3Vyc2l2ZSBjYWxsIHRvIGpRdWVyeSBjbGVhbkRhdGEpXG5cdFx0Zm9yIChvYmpJZCBpbiBiaW5kaW5nLmJuZCkge1xuXHRcdFx0b2JqZWN0ID0gYmluZGluZy5ibmRbb2JqSWRdO1xuXHRcdFx0b2JzSWQgPSBiaW5kaW5nLmNiSWQ7XG5cdFx0XHRpZiAoJGlzQXJyYXkob2JqZWN0KSkge1xuXHRcdFx0XHQkKFtvYmplY3RdKS5vZmYoYXJyYXlDaGFuZ2VTdHIgKyBvYnNJZCkub2ZmKHByb3BlcnR5Q2hhbmdlU3RyICsgb2JzSWQpOyAvLyBUaGVyZSBtYXkgYmUgZWl0aGVyIG9yIGJvdGggb2YgYXJyYXlDaGFuZ2UgYW5kIHByb3BlcnR5Q2hhbmdlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkKG9iamVjdCkub2ZmKHByb3BlcnR5Q2hhbmdlU3RyICsgb2JzSWQpO1xuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIGJpbmRpbmcuYm5kW29iaklkXTtcblx0XHR9XG5cblx0XHRpZiAobGlua0N0eCA9IGJpbmRpbmcubGlua0N0eCkge1xuXHRcdFx0aWYgKHRhZyA9IGxpbmtDdHgudGFnKSB7XG5cdFx0XHRcdGlmICh0YWdDdHhzID0gdGFnLnRhZ0N0eHMpIHtcblx0XHRcdFx0XHRsID0gdGFnQ3R4cy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdFx0aWYgKG1hcCA9IHRhZ0N0eHNbbF0ubWFwKSB7XG5cdFx0XHRcdFx0XHRcdG1hcC51bm1hcCgpOyAvL3Vub2JzZXJ2ZVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQkbGlua2VkRWxlbSA9IHRhZy5saW5rZWRFbGVtO1xuXG5cdFx0XHRcdGlmICh0YWcub25VbmJpbmQpIHtcblx0XHRcdFx0XHR0YWcub25VbmJpbmQodGFnLnRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRhZy5vbkRpc3Bvc2UpIHtcblx0XHRcdFx0XHR0YWcub25EaXNwb3NlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXRhZy5fZWxDbnQpIHtcblx0XHRcdFx0XHRpZiAodGFnLl9wcnYpIHtcblx0XHRcdFx0XHRcdHRhZy5fcHJ2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFnLl9wcnYpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGFnLl9ueHQpIHtcblx0XHRcdFx0XHRcdHRhZy5fbnh0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFnLl9ueHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGlua2VkRWxlbSA9ICRsaW5rZWRFbGVtICYmICRsaW5rZWRFbGVtWzBdIHx8IGxpbmtDdHguZWxlbTtcblxuXHRcdFx0aWYgKHRyaWdnZXIgPSBsaW5rZWRFbGVtICYmIGxpbmtlZEVsZW0uX2pzdlRyKSB7XG5cdFx0XHRcdGJpbmRFbENoYW5nZSgkbGlua2VkRWxlbSB8fCAkKGxpbmtlZEVsZW0pLCB0cmlnZ2VyLCBcIm9mZlwiKTtcblx0XHRcdFx0bGlua2VkRWxlbS5fanN2VHIgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHR2aWV3ID0gbGlua0N0eC52aWV3O1xuXHRcdFx0aWYgKHZpZXcudHlwZSA9PT0gXCJsaW5rXCIpIHtcblx0XHRcdFx0dmlldy5wYXJlbnQucmVtb3ZlVmlld3Modmlldy5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTsgLy8gQSBcImxpbmtcIiB2aWV3IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmluZGluZywgc28gc2hvdWxkIGJlIGRpc3Bvc2VkIHdpdGggYmluZGluZy5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSB2aWV3Ll8uYm5kc1tiaW5kSWRdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRkZWxldGUgY2JCaW5kaW5nc1N0b3JlW2JpbmRpbmcuY2JJZF07XG5cdH1cbn1cblxuZnVuY3Rpb24gJHVubGluayh0bykge1xuXHRpZiAodG8pIHtcblx0XHR0byA9IHRvLmpxdWVyeSA/IHRvIDogJCh0byk7XG5cdFx0dG8uZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbm5lclZpZXc7XG5cdFx0XHQvL1RPRE8gZml4IHRoaXMgZm9yIGJldHRlciBwZXJmLiBSYXRoZXIgdGhhdCBjYWxsaW5nIGlubmVyIHZpZXcgbXVsdGlwbGUgdGltZXMgd2hpY2ggZG9lcyBxdWVyeVNlbGVjdG9yQWxsIGVhY2ggdGltZSwgY29uc2lkZXIgYSBzaW5nbGUgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0Ly8gb3Igc2ltcGx5IGNhbGwgdmlldy5yZW1vdmVWaWV3cygpIG9uIHRoZSB0b3AtbGV2ZWwgdmlld3MgdW5kZXIgdGhlIHRhcmdldCAndG8nIG5vZGUsIHRoZW4gY2xlYW4oLi4uKVxuXHRcdFx0d2hpbGUgKChpbm5lclZpZXcgPSAkdmlldyh0aGlzLCB0cnVlKSkgJiYgaW5uZXJWaWV3LnBhcmVudCkge1xuXHRcdFx0XHRpbm5lclZpZXcucGFyZW50LnJlbW92ZVZpZXdzKGlubmVyVmlldy5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdGNsZWFuKHRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpKTtcblx0XHR9KTtcblx0XHRjbGVhbih0byk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQ2FsbCB0byAkLnVubGluaygpIGlzIGVxdWl2YWxlbnQgdG8gJC51bmxpbmsodHJ1ZSwgXCJib2R5XCIpXG5cdFx0aWYgKGFjdGl2ZUJvZHkpIHtcblx0XHRcdCQoYWN0aXZlQm9keSlcblx0XHRcdFx0Lm9mZihlbGVtZW50Q2hhbmdlU3RyLCBlbGVtQ2hhbmdlSGFuZGxlcilcblx0XHRcdFx0Lm9mZignYmx1cicsICdbY29udGVudGVkaXRhYmxlXScsIGVsZW1DaGFuZ2VIYW5kbGVyKTtcblx0XHRcdGFjdGl2ZUJvZHkgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHRvcFZpZXcucmVtb3ZlVmlld3MoKTtcblx0XHRjbGVhbihkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSk7XG5cdH1cbn1cblxuLy89PT09PT09PVxuLy8gSGVscGVyc1xuLy89PT09PT09PVxuXG5mdW5jdGlvbiBpbnB1dEF0dHJpYihlbGVtKSB7XG5cdHJldHVybiBlbGVtLnR5cGUgPT09IENIRUNLQk9YID8gZWxlbVtDSEVDS0VEXSA6IGVsZW0udmFsdWU7XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLz09PT09PT09PT09PT09PT09PT09PVxuLy8gSnNSZW5kZXIgaW50ZWdyYXRpb25cbi8vPT09PT09PT09PT09PT09PT09PT09XG5cbiRzdWIub25TdG9yZS50ZW1wbGF0ZSA9IGZ1bmN0aW9uKG5hbWUsIGl0ZW0pIHtcblx0aXRlbS5saW5rID0gdG1wbExpbms7XG5cdGlmIChuYW1lKSB7XG5cdFx0JC5saW5rW25hbWVdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdG1wbExpbmsuYXBwbHkoaXRlbSwgYXJndW1lbnRzKTtcblx0XHR9O1xuXHR9XG59O1xuXG4kc3ViLnZpZXdJbmZvcyA9IHZpZXdJbmZvczsgLy8gRXhwb3NlIHZpZXdJbmZvcygpIGFzIHB1YmxpYyBoZWxwZXIgbWV0aG9kXG5cbi8vIERlZmluZSBKc1ZpZXdzIHZlcnNpb24gb2YgZGVsaW1pdGVycygpLCBhbmQgaW5pdGlhbGl6ZVxuKCR2aWV3c1NldHRpbmdzLmRlbGltaXRlcnMgPSBmdW5jdGlvbigpIHtcblx0Ly8gUnVuIGRlbGltaXRlcnMgaW5pdGlhbGl6YXRpb24gaW4gY29udGV4dCBvZiBqc3JlbmRlci5qc1xuXHR2YXIgcmV0ID0gb2xkSnN2RGVsaW1pdGVycy5hcHBseSgwLCBhcmd1bWVudHMpO1xuXG5cdGlmIChvbGRKc3ZEZWxpbWl0ZXJzICE9PSAkdmlld3NEZWxpbWl0ZXJzKSB7XG5cdFx0Ly8gSWYgSnNSZW5kZXIgd2FzIGxvYWRlZCBiZWZvcmUgSnNWaWV3cywgdGhlbiBuZWVkIGFsc28gdG8gaW5pdGlhbGl6ZSBhbmQgc2V0IGdsb2JhbHMgaW4gdGhhdCBKc1JlbmRlciBpbnN0YW5jZVxuXHRcdHJldCA9ICR2aWV3c0RlbGltaXRlcnMuYXBwbHkoMCwgYXJndW1lbnRzKTtcblx0fVxuXG5cdC8vIERhdGEtbGlua2luZyBtdXN0IHVzZSBuZXcgZGVsaW1pdGVyc1xuXHRyVGFnRGF0YWxpbmsgPSBuZXcgUmVnRXhwKFwiKD86XnxcXFxccyopKFtcXFxcdy1dKikoXFxcXFwiICsgbGlua0NoYXIgKyBcIik/KFxcXFxcIiArIGRlbGltT3BlbkNoYXIxICsgJHN1Yi5yVGFnICsgXCIoOlxcXFx3Kik/XFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCIpXCIsIFwiZ1wiKTtcblx0cmV0dXJuIHJldDtcbn0pKCk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG4kc3ViLmFkZFNldHRpbmcoXCJ0cmlnZ2VyXCIpO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQWRkaXRpb25hbCBtZW1iZXJzIGZvciBsaW5rZWQgdmlld3Ncbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHBhcmVudEVsZW0sIGlkLCB2aWV3T3JUYWdDaGFyLCByZWZyZXNoKSB7XG5cdC8vIFRyYW5zZmVyIHRva2VucyBvbiBwcmV2Tm9kZSBvZiB2aWV3VG9SZW1vdmUvdmlld1RvUmVmcmVzaCB0byBuZXh0Tm9kZSBvciBwYXJlbnRFbGVtLl9kZlxuXHR2YXIgaSwgbCwgdndJbmZvcywgdndJbmZvLCB2aWV3T3JUYWcsIHZpZXdJZCwgdG9rZW5zLFxuXHRcdHByZWNlZGluZ0xlbmd0aCA9IDAsXG5cdFx0ZW1wdHlWaWV3ID0gcHJldk5vZGUgPT09IG5leHROb2RlO1xuXG5cdGlmIChwcmV2Tm9kZSkge1xuXHRcdC8vIHByZXZOb2RlIGlzIGVpdGhlciB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgdmlld09yVGFnLCBvciBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgdndJbmZvcyB0b2tlbnMgc3RyaW5nXG5cdFx0dndJbmZvcyA9IHZpZXdJbmZvcyhwcmV2Tm9kZSkgfHwgW107XG5cdFx0Zm9yIChpID0gMCwgbCA9IHZ3SW5mb3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHQvLyBTdGVwIHRocm91Z2ggdmlld3Mgb3IgdGFncyBvbiB0aGUgcHJldk5vZGVcblx0XHRcdHZ3SW5mbyA9IHZ3SW5mb3NbaV07XG5cdFx0XHR2aWV3SWQgPSB2d0luZm8uaWQ7XG5cdFx0XHRpZiAodmlld0lkID09PSBpZCAmJiB2d0luZm8uY2ggPT09IHZpZXdPclRhZ0NoYXIpIHtcblx0XHRcdFx0aWYgKHJlZnJlc2gpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIHZpZXdPclRhZ1RvUmVmcmVzaCwgdGhpcyBpcyB0aGUgbGFzdCB2aWV3T3JUYWcgdG8gcHJvY2Vzcy4uLlxuXHRcdFx0XHRcdGwgPSAwO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgdmlld09yVGFnVG9SZW1vdmUsIHNvIHdlIGFyZSBkb25lLi4uXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghZW1wdHlWaWV3KSB7XG5cdFx0XHRcdHZpZXdPclRhZyA9IHZ3SW5mby5jaCA9PT0gXCJfXCJcblx0XHRcdFx0XHQ/IHZpZXdTdG9yZVt2aWV3SWRdXG5cdFx0XHRcdFx0OiBiaW5kaW5nU3RvcmVbdmlld0lkXS5saW5rQ3R4LnRhZztcblx0XHRcdFx0aWYgKHZ3SW5mby5vcGVuKSB7XG5cdFx0XHRcdFx0Ly8gQSBcIiNtXCIgdG9rZW5cblx0XHRcdFx0XHR2aWV3T3JUYWcuX3BydiA9IG5leHROb2RlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHZ3SW5mby5jbG9zZSkge1xuXHRcdFx0XHRcdC8vIEEgXCIvbVwiIHRva2VuXG5cdFx0XHRcdFx0dmlld09yVGFnLl9ueHQgPSBuZXh0Tm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cHJlY2VkaW5nTGVuZ3RoICs9IHZpZXdJZC5sZW5ndGggKyAyO1xuXHRcdH1cblxuXHRcdGlmIChwcmVjZWRpbmdMZW5ndGgpIHtcblx0XHRcdHByZXZOb2RlLnNldEF0dHJpYnV0ZShqc3ZBdHRyU3RyLCBwcmV2Tm9kZS5nZXRBdHRyaWJ1dGUoanN2QXR0clN0cikuc2xpY2UocHJlY2VkaW5nTGVuZ3RoKSk7XG5cdFx0fVxuXHRcdHRva2VucyA9IG5leHROb2RlID8gbmV4dE5vZGUuZ2V0QXR0cmlidXRlKGpzdkF0dHJTdHIpIDogcGFyZW50RWxlbS5fZGY7XG5cdFx0aWYgKGwgPSB0b2tlbnMuaW5kZXhPZihcIi9cIiArIGlkICsgdmlld09yVGFnQ2hhcikgKyAxKSB7XG5cdFx0XHR0b2tlbnMgPSB2d0luZm9zLl90a25zLnNsaWNlKDAsIHByZWNlZGluZ0xlbmd0aCkgKyB0b2tlbnMuc2xpY2UobCArIChyZWZyZXNoID8gLTEgOiBpZC5sZW5ndGggKyAxKSk7XG5cdFx0fVxuXHRcdGlmICh0b2tlbnMpIHtcblx0XHRcdGlmIChuZXh0Tm9kZSkge1xuXHRcdFx0XHQvLyBJZiB2aWV3T3JUYWdUb1JlbW92ZSB3YXMgYW4gZW1wdHkgdmlld09yVGFnLCB3ZSB3aWxsIHJlbW92ZSBib3RoICNuIGFuZCAvblxuXHRcdFx0XHQvLyAoYW5kIGFueSBpbnRlcnZlbmluZyB0b2tlbnMpIGZyb20gdGhlIG5leHROb2RlICg9PT0gcHJldk5vZGUpXG5cdFx0XHRcdC8vIElmIHZpZXdPclRhZ1RvUmVtb3ZlIHdhcyBub3QgZW1wdHksIHdlIHdpbGwgdGFrZSB0b2tlbnMgcHJlY2VkaW5nICNuIGZyb20gcHJldk5vZGUsXG5cdFx0XHRcdC8vIGFuZCBjb25jYXRlbmF0ZSB3aXRoIHRva2VucyBmb2xsb3dpbmcgL24gb24gbmV4dE5vZGVcblx0XHRcdFx0bmV4dE5vZGUuc2V0QXR0cmlidXRlKGpzdkF0dHJTdHIsIHRva2Vucyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZXREZWZlcihwYXJlbnRFbGVtLCB0b2tlbnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyAhcHJldk5vZGUsIHNvIHRoZXJlIG1heSBiZSBhIGRlZmVycmVkIG5vZGVzIHRva2VuIG9uIHRoZSBwYXJlbnRFbGVtLiBSZW1vdmUgaXQuXG5cdFx0c2V0RGVmZXIocGFyZW50RWxlbSwgcmVtb3ZlU3ViU3RyKHBhcmVudEVsZW0uX2RmLCBcIiNcIiArIGlkICsgdmlld09yVGFnQ2hhcikpO1xuXHRcdGlmICghcmVmcmVzaCAmJiAhbmV4dE5vZGUpIHtcblx0XHRcdC8vIElmIHRoaXMgdmlld09yVGFnIGlzIGJlaW5nIHJlbW92ZWQsIGFuZCB0aGVyZSB3YXMgbm8gLm54dCwgcmVtb3ZlIGNsb3NpbmcgdG9rZW4gZnJvbSBkZWZlcnJlZCB0b2tlbnNcblx0XHRcdHNldERlZmVyKHBhcmVudEVsZW0sIHJlbW92ZVN1YlN0cihwYXJlbnRFbGVtLl9kZiwgXCIvXCIgKyBpZCArIHZpZXdPclRhZ0NoYXIpKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGlzcG9zZVRva2Vucyh0b2tlbnMpIHtcblx0dmFyIGksIGwsIHZ3SXRlbSwgdndJbmZvcztcblx0aWYgKHZ3SW5mb3MgPSB2aWV3SW5mb3ModG9rZW5zLCB0cnVlLCByT3Blbk1hcmtlcnMpKSB7XG5cdFx0Zm9yIChpID0gMCwgbCA9IHZ3SW5mb3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR2d0l0ZW0gPSB2d0luZm9zW2ldO1xuXHRcdFx0aWYgKHZ3SXRlbS5jaCA9PT0gXCJfXCIpIHtcblx0XHRcdFx0aWYgKCh2d0l0ZW0gPSB2aWV3U3RvcmVbdndJdGVtLmlkXSkgJiYgdndJdGVtLnR5cGUpIHtcblx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIHRoZSBfcHJ2IChwcmV2Tm9kZSkgZm9yIGEgdmlldywgcmVtb3ZlIHRoZSB2aWV3XG5cdFx0XHRcdFx0Ly8gLSB1bmxlc3Mgdmlldy50eXBlIGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHJlbW92ZWRcblx0XHRcdFx0XHR2d0l0ZW0ucGFyZW50LnJlbW92ZVZpZXdzKHZ3SXRlbS5fLmtleSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVtb3ZlVmlld0JpbmRpbmcodndJdGVtLmlkKTsgLy8gdW5iaW5kIGJpbmRpbmdzIHdpdGggdGhpcyBiaW5kaW5nSWQgb24gdGhpcyB2aWV3XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBZGQgbGluayBtZXRob2RzIHRvIGRhdGEtbGlua2VkIHZpZXcgb3IgdGFnXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gYWRkTGlua01ldGhvZHModGFnT3JWaWV3LCBpc1RhZykge1xuXG5cdHRhZ09yVmlldy5jb250ZW50cyA9IGZ1bmN0aW9uKGRlZXAsIHNlbGVjdCkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiBqUXVlcnkgb2JqZWN0IHdpdGggdGhlIGNvbnRlbnQgbm9kZXMsXG5cdFx0aWYgKGRlZXAgIT09ICEhZGVlcCkge1xuXHRcdFx0Ly8gZGVlcCBub3QgYm9vbGVhbiwgc28gdGhpcyBpcyBjb250ZW50cyhzZWxlY3Rvcilcblx0XHRcdHNlbGVjdCA9IGRlZXA7XG5cdFx0XHRkZWVwID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR2YXIgZmlsdGVyZWQsXG5cdFx0XHRub2RlcyA9ICQodGhpcy5ub2RlcygpKTtcblx0XHRpZiAobm9kZXNbMF0pIHtcblx0XHRcdGZpbHRlcmVkID0gc2VsZWN0ID8gbm9kZXMuZmlsdGVyKHNlbGVjdCkgOiBub2Rlcztcblx0XHRcdG5vZGVzID0gZGVlcCAmJiBzZWxlY3QgPyBmaWx0ZXJlZC5hZGQobm9kZXMuZmluZChzZWxlY3QpKSA6IGZpbHRlcmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gbm9kZXM7XG5cdH07XG5cblx0dGFnT3JWaWV3Lm5vZGVzID0gZnVuY3Rpb24od2l0aE1hcmtlcnMsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRcdC8vIEZvciBhIHZpZXcgb3IgYSB0YWcsIHJldHVybiB0b3AtbGV2ZWwgbm9kZXNcblx0XHQvLyBEbyBub3QgcmV0dXJuIGFueSBzY3JpcHQgbWFya2VyIG5vZGVzLCB1bmxlc3Mgd2l0aE1hcmtlcnMgaXMgdHJ1ZVxuXHRcdC8vIE9wdGlvbmFsbHkgbGltaXQgcmFuZ2UsIGJ5IHBhc3NpbmcgaW4gcHJldk5vZGUgb3IgbmV4dE5vZGUgcGFyYW1ldGVyc1xuXG5cdFx0dmFyIG5vZGUsXG5cdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdGVsQ250ID0gc2VsZi5fZWxDbnQsXG5cdFx0XHRwcmV2SXNGaXJzdE5vZGUgPSAhcHJldk5vZGUgJiYgZWxDbnQsXG5cdFx0XHRub2RlcyA9IFtdO1xuXG5cdFx0cHJldk5vZGUgPSBwcmV2Tm9kZSB8fCBzZWxmLl9wcnY7XG5cdFx0bmV4dE5vZGUgPSBuZXh0Tm9kZSB8fCBzZWxmLl9ueHQ7XG5cblx0XHRub2RlID0gcHJldklzRmlyc3ROb2RlXG5cdFx0XHQ/IChwcmV2Tm9kZSA9PT0gc2VsZi5fbnh0XG5cdFx0XHRcdD8gc2VsZi5wYXJlbnRFbGVtLmxhc3RTaWJsaW5nXG5cdFx0XHRcdDogcHJldk5vZGUpXG5cdFx0XHQ6IChzZWxmLl8uaW5saW5lID09PSBmYWxzZVxuXHRcdFx0XHQ/IHByZXZOb2RlIHx8IHNlbGYubGlua0N0eC5lbGVtLmZpcnN0Q2hpbGRcblx0XHRcdFx0OiBwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5uZXh0U2libGluZyk7XG5cblx0XHR3aGlsZSAobm9kZSAmJiAoIW5leHROb2RlIHx8IG5vZGUgIT09IG5leHROb2RlKSkge1xuXHRcdFx0aWYgKHdpdGhNYXJrZXJzIHx8IGVsQ250IHx8IG5vZGUudGFnTmFtZSAhPT0gU0NSSVBUKSB7XG5cdFx0XHRcdC8vIEFsbCB0aGUgdG9wLWxldmVsIG5vZGVzIGluIHRoZSB2aWV3XG5cdFx0XHRcdC8vIChleGNlcHQgc2NyaXB0IG1hcmtlciBub2RlcywgdW5sZXNzIHdpdGhNYXJrZXJzID0gdHJ1ZSlcblx0XHRcdFx0Ly8gKE5vdGU6IElmIGEgc2NyaXB0IG1hcmtlciBub2RlLCB2aWV3SW5mby5lbENudCB1bmRlZmluZWQpXG5cdFx0XHRcdG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0XHR9XG5cdFx0XHRub2RlID0gbm9kZS5uZXh0U2libGluZztcblx0XHR9XG5cdFx0cmV0dXJuIG5vZGVzO1xuXHR9O1xuXG5cdHRhZ09yVmlldy5jaGlsZFRhZ3MgPSBmdW5jdGlvbihkZWVwLCB0YWdOYW1lKSB7XG5cdFx0Ly8gRm9yIGEgdmlldyBvciBhIHRhZywgcmV0dXJuIGNoaWxkIHRhZ3MgLSBhdCBhbnkgZGVwdGgsIG9yIGFzIGltbWVkaWF0ZSBjaGlsZHJlbiBvbmx5LlxuXHRcdGlmIChkZWVwICE9PSAhIWRlZXApIHtcblx0XHRcdC8vIGRlZXAgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgY2hpbGRUYWdzKHRhZ05hbWUpIC0gd2hpY2ggbG9va3MgZm9yIHRvcC1sZXZlbCB0YWdzIG9mIGdpdmVuIHRhZ05hbWVcblx0XHRcdHRhZ05hbWUgPSBkZWVwO1xuXHRcdFx0ZGVlcCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHR2aWV3ID0gc2VsZi5saW5rID8gc2VsZiA6IHNlbGYudGFnQ3R4LnZpZXcsIC8vIHRoaXMgbWF5IGJlIGEgdmlldyBvciBhIHRhZy4gSWYgYSB0YWcsIGdldCB0aGUgdmlldyBmcm9tIHRhZy52aWV3LnRhZ0N0eFxuXHRcdFx0cHJldk5vZGUgPSBzZWxmLl9wcnYsXG5cdFx0XHRlbENudCA9IHNlbGYuX2VsQ250LFxuXHRcdFx0dGFncyA9IFtdO1xuXG5cdFx0dmlldy5saW5rKFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0c2VsZi5wYXJlbnRFbGVtLFxuXHRcdFx0ZWxDbnQgPyBwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5wcmV2aW91c1NpYmxpbmcgOiBwcmV2Tm9kZSxcblx0XHRcdHNlbGYuX254dCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHtnZXQ6e1xuXHRcdFx0XHR0YWdzOiB0YWdzLFxuXHRcdFx0XHRkZWVwOiBkZWVwLFxuXHRcdFx0XHRuYW1lOiB0YWdOYW1lLFxuXHRcdFx0XHRpZDogc2VsZi5saW5rID8gc2VsZi5fLmlkICsgXCJfXCIgOiBzZWxmLl90Z0lkICsgXCJeXCJcblx0XHRcdH19XG5cdFx0KTtcblx0XHRyZXR1cm4gdGFncztcblx0fTtcblxuXHR0YWdPclZpZXcucmVmcmVzaCA9IGZ1bmN0aW9uKHNvdXJjZVZhbHVlKSB7XG5cdFx0dmFyIHByb21pc2UsIGF0dHIsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0bGlua0N0eCA9IHRhZy5saW5rQ3R4LFxuXHRcdFx0dmlldyA9IHRhZy50YWdDdHgudmlldztcblxuXHRcdGlmICh0YWcuZGlzcG9zZWQpIHsgZXJyb3IoXCJSZW1vdmVkIHRhZ1wiKTsgfVxuXHRcdGlmIChzb3VyY2VWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzb3VyY2VWYWx1ZSA9ICRzdWIuX3RhZyh0YWcsIHZpZXcsIHZpZXcudG1wbCwgbWVyZ2VDdHhzKHRhZyksIHRydWUpOyAvLyBHZXQgcmVuZGVyZWQgSFRNTCBmb3IgdGFnLCBiYXNlZCBvbiByZWZyZXNoZWQgdGFnQ3R4c1xuXHRcdH1cblx0XHRpZiAoc291cmNlVmFsdWUgKyBcIlwiID09PSBzb3VyY2VWYWx1ZSkge1xuXHRcdFx0Ly8gSWYgbm8gcmVuZGVyZWQgY29udGVudCwgc291cmNlVmFsdWUgd2lsbCBub3QgYmUgYSBzdHJpbmcgKGNhbiBiZSAwIG9yIHVuZGVmaW5lZClcblx0XHRcdGlmICh0YWcub25VbmJpbmQpIHtcblx0XHRcdFx0dGFnLm9uVW5iaW5kKHRhZy50YWdDdHgsIGxpbmtDdHgsIHRhZy5jdHgpO1xuXHRcdFx0fVxuXHRcdFx0YXR0ciA9IHRhZy5fLmlubGluZSA/IEhUTUwgOiAobGlua0N0eC5hdHRyIHx8IGRlZmF1bHRBdHRyKHRhZy5wYXJlbnRFbGVtLCB0cnVlKSk7XG5cdFx0XHRwcm9taXNlID0gdXBkYXRlQ29udGVudChzb3VyY2VWYWx1ZSwgbGlua0N0eCwgYXR0ciwgdGFnKTtcblx0XHR9XG5cblx0XHRjYWxsQWZ0ZXJMaW5rKHRhZyk7XG5cdFx0cmV0dXJuIHByb21pc2UgfHwgdGFnO1xuXHR9O1xuXG5cdHRhZ09yVmlldy51cGRhdGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHZhciBsaW5rZWRFbGVtID0gdGhpcy5saW5rZWRFbGVtO1xuXHRcdGlmIChsaW5rZWRFbGVtKSB7XG5cdFx0XHRlbGVtQ2hhbmdlSGFuZGxlcih7XG5cdFx0XHRcdHRhcmdldDogbGlua2VkRWxlbVswXVxuXHRcdFx0fSwgdW5kZWZpbmVkLCB2YWx1ZSk7XG5cdFx0fVxuXHR9O1xuXG5cdGlmIChpc1RhZykge1xuXHRcdC8vIFRoaXMgaXMgYSBUQUdcblx0XHR0YWdPclZpZXcuZG9tQ2hhbmdlID0gZnVuY3Rpb24oKSB7IC8vIGRvbUNoYW5nZSBub3RpZmljYXRpb24gc3VwcG9ydFxuXHRcdFx0dmFyIGVsZW0gPSB0aGlzLnBhcmVudEVsZW0sXG5cdFx0XHRcdGhhc0xpc3RlbmVyID0gJC5oYXNEYXRhKGVsZW0pICYmICQuX2RhdGEoZWxlbSkuZXZlbnRzLFxuXHRcdFx0XHRkb21DaGFuZ2VOb3RpZmljYXRpb24gPSBcImpzdi1kb21jaGFuZ2VcIjtcblxuXHRcdFx0aWYgKGhhc0xpc3RlbmVyICYmIGhhc0xpc3RlbmVyW2RvbUNoYW5nZU5vdGlmaWNhdGlvbl0pIHtcblx0XHRcdFx0Ly8gT25seSB0cmlnZ2VyIGhhbmRsZXIgaWYgdGhlcmUgaXMgYSBoYW5kbGVyIGxpc3RlbmluZyBmb3IgdGhpcyBldmVudC4gKE5vdGUgdXNpbmcgdHJpZ2dlckhhbmRsZXIgLSBzbyBubyBldmVudCBidWJibGluZy4pXG5cdFx0XHRcdCQoZWxlbSkudHJpZ2dlckhhbmRsZXIoZG9tQ2hhbmdlTm90aWZpY2F0aW9uLCBhcmd1bWVudHMpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyBhIFZJRVdcblx0XHQvLyBOb3RlOiBhIGxpbmtlZCB2aWV3IHdpbGwgYWxzbywgYWZ0ZXIgbGlua2luZyBoYXZlIG5vZGVzW10sIF9wcnYgKHByZXZOb2RlKSwgX254dCAobmV4dE5vZGUpIC4uLlxuXHRcdHRhZ09yVmlldy5hZGRWaWV3cyA9IGZ1bmN0aW9uKGluZGV4LCBkYXRhSXRlbXMpIHtcblx0XHRcdC8vIGlmIHZpZXcgaXMgbm90IGFuIGFycmF5IHZpZXcsIGRvIG5vdGhpbmdcblx0XHRcdHZhciBpLCB2aWV3c0NvdW50LFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0aXRlbXNDb3VudCA9IGRhdGFJdGVtcy5sZW5ndGgsXG5cdFx0XHRcdHZpZXdzID0gc2VsZi52aWV3cztcblxuXHRcdFx0aWYgKCFzZWxmLl8udXNlS2V5ICYmIGl0ZW1zQ291bnQpIHtcblx0XHRcdFx0Ly8gdmlldyBpcyBvZiB0eXBlIFwiYXJyYXlcIlxuXHRcdFx0XHR2aWV3c0NvdW50ID0gdmlld3MubGVuZ3RoICsgaXRlbXNDb3VudDtcblxuXHRcdFx0XHRpZiAodmlld3NDb3VudCA9PT0gc2VsZi5kYXRhLmxlbmd0aCAvLyBJZiB2aWV3cyBub3QgYWxyZWFkeSBzeW5jZWQgdG8gYXJyYXkgKGUuZy4gdHJpZ2dlcmVkIGJ5IGFycmF5Lmxlbmd0aCBwcm9wZXJ0eUNoYW5nZSAtIGpzdmlld3MvaXNzdWVzLzMwMSlcblx0XHRcdFx0XHRcdCYmIHJlbmRlckFuZExpbmsoc2VsZiwgaW5kZXgsIHNlbGYudG1wbCwgdmlld3MsIGRhdGFJdGVtcywgc2VsZi5jdHgpICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdGlmICghc2VsZi5fLnNydCkgeyAvLyBOb3QgcGFydCBvZiBhICdzb3J0JyBvbiByZWZyZXNoXG5cdFx0XHRcdFx0XHRzZWxmLmZpeEluZGV4KGluZGV4ICsgaXRlbXNDb3VudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRhZ09yVmlldy5yZW1vdmVWaWV3cyA9IGZ1bmN0aW9uKGluZGV4LCBpdGVtc0NvdW50LCBrZWVwTm9kZXMsIGlzTW92ZSkge1xuXHRcdFx0Ly8gdmlldy5yZW1vdmVWaWV3cygpIHJlbW92ZXMgYWxsIHRoZSBjaGlsZCB2aWV3c1xuXHRcdFx0Ly8gdmlldy5yZW1vdmVWaWV3cyhpbmRleCkgcmVtb3ZlcyB0aGUgY2hpbGQgdmlldyB3aXRoIHNwZWNpZmllZCBpbmRleCBvciBrZXlcblx0XHRcdC8vIHZpZXcucmVtb3ZlVmlld3MoaW5kZXgsIGNvdW50KSByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbnVtbWJlciBvZiBjaGlsZCB2aWV3cywgc3RhcnRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4XG5cdFx0XHRmdW5jdGlvbiByZW1vdmVWaWV3KGluZGV4KSB7XG5cdFx0XHRcdHZhciBpZCwgYmluZElkLCBwYXJlbnRFbGVtLCBwcmV2Tm9kZSwgbmV4dE5vZGUsIG5vZGVzVG9SZW1vdmUsXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlID0gdmlld3NbaW5kZXhdO1xuXG5cdFx0XHRcdGlmICh2aWV3VG9SZW1vdmUgJiYgdmlld1RvUmVtb3ZlLmxpbmspIHtcblx0XHRcdFx0XHRpZCA9IHZpZXdUb1JlbW92ZS5fLmlkO1xuXHRcdFx0XHRcdGlmICgha2VlcE5vZGVzKSB7XG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgdGhlIEhUTUwgbm9kZXMgZnJvbSB0aGUgRE9NLCB1bmxlc3MgdGhleSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkLCBpbmNsdWRpbmcgbm9kZXMgb2YgY2hpbGQgdmlld3Ncblx0XHRcdFx0XHRcdG5vZGVzVG9SZW1vdmUgPSB2aWV3VG9SZW1vdmUubm9kZXMoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBSZW1vdmUgY2hpbGQgdmlld3MsIHdpdGhvdXQgcmVtb3Zpbmcgbm9kZXNcblx0XHRcdFx0XHR2aWV3VG9SZW1vdmUucmVtb3ZlVmlld3ModW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdFx0XHRcdFx0dmlld1RvUmVtb3ZlLnR5cGUgPSB1bmRlZmluZWQ7IC8vIFNldCB0eXBlIHRvIHVuZGVmaW5lZDogdXNlZCBhcyBhIGZsYWcgdGhhdCB0aGlzIHZpZXcgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0XHRcdHByZXZOb2RlID0gdmlld1RvUmVtb3ZlLl9wcnY7XG5cdFx0XHRcdFx0bmV4dE5vZGUgPSB2aWV3VG9SZW1vdmUuX254dDtcblx0XHRcdFx0XHRwYXJlbnRFbGVtID0gdmlld1RvUmVtb3ZlLnBhcmVudEVsZW07XG5cdFx0XHRcdFx0Ly8gSWYgcHJldk5vZGUgYW5kIG5leHROb2RlIGFyZSB0aGUgc2FtZSwgdGhlIHZpZXcgaXMgZW1wdHlcblx0XHRcdFx0XHRpZiAoIWtlZXBOb2Rlcykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBIVE1MIG5vZGVzIGZyb20gdGhlIERPTSwgdW5sZXNzIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgaW5jbHVkaW5nIG5vZGVzIG9mIGNoaWxkIHZpZXdzXG5cdFx0XHRcdFx0XHRpZiAodmlld1RvUmVtb3ZlLl9lbENudCkge1xuXHRcdFx0XHRcdFx0XHQvLyBpZiBrZWVwTm9kZXMgaXMgZmFsc2UgKGFuZCB0cmFuc2ZlcnJpbmcgb2YgdG9rZW5zIGhhcyBub3QgYWxyZWFkeSBiZWVuIGRvbmUgYXQgYSBoaWdoZXIgbGV2ZWwpXG5cdFx0XHRcdFx0XHRcdC8vIHRoZW4gdHJhbnNmZXIgdG9rZW5zIGZyb20gcHJldk5vZGUgd2hpY2ggaXMgYmVpbmcgcmVtb3ZlZCwgdG8gbmV4dE5vZGUuXG5cdFx0XHRcdFx0XHRcdHRyYW5zZmVyVmlld1Rva2VucyhwcmV2Tm9kZSwgbmV4dE5vZGUsIHBhcmVudEVsZW0sIGlkLCBcIl9cIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQkKG5vZGVzVG9SZW1vdmUpLnJlbW92ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXZpZXdUb1JlbW92ZS5fZWxDbnQpIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHByZXZOb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocHJldk5vZGUpOyAvLyAocHJldk5vZGUucGFyZW50Tm9kZSBpcyBwYXJlbnRFbGVtLCBleGNlcHQgaWYgalF1ZXJ5IE1vYmlsZSBvciBzaW1pbGFyIGhhcyBpbnNlcnRlZCBhbiBpbnRlcm1lZGlhdGUgd3JhcHBlclxuXHRcdFx0XHRcdFx0XHRuZXh0Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5leHROb2RlKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNldEFycmF5Q2hhbmdlTGluayh2aWV3VG9SZW1vdmUpO1xuXHRcdFx0XHRcdGZvciAoYmluZElkIGluIHZpZXdUb1JlbW92ZS5fLmJuZHMpIHtcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXdCaW5kaW5nKGJpbmRJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRlbGV0ZSB2aWV3U3RvcmVbaWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjdXJyZW50LCB2aWV3LCB2aWV3c0NvdW50LFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0aXNBcnJheSA9ICFzZWxmLl8udXNlS2V5LFxuXHRcdFx0XHR2aWV3cyA9IHNlbGYudmlld3M7XG5cblx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdHZpZXdzQ291bnQgPSB2aWV3cy5sZW5ndGg7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBSZW1vdmUgYWxsIGNoaWxkIHZpZXdzXG5cdFx0XHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRcdFx0Ly8gdmlld3MgYW5kIGRhdGEgYXJlIGFycmF5c1xuXHRcdFx0XHRcdGN1cnJlbnQgPSB2aWV3c0NvdW50O1xuXHRcdFx0XHRcdHdoaWxlIChjdXJyZW50LS0pIHtcblx0XHRcdFx0XHRcdHJlbW92ZVZpZXcoY3VycmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGYudmlld3MgPSBbXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB2aWV3cyBhbmQgZGF0YSBhcmUgb2JqZWN0c1xuXHRcdFx0XHRcdGZvciAodmlldyBpbiB2aWV3cykge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGJ5IGtleVxuXHRcdFx0XHRcdFx0cmVtb3ZlVmlldyh2aWV3KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VsZi52aWV3cyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoaXRlbXNDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGlzQXJyYXkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBwYXJlbnRWaWV3IGlzIGRhdGEgYXJyYXkgdmlldy5cblx0XHRcdFx0XHRcdC8vIFNldCBpdGVtc0NvdW50IHRvIDEsIHRvIHJlbW92ZSB0aGlzIGl0ZW1cblx0XHRcdFx0XHRcdGl0ZW1zQ291bnQgPSAxO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgY2hpbGQgdmlldyB3aXRoIGtleSAnaW5kZXgnXG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGluZGV4KTtcblx0XHRcdFx0XHRcdGRlbGV0ZSB2aWV3c1tpbmRleF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChpc0FycmF5ICYmIGl0ZW1zQ291bnRcblx0XHRcdFx0XHQmJiAoaXNNb3ZlIHx8IHZpZXdzQ291bnQgLSBpdGVtc0NvdW50ID09PSBzZWxmLmRhdGEubGVuZ3RoKSkgeyAvLyBJZiB2aWV3cyBub3QgYWxyZWFkeSBzeW5jZWQgdG8gYXJyYXkgKGUuZy4gdHJpZ2dlcmVkIGJ5IGFycmF5Lmxlbmd0aCBwcm9wZXJ0eUNoYW5nZSAtIGpzdmlld3MvaXNzdWVzLzMwMSlcblx0XHRcdFx0XHRjdXJyZW50ID0gaW5kZXggKyBpdGVtc0NvdW50O1xuXHRcdFx0XHRcdC8vIFJlbW92ZSBpbmRleGVkIGl0ZW1zIChwYXJlbnRWaWV3IGlzIGRhdGEgYXJyYXkgdmlldyk7XG5cdFx0XHRcdFx0d2hpbGUgKGN1cnJlbnQtLSA+IGluZGV4KSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVWaWV3KGN1cnJlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2aWV3cy5zcGxpY2UoaW5kZXgsIGl0ZW1zQ291bnQpO1xuXHRcdFx0XHRcdGlmICghc2VsZi5fLnNvcnQpIHtcblx0XHRcdFx0XHRcdHNlbGYuZml4SW5kZXgoaW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0YWdPclZpZXcucmVmcmVzaCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRwYXJlbnQgPSBzZWxmLnBhcmVudDtcblxuXHRcdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0XHRyZW5kZXJBbmRMaW5rKHNlbGYsIHNlbGYuaW5kZXgsIHNlbGYudG1wbCwgcGFyZW50LnZpZXdzLCBzZWxmLmRhdGEsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdHNldEFycmF5Q2hhbmdlTGluayhzZWxmKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LmZpeEluZGV4ID0gZnVuY3Rpb24oZnJvbUluZGV4KSB7XG5cdFx0XHQvLyBGaXh1cCBpbmRleCBvbiBmb2xsb3dpbmcgdmlldyBpdGVtcy4uLlxuXHRcdFx0dmFyIHZpZXdzID0gdGhpcy52aWV3cyxcblx0XHRcdFx0aW5kZXggPSB2aWV3cy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoZnJvbUluZGV4IDwgaW5kZXgtLSkge1xuXHRcdFx0XHRpZiAodmlld3NbaW5kZXhdLmluZGV4ICE9PSBpbmRleCkge1xuXHRcdFx0XHRcdCRvYnNlcnZhYmxlKHZpZXdzW2luZGV4XSkuc2V0UHJvcGVydHkoXCJpbmRleFwiLCBpbmRleCk7XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBmaXhpbmcgdXAgaW5kZXgsIGJ1dCBub3Qga2V5LCBhbmQgbm90IGluZGV4IG9uIGNoaWxkIHZpZXdzLiBGcm9tIGNoaWxkIHZpZXdzLCB1c2Ugdmlldy5nZXRJbmRleCgpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGFnT3JWaWV3LmxpbmsgPSB2aWV3TGluaztcblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSnNWaWV3cy1zcGVjaWZpYyBjb252ZXJ0ZXJzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kY29udmVydGVycy5tZXJnZSA9IGZ1bmN0aW9uKHZhbCkge1xuXHQvLyBTcGVjaWFsIGNvbnZlcnRlciB1c2VkIGluIGRhdGEtbGlua2luZyB0byBzcGFjZS1zZXBhcmF0ZWQgbGlzdHMsIHN1Y2ggYXMgY2xhc3NOYW1lOlxuXHQvLyBDdXJyZW50bHkgb25seSBzdXBwb3J0cyB0b2dnbGUgc2VtYW50aWNzIC0gYW5kIGhhcyBubyBlZmZlY3QgaWYgdG9nZ2xlIHN0cmluZyBpcyBub3Qgc3BlY2lmaWVkXG5cdC8vIGRhdGEtbGluaz1cImNsYXNze21lcmdlOmJvb2xFeHByIHRvZ2dsZT1jbGFzc05hbWV9XCJcblx0dmFyIHJlZ3VsYXJFeHByZXNzaW9uLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHRoaXMubGlua0N0eC5fdmFsIHx8IFwiXCIsXG5cdFx0dG9nZ2xlID0gdGhpcy50YWdDdHgucHJvcHMudG9nZ2xlO1xuXG5cdGlmICh0b2dnbGUpIHtcblx0XHQvLyBXZSBhcmUgdG9nZ2xpbmcgdGhlIGNsYXNzIHNwZWNpZmllZCBieSB0aGUgdG9nZ2xlIHByb3BlcnR5LFxuXHRcdC8vIGFuZCB0aGUgYm9vbGVhbiB2YWwgYmluZGluZyBpcyBkcml2aW5nIHRoZSBpbnNlcnQvcmVtb3ZlIHRvZ2dsZVxuXG5cdFx0cmVndWxhckV4cHJlc3Npb24gPSB0b2dnbGUucmVwbGFjZSgvW1xcXFxeJC58PyorKClbe10vZywgXCJcXFxcJCZcIik7XG5cdFx0Ly8gRXNjYXBlIGFueSByZWd1bGFyIGV4cHJlc3Npb24gc3BlY2lhbCBjaGFyYWN0ZXJzIChtZXRhY2hhcmFjdGVycykgd2l0aGluIHRoZSB0b2dnbGUgc3RyaW5nXG5cdFx0cmVndWxhckV4cHJlc3Npb24gPSBcIihcXFxccyg/PVwiICsgcmVndWxhckV4cHJlc3Npb24gKyBcIiQpfChcXFxccyl8XikoXCIgKyByZWd1bGFyRXhwcmVzc2lvbiArIFwiKFxcXFxzfCQpKVwiO1xuXHRcdC8vIEV4YW1wbGU6IC8oXFxzKD89bXljbGFzcyQpfChcXHMpfF4pPyhteWNsYXNzKFxcc3wkKSkvIC0gc28gbWF0Y2hlcyAoXCIgbXljbGFzc1wiIG9yIFwiIFwiIG9yIF4gKSBmb2xsb3dlZCBieSAoXCJteWNsYXNzIFwiIG9yIFwibXljbGFzcyRcIikgd2hlcmUgXi8kIGFyZSBiZWdpbm5pbmcvZW5kIG9mIHN0cmluZ1xuXHRcdGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAocmVndWxhckV4cHJlc3Npb24pLCBcIiQyXCIpO1xuXHRcdHZhbCA9IGN1cnJlbnRWYWx1ZSArICh2YWwgPyAoY3VycmVudFZhbHVlICYmIFwiIFwiKSArIHRvZ2dsZSA6IFwiXCIpO1xuXHR9XG5cdHJldHVybiB2YWw7XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSnNWaWV3cy1zcGVjaWZpYyB0YWdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBrZWVwUGFyZW50RGF0YUN0eCh2YWwpIHtcblx0cmV0dXJuIHRoaXMudGFnQ3R4LnZpZXc7IC8vIFJldHVybiB0aGUgcGFyZW50IHZpZXcgYXMgZGF0YSBjb250ZXh0IGZvciByZW5kZXJpbmcgYmxvY2sgY29udGVudFxufVxuXG4kdGFncyh7XG5cdG9uOiB7XG5cdFx0YXR0cjogTk9ORSxcblx0XHRpbml0OiBmdW5jdGlvbih0YWdDdHgpIHtcblx0XHRcdHZhciBjb250ZW50LFxuXHRcdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0YXJncyA9IHRhZ0N0eC5hcmdzLCAvLyBbZXZlbnRzLF0gW3NlbGVjdG9yLF0gaGFuZGxlclxuXHRcdFx0XHRsID0gYXJncy5sZW5ndGg7XG5cblx0XHRcdGZvciAoOyBpPGwgJiYgISRpc0Z1bmN0aW9uKGFyZ3NbaV0pOyBpKyspOyAvLyBIYW5kbGVyIGlzIGZpcnN0IGFyZyBvZiB0eXBlIGZ1bmN0aW9uXG5cdFx0XHR0YWcuX2hpID0gbD5pICYmIGkrMTsgLy8gaGFuZGxlciBpbmRleFxuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHRpZiAoISRzdWIuclRtcGwuZXhlYyhjb250ZW50ID0gdGFnQ3R4LnRtcGwubWFya3VwKSkge1xuXHRcdFx0XHRcdC8vIElubGluZSB7Xntvbn19IHRhZyB3aXRoIG5vIGNvbnRlbnQgKG9yIGV4dGVybmFsIHRlbXBsYXRlIGNvbnRlbnQpIG9yIHdpdGggY29udGVudCBjb250YWluaW5nXG5cdFx0XHRcdFx0Ly8gbm8gSFRNTCBvciBKc1JlbmRlciB0YWdzOiBXZSB3aWxsIHdyYXAgdGhlICh0ZXh0KSBjb250ZW50LCBvciB0aGUgb3BlcmF0aW9uIG5hbWUgaW4gYSA8YnV0dG9uPiBlbGVtZW50XG5cdFx0XHRcdFx0Ly8gKE90aGVyd2lzZSB3ZSB3aWxsIGF0dGFjaCB0aGUgaGFuZGxlciB0byB0aGUgZWxlbWVudCBjb250ZW50IGFmdGVyIGRhdGEtbGlua2luZylcblx0XHRcdFx0XHR0YWcudGVtcGxhdGUgPSBcIjxidXR0b24+XCIgKyAoJC50cmltKGNvbnRlbnQpIHx8IHRhZ0N0eC5wYXJhbXMuYXJnc1tpXSB8fCBcIm5vb3BcIikgKyBcIjwvYnV0dG9uPlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZy5hdHRyID0gSFRNTDtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uQWZ0ZXJMaW5rOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHRcdHZhciBoYW5kbGVyLCBwYXJhbXMsIGZpbmQsIGFjdGl2ZUVsZW0sXG5cdFx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRcdGkgPSB0YWcuX2hpLFxuXHRcdFx0XHRhcmdzID0gdGFnQ3R4LmFyZ3MsIC8vIFtldmVudHMsXSBbc2VsZWN0b3IsXSBoYW5kbGVyXG5cdFx0XHRcdGwgPSBhcmdzLmxlbmd0aCxcblx0XHRcdFx0cHJvcHMgPSB0YWdDdHgucHJvcHMsXG5cdFx0XHRcdGRhdGEgPSBwcm9wcy5kYXRhLFxuXHRcdFx0XHR2aWV3ID0gdGFnQ3R4LnZpZXcsXG5cdFx0XHRcdGNvbnRleHRPYiA9IHByb3BzLmNvbnRleHQ7IC8vIENvbnRleHQgKCd0aGlzJyBwb2ludGVyKSBmb3IgYXR0YWNoZWQgaGFuZGxlclxuXG5cdFx0XHRpZiAoaSkgeyAvLyBUaGVyZSBpcyBhIGhhbmRsZXJcblx0XHRcdFx0aGFuZGxlciA9IGFyZ3NbaS0xXTtcblx0XHRcdFx0cGFyYW1zID0gYXJncy5zbGljZShpKTsgLy8gU3Vic2VxdWVudCBhcmdzIGFyZSBwYXJhbXNcblx0XHRcdFx0YXJncyA9IGFyZ3Muc2xpY2UoMCwgaS0xKTsgLy8gUHJlY2VkaW5nIGFyZ3MgKGlmIGFueSkgYXJlIGV2ZW50cyBhbmQgc2VsZWN0b3Jcblx0XHRcdFx0dGFnLl9zZWwgPSBhcmdzWzFdOyAvLyBTZWxlY3RvciBmb3IgZGVzY2VuZGFudCBlbGVtZW50cyAtIGZvciBkZWxlZ2F0ZWQgZXZlbnRzIG9uIHRob3NlIGVsZW1lbnRzLCBkZWxlZ2F0aW5nIHRvIHRoZSBhY3RpdmVFbGVtXG5cblx0XHRcdFx0YWN0aXZlRWxlbSA9IHRhZy5hY3RpdmVFbGVtID0gdGFnLmFjdGl2ZUVsZW0gfHwgJCh0YWcuXy5pbmxpbmVcblx0XHRcdFx0XHQ/ICh0YWcuX3NlbCA9IGFyZ3NbMV0gfHwgXCIqXCIsIHRhZy5wYXJlbnRFbGVtKVxuXHRcdFx0XHRcdC8vIElmIGlubGluZSwgYXR0YWNoIHRvIGNoaWxkIGVsZW1lbnRzIG9mIHRhZyBwYXJlbnQgZWxlbWVudCAoZmlsdGVyZWQgYnkgc2VsZWN0b3IgYXJndW1lbnQgaWYgcHJvdmlkZWQuXG5cdFx0XHRcdFx0Ly8gKEluIGhhbmRsZXIgd2UnbGwgZmlsdGVyIG91dCBldmVudHMgZnJvbSBzaWJsaW5nIGVsZW1lbnRzIHByZWNlZGluZyBvciBmb2xsb3dpbmcgdGFnLilcblx0XHRcdFx0XHQvLyBUaGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIGRlbGVnYXRlZCBwYXR0ZXJuIHdoZXJlIHRoZSBhdHRhY2hlZCBldmVudCB3b3JrcyBldmVuIGZvciBhZGRlZCBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZSBzZWxlY3RvclxuXHRcdFx0XHRcdDogbGlua0N0eC5lbGVtKTtcblxuXHRcdFx0XHRpZiAoIWNvbnRleHRPYikge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgcGF0aCBmb3IgdGhlIHByZWNlZGluZyBvYmplY3QgKGNvbnRleHQgb2JqZWN0KSBvZiBoYW5kbGVyICh3aGljaCBpcyB0aGUgbGFzdCBhcmcpLCBjb21waWxlIGZ1bmN0aW9uXG5cdFx0XHRcdFx0Ly8gdG8gcmV0dXJuIHRoYXQgY29udGV4dCBvYmplY3QsIGFuZCBydW4gY29tcGlsZWQgZnVuY3Rpb24gYWdhaW5zdCBkYXRhXG5cdFx0XHRcdFx0Y29udGV4dE9iID0gL14oLiopW1xcLl5dW1xcdyRdKyQvLmV4ZWModGFnQ3R4LnBhcmFtcy5hcmdzLnNsaWNlKC1wYXJhbXMubGVuZ3RoIC0gMSlbMF0pO1xuXHRcdFx0XHRcdGNvbnRleHRPYiA9IGNvbnRleHRPYiAmJiAkc3ViLnRtcGxGbihkZWxpbU9wZW5DaGFyMSArIFwiOlwiICsgY29udGV4dE9iWzFdICsgZGVsaW1DbG9zZUNoYXIwLCB2aWV3LnRtcGwsIHRydWUpKGxpbmtDdHguZGF0YSwgdmlldyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGFnLl9ldnMpIHtcblx0XHRcdFx0XHR0YWcub25VbmJpbmQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjdGl2ZUVsZW0ub24oXG5cdFx0XHRcdFx0dGFnLl9ldnMgPSBhcmdzWzBdIHx8IFwiY2xpY2tcIiwgLy8gZXZlbnRzIGRlZmF1bHRzIHRvIFwiY2xpY2tcIlxuXHRcdFx0XHRcdHRhZy5fc2VsLFxuXHRcdFx0XHRcdGRhdGEgPT0gdW5kZWZpbmVkID8gbnVsbCA6IGRhdGEsXG5cdFx0XHRcdFx0dGFnLl9obHIgPSBmdW5jdGlvbiBobmRscihldikge1xuXHRcdFx0XHRcdFx0dmFyIG5vZGVzLCBsZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGZvdW5kID0gIXRhZy5fLmlubGluZTtcblxuXHRcdFx0XHRcdFx0aWYgKCFmb3VuZCkgeyAvLyBJZiBpbmxpbmUsIGZpbHRlciBvdXQgZXZlbnRzIGZyb20gc2libGluZyBlbGVtZW50cyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRhZy5cblx0XHRcdFx0XHRcdFx0bm9kZXMgPSB0YWcuY29udGVudHMoXCIqXCIpO1xuXHRcdFx0XHRcdFx0XHRsID0gbm9kZXMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIWZvdW5kICYmIGwtLSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChub2Rlc1tsXS5jb250YWlucyhldi50YXJnZXQpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoZm91bmQpIHsgLy8gdGFyZ2V0IGVsZW0gaXMgaW5kZWVkIHdpdGhpbiB0aGUgdGFnLCBzbyBjYWxsIHRoZSB7b259IGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGhhbmRsZXIuYXBwbHkoY29udGV4dE9iIHx8IGxpbmtDdHguZGF0YSwgW10uY29uY2F0KFxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcywgLy8gZS5nLiBwYXIxLCBwYXIyXG5cdFx0XHRcdFx0XHRcdFx0ZXYsXG5cdFx0XHRcdFx0XHRcdFx0e2NoYW5nZTogZXYudHlwZSwgdmlldzogdmlldywgbGlua0N0eDogbGlua0N0eH0sXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW1zLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSAvLyBJZiB0cmlnZ2VyaW5nIGV2ZW50IChlLmcuIGpzdi1kb21jaGFuZ2UpIGhhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlciBldiwgcGFzcyB0aGVtIHRvb1xuXHRcdFx0XHRcdFx0XHQpKTtcblx0XHRcdFx0XHRcdFx0Ly8gZm9yIHtvbiAnY2xpY2snIGhhbmRsZXIgcGFyMSBwYXIyfSB1c2UgaGFuZGxlcihwYXIxLCBwYXIyLCBldiwgZG9tY2hhbmdlRXZlbnRBcmdzKVxuXHRcdFx0XHRcdFx0XHQvLyBmb3Ige29uICdqc3YtZG9tY2hhbmdlJyBoYW5kbGVyIHBhcjEgcGFyMn0gdXNlIGhhbmRsZXIocGFyMSwgcGFyMiwgZXYsIGRvbWNoYW5nZUV2ZW50QXJncywgdGFnQ3R4LCBsaW5rQ3R4LCBvYnNlcnZhYmxlRXZlbnRBcmdzKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdG9uVW5iaW5kOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRcdGlmIChzZWxmLmFjdGl2ZUVsZW0pIHtcblx0XHRcdFx0c2VsZi5hY3RpdmVFbGVtLm9mZihzZWxmLl9ldnMsIHNlbGYuX3NlbCwgc2VsZi5faGxyKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGZsb3c6IHRydWUsXG5cdFx0Y29udGVudEN0eDoga2VlcFBhcmVudERhdGFDdHgsXG5cdFx0ZGF0YUJvdW5kT25seTogdHJ1ZVxuXHR9LFxuXHRyYWRpb2dyb3VwOiB7XG5cdFx0aW5pdDogZnVuY3Rpb24odGFnQ3R4KSB7XG5cdFx0XHR0aGlzLm5hbWUgPSB0YWdDdHgucHJvcHMubmFtZSB8fCAoXCJqc3ZcIiArIE1hdGgucmFuZG9tKCkpO1xuXHRcdH0sXG5cdFx0b25CaW5kOiBmdW5jdGlvbih0YWdDdHgsIGxpbmtDdHgpIHtcblx0XHRcdHZhciBkb21DaG5nQ250bnIsXG5cdFx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRcdCRsaW5rZWRFbGVtID0gdGFnLmxpbmtlZEVsZW0gPSAodGFnLl8uaW5saW5lID8gdGFnLmNvbnRlbnRzKHRydWUsIFwiaW5wdXRbdHlwZT1yYWRpb11cIikgOiAkKGxpbmtDdHguZWxlbSkuZmluZChcImlucHV0W3R5cGU9cmFkaW9dXCIpKSxcblx0XHRcdFx0bCA9ICRsaW5rZWRFbGVtLmxlbmd0aDtcblxuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0XHQvLyBJZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBvd25lZCBieSAocmVuZGVyZWQgYnkpIHRoaXMgdGFnIChub3QgYnkgYSBjaGlsZFRhZyBzdWNoIGFzIHtee2Zvcn19KVxuXHRcdFx0XHQvLyB1c2UgaXQgYXMgY29udGFpbmVyIGZvciBkZXRlY3RpbmcgZG9tIGNoYW5nZXNcblx0XHRcdFx0ZG9tQ2huZ0NudG5yID0gdGFnLmNvbnRlbnRzKFwiKlwiKVswXTtcblx0XHRcdFx0ZG9tQ2huZ0NudG5yID0gZG9tQ2huZ0NudG5yICYmICQudmlldyhkb21DaG5nQ250bnIpLmN0eC50YWcgPT09IHRhZy5wYXJlbnQgPyBkb21DaG5nQ250bnIgOiB0YWcucGFyZW50RWxlbTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRvbUNobmdDbnRuciA9IGxpbmtDdHguZWxlbTtcblx0XHRcdH1cblx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0Ly8gQ29uZmlndXJlIHRoZSBuYW1lIGZvciBlYWNoIHJhZGlvIGlucHV0IGVsZW1lbnRcblx0XHRcdFx0JGxpbmtlZEVsZW1bbF0ubmFtZSA9ICRsaW5rZWRFbGVtW2xdLm5hbWUgfHwgdGFnLm5hbWU7XG5cdFx0XHR9XG5cdFx0XHQvLyBFc3RhYmxpc2ggYSBkb21jaGFuZ2UgbGlzdGVuZXIgaW4gY2FzZSB0aGlzIHJhZGlvZ3JvdXAgd3JhcHMgYSB7Xntmb3J9fSBvciB7XntpZn19IG9yIHNpbWlsYXIgd2hpY2ggbWlnaHQgZHluYW1pY2FsbHkgaW5zZXJ0IG5ldyByYWRpbyBpbnB1dCBlbGVtZW50c1xuXHRcdFx0JChkb21DaG5nQ250bnIpLm9uKFwianN2LWRvbWNoYW5nZVwiLCBmdW5jdGlvbihldiwgZm9yT3JJZlRhZ0N0eCkge1xuXHRcdFx0XHR2YXIgbGlua2VkRWxlbSxcblx0XHRcdFx0XHRwYXJlbnRUYWdzID0gZm9yT3JJZlRhZ0N0eC5jdHgucGFyZW50VGFncztcblx0XHRcdFx0aWYgKCF0YWcuXy5pbmxpbmUgfHwgZG9tQ2huZ0NudG5yICE9PSB0YWcucGFyZW50RWxlbSAvLyBUaGUgZG9tQ2huZ0NudG5yIGlzIHNwZWNpZmljIHRvIHRoaXMgdGFnXG5cdFx0XHRcdFx0Ly8gVGhlIGRvbUNobmdDbnRuciBpcyB0aGUgcGFyZW50RWxlbSBvZiB0aGlzIHRhZywgc28gbmVlZCB0byBtYWtlIHN1cmUgZG9tIGNoYW5nZSBldmVudCBpcyBmb3Jcblx0XHRcdFx0XHQvLyBhIGNvbnRlbnQgY2hhbmdlIHdpdGhpbiB0aGlzIHRhZywgbm90IG91dHNpZGUgaXQuXG5cdFx0XHRcdFx0fHwgcGFyZW50VGFncyAmJiBwYXJlbnRUYWdzW3RhZy50YWdOYW1lXSA9PT0gdGFnKSB7XG5cdFx0XHRcdFx0Ly8gQ29udGVudHMgaGF2ZSBjaGFuZ2VkIHNvIHJlY3JlYXRlICRsaW5rZWRFbGVtIGZvciB0aGUgcmFkaW8gaW5wdXQgZWxlbWVudHMgKGluY2x1ZGluZyBwb3NzaWJsZSBuZXcgb25lIGp1c3QgaW5zZXJ0ZWQpXG5cdFx0XHRcdFx0JGxpbmtlZEVsZW0gPSB0YWcubGlua2VkRWxlbSA9IHRhZy5jb250ZW50cyh0cnVlLCBcImlucHV0W3R5cGU9cmFkaW9dXCIpO1xuXHRcdFx0XHRcdGwgPSAkbGlua2VkRWxlbS5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0XHRcdFx0Ly8gQ29uZmlndXJlIGJpbmRpbmcgIGFuZCBuYW1lIGZvciBlYWNoIHJhZGlvIGlucHV0IGVsZW1lbnRcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0gPSAkbGlua2VkRWxlbVtsXTtcblx0XHRcdFx0XHRcdGxpbmtlZEVsZW0uX2pzdkxrRWwgPSB0YWc7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLm5hbWUgPSBsaW5rZWRFbGVtLm5hbWUgfHwgdGFnLm5hbWU7XG5cdFx0XHRcdFx0XHRiaW5kVG8oYmluZGluZ1N0b3JlW3RhZy5fdGdJZF0sIHRhZywgbGlua2VkRWxlbSk7XG5cdFx0XHRcdFx0XHRsaW5rZWRFbGVtLl9qc3ZCbmQgPSBcIiZcIiArIHRhZy5fdGdJZCArIFwiK1wiO1xuXHRcdFx0XHRcdFx0bGlua2VkRWxlbS5jaGVja2VkID0gdGFnLmN2dEFyZ3MoKVswXSA9PT0gbGlua2VkRWxlbS52YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0b25VcGRhdGU6IGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MsIHRhZ0N0eHMpIHtcblx0XHRcdHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgcmVyZW5kZXJcblx0XHR9LFxuXHRcdGNvbnRlbnRDdHg6IGtlZXBQYXJlbnREYXRhQ3R4LFxuXHRcdGRhdGFCb3VuZE9ubHk6IHRydWVcblx0fVxufSk7XG5cbiRleHRlbmQoJHRhZ3NbXCJmb3JcIl0sIHtcblx0Ly9vblVwZGF0ZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgbmV3VGFnQ3R4cykge1xuXHRcdC8vQ29uc2lkZXIgYWRkaW5nIGZpbHRlcmluZyBmb3IgcGVyZiBvcHRpbWl6YXRpb24uIEhvd2V2ZXIgdGhlIGJlbG93IHByZXZlbnRzIHVwZGF0ZSBvbiBzb21lIHNjZW5hcmlvcyB3aGljaCBfc2hvdWxkXyB1cGRhdGUgLSBuYW1lbHkgd2hlbiB0aGVyZSBpcyBhbm90aGVyIGFycmF5IG9uIHdoaWNoIGZvciBhbHNvIGRlcGVuZHMuXG5cdFx0Ly92YXIgaSwgbCwgdGNpLCBwcmV2QXJnO1xuXHRcdC8vZm9yICh0Y2kgPSAwOyAocHJldkFyZyA9IHRoaXMudGFnQ3R4c1t0Y2ldKSAmJiBwcmV2QXJnLmFyZ3MubGVuZ3RoOyB0Y2krKykge1xuXHRcdC8vXHRpZiAocHJldkFyZy5hcmdzWzBdICE9PSBuZXdUYWdDdHhzW3RjaV0uYXJnc1swXSkge1xuXHRcdC8vXHRcdHJldHVybiB0cnVlO1xuXHRcdC8vXHR9XG5cdFx0Ly99XG5cdFx0Ly9yZXR1cm4gZmFsc2U7XG5cdC8vfSxcblx0b25BcnJheUNoYW5nZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgdGFnQ3R4LCBsaW5rQ3R4KSB7XG5cdFx0dmFyIGFycmF5Vmlldyxcblx0XHRcdHRhcmdldCA9IGV2LnRhcmdldCxcblx0XHRcdHRhcmdldExlbmd0aCA9IHRhcmdldC5sZW5ndGgsXG5cdFx0XHR0YWcgPSB0aGlzLFxuXHRcdFx0Y2hhbmdlID0gZXZlbnRBcmdzLmNoYW5nZTtcblx0XHRpZiAodGFnLl8ubm9Wd3MgLy8gQ2hpbGQgdmlld3Mgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHRhcmdldCBpcyBub3QgaHRtbCAtIGUuZy4gZGF0YS1saW5rPVwidGl0bGV7Zm9yIC4uLn1cIlxuXHRcdFx0fHwgdGFnLnRhZ0N0eHNbMV0gJiYgKCAvLyBUaGVyZSBpcyBhbiB7e2Vsc2V9fVxuXHRcdFx0XHRjaGFuZ2UgPT09IFwiaW5zZXJ0XCIgJiYgdGFyZ2V0TGVuZ3RoID09PSBldmVudEFyZ3MuaXRlbXMubGVuZ3RoIC8vIGluc2VydGluZywgYW5kIG5ldyBsZW5ndGggaXMgc2FtZSBhcyBpbnNlcnRlZCBsZW5ndGgsIHNvIGdvaW5nIGZyb20gMCB0byBuXG5cdFx0XHRcdHx8IGNoYW5nZSA9PT0gXCJyZW1vdmVcIiAmJiAhdGFyZ2V0TGVuZ3RoIC8vIHJlbW92aW5nICwgYW5kIG5ldyBsZW5ndGggMCwgc28gZ29pbmcgZnJvbSBuIHRvIDBcblx0XHRcdCkpIHtcblx0XHRcdHRhZy5yZWZyZXNoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoYXJyYXlWaWV3IGluIHRhZy5fLmFyclZ3cykge1xuXHRcdFx0XHRhcnJheVZpZXcgPSB0YWcuXy5hcnJWd3NbYXJyYXlWaWV3XTtcblx0XHRcdFx0aWYgKGFycmF5Vmlldy5kYXRhID09PSB0YXJnZXQpIHtcblx0XHRcdFx0XHRhcnJheVZpZXcuXy5vbkFycmF5Q2hhbmdlLmFwcGx5KGFycmF5VmlldywgYXJndW1lbnRzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0YWcuZG9tQ2hhbmdlKHRhZ0N0eCwgbGlua0N0eCwgZXZlbnRBcmdzKTtcblx0XHRldi5kb25lID0gdHJ1ZTtcblx0fSxcblx0b25BZnRlckxpbms6IGZ1bmN0aW9uKHRhZ0N0eCwgbGlua0N0eCkge1xuXHRcdHZhciBpLCBhcnJIYW5kbGVyLCBhcnJCaW5kaW5nLCBkYXRhLFxuXHRcdFx0dGFnID0gdGhpcyxcblx0XHRcdGFycmF5QmluZGluZ3MgPSB0YWcuX2FycyB8fCB7fSxcblx0XHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cyxcblx0XHRcdGwgPSB0YWdDdHhzLmxlbmd0aCxcblx0XHRcdHNlbGVjdGVkID0gdGFnLnNlbGVjdGVkIHx8IDA7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDw9IHNlbGVjdGVkOyBpKyspIHtcblx0XHRcdHRhZ0N0eCA9IHRhZ0N0eHNbaV07ICAgICAgICAvLyBsb29wIHRocm91Z2ggdGFnQ3R4cyB1cCB0byBzZWxlY3RlZFxuXHRcdFx0ZGF0YSA9IHRhZ0N0eC5tYXBcblx0XHRcdFx0PyB0YWdDdHgubWFwLnRndCAgICAgICAgLy8gJ2RhdGEnIGlzIG1hcHBlZCBkYXRhXG5cdFx0XHRcdDogdGFnQ3R4LmFyZ3MubGVuZ3RoXG5cdFx0XHRcdFx0PyB0YWdDdHguYXJnc1swXSAgICAvLyBvciBhcmdzWzBdXG5cdFx0XHRcdFx0OiB0YWdDdHgudmlldy5kYXRhOyAvLyBvciBkZWZhdWx0cyB0byBjdXJyZW50IGRhdGEuXG5cblx0XHRcdGlmICgoYXJyQmluZGluZyA9IGFycmF5QmluZGluZ3NbaV0pICYmIGRhdGEgIT09IGFyckJpbmRpbmdbMF0pIHsgLy8gSXMgdGhlcmUgcHJldmlvdXMgYXJyYXkgZGF0YSBvbiB0aGlzIHRhZ0N0eCwgZGlmZmVyZW50IGZyb20gbmV3IGRhdGFcblx0XHRcdFx0JG9ic2VydmUoYXJyQmluZGluZ1swXSwgYXJyQmluZGluZ1sxXSwgdHJ1ZSk7IC8vdW5vYnNlcnZlIHByZXZpb3VzIGFycmF5XG5cdFx0XHRcdGRlbGV0ZSBhcnJheUJpbmRpbmdzW2ldO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFhcnJheUJpbmRpbmdzW2ldICYmICRpc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRcdCRvYnNlcnZlKGRhdGEsIGFyckhhbmRsZXIgPSBmdW5jdGlvbihldiwgZXZlbnRBcmdzKSB7XG5cdFx0XHRcdFx0dmFyIHRhZ0N0ID0gdGFnQ3R4O1xuXHRcdFx0XHRcdHRhZy5vbkFycmF5Q2hhbmdlKGV2LCBldmVudEFyZ3MsIHRhZ0N0LCBsaW5rQ3R4KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFycmF5QmluZGluZ3NbaV0gPSBbZGF0YSwgYXJySGFuZGxlcl07IC8vIFN0b3JlIGFycmF5IGRhdGEgYW5kIGFycmF5Q2hhbmdlSGFuZGxlciBvbiB0YWcuX2Fyc1tpXVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGkgPSBzZWxlY3RlZCArIDE7IGkgPCBsOyBpKyspIHsgLy8gSWYgdGhlcmUgd2VyZSBwcmV2aW91cyBiaW5kaW5ncyBvbiBsYXRlciB0YWdDdHhzLCByZW1vdmUgdGhlbVxuXHRcdFx0aWYgKGFyckJpbmRpbmcgPSBhcnJheUJpbmRpbmdzW2ldKSB7XG5cdFx0XHRcdCRvYnNlcnZlKGFyckJpbmRpbmdbMF0sIGFyckJpbmRpbmdbMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZSBwcmV2aW91cyBiaW5kaW5nXG5cdFx0XHRcdGRlbGV0ZSBhcnJheUJpbmRpbmdzW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0YWcuX2FycyA9IGFycmF5QmluZGluZ3M7XG5cdH0sXG5cdG9uRGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGwsIHRhZyA9IHRoaXM7XG5cdFx0Zm9yIChsIGluIHRhZy5fYXJzKSB7XG5cdFx0XHQkb2JzZXJ2ZSh0YWcuX2Fyc1tsXVswXSwgdGFnLl9hcnNbbF1bMV0sIHRydWUpOyAvL3Vub2JzZXJ2ZVxuXHRcdH1cblx0fVxufSk7XG5cbiRleHRlbmQoJHRhZ3NbXCJpZlwiXSwge1xuXHRvblVwZGF0ZTogZnVuY3Rpb24oZXYsIGV2ZW50QXJncywgbmV3VGFnQ3R4cykge1xuXHRcdHZhciB0Y2ksIHByZXZBcmcsIGRpZmZlcmVudDtcblx0XHRmb3IgKHRjaSA9IDA7IChwcmV2QXJnID0gdGhpcy50YWdDdHhzW3RjaV0pOyB0Y2krKykge1xuXHRcdFx0ZGlmZmVyZW50ID0gcHJldkFyZy5wcm9wcy50bXBsICE9PSBuZXdUYWdDdHhzW3RjaV0ucHJvcHMudG1wbCB8fCBwcmV2QXJnLmFyZ3MubGVuZ3RoICYmICEocHJldkFyZyA9IHByZXZBcmcuYXJnc1swXSkgIT09ICFuZXdUYWdDdHhzW3RjaV0uYXJnc1swXTtcblx0XHRcdGlmICgoIXRoaXMuY29udmVydCAmJiAhIXByZXZBcmcpIHx8IGRpZmZlcmVudCkge1xuXHRcdFx0XHRyZXR1cm4gZGlmZmVyZW50O1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBub3QgYSBjaGFuZ2Ugb2YgdGVtcGxhdGUsIGFuZCB0aGVyZSBpcyBubyBjb252ZXJ0ZXIsIGFuZCBuZXdBcmcgYW5kIHByZXZBcmcgYXJlIGJvdGggdHJ1dGh5LCByZXR1cm4gZmFsc2UgdG8gY2FuY2VsIHVwZGF0ZS5cblx0XHRcdFx0Ly8gKEV2ZW4gaWYgdmFsdWVzIG9uIGxhdGVyIGVsc2VzIGFyZSBkaWZmZXJlbnQsIHdlIHN0aWxsIGRvbid0IHdhbnQgdG8gdXBkYXRlLCBzaW5jZSByZW5kZXJlZCBvdXRwdXQgd291bGQgYmUgdW5jaGFuZ2VkKVxuXHRcdFx0XHQvLyBJZiBuZXdBcmcgYW5kIHByZXZBcmcgYXJlIGRpZmZlcmVudCwgcmV0dXJuIHRydWUsIHRvIHVwZGF0ZVxuXHRcdFx0XHQvLyBJZiBuZXdBcmcgYW5kIHByZXZBcmcgYXJlIGJvdGggZmFsc2V5LCBtb3ZlIHRvIHRoZSBuZXh0IHt7ZWxzZSAuLi59fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBCb29sZWFuIHZhbHVlIG9mIGFsbCBhcmdzIGFyZSB1bmNoYW5nZWQgKGZhbHNleSksIHNvIHJldHVybiBmYWxzZSB0byBjYW5jZWwgdXBkYXRlXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHRvbkFmdGVyTGluazogZnVuY3Rpb24odGFnQ3R4LCBsaW5rQ3R4LCBjdHgsIGV2LCBldmVudEFyZ3MpIHtcblx0XHRpZiAoZXZlbnRBcmdzKSB7XG5cdFx0XHR0aGlzLmRvbUNoYW5nZSh0YWdDdHgsIGxpbmtDdHgsIGV2ZW50QXJncyk7XG5cdFx0fVxuXHR9XG59KTtcblxuZnVuY3Rpb24gb2JzZXJ2ZVByb3BzKG1hcCwgZXYsIGV2ZW50QXJncykge1xuXHRpZiAoZXZlbnRBcmdzLmNoYW5nZSA9PT0gXCJzZXRcIikge1xuXHRcdHZhciB0YXJnZXQgPSBtYXAudGd0LFxuXHRcdFx0bCA9IHRhcmdldC5sZW5ndGg7XG5cdFx0d2hpbGUgKGwtLSkge1xuXHRcdFx0aWYgKHRhcmdldFtsXS5rZXkgPT09IGV2ZW50QXJncy5wYXRoKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobCA9PT0gLTEpIHtcblx0XHRcdGlmIChldmVudEFyZ3MucGF0aCAmJiAhZXZlbnRBcmdzLnJlbW92ZSkge1xuXHRcdFx0XHQkb2JzZXJ2YWJsZSh0YXJnZXQpLmluc2VydCh7a2V5OiBldmVudEFyZ3MucGF0aCwgcHJvcDogZXZlbnRBcmdzLnZhbHVlfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChldmVudEFyZ3MucmVtb3ZlKSB7XG5cdFx0XHQkb2JzZXJ2YWJsZSh0YXJnZXQpLnJlbW92ZShsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JG9ic2VydmFibGUodGFyZ2V0W2xdKS5zZXRQcm9wZXJ0eShcInByb3BcIiwgZXZlbnRBcmdzLnZhbHVlKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gb2JzZXJ2ZU1hcHBlZFByb3BzKG1hcCwgZXYsIGV2ZW50QXJncykge1xuXHR2YXIgaXRlbSxcblx0XHRzb3VyY2UgPSBtYXAuc3JjLFxuXHRcdGNoYW5nZSA9IGV2ZW50QXJncy5jaGFuZ2U7XG5cblx0aWYgKGNoYW5nZSA9PT0gXCJzZXRcIikge1xuXHRcdGlmIChldmVudEFyZ3MucGF0aCA9PT0gXCJwcm9wXCIpIHtcblx0XHRcdCRvYnNlcnZhYmxlKHNvdXJjZSkuc2V0UHJvcGVydHkoZXYudGFyZ2V0LmtleSwgZXZlbnRBcmdzLnZhbHVlKTtcblx0XHR9IGVsc2UgeyAvLyBwYXRoID09PSBcImtleVwiXG5cdFx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnJlbW92ZVByb3BlcnR5KGV2ZW50QXJncy5vbGRWYWx1ZSk7IC8vIFdoZW4ga2V5IGlzIG1vZGlmaWVkIG9ic2VydmFibHksIHJlbW92ZSBvbGQgb25lIGFuZCBzZXQgbmV3IG9uZVxuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5zZXRQcm9wZXJ0eShldmVudEFyZ3MudmFsdWUsIGV2LnRhcmdldC5wcm9wKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoY2hhbmdlID09PSBcInJlbW92ZVwiKSB7XG5cdFx0aXRlbSA9IGV2ZW50QXJncy5pdGVtc1swXTtcblx0XHQkb2JzZXJ2YWJsZShzb3VyY2UpLnJlbW92ZVByb3BlcnR5KGl0ZW0ua2V5KTtcblx0XHRkZWxldGUgc291cmNlW2l0ZW0ua2V5XTtcblx0fSBlbHNlIGlmIChjaGFuZ2UgPT09IFwiaW5zZXJ0XCIpIHtcblx0XHRpdGVtID0gZXZlbnRBcmdzLml0ZW1zWzBdO1xuXHRcdGlmIChpdGVtLmtleSkge1xuXHRcdFx0JG9ic2VydmFibGUoc291cmNlKS5zZXRQcm9wZXJ0eShpdGVtLmtleSwgaXRlbS5wcm9wKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gc2hhbGxvd0FycmF5RmlsdGVyKGFsbFBhdGggLyosIG9iamVjdCwgcGFyZW50T2JzKi8pIHsgLy8gRmlsdGVyIHVzZWQgYnkge3twcm9wc319IGZvciB0aGUgbWFwcGVkUHJvcHMgdGFyZ2V0IGFycmF5XG5cdHJldHVybiBhbGxQYXRoLmluZGV4T2YoXCIuXCIpIDwgMDtcbn1cblxuJHRhZ3MoXCJwcm9wc1wiLCB7XG5cdGJhc2VUYWc6IFwiZm9yXCIsXG5cdGRhdGFNYXA6ICR2aWV3cy5tYXAoe1xuXHRcdGdldFRndDogJHRhZ3MucHJvcHMuZGF0YU1hcC5nZXRUZ3QsXG5cdFx0b2JzU3JjOiBvYnNlcnZlUHJvcHMsXG5cdFx0b2JzVGd0OiBvYnNlcnZlTWFwcGVkUHJvcHMsXG5cdFx0dGd0Rmx0OiBzaGFsbG93QXJyYXlGaWx0ZXJcblx0fSksXG5cdGZsb3c6IHRydWVcbn0pO1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kIGpRdWVyeSBuYW1lc3BhY2Vcbi8vPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRleHRlbmQoJCwge1xuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8galF1ZXJ5ICQudmlldygpIHBsdWdpblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09XG5cblx0dmlldzogJHZpZXcgPSBmdW5jdGlvbihub2RlLCBpbm5lciwgdHlwZSkge1xuXHRcdC8vICQudmlldygpIHJldHVybnMgdG9wIHZpZXdcblx0XHQvLyAkLnZpZXcobm9kZSkgcmV0dXJucyB2aWV3IHRoYXQgY29udGFpbnMgbm9kZVxuXHRcdC8vICQudmlldyhzZWxlY3RvcikgcmV0dXJucyB2aWV3IHRoYXQgY29udGFpbnMgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudFxuXHRcdC8vICQudmlldyhub2RlT3JTZWxlY3RvciwgdHlwZSkgcmV0dXJucyBuZWFyZXN0IGNvbnRhaW5pbmcgdmlldyBvZiBnaXZlbiB0eXBlXG5cdFx0Ly8gJC52aWV3KG5vZGVPclNlbGVjdG9yLCBcInJvb3RcIikgcmV0dXJucyByb290IGNvbnRhaW5pbmcgdmlldyAoY2hpbGQgb2YgdG9wIHZpZXcpXG5cdFx0Ly8gJC52aWV3KG5vZGVPclNlbGVjdG9yLCB0cnVlLCB0eXBlKSByZXR1cm5zIG5lYXJlc3QgaW5uZXIgKGNvbnRhaW5lZCkgdmlldyBvZiBnaXZlbiB0eXBlXG5cblx0XHRmdW5jdGlvbiBnZXRJbm5lclZpZXcobmQsIGlzVmwpIHtcblx0XHRcdGlmIChuZCkge1xuXHRcdFx0XHR2d0luZm9zID0gdmlld0luZm9zKG5kLCBpc1ZsLCByT3BlblZpZXdNYXJrZXJzKTtcblx0XHRcdFx0Zm9yIChqID0gMCwgayA9IHZ3SW5mb3MubGVuZ3RoOyBqIDwgazsgaisrKSB7XG5cdFx0XHRcdFx0aWYgKCh2aWV3ID0gdmlld1N0b3JlW3Z3SW5mb3Nbal0uaWRdKSAmJiAodmlldyA9IHZpZXcgJiYgdHlwZSA/IHZpZXcuZ2V0KHRydWUsIHR5cGUpIDogdmlldykpIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpbm5lciAhPT0gISFpbm5lcikge1xuXHRcdFx0Ly8gaW5uZXIgbm90IGJvb2xlYW4sIHNvIHRoaXMgaXMgdmlldyhub2RlT3JTZWxlY3RvciwgdHlwZSlcblx0XHRcdHR5cGUgPSBpbm5lcjtcblx0XHRcdGlubmVyID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR2YXIgdmlldywgdndJbmZvcywgaSwgaiwgaywgbCwgZWxlbXMsXG5cdFx0XHRsZXZlbCA9IDAsXG5cdFx0XHRib2R5ID0gZG9jdW1lbnQuYm9keTtcblxuXHRcdGlmIChub2RlICYmIG5vZGUgIT09IGJvZHkgJiYgdG9wVmlldy5fLnVzZUtleSA+IDEpIHtcblx0XHRcdC8vIFBlcmYgb3B0aW1pemF0aW9uIGZvciBjb21tb24gY2FzZXNcblxuXHRcdFx0bm9kZSA9IFwiXCIgKyBub2RlID09PSBub2RlXG5cdFx0XHRcdD8gJChub2RlKVswXVxuXHRcdFx0XHQ6IG5vZGUuanF1ZXJ5XG5cdFx0XHRcdFx0PyBub2RlWzBdXG5cdFx0XHRcdFx0OiBub2RlO1xuXG5cdFx0XHRpZiAobm9kZSkge1xuXHRcdFx0XHRpZiAoaW5uZXIpIHtcblx0XHRcdFx0XHRnZXRJbm5lclZpZXcobm9kZS5fZGYsIHRydWUpO1xuXHRcdFx0XHRcdGlmICghdmlldykge1xuXHRcdFx0XHRcdFx0Ly8gVHJlYXQgc3VwcGxpZWQgbm9kZSBhcyBhIGNvbnRhaW5lciBlbGVtZW50IGFuZCByZXR1cm4gdGhlIGZpcnN0IHZpZXcgZW5jb3VudGVyZWQuXG5cdFx0XHRcdFx0XHRlbGVtcyA9IHFzYSA/IG5vZGUucXVlcnlTZWxlY3RvckFsbChiaW5kRWxzU2VsKSA6ICQoYmluZEVsc1NlbCwgbm9kZSkuZ2V0KCk7XG5cdFx0XHRcdFx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgIXZpZXcgJiYgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRnZXRJbm5lclZpZXcoZWxlbXNbaV0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmlldztcblx0XHRcdFx0fVxuXHRcdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRcdC8vIE1vdmUgYmFjayB0aHJvdWdoIHNpYmxpbmdzIGFuZCB1cCB0aHJvdWdoIHBhcmVudHMgdG8gZmluZCBwcmVjZWRpbmcgbm9kZSB3aGljaCBpcyBhIF9wcnYgKHByZXZOb2RlKVxuXHRcdFx0XHRcdC8vIHNjcmlwdCBtYXJrZXIgbm9kZSBmb3IgYSBub24tZWxlbWVudC1jb250ZW50IHZpZXcsIG9yIGEgX3BydiAoZmlyc3Qgbm9kZSkgZm9yIGFuIGVsQ250IHZpZXdcblx0XHRcdFx0XHRpZiAodndJbmZvcyA9IHZpZXdJbmZvcyhub2RlLCB1bmRlZmluZWQsIHJWaWV3TWFya2VycykpIHtcblx0XHRcdFx0XHRcdGwgPSB2d0luZm9zLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdFx0XHRcdFx0dmlldyA9IHZ3SW5mb3NbbF07XG5cdFx0XHRcdFx0XHRcdGlmICh2aWV3Lm9wZW4pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobGV2ZWwgPCAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2aWV3ID0gdmlld1N0b3JlW3ZpZXcuaWRdO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHZpZXcgJiYgdHlwZSA/IHZpZXcuZ2V0KHR5cGUpIDogdmlldyB8fCB0b3BWaWV3O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRsZXZlbC0tO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGxldmVsIHN0YXJ0cyBhdCB6ZXJvLiBJZiB3ZSBoaXQgYSB2aWV3LmNsb3NlLCB0aGVuIHdlIG1vdmUgbGV2ZWwgdG8gMSwgYW5kIHdlIGRvbid0IHJldHVybiBhIHZpZXcgdW50aWxcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBhcmUgYmFjayBhdCBsZXZlbCB6ZXJvIChvciBhIHBhcmVudCB2aWV3IHdpdGggbGV2ZWwgPCAwKVxuXHRcdFx0XHRcdFx0XHRcdGxldmVsKys7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nIHx8IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdG9wVmlldztcblx0fSxcblxuXHRsaW5rOiAkbGluayxcblx0dW5saW5rOiAkdW5saW5rLFxuXG5cdC8vPT09PT09PT09PT09PT09PT09PT09XG5cdC8vIG92ZXJyaWRlICQuY2xlYW5EYXRhXG5cdC8vPT09PT09PT09PT09PT09PT09PT09XG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oZWxlbXMpIHtcblx0XHRpZiAoZWxlbXMubGVuZ3RoICYmIGlzQ2xlYW5DYWxsKSB7XG5cdFx0XHQvLyBSZW1vdmUgSnNWaWV3cyBiaW5kaW5ncy4gQWxzbywgcmVtb3ZlIGZyb20gdGhlIERPTSBhbnkgY29ycmVzcG9uZGluZyBzY3JpcHQgbWFya2VyIG5vZGVzXG5cdFx0XHRjbGVhbihlbGVtcyk7XG5cdFx0fVxuXHRcdG9sZENsZWFuRGF0YS5hcHBseSgkLCBhcmd1bWVudHMpO1xuXHR9XG59KTtcblxuLy8gUG9zc2libGUgZnV0dXJlIGFkZGl0aW9uIC0gZS5nLiBmb3IgY2tlZGl0b3IgdGFnIGNvbnRyb2xcbi8vJHZpZXdzLnV0aWxpdHkgPSB7XG4vL1x0dmFsaWRhdGU6IGZ1bmN0aW9uKGh0bWwpIHtcbi8vXHRcdHRyeSB7XG4vL1x0XHRcdHRvcFZpZXcubGluayh1bmRlZmluZWQsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBodG1sLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgMSk7XG4vL1x0XHR9XG4vL1x0XHRjYXRjaCAoZSkge1xuLy9cdFx0XHRyZXR1cm4gZS5tZXNzYWdlO1xuLy9cdFx0fVxuLy9cdH1cbi8vfTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgalF1ZXJ5IGluc3RhbmNlIHBsdWdpbnNcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kZXh0ZW5kKCQuZm4sIHtcblx0bGluazogZnVuY3Rpb24oZXhwciwgZnJvbSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHBhcmVudFZpZXcsIHByZXZOb2RlLCBuZXh0Tm9kZSkge1xuXHRcdHJldHVybiAkbGluayhleHByLCB0aGlzLCBmcm9tLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgcGFyZW50VmlldywgcHJldk5vZGUsIG5leHROb2RlKTtcblx0fSxcblx0dW5saW5rOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJHVubGluayh0aGlzKTtcblx0fSxcblx0dmlldzogZnVuY3Rpb24oaW5uZXIsIHR5cGUpIHtcblx0XHRyZXR1cm4gJHZpZXcodGhpc1swXSwgaW5uZXIsIHR5cGUpO1xuXHR9XG59KTtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE92ZXJyaWRlIGpRdWVyeSBtZXRob2RzIHRoYXQgY2FsbCBvdXIgb3ZlcnJpZGRlbiBjbGVhbkRhdGEsIGZvciBkaXNwb3NhbCBldGMuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4kLmVhY2goW0hUTUwsIFwicmVwbGFjZVdpdGhcIiwgXCJlbXB0eVwiLCBcInJlbW92ZVwiXSwgZnVuY3Rpb24oaSwgbmFtZSkge1xuXHR2YXIgb2xkRm4gPSAkLmZuW25hbWVdO1xuXHQkLmZuW25hbWVdID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJlc3VsdDtcblx0XHRpc0NsZWFuQ2FsbCA9IDE7IC8vIE1ha2Ugc3VyZSBjbGVhbkRhdGEgZG9lcyBkaXNwb3NhbCBvbmx5IHdoZW4gY29taW5nIGZyb20gdGhlc2UgY2FsbHMuXG5cdFx0dHJ5IHtcblx0XHRcdHJlc3VsdCA9IG9sZEZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0fVxuXHRcdGZpbmFsbHkge1xuXHRcdFx0aXNDbGVhbkNhbGwgPSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xufSk7XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgdG9wVmlld1xuLy89PT09PT09PT09PT09PT1cblxuYWRkTGlua01ldGhvZHMoJGV4dGVuZCh0b3BWaWV3ID0gJHN1Yi50b3BWaWV3LCB7dG1wbDoge2xpbmtzOiB7fX19KSk7XG5cbnZpZXdTdG9yZSA9IHswOiB0b3BWaWV3fTsgLy8gVG9wLWxldmVsIHZpZXdcbi8vPT09PT09PT09PT09PT09XG4vLyBFeHRlbmQgJC52aWV3c1xuLy89PT09PT09PT09PT09PT1cblxuJHZpZXdzLmdldEN0eCA9IGZ1bmN0aW9uKHBhcmFtKSB7IC8vIFJldHVybiB2YWx1ZSBvZiBjdHguZm9vLCBpbmNsdWRpbmcgZm9yIGNvbXBpbGVkIGNvbnRleHR1YWwgcGFyYW1ldGVycywgfmZvbz1leHByXG5cdGlmIChwYXJhbSAmJiBwYXJhbS5fY3ApIHsgLy8gSWYgdGhpcyBoZWxwZXIgcmVzb3VyY2UgaXMgYSBjb250ZXh0dWFsIHBhcmFtZXRlciwgfmZvbz1leHByXG5cdFx0cGFyYW0gPSAgcGFyYW1bMV0ocGFyYW1bMF0uZGF0YSwgcGFyYW1bMF0sICRzdWIpO1xuXHR9XG5cdHJldHVybiBwYXJhbTtcbn07XG5cbi8vPT09PT09PT09PT09PT09PT09PVxuLy8gRXh0ZW5kICQudmlld3Muc3ViXG4vLz09PT09PT09PT09PT09PT09PT1cblxuJHN1Yi5fY3AgPSBmdW5jdGlvbihwYXJhbVZhbCwgcGFyYW1zLCB2aWV3KSB7IC8vIEdldCBjb21waWxlZCBjb250ZXh0dWFsIHBhcmFtZXRlcnMgKG9yIHByb3BlcnRpZXMpIH5mb289ZXhwci5cblx0aWYgKHZpZXcubGlua2VkKSB7IC8vIEluIEpzVmlld3MsIHJldHVybnMgW3ZpZXcsIGxpbmtGbl0gd2hlcmUgbGlua0ZuIGlzIGNvbXBpbGVkIGZ1bmN0aW9uIGZvciBleHByZXNzaW9uXG5cdFx0cGFyYW1zID0gZGVsaW1PcGVuQ2hhcjEgKyBcIjpcIiArIHBhcmFtcyArIGRlbGltQ2xvc2VDaGFyMDtcblx0XHR2YXIgdG1wbCA9IHZpZXcudG1wbCxcblx0XHRcdGxpbmtzID0gdG9wVmlldy50bXBsLmxpbmtzLCAvLyBVc2UgdG9wVmlldyBsaW5rcywgYXMgZm9yIGNvbXBpbGVkIHRvcC1sZXZlbCBsaW5raW5nIGV4cHJlc3Npb25zLiBUbyBkbyAtIHNob3VsZCB0aGlzIGV2ZXIgZ2V0IGRpc3Bvc2VkP1xuXHRcdFx0bGlua0ZuID0gbGlua3NbcGFyYW1zXTtcblx0XHRpZiAoIWxpbmtGbikge1xuXHRcdFx0bGlua3NbcGFyYW1zXSA9IGxpbmtGbiA9ICRzdWIudG1wbEZuKHBhcmFtcywgdG1wbCwgdHJ1ZSk7XG5cdFx0fVxuXHRcdHBhcmFtVmFsID0gW3ZpZXcsIGxpbmtGbl07XG5cdFx0cGFyYW1WYWwuX2NwID0gdHJ1ZTsgLy8gRmxhZyB0aGF0IHRoaXMgaXMgYSBjb250ZXh0dWFsIHBhcmFtZXRlclxuXHR9XG5cdHJldHVybiBwYXJhbVZhbDsgLy8gSW4gSnNSZW5kZXIgcmV0dXJucyBldmFsdWF0ZWQgZXhwcmVzc2lvblxufTtcblxuJHN1Yi5fY2VvID0gZnVuY3Rpb24gY2xvbmVFeHByT2JqZWN0cyhvYnMpIHsgIC8vIENsb25lIGV4cHJPYnMgc28gdGhhdCBlYWNoIHJlZmVyZW5jZWQgY29udGV4dHVhbCBwYXJhbWV0ZXIgfmZvbyB1c2VzIGl0cyBvd24gZXhwck9iIGluc3RhbmNlc1xuXHR2YXIgb2IsXG5cdFx0Y2xvbmVzID0gb2JzLFxuXHRcdGwgPSBvYnMubGVuZ3RoO1xuXHRpZiAobCkge1xuXHRcdGNsb25lcyA9IFtdO1xuXHRcdHdoaWxlIChsLS0pIHtcblx0XHRcdG9iID0gb2JzW2xdO1xuXHRcdFx0aWYgKG9iLl9qc3YpIHtcblx0XHRcdFx0b2IgPSAkZXh0ZW5kKHt9LCBvYik7ICAgICAgICAgICAgICAvLyBJZiBhbiBleHByT2IsIGNsb25lIGl0LiBJZiBhIHN0cmluZywga2VlcCBhcyBpc1xuXHRcdFx0XHRvYi5wcm0gPSBjbG9uZUV4cHJPYmplY3RzKG9iLnBybSk7IC8vIFJlY3Vyc2l2ZWx5IGNsb25lIGV4cHJPYnMgaW4gcGFyYW1ldGVycywgdG9vXG5cdFx0XHR9XG5cdFx0XHRjbG9uZXMudW5zaGlmdChvYik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBjbG9uZXM7XG59O1xuXG4kc3ViLl9nY2NiID0gZnVuY3Rpb24odmlldykgeyAvLyBSZXR1cm4gYSBjYWxsYmFjayBmb3IgYWNjZXNzaW5nIHRoZSBjb250ZXh0IG9mIGEgdGVtcGxhdGUvZGF0YS1saW5rIGV4cHJlc3Npb24gLSBhbmQgY29udmVydGluZyB+Zm9vLCAjZm9vIGV0Yy5cblx0Ly8gVE9ETyBDb25zaWRlciBleHBvc2luZyBvciBhbGxvd2luZyBvdmVycmlkZSwgYXMgcHVibGljIEFQSVxuXHRyZXR1cm4gZnVuY3Rpb24ocGF0aCwgb2JqZWN0LCBkZXB0aCkge1xuXHRcdC8vIFRPRE8gY29uc2lkZXIgb25seSBjYWxsaW5nIHRoZSBjb250ZXh0Q2Igb24gdGhlIGluaXRpYWwgdG9rZW4gaW4gcGF0aCAnfmEuYi5jJyBhbmQgbm90IGNhbGxpbmcgYWdhaW4gb25cblx0XHQvLyB0aGUgaW5kaXZpZHVhbCB0b2tlbnMsICdhJywgJ2InLCAnYycuLi4gQ3VycmVudGx5IGl0IGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lc1xuXHRcdHZhciB0b2tlbnMsIHRhZywgaXRlbXMsIGhlbHBlciwgbGFzdCwgbmV4dFBhdGgsIGw7XG5cdFx0aWYgKHZpZXcgJiYgcGF0aCkge1xuXHRcdFx0aWYgKHBhdGguX2pzdikge1xuXHRcdFx0XHRyZXR1cm4gcGF0aC5fanN2LmNhbGwodmlldy50bXBsLCBvYmplY3QsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhdGguY2hhckF0KDApID09PSBcIn5cIikge1xuXHRcdFx0XHQvLyBXZSByZXR1cm4gbmV3IGl0ZW1zIHRvIGluc2VydCBpbnRvIHRoZSBzZXF1ZW5jZSwgcmVwbGFjaW5nIHRoZSBcIn5hLmIuY1wiIHN0cmluZzpcblx0XHRcdFx0Ly8gW2hlbHBlck9iamVjdCAnYScsIFwiYS5iLmNcIiBjdXJyZW50RGF0YUl0ZW1dIHNvIGN1cnJlbnREYXRhSXRlbSBiZWNvbWVzIHRoZSBvYmplY3QgZm9yIHN1YnNlcXVlbnQgcGF0aHMuXG5cdFx0XHRcdGlmIChwYXRoLnNsaWNlKDAsIDQpID09PSBcIn50YWdcIikge1xuXHRcdFx0XHRcdHRhZyA9IHZpZXcuY3R4O1xuXHRcdFx0XHRcdGlmIChwYXRoLmNoYXJBdCg0KSA9PT0gXCIuXCIpIHtcblx0XHRcdFx0XHRcdC8vIFwifnRhZy54eHhcIlxuXHRcdFx0XHRcdFx0dG9rZW5zID0gcGF0aC5zbGljZSg1KS5zcGxpdChcIi5cIik7XG5cdFx0XHRcdFx0XHR0YWcgPSB0YWcudGFnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodG9rZW5zKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGFnID8gW3RhZywgdG9rZW5zLmpvaW4oXCIuXCIpLCBvYmplY3RdIDogW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGggPSBwYXRoLnNsaWNlKDEpLnNwbGl0KFwiLlwiKTtcblx0XHRcdFx0aWYgKGhlbHBlciA9IHZpZXcuaGxwKGxhc3QgPSBwYXRoLnNoaWZ0KCksIHRydWUpKSB7XG5cdFx0XHRcdFx0aWYgKGhlbHBlci5fY3ApIHsgIC8vIGhlbHBlciBmb3IgKGNvbnRleHR1YWwgcGFyYW1ldGVyIH5mb289Li4uKSBpcyBhbiBhcnJheSAtIFt2aWV3LCBjdHhQcm1EZXBlbmRlbmNpZXMgLi4uXVxuXHRcdFx0XHRcdFx0aWYgKHBhdGgubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdG5leHRQYXRoID0gXCIuXCIgKyBwYXRoLmpvaW4oXCIuXCIpO1xuXHRcdFx0XHRcdFx0XHRsYXN0ID0gaGVscGVyW2wgPSBoZWxwZXIubGVuZ3RoLTFdO1xuXHRcdFx0XHRcdFx0XHRpZiAobGFzdC5fanN2KSB7XG5cdFx0XHRcdFx0XHRcdFx0bGFzdC5zYiA9IG5leHRQYXRoO1xuXHRcdFx0XHRcdFx0XHRcdGxhc3QuYm5kID0gISFkZXB0aDtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRoZWxwZXJbbF0gPSAobGFzdCArIG5leHRQYXRoKS5yZXBsYWNlKFwiI2RhdGEuXCIsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChsYXN0LnNsaWNlKDAsIDUpID09PSBcIiN2aWV3XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGhlbHBlcltsXSA9IGhlbHBlcltsXS5zbGljZSg2KTtcblx0XHRcdFx0XHRcdFx0XHRcdGhlbHBlci5zcGxpY2UobCwgMCwgdmlldyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpdGVtcyA9IFtoZWxwZXJdOyAvLyBDb250ZXh0dWFsIHBhcmFtZXRlclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGF0aC5sZW5ndGggfHwgJGlzRnVuY3Rpb24oaGVscGVyKSkge1xuXHRcdFx0XHRcdFx0aXRlbXMgPSBbaGVscGVyLCBwYXRoLmpvaW4oXCIuXCIpLCBvYmplY3RdOyAvLyAyd2F5IGJpbmRuZyBvbiB+Zm9vLmhlbHBlckxlYWZQcm9wZXJ0eSBvciB+Y29tcHV0ZWQoKSBvciB+Y29udGV4dHVhbFBhcmFtXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBpdGVtcyB8fCBbXTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gXCIjXCIpIHtcblx0XHRcdFx0Ly8gV2UgcmV0dXJuIG5ldyBpdGVtcyB0byBpbnNlcnQgaW50byB0aGUgc2VxdWVuY2UsIHJlcGxhY2luZyB0aGUgXCIjYS5iLmNcIiBzdHJpbmc6IFt2aWV3LCBcImEuYi5jXCIgY3VycmVudERhdGFJdGVtXVxuXHRcdFx0XHQvLyBzbyBjdXJyZW50RGF0YUl0ZW0gYmVjb21lcyB0aGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50IHBhdGhzLiBUaGUgJ3RydWUnIGZsYWcgbWFrZXMgdGhlIHBhdGhzIGJpbmQgb25seSB0byBsZWFmIGNoYW5nZXMuXG5cdFx0XHRcdHJldHVybiBwYXRoID09PSBcIiNkYXRhXCIgPyBbXSA6IFt2aWV3LCBwYXRoLnJlcGxhY2UoclZpZXdQYXRoLCBcIlwiKSwgb2JqZWN0XTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59O1xuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dGVuZCAkLnZpZXdzLnNldHRpbmdzXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT1cblxub2xkQWR2U2V0ID0gJHN1Yi5hZHZTZXQ7XG5cbiRzdWIuYWR2U2V0ID0gZnVuY3Rpb24oKSB7IC8vIHJlZnJlc2ggYWR2YW5jZWQgc2V0dGluZ3Ncblx0b2xkQWR2U2V0LmNhbGwoJHN1Yik7XG5cdGdsb2JhbC5fanN2ID0gJHN1YlNldHRpbmdzQWR2YW5jZWQuX2pzdlxuXHRcdD8gJGV4dGVuZChnbG9iYWwuX2pzdiB8fCB7fSwgeyAvLyBjcmVhdGUgZ2xvYmFsIF9qc3YsIGZvciBhY2Nlc3Npbmcgdmlld3MsIGV0Y1xuXHRcdFx0XHR2aWV3czogdmlld1N0b3JlLFxuXHRcdFx0XHRiaW5kaW5nczogYmluZGluZ1N0b3JlXG5cdFx0XHR9KVxuXHRcdDogdW5kZWZpbmVkOyAvLyBJbiBJRTggY2Fubm90IGRvIGRlbGV0ZSBnbG9iYWwuX2pzdlxuXHQkdmlld3NMaW5rQXR0ciA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLmxpbmtBdHRyO1xuXHRsaW5rVmlld3NTZWwgPSBiaW5kRWxzU2VsICsgXCIsW1wiICsgJHZpZXdzTGlua0F0dHIgKyBcIl1cIjtcblx0d3JhcE1hcCA9ICRzdWJTZXR0aW5nc0FkdmFuY2VkLl93bTtcblx0d3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXHR3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xuXHR3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcbn07XG5cbiR2aWV3c1NldHRpbmdzLmFkdmFuY2VkKHtcblx0bGlua0F0dHI6IFwiZGF0YS1saW5rXCIsXG5cdHVzZVZpZXdzOiBmYWxzZSxcblx0bm9WYWxpZGF0ZTogZmFsc2UsXG5cdC8vIHdyYXBNYXAgcHJvdmlkZSBhcHByb3ByaWF0ZSB3cmFwcGVycyBmb3IgaW5zZXJ0aW5nIGlubmVySFRNTCwgdXNlZCBpbiBpbnNlcnRCZWZvcmVcblx0Ly8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMClcblx0Ly8gVE9ETyBpbnZlc3RpZ2F0ZSB3aGV0aGVyIG1vcmUgcmVjZW50IGpRdWVyeSBpbXBsZW1lbnRhdGlvbiB1c2luZyB3cmFwTWFwIGluIGRvbU1hbmlwLyQoKS5odG1sKCkgZXRjLiBpcyBiZXR0ZXIgb3B0aW1pemVkIG5vdy4uLlxuXHRfd206IHtcblx0XHRvcHRpb246IFsxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIl0sXG5cdFx0bGVnZW5kOiBbMSwgXCI8ZmllbGRzZXQ+XCIsIFwiPC9maWVsZHNldD5cIl0sXG5cdFx0YXJlYTogWzEsIFwiPG1hcD5cIiwgXCI8L21hcD5cIl0sXG5cdFx0cGFyYW06IFsxLCBcIjxvYmplY3Q+XCIsIFwiPC9vYmplY3Q+XCJdLFxuXHRcdHRoZWFkOiBbMSwgXCI8dGFibGU+XCIsIFwiPC90YWJsZT5cIl0sXG5cdFx0dHI6IFsyLCBcIjx0YWJsZT48dGJvZHk+XCIsIFwiPC90Ym9keT48L3RhYmxlPlwiXSxcblx0XHR0ZDogWzMsIFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsIFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCJdLFxuXHRcdGNvbDogWzIsIFwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCJdLFxuXHRcdHN2Z19uczogWzEsIFwiPHN2Zz5cIiwgXCI8L3N2Zz5cIl0sXG5cdFx0Ly8gSUU2LTggY2FuJ3Qgc2VyaWFsaXplIGxpbmssIHNjcmlwdCwgc3R5bGUsIG9yIGFueSBodG1sNSAoTm9TY29wZSkgdGFncyxcblx0XHQvLyB1bmxlc3Mgd3JhcHBlZCBpbiBhIGRpdiB3aXRoIG5vbi1icmVha2luZyBjaGFyYWN0ZXJzIGluIGZyb250IG9mIGl0LlxuXHRcdGRpdjogJC5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgPyBbMCwgXCJcIiwgXCJcIl0gOiBbMSwgXCJYPGRpdj5cIiwgXCI8L2Rpdj5cIl1cblx0fSxcblx0X2ZlOiB7XG5cdFx0aW5wdXQ6IHtcblx0XHRcdGZyb206IGlucHV0QXR0cmliLCB0bzogXCJ2YWx1ZVwiXG5cdFx0fSxcblx0XHR0ZXh0YXJlYTogdmFsdWVCaW5kaW5nLFxuXHRcdHNlbGVjdDogdmFsdWVCaW5kaW5nLFxuXHRcdG9wdGdyb3VwOiB7XG5cdFx0XHR0bzogXCJsYWJlbFwiXG5cdFx0fVxuXHR9XG59KTtcblxucmV0dXJuICQ7XG59LCB3aW5kb3cpKTtcbiIsIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2Mi4xLjRcbiAqIGh0dHA6Ly9qcXVlcnkuY29tL1xuICpcbiAqIEluY2x1ZGVzIFNpenpsZS5qc1xuICogaHR0cDovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgMjAwNSwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE1LTA0LTI4VDE2OjAxWlxuICovXG5cbihmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Ly8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YFxuXHRcdC8vIGlzIHByZXNlbnQsIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkuXG5cdFx0Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBoYXZlIGEgYHdpbmRvd2Agd2l0aCBhIGBkb2N1bWVudGBcblx0XHQvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy5cblx0XHQvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIGB3aW5kb3dgLlxuXHRcdC8vIGUuZy4gdmFyIGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIikod2luZG93KTtcblx0XHQvLyBTZWUgdGlja2V0ICMxNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrXG4vLyBDYW4ndCBiZSBpbiBzdHJpY3QgbW9kZSwgc2V2ZXJhbCBsaWJzIGluY2x1ZGluZyBBU1AuTkVUIHRyYWNlXG4vLyB0aGUgc3RhY2sgdmlhIGFyZ3VtZW50cy5jYWxsZXIuY2FsbGVlIGFuZCBGaXJlZm94IGRpZXMgaWZcbi8vIHlvdSB0cnkgdG8gdHJhY2UgdGhyb3VnaCBcInVzZSBzdHJpY3RcIiBjYWxsIGNoYWlucy4gKCMxMzMzNSlcbi8vXG5cbnZhciBhcnIgPSBbXTtcblxudmFyIHNsaWNlID0gYXJyLnNsaWNlO1xuXG52YXIgY29uY2F0ID0gYXJyLmNvbmNhdDtcblxudmFyIHB1c2ggPSBhcnIucHVzaDtcblxudmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjtcblxudmFyIGNsYXNzMnR5cGUgPSB7fTtcblxudmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxudmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cblxuXG52YXJcblx0Ly8gVXNlIHRoZSBjb3JyZWN0IGRvY3VtZW50IGFjY29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5kYm94KVxuXHRkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCxcblxuXHR2ZXJzaW9uID0gXCIyLjEuNFwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjFcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLFxuXG5cdC8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xuXHRybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW1xcZGEtel0pL2dpLFxuXG5cdC8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKClcblx0ZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHtcblx0XHRyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG5cdH07XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvclxuXHRzZWxlY3RvcjogXCJcIixcblxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcblx0bGVuZ3RoOiAwLFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxuXHQvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheVxuXHRnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7XG5cdFx0cmV0dXJuIG51bSAhPSBudWxsID9cblxuXHRcdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldFxuXHRcdFx0KCBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdICkgOlxuXG5cdFx0XHQvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBpbiBhIGNsZWFuIGFycmF5XG5cdFx0XHRzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXHRcdHJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdC8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzXG5cdC8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5Lilcblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApO1xuXHRcdH0pKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzW2pdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKG51bGwpO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXG5cdHB1c2g6IHB1c2gsXG5cdHNvcnQ6IGFyci5zb3J0LFxuXHRzcGxpY2U6IGFyci5zcGxpY2Vcbn07XG5cbmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG5cdHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSxcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdC8vIEV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZFxuXHRpZiAoIGkgPT09IGxlbmd0aCApIHtcblx0XHR0YXJnZXQgPSB0aGlzO1xuXHRcdGktLTtcblx0fVxuXG5cdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoIChvcHRpb25zID0gYXJndW1lbnRzWyBpIF0pICE9IG51bGwgKSB7XG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRcdHNyYyA9IHRhcmdldFsgbmFtZSBdO1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1sgbmFtZSBdO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0aWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdChjb3B5KSB8fCAoY29weUlzQXJyYXkgPSBqUXVlcnkuaXNBcnJheShjb3B5KSkgKSApIHtcblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICkge1xuXHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0aXNGdW5jdGlvbjogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gXCJmdW5jdGlvblwiO1xuXHR9LFxuXG5cdGlzQXJyYXk6IEFycmF5LmlzQXJyYXksXG5cblx0aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fSxcblxuXHRpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKG51bGx8dHJ1ZXxmYWxzZXxcIlwiKVxuXHRcdC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcblx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHQvLyBhZGRpbmcgMSBjb3JyZWN0cyBsb3NzIG9mIHByZWNpc2lvbiBmcm9tIHBhcnNlRmxvYXQgKCMxNTEwMClcblx0XHRyZXR1cm4gIWpRdWVyeS5pc0FycmF5KCBvYmogKSAmJiAob2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKyAxKSA+PSAwO1xuXHR9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0Ly8gTm90IHBsYWluIG9iamVjdHM6XG5cdFx0Ly8gLSBBbnkgb2JqZWN0IG9yIHZhbHVlIHdob3NlIGludGVybmFsIFtbQ2xhc3NdXSBwcm9wZXJ0eSBpcyBub3QgXCJbb2JqZWN0IE9iamVjdF1cIlxuXHRcdC8vIC0gRE9NIG5vZGVzXG5cdFx0Ly8gLSB3aW5kb3dcblx0XHRpZiAoIGpRdWVyeS50eXBlKCBvYmogKSAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIG9iai5jb25zdHJ1Y3RvciAmJlxuXHRcdFx0XHQhaGFzT3duLmNhbGwoIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiaXNQcm90b3R5cGVPZlwiICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGZ1bmN0aW9uIGhhc24ndCByZXR1cm5lZCBhbHJlYWR5LCB3ZSdyZSBjb25maWRlbnQgdGhhdFxuXHRcdC8vIHxvYmp8IGlzIGEgcGxhaW4gb2JqZWN0LCBjcmVhdGVkIGJ5IHt9IG9yIGNvbnN0cnVjdGVkIHdpdGggbmV3IE9iamVjdFxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdGlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIG5hbWU7XG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHRcdH1cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMCwgaU9TPDYgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbChvYmopIF0gfHwgXCJvYmplY3RcIiA6XG5cdFx0XHR0eXBlb2Ygb2JqO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0XG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlICkge1xuXHRcdHZhciBzY3JpcHQsXG5cdFx0XHRpbmRpcmVjdCA9IGV2YWw7XG5cblx0XHRjb2RlID0galF1ZXJ5LnRyaW0oIGNvZGUgKTtcblxuXHRcdGlmICggY29kZSApIHtcblx0XHRcdC8vIElmIHRoZSBjb2RlIGluY2x1ZGVzIGEgdmFsaWQsIHByb2xvZ3VlIHBvc2l0aW9uXG5cdFx0XHQvLyBzdHJpY3QgbW9kZSBwcmFnbWEsIGV4ZWN1dGUgY29kZSBieSBpbmplY3RpbmcgYVxuXHRcdFx0Ly8gc2NyaXB0IHRhZyBpbnRvIHRoZSBkb2N1bWVudC5cblx0XHRcdGlmICggY29kZS5pbmRleE9mKFwidXNlIHN0cmljdFwiKSA9PT0gMSApIHtcblx0XHRcdFx0c2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcblx0XHRcdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPdGhlcndpc2UsIGF2b2lkIHRoZSBET00gbm9kZSBjcmVhdGlvbiwgaW5zZXJ0aW9uXG5cdFx0XHQvLyBhbmQgcmVtb3ZhbCBieSB1c2luZyBhbiBpbmRpcmVjdCBnbG9iYWwgZXZhbFxuXHRcdFx0XHRpbmRpcmVjdCggY29kZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxuXHRjYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG5cdH0sXG5cblx0bm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9LFxuXG5cdC8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2ssIGFyZ3MgKSB7XG5cdFx0dmFyIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoLFxuXHRcdFx0aXNBcnJheSA9IGlzQXJyYXlsaWtlKCBvYmogKTtcblxuXHRcdGlmICggYXJncyApIHtcblx0XHRcdGlmICggaXNBcnJheSApIHtcblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggaXNBcnJheSApIHtcblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApO1xuXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xXG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlsaWtlKCBPYmplY3QoYXJyKSApICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHJldCxcblx0XHRcdFx0XHR0eXBlb2YgYXJyID09PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTtcblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRpc0FycmF5ID0gaXNBcnJheWxpa2UoIGVsZW1zICksXG5cdFx0XHRyZXQgPSBbXTtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpciBuZXcgdmFsdWVzXG5cdFx0aWYgKCBpc0FycmF5ICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBjb25jYXQuYXBwbHkoIFtdLCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcblx0Ly8gYXJndW1lbnRzLlxuXHRwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkge1xuXHRcdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XG5cdFx0XHRjb250ZXh0ID0gZm47XG5cdFx0XHRmbiA9IHRtcDtcblx0XHR9XG5cblx0XHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHRcdC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuXG5cdFx0aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFNpbXVsYXRlZCBiaW5kXG5cdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApO1xuXHRcdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQgfHwgdGhpcywgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTtcblx0XHR9O1xuXG5cdFx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdFx0cHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7XG5cblx0XHRyZXR1cm4gcHJveHk7XG5cdH0sXG5cblx0bm93OiBEYXRlLm5vdyxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSk7XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yXCIuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbihpLCBuYW1lKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlsaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogaU9TIDguMiAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0b3IpXG5cdC8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSlcblx0Ly8gaGFzT3duIGlzbid0IHVzZWQgaGVyZSBkdWUgdG8gZmFsc2UgbmVnYXRpdmVzXG5cdC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUVcblx0dmFyIGxlbmd0aCA9IFwibGVuZ3RoXCIgaW4gb2JqICYmIG9iai5sZW5ndGgsXG5cdFx0dHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblxuXHRpZiAoIHR5cGUgPT09IFwiZnVuY3Rpb25cIiB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggb2JqLm5vZGVUeXBlID09PSAxICYmIGxlbmd0aCApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4yLjAtcHJlXG4gKiBodHRwOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCAyMDA4LCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTQtMTItMTZcbiAqL1xuKGZ1bmN0aW9uKCB3aW5kb3cgKSB7XG5cbnZhciBpLFxuXHRzdXBwb3J0LFxuXHRFeHByLFxuXHRnZXRUZXh0LFxuXHRpc1hNTCxcblx0dG9rZW5pemUsXG5cdGNvbXBpbGUsXG5cdHNlbGVjdCxcblx0b3V0ZXJtb3N0Q29udGV4dCxcblx0c29ydElucHV0LFxuXHRoYXNEdXBsaWNhdGUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRzZXREb2N1bWVudCxcblx0ZG9jdW1lbnQsXG5cdGRvY0VsZW0sXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdHJidWdneU1hdGNoZXMsXG5cdG1hdGNoZXMsXG5cdGNvbnRhaW5zLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IFwic2l6emxlXCIgKyAxICogbmV3IERhdGUoKSxcblx0cHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEdlbmVyYWwtcHVycG9zZSBjb25zdGFudHNcblx0TUFYX05FR0FUSVZFID0gMSA8PCAzMSxcblxuXHQvLyBJbnN0YW5jZSBtZXRob2RzXG5cdGhhc093biA9ICh7fSkuaGFzT3duUHJvcGVydHksXG5cdGFyciA9IFtdLFxuXHRwb3AgPSBhcnIucG9wLFxuXHRwdXNoX25hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXHQvLyBVc2UgYSBzdHJpcHBlZC1kb3duIGluZGV4T2YgYXMgaXQncyBmYXN0ZXIgdGhhbiBuYXRpdmVcblx0Ly8gaHR0cDovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFtpXSA9PT0gZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlXG5cdHdoaXRlc3BhY2UgPSBcIltcXFxceDIwXFxcXHRcXFxcclxcXFxuXFxcXGZdXCIsXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNjaGFyYWN0ZXJzXG5cdGNoYXJhY3RlckVuY29kaW5nID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXFxceDAwLVxcXFx4YTBdKStcIixcblxuXHQvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVyc1xuXHQvLyBBbiB1bnF1b3RlZCB2YWx1ZSBzaG91bGQgYmUgYSBDU1MgaWRlbnRpZmllciBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHQvLyBQcm9wZXIgc3ludGF4OiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcblx0aWRlbnRpZmllciA9IGNoYXJhY3RlckVuY29kaW5nLnJlcGxhY2UoIFwid1wiLCBcIncjXCIgKSxcblxuXHQvLyBBdHRyaWJ1dGUgc2VsZWN0b3JzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cdFx0Ly8gT3BlcmF0b3IgKGNhcHR1cmUgMilcblx0XHRcIiooWypeJHwhfl0/PSlcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGNoYXJhY3RlckVuY29kaW5nICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKVwiICksXG5cdFx0XCJDTEFTU1wiOiBuZXcgUmVnRXhwKCBcIl5cXFxcLihcIiArIGNoYXJhY3RlckVuY29kaW5nICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCBcIndcIiwgXCJ3KlwiICkgKyBcIilcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblx0cmVzY2FwZSA9IC8nfFxcXFwvZyxcblxuXHQvLyBDU1MgZXNjYXBlcyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gVXNlZCBmb3IgaWZyYW1lc1xuXHQvLyBTZWUgc2V0RG9jdW1lbnQoKVxuXHQvLyBSZW1vdmluZyB0aGUgZnVuY3Rpb24gd3JhcHBlciBjYXVzZXMgYSBcIlBlcm1pc3Npb24gRGVuaWVkXCJcblx0Ly8gZXJyb3IgaW4gSUVcblx0dW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNldERvY3VtZW50KCk7XG5cdH07XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG1hdGNoLCBlbGVtLCBtLCBub2RlVHlwZSxcblx0XHQvLyBRU0EgdmFyc1xuXHRcdGksIGdyb3Vwcywgb2xkLCBuaWQsIG5ld0NvbnRleHQsIG5ld1NlbGVjdG9yO1xuXG5cdGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXG5cdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblx0bm9kZVR5cGUgPSBjb250ZXh0Lm5vZGVUeXBlO1xuXG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0aWYgKCAhc2VlZCAmJiBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgd2hlbiBwb3NzaWJsZSAoZS5nLiwgbm90IHVuZGVyIERvY3VtZW50RnJhZ21lbnQpXG5cdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHtcblx0XHRcdC8vIFNwZWVkLXVwOiBTaXp6bGUoXCIjSURcIilcblx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XG5cdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKTtcblx0XHRcdFx0XHQvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJuc1xuXHRcdFx0XHRcdC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKGpRdWVyeSAjNjk2Mylcblx0XHRcdFx0XHRpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXNcblx0XHRcdFx0XHRcdC8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDb250ZXh0IGlzIG5vdCBhIGRvY3VtZW50XG5cdFx0XHRcdFx0aWYgKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgJiYgKGVsZW0gPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgJiZcblx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiYgZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdC8vIFNwZWVkLXVwOiBTaXp6bGUoXCJUQUdcIilcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzJdICkge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiLkNMQVNTXCIpXG5cdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFFTQSBwYXRoXG5cdFx0aWYgKCBzdXBwb3J0LnFzYSAmJiAoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkge1xuXHRcdFx0bmlkID0gb2xkID0gZXhwYW5kbztcblx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0bmV3U2VsZWN0b3IgPSBub2RlVHlwZSAhPT0gMSAmJiBzZWxlY3RvcjtcblxuXHRcdFx0Ly8gcVNBIHdvcmtzIHN0cmFuZ2VseSBvbiBFbGVtZW50LXJvb3RlZCBxdWVyaWVzXG5cdFx0XHQvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290XG5cdFx0XHQvLyBhbmQgd29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhlIHRlY2huaXF1ZSlcblx0XHRcdC8vIElFIDggZG9lc24ndCB3b3JrIG9uIG9iamVjdCBlbGVtZW50c1xuXHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXG5cdFx0XHRcdGlmICggKG9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIikpICkge1xuXHRcdFx0XHRcdG5pZCA9IG9sZC5yZXBsYWNlKCByZXNjYXBlLCBcIlxcXFwkJlwiICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgbmlkICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bmlkID0gXCJbaWQ9J1wiICsgbmlkICsgXCInXSBcIjtcblxuXHRcdFx0XHRpID0gZ3JvdXBzLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0Z3JvdXBzW2ldID0gbmlkICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQ7XG5cdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oXCIsXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsXG5cdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9IGNhdGNoKHFzYUVycm9yKSB7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCAhb2xkICkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoXCJpZFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBbGwgb3RoZXJzXG5cdHJldHVybiBzZWxlY3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApO1xufVxuXG4vKipcbiAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZVxuICogQHJldHVybnMge0Z1bmN0aW9uKHN0cmluZywgT2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aFxuICpcdHByb3BlcnR5IG5hbWUgdGhlIChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4cHIuY2FjaGVMZW5ndGgpXG4gKlx0ZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeVxuICovXG5mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcblx0dmFyIGtleXMgPSBbXTtcblxuXHRmdW5jdGlvbiBjYWNoZSgga2V5LCB2YWx1ZSApIHtcblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblx0XHRcdC8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllc1xuXHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTtcblx0XHR9XG5cdFx0cmV0dXJuIChjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrXG4gKi9cbmZ1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7XG5cdGZuWyBleHBhbmRvIF0gPSB0cnVlO1xuXHRyZXR1cm4gZm47XG59XG5cbi8qKlxuICogU3VwcG9ydCB0ZXN0aW5nIHVzaW5nIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFBhc3NlZCB0aGUgY3JlYXRlZCBkaXYgYW5kIGV4cGVjdHMgYSBib29sZWFuIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhc3NlcnQoIGZuICkge1xuXHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBkaXYgKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblx0XHQvLyBSZW1vdmUgZnJvbSBpdHMgcGFyZW50IGJ5IGRlZmF1bHRcblx0XHRpZiAoIGRpdi5wYXJlbnROb2RlICkge1xuXHRcdFx0ZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApO1xuXHRcdH1cblx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxuXHRcdGRpdiA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KFwifFwiKSxcblx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGRvY3VtZW50IG9yZGVyIG9mIHR3byBzaWJsaW5nc1xuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgbGVzcyB0aGFuIDAgaWYgYSBwcmVjZWRlcyBiLCBncmVhdGVyIHRoYW4gMCBpZiBhIGZvbGxvd3MgYlxuICovXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7XG5cdHZhciBjdXIgPSBiICYmIGEsXG5cdFx0ZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdCggfmIuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICkgLVxuXHRcdFx0KCB+YS5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKTtcblxuXHQvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXNcblx0aWYgKCBkaWZmICkge1xuXHRcdHJldHVybiBkaWZmO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgYiBmb2xsb3dzIGFcblx0aWYgKCBjdXIgKSB7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAobmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgcGFyZW50LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBJZiBubyBkb2N1bWVudCBhbmQgZG9jdW1lbnRFbGVtZW50IGlzIGF2YWlsYWJsZSwgcmV0dXJuXG5cdGlmICggZG9jID09PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9XG5cblx0Ly8gU2V0IG91ciBkb2N1bWVudFxuXHRkb2N1bWVudCA9IGRvYztcblx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdHBhcmVudCA9IGRvYy5kZWZhdWx0VmlldztcblxuXHQvLyBTdXBwb3J0OiBJRT44XG5cdC8vIElmIGlmcmFtZSBkb2N1bWVudCBpcyBhc3NpZ25lZCB0byBcImRvY3VtZW50XCIgdmFyaWFibGUgYW5kIGlmIGlmcmFtZSBoYXMgYmVlbiByZWxvYWRlZCxcblx0Ly8gSUUgd2lsbCB0aHJvdyBcInBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBhY2Nlc3NpbmcgXCJkb2N1bWVudFwiIHZhcmlhYmxlLCBzZWUgalF1ZXJ5ICMxMzkzNlxuXHQvLyBJRTYtOCBkbyBub3Qgc3VwcG9ydCB0aGUgZGVmYXVsdFZpZXcgcHJvcGVydHkgc28gcGFyZW50IHdpbGwgYmUgdW5kZWZpbmVkXG5cdGlmICggcGFyZW50ICYmIHBhcmVudCAhPT0gcGFyZW50LnRvcCApIHtcblx0XHQvLyBJRTExIGRvZXMgbm90IGhhdmUgYXR0YWNoRXZlbnQsIHNvIGFsbCBtdXN0IHN1ZmZlclxuXHRcdGlmICggcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblx0XHR9IGVsc2UgaWYgKCBwYXJlbnQuYXR0YWNoRXZlbnQgKSB7XG5cdFx0XHRwYXJlbnQuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgdW5sb2FkSGFuZGxlciApO1xuXHRcdH1cblx0fVxuXG5cdC8qIFN1cHBvcnQgdGVzdHNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jICk7XG5cblx0LyogQXR0cmlidXRlc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gU3VwcG9ydDogSUU8OFxuXHQvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXNcblx0Ly8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpXG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWRpdi5nZXRBdHRyaWJ1dGUoXCJjbGFzc05hbWVcIik7XG5cdH0pO1xuXG5cdC8qIGdldEVsZW1lbnQocylCeSpcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUNvbW1lbnQoXCJcIikgKTtcblx0XHRyZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBTdXBwb3J0OiBJRTw5XG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IHJuYXRpdmUudGVzdCggZG9jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvYy5nZXRFbGVtZW50c0J5TmFtZSB8fCAhZG9jLmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaW5kIGFuZCBmaWx0ZXJcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maW5kW1wiSURcIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cdFx0XHRcdC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zXG5cdFx0XHRcdC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjNcblx0XHRcdFx0cmV0dXJuIG0gJiYgbS5wYXJlbnROb2RlID8gWyBtIF0gOiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdEV4cHIuZmlsdGVyW1wiSURcIl0gPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHQvLyBTdXBwb3J0OiBJRTYvN1xuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRkZWxldGUgRXhwci5maW5kW1wiSURcIl07XG5cblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbXCJUQUdcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFtcIkNMQVNTXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApO1xuXHRcdH1cblx0fTtcblxuXHQvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0XG5cblx0Ly8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSlcblx0cmJ1Z2d5TWF0Y2hlcyA9IFtdO1xuXG5cdC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpXG5cdC8vIFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRocm93cyBhbiBlcnJvclxuXHQvLyB3aGVuZXZlciBgZG9jdW1lbnQuYWN0aXZlRWxlbWVudGAgaXMgYWNjZXNzZWQgb24gYW4gaWZyYW1lXG5cdC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yXG5cdC8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OFxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHRpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jLnF1ZXJ5U2VsZWN0b3JBbGwgKSkgKSB7XG5cdFx0Ly8gQnVpbGQgUVNBIHJlZ2V4XG5cdFx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OVxuXHRcdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZGl2ICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2hoNDY1Mzg4LmFzcHgjYXR0cmlidXRlX3NlY3Rpb25cblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbc2VsZWN0ZWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuMissIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS43K1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiOmNoZWNrZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2liaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIuIy4rWyt+XVwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvYy5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcImhpZGRlblwiICk7XG5cdFx0XHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZT1kXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIipbKl4kfCF+XT89XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZClcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqLDp4XCIpO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIsLio6XCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8XG5cdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IpICkpICkge1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3Jcblx0XHRcdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpXG5cdFx0XHRzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBkaXYsIFwiZGl2XCIgKTtcblxuXHRcdFx0Ly8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvblxuXHRcdFx0Ly8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZFxuXHRcdFx0bWF0Y2hlcy5jYWxsKCBkaXYsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgZG9lcyBub3QgaW1wbGVtZW50IGluY2x1c2l2ZSBkZXNjZW5kZW50XG5cdC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmXG5cdGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29udGFpbnMgKSA/XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLFxuXHRcdFx0XHRidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblx0XHRcdHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRhZG93bi5jb250YWlucyA/XG5cdFx0XHRcdFx0YWRvd24uY29udGFpbnMoIGJ1cCApIDpcblx0XHRcdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0XHRcdCkpO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0aWYgKCBiICkge1xuXHRcdFx0XHR3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHtcblx0XHRcdFx0XHRpZiAoIGIgPT09IGEgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdC8qIFNvcnRpbmdcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmdcblx0c29ydE9yZGVyID0gaGFzQ29tcGFyZSA/XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuXHRcdHZhciBjb21wYXJlID0gIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtcblx0XHRpZiAoIGNvbXBhcmUgKSB7XG5cdFx0XHRyZXR1cm4gY29tcGFyZTtcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRoZSBzYW1lIGRvY3VtZW50XG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID9cblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0MTtcblxuXHRcdC8vIERpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdGlmICggY29tcGFyZSAmIDEgfHxcblx0XHRcdCghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlKSApIHtcblxuXHRcdFx0Ly8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50XG5cdFx0XHRpZiAoIGEgPT09IGRvYyB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGEpICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGIgPT09IGRvYyB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jID8gLTEgOlxuXHRcdFx0XHRiID09PSBkb2MgPyAxIDpcblx0XHRcdFx0YXVwID8gLTEgOlxuXHRcdFx0XHRidXAgPyAxIDpcblx0XHRcdFx0c29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Ly8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2tcblx0XHR9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHtcblx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvblxuXHRcdGN1ciA9IGE7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YXAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXHRcdGN1ciA9IGI7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YnAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3lcblx0XHR3aGlsZSAoIGFwW2ldID09PSBicFtpXSApIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gaSA/XG5cdFx0XHQvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3Jcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3Rcblx0XHRcdGFwW2ldID09PSBwcmVmZXJyZWREb2MgPyAtMSA6XG5cdFx0XHRicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6XG5cdFx0XHQwO1xuXHR9O1xuXG5cdHJldHVybiBkb2M7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIGRpZmYsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9IG5vZGVbIGRpciBdKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggb2ZUeXBlID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gcGFyZW50WyBleHBhbmRvIF0gfHwgKHBhcmVudFsgZXhwYW5kbyBdID0ge30pO1xuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IG91dGVyQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMV07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBjYWNoZVsyXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHNlZWtpbmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVha1xuXHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB1c2VDYWNoZSAmJiAoY2FjaGUgPSAoZWxlbVsgZXhwYW5kbyBdIHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSkpWyB0eXBlIF0pICYmIGNhY2hlWzBdID09PSBkaXJydW5zICkge1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gY2FjaGVbMV07XG5cblx0XHRcdFx0XHRcdC8vIHhtbCA6bnRoLWNoaWxkKC4uLikgb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYgKytkaWZmICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0KG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkge1xuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXG5cdFx0XHQvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyc1xuXHRcdFx0Ly8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvc1xuXHRcdFx0dmFyIGFyZ3MsXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBTaXp6bGUgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZiggc2VlZCwgbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmbjtcblx0XHR9XG5cdH0sXG5cblx0cHNldWRvczoge1xuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksXG5cdFx0XHRcdFx0XHRpID0gc2VlZC5sZW5ndGg7XG5cblx0XHRcdFx0XHQvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgXG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdGlucHV0WzBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdFx0XHRpbnB1dFswXSA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuICFyZXN1bHRzLnBvcCgpO1xuXHRcdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJoYXNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkb1xuXHRcdFwibGFuZ1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8IFwiXCIpICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0XCJ0YXJnZXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDtcblx0XHR9LFxuXG5cdFx0XCJyb290XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY0VsZW07XG5cdFx0fSxcblxuXHRcdFwiZm9jdXNcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRcImVuYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7XG5cdFx0fSxcblxuXHRcdFwiZGlzYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJjaGVja2VkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09IFwib3B0aW9uXCIgJiYgISFlbGVtLnNlbGVjdGVkKTtcblx0XHR9LFxuXG5cdFx0XCJzZWxlY3RlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcblx0XHRcdC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHlcblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0XCJlbXB0eVwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJwYXJlbnRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1tcImVtcHR5XCJdKCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJidXR0b25cIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblxuXHRcdFwidGV4dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRcdC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCBcInNlYXJjaFwiKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09IFwidGV4dFwiXG5cdFx0XHRcdCggKGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIiApO1xuXHRcdH0sXG5cblx0XHQvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uXG5cdFx0XCJmaXJzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFsgMCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJsYXN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0pLFxuXG5cdFx0XCJlcVwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSksXG5cblx0XHRcImV2ZW5cIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcIm9kZFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwibHRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJndFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pXG5cdH1cbn07XG5cbkV4cHIucHNldWRvc1tcIm50aFwiXSA9IEV4cHIucHNldWRvc1tcImVxXCJdO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbnRva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7XG5cdHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLFxuXHRcdHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggY2FjaGVkICkge1xuXHRcdHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7XG5cdH1cblxuXHRzb0ZhciA9IHNlbGVjdG9yO1xuXHRncm91cHMgPSBbXTtcblx0cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyO1xuXG5cdHdoaWxlICggc29GYXIgKSB7XG5cblx0XHQvLyBDb21tYSBhbmQgZmlyc3QgcnVuXG5cdFx0aWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0Zhcjtcblx0XHRcdH1cblx0XHRcdGdyb3Vwcy5wdXNoKCAodG9rZW5zID0gW10pICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCBcIiBcIiApXG5cdFx0XHR9KTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoIChtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdChtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xuXHQvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmdcblx0Ly8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zXG5cdHJldHVybiBwYXJzZU9ubHkgP1xuXHRcdHNvRmFyLmxlbmd0aCA6XG5cdFx0c29GYXIgP1xuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcblx0XHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHRcdHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApO1xufTtcblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRjaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBkaXIgPT09IFwicGFyZW50Tm9kZVwiLFxuXHRcdGRvbmVOYW1lID0gZG9uZSsrO1xuXG5cdHJldHVybiBjb21iaW5hdG9yLmZpcnN0ID9cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGFsbCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudHNcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIG9sZENhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gZGlyIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXHRcdFx0XHRcdFx0aWYgKCAob2xkQ2FjaGUgPSBvdXRlckNhY2hlWyBkaXIgXSkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsgZGlyIF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ICE9PSBkb2N1bWVudCAmJiBjb250ZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgZWxlbWVudHMgcGFzc2luZyBlbGVtZW50TWF0Y2hlcnMgZGlyZWN0bHkgdG8gcmVzdWx0c1xuXHRcdFx0Ly8gS2VlcCBgaWAgYSBzdHJpbmcgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIHNvIGBtYXRjaGVkQ291bnRgIHdpbGwgYmUgXCIwMFwiIGJlbG93XG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZvciBzZXQgZmlsdGVyc1xuXHRcdFx0XHRpZiAoIGJ5U2V0ICkge1xuXHRcdFx0XHRcdC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnNcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gIW1hdGNoZXIgJiYgZWxlbSkgKSB7XG5cdFx0XHRcdFx0XHRtYXRjaGVkQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90XG5cdFx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdFx0dW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblx0XHRcdGlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkge1xuXHRcdFx0XHRqID0gMDtcblx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IHNldE1hdGNoZXJzW2orK10pICkge1xuXHRcdFx0XHRcdG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0Ly8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZ1xuXHRcdFx0XHRcdGlmICggbWF0Y2hlZENvdW50ID4gMCApIHtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRcdHNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRGlzY2FyZCBpbmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXNcblx0XHRcdFx0XHRzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHNcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApO1xuXG5cdFx0XHRcdC8vIFNlZWRsZXNzIHNldCBtYXRjaGVzIHN1Y2NlZWRpbmcgbXVsdGlwbGUgc3VjY2Vzc2Z1bCBtYXRjaGVycyBzdGlwdWxhdGUgc29ydGluZ1xuXHRcdFx0XHRpZiAoIG91dGVybW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHQoIG1hdGNoZWRDb3VudCArIHNldE1hdGNoZXJzLmxlbmd0aCApID4gMSApIHtcblxuXHRcdFx0XHRcdFNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gT3ZlcnJpZGUgbWFuaXB1bGF0aW9uIG9mIGdsb2JhbHMgYnkgbmVzdGVkIG1hdGNoZXJzXG5cdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5tYXRjaGVkO1xuXHRcdH07XG5cblx0cmV0dXJuIGJ5U2V0ID9cblx0XHRtYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDpcblx0XHRzdXBlck1hdGNoZXI7XG59XG5cbmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdHZhciBpLFxuXHRcdHNldE1hdGNoZXJzID0gW10sXG5cdFx0ZWxlbWVudE1hdGNoZXJzID0gW10sXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggIWNhY2hlZCApIHtcblx0XHQvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnRcblx0XHRpZiAoICFtYXRjaCApIHtcblx0XHRcdG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0fVxuXHRcdGkgPSBtYXRjaC5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTtcblx0XHRcdGlmICggY2FjaGVkWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvblxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoIHNlbGVjdG9yLCBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSApO1xuXG5cdFx0Ly8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uXG5cdFx0Y2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdH1cblx0cmV0dXJuIGNhY2hlZDtcbn07XG5cbi8qKlxuICogQSBsb3ctbGV2ZWwgc2VsZWN0aW9uIGZ1bmN0aW9uIHRoYXQgd29ya3Mgd2l0aCBTaXp6bGUncyBjb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uc1xuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHNlbGVjdG9yIEEgc2VsZWN0b3Igb3IgYSBwcmUtY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbiBidWlsdCB3aXRoIFNpenpsZS5jb21waWxlXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHRcbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHRzXVxuICogQHBhcmFtIHtBcnJheX0gW3NlZWRdIEEgc2V0IG9mIGVsZW1lbnRzIHRvIG1hdGNoIGFnYWluc3RcbiAqL1xuc2VsZWN0ID0gU2l6emxlLnNlbGVjdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsXG5cdFx0Y29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBzZWxlY3Rvcixcblx0XHRtYXRjaCA9ICFzZWVkICYmIHRva2VuaXplKCAoc2VsZWN0b3IgPSBjb21waWxlZC5zZWxlY3RvciB8fCBzZWxlY3RvcikgKTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBubyBzZWVkIGFuZCBvbmx5IG9uZSBncm91cFxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0c3VwcG9ydC5nZXRCeUlkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHRcdFx0RXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kW1wiSURcIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwcltcIm5lZWRzQ29udGV4dFwiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHtcblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdFx0XHRcdCkpICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0cnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KFwiXCIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oXCJcIikgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGRpdjEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHhcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PSBcIiNcIiA7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidHlwZVwiID8gMSA6IDIgKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5pZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRkaXYuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiwgXCJcIiApO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRyZXR1cm4gZGl2LmdldEF0dHJpYnV0ZShcImRpc2FibGVkXCIpID09IG51bGw7XG59KSApIHtcblx0YWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciB2YWw7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0fVxuXHR9KTtcbn1cblxucmV0dXJuIFNpenpsZTtcblxufSkoIHdpbmRvdyApO1xuXG5cblxualF1ZXJ5LmZpbmQgPSBTaXp6bGU7XG5qUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7XG5qUXVlcnkuZXhwcltcIjpcIl0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0O1xualF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDtcbmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDtcbmpRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWlucztcblxuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG52YXIgcnNpbmdsZVRhZyA9ICgvXjwoXFx3KylcXHMqXFwvPz4oPzo8XFwvXFwxPnwpJC8pO1xuXG5cblxudmFyIHJpc1NpbXBsZSA9IC9eLlteOiNcXFtcXC4sXSokLztcblxuLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3RcbmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkge1xuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0cmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90O1xuXHRcdH0pO1xuXG5cdH1cblxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSk7XG5cblx0fVxuXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRpZiAoIHJpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTtcblx0XHR9XG5cblx0XHRxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzICk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID49IDAgKSAhPT0gbm90O1xuXHR9KTtcbn1cblxualF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xuXHR2YXIgZWxlbSA9IGVsZW1zWyAwIF07XG5cblx0aWYgKCBub3QgKSB7XG5cdFx0ZXhwciA9IFwiOm5vdChcIiArIGV4cHIgKyBcIilcIjtcblx0fVxuXG5cdHJldHVybiBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSA/XG5cdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdIDpcblx0XHRqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdFx0fSkpO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSkgKTtcblx0XHR9XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApO1xuXHRcdH1cblxuXHRcdC8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVjdG9yLCBjb250ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKVxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQgKTtcblx0XHRyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciArIFwiIFwiICsgc2VsZWN0b3IgOiBzZWxlY3Rvcjtcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UpICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0pO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKikpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIEhUTUwgc3RyaW5nc1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0aWYgKCBzZWxlY3RvclswXSA9PT0gXCI8XCIgJiYgc2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiYgc2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWzFdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFswXSA6IGNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBPcHRpb24gdG8gcnVuIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbGx5IGxldCB0aGUgZXJyb3IgYmUgdGhyb3duIGlmIHBhcnNlSFRNTCBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTChcblx0XHRcdFx0XHRcdG1hdGNoWzFdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWzFdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFByb3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGVcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBCbGFja2JlcnJ5IDQuNlxuXHRcdFx0XHRcdC8vIGdFQklEIHJldHVybnMgbm9kZXMgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAoIzY5NjMpXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0XHR0aGlzWzBdID0gZWxlbTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLmNvbnRleHQgPSBkb2N1bWVudDtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsICQoLi4uKSlcblx0XHRcdH0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gKCBjb250ZXh0IHx8IHJvb3RqUXVlcnkgKS5maW5kKCBzZWxlY3RvciApO1xuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dClcblx0XHRcdC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSEFORExFOiAkKERPTUVsZW1lbnQpXG5cdFx0fSBlbHNlIGlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiB0eXBlb2Ygcm9vdGpRdWVyeS5yZWFkeSAhPT0gXCJ1bmRlZmluZWRcIiA/XG5cdFx0XHRcdHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0O1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHRcdHZhciBtYXRjaGVkID0gW10sXG5cdFx0XHR0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7XG5cblx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBtYXRjaGVkO1xuXHR9LFxuXG5cdHNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkge1xuXHRcdHZhciBtYXRjaGVkID0gW107XG5cblx0XHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdFx0aWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7XG5cdFx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVkO1xuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGhhczogZnVuY3Rpb24oIHRhcmdldCApIHtcblx0XHR2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksXG5cdFx0XHRsID0gdGFyZ2V0cy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDpcblx0XHRcdFx0MDtcblxuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdGZvciAoIGN1ciA9IHRoaXNbaV07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHQvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHNcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAocG9zID9cblx0XHRcdFx0XHRwb3MuaW5kZXgoY3VyKSA+IC0xIDpcblxuXHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSkgKSB7XG5cblx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlKCBtYXRjaGVkICkgOiBtYXRjaGVkICk7XG5cdH0sXG5cblx0Ly8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0XG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBJbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcyxcblxuXHRcdFx0Ly8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkXG5cdFx0XHRlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW1cblx0XHQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWUoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihzZWxlY3Rvcilcblx0XHQpO1xuXHR9XG59KTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKGN1ciA9IGN1cltkaXJdKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCh7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LnNpYmxpbmcoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudCB8fCBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZSggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0pO1xudmFyIHJub3R3aGl0ZSA9ICgvXFxTKy9nKTtcblxuXG5cbi8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGVcbnZhciBvcHRpb25zQ2FjaGUgPSB7fTtcblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0gb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0pO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdCggb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gfHwgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIExhc3QgZmlyZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cylcblx0XHRtZW1vcnksXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXHRcdC8vIEZpcnN0IGNhbGxiYWNrIHRvIGZpcmUgKHVzZWQgaW50ZXJuYWxseSBieSBhZGQgYW5kIGZpcmVXaXRoKVxuXHRcdGZpcmluZ1N0YXJ0LFxuXHRcdC8vIEVuZCBvZiB0aGUgbG9vcCB3aGVuIGZpcmluZ1xuXHRcdGZpcmluZ0xlbmd0aCxcblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1vdmUgaWYgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4LFxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXHRcdC8vIFN0YWNrIG9mIGZpcmUgY2FsbHMgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRzdGFjayA9ICFvcHRpb25zLm9uY2UgJiYgW10sXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdFx0XHRtZW1vcnkgPSBvcHRpb25zLm1lbW9yeSAmJiBkYXRhO1xuXHRcdFx0ZmlyZWQgPSB0cnVlO1xuXHRcdFx0ZmlyaW5nSW5kZXggPSBmaXJpbmdTdGFydCB8fCAwO1xuXHRcdFx0ZmlyaW5nU3RhcnQgPSAwO1xuXHRcdFx0ZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRmaXJpbmcgPSB0cnVlO1xuXHRcdFx0Zm9yICggOyBsaXN0ICYmIGZpcmluZ0luZGV4IDwgZmlyaW5nTGVuZ3RoOyBmaXJpbmdJbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIGRhdGFbIDAgXSwgZGF0YVsgMSBdICkgPT09IGZhbHNlICYmIG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7IC8vIFRvIHByZXZlbnQgZnVydGhlciBjYWxscyB1c2luZyBhZGRcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdGlmICggc3RhY2sgKSB7XG5cdFx0XHRcdFx0aWYgKCBzdGFjay5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCBzdGFjay5zaGlmdCgpICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYuZGlzYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0Ly8gRmlyc3QsIHdlIHNhdmUgdGhlIGN1cnJlbnQgbGVuZ3RoXG5cdFx0XHRcdFx0dmFyIHN0YXJ0ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0KGZ1bmN0aW9uIGFkZCggYXJncyApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcblx0XHRcdFx0XHRcdFx0XHRhZGQoIGFyZyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KSggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0Ly8gRG8gd2UgbmVlZCB0byBhZGQgdGhlIGNhbGxiYWNrcyB0byB0aGVcblx0XHRcdFx0XHQvLyBjdXJyZW50IGZpcmluZyBiYXRjaD9cblx0XHRcdFx0XHRpZiAoIGZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdC8vIFdpdGggbWVtb3J5LCBpZiB3ZSdyZSBub3QgZmlyaW5nIHRoZW5cblx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgY2FsbCByaWdodCBhd2F5XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdFx0ZmlyaW5nU3RhcnQgPSBzdGFydDtcblx0XHRcdFx0XHRcdGZpcmUoIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0XHRsaXN0LnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzXG5cdFx0XHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nTGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyaW5nTGVuZ3RoLS07XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmaXJpbmdJbmRleC0tO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuXG5cdFx0XHQvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC5cblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRyZXR1cm4gZm4gPyBqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDogISEoIGxpc3QgJiYgbGlzdC5sZW5ndGggKTtcblx0XHRcdH0sXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0ZmlyaW5nTGVuZ3RoID0gMDtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gSGF2ZSB0aGUgbGlzdCBkbyBub3RoaW5nIGFueW1vcmVcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsaXN0ID0gc3RhY2sgPSBtZW1vcnkgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdC8vIElzIGl0IGRpc2FibGVkP1xuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gTG9jayB0aGUgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZVxuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHN0YWNrID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoICFtZW1vcnkgKSB7XG5cdFx0XHRcdFx0c2VsZi5kaXNhYmxlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gSXMgaXQgbG9ja2VkP1xuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFzdGFjaztcblx0XHRcdH0sXG5cdFx0XHQvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XG5cdFx0XHRcdGlmICggbGlzdCAmJiAoICFmaXJlZCB8fCBzdGFjayApICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0aWYgKCBmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRzdGFjay5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZpcmUoIGFyZ3MgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcblx0XHRcdGZpcmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmpRdWVyeS5leHRlbmQoe1xuXG5cdERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHtcblx0XHR2YXIgdHVwbGVzID0gW1xuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3RhdGVcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwgXCJyZWplY3RlZFwiIF0sXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKFwibWVtb3J5XCIpIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBmbnNbIGkgXSApICYmIGZuc1sgaSBdO1xuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3RGVmZXJcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oIHRoaXMgPT09IHByb21pc2UgPyBuZXdEZWZlci5wcm9taXNlKCkgOiB0aGlzLCBmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDMgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZVsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWzFdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdXG5cdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblxuXHRcdFx0XHQvLyBbIHJlamVjdF9saXN0IHwgcmVzb2x2ZV9saXN0IF0uZGlzYWJsZTsgcHJvZ3Jlc3NfbGlzdC5sb2NrXG5cdFx0XHRcdH0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbMF0gXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbMF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHByb21pc2UgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdICsgXCJXaXRoXCIgXSA9IGxpc3QuZmlyZVdpdGg7XG5cdFx0fSk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblx0XHRcdGxlbmd0aCA9IHJlc29sdmVWYWx1ZXMubGVuZ3RoLFxuXG5cdFx0XHQvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBsZW5ndGggIT09IDEgfHwgKCBzdWJvcmRpbmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggc3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLFxuXG5cdFx0XHQvLyB0aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNpbmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC5cblx0XHRcdGRlZmVycmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSxcblxuXHRcdFx0Ly8gVXBkYXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlc1xuXHRcdFx0dXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpLCBjb250ZXh0cywgdmFsdWVzICkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdGNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggdmFsdWVzID09PSBwcm9ncmVzc1ZhbHVlcyApIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXG5cdFx0XHRwcm9ncmVzc1ZhbHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBEZWZlcnJlZCBzdWJvcmRpbmF0ZXM7IHRyZWF0IG90aGVycyBhcyByZXNvbHZlZFxuXHRcdGlmICggbGVuZ3RoID4gMSApIHtcblx0XHRcdHByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHByb2dyZXNzQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHQuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKVxuXHRcdFx0XHRcdFx0LmZhaWwoIGRlZmVycmVkLnJlamVjdCApXG5cdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQtLXJlbWFpbmluZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElmIHdlJ3JlIG5vdCB3YWl0aW5nIG9uIGFueXRoaW5nLCByZXNvbHZlIHRoZSBtYXN0ZXJcblx0XHRpZiAoICFyZW1haW5pbmcgKSB7XG5cdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcblx0fVxufSk7XG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0O1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cdC8vIEFkZCB0aGUgY2FsbGJhY2tcblx0alF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBmbiApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhvbGQgKG9yIHJlbGVhc2UpIHRoZSByZWFkeSBldmVudFxuXHRob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkge1xuXHRcdGlmICggaG9sZCApIHtcblx0XHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0XHR9IGVsc2Uge1xuXHRcdFx0alF1ZXJ5LnJlYWR5KCB0cnVlICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblxuXHRcdC8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50c1xuXHRcdGlmICggalF1ZXJ5LmZuLnRyaWdnZXJIYW5kbGVyICkge1xuXHRcdFx0alF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXJIYW5kbGVyKCBcInJlYWR5XCIgKTtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS5vZmYoIFwicmVhZHlcIiApO1xuXHRcdH1cblx0fVxufSk7XG5cbi8qKlxuICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkLCBmYWxzZSApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblx0alF1ZXJ5LnJlYWR5KCk7XG59XG5cbmpRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHtcblx0aWYgKCAhcmVhZHlMaXN0ICkge1xuXG5cdFx0cmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHQvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cblx0XHQvLyBXZSBvbmNlIHRyaWVkIHRvIHVzZSByZWFkeVN0YXRlIFwiaW50ZXJhY3RpdmVcIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmVcblx0XHQvLyBkaXNjb3ZlcmVkIGJ5IENocmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1XG5cdFx0aWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgKSB7XG5cdFx0XHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0XHRcdHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCwgZmFsc2UgKTtcblxuXHRcdFx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApO1xufTtcblxuLy8gS2ljayBvZmYgdGhlIERPTSByZWFkeSBjaGVjayBldmVuIGlmIHRoZSB1c2VyIGRvZXMgbm90XG5qUXVlcnkucmVhZHkucHJvbWlzZSgpO1xuXG5cblxuXG4vLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cbi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvblxudmFyIGFjY2VzcyA9IGpRdWVyeS5hY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCBqUXVlcnkudHlwZSgga2V5ICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblx0XHRmb3IgKCBpIGluIGtleSApIHtcblx0XHRcdGpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmF3ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGJ1bGsgKSB7XG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbiggZWxlbXNbaV0sIGtleSwgcmF3ID8gdmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNoYWluYWJsZSA/XG5cdFx0ZWxlbXMgOlxuXG5cdFx0Ly8gR2V0c1xuXHRcdGJ1bGsgP1xuXHRcdFx0Zm4uY2FsbCggZWxlbXMgKSA6XG5cdFx0XHRsZW4gPyBmbiggZWxlbXNbMF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9iamVjdCBjYW4gaGF2ZSBkYXRhXG4gKi9cbmpRdWVyeS5hY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0LyoganNoaW50IC1XMDE4ICovXG5cdHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTtcbn07XG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LFxuXHQvLyBPbGQgV2ViS2l0IGRvZXMgbm90IGhhdmUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zL2ZyZWV6ZSBtZXRob2QsXG5cdC8vIHJldHVybiBuZXcgZW1wdHkgb2JqZWN0IGluc3RlYWQgd2l0aCBubyBbW3NldF1dIGFjY2Vzc29yXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcy5jYWNoZSA9IHt9LCAwLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cdH0pO1xuXG5cdHRoaXMuZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvICsgRGF0YS51aWQrKztcbn1cblxuRGF0YS51aWQgPSAxO1xuRGF0YS5hY2NlcHRzID0galF1ZXJ5LmFjY2VwdERhdGE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXHRrZXk6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdC8vIEFsd2F5cyByZXR1cm4gdGhlIGtleSBmb3IgYSBmcm96ZW4gb2JqZWN0LlxuXHRcdGlmICggIURhdGEuYWNjZXB0cyggb3duZXIgKSApIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHZhciBkZXNjcmlwdG9yID0ge30sXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUga2V5XG5cdFx0XHR1bmxvY2sgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF1bmxvY2sgKSB7XG5cdFx0XHR1bmxvY2sgPSBEYXRhLnVpZCsrO1xuXG5cdFx0XHQvLyBTZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnR5XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkZXNjcmlwdG9yWyB0aGlzLmV4cGFuZG8gXSA9IHsgdmFsdWU6IHVubG9jayB9O1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggb3duZXIsIGRlc2NyaXB0b3IgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0XG5cdFx0XHQvLyBGYWxsYmFjayB0byBhIGxlc3Mgc2VjdXJlIGRlZmluaXRpb25cblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRkZXNjcmlwdG9yWyB0aGlzLmV4cGFuZG8gXSA9IHVubG9jaztcblx0XHRcdFx0alF1ZXJ5LmV4dGVuZCggb3duZXIsIGRlc2NyaXB0b3IgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgdGhlIGNhY2hlIG9iamVjdFxuXHRcdGlmICggIXRoaXMuY2FjaGVbIHVubG9jayBdICkge1xuXHRcdFx0dGhpcy5jYWNoZVsgdW5sb2NrIF0gPSB7fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5sb2NrO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHQvLyBUaGVyZSBtYXkgYmUgYW4gdW5sb2NrIGFzc2lnbmVkIHRvIHRoaXMgbm9kZSxcblx0XHRcdC8vIGlmIHRoZXJlIGlzIG5vIGVudHJ5IGZvciB0aGlzIFwib3duZXJcIiwgY3JlYXRlIG9uZSBpbmxpbmVcblx0XHRcdC8vIGFuZCBzZXQgdGhlIHVubG9jayBhcyB0aG91Z2ggYW4gb3duZXIgZW50cnkgaGFkIGFsd2F5cyBleGlzdGVkXG5cdFx0XHR1bmxvY2sgPSB0aGlzLmtleSggb3duZXIgKSxcblx0XHRcdGNhY2hlID0gdGhpcy5jYWNoZVsgdW5sb2NrIF07XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGNhY2hlWyBkYXRhIF0gPSB2YWx1ZTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEZyZXNoIGFzc2lnbm1lbnRzIGJ5IG9iamVjdCBhcmUgc2hhbGxvdyBjb3BpZWRcblx0XHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5leHRlbmQoIHRoaXMuY2FjaGVbIHVubG9jayBdLCBkYXRhICk7XG5cdFx0XHQvLyBPdGhlcndpc2UsIGNvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBwcm9wIGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0Y2FjaGVbIHByb3AgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2FjaGU7XG5cdH0sXG5cdGdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0Ly8gRWl0aGVyIGEgdmFsaWQgY2FjaGUgaXMgZm91bmQsIG9yIHdpbGwgYmUgY3JlYXRlZC5cblx0XHQvLyBOZXcgY2FjaGVzIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIHVubG9jayByZXR1cm5lZCxcblx0XHQvLyBhbGxvd2luZyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBuZXdseSBjcmVhdGVkXG5cdFx0Ly8gZW1wdHkgZGF0YSBvYmplY3QuIEEgdmFsaWQgb3duZXIgb2JqZWN0IG11c3QgYmUgcHJvdmlkZWQuXG5cdFx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZVsgdGhpcy5rZXkoIG93bmVyICkgXTtcblxuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRjYWNoZSA6IGNhY2hlWyBrZXkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIHN0b3JlZDtcblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoKGtleSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSApIHtcblxuXHRcdFx0c3RvcmVkID0gdGhpcy5nZXQoIG93bmVyLCBrZXkgKTtcblxuXHRcdFx0cmV0dXJuIHN0b3JlZCAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0c3RvcmVkIDogdGhpcy5nZXQoIG93bmVyLCBqUXVlcnkuY2FtZWxDYXNlKGtleSkgKTtcblx0XHR9XG5cblx0XHQvLyBbKl1XaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllc1xuXHRcdC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly9cblx0XHR0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTtcblxuXHRcdC8vIFNpbmNlIHRoZSBcInNldFwiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50c1xuXHRcdC8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXVxuXHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7XG5cdH0sXG5cdHJlbW92ZTogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGNhbWVsLFxuXHRcdFx0dW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGVbIHVubG9jayBdO1xuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHRoaXMuY2FjaGVbIHVubG9jayBdID0ge307XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIGtleSApICkge1xuXHRcdFx0XHQvLyBJZiBcIm5hbWVcIiBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdoZW4gZGF0YSBpcyBpbml0aWFsbHkgY3JlYXRlZCwgdmlhIChcImtleVwiLCBcInZhbFwiKSBzaWduYXR1cmUsXG5cdFx0XHRcdC8vIGtleXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlLlxuXHRcdFx0XHQvLyBTaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBfaG93XyBhIGtleSB3YXMgYWRkZWQsIHJlbW92ZVxuXHRcdFx0XHQvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2XG5cdFx0XHRcdC8vIFRoaXMgd2lsbCBvbmx5IHBlbmFsaXplIHRoZSBhcnJheSBhcmd1bWVudCBwYXRoLlxuXHRcdFx0XHRuYW1lID0ga2V5LmNvbmNhdCgga2V5Lm1hcCggalF1ZXJ5LmNhbWVsQ2FzZSApICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjYW1lbCA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXHRcdFx0XHQvLyBUcnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvblxuXHRcdFx0XHRpZiAoIGtleSBpbiBjYWNoZSApIHtcblx0XHRcdFx0XHRuYW1lID0gWyBrZXksIGNhbWVsIF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LlxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0bmFtZSA9IGNhbWVsO1xuXHRcdFx0XHRcdG5hbWUgPSBuYW1lIGluIGNhY2hlID9cblx0XHRcdFx0XHRcdFsgbmFtZSBdIDogKCBuYW1lLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGkgPSBuYW1lLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIG5hbWVbIGkgXSBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHJldHVybiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoXG5cdFx0XHR0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXSB8fCB7fVxuXHRcdCk7XG5cdH0sXG5cdGRpc2NhcmQ6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHRpZiAoIG93bmVyWyB0aGlzLmV4cGFuZG8gXSApIHtcblx0XHRcdGRlbGV0ZSB0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXTtcblx0XHR9XG5cdH1cbn07XG52YXIgZGF0YV9wcml2ID0gbmV3IERhdGEoKTtcblxudmFyIGRhdGFfdXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvKFtBLVpdKS9nO1xuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJDFcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGRhdGEgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6XG5cdFx0XHRcdFx0ZGF0YSA9PT0gXCJmYWxzZVwiID8gZmFsc2UgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwibnVsbFwiID8gbnVsbCA6XG5cdFx0XHRcdFx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0XHRcdFx0XHQrZGF0YSArIFwiXCIgPT09IGRhdGEgPyArZGF0YSA6XG5cdFx0XHRcdFx0cmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6XG5cdFx0XHRcdFx0ZGF0YTtcblx0XHRcdH0gY2F0Y2goIGUgKSB7fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXJcblx0XHRcdGRhdGFfdXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkYXRhX3VzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFfcHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFfdXNlci5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhX3VzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YV9wcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVsZW0gKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFfcHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTExK1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxsICgjMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZS5zbGljZSg1KSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhX3ByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhX3VzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhLFxuXHRcdFx0XHRjYW1lbEtleSA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gd2l0aCB0aGUga2V5IGFzLWlzXG5cdFx0XHRcdGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIHdpdGggdGhlIGtleSBjYW1lbGl6ZWRcblx0XHRcdFx0ZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVsZW0sIGNhbWVsS2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGNhbWVsS2V5LCB1bmRlZmluZWQgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSB0cmllZCByZWFsbHkgaGFyZCwgYnV0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBkYXRhLi4uXG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIEZpcnN0LCBhdHRlbXB0IHRvIHN0b3JlIGEgY29weSBvciByZWZlcmVuY2Ugb2YgYW55XG5cdFx0XHRcdC8vIGRhdGEgdGhhdCBtaWdodCd2ZSBiZWVuIHN0b3JlIHdpdGggYSBjYW1lbENhc2VkIGtleS5cblx0XHRcdFx0dmFyIGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCB0aGlzLCBjYW1lbEtleSApO1xuXG5cdFx0XHRcdC8vIEZvciBIVE1MNSBkYXRhLSogYXR0cmlidXRlIGludGVyb3AsIHdlIGhhdmUgdG9cblx0XHRcdFx0Ly8gc3RvcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBkYXNoZXMgaW4gYSBjYW1lbENhc2UgZm9ybS5cblx0XHRcdFx0Ly8gVGhpcyBtaWdodCBub3QgYXBwbHkgdG8gYWxsIHByb3BlcnRpZXMuLi4qXG5cdFx0XHRcdGRhdGFfdXNlci5zZXQoIHRoaXMsIGNhbWVsS2V5LCB2YWx1ZSApO1xuXG5cdFx0XHRcdC8vICouLi4gSW4gdGhlIGNhc2Ugb2YgcHJvcGVydGllcyB0aGF0IG1pZ2h0IF9hY3R1YWxseV9cblx0XHRcdFx0Ly8gaGF2ZSBkYXNoZXMsIHdlIG5lZWQgdG8gYWxzbyBzdG9yZSBhIGNvcHkgb2YgdGhhdFxuXHRcdFx0XHQvLyB1bmNoYW5nZWQgcHJvcGVydHkuXG5cdFx0XHRcdGlmICgga2V5LmluZGV4T2YoXCItXCIpICE9PSAtMSAmJiBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0ZGF0YV91c2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhX3VzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9KTtcblx0fVxufSk7XG5cblxualF1ZXJ5LmV4dGVuZCh7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXBcblx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0aWYgKCAhcXVldWUgfHwgalF1ZXJ5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBkYXRhICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBxdWV1ZSB8fCBbXTtcblx0XHR9XG5cdH0sXG5cblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXG5cdFx0XHRzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCxcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKSxcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXG5cdFx0XHRuZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbFxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0c3RhcnRMZW5ndGgtLTtcblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXG5cdFx0XHQvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nXG5cdFx0XHQvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcblx0XHRcdFx0cXVldWUudW5zaGlmdCggXCJpbnByb2dyZXNzXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvblxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xuXHRcdH1cblxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBOb3QgcHVibGljIC0gZ2VuZXJhdGUgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJuIHRoZSBjdXJyZW50IG9uZVxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dmFyIGtleSA9IHR5cGUgKyBcInF1ZXVlSG9va3NcIjtcblx0XHRyZXR1cm4gZGF0YV9wcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YV9wcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLmFkZChmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgWyB0eXBlICsgXCJxdWV1ZVwiLCBrZXkgXSApO1xuXHRcdFx0fSlcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcyA6XG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWzBdICE9PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSk7XG5cdH0sXG5cdGNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0fSxcblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59KTtcbnZhciBwbnVtID0gKC9bKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkvKS5zb3VyY2U7XG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24oIGVsZW0sIGVsICkge1xuXHRcdC8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247XG5cdFx0Ly8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwgYmUgc2Vjb25kIGFyZ3VtZW50XG5cdFx0ZWxlbSA9IGVsIHx8IGVsZW07XG5cdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiIHx8ICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXHR9O1xuXG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoL14oPzpjaGVja2JveHxyYWRpbykkL2kpO1xuXG5cblxuKGZ1bmN0aW9uKCkge1xuXHR2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0ZGl2ID0gZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApLFxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cblx0Ly8gU3VwcG9ydDogU2FmYXJpPD01LjFcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKCMxMTIxNylcblx0Ly8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKVxuXHQvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSlcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XG5cblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdC8vIFN1cHBvcnQ6IFNhZmFyaTw9NS4xLCBBbmRyb2lkPDQuMlxuXHQvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0pKCk7XG52YXIgc3RydW5kZWZpbmVkID0gdHlwZW9mIHVuZGVmaW5lZDtcblxuXG5cbnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXJcblx0cmtleUV2ZW50ID0gL15rZXkvLFxuXHRybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudSl8Y2xpY2svLFxuXHRyZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcXC4oLispfCkkLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxuICovXG5qUXVlcnkuZXZlbnQgPSB7XG5cblx0Z2xvYmFsOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XG5cblx0XHR2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YV9wcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cylcblx0XHRpZiAoICFlbGVtRGF0YSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzKSApIHtcblx0XHRcdGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRpZiAoICEoZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUpICkge1xuXHRcdFx0ZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHtcblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gc3RydW5kZWZpbmVkICYmIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSA/XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBlbGVtLCBhcmd1bWVudHMgKSA6IHVuZGVmaW5lZDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZVxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVyc1xuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcblx0XHRcdGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoe1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbihcIi5cIilcblx0XHRcdH0sIGhhbmRsZU9iakluICk7XG5cblx0XHRcdC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0XG5cdFx0XHRpZiAoICEoaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSkgKSB7XG5cdFx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTtcblx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7XG5cblx0XHRcdFx0Ly8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XG5cdFx0XHRcdHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udFxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cblx0XHRcdGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7XG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50XG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XG5cblx0XHR2YXIgaiwgb3JpZ0NvdW50LCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhX3ByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZFxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsyXSAmJiBuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKFwiXFxcXC4oPzouKlxcXFwufClcIikgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gXCIqKlwiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkge1xuXHRcdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaiwgMSApO1xuXG5cdFx0XHRcdFx0aWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc3BlY2lhbC5yZW1vdmUgKSB7XG5cdFx0XHRcdFx0XHRzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdFxuXHRcdFx0Ly8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpXG5cdFx0XHRpZiAoIG9yaWdDb3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8IHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7XG5cdFx0XHRkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBcImV2ZW50c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xuXG5cdFx0dmFyIGksIGN1ciwgdG1wLCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdChcIi5cIikgOiBbXTtcblxuXHRcdGN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoXCIuXCIpID49IDAgKSB7XG5cdFx0XHQvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdChcIi5cIik7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZihcIjpcIikgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbihcIi5cIik7XG5cdFx0ZXZlbnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKSArIFwiKFxcXFwufCQpXCIgKSA6XG5cdFx0XHRudWxsO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXG5cdFx0ZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkO1xuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxuXHRcdGRhdGEgPSBkYXRhID09IG51bGwgP1xuXHRcdFx0WyBldmVudCBdIDpcblx0XHRcdGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZlbnQgXSApO1xuXG5cdFx0Ly8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lc1xuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09IChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKGN1ciA9IGV2ZW50UGF0aFtpKytdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9ICggZGF0YV9wcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmIGRhdGFfcHJpdi5nZXQoIGN1ciwgXCJoYW5kbGVcIiApO1xuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XG5cdFx0XHRcdGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5hdGl2ZSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTtcblx0XHRcdGlmICggaGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSkgJiZcblx0XHRcdFx0alF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHtcblxuXHRcdFx0XHQvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSApICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2Rcblx0XHRcdFx0XHR0bXAgPSBlbGVtWyBvbnR5cGUgXTtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBudWxsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7XG5cdFx0XHRcdFx0ZWxlbVsgdHlwZSBdKCk7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApO1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRoYW5kbGVycyA9ICggZGF0YV9wcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWzBdID0gZXZlbnQ7XG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAobWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0pICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoIChoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSkgJiYgIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvciAyKSBoYXZlIG5hbWVzcGFjZShzKVxuXHRcdFx0XHQvLyBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS5cblx0XHRcdFx0aWYgKCAhZXZlbnQubmFtZXNwYWNlX3JlIHx8IGV2ZW50Lm5hbWVzcGFjZV9yZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9KS5oYW5kbGUgfHwgaGFuZGxlT2JqLmhhbmRsZXIgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdGlmICggKGV2ZW50LnJlc3VsdCA9IHJldCkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgbWF0Y2hlcywgc2VsLCBoYW5kbGVPYmosXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICgjMTMxODApXG5cdFx0Ly8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmIGN1ci5ub2RlVHlwZSAmJiAoIWV2ZW50LmJ1dHRvbiB8fCBldmVudC50eXBlICE9PSBcImNsaWNrXCIpICkge1xuXG5cdFx0XHRmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiICkge1xuXHRcdFx0XHRcdG1hdGNoZXMgPSBbXTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDAgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG1hdGNoZXMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVzIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnNcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IHRoaXMsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBoYW5kbGVyUXVldWU7XG5cdH0sXG5cblx0Ly8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnRcblx0cHJvcHM6IFwiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoXCIuc3BsaXQoXCIgXCIpLFxuXG5cdGZpeEhvb2tzOiB7fSxcblxuXHRrZXlIb29rczoge1xuXHRcdHByb3BzOiBcImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGVcIi5zcGxpdChcIiBcIiksXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xuXG5cdFx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRcdGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCApIHtcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXHR9LFxuXG5cdG1vdXNlSG9va3M6IHtcblx0XHRwcm9wczogXCJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnRcIi5zcGxpdChcIiBcIiksXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xuXHRcdFx0dmFyIGV2ZW50RG9jLCBkb2MsIGJvZHksXG5cdFx0XHRcdGJ1dHRvbiA9IG9yaWdpbmFsLmJ1dHRvbjtcblxuXHRcdFx0Ly8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZVxuXHRcdFx0aWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIG9yaWdpbmFsLmNsaWVudFggIT0gbnVsbCApIHtcblx0XHRcdFx0ZXZlbnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcblx0XHRcdFx0ZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0XHRib2R5ID0gZXZlbnREb2MuYm9keTtcblxuXHRcdFx0XHRldmVudC5wYWdlWCA9IG9yaWdpbmFsLmNsaWVudFggKyAoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwICk7XG5cdFx0XHRcdGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdFx0Ly8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXRcblx0XHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRldmVudC53aGljaCA9ICggYnV0dG9uICYgMSA/IDEgOiAoIGJ1dHRvbiAmIDIgPyAzIDogKCBidXR0b24gJiA0ID8gMiA6IDAgKSApICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHtcblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXNcblx0XHR2YXIgaSwgcHJvcCwgY29weSxcblx0XHRcdHR5cGUgPSBldmVudC50eXBlLFxuXHRcdFx0b3JpZ2luYWxFdmVudCA9IGV2ZW50LFxuXHRcdFx0Zml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTtcblxuXHRcdGlmICggIWZpeEhvb2sgKSB7XG5cdFx0XHR0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBmaXhIb29rID1cblx0XHRcdFx0cm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDpcblx0XHRcdFx0cmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOlxuXHRcdFx0XHR7fTtcblx0XHR9XG5cdFx0Y29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlzLnByb3BzLmNvbmNhdCggZml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wcztcblxuXHRcdGV2ZW50ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXG5cdFx0aSA9IGNvcHkubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0cHJvcCA9IGNvcHlbIGkgXTtcblx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogQ29yZG92YSAyLjUgKFdlYktpdCkgKCMxMzI1NSlcblx0XHQvLyBBbGwgZXZlbnRzIHNob3VsZCBoYXZlIGEgdGFyZ2V0OyBDb3Jkb3ZhIGRldmljZXJlYWR5IGRvZXNuJ3Rcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBkb2N1bWVudDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgNi4wKywgQ2hyb21lPDI4XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsICMxMzE0Mylcblx0XHRpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaXhIb29rLmZpbHRlciA/IGZpeEhvb2suZmlsdGVyKCBldmVudCwgb3JpZ2luYWxFdmVudCApIDogZXZlbnQ7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRmb2N1czoge1xuXHRcdFx0Ly8gRmlyZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1ZW5jZSBpcyBjb3JyZWN0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzICE9PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuZm9jdXMgKSB7XG5cdFx0XHRcdFx0dGhpcy5mb2N1cygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGVnYXRlVHlwZTogXCJmb2N1c2luXCJcblx0XHR9LFxuXHRcdGJsdXI6IHtcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMgPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5ibHVyICkge1xuXHRcdFx0XHRcdHRoaXMuYmx1cigpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGVnYXRlVHlwZTogXCJmb2N1c291dFwiXG5cdFx0fSxcblx0XHRjbGljazoge1xuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR0aGlzLmNsaWNrKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9uJ3QgZmlyZSBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgXCJhXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YmVmb3JldW5sb2FkOiB7XG5cdFx0XHRwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDIwK1xuXHRcdFx0XHQvLyBGaXJlZm94IGRvZXNuJ3QgYWxlcnQgaWYgdGhlIHJldHVyblZhbHVlIGZpZWxkIGlzIG5vdCBzZXQuXG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHtcblx0XHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuXG5cdFx0Ly8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlXG5cdFx0Ly8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuXG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlLFxuXHRcdFx0XHRvcmlnaW5hbEV2ZW50OiB7fVxuXHRcdFx0fVxuXHRcdCk7XG5cdFx0aWYgKCBidWJibGUgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guY2FsbCggZWxlbSwgZSApO1xuXHRcdH1cblx0XHRpZiAoIGUuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7XG5cdH1cbn07XG5cbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQpICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IGpRdWVyeS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnByZXZlbnREZWZhdWx0ICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fSxcblx0c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmIGUuc3RvcFByb3BhZ2F0aW9uICkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiApIHtcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcblx0fVxufTtcblxuLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTUrXG5qUXVlcnkuZWFjaCh7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSk7XG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3gsIENocm9tZSwgU2FmYXJpXG4vLyBDcmVhdGUgXCJidWJibGluZ1wiIGZvY3VzIGFuZCBibHVyIGV2ZW50c1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHtcblx0alF1ZXJ5LmVhY2goeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSwgdHJ1ZSApO1xuXHRcdFx0fTtcblxuXHRcdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHtcblx0XHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4ICkgLSAxO1xuXG5cdFx0XHRcdGlmICggIWF0dGFjaGVzICkge1xuXHRcdFx0XHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdFx0ZGF0YV9wcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSk7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHtcblx0XHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdFx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKVxuXHRcdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vbiggdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblx0XHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHQvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKVxuXHRcdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXG5cdFx0XHRcdGZuID0gZGF0YTtcblx0XHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICggb25lID09PSAxICkge1xuXHRcdFx0b3JpZ0ZuID0gZm47XG5cdFx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdFx0cmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9O1xuXHRcdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0XHR9KTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID8gaGFuZGxlT2JqLm9yaWdUeXBlICsgXCIuXCIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDogaGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRcdFx0Ly8gKCB0eXBlcyBbLCBmbl0gKVxuXHRcdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSk7XG5cdH0sXG5cdHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgZWxlbSA9IHRoaXNbMF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59KTtcblxuXG52YXJcblx0cnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1xcdzpdKylbXj5dKilcXC8+L2dpLFxuXHRydGFnTmFtZSA9IC88KFtcXHc6XSspLyxcblx0cmh0bWwgPSAvPHwmIz9cXHcrOy8sXG5cdHJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksXG5cdC8vIGNoZWNrZWQ9XCJjaGVja2VkXCIgb3IgY2hlY2tlZFxuXHRyY2hlY2tlZCA9IC9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksXG5cdHJzY3JpcHRUeXBlID0gL14kfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxcblx0cnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcXC8oLiopLyxcblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nLFxuXG5cdC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApXG5cdHdyYXBNYXAgPSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRvcHRpb246IFsgMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCIgXSxcblxuXHRcdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0XHRjb2w6IFsgMiwgXCI8dGFibGU+PGNvbGdyb3VwPlwiLCBcIjwvY29sZ3JvdXA+PC90YWJsZT5cIiBdLFxuXHRcdHRyOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCIgXSxcblx0XHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0XHRfZGVmYXVsdDogWyAwLCBcIlwiLCBcIlwiIF1cblx0fTtcblxuLy8gU3VwcG9ydDogSUU5XG53cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247XG5cbndyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7XG53cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcblxuLy8gU3VwcG9ydDogMS54IGNvbXBhdGliaWxpdHlcbi8vIE1hbmlwdWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0Ym9keVxuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdGpRdWVyeS5ub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSA/XG5cblx0XHRlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGJvZHlcIilbMF0gfHxcblx0XHRcdGVsZW0uYXBwZW5kQ2hpbGQoIGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIikgKSA6XG5cdFx0ZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gbnVsbCkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHR2YXIgbWF0Y2ggPSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTtcblxuXHRpZiAoIG1hdGNoICkge1xuXHRcdGVsZW0udHlwZSA9IG1hdGNoWyAxIF07XG5cdH0gZWxzZSB7XG5cdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YV9wcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sIFwiZ2xvYmFsRXZhbFwiLCAhcmVmRWxlbWVudHMgfHwgZGF0YV9wcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0dmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YV9wcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YV9wcml2LmFjY2Vzcyggc3JjICk7XG5cdFx0cGRhdGFDdXIgPSBkYXRhX3ByaXYuc2V0KCBkZXN0LCBwZGF0YU9sZCApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTtcblx0XHRcdHBkYXRhQ3VyLmV2ZW50cyA9IHt9O1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhX3VzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhX3VzZXIuYWNjZXNzKCBzcmMgKTtcblx0XHR1ZGF0YUN1ciA9IGpRdWVyeS5leHRlbmQoIHt9LCB1ZGF0YU9sZCApO1xuXG5cdFx0ZGF0YV91c2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHtcblx0dmFyIHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHRjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgPyBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCBcIipcIiApIDpcblx0XHRcdFtdO1xuXG5cdHJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/XG5cdFx0alF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICkgOlxuXHRcdHJldDtcbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxualF1ZXJ5LmV4dGVuZCh7XG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXG5cdFx0Ly8gRml4IElFIGNsb25pbmcgaXNzdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJlxuXHRcdFx0XHQhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cDovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRidWlsZEZyYWdtZW50OiBmdW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiApIHtcblx0XHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLFxuXHRcdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRcdG5vZGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRcdGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBRdFdlYktpdCwgUGhhbnRvbUpTXG5cdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0XHQvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcblx0XHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0XHQvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXNcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudChcImRpdlwiKSApO1xuXG5cdFx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHRcdHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBlbGVtLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdFx0Ly8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50XG5cdFx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHRcdHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXQsIFBoYW50b21KU1xuXHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApO1xuXG5cdFx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdFx0Ly8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKVxuXHRcdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50XG5cdFx0ZnJhZ21lbnQudGV4dENvbnRlbnQgPSBcIlwiO1xuXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoZWxlbSA9IG5vZGVzWyBpKysgXSkgKSB7XG5cblx0XHRcdC8vICM0MDg3IC0gSWYgb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBlbGVtZW50cyBhcmUgdGhlIHNhbWUsIGFuZCB0aGlzIGlzXG5cdFx0XHQvLyB0aGF0IGVsZW1lbnQsIGRvIG5vdCBkbyBhbnl0aGluZ1xuXHRcdFx0aWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApICE9PSAtMSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0XHR0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksIFwic2NyaXB0XCIgKTtcblxuXHRcdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdFx0aWYgKCBjb250YWlucyApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggdG1wICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRcdGlmICggc2NyaXB0cyApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSB0bXBbIGorKyBdKSApIHtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0XHRzY3JpcHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZnJhZ21lbnQ7XG5cdH0sXG5cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cdFx0dmFyIGRhdGEsIGVsZW0sIHR5cGUsIGtleSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoZWxlbSA9IGVsZW1zWyBpIF0pICE9PSB1bmRlZmluZWQ7IGkrKyApIHtcblx0XHRcdGlmICggalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0a2V5ID0gZWxlbVsgZGF0YV9wcml2LmV4cGFuZG8gXTtcblxuXHRcdFx0XHRpZiAoIGtleSAmJiAoZGF0YSA9IGRhdGFfcHJpdi5jYWNoZVsga2V5IF0pICkge1xuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZFxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGRhdGFfcHJpdi5jYWNoZVsga2V5IF0gKSB7XG5cdFx0XHRcdFx0XHQvLyBEaXNjYXJkIGFueSByZW1haW5pbmcgYHByaXZhdGVgIGRhdGFcblx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gRGlzY2FyZCBhbnkgcmVtYWluaW5nIGB1c2VyYCBkYXRhXG5cdFx0XHRkZWxldGUgZGF0YV91c2VyLmNhY2hlWyBlbGVtWyBkYXRhX3VzZXIuZXhwYW5kbyBdIF07XG5cdFx0fVxuXHR9XG59KTtcblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS50ZXh0KCB0aGlzICkgOlxuXHRcdFx0XHR0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGVsZW1zID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgdGhpcyApIDogdGhpcyxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0gKSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkge1xuXHRcdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzXG5cdFx0XHRcdGVsZW0udGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcblx0XHRkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7XG5cblx0XHRyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoKCBlICkge31cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHR0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBhcmcgPSBhcmd1bWVudHNbIDAgXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRhcmcgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cblx0XHRcdGlmICggYXJnICkge1xuXHRcdFx0XHRhcmcucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBGb3JjZSByZW1vdmFsIGlmIHRoZXJlIHdhcyBubyBuZXcgY29udGVudCAoZS5nLiwgZnJvbSBlbXB0eSBhcmd1bWVudHMpXG5cdFx0cmV0dXJuIGFyZyAmJiAoYXJnLmxlbmd0aCB8fCBhcmcubm9kZVR5cGUpID8gdGhpcyA6IHRoaXMucmVtb3ZlKCk7XG5cdH0sXG5cblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlKCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdGRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHRcdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2V0ID0gdGhpcyxcblx0XHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdC8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdFxuXHRcdGlmICggaXNGdW5jdGlvbiB8fFxuXHRcdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHRcdHZhciBzZWxmID0gc2V0LmVxKCBpbmRleCApO1xuXHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdFx0YXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2VsZi5kb21NYW5pcCggYXJncywgY2FsbGJhY2sgKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICggbCApIHtcblx0XHRcdGZyYWdtZW50ID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIGFyZ3MsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgdGhpcyApO1xuXHRcdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGZpcnN0ICkge1xuXHRcdFx0XHRzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgXCJzY3JpcHRcIiApLCBkaXNhYmxlU2NyaXB0ICk7XG5cdFx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cFxuXHRcdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IGZyYWdtZW50O1xuXG5cdFx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdFx0Ly8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvblxuXHRcdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBRdFdlYktpdFxuXHRcdFx0XHRcdFx0XHQvLyBqUXVlcnkubWVyZ2UgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjYWxsYmFjay5jYWxsKCB0aGlzWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdFx0Ly8gUmVlbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRcdGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTtcblxuXHRcdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBzY3JpcHRzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdFx0IWRhdGFfcHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiYgalF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUuc3JjICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKHtcblx0YXBwZW5kVG86IFwiYXBwZW5kXCIsXG5cdHByZXBlbmRUbzogXCJwcmVwZW5kXCIsXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcblx0aW5zZXJ0QWZ0ZXI6IFwiYWZ0ZXJcIixcblx0cmVwbGFjZUFsbDogXCJyZXBsYWNlV2l0aFwiXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBlbGVtcyxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxuXHRcdFx0bGFzdCA9IGluc2VydC5sZW5ndGggLSAxLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkge1xuXHRcdFx0ZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTtcblx0XHRcdGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogUXRXZWJLaXRcblx0XHRcdC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Ncblx0XHRcdHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSk7XG5cblxudmFyIGlmcmFtZSxcblx0ZWxlbWRpc3BsYXkgPSB7fTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIGRpc3BsYXkgb2YgYSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBub2RlTmFtZSBvZiB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IGRvYyBEb2N1bWVudCBvYmplY3RcbiAqL1xuLy8gQ2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gZGVmYXVsdERpc3BsYXlcbmZ1bmN0aW9uIGFjdHVhbERpc3BsYXkoIG5hbWUsIGRvYyApIHtcblx0dmFyIHN0eWxlLFxuXHRcdGVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVtZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9jLmJvZHkgKSxcblxuXHRcdC8vIGdldERlZmF1bHRDb21wdXRlZFN0eWxlIG1pZ2h0IGJlIHJlbGlhYmx5IHVzZWQgb25seSBvbiBhdHRhY2hlZCBlbGVtZW50XG5cdFx0ZGlzcGxheSA9IHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSAmJiAoIHN0eWxlID0gd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlKCBlbGVtWyAwIF0gKSApID9cblxuXHRcdFx0Ly8gVXNlIG9mIHRoaXMgbWV0aG9kIGlzIGEgdGVtcG9yYXJ5IGZpeCAobW9yZSBsaWtlIG9wdGltaXphdGlvbikgdW50aWwgc29tZXRoaW5nIGJldHRlciBjb21lcyBhbG9uZyxcblx0XHRcdC8vIHNpbmNlIGl0IHdhcyByZW1vdmVkIGZyb20gc3BlY2lmaWNhdGlvbiBhbmQgc3VwcG9ydGVkIG9ubHkgaW4gRkZcblx0XHRcdHN0eWxlLmRpc3BsYXkgOiBqUXVlcnkuY3NzKCBlbGVtWyAwIF0sIFwiZGlzcGxheVwiICk7XG5cblx0Ly8gV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSBzdG9yZWQgb24gdGhlIGVsZW1lbnQsXG5cdC8vIHNvIHVzZSBcImRldGFjaFwiIG1ldGhvZCBhcyBmYXN0IHdheSB0byBnZXQgcmlkIG9mIHRoZSBlbGVtZW50XG5cdGVsZW0uZGV0YWNoKCk7XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG5cbi8qKlxuICogVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZVxuICovXG5mdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7XG5cdHZhciBkb2MgPSBkb2N1bWVudCxcblx0XHRkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07XG5cblx0aWYgKCAhZGlzcGxheSApIHtcblx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXG5cdFx0Ly8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1lXG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiB8fCAhZGlzcGxheSApIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxlXG5cdFx0XHRpZnJhbWUgPSAoaWZyYW1lIHx8IGpRdWVyeSggXCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+XCIgKSkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVsZW1lbnQgKTtcblxuXHRcdFx0Ly8gQWx3YXlzIHdyaXRlIGEgbmV3IEhUTUwgc2tlbGV0b24gc28gV2Via2l0IGFuZCBGaXJlZm94IGRvbid0IGNob2tlIG9uIHJldXNlXG5cdFx0XHRkb2MgPSBpZnJhbWVbIDAgXS5jb250ZW50RG9jdW1lbnQ7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0XHRkb2Mud3JpdGUoKTtcblx0XHRcdGRvYy5jbG9zZSgpO1xuXG5cdFx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXHRcdFx0aWZyYW1lLmRldGFjaCgpO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheVxuXHRcdGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTtcblx0fVxuXG5cdHJldHVybiBkaXNwbGF5O1xufVxudmFyIHJtYXJnaW4gPSAoL15tYXJnaW4vKTtcblxudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0Ly8gU3VwcG9ydDogSUU8PTExKywgRmlyZWZveDw9MzArICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHRpZiAoIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5vcGVuZXIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTtcblx0fTtcblxuXG5cbmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7XG5cdHZhciB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLCByZXQsXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdC8vIGdldFByb3BlcnR5VmFsdWUgaXMgb25seSBuZWVkZWQgZm9yIC5jc3MoJ2ZpbHRlcicpICgjMTI1MzcpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cdH1cblxuXHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgPCA2XG5cdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdC8vIGlPUyA8IDYgKGF0IGxlYXN0KSByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIGEgbGFyZ2VyIHNldCBvZiB2YWx1ZXMsIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHNcblx0XHQvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBybWFyZ2luLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cdFx0Ly8gU3VwcG9ydDogSUVcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICh0aGlzLmdldCA9IGhvb2tGbikuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG4oZnVuY3Rpb24oKSB7XG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCxcblx0XHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4O1wiICtcblx0XHRcInBvc2l0aW9uOmFic29sdXRlXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVQaXhlbFBvc2l0aW9uQW5kQm94U2l6aW5nUmVsaWFibGUoKSB7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjNcblx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtcIiArXG5cdFx0XHRcImJveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MSU7dG9wOjElO1wiICtcblx0XHRcdFwiYm9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGVcIjtcblx0XHRkaXYuaW5uZXJIVE1MID0gXCJcIjtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYsIG51bGwgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cdFx0Ym94U2l6aW5nUmVsaWFibGVWYWwgPSBkaXZTdHlsZS53aWR0aCA9PT0gXCI0cHhcIjtcblxuXHRcdGRvY0VsZW0ucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogbm9kZS5qcyBqc2RvbVxuXHQvLyBEb24ndCBhc3N1bWUgdGhhdCBnZXRDb21wdXRlZFN0eWxlIGlzIGEgcHJvcGVydHkgb2YgdGhlIGdsb2JhbCBvYmplY3Rcblx0aWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCBzdXBwb3J0LCB7XG5cdFx0XHRwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBUaGlzIHRlc3QgaXMgZXhlY3V0ZWQgb25seSBvbmNlIGJ1dCB3ZSBzdGlsbCBkbyBtZW1vaXppbmdcblx0XHRcdFx0Ly8gc2luY2Ugd2UgY2FuIHVzZSB0aGUgYm94U2l6aW5nUmVsaWFibGUgcHJlLWNvbXB1dGluZy5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byBjaGVjayBpZiB0aGUgdGVzdCB3YXMgYWxyZWFkeSBwZXJmb3JtZWQsIHRob3VnaC5cblx0XHRcdFx0Y29tcHV0ZVBpeGVsUG9zaXRpb25BbmRCb3hTaXppbmdSZWxpYWJsZSgpO1xuXHRcdFx0XHRyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDtcblx0XHRcdH0sXG5cdFx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdFx0fSxcblx0XHRcdHJlbGlhYmxlTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHRcdC8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHlcblx0XHRcdFx0Ly8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiAoIzMzMzMpXG5cdFx0XHRcdC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodFxuXHRcdFx0XHQvLyBUaGlzIHN1cHBvcnQgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBvbmNlIHNvIG5vIG1lbW9pemluZyBpcyBuZWVkZWQuXG5cdFx0XHRcdHZhciByZXQsXG5cdFx0XHRcdFx0bWFyZ2luRGl2ID0gZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHRcdFx0XHQvLyBSZXNldCBDU1M6IGJveC1zaXppbmc7IGRpc3BsYXk7IG1hcmdpbjsgYm9yZGVyOyBwYWRkaW5nXG5cdFx0XHRcdG1hcmdpbkRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFuZHJvaWQgMi4zXG5cdFx0XHRcdFx0Ly8gVmVuZG9yLXByZWZpeCBib3gtc2l6aW5nXG5cdFx0XHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O1wiICtcblx0XHRcdFx0XHRcImJveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjBcIjtcblx0XHRcdFx0bWFyZ2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gXCIwXCI7XG5cdFx0XHRcdGRpdi5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XG5cdFx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0XHRcdHJldCA9ICFwYXJzZUZsb2F0KCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkubWFyZ2luUmlnaHQgKTtcblxuXHRcdFx0XHRkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0XHRcdFx0ZGl2LnJlbW92ZUNoaWxkKCBtYXJnaW5EaXYgKTtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KSgpO1xuXG5cbi8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMuXG5qUXVlcnkuc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjaywgYXJncyApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhclxuXHQvLyBTd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxuXHQvLyBTZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXlcblx0cmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFxuXHRybnVtc3BsaXQgPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKC4qKSRcIiwgXCJpXCIgKSxcblx0cnJlbE51bSA9IG5ldyBSZWdFeHAoIFwiXihbKy1dKT0oXCIgKyBwbnVtICsgXCIpXCIsIFwiaVwiICksXG5cblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH0sXG5cblx0Y3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiT1wiLCBcIk1velwiLCBcIm1zXCIgXTtcblxuLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBuYW1lICkge1xuXG5cdC8vIFNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkXG5cdGlmICggbmFtZSBpbiBzdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLFxuXHRcdG9yaWdOYW1lID0gbmFtZSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb3JpZ05hbWU7XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cdHZhciBtYXRjaGVzID0gcm51bXNwbGl0LmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAxIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAyIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMgKSB7XG5cdHZhciBpID0gZXh0cmEgPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSA/XG5cdFx0Ly8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJlbWVudCwgYXZvaWQgYXVnbWVudGF0aW9uXG5cdFx0NCA6XG5cdFx0Ly8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllc1xuXHRcdG5hbWUgPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXG5cdFx0dmFsID0gMDtcblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cdFx0Ly8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luLCBzbyBhZGQgaXQgaWYgd2Ugd2FudCBpdFxuXHRcdGlmICggZXh0cmEgPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0JvcmRlckJveCApIHtcblx0XHRcdC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudFxuXHRcdFx0aWYgKCBleHRyYSA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBtYXJnaW4sIHNvIHJlbW92ZSBib3JkZXJcblx0XHRcdGlmICggZXh0cmEgIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZ1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWVcblx0dmFyIHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLFxuXHRcdHZhbCA9IG5hbWUgPT09IFwid2lkdGhcIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCxcblx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0Ly8gU29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkXG5cdC8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NVxuXHQvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2Njhcblx0aWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHtcblx0XHQvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3Nhcnlcblx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdGlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdHZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLlxuXHRcdGlmICggcm51bW5vbnB4LnRlc3QodmFsKSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0XHQvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmXG5cdFx0XHQoIHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApO1xuXG5cdFx0Ly8gTm9ybWFsaXplIFwiXCIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuXHRcdHZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7XG5cdH1cblxuXHQvLyBVc2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlc1xuXHRyZXR1cm4gKCB2YWwgK1xuXHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0ZWxlbSxcblx0XHRcdG5hbWUsXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXG5cdFx0XHR2YWx1ZUlzQm9yZGVyQm94LFxuXHRcdFx0c3R5bGVzXG5cdFx0KVxuXHQpICsgXCJweFwiO1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLCBoaWRkZW4sXG5cdFx0dmFsdWVzID0gW10sXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YV9wcml2LmdldCggZWxlbSwgXCJvbGRkaXNwbGF5XCIgKTtcblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblx0XHRcdC8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXNcblx0XHRcdC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3Rcblx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBvdmVycmlkZGVuIHdpdGggZGlzcGxheTogbm9uZVxuXHRcdFx0Ly8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXNcblx0XHRcdC8vIGZvciBzdWNoIGFuIGVsZW1lbnRcblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuKCBlbGVtICkgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIFwib2xkZGlzcGxheVwiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRoaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApO1xuXG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiIHx8ICFoaWRkZW4gKSB7XG5cdFx0XHRcdGRhdGFfcHJpdi5zZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiLCBoaWRkZW4gPyBkaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wXG5cdC8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3dcblx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAoICFzaG93IHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCBcIlwiIDogXCJub25lXCI7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZXh0ZW5kKHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiY29sdW1uQ291bnRcIjogdHJ1ZSxcblx0XHRcImZpbGxPcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJmbGV4R3Jvd1wiOiB0cnVlLFxuXHRcdFwiZmxleFNocmlua1wiOiB0cnVlLFxuXHRcdFwiZm9udFdlaWdodFwiOiB0cnVlLFxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxuXHRcdFwib3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwib3JkZXJcIjogdHJ1ZSxcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcblx0XHRcIndpZG93c1wiOiB0cnVlLFxuXHRcdFwiekluZGV4XCI6IHRydWUsXG5cdFx0XCJ6b29tXCI6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHtcblx0XHRcImZsb2F0XCI6IFwiY3NzRmxvYXRcIlxuXHR9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG9yaWdOYW1lICkgKTtcblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgKHJldCA9IHJyZWxOdW0uZXhlYyggdmFsdWUgKSkgKSB7XG5cdFx0XHRcdHZhbHVlID0gKCByZXRbMV0gKyAxICkgKiByZXRbMl0gKyBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICkgKTtcblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7XG5cdFx0XHRcdHZhbHVlICs9IFwicHhcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgIShcInNldFwiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XG5cdFx0XHRyZXR1cm4gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHtcblx0XHR2YXIgdmFsLCBudW0sIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTtcblxuXHRcdC8vIFRyeSBwcmVmaXhlZCBuYW1lIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIG5hbWVcblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0XG5cdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBcIm5vcm1hbFwiIHRvIGNvbXB1dGVkIHZhbHVlXG5cdFx0aWYgKCB2YWwgPT09IFwibm9ybWFsXCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7XG5cdFx0XHR2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWNcblx0XHRpZiAoIGV4dHJhID09PSBcIlwiIHx8IGV4dHJhICkge1xuXHRcdFx0bnVtID0gcGFyc2VGbG9hdCggdmFsICk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgalF1ZXJ5LmlzTnVtZXJpYyggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJiBlbGVtLm9mZnNldFdpZHRoID09PSAwID9cblx0XHRcdFx0XHRqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdFx0XHR9KSA6XG5cdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgP1xuXHRcdFx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0XHRzdHlsZXNcblx0XHRcdFx0KSA6IDBcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xufSk7XG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luUmlnaHQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIHsgXCJkaXNwbGF5XCI6IFwiaW5saW5lLWJsb2NrXCIgfSxcblx0XHRcdFx0Y3VyQ1NTLCBbIGVsZW0sIFwibWFyZ2luUmlnaHRcIiBdICk7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCh7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdChcIiBcIikgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0Y3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0dmFyIHN0eWxlcywgbGVuLFxuXHRcdFx0XHRtYXAgPSB7fSxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW4oIHRoaXMgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuc2hvdygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgXCJzd2luZ1wiO1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJlxuXHRcdFx0XHQoIXR3ZWVuLmVsZW0uc3R5bGUgfHwgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwpICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMuXG5cdFx0XHQvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdDtcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMtaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cdFx0XHQvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kIFwiYXV0b1wiIGFyZSBjb252ZXJ0ZWQgdG8gMC5cblx0XHRcdHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gXCJhdXRvXCIgPyAwIDogcmVzdWx0O1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLnN0eWxlICYmICggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8IGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUU5XG4vLyBQYW5pYyBiYXNlZCBhcHByb2FjaCB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHtcblx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5lYXNpbmcgPSB7XG5cdGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIHA7XG5cdH0sXG5cdHN3aW5nOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAgKiBNYXRoLlBJICkgLyAyO1xuXHR9XG59O1xuXG5qUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDtcblxuLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnRcbmpRdWVyeS5meC5zdGVwID0ge307XG5cblxuXG5cbnZhclxuXHRmeE5vdywgdGltZXJJZCxcblx0cmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sXG5cdHJmeG51bSA9IG5ldyBSZWdFeHAoIFwiXig/OihbKy1dKT18KShcIiArIHBudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICksXG5cdHJydW4gPSAvcXVldWVIb29rcyQvLFxuXHRhbmltYXRpb25QcmVmaWx0ZXJzID0gWyBkZWZhdWx0UHJlZmlsdGVyIF0sXG5cdHR3ZWVuZXJzID0ge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksXG5cdFx0XHRcdHRhcmdldCA9IHR3ZWVuLmN1cigpLFxuXHRcdFx0XHRwYXJ0cyA9IHJmeG51bS5leGVjKCB2YWx1ZSApLFxuXHRcdFx0XHR1bml0ID0gcGFydHMgJiYgcGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdFx0XHQvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlc1xuXHRcdFx0XHRzdGFydCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiArdGFyZ2V0ICkgJiZcblx0XHRcdFx0XHRyZnhudW0uZXhlYyggalF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgcHJvcCApICksXG5cdFx0XHRcdHNjYWxlID0gMSxcblx0XHRcdFx0bWF4SXRlcmF0aW9ucyA9IDIwO1xuXG5cdFx0XHRpZiAoIHN0YXJ0ICYmIHN0YXJ0WyAzIF0gIT09IHVuaXQgKSB7XG5cdFx0XHRcdC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3Ncblx0XHRcdFx0dW5pdCA9IHVuaXQgfHwgc3RhcnRbIDMgXTtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0XHRcdHBhcnRzID0gcGFydHMgfHwgW107XG5cblx0XHRcdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRcdFx0c3RhcnQgPSArdGFyZ2V0IHx8IDE7XG5cblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdC8vIElmIHByZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3VibGUgdW50aWwgd2UgZ2V0ICpzb21ldGhpbmcqLlxuXHRcdFx0XHRcdC8vIFVzZSBzdHJpbmcgZm9yIGRvdWJsaW5nIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93XG5cdFx0XHRcdFx0c2NhbGUgPSBzY2FsZSB8fCBcIi41XCI7XG5cblx0XHRcdFx0XHQvLyBBZGp1c3QgYW5kIGFwcGx5XG5cdFx0XHRcdFx0c3RhcnQgPSBzdGFydCAvIHNjYWxlO1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgcHJvcCwgc3RhcnQgKyB1bml0ICk7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKCksXG5cdFx0XHRcdC8vIGJyZWFrIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2hcblx0XHRcdFx0fSB3aGlsZSAoIHNjYWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIoKSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSB0d2VlbiBwcm9wZXJ0aWVzXG5cdFx0XHRpZiAoIHBhcnRzICkge1xuXHRcdFx0XHRzdGFydCA9IHR3ZWVuLnN0YXJ0ID0gK3N0YXJ0IHx8ICt0YXJnZXQgfHwgMDtcblx0XHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHRcdC8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvblxuXHRcdFx0XHR0d2Vlbi5lbmQgPSBwYXJ0c1sgMSBdID9cblx0XHRcdFx0XHRzdGFydCArICggcGFydHNbIDEgXSArIDEgKSAqIHBhcnRzWyAyIF0gOlxuXHRcdFx0XHRcdCtwYXJ0c1sgMiBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH07XG5cbi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHlcbmZ1bmN0aW9uIGNyZWF0ZUZ4Tm93KCkge1xuXHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9KTtcblx0cmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRpID0gMCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07XG5cblx0Ly8gSWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNCA7IGkgKz0gMiAtIGluY2x1ZGVXaWR0aCApIHtcblx0XHR3aGljaCA9IGNzc0V4cGFuZFsgaSBdO1xuXHRcdGF0dHJzWyBcIm1hcmdpblwiICsgd2hpY2ggXSA9IGF0dHJzWyBcInBhZGRpbmdcIiArIHdoaWNoIF0gPSB0eXBlO1xuXHR9XG5cblx0aWYgKCBpbmNsdWRlV2lkdGggKSB7XG5cdFx0YXR0cnMub3BhY2l0eSA9IGF0dHJzLndpZHRoID0gdHlwZTtcblx0fVxuXG5cdHJldHVybiBhdHRycztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7XG5cdHZhciB0d2Vlbixcblx0XHRjb2xsZWN0aW9uID0gKCB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICh0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApKSApIHtcblxuXHRcdFx0Ly8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBob29rcywgb2xkZmlyZSwgZGlzcGxheSwgY2hlY2tEaXNwbGF5LFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YV9wcml2LmdldCggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIEhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXNcblx0aWYgKCAhb3B0cy5xdWV1ZSApIHtcblx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgXCJmeFwiICk7XG5cdFx0aWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkge1xuXHRcdFx0aG9va3MudW5xdWV1ZWQgPSAwO1xuXHRcdFx0b2xkZmlyZSA9IGhvb2tzLmVtcHR5LmZpcmU7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggIWhvb2tzLnVucXVldWVkICkge1xuXHRcdFx0XHRcdG9sZGZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0aG9va3MudW5xdWV1ZWQrKztcblxuXHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gRW5zdXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVyIGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBjb21wbGV0ZXNcblx0XHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gSGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3Ncblx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCJoZWlnaHRcIiBpbiBwcm9wcyB8fCBcIndpZHRoXCIgaW4gcHJvcHMgKSApIHtcblx0XHQvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXRcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFOS0xMCBkbyBub3Rcblx0XHQvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmRcblx0XHQvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZVxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gaW5saW5lLWJsb2NrIGZvciBoZWlnaHQvd2lkdGhcblx0XHQvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkXG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cblx0XHQvLyBUZXN0IGRlZmF1bHQgZGlzcGxheSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSBcIm5vbmVcIlxuXHRcdGNoZWNrRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID9cblx0XHRcdGRhdGFfcHJpdi5nZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiICkgfHwgZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXk7XG5cblx0XHRpZiAoIGNoZWNrRGlzcGxheSA9PT0gXCJpbmxpbmVcIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBzaG93L2hpZGUgcGFzc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGRhdGFTaG93IGxlZnQgb3ZlciBmcm9tIGEgc3RvcHBlZCBoaWRlIG9yIHNob3cgYW5kIHdlIGFyZSBnb2luZyB0byBwcm9jZWVkIHdpdGggc2hvdywgd2Ugc2hvdWxkIHByZXRlbmQgdG8gYmUgaGlkZGVuXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXG5cdFx0Ly8gQW55IG5vbi1meCB2YWx1ZSBzdG9wcyB1cyBmcm9tIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXNwbGF5ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0aWYgKCBkYXRhU2hvdyApIHtcblx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhU2hvdyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIFwiZnhzaG93XCIsIHt9ICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgc3RhdGUgaWYgaXRzIHRvZ2dsZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byBcInJldmVyc2VcIlxuXHRcdGlmICggdG9nZ2xlICkge1xuXHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHR9XG5cdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRqUXVlcnkoIGVsZW0gKS5zaG93KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFuaW0uZG9uZShmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5KCBlbGVtICkuaGlkZSgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGFuaW0uZG9uZShmdW5jdGlvbigpIHtcblx0XHRcdHZhciBwcm9wO1xuXG5cdFx0XHRkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0dHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblxuXHRcdFx0aWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7XG5cdFx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDtcblx0XHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdFx0dHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdFx0dHdlZW4uc3RhcnQgPSBwcm9wID09PSBcIndpZHRoXCIgfHwgcHJvcCA9PT0gXCJoZWlnaHRcIiA/IDEgOiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdC8vIElmIHRoaXMgaXMgYSBub29wIGxpa2UgLmhpZGUoKS5oaWRlKCksIHJlc3RvcmUgYW4gb3ZlcndyaXR0ZW4gZGlzcGxheSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCAoZGlzcGxheSA9PT0gXCJub25lXCIgPyBkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApIDogZGlzcGxheSkgPT09IFwiaW5saW5lXCIgKSB7XG5cdFx0c3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApO1xuXHRcdGVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTtcblx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdO1xuXHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGFuaW1hdGlvblByZWZpbHRlcnMubGVuZ3RoLFxuXHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9KSxcblx0XHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSk7XG5cblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSh7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9IH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXHRcdFx0XHRcdC8vIElmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVuc1xuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxuXHRcdFx0XHRcdGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7XG5cdFx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9KSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdHJlc3VsdCA9IGFuaW1hdGlvblByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xuXHRcdGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApO1xuXHR9XG5cblx0alF1ZXJ5LmZ4LnRpbWVyKFxuXHRcdGpRdWVyeS5leHRlbmQoIHRpY2ssIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRhbmltOiBhbmltYXRpb24sXG5cdFx0XHRxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWVcblx0XHR9KVxuXHQpO1xuXG5cdC8vIGF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdHJldHVybiBhbmltYXRpb24ucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5zcGxpdChcIiBcIik7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdHR3ZWVuZXJzWyBwcm9wIF0gPSB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xuXHRcdFx0dHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRhbmltYXRpb25QcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFuaW1hdGlvblByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsXG5cdFx0ZHVyYXRpb246IHNwZWVkLFxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gXCJudW1iZXJcIiA/IG9wdC5kdXJhdGlvbiA6XG5cdFx0b3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7XG5cblx0Ly8gTm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXG5cdGlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkge1xuXHRcdG9wdC5xdWV1ZSA9IFwiZnhcIjtcblx0fVxuXG5cdC8vIFF1ZXVlaW5nXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XG5cblx0b3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gU2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFfcHJpdi5nZXQoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFfcHJpdi5nZXQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZC5cblx0XHRcdC8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2hcblx0XHRcdC8vIHdpbGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC5cblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YV9wcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5lYWNoKFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSBcImJvb2xlYW5cIiA/XG5cdFx0XHRjc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOlxuXHRcdFx0dGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKHtcblx0c2xpZGVEb3duOiBnZW5GeChcInNob3dcIiksXG5cdHNsaWRlVXA6IGdlbkZ4KFwiaGlkZVwiKSxcblx0c2xpZGVUb2dnbGU6IGdlbkZ4KFwidG9nZ2xlXCIpLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0pO1xuXG5qUXVlcnkudGltZXJzID0gW107XG5qUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgdGltZXIsXG5cdFx0aSA9IDAsXG5cdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycztcblxuXHRmeE5vdyA9IGpRdWVyeS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblx0XHQvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWRcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRpZiAoIHRpbWVyKCkgKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnRpbWVycy5wb3AoKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5cbmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXHRpZiAoICF0aW1lcklkICkge1xuXHRcdHRpbWVySWQgPSBzZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHR9XG59O1xuXG5qUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRjbGVhckludGVydmFsKCB0aW1lcklkICk7XG5cdHRpbWVySWQgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cdC8vIERlZmF1bHQgc3BlZWRcblx0X2RlZmF1bHQ6IDQwMFxufTtcblxuXG4vLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uXG4vLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSk7XG59O1xuXG5cbihmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBpT1M8PTUuMSwgQW5kcm9pZDw9NC4yK1xuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8PTIuM1xuXHQvLyBPcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZSBpbmNvcnJlY3RseSBtYXJrZWQgYXMgZGlzYWJsZWRcblx0c2VsZWN0LmRpc2FibGVkID0gdHJ1ZTtcblx0c3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59KSgpO1xuXG5cbnZhciBub2RlSG9vaywgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9KTtcblx0fVxufSk7XG5cbmpRdWVyeS5leHRlbmQoe1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBkb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBzdHJ1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2VyY2FzZVxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyBcIlwiICk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID9cblx0XHRcdFx0dW5kZWZpbmVkIDpcblx0XHRcdFx0cmV0O1xuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsIHByb3BOYW1lLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAobmFtZSA9IGF0dHJOYW1lc1tpKytdKSApIHtcblx0XHRcdFx0cHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cblx0XHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGdldCBzcGVjaWFsIHRyZWF0bWVudCAoIzEwODcwKVxuXHRcdFx0XHRpZiAoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRcdC8vIFNldCBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHRvIGZhbHNlXG5cdFx0XHRcdFx0ZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0YXR0ckhvb2tzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmXG5cdFx0XHRcdFx0alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgcmV0LCBoYW5kbGU7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBuYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSBoYW5kbGU7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG59KTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdO1xuXHRcdH0pO1xuXHR9XG59KTtcblxualF1ZXJ5LmV4dGVuZCh7XG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fSxcblxuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsIG5vdHhtbCxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTtcblxuXHRcdGlmICggbm90eG1sICkge1xuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybiBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyZXQgOlxuXHRcdFx0XHQoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCA/XG5cdFx0XHRcdHJldCA6XG5cdFx0XHRcdGVsZW1bIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmhhc0F0dHJpYnV0ZSggXCJ0YWJpbmRleFwiICkgfHwgcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgZWxlbS5ocmVmID9cblx0XHRcdFx0XHRlbGVtLnRhYkluZGV4IDpcblx0XHRcdFx0XHQtMTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKFtcblx0XCJ0YWJJbmRleFwiLFxuXHRcInJlYWRPbmx5XCIsXG5cdFwibWF4TGVuZ3RoXCIsXG5cdFwiY2VsbFNwYWNpbmdcIixcblx0XCJjZWxsUGFkZGluZ1wiLFxuXHRcInJvd1NwYW5cIixcblx0XCJjb2xTcGFuXCIsXG5cdFwidXNlTWFwXCIsXG5cdFwiZnJhbWVCb3JkZXJcIixcblx0XCJjb250ZW50RWRpdGFibGVcIlxuXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7XG59KTtcblxuXG5cblxudmFyIHJjbGFzcyA9IC9bXFx0XFxyXFxuXFxmXS9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdHByb2NlZWQgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIHByb2NlZWQgKSB7XG5cdFx0XHQvLyBUaGUgZGlzanVuY3Rpb24gaGVyZSBpcyBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIHJlbW92ZUNsYXNzKVxuXHRcdFx0Y2xhc3NlcyA9ICggdmFsdWUgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF07XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/XG5cdFx0XHRcdFx0KCBcIiBcIiArIGVsZW0uY2xhc3NOYW1lICsgXCIgXCIgKS5yZXBsYWNlKCByY2xhc3MsIFwiIFwiICkgOlxuXHRcdFx0XHRcdFwiIFwiXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBvbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBqUXVlcnkudHJpbSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0cHJvY2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmICggcHJvY2VlZCApIHtcblx0XHRcdGNsYXNzZXMgPSAoIHZhbHVlIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdO1xuXHRcdFx0XHQvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKVxuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgP1xuXHRcdFx0XHRcdCggXCIgXCIgKyBlbGVtLmNsYXNzTmFtZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApIDpcblx0XHRcdFx0XHRcIlwiXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkge1xuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPj0gMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjdXIgKSA6IFwiXCI7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHtcblx0XHR2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdGlmICggdHlwZW9mIHN0YXRlVmFsID09PSBcImJvb2xlYW5cIiAmJiB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlVmFsID8gdGhpcy5hZGRDbGFzcyggdmFsdWUgKSA6IHRoaXMucmVtb3ZlQ2xhc3MoIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnRvZ2dsZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGksIHRoaXMuY2xhc3NOYW1lLCBzdGF0ZVZhbCksIHN0YXRlVmFsICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHR2YXIgY2xhc3NOYW1lLFxuXHRcdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRcdHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0XHRjbGFzc05hbWVzID0gdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRcdHdoaWxlICggKGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdKSApIHtcblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gc3RydW5kZWZpbmVkIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0XHRpZiAoIHRoaXMuY2xhc3NOYW1lICkge1xuXHRcdFx0XHRcdC8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXRcblx0XHRcdFx0XHRkYXRhX3ByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgdGhpcy5jbGFzc05hbWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkIGBmYWxzZWAsXG5cdFx0XHRcdC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksXG5cdFx0XHRcdC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cblx0XHRcdFx0dGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyBcIlwiIDogZGF0YV9wcml2LmdldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdGlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoXCIgXCIgKyB0aGlzW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKHJjbGFzcywgXCIgXCIpLmluZGV4T2YoIGNsYXNzTmFtZSApID49IDAgKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIGlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1swXTtcblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRcdHJldC5yZXBsYWNlKHJyZXR1cm4sIFwiXCIpIDpcblx0XHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0XHRyZXQgPT0gbnVsbCA/IFwiXCIgOiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHR2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCI7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoXCJzZXRcIiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5qUXVlcnkuZXh0ZW5kKHtcblx0dmFsSG9va3M6IHtcblx0XHRvcHRpb246IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFMTAtMTErXG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdGpRdWVyeS50cmltKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIiB8fCBpbmRleCA8IDAsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoLFxuXHRcdFx0XHRcdGkgPSBpbmRleCA8IDAgP1xuXHRcdFx0XHRcdFx0bWF4IDpcblx0XHRcdFx0XHRcdG9uZSA/IGluZGV4IDogMDtcblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIElFNi05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKCMyNTUxKVxuXHRcdFx0XHRcdGlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJlxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCggc3VwcG9ydC5vcHREaXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0QXR0cmlidXRlKCBcImRpc2FibGVkXCIgKSA9PT0gbnVsbCApICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cdFx0XHRcdFx0aWYgKCAob3B0aW9uLnNlbGVjdGVkID0galF1ZXJ5LmluQXJyYXkoIG9wdGlvbi52YWx1ZSwgdmFsdWVzICkgPj0gMCkgKSB7XG5cdFx0XHRcdFx0XHRvcHRpb25TZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaChbIFwicmFkaW9cIiwgXCJjaGVja2JveFwiIF0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoZWxlbSkudmFsKCksIHZhbHVlICkgPj0gMCApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKCAhc3VwcG9ydC5jaGVja09uICkge1xuXHRcdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0pO1xuXG5cblxuXG4vLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRyaWJ1dGVzLW9ubHkgaW5jbHVzaW9uXG5cblxualF1ZXJ5LmVhY2goIChcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudVwiKS5zcGxpdChcIiBcIiksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSk7XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH0sXG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyB0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XG5cdH1cbn0pO1xuXG5cbnZhciBub25jZSA9IGpRdWVyeS5ub3coKTtcblxudmFyIHJxdWVyeSA9ICgvXFw/Lyk7XG5cblxuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuLy8gV29ya2Fyb3VuZCBmYWlsdXJlIHRvIHN0cmluZy1jYXN0IG51bGwgaW5wdXRcbmpRdWVyeS5wYXJzZUpTT04gPSBmdW5jdGlvbiggZGF0YSApIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKyBcIlwiICk7XG59O1xuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sLCB0bXA7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTlcblx0dHJ5IHtcblx0XHR0bXAgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdFx0eG1sID0gdG1wLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyaGFzaCA9IC8jLiokLyxcblx0cnRzID0gLyhbPyZdKV89W14mXSovLFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvbWcsXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXHRydXJsID0gL14oW1xcdy4rLV0rOikoPzpcXC9cXC8oPzpbXlxcLz8jXSpAfCkoW15cXC8/IzpdKikoPzo6KFxcZCspfCl8KS8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uXG5cdGFsbFR5cGVzID0gXCIqL1wiLmNvbmNhdCggXCIqXCIgKSxcblxuXHQvLyBEb2N1bWVudCBsb2NhdGlvblxuXHRhamF4TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZixcblxuXHQvLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHNcblx0YWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdO1xuXG4vLyBCYXNlIFwiY29uc3RydWN0b3JcIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0XG5mdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHtcblxuXHQvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIFwiKlwiXG5cdHJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkge1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZnVuYyA9IGRhdGFUeXBlRXhwcmVzc2lvbjtcblx0XHRcdGRhdGFUeXBlRXhwcmVzc2lvbiA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdHZhciBkYXRhVHlwZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0ZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkge1xuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoZGF0YVR5cGUgPSBkYXRhVHlwZXNbaSsrXSkgKSB7XG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbMF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS51bnNoaWZ0KCBmdW5jICk7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdChzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiYgIXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoZGVlcCA9IHt9KSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1UeXBlXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZVxuXHRpZiAoIGN0ICkge1xuXHRcdGZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7XG5cdFx0XHRpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkge1xuXHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHJlc3BvbnNlIGZvciB0aGUgZXhwZWN0ZWQgZGF0YVR5cGVcblx0aWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7XG5cdFx0ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWzBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmVcblx0XHRmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlO1xuXHR9XG5cblx0Ly8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZVxuXHQvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZFxuXHQvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG5cdGlmICggZmluYWxEYXRhVHlwZSApIHtcblx0XHRpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkge1xuXHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdO1xuXHR9XG59XG5cbi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcbiAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7XG5cdHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBwcmV2LFxuXHRcdGNvbnZlcnRlcnMgPSB7fSxcblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgY29udjIgXTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudCA9IHRtcFsgMCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpXG5cdFx0XHRcdGlmICggY29udiAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW1cblx0XHRcdFx0XHRpZiAoIGNvbnYgJiYgc1sgXCJ0aHJvd3NcIiBdICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgc3RhdGU6IFwicGFyc2VyZXJyb3JcIiwgZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50IH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBhamF4TG9jYXRpb24sXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL3htbC8sXG5cdFx0XHRodG1sOiAvaHRtbC8sXG5cdFx0XHRqc29uOiAvanNvbi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogalF1ZXJ5LnBhcnNlSlNPTixcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXHRcdFx0Ly8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbVxuXHRcdFx0Y2FjaGVVUkwsXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXHRcdFx0Ly8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzXG5cdFx0XHRwYXJ0cyxcblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxuXHRcdFx0cyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYgKCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdGpRdWVyeS5ldmVudCxcblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXHRcdFx0Ly8gVGhlIGpxWEhSIHN0YXRlXG5cdFx0XHRzdGF0ZSA9IDAsXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXHRcdFx0Ly8gRmFrZSB4aHJcblx0XHRcdGpxWEhSID0ge1xuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxuXG5cdFx0XHRcdC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWRcblx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXHRcdFx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIChtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnNbIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0dmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVEZWZlcnJlZC5hZGQ7XG5cdFx0anFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7XG5cdFx0anFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsO1xuXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9tb3Rpb24pXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgYWpheExvY2F0aW9uICkgKyBcIlwiICkucmVwbGFjZSggcmhhc2gsIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNFxuXHRcdHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7XG5cblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XG5cdFx0cy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHdlIGhhdmUgYSBwcm90b2NvbDpob3N0OnBvcnQgbWlzbWF0Y2hcblx0XHRpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHtcblx0XHRcdHBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7XG5cdFx0XHRzLmNyb3NzRG9tYWluID0gISEoIHBhcnRzICYmXG5cdFx0XHRcdCggcGFydHNbIDEgXSAhPT0gYWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHxcblx0XHRcdFx0XHQoIHBhcnRzWyAzIF0gfHwgKCBwYXJ0c1sgMSBdID09PSBcImh0dHA6XCIgPyBcIjgwXCIgOiBcIjQ0M1wiICkgKSAhPT1cblx0XHRcdFx0XHRcdCggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gXCI4MFwiIDogXCI0NDNcIiApICkgKVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpXG5cdFx0ZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7XG5cblx0XHQvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzXG5cdFx0aWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcihcImFqYXhTdGFydFwiKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHRjYWNoZVVSTCA9IHMudXJsO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9ICggcy51cmwgKz0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuZGF0YSApO1xuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgP1xuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJhbWV0ZXIsIHNldCBpdHMgdmFsdWVcblx0XHRcdFx0XHRjYWNoZVVSTC5yZXBsYWNlKCBydHMsIFwiJDFfPVwiICsgbm9uY2UrKyApIDpcblxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmRcblx0XHRcdFx0XHRjYWNoZVVSTCArICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyBub25jZSsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gP1xuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJiAoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IHN0YXRlID09PSAyICkgKSB7XG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Zm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkge1xuXHRcdFx0anFYSFJbIGkgXSggc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGpxWEhSLmFib3J0KFwidGltZW91dFwiKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHN0YXRlID0gMTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0Ly8gUHJvcGFnYXRlIGV4Y2VwdGlvbiBhcyBlcnJvciBpZiBub3QgZG9uZVxuXHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0XHQvLyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lXG5cdFx0ZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7XG5cdFx0XHR2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLFxuXHRcdFx0XHRzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dDtcblxuXHRcdFx0Ly8gQ2FsbGVkIG9uY2Vcblx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdGUgaXMgXCJkb25lXCIgbm93XG5cdFx0XHRzdGF0ZSA9IDI7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb25cblx0XHRcdC8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcblxuXHRcdFx0Ly8gU2V0IHJlYWR5U3RhdGVcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XG5cblx0XHRcdC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsXG5cdFx0XHRpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNDtcblxuXHRcdFx0Ly8gR2V0IHJlc3BvbnNlIGRhdGFcblx0XHRcdGlmICggcmVzcG9uc2VzICkge1xuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJMYXN0LU1vZGlmaWVkXCIpO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJldGFnXCIpO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcihcImFqYXhTdG9wXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59KTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XG5cdFx0XHRjYWxsYmFjayA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkuYWpheCh7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSk7XG5cdH07XG59KTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoe1xuXHRcdHVybDogdXJsLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cdFx0XCJ0aHJvd3NcIjogdHJ1ZVxuXHR9KTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCh7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXNbIDAgXSApIHtcblxuXHRcdFx0Ly8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmRcblx0XHRcdHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1ZSApO1xuXG5cdFx0XHRpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR3cmFwLmluc2VydEJlZm9yZSggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXAubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9KS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKHRoaXMsIGkpICk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0Y29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7XG5cblx0XHRcdGlmICggY29udGVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250ZW50cy53cmFwQWxsKCBodG1sICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYXBwZW5kKCBodG1sICk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0d3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGlzRnVuY3Rpb24gPyBodG1sLmNhbGwodGhpcywgaSkgOiBodG1sICk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dW53cmFwOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImJvZHlcIiApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0XHR9XG5cdFx0fSkuZW5kKCk7XG5cdH1cbn0pO1xuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdC8vIFN1cHBvcnQ6IE9wZXJhIDw9IDEyLjEyXG5cdC8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBvZmZzZXRIZWlnaHRzIGxlc3MgdGhhbiB6ZXJvIG9uIHNvbWUgZWxlbWVudHNcblx0cmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPD0gMCAmJiBlbGVtLm9mZnNldEhlaWdodCA8PSAwO1xufTtcbmpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7XG59O1xuXG5cblxuXG52YXIgcjIwID0gLyUyMC9nLFxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHtcblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgPyBpIDogXCJcIiApICsgXCJdXCIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgalF1ZXJ5LnR5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblx0XHQvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xuXHR9XG59XG5cbi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mXG4vLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmdcbmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHtcblx0dmFyIHByZWZpeCxcblx0XHRzID0gW10sXG5cdFx0YWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWVcblx0XHRcdHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSApO1xuXHRcdH07XG5cblx0Ly8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci5cblx0aWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0pO1xuXG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApLnJlcGxhY2UoIHIyMCwgXCIrXCIgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoe1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSlcblx0XHQuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRcdC8vIFVzZSAuaXMoIFwiOmRpc2FibGVkXCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9KVxuXHRcdC5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdHJldHVybiB2YWwgPT0gbnVsbCA/XG5cdFx0XHRcdG51bGwgOlxuXHRcdFx0XHRqUXVlcnkuaXNBcnJheSggdmFsICkgP1xuXHRcdFx0XHRcdGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9KS5nZXQoKTtcblx0fVxufSk7XG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cdH0gY2F0Y2goIGUgKSB7fVxufTtcblxudmFyIHhocklkID0gMCxcblx0eGhyQ2FsbGJhY2tzID0ge30sXG5cdHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cdFx0Ly8gZmlsZSBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyBjb2RlIDAsIGFzc3VtZSAyMDBcblx0XHQwOiAyMDAsXG5cdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbi8vIFN1cHBvcnQ6IElFOVxuLy8gT3BlbiByZXF1ZXN0cyBtdXN0IGJlIG1hbnVhbGx5IGFib3J0ZWQgb24gdW5sb2FkICgjNTI4MClcbi8vIFNlZSBodHRwczovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8yODU2NzQ2IGZvciBtb3JlIGluZm9cbmlmICggd2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHR3aW5kb3cuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgZnVuY3Rpb24oKSB7XG5cdFx0Zm9yICggdmFyIGtleSBpbiB4aHJDYWxsYmFja3MgKSB7XG5cdFx0XHR4aHJDYWxsYmFja3NbIGtleSBdKCk7XG5cdFx0fVxuXHR9KTtcbn1cblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHR2YXIgY2FsbGJhY2s7XG5cblx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxuXHRpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0dmFyIGksXG5cdFx0XHRcdFx0eGhyID0gb3B0aW9ucy54aHIoKSxcblx0XHRcdFx0XHRpZCA9ICsreGhySWQ7XG5cblx0XHRcdFx0eGhyLm9wZW4oIG9wdGlvbnMudHlwZSwgb3B0aW9ucy51cmwsIG9wdGlvbnMuYXN5bmMsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQgKTtcblxuXHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRcdHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcblx0XHRcdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXJcblx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxuXHRcdFx0XHQvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLlxuXHRcdFx0XHQvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cClcblx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXG5cdFx0XHRcdGlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbXCJYLVJlcXVlc3RlZC1XaXRoXCJdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbXCJYLVJlcXVlc3RlZC1XaXRoXCJdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHhockNhbGxiYWNrc1sgaWQgXTtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSB4aHIub25sb2FkID0geGhyLm9uZXJyb3IgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJhYm9ydFwiICkge1xuXHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcImVycm9yXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBmaWxlOiBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyAwOyBzZWUgIzg2MDUsICMxNDIwN1xuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEFjY2Vzc2luZyBiaW5hcnktZGF0YSByZXNwb25zZVRleHQgdGhyb3dzIGFuIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gKCMxMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiB4aHIucmVzcG9uc2VUZXh0ID09PSBcInN0cmluZ1wiID8ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiB4aHIucmVzcG9uc2VUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHR9IDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0eGhyLm9uZXJyb3IgPSBjYWxsYmFjayhcImVycm9yXCIpO1xuXG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSB4aHJDYWxsYmFja3NbIGlkIF0gPSBjYWxsYmFjayhcImFib3J0XCIpO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0Ly8gIzE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3RpZmllZCBhcyBhbiBlcnJvciB5ZXRcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSk7XG5cblxuXG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvKD86amF2YXxlY21hKXNjcmlwdC9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59KTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0pO1xuXG4vLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnRcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KFwiPHNjcmlwdD5cIikucHJvcCh7XG5cdFx0XHRcdFx0YXN5bmM6IHRydWUsXG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSkub24oXG5cdFx0XHRcdFx0XCJsb2FkIGVycm9yXCIsXG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggZXZ0ICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBldnQudHlwZSA9PT0gXCJlcnJvclwiID8gNDA0IDogMjAwLCBldnQudHlwZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTtcblx0XHRcdH0sXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0pO1xuXG5cblxuXG52YXIgb2xkQ2FsbGJhY2tzID0gW10sXG5cdHJqc29ucCA9IC8oPSlcXD8oPz0mfCQpfFxcP1xcPy87XG5cbi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3NcbmpRdWVyeS5hamF4U2V0dXAoe1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0pO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmICEoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIikgJiYgcmpzb25wLnRlc3QoIHMuZGF0YSApICYmIFwiZGF0YVwiXG5cdFx0KTtcblxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XG5cdGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gXCJqc29ucFwiICkge1xuXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxuXHRcdGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbXCJzY3JpcHQganNvblwiXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIGZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlXG5cdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XG5cblx0XHRcdC8vIFNhdmUgYmFjayBhcyBmcmVlXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xuXHRcdFx0XHQvLyBtYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSk7XG5cblxuXG5cbi8vIGRhdGE6IHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0dmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLFxuXHRcdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsxXSApIF07XG5cdH1cblxuXHRwYXJzZWQgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZFxudmFyIF9sb2FkID0galF1ZXJ5LmZuLmxvYWQ7XG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdGlmICggdHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIiAmJiBfbG9hZCApIHtcblx0XHRyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG5cblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZihcIiBcIik7XG5cblx0aWYgKCBvZmYgPj0gMCApIHtcblx0XHRzZWxlY3RvciA9IGpRdWVyeS50cmltKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoe1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIGlmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWRcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhVHlwZTogXCJodG1sXCIsXG5cdFx0XHRkYXRhOiBwYXJhbXNcblx0XHR9KS5kb25lKGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KFwiPGRpdj5cIikuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0fSkuY29tcGxldGUoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBjYWxsYmFjaywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFsgXCJhamF4U3RhcnRcIiwgXCJhamF4U3RvcFwiLCBcImFqYXhDb21wbGV0ZVwiLCBcImFqYXhFcnJvclwiLCBcImFqYXhTdWNjZXNzXCIsIFwiYWpheFNlbmRcIiBdLCBmdW5jdGlvbiggaSwgdHlwZSApIHtcblx0alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7XG5cdH07XG59KTtcblxuXG5cblxualF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9KS5sZW5ndGg7XG59O1xuXG5cblxuXG52YXIgZG9jRWxlbSA9IHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbi8qKlxuICogR2V0cyBhIHdpbmRvdyBmcm9tIGFuIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPyBlbGVtIDogZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRlZmF1bHRWaWV3O1xufVxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoXCJhdXRvXCIpID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkge1xuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgY3VyT2Zmc2V0ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKHtcblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0XHRqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHR2YXIgZG9jRWxlbSwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sXG5cdFx0XHRkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1bWVudDtcblxuXHRcdGlmICggIWRvYyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhIGRpc2Nvbm5lY3RlZCBET00gbm9kZVxuXHRcdGlmICggIWpRdWVyeS5jb250YWlucyggZG9jRWxlbSwgZWxlbSApICkge1xuXHRcdFx0cmV0dXJuIGJveDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBCbGFja0JlcnJ5IDUsIGlPUyAzIChvcmlnaW5hbCBpUGhvbmUpXG5cdFx0Ly8gSWYgd2UgZG9uJ3QgaGF2ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0aGVyIHRoYW4gZXJyb3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gc3RydW5kZWZpbmVkICkge1xuXHRcdFx0Ym94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR9XG5cdFx0d2luID0gZ2V0V2luZG93KCBkb2MgKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBib3gudG9wICsgd2luLnBhZ2VZT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRUb3AsXG5cdFx0XHRsZWZ0OiBib3gubGVmdCArIHdpbi5wYWdlWE9mZnNldCAtIGRvY0VsZW0uY2xpZW50TGVmdFxuXHRcdH07XG5cdH0sXG5cblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sIGJlY2F1c2UgaXQgaXMgaXRzIG9ubHkgb2Zmc2V0IHBhcmVudFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblx0XHRcdC8vIEFzc3VtZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXMgdGhlcmUgd2hlbiBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudFxuXHRcdFx0b2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKTtcblxuXHRcdFx0Ly8gR2V0IGNvcnJlY3Qgb2Zmc2V0c1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sIFwiaHRtbFwiICkgKSB7XG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzXG5cdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdG9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY0VsZW07XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50LCBcImh0bWxcIiApICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSApIHtcblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2NFbGVtO1xuXHRcdH0pO1xuXHR9XG59KTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXHRcdFx0dmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApO1xuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luZG93LnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbmRvdy5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApO1xuXHR9O1xufSk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaTw3KywgQ2hyb21lPDM3K1xuLy8gQWRkIHRoZSB0b3AvbGVmdCBjc3NIb29rcyB1c2luZyBqUXVlcnkuZm4ucG9zaXRpb25cbi8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NFxuLy8gQmxpbmsgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjI5MjgwXG4vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0O1xuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5waXhlbFBvc2l0aW9uLFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGNvbXB1dGVkID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7XG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSk7XG5cblxuLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBIZWlnaHQ6IFwiaGVpZ2h0XCIsIFdpZHRoOiBcIndpZHRoXCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7XG5cdGpRdWVyeS5lYWNoKCB7IHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsIFwiXCI6IFwib3V0ZXJcIiArIG5hbWUgfSwgZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXHRcdFx0XHRcdC8vIEFzIG9mIDUvOC8yMDEyIHRoaXMgd2lsbCB5aWVsZCBpbmNvcnJlY3QgcmVzdWx0cyBmb3IgTW9iaWxlIFNhZmFyaSwgYnV0IHRoZXJlXG5cdFx0XHRcdFx0Ly8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOlxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNzY0XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBcImNsaWVudFwiICsgbmFtZSBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodFxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0ZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdFx0XHQvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRoL0hlaWdodF0sXG5cdFx0XHRcdFx0Ly8gd2hpY2hldmVyIGlzIGdyZWF0ZXN0XG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcInNjcm9sbFwiICsgbmFtZSBdLCBkb2NbIFwic2Nyb2xsXCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwib2Zmc2V0XCIgKyBuYW1lIF0sIGRvY1sgXCJvZmZzZXRcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGRvY1sgXCJjbGllbnRcIiArIG5hbWUgXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApO1xuXHRcdH07XG5cdH0pO1xufSk7XG5cblxuLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXRcbmpRdWVyeS5mbi5zaXplID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbmpRdWVyeS5mbi5hbmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSk7XG59XG5cblxuXG5cbnZhclxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoIHR5cGVvZiBub0dsb2JhbCA9PT0gc3RydW5kZWZpbmVkICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cbnJldHVybiBqUXVlcnk7XG5cbn0pKTtcbiIsIi8qISBKc1JlbmRlciB2MC45LjgzIChCZXRhKTogaHR0cDovL2pzdmlld3MuY29tLyNqc3JlbmRlciAqL1xuLyohICoqVkVSU0lPTiBGT1IgV0VCKiogKEZvciBOT0RFLkpTIHNlZSBodHRwOi8vanN2aWV3cy5jb20vZG93bmxvYWQvanNyZW5kZXItbm9kZS5qcykgKi9cbi8qXG4gKiBCZXN0LW9mLWJyZWVkIHRlbXBsYXRpbmcgaW4gYnJvd3NlciBvciBvbiBOb2RlLmpzLlxuICogRG9lcyBub3QgcmVxdWlyZSBqUXVlcnksIG9yIEhUTUwgRE9NXG4gKiBJbnRlZ3JhdGVzIHdpdGggSnNWaWV3cyAoaHR0cDovL2pzdmlld3MuY29tLyNqc3ZpZXdzKVxuICpcbiAqIENvcHlyaWdodCAyMDE2LCBCb3JpcyBNb29yZVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vanNoaW50IC1XMDE4LCAtVzA0MVxuXG4oZnVuY3Rpb24oZmFjdG9yeSwgZ2xvYmFsKSB7XG5cdC8vIGdsb2JhbCB2YXIgaXMgdGhlIHRoaXMgb2JqZWN0LCB3aGljaCBpcyB3aW5kb3cgd2hlbiBydW5uaW5nIGluIHRoZSB1c3VhbCBicm93c2VyIGVudmlyb25tZW50XG5cdHZhciAkID0gZ2xvYmFsLmpRdWVyeTtcblxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHsgLy8gQ29tbW9uSlMgZS5nLiBCcm93c2VyaWZ5XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSAkXG5cdFx0XHQ/IGZhY3RvcnkoZ2xvYmFsLCAkKVxuXHRcdFx0OiBmdW5jdGlvbigkKSB7IC8vIElmIG5vIGdsb2JhbCBqUXVlcnksIHRha2Ugb3B0aW9uYWwgalF1ZXJ5IHBhc3NlZCBhcyBwYXJhbWV0ZXI6IHJlcXVpcmUoJ2pzcmVuZGVyJykoalF1ZXJ5KVxuXHRcdFx0XHRpZiAoJCAmJiAhJC5mbikge1xuXHRcdFx0XHRcdHRocm93IFwiUHJvdmlkZSBqUXVlcnkgb3IgbnVsbFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KGdsb2JhbCwgJCk7XG5cdFx0XHR9O1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRCBzY3JpcHQgbG9hZGVyLCBlLmcuIFJlcXVpcmVKU1xuXHRcdGRlZmluZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmYWN0b3J5KGdsb2JhbCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7IC8vIEJyb3dzZXIgdXNpbmcgcGxhaW4gPHNjcmlwdD4gdGFnXG5cdFx0ZmFjdG9yeShnbG9iYWwsIGZhbHNlKTtcblx0fVxufSAoXG5cbi8vIGZhY3RvcnkgKGZvciBqc3JlbmRlci5qcylcbmZ1bmN0aW9uKGdsb2JhbCwgJCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wLWxldmVsIHZhcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gZ2xvYmFsIHZhciBpcyB0aGUgdGhpcyBvYmplY3QsIHdoaWNoIGlzIHdpbmRvdyB3aGVuIHJ1bm5pbmcgaW4gdGhlIHVzdWFsIGJyb3dzZXIgZW52aXJvbm1lbnRcbnZhciBzZXRHbG9iYWxzID0gJCA9PT0gZmFsc2U7IC8vIE9ubHkgc2V0IGdsb2JhbHMgaWYgc2NyaXB0IGJsb2NrIGluIGJyb3dzZXIgKG5vdCBBTUQgYW5kIG5vdCBDb21tb25KUylcblxuJCA9ICQgJiYgJC5mbiA/ICQgOiBnbG9iYWwualF1ZXJ5OyAvLyAkIGlzIGpRdWVyeSBwYXNzZWQgaW4gYnkgQ29tbW9uSlMgbG9hZGVyIChCcm93c2VyaWZ5KSwgb3IgZ2xvYmFsIGpRdWVyeS5cblxudmFyIHZlcnNpb25OdW1iZXIgPSBcInYwLjkuODNcIixcblx0anN2U3RvcmVOYW1lLCByVGFnLCByVG1wbFN0cmluZywgdG9wVmlldywgJHZpZXdzLFx0JGV4cGFuZG8sXG5cbi8vVE9ET1x0dG1wbEZuc0NhY2hlID0ge30sXG5cdCRpc0Z1bmN0aW9uLCAkaXNBcnJheSwgJHRlbXBsYXRlcywgJGNvbnZlcnRlcnMsICRoZWxwZXJzLCAkdGFncywgJHN1YiwgJHN1YlNldHRpbmdzLCAkc3ViU2V0dGluZ3NBZHZhbmNlZCwgJHZpZXdzU2V0dGluZ3MsIGRlbGltT3BlbkNoYXIwLCBkZWxpbU9wZW5DaGFyMSwgZGVsaW1DbG9zZUNoYXIwLCBkZWxpbUNsb3NlQ2hhcjEsIGxpbmtDaGFyLCBzZXR0aW5nLCBiYXNlT25FcnJvcixcblxuXHRyUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHQvLyAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cblx0clBhcmFtcyA9IC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICAgICAgICAgbGZ0UHJuMCAgICAgICAgbGZ0UHJuICAgICAgICBib3VuZCAgICAgICAgICAgIHBhdGggICAgb3BlcmF0b3IgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgICAgICAgICAgICAgcGF0aDIgICAgICAgcHJuICAgIGNvbW1hICAgbGZ0UHJuMiAgIGFwb3MgcXVvdCAgICAgIHJ0UHJuIHJ0UHJuRG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuMiAgc3BhY2Vcblx0Ly8gKGxlZnQgcGFyZW4/IGZvbGxvd2VkIGJ5IChwYXRoPyBmb2xsb3dlZCBieSBvcGVyYXRvcikgb3IgKHBhdGggZm9sbG93ZWQgYnkgbGVmdCBwYXJlbj8pKSBvciBjb21tYSBvciBhcG9zIG9yIHF1b3Qgb3IgcmlnaHQgcGFyZW4gb3Igc3BhY2VcblxuXHRpc1JlbmRlckNhbGwsXG5cdHJOZXdMaW5lID0gL1sgXFx0XSooXFxyXFxufFxcbnxcXHIpL2csXG5cdHJVbmVzY2FwZVF1b3RlcyA9IC9cXFxcKFsnXCJdKS9nLFxuXHRyRXNjYXBlUXVvdGVzID0gL1snXCJcXFxcXS9nLCAvLyBFc2NhcGUgcXVvdGVzIGFuZCBcXCBjaGFyYWN0ZXJcblx0ckJ1aWxkSGFzaCA9IC8oPzpcXHgwOHxeKShvbmVycm9yOik/KD86KH4/KSgoW1xcdyRfXFwuXSspOik/KFteXFx4MDhdKykpXFx4MDgoLCk/KFteXFx4MDhdKykvZ2ksXG5cdHJUZXN0RWxzZUlmID0gL15pZlxccy8sXG5cdHJGaXJzdEVsZW0gPSAvPChcXHcrKVs+XFxzXS8sXG5cdHJBdHRyRW5jb2RlID0gL1tcXHgwMGA+PFwiJyY9XS9nLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdHJJc0h0bWwgPSAvW1xceDAwYD48XFxcIicmPV0vLFxuXHRySGFzSGFuZGxlcnMgPSAvXm9uW0EtWl18XmNvbnZlcnQoQmFjayk/JC8sXG5cdHJXcmFwcGVkSW5WaWV3TWFya2VyID0gL15cXCNcXGQrX2BbXFxzXFxTXSpcXC9cXGQrX2AkLyxcblx0ckh0bWxFbmNvZGUgPSByQXR0ckVuY29kZSxcblx0dmlld0lkID0gMCxcblx0Y2hhckVudGl0aWVzID0ge1xuXHRcdFwiJlwiOiBcIiZhbXA7XCIsXG5cdFx0XCI8XCI6IFwiJmx0O1wiLFxuXHRcdFwiPlwiOiBcIiZndDtcIixcblx0XHRcIlxceDAwXCI6IFwiJiMwO1wiLFxuXHRcdFwiJ1wiOiBcIiYjMzk7XCIsXG5cdFx0J1wiJzogXCImIzM0O1wiLFxuXHRcdFwiYFwiOiBcIiYjOTY7XCIsXG5cdFx0XCI9XCI6IFwiJiM2MTtcIlxuXHR9LFxuXHRIVE1MID0gXCJodG1sXCIsXG5cdE9CSkVDVCA9IFwib2JqZWN0XCIsXG5cdHRtcGxBdHRyID0gXCJkYXRhLWpzdi10bXBsXCIsXG5cdGpzdlRtcGwgPSBcImpzdlRtcGxcIixcblx0aW5kZXhTdHIgPSBcIkZvciAjaW5kZXggaW4gbmVzdGVkIGJsb2NrIHVzZSAjZ2V0SW5kZXgoKS5cIixcblx0JHJlbmRlciA9IHt9LFxuXG5cdGpzciA9IGdsb2JhbC5qc3JlbmRlcixcblx0anNyVG9KcSA9IGpzciAmJiAkICYmICEkLnJlbmRlciwgLy8gSnNSZW5kZXIgYWxyZWFkeSBsb2FkZWQsIHdpdGhvdXQgalF1ZXJ5LiBidXQgd2Ugd2lsbCByZS1sb2FkIGl0IG5vdyB0byBhdHRhY2ggdG8galF1ZXJ5XG5cblx0anN2U3RvcmVzID0ge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVG1wbFxuXHRcdH0sXG5cdFx0dGFnOiB7XG5cdFx0XHRjb21waWxlOiBjb21waWxlVGFnXG5cdFx0fSxcblx0XHR2aWV3TW9kZWw6IHtcblx0XHRcdGNvbXBpbGU6IGNvbXBpbGVWaWV3TW9kZWxcblx0XHR9LFxuXHRcdGhlbHBlcjoge30sXG5cdFx0Y29udmVydGVyOiB7fVxuXHR9O1xuXG5cdC8vIHZpZXdzIG9iamVjdCAoJC52aWV3cyBpZiBqUXVlcnkgaXMgbG9hZGVkLCBqc3JlbmRlci52aWV3cyBpZiBubyBqUXVlcnksIGUuZy4gaW4gTm9kZS5qcylcblx0JHZpZXdzID0ge1xuXHRcdGpzdmlld3M6IHZlcnNpb25OdW1iZXIsXG5cdFx0c3ViOiB7XG5cdFx0XHQvLyBzdWJzY3JpcHRpb24sIGUuZy4gSnNWaWV3cyBpbnRlZ3JhdGlvblxuXHRcdFx0VmlldzogVmlldyxcblx0XHRcdEVycjogSnNWaWV3c0Vycm9yLFxuXHRcdFx0dG1wbEZuOiB0bXBsRm4sXG5cdFx0XHRwYXJzZTogcGFyc2VQYXJhbXMsXG5cdFx0XHRleHRlbmQ6ICRleHRlbmQsXG5cdFx0XHRleHRlbmRDdHg6IGV4dGVuZEN0eCxcblx0XHRcdHN5bnRheEVycjogc3ludGF4RXJyb3IsXG5cdFx0XHRvblN0b3JlOiB7fSxcblx0XHRcdGFkZFNldHRpbmc6IGFkZFNldHRpbmcsXG5cdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRhbGxvd0NvZGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0YWR2U2V0OiBub29wLCAvLyBVcGRhdGUgYWR2YW5jZWQgc2V0dGluZ3Ncblx0XHRcdF90aHM6IHRhZ0hhbmRsZXJzRnJvbVByb3BzLFxuXHRcdFx0X3RnOiBmdW5jdGlvbigpIHt9LCAvLyBDb25zdHJ1Y3RvciBmb3IgdGFnRGVmXG5cdFx0XHRfY252dDogY29udmVydFZhbCxcblx0XHRcdF90YWc6IHJlbmRlclRhZyxcblx0XHRcdF9lcjogZXJyb3IsXG5cdFx0XHRfZXJyOiBvblJlbmRlckVycm9yLFxuXHRcdFx0X2h0bWw6IGh0bWxFbmNvZGUsXG5cdFx0XHRfY3A6IHJldFZhbCwgLy8gR2V0IGNvbXBpbGVkIGNvbnRleHR1YWwgcGFyYW1ldGVycyAob3IgcHJvcGVydGllcykgfmZvbz1leHByLiBJbiBKc1JlbmRlciwgc2ltcGx5IHJldHVybnMgdmFsLlxuXHRcdFx0X3NxOiBmdW5jdGlvbih0b2tlbikge1xuXHRcdFx0XHRpZiAodG9rZW4gPT09IFwiY29uc3RydWN0b3JcIikge1xuXHRcdFx0XHRcdHN5bnRheEVycm9yKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0b2tlbjtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNldHRpbmdzOiB7XG5cdFx0XHRkZWxpbWl0ZXJzOiAkdmlld3NEZWxpbWl0ZXJzLFxuXHRcdFx0YWR2YW5jZWQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZVxuXHRcdFx0XHRcdD8gKFxuXHRcdFx0XHRcdFx0XHQkZXh0ZW5kKCRzdWJTZXR0aW5nc0FkdmFuY2VkLCB2YWx1ZSksXG5cdFx0XHRcdFx0XHRcdCRzdWIuYWR2U2V0KCksXG5cdFx0XHRcdFx0XHRcdCR2aWV3c1NldHRpbmdzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6ICRzdWJTZXR0aW5nc0FkdmFuY2VkO1xuXHRcdFx0XHR9XG5cdFx0fSxcblx0XHRnZXRDdHg6IHJldFZhbCwgLy8gR2V0IGN0eC5mb28gdmFsdWUuIEluIEpzUmVuZGVyLCBzaW1wbHkgcmV0dXJucyB2YWwuXG5cdFx0bWFwOiBkYXRhTWFwICAgIC8vIElmIGpzT2JzZXJ2YWJsZSBsb2FkZWQgZmlyc3QsIHVzZSB0aGF0IGRlZmluaXRpb24gb2YgZGF0YU1hcFxuXHR9O1xuXG5mdW5jdGlvbiBnZXREZXJpdmVkTWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJldCxcblx0XHRcdHRhZyA9IHRoaXMsXG5cdFx0XHRwcmV2QmFzZSA9IHRhZy5iYXNlO1xuXG5cdFx0dGFnLmJhc2UgPSBiYXNlTWV0aG9kOyAvLyBXaXRoaW4gbWV0aG9kIGNhbGwsIGNhbGxpbmcgdGhpcy5iYXNlIHdpbGwgY2FsbCB0aGUgYmFzZSBtZXRob2Rcblx0XHRyZXQgPSBtZXRob2QuYXBwbHkodGFnLCBhcmd1bWVudHMpOyAvLyBDYWxsIHRoZSBtZXRob2Rcblx0XHR0YWcuYmFzZSA9IHByZXZCYXNlOyAvLyBSZXBsYWNlIHRoaXMuYmFzZSB0byBiZSB0aGUgYmFzZSBtZXRob2Qgb2YgdGhlIHByZXZpb3VzIGNhbGwsIGZvciBjaGFpbmVkIGNhbGxzXG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0TWV0aG9kKGJhc2VNZXRob2QsIG1ldGhvZCkge1xuXHQvLyBGb3IgZGVyaXZlZCBtZXRob2RzIChvciBoYW5kbGVycyBkZWNsYXJlZCBkZWNsYXJhdGl2ZWx5IGFzIGluIHt7OmZvbyBvbkNoYW5nZT1+Zm9vQ2hhbmdlZH19IHJlcGxhY2UgYnkgYSBkZXJpdmVkIG1ldGhvZCwgdG8gYWxsb3cgdXNpbmcgdGhpcy5iYXNlKC4uLilcblx0Ly8gb3IgdGhpcy5iYXNlQXBwbHkoYXJndW1lbnRzKSB0byBjYWxsIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLiAoRXF1aXZhbGVudCB0byB0aGlzLl9zdXBlciguLi4pIGFuZCB0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cykgaW4galF1ZXJ5IFVJKVxuXHRpZiAoJGlzRnVuY3Rpb24obWV0aG9kKSkge1xuXHRcdG1ldGhvZCA9IGdldERlcml2ZWRNZXRob2QoXG5cdFx0XHRcdCFiYXNlTWV0aG9kXG5cdFx0XHRcdFx0PyBub29wIC8vIG5vIGJhc2UgbWV0aG9kIGltcGxlbWVudGF0aW9uLCBzbyB1c2Ugbm9vcCBhcyBiYXNlIG1ldGhvZFxuXHRcdFx0XHRcdDogYmFzZU1ldGhvZC5fZFxuXHRcdFx0XHRcdFx0PyBiYXNlTWV0aG9kIC8vIGJhc2VNZXRob2QgaXMgYSBkZXJpdmVkIG1ldGhvZCwgc28gdXMgaXRcblx0XHRcdFx0XHRcdDogZ2V0RGVyaXZlZE1ldGhvZChub29wLCBiYXNlTWV0aG9kKSwgLy8gYmFzZU1ldGhvZCBpcyBub3QgZGVyaXZlZCBzbyBtYWtlIGl0cyBiYXNlIG1ldGhvZCBiZSB0aGUgbm9vcCBtZXRob2Rcblx0XHRcdFx0bWV0aG9kXG5cdFx0XHQpO1xuXHRcdG1ldGhvZC5fZCA9IDE7IC8vIEFkZCBmbGFnIHRoYXQgdGhpcyBpcyBhIGRlcml2ZWQgbWV0aG9kXG5cdH1cblx0cmV0dXJuIG1ldGhvZDtcbn1cblxuZnVuY3Rpb24gdGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHgpIHtcblx0Zm9yICh2YXIgcHJvcCBpbiB0YWdDdHgucHJvcHMpIHtcblx0XHRpZiAockhhc0hhbmRsZXJzLnRlc3QocHJvcCkpIHtcblx0XHRcdHRhZ1twcm9wXSA9IGdldE1ldGhvZCh0YWdbcHJvcF0sIHRhZ0N0eC5wcm9wc1twcm9wXSk7XG5cdFx0XHQvLyBDb3B5IG92ZXIgdGhlIG9uRm9vIHByb3BzLCBjb252ZXJ0IGFuZCBjb252ZXJ0QmFjayBmcm9tIHRhZ0N0eC5wcm9wcyB0byB0YWcgKG92ZXJyaWRlcyB2YWx1ZXMgaW4gdGFnRGVmKS5cblx0XHRcdC8vIE5vdGU6IHVuc3VwcG9ydGVkIHNjZW5hcmlvOiBpZiBoYW5kbGVycyBhcmUgZHluYW1pY2FsbHkgYWRkZWQgXm9uRm9vPWV4cHJlc3Npb24gdGhpcyB3aWxsIHdvcmssIGJ1dCBkeW5hbWljYWxseSByZW1vdmluZyB3aWxsIG5vdCB3b3JrLlxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiByZXRWYWwodmFsKSB7XG5cdHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7XG5cdHJldHVybiBcIlwiO1xufVxuXG5mdW5jdGlvbiBkYmdCcmVhayh2YWwpIHtcblx0Ly8gVXNhZ2UgZXhhbXBsZXM6IHt7ZGJnOi4uLn19LCB7ezp+ZGJnKC4uLil9fSwge3tkYmcgLi4uL319LCB7Xntmb3IgLi4uIG9uQWZ0ZXJMaW5rPX5kYmd9fSBldGMuXG5cdHRyeSB7XG5cdFx0Y29uc29sZS5sb2coXCJKc1JlbmRlciBkYmcgYnJlYWtwb2ludDogXCIgKyB2YWwpO1xuXHRcdHRocm93IFwiZGJnIGJyZWFrcG9pbnRcIjsgLy8gVG8gYnJlYWsgaGVyZSwgc3RvcCBvbiBjYXVnaHQgZXhjZXB0aW9ucy5cblx0fVxuXHRjYXRjaCAoZSkge31cblx0cmV0dXJuIHRoaXMuYmFzZSA/IHRoaXMuYmFzZUFwcGx5KGFyZ3VtZW50cykgOiB2YWw7XG59XG5cbmZ1bmN0aW9uIEpzVmlld3NFcnJvcihtZXNzYWdlKSB7XG5cdC8vIEVycm9yIGV4Y2VwdGlvbiB0eXBlIGZvciBKc1ZpZXdzL0pzUmVuZGVyXG5cdC8vIE92ZXJyaWRlIG9mICQudmlld3Muc3ViLkVycm9yIGlzIHBvc3NpYmxlXG5cdHRoaXMubmFtZSA9ICgkLmxpbmsgPyBcIkpzVmlld3NcIiA6IFwiSnNSZW5kZXJcIikgKyBcIiBFcnJvclwiO1xuXHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IHRoaXMubmFtZTtcbn1cblxuZnVuY3Rpb24gJGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuXHRmb3IgKHZhciBuYW1lIGluIHNvdXJjZSkge1xuXHRcdHRhcmdldFtuYW1lXSA9IHNvdXJjZVtuYW1lXTtcblx0fVxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4oSnNWaWV3c0Vycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpKS5jb25zdHJ1Y3RvciA9IEpzVmlld3NFcnJvcjtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AtbGV2ZWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vPT09PT09PT09PT09PT09PT09PVxuLy8gdmlld3MuZGVsaW1pdGVyc1xuLy89PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uICR2aWV3c0RlbGltaXRlcnMob3BlbkNoYXJzLCBjbG9zZUNoYXJzLCBsaW5rKSB7XG5cdC8vIFNldCB0aGUgdGFnIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyBhbmQgJ2xpbmsnIGNoYXJhY3Rlci4gRGVmYXVsdCBpcyBcInt7XCIsIFwifX1cIiBhbmQgXCJeXCJcblx0Ly8gb3BlbkNoYXJzLCBjbG9zZUNoYXJzOiBvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MsIGVhY2ggd2l0aCB0d28gY2hhcmFjdGVyc1xuXHRpZiAoIW9wZW5DaGFycykge1xuXHRcdHJldHVybiAkc3ViU2V0dGluZ3MuZGVsaW1pdGVycztcblx0fVxuXHRpZiAoJGlzQXJyYXkob3BlbkNoYXJzKSkge1xuXHRcdHJldHVybiAkdmlld3NEZWxpbWl0ZXJzLmFwcGx5KCR2aWV3cywgb3BlbkNoYXJzKTtcblx0fVxuXG5cdCRzdWJTZXR0aW5ncy5kZWxpbWl0ZXJzID0gW29wZW5DaGFycywgY2xvc2VDaGFycywgbGlua0NoYXIgPSBsaW5rID8gbGluay5jaGFyQXQoMCkgOiBsaW5rQ2hhcl07XG5cblx0ZGVsaW1PcGVuQ2hhcjAgPSBvcGVuQ2hhcnMuY2hhckF0KDApOyAvLyBFc2NhcGUgdGhlIGNoYXJhY3RlcnMgLSBzaW5jZSB0aGV5IGNvdWxkIGJlIHJlZ2V4IHNwZWNpYWwgY2hhcmFjdGVyc1xuXHRkZWxpbU9wZW5DaGFyMSA9IG9wZW5DaGFycy5jaGFyQXQoMSk7XG5cdGRlbGltQ2xvc2VDaGFyMCA9IGNsb3NlQ2hhcnMuY2hhckF0KDApO1xuXHRkZWxpbUNsb3NlQ2hhcjEgPSBjbG9zZUNoYXJzLmNoYXJBdCgxKTtcblx0b3BlbkNoYXJzID0gXCJcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxOyAvLyBEZWZhdWx0IGlzIFwie157XCJcblx0Y2xvc2VDaGFycyA9IFwiXFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCJcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjE7ICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgXCJ9fVwiXG5cdC8vIEJ1aWxkIHJlZ2V4IHdpdGggbmV3IGRlbGltaXRlcnNcblx0Ly8gICAgICAgICAgW3RhZyAgICAoZm9sbG93ZWQgYnkgLyBzcGFjZSBvciB9KSAgb3IgY3Z0citjb2xvbiBvciBodG1sIG9yIGNvZGVdIGZvbGxvd2VkIGJ5IHNwYWNlK3BhcmFtcyB0aGVuIGNvbnZlcnRCYWNrP1xuXHRyVGFnID0gXCIoPzooXFxcXHcrKD89W1xcXFwvXFxcXHNcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl0pKXwoXFxcXHcrKT8oOil8KD4pfChcXFxcKikpXFxcXHMqKCg/OlteXFxcXFwiXG5cdFx0KyBkZWxpbUNsb3NlQ2hhcjAgKyBcIl18XFxcXFwiICsgZGVsaW1DbG9zZUNoYXIwICsgXCIoPyFcXFxcXCIgKyBkZWxpbUNsb3NlQ2hhcjEgKyBcIikpKj8pXCI7XG5cblx0Ly8gTWFrZSByVGFnIGF2YWlsYWJsZSB0byBKc1ZpZXdzIChvciBvdGhlciBjb21wb25lbnRzKSBmb3IgcGFyc2luZyBiaW5kaW5nIGV4cHJlc3Npb25zXG5cdCRzdWIuclRhZyA9IFwiKD86XCIgKyByVGFnICsgXCIpXCI7XG5cdC8vICAgICAgICAgICAgICAgICAgICAgICAgeyBePyB7ICAgdGFnK3BhcmFtcyBzbGFzaD8gIG9yIGNsb3NpbmdUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBjb21tZW50XG5cdHJUYWcgPSBuZXcgUmVnRXhwKFwiKD86XCIgKyBvcGVuQ2hhcnMgKyByVGFnICsgXCIoXFxcXC8pP3xcXFxcXCIgKyBkZWxpbU9wZW5DaGFyMCArIFwiKFxcXFxcIiArIGxpbmtDaGFyICsgXCIpP1xcXFxcIiArIGRlbGltT3BlbkNoYXIxICsgXCIoPzooPzpcXFxcLyhcXFxcdyspKVxcXFxzKnwhLS1bXFxcXHNcXFxcU10qPy0tKSlcIiArIGNsb3NlQ2hhcnMsIFwiZ1wiKTtcblxuXHQvLyBEZWZhdWx0OiAgYmluZCAgICAgdGFnTmFtZSAgICAgICAgIGN2dCAgIGNsbiBodG1sIGNvZGUgICAgcGFyYW1zICAgICAgICAgICAgc2xhc2ggICBiaW5kMiAgICAgICAgIGNsb3NlQmxrICBjb21tZW50XG5cdC8vICAgICAgLyg/OnsoXFxeKT97KD86KFxcdysoPz1bXFwvXFxzfV0pKXwoXFx3Kyk/KDopfCg+KXwoXFwqKSlcXHMqKCg/OltefV18fSg/IX0pKSo/KShcXC8pP3x7KFxcXik/eyg/Oig/OlxcLyhcXHcrKSlcXHMqfCEtLVtcXHNcXFNdKj8tLSkpfX1cblxuXHQkc3ViLnJUbXBsID0gbmV3IFJlZ0V4cChcIjwuKj58KFteXFxcXFxcXFxdfF4pW3t9XXxcIiArIG9wZW5DaGFycyArIFwiLipcIiArIGNsb3NlQ2hhcnMpO1xuXHQvLyAkc3ViLnJUbXBsIGxvb2tzIGZvciBodG1sIHRhZ3Mgb3IgeyBvciB9IGNoYXIgbm90IHByZWNlZGVkIGJ5IFxcXFwsIG9yIEpzUmVuZGVyIHRhZ3Mge3t4eHh9fS4gRWFjaCBvZiB0aGVzZSBzdHJpbmdzIGFyZSBjb25zaWRlcmVkXG5cdC8vIE5PVCB0byBiZSBqUXVlcnkgc2VsZWN0b3JzXG5cdHJldHVybiAkdmlld3NTZXR0aW5ncztcbn1cblxuLy89PT09PT09PT1cbi8vIFZpZXcuZ2V0XG4vLz09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRWaWV3KGlubmVyLCB0eXBlKSB7IC8vdmlldy5nZXQoaW5uZXIsIHR5cGUpXG5cdGlmICghdHlwZSAmJiBpbm5lciAhPT0gdHJ1ZSkge1xuXHRcdC8vIHZpZXcuZ2V0KHR5cGUpXG5cdFx0dHlwZSA9IGlubmVyO1xuXHRcdGlubmVyID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dmFyIHZpZXdzLCBpLCBsLCBmb3VuZCxcblx0XHR2aWV3ID0gdGhpcyxcblx0XHRyb290ID0gIXR5cGUgfHwgdHlwZSA9PT0gXCJyb290XCI7XG5cdFx0Ly8gSWYgdHlwZSBpcyB1bmRlZmluZWQsIHJldHVybnMgcm9vdCB2aWV3ICh2aWV3IHVuZGVyIHRvcCB2aWV3KS5cblxuXHRpZiAoaW5uZXIpIHtcblx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgbmVzdGVkIG9uZXMsIGRlcHRoLWZpcnN0IC0gYW5kIHJldHVybiBmaXJzdCBvbmUgd2l0aCBnaXZlbiB0eXBlLlxuXHRcdC8vIElmIHR5cGUgaXMgdW5kZWZpbmVkLCBpLmUuIHZpZXcuZ2V0KHRydWUpLCByZXR1cm4gZmlyc3QgY2hpbGQgdmlldy5cblx0XHRmb3VuZCA9IHR5cGUgJiYgdmlldy50eXBlID09PSB0eXBlICYmIHZpZXc7XG5cdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0dmlld3MgPSB2aWV3LnZpZXdzO1xuXHRcdFx0aWYgKHZpZXcuXy51c2VLZXkpIHtcblx0XHRcdFx0Zm9yIChpIGluIHZpZXdzKSB7XG5cdFx0XHRcdFx0aWYgKGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGkgPSAwLCBsID0gdmlld3MubGVuZ3RoOyAhZm91bmQgJiYgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdGZvdW5kID0gdHlwZSA/IHZpZXdzW2ldLmdldChpbm5lciwgdHlwZSkgOiB2aWV3c1tpXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChyb290KSB7XG5cdFx0Ly8gRmluZCByb290IHZpZXcuICh2aWV3IHdob3NlIHBhcmVudCBpcyB0b3Agdmlldylcblx0XHR3aGlsZSAodmlldy5wYXJlbnQpIHtcblx0XHRcdGZvdW5kID0gdmlldztcblx0XHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0d2hpbGUgKHZpZXcgJiYgIWZvdW5kKSB7XG5cdFx0XHQvLyBHbyB0aHJvdWdoIHZpZXdzIC0gdGhpcyBvbmUsIGFuZCBhbGwgcGFyZW50IG9uZXMgLSBhbmQgcmV0dXJuIGZpcnN0IG9uZSB3aXRoIGdpdmVuIHR5cGUuXG5cdFx0XHRmb3VuZCA9IHZpZXcudHlwZSA9PT0gdHlwZSA/IHZpZXcgOiB1bmRlZmluZWQ7XG5cdFx0XHR2aWV3ID0gdmlldy5wYXJlbnQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkSW5kZXgoKSB7XG5cdHZhciB2aWV3ID0gdGhpcy5nZXQoXCJpdGVtXCIpO1xuXHRyZXR1cm4gdmlldyA/IHZpZXcuaW5kZXggOiB1bmRlZmluZWQ7XG59XG5cbmdldE5lc3RlZEluZGV4LmRlcGVuZHMgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIFt0aGlzLmdldChcIml0ZW1cIiksIFwiaW5kZXhcIl07XG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleCgpIHtcblx0cmV0dXJuIHRoaXMuaW5kZXg7XG59XG5cbmdldEluZGV4LmRlcGVuZHMgPSBcImluZGV4XCI7XG5cbi8vPT09PT09PT09PVxuLy8gVmlldy5obHBcbi8vPT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRIZWxwZXIoaGVscGVyLCBpc0NvbnRleHRDYikge1xuXHQvLyBIZWxwZXIgbWV0aG9kIGNhbGxlZCBhcyB2aWV3LmhscChrZXkpIGZyb20gY29tcGlsZWQgdGVtcGxhdGUsIGZvciBoZWxwZXJzIG9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgfmZvb1xuXHR2YXIgd3JhcHBlZCwgZGVwcyxcblx0dmlldyA9IHRoaXMsXG5cdHJlcyA9IHZpZXcuY3R4O1xuXG5cdGlmIChyZXMpIHtcblx0XHRyZXMgPSByZXNbaGVscGVyXTtcblx0fVxuXHRpZiAocmVzID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXMgPSAkaGVscGVyc1toZWxwZXJdO1xuXHR9XG5cdGlmIChyZXMgJiYgcmVzLl9jcCkgeyAvLyBJZiB0aGlzIGhlbHBlciByZXNvdXJjZSBpcyBhIGNvbnRleHR1YWwgcGFyYW1ldGVyLCB+Zm9vPWV4cHJcblx0XHRpZiAoaXNDb250ZXh0Q2IpIHsgIC8vIEluIGEgY29udGV4dCBjYWxsYmFjayBmb3IgYSBjb250ZXh0dWFsIHBhcmFtLCByZXR1cm4gdGhlIFt2aWV3LCBkZXBlbmRlbmNpZXMuLi5dIGFycmF5IC0gbmVlZGVkIGZvciBvYnNlcnZlIGNhbGxcblx0XHRcdGRlcHMgPSAkc3ViLl9jZW8ocmVzWzFdLmRlcHMpOyAgLy8gZm4gZGVwcywgd2l0aCBhbnkgZXhwck9icyBjbG9uZWRcblx0XHRcdGRlcHMudW5zaGlmdChyZXNbMF0pOyAgICAgICAgICAgLy8gdmlld1xuXHRcdFx0ZGVwcy5fY3AgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIGRlcHM7XG5cdFx0fVxuXHRcdHJlcyA9ICR2aWV3cy5nZXRDdHgocmVzKTsgLy8gSWYgYSBjb250ZXh0dWFsIHBhcmFtLCBidXQgbm90IGEgY29udGV4dCBjYWxsYmFjaywgcmV0dXJuIGV2YWx1YXRlZCBwYXJhbSAtIGZuKGRhdGEsIHZpZXcsIGopXG5cdH1cblxuXHRpZiAocmVzKSB7XG5cdFx0aWYgKCRpc0Z1bmN0aW9uKHJlcykgJiYgIXJlcy5fd3JwKSB7XG5cdFx0XHQvLyBJZiBpdCBpcyBvZiB0eXBlIGZ1bmN0aW9uLCBhbmQgbm90IGFscmVhZHkgd3JhcHBlZCwgd2Ugd2lsbCB3cmFwIGl0LCBzbyBpZiBjYWxsZWQgd2l0aCBubyB0aGlzIHBvaW50ZXIgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcblx0XHRcdC8vIHZpZXcgYXMgJ3RoaXMnIGNvbnRleHQuIElmIHRoZSBoZWxwZXIgfmZvbygpIHdhcyBpbiBhIGRhdGEtbGluayBleHByZXNzaW9uLCB0aGUgdmlldyB3aWxsIGhhdmUgYSAndGVtcG9yYXJ5JyBsaW5rQ3R4IHByb3BlcnR5IHRvby5cblx0XHRcdC8vIE5vdGUgdGhhdCBoZWxwZXIgZnVuY3Rpb25zIG9uIGRlZXBlciBwYXRocyB3aWxsIGhhdmUgc3BlY2lmaWMgdGhpcyBwb2ludGVycywgZnJvbSB0aGUgcHJlY2VkaW5nIHBhdGguXG5cdFx0XHQvLyBGb3IgZXhhbXBsZSwgfnV0aWwuZm9vKCkgd2lsbCBoYXZlIHRoZSB+dXRpbCBvYmplY3QgYXMgJ3RoaXMnIHBvaW50ZXJcblx0XHRcdHdyYXBwZWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHJlcy5hcHBseSgoIXRoaXMgfHwgdGhpcyA9PT0gZ2xvYmFsKSA/IHZpZXcgOiB0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcblx0XHRcdHdyYXBwZWQuX3dycCA9IHZpZXc7XG5cdFx0XHQkZXh0ZW5kKHdyYXBwZWQsIHJlcyk7IC8vIEF0dGFjaCBzYW1lIGV4cGFuZG9zIChpZiBhbnkpIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uXG5cdFx0fVxuXHR9XG5cdHJldHVybiB3cmFwcGVkIHx8IHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0VGVtcGxhdGUodG1wbCkge1xuXHRyZXR1cm4gdG1wbCAmJiAodG1wbC5mblxuXHRcdD8gdG1wbFxuXHRcdDogdGhpcy5nZXRSc2MoXCJ0ZW1wbGF0ZXNcIiwgdG1wbCkgfHwgJHRlbXBsYXRlcyh0bXBsKSk7IC8vIG5vdCB5ZXQgY29tcGlsZWRcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gdmlld3MuX2NudnRcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29udmVydFZhbChjb252ZXJ0ZXIsIHZpZXcsIHRhZ0N0eCwgb25FcnJvcikge1xuXHQvLyBzZWxmIGlzIHRlbXBsYXRlIG9iamVjdCBvciBsaW5rQ3R4IG9iamVjdFxuXHR2YXIgdGFnLCB2YWx1ZSxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhcblx0XHRib3VuZFRhZyA9IHR5cGVvZiB0YWdDdHggPT09IFwibnVtYmVyXCIgJiYgdmlldy50bXBsLmJuZHNbdGFnQ3R4LTFdLFxuXHRcdGxpbmtDdHggPSB2aWV3LmxpbmtDdHg7IC8vIEZvciBkYXRhLWxpbms9XCJ7Y3Z0Oi4uLn1cIi4uLlxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YWdDdHggPSBvbkVycm9yID0ge3Byb3BzOiB7fSwgYXJnczogW29uRXJyb3JdfTtcblx0fSBlbHNlIGlmIChib3VuZFRhZykge1xuXHRcdHRhZ0N0eCA9IGJvdW5kVGFnKHZpZXcuZGF0YSwgdmlldywgJHN1Yik7XG5cdH1cblxuXHR2YWx1ZSA9IHRhZ0N0eC5hcmdzWzBdO1xuXHRpZiAoY29udmVydGVyIHx8IGJvdW5kVGFnKSB7XG5cdFx0dGFnID0gbGlua0N0eCAmJiBsaW5rQ3R4LnRhZztcblx0XHRpZiAoIXRhZykge1xuXHRcdFx0dGFnID0gJGV4dGVuZChuZXcgJHN1Yi5fdGcoKSwge1xuXHRcdFx0XHRfOiB7XG5cdFx0XHRcdFx0aW5saW5lOiAhbGlua0N0eCxcblx0XHRcdFx0XHRibmQ6IGJvdW5kVGFnLFxuXHRcdFx0XHRcdHVubGlua2VkOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRhZ05hbWU6IFwiOlwiLFxuXHRcdFx0XHRjdnQ6IGNvbnZlcnRlcixcblx0XHRcdFx0ZmxvdzogdHJ1ZSxcblx0XHRcdFx0dGFnQ3R4OiB0YWdDdHhcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0bGlua0N0eC50YWcgPSB0YWc7XG5cdFx0XHRcdHRhZy5saW5rQ3R4ID0gbGlua0N0eDtcblx0XHRcdH1cblx0XHRcdHRhZ0N0eC5jdHggPSBleHRlbmRDdHgodGFnQ3R4LmN0eCwgKGxpbmtDdHggPyBsaW5rQ3R4LnZpZXcgOiB2aWV3KS5jdHgpO1xuXHRcdH1cblx0XHR0YWcuX2VyID0gb25FcnJvciAmJiB2YWx1ZTtcblx0XHR0YWdIYW5kbGVyc0Zyb21Qcm9wcyh0YWcsIHRhZ0N0eCk7XG5cblx0XHR0YWdDdHgudmlldyA9IHZpZXc7XG5cblx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eCB8fCB0YWcuY3R4IHx8IHt9O1xuXHRcdHRhZ0N0eC5jdHggPSB1bmRlZmluZWQ7XG5cblx0XHR2YWx1ZSA9IHRhZy5jdnRBcmdzKGNvbnZlcnRlciAhPT0gXCJ0cnVlXCIgJiYgY29udmVydGVyKVswXTsgLy8gSWYgdGhlcmUgaXMgYSBjb252ZXJ0QmFjayBidXQgbm8gY29udmVydCwgY29udmVydGVyIHdpbGwgYmUgXCJ0cnVlXCJcblxuXHRcdC8vIENhbGwgb25SZW5kZXIgKHVzZWQgYnkgSnNWaWV3cyBpZiBwcmVzZW50LCB0byBhZGQgYmluZGluZyBhbm5vdGF0aW9ucyBhcm91bmQgcmVuZGVyZWQgY29udGVudClcblx0XHR2YWx1ZSA9IGJvdW5kVGFnICYmIHZpZXcuXy5vblJlbmRlclxuXHRcdFx0PyB2aWV3Ll8ub25SZW5kZXIodmFsdWUsIHZpZXcsIHRhZylcblx0XHRcdDogdmFsdWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9IHVuZGVmaW5lZCA/IHZhbHVlIDogXCJcIjtcbn1cblxuZnVuY3Rpb24gY29udmVydEFyZ3MoY29udmVydGVyKSB7XG5cdHZhciB0YWcgPSB0aGlzLFxuXHRcdHRhZ0N0eCA9IHRhZy50YWdDdHgsXG5cdFx0dmlldyA9IHRhZ0N0eC52aWV3LFxuXHRcdGFyZ3MgPSB0YWdDdHguYXJncztcblxuXHRjb252ZXJ0ZXIgPSBjb252ZXJ0ZXIgfHwgdGFnLmNvbnZlcnQ7XG5cdGNvbnZlcnRlciA9IGNvbnZlcnRlciAmJiAoXCJcIiArIGNvbnZlcnRlciA9PT0gY29udmVydGVyXG5cdFx0PyAodmlldy5nZXRSc2MoXCJjb252ZXJ0ZXJzXCIsIGNvbnZlcnRlcikgfHwgZXJyb3IoXCJVbmtub3duIGNvbnZlcnRlcjogJ1wiICsgY29udmVydGVyICsgXCInXCIpKVxuXHRcdDogY29udmVydGVyKTtcblxuXHRhcmdzID0gIWFyZ3MubGVuZ3RoICYmICF0YWdDdHguaW5kZXggLy8gT24gdGhlIG9wZW5pbmcgdGFnIHdpdGggbm8gYXJncywgYmluZCB0byB0aGUgY3VycmVudCBkYXRhIGNvbnRleHRcblx0XHQ/IFt2aWV3LmRhdGFdXG5cdFx0OiBjb252ZXJ0ZXJcblx0XHRcdD8gYXJncy5zbGljZSgpIC8vIElmIHRoZXJlIGlzIGEgY29udmVydGVyLCB1c2UgYSBjb3B5IG9mIHRoZSB0YWdDdHguYXJncyBhcnJheSBmb3IgcmVuZGVyaW5nLCBhbmQgcmVwbGFjZSB0aGUgYXJnc1swXSBpblxuXHRcdFx0Ly8gdGhlIGNvcGllZCBhcnJheSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUuIEJ1dCB3ZSBkbyBub3QgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0YWcudGFnQ3R4LmFyZ3NbMF0gKHRoZSBvcmlnaW5hbCBhcmdzIGFycmF5KVxuXHRcdFx0OiBhcmdzOyAvLyBJZiBubyBjb252ZXJ0ZXIsIGdldCB0aGUgb3JpZ2luYWwgdGFnQ3R4LmFyZ3NcblxuXHRpZiAoY29udmVydGVyKSB7XG5cdFx0aWYgKGNvbnZlcnRlci5kZXBlbmRzKSB7XG5cdFx0XHR0YWcuZGVwZW5kcyA9ICRzdWIuZ2V0RGVwcyh0YWcuZGVwZW5kcywgdGFnLCBjb252ZXJ0ZXIuZGVwZW5kcywgY29udmVydGVyKTtcblx0XHR9XG5cdFx0YXJnc1swXSA9IGNvbnZlcnRlci5hcHBseSh0YWcsIGFyZ3MpO1xuXHR9XG5cdHJldHVybiBhcmdzO1xufVxuXG4vLz09PT09PT09PT09PT1cbi8vIHZpZXdzLl90YWdcbi8vPT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZVR5cGUsIGl0ZW1OYW1lKSB7XG5cdHZhciByZXMsIHN0b3JlLFxuXHRcdHZpZXcgPSB0aGlzO1xuXHR3aGlsZSAoKHJlcyA9PT0gdW5kZWZpbmVkKSAmJiB2aWV3KSB7XG5cdFx0c3RvcmUgPSB2aWV3LnRtcGwgJiYgdmlldy50bXBsW3Jlc291cmNlVHlwZV07XG5cdFx0cmVzID0gc3RvcmUgJiYgc3RvcmVbaXRlbU5hbWVdO1xuXHRcdHZpZXcgPSB2aWV3LnBhcmVudDtcblx0fVxuXHRyZXR1cm4gcmVzIHx8ICR2aWV3c1tyZXNvdXJjZVR5cGVdW2l0ZW1OYW1lXTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyVGFnKHRhZ05hbWUsIHBhcmVudFZpZXcsIHRtcGwsIHRhZ0N0eHMsIGlzVXBkYXRlLCBvbkVycm9yKSB7XG5cdHBhcmVudFZpZXcgPSBwYXJlbnRWaWV3IHx8IHRvcFZpZXc7XG5cdHZhciB0YWcsIHRhZ18sIHRhZ0RlZiwgdGVtcGxhdGUsIHRhZ3MsIGF0dHIsIHBhcmVudFRhZywgaSwgbCwgaXRlbVJldCwgdGFnQ3R4LCB0YWdDdHhDdHgsXG5cdFx0Y29udGVudCwgY2FsbEluaXQsIG1hcERlZiwgdGhpc01hcCwgYXJncywgcHJvcHMsIGluaXRpYWxUbXBsLCB0YWdEYXRhTWFwLCBjb250ZW50Q3R4LFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0bGlua0N0eCA9IHBhcmVudFZpZXcubGlua0N0eCB8fCAwLFxuXHRcdGN0eCA9IHBhcmVudFZpZXcuY3R4LFxuXHRcdHBhcmVudFRtcGwgPSB0bXBsIHx8IHBhcmVudFZpZXcudG1wbCxcblx0XHQvLyBpZiB0YWdDdHggaXMgYW4gaW50ZWdlciwgdGhlbiBpdCBpcyB0aGUga2V5IGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBib3VuZFRhZyB0YWdDdHhzXG5cdFx0Ym91bmRUYWcgPSB0eXBlb2YgdGFnQ3R4cyA9PT0gXCJudW1iZXJcIiAmJiBwYXJlbnRWaWV3LnRtcGwuYm5kc1t0YWdDdHhzLTFdO1xuXG5cdGlmICh0YWdOYW1lLl9pcyA9PT0gXCJ0YWdcIikge1xuXHRcdHRhZyA9IHRhZ05hbWU7XG5cdFx0dGFnTmFtZSA9IHRhZy50YWdOYW1lO1xuXHRcdHRhZ0N0eHMgPSB0YWcudGFnQ3R4cztcblx0XHR0ZW1wbGF0ZSA9IHRhZy50ZW1wbGF0ZTtcblx0fSBlbHNlIHtcblx0XHR0YWdEZWYgPSBwYXJlbnRWaWV3LmdldFJzYyhcInRhZ3NcIiwgdGFnTmFtZSkgfHwgZXJyb3IoXCJVbmtub3duIHRhZzoge3tcIiArIHRhZ05hbWUgKyBcIn19IFwiKTtcblx0XHR0ZW1wbGF0ZSA9IHRhZ0RlZi50ZW1wbGF0ZTtcblx0fVxuXG5cdGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXQgKz0gb25FcnJvcjtcblx0XHR0YWdDdHhzID0gb25FcnJvciA9IFt7cHJvcHM6IHt9LCBhcmdzOiBbXX1dO1xuXHR9IGVsc2UgaWYgKGJvdW5kVGFnKSB7XG5cdFx0dGFnQ3R4cyA9IGJvdW5kVGFnKHBhcmVudFZpZXcuZGF0YSwgcGFyZW50VmlldywgJHN1Yik7XG5cdH1cblxuXHRsID0gdGFnQ3R4cy5sZW5ndGg7XG5cdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHR0YWdDdHggPSB0YWdDdHhzW2ldO1xuXHRcdGlmICghbGlua0N0eCB8fCAhbGlua0N0eC50YWcgfHwgaSAmJiAhbGlua0N0eC50YWcuXy5pbmxpbmUgfHwgdGFnLl9lcikge1xuXHRcdFx0Ly8gSW5pdGlhbGl6ZSB0YWdDdHhcblx0XHRcdC8vIEZvciBibG9jayB0YWdzLCB0YWdDdHgudG1wbCBpcyBhbiBpbnRlZ2VyID4gMFxuXHRcdFx0aWYgKGNvbnRlbnQgPSBwYXJlbnRUbXBsLnRtcGxzICYmIHRhZ0N0eC50bXBsKSB7XG5cdFx0XHRcdGNvbnRlbnQgPSB0YWdDdHguY29udGVudCA9IHBhcmVudFRtcGwudG1wbHNbY29udGVudCAtIDFdO1xuXHRcdFx0fVxuXHRcdFx0dGFnQ3R4LmluZGV4ID0gaTtcblx0XHRcdHRhZ0N0eC50bXBsID0gY29udGVudDsgLy8gU2V0IHRoZSB0bXBsIHByb3BlcnR5IHRvIHRoZSBjb250ZW50IG9mIHRoZSBibG9jayB0YWdcblx0XHRcdHRhZ0N0eC5yZW5kZXIgPSByZW5kZXJDb250ZW50O1xuXHRcdFx0dGFnQ3R4LnZpZXcgPSBwYXJlbnRWaWV3O1xuXHRcdFx0dGFnQ3R4LmN0eCA9IGV4dGVuZEN0eCh0YWdDdHguY3R4LCBjdHgpOyAvLyBDbG9uZSBhbmQgZXh0ZW5kIHBhcmVudFZpZXcuY3R4XG5cdFx0fVxuXHRcdGlmICh0bXBsID0gdGFnQ3R4LnByb3BzLnRtcGwpIHtcblx0XHRcdC8vIElmIHRoZSB0bXBsIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4sIHNldCB0aGUgdmFsdWUgKHdoZW4gaW5pdGlhbGl6aW5nLCBvciwgaW4gY2FzZSBvZiBiaW5kaW5nOiBedG1wbD0uLi4sIHdoZW4gdXBkYXRpbmcpXG5cdFx0XHR0YWdDdHgudG1wbCA9IHBhcmVudFZpZXcuZ2V0VG1wbCh0bXBsKTtcblx0XHR9XG5cblx0XHRpZiAoIXRhZykge1xuXHRcdFx0Ly8gVGhpcyB3aWxsIG9ubHkgYmUgaGl0IGZvciBpbml0aWFsIHRhZ0N0eCAobm90IGZvciB7e2Vsc2V9fSkgLSBpZiB0aGUgdGFnIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0IHlldFxuXHRcdFx0Ly8gSW5zdGFudGlhdGUgdGFnIGlmIGl0IGRvZXMgbm90IHlldCBleGlzdFxuXHRcdFx0Ly8gSWYgdGhlIHRhZyBoYXMgbm90IGFscmVhZHkgYmVlbiBpbnN0YW50aWF0ZWQsIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGluc3RhbmNlLlxuXHRcdFx0Ly8gfnRhZyB3aWxsIGFjY2VzcyB0aGUgdGFnLCBldmVuIHdpdGhpbiB0aGUgcmVuZGVyaW5nIG9mIHRoZSB0ZW1wbGF0ZSBjb250ZW50IG9mIHRoaXMgdGFnLlxuXHRcdFx0Ly8gRnJvbSBjaGlsZC9kZXNjZW5kYW50IHRhZ3MsIGNhbiBhY2Nlc3MgdXNpbmcgfnRhZy5wYXJlbnQsIG9yIH5wYXJlbnRUYWdzLnRhZ05hbWVcblx0XHRcdHRhZyA9IG5ldyB0YWdEZWYuX2N0cigpO1xuXHRcdFx0Y2FsbEluaXQgPSAhIXRhZy5pbml0O1xuXG5cdFx0XHR0YWcucGFyZW50ID0gcGFyZW50VGFnID0gY3R4ICYmIGN0eC50YWc7XG5cdFx0XHR0YWcudGFnQ3R4cyA9IHRhZ0N0eHM7XG5cdFx0XHR0YWdEYXRhTWFwID0gdGFnLmRhdGFNYXA7XG5cblx0XHRcdGlmIChsaW5rQ3R4KSB7XG5cdFx0XHRcdHRhZy5fLmlubGluZSA9IGZhbHNlO1xuXHRcdFx0XHRsaW5rQ3R4LnRhZyA9IHRhZztcblx0XHRcdFx0dGFnLmxpbmtDdHggPSBsaW5rQ3R4O1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhZy5fLmJuZCA9IGJvdW5kVGFnIHx8IGxpbmtDdHguZm4pIHtcblx0XHRcdFx0Ly8gQm91bmQgaWYge157dGFnLi4ufX0gb3IgZGF0YS1saW5rPVwie3RhZy4uLn1cIlxuXHRcdFx0XHR0YWcuXy5hcnJWd3MgPSB7fTtcblx0XHRcdH0gZWxzZSBpZiAodGFnLmRhdGFCb3VuZE9ubHkpIHtcblx0XHRcdFx0ZXJyb3IoXCJ7XntcIiArIHRhZ05hbWUgKyBcIn19IHRhZyBtdXN0IGJlIGRhdGEtYm91bmRcIik7XG5cdFx0XHR9XG5cdFx0XHQvL1RPRE8gYmV0dGVyIHBlcmYgZm9yIGNoaWxkVGFncygpIC0ga2VlcCBjaGlsZCB0YWcudGFncyBhcnJheSwgKGFuZCByZW1vdmUgY2hpbGQsIHdoZW4gZGlzcG9zZWQpXG5cdFx0XHQvLyB0YWcudGFncyA9IFtdO1xuXHRcdH1cblx0XHR0YWdDdHhzID0gdGFnLnRhZ0N0eHM7XG5cdFx0dGFnRGF0YU1hcCA9IHRhZy5kYXRhTWFwO1xuXG5cdFx0dGFnQ3R4LnRhZyA9IHRhZztcblx0XHRpZiAodGFnRGF0YU1hcCAmJiB0YWdDdHhzKSB7XG5cdFx0XHR0YWdDdHgubWFwID0gdGFnQ3R4c1tpXS5tYXA7IC8vIENvcHkgb3ZlciB0aGUgY29tcGlsZWQgbWFwIGluc3RhbmNlIGZyb20gdGhlIHByZXZpb3VzIHRhZ0N0eHMgdG8gdGhlIHJlZnJlc2hlZCBvbmVzXG5cdFx0fVxuXHRcdGlmICghdGFnLmZsb3cpIHtcblx0XHRcdHRhZ0N0eEN0eCA9IHRhZ0N0eC5jdHggPSB0YWdDdHguY3R4IHx8IHt9O1xuXG5cdFx0XHQvLyB0YWdzIGhhc2g6IHRhZy5jdHgudGFncywgbWVyZ2VkIHdpdGggcGFyZW50Vmlldy5jdHgudGFncyxcblx0XHRcdHRhZ3MgPSB0YWcucGFyZW50cyA9IHRhZ0N0eEN0eC5wYXJlbnRUYWdzID0gY3R4ICYmIGV4dGVuZEN0eCh0YWdDdHhDdHgucGFyZW50VGFncywgY3R4LnBhcmVudFRhZ3MpIHx8IHt9O1xuXHRcdFx0aWYgKHBhcmVudFRhZykge1xuXHRcdFx0XHR0YWdzW3BhcmVudFRhZy50YWdOYW1lXSA9IHBhcmVudFRhZztcblx0XHRcdFx0Ly9UT0RPIGJldHRlciBwZXJmIGZvciBjaGlsZFRhZ3M6IHBhcmVudFRhZy50YWdzLnB1c2godGFnKTtcblx0XHRcdH1cblx0XHRcdHRhZ3NbdGFnLnRhZ05hbWVdID0gdGFnQ3R4Q3R4LnRhZyA9IHRhZztcblx0XHR9XG5cdH1cblx0aWYgKCEodGFnLl9lciA9IG9uRXJyb3IpKSB7XG5cdFx0dGFnSGFuZGxlcnNGcm9tUHJvcHModGFnLCB0YWdDdHhzWzBdKTtcblx0XHR0YWcucmVuZGVyaW5nID0ge307IC8vIFByb3ZpZGUgb2JqZWN0IGZvciBzdGF0ZSBkdXJpbmcgcmVuZGVyIGNhbGxzIHRvIHRhZyBhbmQgZWxzZXMuIChVc2VkIGJ5IHt7aWZ9fSBhbmQge3tmb3J9fS4uLilcblx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR0YWdDdHggPSB0YWcudGFnQ3R4ID0gdGFnQ3R4c1tpXTtcblx0XHRcdHByb3BzID0gdGFnQ3R4LnByb3BzO1xuXHRcdFx0YXJncyA9IHRhZy5jdnRBcmdzKCk7XG5cblx0XHRcdGlmIChtYXBEZWYgPSBwcm9wcy5kYXRhTWFwIHx8IHRhZ0RhdGFNYXApIHtcblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoIHx8IHByb3BzLmRhdGFNYXApIHtcblx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcDtcblx0XHRcdFx0XHRpZiAoIXRoaXNNYXAgfHwgdGhpc01hcC5zcmMgIT09IGFyZ3NbMF0gfHwgaXNVcGRhdGUpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzTWFwICYmIHRoaXNNYXAuc3JjKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXNNYXAudW5tYXAoKTsgLy8gb25seSBjYWxsZWQgaWYgb2JzZXJ2YWJsZSBtYXAgLSBub3Qgd2hlbiBvbmx5IHVzZWQgaW4gSnNSZW5kZXIsIGUuZy4gYnkge3twcm9wc319XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzTWFwID0gdGFnQ3R4Lm1hcCA9IG1hcERlZi5tYXAoYXJnc1swXSwgcHJvcHMsIHVuZGVmaW5lZCwgIXRhZy5fLmJuZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFyZ3MgPSBbdGhpc01hcC50Z3RdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0YWcuY3R4ID0gdGFnQ3R4LmN0eDtcblxuXHRcdFx0aWYgKCFpKSB7XG5cdFx0XHRcdGlmIChjYWxsSW5pdCkge1xuXHRcdFx0XHRcdGluaXRpYWxUbXBsID0gdGFnLnRlbXBsYXRlO1xuXHRcdFx0XHRcdHRhZy5pbml0KHRhZ0N0eCwgbGlua0N0eCwgdGFnLmN0eCk7XG5cdFx0XHRcdFx0Y2FsbEluaXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGxpbmtDdHgpIHtcblx0XHRcdFx0XHQvLyBTZXQgYXR0ciBvbiBsaW5rQ3R4IHRvIGVuc3VyZSBvdXRwdXR0aW5nIHRvIHRoZSBjb3JyZWN0IHRhcmdldCBhdHRyaWJ1dGUuXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyBlaXRoZXIgbGlua0N0eC5hdHRyIG9yIHRoaXMuYXR0ciBpbiB0aGUgaW5pdCgpIGFsbG93cyBwZXItaW5zdGFuY2UgY2hvaWNlIG9mIHRhcmdldCBhdHRyaWIuXG5cdFx0XHRcdFx0bGlua0N0eC5hdHRyID0gdGFnLmF0dHIgPSBsaW5rQ3R4LmF0dHIgfHwgdGFnLmF0dHI7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXR0ciA9IHRhZy5hdHRyO1xuXHRcdFx0XHR0YWcuXy5ub1Z3cyA9IGF0dHIgJiYgYXR0ciAhPT0gSFRNTDtcblx0XHRcdH1cblxuXHRcdFx0aXRlbVJldCA9IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0YWcucmVuZGVyKSB7XG5cdFx0XHRcdGl0ZW1SZXQgPSB0YWcucmVuZGVyLmFwcGx5KHRhZywgYXJncyk7XG5cdFx0XHRcdGlmIChwYXJlbnRWaWV3LmxpbmtlZCAmJiBpdGVtUmV0ICYmIHRhZy5saW5rZWRFbGVtICYmICFyV3JhcHBlZEluVmlld01hcmtlci50ZXN0KGl0ZW1SZXQpKSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBhIHRhZyByZW5kZXJzIGNvbnRlbnQgZnJvbSB0aGUgcmVuZGVyIG1ldGhvZCwgd2l0aCBkYXRhIGxpbmtpbmcsIGFuZCBoYXMgYSBsaW5rZWRFbGVtIGJpbmRpbmcsIHRoZW4gd2UgbmVlZCB0byB3cmFwIHdpdGhcblx0XHRcdFx0XHQvLyB2aWV3IG1hcmtlcnMsIGlmIGFic2VudCwgc28gdGhlIGNvbnRlbnQgaXMgYSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFnLCB3aGljaCB3aWxsIGNvcnJlY3RseSBkaXNwb3NlIGJpbmRpbmdzIGlmIGRlbGV0ZWQuXG5cdFx0XHRcdFx0aXRlbVJldCA9IHJlbmRlcldpdGhWaWV3cygkLnRlbXBsYXRlcyhpdGVtUmV0KSwgYXJnc1swXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHBhcmVudFZpZXcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0YWcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWFyZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdGFyZ3MgPSBbcGFyZW50Vmlld107IC8vIG5vIGFyZ3VtZW50cyAtIChlLmcuIHt7ZWxzZX19KSBnZXQgZGF0YSBjb250ZXh0IGZyb20gdmlldy5cblx0XHRcdH1cblx0XHRcdGlmIChpdGVtUmV0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGVudEN0eCA9IGFyZ3NbMF07IC8vIERlZmF1bHQgZGF0YSBjb250ZXh0IGZvciB3cmFwcGVkIGJsb2NrIGNvbnRlbnQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBEZWZpbmVkIHRhZy5jb250ZW50Q3R4IGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoaXMuXG5cdFx0XHRcdGlmICh0YWcuY29udGVudEN0eCkge1xuXHRcdFx0XHRcdGNvbnRlbnRDdHggPSB0YWcuY29udGVudEN0eChjb250ZW50Q3R4KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpdGVtUmV0ID0gdGFnQ3R4LnJlbmRlcihjb250ZW50Q3R4LCB0cnVlKSB8fCAoaXNVcGRhdGUgPyB1bmRlZmluZWQgOiBcIlwiKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vIHJldHVybiB2YWx1ZSBmcm9tIHJlbmRlciwgYW5kIG5vIHRlbXBsYXRlL2NvbnRlbnQgdGFnQ3R4LnJlbmRlciguLi4pLCBzbyByZXR1cm4gdW5kZWZpbmVkXG5cdFx0XHRyZXQgPSByZXQgPyByZXQgKyAoaXRlbVJldCB8fCBcIlwiKSA6IGl0ZW1SZXQ7IC8vIElmIG5vIHJlbmRlcmVkIGNvbnRlbnQsIHRoaXMgd2lsbCBiZSB1bmRlZmluZWRcblx0XHR9XG5cdFx0dGFnLnJlbmRlcmluZyA9IHVuZGVmaW5lZDtcblx0fVxuXHR0YWcudGFnQ3R4ID0gdGFnQ3R4c1swXTtcblx0dGFnLmN0eCA9IHRhZy50YWdDdHguY3R4O1xuXG5cdGlmICh0YWcuXy5ub1Z3cykge1xuXHRcdFx0aWYgKHRhZy5fLmlubGluZSkge1xuXHRcdFx0Ly8gaW5saW5lIHRhZyB3aXRoIGF0dHIgc2V0IHRvIFwidGV4dFwiIHdpbGwgaW5zZXJ0IEhUTUwtZW5jb2RlZCBjb250ZW50IC0gYXMgaWYgaXQgd2FzIGVsZW1lbnQtYmFzZWQgaW5uZXJUZXh0XG5cdFx0XHRyZXQgPSBhdHRyID09PSBcInRleHRcIlxuXHRcdFx0XHQ/ICRjb252ZXJ0ZXJzLmh0bWwocmV0KVxuXHRcdFx0XHQ6IFwiXCI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBib3VuZFRhZyAmJiBwYXJlbnRWaWV3Ll8ub25SZW5kZXJcblx0XHQvLyBDYWxsIG9uUmVuZGVyICh1c2VkIGJ5IEpzVmlld3MgaWYgcHJlc2VudCwgdG8gYWRkIGJpbmRpbmcgYW5ub3RhdGlvbnMgYXJvdW5kIHJlbmRlcmVkIGNvbnRlbnQpXG5cdFx0PyBwYXJlbnRWaWV3Ll8ub25SZW5kZXIocmV0LCBwYXJlbnRWaWV3LCB0YWcpXG5cdFx0OiByZXQ7XG59XG5cbi8vPT09PT09PT09PT09PT09PT1cbi8vIFZpZXcgY29uc3RydWN0b3Jcbi8vPT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gVmlldyhjb250ZXh0LCB0eXBlLCBwYXJlbnRWaWV3LCBkYXRhLCB0ZW1wbGF0ZSwga2V5LCBvblJlbmRlciwgY29udGVudFRtcGwpIHtcblx0Ly8gQ29uc3RydWN0b3IgZm9yIHZpZXcgb2JqZWN0IGluIHZpZXcgaGllcmFyY2h5LiAoQXVnbWVudGVkIGJ5IEpzVmlld3MgaWYgSnNWaWV3cyBpcyBsb2FkZWQpXG5cdHZhciB2aWV3cywgcGFyZW50Vmlld18sIHRhZywgc2VsZl8sXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0aXNBcnJheSA9IHR5cGUgPT09IFwiYXJyYXlcIjtcblxuXHRzZWxmLmNvbnRlbnQgPSBjb250ZW50VG1wbDtcblx0c2VsZi52aWV3cyA9IGlzQXJyYXkgPyBbXSA6IHt9O1xuXHRzZWxmLnBhcmVudCA9IHBhcmVudFZpZXc7XG5cdHNlbGYudHlwZSA9IHR5cGUgfHwgXCJ0b3BcIjtcblx0c2VsZi5kYXRhID0gZGF0YTtcblx0c2VsZi50bXBsID0gdGVtcGxhdGU7XG5cdC8vIElmIHRoZSBkYXRhIGlzIGFuIGFycmF5LCB0aGlzIGlzIGFuICdhcnJheSB2aWV3JyB3aXRoIGEgdmlld3MgYXJyYXkgZm9yIGVhY2ggY2hpbGQgJ2l0ZW0gdmlldydcblx0Ly8gSWYgdGhlIGRhdGEgaXMgbm90IGFuIGFycmF5LCB0aGlzIGlzIGFuICdpdGVtIHZpZXcnIHdpdGggYSB2aWV3cyAnaGFzaCcgb2JqZWN0IGZvciBhbnkgY2hpbGQgbmVzdGVkIHZpZXdzXG5cdC8vIC5fLnVzZUtleSBpcyBub24gemVybyBpZiBpcyBub3QgYW4gJ2FycmF5IHZpZXcnIChvd25pbmcgYSBkYXRhIGFycmF5KS4gVXNlIHRoaXMgYXMgbmV4dCBrZXkgZm9yIGFkZGluZyB0byBjaGlsZCB2aWV3cyBoYXNoXG5cdHNlbGZfID0gc2VsZi5fID0ge1xuXHRcdGtleTogMCxcblx0XHR1c2VLZXk6IGlzQXJyYXkgPyAwIDogMSxcblx0XHRpZDogXCJcIiArIHZpZXdJZCsrLFxuXHRcdG9uUmVuZGVyOiBvblJlbmRlcixcblx0XHRibmRzOiB7fVxuXHR9O1xuXHRzZWxmLmxpbmtlZCA9ICEhb25SZW5kZXI7XG5cdGlmIChwYXJlbnRWaWV3KSB7XG5cdFx0dmlld3MgPSBwYXJlbnRWaWV3LnZpZXdzO1xuXHRcdHBhcmVudFZpZXdfID0gcGFyZW50Vmlldy5fO1xuXHRcdGlmIChwYXJlbnRWaWV3Xy51c2VLZXkpIHtcblx0XHRcdC8vIFBhcmVudCBpcyBub3QgYW4gJ2FycmF5IHZpZXcnLiBBZGQgdGhpcyB2aWV3IHRvIGl0cyB2aWV3cyBvYmplY3Rcblx0XHRcdC8vIHNlbGYuX2tleSA9IGlzIHRoZSBrZXkgaW4gdGhlIHBhcmVudCB2aWV3IGhhc2hcblx0XHRcdHZpZXdzW3NlbGZfLmtleSA9IFwiX1wiICsgcGFyZW50Vmlld18udXNlS2V5KytdID0gc2VsZjtcblx0XHRcdHNlbGYuaW5kZXggPSBpbmRleFN0cjtcblx0XHRcdHNlbGYuZ2V0SW5kZXggPSBnZXROZXN0ZWRJbmRleDtcblx0XHR9IGVsc2UgaWYgKHZpZXdzLmxlbmd0aCA9PT0gKHNlbGZfLmtleSA9IHNlbGYuaW5kZXggPSBrZXkpKSB7IC8vIFBhcmVudCBpcyBhbiAnYXJyYXkgdmlldycuIEFkZCB0aGlzIHZpZXcgdG8gaXRzIHZpZXdzIGFycmF5XG5cdFx0XHR2aWV3cy5wdXNoKHNlbGYpOyAvLyBBZGRpbmcgdG8gZW5kIG9mIHZpZXdzIGFycmF5LiAoVXNpbmcgcHVzaCB3aGVuIHBvc3NpYmxlIC0gYmV0dGVyIHBlcmYgdGhhbiBzcGxpY2UpXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZpZXdzLnNwbGljZShrZXksIDAsIHNlbGYpOyAvLyBJbnNlcnRpbmcgaW4gdmlld3MgYXJyYXlcblx0XHR9XG5cdFx0Ly8gSWYgbm8gY29udGV4dCB3YXMgcGFzc2VkIGluLCB1c2UgcGFyZW50IGNvbnRleHRcblx0XHQvLyBJZiBjb250ZXh0IHdhcyBwYXNzZWQgaW4sIGl0IHNob3VsZCBoYXZlIGJlZW4gbWVyZ2VkIGFscmVhZHkgd2l0aCBwYXJlbnQgY29udGV4dFxuXHRcdHNlbGYuY3R4ID0gY29udGV4dCB8fCBwYXJlbnRWaWV3LmN0eDtcblx0fSBlbHNlIHtcblx0XHRzZWxmLmN0eCA9IGNvbnRleHQ7XG5cdH1cbn1cblxuVmlldy5wcm90b3R5cGUgPSB7XG5cdGdldDogZ2V0Vmlldyxcblx0Z2V0SW5kZXg6IGdldEluZGV4LFxuXHRnZXRSc2M6IGdldFJlc291cmNlLFxuXHRnZXRUbXBsOiBnZXRUZW1wbGF0ZSxcblx0aGxwOiBnZXRIZWxwZXIsXG5cdF9pczogXCJ2aWV3XCJcbn07XG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVnaXN0cmF0aW9uXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZUNoaWxkUmVzb3VyY2VzKHBhcmVudFRtcGwpIHtcblx0dmFyIHN0b3JlTmFtZSwgc3RvcmVOYW1lcywgcmVzb3VyY2VzO1xuXHRmb3IgKHN0b3JlTmFtZSBpbiBqc3ZTdG9yZXMpIHtcblx0XHRzdG9yZU5hbWVzID0gc3RvcmVOYW1lICsgXCJzXCI7XG5cdFx0aWYgKHBhcmVudFRtcGxbc3RvcmVOYW1lc10pIHtcblx0XHRcdHJlc291cmNlcyA9IHBhcmVudFRtcGxbc3RvcmVOYW1lc107ICAgIC8vIFJlc291cmNlcyBub3QgeWV0IGNvbXBpbGVkXG5cdFx0XHRwYXJlbnRUbXBsW3N0b3JlTmFtZXNdID0ge307ICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHVuY29tcGlsZWQgcmVzb3VyY2VzXG5cdFx0XHQkdmlld3Nbc3RvcmVOYW1lc10ocmVzb3VyY2VzLCBwYXJlbnRUbXBsKTsgLy8gQWRkIGJhY2sgaW4gdGhlIGNvbXBpbGVkIHJlc291cmNlc1xuXHRcdH1cblx0fVxufVxuXG4vLz09PT09PT09PT09PT09PVxuLy8gY29tcGlsZVRhZ1xuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZVRhZyhuYW1lLCB0YWdEZWYsIHBhcmVudFRtcGwpIHtcblx0dmFyIHRtcGwsIGJhc2VUYWcsIHByb3AsXG5cdFx0Y29tcGlsZWREZWYgPSBuZXcgJHN1Yi5fdGcoKTtcblxuXHRmdW5jdGlvbiBUYWcoKSB7XG5cdFx0dmFyIHRhZyA9IHRoaXM7XG5cdFx0dGFnLl8gPSB7XG5cdFx0XHRpbmxpbmU6IHRydWUsXG5cdFx0XHR1bmxpbmtlZDogdHJ1ZVxuXHRcdH07XG5cblx0XHR0YWcudGFnTmFtZSA9IG5hbWU7XG5cdH1cblxuXHRpZiAoJGlzRnVuY3Rpb24odGFnRGVmKSkge1xuXHRcdC8vIFNpbXBsZSB0YWcgZGVjbGFyZWQgYXMgZnVuY3Rpb24uIE5vIHByZXNlbnRlciBpbnN0YW50YXRpb24uXG5cdFx0dGFnRGVmID0ge1xuXHRcdFx0ZGVwZW5kczogdGFnRGVmLmRlcGVuZHMsXG5cdFx0XHRyZW5kZXI6IHRhZ0RlZlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoXCJcIiArIHRhZ0RlZiA9PT0gdGFnRGVmKSB7XG5cdFx0dGFnRGVmID0ge3RlbXBsYXRlOiB0YWdEZWZ9O1xuXHR9XG5cdGlmIChiYXNlVGFnID0gdGFnRGVmLmJhc2VUYWcpIHtcblx0XHR0YWdEZWYuZmxvdyA9ICEhdGFnRGVmLmZsb3c7IC8vIFNldCBmbG93IHByb3BlcnR5LCBzbyBkZWZhdWx0cyB0byBmYWxzZSBldmVuIGlmIGJhc2VUYWcgaGFzIGZsb3c9dHJ1ZVxuXHRcdHRhZ0RlZi5iYXNlVGFnID0gYmFzZVRhZyA9IFwiXCIgKyBiYXNlVGFnID09PSBiYXNlVGFnXG5cdFx0XHQ/IChwYXJlbnRUbXBsICYmIHBhcmVudFRtcGwudGFnc1tiYXNlVGFnXSB8fCAkdGFnc1tiYXNlVGFnXSlcblx0XHRcdDogYmFzZVRhZztcblxuXHRcdGNvbXBpbGVkRGVmID0gJGV4dGVuZChjb21waWxlZERlZiwgYmFzZVRhZyk7XG5cblx0XHRmb3IgKHByb3AgaW4gdGFnRGVmKSB7XG5cdFx0XHRjb21waWxlZERlZltwcm9wXSA9IGdldE1ldGhvZChiYXNlVGFnW3Byb3BdLCB0YWdEZWZbcHJvcF0pO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb21waWxlZERlZiA9ICRleHRlbmQoY29tcGlsZWREZWYsIHRhZ0RlZik7XG5cdH1cblxuXHQvLyBUYWcgZGVjbGFyZWQgYXMgb2JqZWN0LCB1c2VkIGFzIHRoZSBwcm90b3R5cGUgZm9yIHRhZyBpbnN0YW50aWF0aW9uIChjb250cm9sL3ByZXNlbnRlcilcblx0aWYgKCh0bXBsID0gY29tcGlsZWREZWYudGVtcGxhdGUpICE9PSB1bmRlZmluZWQpIHtcblx0XHRjb21waWxlZERlZi50ZW1wbGF0ZSA9IFwiXCIgKyB0bXBsID09PSB0bXBsID8gKCR0ZW1wbGF0ZXNbdG1wbF0gfHwgJHRlbXBsYXRlcyh0bXBsKSkgOiB0bXBsO1xuXHR9XG5cdGlmIChjb21waWxlZERlZi5pbml0ICE9PSBmYWxzZSkge1xuXHRcdC8vIFNldCBpbml0OiBmYWxzZSBvbiB0YWdEZWYgaWYgeW91IHdhbnQgdG8gcHJvdmlkZSBqdXN0IGEgcmVuZGVyIG1ldGhvZCwgb3IgcmVuZGVyIGFuZCB0ZW1wbGF0ZSwgYnV0IG5vIGNvbnN0cnVjdG9yIG9yIHByb3RvdHlwZS5cblx0XHQvLyBzbyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGFnIHRvIHJlbmRlciBmdW5jdGlvbiwgZXhjZXB0IHlvdSBjYW4gYWxzbyBwcm92aWRlIGEgdGVtcGxhdGUuXG5cdFx0KFRhZy5wcm90b3R5cGUgPSBjb21waWxlZERlZikuY29uc3RydWN0b3IgPSBjb21waWxlZERlZi5fY3RyID0gVGFnO1xuXHR9XG5cblx0aWYgKHBhcmVudFRtcGwpIHtcblx0XHRjb21waWxlZERlZi5fcGFyZW50VG1wbCA9IHBhcmVudFRtcGw7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVkRGVmO1xufVxuXG5mdW5jdGlvbiBiYXNlQXBwbHkoYXJncykge1xuXHQvLyBJbiBkZXJpdmVkIG1ldGhvZCAob3IgaGFuZGxlciBkZWNsYXJlZCBkZWNsYXJhdGl2ZWx5IGFzIGluIHt7OmZvbyBvbkNoYW5nZT1+Zm9vQ2hhbmdlZH19IGNhbiBjYWxsIGJhc2UgbWV0aG9kLFxuXHQvLyB1c2luZyB0aGlzLmJhc2VBcHBseShhcmd1bWVudHMpIChFcXVpdmFsZW50IHRvIHRoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSBpbiBqUXVlcnkgVUkpXG5cdHJldHVybiB0aGlzLmJhc2UuYXBwbHkodGhpcywgYXJncyk7XG59XG5cbi8vPT09PT09PT09PT09PT09XG4vLyBjb21waWxlVG1wbFxuLy89PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY29tcGlsZVRtcGwobmFtZSwgdG1wbCwgcGFyZW50VG1wbCwgb3B0aW9ucykge1xuXHQvLyB0bXBsIGlzIGVpdGhlciBhIHRlbXBsYXRlIG9iamVjdCwgYSBzZWxlY3RvciBmb3IgYSB0ZW1wbGF0ZSBzY3JpcHQgYmxvY2ssIHRoZSBuYW1lIG9mIGEgY29tcGlsZWQgdGVtcGxhdGUsIG9yIGEgdGVtcGxhdGUgb2JqZWN0XG5cblx0Ly89PT09IG5lc3RlZCBmdW5jdGlvbnMgPT09PVxuXHRmdW5jdGlvbiBsb29rdXBUZW1wbGF0ZSh2YWx1ZSkge1xuXHRcdC8vIElmIHZhbHVlIGlzIG9mIHR5cGUgc3RyaW5nIC0gdHJlYXQgYXMgc2VsZWN0b3IsIG9yIG5hbWUgb2YgY29tcGlsZWQgdGVtcGxhdGVcblx0XHQvLyBSZXR1cm4gdGhlIHRlbXBsYXRlIG9iamVjdCwgaWYgYWxyZWFkeSBjb21waWxlZCwgb3IgdGhlIG1hcmt1cCBzdHJpbmdcblx0XHR2YXIgY3VycmVudE5hbWUsIHRtcGw7XG5cdFx0aWYgKChcIlwiICsgdmFsdWUgPT09IHZhbHVlKSB8fCB2YWx1ZS5ub2RlVHlwZSA+IDAgJiYgKGVsZW0gPSB2YWx1ZSkpIHtcblx0XHRcdGlmICghZWxlbSkge1xuXHRcdFx0XHRpZiAoL15cXC5cXC9bXlxcXFw6Kj9cIjw+XSokLy50ZXN0KHZhbHVlKSkge1xuXHRcdFx0XHRcdC8vIHRtcGw9XCIuL3NvbWUvZmlsZS5odG1sXCJcblx0XHRcdFx0XHQvLyBJZiB0aGUgdGVtcGxhdGUgaXMgbm90IG5hbWVkLCB1c2UgXCIuL3NvbWUvZmlsZS5odG1sXCIgYXMgbmFtZS5cblx0XHRcdFx0XHRpZiAodG1wbCA9ICR0ZW1wbGF0ZXNbbmFtZSA9IG5hbWUgfHwgdmFsdWVdKSB7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHRtcGw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIEJST1dTRVItU1BFQ0lGSUMgQ09ERSAobm90IG9uIE5vZGUuanMpOlxuXHRcdFx0XHRcdFx0Ly8gTG9vayBmb3Igc2VydmVyLWdlbmVyYXRlZCBzY3JpcHQgYmxvY2sgd2l0aCBpZCBcIi4vc29tZS9maWxlLmh0bWxcIlxuXHRcdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoJC5mbiAmJiAhJHN1Yi5yVG1wbC50ZXN0KHZhbHVlKSkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gJChkb2N1bWVudCkuZmluZCh2YWx1ZSlbMF07IC8vIGlmIGpRdWVyeSBpcyBsb2FkZWQsIHRlc3QgZm9yIHNlbGVjdG9yIHJldHVybmluZyBlbGVtZW50cywgYW5kIGdldCBmaXJzdCBlbGVtZW50XG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHRcdFx0fS8vIEVORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdH0gLy9CUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdC8vIEdlbmVyYWxseSB0aGlzIGlzIGEgc2NyaXB0IGVsZW1lbnQuXG5cdFx0XHRcdC8vIEhvd2V2ZXIgd2UgYWxsb3cgaXQgdG8gYmUgYW55IGVsZW1lbnQsIHNvIHlvdSBjYW4gZm9yIGV4YW1wbGUgdGFrZSB0aGUgY29udGVudCBvZiBhIGRpdixcblx0XHRcdFx0Ly8gdXNlIGl0IGFzIGEgdGVtcGxhdGUsIGFuZCByZXBsYWNlIGl0IGJ5IHRoZSBzYW1lIGNvbnRlbnQgcmVuZGVyZWQgYWdhaW5zdCBkYXRhLlxuXHRcdFx0XHQvLyBlLmcuIGZvciBsaW5raW5nIHRoZSBjb250ZW50IG9mIGEgZGl2IHRvIGEgY29udGFpbmVyLCBhbmQgdXNpbmcgdGhlIGluaXRpYWwgY29udGVudCBhcyB0ZW1wbGF0ZTpcblx0XHRcdFx0Ly8gJC5saW5rKFwiI2NvbnRlbnRcIiwgbW9kZWwsIHt0bXBsOiBcIiNjb250ZW50XCJ9KTtcblx0XHRcdFx0aWYgKG9wdGlvbnMpIHtcblx0XHRcdFx0XHQvLyBXZSB3aWxsIGNvbXBpbGUgYSBuZXcgdGVtcGxhdGUgdXNpbmcgdGhlIG1hcmt1cCBpbiB0aGUgc2NyaXB0IGVsZW1lbnRcblx0XHRcdFx0XHR2YWx1ZSA9IGVsZW0uaW5uZXJIVE1MO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFdlIHdpbGwgY2FjaGUgYSBzaW5nbGUgY29weSBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUsIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbmFtZVxuXHRcdFx0XHRcdC8vIChyZW5hbWluZyBmcm9tIGEgcHJldmlvdXMgbmFtZSBpZiB0aGVyZSB3YXMgb25lKS5cblx0XHRcdFx0XHRjdXJyZW50TmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKHRtcGxBdHRyKTtcblx0XHRcdFx0XHRpZiAoY3VycmVudE5hbWUpIHtcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50TmFtZSAhPT0ganN2VG1wbCkge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9ICR0ZW1wbGF0ZXNbY3VycmVudE5hbWVdO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgJHRlbXBsYXRlc1tjdXJyZW50TmFtZV07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCQuZm4pIHtcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSAkLmRhdGEoZWxlbSlbanN2VG1wbF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG5hbWUgPSBuYW1lIHx8ICgkLmZuID8ganN2VG1wbCA6IHZhbHVlKTtcblx0XHRcdFx0XHRcdHZhbHVlID0gY29tcGlsZVRtcGwobmFtZSwgZWxlbS5pbm5lckhUTUwsIHBhcmVudFRtcGwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YWx1ZS50bXBsTmFtZSA9IG5hbWUgPSBuYW1lIHx8IGN1cnJlbnROYW1lO1xuXHRcdFx0XHRcdGlmIChuYW1lICE9PSBqc3ZUbXBsKSB7XG5cdFx0XHRcdFx0XHQkdGVtcGxhdGVzW25hbWVdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKHRtcGxBdHRyLCBuYW1lKTtcblx0XHRcdFx0XHRpZiAoJC5mbikge1xuXHRcdFx0XHRcdFx0JC5kYXRhKGVsZW0sIGpzdlRtcGwsIHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gLy8gRU5EIEJST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRcdFx0ZWxlbSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKCF2YWx1ZS5mbikge1xuXHRcdFx0dmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuIEhUTUwgZWxlbWVudCwgb3IgY29tcGlsZWQgdGVtcGxhdGUsIHJldHVybiB1bmRlZmluZWRcblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0dmFyIGVsZW0sIGNvbXBpbGVkVG1wbCxcblx0XHR0bXBsT3JNYXJrdXAgPSB0bXBsID0gdG1wbCB8fCBcIlwiO1xuXG5cdC8vPT09PSBDb21waWxlIHRoZSB0ZW1wbGF0ZSA9PT09XG5cdGlmIChvcHRpb25zID09PSAwKSB7XG5cdFx0b3B0aW9ucyA9IHVuZGVmaW5lZDtcblx0XHR0bXBsT3JNYXJrdXAgPSBsb29rdXBUZW1wbGF0ZSh0bXBsT3JNYXJrdXApOyAvLyBUb3AtbGV2ZWwgY29tcGlsZSBzbyBkbyBhIHRlbXBsYXRlIGxvb2t1cFxuXHR9XG5cblx0Ly8gSWYgb3B0aW9ucywgdGhlbiB0aGlzIHdhcyBhbHJlYWR5IGNvbXBpbGVkIGZyb20gYSAoc2NyaXB0KSBlbGVtZW50IHRlbXBsYXRlIGRlY2xhcmF0aW9uLlxuXHQvLyBJZiBub3QsIHRoZW4gaWYgdG1wbCBpcyBhIHRlbXBsYXRlIG9iamVjdCwgdXNlIGl0IGZvciBvcHRpb25zXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8ICh0bXBsLm1hcmt1cCA/IHRtcGwgOiB7fSk7XG5cdG9wdGlvbnMudG1wbE5hbWUgPSBuYW1lO1xuXHRpZiAocGFyZW50VG1wbCkge1xuXHRcdG9wdGlvbnMuX3BhcmVudFRtcGwgPSBwYXJlbnRUbXBsO1xuXHR9XG5cdC8vIElmIHRtcGwgaXMgbm90IGEgbWFya3VwIHN0cmluZyBvciBhIHNlbGVjdG9yIHN0cmluZywgdGhlbiBpdCBtdXN0IGJlIGEgdGVtcGxhdGUgb2JqZWN0XG5cdC8vIEluIHRoYXQgY2FzZSwgZ2V0IGl0IGZyb20gdGhlIG1hcmt1cCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG5cdGlmICghdG1wbE9yTWFya3VwICYmIHRtcGwubWFya3VwICYmICh0bXBsT3JNYXJrdXAgPSBsb29rdXBUZW1wbGF0ZSh0bXBsLm1hcmt1cCkpKSB7XG5cdFx0aWYgKHRtcGxPck1hcmt1cC5mbikge1xuXHRcdFx0Ly8gSWYgdGhlIHN0cmluZyByZWZlcmVuY2VzIGEgY29tcGlsZWQgdGVtcGxhdGUgb2JqZWN0LCBuZWVkIHRvIHJlY29tcGlsZSB0byBtZXJnZSBhbnkgbW9kaWZpZWQgb3B0aW9uc1xuXHRcdFx0dG1wbE9yTWFya3VwID0gdG1wbE9yTWFya3VwLm1hcmt1cDtcblx0XHR9XG5cdH1cblx0aWYgKHRtcGxPck1hcmt1cCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYgKHRtcGxPck1hcmt1cC5mbiB8fCB0bXBsLmZuKSB7XG5cdFx0XHQvLyB0bXBsIGlzIGFscmVhZHkgY29tcGlsZWQsIHNvIHVzZSBpdFxuXHRcdFx0aWYgKHRtcGxPck1hcmt1cC5mbikge1xuXHRcdFx0XHRjb21waWxlZFRtcGwgPSB0bXBsT3JNYXJrdXA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRtcGxPck1hcmt1cCBpcyBhIG1hcmt1cCBzdHJpbmcsIG5vdCBhIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHQvLyBDcmVhdGUgdGVtcGxhdGUgb2JqZWN0XG5cdFx0XHR0bXBsID0gdG1wbE9iamVjdCh0bXBsT3JNYXJrdXAsIG9wdGlvbnMpO1xuXHRcdFx0Ly8gQ29tcGlsZSB0byBBU1QgYW5kIHRoZW4gdG8gY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdHRtcGxGbih0bXBsT3JNYXJrdXAucmVwbGFjZShyRXNjYXBlUXVvdGVzLCBcIlxcXFwkJlwiKSwgdG1wbCk7XG5cdFx0fVxuXHRcdGlmICghY29tcGlsZWRUbXBsKSB7XG5cdFx0XHRjb21waWxlZFRtcGwgPSAkZXh0ZW5kKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gY29tcGlsZWRUbXBsLnJlbmRlci5hcHBseShjb21waWxlZFRtcGwsIGFyZ3VtZW50cyk7XG5cdFx0XHR9LCB0bXBsKTtcblxuXHRcdFx0Y29tcGlsZUNoaWxkUmVzb3VyY2VzKGNvbXBpbGVkVG1wbCk7XG5cdFx0fVxuXHRcdGlmIChuYW1lICYmICFwYXJlbnRUbXBsICYmIG5hbWUgIT09IGpzdlRtcGwpIHtcblx0XHRcdCRyZW5kZXJbbmFtZV0gPSBjb21waWxlZFRtcGw7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlZFRtcGw7XG5cdH1cbn1cblxuLy89PT09IC9lbmQgb2YgZnVuY3Rpb24gY29tcGlsZVRtcGwgPT09PVxuXG4vLz09PT09PT09PT09PT09PT09XG4vLyBjb21waWxlVmlld01vZGVsXG4vLz09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRWYWwoZGVmYXVsdFZhbCwgZGF0YSkge1xuXHRyZXR1cm4gJC5pc0Z1bmN0aW9uKGRlZmF1bHRWYWwpXG5cdFx0PyBkZWZhdWx0VmFsLmNhbGwoZGF0YSlcblx0XHQ6IGRlZmF1bHRWYWw7XG59XG5cbmZ1bmN0aW9uIHVubWFwQXJyYXkobW9kZWxBcnIpIHtcblx0XHR2YXIgaSwgYXJyID0gW10sXG5cdFx0XHRsID0gbW9kZWxBcnIubGVuZ3RoO1xuXHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0YXJyLnB1c2gobW9kZWxBcnJbaV0udW5tYXAoKSk7XG5cdFx0fVxuXHRcdHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVWaWV3TW9kZWwobmFtZSwgdHlwZSkge1xuXHR2YXIgaSwgY29uc3RydWN0b3IsXG5cdFx0dmlld01vZGVscyA9IHRoaXMsXG5cdFx0Z2V0dGVycyA9IHR5cGUuZ2V0dGVycyxcblx0XHRleHRlbmQgPSB0eXBlLmV4dGVuZCxcblx0XHRpZCA9IHR5cGUuaWQsXG5cdFx0cHJvdG8gPSAkLmV4dGVuZCh7XG5cdFx0XHRfaXM6IG5hbWUgfHwgXCJ1bm5hbWVkXCIsXG5cdFx0XHR1bm1hcDogdW5tYXAsXG5cdFx0XHRtZXJnZTogbWVyZ2Vcblx0XHR9LCBleHRlbmQpLFxuXHRcdGFyZ3MgPSBcIlwiLFxuXHRcdGJvZHkgPSBcIlwiLFxuXHRcdGwgPSBnZXR0ZXJzID8gZ2V0dGVycy5sZW5ndGggOiAwLFxuXHRcdCRvYnNlcnZhYmxlID0gJC5vYnNlcnZhYmxlLFxuXHRcdGdldHRlck5hbWVzID0ge307XG5cblx0ZnVuY3Rpb24gR2V0TmV3KGFyZ3MpIHtcblx0XHRjb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmdzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHZtKCkge1xuXHRcdHJldHVybiBuZXcgR2V0TmV3KGFyZ3VtZW50cyk7XG5cdH1cblxuXHRmdW5jdGlvbiBpdGVyYXRlKGRhdGEsIGFjdGlvbikge1xuXHRcdHZhciBqLCBnZXR0ZXJUeXBlLCBkZWZhdWx0VmFsLCBwcm9wLCBvYixcblx0XHRcdG0gPSBnZXR0ZXJzLmxlbmd0aDtcblx0XHRmb3IgKGo9MDsgajxtOyBqKyspIHtcblx0XHRcdHByb3AgPSBnZXR0ZXJzW2pdO1xuXHRcdFx0Z2V0dGVyVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGlmIChwcm9wICsgXCJcIiAhPT0gcHJvcCkge1xuXHRcdFx0XHRnZXR0ZXJUeXBlID0gcHJvcDtcblx0XHRcdFx0cHJvcCA9IGdldHRlclR5cGUuZ2V0dGVyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKChvYiA9IGRhdGFbcHJvcF0pID09PSB1bmRlZmluZWQgJiYgZ2V0dGVyVHlwZSAmJiAoZGVmYXVsdFZhbCA9IGdldHRlclR5cGUuZGVmYXVsdFZhbCkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvYiA9IGdldERlZmF1bHRWYWwoZGVmYXVsdFZhbCwgZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRhY3Rpb24ob2IsIGdldHRlclR5cGUgJiYgdmlld01vZGVsc1tnZXR0ZXJUeXBlLnR5cGVdLCBwcm9wKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBtYXAoZGF0YSkge1xuXHRcdGRhdGEgPSBkYXRhICsgXCJcIiA9PT0gZGF0YVxuXHRcdFx0PyBKU09OLnBhcnNlKGRhdGEpIC8vIEFjY2VwdCBKU09OIHN0cmluZ1xuXHRcdFx0OiBkYXRhOyAgICAgICAgICAgIC8vIG9yIG9iamVjdC9hcnJheVxuXHRcdHZhciBpLCBqLCAgbCwgbSwgcHJvcCxcblx0XHRcdG9iID0gZGF0YSxcblx0XHRcdGFyciA9IFtdO1xuXG5cdFx0aWYgKCRpc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRkYXRhID0gZGF0YSB8fCBbXTtcblx0XHRcdGwgPSBkYXRhLmxlbmd0aDtcblx0XHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0XHRhcnIucHVzaCh0aGlzLm1hcChkYXRhW2ldKSk7XG5cdFx0XHR9XG5cdFx0XHRhcnIuX2lzID0gbmFtZTtcblx0XHRcdGFyci51bm1hcCA9IHVubWFwO1xuXHRcdFx0YXJyLm1lcmdlID0gbWVyZ2U7XG5cdFx0XHRyZXR1cm4gYXJyO1xuXHRcdH1cblxuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRpdGVyYXRlKGRhdGEsIGZ1bmN0aW9uKG9iLCB2aWV3TW9kZWwpIHtcblx0XHRcdFx0aWYgKHZpZXdNb2RlbCkgeyAvLyBJdGVyYXRlIHRvIGJ1aWxkIGdldHRlcnMgYXJnIGFycmF5ICh2YWx1ZSwgb3IgbWFwcGVkIHZhbHVlKVxuXHRcdFx0XHRcdG9iID0gdmlld01vZGVsLm1hcChvYik7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXJyLnB1c2gob2IpO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9iID0gdGhpcy5hcHBseSh0aGlzLCBhcnIpOyAvLyBJbnNhbnRpYXRlIHRoaXMgVmlldyBNb2RlbCwgcGFzc2luZyBnZXR0ZXJzIGFyZ3MgYXJyYXkgdG8gY29uc3RydWN0b3Jcblx0XHRcdGZvciAocHJvcCBpbiBkYXRhKSB7IC8vIENvcHkgb3ZlciBhbnkgb3RoZXIgcHJvcGVydGllcy4gdGhhdCBhcmUgbm90IGdldC9zZXQgcHJvcGVydGllc1xuXHRcdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8gICYmICFnZXR0ZXJOYW1lc1twcm9wXSkge1xuXHRcdFx0XHRcdG9iW3Byb3BdID0gZGF0YVtwcm9wXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb2I7XG5cdH1cblxuXHRmdW5jdGlvbiBtZXJnZShkYXRhKSB7XG5cdFx0ZGF0YSA9IGRhdGEgKyBcIlwiID09PSBkYXRhXG5cdFx0XHQ/IEpTT04ucGFyc2UoZGF0YSkgLy8gQWNjZXB0IEpTT04gc3RyaW5nXG5cdFx0XHQ6IGRhdGE7ICAgICAgICAgICAgLy8gb3Igb2JqZWN0L2FycmF5XG5cdFx0dmFyIGksIGosIGwsIG0sIHByb3AsIG1vZCwgZm91bmQsIGFzc2lnbmVkLCBvYiwgbmV3TW9kQXJyLFxuXHRcdFx0bW9kZWwgPSB0aGlzO1xuXG5cdFx0aWYgKCRpc0FycmF5KG1vZGVsKSkge1xuXHRcdFx0YXNzaWduZWQgPSB7fTtcblx0XHRcdG5ld01vZEFyciA9IFtdO1xuXHRcdFx0bCA9IGRhdGEubGVuZ3RoO1xuXHRcdFx0bSA9IG1vZGVsLmxlbmd0aDtcblx0XHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0XHRvYiA9IGRhdGFbaV07XG5cdFx0XHRcdGZvdW5kID0gZmFsc2U7XG5cdFx0XHRcdGZvciAoaj0wOyBqPG0gJiYgIWZvdW5kOyBqKyspIHtcblx0XHRcdFx0XHRpZiAoYXNzaWduZWRbal0pIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2QgPSBtb2RlbFtqXTtcblxuXHRcdFx0XHRcdGlmIChpZCkge1xuXHRcdFx0XHRcdFx0YXNzaWduZWRbal0gPSBmb3VuZCA9IGlkICsgXCJcIiA9PT0gaWRcblx0XHRcdFx0XHRcdD8gKG9iW2lkXSAmJiAoZ2V0dGVyTmFtZXNbaWRdID8gbW9kW2lkXSgpIDogbW9kW2lkXSkgPT09IG9iW2lkXSlcblx0XHRcdFx0XHRcdDogaWQobW9kLCBvYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChmb3VuZCkge1xuXHRcdFx0XHRcdG1vZC5tZXJnZShvYik7XG5cdFx0XHRcdFx0bmV3TW9kQXJyLnB1c2gobW9kKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuZXdNb2RBcnIucHVzaCh2bS5tYXAob2IpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCRvYnNlcnZhYmxlKSB7XG5cdFx0XHRcdCRvYnNlcnZhYmxlKG1vZGVsKS5yZWZyZXNoKG5ld01vZEFyciwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb2RlbC5zcGxpY2UuYXBwbHkobW9kZWwsIFswLCBtb2RlbC5sZW5ndGhdLmNvbmNhdChuZXdNb2RBcnIpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aXRlcmF0ZShkYXRhLCBmdW5jdGlvbihvYiwgdmlld01vZGVsLCBnZXR0ZXIpIHtcblx0XHRcdGlmICh2aWV3TW9kZWwpIHtcblx0XHRcdFx0bW9kZWxbZ2V0dGVyXSgpLm1lcmdlKG9iKTsgLy8gVXBkYXRlIHR5cGVkIHByb3BlcnR5XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb2RlbFtnZXR0ZXJdKG9iKTsgLy8gVXBkYXRlIG5vbi10eXBlZCBwcm9wZXJ0eVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGZvciAocHJvcCBpbiBkYXRhKSB7XG5cdFx0XHRpZiAocHJvcCAhPT0gJGV4cGFuZG8gJiYgIWdldHRlck5hbWVzW3Byb3BdKSB7XG5cdFx0XHRcdG1vZGVsW3Byb3BdID0gZGF0YVtwcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiB1bm1hcCgpIHtcblx0XHR2YXIgb2IsIHByb3AsIGksIGwsIGdldHRlclR5cGUsIGFyciwgdmFsdWUsXG5cdFx0XHRtb2RlbCA9IHRoaXM7XG5cblx0XHRpZiAoJGlzQXJyYXkobW9kZWwpKSB7XG5cdFx0XHRyZXR1cm4gdW5tYXBBcnJheShtb2RlbCk7XG5cdFx0fVxuXHRcdG9iID0ge307XG5cdFx0bCA9IGdldHRlcnMubGVuZ3RoO1xuXHRcdGZvciAoaT0wOyBpPGw7IGkrKykge1xuXHRcdFx0cHJvcCA9IGdldHRlcnNbaV07XG5cdFx0XHRnZXR0ZXJUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHByb3AgKyBcIlwiICE9PSBwcm9wKSB7XG5cdFx0XHRcdGdldHRlclR5cGUgPSBwcm9wO1xuXHRcdFx0XHRwcm9wID0gZ2V0dGVyVHlwZS5nZXR0ZXI7XG5cdFx0XHR9XG5cdFx0XHR2YWx1ZSA9IG1vZGVsW3Byb3BdKCk7XG5cdFx0XHRvYltwcm9wXSA9IGdldHRlclR5cGUgJiYgdmFsdWUgJiYgdmlld01vZGVsc1tnZXR0ZXJUeXBlLnR5cGVdXG5cdFx0XHRcdD8gJGlzQXJyYXkodmFsdWUpXG5cdFx0XHRcdFx0PyB1bm1hcEFycmF5KHZhbHVlKVxuXHRcdFx0XHRcdDogdmFsdWUudW5tYXAoKVxuXHRcdFx0XHQ6IHZhbHVlO1xuXHRcdH1cblx0XHRmb3IgKHByb3AgaW4gbW9kZWwpIHtcblx0XHRcdGlmIChwcm9wICE9PSBcIl9pc1wiICYmICFnZXR0ZXJOYW1lc1twcm9wXSAmJiBwcm9wICE9PSAkZXhwYW5kbyAgJiYgKHByb3AuY2hhckF0KDApICE9PSBcIl9cIiB8fCAhZ2V0dGVyTmFtZXNbcHJvcC5zbGljZSgxKV0pICYmICEkLmlzRnVuY3Rpb24obW9kZWxbcHJvcF0pKSB7XG5cdFx0XHRcdG9iW3Byb3BdID0gbW9kZWxbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvYjtcblx0fVxuXG5cdEdldE5ldy5wcm90b3R5cGUgPSBwcm90bztcblxuXHRmb3IgKGk9MDsgaTxsOyBpKyspIHtcblx0XHQoZnVuY3Rpb24oZ2V0dGVyKSB7XG5cdFx0XHRnZXR0ZXIgPSBnZXR0ZXIuZ2V0dGVyIHx8IGdldHRlcjtcblx0XHRcdGdldHRlck5hbWVzW2dldHRlcl0gPSBpKzE7XG5cdFx0XHR2YXIgcHJpdkZpZWxkID0gXCJfXCIgKyBnZXR0ZXI7XG5cblx0XHRcdGFyZ3MgKz0gKGFyZ3MgPyBcIixcIiA6IFwiXCIpICsgZ2V0dGVyO1xuXHRcdFx0Ym9keSArPSBcInRoaXMuXCIgKyBwcml2RmllbGQgKyBcIiA9IFwiICsgZ2V0dGVyICsgXCI7XFxuXCI7XG5cdFx0XHRwcm90b1tnZXR0ZXJdID0gcHJvdG9bZ2V0dGVyXSB8fCBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXNbcHJpdkZpZWxkXTsgLy8gSWYgdGhlcmUgaXMgbm8gYXJndW1lbnQsIHVzZSBhcyBhIGdldHRlclxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHRcdCRvYnNlcnZhYmxlKHRoaXMpLnNldFByb3BlcnR5KGdldHRlciwgdmFsKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzW3ByaXZGaWVsZF0gPSB2YWw7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGlmICgkb2JzZXJ2YWJsZSkge1xuXHRcdFx0XHRwcm90b1tnZXR0ZXJdLnNldCA9IHByb3RvW2dldHRlcl0uc2V0IHx8IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHRcdHRoaXNbcHJpdkZpZWxkXSA9IHZhbDsgLy8gU2V0dGVyIGNhbGxlZCBieSBvYnNlcnZhYmxlIHByb3BlcnR5IGNoYW5nZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pKGdldHRlcnNbaV0pO1xuXHR9XG5cblx0Y29uc3RydWN0b3IgPSBuZXcgRnVuY3Rpb24oYXJncywgYm9keS5zbGljZSgwLCAtMSkpO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBwcm90bztcblx0cHJvdG8uY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjtcblxuXHR2bS5tYXAgPSBtYXA7XG5cdHZtLmdldHRlcnMgPSBnZXR0ZXJzO1xuXHR2bS5leHRlbmQgPSBleHRlbmQ7XG5cdHZtLmlkID0gaWQ7XG5cdHJldHVybiB2bTtcbn1cblxuZnVuY3Rpb24gdG1wbE9iamVjdChtYXJrdXAsIG9wdGlvbnMpIHtcblx0Ly8gVGVtcGxhdGUgb2JqZWN0IGNvbnN0cnVjdG9yXG5cdHZhciBodG1sVGFnLFxuXHRcdHdyYXBNYXAgPSAkc3ViU2V0dGluZ3NBZHZhbmNlZC5fd20gfHwge30sIC8vIE9ubHkgdXNlZCBpbiBKc1ZpZXdzLiBPdGhlcndpc2UgZW1wdHk6IHt9XG5cdFx0dG1wbCA9ICRleHRlbmQoXG5cdFx0XHR7XG5cdFx0XHRcdHRtcGxzOiBbXSxcblx0XHRcdFx0bGlua3M6IHt9LCAvLyBDb21waWxlZCBmdW5jdGlvbnMgZm9yIGxpbmsgZXhwcmVzc2lvbnNcblx0XHRcdFx0Ym5kczogW10sXG5cdFx0XHRcdF9pczogXCJ0ZW1wbGF0ZVwiLFxuXHRcdFx0XHRyZW5kZXI6IHJlbmRlckNvbnRlbnRcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zXG5cdFx0KTtcblxuXHR0bXBsLm1hcmt1cCA9IG1hcmt1cDtcblx0aWYgKCFvcHRpb25zLmh0bWxUYWcpIHtcblx0XHQvLyBTZXQgdG1wbC50YWcgdG8gdGhlIHRvcC1sZXZlbCBIVE1MIHRhZyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSwgaWYgYW55Li4uXG5cdFx0aHRtbFRhZyA9IHJGaXJzdEVsZW0uZXhlYyhtYXJrdXApO1xuXHRcdHRtcGwuaHRtbFRhZyA9IGh0bWxUYWcgPyBodG1sVGFnWzFdLnRvTG93ZXJDYXNlKCkgOiBcIlwiO1xuXHR9XG5cdGh0bWxUYWcgPSB3cmFwTWFwW3RtcGwuaHRtbFRhZ107XG5cdGlmIChodG1sVGFnICYmIGh0bWxUYWcgIT09IHdyYXBNYXAuZGl2KSB7XG5cdFx0Ly8gV2hlbiB1c2luZyBKc1ZpZXdzLCB3ZSB0cmltIHRlbXBsYXRlcyB3aGljaCBhcmUgaW5zZXJ0ZWQgaW50byBIVE1MIGNvbnRleHRzIHdoZXJlIHRleHQgbm9kZXMgYXJlIG5vdCByZW5kZXJlZCAoaS5lLiBub3QgJ1BocmFzaW5nIENvbnRlbnQnKS5cblx0XHQvLyBDdXJyZW50bHkgbm90IHRyaW1tZWQgZm9yIDxsaT4gdGFnLiAoTm90IHdvcnRoIGFkZGluZyBwZXJmIGNvc3QpXG5cdFx0dG1wbC5tYXJrdXAgPSAkLnRyaW0odG1wbC5tYXJrdXApO1xuXHR9XG5cblx0cmV0dXJuIHRtcGw7XG59XG5cbi8vPT09PT09PT09PT09PT1cbi8vIHJlZ2lzdGVyU3RvcmVcbi8vPT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcmVnaXN0ZXJTdG9yZShzdG9yZU5hbWUsIHN0b3JlU2V0dGluZ3MpIHtcblxuXHRmdW5jdGlvbiB0aGVTdG9yZShuYW1lLCBpdGVtLCBwYXJlbnRUbXBsKSB7XG5cdFx0Ly8gVGhlIHN0b3JlIGlzIGFsc28gdGhlIGZ1bmN0aW9uIHVzZWQgdG8gYWRkIGl0ZW1zIHRvIHRoZSBzdG9yZS4gZS5nLiAkLnRlbXBsYXRlcywgb3IgJC52aWV3cy50YWdzXG5cblx0XHQvLyBGb3Igc3RvcmUgb2YgbmFtZSAndGhpbmcnLCBDYWxsIGFzOlxuXHRcdC8vICAgICQudmlld3MudGhpbmdzKGl0ZW1zWywgcGFyZW50VG1wbF0pLFxuXHRcdC8vIG9yICQudmlld3MudGhpbmdzKG5hbWUsIGl0ZW1bLCBwYXJlbnRUbXBsXSlcblxuXHRcdHZhciBvblN0b3JlLCBjb21waWxlLCBpdGVtTmFtZSwgdGhpc1N0b3JlO1xuXHRcdGlmIChuYW1lICYmIHR5cGVvZiBuYW1lID09PSBPQkpFQ1QgJiYgIW5hbWUubm9kZVR5cGUgJiYgIW5hbWUubWFya3VwICYmICFuYW1lLmdldFRndCAmJiAhKHN0b3JlTmFtZSA9PT0gXCJ2aWV3TW9kZWxcIiAmJiBuYW1lLmdldHRlcnMgfHwgbmFtZS5leHRlbmQpKSB7XG5cdFx0XHQvLyBDYWxsIHRvICQudmlld3MudGhpbmdzKGl0ZW1zWywgcGFyZW50VG1wbF0pLFxuXG5cdFx0XHQvLyBBZGRpbmcgaXRlbXMgdG8gdGhlIHN0b3JlXG5cdFx0XHQvLyBJZiBuYW1lIGlzIGEgaGFzaCwgdGhlbiBpdGVtIGlzIHBhcmVudFRtcGwuIEl0ZXJhdGUgb3ZlciBoYXNoIGFuZCBjYWxsIHN0b3JlIGZvciBrZXkuXG5cdFx0XHRmb3IgKGl0ZW1OYW1lIGluIG5hbWUpIHtcblx0XHRcdFx0dGhlU3RvcmUoaXRlbU5hbWUsIG5hbWVbaXRlbU5hbWVdLCBpdGVtKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpdGVtIHx8ICR2aWV3cztcblx0XHR9XG5cdFx0Ly8gQWRkaW5nIGEgc2luZ2xlIHVubmFtZWQgaXRlbSB0byB0aGUgc3RvcmVcblx0XHRpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpdGVtID0gbmFtZTtcblx0XHRcdG5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmIChuYW1lICYmIFwiXCIgKyBuYW1lICE9PSBuYW1lKSB7IC8vIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xuXHRcdFx0cGFyZW50VG1wbCA9IGl0ZW07XG5cdFx0XHRpdGVtID0gbmFtZTtcblx0XHRcdG5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHRoaXNTdG9yZSA9IHBhcmVudFRtcGxcblx0XHRcdD8gc3RvcmVOYW1lID09PSBcInZpZXdNb2RlbFwiXG5cdFx0XHRcdD8gcGFyZW50VG1wbFxuXHRcdFx0XHQ6IChwYXJlbnRUbXBsW3N0b3JlTmFtZXNdID0gcGFyZW50VG1wbFtzdG9yZU5hbWVzXSB8fCB7fSlcblx0XHRcdDogdGhlU3RvcmU7XG5cdFx0Y29tcGlsZSA9IHN0b3JlU2V0dGluZ3MuY29tcGlsZTtcblx0XHRpZiAoaXRlbSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gSWYgaXRlbSBpcyBudWxsLCBkZWxldGUgdGhpcyBlbnRyeVxuXHRcdFx0aWYgKG5hbWUpIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXNTdG9yZVtuYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aXRlbSA9IGNvbXBpbGUgPyBjb21waWxlLmNhbGwodGhpc1N0b3JlLCBuYW1lLCBpdGVtLCBwYXJlbnRUbXBsLCAwKSA6IGl0ZW07XG5cdFx0XHRpZiAobmFtZSkge1xuXHRcdFx0XHR0aGlzU3RvcmVbbmFtZV0gPSBpdGVtO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoY29tcGlsZSAmJiBpdGVtKSB7XG5cdFx0XHRpdGVtLl9pcyA9IHN0b3JlTmFtZTsgLy8gT25seSBkbyB0aGlzIGZvciBjb21waWxlZCBvYmplY3RzICh0YWdzLCB0ZW1wbGF0ZXMuLi4pXG5cdFx0fVxuXHRcdGlmIChpdGVtICYmIChvblN0b3JlID0gJHN1Yi5vblN0b3JlW3N0b3JlTmFtZV0pKSB7XG5cdFx0XHQvLyBlLmcuIEpzVmlld3MgaW50ZWdyYXRpb25cblx0XHRcdG9uU3RvcmUobmFtZSwgaXRlbSwgY29tcGlsZSk7XG5cdFx0fVxuXHRcdHJldHVybiBpdGVtO1xuXHR9XG5cblx0dmFyIHN0b3JlTmFtZXMgPSBzdG9yZU5hbWUgKyBcInNcIjtcblxuXHQkdmlld3Nbc3RvcmVOYW1lc10gPSB0aGVTdG9yZTtcbn1cblxuZnVuY3Rpb24gYWRkU2V0dGluZyhzdCkge1xuXHQkdmlld3NTZXR0aW5nc1tzdF0gPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG5cdFx0XHQ/ICgkc3ViU2V0dGluZ3Nbc3RdID0gdmFsdWUsICR2aWV3c1NldHRpbmdzKVxuXHRcdFx0OiAkc3ViU2V0dGluZ3Nbc3RdO1xuXHR9O1xufVxuXG4vLz09PT09PT09PVxuLy8gZGF0YU1hcFxuLy89PT09PT09PT1cblxuZnVuY3Rpb24gZGF0YU1hcChtYXBEZWYpIHtcblx0ZnVuY3Rpb24gTWFwKHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdHRoaXMudGd0ID0gbWFwRGVmLmdldFRndChzb3VyY2UsIG9wdGlvbnMpO1xuXHR9XG5cblx0aWYgKCRpc0Z1bmN0aW9uKG1hcERlZikpIHtcblx0XHQvLyBTaW1wbGUgbWFwIGRlY2xhcmVkIGFzIGZ1bmN0aW9uXG5cdFx0bWFwRGVmID0ge1xuXHRcdFx0Z2V0VGd0OiBtYXBEZWZcblx0XHR9O1xuXHR9XG5cblx0aWYgKG1hcERlZi5iYXNlTWFwKSB7XG5cdFx0bWFwRGVmID0gJGV4dGVuZCgkZXh0ZW5kKHt9LCBtYXBEZWYuYmFzZU1hcCksIG1hcERlZik7XG5cdH1cblxuXHRtYXBEZWYubWFwID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zKSB7XG5cdFx0cmV0dXJuIG5ldyBNYXAoc291cmNlLCBvcHRpb25zKTtcblx0fTtcblx0cmV0dXJuIG1hcERlZjtcbn1cblxuLy89PT09PT09PT09PT09PVxuLy8gcmVuZGVyQ29udGVudFxuLy89PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiByZW5kZXJDb250ZW50KGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uLCBwYXJlbnRWaWV3LCBrZXksIG9uUmVuZGVyKSB7XG5cdHZhciBpLCBsLCB0YWcsIHRtcGwsIHRhZ0N0eCwgaXNUb3BSZW5kZXJDYWxsLCBwcmV2RGF0YSwgcHJldkluZGV4LFxuXHRcdHZpZXcgPSBwYXJlbnRWaWV3LFxuXHRcdHJlc3VsdCA9IFwiXCI7XG5cblx0aWYgKGNvbnRleHQgPT09IHRydWUpIHtcblx0XHRub0l0ZXJhdGlvbiA9IGNvbnRleHQ7IC8vIHBhc3NpbmcgYm9vbGVhbiBhcyBzZWNvbmQgcGFyYW0gLSBub0l0ZXJhdGlvblxuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHQgIT09IE9CSkVDVCkge1xuXHRcdGNvbnRleHQgPSB1bmRlZmluZWQ7IC8vIGNvbnRleHQgbXVzdCBiZSBhIGJvb2xlYW4gKG5vSXRlcmF0aW9uKSBvciBhIHBsYWluIG9iamVjdFxuXHR9XG5cblx0aWYgKHRhZyA9IHRoaXMudGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGNhbGwgZnJvbSByZW5kZXJUYWcgb3IgdGFnQ3R4LnJlbmRlciguLi4pXG5cdFx0dGFnQ3R4ID0gdGhpcztcblx0XHR2aWV3ID0gdmlldyB8fCB0YWdDdHgudmlldztcblx0XHR0bXBsID0gdmlldy5nZXRUbXBsKHRhZy50ZW1wbGF0ZSB8fCB0YWdDdHgudG1wbCk7XG5cdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRkYXRhID0gdmlldztcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhpcyBpcyBhIHRlbXBsYXRlLnJlbmRlciguLi4pIGNhbGxcblx0XHR0bXBsID0gdGhpcztcblx0fVxuXG5cdGlmICh0bXBsKSB7XG5cdFx0aWYgKCFwYXJlbnRWaWV3ICYmIGRhdGEgJiYgZGF0YS5faXMgPT09IFwidmlld1wiKSB7XG5cdFx0XHR2aWV3ID0gZGF0YTsgLy8gV2hlbiBwYXNzaW5nIGluIGEgdmlldyB0byByZW5kZXIgb3IgbGluayAoYW5kIG5vdCBwYXNzaW5nIGluIGEgcGFyZW50IHZpZXcpIHVzZSB0aGUgcGFzc2VkLWluIHZpZXcgYXMgcGFyZW50Vmlld1xuXHRcdH1cblxuXHRcdGlmICh2aWV3KSB7XG5cdFx0XHRpZiAoZGF0YSA9PT0gdmlldykge1xuXHRcdFx0XHQvLyBJbmhlcml0IHRoZSBkYXRhIGZyb20gdGhlIHBhcmVudCB2aWV3LlxuXHRcdFx0XHQvLyBUaGlzIG1heSBiZSB0aGUgY29udGVudHMgb2YgYW4ge3tpZn19IGJsb2NrXG5cdFx0XHRcdGRhdGEgPSB2aWV3LmRhdGE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aXNUb3BSZW5kZXJDYWxsID0gIXZpZXc7XG5cdFx0aXNSZW5kZXJDYWxsID0gaXNSZW5kZXJDYWxsIHx8IGlzVG9wUmVuZGVyQ2FsbDtcblx0XHRpZiAoIXZpZXcpIHtcblx0XHRcdChjb250ZXh0ID0gY29udGV4dCB8fCB7fSkucm9vdCA9IGRhdGE7IC8vIFByb3ZpZGUgfnJvb3QgYXMgc2hvcnRjdXQgdG8gdG9wLWxldmVsIGRhdGEuXG5cdFx0fVxuXHRcdGlmICghaXNSZW5kZXJDYWxsIHx8ICRzdWJTZXR0aW5nc0FkdmFuY2VkLnVzZVZpZXdzIHx8IHRtcGwudXNlVmlld3MgfHwgdmlldyAmJiB2aWV3ICE9PSB0b3BWaWV3KSB7XG5cdFx0XHRyZXN1bHQgPSByZW5kZXJXaXRoVmlld3ModG1wbCwgZGF0YSwgY29udGV4dCwgbm9JdGVyYXRpb24sIHZpZXcsIGtleSwgb25SZW5kZXIsIHRhZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh2aWV3KSB7IC8vIEluIGEgYmxvY2tcblx0XHRcdFx0cHJldkRhdGEgPSB2aWV3LmRhdGE7XG5cdFx0XHRcdHByZXZJbmRleCA9IHZpZXcuaW5kZXg7XG5cdFx0XHRcdHZpZXcuaW5kZXggPSBpbmRleFN0cjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZpZXcgPSB0b3BWaWV3O1xuXHRcdFx0XHR2aWV3LmRhdGEgPSBkYXRhO1xuXHRcdFx0XHR2aWV3LmN0eCA9IGNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGlzQXJyYXkoZGF0YSkgJiYgIW5vSXRlcmF0aW9uKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHRoZSBhcnJheSwgd2hvc2UgY2hpbGQgdmlld3MgY29ycmVzcG9uZCB0byBlYWNoIGRhdGEgaXRlbS4gKE5vdGU6IGlmIGtleSBhbmQgcGFyZW50VmlldyBhcmUgcGFzc2VkIGluXG5cdFx0XHRcdC8vIGFsb25nIHdpdGggcGFyZW50IHZpZXcsIHRyZWF0IGFzIGluc2VydCAtZS5nLiBmcm9tIHZpZXcuYWRkVmlld3MgLSBzbyBwYXJlbnRWaWV3IGlzIGFscmVhZHkgdGhlIHZpZXcgaXRlbSBmb3IgYXJyYXkpXG5cdFx0XHRcdGZvciAoaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHZpZXcuaW5kZXggPSBpO1xuXHRcdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGFbaV07XG5cdFx0XHRcdFx0cmVzdWx0ICs9IHRtcGwuZm4oZGF0YVtpXSwgdmlldywgJHN1Yik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZpZXcuZGF0YSA9IGRhdGE7XG5cdFx0XHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGEsIHZpZXcsICRzdWIpO1xuXHRcdFx0fVxuXHRcdFx0dmlldy5kYXRhID0gcHJldkRhdGE7XG5cdFx0XHR2aWV3LmluZGV4ID0gcHJldkluZGV4O1xuXHRcdH1cblx0XHRpZiAoaXNUb3BSZW5kZXJDYWxsKSB7XG5cdFx0XHRpc1JlbmRlckNhbGwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcldpdGhWaWV3cyh0bXBsLCBkYXRhLCBjb250ZXh0LCBub0l0ZXJhdGlvbiwgdmlldywga2V5LCBvblJlbmRlciwgdGFnKSB7XG5cdGZ1bmN0aW9uIHNldEl0ZW1WYXIoaXRlbSkge1xuXHRcdC8vIFdoZW4gaXRlbVZhciBpcyBzcGVjaWZpZWQsIHNldCBtb2RpZmllZCBjdHggd2l0aCB1c2VyLW5hbWVkIH5pdGVtXG5cdFx0bmV3Q3R4ID0gJGV4dGVuZCh7fSwgY29udGV4dCk7XG5cdFx0bmV3Q3R4W2l0ZW1WYXJdID0gaXRlbTtcblx0fVxuXG5cdC8vIFJlbmRlciB0ZW1wbGF0ZSBhZ2FpbnN0IGRhdGEgYXMgYSB0cmVlIG9mIHN1YnZpZXdzIChuZXN0ZWQgcmVuZGVyZWQgdGVtcGxhdGUgaW5zdGFuY2VzKSwgb3IgYXMgYSBzdHJpbmcgKHRvcC1sZXZlbCB0ZW1wbGF0ZSkuXG5cdC8vIElmIHRoZSBkYXRhIGlzIHRoZSBwYXJlbnQgdmlldywgdHJlYXQgYXMgbm9JdGVyYXRpb24sIHJlLXJlbmRlciB3aXRoIHRoZSBzYW1lIGRhdGEgY29udGV4dC5cblx0dmFyIGksIGwsIG5ld1ZpZXcsIGNoaWxkVmlldywgaXRlbVJlc3VsdCwgc3dhcENvbnRlbnQsIGNvbnRlbnRUbXBsLCBvdXRlck9uUmVuZGVyLCB0bXBsTmFtZSwgaXRlbVZhciwgbmV3Q3R4LCB0YWdDdHgsXG5cdFx0cmVzdWx0ID0gXCJcIjtcblxuXHRpZiAodGFnKSB7XG5cdFx0Ly8gVGhpcyBpcyBhIGNhbGwgZnJvbSByZW5kZXJUYWcgb3IgdGFnQ3R4LnJlbmRlciguLi4pXG5cdFx0dG1wbE5hbWUgPSB0YWcudGFnTmFtZTtcblx0XHR0YWdDdHggPSB0YWcudGFnQ3R4O1xuXHRcdGNvbnRleHQgPSBjb250ZXh0ID8gZXh0ZW5kQ3R4KGNvbnRleHQsIHRhZy5jdHgpIDogdGFnLmN0eDtcblxuXHRcdGlmICh0bXBsID09PSB2aWV3LmNvbnRlbnQpIHsgLy8ge3t4eHggdG1wbD0jY29udGVudH19XG5cdFx0XHRjb250ZW50VG1wbCA9IHRtcGwgIT09IHZpZXcuY3R4Ll93cnAgLy8gV2UgYXJlIHJlbmRlcmluZyB0aGUgI2NvbnRlbnRcblx0XHRcdFx0PyB2aWV3LmN0eC5fd3JwIC8vICNjb250ZW50IHdhcyB0aGUgdGFnQ3R4LnByb3BzLnRtcGwgd3JhcHBlciBvZiB0aGUgYmxvY2sgY29udGVudCAtIHNvIHdpdGhpbiB0aGlzIHZpZXcsICNjb250ZW50IHdpbGwgbm93IGJlIHRoZSB2aWV3LmN0eC5fd3JwIGJsb2NrIGNvbnRlbnRcblx0XHRcdFx0OiB1bmRlZmluZWQ7IC8vICNjb250ZW50IHdhcyB0aGUgdmlldy5jdHguX3dycCBibG9jayBjb250ZW50IC0gc28gd2l0aGluIHRoaXMgdmlldywgdGhlcmUgaXMgbm8gbG9uZ2VyIGFueSAjY29udGVudCB0byB3cmFwLlxuXHRcdH0gZWxzZSBpZiAodG1wbCAhPT0gdGFnQ3R4LmNvbnRlbnQpIHtcblx0XHRcdGlmICh0bXBsID09PSB0YWcudGVtcGxhdGUpIHsgLy8gUmVuZGVyaW5nIHt7dGFnfX0gdGFnLnRlbXBsYXRlLCByZXBsYWNpbmcgYmxvY2sgY29udGVudC5cblx0XHRcdFx0Y29udGVudFRtcGwgPSB0YWdDdHgudG1wbDsgLy8gU2V0ICNjb250ZW50IHRvIGJsb2NrIGNvbnRlbnQgKG9yIHdyYXBwZWQgYmxvY2sgY29udGVudCBpZiB0YWdDdHgucHJvcHMudG1wbCBpcyBzZXQpXG5cdFx0XHRcdGNvbnRleHQuX3dycCA9IHRhZ0N0eC5jb250ZW50OyAvLyBQYXNzIHdyYXBwZWQgYmxvY2sgY29udGVudCB0byBuZXN0ZWQgdmlld3Ncblx0XHRcdH0gZWxzZSB7IC8vIFJlbmRlcmluZyB0YWdDdHgucHJvcHMudG1wbCB3cmFwcGVyXG5cdFx0XHRcdGNvbnRlbnRUbXBsID0gdGFnQ3R4LmNvbnRlbnQgfHwgdmlldy5jb250ZW50OyAvLyBTZXQgI2NvbnRlbnQgdG8gd3JhcHBlZCBibG9jayBjb250ZW50XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRlbnRUbXBsID0gdmlldy5jb250ZW50OyAvLyBOZXN0ZWQgdmlld3MgaW5oZXJpdCBzYW1lIHdyYXBwZWQgI2NvbnRlbnQgcHJvcGVydHlcblx0XHR9XG5cblx0XHRpZiAodGFnQ3R4LnByb3BzLmxpbmsgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBsaW5rPWZhbHNlIHNldHRpbmcgb24gYmxvY2sgdGFnXG5cdFx0XHQvLyBXZSB3aWxsIG92ZXJyaWRlIGluaGVyaXRlZCB2YWx1ZSBvZiBsaW5rIGJ5IHRoZSBleHBsaWNpdCBzZXR0aW5nIGxpbms9ZmFsc2UgdGFrZW4gZnJvbSBwcm9wc1xuXHRcdFx0Ly8gVGhlIGNoaWxkIHZpZXdzIG9mIGFuIHVubGlua2VkIHZpZXcgYXJlIGFsc28gdW5saW5rZWQuIFNvIHNldHRpbmcgY2hpbGQgYmFjayB0byB0cnVlIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdC5cblx0XHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xuXHRcdFx0Y29udGV4dC5saW5rID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1WYXIgPSB0YWdDdHgucHJvcHMuaXRlbVZhcikge1xuXHRcdFx0aWYgKGl0ZW1WYXIuY2hhckF0KDApICE9PSBcIn5cIikge1xuXHRcdFx0XHRzeW50YXhFcnJvcihcIlVzZSBpdGVtVmFyPSd+bXlJdGVtJ1wiKTtcblx0XHRcdH1cblx0XHRcdGl0ZW1WYXIgPSBpdGVtVmFyLnNsaWNlKDEpO1xuXHRcdH1cblx0fVxuXG5cdGlmICh2aWV3KSB7XG5cdFx0b25SZW5kZXIgPSBvblJlbmRlciB8fCB2aWV3Ll8ub25SZW5kZXI7XG5cdFx0Y29udGV4dCA9IGV4dGVuZEN0eChjb250ZXh0LCB2aWV3LmN0eCk7XG5cdH1cblxuXHRpZiAoa2V5ID09PSB0cnVlKSB7XG5cdFx0c3dhcENvbnRlbnQgPSB0cnVlO1xuXHRcdGtleSA9IDA7XG5cdH1cblxuXHQvLyBJZiBsaW5rPT09ZmFsc2UsIGRvIG5vdCBjYWxsIG9uUmVuZGVyLCBzbyBubyBkYXRhLWxpbmtpbmcgbWFya2VyIG5vZGVzXG5cdGlmIChvblJlbmRlciAmJiAoY29udGV4dCAmJiBjb250ZXh0LmxpbmsgPT09IGZhbHNlIHx8IHRhZyAmJiB0YWcuXy5ub1Z3cykpIHtcblx0XHRvblJlbmRlciA9IHVuZGVmaW5lZDtcblx0fVxuXHRvdXRlck9uUmVuZGVyID0gb25SZW5kZXI7XG5cdGlmIChvblJlbmRlciA9PT0gdHJ1ZSkge1xuXHRcdC8vIFVzZWQgYnkgdmlldy5yZWZyZXNoKCkuIERvbid0IGNyZWF0ZSBhIG5ldyB3cmFwcGVyIHZpZXcuXG5cdFx0b3V0ZXJPblJlbmRlciA9IHVuZGVmaW5lZDtcblx0XHRvblJlbmRlciA9IHZpZXcuXy5vblJlbmRlcjtcblx0fVxuXHQvLyBTZXQgYWRkaXRpb25hbCBjb250ZXh0IG9uIHZpZXdzIGNyZWF0ZWQgaGVyZSwgKGFzIG1vZGlmaWVkIGNvbnRleHQgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCwgYW5kIHRvIGJlIGluaGVyaXRlZCBieSBjaGlsZCB2aWV3cylcblx0Y29udGV4dCA9IHRtcGwuaGVscGVyc1xuXHRcdD8gZXh0ZW5kQ3R4KHRtcGwuaGVscGVycywgY29udGV4dClcblx0XHQ6IGNvbnRleHQ7XG5cblx0bmV3Q3R4ID0gY29udGV4dDtcblx0aWYgKCRpc0FycmF5KGRhdGEpICYmICFub0l0ZXJhdGlvbikge1xuXHRcdC8vIENyZWF0ZSBhIHZpZXcgZm9yIHRoZSBhcnJheSwgd2hvc2UgY2hpbGQgdmlld3MgY29ycmVzcG9uZCB0byBlYWNoIGRhdGEgaXRlbS4gKE5vdGU6IGlmIGtleSBhbmQgdmlldyBhcmUgcGFzc2VkIGluXG5cdFx0Ly8gYWxvbmcgd2l0aCBwYXJlbnQgdmlldywgdHJlYXQgYXMgaW5zZXJ0IC1lLmcuIGZyb20gdmlldy5hZGRWaWV3cyAtIHNvIHZpZXcgaXMgYWxyZWFkeSB0aGUgdmlldyBpdGVtIGZvciBhcnJheSlcblx0XHRuZXdWaWV3ID0gc3dhcENvbnRlbnRcblx0XHRcdD8gdmlld1xuXHRcdFx0OiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdmlldylcblx0XHRcdFx0fHwgbmV3IFZpZXcoY29udGV4dCwgXCJhcnJheVwiLCB2aWV3LCBkYXRhLCB0bXBsLCBrZXksIG9uUmVuZGVyLCBjb250ZW50VG1wbCk7XG5cdFx0aWYgKHZpZXcgJiYgdmlldy5fLnVzZUtleSkge1xuXHRcdFx0Ly8gUGFyZW50IGlzIG5vdCBhbiAnYXJyYXkgdmlldydcblx0XHRcdG5ld1ZpZXcuXy5ibmQgPSAhdGFnIHx8IHRhZy5fLmJuZCAmJiB0YWc7IC8vIEZvciBhcnJheSB2aWV3cyB0aGF0IGFyZSBkYXRhIGJvdW5kIGZvciBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHMsIHNldCB0aGVcblx0XHRcdC8vIHZpZXcuXy5ibmQgcHJvcGVydHkgdG8gdHJ1ZSBmb3IgdG9wLWxldmVsIGxpbmsoKSBvciBkYXRhLWxpbms9XCJ7Zm9yfVwiLCBvciB0byB0aGUgdGFnIGluc3RhbmNlIGZvciBhIGRhdGEtYm91bmQgdGFnLCBlLmcuIHtee2ZvciAuLi59fVxuXHRcdH1cblx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0bmV3Vmlldy5pdCA9IGl0ZW1WYXI7XG5cdFx0fVxuXHRcdGl0ZW1WYXIgPSBuZXdWaWV3Lml0O1xuXHRcdGZvciAoaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3IgZWFjaCBkYXRhIGl0ZW0uXG5cdFx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0XHRzZXRJdGVtVmFyKGRhdGFbaV0pOyAvLyB1c2UgbW9kaWZpZWQgY3R4IHdpdGggdXNlci1uYW1lZCB+aXRlbVxuXHRcdFx0fVxuXHRcdFx0Y2hpbGRWaWV3ID0gbmV3IFZpZXcobmV3Q3R4LCBcIml0ZW1cIiwgbmV3VmlldywgZGF0YVtpXSwgdG1wbCwgKGtleSB8fCAwKSArIGksIG9uUmVuZGVyLCBuZXdWaWV3LmNvbnRlbnQpO1xuXG5cdFx0XHRpdGVtUmVzdWx0ID0gdG1wbC5mbihkYXRhW2ldLCBjaGlsZFZpZXcsICRzdWIpO1xuXHRcdFx0cmVzdWx0ICs9IG5ld1ZpZXcuXy5vblJlbmRlciA/IG5ld1ZpZXcuXy5vblJlbmRlcihpdGVtUmVzdWx0LCBjaGlsZFZpZXcpIDogaXRlbVJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQ3JlYXRlIGEgdmlldyBmb3Igc2luZ2xldG9uIGRhdGEgb2JqZWN0LiBUaGUgdHlwZSBvZiB0aGUgdmlldyB3aWxsIGJlIHRoZSB0YWcgbmFtZSwgZS5nLiBcImlmXCIgb3IgXCJteVRhZ1wiIGV4Y2VwdCBmb3Jcblx0XHQvLyBcIml0ZW1cIiwgXCJhcnJheVwiIGFuZCBcImRhdGFcIiB2aWV3cy4gQSBcImRhdGFcIiB2aWV3IGlzIGZyb20gcHJvZ3JhbW1hdGljIHJlbmRlcihvYmplY3QpIGFnYWluc3QgYSAnc2luZ2xldG9uJy5cblx0XHRpZiAoaXRlbVZhcikge1xuXHRcdFx0c2V0SXRlbVZhcihkYXRhKTtcblx0XHR9XG5cdFx0bmV3VmlldyA9IHN3YXBDb250ZW50ID8gdmlldyA6IG5ldyBWaWV3KG5ld0N0eCwgdG1wbE5hbWUgfHwgXCJkYXRhXCIsIHZpZXcsIGRhdGEsIHRtcGwsIGtleSwgb25SZW5kZXIsIGNvbnRlbnRUbXBsKTtcblx0XHRpZiAodGFnICYmICF0YWcuZmxvdykge1xuXHRcdFx0bmV3Vmlldy50YWcgPSB0YWc7XG5cdFx0XHR0YWcudmlldyA9IG5ld1ZpZXc7XG5cdFx0fVxuXHRcdHJlc3VsdCArPSB0bXBsLmZuKGRhdGEsIG5ld1ZpZXcsICRzdWIpO1xuXHR9XG5cdHJldHVybiBvdXRlck9uUmVuZGVyID8gb3V0ZXJPblJlbmRlcihyZXN1bHQsIG5ld1ZpZXcpIDogcmVzdWx0O1xufVxuXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbGQgYW5kIGNvbXBpbGUgdGVtcGxhdGVcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIEdlbmVyYXRlIGEgcmV1c2FibGUgZnVuY3Rpb24gdGhhdCB3aWxsIHNlcnZlIHRvIHJlbmRlciBhIHRlbXBsYXRlIGFnYWluc3QgZGF0YVxuLy8gKENvbXBpbGUgQVNUIHRoZW4gYnVpbGQgdGVtcGxhdGUgZnVuY3Rpb24pXG5cbmZ1bmN0aW9uIG9uUmVuZGVyRXJyb3IoZSwgdmlldywgZmFsbGJhY2spIHtcblx0dmFyIG1lc3NhZ2UgPSBmYWxsYmFjayAhPT0gdW5kZWZpbmVkXG5cdFx0PyAkaXNGdW5jdGlvbihmYWxsYmFjaylcblx0XHRcdD8gZmFsbGJhY2suY2FsbCh2aWV3LmRhdGEsIGUsIHZpZXcpXG5cdFx0XHQ6IGZhbGxiYWNrIHx8IFwiXCJcblx0XHQ6IFwie0Vycm9yOiBcIiArIGUubWVzc2FnZSArIFwifVwiO1xuXG5cdGlmICgkc3ViU2V0dGluZ3Mub25FcnJvciAmJiAoZmFsbGJhY2sgPSAkc3ViU2V0dGluZ3Mub25FcnJvci5jYWxsKHZpZXcuZGF0YSwgZSwgZmFsbGJhY2sgJiYgbWVzc2FnZSwgdmlldykpICE9PSB1bmRlZmluZWQpIHtcblx0XHRtZXNzYWdlID0gZmFsbGJhY2s7IC8vIFRoZXJlIGlzIGEgc2V0dGluZ3MuZGVidWdNb2RlKGhhbmRsZXIpIG9uRXJyb3Igb3ZlcnJpZGUuIENhbGwgaXQsIGFuZCB1c2UgcmV0dXJuIHZhbHVlIChpZiBhbnkpIHRvIHJlcGxhY2UgbWVzc2FnZVxuXHR9XG5cblx0cmV0dXJuIHZpZXcgJiYgIXZpZXcubGlua0N0eCA/ICRjb252ZXJ0ZXJzLmh0bWwobWVzc2FnZSkgOiBtZXNzYWdlO1xufVxuXG5mdW5jdGlvbiBlcnJvcihtZXNzYWdlKSB7XG5cdHRocm93IG5ldyAkc3ViLkVycihtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gc3ludGF4RXJyb3IobWVzc2FnZSkge1xuXHRlcnJvcihcIlN5bnRheCBlcnJvclxcblwiICsgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHRtcGxGbihtYXJrdXAsIHRtcGwsIGlzTGlua0V4cHIsIGNvbnZlcnRCYWNrLCBoYXNFbHNlKSB7XG5cdC8vIENvbXBpbGUgbWFya3VwIHRvIEFTVCAoYWJ0cmFjdCBzeW50YXggdHJlZSkgdGhlbiBidWlsZCB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBBU1Qgbm9kZXNcblx0Ly8gVXNlZCBmb3IgY29tcGlsaW5nIHRlbXBsYXRlcywgYW5kIGFsc28gYnkgSnNWaWV3cyB0byBidWlsZCBmdW5jdGlvbnMgZm9yIGRhdGEgbGluayBleHByZXNzaW9uc1xuXG5cdC8vPT09PSBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblx0ZnVuY3Rpb24gcHVzaHByZWNlZGluZ0NvbnRlbnQoc2hpZnQpIHtcblx0XHRzaGlmdCAtPSBsb2M7XG5cdFx0aWYgKHNoaWZ0KSB7XG5cdFx0XHRjb250ZW50LnB1c2gobWFya3VwLnN1YnN0cihsb2MsIHNoaWZ0KS5yZXBsYWNlKHJOZXdMaW5lLCBcIlxcXFxuXCIpKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBibG9ja1RhZ0NoZWNrKHRhZ05hbWUsIGJsb2NrKSB7XG5cdFx0aWYgKHRhZ05hbWUpIHtcblx0XHRcdHRhZ05hbWUgKz0gJ319Jztcblx0XHRcdC8vXHRcdFx0J3t7aW5jbHVkZX19IGJsb2NrIGhhcyB7ey9mb3J9fSB3aXRoIG5vIG9wZW4ge3tmb3J9fSdcblx0XHRcdHN5bnRheEVycm9yKChcblx0XHRcdFx0YmxvY2tcblx0XHRcdFx0XHQ/ICd7eycgKyBibG9jayArICd9fSBibG9jayBoYXMge3svJyArIHRhZ05hbWUgKyAnIHdpdGhvdXQge3snICsgdGFnTmFtZVxuXHRcdFx0XHRcdDogJ1VubWF0Y2hlZCBvciBtaXNzaW5nIHt7LycgKyB0YWdOYW1lKSArICcsIGluIHRlbXBsYXRlOlxcbicgKyBtYXJrdXApO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlVGFnKGFsbCwgYmluZCwgdGFnTmFtZSwgY29udmVydGVyLCBjb2xvbiwgaHRtbCwgY29kZVRhZywgcGFyYW1zLCBzbGFzaCwgYmluZDIsIGNsb3NlQmxvY2ssIGluZGV4KSB7XG4vKlxuXG4gICAgIGJpbmQgICAgIHRhZ05hbWUgICAgICAgICBjdnQgICBjbG4gaHRtbCBjb2RlICAgIHBhcmFtcyAgICAgICAgICAgIHNsYXNoICAgYmluZDIgICAgICAgICBjbG9zZUJsayAgY29tbWVudFxuLyg/OnsoXFxeKT97KD86KFxcdysoPz1bXFwvXFxzfV0pKXwoXFx3Kyk/KDopfCg+KXwoXFwqKSlcXHMqKCg/OltefV18fSg/IX0pKSo/KShcXC8pP3x7KFxcXik/eyg/Oig/OlxcLyhcXHcrKSlcXHMqfCEtLVtcXHNcXFNdKj8tLSkpfX0vZ1xuXG4oPzpcbiAgeyhcXF4pP3sgICAgICAgICAgICBiaW5kXG4gICg/OlxuICAgIChcXHcrICAgICAgICAgICAgIHRhZ05hbWVcbiAgICAgICg/PVtcXC9cXHN9XSlcbiAgICApXG4gICAgfFxuICAgIChcXHcrKT8oOikgICAgICAgIGNvbnZlcnRlciBjb2xvblxuICAgIHxcbiAgICAoPikgICAgICAgICAgICAgIGh0bWxcbiAgICB8XG4gICAgKFxcKikgICAgICAgICAgICAgY29kZVRhZ1xuICApXG4gIFxccypcbiAgKCAgICAgICAgICAgICAgICAgIHBhcmFtc1xuICAgICg/OltefV18fSg/IX0pKSo/XG4gIClcbiAgKFxcLyk/ICAgICAgICAgICAgICBzbGFzaFxuICB8XG4gIHsoXFxeKT97ICAgICAgICAgICAgYmluZDJcbiAgKD86XG4gICAgKD86XFwvKFxcdyspKVxccyogICBjbG9zZUJsb2NrXG4gICAgfFxuICAgICEtLVtcXHNcXFNdKj8tLSAgICBjb21tZW50XG4gIClcbilcbn19L2dcblxuKi9cblx0XHRpZiAoY29kZVRhZyAmJiBiaW5kIHx8IHNsYXNoICYmICF0YWdOYW1lIHx8IHBhcmFtcyAmJiBwYXJhbXMuc2xpY2UoLTEpID09PSBcIjpcIiB8fCBiaW5kMikge1xuXHRcdFx0c3ludGF4RXJyb3IoYWxsKTtcblx0XHR9XG5cblx0XHQvLyBCdWlsZCBhYnN0cmFjdCBzeW50YXggdHJlZSAoQVNUKTogW3RhZ05hbWUsIGNvbnZlcnRlciwgcGFyYW1zLCBjb250ZW50LCBoYXNoLCBiaW5kaW5ncywgY29udGVudE1hcmt1cF1cblx0XHRpZiAoaHRtbCkge1xuXHRcdFx0Y29sb24gPSBcIjpcIjtcblx0XHRcdGNvbnZlcnRlciA9IEhUTUw7XG5cdFx0fVxuXHRcdHNsYXNoID0gc2xhc2ggfHwgaXNMaW5rRXhwciAmJiAhaGFzRWxzZTtcblxuXHRcdHZhciBwYXRoQmluZGluZ3MgPSAoYmluZCB8fCBpc0xpbmtFeHByKSAmJiBbW11dLFxuXHRcdFx0cHJvcHMgPSBcIlwiLFxuXHRcdFx0YXJncyA9IFwiXCIsXG5cdFx0XHRjdHhQcm9wcyA9IFwiXCIsXG5cdFx0XHRwYXJhbXNBcmdzID0gXCJcIixcblx0XHRcdHBhcmFtc1Byb3BzID0gXCJcIixcblx0XHRcdHBhcmFtc0N0eFByb3BzID0gXCJcIixcblx0XHRcdG9uRXJyb3IgPSBcIlwiLFxuXHRcdFx0dXNlVHJpZ2dlciA9IFwiXCIsXG5cdFx0XHQvLyBCbG9jayB0YWcgaWYgbm90IHNlbGYtY2xvc2luZyBhbmQgbm90IHt7On19IG9yIHt7Pn19IChzcGVjaWFsIGNhc2UpIGFuZCBub3QgYSBkYXRhLWxpbmsgZXhwcmVzc2lvblxuXHRcdFx0YmxvY2sgPSAhc2xhc2ggJiYgIWNvbG9uO1xuXG5cdFx0Ly89PT09IG5lc3RlZCBoZWxwZXIgZnVuY3Rpb24gPT09PVxuXHRcdHRhZ05hbWUgPSB0YWdOYW1lIHx8IChwYXJhbXMgPSBwYXJhbXMgfHwgXCIjZGF0YVwiLCBjb2xvbik7IC8vIHt7On19IGlzIGVxdWl2YWxlbnQgdG8ge3s6I2RhdGF9fVxuXHRcdHB1c2hwcmVjZWRpbmdDb250ZW50KGluZGV4KTtcblx0XHRsb2MgPSBpbmRleCArIGFsbC5sZW5ndGg7IC8vIGxvY2F0aW9uIG1hcmtlciAtIHBhcnNlZCB1cCB0byBoZXJlXG5cdFx0aWYgKGNvZGVUYWcpIHtcblx0XHRcdGlmIChhbGxvd0NvZGUpIHtcblx0XHRcdFx0Y29udGVudC5wdXNoKFtcIipcIiwgXCJcXG5cIiArIHBhcmFtcy5yZXBsYWNlKC9eOi8sIFwicmV0Kz0gXCIpLnJlcGxhY2UoclVuZXNjYXBlUXVvdGVzLCBcIiQxXCIpICsgXCI7XFxuXCJdKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRhZ05hbWUpIHtcblx0XHRcdGlmICh0YWdOYW1lID09PSBcImVsc2VcIikge1xuXHRcdFx0XHRpZiAoclRlc3RFbHNlSWYudGVzdChwYXJhbXMpKSB7XG5cdFx0XHRcdFx0c3ludGF4RXJyb3IoJ2ZvciBcInt7ZWxzZSBpZiBleHByfX1cIiB1c2UgXCJ7e2Vsc2UgZXhwcn19XCInKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYXRoQmluZGluZ3MgPSBjdXJyZW50WzddICYmIFtbXV07XG5cdFx0XHRcdGN1cnJlbnRbOF0gPSBtYXJrdXAuc3Vic3RyaW5nKGN1cnJlbnRbOF0sIGluZGV4KTsgLy8gY29udGVudE1hcmt1cCBmb3IgYmxvY2sgdGFnXG5cdFx0XHRcdGN1cnJlbnQgPSBzdGFjay5wb3AoKTtcblx0XHRcdFx0Y29udGVudCA9IGN1cnJlbnRbMl07XG5cdFx0XHRcdGJsb2NrID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIG5ld2xpbmVzIGZyb20gdGhlIHBhcmFtcyBzdHJpbmcsIHRvIGF2b2lkIGNvbXBpbGVkIGNvZGUgZXJyb3JzIGZvciB1bnRlcm1pbmF0ZWQgc3RyaW5nc1xuXHRcdFx0XHRwYXJzZVBhcmFtcyhwYXJhbXMucmVwbGFjZShyTmV3TGluZSwgXCIgXCIpLCBwYXRoQmluZGluZ3MsIHRtcGwpXG5cdFx0XHRcdFx0LnJlcGxhY2UockJ1aWxkSGFzaCwgZnVuY3Rpb24oYWxsLCBvbmVycm9yLCBpc0N0eCwga2V5LCBrZXlUb2tlbiwga2V5VmFsdWUsIGFyZywgcGFyYW0pIHtcblx0XHRcdFx0XHRcdGtleSA9IFwiJ1wiICsga2V5VG9rZW4gKyBcIic6XCI7XG5cdFx0XHRcdFx0XHRpZiAoYXJnKSB7XG5cdFx0XHRcdFx0XHRcdGFyZ3MgKz0ga2V5VmFsdWUgKyBcIixcIjtcblx0XHRcdFx0XHRcdFx0cGFyYW1zQXJncyArPSBcIidcIiArIHBhcmFtICsgXCInLFwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpc0N0eCkge1xuXHRcdFx0XHRcdFx0XHRjdHhQcm9wcyArPSBrZXkgKyAnai5fY3AoJyArIGtleVZhbHVlICsgJyxcIicgKyBwYXJhbSArICdcIix2aWV3KSwnO1xuXHRcdFx0XHRcdFx0XHQvLyBDb21waWxlZCBjb2RlIGZvciBldmFsdWF0aW5nIHRhZ0N0eCBvbiBhIHRhZyB3aWxsIGhhdmU6IGN0eDp7J2Zvbyc6ai5fY3AoY29tcGlsZWRFeHByLCBcImV4cHJcIiwgdmlldyl9XG5cdFx0XHRcdFx0XHRcdHBhcmFtc0N0eFByb3BzICs9IGtleSArIFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9uZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0b25FcnJvciArPSBrZXlWYWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmIChrZXlUb2tlbiA9PT0gXCJ0cmlnZ2VyXCIpIHtcblx0XHRcdFx0XHRcdFx0XHR1c2VUcmlnZ2VyICs9IGtleVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHByb3BzICs9IGtleSArIGtleVZhbHVlICsgXCIsXCI7XG5cdFx0XHRcdFx0XHRcdHBhcmFtc1Byb3BzICs9IGtleSArIFwiJ1wiICsgcGFyYW0gKyBcIicsXCI7XG5cdFx0XHRcdFx0XHRcdGhhc0hhbmRsZXJzID0gaGFzSGFuZGxlcnMgfHwgckhhc0hhbmRsZXJzLnRlc3Qoa2V5VG9rZW4pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0XHRcdFx0fSkuc2xpY2UoMCwgLTEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGF0aEJpbmRpbmdzICYmIHBhdGhCaW5kaW5nc1swXSkge1xuXHRcdFx0XHRwYXRoQmluZGluZ3MucG9wKCk7IC8vIFJlbW92ZSB0aGUgYmluZGluZ3MgdGhhdCB3YXMgcHJlcGFyZWQgZm9yIG5leHQgYXJnLiAoVGhlcmUgaXMgYWx3YXlzIGFuIGV4dHJhIG9uZSByZWFkeSkuXG5cdFx0XHR9XG5cblx0XHRcdG5ld05vZGUgPSBbXG5cdFx0XHRcdFx0dGFnTmFtZSxcblx0XHRcdFx0XHRjb252ZXJ0ZXIgfHwgISFjb252ZXJ0QmFjayB8fCBoYXNIYW5kbGVycyB8fCBcIlwiLFxuXHRcdFx0XHRcdGJsb2NrICYmIFtdLFxuXHRcdFx0XHRcdHBhcnNlZFBhcmFtKHBhcmFtc0FyZ3MgfHwgKHRhZ05hbWUgPT09IFwiOlwiID8gXCInI2RhdGEnLFwiIDogXCJcIiksIHBhcmFtc1Byb3BzLCBwYXJhbXNDdHhQcm9wcyksIC8vIHt7On19IGVxdWl2YWxlbnQgdG8ge3s6I2RhdGF9fVxuXHRcdFx0XHRcdHBhcnNlZFBhcmFtKGFyZ3MgfHwgKHRhZ05hbWUgPT09IFwiOlwiID8gXCJkYXRhLFwiIDogXCJcIiksIHByb3BzLCBjdHhQcm9wcyksXG5cdFx0XHRcdFx0b25FcnJvcixcblx0XHRcdFx0XHR1c2VUcmlnZ2VyLFxuXHRcdFx0XHRcdHBhdGhCaW5kaW5ncyB8fCAwXG5cdFx0XHRcdF07XG5cdFx0XHRjb250ZW50LnB1c2gobmV3Tm9kZSk7XG5cdFx0XHRpZiAoYmxvY2spIHtcblx0XHRcdFx0c3RhY2sucHVzaChjdXJyZW50KTtcblx0XHRcdFx0Y3VycmVudCA9IG5ld05vZGU7XG5cdFx0XHRcdGN1cnJlbnRbOF0gPSBsb2M7IC8vIFN0b3JlIGN1cnJlbnQgbG9jYXRpb24gb2Ygb3BlbiB0YWcsIHRvIGJlIGFibGUgdG8gYWRkIGNvbnRlbnRNYXJrdXAgd2hlbiB3ZSByZWFjaCBjbG9zaW5nIHRhZ1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2xvc2VCbG9jaykge1xuXHRcdFx0YmxvY2tUYWdDaGVjayhjbG9zZUJsb2NrICE9PSBjdXJyZW50WzBdICYmIGN1cnJlbnRbMF0gIT09IFwiZWxzZVwiICYmIGNsb3NlQmxvY2ssIGN1cnJlbnRbMF0pO1xuXHRcdFx0Y3VycmVudFs4XSA9IG1hcmt1cC5zdWJzdHJpbmcoY3VycmVudFs4XSwgaW5kZXgpOyAvLyBjb250ZW50TWFya3VwIGZvciBibG9jayB0YWdcblx0XHRcdGN1cnJlbnQgPSBzdGFjay5wb3AoKTtcblx0XHR9XG5cdFx0YmxvY2tUYWdDaGVjayghY3VycmVudCAmJiBjbG9zZUJsb2NrKTtcblx0XHRjb250ZW50ID0gY3VycmVudFsyXTtcblx0fVxuXHQvLz09PT0gL2VuZCBvZiBuZXN0ZWQgZnVuY3Rpb25zID09PT1cblxuXHR2YXIgaSwgcmVzdWx0LCBuZXdOb2RlLCBoYXNIYW5kbGVycywgYmluZGluZ3MsXG5cdFx0YWxsb3dDb2RlID0gJHN1YlNldHRpbmdzLmFsbG93Q29kZSB8fCB0bXBsICYmIHRtcGwuYWxsb3dDb2RlXG5cdFx0XHR8fCAkdmlld3NTZXR0aW5ncy5hbGxvd0NvZGUgPT09IHRydWUsIC8vIGluY2x1ZGUgZGlyZWN0IHNldHRpbmcgb2Ygc2V0dGluZ3MuYWxsb3dDb2RlIHRydWUgZm9yIGJhY2t3YXJkIGNvbXBhdCBvbmx5XG5cdFx0YXN0VG9wID0gW10sXG5cdFx0bG9jID0gMCxcblx0XHRzdGFjayA9IFtdLFxuXHRcdGNvbnRlbnQgPSBhc3RUb3AsXG5cdFx0Y3VycmVudCA9IFssLGFzdFRvcF07XG5cblx0aWYgKGFsbG93Q29kZSAmJiB0bXBsLl9pcykge1xuXHRcdHRtcGwuYWxsb3dDb2RlID0gYWxsb3dDb2RlO1xuXHR9XG5cbi8vVE9ET1x0cmVzdWx0ID0gdG1wbEZuc0NhY2hlW21hcmt1cF07IC8vIE9ubHkgY2FjaGUgaWYgdGVtcGxhdGUgaXMgbm90IG5hbWVkIGFuZCBtYXJrdXAgbGVuZ3RoIDwgLi4uLFxuLy9hbmQgdGhlcmUgYXJlIG5vIGJpbmRpbmdzIG9yIHN1YnRlbXBsYXRlcz8/IENvbnNpZGVyIHN0YW5kYXJkIG9wdGltaXphdGlvbiBmb3IgZGF0YS1saW5rPVwiYS5iLmNcIlxuLy9cdFx0aWYgKHJlc3VsdCkge1xuLy9cdFx0XHR0bXBsLmZuID0gcmVzdWx0O1xuLy9cdFx0fSBlbHNlIHtcblxuLy9cdFx0cmVzdWx0ID0gbWFya3VwO1xuXHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdGlmIChjb252ZXJ0QmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtYXJrdXAgPSBtYXJrdXAuc2xpY2UoMCwgLWNvbnZlcnRCYWNrLmxlbmd0aCAtIDIpICsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdH1cblx0XHRtYXJrdXAgPSBkZWxpbU9wZW5DaGFyMCArIG1hcmt1cCArIGRlbGltQ2xvc2VDaGFyMTtcblx0fVxuXG5cdGJsb2NrVGFnQ2hlY2soc3RhY2tbMF0gJiYgc3RhY2tbMF1bMl0ucG9wKClbMF0pO1xuXHQvLyBCdWlsZCB0aGUgQVNUIChhYnN0cmFjdCBzeW50YXggdHJlZSkgdW5kZXIgYXN0VG9wXG5cdG1hcmt1cC5yZXBsYWNlKHJUYWcsIHBhcnNlVGFnKTtcblxuXHRwdXNocHJlY2VkaW5nQ29udGVudChtYXJrdXAubGVuZ3RoKTtcblxuXHRpZiAobG9jID0gYXN0VG9wW2FzdFRvcC5sZW5ndGggLSAxXSkge1xuXHRcdGJsb2NrVGFnQ2hlY2soXCJcIiArIGxvYyAhPT0gbG9jICYmICgrbG9jWzhdID09PSBsb2NbOF0pICYmIGxvY1swXSk7XG5cdH1cbi8vXHRcdFx0cmVzdWx0ID0gdG1wbEZuc0NhY2hlW21hcmt1cF0gPSBidWlsZENvZGUoYXN0VG9wLCB0bXBsKTtcbi8vXHRcdH1cblxuXHRpZiAoaXNMaW5rRXhwcikge1xuXHRcdHJlc3VsdCA9IGJ1aWxkQ29kZShhc3RUb3AsIG1hcmt1cCwgaXNMaW5rRXhwcik7XG5cdFx0YmluZGluZ3MgPSBbXTtcblx0XHRpID0gYXN0VG9wLmxlbmd0aDtcblx0XHR3aGlsZSAoaS0tKSB7XG5cdFx0XHRiaW5kaW5ncy51bnNoaWZ0KGFzdFRvcFtpXVs3XSk7ICAvLyBXaXRoIGRhdGEtbGluayBleHByZXNzaW9ucywgcGF0aEJpbmRpbmdzIGFycmF5IGZvciB0YWdDdHhbaV0gaXMgYXN0VG9wW2ldWzddXG5cdFx0fVxuXHRcdHNldFBhdGhzKHJlc3VsdCwgYmluZGluZ3MpO1xuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9IGJ1aWxkQ29kZShhc3RUb3AsIHRtcGwpO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNldFBhdGhzKGZuLCBwYXRoc0Fycikge1xuXHR2YXIga2V5LCBwYXRocyxcblx0XHRpID0gMCxcblx0XHRsID0gcGF0aHNBcnIubGVuZ3RoO1xuXHRmbi5kZXBzID0gW107XG5cdGZuLnBhdGhzID0gW107IC8vIFRoZSBhcnJheSBvZiBwYXRoIGJpbmRpbmcgKGFycmF5L2RpY3Rpb25hcnkpcyBmb3IgZWFjaCB0YWcvZWxzZSBibG9jaydzIGFyZ3MgYW5kIHByb3BzXG5cdGZvciAoOyBpIDwgbDsgaSsrKSB7XG5cdFx0Zm4ucGF0aHMucHVzaChwYXRocyA9IHBhdGhzQXJyW2ldKTtcblx0XHRmb3IgKGtleSBpbiBwYXRocykge1xuXHRcdFx0aWYgKGtleSAhPT0gXCJfanN2dG9cIiAmJiBwYXRocy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHBhdGhzW2tleV0ubGVuZ3RoICYmICFwYXRoc1trZXldLnNrcCkge1xuXHRcdFx0XHRmbi5kZXBzID0gZm4uZGVwcy5jb25jYXQocGF0aHNba2V5XSk7IC8vIGRlcHMgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHBhdGhzIGFycmF5cyBmb3IgdGhlIGRpZmZlcmVudCBiaW5kaW5nc1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwYXJzZWRQYXJhbShhcmdzLCBwcm9wcywgY3R4KSB7XG5cdHJldHVybiBbYXJncy5zbGljZSgwLCAtMSksIHByb3BzLnNsaWNlKDAsIC0xKSwgY3R4LnNsaWNlKDAsIC0xKV07XG59XG5cbmZ1bmN0aW9uIHBhcmFtU3RydWN0dXJlKHBhcnRzLCB0eXBlKSB7XG5cdHJldHVybiAnXFxuXFx0J1xuXHRcdCsgKHR5cGVcblx0XHRcdD8gdHlwZSArICc6eydcblx0XHRcdDogJycpXG5cdFx0KyAnYXJnczpbJyArIHBhcnRzWzBdICsgJ10nXG5cdFx0KyAocGFydHNbMV0gfHwgIXR5cGVcblx0XHRcdD8gJyxcXG5cXHRwcm9wczp7JyArIHBhcnRzWzFdICsgJ30nXG5cdFx0XHQ6IFwiXCIpXG5cdFx0KyAocGFydHNbMl0gPyAnLFxcblxcdGN0eDp7JyArIHBhcnRzWzJdICsgJ30nIDogXCJcIik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zKHBhcmFtcywgcGF0aEJpbmRpbmdzLCB0bXBsKSB7XG5cblx0ZnVuY3Rpb24gcGFyc2VUb2tlbnMoYWxsLCBsZnRQcm4wLCBsZnRQcm4sIGJvdW5kLCBwYXRoLCBvcGVyYXRvciwgZXJyLCBlcSwgcGF0aDIsIHBybiwgY29tbWEsIGxmdFBybjIsIGFwb3MsIHF1b3QsIHJ0UHJuLCBydFBybkRvdCwgcHJuMiwgc3BhY2UsIGluZGV4LCBmdWxsKSB7XG5cdC8vIC8oXFwoKSg/PVxccypcXCgpfCg/OihbKFtdKVxccyopPyg/OihcXF4/KSghKj9bI35dP1tcXHckLl5dKyk/XFxzKigoXFwrXFwrfC0tKXxcXCt8LXwmJnxcXHxcXHx8PT09fCE9PXw9PXwhPXw8PXw+PXxbPD4lKjo/XFwvXXwoPSkpXFxzKnwoISo/WyN+XT9bXFx3JC5eXSspKFsoW10pPyl8KCxcXHMqKXwoXFwoPylcXFxcPyg/OignKXwoXCIpKXwoPzpcXHMqKChbKVxcXV0pKD89XFxzKlsuXl18XFxzKiR8W14oW10pfFspXFxdXSkoWyhbXT8pKXwoXFxzKykvZyxcblx0Ly8gICBsZnRQcm4wICAgICAgICBsZnRQcm4gICAgICAgIGJvdW5kICAgICAgICAgICAgcGF0aCAgICBvcGVyYXRvciBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcSAgICAgICAgICAgICBwYXRoMiAgICAgICBwcm4gICAgY29tbWEgICBsZnRQcm4yICAgYXBvcyBxdW90ICAgICAgcnRQcm4gcnRQcm5Eb3QgICAgICAgICAgICAgICAgICAgICAgICBwcm4yICBzcGFjZVxuXHRcdC8vIChsZWZ0IHBhcmVuPyBmb2xsb3dlZCBieSAocGF0aD8gZm9sbG93ZWQgYnkgb3BlcmF0b3IpIG9yIChwYXRoIGZvbGxvd2VkIGJ5IHBhcmVuPykpIG9yIGNvbW1hIG9yIGFwb3Mgb3IgcXVvdCBvciByaWdodCBwYXJlbiBvciBzcGFjZVxuXHRcdGZ1bmN0aW9uIHBhcnNlUGF0aChhbGxQYXRoLCBub3QsIG9iamVjdCwgaGVscGVyLCB2aWV3LCB2aWV3UHJvcGVydHksIHBhdGhUb2tlbnMsIGxlYWZUb2tlbikge1xuXHRcdFx0Ly9yUGF0aCA9IC9eKCEqPykoPzpudWxsfHRydWV8ZmFsc2V8XFxkW1xcZC5dKnwoW1xcdyRdK3xcXC58fihbXFx3JF0rKXwjKHZpZXd8KFtcXHckXSspKT8pKFtcXHckLl5dKj8pKD86Wy5bXl0oW1xcdyRdKylcXF0/KT8pJC9nLFxuXHRcdFx0Ly8gICAgICAgICAgbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCAgICAgaGVscGVyICAgIHZpZXcgIHZpZXdQcm9wZXJ0eSBwYXRoVG9rZW5zICAgICAgbGVhZlRva2VuXG5cdFx0XHR2YXIgc3ViUGF0aCA9IG9iamVjdCA9PT0gXCIuXCI7XG5cdFx0XHRpZiAob2JqZWN0KSB7XG5cdFx0XHRcdHBhdGggPSBwYXRoLnNsaWNlKG5vdC5sZW5ndGgpO1xuXHRcdFx0XHRpZiAoL15cXC4/Y29uc3RydWN0b3IkLy50ZXN0KGxlYWZUb2tlbnx8cGF0aCkpIHtcblx0XHRcdFx0XHRzeW50YXhFcnJvcihhbGxQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXN1YlBhdGgpIHtcblx0XHRcdFx0XHRhbGxQYXRoID0gKGhlbHBlclxuXHRcdFx0XHRcdFx0XHQ/ICd2aWV3LmhscChcIicgKyBoZWxwZXIgKyAnXCIpJ1xuXHRcdFx0XHRcdFx0XHQ6IHZpZXdcblx0XHRcdFx0XHRcdFx0XHQ/IFwidmlld1wiXG5cdFx0XHRcdFx0XHRcdFx0OiBcImRhdGFcIilcblx0XHRcdFx0XHRcdCsgKGxlYWZUb2tlblxuXHRcdFx0XHRcdFx0XHQ/ICh2aWV3UHJvcGVydHlcblx0XHRcdFx0XHRcdFx0XHQ/IFwiLlwiICsgdmlld1Byb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0OiBoZWxwZXJcblx0XHRcdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0OiAodmlldyA/IFwiXCIgOiBcIi5cIiArIG9iamVjdClcblx0XHRcdFx0XHRcdFx0XHQpICsgKHBhdGhUb2tlbnMgfHwgXCJcIilcblx0XHRcdFx0XHRcdFx0OiAobGVhZlRva2VuID0gaGVscGVyID8gXCJcIiA6IHZpZXcgPyB2aWV3UHJvcGVydHkgfHwgXCJcIiA6IG9iamVjdCwgXCJcIikpO1xuXG5cdFx0XHRcdFx0YWxsUGF0aCA9IGFsbFBhdGggKyAobGVhZlRva2VuID8gXCIuXCIgKyBsZWFmVG9rZW4gOiBcIlwiKTtcblxuXHRcdFx0XHRcdGFsbFBhdGggPSBub3QgKyAoYWxsUGF0aC5zbGljZSgwLCA5KSA9PT0gXCJ2aWV3LmRhdGFcIlxuXHRcdFx0XHRcdFx0PyBhbGxQYXRoLnNsaWNlKDUpIC8vIGNvbnZlcnQgI3ZpZXcuZGF0YS4uLiB0byBkYXRhLi4uXG5cdFx0XHRcdFx0XHQ6IGFsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChiaW5kaW5ncykge1xuXHRcdFx0XHRcdGJpbmRzID0gbmFtZWQgPT09IFwibGlua1RvXCIgPyAoYmluZHRvID0gcGF0aEJpbmRpbmdzLl9qc3Z0byA9IHBhdGhCaW5kaW5ncy5fanN2dG8gfHwgW10pIDogYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdGlmICh0aGVPYiA9IHN1YlBhdGggJiYgYmluZHNbYmluZHMubGVuZ3RoLTFdKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhlT2IuX2pzdikge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAodGhlT2Iuc2IpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGVPYiA9IHRoZU9iLnNiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0aGVPYi5ibmQpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoID0gXCJeXCIgKyBwYXRoLnNsaWNlKDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoZU9iLnNiID0gcGF0aDtcblx0XHRcdFx0XHRcdFx0dGhlT2IuYm5kID0gdGhlT2IuYm5kIHx8IHBhdGguY2hhckF0KDApID09PSBcIl5cIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YmluZHMucHVzaChwYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGF0aFN0YXJ0W3BhcmVuRGVwdGhdID0gaW5kZXggKyAoc3ViUGF0aCA/IDEgOiAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFsbFBhdGg7XG5cdFx0fVxuXG5cdFx0Ly9ib3VuZCA9IGJpbmRpbmdzICYmIGJvdW5kO1xuXHRcdGlmIChib3VuZCAmJiAhZXEpIHtcblx0XHRcdHBhdGggPSBib3VuZCArIHBhdGg7IC8vIGUuZy4gc29tZS5mbiguLi4pXnNvbWUucGF0aCAtIHNvIGhlcmUgcGF0aCBpcyBcIl5zb21lLnBhdGhcIlxuXHRcdH1cblx0XHRvcGVyYXRvciA9IG9wZXJhdG9yIHx8IFwiXCI7XG5cdFx0bGZ0UHJuID0gbGZ0UHJuIHx8IGxmdFBybjAgfHwgbGZ0UHJuMjtcblx0XHRwYXRoID0gcGF0aCB8fCBwYXRoMjtcblx0XHQvLyBDb3VsZCBkbyB0aGlzIC0gYnV0IG5vdCB3b3J0aCBwZXJmIGNvc3Q/PyA6LVxuXHRcdC8vIGlmICghcGF0aC5sYXN0SW5kZXhPZihcIiNkYXRhLlwiLCAwKSkgeyBwYXRoID0gcGF0aC5zbGljZSg2KTsgfSAvLyBJZiBwYXRoIHN0YXJ0cyB3aXRoIFwiI2RhdGEuXCIsIHJlbW92ZSB0aGF0LlxuXHRcdHBybiA9IHBybiB8fCBwcm4yIHx8IFwiXCI7XG5cblx0XHR2YXIgZXhwciwgZXhwckZuLCBiaW5kcywgdGhlT2IsIG5ld09iLFxuXHRcdFx0cnRTcSA9IFwiKVwiO1xuXG5cdFx0aWYgKHBybiA9PT0gXCJbXCIpIHtcblx0XHRcdHBybiAgPVwiW2ouX3NxKFwiO1xuXHRcdFx0cnRTcSA9IFwiKV1cIjtcblx0XHR9XG5cblx0XHRpZiAoZXJyICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0c3ludGF4RXJyb3IocGFyYW1zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGJpbmRpbmdzICYmIHJ0UHJuRG90ICYmICFhcG9zZWQgJiYgIXF1b3RlZCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgYmluZGluZyB0byBhIHBhdGggaW4gd2hpY2ggYW4gb2JqZWN0IGlzIHJldHVybmVkIGJ5IGEgaGVscGVyL2RhdGEgZnVuY3Rpb24vZXhwcmVzc2lvbiwgZS5nLiBmb28oKV54Lnkgb3IgKGE/YjpjKV54Lnlcblx0XHRcdFx0Ly8gV2UgY3JlYXRlIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gZ2V0IHRoZSBvYmplY3QgaW5zdGFuY2UgKHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGRlcGVuZGVudCBkYXRhIG9mIHRoZSBzdWJleHByZXNzaW9uIGNoYW5nZXMsIHRvIHJldHVybiB0aGUgbmV3IG9iamVjdCwgYW5kIHRyaWdnZXIgcmUtYmluZGluZyBvZiB0aGUgc3Vic2VxdWVudCBwYXRoKVxuXHRcdFx0XHRpZiAoIW5hbWVkIHx8IGJvdW5kTmFtZSB8fCBiaW5kdG8pIHtcblx0XHRcdFx0XHRleHByID0gcGF0aFN0YXJ0W3BhcmVuRGVwdGggLSAxXTtcblx0XHRcdFx0XHRpZiAoZnVsbC5sZW5ndGggLSAxID4gaW5kZXggLSAoZXhwciB8fCAwKSkgeyAvLyBXZSBuZWVkIHRvIGNvbXBpbGUgYSBzdWJleHByZXNzaW9uXG5cdFx0XHRcdFx0XHRleHByID0gZnVsbC5zbGljZShleHByLCBpbmRleCArIGFsbC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0aWYgKGV4cHJGbiAhPT0gdHJ1ZSkgeyAvLyBJZiBub3QgcmVlbnRyYW50IGNhbGwgZHVyaW5nIGNvbXBpbGF0aW9uXG5cdFx0XHRcdFx0XHRcdGJpbmRzID0gYmluZHRvIHx8IGJuZFN0YWNrW3BhcmVuRGVwdGgtMV0uYmQ7XG5cdFx0XHRcdFx0XHRcdC8vIEluc2VydCBleHByT2Igb2JqZWN0LCB0byBiZSB1c2VkIGR1cmluZyBiaW5kaW5nIHRvIHJldHVybiB0aGUgY29tcHV0ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdHRoZU9iID0gYmluZHNbYmluZHMubGVuZ3RoLTFdO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhlT2IgJiYgdGhlT2IucHJtKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKHRoZU9iLnNiICYmIHRoZU9iLnNiLnBybSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhlT2IgPSB0aGVPYi5zYjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bmV3T2IgPSB0aGVPYi5zYiA9IHtwYXRoOiB0aGVPYi5zYiwgYm5kOiB0aGVPYi5ibmR9O1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGJpbmRzLnB1c2gobmV3T2IgPSB7cGF0aDogYmluZHMucG9wKCl9KTsgLy8gSW5zZXJ0IGV4cHJPYiBvYmplY3QsIHRvIGJlIHVzZWQgZHVyaW5nIGJpbmRpbmcgdG8gcmV0dXJuIHRoZSBjb21wdXRlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgLy8gKGUuZy4gXCJzb21lLm9iamVjdCgpXCIgaW4gXCJzb21lLm9iamVjdCgpLmEuYlwiIC0gdG8gYmUgdXNlZCBhcyBjb250ZXh0IGZvciBiaW5kaW5nIHRoZSBmb2xsb3dpbmcgdG9rZW5zIFwiYS5iXCIpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRydFBybkRvdCA9IGRlbGltT3BlbkNoYXIxICsgXCI6XCIgKyBleHByIC8vIFRoZSBwYXJhbWV0ZXIgb3IgZnVuY3Rpb24gc3ViZXhwcmVzc2lvblxuXHRcdFx0XHRcdFx0XHQrIFwiIG9uZXJyb3I9JydcIiAvLyBzZXQgb25lcnJvcj0nJyBpbiBvcmRlciB0byB3cmFwIGdlbmVyYXRlZCBjb2RlIHdpdGggYSB0cnkgY2F0Y2ggLSByZXR1cm5pbmcgJycgYXMgb2JqZWN0IGluc3RhbmNlIGlmIHRoZXJlIGlzIGFuIGVycm9yL21pc3NpbmcgcGFyZW50XG5cdFx0XHRcdFx0XHRcdCsgZGVsaW1DbG9zZUNoYXIwO1xuXHRcdFx0XHRcdFx0ZXhwckZuID0gdG1wbExpbmtzW3J0UHJuRG90XTtcblx0XHRcdFx0XHRcdGlmICghZXhwckZuKSB7XG5cdFx0XHRcdFx0XHRcdHRtcGxMaW5rc1tydFBybkRvdF0gPSB0cnVlOyAvLyBGbGFnIHRoYXQgdGhpcyBleHByRm4gKGZvciBydFBybkRvdCkgaXMgYmVpbmcgY29tcGlsZWRcblx0XHRcdFx0XHRcdFx0dG1wbExpbmtzW3J0UHJuRG90XSA9IGV4cHJGbiA9IHRtcGxGbihydFBybkRvdCwgdG1wbCwgdHJ1ZSk7IC8vIENvbXBpbGUgdGhlIGV4cHJlc3Npb24gKG9yIHVzZSBjYWNoZWQgY29weSBhbHJlYWR5IGluIHRtcGwubGlua3MpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoZXhwckZuICE9PSB0cnVlICYmIG5ld09iKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIG5vdCByZWVudHJhbnQgY2FsbCBkdXJpbmcgY29tcGlsYXRpb25cblx0XHRcdFx0XHRcdFx0bmV3T2IuX2pzdiA9IGV4cHJGbjtcblx0XHRcdFx0XHRcdFx0bmV3T2IucHJtID0gYm5kQ3R4LmJkO1xuXHRcdFx0XHRcdFx0XHRuZXdPYi5ibmQgPSBuZXdPYi5ibmQgfHwgbmV3T2IucGF0aCAmJiBuZXdPYi5wYXRoLmluZGV4T2YoXCJeXCIpID49IDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKGFwb3NlZFxuXHRcdFx0XHQvLyB3aXRoaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmdcblx0XHRcdFx0PyAoYXBvc2VkID0gIWFwb3MsIChhcG9zZWQgPyBhbGwgOiBsZnRQcm4yICsgJ1wiJykpXG5cdFx0XHRcdDogcXVvdGVkXG5cdFx0XHRcdC8vIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ1xuXHRcdFx0XHRcdD8gKHF1b3RlZCA9ICFxdW90LCAocXVvdGVkID8gYWxsIDogbGZ0UHJuMiArICdcIicpKVxuXHRcdFx0XHRcdDpcblx0XHRcdFx0KFxuXHRcdFx0XHRcdChsZnRQcm5cblx0XHRcdFx0XHRcdD8gKHBhdGhTdGFydFtwYXJlbkRlcHRoXSA9IGluZGV4KyssIGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0gPSB7YmQ6IFtdfSwgbGZ0UHJuKVxuXHRcdFx0XHRcdFx0OiBcIlwiKVxuXHRcdFx0XHRcdCsgKHNwYWNlXG5cdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoXG5cdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHQvLyBOZXcgYXJnIG9yIHByb3AgLSBzbyBpbnNlcnQgYmFja3NwYWNlIFxcYiAoXFx4MDgpIGFzIHNlcGFyYXRvciBmb3IgbmFtZWQgcGFyYW1zLCB1c2VkIHN1YnNlcXVlbnRseSBieSByQnVpbGRIYXNoLCBhbmQgcHJlcGFyZSBuZXcgYmluZGluZ3MgYXJyYXlcblx0XHRcdFx0XHRcdFx0OiAocGFyYW1JbmRleCA9IGZ1bGwuc2xpY2UocGFyYW1JbmRleCwgaW5kZXgpLCBuYW1lZFxuXHRcdFx0XHRcdFx0XHRcdD8gKG5hbWVkID0gYm91bmROYW1lID0gYmluZHRvID0gZmFsc2UsIFwiXFxiXCIpXG5cdFx0XHRcdFx0XHRcdFx0OiBcIlxcYixcIikgKyBwYXJhbUluZGV4ICsgKHBhcmFtSW5kZXggPSBpbmRleCArIGFsbC5sZW5ndGgsIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wdXNoKGJuZEN0eC5iZCA9IFtdKSwgXCJcXGJcIilcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogZXFcblx0XHRcdFx0Ly8gbmFtZWQgcGFyYW0uIFJlbW92ZSBiaW5kaW5ncyBmb3IgYXJnIGFuZCBjcmVhdGUgaW5zdGVhZCBiaW5kaW5ncyBhcnJheSBmb3IgcHJvcFxuXHRcdFx0XHRcdFx0XHQ/IChwYXJlbkRlcHRoICYmIHN5bnRheEVycm9yKHBhcmFtcyksIGJpbmRpbmdzICYmIHBhdGhCaW5kaW5ncy5wb3AoKSwgbmFtZWQgPSBwYXRoLCBib3VuZE5hbWUgPSBib3VuZCwgcGFyYW1JbmRleCA9IGluZGV4ICsgYWxsLmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdGJpbmRpbmdzICYmICgoYmluZGluZ3MgPSBibmRDdHguYmQgPSBwYXRoQmluZGluZ3NbbmFtZWRdID0gW10pLCBiaW5kaW5ncy5za3AgPSAhYm91bmQpLCBwYXRoICsgJzonKVxuXHRcdFx0XHRcdFx0XHQ6IHBhdGhcblx0XHRcdFx0Ly8gcGF0aFxuXHRcdFx0XHRcdFx0XHRcdD8gKHBhdGguc3BsaXQoXCJeXCIpLmpvaW4oXCIuXCIpLnJlcGxhY2UoclBhdGgsIHBhcnNlUGF0aClcblx0XHRcdFx0XHRcdFx0XHRcdCsgKHByblxuXHRcdFx0XHQvLyBzb21lLmZuY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoYm5kQ3R4ID0gYm5kU3RhY2tbKytwYXJlbkRlcHRoXSA9IHtiZDogW119LCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBydFNxLCBwcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3IpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdDogb3BlcmF0b3Jcblx0XHRcdFx0Ly8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdD8gb3BlcmF0b3Jcblx0XHRcdFx0XHRcdFx0XHRcdDogcnRQcm5cblx0XHRcdFx0Ly8gZnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoKHJ0UHJuID0gZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHJ0UHJuLCBmbkNhbGxbcGFyZW5EZXB0aF0gPSBmYWxzZSwgYm5kQ3R4ID0gYm5kU3RhY2tbLS1wYXJlbkRlcHRoXSwgcnRQcm4pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAocHJuIC8vIHJ0UHJuIGFuZCBwcm4sIGUuZyApKCBpbiAoYSkoKSBvciBhKCkoKSwgb3IgKVsgaW4gYSgpW11cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKGJuZEN0eCA9IGJuZFN0YWNrWysrcGFyZW5EZXB0aF0sIGZuQ2FsbFtwYXJlbkRlcHRoXSA9IHJ0U3EsIHBybilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGNvbW1hXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoZm5DYWxsW3BhcmVuRGVwdGhdIHx8IHN5bnRheEVycm9yKHBhcmFtcyksIFwiLFwiKSAvLyBXZSBkb24ndCBhbGxvdyB0b3AtbGV2ZWwgbGl0ZXJhbCBhcnJheXMgb3Igb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogbGZ0UHJuMFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IChhcG9zZWQgPSBhcG9zLCBxdW90ZWQgPSBxdW90LCAnXCInKVxuXHRcdFx0XHQpKVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgbmFtZWQsIGJpbmR0bywgYm91bmROYW1lLFxuXHRcdHF1b3RlZCwgLy8gYm9vbGVhbiBmb3Igc3RyaW5nIGNvbnRlbnQgaW4gZG91YmxlIHF1b3Rlc1xuXHRcdGFwb3NlZCwgLy8gb3IgaW4gc2luZ2xlIHF1b3Rlc1xuXHRcdGJpbmRpbmdzID0gcGF0aEJpbmRpbmdzICYmIHBhdGhCaW5kaW5nc1swXSwgLy8gYmluZGluZ3MgYXJyYXkgZm9yIHRoZSBmaXJzdCBhcmdcblx0XHRibmRDdHggPSB7YmQ6IGJpbmRpbmdzfSxcblx0XHRibmRTdGFjayA9IHswOiBibmRDdHh9LFxuXHRcdHBhcmFtSW5kZXggPSAwLCAvLyBsaXN0LFxuXHRcdHRtcGxMaW5rcyA9ICh0bXBsID8gdG1wbC5saW5rcyA6IGJpbmRpbmdzICYmIChiaW5kaW5ncy5saW5rcyA9IGJpbmRpbmdzLmxpbmtzIHx8IHt9KSkgfHwgdG9wVmlldy50bXBsLmxpbmtzLFxuXHRcdC8vIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIHRyYWNraW5nIHBhdGggcGFyc2luZyBpbmNsdWRpbmcgbmVzdGVkIHBhdGhzLCBzdWNoIGFzIFwiYS5iKGNeZCArIChlKSleZlwiLCBhbmQgY2hhaW5lZCBjb21wdXRlZCBwYXRocyBzdWNoIGFzXG5cdFx0Ly8gXCJhLmIoKS5jXmQoKS5lLmYoKS5nXCIgLSB3aGljaCBoYXMgZm91ciBjaGFpbmVkIHBhdGhzLCBcImEuYigpXCIsIFwiXmMuZCgpXCIsIFwiLmUuZigpXCIgYW5kIFwiLmdcIlxuXHRcdHBhcmVuRGVwdGggPSAwLFxuXHRcdGZuQ2FsbCA9IHt9LCAvLyBXZSBhcmUgaW4gYSBmdW5jdGlvbiBjYWxsXG5cdFx0cGF0aFN0YXJ0ID0ge30sIC8vIHRyYWNrcyB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGF0aCBzdWNoIGFzIGNeZCgpIGluIHRoZSBhYm92ZSBleGFtcGxlXG5cdFx0cmVzdWx0ID0gKHBhcmFtcyArICh0bXBsID8gXCIgXCIgOiBcIlwiKSkucmVwbGFjZShyUGFyYW1zLCBwYXJzZVRva2Vucyk7XG5cblx0cmV0dXJuICFwYXJlbkRlcHRoICYmIHJlc3VsdCB8fCBzeW50YXhFcnJvcihwYXJhbXMpOyAvLyBTeW50YXggZXJyb3IgaWYgdW5iYWxhbmNlZCBwYXJlbnMgaW4gcGFyYW1zIGV4cHJlc3Npb25cbn1cblxuZnVuY3Rpb24gYnVpbGRDb2RlKGFzdCwgdG1wbCwgaXNMaW5rRXhwcikge1xuXHQvLyBCdWlsZCB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBBU1Qgbm9kZXMsIGFuZCBzZXQgYXMgcHJvcGVydHkgb24gdGhlIHBhc3NlZC1pbiB0ZW1wbGF0ZSBvYmplY3Rcblx0Ly8gVXNlZCBmb3IgY29tcGlsaW5nIHRlbXBsYXRlcywgYW5kIGFsc28gYnkgSnNWaWV3cyB0byBidWlsZCBmdW5jdGlvbnMgZm9yIGRhdGEgbGluayBleHByZXNzaW9uc1xuXHR2YXIgaSwgbm9kZSwgdGFnTmFtZSwgY29udmVydGVyLCB0YWdDdHgsIGhhc1RhZywgaGFzRW5jb2RlciwgZ2V0c1ZhbCwgaGFzQ252dCwgdXNlQ252dCwgdG1wbEJpbmRpbmdzLCBwYXRoQmluZGluZ3MsIHBhcmFtcywgYm91bmRPbkVyclN0YXJ0LCBib3VuZE9uRXJyRW5kLFxuXHRcdHRhZ1JlbmRlciwgbmVzdGVkVG1wbHMsIHRtcGxOYW1lLCBuZXN0ZWRUbXBsLCB0YWdBbmRFbHNlcywgY29udGVudCwgbWFya3VwLCBuZXh0SXNFbHNlLCBvbGRDb2RlLCBpc0Vsc2UsIGlzR2V0VmFsLCB0YWdDdHhGbiwgb25FcnJvciwgdGFnU3RhcnQsIHRyaWdnZXIsXG5cdFx0dG1wbEJpbmRpbmdLZXkgPSAwLFxuXHRcdHVzZVZpZXdzID0gJHN1YlNldHRpbmdzQWR2YW5jZWQudXNlVmlld3MgfHwgdG1wbC51c2VWaWV3cyB8fCB0bXBsLnRhZ3MgfHwgdG1wbC50ZW1wbGF0ZXMgfHwgdG1wbC5oZWxwZXJzIHx8IHRtcGwuY29udmVydGVycyxcblx0XHRjb2RlID0gXCJcIixcblx0XHR0bXBsT3B0aW9ucyA9IHt9LFxuXHRcdGwgPSBhc3QubGVuZ3RoO1xuXG5cdGlmIChcIlwiICsgdG1wbCA9PT0gdG1wbCkge1xuXHRcdHRtcGxOYW1lID0gaXNMaW5rRXhwciA/ICdkYXRhLWxpbms9XCInICsgdG1wbC5yZXBsYWNlKHJOZXdMaW5lLCBcIiBcIikuc2xpY2UoMSwgLTEpICsgJ1wiJyA6IHRtcGw7XG5cdFx0dG1wbCA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0dG1wbE5hbWUgPSB0bXBsLnRtcGxOYW1lIHx8IFwidW5uYW1lZFwiO1xuXHRcdGlmICh0bXBsLmFsbG93Q29kZSkge1xuXHRcdFx0dG1wbE9wdGlvbnMuYWxsb3dDb2RlID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHRtcGwuZGVidWcpIHtcblx0XHRcdHRtcGxPcHRpb25zLmRlYnVnID0gdHJ1ZTtcblx0XHR9XG5cdFx0dG1wbEJpbmRpbmdzID0gdG1wbC5ibmRzO1xuXHRcdG5lc3RlZFRtcGxzID0gdG1wbC50bXBscztcblx0fVxuXHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0Ly8gQVNUIG5vZGVzOiBbMDogdGFnTmFtZSwgMTogY29udmVydGVyLCAyOiBjb250ZW50LCAzOiBwYXJhbXMsIDQ6IGNvZGUsIDU6IG9uRXJyb3IsIDY6IHRyaWdnZXIsIDc6cGF0aEJpbmRpbmdzLCA4OiBjb250ZW50TWFya3VwXVxuXHRcdG5vZGUgPSBhc3RbaV07XG5cblx0XHQvLyBBZGQgbmV3bGluZSBmb3IgZWFjaCBjYWxsb3V0IHRvIHQoKSBjKCkgZXRjLiBhbmQgZWFjaCBtYXJrdXAgc3RyaW5nXG5cdFx0aWYgKFwiXCIgKyBub2RlID09PSBub2RlKSB7XG5cdFx0XHQvLyBhIG1hcmt1cCBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWRcblx0XHRcdGNvZGUgKz0gJ1xcbitcIicgKyBub2RlICsgJ1wiJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYSBjb21waWxlZCB0YWcgZXhwcmVzc2lvbiB0byBiZSBpbnNlcnRlZFxuXHRcdFx0dGFnTmFtZSA9IG5vZGVbMF07XG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCIqXCIpIHtcblx0XHRcdFx0Ly8gQ29kZSB0YWc6IHt7KiB9fVxuXHRcdFx0XHRjb2RlICs9IFwiO1xcblwiICsgbm9kZVsxXSArIFwiXFxucmV0PXJldFwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29udmVydGVyID0gbm9kZVsxXTtcblx0XHRcdFx0Y29udGVudCA9ICFpc0xpbmtFeHByICYmIG5vZGVbMl07XG5cdFx0XHRcdHRhZ0N0eCA9IHBhcmFtU3RydWN0dXJlKG5vZGVbM10sICdwYXJhbXMnKSArICd9LCcgKyBwYXJhbVN0cnVjdHVyZShwYXJhbXMgPSBub2RlWzRdKTtcblx0XHRcdFx0b25FcnJvciA9IG5vZGVbNV07XG5cdFx0XHRcdHRyaWdnZXIgPSBub2RlWzZdO1xuXHRcdFx0XHRtYXJrdXAgPSBub2RlWzhdICYmIG5vZGVbOF0ucmVwbGFjZShyVW5lc2NhcGVRdW90ZXMsIFwiJDFcIik7XG5cdFx0XHRcdGlmIChpc0Vsc2UgPSB0YWdOYW1lID09PSBcImVsc2VcIikge1xuXHRcdFx0XHRcdGlmIChwYXRoQmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdHBhdGhCaW5kaW5ncy5wdXNoKG5vZGVbN10pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0bXBsQmluZGluZ0tleSA9IDA7XG5cdFx0XHRcdFx0aWYgKHRtcGxCaW5kaW5ncyAmJiAocGF0aEJpbmRpbmdzID0gbm9kZVs3XSkpIHsgLy8gQXJyYXkgb2YgcGF0aHMsIG9yIGZhbHNlIGlmIG5vdCBkYXRhLWJvdW5kXG5cdFx0XHRcdFx0XHRwYXRoQmluZGluZ3MgPSBbcGF0aEJpbmRpbmdzXTtcblx0XHRcdFx0XHRcdHRtcGxCaW5kaW5nS2V5ID0gdG1wbEJpbmRpbmdzLnB1c2goMSk7IC8vIEFkZCBwbGFjZWhvbGRlciBpbiB0bXBsQmluZGluZ3MgZm9yIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHVzZVZpZXdzID0gdXNlVmlld3MgfHwgcGFyYW1zWzFdIHx8IHBhcmFtc1syXSB8fCBwYXRoQmluZGluZ3MgfHwgL3ZpZXcuKD8haW5kZXgpLy50ZXN0KHBhcmFtc1swXSk7XG5cdFx0XHRcdC8vIHVzZVZpZXdzIGlzIGZvciBwZXJmIG9wdGltaXphdGlvbi4gRm9yIHJlbmRlcigpIHdlIG9ubHkgdXNlIHZpZXdzIGlmIG5lY2Vzc2FyeSAtIGZvciB0aGUgbW9yZSBhZHZhbmNlZCBzY2VuYXJpb3MuXG5cdFx0XHRcdC8vIFdlIHVzZSB2aWV3cyBpZiB0aGVyZSBhcmUgcHJvcHMsIGNvbnRleHR1YWwgcHJvcGVydGllcyBvciBhcmdzIHdpdGggIy4uLiAob3RoZXIgdGhhbiAjaW5kZXgpIC0gYnV0IHlvdSBjYW4gZm9yY2Vcblx0XHRcdFx0Ly8gdXNpbmcgdGhlIGZ1bGwgdmlldyBpbmZyYXN0cnVjdHVyZSwgKGFuZCBwYXkgYSBwZXJmIHByaWNlKSBieSBvcHRpbmcgaW46IFNldCB1c2VWaWV3czogdHJ1ZSBvbiB0aGUgdGVtcGxhdGUsIG1hbnVhbGx5Li4uXG5cdFx0XHRcdGlmIChpc0dldFZhbCA9IHRhZ05hbWUgPT09IFwiOlwiKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnZlcnRlcikge1xuXHRcdFx0XHRcdFx0dGFnTmFtZSA9IGNvbnZlcnRlciA9PT0gSFRNTCA/IFwiPlwiIDogY29udmVydGVyICsgdGFnTmFtZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRlbnQpIHsgLy8gVE9ETyBvcHRpbWl6ZSAtIGlmIGNvbnRlbnQubGVuZ3RoID09PSAwIG9yIGlmIHRoZXJlIGlzIGEgdG1wbD1cIi4uLlwiIHNwZWNpZmllZCAtIHNldCBjb250ZW50IHRvIG51bGwgLyBkb24ndCBydW4gdGhpcyBjb21waWxhdGlvbiBjb2RlIC0gc2luY2UgY29udGVudCB3b24ndCBnZXQgdXNlZCEhXG5cdFx0XHRcdFx0XHQvLyBDcmVhdGUgdGVtcGxhdGUgb2JqZWN0IGZvciBuZXN0ZWQgdGVtcGxhdGVcblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwgPSB0bXBsT2JqZWN0KG1hcmt1cCwgdG1wbE9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbC50bXBsTmFtZSA9IHRtcGxOYW1lICsgXCIvXCIgKyB0YWdOYW1lO1xuXHRcdFx0XHRcdFx0Ly8gQ29tcGlsZSB0byBBU1QgYW5kIHRoZW4gdG8gY29tcGlsZWQgZnVuY3Rpb25cblx0XHRcdFx0XHRcdG5lc3RlZFRtcGwudXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzIHx8IHVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0YnVpbGRDb2RlKGNvbnRlbnQsIG5lc3RlZFRtcGwpO1xuXHRcdFx0XHRcdFx0dXNlVmlld3MgPSBuZXN0ZWRUbXBsLnVzZVZpZXdzO1xuXHRcdFx0XHRcdFx0bmVzdGVkVG1wbHMucHVzaChuZXN0ZWRUbXBsKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIWlzRWxzZSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBub3QgYW4gZWxzZSB0YWcuXG5cdFx0XHRcdFx0XHR0YWdBbmRFbHNlcyA9IHRhZ05hbWU7XG5cdFx0XHRcdFx0XHR1c2VWaWV3cyA9IHVzZVZpZXdzIHx8IHRhZ05hbWUgJiYgKCEkdGFnc1t0YWdOYW1lXSB8fCAhJHRhZ3NbdGFnTmFtZV0uZmxvdyk7XG5cdFx0XHRcdFx0XHQvLyBTd2l0Y2ggdG8gYSBuZXcgY29kZSBzdHJpbmcgZm9yIHRoaXMgYm91bmQgdGFnIChhbmQgaXRzIGVsc2VzLCBpZiBpdCBoYXMgYW55KSAtIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRcdG9sZENvZGUgPSBjb2RlO1xuXHRcdFx0XHRcdFx0Y29kZSA9IFwiXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBhc3RbaSArIDFdO1xuXHRcdFx0XHRcdG5leHRJc0Vsc2UgPSBuZXh0SXNFbHNlICYmIG5leHRJc0Vsc2VbMF0gPT09IFwiZWxzZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZ1N0YXJ0ID0gb25FcnJvciA/IFwiO1xcbnRyeXtcXG5yZXQrPVwiIDogXCJcXG4rXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IFwiXCI7XG5cdFx0XHRcdGJvdW5kT25FcnJFbmQgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChpc0dldFZhbCAmJiAocGF0aEJpbmRpbmdzIHx8IHRyaWdnZXIgfHwgY29udmVydGVyICYmIGNvbnZlcnRlciAhPT0gSFRNTCkpIHtcblx0XHRcdFx0XHQvLyBGb3IgY29udmVydFZhbCB3ZSBuZWVkIGEgY29tcGlsZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBuZXcgdGFnQ3R4KHMpXG5cdFx0XHRcdFx0dGFnQ3R4Rm4gPSBuZXcgRnVuY3Rpb24oXCJkYXRhLHZpZXcsaix1XCIsIFwiIC8vIFwiICsgdG1wbE5hbWUgKyBcIiBcIiArIHRtcGxCaW5kaW5nS2V5ICsgXCIgXCIgKyB0YWdOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgXCJcXG5yZXR1cm4ge1wiICsgdGFnQ3R4ICsgXCJ9O1wiKTtcblx0XHRcdFx0XHR0YWdDdHhGbi5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdHRhZ0N0eEZuLl90YWcgPSB0YWdOYW1lO1xuXG5cdFx0XHRcdFx0aWYgKGlzTGlua0V4cHIpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0YWdDdHhGbjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzZXRQYXRocyh0YWdDdHhGbiwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHR0YWdSZW5kZXIgPSAnYyhcIicgKyBjb252ZXJ0ZXIgKyAnXCIsdmlldywnO1xuXHRcdFx0XHRcdHVzZUNudnQgPSB0cnVlO1xuXHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsXCI7XG5cdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGUgKz0gKGlzR2V0VmFsXG5cdFx0XHRcdFx0PyAoaXNMaW5rRXhwciA/IChvbkVycm9yID8gXCJ0cnl7XFxuXCIgOiBcIlwiKSArIFwicmV0dXJuIFwiIDogdGFnU3RhcnQpICsgKHVzZUNudnQgLy8gQ2FsbCBfY252dCBpZiB0aGVyZSBpcyBhIGNvbnZlcnRlcjoge3tjbnZ0OiAuLi4gfX0gb3Ige157Y252dDogLi4uIH19XG5cdFx0XHRcdFx0XHQ/ICh1c2VDbnZ0ID0gdW5kZWZpbmVkLCB1c2VWaWV3cyA9IGhhc0NudnQgPSB0cnVlLCB0YWdSZW5kZXIgKyAocGF0aEJpbmRpbmdzXG5cdFx0XHRcdFx0XHRcdD8gKCh0bXBsQmluZGluZ3NbdG1wbEJpbmRpbmdLZXkgLSAxXSA9IHRhZ0N0eEZuKSwgdG1wbEJpbmRpbmdLZXkpIC8vIFN0b3JlIHRoZSBjb21waWxlZCB0YWdDdHhGbiBpbiB0bXBsLmJuZHMsIGFuZCBwYXNzIHRoZSBrZXkgdG8gY29udmVydFZhbCgpXG5cdFx0XHRcdFx0XHRcdDogXCJ7XCIgKyB0YWdDdHggKyBcIn1cIikgKyBcIilcIilcblx0XHRcdFx0XHRcdDogdGFnTmFtZSA9PT0gXCI+XCJcblx0XHRcdFx0XHRcdFx0PyAoaGFzRW5jb2RlciA9IHRydWUsIFwiaChcIiArIHBhcmFtc1swXSArIFwiKVwiKVxuXHRcdFx0XHRcdFx0XHQ6IChnZXRzVmFsID0gdHJ1ZSwgXCIoKHY9XCIgKyBwYXJhbXNbMF0gKyAnKSE9bnVsbD92OicgKyAoaXNMaW5rRXhwciA/ICdudWxsKScgOiAnXCJcIiknKSlcblx0XHRcdFx0XHRcdFx0Ly8gTm9uIHN0cmljdCBlcXVhbGl0eSBzbyBkYXRhLWxpbms9XCJ0aXRsZXs6ZXhwcn1cIiB3aXRoIGV4cHI9bnVsbC91bmRlZmluZWQgcmVtb3ZlcyB0aXRsZSBhdHRyaWJ1dGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0OiAoaGFzVGFnID0gdHJ1ZSwgXCJcXG57dmlldzp2aWV3LHRtcGw6XCIgLy8gQWRkIHRoaXMgdGFnQ3R4IHRvIHRoZSBjb21waWxlZCBjb2RlIGZvciB0aGUgdGFnQ3R4cyB0byBiZSBwYXNzZWQgdG8gcmVuZGVyVGFnKClcblx0XHRcdFx0XHRcdCsgKGNvbnRlbnQgPyBuZXN0ZWRUbXBscy5sZW5ndGggOiBcIjBcIikgKyBcIixcIiAvLyBGb3IgYmxvY2sgdGFncywgcGFzcyBpbiB0aGUga2V5IChuZXN0ZWRUbXBscy5sZW5ndGgpIHRvIHRoZSBuZXN0ZWQgY29udGVudCB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0KyB0YWdDdHggKyBcIn0sXCIpKTtcblxuXHRcdFx0XHRpZiAodGFnQW5kRWxzZXMgJiYgIW5leHRJc0Vsc2UpIHtcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgYW4gaW5saW5lIHRhZyB3aXRob3V0IGFueSBlbHNlcywgb3IgdGhlIGxhc3Qge3tlbHNlfX0gb2YgYW4gaW5saW5lIHRhZ1xuXHRcdFx0XHRcdC8vIFdlIGNvbXBsZXRlIHRoZSBjb2RlIGZvciByZXR1cm5pbmcgdGhlIHRhZ0N0eHMgYXJyYXlcblx0XHRcdFx0XHRjb2RlID0gXCJbXCIgKyBjb2RlLnNsaWNlKDAsIC0xKSArIFwiXVwiO1xuXHRcdFx0XHRcdHRhZ1JlbmRlciA9ICd0KFwiJyArIHRhZ0FuZEVsc2VzICsgJ1wiLHZpZXcsdGhpcywnO1xuXHRcdFx0XHRcdGlmIChpc0xpbmtFeHByIHx8IHBhdGhCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGJvdW5kIHRhZyAoZGF0YS1saW5rIGV4cHJlc3Npb24gb3IgaW5saW5lIGJvdW5kIHRhZyB7Xnt0YWcgLi4ufX0pIHNvIHdlIHN0b3JlIGEgY29tcGlsZWQgdGFnQ3R4cyBmdW5jdGlvbiBpbiB0bXAuYm5kc1xuXHRcdFx0XHRcdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgXCIgLy8gXCIgKyB0bXBsTmFtZSArIFwiIFwiICsgdG1wbEJpbmRpbmdLZXkgKyBcIiBcIiArIHRhZ0FuZEVsc2VzICsgXCJcXG5yZXR1cm4gXCIgKyBjb2RlICsgXCI7XCIpO1xuXHRcdFx0XHRcdFx0Y29kZS5fZXIgPSBvbkVycm9yO1xuXHRcdFx0XHRcdFx0Y29kZS5fdGFnID0gdGFnQW5kRWxzZXM7XG5cdFx0XHRcdFx0XHRpZiAocGF0aEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRcdHNldFBhdGhzKHRtcGxCaW5kaW5nc1t0bXBsQmluZGluZ0tleSAtIDFdID0gY29kZSwgcGF0aEJpbmRpbmdzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChpc0xpbmtFeHByKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb2RlOyAvLyBGb3IgYSBkYXRhLWxpbmsgZXhwcmVzc2lvbiB3ZSByZXR1cm4gdGhlIGNvbXBpbGVkIHRhZ0N0eHMgZnVuY3Rpb25cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJvdW5kT25FcnJTdGFydCA9IHRhZ1JlbmRlciArIHRtcGxCaW5kaW5nS2V5ICsgXCIsdW5kZWZpbmVkLFwiO1xuXHRcdFx0XHRcdFx0Ym91bmRPbkVyckVuZCA9IFwiKVwiO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgdGhlIGxhc3Qge3tlbHNlfX0gZm9yIGFuIGlubGluZSB0YWcuXG5cdFx0XHRcdFx0Ly8gRm9yIGEgYm91bmQgdGFnLCBwYXNzIHRoZSB0YWdDdHhzIGZuIGxvb2t1cCBrZXkgdG8gcmVuZGVyVGFnLlxuXHRcdFx0XHRcdC8vIEZvciBhbiB1bmJvdW5kIHRhZywgaW5jbHVkZSB0aGUgY29kZSBkaXJlY3RseSBmb3IgZXZhbHVhdGluZyB0YWdDdHhzIGFycmF5XG5cdFx0XHRcdFx0Y29kZSA9IG9sZENvZGUgKyB0YWdTdGFydCArIHRhZ1JlbmRlciArICh0bXBsQmluZGluZ0tleSB8fCBjb2RlKSArIFwiKVwiO1xuXHRcdFx0XHRcdHBhdGhCaW5kaW5ncyA9IDA7XG5cdFx0XHRcdFx0dGFnQW5kRWxzZXMgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvbkVycm9yKSB7XG5cdFx0XHRcdFx0dXNlVmlld3MgPSB0cnVlO1xuXHRcdFx0XHRcdGNvZGUgKz0gJztcXG59Y2F0Y2goZSl7cmV0JyArIChpc0xpbmtFeHByID8gXCJ1cm4gXCIgOiBcIis9XCIpICsgYm91bmRPbkVyclN0YXJ0ICsgJ2ouX2VycihlLHZpZXcsJyArIG9uRXJyb3IgKyAnKScgKyBib3VuZE9uRXJyRW5kICsgJzt9JyArIChpc0xpbmtFeHByID8gXCJcIiA6ICdyZXQ9cmV0Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gSW5jbHVkZSBvbmx5IHRoZSB2YXIgcmVmZXJlbmNlcyB0aGF0IGFyZSBuZWVkZWQgaW4gdGhlIGNvZGVcblx0Y29kZSA9IFwiLy8gXCIgKyB0bXBsTmFtZVxuXG5cdFx0KyBcIlxcbnZhciB2XCJcblx0XHQrIChoYXNUYWcgPyBcIix0PWouX3RhZ1wiIDogXCJcIikgICAgICAgICAgICAgICAgLy8gaGFzIHRhZ1xuXHRcdCsgKGhhc0NudnQgPyBcIixjPWouX2NudnRcIiA6IFwiXCIpICAgICAgICAgICAgICAvLyBjb252ZXJ0ZXJcblx0XHQrIChoYXNFbmNvZGVyID8gXCIsaD1qLl9odG1sXCIgOiBcIlwiKSAgICAgICAgICAgLy8gaHRtbCBjb252ZXJ0ZXJcblx0XHQrIChpc0xpbmtFeHByID8gXCI7XFxuXCIgOiAnLHJldD1cIlwiXFxuJylcblx0XHQrICh0bXBsT3B0aW9ucy5kZWJ1ZyA/IFwiZGVidWdnZXI7XCIgOiBcIlwiKVxuXHRcdCsgY29kZVxuXHRcdCsgKGlzTGlua0V4cHIgPyBcIlxcblwiIDogXCI7XFxucmV0dXJuIHJldDtcIik7XG5cblx0aWYgKCRzdWJTZXR0aW5ncy5kZWJ1Z01vZGUgIT09IGZhbHNlKSB7XG5cdFx0Y29kZSA9IFwidHJ5IHtcXG5cIiArIGNvZGUgKyBcIlxcbn1jYXRjaChlKXtcXG5yZXR1cm4gai5fZXJyKGUsIHZpZXcpO1xcbn1cIjtcblx0fVxuXG5cdHRyeSB7XG5cdFx0Y29kZSA9IG5ldyBGdW5jdGlvbihcImRhdGEsdmlldyxqLHVcIiwgY29kZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRzeW50YXhFcnJvcihcIkNvbXBpbGVkIHRlbXBsYXRlIGNvZGU6XFxuXFxuXCIgKyBjb2RlICsgJ1xcbjogXCInICsgZS5tZXNzYWdlICsgJ1wiJyk7XG5cdH1cblx0aWYgKHRtcGwpIHtcblx0XHR0bXBsLmZuID0gY29kZTtcblx0XHR0bXBsLnVzZVZpZXdzID0gISF1c2VWaWV3cztcblx0fVxuXHRyZXR1cm4gY29kZTtcbn1cblxuLy89PT09PT09PT09XG4vLyBVdGlsaXRpZXNcbi8vPT09PT09PT09PVxuXG4vLyBNZXJnZSBvYmplY3RzLCBpbiBwYXJ0aWN1bGFyIGNvbnRleHRzIHdoaWNoIGluaGVyaXQgZnJvbSBwYXJlbnQgY29udGV4dHNcbmZ1bmN0aW9uIGV4dGVuZEN0eChjb250ZXh0LCBwYXJlbnRDb250ZXh0KSB7XG5cdC8vIFJldHVybiBjb3B5IG9mIHBhcmVudENvbnRleHQsIHVubGVzcyBjb250ZXh0IGlzIGRlZmluZWQgYW5kIGlzIGRpZmZlcmVudCwgaW4gd2hpY2ggY2FzZSByZXR1cm4gYSBuZXcgbWVyZ2VkIGNvbnRleHRcblx0Ly8gSWYgbmVpdGhlciBjb250ZXh0IG5vciBwYXJlbnRDb250ZXh0IGFyZSBkZWZpbmVkLCByZXR1cm4gdW5kZWZpbmVkXG5cdHJldHVybiBjb250ZXh0ICYmIGNvbnRleHQgIT09IHBhcmVudENvbnRleHRcblx0XHQ/IChwYXJlbnRDb250ZXh0XG5cdFx0XHQ/ICRleHRlbmQoJGV4dGVuZCh7fSwgcGFyZW50Q29udGV4dCksIGNvbnRleHQpXG5cdFx0XHQ6IGNvbnRleHQpXG5cdFx0OiBwYXJlbnRDb250ZXh0ICYmICRleHRlbmQoe30sIHBhcmVudENvbnRleHQpO1xufVxuXG4vLyBHZXQgY2hhcmFjdGVyIGVudGl0eSBmb3IgSFRNTCBhbmQgQXR0cmlidXRlIGVuY29kaW5nXG5mdW5jdGlvbiBnZXRDaGFyRW50aXR5KGNoKSB7XG5cdHJldHVybiBjaGFyRW50aXRpZXNbY2hdIHx8IChjaGFyRW50aXRpZXNbY2hdID0gXCImI1wiICsgY2guY2hhckNvZGVBdCgwKSArIFwiO1wiKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0UHJvcHMoc291cmNlKSB7XG5cdC8vIHRoaXMgcG9pbnRlciBpcyB0aGVNYXAgLSB3aGljaCBoYXMgdGFnQ3R4LnByb3BzIHRvb1xuXHQvLyBhcmd1bWVudHM6IHRhZ0N0eC5hcmdzLlxuXHR2YXIga2V5LCBwcm9wLFxuXHRcdHByb3BzID0gW107XG5cblx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IE9CSkVDVCkge1xuXHRcdGZvciAoa2V5IGluIHNvdXJjZSkge1xuXHRcdFx0cHJvcCA9IHNvdXJjZVtrZXldO1xuXHRcdFx0aWYgKGtleSAhPT0gJGV4cGFuZG8gJiYgc291cmNlLmhhc093blByb3BlcnR5KGtleSkgJiYgISRpc0Z1bmN0aW9uKHByb3ApKSB7XG5cdFx0XHRcdHByb3BzLnB1c2goe2tleToga2V5LCBwcm9wOiBwcm9wfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wcztcbn1cblxuZnVuY3Rpb24gJGZuUmVuZGVyKGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKSB7XG5cdHZhciB0bXBsRWxlbSA9IHRoaXMuanF1ZXJ5ICYmICh0aGlzWzBdIHx8IGVycm9yKCdVbmtub3duIHRlbXBsYXRlJykpLCAvLyBUYXJnZXRlZCBlbGVtZW50IG5vdCBmb3VuZCBmb3IgalF1ZXJ5IHRlbXBsYXRlIHNlbGVjdG9yIHN1Y2ggYXMgXCIjbXlUbXBsXCJcblx0XHR0bXBsID0gdG1wbEVsZW0uZ2V0QXR0cmlidXRlKHRtcGxBdHRyKTtcblxuXHRyZXR1cm4gcmVuZGVyQ29udGVudC5jYWxsKHRtcGwgPyAkLmRhdGEodG1wbEVsZW0pW2pzdlRtcGxdIDogJHRlbXBsYXRlcyh0bXBsRWxlbSksIGRhdGEsIGNvbnRleHQsIG5vSXRlcmF0aW9uKTtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWdpc3RlciBjb252ZXJ0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGh0bWxFbmNvZGUodGV4dCkge1xuXHQvLyBIVE1MIGVuY29kZTogUmVwbGFjZSA8ID4gJiAnIGFuZCBcIiBieSBjb3JyZXNwb25kaW5nIGVudGl0aWVzLlxuXHRyZXR1cm4gdGV4dCAhPSB1bmRlZmluZWQgPyBySXNIdG1sLnRlc3QodGV4dCkgJiYgKFwiXCIgKyB0ZXh0KS5yZXBsYWNlKHJIdG1sRW5jb2RlLCBnZXRDaGFyRW50aXR5KSB8fCB0ZXh0IDogXCJcIjtcbn1cblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiRzdWIgPSAkdmlld3Muc3ViO1xuJHZpZXdzU2V0dGluZ3MgPSAkdmlld3Muc2V0dGluZ3M7XG5cbmlmICghKGpzciB8fCAkICYmICQucmVuZGVyKSkge1xuXHQvLyBKc1JlbmRlciBub3QgYWxyZWFkeSBsb2FkZWQsIG9yIGxvYWRlZCB3aXRob3V0IGpRdWVyeSwgYW5kIHdlIGFyZSBub3cgbW92aW5nIGZyb20ganNyZW5kZXIgbmFtZXNwYWNlIHRvIGpRdWVyeSBuYW1lcGFjZVxuXHRmb3IgKGpzdlN0b3JlTmFtZSBpbiBqc3ZTdG9yZXMpIHtcblx0XHRyZWdpc3RlclN0b3JlKGpzdlN0b3JlTmFtZSwganN2U3RvcmVzW2pzdlN0b3JlTmFtZV0pO1xuXHR9XG5cblx0JGNvbnZlcnRlcnMgPSAkdmlld3MuY29udmVydGVycztcblx0JGhlbHBlcnMgPSAkdmlld3MuaGVscGVycztcblx0JHRhZ3MgPSAkdmlld3MudGFncztcblxuXHQkc3ViLl90Zy5wcm90b3R5cGUgPSB7XG5cdFx0YmFzZUFwcGx5OiBiYXNlQXBwbHksXG5cdFx0Y3Z0QXJnczogY29udmVydEFyZ3Ncblx0fTtcblxuXHR0b3BWaWV3ID0gJHN1Yi50b3BWaWV3ID0gbmV3IFZpZXcoKTtcblxuXHQvL0JST1dTRVItU1BFQ0lGSUMgQ09ERVxuXHRpZiAoJCkge1xuXG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5ICg9ICQpIGlzIGxvYWRlZFxuXG5cdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0JGV4cGFuZG8gPSAkLmV4cGFuZG87XG5cdFx0aWYgKCQub2JzZXJ2YWJsZSkge1xuXHRcdFx0JGV4dGVuZCgkc3ViLCAkLnZpZXdzLnN1Yik7IC8vIGpxdWVyeS5vYnNlcnZhYmxlLmpzIHdhcyBsb2FkZWQgYmVmb3JlIGpzcmVuZGVyLmpzXG5cdFx0XHQkdmlld3MubWFwID0gJC52aWV3cy5tYXA7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8galF1ZXJ5IGlzIG5vdCBsb2FkZWQuXG5cblx0XHQkID0ge307XG5cblx0XHRpZiAoc2V0R2xvYmFscykge1xuXHRcdFx0Z2xvYmFsLmpzcmVuZGVyID0gJDsgLy8gV2UgYXJlIGxvYWRpbmcganNyZW5kZXIuanMgZnJvbSBhIHNjcmlwdCBlbGVtZW50LCBub3QgQU1EIG9yIENvbW1vbkpTLCBzbyBzZXQgZ2xvYmFsXG5cdFx0fVxuXG5cdFx0Ly8gRXJyb3Igd2FybmluZyBpZiBqc3JlbmRlci5qcyBpcyB1c2VkIGFzIHRlbXBsYXRlIGVuZ2luZSBvbiBOb2RlLmpzIChlLmcuIEV4cHJlc3Mgb3IgSGFwaS4uLilcblx0XHQvLyBVc2UganNyZW5kZXItbm9kZS5qcyBpbnN0ZWFkLi4uXG5cdFx0JC5yZW5kZXJGaWxlID0gJC5fX2V4cHJlc3MgPSAkLmNvbXBpbGUgPSBmdW5jdGlvbigpIHsgdGhyb3cgXCJOb2RlLmpzOiB1c2UgbnBtIGpzcmVuZGVyLCBvciBqc3JlbmRlci1ub2RlLmpzXCI7IH07XG5cblx0XHQvL0VORCBCUk9XU0VSLVNQRUNJRklDIENPREVcblx0XHQkLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihvYikge1xuXHRcdFx0cmV0dXJuIHR5cGVvZiBvYiA9PT0gXCJmdW5jdGlvblwiO1xuXHRcdH07XG5cblx0XHQkLmlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0cmV0dXJuICh7fS50b1N0cmluZykuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCI7XG5cdFx0fTtcblxuXHRcdCRzdWIuX2pxID0gZnVuY3Rpb24oanEpIHsgLy8gcHJpdmF0ZSBtZXRob2QgdG8gbW92ZSBmcm9tIEpzUmVuZGVyIEFQSXMgZnJvbSBqc3JlbmRlciBuYW1lc3BhY2UgdG8galF1ZXJ5IG5hbWVzcGFjZVxuXHRcdFx0aWYgKGpxICE9PSAkKSB7XG5cdFx0XHRcdCRleHRlbmQoanEsICQpOyAvLyBtYXAgb3ZlciBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXNwYWNlXG5cdFx0XHRcdCQgPSBqcTtcblx0XHRcdFx0JC5mbi5yZW5kZXIgPSAkZm5SZW5kZXI7XG5cdFx0XHRcdGRlbGV0ZSAkLmpzcmVuZGVyO1xuXHRcdFx0XHQkZXhwYW5kbyA9ICQuZXhwYW5kbztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0JC5qc3JlbmRlciA9IHZlcnNpb25OdW1iZXI7XG5cdH1cblx0JHN1YlNldHRpbmdzID0gJHN1Yi5zZXR0aW5ncztcblx0JHN1YlNldHRpbmdzLmFsbG93Q29kZSA9IGZhbHNlO1xuXHQkaXNGdW5jdGlvbiA9ICQuaXNGdW5jdGlvbjtcblx0JC5yZW5kZXIgPSAkcmVuZGVyO1xuXHQkLnZpZXdzID0gJHZpZXdzO1xuXHQkLnRlbXBsYXRlcyA9ICR0ZW1wbGF0ZXMgPSAkdmlld3MudGVtcGxhdGVzO1xuXG5cdGZvciAoc2V0dGluZyBpbiAkc3ViU2V0dGluZ3MpIHtcblx0XHRhZGRTZXR0aW5nKHNldHRpbmcpO1xuXHR9XG5cblx0KCR2aWV3c1NldHRpbmdzLmRlYnVnTW9kZSA9IGZ1bmN0aW9uKGRlYnVnTW9kZSkge1xuXHRcdHJldHVybiBkZWJ1Z01vZGUgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyAkc3ViU2V0dGluZ3MuZGVidWdNb2RlXG5cdFx0XHQ6IChcblx0XHRcdFx0JHN1YlNldHRpbmdzLmRlYnVnTW9kZSA9IGRlYnVnTW9kZSxcblx0XHRcdFx0JHN1YlNldHRpbmdzLm9uRXJyb3IgPSBkZWJ1Z01vZGUgKyBcIlwiID09PSBkZWJ1Z01vZGVcblx0XHRcdFx0XHQ/IG5ldyBGdW5jdGlvbihcIlwiLCBcInJldHVybiAnXCIgKyBkZWJ1Z01vZGUgKyBcIic7XCIgKVxuXHRcdFx0XHRcdDogJGlzRnVuY3Rpb24oZGVidWdNb2RlKVxuXHRcdFx0XHRcdFx0PyBkZWJ1Z01vZGVcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0XHQkdmlld3NTZXR0aW5ncyk7XG5cdH0pKGZhbHNlKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cblx0JHN1YlNldHRpbmdzQWR2YW5jZWQgPSAkc3ViU2V0dGluZ3MuYWR2YW5jZWQgPSB7XG5cdFx0dXNlVmlld3M6IGZhbHNlLFxuXHRcdF9qc3Y6IGZhbHNlIC8vIEZvciBnbG9iYWwgYWNjZXNzIHRvIEpzVmlld3Mgc3RvcmVcblx0fTtcblxuXHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZ2lzdGVyIHRhZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQkdGFncyh7XG5cdFx0XCJpZlwiOiB7XG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKHZhbCkge1xuXHRcdFx0XHQvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciB7e2lmfX0gYW5kIG9uY2UgZm9yIGVhY2gge3tlbHNlfX0uXG5cdFx0XHRcdC8vIFdlIHdpbGwgdXNlIHRoZSB0YWcucmVuZGVyaW5nIG9iamVjdCBmb3IgY2FycnlpbmcgcmVuZGVyaW5nIHN0YXRlIGFjcm9zcyB0aGUgY2FsbHMuXG5cdFx0XHRcdC8vIElmIG5vdCBkb25lIChhIHByZXZpb3VzIGJsb2NrIGhhcyBub3QgYmVlbiByZW5kZXJlZCksIGxvb2sgYXQgZXhwcmVzc2lvbiBmb3IgdGhpcyBibG9jayBhbmQgcmVuZGVyIHRoZSBibG9jayBpZiBleHByZXNzaW9uIGlzIHRydXRoeVxuXHRcdFx0XHQvLyBPdGhlcndpc2UgcmV0dXJuIFwiXCJcblx0XHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJldCA9IChzZWxmLnJlbmRlcmluZy5kb25lIHx8ICF2YWwgJiYgKGFyZ3VtZW50cy5sZW5ndGggfHwgIXRhZ0N0eC5pbmRleCkpXG5cdFx0XHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0XHRcdDogKHNlbGYucmVuZGVyaW5nLmRvbmUgPSB0cnVlLCBzZWxmLnNlbGVjdGVkID0gdGFnQ3R4LmluZGV4LFxuXHRcdFx0XHRcdFx0XHQvLyBUZXN0IGlzIHNhdGlzZmllZCwgc28gcmVuZGVyIGNvbnRlbnQgb24gY3VycmVudCBjb250ZXh0LiBXZSBjYWxsIHRhZ0N0eC5yZW5kZXIoKSByYXRoZXIgdGhhbiByZXR1cm4gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdC8vICh3aGljaCB3b3VsZCBhbHNvIHJlbmRlciB0aGUgdG1wbC9jb250ZW50IG9uIHRoZSBjdXJyZW50IGNvbnRleHQgYnV0IHdvdWxkIGl0ZXJhdGUgaWYgaXQgaXMgYW4gYXJyYXkpXG5cdFx0XHRcdFx0XHRcdHRhZ0N0eC5yZW5kZXIodGFnQ3R4LnZpZXcsIHRydWUpKTsgLy8gbm8gYXJnLCBzbyByZW5kZXJzIGFnYWluc3QgcGFyZW50Vmlldy5kYXRhXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9LFxuXHRcdFx0ZmxvdzogdHJ1ZVxuXHRcdH0sXG5cdFx0XCJmb3JcIjoge1xuXHRcdFx0cmVuZGVyOiBmdW5jdGlvbih2YWwpIHtcblx0XHRcdFx0Ly8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3Ige3tmb3J9fSBhbmQgb25jZSBmb3IgZWFjaCB7e2Vsc2V9fS5cblx0XHRcdFx0Ly8gV2Ugd2lsbCB1c2UgdGhlIHRhZy5yZW5kZXJpbmcgb2JqZWN0IGZvciBjYXJyeWluZyByZW5kZXJpbmcgc3RhdGUgYWNyb3NzIHRoZSBjYWxscy5cblx0XHRcdFx0dmFyIGZpbmFsRWxzZSA9ICFhcmd1bWVudHMubGVuZ3RoLFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRcdHRhZ0N0eCA9IHNlbGYudGFnQ3R4LFxuXHRcdFx0XHRcdHJlc3VsdCA9IFwiXCIsXG5cdFx0XHRcdFx0ZG9uZSA9IDA7XG5cblx0XHRcdFx0aWYgKCFzZWxmLnJlbmRlcmluZy5kb25lKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBmaW5hbEVsc2UgPyB0YWdDdHgudmlldy5kYXRhIDogdmFsOyAvLyBGb3IgdGhlIGZpbmFsIGVsc2UsIGRlZmF1bHRzIHRvIGN1cnJlbnQgZGF0YSB3aXRob3V0IGl0ZXJhdGlvbi5cblx0XHRcdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IHRhZ0N0eC5yZW5kZXIodmFsdWUsIGZpbmFsRWxzZSk7IC8vIEl0ZXJhdGVzIGV4Y2VwdCBvbiBmaW5hbCBlbHNlLCBpZiBkYXRhIGlzIGFuIGFycmF5LiAoVXNlIHt7aW5jbHVkZX19IHRvIGNvbXBvc2UgdGVtcGxhdGVzIHdpdGhvdXQgYXJyYXkgaXRlcmF0aW9uKVxuXHRcdFx0XHRcdFx0ZG9uZSArPSAkaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc2VsZi5yZW5kZXJpbmcuZG9uZSA9IGRvbmUpIHtcblx0XHRcdFx0XHRcdHNlbGYuc2VsZWN0ZWQgPSB0YWdDdHguaW5kZXg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIElmIG5vdGhpbmcgd2FzIHJlbmRlcmVkIHdlIHdpbGwgbG9vayBhdCB0aGUgbmV4dCB7e2Vsc2V9fS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZG9uZS5cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdHByb3BzOiB7XG5cdFx0XHRiYXNlVGFnOiBcImZvclwiLFxuXHRcdFx0ZGF0YU1hcDogZGF0YU1hcChnZXRUYXJnZXRQcm9wcyksXG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRpbmNsdWRlOiB7XG5cdFx0XHRmbG93OiB0cnVlXG5cdFx0fSxcblx0XHRcIipcIjoge1xuXHRcdFx0Ly8ge3sqIGNvZGUuLi4gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdFwiOipcIjoge1xuXHRcdFx0Ly8ge3s6KiByZXR1cm5lZEV4cHJlc3Npb24gfX0gLSBJZ25vcmVkIGlmIHRlbXBsYXRlLmFsbG93Q29kZSBhbmQgJC52aWV3cy5zZXR0aW5ncy5hbGxvd0NvZGUgYXJlIGZhbHNlLiBPdGhlcndpc2UgaW5jbHVkZSBjb2RlIGluIGNvbXBpbGVkIHRlbXBsYXRlXG5cdFx0XHRyZW5kZXI6IHJldFZhbCxcblx0XHRcdGZsb3c6IHRydWVcblx0XHR9LFxuXHRcdGRiZzogJGhlbHBlcnMuZGJnID0gJGNvbnZlcnRlcnMuZGJnID0gZGJnQnJlYWsgLy8gUmVnaXN0ZXIge3tkYmcvfX0sIHt7ZGJnOi4uLn19IGFuZCB+ZGJnKCkgdG8gdGhyb3cgYW5kIGNhdGNoLCBhcyBicmVha3BvaW50cyBmb3IgZGVidWdnaW5nLlxuXHR9KTtcblxuXHQkY29udmVydGVycyh7XG5cdFx0aHRtbDogaHRtbEVuY29kZSxcblx0XHRhdHRyOiBodG1sRW5jb2RlLCAvLyBJbmNsdWRlcyA+IGVuY29kaW5nIHNpbmNlIHJDb252ZXJ0TWFya2VycyBpbiBKc1ZpZXdzIGRvZXMgbm90IHNraXAgPiBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBzdHJpbmdzXG5cdFx0dXJsOiBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0XHQvLyBVUkwgZW5jb2RpbmcgaGVscGVyLlxuXHRcdFx0cmV0dXJuIHRleHQgIT0gdW5kZWZpbmVkID8gZW5jb2RlVVJJKFwiXCIgKyB0ZXh0KSA6IHRleHQgPT09IG51bGwgPyB0ZXh0IDogXCJcIjsgLy8gbnVsbCByZXR1cm5zIG51bGwsIGUuZy4gdG8gcmVtb3ZlIGF0dHJpYnV0ZS4gdW5kZWZpbmVkIHJldHVybnMgXCJcIlxuXHRcdH1cblx0fSk7XG59XG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09IERlZmluZSBkZWZhdWx0IGRlbGltaXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiRzdWJTZXR0aW5ncyA9ICRzdWIuc2V0dGluZ3M7XG4kaXNBcnJheSA9ICgkfHxqc3IpLmlzQXJyYXk7XG4kdmlld3NTZXR0aW5ncy5kZWxpbWl0ZXJzKFwie3tcIiwgXCJ9fVwiLCBcIl5cIik7XG5cbmlmIChqc3JUb0pxKSB7IC8vIE1vdmluZyBmcm9tIGpzcmVuZGVyIG5hbWVzcGFjZSB0byBqUXVlcnkgbmFtZXBhY2UgLSBjb3B5IG92ZXIgdGhlIHN0b3JlZCBpdGVtcyAodGVtcGxhdGVzLCBjb252ZXJ0ZXJzLCBoZWxwZXJzLi4uKVxuXHRqc3Iudmlld3Muc3ViLl9qcSgkKTtcbn1cbnJldHVybiAkIHx8IGpzcjtcbn0sIHdpbmRvdykpO1xuIiwiLypnbG9iYWwgUVVuaXQsIHRlc3QsIGVxdWFsLCBvayovXG4oZnVuY3Rpb24odW5kZWZpbmVkKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuYnJvd3NlcmlmeS5kb25lLmVpZ2h0QiA9IHRydWU7XG5cblFVbml0Lm1vZHVsZShcIkJyb3dzZXJpZnkgLSBjbGllbnQgY29kZVwiKTtcblxudmFyIGlzSUU4ID0gd2luZG93LmF0dGFjaEV2ZW50ICYmICF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcjtcblxuaWYgKCFpc0lFOCkge1xuXG50ZXN0KFwiTm8galF1ZXJ5IGdsb2JhbDogcmVxdWlyZSgnanNyZW5kZXInKSByZXF1aXJlKCdqc3ZpZXdzJylcIiwgZnVuY3Rpb24oKSB7XG5cdC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gSGlkZSBRVW5pdCBnbG9iYWwgalF1ZXJ5IGFuZCBhbnkgcHJldmlvdXMgZ2xvYmFsIGpzcmVuZGVyLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdHZhciBqUXVlcnkgPSBnbG9iYWwualF1ZXJ5LCBqc3IgPSBnbG9iYWwuanNyZW5kZXI7XG5cdGdsb2JhbC5qUXVlcnkgPSBnbG9iYWwuanNyZW5kZXIgPSB1bmRlZmluZWQ7XG5cblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBcnJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0dmFyIGRhdGEgPSB7bmFtZTogXCJKb1wifTtcblxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBY3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxudmFyICRqcSA9IHJlcXVpcmUoJ2pxdWVyeScpO1xudmFyICRqc3IgPSByZXF1aXJlKCdqc3JlbmRlcicpKCRqcSk7IC8vIFVubmVjZXNzYXJ5IGxvYWRpbmcgb2YgYWRkaXRpb25hbCBqc3JlbmRlciBpbnN0YW5jZSAoVGVzdCBjYXNlKVxudmFyICRqc3IgPSByZXF1aXJlKCcuLi8uLi8nKSgkanEpOyAvLyBQcm92aWRlIGpRdWVyeSwgc28gJGpzciA9PT0gJGpxIGlzIGxvY2FsIGpRdWVyeSBuYW1lc3BhY2VcblxuXHQvLyBVc2UgcmVxdWlyZSB0byBnZXQgc2VydmVyIHRlbXBsYXRlLCB0aGFua3MgdG8gQnJvd3NlcmlmeSBidW5kbGUgdGhhdCB1c2VkIGpzcmVuZGVyL3RtcGxpZnkgdHJhbnNmb3JtXG5cdHZhciB0bXBsID0gcmVxdWlyZSgnLi4vdGVtcGxhdGVzL25hbWUtdGVtcGxhdGUuaHRtbCcpKCRqc3IpOyAvLyBQcm92aWRlICRqc3JcblxuXHR2YXIgcmVzdWx0ID0gdG1wbChkYXRhKTtcblxuXHQkanNyLm9ic2VydmUoZGF0YSwgXCJuYW1lXCIsIGZ1bmN0aW9uKGV2LCBldmVudEFyZ3MpIHtcblx0XHRyZXN1bHQgKz0gXCIgXCIgKyBldmVudEFyZ3MudmFsdWU7XG5cdH0pXG5cdCRqc3Iub2JzZXJ2YWJsZShkYXRhKS5zZXRQcm9wZXJ0eShcIm5hbWVcIiwgXCJuZXcgbmFtZVwiKTsgLy8gcmVzdWx0ID09PSBcIm5ldyBuYW1lXCJcblxuXHRyZXN1bHQgKz0gXCIgXCIgKyAoJGpzciAhPT0galF1ZXJ5ICYmICRqc3IgPT09ICRqcSk7XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBBc3NlcnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cdGVxdWFsKHJlc3VsdCwgXCJOYW1lOiBKbyAobmFtZS10ZW1wbGF0ZS5odG1sKSBuZXcgbmFtZSB0cnVlXCIsIFwicmVzdWx0OiBObyBqUXVlcnkgZ2xvYmFsOiByZXF1aXJlKCdqc3ZpZXdzJylcIik7XG5cblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBSZXNldCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblx0Z2xvYmFsLmpRdWVyeSA9IGpRdWVyeTsgLy8gUmVwbGFjZSBRVW5pdCBnbG9iYWwgalF1ZXJ5XG5cdGdsb2JhbC5qc3JlbmRlciA9IGpzcjsgLy8gUmVwbGFjZSBhbnkgcHJldmlvdXMgZ2xvYmFsIGpzcmVuZGVyXG59KTtcbn1cbn0pKCk7XG4iLCJ2YXIgdG1wbFJlZnMgPSBbXSxcbiAgbWt1cCA9ICdOYW1lOiB7ezpuYW1lfX0gKG5hbWUtdGVtcGxhdGUuaHRtbCknLFxuICAkID0gZ2xvYmFsLmpzcmVuZGVyIHx8IGdsb2JhbC5qUXVlcnk7XG5cbm1vZHVsZS5leHBvcnRzID0gJCA/ICQudGVtcGxhdGVzKFwiLi90ZXN0L3RlbXBsYXRlcy9uYW1lLXRlbXBsYXRlLmh0bWxcIiwgbWt1cCkgOlxuICBmdW5jdGlvbigkKSB7XG4gICAgaWYgKCEkIHx8ICEkLnZpZXdzKSB7dGhyb3cgXCJSZXF1aXJlcyBqc3JlbmRlci9qUXVlcnlcIjt9XG4gICAgd2hpbGUgKHRtcGxSZWZzLmxlbmd0aCkge1xuICAgICAgdG1wbFJlZnMucG9wKCkoJCk7IC8vIGNvbXBpbGUgbmVzdGVkIHRlbXBsYXRlXG4gICAgfVxuXG4gICAgcmV0dXJuICQudGVtcGxhdGVzKFwiLi90ZXN0L3RlbXBsYXRlcy9uYW1lLXRlbXBsYXRlLmh0bWxcIiwgbWt1cClcbiAgfTsiXX0= diff --git a/test/browserify/bundles/9-bundle.js b/test/browserify/bundles/9-bundle.js index e46bbb7..c7df09d 100644 --- a/test/browserify/bundles/9-bundle.js +++ b/test/browserify/bundles/9-bundle.js @@ -1,5 +1,5 @@ (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 to string or (multiselect) array of strings - } - if (cvtBack) { - sourceValue = cvtBack.call(tag, sourceValue); + while (binding = rSplitBindings.exec(bindings)) { + if (binding = bindingStore[binding[1]]) { + if (to = binding.to) { + // The binding has a 'to' field, which is of the form [[targetObject, toPath], cvtBack] + linkCtx = binding.linkCtx; + view = linkCtx.view; + tag = linkCtx.tag || view.tag; + $source = $(source); + onBeforeChange = view.hlp(onBeforeChangeStr); // TODO Can we optimize this and other instances of same? + onAfterChange = view.hlp(onAfterChangeStr); // TODO Can we optimize this and other instances of same + fromAttr = defaultAttr(source); + setter = fnSetters[fromAttr]; + if (sourceValue === undefined) { + sourceValue = $isFunction(fromAttr) + ? fromAttr(source) + : setter + ? $source[setter]() + : $source.attr(fromAttr); + } + cnvtName = to[1]; + to = to[0]; // [object, path] + to = to + "" === to ? [linkCtx.data, to] : to; + if (cnvtName) { + if ($isFunction(cnvtName)) { + cvtBack = cnvtName; + } else { + cvtBack = view.getRsc("converters", cnvtName); } + } + if (linkCtx.elem.nodeName === "SELECT") { + linkCtx.elem._jsvSel = sourceValue = sourceValue || (linkCtx.elem.multiple ? [] : sourceValue); + // data-link \ + {^{for address ~street=~street^street}}\ +
\ + \ + {{/for}}\ +{{/if}}'); + + // ............................... Act ................................. + + var address = {street: "add"}; + var altAddress = {street: "alt"}; + + function getAddress(name) { + return (name.length > 2 || data.alt) ? altAddress : address; + } + + getAddress.depends = "alt"; + + var data = {name: "Jo", address: getAddress, alt: false }; + + tmpl.link("#result", data); + + before = getContent(); + + $("#outerInput").val("addOuter").change(); + + after = before + "|" + getContent(); + + $("#innerInput").val("addInner").change(); + + after += "|" + getContent(); + + $.observable(data).setProperty("name", "John"); + + after += "|" + getContent(); + + $("#outerInput").val("altOuter").change(); + + after += "|" + getContent(); + + $("#innerInput").val("altInner").change(); + + after += "|" + getContent(); + + $.observable(data).setProperty("name", "Me"); + + after += "|" + getContent(); + + $.observable(data).setProperty("alt", true); + + after += "|" + getContent(); + + equal(after, "add:add:add|addOuter:addOuter:addOuter|addInner:addInner:addInner" + + "|alt:alt:alt|altOuter:altOuter:altOuter|altInner:altInner:altInner" + + "|addInner:addInner:addInner|altInner:altInner:altInner", + 'Two-way binding to contextual parameters with computed values'); + + // ................................ Reset ................................ + $("#result").empty(); + + // =============================== Arrange =============================== + + var tmpl = $.templates( +'{^{for items}}\ +{{for 22 ~ind=#index}}\ +{{for 33 ~ind=~ind+1}}\ +{{for 33 ~ind=~ind*2}}\ +{{if true}}\ +{^{:~ind}}\ +{{/if}}\ +{{/for}}\ +{{/for}}\ +{{/for}}\ +{{/for}}' +); + + // ............................... Act ................................. + + var data = {items: [1,2,3]}; + + tmpl.link("#result", data); + + before = $("#result").text(); + + $.observable(data.items).remove(); + + after = before + "|" + $("#result").text(); + + $.observable(data.items).remove(); + + after += "|" + $("#result").text(); + + $.observable(data.items).insert(4); + + after += "|" + $("#result").text(); + + $.observable(data.items).insert(5); + + after += "|" + $("#result").text(); + + $.observable(data.items).insert(6); + + after += "|" + $("#result").text(); + + equal(after, "246|24|2|24|246|2468", + 'Contextual parameter for index with array change'); + + // ................................ Reset ................................ + $("#result").empty(); + }); test("JsViews ArrayChange: insert()", function() {