This repository has been archived on 2021-10-26. You can view files and clone it, but cannot push or open issues or pull requests.
biofriction-web/biofriction-theme/dist/assets/js/app.js

3 lines
266 KiB
JavaScript

/*! For license information please see app.js.LICENSE.txt */
(()=>{var e={545:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Foundation=void 0;var i,o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=(i=n(609))&&i.__esModule?i:{default:i},a=n(318),s=n(857),u={version:"6.5.1",_plugins:{},_uuids:[],plugin:function(e,t){var n=t||l(e),i=d(n);this._plugins[i]=this[n]=e},registerPlugin:function(e,t){var n=t?d(t):l(e.constructor).toLowerCase();e.uuid=(0,a.GetYoDigits)(6,n),e.$element.attr("data-"+n)||e.$element.attr("data-"+n,e.uuid),e.$element.data("zfPlugin")||e.$element.data("zfPlugin",e),e.$element.trigger("init.zf."+n),this._uuids.push(e.uuid)},unregisterPlugin:function(e){var t=d(l(e.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(e.uuid),1),e.$element.removeAttr("data-"+t).removeData("zfPlugin").trigger("destroyed.zf."+t),e)e[n]=null},reInit:function(e){var t=e instanceof r.default;try{if(t)e.each((function(){(0,r.default)(this).data("zfPlugin")._init()}));else{var n=void 0===e?"undefined":o(e),i=this;({object:function(e){e.forEach((function(e){e=d(e),(0,r.default)("[data-"+e+"]").foundation("_init")}))},string:function(){e=d(e),(0,r.default)("[data-"+e+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](e)}}catch(e){console.error(e)}finally{return e}},reflow:function(e,t){void 0===t?t=Object.keys(this._plugins):"string"==typeof t&&(t=[t]);var n=this;r.default.each(t,(function(t,i){var o=n._plugins[i];(0,r.default)(e).find("[data-"+i+"]").addBack("[data-"+i+"]").each((function(){var e=(0,r.default)(this),t={};if(e.data("zfPlugin"))console.warn("Tried to initialize "+i+" on an element that already has a Foundation plugin.");else{e.attr("data-options")&&e.attr("data-options").split(";").forEach((function(e,n){var i,o=e.split(":").map((function(e){return e.trim()}));o[0]&&(t[o[0]]="true"===(i=o[1])||"false"!==i&&(isNaN(1*i)?i:parseFloat(i)))}));try{e.data("zfPlugin",new o((0,r.default)(this),t))}catch(e){console.error(e)}finally{return}}}))}))},getFnName:l,addToJquery:function(e){return e.fn.foundation=function(t){var n=void 0===t?"undefined":o(t),i=e(".no-js");if(i.length&&i.removeClass("no-js"),"undefined"===n)s.MediaQuery._init(),u.reflow(this);else{if("string"!==n)throw new TypeError("We're sorry, "+n+" is not a valid parameter. You must use a string representing the method you wish to invoke.");var r=Array.prototype.slice.call(arguments,1),a=this.data("zfPlugin");if(void 0===a||void 0===a[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(a?l(a):"this element")+".");1===this.length?a[t].apply(a,r):this.each((function(n,i){a[t].apply(e(i).data("zfPlugin"),r)}))}return this},e}};function l(e){if(void 0===Function.prototype.name){var t=/function\s([^(]{1,})\(/.exec(e.toString());return t&&t.length>1?t[1].trim():""}return void 0===e.prototype?e.constructor.name:e.prototype.constructor.name}function d(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}u.util={throttle:function(e,t){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){e.apply(i,o),n=null}),t))}}},window.Foundation=u,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var e=["webkit","moz"],t=0;t<e.length&&!window.requestAnimationFrame;++t){var n=e[t];window.requestAnimationFrame=window[n+"RequestAnimationFrame"],window.cancelAnimationFrame=window[n+"CancelAnimationFrame"]||window[n+"CancelRequestAnimationFrame"]}if(/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent)||!window.requestAnimationFrame||!window.cancelAnimationFrame){var i=0;window.requestAnimationFrame=function(e){var t=Date.now(),n=Math.max(i+16,t);return setTimeout((function(){e(i=n)}),n-t)},window.cancelAnimationFrame=clearTimeout}window.performance&&window.performance.now||(window.performance={start:Date.now(),now:function(){return Date.now()-this.start}})}(),Function.prototype.bind||(Function.prototype.bind=function(e){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var t=Array.prototype.slice.call(arguments,1),n=this,i=function(){},o=function(){return n.apply(this instanceof i?this:e,t.concat(Array.prototype.slice.call(arguments)))};return this.prototype&&(i.prototype=this.prototype),o.prototype=new i,o}),t.Foundation=u},93:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Plugin=void 0;var i,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=((i=n(609))&&i.__esModule,n(318)),a=function(){function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._setup(t,n);var i=u(this);this.uuid=(0,r.GetYoDigits)(6,i),this.$element.attr("data-"+i)||this.$element.attr("data-"+i,this.uuid),this.$element.data("zfPlugin")||this.$element.data("zfPlugin",this),this.$element.trigger("init.zf."+i)}return o(e,[{key:"destroy",value:function(){this._destroy();var e=u(this);for(var t in this.$element.removeAttr("data-"+e).removeData("zfPlugin").trigger("destroyed.zf."+e),this)this[t]=null}}]),e}();function s(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function u(e){return void 0!==e.constructor.name?s(e.constructor.name):s(e.className)}t.Plugin=a},318:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ignoreMousedisappear=t.onLoad=t.transitionend=t.RegExpEscape=t.GetYoDigits=t.rtl=void 0;var i,o=(i=n(609))&&i.__esModule?i:{default:i};t.rtl=function(){return"rtl"===(0,o.default)("html").attr("dir")},t.GetYoDigits=function(e,t){return e=e||6,Math.round(Math.pow(36,e+1)-Math.random()*Math.pow(36,e)).toString(36).slice(1)+(t?"-"+t:"")},t.RegExpEscape=function(e){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},t.transitionend=function(e){var t,n={transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend"},i=document.createElement("div");for(var o in n)void 0!==i.style[o]&&(t=n[o]);return t||(t=setTimeout((function(){e.triggerHandler("transitionend",[e])}),1),"transitionend")},t.onLoad=function(e,t){var n="complete"===document.readyState,i=(n?"_didLoad":"load")+".zf.util.onLoad",r=function(){return e.triggerHandler(i)};return e&&(t&&e.one(i,t),n?setTimeout(r):(0,o.default)(window).one("load",r)),i},t.ignoreMousedisappear=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.ignoreLeaveWindow,i=void 0!==n&&n,r=t.ignoreReappear,a=void 0!==r&&r;return function(t){for(var n=arguments.length,r=Array(n>1?n-1:0),s=1;s<n;s++)r[s-1]=arguments[s];var u=e.bind.apply(e,[this,t].concat(r));if(null!==t.relatedTarget)return u();setTimeout((function(){if(!i&&document.hasFocus&&!document.hasFocus())return u();a||(0,o.default)(document).one("mouseenter",(function(e){(0,o.default)(t.currentTarget).has(e.target).length||(t.relatedTarget=e.target,u())}))}),0)}}},354:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Dropdown=void 0;var i,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=function e(t,n,i){null===t&&(t=Function.prototype);var o=Object.getOwnPropertyDescriptor(t,n);if(void 0===o){var r=Object.getPrototypeOf(t);return null===r?void 0:e(r,n,i)}if("value"in o)return o.value;var a=o.get;return void 0!==a?a.call(i):void 0},a=(i=n(609))&&i.__esModule?i:{default:i},s=n(401),u=n(318),l=n(382),d=n(274);function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var h=function(e){function t(){return f(this,t),c(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"_setup",value:function(e,n){this.$element=e,this.options=a.default.extend({},t.defaults,this.$element.data(),n),this.className="Dropdown",d.Triggers.init(a.default),this._init(),s.Keyboard.register("Dropdown",{ENTER:"toggle",SPACE:"toggle",ESCAPE:"close"})}},{key:"_init",value:function(){var e=this.$element.attr("id");this.$anchors=(0,a.default)('[data-toggle="'+e+'"]').length?(0,a.default)('[data-toggle="'+e+'"]'):(0,a.default)('[data-open="'+e+'"]'),this.$anchors.attr({"aria-controls":e,"data-is-focus":!1,"data-yeti-box":e,"aria-haspopup":!0,"aria-expanded":!1}),this._setCurrentAnchor(this.$anchors.first()),this.options.parentClass?this.$parent=this.$element.parents("."+this.options.parentClass):this.$parent=null,void 0===this.$element.attr("aria-labelledby")&&(void 0===this.$currentAnchor.attr("id")&&this.$currentAnchor.attr("id",(0,u.GetYoDigits)(6,"dd-anchor")),this.$element.attr("aria-labelledby",this.$currentAnchor.attr("id"))),this.$element.attr({"aria-hidden":"true","data-yeti-box":e,"data-resize":e}),r(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"_init",this).call(this),this._events()}},{key:"_getDefaultPosition",value:function(){var e=this.$element[0].className.match(/(top|left|right|bottom)/g);return e?e[0]:"bottom"}},{key:"_getDefaultAlignment",value:function(){var e=/float-(\S+)/.exec(this.$currentAnchor.attr("class"));return e?e[1]:r(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"_getDefaultAlignment",this).call(this)}},{key:"_setPosition",value:function(){this.$element.removeClass("has-position-"+this.position+" has-alignment-"+this.alignment),r(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"_setPosition",this).call(this,this.$currentAnchor,this.$element,this.$parent),this.$element.addClass("has-position-"+this.position+" has-alignment-"+this.alignment)}},{key:"_setCurrentAnchor",value:function(e){this.$currentAnchor=(0,a.default)(e)}},{key:"_events",value:function(){var e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":this._setPosition.bind(this)}),this.$anchors.off("click.zf.trigger").on("click.zf.trigger",(function(){e._setCurrentAnchor(this)})),this.options.hover&&(this.$anchors.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",(function(){e._setCurrentAnchor(this);var t=(0,a.default)("body").data();void 0!==t.whatinput&&"mouse"!==t.whatinput||(clearTimeout(e.timeout),e.timeout=setTimeout((function(){e.open(),e.$anchors.data("hover",!0)}),e.options.hoverDelay))})).on("mouseleave.zf.dropdown",(0,u.ignoreMousedisappear)((function(){clearTimeout(e.timeout),e.timeout=setTimeout((function(){e.close(),e.$anchors.data("hover",!1)}),e.options.hoverDelay)}))),this.options.hoverPane&&this.$element.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",(function(){clearTimeout(e.timeout)})).on("mouseleave.zf.dropdown",(0,u.ignoreMousedisappear)((function(){clearTimeout(e.timeout),e.timeout=setTimeout((function(){e.close(),e.$anchors.data("hover",!1)}),e.options.hoverDelay)})))),this.$anchors.add(this.$element).on("keydown.zf.dropdown",(function(t){var n=(0,a.default)(this);s.Keyboard.findFocusable(e.$element),s.Keyboard.handleKey(t,"Dropdown",{open:function(){n.is(e.$anchors)&&!n.is("input, textarea")&&(e.open(),e.$element.attr("tabindex",-1).focus(),t.preventDefault())},close:function(){e.close(),e.$anchors.focus()}})}))}},{key:"_addBodyHandler",value:function(){var e=(0,a.default)(document.body).not(this.$element),t=this;e.off("click.zf.dropdown").on("click.zf.dropdown",(function(n){t.$anchors.is(n.target)||t.$anchors.find(n.target).length||t.$element.is(n.target)||t.$element.find(n.target).length||(t.close(),e.off("click.zf.dropdown"))}))}},{key:"open",value:function(){if(this.$element.trigger("closeme.zf.dropdown",this.$element.attr("id")),this.$anchors.addClass("hover").attr({"aria-expanded":!0}),this.$element.addClass("is-opening"),this._setPosition(),this.$element.removeClass("is-opening").addClass("is-open").attr({"aria-hidden":!1}),this.options.autoFocus){var e=s.Keyboard.findFocusable(this.$element);e.length&&e.eq(0).focus()}this.options.closeOnClick&&this._addBodyHandler(),this.options.trapFocus&&s.Keyboard.trapFocus(this.$element),this.$element.trigger("show.zf.dropdown",[this.$element])}},{key:"close",value:function(){if(!this.$element.hasClass("is-open"))return!1;this.$element.removeClass("is-open").attr({"aria-hidden":!0}),this.$anchors.removeClass("hover").attr("aria-expanded",!1),this.$element.trigger("hide.zf.dropdown",[this.$element]),this.options.trapFocus&&s.Keyboard.releaseFocus(this.$element)}},{key:"toggle",value:function(){if(this.$element.hasClass("is-open")){if(this.$anchors.data("hover"))return;this.close()}else this.open()}},{key:"_destroy",value:function(){this.$element.off(".zf.trigger").hide(),this.$anchors.off(".zf.dropdown"),(0,a.default)(document.body).off("click.zf.dropdown")}}]),t}(l.Positionable);h.defaults={parentClass:null,hoverDelay:250,hover:!1,hoverPane:!1,vOffset:0,hOffset:0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!0,trapFocus:!1,autoFocus:!1,closeOnClick:!1},t.Dropdown=h},960:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DropdownMenu=void 0;var i,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=(i=n(609))&&i.__esModule?i:{default:i},a=n(93),s=n(318),u=n(401),l=n(231),d=n(778);function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var h=function(e){function t(){return f(this,t),c(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"_setup",value:function(e,n){this.$element=e,this.options=r.default.extend({},t.defaults,this.$element.data(),n),this.className="DropdownMenu",this._init(),u.Keyboard.register("DropdownMenu",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"previous",ESCAPE:"close"})}},{key:"_init",value:function(){l.Nest.Feather(this.$element,"dropdown");var e=this.$element.find("li.is-dropdown-submenu-parent");this.$element.children(".is-dropdown-submenu-parent").children(".is-dropdown-submenu").addClass("first-sub"),this.$menuItems=this.$element.find('[role="menuitem"]'),this.$tabs=this.$element.children('[role="menuitem"]'),this.$tabs.find("ul.is-dropdown-submenu").addClass(this.options.verticalClass),"auto"===this.options.alignment?this.$element.hasClass(this.options.rightClass)||(0,s.rtl)()||this.$element.parents(".top-bar-right").is("*")?(this.options.alignment="right",e.addClass("opens-left")):(this.options.alignment="left",e.addClass("opens-right")):"right"===this.options.alignment?e.addClass("opens-left"):e.addClass("opens-right"),this.changed=!1,this._events()}},{key:"_isVertical",value:function(){return"block"===this.$tabs.css("display")||"column"===this.$element.css("flex-direction")}},{key:"_isRtl",value:function(){return this.$element.hasClass("align-right")||(0,s.rtl)()&&!this.$element.hasClass("align-left")}},{key:"_events",value:function(){var e=this,t="ontouchstart"in window||void 0!==window.ontouchstart,n="is-dropdown-submenu-parent";(this.options.clickOpen||t)&&this.$menuItems.on("click.zf.dropdownmenu touchstart.zf.dropdownmenu",(function(i){var o=(0,r.default)(i.target).parentsUntil("ul","."+n),a=o.hasClass(n),s="true"===o.attr("data-is-click"),u=o.children(".is-dropdown-submenu");if(a)if(s){if(!e.options.closeOnClick||!e.options.clickOpen&&!t||e.options.forceFollow&&t)return;i.stopImmediatePropagation(),i.preventDefault(),e._hide(o)}else i.preventDefault(),i.stopImmediatePropagation(),e._show(u),o.add(o.parentsUntil(e.$element,"."+n)).attr("data-is-click",!0)})),e.options.closeOnClickInside&&this.$menuItems.on("click.zf.dropdownmenu",(function(t){(0,r.default)(this).hasClass(n)||e._hide()})),this.options.disableHover||this.$menuItems.on("mouseenter.zf.dropdownmenu",(function(t){var i=(0,r.default)(this);i.hasClass(n)&&(clearTimeout(i.data("_delay")),i.data("_delay",setTimeout((function(){e._show(i.children(".is-dropdown-submenu"))}),e.options.hoverDelay)))})).on("mouseleave.zf.dropdownMenu",(0,s.ignoreMousedisappear)((function(t){var i=(0,r.default)(this);if(i.hasClass(n)&&e.options.autoclose){if("true"===i.attr("data-is-click")&&e.options.clickOpen)return!1;clearTimeout(i.data("_delay")),i.data("_delay",setTimeout((function(){e._hide(i)}),e.options.closingTime))}}))),this.$menuItems.on("keydown.zf.dropdownmenu",(function(t){var n,i,o=(0,r.default)(t.target).parentsUntil("ul",'[role="menuitem"]'),a=e.$tabs.index(o)>-1,s=a?e.$tabs:o.siblings("li").add(o);s.each((function(e){if((0,r.default)(this).is(o))return n=s.eq(e-1),void(i=s.eq(e+1))}));var l=function(){i.children("a:first").focus(),t.preventDefault()},d=function(){n.children("a:first").focus(),t.preventDefault()},f=function(){var n=o.children("ul.is-dropdown-submenu");n.length&&(e._show(n),o.find("li > a:first").focus(),t.preventDefault())},c=function(){var n=o.parent("ul").parent("li");n.children("a:first").focus(),e._hide(n),t.preventDefault()},h={open:f,close:function(){e._hide(e.$element),e.$menuItems.eq(0).children("a").focus(),t.preventDefault()},handled:function(){t.stopImmediatePropagation()}};a?e._isVertical()?e._isRtl()?r.default.extend(h,{down:l,up:d,next:c,previous:f}):r.default.extend(h,{down:l,up:d,next:f,previous:c}):e._isRtl()?r.default.extend(h,{next:d,previous:l,down:f,up:c}):r.default.extend(h,{next:l,previous:d,down:f,up:c}):e._isRtl()?r.default.extend(h,{next:c,previous:f,down:l,up:d}):r.default.extend(h,{next:f,previous:c,down:l,up:d}),u.Keyboard.handleKey(t,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var e=(0,r.default)(document.body),t=this;e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu").on("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu",(function(n){t.$element.find(n.target).length||(t._hide(),e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu"))}))}},{key:"_show",value:function(e){var t=this.$tabs.index(this.$tabs.filter((function(t,n){return(0,r.default)(n).find(e).length>0}))),n=e.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,t),e.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=d.Box.ImNotTouchingYou(e,null,!0);if(!i){var o="left"===this.options.alignment?"-right":"-left",a=e.parent(".is-dropdown-submenu-parent");a.removeClass("opens"+o).addClass("opens-"+this.options.alignment),(i=d.Box.ImNotTouchingYou(e,null,!0))||a.removeClass("opens-"+this.options.alignment).addClass("opens-inner"),this.changed=!0}e.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownmenu",[e])}},{key:"_hide",value:function(e,t){var n;if((n=e&&e.length?e:void 0!==t?this.$tabs.not((function(e,n){return e===t})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){if(n.find("li.is-active").add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var i="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-"+this.options.alignment).addClass("opens-"+i),this.changed=!1}this.$element.trigger("hide.zf.dropdownmenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownmenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),(0,r.default)(document.body).off(".zf.dropdownmenu"),l.Nest.Burn(this.$element,"dropdown")}}]),t}(a.Plugin);h.defaults={disableHover:!1,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0},t.DropdownMenu=h},987:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Interchange=void 0;var i,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),r=(i=n(609))&&i.__esModule?i:{default:i},a=n(857),s=n(93),u=n(318);function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var f=function(e){function t(){return l(this,t),d(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"_setup",value:function(e,n){this.$element=e,this.options=r.default.extend({},t.defaults,n),this.rules=[],this.currentPath="",this.className="Interchange",this._init(),this._events()}},{key:"_init",value:function(){a.MediaQuery._init();var e=this.$element[0].id||(0,u.GetYoDigits)(6,"interchange");this.$element.attr({"data-resize":e,id:e}),this._addBreakpoints(),this._generateRules(),this._reflow()}},{key:"_events",value:function(){var e=this;this.$element.off("resizeme.zf.trigger").on("resizeme.zf.trigger",(function(){return e._reflow()}))}},{key:"_reflow",value:function(){var e;for(var t in this.rules)if(this.rules.hasOwnProperty(t)){var n=this.rules[t];window.matchMedia(n.query).matches&&(e=n)}e&&this.replace(e.path)}},{key:"_addBreakpoints",value:function(){for(var e in a.MediaQuery.queries)if(a.MediaQuery.queries.hasOwnProperty(e)){var n=a.MediaQuery.queries[e];t.SPECIAL_QUERIES[n.name]=n.value}}},{key:"_generateRules",value:function(e){var n,i=[];for(var o in n="string"==typeof(n=this.options.rules?this.options.rules:this.$element.data("interchange"))?n.match(/\[.*?, .*?\]/g):n)if(n.hasOwnProperty(o)){var r=n[o].slice(1,-1).split(", "),a=r.slice(0,-1).join(""),s=r[r.length-1];t.SPECIAL_QUERIES[s]&&(s=t.SPECIAL_QUERIES[s]),i.push({path:a,query:s})}this.rules=i}},{key:"replace",value:function(e){if(this.currentPath!==e){var t=this,n="replaced.zf.interchange";"IMG"===this.$element[0].nodeName?this.$element.attr("src",e).on("load",(function(){t.currentPath=e})).trigger(n):e.match(/\.(gif|jpg|jpeg|png|svg|tiff)([?#].*)?/i)?(e=e.replace(/\(/g,"%28").replace(/\)/g,"%29"),this.$element.css({"background-image":"url("+e+")"}).trigger(n)):r.default.get(e,(function(i){t.$element.html(i).trigger(n),(0,r.default)(i).foundation(),t.currentPath=e}))}}},{key:"_destroy",value:function(){this.$element.off("resizeme.zf.trigger")}}]),t}(s.Plugin);f.defaults={rules:null},f.SPECIAL_QUERIES={landscape:"screen and (orientation: landscape)",portrait:"screen and (orientation: portrait)",retina:"only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)"},t.Interchange=f},382:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Positionable=void 0;var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),o=n(778),r=n(93),a=n(318);function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var l=["left","right","top","bottom"],d=["top","bottom","center"],f=["left","right","center"],c={left:d,right:d,top:f,bottom:f};function h(e,t){var n=t.indexOf(e);return n===t.length-1?t[0]:t[n+1]}var p=function(e){function t(){return s(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),i(t,[{key:"_init",value:function(){this.triedPositions={},this.position="auto"===this.options.position?this._getDefaultPosition():this.options.position,this.alignment="auto"===this.options.alignment?this._getDefaultAlignment():this.options.alignment,this.originalPosition=this.position,this.originalAlignment=this.alignment}},{key:"_getDefaultPosition",value:function(){return"bottom"}},{key:"_getDefaultAlignment",value:function(){switch(this.position){case"bottom":case"top":return(0,a.rtl)()?"right":"left";case"left":case"right":return"bottom"}}},{key:"_reposition",value:function(){this._alignmentsExhausted(this.position)?(this.position=h(this.position,l),this.alignment=c[this.position][0]):this._realign()}},{key:"_realign",value:function(){this._addTriedPosition(this.position,this.alignment),this.alignment=h(this.alignment,c[this.position])}},{key:"_addTriedPosition",value:function(e,t){this.triedPositions[e]=this.triedPositions[e]||[],this.triedPositions[e].push(t)}},{key:"_positionsExhausted",value:function(){for(var e=!0,t=0;t<l.length;t++)e=e&&this._alignmentsExhausted(l[t]);return e}},{key:"_alignmentsExhausted",value:function(e){return this.triedPositions[e]&&this.triedPositions[e].length==c[e].length}},{key:"_getVOffset",value:function(){return this.options.vOffset}},{key:"_getHOffset",value:function(){return this.options.hOffset}},{key:"_setPosition",value:function(e,t,n){if("false"===e.attr("aria-expanded"))return!1;if(o.Box.GetDimensions(t),o.Box.GetDimensions(e),this.options.allowOverlap||(this.position=this.originalPosition,this.alignment=this.originalAlignment),t.offset(o.Box.GetExplicitOffsets(t,e,this.position,this.alignment,this._getVOffset(),this._getHOffset())),!this.options.allowOverlap){for(var i=1e8,r={position:this.position,alignment:this.alignment};!this._positionsExhausted();){var a=o.Box.OverlapArea(t,n,!1,!1,this.options.allowBottomOverlap);if(0===a)return;a<i&&(i=a,r={position:this.position,alignment:this.alignment}),this._reposition(),t.offset(o.Box.GetExplicitOffsets(t,e,this.position,this.alignment,this._getVOffset(),this._getHOffset()))}this.position=r.position,this.alignment=r.alignment,t.offset(o.Box.GetExplicitOffsets(t,e,this.position,this.alignment,this._getVOffset(),this._getHOffset()))}}}]),t}(r.Plugin);p.defaults={position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!0,vOffset:0,hOffset:0},t.Positionable=p},778:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Box=void 0;var i=n(318),o={ImNotTouchingYou:function(e,t,n,i,o){return 0===r(e,t,n,i,o)},OverlapArea:r,GetDimensions:a,GetOffsets:function(e,t,n,o,r,a){switch(console.log("NOTE: GetOffsets is deprecated in favor of GetExplicitOffsets and will be removed in 6.5"),n){case"top":return(0,i.rtl)()?s(e,t,"top","left",o,r,a):s(e,t,"top","right",o,r,a);case"bottom":return(0,i.rtl)()?s(e,t,"bottom","left",o,r,a):s(e,t,"bottom","right",o,r,a);case"center top":return s(e,t,"top","center",o,r,a);case"center bottom":return s(e,t,"bottom","center",o,r,a);case"center left":return s(e,t,"left","center",o,r,a);case"center right":return s(e,t,"right","center",o,r,a);case"left bottom":return s(e,t,"bottom","left",o,r,a);case"right bottom":return s(e,t,"bottom","right",o,r,a);case"center":return{left:$eleDims.windowDims.offset.left+$eleDims.windowDims.width/2-$eleDims.width/2+r,top:$eleDims.windowDims.offset.top+$eleDims.windowDims.height/2-($eleDims.height/2+o)};case"reveal":return{left:($eleDims.windowDims.width-$eleDims.width)/2+r,top:$eleDims.windowDims.offset.top+o};case"reveal full":return{left:$eleDims.windowDims.offset.left,top:$eleDims.windowDims.offset.top};default:return{left:(0,i.rtl)()?$anchorDims.offset.left-$eleDims.width+$anchorDims.width-r:$anchorDims.offset.left+r,top:$anchorDims.offset.top+$anchorDims.height+o}}},GetExplicitOffsets:s};function r(e,t,n,i,o){var r,s,u,l,d=a(e);if(t){var f=a(t);s=f.height+f.offset.top-(d.offset.top+d.height),r=d.offset.top-f.offset.top,u=d.offset.left-f.offset.left,l=f.width+f.offset.left-(d.offset.left+d.width)}else s=d.windowDims.height+d.windowDims.offset.top-(d.offset.top+d.height),r=d.offset.top-d.windowDims.offset.top,u=d.offset.left-d.windowDims.offset.left,l=d.windowDims.width-(d.offset.left+d.width);return s=o?0:Math.min(s,0),r=Math.min(r,0),u=Math.min(u,0),l=Math.min(l,0),n?u+l:i?r+s:Math.sqrt(r*r+s*s+u*u+l*l)}function a(e){if((e=e.length?e[0]:e)===window||e===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var t=e.getBoundingClientRect(),n=e.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:t.width,height:t.height,offset:{top:t.top+o,left:t.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}function s(e,t,n,i,o,r,s){var u,l,d=a(e),f=t?a(t):null;switch(n){case"top":u=f.offset.top-(d.height+o);break;case"bottom":u=f.offset.top+f.height+o;break;case"left":l=f.offset.left-(d.width+r);break;case"right":l=f.offset.left+f.width+r}switch(n){case"top":case"bottom":switch(i){case"left":l=f.offset.left+r;break;case"right":l=f.offset.left-d.width+f.width-r;break;case"center":l=s?r:f.offset.left+f.width/2-d.width/2+r}break;case"right":case"left":switch(i){case"bottom":u=f.offset.top-o+f.height-d.height;break;case"top":u=f.offset.top+o;break;case"center":u=f.offset.top+o+f.height/2-d.height/2}}return{top:u,left:l}}t.Box=o},541:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.onImagesLoaded=void 0;var i,o=(i=n(609))&&i.__esModule?i:{default:i};t.onImagesLoaded=function(e,t){var n=e.length;function i(){0==--n&&t()}0===n&&t(),e.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var e=new Image,t="load.zf.images error.zf.images";(0,o.default)(e).one(t,(function e(n){(0,o.default)(this).off(t,e),i()})),e.src=(0,o.default)(this).attr("src")}}))}},401:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Keyboard=void 0;var i,o=(i=n(609))&&i.__esModule?i:{default:i},r=n(318),a={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},s={};function u(e){return!!e&&e.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!(0,o.default)(this).is(":visible")||(0,o.default)(this).attr("tabindex")<0)}))}function l(e){var t=a[e.which||e.keyCode]||String.fromCharCode(e.which).toUpperCase();return t=t.replace(/\W+/,""),e.shiftKey&&(t="SHIFT_"+t),e.ctrlKey&&(t="CTRL_"+t),e.altKey&&(t="ALT_"+t),t.replace(/_$/,"")}var d={keys:function(e){var t={};for(var n in e)t[e[n]]=e[n];return t}(a),parseKey:l,handleKey:function(e,t,n){var i,a=s[t],u=this.parseKey(e);if(!a)return console.warn("Component not defined!");if((i=n[(void 0===a.ltr?a:(0,r.rtl)()?o.default.extend({},a.ltr,a.rtl):o.default.extend({},a.rtl,a.ltr))[u]])&&"function"==typeof i){var l=i.apply();(n.handled||"function"==typeof n.handled)&&n.handled(l)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:u,register:function(e,t){s[e]=t},trapFocus:function(e){var t=u(e),n=t.eq(0),i=t.eq(-1);e.on("keydown.zf.trapfocus",(function(e){e.target===i[0]&&"TAB"===l(e)?(e.preventDefault(),n.focus()):e.target===n[0]&&"SHIFT_TAB"===l(e)&&(e.preventDefault(),i.focus())}))},releaseFocus:function(e){e.off("keydown.zf.trapfocus")}};t.Keyboard=d},857:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MediaQuery=void 0;var i,o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=(i=n(609))&&i.__esModule?i:{default:i};window.matchMedia||(window.matchMedia=function(){var e=window.styleMedia||window.media;if(!e){var t,n=document.createElement("style"),i=document.getElementsByTagName("script")[0];n.type="text/css",n.id="matchmediajs-test",i?i.parentNode.insertBefore(n,i):document.head.appendChild(n),t="getComputedStyle"in window&&window.getComputedStyle(n,null)||n.currentStyle,e={matchMedium:function(e){var i="@media "+e+"{ #matchmediajs-test { width: 1px; } }";return n.styleSheet?n.styleSheet.cssText=i:n.textContent=i,"1px"===t.width}}}return function(t){return{matches:e.matchMedium(t||"all"),media:t||"all"}}}());var a={queries:[],current:"",_init:function(){(0,r.default)("meta.foundation-mq").length||(0,r.default)('<meta class="foundation-mq">').appendTo(document.head);var e,t,n,i=(0,r.default)(".foundation-mq").css("font-family");for(var o in n=void 0,n={},e="string"!=typeof(t=i)?n:(t=t.trim().slice(1,-1))?t.split("&").reduce((function(e,t){var n=t.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),e.hasOwnProperty(i)?Array.isArray(e[i])?e[i].push(o):e[i]=[e[i],o]:e[i]=o,e}),{}):n)e.hasOwnProperty(o)&&this.queries.push({name:o,value:"only screen and (min-width: "+e[o]+")"});this.current=this._getCurrentSize(),this._watcher()},atLeast:function(e){var t=this.get(e);return!!t&&window.matchMedia(t).matches},is:function(e){return(e=e.trim().split(" ")).length>1&&"only"===e[1]?e[0]===this._getCurrentSize():this.atLeast(e[0])},get:function(e){for(var t in this.queries)if(this.queries.hasOwnProperty(t)){var n=this.queries[t];if(e===n.name)return n.value}return null},_getCurrentSize:function(){for(var e,t=0;t<this.queries.length;t++){var n=this.queries[t];window.matchMedia(n.value).matches&&(e=n)}return"object"===(void 0===e?"undefined":o(e))?e.name:e},_watcher:function(){var e=this;(0,r.default)(window).off("resize.zf.mediaquery").on("resize.zf.mediaquery",(function(){var t=e._getCurrentSize(),n=e.current;t!==n&&(e.current=t,(0,r.default)(window).trigger("changed.zf.mediaquery",[t,n]))}))}};t.MediaQuery=a},208:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Motion=t.Move=void 0;var i,o=(i=n(609))&&i.__esModule?i:{default:i},r=n(318),a=["mui-enter","mui-leave"],s=["mui-enter-active","mui-leave-active"],u={animateIn:function(e,t,n){l(!0,e,t,n)},animateOut:function(e,t,n){l(!1,e,t,n)}};function l(e,t,n,i){if((t=(0,o.default)(t).eq(0)).length){var u=e?a[0]:a[1],l=e?s[0]:s[1];d(),t.addClass(n).css("transition","none"),requestAnimationFrame((function(){t.addClass(u),e&&t.show()})),requestAnimationFrame((function(){t[0].offsetWidth,t.css("transition","").addClass(l)})),t.one((0,r.transitionend)(t),(function(){e||t.hide(),d(),i&&i.apply(t)}))}function d(){t[0].style.transitionDuration=0,t.removeClass(u+" "+l+" "+n)}}t.Move=function(e,t,n){var i,o,r=null;if(0===e)return n.apply(t),void t.trigger("finished.zf.animate",[t]).triggerHandler("finished.zf.animate",[t]);i=window.requestAnimationFrame((function a(s){r||(r=s),o=s-r,n.apply(t),o<e?i=window.requestAnimationFrame(a,t):(window.cancelAnimationFrame(i),t.trigger("finished.zf.animate",[t]).triggerHandler("finished.zf.animate",[t]))}))},t.Motion=u},231:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Nest=void 0;var i,o=(i=n(609))&&i.__esModule?i:{default:i},r={Feather:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"zf";e.attr("role","menubar");var n=e.find("li").attr({role:"menuitem"}),i="is-"+t+"-submenu",r=i+"-item",a="is-"+t+"-submenu-parent",s="accordion"!==t;n.each((function(){var e=(0,o.default)(this),n=e.children("ul");n.length&&(e.addClass(a),n.addClass("submenu "+i).attr({"data-submenu":""}),s&&(e.attr({"aria-haspopup":!0,"aria-label":e.children("a:first").text()}),"drilldown"===t&&e.attr({"aria-expanded":!1})),n.addClass("submenu "+i).attr({"data-submenu":"",role:"menubar"}),"drilldown"===t&&n.attr({"aria-hidden":!0})),e.parent("[data-submenu]").length&&e.addClass("is-submenu-item "+r)}))},Burn:function(e,t){var n="is-"+t+"-submenu",i=n+"-item",o="is-"+t+"-submenu-parent";e.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass(n+" "+i+" "+o+" is-submenu-item submenu is-active").removeAttr("data-submenu").css("display","")}};t.Nest=r},506:(e,t,n)=>{"use strict";var i;Object.defineProperty(t,"__esModule",{value:!0}),t.Timer=void 0,(i=n(609))&&i.__esModule,t.Timer=function(e,t,n){var i,o,r=this,a=t.duration,s=Object.keys(e.data())[0]||"timer",u=-1;this.isPaused=!1,this.restart=function(){u=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),u=u<=0?a:u,e.data("paused",!1),i=Date.now(),o=setTimeout((function(){t.infinite&&r.restart(),n&&"function"==typeof n&&n()}),u),e.trigger("timerstart.zf."+s)},this.pause=function(){this.isPaused=!0,clearTimeout(o),e.data("paused",!0);var t=Date.now();u-=t-i,e.trigger("timerpaused.zf."+s)}}},193:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Touch=void 0;var i,o,r,a,s,u=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),l=(i=n(609))&&i.__esModule?i:{default:i},d={},f=!1,c=!1;function h(e){if(this.removeEventListener("touchmove",p),this.removeEventListener("touchend",h),!c){var t=l.default.Event("tap",s||e);(0,l.default)(this).trigger(t)}s=null,f=!1,c=!1}function p(e){if(l.default.spotSwipe.preventDefault&&e.preventDefault(),f){var t,n=e.touches[0].pageX,i=(e.touches[0].pageY,o-n);c=!0,a=(new Date).getTime()-r,Math.abs(i)>=l.default.spotSwipe.moveThreshold&&a<=l.default.spotSwipe.timeThreshold&&(t=i>0?"left":"right"),t&&(e.preventDefault(),h.apply(this,arguments),(0,l.default)(this).trigger(l.default.Event("swipe",e),t).trigger(l.default.Event("swipe"+t,e)))}}function m(e){1==e.touches.length&&(o=e.touches[0].pageX,e.touches[0].pageY,s=e,f=!0,c=!1,r=(new Date).getTime(),this.addEventListener("touchmove",p,!1),this.addEventListener("touchend",h,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,!1)}var v=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this.$=t,this._init()}return u(e,[{key:"_init",value:function(){var e=this.$;e.event.special.swipe={setup:g},e.event.special.tap={setup:g},e.each(["left","up","down","right"],(function(){e.event.special["swipe"+this]={setup:function(){e(this).on("swipe",e.noop)}}}))}}]),e}();d.setupSpotSwipe=function(e){e.spotSwipe=new v(e)},d.setupTouchHandler=function(e){e.fn.addTouch=function(){this.each((function(n,i){e(i).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(e){var t,n=e.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[e.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?t=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(t=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(t)}}},d.init=function(e){void 0===e.spotSwipe&&(d.setupSpotSwipe(e),d.setupTouchHandler(e))},t.Touch=d},274:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Triggers=void 0;var i,o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=(i=n(609))&&i.__esModule?i:{default:i},a=n(318),s=n(208),u=function(){for(var e=["WebKit","Moz","O","Ms",""],t=0;t<e.length;t++)if(e[t]+"MutationObserver"in window)return window[e[t]+"MutationObserver"];return!1}(),l=function(e,t){e.data(t).split(" ").forEach((function(n){(0,r.default)("#"+n)["close"===t?"trigger":"triggerHandler"](t+".zf.trigger",[e])}))},d={Listeners:{Basic:{},Global:{}},Initializers:{}};function f(e,t,n){var i=void 0,o=Array.prototype.slice.call(arguments,3);(0,r.default)(window).off(t).on(t,(function(t){i&&clearTimeout(i),i=setTimeout((function(){n.apply(null,o)}),e||10)}))}d.Listeners.Basic={openListener:function(){l((0,r.default)(this),"open")},closeListener:function(){(0,r.default)(this).data("close")?l((0,r.default)(this),"close"):(0,r.default)(this).trigger("close.zf.trigger")},toggleListener:function(){(0,r.default)(this).data("toggle")?l((0,r.default)(this),"toggle"):(0,r.default)(this).trigger("toggle.zf.trigger")},closeableListener:function(e){e.stopPropagation();var t=(0,r.default)(this).data("closable");""!==t?s.Motion.animateOut((0,r.default)(this),t,(function(){(0,r.default)(this).trigger("closed.zf")})):(0,r.default)(this).fadeOut().trigger("closed.zf")},toggleFocusListener:function(){var e=(0,r.default)(this).data("toggle-focus");(0,r.default)("#"+e).triggerHandler("toggle.zf.trigger",[(0,r.default)(this)])}},d.Initializers.addOpenListener=function(e){e.off("click.zf.trigger",d.Listeners.Basic.openListener),e.on("click.zf.trigger","[data-open]",d.Listeners.Basic.openListener)},d.Initializers.addCloseListener=function(e){e.off("click.zf.trigger",d.Listeners.Basic.closeListener),e.on("click.zf.trigger","[data-close]",d.Listeners.Basic.closeListener)},d.Initializers.addToggleListener=function(e){e.off("click.zf.trigger",d.Listeners.Basic.toggleListener),e.on("click.zf.trigger","[data-toggle]",d.Listeners.Basic.toggleListener)},d.Initializers.addCloseableListener=function(e){e.off("close.zf.trigger",d.Listeners.Basic.closeableListener),e.on("close.zf.trigger","[data-closeable], [data-closable]",d.Listeners.Basic.closeableListener)},d.Initializers.addToggleFocusListener=function(e){e.off("focus.zf.trigger blur.zf.trigger",d.Listeners.Basic.toggleFocusListener),e.on("focus.zf.trigger blur.zf.trigger","[data-toggle-focus]",d.Listeners.Basic.toggleFocusListener)},d.Listeners.Global={resizeListener:function(e){u||e.each((function(){(0,r.default)(this).triggerHandler("resizeme.zf.trigger")})),e.attr("data-events","resize")},scrollListener:function(e){u||e.each((function(){(0,r.default)(this).triggerHandler("scrollme.zf.trigger")})),e.attr("data-events","scroll")},closeMeListener:function(e,t){var n=e.namespace.split(".")[0];(0,r.default)("[data-"+n+"]").not('[data-yeti-box="'+t+'"]').each((function(){var e=(0,r.default)(this);e.triggerHandler("close.zf.trigger",[e])}))}},d.Initializers.addClosemeListener=function(e){var t=(0,r.default)("[data-yeti-box]"),n=["dropdown","tooltip","reveal"];if(e&&("string"==typeof e?n.push(e):"object"===(void 0===e?"undefined":o(e))&&"string"==typeof e[0]?n.concat(e):console.error("Plugin names must be strings")),t.length){var i=n.map((function(e){return"closeme.zf."+e})).join(" ");(0,r.default)(window).off(i).on(i,d.Listeners.Global.closeMeListener)}},d.Initializers.addResizeListener=function(e){var t=(0,r.default)("[data-resize]");t.length&&f(e,"resize.zf.trigger",d.Listeners.Global.resizeListener,t)},d.Initializers.addScrollListener=function(e){var t=(0,r.default)("[data-scroll]");t.length&&f(e,"scroll.zf.trigger",d.Listeners.Global.scrollListener,t)},d.Initializers.addMutationEventsListener=function(e){if(!u)return!1;var t=e.find("[data-resize], [data-scroll], [data-mutate]"),n=function(e){var t=(0,r.default)(e[0].target);switch(e[0].type){case"attributes":"scroll"===t.attr("data-events")&&"data-events"===e[0].attributeName&&t.triggerHandler("scrollme.zf.trigger",[t,window.pageYOffset]),"resize"===t.attr("data-events")&&"data-events"===e[0].attributeName&&t.triggerHandler("resizeme.zf.trigger",[t]),"style"===e[0].attributeName&&(t.closest("[data-mutate]").attr("data-events","mutate"),t.closest("[data-mutate]").triggerHandler("mutateme.zf.trigger",[t.closest("[data-mutate]")]));break;case"childList":t.closest("[data-mutate]").attr("data-events","mutate"),t.closest("[data-mutate]").triggerHandler("mutateme.zf.trigger",[t.closest("[data-mutate]")]);break;default:return!1}};if(t.length)for(var i=0;i<=t.length-1;i++)new u(n).observe(t[i],{attributes:!0,childList:!0,characterData:!1,subtree:!0,attributeFilter:["data-events","style"]})},d.Initializers.addSimpleListeners=function(){var e=(0,r.default)(document);d.Initializers.addOpenListener(e),d.Initializers.addCloseListener(e),d.Initializers.addToggleListener(e),d.Initializers.addCloseableListener(e),d.Initializers.addToggleFocusListener(e)},d.Initializers.addGlobalListeners=function(){var e=(0,r.default)(document);d.Initializers.addMutationEventsListener(e),d.Initializers.addResizeListener(),d.Initializers.addScrollListener(),d.Initializers.addClosemeListener()},d.init=function(e,t){(0,a.onLoad)(e(window),(function(){!0!==e.triggersInitialized&&(d.Initializers.addSimpleListeners(),d.Initializers.addGlobalListeners(),e.triggersInitialized=!0)})),t&&(t.Triggers=d,t.IHearYou=d.Initializers.addGlobalListeners)},t.Triggers=d},852:(e,t,n)=>{"use strict";var i,o=(i=n(609))&&i.__esModule?i:{default:i},r=n(545),a=n(318),s=n(778),u=n(541),l=n(401),d=n(857),f=n(208),c=n(231),h=n(506),p=n(193),m=n(274),g=n(354),v=n(960),w=n(987);r.Foundation.addToJquery(o.default),r.Foundation.rtl=a.rtl,r.Foundation.GetYoDigits=a.GetYoDigits,r.Foundation.transitionend=a.transitionend,r.Foundation.Box=s.Box,r.Foundation.onImagesLoaded=u.onImagesLoaded,r.Foundation.Keyboard=l.Keyboard,r.Foundation.MediaQuery=d.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=c.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.default),m.Triggers.init(o.default,r.Foundation),r.Foundation.plugin(g.Dropdown,"Dropdown"),r.Foundation.plugin(v.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(w.Interchange,"Interchange"),e.exports=r.Foundation},474:function(e){var t;t=function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={exports:{},id:i,loaded:!1};return e[i].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}return n.m=e,n.c=t,n.p="",n(0)}([function(e,t){"use strict";e.exports=function(){var e="initial",t=null,n=document.documentElement,i=["input","select","textarea"],o=[],r=[16,17,18,91,93],a=[9],s={keydown:"keyboard",keyup:"keyboard",mousedown:"mouse",mousemove:"mouse",MSPointerDown:"pointer",MSPointerMove:"pointer",pointerdown:"pointer",pointermove:"pointer",touchstart:"touch"},u=[],l=!1,d=!1,f={x:null,y:null},c={2:"touch",3:"touch",4:"mouse"},h=!1;try{var p=Object.defineProperty({},"passive",{get:function(){h=!0}});window.addEventListener("test",null,p)}catch(e){}var m,g=function(n){if(!l){var o=n.which,u=s[n.type];if("pointer"===u&&(u=_(n)),e!==u||t!==u){var d=document.activeElement,f=!1;(d&&d.nodeName&&-1===i.indexOf(d.nodeName.toLowerCase())||-1!==a.indexOf(o))&&(f=!0),("touch"===u||"mouse"===u||"keyboard"===u&&o&&f&&-1===r.indexOf(o))&&(e=t=u,v())}}},v=function(){n.setAttribute("data-whatinput",e),n.setAttribute("data-whatintent",e),-1===u.indexOf(e)&&(u.push(e),n.className+=" whatinput-types-"+e),b("input")},w=function(e){if(f.x!==e.screenX||f.y!==e.screenY?(d=!1,f.x=e.screenX,f.y=e.screenY):d=!0,!l&&!d){var i=s[e.type];"pointer"===i&&(i=_(e)),t!==i&&(t=i,n.setAttribute("data-whatintent",t),b("intent"))}},y=function(e){"touchstart"===e.type?(l=!1,g(e)):l=!0},b=function(e){for(var n=0,i=o.length;n<i;n++)o[n].type===e&&o[n].fn.call(void 0,t)},_=function(e){return"number"==typeof e.pointerType?c[e.pointerType]:"pen"===e.pointerType?"touch":e.pointerType},z=function(){return"onwheel"in document.createElement("div")?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll"};return"addEventListener"in window&&Array.prototype.indexOf&&(s[z()]="mouse",m=!!h&&{passive:!0},window.PointerEvent?(n.addEventListener("pointerdown",g),n.addEventListener("pointermove",w)):window.MSPointerEvent?(n.addEventListener("MSPointerDown",g),n.addEventListener("MSPointerMove",w)):(n.addEventListener("mousedown",g),n.addEventListener("mousemove",w),"ontouchstart"in window&&(n.addEventListener("touchstart",y,m),n.addEventListener("touchend",y))),n.addEventListener(z(),w,m),n.addEventListener("keydown",g),n.addEventListener("keyup",g),v()),{ask:function(n){return"loose"===n?t:e},types:function(){return u},ignoreKeys:function(e){r=e},registerOnChange:function(e,t){o.push({fn:e,type:t||"input"})},unRegisterOnChange:function(e){var t=function(e){for(var t=0,n=o.length;t<n;t++)if(o[t].fn===e)return t}(e);t&&o.splice(t,1)}}}()}])},e.exports=t()},609:e=>{"use strict";e.exports=jQuery}},t={};function n(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={exports:{}};return e[i].call(r.exports,r,r.exports,n),r.exports}(()=>{"use strict";var e=t(n(609));function t(e){return e&&e.__esModule?e:{default:e}}t(n(474)),n(852),window.$=e.default,(0,e.default)(document).foundation()})()})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9iaW9mcmljdGlvbi8uL25vZGVfbW9kdWxlcy9mb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24uY29yZS5qcyIsIndlYnBhY2s6Ly9iaW9mcmljdGlvbi8uL25vZGVfbW9kdWxlcy9mb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24uY29yZS5wbHVnaW4uanMiLCJ3ZWJwYWNrOi8vYmlvZnJpY3Rpb24vLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLmNvcmUudXRpbHMuanMiLCJ3ZWJwYWNrOi8vYmlvZnJpY3Rpb24vLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLmRyb3Bkb3duLmpzIiwid2VicGFjazovL2Jpb2ZyaWN0aW9uLy4vbm9kZV9tb2R1bGVzL2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi5kcm9wZG93bk1lbnUuanMiLCJ3ZWJwYWNrOi8vYmlvZnJpY3Rpb24vLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLmludGVyY2hhbmdlLmpzIiwid2VicGFjazovL2Jpb2ZyaWN0aW9uLy4vbm9kZV9tb2R1bGVzL2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi5wb3NpdGlvbmFibGUuanMiLCJ3ZWJwYWNrOi8vYmlvZnJpY3Rpb24vLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnV0aWwuYm94LmpzIiwid2VicGFjazovL2Jpb2ZyaWN0aW9uLy4vbm9kZV9tb2R1bGVzL2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi51dGlsLmltYWdlTG9hZGVyLmpzIiwid2VicGFjazovL2Jpb2ZyaWN0aW9uLy4vbm9kZV9tb2R1bGVzL2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi51dGlsLmtleWJvYXJkLmpzIiwid2VicGFjazovL2Jpb2ZyaWN0aW9uLy4vbm9kZV9tb2R1bGVzL2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi51dGlsLm1lZGlhUXVlcnkuanMiLCJ3ZWJwYWNrOi8vYmlvZnJpY3Rpb24vLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnV0aWwubW90aW9uLmpzIiwid2VicGFjazovL2Jpb2ZyaWN0aW9uLy4vbm9kZV9tb2R1bGVzL2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi51dGlsLm5lc3QuanMiLCJ3ZWJwYWNrOi8vYmlvZnJpY3Rpb24vLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnV0aWwudGltZXIuanMiLCJ3ZWJwYWNrOi8vYmlvZnJpY3Rpb24vLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnV0aWwudG91Y2guanMiLCJ3ZWJwYWNrOi8vYmlvZnJpY3Rpb24vLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnV0aWwudHJpZ2dlcnMuanMiLCJ3ZWJwYWNrOi8vYmlvZnJpY3Rpb24vLi9zcmMvYXNzZXRzL2pzL2xpYi9mb3VuZGF0aW9uLWV4cGxpY2l0LXBpZWNlcy5qcyIsIndlYnBhY2s6Ly9iaW9mcmljdGlvbi8uL25vZGVfbW9kdWxlcy93aGF0LWlucHV0L2Rpc3Qvd2hhdC1pbnB1dC5qcyIsIndlYnBhY2s6Ly9iaW9mcmljdGlvbi9leHRlcm5hbCBcImpRdWVyeVwiIiwid2VicGFjazovL2Jpb2ZyaWN0aW9uL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2Jpb2ZyaWN0aW9uLy4vc3JjL2Fzc2V0cy9qcy9hcHAuanMiXSwibmFtZXMiOlsiRm91bmRhdGlvbiIsInZlcnNpb24iLCJfcGx1Z2lucyIsIl91dWlkcyIsInBsdWdpbiIsIm5hbWUiLCJjbGFzc05hbWUiLCJmdW5jdGlvbk5hbWUiLCJhdHRyTmFtZSIsImh5cGhlbmF0ZSIsInRoaXMiLCJyZWdpc3RlclBsdWdpbiIsInBsdWdpbk5hbWUiLCJjb25zdHJ1Y3RvciIsInRvTG93ZXJDYXNlIiwidXVpZCIsIkdldFlvRGlnaXRzIiwiJGVsZW1lbnQiLCJhdHRyIiwiZGF0YSIsInRyaWdnZXIiLCJwdXNoIiwidW5yZWdpc3RlclBsdWdpbiIsInByb3AiLCJzcGxpY2UiLCJpbmRleE9mIiwicmVtb3ZlQXR0ciIsInJlbW92ZURhdGEiLCJyZUluaXQiLCJwbHVnaW5zIiwiaXNKUSIsIiQiLCJlYWNoIiwiX2luaXQiLCJ0eXBlIiwiX3RoaXMiLCJwbGdzIiwiZm9yRWFjaCIsInAiLCJmb3VuZGF0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImVyciIsImNvbnNvbGUiLCJlcnJvciIsInJlZmxvdyIsImVsZW0iLCJpIiwiZmluZCIsImFkZEJhY2siLCIkZWwiLCJvcHRzIiwid2FybiIsInNwbGl0IiwiZSIsInN0ciIsIm9wdCIsIm1hcCIsImVsIiwidHJpbSIsImlzTmFOIiwicGFyc2VGbG9hdCIsImVyIiwiZ2V0Rm5OYW1lIiwiYWRkVG9KcXVlcnkiLCJmbiIsIm1ldGhvZCIsIiRub0pTIiwibGVuZ3RoIiwicmVtb3ZlQ2xhc3MiLCJNZWRpYVF1ZXJ5IiwiVHlwZUVycm9yIiwiYXJncyIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwicGx1Z0NsYXNzIiwiUmVmZXJlbmNlRXJyb3IiLCJhcHBseSIsIkZ1bmN0aW9uIiwicmVzdWx0cyIsImV4ZWMiLCJ0b1N0cmluZyIsInJlcGxhY2UiLCJ1dGlsIiwidGhyb3R0bGUiLCJmdW5jIiwiZGVsYXkiLCJ0aW1lciIsImNvbnRleHQiLCJzZXRUaW1lb3V0Iiwid2luZG93IiwiRGF0ZSIsIm5vdyIsImdldFRpbWUiLCJ2ZW5kb3JzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwidnAiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsInRlc3QiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJsYXN0VGltZSIsImNhbGxiYWNrIiwibmV4dFRpbWUiLCJNYXRoIiwibWF4IiwiY2xlYXJUaW1lb3V0IiwicGVyZm9ybWFuY2UiLCJzdGFydCIsImJpbmQiLCJvVGhpcyIsImFBcmdzIiwiZlRvQmluZCIsImZOT1AiLCJmQm91bmQiLCJjb25jYXQiLCJQbHVnaW4iLCJlbGVtZW50Iiwib3B0aW9ucyIsIl9zZXR1cCIsImdldFBsdWdpbk5hbWUiLCJfZGVzdHJveSIsIm9iaiIsIm5hbWVzcGFjZSIsInJvdW5kIiwicG93IiwicmFuZG9tIiwiJGVsZW0iLCJlbmQiLCJ0cmFuc2l0aW9ucyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInQiLCJzdHlsZSIsInRyaWdnZXJIYW5kbGVyIiwiaGFuZGxlciIsImRpZExvYWQiLCJyZWFkeVN0YXRlIiwiZXZlbnRUeXBlIiwiY2IiLCJvbmUiLCJpZ25vcmVMZWF2ZVdpbmRvdyIsImlnbm9yZVJlYXBwZWFyIiwiZUxlYXZlIiwicmVzdCIsInJlbGF0ZWRUYXJnZXQiLCJoYXNGb2N1cyIsImVSZWVudGVyIiwiY3VycmVudFRhcmdldCIsImhhcyIsInRhcmdldCIsIkRyb3Bkb3duIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJUcmlnZ2VycyIsImluaXQiLCJLZXlib2FyZCIsInJlZ2lzdGVyIiwiJGlkIiwiJGFuY2hvcnMiLCJfc2V0Q3VycmVudEFuY2hvciIsImZpcnN0IiwicGFyZW50Q2xhc3MiLCIkcGFyZW50IiwicGFyZW50cyIsIiRjdXJyZW50QW5jaG9yIiwiX2V2ZW50cyIsInBvc2l0aW9uIiwibWF0Y2giLCJob3Jpem9udGFsUG9zaXRpb24iLCJhbGlnbm1lbnQiLCJhZGRDbGFzcyIsIm9uIiwib3BlbiIsImNsb3NlIiwidG9nZ2xlIiwiX3NldFBvc2l0aW9uIiwib2ZmIiwiaG92ZXIiLCJib2R5RGF0YSIsIndoYXRpbnB1dCIsInRpbWVvdXQiLCJob3ZlckRlbGF5IiwiaWdub3JlTW91c2VkaXNhcHBlYXIiLCJob3ZlclBhbmUiLCJhZGQiLCIkdGFyZ2V0IiwiZmluZEZvY3VzYWJsZSIsImhhbmRsZUtleSIsImlzIiwiZm9jdXMiLCJwcmV2ZW50RGVmYXVsdCIsIiRib2R5IiwiYm9keSIsIm5vdCIsImF1dG9Gb2N1cyIsIiRmb2N1c2FibGUiLCJlcSIsImNsb3NlT25DbGljayIsIl9hZGRCb2R5SGFuZGxlciIsInRyYXBGb2N1cyIsImhhc0NsYXNzIiwicmVsZWFzZUZvY3VzIiwiaGlkZSIsIlBvc2l0aW9uYWJsZSIsInZPZmZzZXQiLCJoT2Zmc2V0IiwiYWxsb3dPdmVybGFwIiwiYWxsb3dCb3R0b21PdmVybGFwIiwiRHJvcGRvd25NZW51IiwiTmVzdCIsIkZlYXRoZXIiLCJzdWJzIiwiY2hpbGRyZW4iLCIkbWVudUl0ZW1zIiwiJHRhYnMiLCJ2ZXJ0aWNhbENsYXNzIiwicmlnaHRDbGFzcyIsImNoYW5nZWQiLCJjc3MiLCJoYXNUb3VjaCIsIm9udG91Y2hzdGFydCIsInBhckNsYXNzIiwiY2xpY2tPcGVuIiwicGFyZW50c1VudGlsIiwiaGFzU3ViIiwiaGFzQ2xpY2tlZCIsIiRzdWIiLCJmb3JjZUZvbGxvdyIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsIl9oaWRlIiwiX3Nob3ciLCJjbG9zZU9uQ2xpY2tJbnNpZGUiLCJkaXNhYmxlSG92ZXIiLCJhdXRvY2xvc2UiLCJjbG9zaW5nVGltZSIsIiRwcmV2RWxlbWVudCIsIiRuZXh0RWxlbWVudCIsImlzVGFiIiwiaW5kZXgiLCIkZWxlbWVudHMiLCJzaWJsaW5ncyIsIm5leHRTaWJsaW5nIiwicHJldlNpYmxpbmciLCJvcGVuU3ViIiwiY2xvc2VTdWIiLCJwYXJlbnQiLCJmdW5jdGlvbnMiLCJoYW5kbGVkIiwiX2lzVmVydGljYWwiLCJfaXNSdGwiLCJkb3duIiwidXAiLCJuZXh0IiwicHJldmlvdXMiLCJpZHgiLCJmaWx0ZXIiLCIkc2licyIsImNsZWFyIiwiQm94IiwiSW1Ob3RUb3VjaGluZ1lvdSIsIm9sZENsYXNzIiwiJHBhcmVudExpIiwiJHRvQ2xvc2UiLCJCdXJuIiwiSW50ZXJjaGFuZ2UiLCJydWxlcyIsImN1cnJlbnRQYXRoIiwiaWQiLCJfYWRkQnJlYWtwb2ludHMiLCJfZ2VuZXJhdGVSdWxlcyIsIl9yZWZsb3ciLCJoYXNPd25Qcm9wZXJ0eSIsInJ1bGUiLCJtYXRjaE1lZGlhIiwicXVlcnkiLCJtYXRjaGVzIiwicGF0aCIsInF1ZXJpZXMiLCJTUEVDSUFMX1FVRVJJRVMiLCJ2YWx1ZSIsInJ1bGVzTGlzdCIsImpvaW4iLCJub2RlTmFtZSIsImdldCIsInJlc3BvbnNlIiwiaHRtbCIsIlBPU0lUSU9OUyIsIlZFUlRJQ0FMX0FMSUdOTUVOVFMiLCJIT1JJWk9OVEFMX0FMSUdOTUVOVFMiLCJBTElHTk1FTlRTIiwibmV4dEl0ZW0iLCJpdGVtIiwiYXJyYXkiLCJjdXJyZW50SWR4IiwidHJpZWRQb3NpdGlvbnMiLCJfZ2V0RGVmYXVsdFBvc2l0aW9uIiwiX2dldERlZmF1bHRBbGlnbm1lbnQiLCJvcmlnaW5hbFBvc2l0aW9uIiwib3JpZ2luYWxBbGlnbm1lbnQiLCJfYWxpZ25tZW50c0V4aGF1c3RlZCIsIl9yZWFsaWduIiwiX2FkZFRyaWVkUG9zaXRpb24iLCJpc0V4aGF1c3RlZCIsIiRhbmNob3IiLCJHZXREaW1lbnNpb25zIiwib2Zmc2V0IiwiR2V0RXhwbGljaXRPZmZzZXRzIiwiX2dldFZPZmZzZXQiLCJfZ2V0SE9mZnNldCIsIm1pbk92ZXJsYXAiLCJtaW5Db29yZGluYXRlcyIsIl9wb3NpdGlvbnNFeGhhdXN0ZWQiLCJvdmVybGFwIiwiT3ZlcmxhcEFyZWEiLCJfcmVwb3NpdGlvbiIsImxyT25seSIsInRiT25seSIsImlnbm9yZUJvdHRvbSIsIkdldE9mZnNldHMiLCJhbmNob3IiLCJpc092ZXJmbG93IiwibG9nIiwibGVmdCIsIiRlbGVEaW1zIiwid2luZG93RGltcyIsIndpZHRoIiwidG9wIiwiaGVpZ2h0IiwiJGFuY2hvckRpbXMiLCJ0b3BPdmVyIiwiYm90dG9tT3ZlciIsImxlZnRPdmVyIiwicmlnaHRPdmVyIiwiZWxlRGltcyIsInBhckRpbXMiLCJtaW4iLCJzcXJ0IiwiRXJyb3IiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicGFyUmVjdCIsInBhcmVudE5vZGUiLCJ3aW5SZWN0Iiwid2luWSIsInBhZ2VZT2Zmc2V0Iiwid2luWCIsInBhZ2VYT2Zmc2V0IiwicGFyZW50RGltcyIsInRvcFZhbCIsImxlZnRWYWwiLCJpbWFnZXMiLCJ1bmxvYWRlZCIsInNpbmdsZUltYWdlTG9hZGVkIiwiY29tcGxldGUiLCJuYXR1cmFsV2lkdGgiLCJpbWFnZSIsIkltYWdlIiwiZXZlbnRzIiwibWUiLCJldmVudCIsInNyYyIsImtleUNvZGVzIiwiOSIsIjEzIiwiMjciLCIzMiIsIjM1IiwiMzYiLCIzNyIsIjM4IiwiMzkiLCI0MCIsImNvbW1hbmRzIiwicGFyc2VLZXkiLCJrZXkiLCJ3aGljaCIsImtleUNvZGUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJ0b1VwcGVyQ2FzZSIsInNoaWZ0S2V5IiwiY3RybEtleSIsImFsdEtleSIsImtjcyIsImsiLCJrYyIsImdldEtleUNvZGVzIiwiY29tcG9uZW50IiwiY29tbWFuZExpc3QiLCJsdHIiLCJydGwiLCJyZXR1cm5WYWx1ZSIsInVuaGFuZGxlZCIsImNvbXBvbmVudE5hbWUiLCJjbWRzIiwiJGZpcnN0Rm9jdXNhYmxlIiwiJGxhc3RGb2N1c2FibGUiLCJzdHlsZU1lZGlhIiwibWVkaWEiLCJpbmZvIiwic2NyaXB0IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbnNlcnRCZWZvcmUiLCJoZWFkIiwiYXBwZW5kQ2hpbGQiLCJnZXRDb21wdXRlZFN0eWxlIiwiY3VycmVudFN0eWxlIiwibWF0Y2hNZWRpdW0iLCJ0ZXh0Iiwic3R5bGVTaGVldCIsImNzc1RleHQiLCJ0ZXh0Q29udGVudCIsImN1cnJlbnQiLCJhcHBlbmRUbyIsIm5hbWVkUXVlcmllcyIsInN0eWxlT2JqZWN0IiwiZXh0cmFjdGVkU3R5bGVzIiwicmVkdWNlIiwicmV0IiwicGFyYW0iLCJwYXJ0cyIsInZhbCIsImRlY29kZVVSSUNvbXBvbmVudCIsImlzQXJyYXkiLCJfZ2V0Q3VycmVudFNpemUiLCJfd2F0Y2hlciIsImF0TGVhc3QiLCJzaXplIiwibWF0Y2hlZCIsIm5ld1NpemUiLCJjdXJyZW50U2l6ZSIsImluaXRDbGFzc2VzIiwiYWN0aXZlQ2xhc3NlcyIsIk1vdGlvbiIsImFuaW1hdGVJbiIsImFuaW1hdGlvbiIsImFuaW1hdGUiLCJhbmltYXRlT3V0IiwiaXNJbiIsImluaXRDbGFzcyIsImFjdGl2ZUNsYXNzIiwicmVzZXQiLCJzaG93Iiwib2Zmc2V0V2lkdGgiLCJ0cmFuc2l0aW9uZW5kIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwiZHVyYXRpb24iLCJhbmltIiwicHJvZyIsIm1vdmUiLCJ0cyIsIm1lbnUiLCJpdGVtcyIsInN1Yk1lbnVDbGFzcyIsInN1Ykl0ZW1DbGFzcyIsImhhc1N1YkNsYXNzIiwiYXBwbHlBcmlhIiwiJGl0ZW0iLCJuYW1lU3BhY2UiLCJyZW1haW4iLCJpc1BhdXNlZCIsInJlc3RhcnQiLCJpbmZpbml0ZSIsInBhdXNlIiwic3RhcnRQb3NYIiwic3RhcnRUaW1lIiwiZWxhcHNlZFRpbWUiLCJzdGFydEV2ZW50IiwiVG91Y2giLCJpc01vdmluZyIsImRpZE1vdmVkIiwib25Ub3VjaEVuZCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvblRvdWNoTW92ZSIsInRhcEV2ZW50IiwiRXZlbnQiLCJzcG90U3dpcGUiLCJkaXIiLCJ4IiwidG91Y2hlcyIsInBhZ2VYIiwiZHgiLCJwYWdlWSIsImFicyIsIm1vdmVUaHJlc2hvbGQiLCJ0aW1lVGhyZXNob2xkIiwib25Ub3VjaFN0YXJ0IiwiYWRkRXZlbnRMaXN0ZW5lciIsIlNwb3RTd2lwZSIsImVuYWJsZWQiLCJkb2N1bWVudEVsZW1lbnQiLCJzcGVjaWFsIiwic3dpcGUiLCJzZXR1cCIsInRhcCIsIm5vb3AiLCJzZXR1cFNwb3RTd2lwZSIsInNldHVwVG91Y2hIYW5kbGVyIiwiYWRkVG91Y2giLCJoYW5kbGVUb3VjaCIsInNpbXVsYXRlZEV2ZW50IiwiY2hhbmdlZFRvdWNoZXMiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJNb3VzZUV2ZW50Iiwic2NyZWVuWCIsInNjcmVlblkiLCJjbGllbnRYIiwiY2xpZW50WSIsImNyZWF0ZUV2ZW50IiwiaW5pdE1vdXNlRXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiTXV0YXRpb25PYnNlcnZlciIsInByZWZpeGVzIiwidHJpZ2dlcnMiLCJMaXN0ZW5lcnMiLCJCYXNpYyIsIkdsb2JhbCIsIkluaXRpYWxpemVycyIsImRlYm91bmNlR2xvYmFsTGlzdGVuZXIiLCJkZWJvdW5jZSIsImxpc3RlbmVyIiwib3Blbkxpc3RlbmVyIiwiY2xvc2VMaXN0ZW5lciIsInRvZ2dsZUxpc3RlbmVyIiwiY2xvc2VhYmxlTGlzdGVuZXIiLCJzdG9wUHJvcGFnYXRpb24iLCJmYWRlT3V0IiwidG9nZ2xlRm9jdXNMaXN0ZW5lciIsImFkZE9wZW5MaXN0ZW5lciIsImFkZENsb3NlTGlzdGVuZXIiLCJhZGRUb2dnbGVMaXN0ZW5lciIsImFkZENsb3NlYWJsZUxpc3RlbmVyIiwiYWRkVG9nZ2xlRm9jdXNMaXN0ZW5lciIsInJlc2l6ZUxpc3RlbmVyIiwiJG5vZGVzIiwic2Nyb2xsTGlzdGVuZXIiLCJjbG9zZU1lTGlzdGVuZXIiLCJwbHVnaW5JZCIsImFkZENsb3NlbWVMaXN0ZW5lciIsInlldGlCb3hlcyIsInBsdWdOYW1lcyIsImxpc3RlbmVycyIsImFkZFJlc2l6ZUxpc3RlbmVyIiwiYWRkU2Nyb2xsTGlzdGVuZXIiLCJhZGRNdXRhdGlvbkV2ZW50c0xpc3RlbmVyIiwibGlzdGVuaW5nRWxlbWVudHNNdXRhdGlvbiIsIm11dGF0aW9uUmVjb3Jkc0xpc3QiLCJhdHRyaWJ1dGVOYW1lIiwiY2xvc2VzdCIsIm9ic2VydmUiLCJhdHRyaWJ1dGVzIiwiY2hpbGRMaXN0IiwiY2hhcmFjdGVyRGF0YSIsInN1YnRyZWUiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJhZGRTaW1wbGVMaXN0ZW5lcnMiLCIkZG9jdW1lbnQiLCJhZGRHbG9iYWxMaXN0ZW5lcnMiLCJvbkxvYWQiLCJ0cmlnZ2Vyc0luaXRpYWxpemVkIiwiSUhlYXJZb3UiLCJvbkltYWdlc0xvYWRlZCIsIk1vdmUiLCJUaW1lciIsIm1vZHVsZSIsImV4cG9ydHMiLCJmYWN0b3J5IiwibW9kdWxlcyIsImluc3RhbGxlZE1vZHVsZXMiLCJtb2R1bGVJZCIsImxvYWRlZCIsIm0iLCJjIiwiY3VycmVudElucHV0IiwiY3VycmVudEludGVudCIsImRvYyIsImZvcm1JbnB1dHMiLCJmdW5jdGlvbkxpc3QiLCJpZ25vcmVNYXAiLCJjaGFuZ2VJbnRlbnRNYXAiLCJpbnB1dE1hcCIsImtleWRvd24iLCJrZXl1cCIsIm1vdXNlZG93biIsIm1vdXNlbW92ZSIsIk1TUG9pbnRlckRvd24iLCJNU1BvaW50ZXJNb3ZlIiwicG9pbnRlcmRvd24iLCJwb2ludGVybW92ZSIsImlucHV0VHlwZXMiLCJpc0J1ZmZlcmluZyIsImlzU2Nyb2xsaW5nIiwibW91c2VQb3MiLCJ5IiwicG9pbnRlck1hcCIsIjIiLCIzIiwiNCIsInN1cHBvcnRzUGFzc2l2ZSIsImRlZmluZVByb3BlcnR5IiwidXBkYXRlSW5wdXQiLCJldmVudEtleSIsInBvaW50ZXJUeXBlIiwiYWN0aXZlRWxlbSIsImFjdGl2ZUVsZW1lbnQiLCJhY3RpdmVJbnB1dCIsInNldElucHV0Iiwic2V0QXR0cmlidXRlIiwiZmlyZUZ1bmN0aW9ucyIsInNldEludGVudCIsInRvdWNoQnVmZmVyIiwibGVuIiwidW5kZWZpbmVkIiwiZGV0ZWN0V2hlZWwiLCJvbm1vdXNld2hlZWwiLCJwYXNzaXZlIiwiUG9pbnRlckV2ZW50IiwiTVNQb2ludGVyRXZlbnQiLCJhc2siLCJ0eXBlcyIsImlnbm9yZUtleXMiLCJhcnIiLCJyZWdpc3Rlck9uQ2hhbmdlIiwidW5SZWdpc3Rlck9uQ2hhbmdlIiwib2JqUG9zIiwialF1ZXJ5IiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iXSwibWFwcGluZ3MiOiI7b1VBRUEsUywyQkFDQSxTQUNBLFNBTUlBLEVBQWEsQ0FD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QUFJMkQsRUFBZUYsRUFBeUJ6RCxHQUM1QyxRQUFxQjJDLElBQWpCZ0IsRUFDSCxPQUFPQSxFQUFhL0QsUUFHckIsSUFBSUQsRUFBUzhELEVBQXlCekQsR0FBWSxDQUdqREosUUFBUyxJQU9WLE9BSEFnRSxFQUFvQjVELEdBQVVuZixLQUFLOGUsRUFBT0MsUUFBU0QsRUFBUUEsRUFBT0MsUUFBUzhELEdBR3BFL0QsRUFBT0MsUSxtQkNyQmYsSSxJQUFBLFEscURBQ0EsUUFPQyxPQUxEOWQsT0FBTzlELEVBQUlBLFdBT1gsYUFBRXNHLFVBQVU5RixjIiwiZmlsZSI6ImFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgR2V0WW9EaWdpdHMgfSBmcm9tICcuL2ZvdW5kYXRpb24uY29yZS51dGlscyc7XG5pbXBvcnQgeyBNZWRpYVF1ZXJ5IH0gZnJvbSAnLi9mb3VuZGF0aW9uLnV0aWwubWVkaWFRdWVyeSc7XG5cbnZhciBGT1VOREFUSU9OX1ZFUlNJT04gPSAnNi41LjEnO1xuXG4vLyBHbG9iYWwgRm91bmRhdGlvbiBvYmplY3Rcbi8vIFRoaXMgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdywgb3IgdXNlZCBhcyBhIG1vZHVsZSBmb3IgQU1EL0Jyb3dzZXJpZnlcbnZhciBGb3VuZGF0aW9uID0ge1xuICB2ZXJzaW9uOiBGT1VOREFUSU9OX1ZFUlNJT04sXG5cbiAgLyoqXG4gICAqIFN0b3JlcyBpbml0aWFsaXplZCBwbHVnaW5zLlxuICAgKi9cbiAgX3BsdWdpbnM6IHt9LFxuXG4gIC8qKlxuICAgKiBTdG9yZXMgZ2VuZXJhdGVkIHVuaXF1ZSBpZHMgZm9yIHBsdWdpbiBpbnN0YW5jZXNcbiAgICovXG4gIF91dWlkczogW10sXG5cbiAgLyoqXG4gICAqIERlZmluZXMgYSBGb3VuZGF0aW9uIHBsdWdpbiwgYWRkaW5nIGl0IHRvIHRoZSBgRm91bmRhdGlvbmAgbmFtZXNwYWNlIGFuZCB0aGUgbGlzdCBvZiBwbHVnaW5zIHRvIGluaXRpYWxpemUgd2hlbiByZWZsb3dpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwbHVnaW4gLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHBsdWdpbjogZnVuY3Rpb24ocGx1Z2luLCBuYW1lKSB7XG4gICAgLy8gT2JqZWN0IGtleSB0byB1c2Ugd2hlbiBhZGRpbmcgdG8gZ2xvYmFsIEZvdW5kYXRpb24gb2JqZWN0XG4gICAgLy8gRXhhbXBsZXM6IEZvdW5kYXRpb24uUmV2ZWFsLCBGb3VuZGF0aW9uLk9mZkNhbnZhc1xuICAgIHZhciBjbGFzc05hbWUgPSAobmFtZSB8fCBmdW5jdGlvbk5hbWUocGx1Z2luKSk7XG4gICAgLy8gT2JqZWN0IGtleSB0byB1c2Ugd2hlbiBzdG9yaW5nIHRoZSBwbHVnaW4sIGFsc28gdXNlZCB0byBjcmVhdGUgdGhlIGlkZW50aWZ5aW5nIGRhdGEgYXR0cmlidXRlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gRXhhbXBsZXM6IGRhdGEtcmV2ZWFsLCBkYXRhLW9mZi1jYW52YXNcbiAgICB2YXIgYXR0ck5hbWUgID0gaHlwaGVuYXRlKGNsYXNzTmFtZSk7XG5cbiAgICAvLyBBZGQgdG8gdGhlIEZvdW5kYXRpb24gb2JqZWN0IGFuZCB0aGUgcGx1Z2lucyBsaXN0IChmb3IgcmVmbG93aW5nKVxuICAgIHRoaXMuX3BsdWdpbnNbYXR0ck5hbWVdID0gdGhpc1tjbGFzc05hbWVdID0gcGx1Z2luO1xuICB9LFxuICAvKipcbiAgICogQGZ1bmN0aW9uXG4gICAqIFBvcHVsYXRlcyB0aGUgX3V1aWRzIGFycmF5IHdpdGggcG9pbnRlcnMgdG8gZWFjaCBpbmRpdmlkdWFsIHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQWRkcyB0aGUgYHpmUGx1Z2luYCBkYXRhLWF0dHJpYnV0ZSB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZWQgcGx1Z2lucyB0byBhbGxvdyB1c2Ugb2YgJChzZWxlY3RvcikuZm91bmRhdGlvbihtZXRob2QpIGNhbGxzLlxuICAgKiBBbHNvIGZpcmVzIHRoZSBpbml0aWFsaXphdGlvbiBldmVudCBmb3IgZWFjaCBwbHVnaW4sIGNvbnNvbGlkYXRpbmcgcmVwZXRpdGl2ZSBjb2RlLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGx1Z2luIC0gYW4gaW5zdGFuY2Ugb2YgYSBwbHVnaW4sIHVzdWFsbHkgYHRoaXNgIGluIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiwgcGFzc2VkIGFzIGEgY2FtZWxDYXNlZCBzdHJpbmcuXG4gICAqIEBmaXJlcyBQbHVnaW4jaW5pdFxuICAgKi9cbiAgcmVnaXN0ZXJQbHVnaW46IGZ1bmN0aW9uKHBsdWdpbiwgbmFtZSl7XG4gICAgdmFyIHBsdWdpbk5hbWUgPSBuYW1lID8gaHlwaGVuYXRlKG5hbWUpIDogZnVuY3Rpb25OYW1lKHBsdWdpbi5jb25zdHJ1Y3RvcikudG9Mb3dlckNhc2UoKTtcbiAgICBwbHVnaW4udXVpZCA9IEdldFlvRGlnaXRzKDYsIHBsdWdpbk5hbWUpO1xuXG4gICAgaWYoIXBsdWdpbi4kZWxlbWVudC5hdHRyKGBkYXRhLSR7cGx1Z2luTmFtZX1gKSl7IHBsdWdpbi4kZWxlbWVudC5hdHRyKGBkYXRhLSR7cGx1Z2luTmFtZX1gLCBwbHVnaW4udXVpZCk7IH1cbiAgICBpZighcGx1Z2luLiRlbGVtZW50LmRhdGEoJ3pmUGx1Z2luJykpeyBwbHVnaW4uJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nLCBwbHVnaW4pOyB9XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgcGx1Z2luIGhhcyBpbml0aWFsaXplZC5cbiAgICAgICAgICAgKiBAZXZlbnQgUGx1Z2luI2luaXRcbiAgICAgICAgICAgKi9cbiAgICBwbHVnaW4uJGVsZW1lbnQudHJpZ2dlcihgaW5pdC56Zi4ke3BsdWdpbk5hbWV9YCk7XG5cbiAgICB0aGlzLl91dWlkcy5wdXNoKHBsdWdpbi51dWlkKTtcblxuICAgIHJldHVybjtcbiAgfSxcbiAgLyoqXG4gICAqIEBmdW5jdGlvblxuICAgKiBSZW1vdmVzIHRoZSBwbHVnaW5zIHV1aWQgZnJvbSB0aGUgX3V1aWRzIGFycmF5LlxuICAgKiBSZW1vdmVzIHRoZSB6ZlBsdWdpbiBkYXRhIGF0dHJpYnV0ZSwgYXMgd2VsbCBhcyB0aGUgZGF0YS1wbHVnaW4tbmFtZSBhdHRyaWJ1dGUuXG4gICAqIEFsc28gZmlyZXMgdGhlIGRlc3Ryb3llZCBldmVudCBmb3IgdGhlIHBsdWdpbiwgY29uc29saWRhdGluZyByZXBldGl0aXZlIGNvZGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwbHVnaW4gLSBhbiBpbnN0YW5jZSBvZiBhIHBsdWdpbiwgdXN1YWxseSBgdGhpc2AgaW4gY29udGV4dC5cbiAgICogQGZpcmVzIFBsdWdpbiNkZXN0cm95ZWRcbiAgICovXG4gIHVucmVnaXN0ZXJQbHVnaW46IGZ1bmN0aW9uKHBsdWdpbil7XG4gICAgdmFyIHBsdWdpbk5hbWUgPSBoeXBoZW5hdGUoZnVuY3Rpb25OYW1lKHBsdWdpbi4kZWxlbWVudC5kYXRhKCd6ZlBsdWdpbicpLmNvbnN0cnVjdG9yKSk7XG5cbiAgICB0aGlzLl91dWlkcy5zcGxpY2UodGhpcy5fdXVpZHMuaW5kZXhPZihwbHVnaW4udXVpZCksIDEpO1xuICAgIHBsdWdpbi4kZWxlbWVudC5yZW1vdmVBdHRyKGBkYXRhLSR7cGx1Z2luTmFtZX1gKS5yZW1vdmVEYXRhKCd6ZlBsdWdpbicpXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRmlyZXMgd2hlbiB0aGUgcGx1Z2luIGhhcyBiZWVuIGRlc3Ryb3llZC5cbiAgICAgICAgICAgKiBAZXZlbnQgUGx1Z2luI2Rlc3Ryb3llZFxuICAgICAgICAgICAqL1xuICAgICAgICAgIC50cmlnZ2VyKGBkZXN0cm95ZWQuemYuJHtwbHVnaW5OYW1lfWApO1xuICAgIGZvcih2YXIgcHJvcCBpbiBwbHVnaW4pe1xuICAgICAgcGx1Z2luW3Byb3BdID0gbnVsbDsvL2NsZWFuIHVwIHNjcmlwdCB0byBwcmVwIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gICAgfVxuICAgIHJldHVybjtcbiAgfSxcblxuICAvKipcbiAgICogQGZ1bmN0aW9uXG4gICAqIENhdXNlcyBvbmUgb3IgbW9yZSBhY3RpdmUgcGx1Z2lucyB0byByZS1pbml0aWFsaXplLCByZXNldHRpbmcgZXZlbnQgbGlzdGVuZXJzLCByZWNhbGN1bGF0aW5nIHBvc2l0aW9ucywgZXRjLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGx1Z2lucyAtIG9wdGlvbmFsIHN0cmluZyBvZiBhbiBpbmRpdmlkdWFsIHBsdWdpbiBrZXksIGF0dGFpbmVkIGJ5IGNhbGxpbmcgYCQoZWxlbWVudCkuZGF0YSgncGx1Z2luTmFtZScpYCwgb3Igc3RyaW5nIG9mIGEgcGx1Z2luIGNsYXNzIGkuZS4gYCdkcm9wZG93bidgXG4gICAqIEBkZWZhdWx0IElmIG5vIGFyZ3VtZW50IGlzIHBhc3NlZCwgcmVmbG93IGFsbCBjdXJyZW50bHkgYWN0aXZlIHBsdWdpbnMuXG4gICAqL1xuICAgcmVJbml0OiBmdW5jdGlvbihwbHVnaW5zKXtcbiAgICAgdmFyIGlzSlEgPSBwbHVnaW5zIGluc3RhbmNlb2YgJDtcbiAgICAgdHJ5e1xuICAgICAgIGlmKGlzSlEpe1xuICAgICAgICAgcGx1Z2lucy5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICQodGhpcykuZGF0YSgnemZQbHVnaW4nKS5faW5pdCgpO1xuICAgICAgICAgfSk7XG4gICAgICAgfWVsc2V7XG4gICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiBwbHVnaW5zLFxuICAgICAgICAgX3RoaXMgPSB0aGlzLFxuICAgICAgICAgZm5zID0ge1xuICAgICAgICAgICAnb2JqZWN0JzogZnVuY3Rpb24ocGxncyl7XG4gICAgICAgICAgICAgcGxncy5mb3JFYWNoKGZ1bmN0aW9uKHApe1xuICAgICAgICAgICAgICAgcCA9IGh5cGhlbmF0ZShwKTtcbiAgICAgICAgICAgICAgICQoJ1tkYXRhLScrIHAgKyddJykuZm91bmRhdGlvbignX2luaXQnKTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgfSxcbiAgICAgICAgICAgJ3N0cmluZyc6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgcGx1Z2lucyA9IGh5cGhlbmF0ZShwbHVnaW5zKTtcbiAgICAgICAgICAgICAkKCdbZGF0YS0nKyBwbHVnaW5zICsnXScpLmZvdW5kYXRpb24oJ19pbml0Jyk7XG4gICAgICAgICAgIH0sXG4gICAgICAgICAgICd1bmRlZmluZWQnOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgIHRoaXNbJ29iamVjdCddKE9iamVjdC5rZXlzKF90aGlzLl9wbHVnaW5zKSk7XG4gICAgICAgICAgIH1cbiAgICAgICAgIH07XG4gICAgICAgICBmbnNbdHlwZV0ocGx1Z2lucyk7XG4gICAgICAgfVxuICAgICB9Y2F0Y2goZXJyKXtcbiAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgIH1maW5hbGx5e1xuICAgICAgIHJldHVybiBwbHVnaW5zO1xuICAgICB9XG4gICB9LFxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHBsdWdpbnMgb24gYW55IGVsZW1lbnRzIHdpdGhpbiBgZWxlbWAgKGFuZCBgZWxlbWAgaXRzZWxmKSB0aGF0IGFyZW4ndCBhbHJlYWR5IGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbSAtIGpRdWVyeSBvYmplY3QgY29udGFpbmluZyB0aGUgZWxlbWVudCB0byBjaGVjayBpbnNpZGUuIEFsc28gY2hlY2tzIHRoZSBlbGVtZW50IGl0c2VsZiwgdW5sZXNzIGl0J3MgdGhlIGBkb2N1bWVudGAgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gcGx1Z2lucyAtIEEgbGlzdCBvZiBwbHVnaW5zIHRvIGluaXRpYWxpemUuIExlYXZlIHRoaXMgb3V0IHRvIGluaXRpYWxpemUgZXZlcnl0aGluZy5cbiAgICovXG4gIHJlZmxvdzogZnVuY3Rpb24oZWxlbSwgcGx1Z2lucykge1xuXG4gICAgLy8gSWYgcGx1Z2lucyBpcyB1bmRlZmluZWQsIGp1c3QgZ3JhYiBldmVyeXRoaW5nXG4gICAgaWYgKHR5cGVvZiBwbHVnaW5zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGx1Z2lucyA9IE9iamVjdC5rZXlzKHRoaXMuX3BsdWdpbnMpO1xuICAgIH1cbiAgICAvLyBJZiBwbHVnaW5zIGlzIGEgc3RyaW5nLCBjb252ZXJ0IGl0IHRvIGFuIGFycmF5IHdpdGggb25lIGl0ZW1cbiAgICBlbHNlIGlmICh0eXBlb2YgcGx1Z2lucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBsdWdpbnMgPSBbcGx1Z2luc107XG4gICAgfVxuXG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHBsdWdpblxuICAgICQuZWFjaChwbHVnaW5zLCBmdW5jdGlvbihpLCBuYW1lKSB7XG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcGx1Z2luXG4gICAgICB2YXIgcGx1Z2luID0gX3RoaXMuX3BsdWdpbnNbbmFtZV07XG5cbiAgICAgIC8vIExvY2FsaXplIHRoZSBzZWFyY2ggdG8gYWxsIGVsZW1lbnRzIGluc2lkZSBlbGVtLCBhcyB3ZWxsIGFzIGVsZW0gaXRzZWxmLCB1bmxlc3MgZWxlbSA9PT0gZG9jdW1lbnRcbiAgICAgIHZhciAkZWxlbSA9ICQoZWxlbSkuZmluZCgnW2RhdGEtJytuYW1lKyddJykuYWRkQmFjaygnW2RhdGEtJytuYW1lKyddJyk7XG5cbiAgICAgIC8vIEZvciBlYWNoIHBsdWdpbiBmb3VuZCwgaW5pdGlhbGl6ZSBpdFxuICAgICAgJGVsZW0uZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyICRlbCA9ICQodGhpcyksXG4gICAgICAgICAgICBvcHRzID0ge307XG4gICAgICAgIC8vIERvbid0IGRvdWJsZS1kaXAgb24gcGx1Z2luc1xuICAgICAgICBpZiAoJGVsLmRhdGEoJ3pmUGx1Z2luJykpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJUcmllZCB0byBpbml0aWFsaXplIFwiK25hbWUrXCIgb24gYW4gZWxlbWVudCB0aGF0IGFscmVhZHkgaGFzIGEgRm91bmRhdGlvbiBwbHVnaW4uXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCRlbC5hdHRyKCdkYXRhLW9wdGlvbnMnKSl7XG4gICAgICAgICAgdmFyIHRoaW5nID0gJGVsLmF0dHIoJ2RhdGEtb3B0aW9ucycpLnNwbGl0KCc7JykuZm9yRWFjaChmdW5jdGlvbihlLCBpKXtcbiAgICAgICAgICAgIHZhciBvcHQgPSBlLnNwbGl0KCc6JykubWFwKGZ1bmN0aW9uKGVsKXsgcmV0dXJuIGVsLnRyaW0oKTsgfSk7XG4gICAgICAgICAgICBpZihvcHRbMF0pIG9wdHNbb3B0WzBdXSA9IHBhcnNlVmFsdWUob3B0WzFdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0cnl7XG4gICAgICAgICAgJGVsLmRhdGEoJ3pmUGx1Z2luJywgbmV3IHBsdWdpbigkKHRoaXMpLCBvcHRzKSk7XG4gICAgICAgIH1jYXRjaChlcil7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcik7XG4gICAgICAgIH1maW5hbGx5e1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldEZuTmFtZTogZnVuY3Rpb25OYW1lLFxuXG4gIGFkZFRvSnF1ZXJ5OiBmdW5jdGlvbigkKSB7XG4gICAgLy8gVE9ETzogY29uc2lkZXIgbm90IG1ha2luZyB0aGlzIGEgalF1ZXJ5IGZ1bmN0aW9uXG4gICAgLy8gVE9ETzogbmVlZCB3YXkgdG8gcmVmbG93IHZzLiByZS1pbml0aWFsaXplXG4gICAgLyoqXG4gICAgICogVGhlIEZvdW5kYXRpb24galF1ZXJ5IG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gbWV0aG9kIC0gQW4gYWN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIGN1cnJlbnQgalF1ZXJ5IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgZm91bmRhdGlvbiA9IGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgbWV0aG9kLFxuICAgICAgICAgICRub0pTID0gJCgnLm5vLWpzJyk7XG5cbiAgICAgIGlmKCRub0pTLmxlbmd0aCl7XG4gICAgICAgICRub0pTLnJlbW92ZUNsYXNzKCduby1qcycpO1xuICAgICAgfVxuXG4gICAgICBpZih0eXBlID09PSAndW5kZWZpbmVkJyl7Ly9uZWVkcyB0byBpbml0aWFsaXplIHRoZSBGb3VuZGF0aW9uIG9iamVjdCwgb3IgYW4gaW5kaXZpZHVhbCBwbHVnaW4uXG4gICAgICAgIE1lZGlhUXVlcnkuX2luaXQoKTtcbiAgICAgICAgRm91bmRhdGlvbi5yZWZsb3codGhpcyk7XG4gICAgICB9ZWxzZSBpZih0eXBlID09PSAnc3RyaW5nJyl7Ly9hbiBpbmRpdmlkdWFsIG1ldGhvZCB0byBpbnZva2Ugb24gYSBwbHVnaW4gb3IgZ3JvdXAgb2YgcGx1Z2luc1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7Ly9jb2xsZWN0IGFsbCB0aGUgYXJndW1lbnRzLCBpZiBuZWNlc3NhcnlcbiAgICAgICAgdmFyIHBsdWdDbGFzcyA9IHRoaXMuZGF0YSgnemZQbHVnaW4nKTsvL2RldGVybWluZSB0aGUgY2xhc3Mgb2YgcGx1Z2luXG5cbiAgICAgICAgaWYodHlwZW9mIHBsdWdDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHBsdWdDbGFzc1ttZXRob2RdICE9PSAndW5kZWZpbmVkJyl7Ly9tYWtlIHN1cmUgYm90aCB0aGUgY2xhc3MgYW5kIG1ldGhvZCBleGlzdFxuICAgICAgICAgIGlmKHRoaXMubGVuZ3RoID09PSAxKXsvL2lmIHRoZXJlJ3Mgb25seSBvbmUsIGNhbGwgaXQgZGlyZWN0bHkuXG4gICAgICAgICAgICAgIHBsdWdDbGFzc1ttZXRob2RdLmFwcGx5KHBsdWdDbGFzcywgYXJncyk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24oaSwgZWwpey8vb3RoZXJ3aXNlIGxvb3AgdGhyb3VnaCB0aGUgalF1ZXJ5IGNvbGxlY3Rpb24gYW5kIGludm9rZSB0aGUgbWV0aG9kIG9uIGVhY2hcbiAgICAgICAgICAgICAgcGx1Z0NsYXNzW21ldGhvZF0uYXBwbHkoJChlbCkuZGF0YSgnemZQbHVnaW4nKSwgYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1lbHNley8vZXJyb3IgZm9yIG5vIGNsYXNzIG9yIG5vIG1ldGhvZFxuICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcIldlJ3JlIHNvcnJ5LCAnXCIgKyBtZXRob2QgKyBcIicgaXMgbm90IGFuIGF2YWlsYWJsZSBtZXRob2QgZm9yIFwiICsgKHBsdWdDbGFzcyA/IGZ1bmN0aW9uTmFtZShwbHVnQ2xhc3MpIDogJ3RoaXMgZWxlbWVudCcpICsgJy4nKTtcbiAgICAgICAgfVxuICAgICAgfWVsc2V7Ly9lcnJvciBmb3IgaW52YWxpZCBhcmd1bWVudCB0eXBlXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFdlJ3JlIHNvcnJ5LCAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIHBhcmFtZXRlci4gWW91IG11c3QgdXNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbWV0aG9kIHlvdSB3aXNoIHRvIGludm9rZS5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgJC5mbi5mb3VuZGF0aW9uID0gZm91bmRhdGlvbjtcbiAgICByZXR1cm4gJDtcbiAgfVxufTtcblxuRm91bmRhdGlvbi51dGlsID0ge1xuICAvKipcbiAgICogRnVuY3Rpb24gZm9yIGFwcGx5aW5nIGEgZGVib3VuY2UgZWZmZWN0IHRvIGEgZnVuY3Rpb24gY2FsbC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgLSBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgZW5kIG9mIHRpbWVvdXQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWxheSAtIFRpbWUgaW4gbXMgdG8gZGVsYXkgdGhlIGNhbGwgb2YgYGZ1bmNgLlxuICAgKiBAcmV0dXJucyBmdW5jdGlvblxuICAgKi9cbiAgdGhyb3R0bGU6IGZ1bmN0aW9uIChmdW5jLCBkZWxheSkge1xuICAgIHZhciB0aW1lciA9IG51bGw7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICBpZiAodGltZXIgPT09IG51bGwpIHtcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbndpbmRvdy5Gb3VuZGF0aW9uID0gRm91bmRhdGlvbjtcblxuLy8gUG9seWZpbGwgZm9yIHJlcXVlc3RBbmltYXRpb25GcmFtZVxuKGZ1bmN0aW9uKCkge1xuICBpZiAoIURhdGUubm93IHx8ICF3aW5kb3cuRGF0ZS5ub3cpXG4gICAgd2luZG93LkRhdGUubm93ID0gRGF0ZS5ub3cgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9O1xuXG4gIHZhciB2ZW5kb3JzID0gWyd3ZWJraXQnLCAnbW96J107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGggJiYgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsraSkge1xuICAgICAgdmFyIHZwID0gdmVuZG9yc1tpXTtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3dbdnArJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gKHdpbmRvd1t2cCsnQ2FuY2VsQW5pbWF0aW9uRnJhbWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2luZG93W3ZwKydDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXSk7XG4gIH1cbiAgaWYgKC9pUChhZHxob25lfG9kKS4qT1MgNi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudClcbiAgICB8fCAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAhd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgdmFyIGxhc3RUaW1lID0gMDtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHZhciBuZXh0VGltZSA9IE1hdGgubWF4KGxhc3RUaW1lICsgMTYsIG5vdyk7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhsYXN0VGltZSA9IG5leHRUaW1lKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWUgLSBub3cpO1xuICAgIH07XG4gICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gY2xlYXJUaW1lb3V0O1xuICB9XG4gIC8qKlxuICAgKiBQb2x5ZmlsbCBmb3IgcGVyZm9ybWFuY2Uubm93LCByZXF1aXJlZCBieSByQUZcbiAgICovXG4gIGlmKCF3aW5kb3cucGVyZm9ybWFuY2UgfHwgIXdpbmRvdy5wZXJmb3JtYW5jZS5ub3cpe1xuICAgIHdpbmRvdy5wZXJmb3JtYW5jZSA9IHtcbiAgICAgIHN0YXJ0OiBEYXRlLm5vdygpLFxuICAgICAgbm93OiBmdW5jdGlvbigpeyByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnQ7IH1cbiAgICB9O1xuICB9XG59KSgpO1xuaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkge1xuICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKG9UaGlzKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBjbG9zZXN0IHRoaW5nIHBvc3NpYmxlIHRvIHRoZSBFQ01BU2NyaXB0IDVcbiAgICAgIC8vIGludGVybmFsIElzQ2FsbGFibGUgZnVuY3Rpb25cbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIC0gd2hhdCBpcyB0cnlpbmcgdG8gYmUgYm91bmQgaXMgbm90IGNhbGxhYmxlJyk7XG4gICAgfVxuXG4gICAgdmFyIGFBcmdzICAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLFxuICAgICAgICBmVG9CaW5kID0gdGhpcyxcbiAgICAgICAgZk5PUCAgICA9IGZ1bmN0aW9uKCkge30sXG4gICAgICAgIGZCb3VuZCAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gZlRvQmluZC5hcHBseSh0aGlzIGluc3RhbmNlb2YgZk5PUFxuICAgICAgICAgICAgICAgICA/IHRoaXNcbiAgICAgICAgICAgICAgICAgOiBvVGhpcyxcbiAgICAgICAgICAgICAgICAgYUFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICAgICAgfTtcblxuICAgIGlmICh0aGlzLnByb3RvdHlwZSkge1xuICAgICAgLy8gbmF0aXZlIGZ1bmN0aW9ucyBkb24ndCBoYXZlIGEgcHJvdG90eXBlXG4gICAgICBmTk9QLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuICAgIH1cbiAgICBmQm91bmQucHJvdG90eXBlID0gbmV3IGZOT1AoKTtcblxuICAgIHJldHVybiBmQm91bmQ7XG4gIH07XG59XG4vLyBQb2x5ZmlsbCB0byBnZXQgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBpbiBJRTlcbmZ1bmN0aW9uIGZ1bmN0aW9uTmFtZShmbikge1xuICBpZiAodHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBmdW5jTmFtZVJlZ2V4ID0gL2Z1bmN0aW9uXFxzKFteKF17MSx9KVxcKC87XG4gICAgdmFyIHJlc3VsdHMgPSAoZnVuY05hbWVSZWdleCkuZXhlYygoZm4pLnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDEpID8gcmVzdWx0c1sxXS50cmltKCkgOiBcIlwiO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBmbi5wcm90b3R5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZuLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIGZuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5mdW5jdGlvbiBwYXJzZVZhbHVlKHN0cil7XG4gIGlmICgndHJ1ZScgPT09IHN0cikgcmV0dXJuIHRydWU7XG4gIGVsc2UgaWYgKCdmYWxzZScgPT09IHN0cikgcmV0dXJuIGZhbHNlO1xuICBlbHNlIGlmICghaXNOYU4oc3RyICogMSkpIHJldHVybiBwYXJzZUZsb2F0KHN0cik7XG4gIHJldHVybiBzdHI7XG59XG4vLyBDb252ZXJ0IFBhc2NhbENhc2UgdG8ga2ViYWItY2FzZVxuLy8gVGhhbmsgeW91OiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS84OTU1NTgwXG5mdW5jdGlvbiBoeXBoZW5hdGUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IHtGb3VuZGF0aW9ufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IEdldFlvRGlnaXRzIH0gZnJvbSAnLi9mb3VuZGF0aW9uLmNvcmUudXRpbHMnO1xuXG4vLyBBYnN0cmFjdCBjbGFzcyBmb3IgcHJvdmlkaW5nIGxpZmVjeWNsZSBob29rcy4gRXhwZWN0IHBsdWdpbnMgdG8gZGVmaW5lIEFUIExFQVNUXG4vLyB7ZnVuY3Rpb259IF9zZXR1cCAocmVwbGFjZXMgcHJldmlvdXMgY29uc3RydWN0b3IpLFxuLy8ge2Z1bmN0aW9ufSBfZGVzdHJveSAocmVwbGFjZXMgcHJldmlvdXMgZGVzdHJveSlcbmNsYXNzIFBsdWdpbiB7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuX3NldHVwKGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIHZhciBwbHVnaW5OYW1lID0gZ2V0UGx1Z2luTmFtZSh0aGlzKTtcbiAgICB0aGlzLnV1aWQgPSBHZXRZb0RpZ2l0cyg2LCBwbHVnaW5OYW1lKTtcblxuICAgIGlmKCF0aGlzLiRlbGVtZW50LmF0dHIoYGRhdGEtJHtwbHVnaW5OYW1lfWApKXsgdGhpcy4kZWxlbWVudC5hdHRyKGBkYXRhLSR7cGx1Z2luTmFtZX1gLCB0aGlzLnV1aWQpOyB9XG4gICAgaWYoIXRoaXMuJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nKSl7IHRoaXMuJGVsZW1lbnQuZGF0YSgnemZQbHVnaW4nLCB0aGlzKTsgfVxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIHBsdWdpbiBoYXMgaW5pdGlhbGl6ZWQuXG4gICAgICogQGV2ZW50IFBsdWdpbiNpbml0XG4gICAgICovXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGBpbml0LnpmLiR7cGx1Z2luTmFtZX1gKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveSgpO1xuICAgIHZhciBwbHVnaW5OYW1lID0gZ2V0UGx1Z2luTmFtZSh0aGlzKTtcbiAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUF0dHIoYGRhdGEtJHtwbHVnaW5OYW1lfWApLnJlbW92ZURhdGEoJ3pmUGx1Z2luJylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVzIHdoZW4gdGhlIHBsdWdpbiBoYXMgYmVlbiBkZXN0cm95ZWQuXG4gICAgICAgICAqIEBldmVudCBQbHVnaW4jZGVzdHJveWVkXG4gICAgICAgICAqL1xuICAgICAgICAudHJpZ2dlcihgZGVzdHJveWVkLnpmLiR7cGx1Z2luTmFtZX1gKTtcbiAgICBmb3IodmFyIHByb3AgaW4gdGhpcyl7XG4gICAgICB0aGlzW3Byb3BdID0gbnVsbDsvL2NsZWFuIHVwIHNjcmlwdCB0byBwcmVwIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gICAgfVxuICB9XG59XG5cbi8vIENvbnZlcnQgUGFzY2FsQ2FzZSB0byBrZWJhYi1jYXNlXG4vLyBUaGFuayB5b3U6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzg5NTU1ODBcbmZ1bmN0aW9uIGh5cGhlbmF0ZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBnZXRQbHVnaW5OYW1lKG9iaikge1xuICBpZih0eXBlb2Yob2JqLmNvbnN0cnVjdG9yLm5hbWUpICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBoeXBoZW5hdGUob2JqLmNvbnN0cnVjdG9yLm5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBoeXBoZW5hdGUob2JqLmNsYXNzTmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IHtQbHVnaW59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbi8vIENvcmUgRm91bmRhdGlvbiBVdGlsaXRpZXMsIHV0aWxpemVkIGluIGEgbnVtYmVyIG9mIHBsYWNlcy5cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gZm9yIFJUTCBzdXBwb3J0XG4gICAqL1xuZnVuY3Rpb24gcnRsKCkge1xuICByZXR1cm4gJCgnaHRtbCcpLmF0dHIoJ2RpcicpID09PSAncnRsJztcbn1cblxuLyoqXG4gKiByZXR1cm5zIGEgcmFuZG9tIGJhc2UtMzYgdWlkIHdpdGggbmFtZXNwYWNpbmdcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCAtIG51bWJlciBvZiByYW5kb20gYmFzZS0zNiBkaWdpdHMgZGVzaXJlZC4gSW5jcmVhc2UgZm9yIG1vcmUgcmFuZG9tIHN0cmluZ3MuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIC0gbmFtZSBvZiBwbHVnaW4gdG8gYmUgaW5jb3Jwb3JhdGVkIGluIHVpZCwgb3B0aW9uYWwuXG4gKiBAZGVmYXVsdCB7U3RyaW5nfSAnJyAtIGlmIG5vIHBsdWdpbiBuYW1lIGlzIHByb3ZpZGVkLCBub3RoaW5nIGlzIGFwcGVuZGVkIHRvIHRoZSB1aWQuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSAtIHVuaXF1ZSBpZFxuICovXG5mdW5jdGlvbiBHZXRZb0RpZ2l0cyhsZW5ndGgsIG5hbWVzcGFjZSl7XG4gIGxlbmd0aCA9IGxlbmd0aCB8fCA2O1xuICByZXR1cm4gTWF0aC5yb3VuZCgoTWF0aC5wb3coMzYsIGxlbmd0aCArIDEpIC0gTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDM2LCBsZW5ndGgpKSkudG9TdHJpbmcoMzYpLnNsaWNlKDEpICsgKG5hbWVzcGFjZSA/IGAtJHtuYW1lc3BhY2V9YCA6ICcnKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYSBzdHJpbmcgc28gaXQgY2FuIGJlIHVzZWQgYXMgYSByZWdleHAgcGF0dGVyblxuICogQGZ1bmN0aW9uXG4gKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS85MzEwNzUyLzQzMTczODRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIC0gc3RyaW5nIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IC0gZXNjYXBlZCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gUmVnRXhwRXNjYXBlKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csICdcXFxcJCYnKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNpdGlvbmVuZCgkZWxlbSl7XG4gIHZhciB0cmFuc2l0aW9ucyA9IHtcbiAgICAndHJhbnNpdGlvbic6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAnV2Via2l0VHJhbnNpdGlvbic6ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICAnTW96VHJhbnNpdGlvbic6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAnT1RyYW5zaXRpb24nOiAnb3RyYW5zaXRpb25lbmQnXG4gIH07XG4gIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgICBlbmQ7XG5cbiAgZm9yICh2YXIgdCBpbiB0cmFuc2l0aW9ucyl7XG4gICAgaWYgKHR5cGVvZiBlbGVtLnN0eWxlW3RdICE9PSAndW5kZWZpbmVkJyl7XG4gICAgICBlbmQgPSB0cmFuc2l0aW9uc1t0XTtcbiAgICB9XG4gIH1cbiAgaWYoZW5kKXtcbiAgICByZXR1cm4gZW5kO1xuICB9ZWxzZXtcbiAgICBlbmQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAkZWxlbS50cmlnZ2VySGFuZGxlcigndHJhbnNpdGlvbmVuZCcsIFskZWxlbV0pO1xuICAgIH0sIDEpO1xuICAgIHJldHVybiAndHJhbnNpdGlvbmVuZCc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gZXZlbnQgdHlwZSB0byBsaXN0ZW4gZm9yIHdpbmRvdyBsb2FkLlxuICpcbiAqIElmIGAkZWxlbWAgaXMgcGFzc2VkLCBhbiBldmVudCB3aWxsIGJlIHRyaWdnZXJlZCBvbiBgJGVsZW1gLiBJZiB3aW5kb3cgaXMgYWxyZWFkeSBsb2FkZWQsIHRoZSBldmVudCB3aWxsIHN0aWxsIGJlIHRyaWdnZXJlZC5cbiAqIElmIGBoYW5kbGVyYCBpcyBwYXNzZWQsIGF0dGFjaCBpdCB0byB0aGUgZXZlbnQgb24gYCRlbGVtYC5cbiAqIENhbGxpbmcgYG9uTG9hZGAgd2l0aG91dCBoYW5kbGVyIGFsbG93cyB5b3UgdG8gZ2V0IHRoZSBldmVudCB0eXBlIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgYmVmb3JlIGF0dGFjaGluZyB0aGUgaGFuZGxlciBieSB5b3Vyc2VsZi5cbiAqIEBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbXSAkZWxlbSAtIGpRdWVyeSBlbGVtZW50IG9uIHdoaWNoIHRoZSBldmVudCB3aWxsIGJlIHRyaWdnZXJlZCBpZiBwYXNzZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbXSBoYW5kbGVyIC0gZnVuY3Rpb24gdG8gYXR0YWNoIHRvIHRoZSBldmVudC5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IC0gZXZlbnQgdHlwZSB0aGF0IHNob3VsZCBvciB3aWxsIGJlIHRyaWdnZXJlZC5cbiAqL1xuZnVuY3Rpb24gb25Mb2FkKCRlbGVtLCBoYW5kbGVyKSB7XG4gIGNvbnN0IGRpZExvYWQgPSBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnO1xuICBjb25zdCBldmVudFR5cGUgPSAoZGlkTG9hZCA/ICdfZGlkTG9hZCcgOiAnbG9hZCcpICsgJy56Zi51dGlsLm9uTG9hZCc7XG4gIGNvbnN0IGNiID0gKCkgPT4gJGVsZW0udHJpZ2dlckhhbmRsZXIoZXZlbnRUeXBlKTtcblxuICBpZiAoJGVsZW0pIHtcbiAgICBpZiAoaGFuZGxlcikgJGVsZW0ub25lKGV2ZW50VHlwZSwgaGFuZGxlcik7XG5cbiAgICBpZiAoZGlkTG9hZClcbiAgICAgIHNldFRpbWVvdXQoY2IpO1xuICAgIGVsc2VcbiAgICAgICQod2luZG93KS5vbmUoJ2xvYWQnLCBjYik7XG4gIH1cblxuICByZXR1cm4gZXZlbnRUeXBlO1xufVxuXG4vKipcbiAqIFJldHVucyBhbiBoYW5kbGVyIGZvciB0aGUgYG1vdXNlbGVhdmVgIHRoYXQgaWdub3JlIGRpc2FwcGVhcmVkIG1vdXNlcy5cbiAqXG4gKiBJZiB0aGUgbW91c2UgXCJkaXNhcHBlYXJlZFwiIGZyb20gdGhlIGRvY3VtZW50IChsaWtlIHdoZW4gZ29pbmcgb24gYSBicm93c2VyIFVJIGVsZW1lbnQsIFNlZSBodHRwczovL2dpdC5pby96Zi0xMTQxMCksXG4gKiB0aGUgZXZlbnQgaXMgaWdub3JlZC5cbiAqIC0gSWYgdGhlIGBpZ25vcmVMZWF2ZVdpbmRvd2AgaXMgYHRydWVgLCB0aGUgZXZlbnQgaXMgaWdub3JlZCB3aGVuIHRoZSB1c2VyIGFjdHVhbGx5IGxlZnQgdGhlIHdpbmRvd1xuICogICAobGlrZSBieSBzd2l0Y2hpbmcgdG8gYW4gb3RoZXIgd2luZG93IHdpdGggW0FsdF0rW1RhYl0pLlxuICogLSBJZiB0aGUgYGlnbm9yZVJlYXBwZWFyYCBpcyBgdHJ1ZWAsIHRoZSBldmVudCB3aWxsIGJlIGlnbm9yZWQgd2hlbiB0aGUgbW91c2Ugd2lsbCByZWFwcGVhciBsYXRlciBvbiB0aGUgZG9jdW1lbnRcbiAqICAgb3V0c2lkZSBvZiB0aGUgZWxlbWVudCBpdCBsZWZ0LlxuICpcbiAqIEBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtdIGhhbmRsZXIgLSBoYW5kbGVyIGZvciB0aGUgZmlsdGVyZWQgYG1vdXNlbGVhdmVgIGV2ZW50IHRvIHdhdGNoLlxuICogQHBhcmFtIHtPYmplY3R9IFtdIG9wdGlvbnMgLSBvYmplY3Qgb2Ygb3B0aW9uczpcbiAqIC0ge0Jvb2xlYW59IFtmYWxzZV0gaWdub3JlTGVhdmVXaW5kb3cgLSBhbHNvIGlnbm9yZSB3aGVuIHRoZSB1c2VyIHN3aXRjaGVkIHdpbmRvd3MuXG4gKiAtIHtCb29sZWFufSBbZmFsc2VdIGlnbm9yZVJlYXBwZWFyIC0gYWxzbyBpZ25vcmUgd2hlbiB0aGUgbW91c2UgcmVhcHBlYXJlZCBvdXRzaWRlIG9mIHRoZSBlbGVtZW50IGl0IGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IC0gZmlsdGVyZWQgaGFuZGxlciB0byB1c2UgdG8gbGlzdGVuIG9uIHRoZSBgbW91c2VsZWF2ZWAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGlnbm9yZU1vdXNlZGlzYXBwZWFyKGhhbmRsZXIsIHsgaWdub3JlTGVhdmVXaW5kb3cgPSBmYWxzZSwgaWdub3JlUmVhcHBlYXIgPSBmYWxzZSB9ID0ge30pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGxlYXZlRXZlbnRIYW5kbGVyKGVMZWF2ZSwgLi4ucmVzdCkge1xuICAgIGNvbnN0IGNhbGxiYWNrID0gaGFuZGxlci5iaW5kKHRoaXMsIGVMZWF2ZSwgLi4ucmVzdCk7XG5cbiAgICAvLyBUaGUgbW91c2UgbGVmdDogY2FsbCB0aGUgZ2l2ZW4gY2FsbGJhY2sgaWYgdGhlIG1vdXNlIGVudGVyZWQgZWxzZXdoZXJlXG4gICAgaWYgKGVMZWF2ZS5yZWxhdGVkVGFyZ2V0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGNoZWNrIGlmIHRoZSBtb3VzZSBhY3R1YWxseSBsZWZ0IHRoZSB3aW5kb3cuXG4gICAgLy8gSW4gZmlyZWZveCBpZiB0aGUgdXNlciBzd2l0Y2hlZCBiZXR3ZWVuIHdpbmRvd3MsIHRoZSB3aW5kb3cgc2lsbCBoYXZlIHRoZSBmb2N1cyBieSB0aGUgdGltZVxuICAgIC8vIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuIFdlIGhhdmUgdG8gZGVib3VuY2UgdGhlIGV2ZW50IHRvIHRlc3QgdGhpcyBjYXNlLlxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gbGVhdmVFdmVudERlYm91bmNlcigpIHtcbiAgICAgIGlmICghaWdub3JlTGVhdmVXaW5kb3cgJiYgZG9jdW1lbnQuaGFzRm9jdXMgJiYgIWRvY3VtZW50Lmhhc0ZvY3VzKCkpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgd2FpdCBmb3IgdGhlIG1vdXNlIHRvIHJlZWFwZWFyIG91dHNpZGUgb2YgdGhlIGVsZW1lbnQsXG4gICAgICBpZiAoIWlnbm9yZVJlYXBwZWFyKSB7XG4gICAgICAgICQoZG9jdW1lbnQpLm9uZSgnbW91c2VlbnRlcicsIGZ1bmN0aW9uIHJlZW50ZXJFdmVudEhhbmRsZXIoZVJlZW50ZXIpIHtcbiAgICAgICAgICBpZiAoISQoZUxlYXZlLmN1cnJlbnRUYXJnZXQpLmhhcyhlUmVlbnRlci50YXJnZXQpLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gRmlsbCB3aGVyZSB0aGUgbW91c2UgZmluYWxseSBlbnRlcmVkLlxuICAgICAgICAgICAgZUxlYXZlLnJlbGF0ZWRUYXJnZXQgPSBlUmVlbnRlci50YXJnZXQ7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICB9LCAwKTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgcnRsLCBHZXRZb0RpZ2l0cywgUmVnRXhwRXNjYXBlLCB0cmFuc2l0aW9uZW5kLCBvbkxvYWQsIGlnbm9yZU1vdXNlZGlzYXBwZWFyIH07XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBLZXlib2FyZCB9IGZyb20gJy4vZm91bmRhdGlvbi51dGlsLmtleWJvYXJkJztcbmltcG9ydCB7IEdldFlvRGlnaXRzLCBpZ25vcmVNb3VzZWRpc2FwcGVhciB9IGZyb20gJy4vZm91bmRhdGlvbi5jb3JlLnV0aWxzJztcbmltcG9ydCB7IFBvc2l0aW9uYWJsZSB9IGZyb20gJy4vZm91bmRhdGlvbi5wb3NpdGlvbmFibGUnO1xuXG5pbXBvcnQgeyBUcmlnZ2VycyB9IGZyb20gJy4vZm91bmRhdGlvbi51dGlsLnRyaWdnZXJzJztcblxuXG4vKipcbiAqIERyb3Bkb3duIG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi5kcm9wZG93blxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5rZXlib2FyZFxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5ib3hcbiAqIEByZXF1aXJlcyBmb3VuZGF0aW9uLnV0aWwudHJpZ2dlcnNcbiAqL1xuY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBQb3NpdGlvbmFibGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIGRyb3Bkb3duLlxuICAgKiBAY2xhc3NcbiAgICogQG5hbWUgRHJvcGRvd25cbiAgICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIG1ha2UgaW50byBhIGRyb3Bkb3duLlxuICAgKiAgICAgICAgT2JqZWN0IHNob3VsZCBiZSBvZiB0aGUgZHJvcGRvd24gcGFuZWwsIHJhdGhlciB0aGFuIGl0cyBhbmNob3IuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3ZlcnJpZGVzIHRvIHRoZSBkZWZhdWx0IHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIF9zZXR1cChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIERyb3Bkb3duLmRlZmF1bHRzLCB0aGlzLiRlbGVtZW50LmRhdGEoKSwgb3B0aW9ucyk7XG4gICAgdGhpcy5jbGFzc05hbWUgPSAnRHJvcGRvd24nOyAvLyBpZTkgYmFjayBjb21wYXRcblxuICAgIC8vIFRyaWdnZXJzIGluaXQgaXMgaWRlbXBvdGVudCwganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBpbml0aWFsaXplZFxuICAgIFRyaWdnZXJzLmluaXQoJCk7XG5cbiAgICB0aGlzLl9pbml0KCk7XG5cbiAgICBLZXlib2FyZC5yZWdpc3RlcignRHJvcGRvd24nLCB7XG4gICAgICAnRU5URVInOiAndG9nZ2xlJyxcbiAgICAgICdTUEFDRSc6ICd0b2dnbGUnLFxuICAgICAgJ0VTQ0FQRSc6ICdjbG9zZSdcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2luIGJ5IHNldHRpbmcvY2hlY2tpbmcgb3B0aW9ucyBhbmQgYXR0cmlidXRlcywgYWRkaW5nIGhlbHBlciB2YXJpYWJsZXMsIGFuZCBzYXZpbmcgdGhlIGFuY2hvci5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaW5pdCgpIHtcbiAgICB2YXIgJGlkID0gdGhpcy4kZWxlbWVudC5hdHRyKCdpZCcpO1xuXG4gICAgdGhpcy4kYW5jaG9ycyA9ICQoYFtkYXRhLXRvZ2dsZT1cIiR7JGlkfVwiXWApLmxlbmd0aCA/ICQoYFtkYXRhLXRvZ2dsZT1cIiR7JGlkfVwiXWApIDogJChgW2RhdGEtb3Blbj1cIiR7JGlkfVwiXWApO1xuICAgIHRoaXMuJGFuY2hvcnMuYXR0cih7XG4gICAgICAnYXJpYS1jb250cm9scyc6ICRpZCxcbiAgICAgICdkYXRhLWlzLWZvY3VzJzogZmFsc2UsXG4gICAgICAnZGF0YS15ZXRpLWJveCc6ICRpZCxcbiAgICAgICdhcmlhLWhhc3BvcHVwJzogdHJ1ZSxcbiAgICAgICdhcmlhLWV4cGFuZGVkJzogZmFsc2VcbiAgICB9KTtcblxuICAgIHRoaXMuX3NldEN1cnJlbnRBbmNob3IodGhpcy4kYW5jaG9ycy5maXJzdCgpKTtcblxuICAgIGlmKHRoaXMub3B0aW9ucy5wYXJlbnRDbGFzcyl7XG4gICAgICB0aGlzLiRwYXJlbnQgPSB0aGlzLiRlbGVtZW50LnBhcmVudHMoJy4nICsgdGhpcy5vcHRpb25zLnBhcmVudENsYXNzKTtcbiAgICB9ZWxzZXtcbiAgICAgIHRoaXMuJHBhcmVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2V0IFthcmlhLWxhYmVsbGVkYnldIG9uIHRoZSBEcm9wZG93biBpZiBpdCBpcyBub3Qgc2V0XG4gICAgaWYgKHR5cGVvZiB0aGlzLiRlbGVtZW50LmF0dHIoJ2FyaWEtbGFiZWxsZWRieScpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gR2V0IHRoZSBhbmNob3IgSUQgb3IgY3JlYXRlIG9uZVxuICAgICAgaWYgKHR5cGVvZiB0aGlzLiRjdXJyZW50QW5jaG9yLmF0dHIoJ2lkJykgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMuJGN1cnJlbnRBbmNob3IuYXR0cignaWQnLCBHZXRZb0RpZ2l0cyg2LCAnZGQtYW5jaG9yJykpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy4kZWxlbWVudC5hdHRyKCdhcmlhLWxhYmVsbGVkYnknLCB0aGlzLiRjdXJyZW50QW5jaG9yLmF0dHIoJ2lkJykpO1xuICAgIH1cblxuICAgIHRoaXMuJGVsZW1lbnQuYXR0cih7XG4gICAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsXG4gICAgICAnZGF0YS15ZXRpLWJveCc6ICRpZCxcbiAgICAgICdkYXRhLXJlc2l6ZSc6ICRpZCxcbiAgICB9KTtcblxuICAgIHN1cGVyLl9pbml0KCk7XG4gICAgdGhpcy5fZXZlbnRzKCk7XG4gIH1cblxuICBfZ2V0RGVmYXVsdFBvc2l0aW9uKCkge1xuICAgIC8vIGhhbmRsZSBsZWdhY3kgY2xhc3NuYW1lc1xuICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuJGVsZW1lbnRbMF0uY2xhc3NOYW1lLm1hdGNoKC8odG9wfGxlZnR8cmlnaHR8Ym90dG9tKS9nKTtcbiAgICBpZihwb3NpdGlvbikge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2JvdHRvbSdcbiAgICB9XG4gIH1cblxuICBfZ2V0RGVmYXVsdEFsaWdubWVudCgpIHtcbiAgICAvLyBoYW5kbGUgbGVnYWN5IGZsb2F0IGFwcHJvYWNoXG4gICAgdmFyIGhvcml6b250YWxQb3NpdGlvbiA9IC9mbG9hdC0oXFxTKykvLmV4ZWModGhpcy4kY3VycmVudEFuY2hvci5hdHRyKCdjbGFzcycpKTtcbiAgICBpZihob3Jpem9udGFsUG9zaXRpb24pIHtcbiAgICAgIHJldHVybiBob3Jpem9udGFsUG9zaXRpb25bMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLl9nZXREZWZhdWx0QWxpZ25tZW50KCk7XG4gIH1cblxuXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBvc2l0aW9uIGFuZCBvcmllbnRhdGlvbiBvZiB0aGUgZHJvcGRvd24gcGFuZSwgY2hlY2tzIGZvciBjb2xsaXNpb25zIGlmIGFsbG93LW92ZXJsYXAgaXMgbm90IHRydWUuXG4gICAqIFJlY3Vyc2l2ZWx5IGNhbGxzIGl0c2VsZiBpZiBhIGNvbGxpc2lvbiBpcyBkZXRlY3RlZCwgd2l0aCBhIG5ldyBwb3NpdGlvbiBjbGFzcy5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0UG9zaXRpb24oKSB7XG4gICAgdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhgaGFzLXBvc2l0aW9uLSR7dGhpcy5wb3NpdGlvbn0gaGFzLWFsaWdubWVudC0ke3RoaXMuYWxpZ25tZW50fWApO1xuICAgIHN1cGVyLl9zZXRQb3NpdGlvbih0aGlzLiRjdXJyZW50QW5jaG9yLCB0aGlzLiRlbGVtZW50LCB0aGlzLiRwYXJlbnQpO1xuICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoYGhhcy1wb3NpdGlvbi0ke3RoaXMucG9zaXRpb259IGhhcy1hbGlnbm1lbnQtJHt0aGlzLmFsaWdubWVudH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGl0IGEgY3VycmVudCBhbmNob3IuXG4gICAqIEN1cnJlbnQgYW5jaG9yIGFzIHRoZSByZWZlcmVuY2UgZm9yIHRoZSBwb3NpdGlvbiBvZiBEcm9wZG93biBwYW5lcy5cbiAgICogQHBhcmFtIHtIVE1MfSBlbCAtIERPTSBlbGVtZW50IG9mIHRoZSBhbmNob3IuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NldEN1cnJlbnRBbmNob3IoZWwpIHtcbiAgICB0aGlzLiRjdXJyZW50QW5jaG9yID0gJChlbCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIGVsZW1lbnQgdXRpbGl6aW5nIHRoZSB0cmlnZ2VycyB1dGlsaXR5IGxpYnJhcnkuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2V2ZW50cygpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuJGVsZW1lbnQub24oe1xuICAgICAgJ29wZW4uemYudHJpZ2dlcic6IHRoaXMub3Blbi5iaW5kKHRoaXMpLFxuICAgICAgJ2Nsb3NlLnpmLnRyaWdnZXInOiB0aGlzLmNsb3NlLmJpbmQodGhpcyksXG4gICAgICAndG9nZ2xlLnpmLnRyaWdnZXInOiB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpLFxuICAgICAgJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInOiB0aGlzLl9zZXRQb3NpdGlvbi5iaW5kKHRoaXMpXG4gICAgfSk7XG5cbiAgICB0aGlzLiRhbmNob3JzLm9mZignY2xpY2suemYudHJpZ2dlcicpXG4gICAgICAub24oJ2NsaWNrLnpmLnRyaWdnZXInLCBmdW5jdGlvbigpIHsgX3RoaXMuX3NldEN1cnJlbnRBbmNob3IodGhpcyk7IH0pO1xuXG4gICAgaWYodGhpcy5vcHRpb25zLmhvdmVyKXtcbiAgICAgIHRoaXMuJGFuY2hvcnMub2ZmKCdtb3VzZWVudGVyLnpmLmRyb3Bkb3duIG1vdXNlbGVhdmUuemYuZHJvcGRvd24nKVxuICAgICAgLm9uKCdtb3VzZWVudGVyLnpmLmRyb3Bkb3duJywgZnVuY3Rpb24oKXtcbiAgICAgICAgX3RoaXMuX3NldEN1cnJlbnRBbmNob3IodGhpcyk7XG5cbiAgICAgICAgdmFyIGJvZHlEYXRhID0gJCgnYm9keScpLmRhdGEoKTtcbiAgICAgICAgaWYodHlwZW9mKGJvZHlEYXRhLndoYXRpbnB1dCkgPT09ICd1bmRlZmluZWQnIHx8IGJvZHlEYXRhLndoYXRpbnB1dCA9PT0gJ21vdXNlJykge1xuICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpcy50aW1lb3V0KTtcbiAgICAgICAgICBfdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgX3RoaXMub3BlbigpO1xuICAgICAgICAgICAgX3RoaXMuJGFuY2hvcnMuZGF0YSgnaG92ZXInLCB0cnVlKTtcbiAgICAgICAgICB9LCBfdGhpcy5vcHRpb25zLmhvdmVyRGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9KS5vbignbW91c2VsZWF2ZS56Zi5kcm9wZG93bicsIGlnbm9yZU1vdXNlZGlzYXBwZWFyKGZ1bmN0aW9uKCl7XG4gICAgICAgIGNsZWFyVGltZW91dChfdGhpcy50aW1lb3V0KTtcbiAgICAgICAgX3RoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICAgIF90aGlzLiRhbmNob3JzLmRhdGEoJ2hvdmVyJywgZmFsc2UpO1xuICAgICAgICB9LCBfdGhpcy5vcHRpb25zLmhvdmVyRGVsYXkpO1xuICAgICAgfSkpO1xuICAgICAgaWYodGhpcy5vcHRpb25zLmhvdmVyUGFuZSl7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQub2ZmKCdtb3VzZWVudGVyLnpmLmRyb3Bkb3duIG1vdXNlbGVhdmUuemYuZHJvcGRvd24nKVxuICAgICAgICAgICAgLm9uKCdtb3VzZWVudGVyLnpmLmRyb3Bkb3duJywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLnRpbWVvdXQpO1xuICAgICAgICAgICAgfSkub24oJ21vdXNlbGVhdmUuemYuZHJvcGRvd24nLCBpZ25vcmVNb3VzZWRpc2FwcGVhcihmdW5jdGlvbigpe1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMudGltZW91dCk7XG4gICAgICAgICAgICAgIF90aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy4kYW5jaG9ycy5kYXRhKCdob3ZlcicsIGZhbHNlKTtcbiAgICAgICAgICAgICAgfSwgX3RoaXMub3B0aW9ucy5ob3ZlckRlbGF5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4kYW5jaG9ycy5hZGQodGhpcy4kZWxlbWVudCkub24oJ2tleWRvd24uemYuZHJvcGRvd24nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgIHZhciAkdGFyZ2V0ID0gJCh0aGlzKSxcbiAgICAgICAgdmlzaWJsZUZvY3VzYWJsZUVsZW1lbnRzID0gS2V5Ym9hcmQuZmluZEZvY3VzYWJsZShfdGhpcy4kZWxlbWVudCk7XG5cbiAgICAgIEtleWJvYXJkLmhhbmRsZUtleShlLCAnRHJvcGRvd24nLCB7XG4gICAgICAgIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICgkdGFyZ2V0LmlzKF90aGlzLiRhbmNob3JzKSAmJiAhJHRhcmdldC5pcygnaW5wdXQsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgIF90aGlzLm9wZW4oKTtcbiAgICAgICAgICAgIF90aGlzLiRlbGVtZW50LmF0dHIoJ3RhYmluZGV4JywgLTEpLmZvY3VzKCk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgICBfdGhpcy4kYW5jaG9ycy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGJvZHkgdG8gY2xvc2UgYW55IGRyb3Bkb3ducyBvbiBhIGNsaWNrLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9hZGRCb2R5SGFuZGxlcigpIHtcbiAgICAgdmFyICRib2R5ID0gJChkb2N1bWVudC5ib2R5KS5ub3QodGhpcy4kZWxlbWVudCksXG4gICAgICAgICBfdGhpcyA9IHRoaXM7XG4gICAgICRib2R5Lm9mZignY2xpY2suemYuZHJvcGRvd24nKVxuICAgICAgICAgIC5vbignY2xpY2suemYuZHJvcGRvd24nLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgIGlmKF90aGlzLiRhbmNob3JzLmlzKGUudGFyZ2V0KSB8fCBfdGhpcy4kYW5jaG9ycy5maW5kKGUudGFyZ2V0KS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoX3RoaXMuJGVsZW1lbnQuaXMoZS50YXJnZXQpIHx8IF90aGlzLiRlbGVtZW50LmZpbmQoZS50YXJnZXQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgJGJvZHkub2ZmKCdjbGljay56Zi5kcm9wZG93bicpO1xuICAgICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBkcm9wZG93biBwYW5lLCBhbmQgZmlyZXMgYSBidWJibGluZyBldmVudCB0byBjbG9zZSBvdGhlciBkcm9wZG93bnMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAZmlyZXMgRHJvcGRvd24jY2xvc2VtZVxuICAgKiBAZmlyZXMgRHJvcGRvd24jc2hvd1xuICAgKi9cbiAgb3BlbigpIHtcbiAgICAvLyB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHRvIGNsb3NlIG90aGVyIG9wZW4gZHJvcGRvd25zLCB0eXBpY2FsbHkgd2hlbiBkcm9wZG93biBpcyBvcGVuaW5nXG4gICAgICogQGV2ZW50IERyb3Bkb3duI2Nsb3NlbWVcbiAgICAgKi9cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2Nsb3NlbWUuemYuZHJvcGRvd24nLCB0aGlzLiRlbGVtZW50LmF0dHIoJ2lkJykpO1xuICAgIHRoaXMuJGFuY2hvcnMuYWRkQ2xhc3MoJ2hvdmVyJylcbiAgICAgICAgLmF0dHIoeydhcmlhLWV4cGFuZGVkJzogdHJ1ZX0pO1xuICAgIC8vIHRoaXMuJGVsZW1lbnQvKi5zaG93KCkqLztcblxuICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ2lzLW9wZW5pbmcnKTtcbiAgICB0aGlzLl9zZXRQb3NpdGlvbigpO1xuICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2lzLW9wZW5pbmcnKS5hZGRDbGFzcygnaXMtb3BlbicpXG4gICAgICAgIC5hdHRyKHsnYXJpYS1oaWRkZW4nOiBmYWxzZX0pO1xuXG4gICAgaWYodGhpcy5vcHRpb25zLmF1dG9Gb2N1cyl7XG4gICAgICB2YXIgJGZvY3VzYWJsZSA9IEtleWJvYXJkLmZpbmRGb2N1c2FibGUodGhpcy4kZWxlbWVudCk7XG4gICAgICBpZigkZm9jdXNhYmxlLmxlbmd0aCl7XG4gICAgICAgICRmb2N1c2FibGUuZXEoMCkuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZih0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrKXsgdGhpcy5fYWRkQm9keUhhbmRsZXIoKTsgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50cmFwRm9jdXMpIHtcbiAgICAgIEtleWJvYXJkLnRyYXBGb2N1cyh0aGlzLiRlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbmNlIHRoZSBkcm9wZG93biBpcyB2aXNpYmxlLlxuICAgICAqIEBldmVudCBEcm9wZG93biNzaG93XG4gICAgICovXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdzaG93LnpmLmRyb3Bkb3duJywgW3RoaXMuJGVsZW1lbnRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9wZW4gZHJvcGRvd24gcGFuZS5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBmaXJlcyBEcm9wZG93biNoaWRlXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICBpZighdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaXMtb3BlbicpKXtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcygnaXMtb3BlbicpXG4gICAgICAgIC5hdHRyKHsnYXJpYS1oaWRkZW4nOiB0cnVlfSk7XG5cbiAgICB0aGlzLiRhbmNob3JzLnJlbW92ZUNsYXNzKCdob3ZlcicpXG4gICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgb25jZSB0aGUgZHJvcGRvd24gaXMgbm8gbG9uZ2VyIHZpc2libGUuXG4gICAgICogQGV2ZW50IERyb3Bkb3duI2hpZGVcbiAgICAgKi9cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2hpZGUuemYuZHJvcGRvd24nLCBbdGhpcy4kZWxlbWVudF0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50cmFwRm9jdXMpIHtcbiAgICAgIEtleWJvYXJkLnJlbGVhc2VGb2N1cyh0aGlzLiRlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZHJvcGRvd24gcGFuZSdzIHZpc2liaWxpdHkuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgdG9nZ2xlKCkge1xuICAgIGlmKHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2lzLW9wZW4nKSl7XG4gICAgICBpZih0aGlzLiRhbmNob3JzLmRhdGEoJ2hvdmVyJykpIHJldHVybjtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9ZWxzZXtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgZHJvcGRvd24uXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX2Rlc3Ryb3koKSB7XG4gICAgdGhpcy4kZWxlbWVudC5vZmYoJy56Zi50cmlnZ2VyJykuaGlkZSgpO1xuICAgIHRoaXMuJGFuY2hvcnMub2ZmKCcuemYuZHJvcGRvd24nKTtcbiAgICAkKGRvY3VtZW50LmJvZHkpLm9mZignY2xpY2suemYuZHJvcGRvd24nKTtcblxuICB9XG59XG5cbkRyb3Bkb3duLmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogQ2xhc3MgdGhhdCBkZXNpZ25hdGVzIGJvdW5kaW5nIGNvbnRhaW5lciBvZiBEcm9wZG93biAoZGVmYXVsdDogd2luZG93KVxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHs/c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqL1xuICBwYXJlbnRDbGFzczogbnVsbCxcbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIHRvIGRlbGF5IG9wZW5pbmcgYSBzdWJtZW51IG9uIGhvdmVyIGV2ZW50LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDI1MFxuICAgKi9cbiAgaG92ZXJEZWxheTogMjUwLFxuICAvKipcbiAgICogQWxsb3cgc3VibWVudXMgdG8gb3BlbiBvbiBob3ZlciBldmVudHNcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGhvdmVyOiBmYWxzZSxcbiAgLyoqXG4gICAqIERvbid0IGNsb3NlIGRyb3Bkb3duIHdoZW4gaG92ZXJpbmcgb3ZlciBkcm9wZG93biBwYW5lXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBob3ZlclBhbmU6IGZhbHNlLFxuICAvKipcbiAgICogTnVtYmVyIG9mIHBpeGVscyBiZXR3ZWVuIHRoZSBkcm9wZG93biBwYW5lIGFuZCB0aGUgdHJpZ2dlcmluZyBlbGVtZW50IG9uIG9wZW4uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgdk9mZnNldDogMCxcbiAgLyoqXG4gICAqIE51bWJlciBvZiBwaXhlbHMgYmV0d2VlbiB0aGUgZHJvcGRvd24gcGFuZSBhbmQgdGhlIHRyaWdnZXJpbmcgZWxlbWVudCBvbiBvcGVuLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGhPZmZzZXQ6IDAsXG4gIC8qKlxuICAgKiBQb3NpdGlvbiBvZiBkcm9wZG93bi4gQ2FuIGJlIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgb3IgYXV0by5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAnYXV0bydcbiAgICovXG4gIHBvc2l0aW9uOiAnYXV0bycsXG4gIC8qKlxuICAgKiBBbGlnbm1lbnQgb2YgZHJvcGRvd24gcmVsYXRpdmUgdG8gYW5jaG9yLiBDYW4gYmUgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBjZW50ZXIsIG9yIGF1dG8uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2F1dG8nXG4gICAqL1xuICBhbGlnbm1lbnQ6ICdhdXRvJyxcbiAgLyoqXG4gICAqIEFsbG93IG92ZXJsYXAgb2YgY29udGFpbmVyL3dpbmRvdy4gSWYgZmFsc2UsIGRyb3Bkb3duIHdpbGwgZmlyc3QgdHJ5IHRvIHBvc2l0aW9uIGFzIGRlZmluZWQgYnkgZGF0YS1wb3NpdGlvbiBhbmQgZGF0YS1hbGlnbm1lbnQsIGJ1dCByZXBvc2l0aW9uIGlmIGl0IHdvdWxkIGNhdXNlIGFuIG92ZXJmbG93LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYWxsb3dPdmVybGFwOiBmYWxzZSxcbiAgLyoqXG4gICAqIEFsbG93IG92ZXJsYXAgb2Ygb25seSB0aGUgYm90dG9tIG9mIHRoZSBjb250YWluZXIuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uXG4gICAqIGJlaGF2aW9yIGZvciBkcm9wZG93bnMsIGFsbG93aW5nIHRoZSBkcm9wZG93biB0byBleHRlbmQgdGhlIGJvdHRvbSBvZiB0aGVcbiAgICogc2NyZWVuIGJ1dCBub3Qgb3RoZXJ3aXNlIGluZmx1ZW5jZSBvciBicmVhayBvdXQgb2YgdGhlIGNvbnRhaW5lci5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYWxsb3dCb3R0b21PdmVybGFwOiB0cnVlLFxuICAvKipcbiAgICogQWxsb3cgdGhlIHBsdWdpbiB0byB0cmFwIGZvY3VzIHRvIHRoZSBkcm9wZG93biBwYW5lIGlmIG9wZW5lZCB3aXRoIGtleWJvYXJkIGNvbW1hbmRzLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgdHJhcEZvY3VzOiBmYWxzZSxcbiAgLyoqXG4gICAqIEFsbG93IHRoZSBwbHVnaW4gdG8gc2V0IGZvY3VzIHRvIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCB3aXRoaW4gdGhlIHBhbmUsIHJlZ2FyZGxlc3Mgb2YgbWV0aG9kIG9mIG9wZW5pbmcuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBhdXRvRm9jdXM6IGZhbHNlLFxuICAvKipcbiAgICogQWxsb3dzIGEgY2xpY2sgb24gdGhlIGJvZHkgdG8gY2xvc2UgdGhlIGRyb3Bkb3duLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY2xvc2VPbkNsaWNrOiBmYWxzZVxufTtcblxuZXhwb3J0IHtEcm9wZG93bn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICcuL2ZvdW5kYXRpb24uY29yZS5wbHVnaW4nO1xuaW1wb3J0IHsgcnRsIGFzIFJ0bCwgaWdub3JlTW91c2VkaXNhcHBlYXIgfSBmcm9tICcuL2ZvdW5kYXRpb24uY29yZS51dGlscyc7XG5pbXBvcnQgeyBLZXlib2FyZCB9IGZyb20gJy4vZm91bmRhdGlvbi51dGlsLmtleWJvYXJkJztcbmltcG9ydCB7IE5lc3QgfSBmcm9tICcuL2ZvdW5kYXRpb24udXRpbC5uZXN0JztcbmltcG9ydCB7IEJveCB9IGZyb20gJy4vZm91bmRhdGlvbi51dGlsLmJveCc7XG5cbi8qKlxuICogRHJvcGRvd25NZW51IG1vZHVsZS5cbiAqIEBtb2R1bGUgZm91bmRhdGlvbi5kcm9wZG93bi1tZW51XG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLmtleWJvYXJkXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLmJveFxuICogQHJlcXVpcmVzIGZvdW5kYXRpb24udXRpbC5uZXN0XG4gKi9cblxuY2xhc3MgRHJvcGRvd25NZW51IGV4dGVuZHMgUGx1Z2luIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgRHJvcGRvd25NZW51LlxuICAgKiBAY2xhc3NcbiAgICogQG5hbWUgRHJvcGRvd25NZW51XG4gICAqIEBmaXJlcyBEcm9wZG93bk1lbnUjaW5pdFxuICAgKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gbWFrZSBpbnRvIGEgZHJvcGRvd24gbWVudS5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgX3NldHVwKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgRHJvcGRvd25NZW51LmRlZmF1bHRzLCB0aGlzLiRlbGVtZW50LmRhdGEoKSwgb3B0aW9ucyk7XG4gICAgdGhpcy5jbGFzc05hbWUgPSAnRHJvcGRvd25NZW51JzsgLy8gaWU5IGJhY2sgY29tcGF0XG5cbiAgICB0aGlzLl9pbml0KCk7XG5cbiAgICBLZXlib2FyZC5yZWdpc3RlcignRHJvcGRvd25NZW51Jywge1xuICAgICAgJ0VOVEVSJzogJ29wZW4nLFxuICAgICAgJ1NQQUNFJzogJ29wZW4nLFxuICAgICAgJ0FSUk9XX1JJR0hUJzogJ25leHQnLFxuICAgICAgJ0FSUk9XX1VQJzogJ3VwJyxcbiAgICAgICdBUlJPV19ET1dOJzogJ2Rvd24nLFxuICAgICAgJ0FSUk9XX0xFRlQnOiAncHJldmlvdXMnLFxuICAgICAgJ0VTQ0FQRSc6ICdjbG9zZSdcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2luLCBhbmQgY2FsbHMgX3ByZXBhcmVNZW51XG4gICAqIEBwcml2YXRlXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX2luaXQoKSB7XG4gICAgTmVzdC5GZWF0aGVyKHRoaXMuJGVsZW1lbnQsICdkcm9wZG93bicpO1xuXG4gICAgdmFyIHN1YnMgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ2xpLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50Jyk7XG4gICAgdGhpcy4kZWxlbWVudC5jaGlsZHJlbignLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50JykuY2hpbGRyZW4oJy5pcy1kcm9wZG93bi1zdWJtZW51JykuYWRkQ2xhc3MoJ2ZpcnN0LXN1YicpO1xuXG4gICAgdGhpcy4kbWVudUl0ZW1zID0gdGhpcy4kZWxlbWVudC5maW5kKCdbcm9sZT1cIm1lbnVpdGVtXCJdJyk7XG4gICAgdGhpcy4kdGFicyA9IHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oJ1tyb2xlPVwibWVudWl0ZW1cIl0nKTtcbiAgICB0aGlzLiR0YWJzLmZpbmQoJ3VsLmlzLWRyb3Bkb3duLXN1Ym1lbnUnKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMudmVydGljYWxDbGFzcyk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmFsaWdubWVudCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIGlmICh0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKHRoaXMub3B0aW9ucy5yaWdodENsYXNzKSB8fCBSdGwoKSB8fCB0aGlzLiRlbGVtZW50LnBhcmVudHMoJy50b3AtYmFyLXJpZ2h0JykuaXMoJyonKSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFsaWdubWVudCA9ICdyaWdodCc7XG4gICAgICAgICAgICBzdWJzLmFkZENsYXNzKCdvcGVucy1sZWZ0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxpZ25tZW50ID0gJ2xlZnQnO1xuICAgICAgICAgICAgc3Vicy5hZGRDbGFzcygnb3BlbnMtcmlnaHQnKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmFsaWdubWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHN1YnMuYWRkQ2xhc3MoJ29wZW5zLWxlZnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Vicy5hZGRDbGFzcygnb3BlbnMtcmlnaHQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5fZXZlbnRzKCk7XG4gIH07XG5cbiAgX2lzVmVydGljYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuJHRhYnMuY3NzKCdkaXNwbGF5JykgPT09ICdibG9jaycgfHwgdGhpcy4kZWxlbWVudC5jc3MoJ2ZsZXgtZGlyZWN0aW9uJykgPT09ICdjb2x1bW4nO1xuICB9XG5cbiAgX2lzUnRsKCkge1xuICAgIHJldHVybiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdhbGlnbi1yaWdodCcpIHx8IChSdGwoKSAmJiAhdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnYWxpZ24tbGVmdCcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byBlbGVtZW50cyB3aXRoaW4gdGhlIG1lbnVcbiAgICogQHByaXZhdGVcbiAgICogQGZ1bmN0aW9uXG4gICAqL1xuICBfZXZlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGhhc1RvdWNoID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8ICh0eXBlb2Ygd2luZG93Lm9udG91Y2hzdGFydCAhPT0gJ3VuZGVmaW5lZCcpLFxuICAgICAgICBwYXJDbGFzcyA9ICdpcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudCc7XG5cbiAgICAvLyB1c2VkIGZvciBvbkNsaWNrIGFuZCBpbiB0aGUga2V5Ym9hcmQgaGFuZGxlcnNcbiAgICB2YXIgaGFuZGxlQ2xpY2tGbiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciAkZWxlbSA9ICQoZS50YXJnZXQpLnBhcmVudHNVbnRpbCgndWwnLCBgLiR7cGFyQ2xhc3N9YCksXG4gICAgICAgICAgaGFzU3ViID0gJGVsZW0uaGFzQ2xhc3MocGFyQ2xhc3MpLFxuICAgICAgICAgIGhhc0NsaWNrZWQgPSAkZWxlbS5hdHRyKCdkYXRhLWlzLWNsaWNrJykgPT09ICd0cnVlJyxcbiAgICAgICAgICAkc3ViID0gJGVsZW0uY2hpbGRyZW4oJy5pcy1kcm9wZG93bi1zdWJtZW51Jyk7XG5cbiAgICAgIGlmIChoYXNTdWIpIHtcbiAgICAgICAgaWYgKGhhc0NsaWNrZWQpIHtcbiAgICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrIHx8ICghX3RoaXMub3B0aW9ucy5jbGlja09wZW4gJiYgIWhhc1RvdWNoKSB8fCAoX3RoaXMub3B0aW9ucy5mb3JjZUZvbGxvdyAmJiBoYXNUb3VjaCkpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgX3RoaXMuX2hpZGUoJGVsZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBfdGhpcy5fc2hvdygkc3ViKTtcbiAgICAgICAgICAkZWxlbS5hZGQoJGVsZW0ucGFyZW50c1VudGlsKF90aGlzLiRlbGVtZW50LCBgLiR7cGFyQ2xhc3N9YCkpLmF0dHIoJ2RhdGEtaXMtY2xpY2snLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNsaWNrT3BlbiB8fCBoYXNUb3VjaCkge1xuICAgICAgdGhpcy4kbWVudUl0ZW1zLm9uKCdjbGljay56Zi5kcm9wZG93bm1lbnUgdG91Y2hzdGFydC56Zi5kcm9wZG93bm1lbnUnLCBoYW5kbGVDbGlja0ZuKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgTGVhZiBlbGVtZW50IENsaWNrc1xuICAgIGlmKF90aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrSW5zaWRlKXtcbiAgICAgIHRoaXMuJG1lbnVJdGVtcy5vbignY2xpY2suemYuZHJvcGRvd25tZW51JywgZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgJGVsZW0gPSAkKHRoaXMpLFxuICAgICAgICAgICAgaGFzU3ViID0gJGVsZW0uaGFzQ2xhc3MocGFyQ2xhc3MpO1xuICAgICAgICBpZighaGFzU3ViKXtcbiAgICAgICAgICBfdGhpcy5faGlkZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlSG92ZXIpIHtcbiAgICAgIHRoaXMuJG1lbnVJdGVtcy5vbignbW91c2VlbnRlci56Zi5kcm9wZG93bm1lbnUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgJGVsZW0gPSAkKHRoaXMpLFxuICAgICAgICAgIGhhc1N1YiA9ICRlbGVtLmhhc0NsYXNzKHBhckNsYXNzKTtcblxuICAgICAgICBpZiAoaGFzU3ViKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KCRlbGVtLmRhdGEoJ19kZWxheScpKTtcbiAgICAgICAgICAkZWxlbS5kYXRhKCdfZGVsYXknLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLl9zaG93KCRlbGVtLmNoaWxkcmVuKCcuaXMtZHJvcGRvd24tc3VibWVudScpKTtcbiAgICAgICAgICB9LCBfdGhpcy5vcHRpb25zLmhvdmVyRGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgfSkub24oJ21vdXNlbGVhdmUuemYuZHJvcGRvd25NZW51JywgaWdub3JlTW91c2VkaXNhcHBlYXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyICRlbGVtID0gJCh0aGlzKSxcbiAgICAgICAgICAgIGhhc1N1YiA9ICRlbGVtLmhhc0NsYXNzKHBhckNsYXNzKTtcbiAgICAgICAgaWYgKGhhc1N1YiAmJiBfdGhpcy5vcHRpb25zLmF1dG9jbG9zZSkge1xuICAgICAgICAgIGlmICgkZWxlbS5hdHRyKCdkYXRhLWlzLWNsaWNrJykgPT09ICd0cnVlJyAmJiBfdGhpcy5vcHRpb25zLmNsaWNrT3BlbikgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICAgIGNsZWFyVGltZW91dCgkZWxlbS5kYXRhKCdfZGVsYXknKSk7XG4gICAgICAgICAgJGVsZW0uZGF0YSgnX2RlbGF5Jywgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5faGlkZSgkZWxlbSk7XG4gICAgICAgICAgfSwgX3RoaXMub3B0aW9ucy5jbG9zaW5nVGltZSkpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfVxuICAgIHRoaXMuJG1lbnVJdGVtcy5vbigna2V5ZG93bi56Zi5kcm9wZG93bm1lbnUnLCBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgJGVsZW1lbnQgPSAkKGUudGFyZ2V0KS5wYXJlbnRzVW50aWwoJ3VsJywgJ1tyb2xlPVwibWVudWl0ZW1cIl0nKSxcbiAgICAgICAgICBpc1RhYiA9IF90aGlzLiR0YWJzLmluZGV4KCRlbGVtZW50KSA+IC0xLFxuICAgICAgICAgICRlbGVtZW50cyA9IGlzVGFiID8gX3RoaXMuJHRhYnMgOiAkZWxlbWVudC5zaWJsaW5ncygnbGknKS5hZGQoJGVsZW1lbnQpLFxuICAgICAgICAgICRwcmV2RWxlbWVudCxcbiAgICAgICAgICAkbmV4dEVsZW1lbnQ7XG5cbiAgICAgICRlbGVtZW50cy5lYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgaWYgKCQodGhpcykuaXMoJGVsZW1lbnQpKSB7XG4gICAgICAgICAgJHByZXZFbGVtZW50ID0gJGVsZW1lbnRzLmVxKGktMSk7XG4gICAgICAgICAgJG5leHRFbGVtZW50ID0gJGVsZW1lbnRzLmVxKGkrMSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIG5leHRTaWJsaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICRuZXh0RWxlbWVudC5jaGlsZHJlbignYTpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sIHByZXZTaWJsaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICRwcmV2RWxlbWVudC5jaGlsZHJlbignYTpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sIG9wZW5TdWIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyICRzdWIgPSAkZWxlbWVudC5jaGlsZHJlbigndWwuaXMtZHJvcGRvd24tc3VibWVudScpO1xuICAgICAgICBpZiAoJHN1Yi5sZW5ndGgpIHtcbiAgICAgICAgICBfdGhpcy5fc2hvdygkc3ViKTtcbiAgICAgICAgICAkZWxlbWVudC5maW5kKCdsaSA+IGE6Zmlyc3QnKS5mb2N1cygpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIHsgcmV0dXJuOyB9XG4gICAgICB9LCBjbG9zZVN1YiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvL2lmICgkZWxlbWVudC5pcygnOmZpcnN0LWNoaWxkJykpIHtcbiAgICAgICAgdmFyIGNsb3NlID0gJGVsZW1lbnQucGFyZW50KCd1bCcpLnBhcmVudCgnbGknKTtcbiAgICAgICAgY2xvc2UuY2hpbGRyZW4oJ2E6Zmlyc3QnKS5mb2N1cygpO1xuICAgICAgICBfdGhpcy5faGlkZShjbG9zZSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy99XG4gICAgICB9O1xuICAgICAgdmFyIGZ1bmN0aW9ucyA9IHtcbiAgICAgICAgb3Blbjogb3BlblN1YixcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIF90aGlzLl9oaWRlKF90aGlzLiRlbGVtZW50KTtcbiAgICAgICAgICBfdGhpcy4kbWVudUl0ZW1zLmVxKDApLmNoaWxkcmVuKCdhJykuZm9jdXMoKTsgLy8gZm9jdXMgdG8gZmlyc3QgZWxlbWVudFxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFuZGxlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKGlzVGFiKSB7XG4gICAgICAgIGlmIChfdGhpcy5faXNWZXJ0aWNhbCgpKSB7IC8vIHZlcnRpY2FsIG1lbnVcbiAgICAgICAgICBpZiAoX3RoaXMuX2lzUnRsKCkpIHsgLy8gcmlnaHQgYWxpZ25lZFxuICAgICAgICAgICAgJC5leHRlbmQoZnVuY3Rpb25zLCB7XG4gICAgICAgICAgICAgIGRvd246IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICB1cDogcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgIG5leHQ6IGNsb3NlU3ViLFxuICAgICAgICAgICAgICBwcmV2aW91czogb3BlblN1YlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gbGVmdCBhbGlnbmVkXG4gICAgICAgICAgICAkLmV4dGVuZChmdW5jdGlvbnMsIHtcbiAgICAgICAgICAgICAgZG93bjogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgIHVwOiBwcmV2U2libGluZyxcbiAgICAgICAgICAgICAgbmV4dDogb3BlblN1YixcbiAgICAgICAgICAgICAgcHJldmlvdXM6IGNsb3NlU3ViXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7IC8vIGhvcml6b250YWwgbWVudVxuICAgICAgICAgIGlmIChfdGhpcy5faXNSdGwoKSkgeyAvLyByaWdodCBhbGlnbmVkXG4gICAgICAgICAgICAkLmV4dGVuZChmdW5jdGlvbnMsIHtcbiAgICAgICAgICAgICAgbmV4dDogcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgIHByZXZpb3VzOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgICAgZG93bjogb3BlblN1YixcbiAgICAgICAgICAgICAgdXA6IGNsb3NlU3ViXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgeyAvLyBsZWZ0IGFsaWduZWRcbiAgICAgICAgICAgICQuZXh0ZW5kKGZ1bmN0aW9ucywge1xuICAgICAgICAgICAgICBuZXh0OiBuZXh0U2libGluZyxcbiAgICAgICAgICAgICAgcHJldmlvdXM6IHByZXZTaWJsaW5nLFxuICAgICAgICAgICAgICBkb3duOiBvcGVuU3ViLFxuICAgICAgICAgICAgICB1cDogY2xvc2VTdWJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gbm90IHRhYnMgLT4gb25lIHN1YlxuICAgICAgICBpZiAoX3RoaXMuX2lzUnRsKCkpIHsgLy8gcmlnaHQgYWxpZ25lZFxuICAgICAgICAgICQuZXh0ZW5kKGZ1bmN0aW9ucywge1xuICAgICAgICAgICAgbmV4dDogY2xvc2VTdWIsXG4gICAgICAgICAgICBwcmV2aW91czogb3BlblN1YixcbiAgICAgICAgICAgIGRvd246IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgdXA6IHByZXZTaWJsaW5nXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7IC8vIGxlZnQgYWxpZ25lZFxuICAgICAgICAgICQuZXh0ZW5kKGZ1bmN0aW9ucywge1xuICAgICAgICAgICAgbmV4dDogb3BlblN1YixcbiAgICAgICAgICAgIHByZXZpb3VzOiBjbG9zZVN1YixcbiAgICAgICAgICAgIGRvd246IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgdXA6IHByZXZTaWJsaW5nXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEtleWJvYXJkLmhhbmRsZUtleShlLCAnRHJvcGRvd25NZW51JywgZnVuY3Rpb25zKTtcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgYm9keSB0byBjbG9zZSBhbnkgZHJvcGRvd25zIG9uIGEgY2xpY2suXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2FkZEJvZHlIYW5kbGVyKCkge1xuICAgIHZhciAkYm9keSA9ICQoZG9jdW1lbnQuYm9keSksXG4gICAgICAgIF90aGlzID0gdGhpcztcbiAgICAkYm9keS5vZmYoJ21vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudScpXG4gICAgICAgICAub24oJ21vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgdmFyICRsaW5rID0gX3RoaXMuJGVsZW1lbnQuZmluZChlLnRhcmdldCk7XG4gICAgICAgICAgIGlmICgkbGluay5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgX3RoaXMuX2hpZGUoKTtcbiAgICAgICAgICAgJGJvZHkub2ZmKCdtb3VzZXVwLnpmLmRyb3Bkb3dubWVudSB0b3VjaGVuZC56Zi5kcm9wZG93bm1lbnUnKTtcbiAgICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgZHJvcGRvd24gcGFuZSwgYW5kIGNoZWNrcyBmb3IgY29sbGlzaW9ucyBmaXJzdC5cbiAgICogQHBhcmFtIHtqUXVlcnl9ICRzdWIgLSB1bCBlbGVtZW50IHRoYXQgaXMgYSBzdWJtZW51IHRvIHNob3dcbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqIEBmaXJlcyBEcm9wZG93bm1lbnUjc2hvd1xuICAgKi9cbiAgX3Nob3coJHN1Yikge1xuICAgIHZhciBpZHggPSB0aGlzLiR0YWJzLmluZGV4KHRoaXMuJHRhYnMuZmlsdGVyKGZ1bmN0aW9uKGksIGVsKSB7XG4gICAgICByZXR1cm4gJChlbCkuZmluZCgkc3ViKS5sZW5ndGggPiAwO1xuICAgIH0pKTtcbiAgICB2YXIgJHNpYnMgPSAkc3ViLnBhcmVudCgnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKS5zaWJsaW5ncygnbGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnQnKTtcbiAgICB0aGlzLl9oaWRlKCRzaWJzLCBpZHgpO1xuICAgICRzdWIuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpLmFkZENsYXNzKCdqcy1kcm9wZG93bi1hY3RpdmUnKVxuICAgICAgICAucGFyZW50KCdsaS5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudCcpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICB2YXIgY2xlYXIgPSBCb3guSW1Ob3RUb3VjaGluZ1lvdSgkc3ViLCBudWxsLCB0cnVlKTtcbiAgICBpZiAoIWNsZWFyKSB7XG4gICAgICB2YXIgb2xkQ2xhc3MgPSB0aGlzLm9wdGlvbnMuYWxpZ25tZW50ID09PSAnbGVmdCcgPyAnLXJpZ2h0JyA6ICctbGVmdCcsXG4gICAgICAgICAgJHBhcmVudExpID0gJHN1Yi5wYXJlbnQoJy5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudCcpO1xuICAgICAgJHBhcmVudExpLnJlbW92ZUNsYXNzKGBvcGVucyR7b2xkQ2xhc3N9YCkuYWRkQ2xhc3MoYG9wZW5zLSR7dGhpcy5vcHRpb25zLmFsaWdubWVudH1gKTtcbiAgICAgIGNsZWFyID0gQm94LkltTm90VG91Y2hpbmdZb3UoJHN1YiwgbnVsbCwgdHJ1ZSk7XG4gICAgICBpZiAoIWNsZWFyKSB7XG4gICAgICAgICRwYXJlbnRMaS5yZW1vdmVDbGFzcyhgb3BlbnMtJHt0aGlzLm9wdGlvbnMuYWxpZ25tZW50fWApLmFkZENsYXNzKCdvcGVucy1pbm5lcicpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgJHN1Yi5jc3MoJ3Zpc2liaWxpdHknLCAnJyk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2spIHsgdGhpcy5fYWRkQm9keUhhbmRsZXIoKTsgfVxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIG5ldyBkcm9wZG93biBwYW5lIGlzIHZpc2libGUuXG4gICAgICogQGV2ZW50IERyb3Bkb3dubWVudSNzaG93XG4gICAgICovXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdzaG93LnpmLmRyb3Bkb3dubWVudScsIFskc3ViXSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgYSBzaW5nbGUsIGN1cnJlbnRseSBvcGVuIGRyb3Bkb3duIHBhbmUsIGlmIHBhc3NlZCBhIHBhcmFtZXRlciwgb3RoZXJ3aXNlLCBoaWRlcyBldmVyeXRoaW5nLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtqUXVlcnl9ICRlbGVtIC0gZWxlbWVudCB3aXRoIGEgc3VibWVudSB0byBoaWRlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpZHggLSBpbmRleCBvZiB0aGUgJHRhYnMgY29sbGVjdGlvbiB0byBoaWRlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaGlkZSgkZWxlbSwgaWR4KSB7XG4gICAgdmFyICR0b0Nsb3NlO1xuICAgIGlmICgkZWxlbSAmJiAkZWxlbS5sZW5ndGgpIHtcbiAgICAgICR0b0Nsb3NlID0gJGVsZW07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaWR4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgJHRvQ2xvc2UgPSB0aGlzLiR0YWJzLm5vdChmdW5jdGlvbihpLCBlbCkge1xuICAgICAgICByZXR1cm4gaSA9PT0gaWR4O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgJHRvQ2xvc2UgPSB0aGlzLiRlbGVtZW50O1xuICAgIH1cbiAgICB2YXIgc29tZXRoaW5nVG9DbG9zZSA9ICR0b0Nsb3NlLmhhc0NsYXNzKCdpcy1hY3RpdmUnKSB8fCAkdG9DbG9zZS5maW5kKCcuaXMtYWN0aXZlJykubGVuZ3RoID4gMDtcblxuICAgIGlmIChzb21ldGhpbmdUb0Nsb3NlKSB7XG4gICAgICAkdG9DbG9zZS5maW5kKCdsaS5pcy1hY3RpdmUnKS5hZGQoJHRvQ2xvc2UpLmF0dHIoe1xuICAgICAgICAnZGF0YS1pcy1jbGljayc6IGZhbHNlXG4gICAgICB9KS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XG5cbiAgICAgICR0b0Nsb3NlLmZpbmQoJ3VsLmpzLWRyb3Bkb3duLWFjdGl2ZScpLnJlbW92ZUNsYXNzKCdqcy1kcm9wZG93bi1hY3RpdmUnKTtcblxuICAgICAgaWYgKHRoaXMuY2hhbmdlZCB8fCAkdG9DbG9zZS5maW5kKCdvcGVucy1pbm5lcicpLmxlbmd0aCkge1xuICAgICAgICB2YXIgb2xkQ2xhc3MgPSB0aGlzLm9wdGlvbnMuYWxpZ25tZW50ID09PSAnbGVmdCcgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICAkdG9DbG9zZS5maW5kKCdsaS5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudCcpLmFkZCgkdG9DbG9zZSlcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoYG9wZW5zLWlubmVyIG9wZW5zLSR7dGhpcy5vcHRpb25zLmFsaWdubWVudH1gKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhgb3BlbnMtJHtvbGRDbGFzc31gKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEZpcmVzIHdoZW4gdGhlIG9wZW4gbWVudXMgYXJlIGNsb3NlZC5cbiAgICAgICAqIEBldmVudCBEcm9wZG93bm1lbnUjaGlkZVxuICAgICAgICovXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2hpZGUuemYuZHJvcGRvd25tZW51JywgWyR0b0Nsb3NlXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBwbHVnaW4uXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX2Rlc3Ryb3koKSB7XG4gICAgdGhpcy4kbWVudUl0ZW1zLm9mZignLnpmLmRyb3Bkb3dubWVudScpLnJlbW92ZUF0dHIoJ2RhdGEtaXMtY2xpY2snKVxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2lzLXJpZ2h0LWFycm93IGlzLWxlZnQtYXJyb3cgaXMtZG93bi1hcnJvdyBvcGVucy1yaWdodCBvcGVucy1sZWZ0IG9wZW5zLWlubmVyJyk7XG4gICAgJChkb2N1bWVudC5ib2R5KS5vZmYoJy56Zi5kcm9wZG93bm1lbnUnKTtcbiAgICBOZXN0LkJ1cm4odGhpcy4kZWxlbWVudCwgJ2Ryb3Bkb3duJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZhdWx0IHNldHRpbmdzIGZvciBwbHVnaW5cbiAqL1xuRHJvcGRvd25NZW51LmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogRGlzYWxsb3dzIGhvdmVyIGV2ZW50cyBmcm9tIG9wZW5pbmcgc3VibWVudXNcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRpc2FibGVIb3ZlcjogZmFsc2UsXG4gIC8qKlxuICAgKiBBbGxvdyBhIHN1Ym1lbnUgdG8gYXV0b21hdGljYWxseSBjbG9zZSBvbiBhIG1vdXNlbGVhdmUgZXZlbnQsIGlmIG5vdCBjbGlja2VkIG9wZW4uXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGF1dG9jbG9zZTogdHJ1ZSxcbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIHRvIGRlbGF5IG9wZW5pbmcgYSBzdWJtZW51IG9uIGhvdmVyIGV2ZW50LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDUwXG4gICAqL1xuICBob3ZlckRlbGF5OiA1MCxcbiAgLyoqXG4gICAqIEFsbG93IGEgc3VibWVudSB0byBvcGVuL3JlbWFpbiBvcGVuIG9uIHBhcmVudCBjbGljayBldmVudC4gQWxsb3dzIGN1cnNvciB0byBtb3ZlIGF3YXkgZnJvbSBtZW51LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY2xpY2tPcGVuOiBmYWxzZSxcbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIHRvIGRlbGF5IGNsb3NpbmcgYSBzdWJtZW51IG9uIGEgbW91c2VsZWF2ZSBldmVudC5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCA1MDBcbiAgICovXG5cbiAgY2xvc2luZ1RpbWU6IDUwMCxcbiAgLyoqXG4gICAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHdoYXQgZGlyZWN0aW9uIHRoZSBzdWJtZW51cyBzaG91bGQgb3Blbi4gSGFuZGxlZCBieSBKUy4gQ2FuIGJlIGAnYXV0bydgLCBgJ2xlZnQnYCBvciBgJ3JpZ2h0J2AuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2F1dG8nXG4gICAqL1xuICBhbGlnbm1lbnQ6ICdhdXRvJyxcbiAgLyoqXG4gICAqIEFsbG93IGNsaWNrcyBvbiB0aGUgYm9keSB0byBjbG9zZSBhbnkgb3BlbiBzdWJtZW51cy5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgY2xvc2VPbkNsaWNrOiB0cnVlLFxuICAvKipcbiAgICogQWxsb3cgY2xpY2tzIG9uIGxlYWYgYW5jaG9yIGxpbmtzIHRvIGNsb3NlIGFueSBvcGVuIHN1Ym1lbnVzLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBjbG9zZU9uQ2xpY2tJbnNpZGU6IHRydWUsXG4gIC8qKlxuICAgKiBDbGFzcyBhcHBsaWVkIHRvIHZlcnRpY2FsIG9yaWVudGVkIG1lbnVzLCBGb3VuZGF0aW9uIGRlZmF1bHQgaXMgYHZlcnRpY2FsYC4gVXBkYXRlIHRoaXMgaWYgdXNpbmcgeW91ciBvd24gY2xhc3MuXG4gICAqIEBvcHRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ3ZlcnRpY2FsJ1xuICAgKi9cbiAgdmVydGljYWxDbGFzczogJ3ZlcnRpY2FsJyxcbiAgLyoqXG4gICAqIENsYXNzIGFwcGxpZWQgdG8gcmlnaHQtc2lkZSBvcmllbnRlZCBtZW51cywgRm91bmRhdGlvbiBkZWZhdWx0IGlzIGBhbGlnbi1yaWdodGAuIFVwZGF0ZSB0aGlzIGlmIHVzaW5nIHlvdXIgb3duIGNsYXNzLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdhbGlnbi1yaWdodCdcbiAgICovXG4gIHJpZ2h0Q2xhc3M6ICdhbGlnbi1yaWdodCcsXG4gIC8qKlxuICAgKiBCb29sZWFuIHRvIGZvcmNlIG92ZXJpZGUgdGhlIGNsaWNraW5nIG9mIGxpbmtzIHRvIHBlcmZvcm0gZGVmYXVsdCBhY3Rpb24sIG9uIHNlY29uZCB0b3VjaCBldmVudCBmb3IgbW9iaWxlLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBmb3JjZUZvbGxvdzogdHJ1ZVxufTtcblxuZXhwb3J0IHtEcm9wZG93bk1lbnV9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgTWVkaWFRdWVyeSB9IGZyb20gJy4vZm91bmRhdGlvbi51dGlsLm1lZGlhUXVlcnknO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnLi9mb3VuZGF0aW9uLmNvcmUucGx1Z2luJztcbmltcG9ydCB7IEdldFlvRGlnaXRzIH0gZnJvbSAnLi9mb3VuZGF0aW9uLmNvcmUudXRpbHMnO1xuXG5cbi8qKlxuICogSW50ZXJjaGFuZ2UgbW9kdWxlLlxuICogQG1vZHVsZSBmb3VuZGF0aW9uLmludGVyY2hhbmdlXG4gKiBAcmVxdWlyZXMgZm91bmRhdGlvbi51dGlsLm1lZGlhUXVlcnlcbiAqL1xuXG5jbGFzcyBJbnRlcmNoYW5nZSBleHRlbmRzIFBsdWdpbiB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEludGVyY2hhbmdlLlxuICAgKiBAY2xhc3NcbiAgICogQG5hbWUgSW50ZXJjaGFuZ2VcbiAgICogQGZpcmVzIEludGVyY2hhbmdlI2luaXRcbiAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgLSBqUXVlcnkgb2JqZWN0IHRvIGFkZCB0aGUgdHJpZ2dlciB0by5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgX3NldHVwKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgSW50ZXJjaGFuZ2UuZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIHRoaXMucnVsZXMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRQYXRoID0gJyc7XG4gICAgdGhpcy5jbGFzc05hbWUgPSAnSW50ZXJjaGFuZ2UnOyAvLyBpZTkgYmFjayBjb21wYXRcblxuICAgIHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLl9ldmVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgSW50ZXJjaGFuZ2UgcGx1Z2luIGFuZCBjYWxscyBmdW5jdGlvbnMgdG8gZ2V0IGludGVyY2hhbmdlIGZ1bmN0aW9uaW5nIG9uIGxvYWQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2luaXQoKSB7XG4gICAgTWVkaWFRdWVyeS5faW5pdCgpO1xuXG4gICAgdmFyIGlkID0gdGhpcy4kZWxlbWVudFswXS5pZCB8fCBHZXRZb0RpZ2l0cyg2LCAnaW50ZXJjaGFuZ2UnKTtcbiAgICB0aGlzLiRlbGVtZW50LmF0dHIoe1xuICAgICAgJ2RhdGEtcmVzaXplJzogaWQsXG4gICAgICAnaWQnOiBpZFxuICAgIH0pO1xuXG4gICAgdGhpcy5fYWRkQnJlYWtwb2ludHMoKTtcbiAgICB0aGlzLl9nZW5lcmF0ZVJ1bGVzKCk7XG4gICAgdGhpcy5fcmVmbG93KCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgZXZlbnRzIGZvciBJbnRlcmNoYW5nZS5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZXZlbnRzKCkge1xuICAgIHRoaXMuJGVsZW1lbnQub2ZmKCdyZXNpemVtZS56Zi50cmlnZ2VyJykub24oJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInLCAoKSA9PiB0aGlzLl9yZWZsb3coKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgbmVjZXNzYXJ5IGZ1bmN0aW9ucyB0byB1cGRhdGUgSW50ZXJjaGFuZ2UgdXBvbiBET00gY2hhbmdlXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlZmxvdygpIHtcbiAgICB2YXIgbWF0Y2g7XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBydWxlLCBidXQgb25seSBzYXZlIHRoZSBsYXN0IG1hdGNoXG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLnJ1bGVzKSB7XG4gICAgICBpZih0aGlzLnJ1bGVzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIHZhciBydWxlID0gdGhpcy5ydWxlc1tpXTtcbiAgICAgICAgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKHJ1bGUucXVlcnkpLm1hdGNoZXMpIHtcbiAgICAgICAgICBtYXRjaCA9IHJ1bGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHRoaXMucmVwbGFjZShtYXRjaC5wYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgRm91bmRhdGlvbiBicmVha3BvaW50cyBhbmQgYWRkcyB0aGVtIHRvIHRoZSBJbnRlcmNoYW5nZS5TUEVDSUFMX1FVRVJJRVMgb2JqZWN0LlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9hZGRCcmVha3BvaW50cygpIHtcbiAgICBmb3IgKHZhciBpIGluIE1lZGlhUXVlcnkucXVlcmllcykge1xuICAgICAgaWYgKE1lZGlhUXVlcnkucXVlcmllcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICB2YXIgcXVlcnkgPSBNZWRpYVF1ZXJ5LnF1ZXJpZXNbaV07XG4gICAgICAgIEludGVyY2hhbmdlLlNQRUNJQUxfUVVFUklFU1txdWVyeS5uYW1lXSA9IHF1ZXJ5LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIEludGVyY2hhbmdlIGVsZW1lbnQgZm9yIHRoZSBwcm92aWRlZCBtZWRpYSBxdWVyeSArIGNvbnRlbnQgcGFpcmluZ3NcbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IC0galF1ZXJ5IG9iamVjdCB0aGF0IGlzIGFuIEludGVyY2hhbmdlIGluc3RhbmNlXG4gICAqIEByZXR1cm5zIHtBcnJheX0gc2NlbmFyaW9zIC0gQXJyYXkgb2Ygb2JqZWN0cyB0aGF0IGhhdmUgJ21xJyBhbmQgJ3BhdGgnIGtleXMgd2l0aCBjb3JyZXNwb25kaW5nIGtleXNcbiAgICovXG4gIF9nZW5lcmF0ZVJ1bGVzKGVsZW1lbnQpIHtcbiAgICB2YXIgcnVsZXNMaXN0ID0gW107XG4gICAgdmFyIHJ1bGVzO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ydWxlcykge1xuICAgICAgcnVsZXMgPSB0aGlzLm9wdGlvbnMucnVsZXM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcnVsZXMgPSB0aGlzLiRlbGVtZW50LmRhdGEoJ2ludGVyY2hhbmdlJyk7XG4gICAgfVxuXG4gICAgcnVsZXMgPSAgdHlwZW9mIHJ1bGVzID09PSAnc3RyaW5nJyA/IHJ1bGVzLm1hdGNoKC9cXFsuKj8sIC4qP1xcXS9nKSA6IHJ1bGVzO1xuXG4gICAgZm9yICh2YXIgaSBpbiBydWxlcykge1xuICAgICAgaWYocnVsZXMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgdmFyIHJ1bGUgPSBydWxlc1tpXS5zbGljZSgxLCAtMSkuc3BsaXQoJywgJyk7XG4gICAgICAgIHZhciBwYXRoID0gcnVsZS5zbGljZSgwLCAtMSkuam9pbignJyk7XG4gICAgICAgIHZhciBxdWVyeSA9IHJ1bGVbcnVsZS5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAoSW50ZXJjaGFuZ2UuU1BFQ0lBTF9RVUVSSUVTW3F1ZXJ5XSkge1xuICAgICAgICAgIHF1ZXJ5ID0gSW50ZXJjaGFuZ2UuU1BFQ0lBTF9RVUVSSUVTW3F1ZXJ5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bGVzTGlzdC5wdXNoKHtcbiAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgIHF1ZXJ5OiBxdWVyeVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzID0gcnVsZXNMaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgYHNyY2AgcHJvcGVydHkgb2YgYW4gaW1hZ2UsIG9yIGNoYW5nZSB0aGUgSFRNTCBvZiBhIGNvbnRhaW5lciwgdG8gdGhlIHNwZWNpZmllZCBwYXRoLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggLSBQYXRoIHRvIHRoZSBpbWFnZSBvciBIVE1MIHBhcnRpYWwuXG4gICAqIEBmaXJlcyBJbnRlcmNoYW5nZSNyZXBsYWNlZFxuICAgKi9cbiAgcmVwbGFjZShwYXRoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhdGggPT09IHBhdGgpIHJldHVybjtcblxuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgIHRyaWdnZXIgPSAncmVwbGFjZWQuemYuaW50ZXJjaGFuZ2UnO1xuXG4gICAgLy8gUmVwbGFjaW5nIGltYWdlc1xuICAgIGlmICh0aGlzLiRlbGVtZW50WzBdLm5vZGVOYW1lID09PSAnSU1HJykge1xuICAgICAgdGhpcy4kZWxlbWVudC5hdHRyKCdzcmMnLCBwYXRoKS5vbignbG9hZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBfdGhpcy5jdXJyZW50UGF0aCA9IHBhdGg7XG4gICAgICB9KVxuICAgICAgLnRyaWdnZXIodHJpZ2dlcik7XG4gICAgfVxuICAgIC8vIFJlcGxhY2luZyBiYWNrZ3JvdW5kIGltYWdlc1xuICAgIGVsc2UgaWYgKHBhdGgubWF0Y2goL1xcLihnaWZ8anBnfGpwZWd8cG5nfHN2Z3x0aWZmKShbPyNdLiopPy9pKSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwoL2csICclMjgnKS5yZXBsYWNlKC9cXCkvZywgJyUyOScpO1xuICAgICAgdGhpcy4kZWxlbWVudC5jc3MoeyAnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJytwYXRoKycpJyB9KVxuICAgICAgICAgIC50cmlnZ2VyKHRyaWdnZXIpO1xuICAgIH1cbiAgICAvLyBSZXBsYWNpbmcgSFRNTFxuICAgIGVsc2Uge1xuICAgICAgJC5nZXQocGF0aCwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgX3RoaXMuJGVsZW1lbnQuaHRtbChyZXNwb25zZSlcbiAgICAgICAgICAgICAudHJpZ2dlcih0cmlnZ2VyKTtcbiAgICAgICAgJChyZXNwb25zZSkuZm91bmRhdGlvbigpO1xuICAgICAgICBfdGhpcy5jdXJyZW50UGF0aCA9IHBhdGg7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGNvbnRlbnQgaW4gYW4gSW50ZXJjaGFuZ2UgZWxlbWVudCBpcyBkb25lIGJlaW5nIGxvYWRlZC5cbiAgICAgKiBAZXZlbnQgSW50ZXJjaGFuZ2UjcmVwbGFjZWRcbiAgICAgKi9cbiAgICAvLyB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ3JlcGxhY2VkLnpmLmludGVyY2hhbmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgYW4gaW5zdGFuY2Ugb2YgaW50ZXJjaGFuZ2UuXG4gICAqIEBmdW5jdGlvblxuICAgKi9cbiAgX2Rlc3Ryb3koKSB7XG4gICAgdGhpcy4kZWxlbWVudC5vZmYoJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInKVxuICB9XG59XG5cbi8qKlxuICogRGVmYXVsdCBzZXR0aW5ncyBmb3IgcGx1Z2luXG4gKi9cbkludGVyY2hhbmdlLmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogUnVsZXMgdG8gYmUgYXBwbGllZCB0byBJbnRlcmNoYW5nZSBlbGVtZW50cy4gU2V0IHdpdGggdGhlIGBkYXRhLWludGVyY2hhbmdlYCBhcnJheSBub3RhdGlvbi5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7P2FycmF5fVxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqL1xuICBydWxlczogbnVsbFxufTtcblxuSW50ZXJjaGFuZ2UuU1BFQ0lBTF9RVUVSSUVTID0ge1xuICAnbGFuZHNjYXBlJzogJ3NjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpJyxcbiAgJ3BvcnRyYWl0JzogJ3NjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknLFxuICAncmV0aW5hJzogJ29ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwgb25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLCBvbmx5IHNjcmVlbiBhbmQgKC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIvMSksIG9ubHkgc2NyZWVuIGFuZCAobWluLWRldmljZS1waXhlbC1yYXRpbzogMiksIG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksIG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDJkcHB4KSdcbn07XG5cbmV4cG9ydCB7SW50ZXJjaGFuZ2V9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBCb3ggfSBmcm9tICcuL2ZvdW5kYXRpb24udXRpbC5ib3gnO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnLi9mb3VuZGF0aW9uLmNvcmUucGx1Z2luJztcbmltcG9ydCB7IHJ0bCBhcyBSdGwgfSBmcm9tICcuL2ZvdW5kYXRpb24uY29yZS51dGlscyc7XG5cbmNvbnN0IFBPU0lUSU9OUyA9IFsnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJ107XG5jb25zdCBWRVJUSUNBTF9BTElHTk1FTlRTID0gWyd0b3AnLCAnYm90dG9tJywgJ2NlbnRlciddO1xuY29uc3QgSE9SSVpPTlRBTF9BTElHTk1FTlRTID0gWydsZWZ0JywgJ3JpZ2h0JywgJ2NlbnRlciddO1xuXG5jb25zdCBBTElHTk1FTlRTID0ge1xuICAnbGVmdCc6IFZFUlRJQ0FMX0FMSUdOTUVOVFMsXG4gICdyaWdodCc6IFZFUlRJQ0FMX0FMSUdOTUVOVFMsXG4gICd0b3AnOiBIT1JJWk9OVEFMX0FMSUdOTUVOVFMsXG4gICdib3R0b20nOiBIT1JJWk9OVEFMX0FMSUdOTUVOVFNcbn1cblxuZnVuY3Rpb24gbmV4dEl0ZW0oaXRlbSwgYXJyYXkpIHtcbiAgdmFyIGN1cnJlbnRJZHggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuICBpZihjdXJyZW50SWR4ID09PSBhcnJheS5sZW5ndGggLSAxKSB7XG4gICAgcmV0dXJuIGFycmF5WzBdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcnJheVtjdXJyZW50SWR4ICsgMV07XG4gIH1cbn1cblxuXG5jbGFzcyBQb3NpdGlvbmFibGUgZXh0ZW5kcyBQbHVnaW4ge1xuICAvKipcbiAgICogQWJzdHJhY3QgY2xhc3MgZW5jYXBzdWxhdGluZyB0aGUgdGV0aGVyLWxpa2UgZXhwbGljaXQgcG9zaXRpb25pbmcgbG9naWNcbiAgICogaW5jbHVkaW5nIHJlcG9zaXRpb25pbmcgYmFzZWQgb24gb3ZlcmxhcC5cbiAgICogRXhwZWN0cyBjbGFzc2VzIHRvIGRlZmluZSBkZWZhdWx0cyBmb3Igdk9mZnNldCwgaE9mZnNldCwgcG9zaXRpb24sXG4gICAqIGFsaWdubWVudCwgYWxsb3dPdmVybGFwLCBhbmQgYWxsb3dCb3R0b21PdmVybGFwLiBUaGV5IGNhbiBkbyB0aGlzIGJ5XG4gICAqIGV4dGVuZGluZyB0aGUgZGVmYXVsdHMsIG9yIChmb3Igbm93IHJlY29tbWVuZGVkIGR1ZSB0byB0aGUgd2F5IGRvY3MgYXJlXG4gICAqIGdlbmVyYXRlZCkgYnkgZXhwbGljaXRseSBkZWNsYXJpbmcgdGhlbS5cbiAgICpcbiAgICoqL1xuXG4gIF9pbml0KCkge1xuICAgIHRoaXMudHJpZWRQb3NpdGlvbnMgPSB7fTtcbiAgICB0aGlzLnBvc2l0aW9uICA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2F1dG8nID8gdGhpcy5fZ2V0RGVmYXVsdFBvc2l0aW9uKCkgOiB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgdGhpcy5hbGlnbm1lbnQgPSB0aGlzLm9wdGlvbnMuYWxpZ25tZW50ID09PSAnYXV0bycgPyB0aGlzLl9nZXREZWZhdWx0QWxpZ25tZW50KCkgOiB0aGlzLm9wdGlvbnMuYWxpZ25tZW50O1xuICAgIHRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG4gICAgdGhpcy5vcmlnaW5hbEFsaWdubWVudCA9IHRoaXMuYWxpZ25tZW50O1xuICB9XG5cbiAgX2dldERlZmF1bHRQb3NpdGlvbiAoKSB7XG4gICAgcmV0dXJuICdib3R0b20nO1xuICB9XG5cbiAgX2dldERlZmF1bHRBbGlnbm1lbnQoKSB7XG4gICAgc3dpdGNoKHRoaXMucG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICByZXR1cm4gUnRsKCkgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRqdXN0cyB0aGUgcG9zaXRpb25hYmxlIHBvc3NpYmxlIHBvc2l0aW9ucyBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGlnbm1lbnRzXG4gICAqIGFuZCBwb3NpdGlvbnMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlcG9zaXRpb24oKSB7XG4gICAgaWYodGhpcy5fYWxpZ25tZW50c0V4aGF1c3RlZCh0aGlzLnBvc2l0aW9uKSkge1xuICAgICAgdGhpcy5wb3NpdGlvbiA9IG5leHRJdGVtKHRoaXMucG9zaXRpb24sIFBPU0lUSU9OUyk7XG4gICAgICB0aGlzLmFsaWdubWVudCA9IEFMSUdOTUVOVFNbdGhpcy5wb3NpdGlvbl1bMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlYWxpZ24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRqdXN0cyB0aGUgZHJvcGRvd24gcGFuZSBwb3NzaWJsZSBwb3NpdGlvbnMgYnkgaXRlcmF0aW5nIHRocm91Z2ggYWxpZ25tZW50c1xuICAgKiBvbiB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVhbGlnbigpIHtcbiAgICB0aGlzLl9hZGRUcmllZFBvc2l0aW9uKHRoaXMucG9zaXRpb24sIHRoaXMuYWxpZ25tZW50KVxuICAgIHRoaXMuYWxpZ25tZW50ID0gbmV4dEl0ZW0odGhpcy5hbGlnbm1lbnQsIEFMSUdOTUVOVFNbdGhpcy5wb3NpdGlvbl0pXG4gIH1cblxuICBfYWRkVHJpZWRQb3NpdGlvbihwb3NpdGlvbiwgYWxpZ25tZW50KSB7XG4gICAgdGhpcy50cmllZFBvc2l0aW9uc1twb3NpdGlvbl0gPSB0aGlzLnRyaWVkUG9zaXRpb25zW3Bvc2l0aW9uXSB8fCBbXVxuICAgIHRoaXMudHJpZWRQb3NpdGlvbnNbcG9zaXRpb25dLnB1c2goYWxpZ25tZW50KTtcbiAgfVxuXG4gIF9wb3NpdGlvbnNFeGhhdXN0ZWQoKSB7XG4gICAgdmFyIGlzRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgUE9TSVRJT05TLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpc0V4aGF1c3RlZCA9IGlzRXhoYXVzdGVkICYmIHRoaXMuX2FsaWdubWVudHNFeGhhdXN0ZWQoUE9TSVRJT05TW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzRXhoYXVzdGVkO1xuICB9XG5cbiAgX2FsaWdubWVudHNFeGhhdXN0ZWQocG9zaXRpb24pIHtcbiAgICByZXR1cm4gdGhpcy50cmllZFBvc2l0aW9uc1twb3NpdGlvbl0gJiYgdGhpcy50cmllZFBvc2l0aW9uc1twb3NpdGlvbl0ubGVuZ3RoID09IEFMSUdOTUVOVFNbcG9zaXRpb25dLmxlbmd0aDtcbiAgfVxuXG5cbiAgLy8gV2hlbiB3ZSdyZSB0cnlpbmcgdG8gY2VudGVyLCB3ZSBkb24ndCB3YW50IHRvIGFwcGx5IG9mZnNldCB0aGF0J3MgZ29pbmcgdG9cbiAgLy8gdGFrZSB1cyBqdXN0IG9mZiBjZW50ZXIsIHNvIHdyYXAgYXJvdW5kIHRvIHJldHVybiAwIGZvciB0aGUgYXBwcm9wcmlhdGVcbiAgLy8gb2Zmc2V0IGluIHRob3NlIGFsaWdubWVudHMuICBUT0RPOiBGaWd1cmUgb3V0IGlmIHdlIHdhbnQgdG8gbWFrZSB0aGlzXG4gIC8vIGNvbmZpZ3VyYWJsZSBiZWhhdmlvci4uLiBpdCBmZWVscyBtb3JlIGludHVpdGl2ZSwgZXNwZWNpYWxseSBmb3IgdG9vbHRpcHMsIGJ1dFxuICAvLyBpdCdzIHBvc3NpYmxlIHNvbWVvbmUgbWlnaHQgYWN0dWFsbHkgd2FudCB0byBzdGFydCBmcm9tIGNlbnRlciBhbmQgdGhlbiBudWRnZVxuICAvLyBzbGlnaHRseSBvZmYuXG4gIF9nZXRWT2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudk9mZnNldDtcbiAgfVxuXG4gIF9nZXRIT2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaE9mZnNldDtcbiAgfVxuXG5cbiAgX3NldFBvc2l0aW9uKCRhbmNob3IsICRlbGVtZW50LCAkcGFyZW50KSB7XG4gICAgaWYoJGFuY2hvci5hdHRyKCdhcmlhLWV4cGFuZGVkJykgPT09ICdmYWxzZScpeyByZXR1cm4gZmFsc2U7IH1cbiAgICB2YXIgJGVsZURpbXMgPSBCb3guR2V0RGltZW5zaW9ucygkZWxlbWVudCksXG4gICAgICAgICRhbmNob3JEaW1zID0gQm94LkdldERpbWVuc2lvbnMoJGFuY2hvcik7XG5cblxuICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93T3ZlcmxhcCkge1xuICAgICAgLy8gcmVzdG9yZSBvcmlnaW5hbCBwb3NpdGlvbiAmIGFsaWdubWVudCBiZWZvcmUgY2hlY2tpbmcgb3ZlcmxhcFxuICAgICAgdGhpcy5wb3NpdGlvbiA9IHRoaXMub3JpZ2luYWxQb3NpdGlvbjtcbiAgICAgIHRoaXMuYWxpZ25tZW50ID0gdGhpcy5vcmlnaW5hbEFsaWdubWVudDtcbiAgICB9XG5cbiAgICAkZWxlbWVudC5vZmZzZXQoQm94LkdldEV4cGxpY2l0T2Zmc2V0cygkZWxlbWVudCwgJGFuY2hvciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5hbGlnbm1lbnQsIHRoaXMuX2dldFZPZmZzZXQoKSwgdGhpcy5fZ2V0SE9mZnNldCgpKSk7XG5cbiAgICBpZighdGhpcy5vcHRpb25zLmFsbG93T3ZlcmxhcCkge1xuICAgICAgdmFyIG92ZXJsYXBzID0ge307XG4gICAgICB2YXIgbWluT3ZlcmxhcCA9IDEwMDAwMDAwMDtcbiAgICAgIC8vIGRlZmF1bHQgY29vcmRpbmF0ZXMgdG8gaG93IHdlIHN0YXJ0LCBpbiBjYXNlIHdlIGNhbid0IGZpZ3VyZSBvdXQgYmV0dGVyXG4gICAgICB2YXIgbWluQ29vcmRpbmF0ZXMgPSB7cG9zaXRpb246IHRoaXMucG9zaXRpb24sIGFsaWdubWVudDogdGhpcy5hbGlnbm1lbnR9O1xuICAgICAgd2hpbGUoIXRoaXMuX3Bvc2l0aW9uc0V4aGF1c3RlZCgpKSB7XG4gICAgICAgIGxldCBvdmVybGFwID0gQm94Lk92ZXJsYXBBcmVhKCRlbGVtZW50LCAkcGFyZW50LCBmYWxzZSwgZmFsc2UsIHRoaXMub3B0aW9ucy5hbGxvd0JvdHRvbU92ZXJsYXApO1xuICAgICAgICBpZihvdmVybGFwID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYob3ZlcmxhcCA8IG1pbk92ZXJsYXApIHtcbiAgICAgICAgICBtaW5PdmVybGFwID0gb3ZlcmxhcDtcbiAgICAgICAgICBtaW5Db29yZGluYXRlcyA9IHtwb3NpdGlvbjogdGhpcy5wb3NpdGlvbiwgYWxpZ25tZW50OiB0aGlzLmFsaWdubWVudH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZXBvc2l0aW9uKCk7XG5cbiAgICAgICAgJGVsZW1lbnQub2Zmc2V0KEJveC5HZXRFeHBsaWNpdE9mZnNldHMoJGVsZW1lbnQsICRhbmNob3IsIHRoaXMucG9zaXRpb24sIHRoaXMuYWxpZ25tZW50LCB0aGlzLl9nZXRWT2Zmc2V0KCksIHRoaXMuX2dldEhPZmZzZXQoKSkpO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UgZ2V0IHRocm91Z2ggdGhlIGVudGlyZSBsb29wLCB0aGVyZSB3YXMgbm8gbm9uLW92ZXJsYXBwaW5nXG4gICAgICAvLyBwb3NpdGlvbiBhdmFpbGFibGUuIFBpY2sgdGhlIHZlcnNpb24gd2l0aCBsZWFzdCBvdmVybGFwLlxuICAgICAgdGhpcy5wb3NpdGlvbiA9IG1pbkNvb3JkaW5hdGVzLnBvc2l0aW9uO1xuICAgICAgdGhpcy5hbGlnbm1lbnQgPSBtaW5Db29yZGluYXRlcy5hbGlnbm1lbnQ7XG4gICAgICAkZWxlbWVudC5vZmZzZXQoQm94LkdldEV4cGxpY2l0T2Zmc2V0cygkZWxlbWVudCwgJGFuY2hvciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5hbGlnbm1lbnQsIHRoaXMuX2dldFZPZmZzZXQoKSwgdGhpcy5fZ2V0SE9mZnNldCgpKSk7XG4gICAgfVxuICB9XG5cbn1cblxuUG9zaXRpb25hYmxlLmRlZmF1bHRzID0ge1xuICAvKipcbiAgICogUG9zaXRpb24gb2YgcG9zaXRpb25hYmxlIHJlbGF0aXZlIHRvIGFuY2hvci4gQ2FuIGJlIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgb3IgYXV0by5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCAnYXV0bydcbiAgICovXG4gIHBvc2l0aW9uOiAnYXV0bycsXG4gIC8qKlxuICAgKiBBbGlnbm1lbnQgb2YgcG9zaXRpb25hYmxlIHJlbGF0aXZlIHRvIGFuY2hvci4gQ2FuIGJlIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgY2VudGVyLCBvciBhdXRvLlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdhdXRvJ1xuICAgKi9cbiAgYWxpZ25tZW50OiAnYXV0bycsXG4gIC8qKlxuICAgKiBBbGxvdyBvdmVybGFwIG9mIGNvbnRhaW5lci93aW5kb3cuIElmIGZhbHNlLCBkcm9wZG93biBwb3NpdGlvbmFibGUgZmlyc3RcbiAgICogdHJ5IHRvIHBvc2l0aW9uIGFzIGRlZmluZWQgYnkgZGF0YS1wb3NpdGlvbiBhbmQgZGF0YS1hbGlnbm1lbnQsIGJ1dFxuICAgKiByZXBvc2l0aW9uIGlmIGl0IHdvdWxkIGNhdXNlIGFuIG92ZXJmbG93LlxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYWxsb3dPdmVybGFwOiBmYWxzZSxcbiAgLyoqXG4gICAqIEFsbG93IG92ZXJsYXAgb2Ygb25seSB0aGUgYm90dG9tIG9mIHRoZSBjb250YWluZXIuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uXG4gICAqIGJlaGF2aW9yIGZvciBkcm9wZG93bnMsIGFsbG93aW5nIHRoZSBkcm9wZG93biB0byBleHRlbmQgdGhlIGJvdHRvbSBvZiB0aGVcbiAgICogc2NyZWVuIGJ1dCBub3Qgb3RoZXJ3aXNlIGluZmx1ZW5jZSBvciBicmVhayBvdXQgb2YgdGhlIGNvbnRhaW5lci5cbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYWxsb3dCb3R0b21PdmVybGFwOiB0cnVlLFxuICAvKipcbiAgICogTnVtYmVyIG9mIHBpeGVscyB0aGUgcG9zaXRpb25hYmxlIHNob3VsZCBiZSBzZXBhcmF0ZWQgdmVydGljYWxseSBmcm9tIGFuY2hvclxuICAgKiBAb3B0aW9uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHZPZmZzZXQ6IDAsXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcGl4ZWxzIHRoZSBwb3NpdGlvbmFibGUgc2hvdWxkIGJlIHNlcGFyYXRlZCBob3Jpem9udGFsbHkgZnJvbSBhbmNob3JcbiAgICogQG9wdGlvblxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBoT2Zmc2V0OiAwLFxufVxuXG5leHBvcnQge1Bvc2l0aW9uYWJsZX07XG4iLCIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IHsgcnRsIGFzIFJ0bCB9IGZyb20gXCIuL2ZvdW5kYXRpb24uY29yZS51dGlsc1wiO1xuXG52YXIgQm94ID0ge1xuICBJbU5vdFRvdWNoaW5nWW91OiBJbU5vdFRvdWNoaW5nWW91LFxuICBPdmVybGFwQXJlYTogT3ZlcmxhcEFyZWEsXG4gIEdldERpbWVuc2lvbnM6IEdldERpbWVuc2lvbnMsXG4gIEdldE9mZnNldHM6IEdldE9mZnNldHMsXG4gIEdldEV4cGxpY2l0T2Zmc2V0czogR2V0RXhwbGljaXRPZmZzZXRzXG59XG5cbi8qKlxuICogQ29tcGFyZXMgdGhlIGRpbWVuc2lvbnMgb2YgYW4gZWxlbWVudCB0byBhIGNvbnRhaW5lciBhbmQgZGV0ZXJtaW5lcyBjb2xsaXNpb24gZXZlbnRzIHdpdGggY29udGFpbmVyLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gdGVzdCBmb3IgY29sbGlzaW9ucy5cbiAqIEBwYXJhbSB7alF1ZXJ5fSBwYXJlbnQgLSBqUXVlcnkgb2JqZWN0IHRvIHVzZSBhcyBib3VuZGluZyBjb250YWluZXIuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGxyT25seSAtIHNldCB0byB0cnVlIHRvIGNoZWNrIGxlZnQgYW5kIHJpZ2h0IHZhbHVlcyBvbmx5LlxuICogQHBhcmFtIHtCb29sZWFufSB0Yk9ubHkgLSBzZXQgdG8gdHJ1ZSB0byBjaGVjayB0b3AgYW5kIGJvdHRvbSB2YWx1ZXMgb25seS5cbiAqIEBkZWZhdWx0IGlmIG5vIHBhcmVudCBvYmplY3QgcGFzc2VkLCBkZXRlY3RzIGNvbGxpc2lvbnMgd2l0aCBgd2luZG93YC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUgaWYgY29sbGlzaW9uIGZyZWUsIGZhbHNlIGlmIGEgY29sbGlzaW9uIGluIGFueSBkaXJlY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIEltTm90VG91Y2hpbmdZb3UoZWxlbWVudCwgcGFyZW50LCBsck9ubHksIHRiT25seSwgaWdub3JlQm90dG9tKSB7XG4gIHJldHVybiBPdmVybGFwQXJlYShlbGVtZW50LCBwYXJlbnQsIGxyT25seSwgdGJPbmx5LCBpZ25vcmVCb3R0b20pID09PSAwO1xufTtcblxuZnVuY3Rpb24gT3ZlcmxhcEFyZWEoZWxlbWVudCwgcGFyZW50LCBsck9ubHksIHRiT25seSwgaWdub3JlQm90dG9tKSB7XG4gIHZhciBlbGVEaW1zID0gR2V0RGltZW5zaW9ucyhlbGVtZW50KSxcbiAgdG9wT3ZlciwgYm90dG9tT3ZlciwgbGVmdE92ZXIsIHJpZ2h0T3ZlcjtcbiAgaWYgKHBhcmVudCkge1xuICAgIHZhciBwYXJEaW1zID0gR2V0RGltZW5zaW9ucyhwYXJlbnQpO1xuXG4gICAgYm90dG9tT3ZlciA9IChwYXJEaW1zLmhlaWdodCArIHBhckRpbXMub2Zmc2V0LnRvcCkgLSAoZWxlRGltcy5vZmZzZXQudG9wICsgZWxlRGltcy5oZWlnaHQpO1xuICAgIHRvcE92ZXIgICAgPSBlbGVEaW1zLm9mZnNldC50b3AgLSBwYXJEaW1zLm9mZnNldC50b3A7XG4gICAgbGVmdE92ZXIgICA9IGVsZURpbXMub2Zmc2V0LmxlZnQgLSBwYXJEaW1zLm9mZnNldC5sZWZ0O1xuICAgIHJpZ2h0T3ZlciAgPSAocGFyRGltcy53aWR0aCArIHBhckRpbXMub2Zmc2V0LmxlZnQpIC0gKGVsZURpbXMub2Zmc2V0LmxlZnQgKyBlbGVEaW1zLndpZHRoKTtcbiAgfVxuICBlbHNlIHtcbiAgICBib3R0b21PdmVyID0gKGVsZURpbXMud2luZG93RGltcy5oZWlnaHQgKyBlbGVEaW1zLndpbmRvd0RpbXMub2Zmc2V0LnRvcCkgLSAoZWxlRGltcy5vZmZzZXQudG9wICsgZWxlRGltcy5oZWlnaHQpO1xuICAgIHRvcE92ZXIgICAgPSBlbGVEaW1zLm9mZnNldC50b3AgLSBlbGVEaW1zLndpbmRvd0RpbXMub2Zmc2V0LnRvcDtcbiAgICBsZWZ0T3ZlciAgID0gZWxlRGltcy5vZmZzZXQubGVmdCAtIGVsZURpbXMud2luZG93RGltcy5vZmZzZXQubGVmdDtcbiAgICByaWdodE92ZXIgID0gZWxlRGltcy53aW5kb3dEaW1zLndpZHRoIC0gKGVsZURpbXMub2Zmc2V0LmxlZnQgKyBlbGVEaW1zLndpZHRoKTtcbiAgfVxuXG4gIGJvdHRvbU92ZXIgPSBpZ25vcmVCb3R0b20gPyAwIDogTWF0aC5taW4oYm90dG9tT3ZlciwgMCk7XG4gIHRvcE92ZXIgICAgPSBNYXRoLm1pbih0b3BPdmVyLCAwKTtcbiAgbGVmdE92ZXIgICA9IE1hdGgubWluKGxlZnRPdmVyLCAwKTtcbiAgcmlnaHRPdmVyICA9IE1hdGgubWluKHJpZ2h0T3ZlciwgMCk7XG5cbiAgaWYgKGxyT25seSkge1xuICAgIHJldHVybiBsZWZ0T3ZlciArIHJpZ2h0T3ZlcjtcbiAgfVxuICBpZiAodGJPbmx5KSB7XG4gICAgcmV0dXJuIHRvcE92ZXIgKyBib3R0b21PdmVyO1xuICB9XG5cbiAgLy8gdXNlIHN1bSBvZiBzcXVhcmVzIGIvYyB3ZSBjYXJlIGFib3V0IG92ZXJsYXAgYXJlYS5cbiAgcmV0dXJuIE1hdGguc3FydCgodG9wT3ZlciAqIHRvcE92ZXIpICsgKGJvdHRvbU92ZXIgKiBib3R0b21PdmVyKSArIChsZWZ0T3ZlciAqIGxlZnRPdmVyKSArIChyaWdodE92ZXIgKiByaWdodE92ZXIpKTtcbn1cblxuLyoqXG4gKiBVc2VzIG5hdGl2ZSBtZXRob2RzIHRvIHJldHVybiBhbiBvYmplY3Qgb2YgZGltZW5zaW9uIHZhbHVlcy5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtqUXVlcnkgfHwgSFRNTH0gZWxlbWVudCAtIGpRdWVyeSBvYmplY3Qgb3IgRE9NIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgZGltZW5zaW9ucy4gQ2FuIGJlIGFueSBlbGVtZW50IG90aGVyIHRoYXQgZG9jdW1lbnQgb3Igd2luZG93LlxuICogQHJldHVybnMge09iamVjdH0gLSBuZXN0ZWQgb2JqZWN0IG9mIGludGVnZXIgcGl4ZWwgdmFsdWVzXG4gKiBUT0RPIC0gaWYgZWxlbWVudCBpcyB3aW5kb3csIHJldHVybiBvbmx5IHRob3NlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gR2V0RGltZW5zaW9ucyhlbGVtKXtcbiAgZWxlbSA9IGVsZW0ubGVuZ3RoID8gZWxlbVswXSA6IGVsZW07XG5cbiAgaWYgKGVsZW0gPT09IHdpbmRvdyB8fCBlbGVtID09PSBkb2N1bWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkknbSBzb3JyeSwgRGF2ZS4gSSdtIGFmcmFpZCBJIGNhbid0IGRvIHRoYXQuXCIpO1xuICB9XG5cbiAgdmFyIHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgcGFyUmVjdCA9IGVsZW0ucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHdpblJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgd2luWSA9IHdpbmRvdy5wYWdlWU9mZnNldCxcbiAgICAgIHdpblggPSB3aW5kb3cucGFnZVhPZmZzZXQ7XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgIG9mZnNldDoge1xuICAgICAgdG9wOiByZWN0LnRvcCArIHdpblksXG4gICAgICBsZWZ0OiByZWN0LmxlZnQgKyB3aW5YXG4gICAgfSxcbiAgICBwYXJlbnREaW1zOiB7XG4gICAgICB3aWR0aDogcGFyUmVjdC53aWR0aCxcbiAgICAgIGhlaWdodDogcGFyUmVjdC5oZWlnaHQsXG4gICAgICBvZmZzZXQ6IHtcbiAgICAgICAgdG9wOiBwYXJSZWN0LnRvcCArIHdpblksXG4gICAgICAgIGxlZnQ6IHBhclJlY3QubGVmdCArIHdpblhcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpbmRvd0RpbXM6IHtcbiAgICAgIHdpZHRoOiB3aW5SZWN0LndpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5SZWN0LmhlaWdodCxcbiAgICAgIG9mZnNldDoge1xuICAgICAgICB0b3A6IHdpblksXG4gICAgICAgIGxlZnQ6IHdpblhcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBvZiB0b3AgYW5kIGxlZnQgaW50ZWdlciBwaXhlbCB2YWx1ZXMgZm9yIGR5bmFtaWNhbGx5IHJlbmRlcmVkIGVsZW1lbnRzLFxuICogc3VjaCBhczogVG9vbHRpcCwgUmV2ZWFsLCBhbmQgRHJvcGRvd24uIE1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbmQgd2hlcmVcbiAqIHlvdSBkb24ndCBrbm93IGFsaWdubWVudCwgYnV0IGdlbmVyYWxseSBmcm9tXG4gKiA2LjQgZm9yd2FyZCB5b3Ugc2hvdWxkIHVzZSBHZXRFeHBsaWNpdE9mZnNldHMsIGFzIEdldE9mZnNldHMgY29uZmxhdGVzIHBvc2l0aW9uIGFuZCBhbGlnbm1lbnQuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IC0galF1ZXJ5IG9iamVjdCBmb3IgdGhlIGVsZW1lbnQgYmVpbmcgcG9zaXRpb25lZC5cbiAqIEBwYXJhbSB7alF1ZXJ5fSBhbmNob3IgLSBqUXVlcnkgb2JqZWN0IGZvciB0aGUgZWxlbWVudCdzIGFuY2hvciBwb2ludC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwb3NpdGlvbiAtIGEgc3RyaW5nIHJlbGF0aW5nIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LCByZWxhdGl2ZSB0byBpdCdzIGFuY2hvclxuICogQHBhcmFtIHtOdW1iZXJ9IHZPZmZzZXQgLSBpbnRlZ2VyIHBpeGVsIHZhbHVlIG9mIGRlc2lyZWQgdmVydGljYWwgc2VwYXJhdGlvbiBiZXR3ZWVuIGFuY2hvciBhbmQgZWxlbWVudC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBoT2Zmc2V0IC0gaW50ZWdlciBwaXhlbCB2YWx1ZSBvZiBkZXNpcmVkIGhvcml6b250YWwgc2VwYXJhdGlvbiBiZXR3ZWVuIGFuY2hvciBhbmQgZWxlbWVudC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNPdmVyZmxvdyAtIGlmIGEgY29sbGlzaW9uIGV2ZW50IGlzIGRldGVjdGVkLCBzZXRzIHRvIHRydWUgdG8gZGVmYXVsdCB0aGUgZWxlbWVudCB0byBmdWxsIHdpZHRoIC0gYW55IGRlc2lyZWQgb2Zmc2V0LlxuICogVE9ETyBhbHRlci9yZXdyaXRlIHRvIHdvcmsgd2l0aCBgZW1gIHZhbHVlcyBhcyB3ZWxsL2luc3RlYWQgb2YgcGl4ZWxzXG4gKi9cbmZ1bmN0aW9uIEdldE9mZnNldHMoZWxlbWVudCwgYW5jaG9yLCBwb3NpdGlvbiwgdk9mZnNldCwgaE9mZnNldCwgaXNPdmVyZmxvdykge1xuICBjb25zb2xlLmxvZyhcIk5PVEU6IEdldE9mZnNldHMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBHZXRFeHBsaWNpdE9mZnNldHMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiA2LjVcIik7XG4gIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgcmV0dXJuIFJ0bCgpID9cbiAgICAgICAgR2V0RXhwbGljaXRPZmZzZXRzKGVsZW1lbnQsIGFuY2hvciwgJ3RvcCcsICdsZWZ0Jywgdk9mZnNldCwgaE9mZnNldCwgaXNPdmVyZmxvdykgOlxuICAgICAgICBHZXRFeHBsaWNpdE9mZnNldHMoZWxlbWVudCwgYW5jaG9yLCAndG9wJywgJ3JpZ2h0Jywgdk9mZnNldCwgaE9mZnNldCwgaXNPdmVyZmxvdyk7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIHJldHVybiBSdGwoKSA/XG4gICAgICAgIEdldEV4cGxpY2l0T2Zmc2V0cyhlbGVtZW50LCBhbmNob3IsICdib3R0b20nLCAnbGVmdCcsIHZPZmZzZXQsIGhPZmZzZXQsIGlzT3ZlcmZsb3cpIDpcbiAgICAgICAgR2V0RXhwbGljaXRPZmZzZXRzKGVsZW1lbnQsIGFuY2hvciwgJ2JvdHRvbScsICdyaWdodCcsIHZPZmZzZXQsIGhPZmZzZXQsIGlzT3ZlcmZsb3cpO1xuICAgIGNhc2UgJ2NlbnRlciB0b3AnOlxuICAgICAgcmV0dXJuIEdldEV4cGxpY2l0T2Zmc2V0cyhlbGVtZW50LCBhbmNob3IsICd0b3AnLCAnY2VudGVyJywgdk9mZnNldCwgaE9mZnNldCwgaXNPdmVyZmxvdyk7XG4gICAgY2FzZSAnY2VudGVyIGJvdHRvbSc6XG4gICAgICByZXR1cm4gR2V0RXhwbGljaXRPZmZzZXRzKGVsZW1lbnQsIGFuY2hvciwgJ2JvdHRvbScsICdjZW50ZXInLCB2T2Zmc2V0LCBoT2Zmc2V0LCBpc092ZXJmbG93KTtcbiAgICBjYXNlICdjZW50ZXIgbGVmdCc6XG4gICAgICByZXR1cm4gR2V0RXhwbGljaXRPZmZzZXRzKGVsZW1lbnQsIGFuY2hvciwgJ2xlZnQnLCAnY2VudGVyJywgdk9mZnNldCwgaE9mZnNldCwgaXNPdmVyZmxvdyk7XG4gICAgY2FzZSAnY2VudGVyIHJpZ2h0JzpcbiAgICAgIHJldHVybiBHZXRFeHBsaWNpdE9mZnNldHMoZWxlbWVudCwgYW5jaG9yLCAncmlnaHQnLCAnY2VudGVyJywgdk9mZnNldCwgaE9mZnNldCwgaXNPdmVyZmxvdyk7XG4gICAgY2FzZSAnbGVmdCBib3R0b20nOlxuICAgICAgcmV0dXJuIEdldEV4cGxpY2l0T2Zmc2V0cyhlbGVtZW50LCBhbmNob3IsICdib3R0b20nLCAnbGVmdCcsIHZPZmZzZXQsIGhPZmZzZXQsIGlzT3ZlcmZsb3cpO1xuICAgIGNhc2UgJ3JpZ2h0IGJvdHRvbSc6XG4gICAgICByZXR1cm4gR2V0RXhwbGljaXRPZmZzZXRzKGVsZW1lbnQsIGFuY2hvciwgJ2JvdHRvbScsICdyaWdodCcsIHZPZmZzZXQsIGhPZmZzZXQsIGlzT3ZlcmZsb3cpO1xuICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Li4uIHRoaXMgYWxvbmcgd2l0aCB0aGUgcmV2ZWFsIGFuZCByZXZlYWwgZnVsbFxuICAgIC8vIGNsYXNzZXMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBkaWRuJ3QgcmVmZXJlbmNlIGFuY2hvclxuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAoJGVsZURpbXMud2luZG93RGltcy5vZmZzZXQubGVmdCArICgkZWxlRGltcy53aW5kb3dEaW1zLndpZHRoIC8gMikpIC0gKCRlbGVEaW1zLndpZHRoIC8gMikgKyBoT2Zmc2V0LFxuICAgICAgICB0b3A6ICgkZWxlRGltcy53aW5kb3dEaW1zLm9mZnNldC50b3AgKyAoJGVsZURpbXMud2luZG93RGltcy5oZWlnaHQgLyAyKSkgLSAoJGVsZURpbXMuaGVpZ2h0IC8gMiArIHZPZmZzZXQpXG4gICAgICB9XG4gICAgY2FzZSAncmV2ZWFsJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICgkZWxlRGltcy53aW5kb3dEaW1zLndpZHRoIC0gJGVsZURpbXMud2lkdGgpIC8gMiArIGhPZmZzZXQsXG4gICAgICAgIHRvcDogJGVsZURpbXMud2luZG93RGltcy5vZmZzZXQudG9wICsgdk9mZnNldFxuICAgICAgfVxuICAgIGNhc2UgJ3JldmVhbCBmdWxsJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICRlbGVEaW1zLndpbmRvd0RpbXMub2Zmc2V0LmxlZnQsXG4gICAgICAgIHRvcDogJGVsZURpbXMud2luZG93RGltcy5vZmZzZXQudG9wXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogKFJ0bCgpID8gJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgLSAkZWxlRGltcy53aWR0aCArICRhbmNob3JEaW1zLndpZHRoIC0gaE9mZnNldDogJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgKyBoT2Zmc2V0KSxcbiAgICAgICAgdG9wOiAkYW5jaG9yRGltcy5vZmZzZXQudG9wICsgJGFuY2hvckRpbXMuaGVpZ2h0ICsgdk9mZnNldFxuICAgICAgfVxuXG4gIH1cblxufVxuXG5mdW5jdGlvbiBHZXRFeHBsaWNpdE9mZnNldHMoZWxlbWVudCwgYW5jaG9yLCBwb3NpdGlvbiwgYWxpZ25tZW50LCB2T2Zmc2V0LCBoT2Zmc2V0LCBpc092ZXJmbG93KSB7XG4gIHZhciAkZWxlRGltcyA9IEdldERpbWVuc2lvbnMoZWxlbWVudCksXG4gICAgICAkYW5jaG9yRGltcyA9IGFuY2hvciA/IEdldERpbWVuc2lvbnMoYW5jaG9yKSA6IG51bGw7XG5cbiAgICAgIHZhciB0b3BWYWwsIGxlZnRWYWw7XG5cbiAgLy8gc2V0IHBvc2l0aW9uIHJlbGF0ZWQgYXR0cmlidXRlXG5cbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICB0b3BWYWwgPSAkYW5jaG9yRGltcy5vZmZzZXQudG9wIC0gKCRlbGVEaW1zLmhlaWdodCArIHZPZmZzZXQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIHRvcFZhbCA9ICRhbmNob3JEaW1zLm9mZnNldC50b3AgKyAkYW5jaG9yRGltcy5oZWlnaHQgKyB2T2Zmc2V0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICBsZWZ0VmFsID0gJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgLSAoJGVsZURpbXMud2lkdGggKyBoT2Zmc2V0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGxlZnRWYWwgPSAkYW5jaG9yRGltcy5vZmZzZXQubGVmdCArICRhbmNob3JEaW1zLndpZHRoICsgaE9mZnNldDtcbiAgICAgIGJyZWFrO1xuICB9XG5cblxuICAvLyBzZXQgYWxpZ25tZW50IHJlbGF0ZWQgYXR0cmlidXRlXG4gIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0VmFsID0gJGFuY2hvckRpbXMub2Zmc2V0LmxlZnQgKyBoT2Zmc2V0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdFZhbCA9ICRhbmNob3JEaW1zLm9mZnNldC5sZWZ0IC0gJGVsZURpbXMud2lkdGggKyAkYW5jaG9yRGltcy53aWR0aCAtIGhPZmZzZXQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgbGVmdFZhbCA9IGlzT3ZlcmZsb3cgPyBoT2Zmc2V0IDogKCgkYW5jaG9yRGltcy5vZmZzZXQubGVmdCArICgkYW5jaG9yRGltcy53aWR0aCAvIDIpKSAtICgkZWxlRGltcy53aWR0aCAvIDIpKSArIGhPZmZzZXQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcFZhbCA9ICRhbmNob3JEaW1zLm9mZnNldC50b3AgLSB2T2Zmc2V0ICsgJGFuY2hvckRpbXMuaGVpZ2h0IC0gJGVsZURpbXMuaGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHRvcFZhbCA9ICRhbmNob3JEaW1zLm9mZnNldC50b3AgKyB2T2Zmc2V0XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgdG9wVmFsID0gKCRhbmNob3JEaW1zLm9mZnNldC50b3AgKyB2T2Zmc2V0ICsgKCRhbmNob3JEaW1zLmhlaWdodCAvIDIpKSAtICgkZWxlRGltcy5oZWlnaHQgLyAyKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHt0b3A6IHRvcFZhbCwgbGVmdDogbGVmdFZhbH07XG59XG5cbmV4cG9ydCB7Qm94fTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuLyoqXG4gKiBSdW5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBpbWFnZXMgYXJlIGZ1bGx5IGxvYWRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbWFnZXMgLSBJbWFnZShzKSB0byBjaGVjayBpZiBsb2FkZWQuXG4gKiBAcGFyYW0ge0Z1bmN9IGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIGltYWdlIGlzIGZ1bGx5IGxvYWRlZC5cbiAqL1xuZnVuY3Rpb24gb25JbWFnZXNMb2FkZWQoaW1hZ2VzLCBjYWxsYmFjayl7XG4gIHZhciBzZWxmID0gdGhpcyxcbiAgICAgIHVubG9hZGVkID0gaW1hZ2VzLmxlbmd0aDtcblxuICBpZiAodW5sb2FkZWQgPT09IDApIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgaW1hZ2VzLmVhY2goZnVuY3Rpb24oKXtcbiAgICAvLyBDaGVjayBpZiBpbWFnZSBpcyBsb2FkZWRcbiAgICBpZiAodGhpcy5jb21wbGV0ZSAmJiB0eXBlb2YgdGhpcy5uYXR1cmFsV2lkdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBzaW5nbGVJbWFnZUxvYWRlZCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBhYm92ZSBjaGVjayBmYWlsZWQsIHNpbXVsYXRlIGxvYWRpbmcgb24gZGV0YWNoZWQgZWxlbWVudC5cbiAgICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgLy8gU3RpbGwgY291bnQgaW1hZ2UgYXMgbG9hZGVkIGlmIGl0IGZpbmFsaXplcyB3aXRoIGFuIGVycm9yLlxuICAgICAgdmFyIGV2ZW50cyA9IFwibG9hZC56Zi5pbWFnZXMgZXJyb3IuemYuaW1hZ2VzXCI7XG4gICAgICAkKGltYWdlKS5vbmUoZXZlbnRzLCBmdW5jdGlvbiBtZShldmVudCl7XG4gICAgICAgIC8vIFVuYmluZCB0aGUgZXZlbnQgbGlzdGVuZXJzLiBXZSdyZSB1c2luZyAnb25lJyBidXQgb25seSBvbmUgb2YgdGhlIHR3byBldmVudHMgd2lsbCBoYXZlIGZpcmVkLlxuICAgICAgICAkKHRoaXMpLm9mZihldmVudHMsIG1lKTtcbiAgICAgICAgc2luZ2xlSW1hZ2VMb2FkZWQoKTtcbiAgICAgIH0pO1xuICAgICAgaW1hZ2Uuc3JjID0gJCh0aGlzKS5hdHRyKCdzcmMnKTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHNpbmdsZUltYWdlTG9hZGVkKCkge1xuICAgIHVubG9hZGVkLS07XG4gICAgaWYgKHVubG9hZGVkID09PSAwKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBvbkltYWdlc0xvYWRlZCB9O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKiBUaGlzIHV0aWwgd2FzIGNyZWF0ZWQgYnkgTWFyaXVzIE9sYmVydHogKlxuICogUGxlYXNlIHRoYW5rIE1hcml1cyBvbiBHaXRIdWIgL293bGJlcnR6ICpcbiAqIG9yIHRoZSB3ZWIgaHR0cDovL3d3dy5tYXJpdXNvbGJlcnR6LmRlLyAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgcnRsIGFzIFJ0bCB9IGZyb20gJy4vZm91bmRhdGlvbi5jb3JlLnV0aWxzJztcblxuY29uc3Qga2V5Q29kZXMgPSB7XG4gIDk6ICdUQUInLFxuICAxMzogJ0VOVEVSJyxcbiAgMjc6ICdFU0NBUEUnLFxuICAzMjogJ1NQQUNFJyxcbiAgMzU6ICdFTkQnLFxuICAzNjogJ0hPTUUnLFxuICAzNzogJ0FSUk9XX0xFRlQnLFxuICAzODogJ0FSUk9XX1VQJyxcbiAgMzk6ICdBUlJPV19SSUdIVCcsXG4gIDQwOiAnQVJST1dfRE9XTidcbn1cblxudmFyIGNvbW1hbmRzID0ge31cblxuLy8gRnVuY3Rpb25zIHB1bGxlZCBvdXQgdG8gYmUgcmVmZXJlbmNlYWJsZSBmcm9tIGludGVybmFsc1xuZnVuY3Rpb24gZmluZEZvY3VzYWJsZSgkZWxlbWVudCkge1xuICBpZighJGVsZW1lbnQpIHtyZXR1cm4gZmFsc2U7IH1cbiAgcmV0dXJuICRlbGVtZW50LmZpbmQoJ2FbaHJlZl0sIGFyZWFbaHJlZl0sIGlucHV0Om5vdChbZGlzYWJsZWRdKSwgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpZnJhbWUsIG9iamVjdCwgZW1iZWQsICpbdGFiaW5kZXhdLCAqW2NvbnRlbnRlZGl0YWJsZV0nKS5maWx0ZXIoZnVuY3Rpb24oKSB7XG4gICAgaWYgKCEkKHRoaXMpLmlzKCc6dmlzaWJsZScpIHx8ICQodGhpcykuYXR0cigndGFiaW5kZXgnKSA8IDApIHsgcmV0dXJuIGZhbHNlOyB9IC8vb25seSBoYXZlIHZpc2libGUgZWxlbWVudHMgYW5kIHRob3NlIHRoYXQgaGF2ZSBhIHRhYmluZGV4IGdyZWF0ZXIgb3IgZXF1YWwgMFxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VLZXkoZXZlbnQpIHtcbiAgdmFyIGtleSA9IGtleUNvZGVzW2V2ZW50LndoaWNoIHx8IGV2ZW50LmtleUNvZGVdIHx8IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQud2hpY2gpLnRvVXBwZXJDYXNlKCk7XG5cbiAgLy8gUmVtb3ZlIHVuLXByaW50YWJsZSBjaGFyYWN0ZXJzLCBlLmcuIGZvciBgZnJvbUNoYXJDb2RlYCBjYWxscyBmb3IgQ1RSTCBvbmx5IGV2ZW50c1xuICBrZXkgPSBrZXkucmVwbGFjZSgvXFxXKy8sICcnKTtcblxuICBpZiAoZXZlbnQuc2hpZnRLZXkpIGtleSA9IGBTSElGVF8ke2tleX1gO1xuICBpZiAoZXZlbnQuY3RybEtleSkga2V5ID0gYENUUkxfJHtrZXl9YDtcbiAgaWYgKGV2ZW50LmFsdEtleSkga2V5ID0gYEFMVF8ke2tleX1gO1xuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyB1bmRlcnNjb3JlLCBpbiBjYXNlIG9ubHkgbW9kaWZpZXJzIHdlcmUgdXNlZCAoZS5nLiBvbmx5IGBDVFJMX0FMVGApXG4gIGtleSA9IGtleS5yZXBsYWNlKC9fJC8sICcnKTtcblxuICByZXR1cm4ga2V5O1xufVxuXG52YXIgS2V5Ym9hcmQgPSB7XG4gIGtleXM6IGdldEtleUNvZGVzKGtleUNvZGVzKSxcblxuICAvKipcbiAgICogUGFyc2VzIHRoZSAoa2V5Ym9hcmQpIGV2ZW50IGFuZCByZXR1cm5zIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyBpdHMga2V5XG4gICAqIENhbiBiZSB1c2VkIGxpa2UgRm91bmRhdGlvbi5wYXJzZUtleShldmVudCkgPT09IEZvdW5kYXRpb24ua2V5cy5TUEFDRVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIHRoZSBldmVudCBnZW5lcmF0ZWQgYnkgdGhlIGV2ZW50IGhhbmRsZXJcbiAgICogQHJldHVybiBTdHJpbmcga2V5IC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUga2V5IHByZXNzZWRcbiAgICovXG4gIHBhcnNlS2V5OiBwYXJzZUtleSxcblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgZ2l2ZW4gKGtleWJvYXJkKSBldmVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIHRoZSBldmVudCBnZW5lcmF0ZWQgYnkgdGhlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvbmVudCAtIEZvdW5kYXRpb24gY29tcG9uZW50J3MgbmFtZSwgZS5nLiBTbGlkZXIgb3IgUmV2ZWFsXG4gICAqIEBwYXJhbSB7T2JqZWN0c30gZnVuY3Rpb25zIC0gY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgdGhhdCBhcmUgdG8gYmUgZXhlY3V0ZWRcbiAgICovXG4gIGhhbmRsZUtleShldmVudCwgY29tcG9uZW50LCBmdW5jdGlvbnMpIHtcbiAgICB2YXIgY29tbWFuZExpc3QgPSBjb21tYW5kc1tjb21wb25lbnRdLFxuICAgICAga2V5Q29kZSA9IHRoaXMucGFyc2VLZXkoZXZlbnQpLFxuICAgICAgY21kcyxcbiAgICAgIGNvbW1hbmQsXG4gICAgICBmbjtcblxuICAgIGlmICghY29tbWFuZExpc3QpIHJldHVybiBjb25zb2xlLndhcm4oJ0NvbXBvbmVudCBub3QgZGVmaW5lZCEnKTtcblxuICAgIGlmICh0eXBlb2YgY29tbWFuZExpc3QubHRyID09PSAndW5kZWZpbmVkJykgeyAvLyB0aGlzIGNvbXBvbmVudCBkb2VzIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbHRyIGFuZCBydGxcbiAgICAgICAgY21kcyA9IGNvbW1hbmRMaXN0OyAvLyB1c2UgcGxhaW4gbGlzdFxuICAgIH0gZWxzZSB7IC8vIG1lcmdlIGx0ciBhbmQgcnRsOiBpZiBkb2N1bWVudCBpcyBydGwsIHJ0bCBvdmVyd3JpdGVzIGx0ciBhbmQgdmljZSB2ZXJzYVxuICAgICAgICBpZiAoUnRsKCkpIGNtZHMgPSAkLmV4dGVuZCh7fSwgY29tbWFuZExpc3QubHRyLCBjb21tYW5kTGlzdC5ydGwpO1xuXG4gICAgICAgIGVsc2UgY21kcyA9ICQuZXh0ZW5kKHt9LCBjb21tYW5kTGlzdC5ydGwsIGNvbW1hbmRMaXN0Lmx0cik7XG4gICAgfVxuICAgIGNvbW1hbmQgPSBjbWRzW2tleUNvZGVdO1xuXG4gICAgZm4gPSBmdW5jdGlvbnNbY29tbWFuZF07XG4gICAgaWYgKGZuICYmIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBleGVjdXRlIGZ1bmN0aW9uICBpZiBleGlzdHNcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGZuLmFwcGx5KCk7XG4gICAgICBpZiAoZnVuY3Rpb25zLmhhbmRsZWQgfHwgdHlwZW9mIGZ1bmN0aW9ucy5oYW5kbGVkID09PSAnZnVuY3Rpb24nKSB7IC8vIGV4ZWN1dGUgZnVuY3Rpb24gd2hlbiBldmVudCB3YXMgaGFuZGxlZFxuICAgICAgICAgIGZ1bmN0aW9ucy5oYW5kbGVkKHJldHVyblZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZ1bmN0aW9ucy51bmhhbmRsZWQgfHwgdHlwZW9mIGZ1bmN0aW9ucy51bmhhbmRsZWQgPT09ICdmdW5jdGlvbicpIHsgLy8gZXhlY3V0ZSBmdW5jdGlvbiB3aGVuIGV2ZW50IHdhcyBub3QgaGFuZGxlZFxuICAgICAgICAgIGZ1bmN0aW9ucy51bmhhbmRsZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBmb2N1c2FibGUgZWxlbWVudHMgd2l0aGluIHRoZSBnaXZlbiBgJGVsZW1lbnRgXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWxlbWVudCAtIGpRdWVyeSBvYmplY3QgdG8gc2VhcmNoIHdpdGhpblxuICAgKiBAcmV0dXJuIHtqUXVlcnl9ICRmb2N1c2FibGUgLSBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzIHdpdGhpbiBgJGVsZW1lbnRgXG4gICAqL1xuXG4gIGZpbmRGb2N1c2FibGU6IGZpbmRGb2N1c2FibGUsXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBuYW1lIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbXBvbmVudCAtIEZvdW5kYXRpb24gY29tcG9uZW50LCBlLmcuIFNsaWRlciBvciBSZXZlYWxcbiAgICogQHJldHVybiBTdHJpbmcgY29tcG9uZW50TmFtZVxuICAgKi9cblxuICByZWdpc3Rlcihjb21wb25lbnROYW1lLCBjbWRzKSB7XG4gICAgY29tbWFuZHNbY29tcG9uZW50TmFtZV0gPSBjbWRzO1xuICB9LFxuXG5cbiAgLy8gVE9ETzk0Mzg6IFRoZXNlIHJlZmVyZW5jZXMgdG8gS2V5Ym9hcmQgbmVlZCB0byBub3QgcmVxdWlyZSBnbG9iYWwuIFdpbGwgJ3RoaXMnIHdvcmsgaW4gdGhpcyBjb250ZXh0P1xuICAvL1xuICAvKipcbiAgICogVHJhcHMgdGhlIGZvY3VzIGluIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtqUXVlcnl9ICRlbGVtZW50ICBqUXVlcnkgb2JqZWN0IHRvIHRyYXAgdGhlIGZvdWNzIGludG8uXG4gICAqL1xuICB0cmFwRm9jdXMoJGVsZW1lbnQpIHtcbiAgICB2YXIgJGZvY3VzYWJsZSA9IGZpbmRGb2N1c2FibGUoJGVsZW1lbnQpLFxuICAgICAgICAkZmlyc3RGb2N1c2FibGUgPSAkZm9jdXNhYmxlLmVxKDApLFxuICAgICAgICAkbGFzdEZvY3VzYWJsZSA9ICRmb2N1c2FibGUuZXEoLTEpO1xuXG4gICAgJGVsZW1lbnQub24oJ2tleWRvd24uemYudHJhcGZvY3VzJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09ICRsYXN0Rm9jdXNhYmxlWzBdICYmIHBhcnNlS2V5KGV2ZW50KSA9PT0gJ1RBQicpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJGZpcnN0Rm9jdXNhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChldmVudC50YXJnZXQgPT09ICRmaXJzdEZvY3VzYWJsZVswXSAmJiBwYXJzZUtleShldmVudCkgPT09ICdTSElGVF9UQUInKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICRsYXN0Rm9jdXNhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgdHJhcHBlZCBmb2N1cyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtqUXVlcnl9ICRlbGVtZW50ICBqUXVlcnkgb2JqZWN0IHRvIHJlbGVhc2UgdGhlIGZvY3VzIGZvci5cbiAgICovXG4gIHJlbGVhc2VGb2N1cygkZWxlbWVudCkge1xuICAgICRlbGVtZW50Lm9mZigna2V5ZG93bi56Zi50cmFwZm9jdXMnKTtcbiAgfVxufVxuXG4vKlxuICogQ29uc3RhbnRzIGZvciBlYXNpZXIgY29tcGFyaW5nLlxuICogQ2FuIGJlIHVzZWQgbGlrZSBGb3VuZGF0aW9uLnBhcnNlS2V5KGV2ZW50KSA9PT0gRm91bmRhdGlvbi5rZXlzLlNQQUNFXG4gKi9cbmZ1bmN0aW9uIGdldEtleUNvZGVzKGtjcykge1xuICB2YXIgayA9IHt9O1xuICBmb3IgKHZhciBrYyBpbiBrY3MpIGtba2NzW2tjXV0gPSBrY3Nba2NdO1xuICByZXR1cm4gaztcbn1cblxuZXhwb3J0IHtLZXlib2FyZH07XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbi8vIERlZmF1bHQgc2V0IG9mIG1lZGlhIHF1ZXJpZXNcbmNvbnN0IGRlZmF1bHRRdWVyaWVzID0ge1xuICAnZGVmYXVsdCcgOiAnb25seSBzY3JlZW4nLFxuICBsYW5kc2NhcGUgOiAnb25seSBzY3JlZW4gYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKScsXG4gIHBvcnRyYWl0IDogJ29ubHkgc2NyZWVuIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KScsXG4gIHJldGluYSA6ICdvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksJyArXG4gICAgJ29ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwnICtcbiAgICAnb25seSBzY3JlZW4gYW5kICgtby1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyLzEpLCcgK1xuICAgICdvbmx5IHNjcmVlbiBhbmQgKG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLCcgK1xuICAgICdvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpLCcgK1xuICAgICdvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAyZHBweCknXG4gIH07XG5cblxuLy8gbWF0Y2hNZWRpYSgpIHBvbHlmaWxsIC0gVGVzdCBhIENTUyBtZWRpYSB0eXBlL3F1ZXJ5IGluIEpTLlxuLy8gQXV0aG9ycyAmIGNvcHlyaWdodChjKSAyMDEyOiBTY290dCBKZWhsLCBQYXVsIElyaXNoLCBOaWNob2xhcyBaYWthcywgRGF2aWQgS25pZ2h0LiBNSVQgbGljZW5zZVxuLyogZXNsaW50LWRpc2FibGUgKi9cbndpbmRvdy5tYXRjaE1lZGlhIHx8ICh3aW5kb3cubWF0Y2hNZWRpYSA9IChmdW5jdGlvbiAoKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIC8vIEZvciBicm93c2VycyB0aGF0IHN1cHBvcnQgbWF0Y2hNZWRpdW0gYXBpIHN1Y2ggYXMgSUUgOSBhbmQgd2Via2l0XG4gIHZhciBzdHlsZU1lZGlhID0gKHdpbmRvdy5zdHlsZU1lZGlhIHx8IHdpbmRvdy5tZWRpYSk7XG5cbiAgLy8gRm9yIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtYXRjaE1lZGl1bVxuICBpZiAoIXN0eWxlTWVkaWEpIHtcbiAgICB2YXIgc3R5bGUgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyksXG4gICAgc2NyaXB0ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF0sXG4gICAgaW5mbyAgICAgICAgPSBudWxsO1xuXG4gICAgc3R5bGUudHlwZSAgPSAndGV4dC9jc3MnO1xuICAgIHN0eWxlLmlkICAgID0gJ21hdGNobWVkaWFqcy10ZXN0JztcblxuICAgIGlmICghc2NyaXB0KSB7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHN0eWxlLCBzY3JpcHQpO1xuICAgIH1cblxuICAgIC8vICdzdHlsZS5jdXJyZW50U3R5bGUnIGlzIHVzZWQgYnkgSUUgPD0gOCBhbmQgJ3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlJyBmb3IgYWxsIG90aGVyIGJyb3dzZXJzXG4gICAgaW5mbyA9ICgnZ2V0Q29tcHV0ZWRTdHlsZScgaW4gd2luZG93KSAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzdHlsZSwgbnVsbCkgfHwgc3R5bGUuY3VycmVudFN0eWxlO1xuXG4gICAgc3R5bGVNZWRpYSA9IHtcbiAgICAgIG1hdGNoTWVkaXVtOiBmdW5jdGlvbiAobWVkaWEpIHtcbiAgICAgICAgdmFyIHRleHQgPSAnQG1lZGlhICcgKyBtZWRpYSArICd7ICNtYXRjaG1lZGlhanMtdGVzdCB7IHdpZHRoOiAxcHg7IH0gfSc7XG5cbiAgICAgICAgLy8gJ3N0eWxlLnN0eWxlU2hlZXQnIGlzIHVzZWQgYnkgSUUgPD0gOCBhbmQgJ3N0eWxlLnRleHRDb250ZW50JyBmb3IgYWxsIG90aGVyIGJyb3dzZXJzXG4gICAgICAgIGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gdGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUZXN0IGlmIG1lZGlhIHF1ZXJ5IGlzIHRydWUgb3IgZmFsc2VcbiAgICAgICAgcmV0dXJuIGluZm8ud2lkdGggPT09ICcxcHgnO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24obWVkaWEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWF0Y2hlczogc3R5bGVNZWRpYS5tYXRjaE1lZGl1bShtZWRpYSB8fCAnYWxsJyksXG4gICAgICBtZWRpYTogbWVkaWEgfHwgJ2FsbCdcbiAgICB9O1xuICB9O1xufSkoKSk7XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbnZhciBNZWRpYVF1ZXJ5ID0ge1xuICBxdWVyaWVzOiBbXSxcblxuICBjdXJyZW50OiAnJyxcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIG1lZGlhIHF1ZXJ5IGhlbHBlciwgYnkgZXh0cmFjdGluZyB0aGUgYnJlYWtwb2ludCBsaXN0IGZyb20gdGhlIENTUyBhbmQgYWN0aXZhdGluZyB0aGUgYnJlYWtwb2ludCB3YXRjaGVyLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0KCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgJG1ldGEgPSAkKCdtZXRhLmZvdW5kYXRpb24tbXEnKTtcbiAgICBpZighJG1ldGEubGVuZ3RoKXtcbiAgICAgICQoJzxtZXRhIGNsYXNzPVwiZm91bmRhdGlvbi1tcVwiPicpLmFwcGVuZFRvKGRvY3VtZW50LmhlYWQpO1xuICAgIH1cblxuICAgIHZhciBleHRyYWN0ZWRTdHlsZXMgPSAkKCcuZm91bmRhdGlvbi1tcScpLmNzcygnZm9udC1mYW1pbHknKTtcbiAgICB2YXIgbmFtZWRRdWVyaWVzO1xuXG4gICAgbmFtZWRRdWVyaWVzID0gcGFyc2VTdHlsZVRvT2JqZWN0KGV4dHJhY3RlZFN0eWxlcyk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gbmFtZWRRdWVyaWVzKSB7XG4gICAgICBpZihuYW1lZFF1ZXJpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBzZWxmLnF1ZXJpZXMucHVzaCh7XG4gICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgIHZhbHVlOiBgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICR7bmFtZWRRdWVyaWVzW2tleV19KWBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5fZ2V0Q3VycmVudFNpemUoKTtcblxuICAgIHRoaXMuX3dhdGNoZXIoKTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzY3JlZW4gaXMgYXQgbGVhc3QgYXMgd2lkZSBhcyBhIGJyZWFrcG9pbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2l6ZSAtIE5hbWUgb2YgdGhlIGJyZWFrcG9pbnQgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGJyZWFrcG9pbnQgbWF0Y2hlcywgYGZhbHNlYCBpZiBpdCdzIHNtYWxsZXIuXG4gICAqL1xuICBhdExlYXN0KHNpemUpIHtcbiAgICB2YXIgcXVlcnkgPSB0aGlzLmdldChzaXplKTtcblxuICAgIGlmIChxdWVyeSkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKHF1ZXJ5KS5tYXRjaGVzO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzY3JlZW4gbWF0Y2hlcyB0byBhIGJyZWFrcG9pbnQuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2l6ZSAtIE5hbWUgb2YgdGhlIGJyZWFrcG9pbnQgdG8gY2hlY2ssIGVpdGhlciAnc21hbGwgb25seScgb3IgJ3NtYWxsJy4gT21pdHRpbmcgJ29ubHknIGZhbGxzIGJhY2sgdG8gdXNpbmcgYXRMZWFzdCgpIG1ldGhvZC5cbiAgICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYnJlYWtwb2ludCBtYXRjaGVzLCBgZmFsc2VgIGlmIGl0IGRvZXMgbm90LlxuICAgKi9cbiAgaXMoc2l6ZSkge1xuICAgIHNpemUgPSBzaXplLnRyaW0oKS5zcGxpdCgnICcpO1xuICAgIGlmKHNpemUubGVuZ3RoID4gMSAmJiBzaXplWzFdID09PSAnb25seScpIHtcbiAgICAgIGlmKHNpemVbMF0gPT09IHRoaXMuX2dldEN1cnJlbnRTaXplKCkpIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5hdExlYXN0KHNpemVbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1lZGlhIHF1ZXJ5IG9mIGEgYnJlYWtwb2ludC5cbiAgICogQGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzaXplIC0gTmFtZSBvZiB0aGUgYnJlYWtwb2ludCB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtTdHJpbmd8bnVsbH0gLSBUaGUgbWVkaWEgcXVlcnkgb2YgdGhlIGJyZWFrcG9pbnQsIG9yIGBudWxsYCBpZiB0aGUgYnJlYWtwb2ludCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cbiAgZ2V0KHNpemUpIHtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMucXVlcmllcykge1xuICAgICAgaWYodGhpcy5xdWVyaWVzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIHZhciBxdWVyeSA9IHRoaXMucXVlcmllc1tpXTtcbiAgICAgICAgaWYgKHNpemUgPT09IHF1ZXJ5Lm5hbWUpIHJldHVybiBxdWVyeS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBicmVha3BvaW50IG5hbWUgYnkgdGVzdGluZyBldmVyeSBicmVha3BvaW50IGFuZCByZXR1cm5pbmcgdGhlIGxhc3Qgb25lIHRvIG1hdGNoICh0aGUgYmlnZ2VzdCBvbmUpLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge1N0cmluZ30gTmFtZSBvZiB0aGUgY3VycmVudCBicmVha3BvaW50LlxuICAgKi9cbiAgX2dldEN1cnJlbnRTaXplKCkge1xuICAgIHZhciBtYXRjaGVkO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVyeSA9IHRoaXMucXVlcmllc1tpXTtcblxuICAgICAgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKHF1ZXJ5LnZhbHVlKS5tYXRjaGVzKSB7XG4gICAgICAgIG1hdGNoZWQgPSBxdWVyeTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1hdGNoZWQgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlZC5uYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWF0Y2hlZDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyB0aGUgYnJlYWtwb2ludCB3YXRjaGVyLCB3aGljaCBmaXJlcyBhbiBldmVudCBvbiB0aGUgd2luZG93IHdoZW5ldmVyIHRoZSBicmVha3BvaW50IGNoYW5nZXMuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dhdGNoZXIoKSB7XG4gICAgJCh3aW5kb3cpLm9mZigncmVzaXplLnpmLm1lZGlhcXVlcnknKS5vbigncmVzaXplLnpmLm1lZGlhcXVlcnknLCAoKSA9PiB7XG4gICAgICB2YXIgbmV3U2l6ZSA9IHRoaXMuX2dldEN1cnJlbnRTaXplKCksIGN1cnJlbnRTaXplID0gdGhpcy5jdXJyZW50O1xuXG4gICAgICBpZiAobmV3U2l6ZSAhPT0gY3VycmVudFNpemUpIHtcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBjdXJyZW50IG1lZGlhIHF1ZXJ5XG4gICAgICAgIHRoaXMuY3VycmVudCA9IG5ld1NpemU7XG5cbiAgICAgICAgLy8gQnJvYWRjYXN0IHRoZSBtZWRpYSBxdWVyeSBjaGFuZ2Ugb24gdGhlIHdpbmRvd1xuICAgICAgICAkKHdpbmRvdykudHJpZ2dlcignY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5JywgW25ld1NpemUsIGN1cnJlbnRTaXplXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5cblxuXG4vLyBUaGFuayB5b3U6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcXVlcnktc3RyaW5nXG5mdW5jdGlvbiBwYXJzZVN0eWxlVG9PYmplY3Qoc3RyKSB7XG4gIHZhciBzdHlsZU9iamVjdCA9IHt9O1xuXG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHlsZU9iamVjdDtcbiAgfVxuXG4gIHN0ciA9IHN0ci50cmltKCkuc2xpY2UoMSwgLTEpOyAvLyBicm93c2VycyByZS1xdW90ZSBzdHJpbmcgc3R5bGUgdmFsdWVzXG5cbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gc3R5bGVPYmplY3Q7XG4gIH1cblxuICBzdHlsZU9iamVjdCA9IHN0ci5zcGxpdCgnJicpLnJlZHVjZShmdW5jdGlvbihyZXQsIHBhcmFtKSB7XG4gICAgdmFyIHBhcnRzID0gcGFyYW0ucmVwbGFjZSgvXFwrL2csICcgJykuc3BsaXQoJz0nKTtcbiAgICB2YXIga2V5ID0gcGFydHNbMF07XG4gICAgdmFyIHZhbCA9IHBhcnRzWzFdO1xuICAgIGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXkpO1xuXG4gICAgLy8gbWlzc2luZyBgPWAgc2hvdWxkIGJlIGBudWxsYDpcbiAgICAvLyBodHRwOi8vdzMub3JnL1RSLzIwMTIvV0QtdXJsLTIwMTIwNTI0LyNjb2xsZWN0LXVybC1wYXJhbWV0ZXJzXG4gICAgdmFsID0gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHZhbCk7XG5cbiAgICBpZiAoIXJldC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXRba2V5XSA9IHZhbDtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmV0W2tleV0pKSB7XG4gICAgICByZXRba2V5XS5wdXNoKHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldFtrZXldID0gW3JldFtrZXldLCB2YWxdO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIHN0eWxlT2JqZWN0O1xufVxuXG5leHBvcnQge01lZGlhUXVlcnl9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgdHJhbnNpdGlvbmVuZCB9IGZyb20gJy4vZm91bmRhdGlvbi5jb3JlLnV0aWxzJztcblxuLyoqXG4gKiBNb3Rpb24gbW9kdWxlLlxuICogQG1vZHVsZSBmb3VuZGF0aW9uLm1vdGlvblxuICovXG5cbmNvbnN0IGluaXRDbGFzc2VzICAgPSBbJ211aS1lbnRlcicsICdtdWktbGVhdmUnXTtcbmNvbnN0IGFjdGl2ZUNsYXNzZXMgPSBbJ211aS1lbnRlci1hY3RpdmUnLCAnbXVpLWxlYXZlLWFjdGl2ZSddO1xuXG5jb25zdCBNb3Rpb24gPSB7XG4gIGFuaW1hdGVJbjogZnVuY3Rpb24oZWxlbWVudCwgYW5pbWF0aW9uLCBjYikge1xuICAgIGFuaW1hdGUodHJ1ZSwgZWxlbWVudCwgYW5pbWF0aW9uLCBjYik7XG4gIH0sXG5cbiAgYW5pbWF0ZU91dDogZnVuY3Rpb24oZWxlbWVudCwgYW5pbWF0aW9uLCBjYikge1xuICAgIGFuaW1hdGUoZmFsc2UsIGVsZW1lbnQsIGFuaW1hdGlvbiwgY2IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIE1vdmUoZHVyYXRpb24sIGVsZW0sIGZuKXtcbiAgdmFyIGFuaW0sIHByb2csIHN0YXJ0ID0gbnVsbDtcbiAgLy8gY29uc29sZS5sb2coJ2NhbGxlZCcpO1xuXG4gIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgIGZuLmFwcGx5KGVsZW0pO1xuICAgIGVsZW0udHJpZ2dlcignZmluaXNoZWQuemYuYW5pbWF0ZScsIFtlbGVtXSkudHJpZ2dlckhhbmRsZXIoJ2ZpbmlzaGVkLnpmLmFuaW1hdGUnLCBbZWxlbV0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmUodHMpe1xuICAgIGlmKCFzdGFydCkgc3RhcnQgPSB0cztcbiAgICAvLyBjb25zb2xlLmxvZyhzdGFydCwgdHMpO1xuICAgIHByb2cgPSB0cyAtIHN0YXJ0O1xuICAgIGZuLmFwcGx5KGVsZW0pO1xuXG4gICAgaWYocHJvZyA8IGR1cmF0aW9uKXsgYW5pbSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobW92ZSwgZWxlbSk7IH1cbiAgICBlbHNle1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGFuaW0pO1xuICAgICAgZWxlbS50cmlnZ2VyKCdmaW5pc2hlZC56Zi5hbmltYXRlJywgW2VsZW1dKS50cmlnZ2VySGFuZGxlcignZmluaXNoZWQuemYuYW5pbWF0ZScsIFtlbGVtXSk7XG4gICAgfVxuICB9XG4gIGFuaW0gPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG1vdmUpO1xufVxuXG4vKipcbiAqIEFuaW1hdGVzIGFuIGVsZW1lbnQgaW4gb3Igb3V0IHVzaW5nIGEgQ1NTIHRyYW5zaXRpb24gY2xhc3MuXG4gKiBAZnVuY3Rpb25cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzSW4gLSBEZWZpbmVzIGlmIHRoZSBhbmltYXRpb24gaXMgaW4gb3Igb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgLSBqUXVlcnkgb3IgSFRNTCBvYmplY3QgdG8gYW5pbWF0ZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBhbmltYXRpb24gLSBDU1MgY2xhc3MgdG8gdXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgLSBDYWxsYmFjayB0byBydW4gd2hlbiBhbmltYXRpb24gaXMgZmluaXNoZWQuXG4gKi9cbmZ1bmN0aW9uIGFuaW1hdGUoaXNJbiwgZWxlbWVudCwgYW5pbWF0aW9uLCBjYikge1xuICBlbGVtZW50ID0gJChlbGVtZW50KS5lcSgwKTtcblxuICBpZiAoIWVsZW1lbnQubGVuZ3RoKSByZXR1cm47XG5cbiAgdmFyIGluaXRDbGFzcyA9IGlzSW4gPyBpbml0Q2xhc3Nlc1swXSA6IGluaXRDbGFzc2VzWzFdO1xuICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0luID8gYWN0aXZlQ2xhc3Nlc1swXSA6IGFjdGl2ZUNsYXNzZXNbMV07XG5cbiAgLy8gU2V0IHVwIHRoZSBhbmltYXRpb25cbiAgcmVzZXQoKTtcblxuICBlbGVtZW50XG4gICAgLmFkZENsYXNzKGFuaW1hdGlvbilcbiAgICAuY3NzKCd0cmFuc2l0aW9uJywgJ25vbmUnKTtcblxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgIGVsZW1lbnQuYWRkQ2xhc3MoaW5pdENsYXNzKTtcbiAgICBpZiAoaXNJbikgZWxlbWVudC5zaG93KCk7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IHRoZSBhbmltYXRpb25cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICBlbGVtZW50WzBdLm9mZnNldFdpZHRoO1xuICAgIGVsZW1lbnRcbiAgICAgIC5jc3MoJ3RyYW5zaXRpb24nLCAnJylcbiAgICAgIC5hZGRDbGFzcyhhY3RpdmVDbGFzcyk7XG4gIH0pO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBhbmltYXRpb24gd2hlbiBpdCBmaW5pc2hlc1xuICBlbGVtZW50Lm9uZSh0cmFuc2l0aW9uZW5kKGVsZW1lbnQpLCBmaW5pc2gpO1xuXG4gIC8vIEhpZGVzIHRoZSBlbGVtZW50IChmb3Igb3V0IGFuaW1hdGlvbnMpLCByZXNldHMgdGhlIGVsZW1lbnQsIGFuZCBydW5zIGEgY2FsbGJhY2tcbiAgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgIGlmICghaXNJbikgZWxlbWVudC5oaWRlKCk7XG4gICAgcmVzZXQoKTtcbiAgICBpZiAoY2IpIGNiLmFwcGx5KGVsZW1lbnQpO1xuICB9XG5cbiAgLy8gUmVzZXRzIHRyYW5zaXRpb25zIGFuZCByZW1vdmVzIG1vdGlvbi1zcGVjaWZpYyBjbGFzc2VzXG4gIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGVsZW1lbnRbMF0uc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gMDtcbiAgICBlbGVtZW50LnJlbW92ZUNsYXNzKGAke2luaXRDbGFzc30gJHthY3RpdmVDbGFzc30gJHthbmltYXRpb259YCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTW92ZSwgTW90aW9uIH07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuY29uc3QgTmVzdCA9IHtcbiAgRmVhdGhlcihtZW51LCB0eXBlID0gJ3pmJykge1xuICAgIG1lbnUuYXR0cigncm9sZScsICdtZW51YmFyJyk7XG5cbiAgICB2YXIgaXRlbXMgPSBtZW51LmZpbmQoJ2xpJykuYXR0cih7J3JvbGUnOiAnbWVudWl0ZW0nfSksXG4gICAgICAgIHN1Yk1lbnVDbGFzcyA9IGBpcy0ke3R5cGV9LXN1Ym1lbnVgLFxuICAgICAgICBzdWJJdGVtQ2xhc3MgPSBgJHtzdWJNZW51Q2xhc3N9LWl0ZW1gLFxuICAgICAgICBoYXNTdWJDbGFzcyA9IGBpcy0ke3R5cGV9LXN1Ym1lbnUtcGFyZW50YCxcbiAgICAgICAgYXBwbHlBcmlhID0gKHR5cGUgIT09ICdhY2NvcmRpb24nKTsgLy8gQWNjb3JkaW9ucyBoYW5kbGUgdGhlaXIgb3duIEFSSUEgYXR0cml1dGVzLlxuXG4gICAgaXRlbXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciAkaXRlbSA9ICQodGhpcyksXG4gICAgICAgICAgJHN1YiA9ICRpdGVtLmNoaWxkcmVuKCd1bCcpO1xuXG4gICAgICBpZiAoJHN1Yi5sZW5ndGgpIHtcbiAgICAgICAgJGl0ZW0uYWRkQ2xhc3MoaGFzU3ViQ2xhc3MpO1xuICAgICAgICAkc3ViLmFkZENsYXNzKGBzdWJtZW51ICR7c3ViTWVudUNsYXNzfWApLmF0dHIoeydkYXRhLXN1Ym1lbnUnOiAnJ30pO1xuICAgICAgICBpZihhcHBseUFyaWEpIHtcbiAgICAgICAgICAkaXRlbS5hdHRyKHtcbiAgICAgICAgICAgICdhcmlhLWhhc3BvcHVwJzogdHJ1ZSxcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJzogJGl0ZW0uY2hpbGRyZW4oJ2E6Zmlyc3QnKS50ZXh0KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBOb3RlOiAgRHJpbGxkb3ducyBiZWhhdmUgZGlmZmVyZW50bHkgaW4gaG93IHRoZXkgaGlkZSwgYW5kIHNvIG5lZWRcbiAgICAgICAgICAvLyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMuICBXZSBzaG91bGQgbG9vayBpZiB0aGlzIHBvc3NpYmx5IG92ZXItZ2VuZXJhbGl6ZWRcbiAgICAgICAgICAvLyB1dGlsaXR5IChOZXN0KSBpcyBhcHByb3ByaWF0ZSB3aGVuIHdlIHJld29yayBtZW51cyBpbiA2LjRcbiAgICAgICAgICBpZih0eXBlID09PSAnZHJpbGxkb3duJykge1xuICAgICAgICAgICAgJGl0ZW0uYXR0cih7J2FyaWEtZXhwYW5kZWQnOiBmYWxzZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAkc3ViXG4gICAgICAgICAgLmFkZENsYXNzKGBzdWJtZW51ICR7c3ViTWVudUNsYXNzfWApXG4gICAgICAgICAgLmF0dHIoe1xuICAgICAgICAgICAgJ2RhdGEtc3VibWVudSc6ICcnLFxuICAgICAgICAgICAgJ3JvbGUnOiAnbWVudWJhcidcbiAgICAgICAgICB9KTtcbiAgICAgICAgaWYodHlwZSA9PT0gJ2RyaWxsZG93bicpIHtcbiAgICAgICAgICAkc3ViLmF0dHIoeydhcmlhLWhpZGRlbic6IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoJGl0ZW0ucGFyZW50KCdbZGF0YS1zdWJtZW51XScpLmxlbmd0aCkge1xuICAgICAgICAkaXRlbS5hZGRDbGFzcyhgaXMtc3VibWVudS1pdGVtICR7c3ViSXRlbUNsYXNzfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIEJ1cm4obWVudSwgdHlwZSkge1xuICAgIHZhciAvL2l0ZW1zID0gbWVudS5maW5kKCdsaScpLFxuICAgICAgICBzdWJNZW51Q2xhc3MgPSBgaXMtJHt0eXBlfS1zdWJtZW51YCxcbiAgICAgICAgc3ViSXRlbUNsYXNzID0gYCR7c3ViTWVudUNsYXNzfS1pdGVtYCxcbiAgICAgICAgaGFzU3ViQ2xhc3MgPSBgaXMtJHt0eXBlfS1zdWJtZW51LXBhcmVudGA7XG5cbiAgICBtZW51XG4gICAgICAuZmluZCgnPmxpLCA+IGxpID4gdWwsIC5tZW51LCAubWVudSA+IGxpLCBbZGF0YS1zdWJtZW51XSA+IGxpJylcbiAgICAgIC5yZW1vdmVDbGFzcyhgJHtzdWJNZW51Q2xhc3N9ICR7c3ViSXRlbUNsYXNzfSAke2hhc1N1YkNsYXNzfSBpcy1zdWJtZW51LWl0ZW0gc3VibWVudSBpcy1hY3RpdmVgKVxuICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtc3VibWVudScpLmNzcygnZGlzcGxheScsICcnKTtcblxuICB9XG59XG5cbmV4cG9ydCB7TmVzdH07XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmZ1bmN0aW9uIFRpbWVyKGVsZW0sIG9wdGlvbnMsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICBkdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24sLy9vcHRpb25zIGlzIGFuIG9iamVjdCBmb3IgZWFzaWx5IGFkZGluZyBmZWF0dXJlcyBsYXRlci5cbiAgICAgIG5hbWVTcGFjZSA9IE9iamVjdC5rZXlzKGVsZW0uZGF0YSgpKVswXSB8fCAndGltZXInLFxuICAgICAgcmVtYWluID0gLTEsXG4gICAgICBzdGFydCxcbiAgICAgIHRpbWVyO1xuXG4gIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcblxuICB0aGlzLnJlc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICByZW1haW4gPSAtMTtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIHRoaXMuc3RhcnQoKTtcbiAgfVxuXG4gIHRoaXMuc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG4gICAgLy8gaWYoIWVsZW0uZGF0YSgncGF1c2VkJykpeyByZXR1cm4gZmFsc2U7IH0vL21heWJlIGltcGxlbWVudCB0aGlzIHNhbml0eSBjaGVjayBpZiB1c2VkIGZvciBvdGhlciB0aGluZ3MuXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICByZW1haW4gPSByZW1haW4gPD0gMCA/IGR1cmF0aW9uIDogcmVtYWluO1xuICAgIGVsZW0uZGF0YSgncGF1c2VkJywgZmFsc2UpO1xuICAgIHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIGlmKG9wdGlvbnMuaW5maW5pdGUpe1xuICAgICAgICBfdGhpcy5yZXN0YXJ0KCk7Ly9yZXJ1biB0aGUgdGltZXIuXG4gICAgICB9XG4gICAgICBpZiAoY2IgJiYgdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7IGNiKCk7IH1cbiAgICB9LCByZW1haW4pO1xuICAgIGVsZW0udHJpZ2dlcihgdGltZXJzdGFydC56Zi4ke25hbWVTcGFjZX1gKTtcbiAgfVxuXG4gIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcbiAgICAvL2lmKGVsZW0uZGF0YSgncGF1c2VkJykpeyByZXR1cm4gZmFsc2U7IH0vL21heWJlIGltcGxlbWVudCB0aGlzIHNhbml0eSBjaGVjayBpZiB1c2VkIGZvciBvdGhlciB0aGluZ3MuXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICBlbGVtLmRhdGEoJ3BhdXNlZCcsIHRydWUpO1xuICAgIHZhciBlbmQgPSBEYXRlLm5vdygpO1xuICAgIHJlbWFpbiA9IHJlbWFpbiAtIChlbmQgLSBzdGFydCk7XG4gICAgZWxlbS50cmlnZ2VyKGB0aW1lcnBhdXNlZC56Zi4ke25hbWVTcGFjZX1gKTtcbiAgfVxufVxuXG5leHBvcnQge1RpbWVyfTtcbiIsIi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vKipXb3JrIGluc3BpcmVkIGJ5IG11bHRpcGxlIGpxdWVyeSBzd2lwZSBwbHVnaW5zKipcbi8vKipEb25lIGJ5IFlvaGFpIEFyYXJhdCAqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxudmFyIFRvdWNoID0ge307XG5cbnZhciBzdGFydFBvc1gsXG4gICAgc3RhcnRQb3NZLFxuICAgIHN0YXJ0VGltZSxcbiAgICBlbGFwc2VkVGltZSxcbiAgICBzdGFydEV2ZW50LFxuICAgIGlzTW92aW5nID0gZmFsc2UsXG4gICAgZGlkTW92ZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gb25Ub3VjaEVuZChlKSB7XG4gIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUpO1xuICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG5cbiAgLy8gSWYgdGhlIHRvdWNoIGRpZCBub3QgbW92ZSwgY29uc2lkZXIgaXQgYXMgYSBcInRhcFwiXG4gIGlmICghZGlkTW92ZWQpIHtcbiAgICB2YXIgdGFwRXZlbnQgPSAkLkV2ZW50KCd0YXAnLCBzdGFydEV2ZW50IHx8IGUpO1xuICAgICQodGhpcykudHJpZ2dlcih0YXBFdmVudCk7XG4gIH1cblxuICBzdGFydEV2ZW50ID0gbnVsbDtcbiAgaXNNb3ZpbmcgPSBmYWxzZTtcbiAgZGlkTW92ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb25Ub3VjaE1vdmUoZSkge1xuICBpZiAoJC5zcG90U3dpcGUucHJldmVudERlZmF1bHQpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XG5cbiAgaWYoaXNNb3ZpbmcpIHtcbiAgICB2YXIgeCA9IGUudG91Y2hlc1swXS5wYWdlWDtcbiAgICB2YXIgeSA9IGUudG91Y2hlc1swXS5wYWdlWTtcbiAgICB2YXIgZHggPSBzdGFydFBvc1ggLSB4O1xuICAgIHZhciBkeSA9IHN0YXJ0UG9zWSAtIHk7XG4gICAgdmFyIGRpcjtcbiAgICBkaWRNb3ZlZCA9IHRydWU7XG4gICAgZWxhcHNlZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0VGltZTtcbiAgICBpZihNYXRoLmFicyhkeCkgPj0gJC5zcG90U3dpcGUubW92ZVRocmVzaG9sZCAmJiBlbGFwc2VkVGltZSA8PSAkLnNwb3RTd2lwZS50aW1lVGhyZXNob2xkKSB7XG4gICAgICBkaXIgPSBkeCA+IDAgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIH1cbiAgICAvLyBlbHNlIGlmKE1hdGguYWJzKGR5KSA+PSAkLnNwb3RTd2lwZS5tb3ZlVGhyZXNob2xkICYmIGVsYXBzZWRUaW1lIDw9ICQuc3BvdFN3aXBlLnRpbWVUaHJlc2hvbGQpIHtcbiAgICAvLyAgIGRpciA9IGR5ID4gMCA/ICdkb3duJyA6ICd1cCc7XG4gICAgLy8gfVxuICAgIGlmKGRpcikge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgb25Ub3VjaEVuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgJCh0aGlzKVxuICAgICAgICAudHJpZ2dlcigkLkV2ZW50KCdzd2lwZScsIGUpLCBkaXIpXG4gICAgICAgIC50cmlnZ2VyKCQuRXZlbnQoYHN3aXBlJHtkaXJ9YCwgZSkpO1xuICAgIH1cbiAgfVxuXG59XG5cbmZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG5cbiAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT0gMSkge1xuICAgIHN0YXJ0UG9zWCA9IGUudG91Y2hlc1swXS5wYWdlWDtcbiAgICBzdGFydFBvc1kgPSBlLnRvdWNoZXNbMF0ucGFnZVk7XG4gICAgc3RhcnRFdmVudCA9IGU7XG4gICAgaXNNb3ZpbmcgPSB0cnVlO1xuICAgIGRpZE1vdmVkID0gZmFsc2U7XG4gICAgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCgpIHtcbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyICYmIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiB0ZWFyZG93bigpIHtcbiAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0KTtcbn1cblxuY2xhc3MgU3BvdFN3aXBlIHtcbiAgY29uc3RydWN0b3IoJCkge1xuICAgIHRoaXMudmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgdGhpcy5lbmFibGVkID0gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHRoaXMucHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICB0aGlzLm1vdmVUaHJlc2hvbGQgPSA3NTtcbiAgICB0aGlzLnRpbWVUaHJlc2hvbGQgPSAyMDA7XG4gICAgdGhpcy4kID0gJDtcbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBfaW5pdCgpIHtcbiAgICB2YXIgJCA9IHRoaXMuJDtcbiAgICAkLmV2ZW50LnNwZWNpYWwuc3dpcGUgPSB7IHNldHVwOiBpbml0IH07XG4gICAgJC5ldmVudC5zcGVjaWFsLnRhcCA9IHsgc2V0dXA6IGluaXQgfTtcblxuICAgICQuZWFjaChbJ2xlZnQnLCAndXAnLCAnZG93bicsICdyaWdodCddLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkLmV2ZW50LnNwZWNpYWxbYHN3aXBlJHt0aGlzfWBdID0geyBzZXR1cDogZnVuY3Rpb24oKXtcbiAgICAgICAgJCh0aGlzKS5vbignc3dpcGUnLCAkLm5vb3ApO1xuICAgICAgfSB9O1xuICAgIH0pO1xuICB9XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgYm90aCBzZXR1cFNwb3RTd2lwZSBhbmQgICAgKlxuICogc2V0dXBUb3VjaEhhbmRsZXIgc2hvdWxkIGJlIGlkZW1wb3RlbnQsICAgICAgICAgICpcbiAqIGJlY2F1c2UgdGhleSBkaXJlY3RseSByZXBsYWNlIGZ1bmN0aW9ucyAmICAgICAgICAqXG4gKiB2YWx1ZXMsIGFuZCBkbyBub3QgYWRkIGV2ZW50IGhhbmRsZXJzIGRpcmVjdGx5LiAgKlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblRvdWNoLnNldHVwU3BvdFN3aXBlID0gZnVuY3Rpb24oJCkge1xuICAkLnNwb3RTd2lwZSA9IG5ldyBTcG90U3dpcGUoJCk7XG59O1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogTWV0aG9kIGZvciBhZGRpbmcgcHNldWRvIGRyYWcgZXZlbnRzIHRvIGVsZW1lbnRzICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5Ub3VjaC5zZXR1cFRvdWNoSGFuZGxlciA9IGZ1bmN0aW9uKCQpIHtcbiAgJC5mbi5hZGRUb3VjaCA9IGZ1bmN0aW9uKCl7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGksZWwpe1xuICAgICAgJChlbCkuYmluZCgndG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwnLCBmdW5jdGlvbihldmVudCkgIHtcbiAgICAgICAgLy93ZSBwYXNzIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QgYmVjYXVzZSB0aGUgalF1ZXJ5IGV2ZW50XG4gICAgICAgIC8vb2JqZWN0IGlzIG5vcm1hbGl6ZWQgdG8gdzNjIHNwZWNzIGFuZCBkb2VzIG5vdCBwcm92aWRlIHRoZSBUb3VjaExpc3RcbiAgICAgICAgaGFuZGxlVG91Y2goZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgaGFuZGxlVG91Y2ggPSBmdW5jdGlvbihldmVudCl7XG4gICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICAgIGZpcnN0ID0gdG91Y2hlc1swXSxcbiAgICAgICAgICBldmVudFR5cGVzID0ge1xuICAgICAgICAgICAgdG91Y2hzdGFydDogJ21vdXNlZG93bicsXG4gICAgICAgICAgICB0b3VjaG1vdmU6ICdtb3VzZW1vdmUnLFxuICAgICAgICAgICAgdG91Y2hlbmQ6ICdtb3VzZXVwJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZSA9IGV2ZW50VHlwZXNbZXZlbnQudHlwZV0sXG4gICAgICAgICAgc2ltdWxhdGVkRXZlbnRcbiAgICAgICAgO1xuXG4gICAgICBpZignTW91c2VFdmVudCcgaW4gd2luZG93ICYmIHR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzaW11bGF0ZWRFdmVudCA9IG5ldyB3aW5kb3cuTW91c2VFdmVudCh0eXBlLCB7XG4gICAgICAgICAgJ2J1YmJsZXMnOiB0cnVlLFxuICAgICAgICAgICdjYW5jZWxhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnc2NyZWVuWCc6IGZpcnN0LnNjcmVlblgsXG4gICAgICAgICAgJ3NjcmVlblknOiBmaXJzdC5zY3JlZW5ZLFxuICAgICAgICAgICdjbGllbnRYJzogZmlyc3QuY2xpZW50WCxcbiAgICAgICAgICAnY2xpZW50WSc6IGZpcnN0LmNsaWVudFlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaW11bGF0ZWRFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7XG4gICAgICAgIHNpbXVsYXRlZEV2ZW50LmluaXRNb3VzZUV2ZW50KHR5cGUsIHRydWUsIHRydWUsIHdpbmRvdywgMSwgZmlyc3Quc2NyZWVuWCwgZmlyc3Quc2NyZWVuWSwgZmlyc3QuY2xpZW50WCwgZmlyc3QuY2xpZW50WSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAvKmxlZnQqLywgbnVsbCk7XG4gICAgICB9XG4gICAgICBmaXJzdC50YXJnZXQuZGlzcGF0Y2hFdmVudChzaW11bGF0ZWRFdmVudCk7XG4gICAgfTtcbiAgfTtcbn07XG5cblRvdWNoLmluaXQgPSBmdW5jdGlvbiAoJCkge1xuXG4gIGlmKHR5cGVvZigkLnNwb3RTd2lwZSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgVG91Y2guc2V0dXBTcG90U3dpcGUoJCk7XG4gICAgVG91Y2guc2V0dXBUb3VjaEhhbmRsZXIoJCk7XG4gIH1cbn07XG5cbmV4cG9ydCB7VG91Y2h9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgb25Mb2FkIH0gZnJvbSAnLi9mb3VuZGF0aW9uLmNvcmUudXRpbHMnO1xuaW1wb3J0IHsgTW90aW9uIH0gZnJvbSAnLi9mb3VuZGF0aW9uLnV0aWwubW90aW9uJztcblxuY29uc3QgTXV0YXRpb25PYnNlcnZlciA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBwcmVmaXhlcyA9IFsnV2ViS2l0JywgJ01veicsICdPJywgJ01zJywgJyddO1xuICBmb3IgKHZhciBpPTA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChgJHtwcmVmaXhlc1tpXX1NdXRhdGlvbk9ic2VydmVyYCBpbiB3aW5kb3cpIHtcbiAgICAgIHJldHVybiB3aW5kb3dbYCR7cHJlZml4ZXNbaV19TXV0YXRpb25PYnNlcnZlcmBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59KCkpO1xuXG5jb25zdCB0cmlnZ2VycyA9IChlbCwgdHlwZSkgPT4ge1xuICBlbC5kYXRhKHR5cGUpLnNwbGl0KCcgJykuZm9yRWFjaChpZCA9PiB7XG4gICAgJChgIyR7aWR9YClbIHR5cGUgPT09ICdjbG9zZScgPyAndHJpZ2dlcicgOiAndHJpZ2dlckhhbmRsZXInXShgJHt0eXBlfS56Zi50cmlnZ2VyYCwgW2VsXSk7XG4gIH0pO1xufTtcblxudmFyIFRyaWdnZXJzID0ge1xuICBMaXN0ZW5lcnM6IHtcbiAgICBCYXNpYzoge30sXG4gICAgR2xvYmFsOiB7fVxuICB9LFxuICBJbml0aWFsaXplcnM6IHt9XG59XG5cblRyaWdnZXJzLkxpc3RlbmVycy5CYXNpYyAgPSB7XG4gIG9wZW5MaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgdHJpZ2dlcnMoJCh0aGlzKSwgJ29wZW4nKTtcbiAgfSxcbiAgY2xvc2VMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgbGV0IGlkID0gJCh0aGlzKS5kYXRhKCdjbG9zZScpO1xuICAgIGlmIChpZCkge1xuICAgICAgdHJpZ2dlcnMoJCh0aGlzKSwgJ2Nsb3NlJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgJCh0aGlzKS50cmlnZ2VyKCdjbG9zZS56Zi50cmlnZ2VyJyk7XG4gICAgfVxuICB9LFxuICB0b2dnbGVMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgbGV0IGlkID0gJCh0aGlzKS5kYXRhKCd0b2dnbGUnKTtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRyaWdnZXJzKCQodGhpcyksICd0b2dnbGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCh0aGlzKS50cmlnZ2VyKCd0b2dnbGUuemYudHJpZ2dlcicpO1xuICAgIH1cbiAgfSxcbiAgY2xvc2VhYmxlTGlzdGVuZXI6IGZ1bmN0aW9uKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGxldCBhbmltYXRpb24gPSAkKHRoaXMpLmRhdGEoJ2Nsb3NhYmxlJyk7XG5cbiAgICBpZihhbmltYXRpb24gIT09ICcnKXtcbiAgICAgIE1vdGlvbi5hbmltYXRlT3V0KCQodGhpcyksIGFuaW1hdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcykudHJpZ2dlcignY2xvc2VkLnpmJyk7XG4gICAgICB9KTtcbiAgICB9ZWxzZXtcbiAgICAgICQodGhpcykuZmFkZU91dCgpLnRyaWdnZXIoJ2Nsb3NlZC56ZicpO1xuICAgIH1cbiAgfSxcbiAgdG9nZ2xlRm9jdXNMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgbGV0IGlkID0gJCh0aGlzKS5kYXRhKCd0b2dnbGUtZm9jdXMnKTtcbiAgICAkKGAjJHtpZH1gKS50cmlnZ2VySGFuZGxlcigndG9nZ2xlLnpmLnRyaWdnZXInLCBbJCh0aGlzKV0pO1xuICB9XG59O1xuXG4vLyBFbGVtZW50cyB3aXRoIFtkYXRhLW9wZW5dIHdpbGwgcmV2ZWFsIGEgcGx1Z2luIHRoYXQgc3VwcG9ydHMgaXQgd2hlbiBjbGlja2VkLlxuVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZE9wZW5MaXN0ZW5lciA9ICgkZWxlbSkgPT4ge1xuICAkZWxlbS5vZmYoJ2NsaWNrLnpmLnRyaWdnZXInLCBUcmlnZ2Vycy5MaXN0ZW5lcnMuQmFzaWMub3Blbkxpc3RlbmVyKTtcbiAgJGVsZW0ub24oJ2NsaWNrLnpmLnRyaWdnZXInLCAnW2RhdGEtb3Blbl0nLCBUcmlnZ2Vycy5MaXN0ZW5lcnMuQmFzaWMub3Blbkxpc3RlbmVyKTtcbn1cblxuLy8gRWxlbWVudHMgd2l0aCBbZGF0YS1jbG9zZV0gd2lsbCBjbG9zZSBhIHBsdWdpbiB0aGF0IHN1cHBvcnRzIGl0IHdoZW4gY2xpY2tlZC5cbi8vIElmIHVzZWQgd2l0aG91dCBhIHZhbHVlIG9uIFtkYXRhLWNsb3NlXSwgdGhlIGV2ZW50IHdpbGwgYnViYmxlLCBhbGxvd2luZyBpdCB0byBjbG9zZSBhIHBhcmVudCBjb21wb25lbnQuXG5UcmlnZ2Vycy5Jbml0aWFsaXplcnMuYWRkQ2xvc2VMaXN0ZW5lciA9ICgkZWxlbSkgPT4ge1xuICAkZWxlbS5vZmYoJ2NsaWNrLnpmLnRyaWdnZXInLCBUcmlnZ2Vycy5MaXN0ZW5lcnMuQmFzaWMuY2xvc2VMaXN0ZW5lcik7XG4gICRlbGVtLm9uKCdjbGljay56Zi50cmlnZ2VyJywgJ1tkYXRhLWNsb3NlXScsIFRyaWdnZXJzLkxpc3RlbmVycy5CYXNpYy5jbG9zZUxpc3RlbmVyKTtcbn1cblxuLy8gRWxlbWVudHMgd2l0aCBbZGF0YS10b2dnbGVdIHdpbGwgdG9nZ2xlIGEgcGx1Z2luIHRoYXQgc3VwcG9ydHMgaXQgd2hlbiBjbGlja2VkLlxuVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZFRvZ2dsZUxpc3RlbmVyID0gKCRlbGVtKSA9PiB7XG4gICRlbGVtLm9mZignY2xpY2suemYudHJpZ2dlcicsIFRyaWdnZXJzLkxpc3RlbmVycy5CYXNpYy50b2dnbGVMaXN0ZW5lcik7XG4gICRlbGVtLm9uKCdjbGljay56Zi50cmlnZ2VyJywgJ1tkYXRhLXRvZ2dsZV0nLCBUcmlnZ2Vycy5MaXN0ZW5lcnMuQmFzaWMudG9nZ2xlTGlzdGVuZXIpO1xufVxuXG4vLyBFbGVtZW50cyB3aXRoIFtkYXRhLWNsb3NhYmxlXSB3aWxsIHJlc3BvbmQgdG8gY2xvc2UuemYudHJpZ2dlciBldmVudHMuXG5UcmlnZ2Vycy5Jbml0aWFsaXplcnMuYWRkQ2xvc2VhYmxlTGlzdGVuZXIgPSAoJGVsZW0pID0+IHtcbiAgJGVsZW0ub2ZmKCdjbG9zZS56Zi50cmlnZ2VyJywgVHJpZ2dlcnMuTGlzdGVuZXJzLkJhc2ljLmNsb3NlYWJsZUxpc3RlbmVyKTtcbiAgJGVsZW0ub24oJ2Nsb3NlLnpmLnRyaWdnZXInLCAnW2RhdGEtY2xvc2VhYmxlXSwgW2RhdGEtY2xvc2FibGVdJywgVHJpZ2dlcnMuTGlzdGVuZXJzLkJhc2ljLmNsb3NlYWJsZUxpc3RlbmVyKTtcbn1cblxuLy8gRWxlbWVudHMgd2l0aCBbZGF0YS10b2dnbGUtZm9jdXNdIHdpbGwgcmVzcG9uZCB0byBjb21pbmcgaW4gYW5kIG91dCBvZiBmb2N1c1xuVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZFRvZ2dsZUZvY3VzTGlzdGVuZXIgPSAoJGVsZW0pID0+IHtcbiAgJGVsZW0ub2ZmKCdmb2N1cy56Zi50cmlnZ2VyIGJsdXIuemYudHJpZ2dlcicsIFRyaWdnZXJzLkxpc3RlbmVycy5CYXNpYy50b2dnbGVGb2N1c0xpc3RlbmVyKTtcbiAgJGVsZW0ub24oJ2ZvY3VzLnpmLnRyaWdnZXIgYmx1ci56Zi50cmlnZ2VyJywgJ1tkYXRhLXRvZ2dsZS1mb2N1c10nLCBUcmlnZ2Vycy5MaXN0ZW5lcnMuQmFzaWMudG9nZ2xlRm9jdXNMaXN0ZW5lcik7XG59XG5cblxuXG4vLyBNb3JlIEdsb2JhbC9jb21wbGV4IGxpc3RlbmVycyBhbmQgdHJpZ2dlcnNcblRyaWdnZXJzLkxpc3RlbmVycy5HbG9iYWwgID0ge1xuICByZXNpemVMaXN0ZW5lcjogZnVuY3Rpb24oJG5vZGVzKSB7XG4gICAgaWYoIU11dGF0aW9uT2JzZXJ2ZXIpey8vZmFsbGJhY2sgZm9yIElFIDlcbiAgICAgICRub2Rlcy5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICAgICQodGhpcykudHJpZ2dlckhhbmRsZXIoJ3Jlc2l6ZW1lLnpmLnRyaWdnZXInKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvL3RyaWdnZXIgYWxsIGxpc3RlbmluZyBlbGVtZW50cyBhbmQgc2lnbmFsIGEgcmVzaXplIGV2ZW50XG4gICAgJG5vZGVzLmF0dHIoJ2RhdGEtZXZlbnRzJywgXCJyZXNpemVcIik7XG4gIH0sXG4gIHNjcm9sbExpc3RlbmVyOiBmdW5jdGlvbigkbm9kZXMpIHtcbiAgICBpZighTXV0YXRpb25PYnNlcnZlcil7Ly9mYWxsYmFjayBmb3IgSUUgOVxuICAgICAgJG5vZGVzLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgJCh0aGlzKS50cmlnZ2VySGFuZGxlcignc2Nyb2xsbWUuemYudHJpZ2dlcicpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vdHJpZ2dlciBhbGwgbGlzdGVuaW5nIGVsZW1lbnRzIGFuZCBzaWduYWwgYSBzY3JvbGwgZXZlbnRcbiAgICAkbm9kZXMuYXR0cignZGF0YS1ldmVudHMnLCBcInNjcm9sbFwiKTtcbiAgfSxcbiAgY2xvc2VNZUxpc3RlbmVyOiBmdW5jdGlvbihlLCBwbHVnaW5JZCl7XG4gICAgbGV0IHBsdWdpbiA9IGUubmFtZXNwYWNlLnNwbGl0KCcuJylbMF07XG4gICAgbGV0IHBsdWdpbnMgPSAkKGBbZGF0YS0ke3BsdWdpbn1dYCkubm90KGBbZGF0YS15ZXRpLWJveD1cIiR7cGx1Z2luSWR9XCJdYCk7XG5cbiAgICBwbHVnaW5zLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgIGxldCBfdGhpcyA9ICQodGhpcyk7XG4gICAgICBfdGhpcy50cmlnZ2VySGFuZGxlcignY2xvc2UuemYudHJpZ2dlcicsIFtfdGhpc10pO1xuICAgIH0pO1xuICB9XG59XG5cbi8vIEdsb2JhbCwgcGFyc2VzIHdob2xlIGRvY3VtZW50LlxuVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZENsb3NlbWVMaXN0ZW5lciA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUpIHtcbiAgdmFyIHlldGlCb3hlcyA9ICQoJ1tkYXRhLXlldGktYm94XScpLFxuICAgICAgcGx1Z05hbWVzID0gWydkcm9wZG93bicsICd0b29sdGlwJywgJ3JldmVhbCddO1xuXG4gIGlmKHBsdWdpbk5hbWUpe1xuICAgIGlmKHR5cGVvZiBwbHVnaW5OYW1lID09PSAnc3RyaW5nJyl7XG4gICAgICBwbHVnTmFtZXMucHVzaChwbHVnaW5OYW1lKTtcbiAgICB9ZWxzZSBpZih0eXBlb2YgcGx1Z2luTmFtZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBsdWdpbk5hbWVbMF0gPT09ICdzdHJpbmcnKXtcbiAgICAgIHBsdWdOYW1lcy5jb25jYXQocGx1Z2luTmFtZSk7XG4gICAgfWVsc2V7XG4gICAgICBjb25zb2xlLmVycm9yKCdQbHVnaW4gbmFtZXMgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICB9XG4gIGlmKHlldGlCb3hlcy5sZW5ndGgpe1xuICAgIGxldCBsaXN0ZW5lcnMgPSBwbHVnTmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgICByZXR1cm4gYGNsb3NlbWUuemYuJHtuYW1lfWA7XG4gICAgfSkuam9pbignICcpO1xuXG4gICAgJCh3aW5kb3cpLm9mZihsaXN0ZW5lcnMpLm9uKGxpc3RlbmVycywgVHJpZ2dlcnMuTGlzdGVuZXJzLkdsb2JhbC5jbG9zZU1lTGlzdGVuZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlYm91bmNlR2xvYmFsTGlzdGVuZXIoZGVib3VuY2UsIHRyaWdnZXIsIGxpc3RlbmVyKSB7XG4gIGxldCB0aW1lciwgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG4gICQod2luZG93KS5vZmYodHJpZ2dlcikub24odHJpZ2dlciwgZnVuY3Rpb24oZSkge1xuICAgIGlmICh0aW1lcikgeyBjbGVhclRpbWVvdXQodGltZXIpOyB9XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICBsaXN0ZW5lci5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9LCBkZWJvdW5jZSB8fCAxMCk7Ly9kZWZhdWx0IHRpbWUgdG8gZW1pdCBzY3JvbGwgZXZlbnRcbiAgfSk7XG59XG5cblRyaWdnZXJzLkluaXRpYWxpemVycy5hZGRSZXNpemVMaXN0ZW5lciA9IGZ1bmN0aW9uKGRlYm91bmNlKXtcbiAgbGV0ICRub2RlcyA9ICQoJ1tkYXRhLXJlc2l6ZV0nKTtcbiAgaWYoJG5vZGVzLmxlbmd0aCl7XG4gICAgZGVib3VuY2VHbG9iYWxMaXN0ZW5lcihkZWJvdW5jZSwgJ3Jlc2l6ZS56Zi50cmlnZ2VyJywgVHJpZ2dlcnMuTGlzdGVuZXJzLkdsb2JhbC5yZXNpemVMaXN0ZW5lciwgJG5vZGVzKTtcbiAgfVxufVxuXG5UcmlnZ2Vycy5Jbml0aWFsaXplcnMuYWRkU2Nyb2xsTGlzdGVuZXIgPSBmdW5jdGlvbihkZWJvdW5jZSl7XG4gIGxldCAkbm9kZXMgPSAkKCdbZGF0YS1zY3JvbGxdJyk7XG4gIGlmKCRub2Rlcy5sZW5ndGgpe1xuICAgIGRlYm91bmNlR2xvYmFsTGlzdGVuZXIoZGVib3VuY2UsICdzY3JvbGwuemYudHJpZ2dlcicsIFRyaWdnZXJzLkxpc3RlbmVycy5HbG9iYWwuc2Nyb2xsTGlzdGVuZXIsICRub2Rlcyk7XG4gIH1cbn1cblxuVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZE11dGF0aW9uRXZlbnRzTGlzdGVuZXIgPSBmdW5jdGlvbigkZWxlbSkge1xuICBpZighTXV0YXRpb25PYnNlcnZlcil7IHJldHVybiBmYWxzZTsgfVxuICBsZXQgJG5vZGVzID0gJGVsZW0uZmluZCgnW2RhdGEtcmVzaXplXSwgW2RhdGEtc2Nyb2xsXSwgW2RhdGEtbXV0YXRlXScpO1xuXG4gIC8vZWxlbWVudCBjYWxsYmFja1xuICB2YXIgbGlzdGVuaW5nRWxlbWVudHNNdXRhdGlvbiA9IGZ1bmN0aW9uIChtdXRhdGlvblJlY29yZHNMaXN0KSB7XG4gICAgdmFyICR0YXJnZXQgPSAkKG11dGF0aW9uUmVjb3Jkc0xpc3RbMF0udGFyZ2V0KTtcblxuICAgIC8vdHJpZ2dlciB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIGVsZW1lbnQgZGVwZW5kaW5nIG9uIHR5cGVcbiAgICBzd2l0Y2ggKG11dGF0aW9uUmVjb3Jkc0xpc3RbMF0udHlwZSkge1xuICAgICAgY2FzZSBcImF0dHJpYnV0ZXNcIjpcbiAgICAgICAgaWYgKCR0YXJnZXQuYXR0cihcImRhdGEtZXZlbnRzXCIpID09PSBcInNjcm9sbFwiICYmIG11dGF0aW9uUmVjb3Jkc0xpc3RbMF0uYXR0cmlidXRlTmFtZSA9PT0gXCJkYXRhLWV2ZW50c1wiKSB7XG4gICAgICAgICAgJHRhcmdldC50cmlnZ2VySGFuZGxlcignc2Nyb2xsbWUuemYudHJpZ2dlcicsIFskdGFyZ2V0LCB3aW5kb3cucGFnZVlPZmZzZXRdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJHRhcmdldC5hdHRyKFwiZGF0YS1ldmVudHNcIikgPT09IFwicmVzaXplXCIgJiYgbXV0YXRpb25SZWNvcmRzTGlzdFswXS5hdHRyaWJ1dGVOYW1lID09PSBcImRhdGEtZXZlbnRzXCIpIHtcbiAgICAgICAgICAkdGFyZ2V0LnRyaWdnZXJIYW5kbGVyKCdyZXNpemVtZS56Zi50cmlnZ2VyJywgWyR0YXJnZXRdKTtcbiAgICAgICAgIH1cbiAgICAgICAgaWYgKG11dGF0aW9uUmVjb3Jkc0xpc3RbMF0uYXR0cmlidXRlTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgJHRhcmdldC5jbG9zZXN0KFwiW2RhdGEtbXV0YXRlXVwiKS5hdHRyKFwiZGF0YS1ldmVudHNcIixcIm11dGF0ZVwiKTtcbiAgICAgICAgICAkdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1tdXRhdGVdXCIpLnRyaWdnZXJIYW5kbGVyKCdtdXRhdGVtZS56Zi50cmlnZ2VyJywgWyR0YXJnZXQuY2xvc2VzdChcIltkYXRhLW11dGF0ZV1cIildKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImNoaWxkTGlzdFwiOlxuICAgICAgICAkdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1tdXRhdGVdXCIpLmF0dHIoXCJkYXRhLWV2ZW50c1wiLFwibXV0YXRlXCIpO1xuICAgICAgICAkdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1tdXRhdGVdXCIpLnRyaWdnZXJIYW5kbGVyKCdtdXRhdGVtZS56Zi50cmlnZ2VyJywgWyR0YXJnZXQuY2xvc2VzdChcIltkYXRhLW11dGF0ZV1cIildKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIC8vbm90aGluZ1xuICAgIH1cbiAgfTtcblxuICBpZiAoJG5vZGVzLmxlbmd0aCkge1xuICAgIC8vZm9yIGVhY2ggZWxlbWVudCB0aGF0IG5lZWRzIHRvIGxpc3RlbiBmb3IgcmVzaXppbmcsIHNjcm9sbGluZywgb3IgbXV0YXRpb24gYWRkIGEgc2luZ2xlIG9ic2VydmVyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gJG5vZGVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgdmFyIGVsZW1lbnRPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGxpc3RlbmluZ0VsZW1lbnRzTXV0YXRpb24pO1xuICAgICAgZWxlbWVudE9ic2VydmVyLm9ic2VydmUoJG5vZGVzW2ldLCB7IGF0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogZmFsc2UsIHN1YnRyZWU6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogW1wiZGF0YS1ldmVudHNcIiwgXCJzdHlsZVwiXSB9KTtcbiAgICB9XG4gIH1cbn1cblxuVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZFNpbXBsZUxpc3RlbmVycyA9IGZ1bmN0aW9uKCkge1xuICBsZXQgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XG5cbiAgVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZE9wZW5MaXN0ZW5lcigkZG9jdW1lbnQpO1xuICBUcmlnZ2Vycy5Jbml0aWFsaXplcnMuYWRkQ2xvc2VMaXN0ZW5lcigkZG9jdW1lbnQpO1xuICBUcmlnZ2Vycy5Jbml0aWFsaXplcnMuYWRkVG9nZ2xlTGlzdGVuZXIoJGRvY3VtZW50KTtcbiAgVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZENsb3NlYWJsZUxpc3RlbmVyKCRkb2N1bWVudCk7XG4gIFRyaWdnZXJzLkluaXRpYWxpemVycy5hZGRUb2dnbGVGb2N1c0xpc3RlbmVyKCRkb2N1bWVudCk7XG5cbn1cblxuVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZEdsb2JhbExpc3RlbmVycyA9IGZ1bmN0aW9uKCkge1xuICBsZXQgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XG4gIFRyaWdnZXJzLkluaXRpYWxpemVycy5hZGRNdXRhdGlvbkV2ZW50c0xpc3RlbmVyKCRkb2N1bWVudCk7XG4gIFRyaWdnZXJzLkluaXRpYWxpemVycy5hZGRSZXNpemVMaXN0ZW5lcigpO1xuICBUcmlnZ2Vycy5Jbml0aWFsaXplcnMuYWRkU2Nyb2xsTGlzdGVuZXIoKTtcbiAgVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZENsb3NlbWVMaXN0ZW5lcigpO1xufVxuXG5cblRyaWdnZXJzLmluaXQgPSBmdW5jdGlvbiAoJCwgRm91bmRhdGlvbikge1xuICBvbkxvYWQoJCh3aW5kb3cpLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCQudHJpZ2dlcnNJbml0aWFsaXplZCAhPT0gdHJ1ZSkge1xuICAgICAgVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZFNpbXBsZUxpc3RlbmVycygpO1xuICAgICAgVHJpZ2dlcnMuSW5pdGlhbGl6ZXJzLmFkZEdsb2JhbExpc3RlbmVycygpO1xuICAgICAgJC50cmlnZ2Vyc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmKEZvdW5kYXRpb24pIHtcbiAgICBGb3VuZGF0aW9uLlRyaWdnZXJzID0gVHJpZ2dlcnM7XG4gICAgLy8gTGVnYWN5IGluY2x1ZGVkIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIGZvciBub3cuXG4gICAgRm91bmRhdGlvbi5JSGVhcllvdSA9IFRyaWdnZXJzLkluaXRpYWxpemVycy5hZGRHbG9iYWxMaXN0ZW5lcnNcbiAgfVxufVxuXG5leHBvcnQge1RyaWdnZXJzfTtcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBGb3VuZGF0aW9uIH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLmNvcmUnO1xuaW1wb3J0IHsgcnRsLCBHZXRZb0RpZ2l0cywgdHJhbnNpdGlvbmVuZCB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi5jb3JlLnV0aWxzJztcbmltcG9ydCB7IEJveCB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi51dGlsLmJveCdcbmltcG9ydCB7IG9uSW1hZ2VzTG9hZGVkIH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnV0aWwuaW1hZ2VMb2FkZXInO1xuaW1wb3J0IHsgS2V5Ym9hcmQgfSBmcm9tICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24udXRpbC5rZXlib2FyZCc7XG5pbXBvcnQgeyBNZWRpYVF1ZXJ5IH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnV0aWwubWVkaWFRdWVyeSc7XG5pbXBvcnQgeyBNb3Rpb24sIE1vdmUgfSBmcm9tICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24udXRpbC5tb3Rpb24nO1xuaW1wb3J0IHsgTmVzdCB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi51dGlsLm5lc3QnO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24udXRpbC50aW1lcic7XG5pbXBvcnQgeyBUb3VjaCB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi51dGlsLnRvdWNoJztcbmltcG9ydCB7IFRyaWdnZXJzIH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnV0aWwudHJpZ2dlcnMnO1xuLy8gaW1wb3J0IHsgQWJpZGUgfSBmcm9tICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24uYWJpZGUnO1xuLy8gaW1wb3J0IHsgQWNjb3JkaW9uIH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLmFjY29yZGlvbic7XG4vLyBpbXBvcnQgeyBBY2NvcmRpb25NZW51IH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLmFjY29yZGlvbk1lbnUnO1xuLy8gaW1wb3J0IHsgRHJpbGxkb3duIH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLmRyaWxsZG93bic7XG5pbXBvcnQgeyBEcm9wZG93biB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi5kcm9wZG93bic7XG5pbXBvcnQgeyBEcm9wZG93bk1lbnUgfSBmcm9tICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24uZHJvcGRvd25NZW51Jztcbi8vIGltcG9ydCB7IEVxdWFsaXplciB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi5lcXVhbGl6ZXInO1xuaW1wb3J0IHsgSW50ZXJjaGFuZ2UgfSBmcm9tICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24uaW50ZXJjaGFuZ2UnO1xuLy8gaW1wb3J0IHsgTWFnZWxsYW4gfSBmcm9tICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24ubWFnZWxsYW4nO1xuLy8gaW1wb3J0IHsgT2ZmQ2FudmFzIH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLm9mZmNhbnZhcyc7XG4vLyBpbXBvcnQgeyBPcmJpdCB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi5vcmJpdCc7XG4vLyBpbXBvcnQgeyBSZXNwb25zaXZlTWVudSB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi5yZXNwb25zaXZlTWVudSc7XG4vLyBpbXBvcnQgeyBSZXNwb25zaXZlVG9nZ2xlIH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnJlc3BvbnNpdmVUb2dnbGUnO1xuLy8gaW1wb3J0IHsgUmV2ZWFsIH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnJldmVhbCc7XG4vLyBpbXBvcnQgeyBTbGlkZXIgfSBmcm9tICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24uc2xpZGVyJztcbi8vIGltcG9ydCB7IFNtb290aFNjcm9sbCB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi5zbW9vdGhTY3JvbGwnO1xuLy8gaW1wb3J0IHsgU3RpY2t5IH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnN0aWNreSc7XG4vLyBpbXBvcnQgeyBUYWJzIH0gZnJvbSAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uLnRhYnMnO1xuLy8gaW1wb3J0IHsgVG9nZ2xlciB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi50b2dnbGVyJztcbi8vIGltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24udG9vbHRpcCc7XG4vLyBpbXBvcnQgeyBSZXNwb25zaXZlQWNjb3JkaW9uVGFicyB9IGZyb20gJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi5yZXNwb25zaXZlQWNjb3JkaW9uVGFicyc7XG5cblxuRm91bmRhdGlvbi5hZGRUb0pxdWVyeSgkKTtcblxuLy8gQWRkIEZvdW5kYXRpb24gVXRpbHMgdG8gRm91bmRhdGlvbiBnbG9iYWwgbmFtZXNwYWNlIGZvciBiYWNrd2FyZHNcbi8vIGNvbXBhdGliaWxpdHkuXG5cbkZvdW5kYXRpb24ucnRsID0gcnRsO1xuRm91bmRhdGlvbi5HZXRZb0RpZ2l0cyA9IEdldFlvRGlnaXRzO1xuRm91bmRhdGlvbi50cmFuc2l0aW9uZW5kID0gdHJhbnNpdGlvbmVuZDtcblxuRm91bmRhdGlvbi5Cb3ggPSBCb3g7XG5Gb3VuZGF0aW9uLm9uSW1hZ2VzTG9hZGVkID0gb25JbWFnZXNMb2FkZWQ7XG5Gb3VuZGF0aW9uLktleWJvYXJkID0gS2V5Ym9hcmQ7XG5Gb3VuZGF0aW9uLk1lZGlhUXVlcnkgPSBNZWRpYVF1ZXJ5O1xuRm91bmRhdGlvbi5Nb3Rpb24gPSBNb3Rpb247XG5Gb3VuZGF0aW9uLk1vdmUgPSBNb3ZlO1xuRm91bmRhdGlvbi5OZXN0ID0gTmVzdDtcbkZvdW5kYXRpb24uVGltZXIgPSBUaW1lcjtcblxuLy8gVG91Y2ggYW5kIFRyaWdnZXJzIHByZXZpb3VzbHkgd2VyZSBhbG1vc3QgcHVyZWx5IHNlZGUgZWZmZWN0IGRyaXZlbixcbi8vIHNvIG5vIC8vIG5lZWQgdG8gYWRkIGl0IHRvIEZvdW5kYXRpb24sIGp1c3QgaW5pdCB0aGVtLlxuXG5Ub3VjaC5pbml0KCQpO1xuXG5UcmlnZ2Vycy5pbml0KCQsIEZvdW5kYXRpb24pO1xuXG4vLyBGb3VuZGF0aW9uLnBsdWdpbihBYmlkZSwgJ0FiaWRlJyk7XG4vL1xuLy8gRm91bmRhdGlvbi5wbHVnaW4oQWNjb3JkaW9uLCAnQWNjb3JkaW9uJyk7XG4vL1xuLy8gRm91bmRhdGlvbi5wbHVnaW4oQWNjb3JkaW9uTWVudSwgJ0FjY29yZGlvbk1lbnUnKTtcbi8vXG4vLyBGb3VuZGF0aW9uLnBsdWdpbihEcmlsbGRvd24sICdEcmlsbGRvd24nKTtcbi8vXG5Gb3VuZGF0aW9uLnBsdWdpbihEcm9wZG93biwgJ0Ryb3Bkb3duJyk7XG5cbkZvdW5kYXRpb24ucGx1Z2luKERyb3Bkb3duTWVudSwgJ0Ryb3Bkb3duTWVudScpO1xuXG4vLyBGb3VuZGF0aW9uLnBsdWdpbihFcXVhbGl6ZXIsICdFcXVhbGl6ZXInKTtcblxuRm91bmRhdGlvbi5wbHVnaW4oSW50ZXJjaGFuZ2UsICdJbnRlcmNoYW5nZScpO1xuLy9cbi8vIEZvdW5kYXRpb24ucGx1Z2luKE1hZ2VsbGFuLCAnTWFnZWxsYW4nKTtcbi8vXG4vLyBGb3VuZGF0aW9uLnBsdWdpbihPZmZDYW52YXMsICdPZmZDYW52YXMnKTtcbi8vXG4vLyBGb3VuZGF0aW9uLnBsdWdpbihPcmJpdCwgJ09yYml0Jyk7XG4vL1xuLy8gRm91bmRhdGlvbi5wbHVnaW4oUmVzcG9uc2l2ZU1lbnUsICdSZXNwb25zaXZlTWVudScpO1xuLy9cbi8vIEZvdW5kYXRpb24ucGx1Z2luKFJlc3BvbnNpdmVUb2dnbGUsICdSZXNwb25zaXZlVG9nZ2xlJyk7XG4vL1xuLy8gRm91bmRhdGlvbi5wbHVnaW4oUmV2ZWFsLCAnUmV2ZWFsJyk7XG4vL1xuLy8gRm91bmRhdGlvbi5wbHVnaW4oU2xpZGVyLCAnU2xpZGVyJyk7XG4vL1xuLy8gRm91bmRhdGlvbi5wbHVnaW4oU21vb3RoU2Nyb2xsLCAnU21vb3RoU2Nyb2xsJyk7XG4vL1xuLy8gRm91bmRhdGlvbi5wbHVnaW4oU3RpY2t5LCAnU3RpY2t5Jyk7XG4vL1xuLy8gRm91bmRhdGlvbi5wbHVnaW4oVGFicywgJ1RhYnMnKTtcbi8vXG4vLyBGb3VuZGF0aW9uLnBsdWdpbihUb2dnbGVyLCAnVG9nZ2xlcicpO1xuLy9cbi8vIEZvdW5kYXRpb24ucGx1Z2luKFRvb2x0aXAsICdUb29sdGlwJyk7XG4vL1xuLy8gRm91bmRhdGlvbi5wbHVnaW4oUmVzcG9uc2l2ZUFjY29yZGlvblRhYnMsICdSZXNwb25zaXZlQWNjb3JkaW9uVGFicycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZvdW5kYXRpb247XG4iLCIvKipcbiAqIHdoYXQtaW5wdXQgLSBBIGdsb2JhbCB1dGlsaXR5IGZvciB0cmFja2luZyB0aGUgY3VycmVudCBpbnB1dCBtZXRob2QgKG1vdXNlLCBrZXlib2FyZCBvciB0b3VjaCkuXG4gKiBAdmVyc2lvbiB2NC4zLjFcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW4xc2V2ZW4vd2hhdC1pbnB1dFxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwid2hhdElucHV0XCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIndoYXRJbnB1dFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJ3aGF0SW5wdXRcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHQgIC8qXG5cdCAgICogdmFyaWFibGVzXG5cdCAgICovXG5cblx0ICAvLyBsYXN0IHVzZWQgaW5wdXQgdHlwZVxuXHQgIHZhciBjdXJyZW50SW5wdXQgPSAnaW5pdGlhbCc7XG5cblx0ICAvLyBsYXN0IHVzZWQgaW5wdXQgaW50ZW50XG5cdCAgdmFyIGN1cnJlbnRJbnRlbnQgPSBudWxsO1xuXG5cdCAgLy8gY2FjaGUgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG5cdCAgdmFyIGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXHQgIC8vIGZvcm0gaW5wdXQgdHlwZXNcblx0ICB2YXIgZm9ybUlucHV0cyA9IFsnaW5wdXQnLCAnc2VsZWN0JywgJ3RleHRhcmVhJ107XG5cblx0ICB2YXIgZnVuY3Rpb25MaXN0ID0gW107XG5cblx0ICAvLyBsaXN0IG9mIG1vZGlmaWVyIGtleXMgY29tbW9ubHkgdXNlZCB3aXRoIHRoZSBtb3VzZSBhbmRcblx0ICAvLyBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgdG8gcHJldmVudCBmYWxzZSBrZXlib2FyZCBkZXRlY3Rpb25cblx0ICB2YXIgaWdub3JlTWFwID0gWzE2LCAvLyBzaGlmdFxuXHQgIDE3LCAvLyBjb250cm9sXG5cdCAgMTgsIC8vIGFsdFxuXHQgIDkxLCAvLyBXaW5kb3dzIGtleSAvIGxlZnQgQXBwbGUgY21kXG5cdCAgOTMgLy8gV2luZG93cyBtZW51IC8gcmlnaHQgQXBwbGUgY21kXG5cdCAgXTtcblxuXHQgIC8vIGxpc3Qgb2Yga2V5cyBmb3Igd2hpY2ggd2UgY2hhbmdlIGludGVudCBldmVuIGZvciBmb3JtIGlucHV0c1xuXHQgIHZhciBjaGFuZ2VJbnRlbnRNYXAgPSBbOSAvLyB0YWJcblx0ICBdO1xuXG5cdCAgLy8gbWFwcGluZyBvZiBldmVudHMgdG8gaW5wdXQgdHlwZXNcblx0ICB2YXIgaW5wdXRNYXAgPSB7XG5cdCAgICBrZXlkb3duOiAna2V5Ym9hcmQnLFxuXHQgICAga2V5dXA6ICdrZXlib2FyZCcsXG5cdCAgICBtb3VzZWRvd246ICdtb3VzZScsXG5cdCAgICBtb3VzZW1vdmU6ICdtb3VzZScsXG5cdCAgICBNU1BvaW50ZXJEb3duOiAncG9pbnRlcicsXG5cdCAgICBNU1BvaW50ZXJNb3ZlOiAncG9pbnRlcicsXG5cdCAgICBwb2ludGVyZG93bjogJ3BvaW50ZXInLFxuXHQgICAgcG9pbnRlcm1vdmU6ICdwb2ludGVyJyxcblx0ICAgIHRvdWNoc3RhcnQ6ICd0b3VjaCdcblx0ICB9O1xuXG5cdCAgLy8gYXJyYXkgb2YgYWxsIHVzZWQgaW5wdXQgdHlwZXNcblx0ICB2YXIgaW5wdXRUeXBlcyA9IFtdO1xuXG5cdCAgLy8gYm9vbGVhbjogdHJ1ZSBpZiB0b3VjaCBidWZmZXIgaXMgYWN0aXZlXG5cdCAgdmFyIGlzQnVmZmVyaW5nID0gZmFsc2U7XG5cblx0ICAvLyBib29sZWFuOiB0cnVlIGlmIHRoZSBwYWdlIGlzIGJlaW5nIHNjcm9sbGVkXG5cdCAgdmFyIGlzU2Nyb2xsaW5nID0gZmFsc2U7XG5cblx0ICAvLyBzdG9yZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uXG5cdCAgdmFyIG1vdXNlUG9zID0ge1xuXHQgICAgeDogbnVsbCxcblx0ICAgIHk6IG51bGxcblx0ICB9O1xuXG5cdCAgLy8gbWFwIG9mIElFIDEwIHBvaW50ZXIgZXZlbnRzXG5cdCAgdmFyIHBvaW50ZXJNYXAgPSB7XG5cdCAgICAyOiAndG91Y2gnLFxuXHQgICAgMzogJ3RvdWNoJywgLy8gdHJlYXQgcGVuIGxpa2UgdG91Y2hcblx0ICAgIDQ6ICdtb3VzZSdcblx0ICB9O1xuXG5cdCAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuXG5cdCAgdHJ5IHtcblx0ICAgIHZhciBvcHRzID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICAgICAgc3VwcG9ydHNQYXNzaXZlID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7XG5cdCAgfSBjYXRjaCAoZSkge31cblxuXHQgIC8qXG5cdCAgICogc2V0IHVwXG5cdCAgICovXG5cblx0ICB2YXIgc2V0VXAgPSBmdW5jdGlvbiBzZXRVcCgpIHtcblx0ICAgIC8vIGFkZCBjb3JyZWN0IG1vdXNlIHdoZWVsIGV2ZW50IG1hcHBpbmcgdG8gYGlucHV0TWFwYFxuXHQgICAgaW5wdXRNYXBbZGV0ZWN0V2hlZWwoKV0gPSAnbW91c2UnO1xuXG5cdCAgICBhZGRMaXN0ZW5lcnMoKTtcblx0ICAgIHNldElucHV0KCk7XG5cdCAgfTtcblxuXHQgIC8qXG5cdCAgICogZXZlbnRzXG5cdCAgICovXG5cblx0ICB2YXIgYWRkTGlzdGVuZXJzID0gZnVuY3Rpb24gYWRkTGlzdGVuZXJzKCkge1xuXHQgICAgLy8gYHBvaW50ZXJtb3ZlYCwgYE1TUG9pbnRlck1vdmVgLCBgbW91c2Vtb3ZlYCBhbmQgbW91c2Ugd2hlZWwgZXZlbnQgYmluZGluZ1xuXHQgICAgLy8gY2FuIG9ubHkgZGVtb25zdHJhdGUgcG90ZW50aWFsLCBidXQgbm90IGFjdHVhbCwgaW50ZXJhY3Rpb25cblx0ICAgIC8vIGFuZCBhcmUgdHJlYXRlZCBzZXBhcmF0ZWx5XG5cdCAgICB2YXIgb3B0aW9ucyA9IHN1cHBvcnRzUGFzc2l2ZSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogZmFsc2U7XG5cblx0ICAgIC8vIHBvaW50ZXIgZXZlbnRzIChtb3VzZSwgcGVuLCB0b3VjaClcblx0ICAgIGlmICh3aW5kb3cuUG9pbnRlckV2ZW50KSB7XG5cdCAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHVwZGF0ZUlucHV0KTtcblx0ICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgc2V0SW50ZW50KTtcblx0ICAgIH0gZWxzZSBpZiAod2luZG93Lk1TUG9pbnRlckV2ZW50KSB7XG5cdCAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdNU1BvaW50ZXJEb3duJywgdXBkYXRlSW5wdXQpO1xuXHQgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignTVNQb2ludGVyTW92ZScsIHNldEludGVudCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvLyBtb3VzZSBldmVudHNcblx0ICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHVwZGF0ZUlucHV0KTtcblx0ICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHNldEludGVudCk7XG5cblx0ICAgICAgLy8gdG91Y2ggZXZlbnRzXG5cdCAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cpIHtcblx0ICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRvdWNoQnVmZmVyLCBvcHRpb25zKTtcblx0ICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaEJ1ZmZlcik7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgLy8gbW91c2Ugd2hlZWxcblx0ICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKGRldGVjdFdoZWVsKCksIHNldEludGVudCwgb3B0aW9ucyk7XG5cblx0ICAgIC8vIGtleWJvYXJkIGV2ZW50c1xuXHQgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB1cGRhdGVJbnB1dCk7XG5cdCAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB1cGRhdGVJbnB1dCk7XG5cdCAgfTtcblxuXHQgIC8vIGNoZWNrcyBjb25kaXRpb25zIGJlZm9yZSB1cGRhdGluZyBuZXcgaW5wdXRcblx0ICB2YXIgdXBkYXRlSW5wdXQgPSBmdW5jdGlvbiB1cGRhdGVJbnB1dChldmVudCkge1xuXHQgICAgLy8gb25seSBleGVjdXRlIGlmIHRoZSB0b3VjaCBidWZmZXIgdGltZXIgaXNuJ3QgcnVubmluZ1xuXHQgICAgaWYgKCFpc0J1ZmZlcmluZykge1xuXHQgICAgICB2YXIgZXZlbnRLZXkgPSBldmVudC53aGljaDtcblx0ICAgICAgdmFyIHZhbHVlID0gaW5wdXRNYXBbZXZlbnQudHlwZV07XG5cdCAgICAgIGlmICh2YWx1ZSA9PT0gJ3BvaW50ZXInKSB2YWx1ZSA9IHBvaW50ZXJUeXBlKGV2ZW50KTtcblxuXHQgICAgICBpZiAoY3VycmVudElucHV0ICE9PSB2YWx1ZSB8fCBjdXJyZW50SW50ZW50ICE9PSB2YWx1ZSkge1xuXHQgICAgICAgIHZhciBhY3RpdmVFbGVtID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0ICAgICAgICB2YXIgYWN0aXZlSW5wdXQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgbm90Rm9ybUlucHV0ID0gYWN0aXZlRWxlbSAmJiBhY3RpdmVFbGVtLm5vZGVOYW1lICYmIGZvcm1JbnB1dHMuaW5kZXhPZihhY3RpdmVFbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID09PSAtMTtcblxuXHQgICAgICAgIGlmIChub3RGb3JtSW5wdXQgfHwgY2hhbmdlSW50ZW50TWFwLmluZGV4T2YoZXZlbnRLZXkpICE9PSAtMSkge1xuXHQgICAgICAgICAgYWN0aXZlSW5wdXQgPSB0cnVlO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RvdWNoJyB8fFxuXHQgICAgICAgIC8vIGlnbm9yZSBtb3VzZSBtb2RpZmllciBrZXlzXG5cdCAgICAgICAgdmFsdWUgPT09ICdtb3VzZScgfHxcblx0ICAgICAgICAvLyBkb24ndCBzd2l0Y2ggaWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIGZvcm0gaW5wdXRcblx0ICAgICAgICB2YWx1ZSA9PT0gJ2tleWJvYXJkJyAmJiBldmVudEtleSAmJiBhY3RpdmVJbnB1dCAmJiBpZ25vcmVNYXAuaW5kZXhPZihldmVudEtleSkgPT09IC0xKSB7XG5cdCAgICAgICAgICAvLyBzZXQgdGhlIGN1cnJlbnQgYW5kIGNhdGNoLWFsbCB2YXJpYWJsZVxuXHQgICAgICAgICAgY3VycmVudElucHV0ID0gY3VycmVudEludGVudCA9IHZhbHVlO1xuXG5cdCAgICAgICAgICBzZXRJbnB1dCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH07XG5cblx0ICAvLyB1cGRhdGVzIHRoZSBkb2MgYW5kIGBpbnB1dFR5cGVzYCBhcnJheSB3aXRoIG5ldyBpbnB1dFxuXHQgIHZhciBzZXRJbnB1dCA9IGZ1bmN0aW9uIHNldElucHV0KCkge1xuXHQgICAgZG9jLnNldEF0dHJpYnV0ZSgnZGF0YS13aGF0aW5wdXQnLCBjdXJyZW50SW5wdXQpO1xuXHQgICAgZG9jLnNldEF0dHJpYnV0ZSgnZGF0YS13aGF0aW50ZW50JywgY3VycmVudElucHV0KTtcblxuXHQgICAgaWYgKGlucHV0VHlwZXMuaW5kZXhPZihjdXJyZW50SW5wdXQpID09PSAtMSkge1xuXHQgICAgICBpbnB1dFR5cGVzLnB1c2goY3VycmVudElucHV0KTtcblx0ICAgICAgZG9jLmNsYXNzTmFtZSArPSAnIHdoYXRpbnB1dC10eXBlcy0nICsgY3VycmVudElucHV0O1xuXHQgICAgfVxuXG5cdCAgICBmaXJlRnVuY3Rpb25zKCdpbnB1dCcpO1xuXHQgIH07XG5cblx0ICAvLyB1cGRhdGVzIGlucHV0IGludGVudCBmb3IgYG1vdXNlbW92ZWAgYW5kIGBwb2ludGVybW92ZWBcblx0ICB2YXIgc2V0SW50ZW50ID0gZnVuY3Rpb24gc2V0SW50ZW50KGV2ZW50KSB7XG5cdCAgICAvLyB0ZXN0IHRvIHNlZSBpZiBgbW91c2Vtb3ZlYCBoYXBwZW5lZCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuXG5cdCAgICAvLyB0byBkZXRlY3Qgc2Nyb2xsaW5nIHZlcnN1cyBtb3VzZW1vdmVcblx0ICAgIGlmIChtb3VzZVBvc1sneCddICE9PSBldmVudC5zY3JlZW5YIHx8IG1vdXNlUG9zWyd5J10gIT09IGV2ZW50LnNjcmVlblkpIHtcblx0ICAgICAgaXNTY3JvbGxpbmcgPSBmYWxzZTtcblxuXHQgICAgICBtb3VzZVBvc1sneCddID0gZXZlbnQuc2NyZWVuWDtcblx0ICAgICAgbW91c2VQb3NbJ3knXSA9IGV2ZW50LnNjcmVlblk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG5cdCAgICB9XG5cblx0ICAgIC8vIG9ubHkgZXhlY3V0ZSBpZiB0aGUgdG91Y2ggYnVmZmVyIHRpbWVyIGlzbid0IHJ1bm5pbmdcblx0ICAgIC8vIG9yIHNjcm9sbGluZyBpc24ndCBoYXBwZW5pbmdcblx0ICAgIGlmICghaXNCdWZmZXJpbmcgJiYgIWlzU2Nyb2xsaW5nKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IGlucHV0TWFwW2V2ZW50LnR5cGVdO1xuXHQgICAgICBpZiAodmFsdWUgPT09ICdwb2ludGVyJykgdmFsdWUgPSBwb2ludGVyVHlwZShldmVudCk7XG5cblx0ICAgICAgaWYgKGN1cnJlbnRJbnRlbnQgIT09IHZhbHVlKSB7XG5cdCAgICAgICAgY3VycmVudEludGVudCA9IHZhbHVlO1xuXG5cdCAgICAgICAgZG9jLnNldEF0dHJpYnV0ZSgnZGF0YS13aGF0aW50ZW50JywgY3VycmVudEludGVudCk7XG5cblx0ICAgICAgICBmaXJlRnVuY3Rpb25zKCdpbnRlbnQnKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH07XG5cblx0ICAvLyBidWZmZXJzIHRvdWNoIGV2ZW50cyBiZWNhdXNlIHRoZXkgZnJlcXVlbnRseSBhbHNvIGZpcmUgbW91c2UgZXZlbnRzXG5cdCAgdmFyIHRvdWNoQnVmZmVyID0gZnVuY3Rpb24gdG91Y2hCdWZmZXIoZXZlbnQpIHtcblx0ICAgIGlmIChldmVudC50eXBlID09PSAndG91Y2hzdGFydCcpIHtcblx0ICAgICAgaXNCdWZmZXJpbmcgPSBmYWxzZTtcblxuXHQgICAgICAvLyBzZXQgdGhlIGN1cnJlbnQgaW5wdXRcblx0ICAgICAgdXBkYXRlSW5wdXQoZXZlbnQpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaXNCdWZmZXJpbmcgPSB0cnVlO1xuXHQgICAgfVxuXHQgIH07XG5cblx0ICB2YXIgZmlyZUZ1bmN0aW9ucyA9IGZ1bmN0aW9uIGZpcmVGdW5jdGlvbnModHlwZSkge1xuXHQgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGZ1bmN0aW9uTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICBpZiAoZnVuY3Rpb25MaXN0W2ldLnR5cGUgPT09IHR5cGUpIHtcblx0ICAgICAgICBmdW5jdGlvbkxpc3RbaV0uZm4uY2FsbCh1bmRlZmluZWQsIGN1cnJlbnRJbnRlbnQpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfTtcblxuXHQgIC8qXG5cdCAgICogdXRpbGl0aWVzXG5cdCAgICovXG5cblx0ICB2YXIgcG9pbnRlclR5cGUgPSBmdW5jdGlvbiBwb2ludGVyVHlwZShldmVudCkge1xuXHQgICAgaWYgKHR5cGVvZiBldmVudC5wb2ludGVyVHlwZSA9PT0gJ251bWJlcicpIHtcblx0ICAgICAgcmV0dXJuIHBvaW50ZXJNYXBbZXZlbnQucG9pbnRlclR5cGVdO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgLy8gdHJlYXQgcGVuIGxpa2UgdG91Y2hcblx0ICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJUeXBlID09PSAncGVuJyA/ICd0b3VjaCcgOiBldmVudC5wb2ludGVyVHlwZTtcblx0ICAgIH1cblx0ICB9O1xuXG5cdCAgLy8gZGV0ZWN0IHZlcnNpb24gb2YgbW91c2Ugd2hlZWwgZXZlbnQgdG8gdXNlXG5cdCAgLy8gdmlhIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy93aGVlbFxuXHQgIHZhciBkZXRlY3RXaGVlbCA9IGZ1bmN0aW9uIGRldGVjdFdoZWVsKCkge1xuXHQgICAgdmFyIHdoZWVsVHlwZSA9IHZvaWQgMDtcblxuXHQgICAgLy8gTW9kZXJuIGJyb3dzZXJzIHN1cHBvcnQgXCJ3aGVlbFwiXG5cdCAgICBpZiAoJ29ud2hlZWwnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSB7XG5cdCAgICAgIHdoZWVsVHlwZSA9ICd3aGVlbCc7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvLyBXZWJraXQgYW5kIElFIHN1cHBvcnQgYXQgbGVhc3QgXCJtb3VzZXdoZWVsXCJcblx0ICAgICAgLy8gb3IgYXNzdW1lIHRoYXQgcmVtYWluaW5nIGJyb3dzZXJzIGFyZSBvbGRlciBGaXJlZm94XG5cdCAgICAgIHdoZWVsVHlwZSA9IGRvY3VtZW50Lm9ubW91c2V3aGVlbCAhPT0gdW5kZWZpbmVkID8gJ21vdXNld2hlZWwnIDogJ0RPTU1vdXNlU2Nyb2xsJztcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIHdoZWVsVHlwZTtcblx0ICB9O1xuXG5cdCAgdmFyIG9ialBvcyA9IGZ1bmN0aW9uIG9ialBvcyhtYXRjaCkge1xuXHQgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGZ1bmN0aW9uTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICBpZiAoZnVuY3Rpb25MaXN0W2ldLmZuID09PSBtYXRjaCkge1xuXHQgICAgICAgIHJldHVybiBpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfTtcblxuXHQgIC8qXG5cdCAgICogaW5pdFxuXHQgICAqL1xuXG5cdCAgLy8gZG9uJ3Qgc3RhcnQgc2NyaXB0IHVubGVzcyBicm93c2VyIGN1dHMgdGhlIG11c3RhcmRcblx0ICAvLyAoYWxzbyBwYXNzZXMgaWYgcG9seWZpbGxzIGFyZSB1c2VkKVxuXHQgIGlmICgnYWRkRXZlbnRMaXN0ZW5lcicgaW4gd2luZG93ICYmIEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XG5cdCAgICBzZXRVcCgpO1xuXHQgIH1cblxuXHQgIC8qXG5cdCAgICogYXBpXG5cdCAgICovXG5cblx0ICByZXR1cm4ge1xuXHQgICAgLy8gcmV0dXJucyBzdHJpbmc6IHRoZSBjdXJyZW50IGlucHV0IHR5cGVcblx0ICAgIC8vIG9wdDogJ2xvb3NlJ3wnc3RyaWN0J1xuXHQgICAgLy8gJ3N0cmljdCcgKGRlZmF1bHQpOiByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBgZGF0YS13aGF0aW5wdXRgIGF0dHJpYnV0ZVxuXHQgICAgLy8gJ2xvb3NlJzogaW5jbHVkZXMgYGRhdGEtd2hhdGludGVudGAgdmFsdWUgaWYgaXQncyBtb3JlIGN1cnJlbnQgdGhhbiBgZGF0YS13aGF0aW5wdXRgXG5cdCAgICBhc2s6IGZ1bmN0aW9uIGFzayhvcHQpIHtcblx0ICAgICAgcmV0dXJuIG9wdCA9PT0gJ2xvb3NlJyA/IGN1cnJlbnRJbnRlbnQgOiBjdXJyZW50SW5wdXQ7XG5cdCAgICB9LFxuXG5cdCAgICAvLyByZXR1cm5zIGFycmF5OiBhbGwgdGhlIGRldGVjdGVkIGlucHV0IHR5cGVzXG5cdCAgICB0eXBlczogZnVuY3Rpb24gdHlwZXMoKSB7XG5cdCAgICAgIHJldHVybiBpbnB1dFR5cGVzO1xuXHQgICAgfSxcblxuXHQgICAgLy8gb3ZlcndyaXRlcyBpZ25vcmVkIGtleXMgd2l0aCBwcm92aWRlZCBhcnJheVxuXHQgICAgaWdub3JlS2V5czogZnVuY3Rpb24gaWdub3JlS2V5cyhhcnIpIHtcblx0ICAgICAgaWdub3JlTWFwID0gYXJyO1xuXHQgICAgfSxcblxuXHQgICAgLy8gYXR0YWNoIGZ1bmN0aW9ucyB0byBpbnB1dCBhbmQgaW50ZW50IFwiZXZlbnRzXCJcblx0ICAgIC8vIGZ1bmN0OiBmdW5jdGlvbiB0byBmaXJlIG9uIGNoYW5nZVxuXHQgICAgLy8gZXZlbnRUeXBlOiAnaW5wdXQnfCdpbnRlbnQnXG5cdCAgICByZWdpc3Rlck9uQ2hhbmdlOiBmdW5jdGlvbiByZWdpc3Rlck9uQ2hhbmdlKGZuLCBldmVudFR5cGUpIHtcblx0ICAgICAgZnVuY3Rpb25MaXN0LnB1c2goe1xuXHQgICAgICAgIGZuOiBmbixcblx0ICAgICAgICB0eXBlOiBldmVudFR5cGUgfHwgJ2lucHV0J1xuXHQgICAgICB9KTtcblx0ICAgIH0sXG5cblx0ICAgIHVuUmVnaXN0ZXJPbkNoYW5nZTogZnVuY3Rpb24gdW5SZWdpc3Rlck9uQ2hhbmdlKGZuKSB7XG5cdCAgICAgIHZhciBwb3NpdGlvbiA9IG9ialBvcyhmbik7XG5cblx0ICAgICAgaWYgKHBvc2l0aW9uKSB7XG5cdCAgICAgICAgZnVuY3Rpb25MaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9O1xuXHR9KCk7XG5cbi8qKiovIH1cbi8qKioqKiovIF0pXG59KTtcbjsiLCJtb2R1bGUuZXhwb3J0cyA9IGpRdWVyeTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB3aGF0SW5wdXQgZnJvbSAnd2hhdC1pbnB1dCc7XG5cbndpbmRvdy4kID0gJDtcblxuLy9pbXBvcnQgRm91bmRhdGlvbiBmcm9tICdmb3VuZGF0aW9uLXNpdGVzJztcbi8vIElmIHlvdSB3YW50IHRvIHBpY2sgYW5kIGNob29zZSB3aGljaCBtb2R1bGVzIHRvIGluY2x1ZGUsIGNvbW1lbnQgb3V0IHRoZSBhYm92ZSBhbmQgdW5jb21tZW50XG4vLyB0aGUgbGluZSBiZWxvd1xuIGltcG9ydCAnLi9saWIvZm91bmRhdGlvbi1leHBsaWNpdC1waWVjZXMnO1xuXG4kKGRvY3VtZW50KS5mb3VuZGF0aW9uKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9