From f9d3017aac15539e4806b84d33eaa47d4df654b6 Mon Sep 17 00:00:00 2001 From: Patrick Brosset Date: Wed, 6 Dec 2023 15:41:14 +0100 Subject: [PATCH] Minor calendar app fix --- slow-calendar/public/bundle.js | 4 ++-- slow-calendar/src/Sidebar.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/slow-calendar/public/bundle.js b/slow-calendar/public/bundle.js index c2f4329..b28dbf7 100644 --- a/slow-calendar/public/bundle.js +++ b/slow-calendar/public/bundle.js @@ -1,2 +1,2 @@ -(()=>{"use strict";function e(e,n,...s){if(!e)throw new TypeError(t(n,s))}function t(e,t){let s=0;return e.replace(/%[os]/gu,(()=>n(t[s++])))}function n(e){return"object"!=typeof e||null===e?String(e):Object.prototype.toString.call(e)}const s="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:void 0;let i;class o{constructor(e,t){this.code=e,this.message=t}warn(...e){var t;try{i;const n=(null!==(t=(new Error).stack)&&void 0!==t?t:"").replace(/^(?:.+?\n){2}/gu,"\n");console.warn(this.message,...e,n)}catch(e){}}}const a=new o("W01","Unable to initialize event under dispatching."),r=new o("W02","Assigning any falsy value to 'cancelBubble' property has no effect."),l=new o("W03","Assigning any truthy value to 'returnValue' property has no effect."),c=new o("W04","Unable to preventDefault on non-cancelable events."),d=new o("W05","Unable to preventDefault inside passive event listener invocation."),h=new o("W06","An event listener wasn't added because it has been added already: %o, %o"),u=new o("W07","The %o option value was abandoned because the event listener wasn't added as duplicated."),p=new o("W08","The 'callback' argument must be a function or an object that has 'handleEvent' method: %o");new o("W09","Event attribute handler must be a function: %o");class g{static get NONE(){return v}static get CAPTURING_PHASE(){return m}static get AT_TARGET(){return E}static get BUBBLING_PHASE(){return y}constructor(e,t){Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0});const n=null!=t?t:{};f.set(this,{type:String(e),bubbles:Boolean(n.bubbles),cancelable:Boolean(n.cancelable),composed:Boolean(n.composed),target:null,currentTarget:null,stopPropagationFlag:!1,stopImmediatePropagationFlag:!1,canceledFlag:!1,inPassiveListenerFlag:!1,dispatchFlag:!1,timeStamp:Date.now()})}get type(){return b(this).type}get target(){return b(this).target}get srcElement(){return b(this).target}get currentTarget(){return b(this).currentTarget}composedPath(){const e=b(this).currentTarget;return e?[e]:[]}get NONE(){return v}get CAPTURING_PHASE(){return m}get AT_TARGET(){return E}get BUBBLING_PHASE(){return y}get eventPhase(){return b(this).dispatchFlag?2:0}stopPropagation(){b(this).stopPropagationFlag=!0}get cancelBubble(){return b(this).stopPropagationFlag}set cancelBubble(e){e?b(this).stopPropagationFlag=!0:r.warn()}stopImmediatePropagation(){const e=b(this);e.stopPropagationFlag=e.stopImmediatePropagationFlag=!0}get bubbles(){return b(this).bubbles}get cancelable(){return b(this).cancelable}get returnValue(){return!b(this).canceledFlag}set returnValue(e){e?l.warn():w(b(this))}preventDefault(){w(b(this))}get defaultPrevented(){return b(this).canceledFlag}get composed(){return b(this).composed}get isTrusted(){return!1}get timeStamp(){return b(this).timeStamp}initEvent(e,t=!1,n=!1){const s=b(this);s.dispatchFlag?a.warn():f.set(this,{...s,type:String(e),bubbles:Boolean(t),cancelable:Boolean(n),target:null,currentTarget:null,stopPropagationFlag:!1,stopImmediatePropagationFlag:!1,canceledFlag:!1})}}const v=0,m=1,E=2,y=3,f=new WeakMap;function b(t,n="this"){const s=f.get(t);return e(null!=s,"'%s' must be an object that Event constructor created, but got another one: %o",n,t),s}function w(e){e.inPassiveListenerFlag?d.warn():e.cancelable?e.canceledFlag=!0:c.warn()}Object.defineProperty(g,"NONE",{enumerable:!0}),Object.defineProperty(g,"CAPTURING_PHASE",{enumerable:!0}),Object.defineProperty(g,"AT_TARGET",{enumerable:!0}),Object.defineProperty(g,"BUBBLING_PHASE",{enumerable:!0});const D=Object.getOwnPropertyNames(g.prototype);for(let e=0;ei,configurable:!0,enumerable:!0})}}class P extends g{static wrap(e){return new(L(e))(e)}constructor(e){super(e.type,{bubbles:e.bubbles,cancelable:e.cancelable,composed:e.composed}),e.cancelBubble&&super.stopPropagation(),e.defaultPrevented&&super.preventDefault(),M.set(this,{original:e});const t=Object.keys(e);for(let n=0;nn!==t)),!1):(e.listeners.splice(t,1),!0)}R.set(Object.prototype,P),void 0!==s&&void 0!==s.Event&&R.set(s.Event.prototype,P);class G{constructor(){B.set(this,Object.create(null))}addEventListener(e,t,n){const s=H(this),{callback:i,capture:o,once:a,passive:r,signal:l,type:c}=function(e,t,n){var s;return W(t),"object"==typeof n&&null!==n?{type:String(e),callback:null!=t?t:void 0,capture:Boolean(n.capture),passive:Boolean(n.passive),once:Boolean(n.once),signal:null!==(s=n.signal)&&void 0!==s?s:void 0}:{type:String(e),callback:null!=t?t:void 0,capture:Boolean(n),passive:!1,once:!1,signal:void 0}}(e,t,n);if(null==i||(null==l?void 0:l.aborted))return;const d=function(e,t){var n;return null!==(n=e[t])&&void 0!==n?n:e[t]={attrCallback:void 0,attrListener:void 0,cow:!1,listeners:[]}}(s,c),p=j(d,i,o);-1===p?function(e,t,n,s,i,o){let a;o&&(a=x.bind(null,e,t,n),o.addEventListener("abort",a));const r=function(e,t,n,s,i,o){return{callback:e,flags:(t?1:0)|(n?2:0)|(s?4:0),signal:i,signalListener:o}}(t,n,s,i,o,a);e.cow?(e.cow=!1,e.listeners=[...e.listeners,r]):e.listeners.push(r)}(d,i,o,r,a,l):function(e,t,n,s){h.warn($(e)?"capture":"bubble",e.callback),I(e)!==t&&u.warn("passive"),F(e)!==n&&u.warn("once"),e.signal!==s&&u.warn("signal")}(d.listeners[p],r,a,l)}removeEventListener(e,t,n){const s=H(this),{callback:i,capture:o,type:a}=function(e,t,n){return W(t),"object"==typeof n&&null!==n?{type:String(e),callback:null!=t?t:void 0,capture:Boolean(n.capture)}:{type:String(e),callback:null!=t?t:void 0,capture:Boolean(n)}}(e,t,n),r=s[a];null!=i&&r&&x(r,i,o)}dispatchEvent(e){const t=H(this)[String(e.type)];if(null==t)return!0;const n=e instanceof g?e:P.wrap(e),i=b(n,"event");if(i.dispatchFlag)throw o="This event has been in dispatching.",s.DOMException?new s.DOMException(o,"InvalidStateError"):(null==_&&(_=class e extends Error{constructor(t){super(t),Error.captureStackTrace&&Error.captureStackTrace(this,e)}get code(){return 11}get name(){return"InvalidStateError"}},Object.defineProperties(_.prototype,{code:{enumerable:!0},name:{enumerable:!0}}),k(_),k(_.prototype)),new _(o));var o;if(i.dispatchFlag=!0,i.target=i.currentTarget=this,!i.stopPropagationFlag){const{cow:e,listeners:s}=t;t.cow=!0;for(let o=0;oe.date.getFullYear()===t.getFullYear()&&e.date.getMonth()===t.getMonth()&&e.date.getDate()===t.getDate())).sort(((e,t)=>!e.time&&t.time?-1:e.time&&!t.time?1:e.time||t.time?parseInt(e.time.replace(/^0/,"").replace(":",""))-parseInt(t.time.replace(/^0/,"").replace(":","")):0)).sort(((e,t)=>e.multiDays&&!t.multiDays?-1:!e.multiDays&&t.multiDays?1:void 0))}void 0!==s&&void 0!==s.EventTarget&&Object.setPrototypeOf(G.prototype,s.EventTarget.prototype);const V=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];class q extends G{constructor(e,t,n){super(),this.el=e,this._date=new Date,this.rootEl=e,this._date=t,this._events=n,this.render()}render(){this.rootEl.innerHTML="";const e=this._date.getMonth(),t=this._date.getFullYear(),n=new Date(t,e,1),s=new Date(t,e+1,0),i=n.getDay(),o=s.getDay(),a=s.getDate(),r=new Date(t,e,0).getDate(),l=[];let c=0;for(let n=r-i+1;n<=r;n++){const s=new Date(t,e-1,n);l.push({date:s,html:this.renderDay(s,n,c,"prev-month")}),c++}for(let n=1;n<=a;n++){const s=new Date(t,e,n);l.push({date:s,html:this.renderDay(s,n,c)}),c++}for(let n=1;n<=7-o-1;n++){const s=new Date(t,e+1,n);l.push({date:s,html:this.renderDay(s,n,c,"next-month")}),c++}for(const{date:e,html:t}of l)this.rootEl.insertAdjacentHTML("beforeend",t),this.rootEl.lastElementChild.addEventListener("click",(t=>{this.dispatchEvent(new CustomEvent("day-clicked",{detail:e}))}));this.updateNowMarker()}renderDay(e,t,n,s=""){const i=U(this._events,e);return`\n
\n
\n ${V[e.getDay()]}\n ${t}\n
\n
    \n ${i.map((e=>e.asOneLineHTML(n))).join("")}\n
\n
\n `}updateNowMarker(){const e=new Date,t=100*(100*e.getHours()+e.getMinutes())/2400,n=this.rootEl.querySelector(".day.today");if(n){const e=n.offsetHeight*t/100;this.rootEl.style.setProperty("--now-marker",`${e}px`)}setTimeout((()=>this.updateNowMarker()),1e3)}set date(e){this._date=e,this.render()}set events(e){this._events=e,this.render()}}const J=["January","February","March","April","May","June","July","August","September","October","November","December"];class X extends G{constructor(e,t,n){super(),this.el=e,this.selectedMode="month",this.rootEl=e,this._date=t,this.selectedMode=n,this.render()}formatMonthYear(){const e=this._date.getMonth(),t=this._date.getFullYear();return`${J[e]} ${t}`}render(){this.rootEl.innerHTML=`\n \n \n \n ${this.formatMonthYear()}\n \n \n \n \n `,this.rootEl.querySelector("#prev-month").addEventListener("click",(()=>{console.log(`Prev ${this.selectedMode} clicked`),this.dispatchEvent(new g("prev"))})),this.rootEl.querySelector("#next-month").addEventListener("click",(()=>{console.log(`Next ${this.selectedMode} clicked`),this.dispatchEvent(new g("next"))})),this.rootEl.querySelector("#today").addEventListener("click",(()=>{console.log("Today clicked"),this.dispatchEvent(new g("today"))})),this.rootEl.querySelector("#month-view").addEventListener("click",(()=>{console.log("Month view clicked"),this.dispatchEvent(new g("month-view")),this.selectedMode="month"})),this.rootEl.querySelector("#week-view").addEventListener("click",(()=>{console.log("Week view clicked"),this.dispatchEvent(new g("week-view")),this.selectedMode="week"}))}set date(e){this._date=e,this.render()}}class z{constructor(e,t,n){this.el=e,this._events=[],this._date=new Date,this.rootEl=e,this._date=t,this._events=n,this.render()}render(){if(this.rootEl.innerHTML="\n

Click a day to view events

\n ",!this._events.length)return;this.rootEl.innerHTML="";const e=document.createElement("ul");e.className="events",this.rootEl.appendChild(e);for(const t of this._events)e.innerHTML+=t.asFullHTML()}set events(e){this._events=e,this.render()}}const Q=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];class Z extends G{constructor(e,t,n){super(),this.el=e,this._date=new Date,this.rootEl=e,this._date=t,this._events=n,this.render()}render(){this.rootEl.innerHTML="";const e=this._date.getMonth(),t=this._date.getFullYear(),n=this._date.getDate(),s=this._date.getDay(),i=new Date(t,e,n-s);for(let n=0;n<7;n++){const s=new Date(t,e,i.getDate()+n);this.rootEl.insertAdjacentHTML("beforeend",this.renderDay(s,s.getDate())),this.rootEl.lastElementChild.addEventListener("click",(e=>{this.dispatchEvent(new CustomEvent("day-clicked",{detail:s}))}))}this.updateNowMarker()}renderDay(e,t,n=""){const s=U(this._events,e);return`\n
\n
\n ${Q[e.getDay()]}\n ${t}\n
\n
    \n ${s.map((e=>e.asMediumLengthHTML())).join("")}\n
\n
\n `}updateNowMarker(){const e=new Date,t=100*(100*e.getHours()+e.getMinutes())/2400,n=this.rootEl.querySelector(".day.today");if(n){const e=n.offsetHeight*t/100;this.rootEl.style.setProperty("--now-marker",`${e}px`)}setTimeout((()=>this.updateNowMarker()),1e3)}set date(e){this._date=e,this.render()}set events(e){this._events=e,this.render()}}class K extends G{constructor(e,t,n,s){super(),this.mode="month",this.rootEl=e,this._date=t,this._events=s,this.mode=n,this.render()}render(){this.rootEl.innerHTML="",this.toolbarEl=document.createElement("div"),this.toolbarEl.id="toolbar",this.rootEl.appendChild(this.toolbarEl),this.toolbar=new X(this.toolbarEl,this._date,this.mode),this.toolbar.addEventListener("prev",(()=>{const e="month"===this.mode?new Date(this._date.getFullYear(),this._date.getMonth()-1,1):new Date(this._date.getFullYear(),this._date.getMonth(),this._date.getDate()-7);this.date=e,this.dispatchEvent(new CustomEvent("date-changed",{detail:this._date}))})),this.toolbar.addEventListener("next",(()=>{const e="month"===this.mode?new Date(this._date.getFullYear(),this._date.getMonth()+1,1):new Date(this._date.getFullYear(),this._date.getMonth(),this._date.getDate()+7);this.date=e,this.dispatchEvent(new CustomEvent("date-changed",{detail:this._date}))})),this.toolbar.addEventListener("today",(()=>{this.date=new Date,this.dispatchEvent(new CustomEvent("date-changed",{detail:this._date}))})),this.toolbar.addEventListener("month-view",(()=>{this.mode="month",this.monthGridEl.style.display="grid",this.weekGridEl.style.display="none",this.dispatchEvent(new CustomEvent("mode-changed",{detail:this.mode}))})),this.toolbar.addEventListener("week-view",(()=>{this.mode="week",this.monthGridEl.style.display="none",this.weekGridEl.style.display="grid",this.dispatchEvent(new CustomEvent("mode-changed",{detail:this.mode}))})),this.monthGridEl=document.createElement("div"),this.monthGridEl.id="month-grid",this.rootEl.appendChild(this.monthGridEl),this.monthGrid=new q(this.monthGridEl,this._date,this._events),this.weekGridEl=document.createElement("div"),this.weekGridEl.id="week-grid",this.rootEl.appendChild(this.weekGridEl),this.weekGrid=new Z(this.weekGridEl,this._date,this._events),this.sidebarEl=document.createElement("div"),this.sidebarEl.id="sidebar",this.rootEl.appendChild(this.sidebarEl),this.sidebar=new z(this.sidebarEl,this._date,this._events),this.monthGrid.addEventListener("day-clicked",(e=>{const t=e.detail,n=U(this._events,t);this.sidebar.events=n})),this.weekGrid.addEventListener("day-clicked",(e=>{const t=e.detail,n=U(this._events,t);this.sidebar.events=n})),this.sidebar.events=U(this._events,new Date),"week"===this.mode?(this.monthGridEl.style.display="none",this.weekGridEl.style.display="grid"):(this.monthGridEl.style.display="grid",this.weekGridEl.style.display="none")}set date(e){console.log("Setting date to",e),this._date=e,this.monthGrid.date=e,this.weekGrid.date=e,this.toolbar.date=e,this.sidebar.events=U(this._events,this._date)}set events(e){this._events=e,this.monthGrid.events=e,this.weekGrid.events=e,this.sidebar.events=U(this._events,this._date)}}class ee{constructor(e,t,n){this.rsvp=!1,this.title=e,this.id=t,this.date=n}asOneLineHTML(e=void 0){const t=this.time?`${this.time}`:"";return`\n
  • \n
    ${t} ${this.title}
    \n
  • \n `}asMediumLengthHTML(){const e=this.time?`${this.time}`:"";return`\n
  • \n
    ${e}
    \n

    ${this.title}

    \n

    ${this.description}

    \n
  • \n `}asFullHTML(){let e="";return this.multiDays?e=`From ${this.multiDays.start.toDateString()} to ${this.multiDays.end.toDateString()}`:(e=this.date.toDateString(),this.time&&(e+=`, at ${this.time}`),this.repeat&&(e+=`, ${this.repeat}`),this.duration&&(e+=` (${this.duration} minutes)`)),`\n
  • \n
    \n

    ${this.title}

    \n

    ${e}

    \n ${this.location?`

    ${this.location}

    `:""}\n

    ${this.description}

    \n
    \n
  • \n `}}var te=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function a(e){try{l(s.next(e))}catch(e){o(e)}}function r(e){try{l(s.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}l((s=s.apply(e,t||[])).next())}))};class ne{constructor(e){this.events=e}start(){this.popupEl||(this.popupEl=document.createElement("div"),this.popupEl.className="popup"),addEventListener("mousemove",(e=>{this.popupEl.classList.remove("visible"),this.popupEl.remove();const t=e.target.closest("#month-grid .event, #week-grid .event");if(!t)return;const n=t.id;if(!n||!n.startsWith("id-"))return;let s=n.replace("id-","");const i=this.events.find((e=>e.id===s));if(!i)return void console.log("No event found for id",s);const o=parseInt(t.dataset.indexInGrid);this.popupEl.style.setProperty("--event-color",i.color),this.popupEl.classList.toggle("visible",!0),this.popupEl.classList.toggle("unconfirmed",!i.rsvp);let a="";i.multiDays?a=`From ${i.multiDays.start.toDateString()} to ${i.multiDays.end.toDateString()}`:(a=i.date.toDateString(),i.time&&(a+=`, at ${i.time}`),i.repeat&&(a+=`, ${i.repeat}`),i.duration&&(a+=` (${i.duration} minutes)`)),this.popupEl.innerHTML=`\n

    ${i.title}

    \n

    ${a}

    \n ${i.location?`

    ${i.location}

    `:""}\n

    ${i.description}

    \n `,document.body.appendChild(this.popupEl);const r=t.getBoundingClientRect(),l=r.top,c=r.right,d=r.left,h=r.width;this.popupEl.style.top=o>=28?l-this.popupEl.clientHeight+"px":`${l}px`,6===o||13===o||20===o||27===o||34===o?(this.popupEl.style.left=d-h+"px",this.popupEl.classList.toggle("left",!0)):(this.popupEl.style.left=`${c}px`,this.popupEl.classList.toggle("left",!1))}))}}class se{getStoredPrefs(){return e=this,t=void 0,s=function*(){yield new Promise((e=>setTimeout(e,250*Math.random())));const e=localStorage.getItem("slow-cal-mode"),t=localStorage.getItem("slow-cal-initDate");return{mode:e,initDate:t?new Date(t):void 0}},new((n=void 0)||(n=Promise))((function(i,o){function a(e){try{l(s.next(e))}catch(e){o(e)}}function r(e){try{l(s.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}l((s=s.apply(e,t||[])).next())}));var e,t,n,s}set mode(e){console.log("Storing mode prefs"),localStorage.setItem("slow-cal-mode",e)}set initDate(e){console.log("Storing date prefs"),localStorage.setItem("slow-cal-initDate",e.toISOString())}}addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,s=function*(){const e=new se,t=yield e.getStoredPrefs(),n=t.initDate||new Date,s=t.mode||"month",i=document.getElementById("app"),o=new K(i,n,s,[]),a=yield function(){return te(this,void 0,void 0,(function*(){const e=yield function(){return te(this,void 0,void 0,(function*(){console.log("Fetching calendar data ..."),yield new Promise((e=>setTimeout(e,500*Math.random())));const e=yield fetch("./data.json");return yield e.json()}))}();return console.log("Processing events ..."),e.events.map((e=>function(e){const t=[new Date(e.startDate)];let n=null;if(e.repeat){const n=new Date(e.startDate),s=e.endDate?new Date(e.endDate):new Date(n.getTime()+15768e7);if("daily"===e.repeat){console.log("Expanding daily event ...");const e=(s.getTime()-n.getTime())/864e5;for(let s=1;s<=e;s++){const e=new Date(n.getTime()+24*s*60*60*1e3);0!==e.getDay()&&6!==e.getDay()&&t.push(e)}}else if("weekly"===e.repeat){console.log("Expanding weekly event ...");const e=(s.getTime()-n.getTime())/6048e5;for(let s=1;s<=e;s++){const e=new Date(n.getTime()+7*s*24*60*60*1e3);t.push(e)}}else if("monthly"===e.repeat){console.log("Expanding monthly event ...");const e=12*(s.getFullYear()-n.getFullYear())+(s.getMonth()-n.getMonth());for(let s=1;s<=e;s++){const e=new Date(n.getTime());e.setMonth(e.getMonth()+s),t.push(e)}}else if("yearly"===e.repeat){console.log("Expanding yearly event ...");const e=s.getFullYear()-n.getFullYear();for(let s=1;s<=e;s++){const e=new Date(n.getTime());e.setFullYear(e.getFullYear()+s),t.push(e)}}}else if(e.endDate){const s=new Date(e.startDate),i=new Date(e.endDate),o=(i.getTime()-s.getTime())/864e5;for(let e=1;e<=o;e++){const n=new Date(s.getTime()+24*e*60*60*1e3);t.push(n)}n={start:s,end:i}}return t.map(((t,s)=>{const i=e.id+(s>0?`-${s}`:""),o=new ee(e.title,i,t);return o.multiDays=n,o.color=e.color,o.time=e.startTime,o.duration=e.duration,o.repeat=e.repeat,o.location=e.location,o.description=e.description,o.rsvp=e.rsvp,o}))}(e))).flat()}))}();console.log("Refreshing calendar with events"),o.events=a,console.log("Initializing the popup util"),new ne(a).start(),o.addEventListener("mode-changed",(t=>{e.mode=t.detail})),o.addEventListener("date-changed",(t=>{e.initDate=t.detail}))},new((n=void 0)||(n=Promise))((function(i,o){function a(e){try{l(s.next(e))}catch(e){o(e)}}function r(e){try{l(s.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}l((s=s.apply(e,t||[])).next())}));var e,t,n,s}))})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBUSxFQUFJLElBQUlBLElBQVUsSUFDL0NoRixFQUFRLElBQUl5TSxHQUFjdEYsRUFBVXVGLE1BQU9YLEVBQUlyRSxHQVlyRCxPQVZBMUgsRUFBTW1JLFVBQVlBLEVBRWxCbkksRUFBTTRNLE1BQVF6RixFQUFVeUYsTUFDeEI1TSxFQUFNaUksS0FBT2QsRUFBVW1KLFVBQ3ZCdFEsRUFBTWtOLFNBQVcvRixFQUFVK0YsU0FDM0JsTixFQUFNaU4sT0FBUzlGLEVBQVU4RixPQUN6QmpOLEVBQU1tTixTQUFXaEcsRUFBVWdHLFNBQzNCbk4sRUFBTTZNLFlBQWMxRixFQUFVMEYsWUFDOUI3TSxFQUFNMk0sS0FBT3hGLEVBQVV3RixLQUVoQjNNLENBQUssR0FFaEIsQ0FPV3VRLENBQWtDdlEsS0FDeEN3USxNQUNMLEcsQ0RsRnVCQyxHQUVyQjdULFFBQVF1TyxJQUFJLG1DQUNacUUsRUFBTS9ILE9BQVNBLEVBRWY3SyxRQUFRdU8sSUFBSSwrQkFDRSxJQUFJaUMsR0FBVzNGLEdBQ3ZCc0YsUUFHTnlDLEVBQU0xSixpQkFBaUIsZ0JBQWlCb0IsSUFDdENpSSxFQUFNbkUsS0FBTzlELEVBQUUwQyxNQUFNLElBSXZCNEYsRUFBTTFKLGlCQUFpQixnQkFBaUJvQixJQUN0Q2lJLEVBQU1ILFNBQVc5SCxFQUFFMEMsTUFBTSxHQUU3QixFLFlBN0JpRCxLLDZRQTZCL0MsRyIsInNvdXJjZXMiOlsid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9ub2RlX21vZHVsZXMvZXZlbnQtdGFyZ2V0LXNoaW0vaW5kZXgubWpzIiwid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9zcmMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vc2xvdy1jYWxlbmRhci8uL3NyYy9Nb250aEdyaWQudHMiLCJ3ZWJwYWNrOi8vc2xvdy1jYWxlbmRhci8uL3NyYy9Ub29sYmFyLnRzIiwid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9zcmMvU2lkZWJhci50cyIsIndlYnBhY2s6Ly9zbG93LWNhbGVuZGFyLy4vc3JjL1dlZWtHcmlkLnRzIiwid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9zcmMvQXBwVUkudHMiLCJ3ZWJwYWNrOi8vc2xvdy1jYWxlbmRhci8uL3NyYy9DYWxlbmRhckV2ZW50LnRzIiwid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9zcmMvRXZlbnRQb3B1cC50cyIsIndlYnBhY2s6Ly9zbG93LWNhbGVuZGFyLy4vc3JjL1N0b3JlLnRzIiwid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9zcmMvYXBwLnRzIiwid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9zcmMvZXZlbnRzLWZhY3RvcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBc3NlcnQgYSBjb25kaXRpb24uXG4gKiBAcGFyYW0gY29uZGl0aW9uIFRoZSBjb25kaXRpb24gdGhhdCBpdCBzaG91bGQgc2F0aXNmeS5cbiAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgcmVwbGFjaW5nIHBsYWNlaG9sZGVycyBpbiB0aGUgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0VHlwZShjb25kaXRpb24sIG1lc3NhZ2UsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGZvcm1hdChtZXNzYWdlLCBhcmdzKSk7XG4gICAgfVxufVxuLyoqXG4gKiBDb252ZXJ0IGEgdGV4dCBhbmQgYXJndW1lbnRzIHRvIG9uZSBzdHJpbmcuXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgZm9ybWF0aW5nIHRleHRcbiAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdChtZXNzYWdlLCBhcmdzKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoLyVbb3NdL2d1LCAoKSA9PiBhbnlUb1N0cmluZyhhcmdzW2krK10pKTtcbn1cbi8qKlxuICogQ29udmVydCBhIHZhbHVlIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHggVGhlIHZhbHVlIHRvIGdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICovXG5mdW5jdGlvbiBhbnlUb1N0cmluZyh4KSB7XG4gICAgaWYgKHR5cGVvZiB4ICE9PSBcIm9iamVjdFwiIHx8IHggPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh4KTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KTtcbn1cblxubGV0IGN1cnJlbnRFcnJvckhhbmRsZXI7XG4vKipcbiAqIFNldCB0aGUgZXJyb3IgaGFuZGxlci5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgZXJyb3IgaGFuZGxlciB0byBzZXQuXG4gKi9cbmZ1bmN0aW9uIHNldEVycm9ySGFuZGxlcih2YWx1ZSkge1xuICAgIGFzc2VydFR5cGUodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCwgXCJUaGUgZXJyb3IgaGFuZGxlciBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkLCBidXQgZ290ICVvLlwiLCB2YWx1ZSk7XG4gICAgY3VycmVudEVycm9ySGFuZGxlciA9IHZhbHVlO1xufVxuLyoqXG4gKiBQcmludCBhIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0gbWF5YmVFcnJvciBUaGUgZXJyb3Igb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZXBvcnRFcnJvcihtYXliZUVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBtYXliZUVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgID8gbWF5YmVFcnJvclxuICAgICAgICAgICAgOiBuZXcgRXJyb3IoYW55VG9TdHJpbmcobWF5YmVFcnJvcikpO1xuICAgICAgICAvLyBDYWxsIHRoZSB1c2VyLWRlZmluZWQgZXJyb3IgaGFuZGxlciBpZiBleGlzdHMuXG4gICAgICAgIGlmIChjdXJyZW50RXJyb3JIYW5kbGVyKSB7XG4gICAgICAgICAgICBjdXJyZW50RXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEaXNwYXRjaCBhbiBgZXJyb3JgIGV2ZW50IGlmIHRoaXMgaXMgb24gYSBicm93c2VyLlxuICAgICAgICBpZiAodHlwZW9mIGRpc3BhdGNoRXZlbnQgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIEVycm9yRXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGlzcGF0Y2hFdmVudChuZXcgRXJyb3JFdmVudChcImVycm9yXCIsIHsgZXJyb3IsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVtaXQgYW4gYHVuY2F1Z2h0RXhjZXB0aW9uYCBldmVudCBpZiB0aGlzIGlzIG9uIE5vZGUuanMuXG4gICAgICAgIC8vaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLmVtaXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbWl0KFwidW5jYXVnaHRFeGNlcHRpb25cIiwgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgcHJpbnQgdGhlIGVycm9yLlxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgIC8vIGlnbm9yZS5cbiAgICB9XG59XG5cbi8qKlxuICogVGhlIGdsb2JhbCBvYmplY3QuXG4gKi9cbi8vaXN0YW5idWwgaWdub3JlIG5leHRcbmNvbnN0IEdsb2JhbCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCJcbiAgICA/IHdpbmRvd1xuICAgIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBzZWxmXG4gICAgICAgIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgPyBnbG9iYWxcbiAgICAgICAgICAgIDogdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICA/IGdsb2JhbFRoaXNcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxubGV0IGN1cnJlbnRXYXJuSGFuZGxlcjtcbi8qKlxuICogU2V0IHRoZSB3YXJuaW5nIGhhbmRsZXIuXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHdhcm5pbmcgaGFuZGxlciB0byBzZXQuXG4gKi9cbmZ1bmN0aW9uIHNldFdhcm5pbmdIYW5kbGVyKHZhbHVlKSB7XG4gICAgYXNzZXJ0VHlwZSh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkLCBcIlRoZSB3YXJuaW5nIGhhbmRsZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIHVuZGVmaW5lZCwgYnV0IGdvdCAlby5cIiwgdmFsdWUpO1xuICAgIGN1cnJlbnRXYXJuSGFuZGxlciA9IHZhbHVlO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBpbmZvcm1hdGlvbi5cbiAqL1xuY2xhc3MgV2FybmluZyB7XG4gICAgY29uc3RydWN0b3IoY29kZSwgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnQgdGhpcyB3YXJuaW5nLlxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgb2YgdGhlIHdhcm5pbmcuXG4gICAgICovXG4gICAgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIENhbGwgdGhlIHVzZXItZGVmaW5lZCB3YXJuaW5nIGhhbmRsZXIgaWYgZXhpc3RzLlxuICAgICAgICAgICAgaWYgKGN1cnJlbnRXYXJuSGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRXYXJuSGFuZGxlcih7IC4uLnRoaXMsIGFyZ3MgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwcmludCB0aGUgd2FybmluZy5cbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gKChfYSA9IG5ldyBFcnJvcigpLnN0YWNrKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiKS5yZXBsYWNlKC9eKD86Lis/XFxuKXsyfS9ndSwgXCJcXG5cIik7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4odGhpcy5tZXNzYWdlLCAuLi5hcmdzLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9iKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUuXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IEluaXRFdmVudFdhc0NhbGxlZFdoaWxlRGlzcGF0Y2hpbmcgPSBuZXcgV2FybmluZyhcIlcwMVwiLCBcIlVuYWJsZSB0byBpbml0aWFsaXplIGV2ZW50IHVuZGVyIGRpc3BhdGNoaW5nLlwiKTtcbmNvbnN0IEZhbHN5V2FzQXNzaWduZWRUb0NhbmNlbEJ1YmJsZSA9IG5ldyBXYXJuaW5nKFwiVzAyXCIsIFwiQXNzaWduaW5nIGFueSBmYWxzeSB2YWx1ZSB0byAnY2FuY2VsQnViYmxlJyBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0LlwiKTtcbmNvbnN0IFRydXRoeVdhc0Fzc2lnbmVkVG9SZXR1cm5WYWx1ZSA9IG5ldyBXYXJuaW5nKFwiVzAzXCIsIFwiQXNzaWduaW5nIGFueSB0cnV0aHkgdmFsdWUgdG8gJ3JldHVyblZhbHVlJyBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0LlwiKTtcbmNvbnN0IE5vbkNhbmNlbGFibGVFdmVudFdhc0NhbmNlbGVkID0gbmV3IFdhcm5pbmcoXCJXMDRcIiwgXCJVbmFibGUgdG8gcHJldmVudERlZmF1bHQgb24gbm9uLWNhbmNlbGFibGUgZXZlbnRzLlwiKTtcbmNvbnN0IENhbmNlbGVkSW5QYXNzaXZlTGlzdGVuZXIgPSBuZXcgV2FybmluZyhcIlcwNVwiLCBcIlVuYWJsZSB0byBwcmV2ZW50RGVmYXVsdCBpbnNpZGUgcGFzc2l2ZSBldmVudCBsaXN0ZW5lciBpbnZvY2F0aW9uLlwiKTtcbmNvbnN0IEV2ZW50TGlzdGVuZXJXYXNEdXBsaWNhdGVkID0gbmV3IFdhcm5pbmcoXCJXMDZcIiwgXCJBbiBldmVudCBsaXN0ZW5lciB3YXNuJ3QgYWRkZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBhZGRlZCBhbHJlYWR5OiAlbywgJW9cIik7XG5jb25zdCBPcHRpb25XYXNJZ25vcmVkID0gbmV3IFdhcm5pbmcoXCJXMDdcIiwgXCJUaGUgJW8gb3B0aW9uIHZhbHVlIHdhcyBhYmFuZG9uZWQgYmVjYXVzZSB0aGUgZXZlbnQgbGlzdGVuZXIgd2Fzbid0IGFkZGVkIGFzIGR1cGxpY2F0ZWQuXCIpO1xuY29uc3QgSW52YWxpZEV2ZW50TGlzdGVuZXIgPSBuZXcgV2FybmluZyhcIlcwOFwiLCBcIlRoZSAnY2FsbGJhY2snIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QgdGhhdCBoYXMgJ2hhbmRsZUV2ZW50JyBtZXRob2Q6ICVvXCIpO1xuY29uc3QgSW52YWxpZEF0dHJpYnV0ZUhhbmRsZXIgPSBuZXcgV2FybmluZyhcIlcwOVwiLCBcIkV2ZW50IGF0dHJpYnV0ZSBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbjogJW9cIik7XG5cbi8qZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgRXZlbnRgIGludGVyZmFjZSwgdGhhdCB3cmFwcyBhIGdpdmVuIGV2ZW50IG9iamVjdC5cbiAqIGBFdmVudFRhcmdldGAgc2hpbSBjYW4gY29udHJvbCB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhpcyBgRXZlbnRgIG9iamVjdHMuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZXZlbnRcbiAqL1xuY2xhc3MgRXZlbnQge1xuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtbm9uZVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9ORSgpIHtcbiAgICAgICAgcmV0dXJuIE5PTkU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtY2FwdHVyaW5nX3BoYXNlXG4gICAgICovXG4gICAgc3RhdGljIGdldCBDQVBUVVJJTkdfUEhBU0UoKSB7XG4gICAgICAgIHJldHVybiBDQVBUVVJJTkdfUEhBU0U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtYXRfdGFyZ2V0XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVF9UQVJHRVQoKSB7XG4gICAgICAgIHJldHVybiBBVF9UQVJHRVQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtYnViYmxpbmdfcGhhc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEJVQkJMSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gQlVCQkxJTkdfUEhBU0U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhpcyBldmVudCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEBwYXJhbSBldmVudEluaXREaWN0IE9wdGlvbnMgdG8gaW5pdGlhbGl6ZS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWV2ZW50XG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZSwgZXZlbnRJbml0RGljdCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc1RydXN0ZWRcIiwge1xuICAgICAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBldmVudEluaXREaWN0ICE9PSBudWxsICYmIGV2ZW50SW5pdERpY3QgIT09IHZvaWQgMCA/IGV2ZW50SW5pdERpY3QgOiB7fTtcbiAgICAgICAgaW50ZXJuYWxEYXRhTWFwLnNldCh0aGlzLCB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcodHlwZSksXG4gICAgICAgICAgICBidWJibGVzOiBCb29sZWFuKG9wdHMuYnViYmxlcyksXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiBCb29sZWFuKG9wdHMuY2FuY2VsYWJsZSksXG4gICAgICAgICAgICBjb21wb3NlZDogQm9vbGVhbihvcHRzLmNvbXBvc2VkKSxcbiAgICAgICAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQ6IG51bGwsXG4gICAgICAgICAgICBzdG9wUHJvcGFnYXRpb25GbGFnOiBmYWxzZSxcbiAgICAgICAgICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbkZsYWc6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsZWRGbGFnOiBmYWxzZSxcbiAgICAgICAgICAgIGluUGFzc2l2ZUxpc3RlbmVyRmxhZzogZmFsc2UsXG4gICAgICAgICAgICBkaXNwYXRjaEZsYWc6IGZhbHNlLFxuICAgICAgICAgICAgdGltZVN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LXR5cGVcbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcykudHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IHRhcmdldCBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGluZy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LXRhcmdldFxuICAgICAqL1xuICAgIGdldCB0YXJnZXQoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLnRhcmdldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IHRhcmdldCBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGluZy5cbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGB0YXJnZXRgIHByb3BlcnR5IGluc3RlYWQuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1zcmNlbGVtZW50XG4gICAgICovXG4gICAgZ2V0IHNyY0VsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLnRhcmdldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IHRhcmdldCBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGluZy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWN1cnJlbnR0YXJnZXRcbiAgICAgKi9cbiAgICBnZXQgY3VycmVudFRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcykuY3VycmVudFRhcmdldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IHRhcmdldCBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGluZy5cbiAgICAgKiBUaGlzIGRvZXNuJ3Qgc3VwcG9ydCBub2RlIHRyZWUuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1jb21wb3NlZHBhdGhcbiAgICAgKi9cbiAgICBjb21wb3NlZFBhdGgoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSAkKHRoaXMpLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmIChjdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gW2N1cnJlbnRUYXJnZXRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1ub25lXG4gICAgICovXG4gICAgZ2V0IE5PTkUoKSB7XG4gICAgICAgIHJldHVybiBOT05FO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWNhcHR1cmluZ19waGFzZVxuICAgICAqL1xuICAgIGdldCBDQVBUVVJJTkdfUEhBU0UoKSB7XG4gICAgICAgIHJldHVybiBDQVBUVVJJTkdfUEhBU0U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtYXRfdGFyZ2V0XG4gICAgICovXG4gICAgZ2V0IEFUX1RBUkdFVCgpIHtcbiAgICAgICAgcmV0dXJuIEFUX1RBUkdFVDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1idWJibGluZ19waGFzZVxuICAgICAqL1xuICAgIGdldCBCVUJCTElOR19QSEFTRSgpIHtcbiAgICAgICAgcmV0dXJuIEJVQkJMSU5HX1BIQVNFO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBldmVudCBwaGFzZS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWV2ZW50cGhhc2VcbiAgICAgKi9cbiAgICBnZXQgZXZlbnRQaGFzZSgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcykuZGlzcGF0Y2hGbGFnID8gMiA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQmVjYXVzZSB0aGlzIHNoaW0gZG9lc24ndCBzdXBwb3J0IG5vZGUgdHJlZSwgdGhpcyBtZXJlbHkgY2hhbmdlcyB0aGUgYGNhbmNlbEJ1YmJsZWAgcHJvcGVydHkgdmFsdWUuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1zdG9wcHJvcGFnYXRpb25cbiAgICAgKi9cbiAgICBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgICAgICQodGhpcykuc3RvcFByb3BhZ2F0aW9uRmxhZyA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiBldmVudCBidWJibGluZyB3YXMgc3RvcHBlZC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtY2FuY2VsYnViYmxlXG4gICAgICovXG4gICAgZ2V0IGNhbmNlbEJ1YmJsZSgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcykuc3RvcFByb3BhZ2F0aW9uRmxhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcCBldmVudCBidWJibGluZyBpZiBgdHJ1ZWAgaXMgc2V0LlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgYHN0b3BQcm9wYWdhdGlvbigpYCBtZXRob2QgaW5zdGVhZC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWNhbmNlbGJ1YmJsZVxuICAgICAqL1xuICAgIHNldCBjYW5jZWxCdWJibGUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAkKHRoaXMpLnN0b3BQcm9wYWdhdGlvbkZsYWcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgRmFsc3lXYXNBc3NpZ25lZFRvQ2FuY2VsQnViYmxlLndhcm4oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9wIGV2ZW50IGJ1YmJsaW5nIGFuZCBzdWJzZXF1ZW50IGV2ZW50IGxpc3RlbmVyIGNhbGxpbmdzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtc3RvcGltbWVkaWF0ZXByb3BhZ2F0aW9uXG4gICAgICovXG4gICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gJCh0aGlzKTtcbiAgICAgICAgZGF0YS5zdG9wUHJvcGFnYXRpb25GbGFnID0gZGF0YS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25GbGFnID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoaXMgZXZlbnQgd2lsbCBidWJibGUuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1idWJibGVzXG4gICAgICovXG4gICAgZ2V0IGJ1YmJsZXMoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLmJ1YmJsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGlzIGV2ZW50IGNhbiBiZSBjYW5jZWxlZCBieSB0aGUgYHByZXZlbnREZWZhdWx0KClgIG1ldGhvZC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWNhbmNlbGFibGVcbiAgICAgKi9cbiAgICBnZXQgY2FuY2VsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcykuY2FuY2VsYWJsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgYWN0LlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgYGRlZmF1bHRQcmV2ZW50ZWRgIHByb2VwcnR5IGluc3RlYWQuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1yZXR1cm52YWx1ZVxuICAgICAqL1xuICAgIGdldCByZXR1cm5WYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuICEkKHRoaXMpLmNhbmNlbGVkRmxhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlmIGBmYWxzZWAgaXMgc2V0LlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgYHByZXZlbnREZWZhdWx0KClgIG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtcmV0dXJudmFsdWVcbiAgICAgKi9cbiAgICBzZXQgcmV0dXJuVmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgc2V0Q2FuY2VsRmxhZygkKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFRydXRoeVdhc0Fzc2lnbmVkVG9SZXR1cm5WYWx1ZS53YXJuKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VsIHRoZSBkZWZhdWx0IGJlaGF2aW9yLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtcHJldmVudGRlZmF1bHRcbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgc2V0Q2FuY2VsRmxhZygkKHRoaXMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdhcyBjYW5jZWxlZC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWRlZmF1bHRwcmV2ZW50ZWRcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcykuY2FuY2VsZWRGbGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWNvbXBvc2VkXG4gICAgICovXG4gICAgZ2V0IGNvbXBvc2VkKCkge1xuICAgICAgICByZXR1cm4gJCh0aGlzKS5jb21wb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1pc3RydXN0ZWRcbiAgICAgKi9cbiAgICAvL2lzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgZ2V0IGlzVHJ1c3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LXRpbWVzdGFtcFxuICAgICAqL1xuICAgIGdldCB0aW1lU3RhbXAoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLnRpbWVTdGFtcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgRG9uJ3QgdXNlIHRoaXMgbWV0aG9kLiBUaGUgY29uc3RydWN0b3IgZGlkIGluaXRpYWxpemF0aW9uLlxuICAgICAqL1xuICAgIGluaXRFdmVudCh0eXBlLCBidWJibGVzID0gZmFsc2UsIGNhbmNlbGFibGUgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBkYXRhID0gJCh0aGlzKTtcbiAgICAgICAgaWYgKGRhdGEuZGlzcGF0Y2hGbGFnKSB7XG4gICAgICAgICAgICBJbml0RXZlbnRXYXNDYWxsZWRXaGlsZURpc3BhdGNoaW5nLndhcm4oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcm5hbERhdGFNYXAuc2V0KHRoaXMsIHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcodHlwZSksXG4gICAgICAgICAgICBidWJibGVzOiBCb29sZWFuKGJ1YmJsZXMpLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogQm9vbGVhbihjYW5jZWxhYmxlKSxcbiAgICAgICAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQ6IG51bGwsXG4gICAgICAgICAgICBzdG9wUHJvcGFnYXRpb25GbGFnOiBmYWxzZSxcbiAgICAgICAgICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbkZsYWc6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsZWRGbGFnOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhlbHBlcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBOT05FID0gMDtcbmNvbnN0IENBUFRVUklOR19QSEFTRSA9IDE7XG5jb25zdCBBVF9UQVJHRVQgPSAyO1xuY29uc3QgQlVCQkxJTkdfUEhBU0UgPSAzO1xuLyoqXG4gKiBQcml2YXRlIGRhdGEgZm9yIGV2ZW50IHdyYXBwZXJzLlxuICovXG5jb25zdCBpbnRlcm5hbERhdGFNYXAgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBHZXQgcHJpdmF0ZSBkYXRhLlxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBvYmplY3QgdG8gZ2V0IHByaXZhdGUgZGF0YS5cbiAqIEBwYXJhbSBuYW1lIFRoZSB2YXJpYWJsZSBuYW1lIHRvIHJlcG9ydC5cbiAqIEByZXR1cm5zIFRoZSBwcml2YXRlIGRhdGEgb2YgdGhlIGV2ZW50LlxuICovXG5mdW5jdGlvbiAkKGV2ZW50LCBuYW1lID0gXCJ0aGlzXCIpIHtcbiAgICBjb25zdCByZXR2ID0gaW50ZXJuYWxEYXRhTWFwLmdldChldmVudCk7XG4gICAgYXNzZXJ0VHlwZShyZXR2ICE9IG51bGwsIFwiJyVzJyBtdXN0IGJlIGFuIG9iamVjdCB0aGF0IEV2ZW50IGNvbnN0cnVjdG9yIGNyZWF0ZWQsIGJ1dCBnb3QgYW5vdGhlciBvbmU6ICVvXCIsIG5hbWUsIGV2ZW50KTtcbiAgICByZXR1cm4gcmV0djtcbn1cbi8qKlxuICogaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNzZXQtdGhlLWNhbmNlbGVkLWZsYWdcbiAqIEBwYXJhbSBkYXRhIHByaXZhdGUgZGF0YS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FuY2VsRmxhZyhkYXRhKSB7XG4gICAgaWYgKGRhdGEuaW5QYXNzaXZlTGlzdGVuZXJGbGFnKSB7XG4gICAgICAgIENhbmNlbGVkSW5QYXNzaXZlTGlzdGVuZXIud2FybigpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZGF0YS5jYW5jZWxhYmxlKSB7XG4gICAgICAgIE5vbkNhbmNlbGFibGVFdmVudFdhc0NhbmNlbGVkLndhcm4oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhLmNhbmNlbGVkRmxhZyA9IHRydWU7XG59XG4vLyBTZXQgZW51bWVyYWJsZVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50LCBcIk5PTkVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50LCBcIkNBUFRVUklOR19QSEFTRVwiLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnQsIFwiQVRfVEFSR0VUXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudCwgXCJCVUJCTElOR19QSEFTRVwiLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5jb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRXZlbnQucHJvdG90eXBlKTtcbmZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgIGlmIChrZXlzW2ldID09PSBcImNvbnN0cnVjdG9yXCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsIGtleXNbaV0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn1cbi8vIEVuc3VyZSBgZXZlbnQgaW5zdGFuY2VvZiB3aW5kb3cuRXZlbnRgIGlzIGB0cnVlYC5cbmlmICh0eXBlb2YgR2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBHbG9iYWwuRXZlbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnQucHJvdG90eXBlLCBHbG9iYWwuRXZlbnQucHJvdG90eXBlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgSW52YWxpZFN0YXRlRXJyb3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW52YWxpZFN0YXRlRXJyb3IobWVzc2FnZSkge1xuICAgIGlmIChHbG9iYWwuRE9NRXhjZXB0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgR2xvYmFsLkRPTUV4Y2VwdGlvbihtZXNzYWdlLCBcIkludmFsaWRTdGF0ZUVycm9yXCIpO1xuICAgIH1cbiAgICBpZiAoRE9NRXhjZXB0aW9uID09IG51bGwpIHtcbiAgICAgICAgRE9NRXhjZXB0aW9uID0gY2xhc3MgRE9NRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICAgICAgICAgICAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIobXNnKTtcbiAgICAgICAgICAgICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRE9NRXhjZXB0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgICAgICAgICAgZ2V0IGNvZGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDExO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICAgICAgICAgIGdldCBuYW1lKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIkludmFsaWRTdGF0ZUVycm9yXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERPTUV4Y2VwdGlvbi5wcm90b3R5cGUsIHtcbiAgICAgICAgICAgIGNvZGU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgbmFtZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBkZWZpbmVFcnJvckNvZGVQcm9wZXJ0aWVzKERPTUV4Y2VwdGlvbik7XG4gICAgICAgIGRlZmluZUVycm9yQ29kZVByb3BlcnRpZXMoRE9NRXhjZXB0aW9uLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRE9NRXhjZXB0aW9uKG1lc3NhZ2UpO1xufVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhlbHBlcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5sZXQgRE9NRXhjZXB0aW9uO1xuY29uc3QgRXJyb3JDb2RlTWFwID0ge1xuICAgIElOREVYX1NJWkVfRVJSOiAxLFxuICAgIERPTVNUUklOR19TSVpFX0VSUjogMixcbiAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IDMsXG4gICAgV1JPTkdfRE9DVU1FTlRfRVJSOiA0LFxuICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogNSxcbiAgICBOT19EQVRBX0FMTE9XRURfRVJSOiA2LFxuICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogNyxcbiAgICBOT1RfRk9VTkRfRVJSOiA4LFxuICAgIE5PVF9TVVBQT1JURURfRVJSOiA5LFxuICAgIElOVVNFX0FUVFJJQlVURV9FUlI6IDEwLFxuICAgIElOVkFMSURfU1RBVEVfRVJSOiAxMSxcbiAgICBTWU5UQVhfRVJSOiAxMixcbiAgICBJTlZBTElEX01PRElGSUNBVElPTl9FUlI6IDEzLFxuICAgIE5BTUVTUEFDRV9FUlI6IDE0LFxuICAgIElOVkFMSURfQUNDRVNTX0VSUjogMTUsXG4gICAgVkFMSURBVElPTl9FUlI6IDE2LFxuICAgIFRZUEVfTUlTTUFUQ0hfRVJSOiAxNyxcbiAgICBTRUNVUklUWV9FUlI6IDE4LFxuICAgIE5FVFdPUktfRVJSOiAxOSxcbiAgICBBQk9SVF9FUlI6IDIwLFxuICAgIFVSTF9NSVNNQVRDSF9FUlI6IDIxLFxuICAgIFFVT1RBX0VYQ0VFREVEX0VSUjogMjIsXG4gICAgVElNRU9VVF9FUlI6IDIzLFxuICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogMjQsXG4gICAgREFUQV9DTE9ORV9FUlI6IDI1LFxufTtcbmZ1bmN0aW9uIGRlZmluZUVycm9yQ29kZVByb3BlcnRpZXMob2JqKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKEVycm9yQ29kZU1hcCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gRXJyb3JDb2RlTWFwW2tleV07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYEV2ZW50YCBpbnRlcmZhY2UsIHRoYXQgd3JhcHMgYSBnaXZlbiBldmVudCBvYmplY3QuXG4gKiBUaGlzIGNsYXNzIGNvbnRyb2xzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBgRXZlbnRgLlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2ludGVyZmFjZS1ldmVudFxuICovXG5jbGFzcyBFdmVudFdyYXBwZXIgZXh0ZW5kcyBFdmVudCB7XG4gICAgLyoqXG4gICAgICogV3JhcCBhIGdpdmVuIGV2ZW50IG9iamVjdCB0byBjb250cm9sIHN0YXRlcy5cbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LWxpa2Ugb2JqZWN0IHRvIHdyYXAuXG4gICAgICovXG4gICAgc3RhdGljIHdyYXAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyAoZ2V0V3JhcHBlckNsYXNzT2YoZXZlbnQpKShldmVudCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGV2ZW50KSB7XG4gICAgICAgIHN1cGVyKGV2ZW50LnR5cGUsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IGV2ZW50LmJ1YmJsZXMsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiBldmVudC5jYW5jZWxhYmxlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IGV2ZW50LmNvbXBvc2VkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGV2ZW50LmNhbmNlbEJ1YmJsZSkge1xuICAgICAgICAgICAgc3VwZXIuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIHN1cGVyLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJuYWxEYXRhTWFwJDEuc2V0KHRoaXMsIHsgb3JpZ2luYWw6IGV2ZW50IH0pO1xuICAgICAgICAvLyBEZWZpbmUgYWNjZXNzb3JzXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhldmVudCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgIGlmICghKGtleSBpbiB0aGlzKSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihldmVudCwga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICBzdXBlci5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3QgeyBvcmlnaW5hbCB9ID0gJCQxKHRoaXMpO1xuICAgICAgICBpZiAoXCJzdG9wUHJvcGFnYXRpb25cIiBpbiBvcmlnaW5hbCkge1xuICAgICAgICAgICAgb3JpZ2luYWwuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGNhbmNlbEJ1YmJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNhbmNlbEJ1YmJsZTtcbiAgICB9XG4gICAgc2V0IGNhbmNlbEJ1YmJsZSh2YWx1ZSkge1xuICAgICAgICBzdXBlci5jYW5jZWxCdWJibGUgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgeyBvcmlnaW5hbCB9ID0gJCQxKHRoaXMpO1xuICAgICAgICBpZiAoXCJjYW5jZWxCdWJibGVcIiBpbiBvcmlnaW5hbCkge1xuICAgICAgICAgICAgb3JpZ2luYWwuY2FuY2VsQnViYmxlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICBzdXBlci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3QgeyBvcmlnaW5hbCB9ID0gJCQxKHRoaXMpO1xuICAgICAgICBpZiAoXCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25cIiBpbiBvcmlnaW5hbCkge1xuICAgICAgICAgICAgb3JpZ2luYWwuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHJldHVyblZhbHVlKCkge1xuICAgICAgICByZXR1cm4gc3VwZXIucmV0dXJuVmFsdWU7XG4gICAgfVxuICAgIHNldCByZXR1cm5WYWx1ZSh2YWx1ZSkge1xuICAgICAgICBzdXBlci5yZXR1cm5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICBjb25zdCB7IG9yaWdpbmFsIH0gPSAkJDEodGhpcyk7XG4gICAgICAgIGlmIChcInJldHVyblZhbHVlXCIgaW4gb3JpZ2luYWwpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsLnJldHVyblZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHN1cGVyLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHsgb3JpZ2luYWwgfSA9ICQkMSh0aGlzKTtcbiAgICAgICAgaWYgKFwicHJldmVudERlZmF1bHRcIiBpbiBvcmlnaW5hbCkge1xuICAgICAgICAgICAgb3JpZ2luYWwucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgdGltZVN0YW1wKCkge1xuICAgICAgICBjb25zdCB7IG9yaWdpbmFsIH0gPSAkJDEodGhpcyk7XG4gICAgICAgIGlmIChcInRpbWVTdGFtcFwiIGluIG9yaWdpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwudGltZVN0YW1wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci50aW1lU3RhbXA7XG4gICAgfVxufVxuLyoqXG4gKiBQcml2YXRlIGRhdGEgZm9yIGV2ZW50IHdyYXBwZXJzLlxuICovXG5jb25zdCBpbnRlcm5hbERhdGFNYXAkMSA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdldCBwcml2YXRlIGRhdGEuXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IG9iamVjdCB0byBnZXQgcHJpdmF0ZSBkYXRhLlxuICogQHJldHVybnMgVGhlIHByaXZhdGUgZGF0YSBvZiB0aGUgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uICQkMShldmVudCkge1xuICAgIGNvbnN0IHJldHYgPSBpbnRlcm5hbERhdGFNYXAkMS5nZXQoZXZlbnQpO1xuICAgIGFzc2VydFR5cGUocmV0diAhPSBudWxsLCBcIid0aGlzJyBpcyBleHBlY3RlZCBhbiBFdmVudCBvYmplY3QsIGJ1dCBnb3RcIiwgZXZlbnQpO1xuICAgIHJldHVybiByZXR2O1xufVxuLyoqXG4gKiBDYWNoZSBmb3Igd3JhcHBlciBjbGFzc2VzLlxuICogQHR5cGUge1dlYWtNYXA8T2JqZWN0LCBGdW5jdGlvbj59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB3cmFwcGVyQ2xhc3NDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4vLyBNYWtlIGFzc29jaWF0aW9uIGZvciB3cmFwcGVycy5cbndyYXBwZXJDbGFzc0NhY2hlLnNldChPYmplY3QucHJvdG90eXBlLCBFdmVudFdyYXBwZXIpO1xuaWYgKHR5cGVvZiBHbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIEdsb2JhbC5FdmVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdyYXBwZXJDbGFzc0NhY2hlLnNldChHbG9iYWwuRXZlbnQucHJvdG90eXBlLCBFdmVudFdyYXBwZXIpO1xufVxuLyoqXG4gKiBHZXQgdGhlIHdyYXBwZXIgY2xhc3Mgb2YgYSBnaXZlbiBwcm90b3R5cGUuXG4gKiBAcGFyYW0gb3JpZ2luYWxFdmVudCBUaGUgZXZlbnQgb2JqZWN0IHRvIHdyYXAuXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBwZXJDbGFzc09mKG9yaWdpbmFsRXZlbnQpIHtcbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWxFdmVudCk7XG4gICAgaWYgKHByb3RvdHlwZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBFdmVudFdyYXBwZXI7XG4gICAgfVxuICAgIGxldCB3cmFwcGVyID0gd3JhcHBlckNsYXNzQ2FjaGUuZ2V0KHByb3RvdHlwZSk7XG4gICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkge1xuICAgICAgICB3cmFwcGVyID0gZGVmaW5lV3JhcHBlcihnZXRXcmFwcGVyQ2xhc3NPZihwcm90b3R5cGUpLCBwcm90b3R5cGUpO1xuICAgICAgICB3cmFwcGVyQ2xhc3NDYWNoZS5zZXQocHJvdG90eXBlLCB3cmFwcGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBwZXI7XG59XG4vKipcbiAqIERlZmluZSBuZXcgd3JhcHBlciBjbGFzcy5cbiAqIEBwYXJhbSBCYXNlRXZlbnRXcmFwcGVyIFRoZSBiYXNlIHdyYXBwZXIgY2xhc3MuXG4gKiBAcGFyYW0gb3JpZ2luYWxQcm90b3R5cGUgVGhlIHByb3RvdHlwZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZVdyYXBwZXIoQmFzZUV2ZW50V3JhcHBlciwgb3JpZ2luYWxQcm90b3R5cGUpIHtcbiAgICBjbGFzcyBDdXN0b21FdmVudFdyYXBwZXIgZXh0ZW5kcyBCYXNlRXZlbnRXcmFwcGVyIHtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9yaWdpbmFsUHJvdG90eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEN1c3RvbUV2ZW50V3JhcHBlci5wcm90b3R5cGUsIGtleXNbaV0sIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihvcmlnaW5hbFByb3RvdHlwZSwga2V5c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gQ3VzdG9tRXZlbnRXcmFwcGVyO1xufVxuLyoqXG4gKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gcmVkaXJlY3QgYSBnaXZlbiBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUmVkaXJlY3REZXNjcmlwdG9yKG9iaiwga2V5KSB7XG4gICAgY29uc3QgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gJCQxKHRoaXMpLm9yaWdpbmFsO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvcmlnaW5hbFtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQob3JpZ2luYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gJCQxKHRoaXMpLm9yaWdpbmFsO1xuICAgICAgICAgICAgb3JpZ2luYWxba2V5XSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IGQuY29uZmlndXJhYmxlLFxuICAgICAgICBlbnVtZXJhYmxlOiBkLmVudW1lcmFibGUsXG4gICAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbGlzdGVuZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICogQHBhcmFtIGNhcHR1cmUgVGhlIGNhcHR1cmUgZmxhZy5cbiAqIEBwYXJhbSBwYXNzaXZlIFRoZSBwYXNzaXZlIGZsYWcuXG4gKiBAcGFyYW0gb25jZSBUaGUgb25jZSBmbGFnLlxuICogQHBhcmFtIHNpZ25hbCBUaGUgYWJvcnQgc2lnbmFsLlxuICogQHBhcmFtIHNpZ25hbExpc3RlbmVyIFRoZSBhYm9ydCBldmVudCBsaXN0ZW5lciBmb3IgdGhlIGFib3J0IHNpZ25hbC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTGlzdGVuZXIoY2FsbGJhY2ssIGNhcHR1cmUsIHBhc3NpdmUsIG9uY2UsIHNpZ25hbCwgc2lnbmFsTGlzdGVuZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgZmxhZ3M6IChjYXB0dXJlID8gMSAvKiBDYXB0dXJlICovIDogMCkgfFxuICAgICAgICAgICAgKHBhc3NpdmUgPyAyIC8qIFBhc3NpdmUgKi8gOiAwKSB8XG4gICAgICAgICAgICAob25jZSA/IDQgLyogT25jZSAqLyA6IDApLFxuICAgICAgICBzaWduYWwsXG4gICAgICAgIHNpZ25hbExpc3RlbmVyLFxuICAgIH07XG59XG4vKipcbiAqIFNldCB0aGUgYHJlbW92ZWRgIGZsYWcgdG8gdGhlIGdpdmVuIGxpc3RlbmVyLlxuICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gc2V0UmVtb3ZlZChsaXN0ZW5lcikge1xuICAgIGxpc3RlbmVyLmZsYWdzIHw9IDggLyogUmVtb3ZlZCAqLztcbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGxpc3RlbmVyIGhhcyB0aGUgYGNhcHR1cmVgIGZsYWcgb3Igbm90LlxuICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gaXNDYXB0dXJlKGxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIChsaXN0ZW5lci5mbGFncyAmIDEgLyogQ2FwdHVyZSAqLykgPT09IDEgLyogQ2FwdHVyZSAqLztcbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGxpc3RlbmVyIGhhcyB0aGUgYHBhc3NpdmVgIGZsYWcgb3Igbm90LlxuICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gaXNQYXNzaXZlKGxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIChsaXN0ZW5lci5mbGFncyAmIDIgLyogUGFzc2l2ZSAqLykgPT09IDIgLyogUGFzc2l2ZSAqLztcbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGxpc3RlbmVyIGhhcyB0aGUgYG9uY2VgIGZsYWcgb3Igbm90LlxuICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gaXNPbmNlKGxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIChsaXN0ZW5lci5mbGFncyAmIDQgLyogT25jZSAqLykgPT09IDQgLyogT25jZSAqLztcbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGxpc3RlbmVyIGhhcyB0aGUgYHJlbW92ZWRgIGZsYWcgb3Igbm90LlxuICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gaXNSZW1vdmVkKGxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIChsaXN0ZW5lci5mbGFncyAmIDggLyogUmVtb3ZlZCAqLykgPT09IDggLyogUmVtb3ZlZCAqLztcbn1cbi8qKlxuICogQ2FsbCBhbiBldmVudCBsaXN0ZW5lci5cbiAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2FsbC5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGV2ZW50IHRhcmdldCBvYmplY3QgZm9yIGB0aGlzQXJnYC5cbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgb2JqZWN0IGZvciB0aGUgZmlyc3QgYXJndW1lbnQuXG4gKiBAcGFyYW0gYXR0cmlidXRlIGB0cnVlYCBpZiB0aGlzIGNhbGxiYWNrIGlzIGFuIGV2ZW50IGF0dHJpYnV0ZSBoYW5kbGVyLlxuICovXG5mdW5jdGlvbiBpbnZva2VDYWxsYmFjayh7IGNhbGxiYWNrIH0sIHRhcmdldCwgZXZlbnQpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGFyZ2V0LCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNhbGxiYWNrLmhhbmRsZUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAodGhyb3duRXJyb3IpIHtcbiAgICAgICAgcmVwb3J0RXJyb3IodGhyb3duRXJyb3IpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBpbmRleCBvZiBnaXZlbiBsaXN0ZW5lci5cbiAqIFRoaXMgcmV0dXJucyBgLTFgIGlmIG5vdCBmb3VuZC5cbiAqIEBwYXJhbSBsaXN0IFRoZSBsaXN0ZW5lciBsaXN0LlxuICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBmaW5kLlxuICogQHBhcmFtIGNhcHR1cmUgVGhlIGNhcHR1cmUgZmxhZyB0byBmaW5kLlxuICovXG5mdW5jdGlvbiBmaW5kSW5kZXhPZkxpc3RlbmVyKHsgbGlzdGVuZXJzIH0sIGNhbGxiYWNrLCBjYXB0dXJlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyc1tpXS5jYWxsYmFjayA9PT0gY2FsbGJhY2sgJiZcbiAgICAgICAgICAgIGlzQ2FwdHVyZShsaXN0ZW5lcnNbaV0pID09PSBjYXB0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG4vKipcbiAqIEFkZCB0aGUgZ2l2ZW4gbGlzdGVuZXIuXG4gKiBEb2VzIGNvcHktb24td3JpdGUgaWYgbmVlZGVkLlxuICogQHBhcmFtIGxpc3QgVGhlIGxpc3RlbmVyIGxpc3QuXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICogQHBhcmFtIGNhcHR1cmUgVGhlIGNhcHR1cmUgZmxhZy5cbiAqIEBwYXJhbSBwYXNzaXZlIFRoZSBwYXNzaXZlIGZsYWcuXG4gKiBAcGFyYW0gb25jZSBUaGUgb25jZSBmbGFnLlxuICogQHBhcmFtIHNpZ25hbCBUaGUgYWJvcnQgc2lnbmFsLlxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihsaXN0LCBjYWxsYmFjaywgY2FwdHVyZSwgcGFzc2l2ZSwgb25jZSwgc2lnbmFsKSB7XG4gICAgbGV0IHNpZ25hbExpc3RlbmVyO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgc2lnbmFsTGlzdGVuZXIgPSByZW1vdmVMaXN0ZW5lci5iaW5kKG51bGwsIGxpc3QsIGNhbGxiYWNrLCBjYXB0dXJlKTtcbiAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBzaWduYWxMaXN0ZW5lcik7XG4gICAgfVxuICAgIGNvbnN0IGxpc3RlbmVyID0gY3JlYXRlTGlzdGVuZXIoY2FsbGJhY2ssIGNhcHR1cmUsIHBhc3NpdmUsIG9uY2UsIHNpZ25hbCwgc2lnbmFsTGlzdGVuZXIpO1xuICAgIGlmIChsaXN0LmNvdykge1xuICAgICAgICBsaXN0LmNvdyA9IGZhbHNlO1xuICAgICAgICBsaXN0Lmxpc3RlbmVycyA9IFsuLi5saXN0Lmxpc3RlbmVycywgbGlzdGVuZXJdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGlzdC5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuICAgIHJldHVybiBsaXN0ZW5lcjtcbn1cbi8qKlxuICogUmVtb3ZlIGEgbGlzdGVuZXIuXG4gKiBAcGFyYW0gbGlzdCBUaGUgbGlzdGVuZXIgbGlzdC5cbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZmluZC5cbiAqIEBwYXJhbSBjYXB0dXJlIFRoZSBjYXB0dXJlIGZsYWcgdG8gZmluZC5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBtdXRhdGVkIHRoZSBsaXN0IGRpcmVjdGx5LlxuICovXG5mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihsaXN0LCBjYWxsYmFjaywgY2FwdHVyZSkge1xuICAgIGNvbnN0IGluZGV4ID0gZmluZEluZGV4T2ZMaXN0ZW5lcihsaXN0LCBjYWxsYmFjaywgY2FwdHVyZSk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gcmVtb3ZlTGlzdGVuZXJBdChsaXN0LCBpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogUmVtb3ZlIGEgbGlzdGVuZXIuXG4gKiBAcGFyYW0gbGlzdCBUaGUgbGlzdGVuZXIgbGlzdC5cbiAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHRhcmdldCBsaXN0ZW5lci5cbiAqIEBwYXJhbSBkaXNhYmxlQ293IERpc2FibGUgY29weS1vbi13cml0ZSBpZiB0cnVlLlxuICogQHJldHVybnMgYHRydWVgIGlmIGl0IG11dGF0ZWQgdGhlIGBsaXN0ZW5lcnNgIGFycmF5IGRpcmVjdGx5LlxuICovXG5mdW5jdGlvbiByZW1vdmVMaXN0ZW5lckF0KGxpc3QsIGluZGV4LCBkaXNhYmxlQ293ID0gZmFsc2UpIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IGxpc3QubGlzdGVuZXJzW2luZGV4XTtcbiAgICAvLyBTZXQgdGhlIHJlbW92ZWQgZmxhZy5cbiAgICBzZXRSZW1vdmVkKGxpc3RlbmVyKTtcbiAgICAvLyBEaXNwb3NlIHRoZSBhYm9ydCBzaWduYWwgbGlzdGVuZXIgaWYgZXhpc3RzLlxuICAgIGlmIChsaXN0ZW5lci5zaWduYWwpIHtcbiAgICAgICAgbGlzdGVuZXIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBsaXN0ZW5lci5zaWduYWxMaXN0ZW5lcik7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBpdCBmcm9tIHRoZSBhcnJheS5cbiAgICBpZiAobGlzdC5jb3cgJiYgIWRpc2FibGVDb3cpIHtcbiAgICAgICAgbGlzdC5jb3cgPSBmYWxzZTtcbiAgICAgICAgbGlzdC5saXN0ZW5lcnMgPSBsaXN0Lmxpc3RlbmVycy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsaXN0Lmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBgTGlzdGVuZXJMaXN0TWFwYCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyTGlzdE1hcCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0ZW5lciBsaXN0IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogSWYgdGhlIGxpc3RlbmVyIGxpc3QgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLCBpbml0aWFsaXplIGFuZCByZXR1cm4gaXQuXG4gKiBAcGFyYW0gbGlzdGVuZXJNYXAgVGhlIGxpc3RlbmVyIGxpc3QgbWFwLlxuICogQHBhcmFtIHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gZ2V0LlxuICovXG5mdW5jdGlvbiBlbnN1cmVMaXN0ZW5lckxpc3QobGlzdGVuZXJNYXAsIHR5cGUpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuICgoX2EgPSBsaXN0ZW5lck1hcFt0eXBlXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKGxpc3RlbmVyTWFwW3R5cGVdID0ge1xuICAgICAgICBhdHRyQ2FsbGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgYXR0ckxpc3RlbmVyOiB1bmRlZmluZWQsXG4gICAgICAgIGNvdzogZmFsc2UsXG4gICAgICAgIGxpc3RlbmVyczogW10sXG4gICAgfSkpO1xufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBgRXZlbnRUYXJnZXRgIGludGVyZmFjZS5cbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNldmVudHRhcmdldFxuICovXG5jbGFzcyBFdmVudFRhcmdldCB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBpbnRlcm5hbERhdGFNYXAkMi5zZXQodGhpcywgY3JlYXRlTGlzdGVuZXJMaXN0TWFwKCkpO1xuICAgIH1cbiAgICAvLyBJbXBsZW1lbnRhdGlvblxuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZTAsIGNhbGxiYWNrMCwgb3B0aW9uczApIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJNYXAgPSAkJDIodGhpcyk7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIGNhcHR1cmUsIG9uY2UsIHBhc3NpdmUsIHNpZ25hbCwgdHlwZSwgfSA9IG5vcm1hbGl6ZUFkZE9wdGlvbnModHlwZTAsIGNhbGxiYWNrMCwgb3B0aW9uczApO1xuICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCB8fCAoc2lnbmFsID09PSBudWxsIHx8IHNpZ25hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2lnbmFsLmFib3J0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdCA9IGVuc3VyZUxpc3RlbmVyTGlzdChsaXN0ZW5lck1hcCwgdHlwZSk7XG4gICAgICAgIC8vIEZpbmQgZXhpc3RpbmcgbGlzdGVuZXIuXG4gICAgICAgIGNvbnN0IGkgPSBmaW5kSW5kZXhPZkxpc3RlbmVyKGxpc3QsIGNhbGxiYWNrLCBjYXB0dXJlKTtcbiAgICAgICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICAgICAgICB3YXJuRHVwbGljYXRlKGxpc3QubGlzdGVuZXJzW2ldLCBwYXNzaXZlLCBvbmNlLCBzaWduYWwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IGxpc3RlbmVyLlxuICAgICAgICBhZGRMaXN0ZW5lcihsaXN0LCBjYWxsYmFjaywgY2FwdHVyZSwgcGFzc2l2ZSwgb25jZSwgc2lnbmFsKTtcbiAgICB9XG4gICAgLy8gSW1wbGVtZW50YXRpb25cbiAgICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUwLCBjYWxsYmFjazAsIG9wdGlvbnMwKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyTWFwID0gJCQyKHRoaXMpO1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBjYXB0dXJlLCB0eXBlIH0gPSBub3JtYWxpemVPcHRpb25zKHR5cGUwLCBjYWxsYmFjazAsIG9wdGlvbnMwKTtcbiAgICAgICAgY29uc3QgbGlzdCA9IGxpc3RlbmVyTWFwW3R5cGVdO1xuICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiBsaXN0KSB7XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihsaXN0LCBjYWxsYmFjaywgY2FwdHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSW1wbGVtZW50YXRpb25cbiAgICBkaXNwYXRjaEV2ZW50KGUpIHtcbiAgICAgICAgY29uc3QgbGlzdCA9ICQkMih0aGlzKVtTdHJpbmcoZS50eXBlKV07XG4gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZSBpbnN0YW5jZW9mIEV2ZW50ID8gZSA6IEV2ZW50V3JhcHBlci53cmFwKGUpO1xuICAgICAgICBjb25zdCBldmVudERhdGEgPSAkKGV2ZW50LCBcImV2ZW50XCIpO1xuICAgICAgICBpZiAoZXZlbnREYXRhLmRpc3BhdGNoRmxhZykge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlSW52YWxpZFN0YXRlRXJyb3IoXCJUaGlzIGV2ZW50IGhhcyBiZWVuIGluIGRpc3BhdGNoaW5nLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudERhdGEuZGlzcGF0Y2hGbGFnID0gdHJ1ZTtcbiAgICAgICAgZXZlbnREYXRhLnRhcmdldCA9IGV2ZW50RGF0YS5jdXJyZW50VGFyZ2V0ID0gdGhpcztcbiAgICAgICAgaWYgKCFldmVudERhdGEuc3RvcFByb3BhZ2F0aW9uRmxhZykge1xuICAgICAgICAgICAgY29uc3QgeyBjb3csIGxpc3RlbmVycyB9ID0gbGlzdDtcbiAgICAgICAgICAgIC8vIFNldCBjb3B5LW9uLXdyaXRlIGZsYWcuXG4gICAgICAgICAgICBsaXN0LmNvdyA9IHRydWU7XG4gICAgICAgICAgICAvLyBDYWxsIGxpc3RlbmVycy5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBpZiByZW1vdmVkLlxuICAgICAgICAgICAgICAgIGlmIChpc1JlbW92ZWQobGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBsaXN0ZW5lciBpZiBoYXMgdGhlIGBvbmNlYCBmbGFnLlxuICAgICAgICAgICAgICAgIGlmIChpc09uY2UobGlzdGVuZXIpICYmIHJlbW92ZUxpc3RlbmVyQXQobGlzdCwgaSwgIWNvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGlzIGxpc3RlbmVyIHdhcyByZW1vdmVkLCB0aGUgbmV4dCBpbmRleCBpcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSBhcyB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDYWxsIHRoaXMgbGlzdGVuZXIgd2l0aCB0aGUgYHBhc3NpdmVgIGZsYWcuXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhLmluUGFzc2l2ZUxpc3RlbmVyRmxhZyA9IGlzUGFzc2l2ZShsaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sobGlzdGVuZXIsIHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICBldmVudERhdGEuaW5QYXNzaXZlTGlzdGVuZXJGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gU3RvcCBpZiB0aGUgYGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpYCBtZXRob2Qgd2FzIGNhbGxlZC5cbiAgICAgICAgICAgICAgICBpZiAoZXZlbnREYXRhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbkZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVzdG9yZSBjb3B5LW9uLXdyaXRlIGZsYWcuXG4gICAgICAgICAgICBpZiAoIWNvdykge1xuICAgICAgICAgICAgICAgIGxpc3QuY293ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnREYXRhLnRhcmdldCA9IG51bGw7XG4gICAgICAgIGV2ZW50RGF0YS5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgZXZlbnREYXRhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbkZsYWcgPSBmYWxzZTtcbiAgICAgICAgZXZlbnREYXRhLnN0b3BQcm9wYWdhdGlvbkZsYWcgPSBmYWxzZTtcbiAgICAgICAgZXZlbnREYXRhLmRpc3BhdGNoRmxhZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gIWV2ZW50RGF0YS5jYW5jZWxlZEZsYWc7XG4gICAgfVxufVxuLyoqXG4gKiBJbnRlcm5hbCBkYXRhLlxuICovXG5jb25zdCBpbnRlcm5hbERhdGFNYXAkMiA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdldCBwcml2YXRlIGRhdGEuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgb2JqZWN0IHRvIGdldCBwcml2YXRlIGRhdGEuXG4gKiBAcGFyYW0gbmFtZSBUaGUgdmFyaWFibGUgbmFtZSB0byByZXBvcnQuXG4gKiBAcmV0dXJucyBUaGUgcHJpdmF0ZSBkYXRhIG9mIHRoZSBldmVudC5cbiAqL1xuZnVuY3Rpb24gJCQyKHRhcmdldCwgbmFtZSA9IFwidGhpc1wiKSB7XG4gICAgY29uc3QgcmV0diA9IGludGVybmFsRGF0YU1hcCQyLmdldCh0YXJnZXQpO1xuICAgIGFzc2VydFR5cGUocmV0diAhPSBudWxsLCBcIiclcycgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCBFdmVudFRhcmdldCBjb25zdHJ1Y3RvciBjcmVhdGVkLCBidXQgZ290IGFub3RoZXIgb25lOiAlb1wiLCBuYW1lLCB0YXJnZXQpO1xuICAgIHJldHVybiByZXR2O1xufVxuLyoqXG4gKiBOb3JtYWxpemUgb3B0aW9ucy5cbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIG5vcm1hbGl6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQWRkT3B0aW9ucyh0eXBlLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICBhc3NlcnRDYWxsYmFjayhjYWxsYmFjayk7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcIm9iamVjdFwiICYmIG9wdGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyh0eXBlKSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayAhPT0gbnVsbCAmJiBjYWxsYmFjayAhPT0gdm9pZCAwID8gY2FsbGJhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjYXB0dXJlOiBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSksXG4gICAgICAgICAgICBwYXNzaXZlOiBCb29sZWFuKG9wdGlvbnMucGFzc2l2ZSksXG4gICAgICAgICAgICBvbmNlOiBCb29sZWFuKG9wdGlvbnMub25jZSksXG4gICAgICAgICAgICBzaWduYWw6IChfYSA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFN0cmluZyh0eXBlKSxcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrICE9PSBudWxsICYmIGNhbGxiYWNrICE9PSB2b2lkIDAgPyBjYWxsYmFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgY2FwdHVyZTogQm9vbGVhbihvcHRpb25zKSxcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIG9uY2U6IGZhbHNlLFxuICAgICAgICBzaWduYWw6IHVuZGVmaW5lZCxcbiAgICB9O1xufVxuLyoqXG4gKiBOb3JtYWxpemUgb3B0aW9ucy5cbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIG5vcm1hbGl6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplT3B0aW9ucyh0eXBlLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIGFzc2VydENhbGxiYWNrKGNhbGxiYWNrKTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwib2JqZWN0XCIgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nKHR5cGUpLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrICE9PSBudWxsICYmIGNhbGxiYWNrICE9PSB2b2lkIDAgPyBjYWxsYmFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNhcHR1cmU6IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogU3RyaW5nKHR5cGUpLFxuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2sgIT09IG51bGwgJiYgY2FsbGJhY2sgIT09IHZvaWQgMCA/IGNhbGxiYWNrIDogdW5kZWZpbmVkLFxuICAgICAgICBjYXB0dXJlOiBCb29sZWFuKG9wdGlvbnMpLFxuICAgIH07XG59XG4vKipcbiAqIEFzc2VydCB0aGUgdHlwZSBvZiAnY2FsbGJhY2snIGFyZ3VtZW50LlxuICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Q2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgICAgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgY2FsbGJhY2sgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYWxsYmFjay5oYW5kbGVFdmVudCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjYWxsYmFjayA9PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBJbnZhbGlkRXZlbnRMaXN0ZW5lci53YXJuKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGZvcm1hdChJbnZhbGlkRXZlbnRMaXN0ZW5lci5tZXNzYWdlLCBbY2FsbGJhY2tdKSk7XG59XG4vKipcbiAqIFByaW50IHdhcm5pbmcgZm9yIGR1cGxpY2F0ZWQuXG4gKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGN1cnJlbnQgbGlzdGVuZXIgdGhhdCBpcyBkdXBsaWNhdGVkLlxuICogQHBhcmFtIHBhc3NpdmUgVGhlIHBhc3NpdmUgZmxhZyBvZiB0aGUgbmV3IGR1cGxpY2F0ZWQgbGlzdGVuZXIuXG4gKiBAcGFyYW0gb25jZSBUaGUgb25jZSBmbGFnIG9mIHRoZSBuZXcgZHVwbGljYXRlZCBsaXN0ZW5lci5cbiAqIEBwYXJhbSBzaWduYWwgVGhlIHNpZ25hbCBvYmplY3Qgb2YgdGhlIG5ldyBkdXBsaWNhdGVkIGxpc3RlbmVyLlxuICovXG5mdW5jdGlvbiB3YXJuRHVwbGljYXRlKGxpc3RlbmVyLCBwYXNzaXZlLCBvbmNlLCBzaWduYWwpIHtcbiAgICBFdmVudExpc3RlbmVyV2FzRHVwbGljYXRlZC53YXJuKGlzQ2FwdHVyZShsaXN0ZW5lcikgPyBcImNhcHR1cmVcIiA6IFwiYnViYmxlXCIsIGxpc3RlbmVyLmNhbGxiYWNrKTtcbiAgICBpZiAoaXNQYXNzaXZlKGxpc3RlbmVyKSAhPT0gcGFzc2l2ZSkge1xuICAgICAgICBPcHRpb25XYXNJZ25vcmVkLndhcm4oXCJwYXNzaXZlXCIpO1xuICAgIH1cbiAgICBpZiAoaXNPbmNlKGxpc3RlbmVyKSAhPT0gb25jZSkge1xuICAgICAgICBPcHRpb25XYXNJZ25vcmVkLndhcm4oXCJvbmNlXCIpO1xuICAgIH1cbiAgICBpZiAobGlzdGVuZXIuc2lnbmFsICE9PSBzaWduYWwpIHtcbiAgICAgICAgT3B0aW9uV2FzSWdub3JlZC53YXJuKFwic2lnbmFsXCIpO1xuICAgIH1cbn1cbi8vIFNldCBlbnVtZXJhYmxlXG5jb25zdCBrZXlzJDEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhFdmVudFRhcmdldC5wcm90b3R5cGUpO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzJDEubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoa2V5cyQxW2ldID09PSBcImNvbnN0cnVjdG9yXCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudFRhcmdldC5wcm90b3R5cGUsIGtleXMkMVtpXSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufVxuLy8gRW5zdXJlIGBldmVudFRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudFRhcmdldGAgaXMgYHRydWVgLlxuaWYgKHR5cGVvZiBHbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2YgR2xvYmFsLkV2ZW50VGFyZ2V0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEV2ZW50VGFyZ2V0LnByb3RvdHlwZSwgR2xvYmFsLkV2ZW50VGFyZ2V0LnByb3RvdHlwZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgZ2l2ZW4gZXZlbnQgYXR0cmlidXRlLlxuICogQHBhcmFtIHRhcmdldCBUaGUgYEV2ZW50VGFyZ2V0YCBvYmplY3QgdG8gZ2V0LlxuICogQHBhcmFtIHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50QXR0cmlidXRlVmFsdWUodGFyZ2V0LCB0eXBlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBjb25zdCBsaXN0TWFwID0gJCQyKHRhcmdldCwgXCJ0YXJnZXRcIik7XG4gICAgcmV0dXJuIChfYiA9IChfYSA9IGxpc3RNYXBbdHlwZV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hdHRyQ2FsbGJhY2spICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGw7XG59XG4vKipcbiAqIFNldCBhbiBldmVudCBsaXN0ZW5lciB0byBhIGdpdmVuIGV2ZW50IGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGBFdmVudFRhcmdldGAgb2JqZWN0IHRvIHNldC5cbiAqIEBwYXJhbSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICogQHBhcmFtIGNhbGxiYWNrIFRoZSBldmVudCBsaXN0ZW5lci5cbiAqL1xuZnVuY3Rpb24gc2V0RXZlbnRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgSW52YWxpZEF0dHJpYnV0ZUhhbmRsZXIud2FybihjYWxsYmFjayk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICAgICAodHlwZW9mIGNhbGxiYWNrID09PSBcIm9iamVjdFwiICYmIGNhbGxiYWNrICE9PSBudWxsKSkge1xuICAgICAgICB1cHNlcnRFdmVudEF0dHJpYnV0ZUxpc3RlbmVyKHRhcmdldCwgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRXZlbnRBdHRyaWJ1dGVMaXN0ZW5lcih0YXJnZXQsIHR5cGUpO1xuICAgIH1cbn1cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBVcGRhdGUgb3IgaW5zZXJ0IHRoZSBnaXZlbiBldmVudCBhdHRyaWJ1dGUgaGFuZGxlci5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGBFdmVudFRhcmdldGAgb2JqZWN0IHRvIHNldC5cbiAqIEBwYXJhbSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICogQHBhcmFtIGNhbGxiYWNrIFRoZSBldmVudCBsaXN0ZW5lci5cbiAqL1xuZnVuY3Rpb24gdXBzZXJ0RXZlbnRBdHRyaWJ1dGVMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgbGlzdCA9IGVuc3VyZUxpc3RlbmVyTGlzdCgkJDIodGFyZ2V0LCBcInRhcmdldFwiKSwgU3RyaW5nKHR5cGUpKTtcbiAgICBsaXN0LmF0dHJDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIGlmIChsaXN0LmF0dHJMaXN0ZW5lciA9PSBudWxsKSB7XG4gICAgICAgIGxpc3QuYXR0ckxpc3RlbmVyID0gYWRkTGlzdGVuZXIobGlzdCwgZGVmaW5lRXZlbnRBdHRyaWJ1dGVDYWxsYmFjayhsaXN0KSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdW5kZWZpbmVkKTtcbiAgICB9XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgZ2l2ZW4gZXZlbnQgYXR0cmlidXRlIGhhbmRsZXIuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSBgRXZlbnRUYXJnZXRgIG9iamVjdCB0byByZW1vdmUuXG4gKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgZXZlbnQgbGlzdGVuZXIuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50QXR0cmlidXRlTGlzdGVuZXIodGFyZ2V0LCB0eXBlKSB7XG4gICAgY29uc3QgbGlzdE1hcCA9ICQkMih0YXJnZXQsIFwidGFyZ2V0XCIpO1xuICAgIGNvbnN0IGxpc3QgPSBsaXN0TWFwW1N0cmluZyh0eXBlKV07XG4gICAgaWYgKGxpc3QgJiYgbGlzdC5hdHRyTGlzdGVuZXIpIHtcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdCwgbGlzdC5hdHRyTGlzdGVuZXIuY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgbGlzdC5hdHRyQ2FsbGJhY2sgPSBsaXN0LmF0dHJMaXN0ZW5lciA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG4vKipcbiAqIERlZmluZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBsaXN0ZW5lciBsaXN0IG9iamVjdC5cbiAqIEl0IGNhbGxzIGBhdHRyQ2FsbGJhY2tgIHByb3BlcnR5IGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIGxpc3QgVGhlIGBMaXN0ZW5lckxpc3RgIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lRXZlbnRBdHRyaWJ1dGVDYWxsYmFjayhsaXN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IGxpc3QuYXR0ckNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqXG4gKiBEZWZpbmUgYW4gYEV2ZW50VGFyZ2V0YCBjbGFzcyB0aGF0IGhhcyBldmVudCBhdHRpYnV0ZXMuXG4gKiBAcGFyYW0gdHlwZXMgVGhlIHR5cGVzIHRvIGRlZmluZSBldmVudCBhdHRyaWJ1dGVzLlxuICogQGRlcHJlY2F0ZWQgVXNlIGBnZXRFdmVudEF0dHJpYnV0ZVZhbHVlYC9gc2V0RXZlbnRBdHRyaWJ1dGVWYWx1ZWAgcGFpciBvbiB5b3VyIGRlcml2ZWQgY2xhc3MgaW5zdGVhZCBiZWNhdXNlIG9mIHN0YXRpYyBhbmFseXNpcyBmcmllbmRseS5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoLi4udHlwZXMpIHtcbiAgICBjbGFzcyBDdXN0b21FdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBkZWZpbmVFdmVudEF0dHJpYnV0ZShDdXN0b21FdmVudFRhcmdldC5wcm90b3R5cGUsIHR5cGVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50VGFyZ2V0O1xufVxuLyoqXG4gKiBEZWZpbmUgYW4gZXZlbnQgYXR0cmlidXRlLlxuICogQHBhcmFtIHRhcmdldCBUaGUgYEV2ZW50VGFyZ2V0YCBvYmplY3QgdG8gZGVmaW5lIGFuIGV2ZW50IGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGRlZmluZS5cbiAqIEBwYXJhbSBfZXZlbnRDbGFzcyBVbnVzZWQsIGJ1dCB0byBpbmZlciBgRXZlbnRgIGNsYXNzIHR5cGUuXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGdldEV2ZW50QXR0cmlidXRlVmFsdWVgL2BzZXRFdmVudEF0dHJpYnV0ZVZhbHVlYCBwYWlyIG9uIHlvdXIgZGVyaXZlZCBjbGFzcyBpbnN0ZWFkIGJlY2F1c2Ugb2Ygc3RhdGljIGFuYWx5c2lzIGZyaWVuZGx5LlxuICovXG5mdW5jdGlvbiBkZWZpbmVFdmVudEF0dHJpYnV0ZSh0YXJnZXQsIHR5cGUsIF9ldmVudENsYXNzKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgYG9uJHt0eXBlfWAsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEV2ZW50QXR0cmlidXRlVmFsdWUodGhpcywgdHlwZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgc2V0RXZlbnRBdHRyaWJ1dGVWYWx1ZSh0aGlzLCB0eXBlLCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRUYXJnZXQ7XG5leHBvcnQgeyBFdmVudCwgRXZlbnRUYXJnZXQsIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0LCBkZWZpbmVFdmVudEF0dHJpYnV0ZSwgZ2V0RXZlbnRBdHRyaWJ1dGVWYWx1ZSwgc2V0RXJyb3JIYW5kbGVyLCBzZXRFdmVudEF0dHJpYnV0ZVZhbHVlLCBzZXRXYXJuaW5nSGFuZGxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiaW1wb3J0IHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gXCIuL0NhbGVuZGFyRXZlbnRcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFdmVudHNGb3JEYXkoZXZlbnRzOiBDYWxlbmRhckV2ZW50W10sIGRhdGU6IERhdGUpOiBDYWxlbmRhckV2ZW50W10ge1xyXG4gIHJldHVybiBldmVudHMuZmlsdGVyKGV2ZW50ID0+IHtcclxuICAgIHJldHVybiBldmVudC5kYXRlLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUuZ2V0RnVsbFllYXIoKSAmJlxyXG4gICAgICBldmVudC5kYXRlLmdldE1vbnRoKCkgPT09IGRhdGUuZ2V0TW9udGgoKSAmJlxyXG4gICAgICBldmVudC5kYXRlLmdldERhdGUoKSA9PT0gZGF0ZS5nZXREYXRlKCk7XHJcbiAgfSkuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgLy8gSWYgb25lIGhhcyBubyB0aW1lIHByb3BlcnR5LCBpdCBzaG91bGQgYmUgZmlyc3QuXHJcbiAgICAvLyBJZiBib3RoIGhhdmUgbm8gdGltZSwgbm8gc29ydGluZyBpcyBuZWVkZWQuXHJcbiAgICBpZiAoIWEudGltZSAmJiAhIWIudGltZSkge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9IGVsc2UgaWYgKCEhYS50aW1lICYmICFiLnRpbWUpIHtcclxuICAgICAgcmV0dXJuIDE7XHJcbiAgICB9IGVsc2UgaWYgKCFhLnRpbWUgJiYgIWIudGltZSkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTb3J0IHRoZSBldmVudHMgYnkgdGltZS4gVGltZXMgYXJlIHN0cmluZ3MgaW4gMjRcclxuICAgIC8vIGZvcm1hdHMsIHNvIGp1c3QgcmVtb3ZlIHRoZSBsZWFkaW5nIDAsIGlmIGFueSwgYW5kXHJcbiAgICAvLyB0aGUgY29sb24sIGFuZCBjb21wYXJlIHRoZSBudW1iZXJzLlxyXG4gICAgY29uc3QgYVRpbWUgPSBwYXJzZUludChhLnRpbWUucmVwbGFjZSgvXjAvLCAnJykucmVwbGFjZSgnOicsICcnKSk7XHJcbiAgICBjb25zdCBiVGltZSA9IHBhcnNlSW50KGIudGltZS5yZXBsYWNlKC9eMC8sICcnKS5yZXBsYWNlKCc6JywgJycpKTtcclxuICAgIHJldHVybiBhVGltZSAtIGJUaW1lO1xyXG4gIH0pLnNvcnQoKGEsIGIpID0+IHtcclxuICAgIC8vIFNvcnQgdGhlIGV2ZW50cyB0aGF0IGFyZSBtdWx0aS1kYXlzIGZpcnN0LlxyXG4gICAgaWYgKCEhYS5tdWx0aURheXMgJiYgIWIubXVsdGlEYXlzKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH0gZWxzZSBpZiAoIWEubXVsdGlEYXlzICYmICEhYi5tdWx0aURheXMpIHtcclxuICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwiaW1wb3J0IHsgRXZlbnRUYXJnZXQsIEV2ZW50IH0gZnJvbSBcImV2ZW50LXRhcmdldC1zaGltXCI7XHJcbmltcG9ydCB7IENhbGVuZGFyRXZlbnQgfSBmcm9tIFwiLi9DYWxlbmRhckV2ZW50XCI7XHJcbmltcG9ydCB7IGdldEV2ZW50c0ZvckRheSB9IGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5jb25zdCBEQVlTID0gWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1vbnRoR3JpZCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcclxuICBwcml2YXRlIHJvb3RFbDogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgcHJpdmF0ZSBfZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEhUTUxFbGVtZW50LCBkYXRlOiBEYXRlLCBldmVudHM6IENhbGVuZGFyRXZlbnRbXSkge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLnJvb3RFbCA9IGVsO1xyXG4gICAgdGhpcy5fZGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHM7XHJcblxyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcbiAgXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5yb290RWwuaW5uZXJIVE1MID0gJyc7XHJcblxyXG4gICAgY29uc3QgbW9udGggPSB0aGlzLl9kYXRlLmdldE1vbnRoKCk7XHJcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5fZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gIFxyXG4gICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XHJcbiAgICBjb25zdCBsYXN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKTtcclxuICBcclxuICAgIGNvbnN0IGZpcnN0V2Vla2RheSA9IGZpcnN0RGF5LmdldERheSgpO1xyXG4gICAgY29uc3QgbGFzdFdlZWtkYXkgPSBsYXN0RGF5LmdldERheSgpO1xyXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBsYXN0RGF5LmdldERhdGUoKTtcclxuICAgIGNvbnN0IGRheXNJbkxhc3RNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XHJcbiAgICBjb25zdCBkYXlzOiB7ZGF0ZTogRGF0ZSwgaHRtbDogc3RyaW5nfVtdID0gW107XHJcbiAgXHJcbiAgICBsZXQgaW5kZXhJbkdyaWQgPSAwO1xyXG5cclxuICAgIC8vIERheXMgZnJvbSBsYXN0IG1vbnRoXHJcbiAgICBmb3IgKGxldCBpID0gZGF5c0luTGFzdE1vbnRoIC0gZmlyc3RXZWVrZGF5ICsgMTsgaSA8PSBkYXlzSW5MYXN0TW9udGg7IGkrKykge1xyXG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBpKTtcclxuICAgICAgZGF5cy5wdXNoKHtkYXRlLCBodG1sOiB0aGlzLnJlbmRlckRheShkYXRlLCBpLCBpbmRleEluR3JpZCwgJ3ByZXYtbW9udGgnKX0pO1xyXG4gICAgICBpbmRleEluR3JpZCsrO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gRGF5cyBmcm9tIHRoaXMgbW9udGhcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRheXNJbk1vbnRoOyBpKyspIHtcclxuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpKTtcclxuICAgICAgZGF5cy5wdXNoKHtkYXRlLCBodG1sOiB0aGlzLnJlbmRlckRheShkYXRlLCBpLCBpbmRleEluR3JpZCl9KTtcclxuICAgICAgaW5kZXhJbkdyaWQrKztcclxuICAgIH1cclxuICBcclxuICAgIC8vIERheXMgZnJvbSBuZXh0IG1vbnRoXHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSA3IC0gbGFzdFdlZWtkYXkgLSAxOyBpKyspIHtcclxuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgaSk7XHJcbiAgICAgIGRheXMucHVzaCh7ZGF0ZSwgaHRtbDogdGhpcy5yZW5kZXJEYXkoZGF0ZSwgaSwgaW5kZXhJbkdyaWQsICduZXh0LW1vbnRoJyl9KTtcclxuICAgICAgaW5kZXhJbkdyaWQrKztcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IHtkYXRlLCBodG1sfSBvZiBkYXlzKSB7XHJcbiAgICAgIHRoaXMucm9vdEVsLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XHJcbiAgICAgIGNvbnN0IGRheUVsID0gdGhpcy5yb290RWwubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgIGRheUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZGF5LWNsaWNrZWQnLCB7ZGV0YWlsOiBkYXRlfSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZU5vd01hcmtlcigpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyRGF5KGRhdGU6IERhdGUsIGRheU51bWJlcjogbnVtYmVyLCBpbmRleEluR3JpZDogbnVtYmVyLCBjbGFzc05hbWU6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGV2ZW50cyA9IGdldEV2ZW50c0ZvckRheSh0aGlzLl9ldmVudHMsIGRhdGUpO1xyXG4gICAgY29uc3QgaXNUb2RheSA9IGRhdGUudG9EYXRlU3RyaW5nKCkgPT09IG5ldyBEYXRlKCkudG9EYXRlU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuIGBcclxuICAgICAgPGRpdiBjbGFzcz1cImRheSAke2lzVG9kYXkgPyAndG9kYXknIDogJyd9ICR7Y2xhc3NOYW1lfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF5LW5hbWVcIj4ke0RBWVNbZGF0ZS5nZXREYXkoKV19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXktbnVtYmVyXCI+JHtkYXlOdW1iZXJ9PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDx1bCBjbGFzcz1cImV2ZW50c1wiPlxyXG4gICAgICAgICAgJHtldmVudHMubWFwKGV2ZW50ID0+IGV2ZW50LmFzT25lTGluZUhUTUwoaW5kZXhJbkdyaWQpKS5qb2luKCcnKX1cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIGA7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVOb3dNYXJrZXIoKSB7XHJcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3QgdGltZSA9IG5vdy5nZXRIb3VycygpICogMTAwICsgbm93LmdldE1pbnV0ZXMoKTtcclxuICAgIGNvbnN0IHJhdGlvID0gdGltZSAqIDEwMCAvIDI0MDA7XHJcblxyXG4gICAgLy8gRm9yY2luZyBhIHN5bmMgcmVmbG93IGhlcmUgYnkgcXVlcnlpbmcgdGhlIG9mZnNldEhlaWdodCBvZiB0aGUgZGF5IGNlbGwuXHJcbiAgICAvLyBDb3VsZCBqdXN0IHNldCB0aGUgJSB2YWx1ZSBkaXJlY3RseSBpbnN0ZWFkLlxyXG4gICAgY29uc3QgZGF5RWwgPSB0aGlzLnJvb3RFbC5xdWVyeVNlbGVjdG9yKCcuZGF5LnRvZGF5JykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoZGF5RWwpIHtcclxuICAgICAgY29uc3QgcHhIZWlnaHQgPSBkYXlFbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IG1hcmtlckhlaWdodCA9IHB4SGVpZ2h0ICogcmF0aW8gLyAxMDA7XHJcblxyXG4gICAgICB0aGlzLnJvb3RFbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1ub3ctbWFya2VyJywgYCR7bWFya2VySGVpZ2h0fXB4YCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZU5vd01hcmtlcigpLCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHNldCBkYXRlKGRhdGU6IERhdGUpIHtcclxuICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHNldCBldmVudHMoZXZlbnRzOiBDYWxlbmRhckV2ZW50W10pIHtcclxuICAgIHRoaXMuX2V2ZW50cyA9IGV2ZW50cztcclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEV2ZW50VGFyZ2V0LCBFdmVudCB9IGZyb20gXCJldmVudC10YXJnZXQtc2hpbVwiO1xyXG5cclxuY29uc3QgTU9OVEhTID0gW1xyXG4gICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JyxcclxuICAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCdEZWNlbWJlcidcclxuXTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUb29sYmFyIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xyXG4gIHByaXZhdGUgcm9vdEVsOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIF9kYXRlOiBEYXRlO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRNb2RlOiBzdHJpbmcgPSBcIm1vbnRoXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEhUTUxFbGVtZW50LCBkYXRlOiBEYXRlLCBtb2RlOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy5yb290RWwgPSBlbDtcclxuICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5zZWxlY3RlZE1vZGUgPSBtb2RlO1xyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRNb250aFllYXIoKSB7XHJcbiAgICBjb25zdCBtb250aCA9IHRoaXMuX2RhdGUuZ2V0TW9udGgoKTtcclxuICAgIGNvbnN0IHllYXIgPSB0aGlzLl9kYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICByZXR1cm4gYCR7TU9OVEhTW21vbnRoXX0gJHt5ZWFyfWA7XHJcbiAgfVxyXG4gIFxyXG4gIHJlbmRlcigpIHtcclxuICAgIHRoaXMucm9vdEVsLmlubmVySFRNTCA9IGBcclxuICAgICAgPGJ1dHRvbiBpZD1cInByZXYtbW9udGhcIj5QcmV2PC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gaWQ9XCJ0b2RheVwiIGNsYXNzPVwicHJpbWFyeVwiPlRvZGF5PC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gaWQ9XCJuZXh0LW1vbnRoXCI+TmV4dDwvYnV0dG9uPlxyXG4gICAgICA8c3BhbiBpZD1cIm1vbnRoLXllYXJcIj4ke3RoaXMuZm9ybWF0TW9udGhZZWFyKCl9PC9zcGFuPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInZpZXdcIiBpZD1cIm1vbnRoLXZpZXdcIiAke3RoaXMuc2VsZWN0ZWRNb2RlID09PSBcIm1vbnRoXCIgPyBcImNoZWNrZWRcIiA6IFwiXCJ9PlxyXG4gICAgICA8bGFiZWwgZm9yPVwibW9udGgtdmlld1wiPk1vbnRoPC9sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ2aWV3XCIgaWQ9XCJ3ZWVrLXZpZXdcIiAke3RoaXMuc2VsZWN0ZWRNb2RlID09PSBcIndlZWtcIiA/IFwiY2hlY2tlZFwiIDogXCJcIn0+XHJcbiAgICAgIDxsYWJlbCBmb3I9XCJ3ZWVrLXZpZXdcIj5XZWVrPC9sYWJlbD4gICAgICBcclxuICAgIGA7XHJcblxyXG4gICAgdGhpcy5yb290RWwucXVlcnlTZWxlY3RvcignI3ByZXYtbW9udGgnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coYFByZXYgJHt0aGlzLnNlbGVjdGVkTW9kZX0gY2xpY2tlZGApO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdwcmV2JykpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yb290RWwucXVlcnlTZWxlY3RvcignI25leHQtbW9udGgnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coYE5leHQgJHt0aGlzLnNlbGVjdGVkTW9kZX0gY2xpY2tlZGApO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCduZXh0JykpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yb290RWwucXVlcnlTZWxlY3RvcignI3RvZGF5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiVG9kYXkgY2xpY2tlZFwiKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgndG9kYXknKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJvb3RFbC5xdWVyeVNlbGVjdG9yKCcjbW9udGgtdmlldycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIk1vbnRoIHZpZXcgY2xpY2tlZFwiKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbW9udGgtdmlldycpKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZE1vZGUgPSBcIm1vbnRoXCI7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgdGhpcy5yb290RWwucXVlcnlTZWxlY3RvcignI3dlZWstdmlldycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIldlZWsgdmlldyBjbGlja2VkXCIpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd3ZWVrLXZpZXcnKSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlID0gXCJ3ZWVrXCI7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldCBkYXRlKGRhdGU6IERhdGUpIHtcclxuICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gXCIuL0NhbGVuZGFyRXZlbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTaWRlYmFyIHtcclxuICBwcml2YXRlIHJvb3RFbDogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfZXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXTtcclxuICBwcml2YXRlIF9kYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogSFRNTEVsZW1lbnQsIGRhdGU6IERhdGUsIGV2ZW50czogQ2FsZW5kYXJFdmVudFtdKSB7XHJcbiAgICB0aGlzLnJvb3RFbCA9IGVsO1xyXG4gICAgdGhpcy5fZGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHM7XHJcblxyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcbiAgXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5yb290RWwuaW5uZXJIVE1MID0gYFxyXG4gICAgICA8aDI+Q2xpY2sgYSBkYXkgdG8gdmlldyBldmVudHM8L2gyPlxyXG4gICAgYDtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdEVsLmlubmVySFRNTCA9ICcnO1xyXG5cclxuICAgIGNvbnN0IHVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcclxuICAgIHVsLmNsYXNzTmFtZSA9ICdldmVudHMnO1xyXG4gICAgdGhpcy5yb290RWwuYXBwZW5kQ2hpbGQodWwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgdGhpcy5fZXZlbnRzKSB7XHJcbiAgICAgIHVsLmlubmVySFRNTCArPSBldmVudC5hc0Z1bGxIVE1MKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXQgZXZlbnRzKGV2ZW50czogQ2FsZW5kYXJFdmVudFtdKSB7XHJcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHM7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxufVxyXG5gYCIsImltcG9ydCB7IEV2ZW50VGFyZ2V0LCBFdmVudCB9IGZyb20gXCJldmVudC10YXJnZXQtc2hpbVwiO1xyXG5pbXBvcnQgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSBcIi4vQ2FsZW5kYXJFdmVudFwiO1xyXG5pbXBvcnQgeyBnZXRFdmVudHNGb3JEYXkgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuY29uc3QgREFZUyA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTtcclxuXHJcbmV4cG9ydCBjbGFzcyBXZWVrR3JpZCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcclxuICBwcml2YXRlIHJvb3RFbDogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgcHJpdmF0ZSBfZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEhUTUxFbGVtZW50LCBkYXRlOiBEYXRlLCBldmVudHM6IENhbGVuZGFyRXZlbnRbXSkge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLnJvb3RFbCA9IGVsO1xyXG4gICAgdGhpcy5fZGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHM7XHJcblxyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcbiAgXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5yb290RWwuaW5uZXJIVE1MID0gJyc7XHJcblxyXG4gICAgLy8gRmluZCB0aGUgZGF0ZXMgdGhhdCBtYWtlIHRoZSB3ZWVrIGFyb3VuZCB0aGlzLl9kYXRlLlxyXG4gICAgY29uc3QgbW9udGggPSB0aGlzLl9kYXRlLmdldE1vbnRoKCk7XHJcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5fZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgY29uc3QgZGF5ID0gdGhpcy5fZGF0ZS5nZXREYXkoKTtcclxuXHJcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXRlIC0gZGF5KTtcclxuXHJcbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGRhdGVzIGFuZCByZW5kZXIgdGhlIGRheXMuXHJcbiAgICBjb25zdCBkYXlzOiB7ZGF0ZTogRGF0ZSwgaHRtbDogc3RyaW5nfVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xyXG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGZpcnN0RGF5LmdldERhdGUoKSArIGkpO1xyXG4gICAgICB0aGlzLnJvb3RFbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHRoaXMucmVuZGVyRGF5KGRhdGUsIGRhdGUuZ2V0RGF0ZSgpKSk7XHJcblxyXG4gICAgICBjb25zdCBkYXlFbCA9IHRoaXMucm9vdEVsLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGRheUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZGF5LWNsaWNrZWQnLCB7ZGV0YWlsOiBkYXRlfSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZU5vd01hcmtlcigpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyRGF5KGRhdGU6IERhdGUsIGRheU51bWJlcjogbnVtYmVyLCBjbGFzc05hbWU6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGV2ZW50cyA9IGdldEV2ZW50c0ZvckRheSh0aGlzLl9ldmVudHMsIGRhdGUpO1xyXG4gICAgY29uc3QgaXNUb2RheSA9IGRhdGUudG9EYXRlU3RyaW5nKCkgPT09IG5ldyBEYXRlKCkudG9EYXRlU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuIGBcclxuICAgICAgPGRpdiBjbGFzcz1cImRheSAke2lzVG9kYXkgPyAndG9kYXknIDogJyd9ICR7Y2xhc3NOYW1lfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF5LW5hbWVcIj4ke0RBWVNbZGF0ZS5nZXREYXkoKV19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXktbnVtYmVyXCI+JHtkYXlOdW1iZXJ9PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDx1bCBjbGFzcz1cImV2ZW50c1wiPlxyXG4gICAgICAgICAgJHtldmVudHMubWFwKGV2ZW50ID0+IGV2ZW50LmFzTWVkaXVtTGVuZ3RoSFRNTCgpKS5qb2luKCcnKX1cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIGA7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVOb3dNYXJrZXIoKSB7XHJcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3QgdGltZSA9IG5vdy5nZXRIb3VycygpICogMTAwICsgbm93LmdldE1pbnV0ZXMoKTtcclxuICAgIGNvbnN0IHJhdGlvID0gdGltZSAqIDEwMCAvIDI0MDA7XHJcblxyXG4gICAgLy8gRm9yY2luZyBhIHN5bmMgcmVmbG93IGhlcmUgYnkgcXVlcnlpbmcgdGhlIG9mZnNldEhlaWdodCBvZiB0aGUgZGF5IGNlbGwuXHJcbiAgICAvLyBDb3VsZCBqdXN0IHNldCB0aGUgJSB2YWx1ZSBkaXJlY3RseSBpbnN0ZWFkLlxyXG4gICAgY29uc3QgZGF5RWwgPSB0aGlzLnJvb3RFbC5xdWVyeVNlbGVjdG9yKCcuZGF5LnRvZGF5JykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoZGF5RWwpIHtcclxuICAgICAgY29uc3QgcHhIZWlnaHQgPSBkYXlFbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IG1hcmtlckhlaWdodCA9IHB4SGVpZ2h0ICogcmF0aW8gLyAxMDA7XHJcblxyXG4gICAgICB0aGlzLnJvb3RFbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1ub3ctbWFya2VyJywgYCR7bWFya2VySGVpZ2h0fXB4YCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZU5vd01hcmtlcigpLCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHNldCBkYXRlKGRhdGU6IERhdGUpIHtcclxuICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHNldCBldmVudHMoZXZlbnRzOiBDYWxlbmRhckV2ZW50W10pIHtcclxuICAgIHRoaXMuX2V2ZW50cyA9IGV2ZW50cztcclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEV2ZW50VGFyZ2V0LCBFdmVudCB9IGZyb20gXCJldmVudC10YXJnZXQtc2hpbVwiO1xyXG5pbXBvcnQgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSBcIi4vQ2FsZW5kYXJFdmVudFwiO1xyXG5pbXBvcnQgeyBNb250aEdyaWQgfSBmcm9tIFwiLi9Nb250aEdyaWRcIjtcclxuaW1wb3J0IHsgVG9vbGJhciB9IGZyb20gXCIuL1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gXCIuL1NpZGViYXJcIjtcclxuaW1wb3J0IHsgZ2V0RXZlbnRzRm9yRGF5IH0gZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IHsgV2Vla0dyaWQgfSBmcm9tIFwiLi9XZWVrR3JpZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFwcFVJIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xyXG4gIHByaXZhdGUgcm9vdEVsOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgcHJpdmF0ZSBtb250aEdyaWRFbDogSFRNTEVsZW1lbnQ7XHJcbiAgcHVibGljIG1vbnRoR3JpZDogTW9udGhHcmlkO1xyXG5cclxuICBwcml2YXRlIHdlZWtHcmlkRWw6IEhUTUxFbGVtZW50O1xyXG4gIHB1YmxpYyB3ZWVrR3JpZDogV2Vla0dyaWQ7XHJcblxyXG4gIHByaXZhdGUgdG9vbGJhckVsOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHRvb2xiYXI6IFRvb2xiYXI7XHJcblxyXG4gIHByaXZhdGUgc2lkZWJhckVsOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHNpZGViYXI6IFNpZGViYXI7XHJcblxyXG4gIHByaXZhdGUgX2RhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBfZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XHJcblxyXG4gIHByaXZhdGUgbW9kZTogc3RyaW5nID0gXCJtb250aFwiO1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbDogSFRNTEVsZW1lbnQsIGRhdGU6IERhdGUsIG1vZGU6IHN0cmluZywgZXZlbnRzOiBDYWxlbmRhckV2ZW50W10pIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy5yb290RWwgPSBlbDtcclxuICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5fZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgdGhpcy5tb2RlID0gbW9kZTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5yb290RWwuaW5uZXJIVE1MID0gJyc7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuIGVsZW1lbnQgZm9yIHRoZSB0b29sYmFyLlxyXG4gICAgdGhpcy50b29sYmFyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMudG9vbGJhckVsLmlkID0gJ3Rvb2xiYXInO1xyXG4gICAgdGhpcy5yb290RWwuYXBwZW5kQ2hpbGQodGhpcy50b29sYmFyRWwpO1xyXG5cclxuICAgIC8vIEluaXQgdGhlIHRvb2xiYXIgY29tcG9uZW50IGluIGl0LlxyXG4gICAgdGhpcy50b29sYmFyID0gbmV3IFRvb2xiYXIodGhpcy50b29sYmFyRWwsIHRoaXMuX2RhdGUsIHRoaXMubW9kZSk7XHJcblxyXG4gICAgdGhpcy50b29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ3ByZXYnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLm1vZGUgPT09IFwibW9udGhcIlxyXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5fZGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLl9kYXRlLmdldE1vbnRoKCkgLSAxLCAxKVxyXG4gICAgICAgIDogbmV3IERhdGUodGhpcy5fZGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLl9kYXRlLmdldE1vbnRoKCksIHRoaXMuX2RhdGUuZ2V0RGF0ZSgpIC0gNyk7XHJcbiAgICAgIHRoaXMuZGF0ZSA9IG5ld0RhdGU7XHJcblxyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RhdGUtY2hhbmdlZCcsIHtkZXRhaWw6IHRoaXMuX2RhdGV9KSk7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgdGhpcy50b29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ25leHQnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLm1vZGUgPT09IFwibW9udGhcIlxyXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5fZGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLl9kYXRlLmdldE1vbnRoKCkgKyAxLCAxKVxyXG4gICAgICAgIDogbmV3IERhdGUodGhpcy5fZGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLl9kYXRlLmdldE1vbnRoKCksIHRoaXMuX2RhdGUuZ2V0RGF0ZSgpICsgNyk7XHJcbiAgICAgIHRoaXMuZGF0ZSA9IG5ld0RhdGU7XHJcblxyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RhdGUtY2hhbmdlZCcsIHtkZXRhaWw6IHRoaXMuX2RhdGV9KSk7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgdGhpcy50b29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvZGF5JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLmRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkYXRlLWNoYW5nZWQnLCB7ZGV0YWlsOiB0aGlzLl9kYXRlfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy50b29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ21vbnRoLXZpZXcnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMubW9kZSA9IFwibW9udGhcIjtcclxuICAgICAgdGhpcy5tb250aEdyaWRFbC5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnO1xyXG4gICAgICB0aGlzLndlZWtHcmlkRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbW9kZS1jaGFuZ2VkJywge2RldGFpbDogdGhpcy5tb2RlfSkpO1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIHRoaXMudG9vbGJhci5hZGRFdmVudExpc3RlbmVyKCd3ZWVrLXZpZXcnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMubW9kZSA9IFwid2Vla1wiO1xyXG4gICAgICB0aGlzLm1vbnRoR3JpZEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIHRoaXMud2Vla0dyaWRFbC5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnO1xyXG5cclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdtb2RlLWNoYW5nZWQnLCB7ZGV0YWlsOiB0aGlzLm1vZGV9KSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gZWxlbWVudCBmb3IgdGhlIG1vbnRoIGdyaWQuXHJcbiAgICB0aGlzLm1vbnRoR3JpZEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLm1vbnRoR3JpZEVsLmlkID0gJ21vbnRoLWdyaWQnO1xyXG4gICAgdGhpcy5yb290RWwuYXBwZW5kQ2hpbGQodGhpcy5tb250aEdyaWRFbCk7XHJcblxyXG4gICAgLy8gSW5pdCB0aGUgbW9udGggZ3JpZCBjb21wb25lbnQgaW4gaXQuXHJcbiAgICB0aGlzLm1vbnRoR3JpZCA9IG5ldyBNb250aEdyaWQodGhpcy5tb250aEdyaWRFbCwgdGhpcy5fZGF0ZSwgdGhpcy5fZXZlbnRzKTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gZWxlbWVudCBmb3IgdGhlIHdlZWsgZ3JpZC5cclxuICAgIHRoaXMud2Vla0dyaWRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy53ZWVrR3JpZEVsLmlkID0gJ3dlZWstZ3JpZCc7XHJcbiAgICB0aGlzLnJvb3RFbC5hcHBlbmRDaGlsZCh0aGlzLndlZWtHcmlkRWwpO1xyXG5cclxuICAgIC8vIEluaXQgdGhlIHdlZWsgZ3JpZCBjb21wb25lbnQgaW4gaXQuXHJcbiAgICB0aGlzLndlZWtHcmlkID0gbmV3IFdlZWtHcmlkKHRoaXMud2Vla0dyaWRFbCwgdGhpcy5fZGF0ZSwgdGhpcy5fZXZlbnRzKTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gZWxlbWVudCBmb3IgdGhlIHNpZGViYXIuXHJcbiAgICB0aGlzLnNpZGViYXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5zaWRlYmFyRWwuaWQgPSAnc2lkZWJhcic7XHJcbiAgICB0aGlzLnJvb3RFbC5hcHBlbmRDaGlsZCh0aGlzLnNpZGViYXJFbCk7XHJcblxyXG4gICAgLy8gSW5pdCB0aGUgc2lkZWJhciBjb21wb25lbnQgaW4gaXQuXHJcbiAgICB0aGlzLnNpZGViYXIgPSBuZXcgU2lkZWJhcih0aGlzLnNpZGViYXJFbCwgdGhpcy5fZGF0ZSwgdGhpcy5fZXZlbnRzKTtcclxuXHJcbiAgICAvLyBMaXN0ZW4gZm9yIGRheS1jbGlja2VkIGV2ZW50cyBmcm9tIHRoZSBtb250aCBhbmQgd2VlayBncmlkcyB0byBzaG93IHRoZSBmdWxsXHJcbiAgICAvLyBsaXN0IGluIHRoZSBzaWRlYmFyLlxyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgdGhpcy5tb250aEdyaWQuYWRkRXZlbnRMaXN0ZW5lcignZGF5LWNsaWNrZWQnLCAoZTogQ3VzdG9tRXZlbnQpID0+IHtcclxuICAgICAgY29uc3QgZGF0ZSA9IGUuZGV0YWlsO1xyXG4gICAgICBjb25zdCBldmVudHMgPSBnZXRFdmVudHNGb3JEYXkodGhpcy5fZXZlbnRzLCBkYXRlKTtcclxuICAgICAgdGhpcy5zaWRlYmFyLmV2ZW50cyA9IGV2ZW50cztcclxuICAgIH0pO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgdGhpcy53ZWVrR3JpZC5hZGRFdmVudExpc3RlbmVyKCdkYXktY2xpY2tlZCcsIChlOiBDdXN0b21FdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRlID0gZS5kZXRhaWw7XHJcbiAgICAgIGNvbnN0IGV2ZW50cyA9IGdldEV2ZW50c0ZvckRheSh0aGlzLl9ldmVudHMsIGRhdGUpO1xyXG4gICAgICB0aGlzLnNpZGViYXIuZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU3RhcnQgd2l0aCB0b2RheS5cclxuICAgIHRoaXMuc2lkZWJhci5ldmVudHMgPSBnZXRFdmVudHNGb3JEYXkodGhpcy5fZXZlbnRzLCBuZXcgRGF0ZSgpKTtcclxuXHJcbiAgICAvLyBTaG93L2hpZGUgdGhlIHJpZ2h0IG1vZGVcclxuICAgIGlmICh0aGlzLm1vZGUgPT09IFwid2Vla1wiKSB7XHJcbiAgICAgIHRoaXMubW9udGhHcmlkRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgdGhpcy53ZWVrR3JpZEVsLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1vbnRoR3JpZEVsLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XHJcbiAgICAgIHRoaXMud2Vla0dyaWRFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IGRhdGUoZGF0ZTogRGF0ZSkge1xyXG4gICAgY29uc29sZS5sb2coXCJTZXR0aW5nIGRhdGUgdG9cIiwgZGF0ZSk7XHJcbiAgICB0aGlzLl9kYXRlID0gZGF0ZTtcclxuICAgIHRoaXMubW9udGhHcmlkLmRhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy53ZWVrR3JpZC5kYXRlID0gZGF0ZTtcclxuICAgIHRoaXMudG9vbGJhci5kYXRlID0gZGF0ZTtcclxuICAgIHRoaXMuc2lkZWJhci5ldmVudHMgPSBnZXRFdmVudHNGb3JEYXkodGhpcy5fZXZlbnRzLCB0aGlzLl9kYXRlKTtcclxuICB9XHJcblxyXG4gIHNldCBldmVudHMoZXZlbnRzOiBDYWxlbmRhckV2ZW50W10pIHtcclxuICAgIHRoaXMuX2V2ZW50cyA9IGV2ZW50cztcclxuICAgIHRoaXMubW9udGhHcmlkLmV2ZW50cyA9IGV2ZW50cztcclxuICAgIHRoaXMud2Vla0dyaWQuZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgdGhpcy5zaWRlYmFyLmV2ZW50cyA9IGdldEV2ZW50c0ZvckRheSh0aGlzLl9ldmVudHMsIHRoaXMuX2RhdGUpO1xyXG4gIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgQ2FsZW5kYXJFdmVudCB7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBpZDogc3RyaW5nO1xyXG4gIGRhdGU6IERhdGU7XHJcbiAgdGltZTogc3RyaW5nfHVuZGVmaW5lZDtcclxuICBkdXJhdGlvbjogbnVtYmVyfHVuZGVmaW5lZDtcclxuICByZXBlYXQ6IHN0cmluZ3x1bmRlZmluZWQ7XHJcbiAgZGVzY3JpcHRpb246IHN0cmluZ3x1bmRlZmluZWQ7XHJcbiAgY29sb3I6IHN0cmluZ3x1bmRlZmluZWQ7XHJcbiAgbG9jYXRpb246IHN0cmluZ3x1bmRlZmluZWQ7XHJcbiAgbXVsdGlEYXlzOiB7c3RhcnQ6IERhdGUsIGVuZDogRGF0ZX18bnVsbDtcclxuICByc3ZwOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHRpdGxlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGRhdGU6IERhdGUpIHtcclxuICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcclxuICAgIHRoaXMuaWQgPSBpZDtcclxuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XHJcbiAgfVxyXG5cclxuICBhc09uZUxpbmVIVE1MKGluZGV4SW5HcmlkOiBudW1iZXJ8dW5kZWZpbmVkID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRpbWUgPSB0aGlzLnRpbWUgPyBgPHNwYW4gY2xhc3M9XCJ0aW1lXCI+JHt0aGlzLnRpbWV9PC9zcGFuPmAgOiAnJztcclxuXHJcbiAgICByZXR1cm4gYFxyXG4gICAgICA8bGkgaWQ9XCJpZC0ke3RoaXMuaWR9XCIgZGF0YS1pbmRleC1pbi1ncmlkPVwiJHtpbmRleEluR3JpZH1cIiBjbGFzcz1cImV2ZW50JHshIXRoaXMubXVsdGlEYXlzID8gXCIgbXVsdGktZGF5XCIgOiBcIlwifSR7dGhpcy5yc3ZwID8gXCJcIiA6IFwiIHVuY29uZmlybWVkXCJ9XCIgc3R5bGU9XCItLWV2ZW50LWNvbG9yOiAke3RoaXMuY29sb3J9O1wiPlxyXG4gICAgICAgIDxkaXY+JHt0aW1lfSA8c3BhbiBjbGFzcz1cInRpdGxlXCI+JHt0aGlzLnRpdGxlfTwvc3Bhbj48L2Rpdj5cclxuICAgICAgPC9saT5cclxuICAgIGA7XHJcbiAgfVxyXG5cclxuICBhc01lZGl1bUxlbmd0aEhUTUwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRpbWUgPSB0aGlzLnRpbWUgPyBgPHNwYW4gY2xhc3M9XCJ0aW1lXCI+JHt0aGlzLnRpbWV9PC9zcGFuPmAgOiAnJztcclxuXHJcbiAgICByZXR1cm4gYFxyXG4gICAgICA8bGkgaWQ9XCJpZC0ke3RoaXMuaWR9XCIgY2xhc3M9XCJldmVudCR7ISF0aGlzLm11bHRpRGF5cyA/IFwiIG11bHRpLWRheVwiIDogXCJcIn0ke3RoaXMucnN2cCA/IFwiXCIgOiBcIiB1bmNvbmZpcm1lZFwifVwiIHN0eWxlPVwiLS1ldmVudC1jb2xvcjogJHt0aGlzLmNvbG9yfTtcIj5cclxuICAgICAgICA8ZGl2PiR7dGltZX08L2Rpdj5cclxuICAgICAgICA8cCBjbGFzcz1cInRpdGxlXCI+JHt0aGlzLnRpdGxlfTwvcD5cclxuICAgICAgICA8cD4ke3RoaXMuZGVzY3JpcHRpb259PC9wPlxyXG4gICAgICA8L2xpPlxyXG4gICAgYDtcclxuICB9XHJcblxyXG4gIGFzRnVsbEhUTUwoKTogc3RyaW5nIHtcclxuICAgIGxldCB3aGVuID0gXCJcIjtcclxuICAgICAgXHJcbiAgICBpZiAoIXRoaXMubXVsdGlEYXlzKSB7XHJcbiAgICAgIHdoZW4gPSB0aGlzLmRhdGUudG9EYXRlU3RyaW5nKCk7XHJcbiAgICAgIGlmICh0aGlzLnRpbWUpIHtcclxuICAgICAgICB3aGVuICs9IGAsIGF0ICR7dGhpcy50aW1lfWA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMucmVwZWF0KSB7XHJcbiAgICAgICAgd2hlbiArPSBgLCAke3RoaXMucmVwZWF0fWA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZHVyYXRpb24pIHtcclxuICAgICAgICB3aGVuICs9IGAgKCR7dGhpcy5kdXJhdGlvbn0gbWludXRlcylgO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aGVuID0gYEZyb20gJHt0aGlzLm11bHRpRGF5cy5zdGFydC50b0RhdGVTdHJpbmcoKX0gdG8gJHt0aGlzLm11bHRpRGF5cy5lbmQudG9EYXRlU3RyaW5nKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYFxyXG4gICAgICA8bGkgY2xhc3M9XCJldmVudCR7dGhpcy5yc3ZwID8gXCJcIiA6IFwiIHVuY29uZmlybWVkXCJ9XCIgc3R5bGU9XCItLWV2ZW50LWNvbG9yOiAke3RoaXMuY29sb3J9O1wiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8aDI+JHt0aGlzLnRpdGxlfTwvaDI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIndoZW5cIj4ke3doZW59PC9wPlxyXG4gICAgICAgICAgJHt0aGlzLmxvY2F0aW9uID8gYDxwIGNsYXNzPVwid2hlcmVcIj4ke3RoaXMubG9jYXRpb259PC9wPmAgOiBcIlwifVxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJ3aGF0XCI+JHt0aGlzLmRlc2NyaXB0aW9ufTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9saT5cclxuICAgIGA7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IENhbGVuZGFyRXZlbnQgfSBmcm9tIFwiLi9DYWxlbmRhckV2ZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRXZlbnRQb3B1cCB7XHJcbiAgcHJpdmF0ZSBwb3B1cEVsOiBIVE1MRWxlbWVudHx1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXZlbnRzOiBDYWxlbmRhckV2ZW50W10pIHt9XHJcblxyXG4gIHN0YXJ0KCkge1xyXG4gICAgaWYgKCF0aGlzLnBvcHVwRWwpIHtcclxuICAgICAgdGhpcy5wb3B1cEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgdGhpcy5wb3B1cEVsLmNsYXNzTmFtZSA9IFwicG9wdXBcIjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCAoZTogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICB0aGlzLnBvcHVwRWwuY2xhc3NMaXN0LnJlbW92ZShcInZpc2libGVcIik7XHJcbiAgICAgIHRoaXMucG9wdXBFbC5yZW1vdmUoKTtcclxuXHJcbiAgICAgIGNvbnN0IGV2ZW50RWwgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIjbW9udGgtZ3JpZCAuZXZlbnQsICN3ZWVrLWdyaWQgLmV2ZW50XCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAoIWV2ZW50RWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGlkID0gZXZlbnRFbC5pZDtcclxuXHJcbiAgICAgIGlmICghaWQgfHwgIWlkLnN0YXJ0c1dpdGgoXCJpZC1cIikpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBldmVudElkID0gaWQucmVwbGFjZShcImlkLVwiLCBcIlwiKTtcclxuXHJcbiAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudHMuZmluZChldmVudCA9PiBldmVudC5pZCA9PT0gZXZlbnRJZCk7ICAgICAgXHJcbiAgICAgIGlmICghZXZlbnQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIk5vIGV2ZW50IGZvdW5kIGZvciBpZFwiLCBldmVudElkKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGV2ZW50SW5kZXhJbkdyaWQgPSBwYXJzZUludChldmVudEVsLmRhdGFzZXQuaW5kZXhJbkdyaWQhKTtcclxuXHJcbiAgICAgIHRoaXMucG9wdXBFbC5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tZXZlbnQtY29sb3JcIiwgZXZlbnQuY29sb3IpO1xyXG4gICAgICB0aGlzLnBvcHVwRWwuY2xhc3NMaXN0LnRvZ2dsZShcInZpc2libGVcIiwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMucG9wdXBFbC5jbGFzc0xpc3QudG9nZ2xlKFwidW5jb25maXJtZWRcIiwgIWV2ZW50LnJzdnApO1xyXG5cclxuICAgICAgbGV0IHdoZW4gPSBcIlwiO1xyXG4gICAgICBcclxuICAgICAgaWYgKCFldmVudC5tdWx0aURheXMpIHtcclxuICAgICAgICB3aGVuID0gZXZlbnQuZGF0ZS50b0RhdGVTdHJpbmcoKTtcclxuICAgICAgICBpZiAoZXZlbnQudGltZSkge1xyXG4gICAgICAgICAgd2hlbiArPSBgLCBhdCAke2V2ZW50LnRpbWV9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV2ZW50LnJlcGVhdCkge1xyXG4gICAgICAgICAgd2hlbiArPSBgLCAke2V2ZW50LnJlcGVhdH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZlbnQuZHVyYXRpb24pIHtcclxuICAgICAgICAgIHdoZW4gKz0gYCAoJHtldmVudC5kdXJhdGlvbn0gbWludXRlcylgO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB3aGVuID0gYEZyb20gJHtldmVudC5tdWx0aURheXMuc3RhcnQudG9EYXRlU3RyaW5nKCl9IHRvICR7ZXZlbnQubXVsdGlEYXlzLmVuZC50b0RhdGVTdHJpbmcoKX1gO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnBvcHVwRWwuaW5uZXJIVE1MID0gYFxyXG4gICAgICAgIDxoMj4ke2V2ZW50LnRpdGxlfTwvaDI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJ3aGVuXCI+JHt3aGVufTwvcD5cclxuICAgICAgICAke2V2ZW50LmxvY2F0aW9uID8gYDxwIGNsYXNzPVwid2hlcmVcIj4ke2V2ZW50LmxvY2F0aW9ufTwvcD5gIDogXCJcIn1cclxuICAgICAgICA8cCBjbGFzcz1cIndoYXRcIj4ke2V2ZW50LmRlc2NyaXB0aW9ufTwvcD5cclxuICAgICAgYDtcclxuXHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5wb3B1cEVsKTtcclxuXHJcbiAgICAgIC8vIEdldCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGV2ZW50IGVsZW1lbnQuXHJcbiAgICAgIGNvbnN0IHJlY3QgPSBldmVudEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBjb25zdCB0b3AgPSByZWN0LnRvcDtcclxuICAgICAgY29uc3QgcmlnaHQgPSByZWN0LnJpZ2h0O1xyXG4gICAgICBjb25zdCBsZWZ0ID0gcmVjdC5sZWZ0O1xyXG4gICAgICBjb25zdCB3aWR0aCA9IHJlY3Qud2lkdGg7XHJcblxyXG4gICAgICBpZiAoZXZlbnRJbmRleEluR3JpZCA+PSAyOCkge1xyXG4gICAgICAgIC8vIFRoZSBldmVudCBpcyBpbiB0aGUgbGFzdCAyIHJvd3MuIFNob3cgdGhlIHBvcHVwIGFib3ZlIGl0LlxyXG4gICAgICAgIHRoaXMucG9wdXBFbC5zdHlsZS50b3AgPSBgJHt0b3AgLSB0aGlzLnBvcHVwRWwuY2xpZW50SGVpZ2h0fXB4YDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBvcHVwRWwuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50SW5kZXhJbkdyaWQgPT09IDYgfHwgZXZlbnRJbmRleEluR3JpZCA9PT0gMTMgfHwgZXZlbnRJbmRleEluR3JpZCA9PT0gMjAgfHwgZXZlbnRJbmRleEluR3JpZCA9PT0gMjcgfHwgZXZlbnRJbmRleEluR3JpZCA9PT0gMzQpIHtcclxuICAgICAgICAvLyBUaGUgZXZlbnQgaXMgbGFzdCBpbiBhIHJvdywgc28gd2Ugd2FudCB0byBzaG93IHRoZSBwb3B1cCB0byB0aGUgbGVmdCBvZiBpdC5cclxuICAgICAgICB0aGlzLnBvcHVwRWwuc3R5bGUubGVmdCA9IGAke2xlZnQgLSB3aWR0aH1weGA7XHJcbiAgICAgICAgdGhpcy5wb3B1cEVsLmNsYXNzTGlzdC50b2dnbGUoXCJsZWZ0XCIsIHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucG9wdXBFbC5zdHlsZS5sZWZ0ID0gYCR7cmlnaHR9cHhgO1xyXG4gICAgICAgIHRoaXMucG9wdXBFbC5jbGFzc0xpc3QudG9nZ2xlKFwibGVmdFwiLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgU3RvcmUge1xyXG4gIGFzeW5jIGdldFN0b3JlZFByZWZzKCk6IFByb21pc2U8e21vZGU6IHN0cmluZywgaW5pdERhdGU6IERhdGV8dW5kZWZpbmVkfT4ge1xyXG4gICAgLy8gRmFrZSBzb21lIHJhbmRvbSB0aW1lICh1cCB0byAyNTBtcykgdG8gc2ltdWxhdGUgYW4gQVBJIGNhbGwuXHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgTWF0aC5yYW5kb20oKSAqIDI1MCkpO1xyXG5cclxuICAgIGNvbnN0IG1vZGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2xvdy1jYWwtbW9kZScpO1xyXG4gICAgY29uc3QgaW5pdERhdGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2xvdy1jYWwtaW5pdERhdGUnKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtb2RlLFxyXG4gICAgICBpbml0RGF0ZTogaW5pdERhdGUgPyBuZXcgRGF0ZShpbml0RGF0ZSkgOiB1bmRlZmluZWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBzZXQgbW9kZShtb2RlOiBzdHJpbmcpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiU3RvcmluZyBtb2RlIHByZWZzXCIpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Nsb3ctY2FsLW1vZGUnLCBtb2RlKTtcclxuICB9XHJcblxyXG4gIHNldCBpbml0RGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIlN0b3JpbmcgZGF0ZSBwcmVmc1wiKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzbG93LWNhbC1pbml0RGF0ZScsIGRhdGUudG9JU09TdHJpbmcoKSk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEFwcFVJIH0gZnJvbSBcIi4vQXBwVUlcIjtcclxuaW1wb3J0IHsgZ2V0QWxsRXZlbnRzIH0gZnJvbSBcIi4vZXZlbnRzLWZhY3RvcnlcIjtcclxuaW1wb3J0IHsgRXZlbnRQb3B1cCB9IGZyb20gXCIuL0V2ZW50UG9wdXBcIjtcclxuaW1wb3J0IHsgU3RvcmUgfSBmcm9tIFwiLi9TdG9yZVwiO1xyXG5cclxuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgYXN5bmMgKCkgPT4ge1xyXG4gIGNvbnN0IHN0b3JlID0gbmV3IFN0b3JlKCk7XHJcbiAgY29uc3QgcHJlZnMgPSBhd2FpdCBzdG9yZS5nZXRTdG9yZWRQcmVmcygpO1xyXG5cclxuICAvLyBUaGlzIGlzIHdoYXQgdGhlIGNhbGVuZGFyIHdpbGwgYmUgY2VudGVyZWQgYXJvdW5kIG9uIGxvYWQuXHJcbiAgY29uc3QgaW5pdERhdGUgPSBwcmVmcy5pbml0RGF0ZSB8fCBuZXcgRGF0ZSgpO1xyXG4gIGNvbnN0IGluaXRNb2RlID0gcHJlZnMubW9kZSB8fCBcIm1vbnRoXCI7XHJcblxyXG4gIGNvbnN0IGFwcEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcCcpO1xyXG4gIGNvbnN0IGFwcFVJID0gbmV3IEFwcFVJKGFwcEVsISwgaW5pdERhdGUsIGluaXRNb2RlLCBbXSk7XHJcblxyXG4gIGNvbnN0IGV2ZW50cyA9IGF3YWl0IGdldEFsbEV2ZW50cygpXHJcblxyXG4gIGNvbnNvbGUubG9nKFwiUmVmcmVzaGluZyBjYWxlbmRhciB3aXRoIGV2ZW50c1wiKTtcclxuICBhcHBVSS5ldmVudHMgPSBldmVudHM7XHJcblxyXG4gIGNvbnNvbGUubG9nKFwiSW5pdGlhbGl6aW5nIHRoZSBwb3B1cCB1dGlsXCIpO1xyXG4gIGNvbnN0IHBvcHVwID0gbmV3IEV2ZW50UG9wdXAoZXZlbnRzKTtcclxuICBwb3B1cC5zdGFydCgpO1xyXG5cclxuICAvLyBAdHMtaWdub3JlXHJcbiAgYXBwVUkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vZGUtY2hhbmdlZFwiLCAoZTogQ3VzdG9tRXZlbnQpID0+IHtcclxuICAgIHN0b3JlLm1vZGUgPSBlLmRldGFpbDtcclxuICB9KTtcclxuXHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIGFwcFVJLmFkZEV2ZW50TGlzdGVuZXIoXCJkYXRlLWNoYW5nZWRcIiwgKGU6IEN1c3RvbUV2ZW50KSA9PiB7XHJcbiAgICBzdG9yZS5pbml0RGF0ZSA9IGUuZGV0YWlsO1xyXG4gIH0pO1xyXG59KTtcclxuIiwiaW1wb3J0IHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gXCIuL0NhbGVuZGFyRXZlbnRcIjtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSgpIHtcclxuICAvLyBTaW11bGF0ZSBhIHNsb3dlciBBUEkgZW5kcG9pbnQgY2FsbC5cclxuICBjb25zb2xlLmxvZyhcIkZldGNoaW5nIGNhbGVuZGFyIGRhdGEgLi4uXCIpO1xyXG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBNYXRoLnJhbmRvbSgpICogNTAwKSk7XHJcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnLi9kYXRhLmpzb24nKTtcclxuICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVPbmVPck11bHRpcGxlRXZlbnRzRnJvbURhdGEoZXZlbnREYXRhOiBhbnkpOiBDYWxlbmRhckV2ZW50W10geyAgXHJcbiAgY29uc3QgZGF0ZXM6IERhdGVbXSA9IFtuZXcgRGF0ZShldmVudERhdGEuc3RhcnREYXRlKV07XHJcbiAgbGV0IG11bHRpRGF5czoge3N0YXJ0OiBEYXRlLCBlbmQ6IERhdGV9fG51bGwgPSBudWxsO1xyXG5cclxuICBpZiAoZXZlbnREYXRhLnJlcGVhdCkge1xyXG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZXZlbnREYXRhLnN0YXJ0RGF0ZSk7XHJcblxyXG4gICAgLy8gSWYgdGhpcyBldmVudCBpcyByZXBlYXRlZCwgaXQgbXVzdCBoYXZlIGFuIGVuZCBkYXRlLlxyXG4gICAgY29uc3QgZW5kRGF0ZSA9IGV2ZW50RGF0YS5lbmREYXRlXHJcbiAgICAgIC8vIEVpdGhlciB0aGUgZW5kIGRhdGUgaXMgc3BlY2lmaWVkLlxyXG4gICAgICA/IG5ldyBEYXRlKGV2ZW50RGF0YS5lbmREYXRlKVxyXG4gICAgICAvLyBPciBpdCdzIDUgeWVhciBhZnRlciB0aGUgc3RhcnQgZGF0ZS5cclxuICAgICAgOiBuZXcgRGF0ZShzdGFydERhdGUuZ2V0VGltZSgpICsgNSAqIDM2NSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xyXG5cclxuICAgIGlmIChldmVudERhdGEucmVwZWF0ID09PSBcImRhaWx5XCIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFeHBhbmRpbmcgZGFpbHkgZXZlbnQgLi4uXCIpO1xyXG4gICAgICBjb25zdCBkYXlzID0gKGVuZERhdGUuZ2V0VGltZSgpIC0gc3RhcnREYXRlLmdldFRpbWUoKSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRheXM7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUuZ2V0VGltZSgpICsgaSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xyXG4gICAgICAgIC8vIElmIGRhdGUgaXMgb24gYSB3ZWVrIGVuZCwgc2tpcCBpdC5cclxuICAgICAgICBpZiAoZGF0ZS5nZXREYXkoKSA9PT0gMCB8fCBkYXRlLmdldERheSgpID09PSA2KSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGVzLnB1c2goZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoZXZlbnREYXRhLnJlcGVhdCA9PT0gXCJ3ZWVrbHlcIikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkV4cGFuZGluZyB3ZWVrbHkgZXZlbnQgLi4uXCIpO1xyXG4gICAgICBjb25zdCB3ZWVrcyA9IChlbmREYXRlLmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIC8gKDEwMDAgKiA2MCAqIDYwICogMjQgKiA3KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gd2Vla3M7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUuZ2V0VGltZSgpICsgaSAqIDcgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcclxuICAgICAgICBkYXRlcy5wdXNoKGRhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50RGF0YS5yZXBlYXQgPT09IFwibW9udGhseVwiKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRXhwYW5kaW5nIG1vbnRobHkgZXZlbnQgLi4uXCIpO1xyXG4gICAgICBjb25zdCBtb250aHMgPSAoZW5kRGF0ZS5nZXRGdWxsWWVhcigpIC0gc3RhcnREYXRlLmdldEZ1bGxZZWFyKCkpICogMTIgKyAoZW5kRGF0ZS5nZXRNb250aCgpIC0gc3RhcnREYXRlLmdldE1vbnRoKCkpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBtb250aHM7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUuZ2V0VGltZSgpKTtcclxuICAgICAgICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSArIGkpO1xyXG4gICAgICAgIGRhdGVzLnB1c2goZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoZXZlbnREYXRhLnJlcGVhdCA9PT0gXCJ5ZWFybHlcIikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkV4cGFuZGluZyB5ZWFybHkgZXZlbnQgLi4uXCIpO1xyXG4gICAgICBjb25zdCB5ZWFycyA9IGVuZERhdGUuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB5ZWFyczsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZS5nZXRUaW1lKCkpO1xyXG4gICAgICAgIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgaSk7XHJcbiAgICAgICAgZGF0ZXMucHVzaChkYXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoZXZlbnREYXRhLmVuZERhdGUpIHtcclxuICAgIC8vIElmIHRoaXMgZXZlbnQgaGFzIGEgc3RhcnQgYW5kIGVuZCBkYXRlLCBidXQgaXNuJ3QgcmVwZWF0ZWQuXHJcbiAgICBjb25zdCBzdGFydERhdGUgPSBuZXcgRGF0ZShldmVudERhdGEuc3RhcnREYXRlKTtcclxuICAgIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShldmVudERhdGEuZW5kRGF0ZSk7XHJcbiAgICBjb25zdCBkYXlzID0gKGVuZERhdGUuZ2V0VGltZSgpIC0gc3RhcnREYXRlLmdldFRpbWUoKSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCk7XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkYXlzOyBpKyspIHtcclxuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZS5nZXRUaW1lKCkgKyBpICogMjQgKiA2MCAqIDYwICogMTAwMCk7XHJcbiAgICAgIGRhdGVzLnB1c2goZGF0ZSk7XHJcbiAgICB9XHJcbiAgICBtdWx0aURheXMgPSB7c3RhcnQ6IHN0YXJ0RGF0ZSwgZW5kOiBlbmREYXRlfTtcclxuICB9XHJcblxyXG5cclxuICByZXR1cm4gZGF0ZXMubWFwKChkYXRlLCBpbmRleCkgPT4ge1xyXG4gICAgY29uc3QgaWQgPSBldmVudERhdGEuaWQgKyAoaW5kZXggPiAwID8gYC0ke2luZGV4fWAgOiBcIlwiKTtcclxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IENhbGVuZGFyRXZlbnQoZXZlbnREYXRhLnRpdGxlLCBpZCwgZGF0ZSk7XHJcblxyXG4gICAgZXZlbnQubXVsdGlEYXlzID0gbXVsdGlEYXlzO1xyXG5cclxuICAgIGV2ZW50LmNvbG9yID0gZXZlbnREYXRhLmNvbG9yO1xyXG4gICAgZXZlbnQudGltZSA9IGV2ZW50RGF0YS5zdGFydFRpbWU7XHJcbiAgICBldmVudC5kdXJhdGlvbiA9IGV2ZW50RGF0YS5kdXJhdGlvbjtcclxuICAgIGV2ZW50LnJlcGVhdCA9IGV2ZW50RGF0YS5yZXBlYXQ7XHJcbiAgICBldmVudC5sb2NhdGlvbiA9IGV2ZW50RGF0YS5sb2NhdGlvbjtcclxuICAgIGV2ZW50LmRlc2NyaXB0aW9uID0gZXZlbnREYXRhLmRlc2NyaXB0aW9uO1xyXG4gICAgZXZlbnQucnN2cCA9IGV2ZW50RGF0YS5yc3ZwO1xyXG5cclxuICAgIHJldHVybiBldmVudDtcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFsbEV2ZW50cygpOiBQcm9taXNlPENhbGVuZGFyRXZlbnRbXT4ge1xyXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaERhdGEoKTtcclxuXHJcbiAgY29uc29sZS5sb2coXCJQcm9jZXNzaW5nIGV2ZW50cyAuLi5cIik7XHJcbiAgcmV0dXJuIGRhdGEuZXZlbnRzLm1hcCgoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgcmV0dXJuIGNyZWF0ZU9uZU9yTXVsdGlwbGVFdmVudHNGcm9tRGF0YShldmVudCk7XHJcbiAgfSkuZmxhdCgpO1xyXG59XHJcbiJdLCJuYW1lcyI6WyJhc3NlcnRUeXBlIiwiY29uZGl0aW9uIiwibWVzc2FnZSIsImFyZ3MiLCJUeXBlRXJyb3IiLCJmb3JtYXQiLCJpIiwicmVwbGFjZSIsImFueVRvU3RyaW5nIiwieCIsIlN0cmluZyIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsIkdsb2JhbCIsIndpbmRvdyIsInNlbGYiLCJnbG9iYWwiLCJnbG9iYWxUaGlzIiwidW5kZWZpbmVkIiwiY3VycmVudFdhcm5IYW5kbGVyIiwiV2FybmluZyIsImNvbnN0cnVjdG9yIiwiY29kZSIsInRoaXMiLCJ3YXJuIiwiX2EiLCJzdGFjayIsIkVycm9yIiwiY29uc29sZSIsIl9iIiwiSW5pdEV2ZW50V2FzQ2FsbGVkV2hpbGVEaXNwYXRjaGluZyIsIkZhbHN5V2FzQXNzaWduZWRUb0NhbmNlbEJ1YmJsZSIsIlRydXRoeVdhc0Fzc2lnbmVkVG9SZXR1cm5WYWx1ZSIsIk5vbkNhbmNlbGFibGVFdmVudFdhc0NhbmNlbGVkIiwiQ2FuY2VsZWRJblBhc3NpdmVMaXN0ZW5lciIsIkV2ZW50TGlzdGVuZXJXYXNEdXBsaWNhdGVkIiwiT3B0aW9uV2FzSWdub3JlZCIsIkludmFsaWRFdmVudExpc3RlbmVyIiwiRXZlbnQiLCJOT05FIiwiQ0FQVFVSSU5HX1BIQVNFIiwiQVRfVEFSR0VUIiwiQlVCQkxJTkdfUEhBU0UiLCJ0eXBlIiwiZXZlbnRJbml0RGljdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJlbnVtZXJhYmxlIiwib3B0cyIsImludGVybmFsRGF0YU1hcCIsInNldCIsImJ1YmJsZXMiLCJCb29sZWFuIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsInN0b3BQcm9wYWdhdGlvbkZsYWciLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25GbGFnIiwiY2FuY2VsZWRGbGFnIiwiaW5QYXNzaXZlTGlzdGVuZXJGbGFnIiwiZGlzcGF0Y2hGbGFnIiwidGltZVN0YW1wIiwiRGF0ZSIsIm5vdyIsIiQiLCJzcmNFbGVtZW50IiwiY29tcG9zZWRQYXRoIiwiZXZlbnRQaGFzZSIsInN0b3BQcm9wYWdhdGlvbiIsImNhbmNlbEJ1YmJsZSIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsImRhdGEiLCJyZXR1cm5WYWx1ZSIsInNldENhbmNlbEZsYWciLCJwcmV2ZW50RGVmYXVsdCIsImRlZmF1bHRQcmV2ZW50ZWQiLCJpc1RydXN0ZWQiLCJpbml0RXZlbnQiLCJXZWFrTWFwIiwiZXZlbnQiLCJuYW1lIiwicmV0diIsImdldCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwibGVuZ3RoIiwiRE9NRXhjZXB0aW9uIiwic2V0UHJvdG90eXBlT2YiLCJFcnJvckNvZGVNYXAiLCJJTkRFWF9TSVpFX0VSUiIsIkRPTVNUUklOR19TSVpFX0VSUiIsIkhJRVJBUkNIWV9SRVFVRVNUX0VSUiIsIldST05HX0RPQ1VNRU5UX0VSUiIsIklOVkFMSURfQ0hBUkFDVEVSX0VSUiIsIk5PX0RBVEFfQUxMT1dFRF9FUlIiLCJOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIiLCJOT1RfRk9VTkRfRVJSIiwiTk9UX1NVUFBPUlRFRF9FUlIiLCJJTlVTRV9BVFRSSUJVVEVfRVJSIiwiSU5WQUxJRF9TVEFURV9FUlIiLCJTWU5UQVhfRVJSIiwiSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSIiwiTkFNRVNQQUNFX0VSUiIsIklOVkFMSURfQUNDRVNTX0VSUiIsIlZBTElEQVRJT05fRVJSIiwiVFlQRV9NSVNNQVRDSF9FUlIiLCJTRUNVUklUWV9FUlIiLCJORVRXT1JLX0VSUiIsIkFCT1JUX0VSUiIsIlVSTF9NSVNNQVRDSF9FUlIiLCJRVU9UQV9FWENFRURFRF9FUlIiLCJUSU1FT1VUX0VSUiIsIklOVkFMSURfTk9ERV9UWVBFX0VSUiIsIkRBVEFfQ0xPTkVfRVJSIiwiZGVmaW5lRXJyb3JDb2RlUHJvcGVydGllcyIsIm9iaiIsImtleSIsImNvbmZpZ3VyYWJsZSIsIkV2ZW50V3JhcHBlciIsIndyYXAiLCJnZXRXcmFwcGVyQ2xhc3NPZiIsInN1cGVyIiwiaW50ZXJuYWxEYXRhTWFwJDEiLCJvcmlnaW5hbCIsImRlZmluZVJlZGlyZWN0RGVzY3JpcHRvciIsIiQkMSIsIndyYXBwZXJDbGFzc0NhY2hlIiwib3JpZ2luYWxFdmVudCIsImdldFByb3RvdHlwZU9mIiwid3JhcHBlciIsIkJhc2VFdmVudFdyYXBwZXIiLCJvcmlnaW5hbFByb3RvdHlwZSIsIkN1c3RvbUV2ZW50V3JhcHBlciIsImRlZmluZVdyYXBwZXIiLCJkIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiYmluZCIsImlzQ2FwdHVyZSIsImxpc3RlbmVyIiwiZmxhZ3MiLCJpc1Bhc3NpdmUiLCJpc09uY2UiLCJpc1JlbW92ZWQiLCJpbnZva2VDYWxsYmFjayIsImNhbGxiYWNrIiwiaGFuZGxlRXZlbnQiLCJ0aHJvd25FcnJvciIsIm1heWJlRXJyb3IiLCJlcnJvciIsImRpc3BhdGNoRXZlbnQiLCJFcnJvckV2ZW50IiwicHJvY2VzcyIsImVtaXQiLCJyZXBvcnRFcnJvciIsImZpbmRJbmRleE9mTGlzdGVuZXIiLCJsaXN0ZW5lcnMiLCJjYXB0dXJlIiwicmVtb3ZlTGlzdGVuZXIiLCJsaXN0IiwiaW5kZXgiLCJyZW1vdmVMaXN0ZW5lckF0IiwiZGlzYWJsZUNvdyIsInNldFJlbW92ZWQiLCJzaWduYWwiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2lnbmFsTGlzdGVuZXIiLCJjb3ciLCJmaWx0ZXIiLCJfIiwic3BsaWNlIiwiRXZlbnRUYXJnZXQiLCJpbnRlcm5hbERhdGFNYXAkMiIsImNyZWF0ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0eXBlMCIsImNhbGxiYWNrMCIsIm9wdGlvbnMwIiwibGlzdGVuZXJNYXAiLCIkJDIiLCJvbmNlIiwicGFzc2l2ZSIsIm9wdGlvbnMiLCJhc3NlcnRDYWxsYmFjayIsIm5vcm1hbGl6ZUFkZE9wdGlvbnMiLCJhYm9ydGVkIiwiYXR0ckNhbGxiYWNrIiwiYXR0ckxpc3RlbmVyIiwiZW5zdXJlTGlzdGVuZXJMaXN0IiwiY3JlYXRlTGlzdGVuZXIiLCJwdXNoIiwiYWRkTGlzdGVuZXIiLCJ3YXJuRHVwbGljYXRlIiwibm9ybWFsaXplT3B0aW9ucyIsImUiLCJldmVudERhdGEiLCJtc2ciLCJjYXB0dXJlU3RhY2tUcmFjZSIsImRlZmluZVByb3BlcnRpZXMiLCJrZXlzJDEiLCJnZXRFdmVudHNGb3JEYXkiLCJldmVudHMiLCJkYXRlIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJzb3J0IiwiYSIsImIiLCJ0aW1lIiwicGFyc2VJbnQiLCJtdWx0aURheXMiLCJEQVlTIiwiTW9udGhHcmlkIiwiZWwiLCJfZGF0ZSIsInJvb3RFbCIsIl9ldmVudHMiLCJyZW5kZXIiLCJpbm5lckhUTUwiLCJtb250aCIsInllYXIiLCJmaXJzdERheSIsImxhc3REYXkiLCJmaXJzdFdlZWtkYXkiLCJnZXREYXkiLCJsYXN0V2Vla2RheSIsImRheXNJbk1vbnRoIiwiZGF5c0luTGFzdE1vbnRoIiwiZGF5cyIsImluZGV4SW5HcmlkIiwiaHRtbCIsInJlbmRlckRheSIsImluc2VydEFkamFjZW50SFRNTCIsImxhc3RFbGVtZW50Q2hpbGQiLCJDdXN0b21FdmVudCIsImRldGFpbCIsInVwZGF0ZU5vd01hcmtlciIsImRheU51bWJlciIsImNsYXNzTmFtZSIsInRvRGF0ZVN0cmluZyIsIm1hcCIsImFzT25lTGluZUhUTUwiLCJqb2luIiwicmF0aW8iLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJkYXlFbCIsInF1ZXJ5U2VsZWN0b3IiLCJtYXJrZXJIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJzdHlsZSIsInNldFByb3BlcnR5Iiwic2V0VGltZW91dCIsIk1PTlRIUyIsIlRvb2xiYXIiLCJtb2RlIiwic2VsZWN0ZWRNb2RlIiwiZm9ybWF0TW9udGhZZWFyIiwibG9nIiwiU2lkZWJhciIsInVsIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJhc0Z1bGxIVE1MIiwiV2Vla0dyaWQiLCJkYXkiLCJhc01lZGl1bUxlbmd0aEhUTUwiLCJBcHBVSSIsInRvb2xiYXJFbCIsImlkIiwidG9vbGJhciIsIm5ld0RhdGUiLCJtb250aEdyaWRFbCIsImRpc3BsYXkiLCJ3ZWVrR3JpZEVsIiwibW9udGhHcmlkIiwid2Vla0dyaWQiLCJzaWRlYmFyRWwiLCJzaWRlYmFyIiwiQ2FsZW5kYXJFdmVudCIsInRpdGxlIiwicnN2cCIsImNvbG9yIiwiZGVzY3JpcHRpb24iLCJ3aGVuIiwic3RhcnQiLCJlbmQiLCJyZXBlYXQiLCJkdXJhdGlvbiIsImxvY2F0aW9uIiwiRXZlbnRQb3B1cCIsInBvcHVwRWwiLCJjbGFzc0xpc3QiLCJyZW1vdmUiLCJldmVudEVsIiwiY2xvc2VzdCIsInN0YXJ0c1dpdGgiLCJldmVudElkIiwiZmluZCIsImV2ZW50SW5kZXhJbkdyaWQiLCJkYXRhc2V0IiwidG9nZ2xlIiwiYm9keSIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b3AiLCJyaWdodCIsImxlZnQiLCJ3aWR0aCIsImNsaWVudEhlaWdodCIsIlN0b3JlIiwiZ2V0U3RvcmVkUHJlZnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsIk1hdGgiLCJyYW5kb20iLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiaW5pdERhdGUiLCJzZXRJdGVtIiwidG9JU09TdHJpbmciLCJzdG9yZSIsInByZWZzIiwiaW5pdE1vZGUiLCJhcHBFbCIsImdldEVsZW1lbnRCeUlkIiwiYXBwVUkiLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsImZldGNoRGF0YSIsImRhdGVzIiwic3RhcnREYXRlIiwiZW5kRGF0ZSIsImdldFRpbWUiLCJ3ZWVrcyIsIm1vbnRocyIsInNldE1vbnRoIiwieWVhcnMiLCJzZXRGdWxsWWVhciIsInN0YXJ0VGltZSIsImNyZWF0ZU9uZU9yTXVsdGlwbGVFdmVudHNGcm9tRGF0YSIsImZsYXQiLCJnZXRBbGxFdmVudHMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +(()=>{"use strict";function e(e,n,...s){if(!e)throw new TypeError(t(n,s))}function t(e,t){let s=0;return e.replace(/%[os]/gu,(()=>n(t[s++])))}function n(e){return"object"!=typeof e||null===e?String(e):Object.prototype.toString.call(e)}const s="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:void 0;let i;class o{constructor(e,t){this.code=e,this.message=t}warn(...e){var t;try{i;const n=(null!==(t=(new Error).stack)&&void 0!==t?t:"").replace(/^(?:.+?\n){2}/gu,"\n");console.warn(this.message,...e,n)}catch(e){}}}const a=new o("W01","Unable to initialize event under dispatching."),r=new o("W02","Assigning any falsy value to 'cancelBubble' property has no effect."),l=new o("W03","Assigning any truthy value to 'returnValue' property has no effect."),c=new o("W04","Unable to preventDefault on non-cancelable events."),d=new o("W05","Unable to preventDefault inside passive event listener invocation."),h=new o("W06","An event listener wasn't added because it has been added already: %o, %o"),u=new o("W07","The %o option value was abandoned because the event listener wasn't added as duplicated."),p=new o("W08","The 'callback' argument must be a function or an object that has 'handleEvent' method: %o");new o("W09","Event attribute handler must be a function: %o");class g{static get NONE(){return v}static get CAPTURING_PHASE(){return m}static get AT_TARGET(){return E}static get BUBBLING_PHASE(){return y}constructor(e,t){Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0});const n=null!=t?t:{};f.set(this,{type:String(e),bubbles:Boolean(n.bubbles),cancelable:Boolean(n.cancelable),composed:Boolean(n.composed),target:null,currentTarget:null,stopPropagationFlag:!1,stopImmediatePropagationFlag:!1,canceledFlag:!1,inPassiveListenerFlag:!1,dispatchFlag:!1,timeStamp:Date.now()})}get type(){return b(this).type}get target(){return b(this).target}get srcElement(){return b(this).target}get currentTarget(){return b(this).currentTarget}composedPath(){const e=b(this).currentTarget;return e?[e]:[]}get NONE(){return v}get CAPTURING_PHASE(){return m}get AT_TARGET(){return E}get BUBBLING_PHASE(){return y}get eventPhase(){return b(this).dispatchFlag?2:0}stopPropagation(){b(this).stopPropagationFlag=!0}get cancelBubble(){return b(this).stopPropagationFlag}set cancelBubble(e){e?b(this).stopPropagationFlag=!0:r.warn()}stopImmediatePropagation(){const e=b(this);e.stopPropagationFlag=e.stopImmediatePropagationFlag=!0}get bubbles(){return b(this).bubbles}get cancelable(){return b(this).cancelable}get returnValue(){return!b(this).canceledFlag}set returnValue(e){e?l.warn():w(b(this))}preventDefault(){w(b(this))}get defaultPrevented(){return b(this).canceledFlag}get composed(){return b(this).composed}get isTrusted(){return!1}get timeStamp(){return b(this).timeStamp}initEvent(e,t=!1,n=!1){const s=b(this);s.dispatchFlag?a.warn():f.set(this,{...s,type:String(e),bubbles:Boolean(t),cancelable:Boolean(n),target:null,currentTarget:null,stopPropagationFlag:!1,stopImmediatePropagationFlag:!1,canceledFlag:!1})}}const v=0,m=1,E=2,y=3,f=new WeakMap;function b(t,n="this"){const s=f.get(t);return e(null!=s,"'%s' must be an object that Event constructor created, but got another one: %o",n,t),s}function w(e){e.inPassiveListenerFlag?d.warn():e.cancelable?e.canceledFlag=!0:c.warn()}Object.defineProperty(g,"NONE",{enumerable:!0}),Object.defineProperty(g,"CAPTURING_PHASE",{enumerable:!0}),Object.defineProperty(g,"AT_TARGET",{enumerable:!0}),Object.defineProperty(g,"BUBBLING_PHASE",{enumerable:!0});const D=Object.getOwnPropertyNames(g.prototype);for(let e=0;ei,configurable:!0,enumerable:!0})}}class P extends g{static wrap(e){return new(L(e))(e)}constructor(e){super(e.type,{bubbles:e.bubbles,cancelable:e.cancelable,composed:e.composed}),e.cancelBubble&&super.stopPropagation(),e.defaultPrevented&&super.preventDefault(),M.set(this,{original:e});const t=Object.keys(e);for(let n=0;nn!==t)),!1):(e.listeners.splice(t,1),!0)}R.set(Object.prototype,P),void 0!==s&&void 0!==s.Event&&R.set(s.Event.prototype,P);class G{constructor(){B.set(this,Object.create(null))}addEventListener(e,t,n){const s=H(this),{callback:i,capture:o,once:a,passive:r,signal:l,type:c}=function(e,t,n){var s;return W(t),"object"==typeof n&&null!==n?{type:String(e),callback:null!=t?t:void 0,capture:Boolean(n.capture),passive:Boolean(n.passive),once:Boolean(n.once),signal:null!==(s=n.signal)&&void 0!==s?s:void 0}:{type:String(e),callback:null!=t?t:void 0,capture:Boolean(n),passive:!1,once:!1,signal:void 0}}(e,t,n);if(null==i||(null==l?void 0:l.aborted))return;const d=function(e,t){var n;return null!==(n=e[t])&&void 0!==n?n:e[t]={attrCallback:void 0,attrListener:void 0,cow:!1,listeners:[]}}(s,c),p=j(d,i,o);-1===p?function(e,t,n,s,i,o){let a;o&&(a=x.bind(null,e,t,n),o.addEventListener("abort",a));const r=function(e,t,n,s,i,o){return{callback:e,flags:(t?1:0)|(n?2:0)|(s?4:0),signal:i,signalListener:o}}(t,n,s,i,o,a);e.cow?(e.cow=!1,e.listeners=[...e.listeners,r]):e.listeners.push(r)}(d,i,o,r,a,l):function(e,t,n,s){h.warn($(e)?"capture":"bubble",e.callback),I(e)!==t&&u.warn("passive"),F(e)!==n&&u.warn("once"),e.signal!==s&&u.warn("signal")}(d.listeners[p],r,a,l)}removeEventListener(e,t,n){const s=H(this),{callback:i,capture:o,type:a}=function(e,t,n){return W(t),"object"==typeof n&&null!==n?{type:String(e),callback:null!=t?t:void 0,capture:Boolean(n.capture)}:{type:String(e),callback:null!=t?t:void 0,capture:Boolean(n)}}(e,t,n),r=s[a];null!=i&&r&&x(r,i,o)}dispatchEvent(e){const t=H(this)[String(e.type)];if(null==t)return!0;const n=e instanceof g?e:P.wrap(e),i=b(n,"event");if(i.dispatchFlag)throw o="This event has been in dispatching.",s.DOMException?new s.DOMException(o,"InvalidStateError"):(null==_&&(_=class e extends Error{constructor(t){super(t),Error.captureStackTrace&&Error.captureStackTrace(this,e)}get code(){return 11}get name(){return"InvalidStateError"}},Object.defineProperties(_.prototype,{code:{enumerable:!0},name:{enumerable:!0}}),k(_),k(_.prototype)),new _(o));var o;if(i.dispatchFlag=!0,i.target=i.currentTarget=this,!i.stopPropagationFlag){const{cow:e,listeners:s}=t;t.cow=!0;for(let o=0;oe.date.getFullYear()===t.getFullYear()&&e.date.getMonth()===t.getMonth()&&e.date.getDate()===t.getDate())).sort(((e,t)=>!e.time&&t.time?-1:e.time&&!t.time?1:e.time||t.time?parseInt(e.time.replace(/^0/,"").replace(":",""))-parseInt(t.time.replace(/^0/,"").replace(":","")):0)).sort(((e,t)=>e.multiDays&&!t.multiDays?-1:!e.multiDays&&t.multiDays?1:void 0))}void 0!==s&&void 0!==s.EventTarget&&Object.setPrototypeOf(G.prototype,s.EventTarget.prototype);const V=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];class q extends G{constructor(e,t,n){super(),this.el=e,this._date=new Date,this.rootEl=e,this._date=t,this._events=n,this.render()}render(){this.rootEl.innerHTML="";const e=this._date.getMonth(),t=this._date.getFullYear(),n=new Date(t,e,1),s=new Date(t,e+1,0),i=n.getDay(),o=s.getDay(),a=s.getDate(),r=new Date(t,e,0).getDate(),l=[];let c=0;for(let n=r-i+1;n<=r;n++){const s=new Date(t,e-1,n);l.push({date:s,html:this.renderDay(s,n,c,"prev-month")}),c++}for(let n=1;n<=a;n++){const s=new Date(t,e,n);l.push({date:s,html:this.renderDay(s,n,c)}),c++}for(let n=1;n<=7-o-1;n++){const s=new Date(t,e+1,n);l.push({date:s,html:this.renderDay(s,n,c,"next-month")}),c++}for(const{date:e,html:t}of l)this.rootEl.insertAdjacentHTML("beforeend",t),this.rootEl.lastElementChild.addEventListener("click",(t=>{this.dispatchEvent(new CustomEvent("day-clicked",{detail:e}))}));this.updateNowMarker()}renderDay(e,t,n,s=""){const i=U(this._events,e);return`\n
    \n
    \n ${V[e.getDay()]}\n ${t}\n
    \n
      \n ${i.map((e=>e.asOneLineHTML(n))).join("")}\n
    \n
    \n `}updateNowMarker(){const e=new Date,t=100*(100*e.getHours()+e.getMinutes())/2400,n=this.rootEl.querySelector(".day.today");if(n){const e=n.offsetHeight*t/100;this.rootEl.style.setProperty("--now-marker",`${e}px`)}setTimeout((()=>this.updateNowMarker()),1e3)}set date(e){this._date=e,this.render()}set events(e){this._events=e,this.render()}}const J=["January","February","March","April","May","June","July","August","September","October","November","December"];class X extends G{constructor(e,t,n){super(),this.el=e,this.selectedMode="month",this.rootEl=e,this._date=t,this.selectedMode=n,this.render()}formatMonthYear(){const e=this._date.getMonth(),t=this._date.getFullYear();return`${J[e]} ${t}`}render(){this.rootEl.innerHTML=`\n \n \n \n ${this.formatMonthYear()}\n \n \n \n \n `,this.rootEl.querySelector("#prev-month").addEventListener("click",(()=>{console.log(`Prev ${this.selectedMode} clicked`),this.dispatchEvent(new g("prev"))})),this.rootEl.querySelector("#next-month").addEventListener("click",(()=>{console.log(`Next ${this.selectedMode} clicked`),this.dispatchEvent(new g("next"))})),this.rootEl.querySelector("#today").addEventListener("click",(()=>{console.log("Today clicked"),this.dispatchEvent(new g("today"))})),this.rootEl.querySelector("#month-view").addEventListener("click",(()=>{console.log("Month view clicked"),this.dispatchEvent(new g("month-view")),this.selectedMode="month"})),this.rootEl.querySelector("#week-view").addEventListener("click",(()=>{console.log("Week view clicked"),this.dispatchEvent(new g("week-view")),this.selectedMode="week"}))}set date(e){this._date=e,this.render()}}class z{constructor(e,t,n){this.el=e,this._events=[],this._date=new Date,this.rootEl=e,this._date=t,this._events=n,this.render()}render(){if(this.rootEl.innerHTML="\n

    Click a day to view events

    \n ",!this._events.length)return;this.rootEl.innerHTML="";const e=document.createElement("ul");e.className="events",this.rootEl.appendChild(e);for(const t of this._events)e.innerHTML+=t.asFullHTML()}set events(e){this._events=e,this.render()}}const Q=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];class Z extends G{constructor(e,t,n){super(),this.el=e,this._date=new Date,this.rootEl=e,this._date=t,this._events=n,this.render()}render(){this.rootEl.innerHTML="";const e=this._date.getMonth(),t=this._date.getFullYear(),n=this._date.getDate(),s=this._date.getDay(),i=new Date(t,e,n-s);for(let n=0;n<7;n++){const s=new Date(t,e,i.getDate()+n);this.rootEl.insertAdjacentHTML("beforeend",this.renderDay(s,s.getDate())),this.rootEl.lastElementChild.addEventListener("click",(e=>{this.dispatchEvent(new CustomEvent("day-clicked",{detail:s}))}))}this.updateNowMarker()}renderDay(e,t,n=""){const s=U(this._events,e);return`\n
    \n
    \n ${Q[e.getDay()]}\n ${t}\n
    \n
      \n ${s.map((e=>e.asMediumLengthHTML())).join("")}\n
    \n
    \n `}updateNowMarker(){const e=new Date,t=100*(100*e.getHours()+e.getMinutes())/2400,n=this.rootEl.querySelector(".day.today");if(n){const e=n.offsetHeight*t/100;this.rootEl.style.setProperty("--now-marker",`${e}px`)}setTimeout((()=>this.updateNowMarker()),1e3)}set date(e){this._date=e,this.render()}set events(e){this._events=e,this.render()}}class K extends G{constructor(e,t,n,s){super(),this.mode="month",this.rootEl=e,this._date=t,this._events=s,this.mode=n,this.render()}render(){this.rootEl.innerHTML="",this.toolbarEl=document.createElement("div"),this.toolbarEl.id="toolbar",this.rootEl.appendChild(this.toolbarEl),this.toolbar=new X(this.toolbarEl,this._date,this.mode),this.toolbar.addEventListener("prev",(()=>{const e="month"===this.mode?new Date(this._date.getFullYear(),this._date.getMonth()-1,1):new Date(this._date.getFullYear(),this._date.getMonth(),this._date.getDate()-7);this.date=e,this.dispatchEvent(new CustomEvent("date-changed",{detail:this._date}))})),this.toolbar.addEventListener("next",(()=>{const e="month"===this.mode?new Date(this._date.getFullYear(),this._date.getMonth()+1,1):new Date(this._date.getFullYear(),this._date.getMonth(),this._date.getDate()+7);this.date=e,this.dispatchEvent(new CustomEvent("date-changed",{detail:this._date}))})),this.toolbar.addEventListener("today",(()=>{this.date=new Date,this.dispatchEvent(new CustomEvent("date-changed",{detail:this._date}))})),this.toolbar.addEventListener("month-view",(()=>{this.mode="month",this.monthGridEl.style.display="grid",this.weekGridEl.style.display="none",this.dispatchEvent(new CustomEvent("mode-changed",{detail:this.mode}))})),this.toolbar.addEventListener("week-view",(()=>{this.mode="week",this.monthGridEl.style.display="none",this.weekGridEl.style.display="grid",this.dispatchEvent(new CustomEvent("mode-changed",{detail:this.mode}))})),this.monthGridEl=document.createElement("div"),this.monthGridEl.id="month-grid",this.rootEl.appendChild(this.monthGridEl),this.monthGrid=new q(this.monthGridEl,this._date,this._events),this.weekGridEl=document.createElement("div"),this.weekGridEl.id="week-grid",this.rootEl.appendChild(this.weekGridEl),this.weekGrid=new Z(this.weekGridEl,this._date,this._events),this.sidebarEl=document.createElement("div"),this.sidebarEl.id="sidebar",this.rootEl.appendChild(this.sidebarEl),this.sidebar=new z(this.sidebarEl,this._date,this._events),this.monthGrid.addEventListener("day-clicked",(e=>{const t=e.detail,n=U(this._events,t);this.sidebar.events=n})),this.weekGrid.addEventListener("day-clicked",(e=>{const t=e.detail,n=U(this._events,t);this.sidebar.events=n})),this.sidebar.events=U(this._events,new Date),"week"===this.mode?(this.monthGridEl.style.display="none",this.weekGridEl.style.display="grid"):(this.monthGridEl.style.display="grid",this.weekGridEl.style.display="none")}set date(e){console.log("Setting date to",e),this._date=e,this.monthGrid.date=e,this.weekGrid.date=e,this.toolbar.date=e,this.sidebar.events=U(this._events,this._date)}set events(e){this._events=e,this.monthGrid.events=e,this.weekGrid.events=e,this.sidebar.events=U(this._events,this._date)}}class ee{constructor(e,t,n){this.rsvp=!1,this.title=e,this.id=t,this.date=n}asOneLineHTML(e=void 0){const t=this.time?`${this.time}`:"";return`\n
  • \n
    ${t} ${this.title}
    \n
  • \n `}asMediumLengthHTML(){const e=this.time?`${this.time}`:"";return`\n
  • \n
    ${e}
    \n

    ${this.title}

    \n

    ${this.description}

    \n
  • \n `}asFullHTML(){let e="";return this.multiDays?e=`From ${this.multiDays.start.toDateString()} to ${this.multiDays.end.toDateString()}`:(e=this.date.toDateString(),this.time&&(e+=`, at ${this.time}`),this.repeat&&(e+=`, ${this.repeat}`),this.duration&&(e+=` (${this.duration} minutes)`)),`\n
  • \n
    \n

    ${this.title}

    \n

    ${e}

    \n ${this.location?`

    ${this.location}

    `:""}\n

    ${this.description}

    \n
    \n
  • \n `}}var te=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function a(e){try{l(s.next(e))}catch(e){o(e)}}function r(e){try{l(s.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}l((s=s.apply(e,t||[])).next())}))};class ne{constructor(e){this.events=e}start(){this.popupEl||(this.popupEl=document.createElement("div"),this.popupEl.className="popup"),addEventListener("mousemove",(e=>{this.popupEl.classList.remove("visible"),this.popupEl.remove();const t=e.target.closest("#month-grid .event, #week-grid .event");if(!t)return;const n=t.id;if(!n||!n.startsWith("id-"))return;let s=n.replace("id-","");const i=this.events.find((e=>e.id===s));if(!i)return void console.log("No event found for id",s);const o=parseInt(t.dataset.indexInGrid);this.popupEl.style.setProperty("--event-color",i.color),this.popupEl.classList.toggle("visible",!0),this.popupEl.classList.toggle("unconfirmed",!i.rsvp);let a="";i.multiDays?a=`From ${i.multiDays.start.toDateString()} to ${i.multiDays.end.toDateString()}`:(a=i.date.toDateString(),i.time&&(a+=`, at ${i.time}`),i.repeat&&(a+=`, ${i.repeat}`),i.duration&&(a+=` (${i.duration} minutes)`)),this.popupEl.innerHTML=`\n

    ${i.title}

    \n

    ${a}

    \n ${i.location?`

    ${i.location}

    `:""}\n

    ${i.description}

    \n `,document.body.appendChild(this.popupEl);const r=t.getBoundingClientRect(),l=r.top,c=r.right,d=r.left,h=r.width;this.popupEl.style.top=o>=28?l-this.popupEl.clientHeight+"px":`${l}px`,6===o||13===o||20===o||27===o||34===o?(this.popupEl.style.left=d-h+"px",this.popupEl.classList.toggle("left",!0)):(this.popupEl.style.left=`${c}px`,this.popupEl.classList.toggle("left",!1))}))}}class se{getStoredPrefs(){return e=this,t=void 0,s=function*(){yield new Promise((e=>setTimeout(e,250*Math.random())));const e=localStorage.getItem("slow-cal-mode"),t=localStorage.getItem("slow-cal-initDate");return{mode:e,initDate:t?new Date(t):void 0}},new((n=void 0)||(n=Promise))((function(i,o){function a(e){try{l(s.next(e))}catch(e){o(e)}}function r(e){try{l(s.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}l((s=s.apply(e,t||[])).next())}));var e,t,n,s}set mode(e){console.log("Storing mode prefs"),localStorage.setItem("slow-cal-mode",e)}set initDate(e){console.log("Storing date prefs"),localStorage.setItem("slow-cal-initDate",e.toISOString())}}addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,s=function*(){const e=new se,t=yield e.getStoredPrefs(),n=t.initDate||new Date,s=t.mode||"month",i=document.getElementById("app"),o=new K(i,n,s,[]),a=yield function(){return te(this,void 0,void 0,(function*(){const e=yield function(){return te(this,void 0,void 0,(function*(){console.log("Fetching calendar data ..."),yield new Promise((e=>setTimeout(e,500*Math.random())));const e=yield fetch(`./data.json?cacheBuster=${Date.now()}`);return yield e.json()}))}();return console.log("Processing events ..."),e.events.map((e=>function(e){const t=[new Date(e.startDate)];let n=null;if(e.repeat){const n=new Date(e.startDate),s=e.endDate?new Date(e.endDate):new Date(n.getTime()+15768e7);if("daily"===e.repeat){console.log("Expanding daily event ...");const e=(s.getTime()-n.getTime())/864e5;for(let s=1;s<=e;s++){const e=new Date(n.getTime()+24*s*60*60*1e3);0!==e.getDay()&&6!==e.getDay()&&t.push(e)}}else if("weekly"===e.repeat){console.log("Expanding weekly event ...");const e=(s.getTime()-n.getTime())/6048e5;for(let s=1;s<=e;s++){const e=new Date(n.getTime()+7*s*24*60*60*1e3);t.push(e)}}else if("monthly"===e.repeat){console.log("Expanding monthly event ...");const e=12*(s.getFullYear()-n.getFullYear())+(s.getMonth()-n.getMonth());for(let s=1;s<=e;s++){const e=new Date(n.getTime());e.setMonth(e.getMonth()+s),t.push(e)}}else if("yearly"===e.repeat){console.log("Expanding yearly event ...");const e=s.getFullYear()-n.getFullYear();for(let s=1;s<=e;s++){const e=new Date(n.getTime());e.setFullYear(e.getFullYear()+s),t.push(e)}}}else if(e.endDate){const s=new Date(e.startDate),i=new Date(e.endDate),o=(i.getTime()-s.getTime())/864e5;for(let e=1;e<=o;e++){const n=new Date(s.getTime()+24*e*60*60*1e3);t.push(n)}n={start:s,end:i}}return t.map(((t,s)=>{const i=e.id+(s>0?`-${s}`:""),o=new ee(e.title,i,t);return o.multiDays=n,o.color=e.color,o.time=e.startTime,o.duration=e.duration,o.repeat=e.repeat,o.location=e.location,o.description=e.description,o.rsvp=e.rsvp,o}))}(e))).flat()}))}();console.log("Refreshing calendar with events"),o.events=a,console.log("Initializing the popup util"),new ne(a).start(),o.addEventListener("mode-changed",(t=>{e.mode=t.detail})),o.addEventListener("date-changed",(t=>{e.initDate=t.detail}))},new((n=void 0)||(n=Promise))((function(i,o){function a(e){try{l(s.next(e))}catch(e){o(e)}}function r(e){try{l(s.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}l((s=s.apply(e,t||[])).next())}));var e,t,n,s}))})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RSxFQUFVNEUsSUFBTS9HLEVBQVEsRUFBSSxJQUFJQSxJQUFVLElBQy9DaEYsRUFBUSxJQUFJeU0sR0FBY3RGLEVBQVV1RixNQUFPWCxFQUFJckUsR0FZckQsT0FWQTFILEVBQU1tSSxVQUFZQSxFQUVsQm5JLEVBQU00TSxNQUFRekYsRUFBVXlGLE1BQ3hCNU0sRUFBTWlJLEtBQU9kLEVBQVVtSixVQUN2QnRRLEVBQU1rTixTQUFXL0YsRUFBVStGLFNBQzNCbE4sRUFBTWlOLE9BQVM5RixFQUFVOEYsT0FDekJqTixFQUFNbU4sU0FBV2hHLEVBQVVnRyxTQUMzQm5OLEVBQU02TSxZQUFjMUYsRUFBVTBGLFlBQzlCN00sRUFBTTJNLEtBQU94RixFQUFVd0YsS0FFaEIzTSxDQUFLLEdBRWhCLENBT1d1USxDQUFrQ3ZRLEtBQ3hDd1EsTUFDTCxHLENEbkZ1QkMsR0FFckI3VCxRQUFRdU8sSUFBSSxtQ0FDWnFFLEVBQU0vSCxPQUFTQSxFQUVmN0ssUUFBUXVPLElBQUksK0JBQ0UsSUFBSWlDLEdBQVczRixHQUN2QnNGLFFBR055QyxFQUFNMUosaUJBQWlCLGdCQUFpQm9CLElBQ3RDaUksRUFBTW5FLEtBQU85RCxFQUFFMEMsTUFBTSxJQUl2QjRGLEVBQU0xSixpQkFBaUIsZ0JBQWlCb0IsSUFDdENpSSxFQUFNSCxTQUFXOUgsRUFBRTBDLE1BQU0sR0FFN0IsRSxZQTdCaUQsSyw2UUE2Qi9DLEciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbG93LWNhbGVuZGFyLy4vbm9kZV9tb2R1bGVzL2V2ZW50LXRhcmdldC1zaGltL2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9zbG93LWNhbGVuZGFyLy4vc3JjL3V0aWxzLnRzIiwid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9zcmMvTW9udGhHcmlkLnRzIiwid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9zcmMvVG9vbGJhci50cyIsIndlYnBhY2s6Ly9zbG93LWNhbGVuZGFyLy4vc3JjL1NpZGViYXIudHMiLCJ3ZWJwYWNrOi8vc2xvdy1jYWxlbmRhci8uL3NyYy9XZWVrR3JpZC50cyIsIndlYnBhY2s6Ly9zbG93LWNhbGVuZGFyLy4vc3JjL0FwcFVJLnRzIiwid2VicGFjazovL3Nsb3ctY2FsZW5kYXIvLi9zcmMvQ2FsZW5kYXJFdmVudC50cyIsIndlYnBhY2s6Ly9zbG93LWNhbGVuZGFyLy4vc3JjL0V2ZW50UG9wdXAudHMiLCJ3ZWJwYWNrOi8vc2xvdy1jYWxlbmRhci8uL3NyYy9TdG9yZS50cyIsIndlYnBhY2s6Ly9zbG93LWNhbGVuZGFyLy4vc3JjL2FwcC50cyIsIndlYnBhY2s6Ly9zbG93LWNhbGVuZGFyLy4vc3JjL2V2ZW50cy1mYWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXNzZXJ0IGEgY29uZGl0aW9uLlxuICogQHBhcmFtIGNvbmRpdGlvbiBUaGUgY29uZGl0aW9uIHRoYXQgaXQgc2hvdWxkIHNhdGlzZnkuXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgZm9yIHJlcGxhY2luZyBwbGFjZWhvbGRlcnMgaW4gdGhlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFR5cGUoY29uZGl0aW9uLCBtZXNzYWdlLCAuLi5hcmdzKSB7XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihmb3JtYXQobWVzc2FnZSwgYXJncykpO1xuICAgIH1cbn1cbi8qKlxuICogQ29udmVydCBhIHRleHQgYW5kIGFyZ3VtZW50cyB0byBvbmUgc3RyaW5nLlxuICogQHBhcmFtIG1lc3NhZ2UgVGhlIGZvcm1hdGluZyB0ZXh0XG4gKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzLlxuICovXG5mdW5jdGlvbiBmb3JtYXQobWVzc2FnZSwgYXJncykge1xuICAgIGxldCBpID0gMDtcbiAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC8lW29zXS9ndSwgKCkgPT4gYW55VG9TdHJpbmcoYXJnc1tpKytdKSk7XG59XG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB4IFRoZSB2YWx1ZSB0byBnZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYW55VG9TdHJpbmcoeCkge1xuICAgIGlmICh0eXBlb2YgeCAhPT0gXCJvYmplY3RcIiB8fCB4ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoeCk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCk7XG59XG5cbmxldCBjdXJyZW50RXJyb3JIYW5kbGVyO1xuLyoqXG4gKiBTZXQgdGhlIGVycm9yIGhhbmRsZXIuXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGVycm9yIGhhbmRsZXIgdG8gc2V0LlxuICovXG5mdW5jdGlvbiBzZXRFcnJvckhhbmRsZXIodmFsdWUpIHtcbiAgICBhc3NlcnRUeXBlKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8IHZhbHVlID09PSB1bmRlZmluZWQsIFwiVGhlIGVycm9yIGhhbmRsZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIHVuZGVmaW5lZCwgYnV0IGdvdCAlby5cIiwgdmFsdWUpO1xuICAgIGN1cnJlbnRFcnJvckhhbmRsZXIgPSB2YWx1ZTtcbn1cbi8qKlxuICogUHJpbnQgYSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIG1heWJlRXJyb3IgVGhlIGVycm9yIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVwb3J0RXJyb3IobWF5YmVFcnJvcikge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbWF5YmVFcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IG1heWJlRXJyb3JcbiAgICAgICAgICAgIDogbmV3IEVycm9yKGFueVRvU3RyaW5nKG1heWJlRXJyb3IpKTtcbiAgICAgICAgLy8gQ2FsbCB0aGUgdXNlci1kZWZpbmVkIGVycm9yIGhhbmRsZXIgaWYgZXhpc3RzLlxuICAgICAgICBpZiAoY3VycmVudEVycm9ySGFuZGxlcikge1xuICAgICAgICAgICAgY3VycmVudEVycm9ySGFuZGxlcihlcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGlzcGF0Y2ggYW4gYGVycm9yYCBldmVudCBpZiB0aGlzIGlzIG9uIGEgYnJvd3Nlci5cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwYXRjaEV2ZW50ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBFcnJvckV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXZlbnQobmV3IEVycm9yRXZlbnQoXCJlcnJvclwiLCB7IGVycm9yLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbWl0IGFuIGB1bmNhdWdodEV4Y2VwdGlvbmAgZXZlbnQgaWYgdGhpcyBpcyBvbiBOb2RlLmpzLlxuICAgICAgICAvL2lzdGFuYnVsIGlnbm9yZSBlbHNlXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy5lbWl0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW1pdChcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHByaW50IHRoZSBlcnJvci5cbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICAvLyBpZ25vcmUuXG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBnbG9iYWwgb2JqZWN0LlxuICovXG4vL2lzdGFuYnVsIGlnbm9yZSBuZXh0XG5jb25zdCBHbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiXG4gICAgPyB3aW5kb3dcbiAgICA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gc2VsZlxuICAgICAgICA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgID8gZ2xvYmFsXG4gICAgICAgICAgICA6IHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgPyBnbG9iYWxUaGlzXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbmxldCBjdXJyZW50V2FybkhhbmRsZXI7XG4vKipcbiAqIFNldCB0aGUgd2FybmluZyBoYW5kbGVyLlxuICogQHBhcmFtIHZhbHVlIFRoZSB3YXJuaW5nIGhhbmRsZXIgdG8gc2V0LlxuICovXG5mdW5jdGlvbiBzZXRXYXJuaW5nSGFuZGxlcih2YWx1ZSkge1xuICAgIGFzc2VydFR5cGUodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCwgXCJUaGUgd2FybmluZyBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiBvciB1bmRlZmluZWQsIGJ1dCBnb3QgJW8uXCIsIHZhbHVlKTtcbiAgICBjdXJyZW50V2FybkhhbmRsZXIgPSB2YWx1ZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgaW5mb3JtYXRpb24uXG4gKi9cbmNsYXNzIFdhcm5pbmcge1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwb3J0IHRoaXMgd2FybmluZy5cbiAgICAgKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIG9mIHRoZSB3YXJuaW5nLlxuICAgICAqL1xuICAgIHdhcm4oLi4uYXJncykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSB1c2VyLWRlZmluZWQgd2FybmluZyBoYW5kbGVyIGlmIGV4aXN0cy5cbiAgICAgICAgICAgIGlmIChjdXJyZW50V2FybkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50V2FybkhhbmRsZXIoeyAuLi50aGlzLCBhcmdzIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgcHJpbnQgdGhlIHdhcm5pbmcuXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9ICgoX2EgPSBuZXcgRXJyb3IoKS5zdGFjaykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIikucmVwbGFjZSgvXig/Oi4rP1xcbil7Mn0vZ3UsIFwiXFxuXCIpO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKHRoaXMubWVzc2FnZSwgLi4uYXJncywgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYikge1xuICAgICAgICAgICAgLy8gSWdub3JlLlxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBJbml0RXZlbnRXYXNDYWxsZWRXaGlsZURpc3BhdGNoaW5nID0gbmV3IFdhcm5pbmcoXCJXMDFcIiwgXCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBldmVudCB1bmRlciBkaXNwYXRjaGluZy5cIik7XG5jb25zdCBGYWxzeVdhc0Fzc2lnbmVkVG9DYW5jZWxCdWJibGUgPSBuZXcgV2FybmluZyhcIlcwMlwiLCBcIkFzc2lnbmluZyBhbnkgZmFsc3kgdmFsdWUgdG8gJ2NhbmNlbEJ1YmJsZScgcHJvcGVydHkgaGFzIG5vIGVmZmVjdC5cIik7XG5jb25zdCBUcnV0aHlXYXNBc3NpZ25lZFRvUmV0dXJuVmFsdWUgPSBuZXcgV2FybmluZyhcIlcwM1wiLCBcIkFzc2lnbmluZyBhbnkgdHJ1dGh5IHZhbHVlIHRvICdyZXR1cm5WYWx1ZScgcHJvcGVydHkgaGFzIG5vIGVmZmVjdC5cIik7XG5jb25zdCBOb25DYW5jZWxhYmxlRXZlbnRXYXNDYW5jZWxlZCA9IG5ldyBXYXJuaW5nKFwiVzA0XCIsIFwiVW5hYmxlIHRvIHByZXZlbnREZWZhdWx0IG9uIG5vbi1jYW5jZWxhYmxlIGV2ZW50cy5cIik7XG5jb25zdCBDYW5jZWxlZEluUGFzc2l2ZUxpc3RlbmVyID0gbmV3IFdhcm5pbmcoXCJXMDVcIiwgXCJVbmFibGUgdG8gcHJldmVudERlZmF1bHQgaW5zaWRlIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXIgaW52b2NhdGlvbi5cIik7XG5jb25zdCBFdmVudExpc3RlbmVyV2FzRHVwbGljYXRlZCA9IG5ldyBXYXJuaW5nKFwiVzA2XCIsIFwiQW4gZXZlbnQgbGlzdGVuZXIgd2Fzbid0IGFkZGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gYWRkZWQgYWxyZWFkeTogJW8sICVvXCIpO1xuY29uc3QgT3B0aW9uV2FzSWdub3JlZCA9IG5ldyBXYXJuaW5nKFwiVzA3XCIsIFwiVGhlICVvIG9wdGlvbiB2YWx1ZSB3YXMgYWJhbmRvbmVkIGJlY2F1c2UgdGhlIGV2ZW50IGxpc3RlbmVyIHdhc24ndCBhZGRlZCBhcyBkdXBsaWNhdGVkLlwiKTtcbmNvbnN0IEludmFsaWRFdmVudExpc3RlbmVyID0gbmV3IFdhcm5pbmcoXCJXMDhcIiwgXCJUaGUgJ2NhbGxiYWNrJyBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IHRoYXQgaGFzICdoYW5kbGVFdmVudCcgbWV0aG9kOiAlb1wiKTtcbmNvbnN0IEludmFsaWRBdHRyaWJ1dGVIYW5kbGVyID0gbmV3IFdhcm5pbmcoXCJXMDlcIiwgXCJFdmVudCBhdHRyaWJ1dGUgaGFuZGxlciBtdXN0IGJlIGEgZnVuY3Rpb246ICVvXCIpO1xuXG4vKmVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYEV2ZW50YCBpbnRlcmZhY2UsIHRoYXQgd3JhcHMgYSBnaXZlbiBldmVudCBvYmplY3QuXG4gKiBgRXZlbnRUYXJnZXRgIHNoaW0gY2FuIGNvbnRyb2wgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoaXMgYEV2ZW50YCBvYmplY3RzLlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2V2ZW50XG4gKi9cbmNsYXNzIEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LW5vbmVcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5PTkUoKSB7XG4gICAgICAgIHJldHVybiBOT05FO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWNhcHR1cmluZ19waGFzZVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0FQVFVSSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gQ0FQVFVSSU5HX1BIQVNFO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWF0X3RhcmdldFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVRfVEFSR0VUKCkge1xuICAgICAgICByZXR1cm4gQVRfVEFSR0VUO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWJ1YmJsaW5nX3BoYXNlXG4gICAgICovXG4gICAgc3RhdGljIGdldCBCVUJCTElOR19QSEFTRSgpIHtcbiAgICAgICAgcmV0dXJuIEJVQkJMSU5HX1BIQVNFO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoaXMgZXZlbnQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAcGFyYW0gZXZlbnRJbml0RGljdCBPcHRpb25zIHRvIGluaXRpYWxpemUuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1ldmVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGV2ZW50SW5pdERpY3QpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiaXNUcnVzdGVkXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvcHRzID0gZXZlbnRJbml0RGljdCAhPT0gbnVsbCAmJiBldmVudEluaXREaWN0ICE9PSB2b2lkIDAgPyBldmVudEluaXREaWN0IDoge307XG4gICAgICAgIGludGVybmFsRGF0YU1hcC5zZXQodGhpcywge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nKHR5cGUpLFxuICAgICAgICAgICAgYnViYmxlczogQm9vbGVhbihvcHRzLmJ1YmJsZXMpLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogQm9vbGVhbihvcHRzLmNhbmNlbGFibGUpLFxuICAgICAgICAgICAgY29tcG9zZWQ6IEJvb2xlYW4ob3B0cy5jb21wb3NlZCksXG4gICAgICAgICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiBudWxsLFxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uRmxhZzogZmFsc2UsXG4gICAgICAgICAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25GbGFnOiBmYWxzZSxcbiAgICAgICAgICAgIGNhbmNlbGVkRmxhZzogZmFsc2UsXG4gICAgICAgICAgICBpblBhc3NpdmVMaXN0ZW5lckZsYWc6IGZhbHNlLFxuICAgICAgICAgICAgZGlzcGF0Y2hGbGFnOiBmYWxzZSxcbiAgICAgICAgICAgIHRpbWVTdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC10eXBlXG4gICAgICovXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLnR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB0YXJnZXQgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hpbmcuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC10YXJnZXRcbiAgICAgKi9cbiAgICBnZXQgdGFyZ2V0KCkge1xuICAgICAgICByZXR1cm4gJCh0aGlzKS50YXJnZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB0YXJnZXQgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hpbmcuXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBgdGFyZ2V0YCBwcm9wZXJ0eSBpbnN0ZWFkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtc3JjZWxlbWVudFxuICAgICAqL1xuICAgIGdldCBzcmNFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gJCh0aGlzKS50YXJnZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB0YXJnZXQgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hpbmcuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1jdXJyZW50dGFyZ2V0XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRUYXJnZXQoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLmN1cnJlbnRUYXJnZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB0YXJnZXQgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hpbmcuXG4gICAgICogVGhpcyBkb2Vzbid0IHN1cHBvcnQgbm9kZSB0cmVlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtY29tcG9zZWRwYXRoXG4gICAgICovXG4gICAgY29tcG9zZWRQYXRoKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gJCh0aGlzKS5jdXJyZW50VGFyZ2V0O1xuICAgICAgICBpZiAoY3VycmVudFRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIFtjdXJyZW50VGFyZ2V0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtbm9uZVxuICAgICAqL1xuICAgIGdldCBOT05FKCkge1xuICAgICAgICByZXR1cm4gTk9ORTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1jYXB0dXJpbmdfcGhhc2VcbiAgICAgKi9cbiAgICBnZXQgQ0FQVFVSSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gQ0FQVFVSSU5HX1BIQVNFO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWF0X3RhcmdldFxuICAgICAqL1xuICAgIGdldCBBVF9UQVJHRVQoKSB7XG4gICAgICAgIHJldHVybiBBVF9UQVJHRVQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtYnViYmxpbmdfcGhhc2VcbiAgICAgKi9cbiAgICBnZXQgQlVCQkxJTkdfUEhBU0UoKSB7XG4gICAgICAgIHJldHVybiBCVUJCTElOR19QSEFTRTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgZXZlbnQgcGhhc2UuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1ldmVudHBoYXNlXG4gICAgICovXG4gICAgZ2V0IGV2ZW50UGhhc2UoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLmRpc3BhdGNoRmxhZyA/IDIgOiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9wIGV2ZW50IGJ1YmJsaW5nLlxuICAgICAqIEJlY2F1c2UgdGhpcyBzaGltIGRvZXNuJ3Qgc3VwcG9ydCBub2RlIHRyZWUsIHRoaXMgbWVyZWx5IGNoYW5nZXMgdGhlIGBjYW5jZWxCdWJibGVgIHByb3BlcnR5IHZhbHVlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtc3RvcHByb3BhZ2F0aW9uXG4gICAgICovXG4gICAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICAkKHRoaXMpLnN0b3BQcm9wYWdhdGlvbkZsYWcgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgZXZlbnQgYnViYmxpbmcgd2FzIHN0b3BwZWQuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LWNhbmNlbGJ1YmJsZVxuICAgICAqL1xuICAgIGdldCBjYW5jZWxCdWJibGUoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLnN0b3BQcm9wYWdhdGlvbkZsYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcgaWYgYHRydWVgIGlzIHNldC5cbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBzdG9wUHJvcGFnYXRpb24oKWAgbWV0aG9kIGluc3RlYWQuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1jYW5jZWxidWJibGVcbiAgICAgKi9cbiAgICBzZXQgY2FuY2VsQnViYmxlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgJCh0aGlzKS5zdG9wUHJvcGFnYXRpb25GbGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIEZhbHN5V2FzQXNzaWduZWRUb0NhbmNlbEJ1YmJsZS53YXJuKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcCBldmVudCBidWJibGluZyBhbmQgc3Vic2VxdWVudCBldmVudCBsaXN0ZW5lciBjYWxsaW5ncy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LXN0b3BpbW1lZGlhdGVwcm9wYWdhdGlvblxuICAgICAqL1xuICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9ICQodGhpcyk7XG4gICAgICAgIGRhdGEuc3RvcFByb3BhZ2F0aW9uRmxhZyA9IGRhdGEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uRmxhZyA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGlzIGV2ZW50IHdpbGwgYnViYmxlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtYnViYmxlc1xuICAgICAqL1xuICAgIGdldCBidWJibGVzKCkge1xuICAgICAgICByZXR1cm4gJCh0aGlzKS5idWJibGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhpcyBldmVudCBjYW4gYmUgY2FuY2VsZWQgYnkgdGhlIGBwcmV2ZW50RGVmYXVsdCgpYCBtZXRob2QuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1jYW5jZWxhYmxlXG4gICAgICovXG4gICAgZ2V0IGNhbmNlbGFibGUoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLmNhbmNlbGFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgZGVmYXVsdCBiZWhhdmlvciB3aWxsIGFjdC5cbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBkZWZhdWx0UHJldmVudGVkYCBwcm9lcHJ0eSBpbnN0ZWFkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtcmV0dXJudmFsdWVcbiAgICAgKi9cbiAgICBnZXQgcmV0dXJuVmFsdWUoKSB7XG4gICAgICAgIHJldHVybiAhJCh0aGlzKS5jYW5jZWxlZEZsYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbmNlbCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpZiBgZmFsc2VgIGlzIHNldC5cbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBwcmV2ZW50RGVmYXVsdCgpYCBtZXRob2QgaW5zdGVhZC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LXJldHVybnZhbHVlXG4gICAgICovXG4gICAgc2V0IHJldHVyblZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHNldENhbmNlbEZsYWcoJCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBUcnV0aHlXYXNBc3NpZ25lZFRvUmV0dXJuVmFsdWUud2FybigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbmNlbCB0aGUgZGVmYXVsdCBiZWhhdmlvci5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWV2ZW50LXByZXZlbnRkZWZhdWx0XG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHNldENhbmNlbEZsYWcoJCh0aGlzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgZGVmYXVsdCBiZWhhdmlvciB3YXMgY2FuY2VsZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1kZWZhdWx0cHJldmVudGVkXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRQcmV2ZW50ZWQoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLmNhbmNlbGVkRmxhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC1jb21wb3NlZFxuICAgICAqL1xuICAgIGdldCBjb21wb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcykuY29tcG9zZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnQtaXN0cnVzdGVkXG4gICAgICovXG4gICAgLy9pc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgIGdldCBpc1RydXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ldmVudC10aW1lc3RhbXBcbiAgICAgKi9cbiAgICBnZXQgdGltZVN0YW1wKCkge1xuICAgICAgICByZXR1cm4gJCh0aGlzKS50aW1lU3RhbXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIERvbid0IHVzZSB0aGlzIG1ldGhvZC4gVGhlIGNvbnN0cnVjdG9yIGRpZCBpbml0aWFsaXphdGlvbi5cbiAgICAgKi9cbiAgICBpbml0RXZlbnQodHlwZSwgYnViYmxlcyA9IGZhbHNlLCBjYW5jZWxhYmxlID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9ICQodGhpcyk7XG4gICAgICAgIGlmIChkYXRhLmRpc3BhdGNoRmxhZykge1xuICAgICAgICAgICAgSW5pdEV2ZW50V2FzQ2FsbGVkV2hpbGVEaXNwYXRjaGluZy53YXJuKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJuYWxEYXRhTWFwLnNldCh0aGlzLCB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgdHlwZTogU3RyaW5nKHR5cGUpLFxuICAgICAgICAgICAgYnViYmxlczogQm9vbGVhbihidWJibGVzKSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4oY2FuY2VsYWJsZSksXG4gICAgICAgICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiBudWxsLFxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uRmxhZzogZmFsc2UsXG4gICAgICAgICAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25GbGFnOiBmYWxzZSxcbiAgICAgICAgICAgIGNhbmNlbGVkRmxhZzogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgTk9ORSA9IDA7XG5jb25zdCBDQVBUVVJJTkdfUEhBU0UgPSAxO1xuY29uc3QgQVRfVEFSR0VUID0gMjtcbmNvbnN0IEJVQkJMSU5HX1BIQVNFID0gMztcbi8qKlxuICogUHJpdmF0ZSBkYXRhIGZvciBldmVudCB3cmFwcGVycy5cbiAqL1xuY29uc3QgaW50ZXJuYWxEYXRhTWFwID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogR2V0IHByaXZhdGUgZGF0YS5cbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgb2JqZWN0IHRvIGdldCBwcml2YXRlIGRhdGEuXG4gKiBAcGFyYW0gbmFtZSBUaGUgdmFyaWFibGUgbmFtZSB0byByZXBvcnQuXG4gKiBAcmV0dXJucyBUaGUgcHJpdmF0ZSBkYXRhIG9mIHRoZSBldmVudC5cbiAqL1xuZnVuY3Rpb24gJChldmVudCwgbmFtZSA9IFwidGhpc1wiKSB7XG4gICAgY29uc3QgcmV0diA9IGludGVybmFsRGF0YU1hcC5nZXQoZXZlbnQpO1xuICAgIGFzc2VydFR5cGUocmV0diAhPSBudWxsLCBcIiclcycgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCBFdmVudCBjb25zdHJ1Y3RvciBjcmVhdGVkLCBidXQgZ290IGFub3RoZXIgb25lOiAlb1wiLCBuYW1lLCBldmVudCk7XG4gICAgcmV0dXJuIHJldHY7XG59XG4vKipcbiAqIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jc2V0LXRoZS1jYW5jZWxlZC1mbGFnXG4gKiBAcGFyYW0gZGF0YSBwcml2YXRlIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIHNldENhbmNlbEZsYWcoZGF0YSkge1xuICAgIGlmIChkYXRhLmluUGFzc2l2ZUxpc3RlbmVyRmxhZykge1xuICAgICAgICBDYW5jZWxlZEluUGFzc2l2ZUxpc3RlbmVyLndhcm4oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRhdGEuY2FuY2VsYWJsZSkge1xuICAgICAgICBOb25DYW5jZWxhYmxlRXZlbnRXYXNDYW5jZWxlZC53YXJuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGF0YS5jYW5jZWxlZEZsYWcgPSB0cnVlO1xufVxuLy8gU2V0IGVudW1lcmFibGVcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudCwgXCJOT05FXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudCwgXCJDQVBUVVJJTkdfUEhBU0VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50LCBcIkFUX1RBUkdFVFwiLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnQsIFwiQlVCQkxJTkdfUEhBU0VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEV2ZW50LnByb3RvdHlwZSk7XG5mb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoa2V5c1tpXSA9PT0gXCJjb25zdHJ1Y3RvclwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnQucHJvdG90eXBlLCBrZXlzW2ldLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG59XG4vLyBFbnN1cmUgYGV2ZW50IGluc3RhbmNlb2Ygd2luZG93LkV2ZW50YCBpcyBgdHJ1ZWAuXG5pZiAodHlwZW9mIEdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgR2xvYmFsLkV2ZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEV2ZW50LnByb3RvdHlwZSwgR2xvYmFsLkV2ZW50LnByb3RvdHlwZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IEludmFsaWRTdGF0ZUVycm9yIGluc3RhbmNlLlxuICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRTdGF0ZUVycm9yKG1lc3NhZ2UpIHtcbiAgICBpZiAoR2xvYmFsLkRPTUV4Y2VwdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IEdsb2JhbC5ET01FeGNlcHRpb24obWVzc2FnZSwgXCJJbnZhbGlkU3RhdGVFcnJvclwiKTtcbiAgICB9XG4gICAgaWYgKERPTUV4Y2VwdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIERPTUV4Y2VwdGlvbiA9IGNsYXNzIERPTUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKG1zZykge1xuICAgICAgICAgICAgICAgIHN1cGVyKG1zZyk7XG4gICAgICAgICAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIERPTUV4Y2VwdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICAgICAgICAgIGdldCBjb2RlKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gICAgICAgICAgICBnZXQgbmFtZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJJbnZhbGlkU3RhdGVFcnJvclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhET01FeGNlcHRpb24ucHJvdG90eXBlLCB7XG4gICAgICAgICAgICBjb2RlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIG5hbWU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgZGVmaW5lRXJyb3JDb2RlUHJvcGVydGllcyhET01FeGNlcHRpb24pO1xuICAgICAgICBkZWZpbmVFcnJvckNvZGVQcm9wZXJ0aWVzKERPTUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERPTUV4Y2VwdGlvbihtZXNzYWdlKTtcbn1cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxubGV0IERPTUV4Y2VwdGlvbjtcbmNvbnN0IEVycm9yQ29kZU1hcCA9IHtcbiAgICBJTkRFWF9TSVpFX0VSUjogMSxcbiAgICBET01TVFJJTkdfU0laRV9FUlI6IDIsXG4gICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiAzLFxuICAgIFdST05HX0RPQ1VNRU5UX0VSUjogNCxcbiAgICBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IDUsXG4gICAgTk9fREFUQV9BTExPV0VEX0VSUjogNixcbiAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IDcsXG4gICAgTk9UX0ZPVU5EX0VSUjogOCxcbiAgICBOT1RfU1VQUE9SVEVEX0VSUjogOSxcbiAgICBJTlVTRV9BVFRSSUJVVEVfRVJSOiAxMCxcbiAgICBJTlZBTElEX1NUQVRFX0VSUjogMTEsXG4gICAgU1lOVEFYX0VSUjogMTIsXG4gICAgSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSOiAxMyxcbiAgICBOQU1FU1BBQ0VfRVJSOiAxNCxcbiAgICBJTlZBTElEX0FDQ0VTU19FUlI6IDE1LFxuICAgIFZBTElEQVRJT05fRVJSOiAxNixcbiAgICBUWVBFX01JU01BVENIX0VSUjogMTcsXG4gICAgU0VDVVJJVFlfRVJSOiAxOCxcbiAgICBORVRXT1JLX0VSUjogMTksXG4gICAgQUJPUlRfRVJSOiAyMCxcbiAgICBVUkxfTUlTTUFUQ0hfRVJSOiAyMSxcbiAgICBRVU9UQV9FWENFRURFRF9FUlI6IDIyLFxuICAgIFRJTUVPVVRfRVJSOiAyMyxcbiAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IDI0LFxuICAgIERBVEFfQ0xPTkVfRVJSOiAyNSxcbn07XG5mdW5jdGlvbiBkZWZpbmVFcnJvckNvZGVQcm9wZXJ0aWVzKG9iaikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhFcnJvckNvZGVNYXApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IEVycm9yQ29kZU1hcFtrZXldO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBFdmVudGAgaW50ZXJmYWNlLCB0aGF0IHdyYXBzIGEgZ2l2ZW4gZXZlbnQgb2JqZWN0LlxuICogVGhpcyBjbGFzcyBjb250cm9scyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgYEV2ZW50YC5cbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtZXZlbnRcbiAqL1xuY2xhc3MgRXZlbnRXcmFwcGVyIGV4dGVuZHMgRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFdyYXAgYSBnaXZlbiBldmVudCBvYmplY3QgdG8gY29udHJvbCBzdGF0ZXMuXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudC1saWtlIG9iamVjdCB0byB3cmFwLlxuICAgICAqL1xuICAgIHN0YXRpYyB3cmFwKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgKGdldFdyYXBwZXJDbGFzc09mKGV2ZW50KSkoZXZlbnQpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihldmVudCkge1xuICAgICAgICBzdXBlcihldmVudC50eXBlLCB7XG4gICAgICAgICAgICBidWJibGVzOiBldmVudC5idWJibGVzLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogZXZlbnQuY2FuY2VsYWJsZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiBldmVudC5jb21wb3NlZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChldmVudC5jYW5jZWxCdWJibGUpIHtcbiAgICAgICAgICAgIHN1cGVyLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICBzdXBlci5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGludGVybmFsRGF0YU1hcCQxLnNldCh0aGlzLCB7IG9yaWdpbmFsOiBldmVudCB9KTtcbiAgICAgICAgLy8gRGVmaW5lIGFjY2Vzc29yc1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICBpZiAoIShrZXkgaW4gdGhpcykpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3IoZXZlbnQsIGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgc3VwZXIuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IHsgb3JpZ2luYWwgfSA9ICQkMSh0aGlzKTtcbiAgICAgICAgaWYgKFwic3RvcFByb3BhZ2F0aW9uXCIgaW4gb3JpZ2luYWwpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjYW5jZWxCdWJibGUoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5jYW5jZWxCdWJibGU7XG4gICAgfVxuICAgIHNldCBjYW5jZWxCdWJibGUodmFsdWUpIHtcbiAgICAgICAgc3VwZXIuY2FuY2VsQnViYmxlID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IHsgb3JpZ2luYWwgfSA9ICQkMSh0aGlzKTtcbiAgICAgICAgaWYgKFwiY2FuY2VsQnViYmxlXCIgaW4gb3JpZ2luYWwpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsLmNhbmNlbEJ1YmJsZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgc3VwZXIuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IHsgb3JpZ2luYWwgfSA9ICQkMSh0aGlzKTtcbiAgICAgICAgaWYgKFwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uXCIgaW4gb3JpZ2luYWwpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCByZXR1cm5WYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJldHVyblZhbHVlO1xuICAgIH1cbiAgICBzZXQgcmV0dXJuVmFsdWUodmFsdWUpIHtcbiAgICAgICAgc3VwZXIucmV0dXJuVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgeyBvcmlnaW5hbCB9ID0gJCQxKHRoaXMpO1xuICAgICAgICBpZiAoXCJyZXR1cm5WYWx1ZVwiIGluIG9yaWdpbmFsKSB7XG4gICAgICAgICAgICBvcmlnaW5hbC5yZXR1cm5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICBzdXBlci5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB7IG9yaWdpbmFsIH0gPSAkJDEodGhpcyk7XG4gICAgICAgIGlmIChcInByZXZlbnREZWZhdWx0XCIgaW4gb3JpZ2luYWwpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRpbWVTdGFtcCgpIHtcbiAgICAgICAgY29uc3QgeyBvcmlnaW5hbCB9ID0gJCQxKHRoaXMpO1xuICAgICAgICBpZiAoXCJ0aW1lU3RhbXBcIiBpbiBvcmlnaW5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLnRpbWVTdGFtcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIudGltZVN0YW1wO1xuICAgIH1cbn1cbi8qKlxuICogUHJpdmF0ZSBkYXRhIGZvciBldmVudCB3cmFwcGVycy5cbiAqL1xuY29uc3QgaW50ZXJuYWxEYXRhTWFwJDEgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBHZXQgcHJpdmF0ZSBkYXRhLlxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBvYmplY3QgdG8gZ2V0IHByaXZhdGUgZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBwcml2YXRlIGRhdGEgb2YgdGhlIGV2ZW50LlxuICovXG5mdW5jdGlvbiAkJDEoZXZlbnQpIHtcbiAgICBjb25zdCByZXR2ID0gaW50ZXJuYWxEYXRhTWFwJDEuZ2V0KGV2ZW50KTtcbiAgICBhc3NlcnRUeXBlKHJldHYgIT0gbnVsbCwgXCIndGhpcycgaXMgZXhwZWN0ZWQgYW4gRXZlbnQgb2JqZWN0LCBidXQgZ290XCIsIGV2ZW50KTtcbiAgICByZXR1cm4gcmV0djtcbn1cbi8qKlxuICogQ2FjaGUgZm9yIHdyYXBwZXIgY2xhc3Nlcy5cbiAqIEB0eXBlIHtXZWFrTWFwPE9iamVjdCwgRnVuY3Rpb24+fVxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgd3JhcHBlckNsYXNzQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuLy8gTWFrZSBhc3NvY2lhdGlvbiBmb3Igd3JhcHBlcnMuXG53cmFwcGVyQ2xhc3NDYWNoZS5zZXQoT2JqZWN0LnByb3RvdHlwZSwgRXZlbnRXcmFwcGVyKTtcbmlmICh0eXBlb2YgR2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBHbG9iYWwuRXZlbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3cmFwcGVyQ2xhc3NDYWNoZS5zZXQoR2xvYmFsLkV2ZW50LnByb3RvdHlwZSwgRXZlbnRXcmFwcGVyKTtcbn1cbi8qKlxuICogR2V0IHRoZSB3cmFwcGVyIGNsYXNzIG9mIGEgZ2l2ZW4gcHJvdG90eXBlLlxuICogQHBhcmFtIG9yaWdpbmFsRXZlbnQgVGhlIGV2ZW50IG9iamVjdCB0byB3cmFwLlxuICovXG5mdW5jdGlvbiBnZXRXcmFwcGVyQ2xhc3NPZihvcmlnaW5hbEV2ZW50KSB7XG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9yaWdpbmFsRXZlbnQpO1xuICAgIGlmIChwcm90b3R5cGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXZlbnRXcmFwcGVyO1xuICAgIH1cbiAgICBsZXQgd3JhcHBlciA9IHdyYXBwZXJDbGFzc0NhY2hlLmdldChwcm90b3R5cGUpO1xuICAgIGlmICh3cmFwcGVyID09IG51bGwpIHtcbiAgICAgICAgd3JhcHBlciA9IGRlZmluZVdyYXBwZXIoZ2V0V3JhcHBlckNsYXNzT2YocHJvdG90eXBlKSwgcHJvdG90eXBlKTtcbiAgICAgICAgd3JhcHBlckNsYXNzQ2FjaGUuc2V0KHByb3RvdHlwZSwgd3JhcHBlcik7XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVyO1xufVxuLyoqXG4gKiBEZWZpbmUgbmV3IHdyYXBwZXIgY2xhc3MuXG4gKiBAcGFyYW0gQmFzZUV2ZW50V3JhcHBlciBUaGUgYmFzZSB3cmFwcGVyIGNsYXNzLlxuICogQHBhcmFtIG9yaWdpbmFsUHJvdG90eXBlIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50LlxuICovXG5mdW5jdGlvbiBkZWZpbmVXcmFwcGVyKEJhc2VFdmVudFdyYXBwZXIsIG9yaWdpbmFsUHJvdG90eXBlKSB7XG4gICAgY2xhc3MgQ3VzdG9tRXZlbnRXcmFwcGVyIGV4dGVuZHMgQmFzZUV2ZW50V3JhcHBlciB7XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcmlnaW5hbFByb3RvdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDdXN0b21FdmVudFdyYXBwZXIucHJvdG90eXBlLCBrZXlzW2ldLCBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Iob3JpZ2luYWxQcm90b3R5cGUsIGtleXNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50V3JhcHBlcjtcbn1cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIHJlZGlyZWN0IGEgZ2l2ZW4gcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihvYmosIGtleSkge1xuICAgIGNvbnN0IGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9ICQkMSh0aGlzKS5vcmlnaW5hbDtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3JpZ2luYWxba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKG9yaWdpbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9ICQkMSh0aGlzKS5vcmlnaW5hbDtcbiAgICAgICAgICAgIG9yaWdpbmFsW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBkLmNvbmZpZ3VyYWJsZSxcbiAgICAgICAgZW51bWVyYWJsZTogZC5lbnVtZXJhYmxlLFxuICAgIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGxpc3RlbmVyLlxuICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqIEBwYXJhbSBjYXB0dXJlIFRoZSBjYXB0dXJlIGZsYWcuXG4gKiBAcGFyYW0gcGFzc2l2ZSBUaGUgcGFzc2l2ZSBmbGFnLlxuICogQHBhcmFtIG9uY2UgVGhlIG9uY2UgZmxhZy5cbiAqIEBwYXJhbSBzaWduYWwgVGhlIGFib3J0IHNpZ25hbC5cbiAqIEBwYXJhbSBzaWduYWxMaXN0ZW5lciBUaGUgYWJvcnQgZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBhYm9ydCBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyKGNhbGxiYWNrLCBjYXB0dXJlLCBwYXNzaXZlLCBvbmNlLCBzaWduYWwsIHNpZ25hbExpc3RlbmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIGZsYWdzOiAoY2FwdHVyZSA/IDEgLyogQ2FwdHVyZSAqLyA6IDApIHxcbiAgICAgICAgICAgIChwYXNzaXZlID8gMiAvKiBQYXNzaXZlICovIDogMCkgfFxuICAgICAgICAgICAgKG9uY2UgPyA0IC8qIE9uY2UgKi8gOiAwKSxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBzaWduYWxMaXN0ZW5lcixcbiAgICB9O1xufVxuLyoqXG4gKiBTZXQgdGhlIGByZW1vdmVkYCBmbGFnIHRvIHRoZSBnaXZlbiBsaXN0ZW5lci5cbiAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIHNldFJlbW92ZWQobGlzdGVuZXIpIHtcbiAgICBsaXN0ZW5lci5mbGFncyB8PSA4IC8qIFJlbW92ZWQgKi87XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBsaXN0ZW5lciBoYXMgdGhlIGBjYXB0dXJlYCBmbGFnIG9yIG5vdC5cbiAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzQ2FwdHVyZShsaXN0ZW5lcikge1xuICAgIHJldHVybiAobGlzdGVuZXIuZmxhZ3MgJiAxIC8qIENhcHR1cmUgKi8pID09PSAxIC8qIENhcHR1cmUgKi87XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBsaXN0ZW5lciBoYXMgdGhlIGBwYXNzaXZlYCBmbGFnIG9yIG5vdC5cbiAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzUGFzc2l2ZShsaXN0ZW5lcikge1xuICAgIHJldHVybiAobGlzdGVuZXIuZmxhZ3MgJiAyIC8qIFBhc3NpdmUgKi8pID09PSAyIC8qIFBhc3NpdmUgKi87XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBsaXN0ZW5lciBoYXMgdGhlIGBvbmNlYCBmbGFnIG9yIG5vdC5cbiAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzT25jZShsaXN0ZW5lcikge1xuICAgIHJldHVybiAobGlzdGVuZXIuZmxhZ3MgJiA0IC8qIE9uY2UgKi8pID09PSA0IC8qIE9uY2UgKi87XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBsaXN0ZW5lciBoYXMgdGhlIGByZW1vdmVkYCBmbGFnIG9yIG5vdC5cbiAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzUmVtb3ZlZChsaXN0ZW5lcikge1xuICAgIHJldHVybiAobGlzdGVuZXIuZmxhZ3MgJiA4IC8qIFJlbW92ZWQgKi8pID09PSA4IC8qIFJlbW92ZWQgKi87XG59XG4vKipcbiAqIENhbGwgYW4gZXZlbnQgbGlzdGVuZXIuXG4gKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGNhbGwuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgb2JqZWN0IGZvciBgdGhpc0FyZ2AuXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IG9iamVjdCBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50LlxuICogQHBhcmFtIGF0dHJpYnV0ZSBgdHJ1ZWAgaWYgdGhpcyBjYWxsYmFjayBpcyBhbiBldmVudCBhdHRyaWJ1dGUgaGFuZGxlci5cbiAqL1xuZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2soeyBjYWxsYmFjayB9LCB0YXJnZXQsIGV2ZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRhcmdldCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjYWxsYmFjay5oYW5kbGVFdmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjYWxsYmFjay5oYW5kbGVFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKHRocm93bkVycm9yKSB7XG4gICAgICAgIHJlcG9ydEVycm9yKHRocm93bkVycm9yKTtcbiAgICB9XG59XG5cbi8qKlxuICogRmluZCB0aGUgaW5kZXggb2YgZ2l2ZW4gbGlzdGVuZXIuXG4gKiBUaGlzIHJldHVybnMgYC0xYCBpZiBub3QgZm91bmQuXG4gKiBAcGFyYW0gbGlzdCBUaGUgbGlzdGVuZXIgbGlzdC5cbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZmluZC5cbiAqIEBwYXJhbSBjYXB0dXJlIFRoZSBjYXB0dXJlIGZsYWcgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4T2ZMaXN0ZW5lcih7IGxpc3RlbmVycyB9LCBjYWxsYmFjaywgY2FwdHVyZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lcnNbaV0uY2FsbGJhY2sgPT09IGNhbGxiYWNrICYmXG4gICAgICAgICAgICBpc0NhcHR1cmUobGlzdGVuZXJzW2ldKSA9PT0gY2FwdHVyZSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIGxpc3RlbmVyLlxuICogRG9lcyBjb3B5LW9uLXdyaXRlIGlmIG5lZWRlZC5cbiAqIEBwYXJhbSBsaXN0IFRoZSBsaXN0ZW5lciBsaXN0LlxuICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqIEBwYXJhbSBjYXB0dXJlIFRoZSBjYXB0dXJlIGZsYWcuXG4gKiBAcGFyYW0gcGFzc2l2ZSBUaGUgcGFzc2l2ZSBmbGFnLlxuICogQHBhcmFtIG9uY2UgVGhlIG9uY2UgZmxhZy5cbiAqIEBwYXJhbSBzaWduYWwgVGhlIGFib3J0IHNpZ25hbC5cbiAqL1xuZnVuY3Rpb24gYWRkTGlzdGVuZXIobGlzdCwgY2FsbGJhY2ssIGNhcHR1cmUsIHBhc3NpdmUsIG9uY2UsIHNpZ25hbCkge1xuICAgIGxldCBzaWduYWxMaXN0ZW5lcjtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgIHNpZ25hbExpc3RlbmVyID0gcmVtb3ZlTGlzdGVuZXIuYmluZChudWxsLCBsaXN0LCBjYWxsYmFjaywgY2FwdHVyZSk7XG4gICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgc2lnbmFsTGlzdGVuZXIpO1xuICAgIH1cbiAgICBjb25zdCBsaXN0ZW5lciA9IGNyZWF0ZUxpc3RlbmVyKGNhbGxiYWNrLCBjYXB0dXJlLCBwYXNzaXZlLCBvbmNlLCBzaWduYWwsIHNpZ25hbExpc3RlbmVyKTtcbiAgICBpZiAobGlzdC5jb3cpIHtcbiAgICAgICAgbGlzdC5jb3cgPSBmYWxzZTtcbiAgICAgICAgbGlzdC5saXN0ZW5lcnMgPSBbLi4ubGlzdC5saXN0ZW5lcnMsIGxpc3RlbmVyXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxpc3QubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdGVuZXI7XG59XG4vKipcbiAqIFJlbW92ZSBhIGxpc3RlbmVyLlxuICogQHBhcmFtIGxpc3QgVGhlIGxpc3RlbmVyIGxpc3QuXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGZpbmQuXG4gKiBAcGFyYW0gY2FwdHVyZSBUaGUgY2FwdHVyZSBmbGFnIHRvIGZpbmQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgbXV0YXRlZCB0aGUgbGlzdCBkaXJlY3RseS5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIobGlzdCwgY2FsbGJhY2ssIGNhcHR1cmUpIHtcbiAgICBjb25zdCBpbmRleCA9IGZpbmRJbmRleE9mTGlzdGVuZXIobGlzdCwgY2FsbGJhY2ssIGNhcHR1cmUpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJlbW92ZUxpc3RlbmVyQXQobGlzdCwgaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIFJlbW92ZSBhIGxpc3RlbmVyLlxuICogQHBhcmFtIGxpc3QgVGhlIGxpc3RlbmVyIGxpc3QuXG4gKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSB0YXJnZXQgbGlzdGVuZXIuXG4gKiBAcGFyYW0gZGlzYWJsZUNvdyBEaXNhYmxlIGNvcHktb24td3JpdGUgaWYgdHJ1ZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBtdXRhdGVkIHRoZSBgbGlzdGVuZXJzYCBhcnJheSBkaXJlY3RseS5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJBdChsaXN0LCBpbmRleCwgZGlzYWJsZUNvdyA9IGZhbHNlKSB7XG4gICAgY29uc3QgbGlzdGVuZXIgPSBsaXN0Lmxpc3RlbmVyc1tpbmRleF07XG4gICAgLy8gU2V0IHRoZSByZW1vdmVkIGZsYWcuXG4gICAgc2V0UmVtb3ZlZChsaXN0ZW5lcik7XG4gICAgLy8gRGlzcG9zZSB0aGUgYWJvcnQgc2lnbmFsIGxpc3RlbmVyIGlmIGV4aXN0cy5cbiAgICBpZiAobGlzdGVuZXIuc2lnbmFsKSB7XG4gICAgICAgIGxpc3RlbmVyLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgbGlzdGVuZXIuc2lnbmFsTGlzdGVuZXIpO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXG4gICAgaWYgKGxpc3QuY293ICYmICFkaXNhYmxlQ293KSB7XG4gICAgICAgIGxpc3QuY293ID0gZmFsc2U7XG4gICAgICAgIGxpc3QubGlzdGVuZXJzID0gbGlzdC5saXN0ZW5lcnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGlzdC5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgYExpc3RlbmVyTGlzdE1hcGAgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjcmVhdGVMaXN0ZW5lckxpc3RNYXAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG4vKipcbiAqIEdldCB0aGUgbGlzdGVuZXIgbGlzdCBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIElmIHRoZSBsaXN0ZW5lciBsaXN0IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCwgaW5pdGlhbGl6ZSBhbmQgcmV0dXJuIGl0LlxuICogQHBhcmFtIGxpc3RlbmVyTWFwIFRoZSBsaXN0ZW5lciBsaXN0IG1hcC5cbiAqIEBwYXJhbSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGdldC5cbiAqL1xuZnVuY3Rpb24gZW5zdXJlTGlzdGVuZXJMaXN0KGxpc3RlbmVyTWFwLCB0eXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoKF9hID0gbGlzdGVuZXJNYXBbdHlwZV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChsaXN0ZW5lck1hcFt0eXBlXSA9IHtcbiAgICAgICAgYXR0ckNhbGxiYWNrOiB1bmRlZmluZWQsXG4gICAgICAgIGF0dHJMaXN0ZW5lcjogdW5kZWZpbmVkLFxuICAgICAgICBjb3c6IGZhbHNlLFxuICAgICAgICBsaXN0ZW5lcnM6IFtdLFxuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2UuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZXZlbnR0YXJnZXRcbiAqL1xuY2xhc3MgRXZlbnRUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhpcyBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhTWFwJDIuc2V0KHRoaXMsIGNyZWF0ZUxpc3RlbmVyTGlzdE1hcCgpKTtcbiAgICB9XG4gICAgLy8gSW1wbGVtZW50YXRpb25cbiAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUwLCBjYWxsYmFjazAsIG9wdGlvbnMwKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyTWFwID0gJCQyKHRoaXMpO1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBjYXB0dXJlLCBvbmNlLCBwYXNzaXZlLCBzaWduYWwsIHR5cGUsIH0gPSBub3JtYWxpemVBZGRPcHRpb25zKHR5cGUwLCBjYWxsYmFjazAsIG9wdGlvbnMwKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwgfHwgKHNpZ25hbCA9PT0gbnVsbCB8fCBzaWduYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNpZ25hbC5hYm9ydGVkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpc3QgPSBlbnN1cmVMaXN0ZW5lckxpc3QobGlzdGVuZXJNYXAsIHR5cGUpO1xuICAgICAgICAvLyBGaW5kIGV4aXN0aW5nIGxpc3RlbmVyLlxuICAgICAgICBjb25zdCBpID0gZmluZEluZGV4T2ZMaXN0ZW5lcihsaXN0LCBjYWxsYmFjaywgY2FwdHVyZSk7XG4gICAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICAgICAgd2FybkR1cGxpY2F0ZShsaXN0Lmxpc3RlbmVyc1tpXSwgcGFzc2l2ZSwgb25jZSwgc2lnbmFsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGQgdGhlIG5ldyBsaXN0ZW5lci5cbiAgICAgICAgYWRkTGlzdGVuZXIobGlzdCwgY2FsbGJhY2ssIGNhcHR1cmUsIHBhc3NpdmUsIG9uY2UsIHNpZ25hbCk7XG4gICAgfVxuICAgIC8vIEltcGxlbWVudGF0aW9uXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlMCwgY2FsbGJhY2swLCBvcHRpb25zMCkge1xuICAgICAgICBjb25zdCBsaXN0ZW5lck1hcCA9ICQkMih0aGlzKTtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgY2FwdHVyZSwgdHlwZSB9ID0gbm9ybWFsaXplT3B0aW9ucyh0eXBlMCwgY2FsbGJhY2swLCBvcHRpb25zMCk7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBsaXN0ZW5lck1hcFt0eXBlXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgbGlzdCkge1xuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdCwgY2FsbGJhY2ssIGNhcHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEltcGxlbWVudGF0aW9uXG4gICAgZGlzcGF0Y2hFdmVudChlKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSAkJDIodGhpcylbU3RyaW5nKGUudHlwZSldO1xuICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudCA9IGUgaW5zdGFuY2VvZiBFdmVudCA/IGUgOiBFdmVudFdyYXBwZXIud3JhcChlKTtcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gJChldmVudCwgXCJldmVudFwiKTtcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5kaXNwYXRjaEZsYWcpIHtcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUludmFsaWRTdGF0ZUVycm9yKFwiVGhpcyBldmVudCBoYXMgYmVlbiBpbiBkaXNwYXRjaGluZy5cIik7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnREYXRhLmRpc3BhdGNoRmxhZyA9IHRydWU7XG4gICAgICAgIGV2ZW50RGF0YS50YXJnZXQgPSBldmVudERhdGEuY3VycmVudFRhcmdldCA9IHRoaXM7XG4gICAgICAgIGlmICghZXZlbnREYXRhLnN0b3BQcm9wYWdhdGlvbkZsYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY293LCBsaXN0ZW5lcnMgfSA9IGxpc3Q7XG4gICAgICAgICAgICAvLyBTZXQgY29weS1vbi13cml0ZSBmbGFnLlxuICAgICAgICAgICAgbGlzdC5jb3cgPSB0cnVlO1xuICAgICAgICAgICAgLy8gQ2FsbCBsaXN0ZW5lcnMuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgcmVtb3ZlZC5cbiAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdmVkKGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgbGlzdGVuZXIgaWYgaGFzIHRoZSBgb25jZWAgZmxhZy5cbiAgICAgICAgICAgICAgICBpZiAoaXNPbmNlKGxpc3RlbmVyKSAmJiByZW1vdmVMaXN0ZW5lckF0KGxpc3QsIGksICFjb3cpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhpcyBsaXN0ZW5lciB3YXMgcmVtb3ZlZCwgdGhlIG5leHQgaW5kZXggaXMgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgYXMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ2FsbCB0aGlzIGxpc3RlbmVyIHdpdGggdGhlIGBwYXNzaXZlYCBmbGFnLlxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5pblBhc3NpdmVMaXN0ZW5lckZsYWcgPSBpc1Bhc3NpdmUobGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgIGludm9rZUNhbGxiYWNrKGxpc3RlbmVyLCB0aGlzLCBldmVudCk7XG4gICAgICAgICAgICAgICAgZXZlbnREYXRhLmluUGFzc2l2ZUxpc3RlbmVyRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIFN0b3AgaWYgdGhlIGBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKWAgbWV0aG9kIHdhcyBjYWxsZWQuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50RGF0YS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25GbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlc3RvcmUgY29weS1vbi13cml0ZSBmbGFnLlxuICAgICAgICAgICAgaWYgKCFjb3cpIHtcbiAgICAgICAgICAgICAgICBsaXN0LmNvdyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV2ZW50RGF0YS50YXJnZXQgPSBudWxsO1xuICAgICAgICBldmVudERhdGEuY3VycmVudFRhcmdldCA9IG51bGw7XG4gICAgICAgIGV2ZW50RGF0YS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25GbGFnID0gZmFsc2U7XG4gICAgICAgIGV2ZW50RGF0YS5zdG9wUHJvcGFnYXRpb25GbGFnID0gZmFsc2U7XG4gICAgICAgIGV2ZW50RGF0YS5kaXNwYXRjaEZsYWcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuICFldmVudERhdGEuY2FuY2VsZWRGbGFnO1xuICAgIH1cbn1cbi8qKlxuICogSW50ZXJuYWwgZGF0YS5cbiAqL1xuY29uc3QgaW50ZXJuYWxEYXRhTWFwJDIgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBHZXQgcHJpdmF0ZSBkYXRhLlxuICogQHBhcmFtIHRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IG9iamVjdCB0byBnZXQgcHJpdmF0ZSBkYXRhLlxuICogQHBhcmFtIG5hbWUgVGhlIHZhcmlhYmxlIG5hbWUgdG8gcmVwb3J0LlxuICogQHJldHVybnMgVGhlIHByaXZhdGUgZGF0YSBvZiB0aGUgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uICQkMih0YXJnZXQsIG5hbWUgPSBcInRoaXNcIikge1xuICAgIGNvbnN0IHJldHYgPSBpbnRlcm5hbERhdGFNYXAkMi5nZXQodGFyZ2V0KTtcbiAgICBhc3NlcnRUeXBlKHJldHYgIT0gbnVsbCwgXCInJXMnIG11c3QgYmUgYW4gb2JqZWN0IHRoYXQgRXZlbnRUYXJnZXQgY29uc3RydWN0b3IgY3JlYXRlZCwgYnV0IGdvdCBhbm90aGVyIG9uZTogJW9cIiwgbmFtZSwgdGFyZ2V0KTtcbiAgICByZXR1cm4gcmV0djtcbn1cbi8qKlxuICogTm9ybWFsaXplIG9wdGlvbnMuXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBub3JtYWxpemUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFkZE9wdGlvbnModHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgYXNzZXJ0Q2FsbGJhY2soY2FsbGJhY2spO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJvYmplY3RcIiAmJiBvcHRpb25zICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcodHlwZSksXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2sgIT09IG51bGwgJiYgY2FsbGJhY2sgIT09IHZvaWQgMCA/IGNhbGxiYWNrIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2FwdHVyZTogQm9vbGVhbihvcHRpb25zLmNhcHR1cmUpLFxuICAgICAgICAgICAgcGFzc2l2ZTogQm9vbGVhbihvcHRpb25zLnBhc3NpdmUpLFxuICAgICAgICAgICAgb25jZTogQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICAgICAgc2lnbmFsOiAoX2EgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBTdHJpbmcodHlwZSksXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayAhPT0gbnVsbCAmJiBjYWxsYmFjayAhPT0gdm9pZCAwID8gY2FsbGJhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgIGNhcHR1cmU6IEJvb2xlYW4ob3B0aW9ucyksXG4gICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICBvbmNlOiBmYWxzZSxcbiAgICAgICAgc2lnbmFsOiB1bmRlZmluZWQsXG4gICAgfTtcbn1cbi8qKlxuICogTm9ybWFsaXplIG9wdGlvbnMuXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBub3JtYWxpemUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbnModHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBhc3NlcnRDYWxsYmFjayhjYWxsYmFjayk7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcIm9iamVjdFwiICYmIG9wdGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyh0eXBlKSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayAhPT0gbnVsbCAmJiBjYWxsYmFjayAhPT0gdm9pZCAwID8gY2FsbGJhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjYXB0dXJlOiBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFN0cmluZyh0eXBlKSxcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrICE9PSBudWxsICYmIGNhbGxiYWNrICE9PSB2b2lkIDAgPyBjYWxsYmFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgY2FwdHVyZTogQm9vbGVhbihvcHRpb25zKSxcbiAgICB9O1xufVxuLyoqXG4gKiBBc3NlcnQgdGhlIHR5cGUgb2YgJ2NhbGxiYWNrJyBhcmd1bWVudC5cbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGFzc2VydENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgICh0eXBlb2YgY2FsbGJhY2sgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGNhbGxiYWNrICE9PSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2YgY2FsbGJhY2suaGFuZGxlRXZlbnQgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCB8fCB0eXBlb2YgY2FsbGJhY2sgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgSW52YWxpZEV2ZW50TGlzdGVuZXIud2FybihjYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihmb3JtYXQoSW52YWxpZEV2ZW50TGlzdGVuZXIubWVzc2FnZSwgW2NhbGxiYWNrXSkpO1xufVxuLyoqXG4gKiBQcmludCB3YXJuaW5nIGZvciBkdXBsaWNhdGVkLlxuICogQHBhcmFtIGxpc3RlbmVyIFRoZSBjdXJyZW50IGxpc3RlbmVyIHRoYXQgaXMgZHVwbGljYXRlZC5cbiAqIEBwYXJhbSBwYXNzaXZlIFRoZSBwYXNzaXZlIGZsYWcgb2YgdGhlIG5ldyBkdXBsaWNhdGVkIGxpc3RlbmVyLlxuICogQHBhcmFtIG9uY2UgVGhlIG9uY2UgZmxhZyBvZiB0aGUgbmV3IGR1cGxpY2F0ZWQgbGlzdGVuZXIuXG4gKiBAcGFyYW0gc2lnbmFsIFRoZSBzaWduYWwgb2JqZWN0IG9mIHRoZSBuZXcgZHVwbGljYXRlZCBsaXN0ZW5lci5cbiAqL1xuZnVuY3Rpb24gd2FybkR1cGxpY2F0ZShsaXN0ZW5lciwgcGFzc2l2ZSwgb25jZSwgc2lnbmFsKSB7XG4gICAgRXZlbnRMaXN0ZW5lcldhc0R1cGxpY2F0ZWQud2Fybihpc0NhcHR1cmUobGlzdGVuZXIpID8gXCJjYXB0dXJlXCIgOiBcImJ1YmJsZVwiLCBsaXN0ZW5lci5jYWxsYmFjayk7XG4gICAgaWYgKGlzUGFzc2l2ZShsaXN0ZW5lcikgIT09IHBhc3NpdmUpIHtcbiAgICAgICAgT3B0aW9uV2FzSWdub3JlZC53YXJuKFwicGFzc2l2ZVwiKTtcbiAgICB9XG4gICAgaWYgKGlzT25jZShsaXN0ZW5lcikgIT09IG9uY2UpIHtcbiAgICAgICAgT3B0aW9uV2FzSWdub3JlZC53YXJuKFwib25jZVwiKTtcbiAgICB9XG4gICAgaWYgKGxpc3RlbmVyLnNpZ25hbCAhPT0gc2lnbmFsKSB7XG4gICAgICAgIE9wdGlvbldhc0lnbm9yZWQud2FybihcInNpZ25hbFwiKTtcbiAgICB9XG59XG4vLyBTZXQgZW51bWVyYWJsZVxuY29uc3Qga2V5cyQxID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRXZlbnRUYXJnZXQucHJvdG90eXBlKTtcbmZvciAobGV0IGkgPSAwOyBpIDwga2V5cyQxLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGtleXMkMVtpXSA9PT0gXCJjb25zdHJ1Y3RvclwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRUYXJnZXQucHJvdG90eXBlLCBrZXlzJDFbaV0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn1cbi8vIEVuc3VyZSBgZXZlbnRUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuRXZlbnRUYXJnZXRgIGlzIGB0cnVlYC5cbmlmICh0eXBlb2YgR2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgdHlwZW9mIEdsb2JhbC5FdmVudFRhcmdldCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihFdmVudFRhcmdldC5wcm90b3R5cGUsIEdsb2JhbC5FdmVudFRhcmdldC5wcm90b3R5cGUpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIGdpdmVuIGV2ZW50IGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGBFdmVudFRhcmdldGAgb2JqZWN0IHRvIGdldC5cbiAqIEBwYXJhbSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICovXG5mdW5jdGlvbiBnZXRFdmVudEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgdHlwZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3QgbGlzdE1hcCA9ICQkMih0YXJnZXQsIFwidGFyZ2V0XCIpO1xuICAgIHJldHVybiAoX2IgPSAoX2EgPSBsaXN0TWFwW3R5cGVdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXR0ckNhbGxiYWNrKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBudWxsO1xufVxuLyoqXG4gKiBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBnaXZlbiBldmVudCBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSBgRXZlbnRUYXJnZXRgIG9iamVjdCB0byBzZXQuXG4gKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgZXZlbnQgbGlzdGVuZXIuXG4gKi9cbmZ1bmN0aW9uIHNldEV2ZW50QXR0cmlidXRlVmFsdWUodGFyZ2V0LCB0eXBlLCBjYWxsYmFjaykge1xuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIEludmFsaWRBdHRyaWJ1dGVIYW5kbGVyLndhcm4oY2FsbGJhY2spO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgICAgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJvYmplY3RcIiAmJiBjYWxsYmFjayAhPT0gbnVsbCkpIHtcbiAgICAgICAgdXBzZXJ0RXZlbnRBdHRyaWJ1dGVMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlbW92ZUV2ZW50QXR0cmlidXRlTGlzdGVuZXIodGFyZ2V0LCB0eXBlKTtcbiAgICB9XG59XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogVXBkYXRlIG9yIGluc2VydCB0aGUgZ2l2ZW4gZXZlbnQgYXR0cmlidXRlIGhhbmRsZXIuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSBgRXZlbnRUYXJnZXRgIG9iamVjdCB0byBzZXQuXG4gKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgZXZlbnQgbGlzdGVuZXIuXG4gKi9cbmZ1bmN0aW9uIHVwc2VydEV2ZW50QXR0cmlidXRlTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGxpc3QgPSBlbnN1cmVMaXN0ZW5lckxpc3QoJCQyKHRhcmdldCwgXCJ0YXJnZXRcIiksIFN0cmluZyh0eXBlKSk7XG4gICAgbGlzdC5hdHRyQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICBpZiAobGlzdC5hdHRyTGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICBsaXN0LmF0dHJMaXN0ZW5lciA9IGFkZExpc3RlbmVyKGxpc3QsIGRlZmluZUV2ZW50QXR0cmlidXRlQ2FsbGJhY2sobGlzdCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGdpdmVuIGV2ZW50IGF0dHJpYnV0ZSBoYW5kbGVyLlxuICogQHBhcmFtIHRhcmdldCBUaGUgYEV2ZW50VGFyZ2V0YCBvYmplY3QgdG8gcmVtb3ZlLlxuICogQHBhcmFtIHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGV2ZW50IGxpc3RlbmVyLlxuICovXG5mdW5jdGlvbiByZW1vdmVFdmVudEF0dHJpYnV0ZUxpc3RlbmVyKHRhcmdldCwgdHlwZSkge1xuICAgIGNvbnN0IGxpc3RNYXAgPSAkJDIodGFyZ2V0LCBcInRhcmdldFwiKTtcbiAgICBjb25zdCBsaXN0ID0gbGlzdE1hcFtTdHJpbmcodHlwZSldO1xuICAgIGlmIChsaXN0ICYmIGxpc3QuYXR0ckxpc3RlbmVyKSB7XG4gICAgICAgIHJlbW92ZUxpc3RlbmVyKGxpc3QsIGxpc3QuYXR0ckxpc3RlbmVyLmNhbGxiYWNrLCBmYWxzZSk7XG4gICAgICAgIGxpc3QuYXR0ckNhbGxiYWNrID0gbGlzdC5hdHRyTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBEZWZpbmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbGlzdGVuZXIgbGlzdCBvYmplY3QuXG4gKiBJdCBjYWxscyBgYXR0ckNhbGxiYWNrYCBwcm9wZXJ0eSBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgYSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBsaXN0IFRoZSBgTGlzdGVuZXJMaXN0YCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUV2ZW50QXR0cmlidXRlQ2FsbGJhY2sobGlzdCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBsaXN0LmF0dHJDYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qKlxuICogRGVmaW5lIGFuIGBFdmVudFRhcmdldGAgY2xhc3MgdGhhdCBoYXMgZXZlbnQgYXR0aWJ1dGVzLlxuICogQHBhcmFtIHR5cGVzIFRoZSB0eXBlcyB0byBkZWZpbmUgZXZlbnQgYXR0cmlidXRlcy5cbiAqIEBkZXByZWNhdGVkIFVzZSBgZ2V0RXZlbnRBdHRyaWJ1dGVWYWx1ZWAvYHNldEV2ZW50QXR0cmlidXRlVmFsdWVgIHBhaXIgb24geW91ciBkZXJpdmVkIGNsYXNzIGluc3RlYWQgYmVjYXVzZSBvZiBzdGF0aWMgYW5hbHlzaXMgZnJpZW5kbHkuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KC4uLnR5cGVzKSB7XG4gICAgY2xhc3MgQ3VzdG9tRXZlbnRUYXJnZXQgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGVmaW5lRXZlbnRBdHRyaWJ1dGUoQ3VzdG9tRXZlbnRUYXJnZXQucHJvdG90eXBlLCB0eXBlc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBDdXN0b21FdmVudFRhcmdldDtcbn1cbi8qKlxuICogRGVmaW5lIGFuIGV2ZW50IGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGBFdmVudFRhcmdldGAgb2JqZWN0IHRvIGRlZmluZSBhbiBldmVudCBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBkZWZpbmUuXG4gKiBAcGFyYW0gX2V2ZW50Q2xhc3MgVW51c2VkLCBidXQgdG8gaW5mZXIgYEV2ZW50YCBjbGFzcyB0eXBlLlxuICogQGRlcHJlY2F0ZWQgVXNlIGBnZXRFdmVudEF0dHJpYnV0ZVZhbHVlYC9gc2V0RXZlbnRBdHRyaWJ1dGVWYWx1ZWAgcGFpciBvbiB5b3VyIGRlcml2ZWQgY2xhc3MgaW5zdGVhZCBiZWNhdXNlIG9mIHN0YXRpYyBhbmFseXNpcyBmcmllbmRseS5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lRXZlbnRBdHRyaWJ1dGUodGFyZ2V0LCB0eXBlLCBfZXZlbnRDbGFzcykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGBvbiR7dHlwZX1gLCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRFdmVudEF0dHJpYnV0ZVZhbHVlKHRoaXMsIHR5cGUpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgIHNldEV2ZW50QXR0cmlidXRlVmFsdWUodGhpcywgdHlwZSwgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50VGFyZ2V0O1xuZXhwb3J0IHsgRXZlbnQsIEV2ZW50VGFyZ2V0LCBkZWZpbmVDdXN0b21FdmVudFRhcmdldCwgZGVmaW5lRXZlbnRBdHRyaWJ1dGUsIGdldEV2ZW50QXR0cmlidXRlVmFsdWUsIHNldEVycm9ySGFuZGxlciwgc2V0RXZlbnRBdHRyaWJ1dGVWYWx1ZSwgc2V0V2FybmluZ0hhbmRsZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsImltcG9ydCB7IENhbGVuZGFyRXZlbnQgfSBmcm9tIFwiLi9DYWxlbmRhckV2ZW50XCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRzRm9yRGF5KGV2ZW50czogQ2FsZW5kYXJFdmVudFtdLCBkYXRlOiBEYXRlKTogQ2FsZW5kYXJFdmVudFtdIHtcclxuICByZXR1cm4gZXZlbnRzLmZpbHRlcihldmVudCA9PiB7XHJcbiAgICByZXR1cm4gZXZlbnQuZGF0ZS5nZXRGdWxsWWVhcigpID09PSBkYXRlLmdldEZ1bGxZZWFyKCkgJiZcclxuICAgICAgZXZlbnQuZGF0ZS5nZXRNb250aCgpID09PSBkYXRlLmdldE1vbnRoKCkgJiZcclxuICAgICAgZXZlbnQuZGF0ZS5nZXREYXRlKCkgPT09IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gIH0pLnNvcnQoKGEsIGIpID0+IHtcclxuICAgIC8vIElmIG9uZSBoYXMgbm8gdGltZSBwcm9wZXJ0eSwgaXQgc2hvdWxkIGJlIGZpcnN0LlxyXG4gICAgLy8gSWYgYm90aCBoYXZlIG5vIHRpbWUsIG5vIHNvcnRpbmcgaXMgbmVlZGVkLlxyXG4gICAgaWYgKCFhLnRpbWUgJiYgISFiLnRpbWUpIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfSBlbHNlIGlmICghIWEudGltZSAmJiAhYi50aW1lKSB7XHJcbiAgICAgIHJldHVybiAxO1xyXG4gICAgfSBlbHNlIGlmICghYS50aW1lICYmICFiLnRpbWUpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU29ydCB0aGUgZXZlbnRzIGJ5IHRpbWUuIFRpbWVzIGFyZSBzdHJpbmdzIGluIDI0XHJcbiAgICAvLyBmb3JtYXRzLCBzbyBqdXN0IHJlbW92ZSB0aGUgbGVhZGluZyAwLCBpZiBhbnksIGFuZFxyXG4gICAgLy8gdGhlIGNvbG9uLCBhbmQgY29tcGFyZSB0aGUgbnVtYmVycy5cclxuICAgIGNvbnN0IGFUaW1lID0gcGFyc2VJbnQoYS50aW1lLnJlcGxhY2UoL14wLywgJycpLnJlcGxhY2UoJzonLCAnJykpO1xyXG4gICAgY29uc3QgYlRpbWUgPSBwYXJzZUludChiLnRpbWUucmVwbGFjZSgvXjAvLCAnJykucmVwbGFjZSgnOicsICcnKSk7XHJcbiAgICByZXR1cm4gYVRpbWUgLSBiVGltZTtcclxuICB9KS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAvLyBTb3J0IHRoZSBldmVudHMgdGhhdCBhcmUgbXVsdGktZGF5cyBmaXJzdC5cclxuICAgIGlmICghIWEubXVsdGlEYXlzICYmICFiLm11bHRpRGF5cykge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9IGVsc2UgaWYgKCFhLm11bHRpRGF5cyAmJiAhIWIubXVsdGlEYXlzKSB7XHJcbiAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbiIsImltcG9ydCB7IEV2ZW50VGFyZ2V0LCBFdmVudCB9IGZyb20gXCJldmVudC10YXJnZXQtc2hpbVwiO1xyXG5pbXBvcnQgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSBcIi4vQ2FsZW5kYXJFdmVudFwiO1xyXG5pbXBvcnQgeyBnZXRFdmVudHNGb3JEYXkgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuY29uc3QgREFZUyA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTtcclxuXHJcbmV4cG9ydCBjbGFzcyBNb250aEdyaWQgZXh0ZW5kcyBFdmVudFRhcmdldCB7XHJcbiAgcHJpdmF0ZSByb290RWw6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgX2RhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIHByaXZhdGUgX2V2ZW50czogQ2FsZW5kYXJFdmVudFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBIVE1MRWxlbWVudCwgZGF0ZTogRGF0ZSwgZXZlbnRzOiBDYWxlbmRhckV2ZW50W10pIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy5yb290RWwgPSBlbDtcclxuICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5fZXZlbnRzID0gZXZlbnRzO1xyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG4gIFxyXG4gIHJlbmRlcigpIHtcclxuICAgIHRoaXMucm9vdEVsLmlubmVySFRNTCA9ICcnO1xyXG5cclxuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5fZGF0ZS5nZXRNb250aCgpO1xyXG4gICAgY29uc3QgeWVhciA9IHRoaXMuX2RhdGUuZ2V0RnVsbFllYXIoKTtcclxuICBcclxuICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG4gICAgY29uc3QgbGFzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCk7XHJcbiAgXHJcbiAgICBjb25zdCBmaXJzdFdlZWtkYXkgPSBmaXJzdERheS5nZXREYXkoKTtcclxuICAgIGNvbnN0IGxhc3RXZWVrZGF5ID0gbGFzdERheS5nZXREYXkoKTtcclxuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbGFzdERheS5nZXREYXRlKCk7XHJcbiAgICBjb25zdCBkYXlzSW5MYXN0TW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMCkuZ2V0RGF0ZSgpO1xyXG4gICAgY29uc3QgZGF5czoge2RhdGU6IERhdGUsIGh0bWw6IHN0cmluZ31bXSA9IFtdO1xyXG4gIFxyXG4gICAgbGV0IGluZGV4SW5HcmlkID0gMDtcclxuXHJcbiAgICAvLyBEYXlzIGZyb20gbGFzdCBtb250aFxyXG4gICAgZm9yIChsZXQgaSA9IGRheXNJbkxhc3RNb250aCAtIGZpcnN0V2Vla2RheSArIDE7IGkgPD0gZGF5c0luTGFzdE1vbnRoOyBpKyspIHtcclxuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgaSk7XHJcbiAgICAgIGRheXMucHVzaCh7ZGF0ZSwgaHRtbDogdGhpcy5yZW5kZXJEYXkoZGF0ZSwgaSwgaW5kZXhJbkdyaWQsICdwcmV2LW1vbnRoJyl9KTtcclxuICAgICAgaW5kZXhJbkdyaWQrKztcclxuICAgIH1cclxuICBcclxuICAgIC8vIERheXMgZnJvbSB0aGlzIG1vbnRoXHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkYXlzSW5Nb250aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgaSk7XHJcbiAgICAgIGRheXMucHVzaCh7ZGF0ZSwgaHRtbDogdGhpcy5yZW5kZXJEYXkoZGF0ZSwgaSwgaW5kZXhJbkdyaWQpfSk7XHJcbiAgICAgIGluZGV4SW5HcmlkKys7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBEYXlzIGZyb20gbmV4dCBtb250aFxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNyAtIGxhc3RXZWVrZGF5IC0gMTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIGkpO1xyXG4gICAgICBkYXlzLnB1c2goe2RhdGUsIGh0bWw6IHRoaXMucmVuZGVyRGF5KGRhdGUsIGksIGluZGV4SW5HcmlkLCAnbmV4dC1tb250aCcpfSk7XHJcbiAgICAgIGluZGV4SW5HcmlkKys7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCB7ZGF0ZSwgaHRtbH0gb2YgZGF5cykge1xyXG4gICAgICB0aGlzLnJvb3RFbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWwpO1xyXG4gICAgICBjb25zdCBkYXlFbCA9IHRoaXMucm9vdEVsLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICBkYXlFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RheS1jbGlja2VkJywge2RldGFpbDogZGF0ZX0pKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVOb3dNYXJrZXIoKTtcclxuICB9XHJcblxyXG4gIHJlbmRlckRheShkYXRlOiBEYXRlLCBkYXlOdW1iZXI6IG51bWJlciwgaW5kZXhJbkdyaWQ6IG51bWJlciwgY2xhc3NOYW1lOiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBldmVudHMgPSBnZXRFdmVudHNGb3JEYXkodGhpcy5fZXZlbnRzLCBkYXRlKTtcclxuICAgIGNvbnN0IGlzVG9kYXkgPSBkYXRlLnRvRGF0ZVN0cmluZygpID09PSBuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpO1xyXG5cclxuICAgIHJldHVybiBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYXkgJHtpc1RvZGF5ID8gJ3RvZGF5JyA6ICcnfSAke2NsYXNzTmFtZX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRheS1uYW1lXCI+JHtEQVlTW2RhdGUuZ2V0RGF5KCldfTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF5LW51bWJlclwiPiR7ZGF5TnVtYmVyfTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJldmVudHNcIj5cclxuICAgICAgICAgICR7ZXZlbnRzLm1hcChldmVudCA9PiBldmVudC5hc09uZUxpbmVIVE1MKGluZGV4SW5HcmlkKSkuam9pbignJyl9XHJcbiAgICAgICAgPC91bD5cclxuICAgICAgPC9kaXY+XHJcbiAgICBgO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTm93TWFya2VyKCkge1xyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IHRpbWUgPSBub3cuZ2V0SG91cnMoKSAqIDEwMCArIG5vdy5nZXRNaW51dGVzKCk7XHJcbiAgICBjb25zdCByYXRpbyA9IHRpbWUgKiAxMDAgLyAyNDAwO1xyXG5cclxuICAgIC8vIEZvcmNpbmcgYSBzeW5jIHJlZmxvdyBoZXJlIGJ5IHF1ZXJ5aW5nIHRoZSBvZmZzZXRIZWlnaHQgb2YgdGhlIGRheSBjZWxsLlxyXG4gICAgLy8gQ291bGQganVzdCBzZXQgdGhlICUgdmFsdWUgZGlyZWN0bHkgaW5zdGVhZC5cclxuICAgIGNvbnN0IGRheUVsID0gdGhpcy5yb290RWwucXVlcnlTZWxlY3RvcignLmRheS50b2RheScpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKGRheUVsKSB7XHJcbiAgICAgIGNvbnN0IHB4SGVpZ2h0ID0gZGF5RWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICBjb25zdCBtYXJrZXJIZWlnaHQgPSBweEhlaWdodCAqIHJhdGlvIC8gMTAwO1xyXG5cclxuICAgICAgdGhpcy5yb290RWwuc3R5bGUuc2V0UHJvcGVydHkoJy0tbm93LW1hcmtlcicsIGAke21hcmtlckhlaWdodH1weGApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVOb3dNYXJrZXIoKSwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl9kYXRlID0gZGF0ZTtcclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBzZXQgZXZlbnRzKGV2ZW50czogQ2FsZW5kYXJFdmVudFtdKSB7XHJcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHM7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBFdmVudFRhcmdldCwgRXZlbnQgfSBmcm9tIFwiZXZlbnQtdGFyZ2V0LXNoaW1cIjtcclxuXHJcbmNvbnN0IE1PTlRIUyA9IFtcclxuICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsXHJcbiAgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywnRGVjZW1iZXInXHJcbl07XHJcblxyXG5leHBvcnQgY2xhc3MgVG9vbGJhciBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcclxuICBwcml2YXRlIHJvb3RFbDogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfZGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIHNlbGVjdGVkTW9kZTogc3RyaW5nID0gXCJtb250aFwiO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBIVE1MRWxlbWVudCwgZGF0ZTogRGF0ZSwgbW9kZTogc3RyaW5nKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMucm9vdEVsID0gZWw7XHJcbiAgICB0aGlzLl9kYXRlID0gZGF0ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRNb2RlID0gbW9kZTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0TW9udGhZZWFyKCkge1xyXG4gICAgY29uc3QgbW9udGggPSB0aGlzLl9kYXRlLmdldE1vbnRoKCk7XHJcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5fZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgcmV0dXJuIGAke01PTlRIU1ttb250aF19ICR7eWVhcn1gO1xyXG4gIH1cclxuICBcclxuICByZW5kZXIoKSB7XHJcbiAgICB0aGlzLnJvb3RFbC5pbm5lckhUTUwgPSBgXHJcbiAgICAgIDxidXR0b24gaWQ9XCJwcmV2LW1vbnRoXCI+UHJldjwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGlkPVwidG9kYXlcIiBjbGFzcz1cInByaW1hcnlcIj5Ub2RheTwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGlkPVwibmV4dC1tb250aFwiPk5leHQ8L2J1dHRvbj5cclxuICAgICAgPHNwYW4gaWQ9XCJtb250aC15ZWFyXCI+JHt0aGlzLmZvcm1hdE1vbnRoWWVhcigpfTwvc3Bhbj5cclxuICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ2aWV3XCIgaWQ9XCJtb250aC12aWV3XCIgJHt0aGlzLnNlbGVjdGVkTW9kZSA9PT0gXCJtb250aFwiID8gXCJjaGVja2VkXCIgOiBcIlwifT5cclxuICAgICAgPGxhYmVsIGZvcj1cIm1vbnRoLXZpZXdcIj5Nb250aDwvbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwidmlld1wiIGlkPVwid2Vlay12aWV3XCIgJHt0aGlzLnNlbGVjdGVkTW9kZSA9PT0gXCJ3ZWVrXCIgPyBcImNoZWNrZWRcIiA6IFwiXCJ9PlxyXG4gICAgICA8bGFiZWwgZm9yPVwid2Vlay12aWV3XCI+V2VlazwvbGFiZWw+ICAgICAgXHJcbiAgICBgO1xyXG5cclxuICAgIHRoaXMucm9vdEVsLnF1ZXJ5U2VsZWN0b3IoJyNwcmV2LW1vbnRoJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBQcmV2ICR7dGhpcy5zZWxlY3RlZE1vZGV9IGNsaWNrZWRgKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncHJldicpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucm9vdEVsLnF1ZXJ5U2VsZWN0b3IoJyNuZXh0LW1vbnRoJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBOZXh0ICR7dGhpcy5zZWxlY3RlZE1vZGV9IGNsaWNrZWRgKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbmV4dCcpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucm9vdEVsLnF1ZXJ5U2VsZWN0b3IoJyN0b2RheScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIlRvZGF5IGNsaWNrZWRcIik7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3RvZGF5JykpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yb290RWwucXVlcnlTZWxlY3RvcignI21vbnRoLXZpZXcnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coXCJNb250aCB2aWV3IGNsaWNrZWRcIik7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ21vbnRoLXZpZXcnKSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlID0gXCJtb250aFwiO1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIHRoaXMucm9vdEVsLnF1ZXJ5U2VsZWN0b3IoJyN3ZWVrLXZpZXcnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coXCJXZWVrIHZpZXcgY2xpY2tlZFwiKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnd2Vlay12aWV3JykpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTW9kZSA9IFwid2Vla1wiO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl9kYXRlID0gZGF0ZTtcclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IENhbGVuZGFyRXZlbnQgfSBmcm9tIFwiLi9DYWxlbmRhckV2ZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2lkZWJhciB7XHJcbiAgcHJpdmF0ZSByb290RWw6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgX2V2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gW107XHJcbiAgcHJpdmF0ZSBfZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEhUTUxFbGVtZW50LCBkYXRlOiBEYXRlLCBldmVudHM6IENhbGVuZGFyRXZlbnRbXSkge1xyXG4gICAgdGhpcy5yb290RWwgPSBlbDtcclxuICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5fZXZlbnRzID0gZXZlbnRzO1xyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG4gIFxyXG4gIHJlbmRlcigpIHtcclxuICAgIHRoaXMucm9vdEVsLmlubmVySFRNTCA9IGBcclxuICAgICAgPGgyPkNsaWNrIGEgZGF5IHRvIHZpZXcgZXZlbnRzPC9oMj5cclxuICAgIGA7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9ldmVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJvb3RFbC5pbm5lckhUTUwgPSAnJztcclxuXHJcbiAgICBjb25zdCB1bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB1bC5jbGFzc05hbWUgPSAnZXZlbnRzJztcclxuICAgIHRoaXMucm9vdEVsLmFwcGVuZENoaWxkKHVsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHRoaXMuX2V2ZW50cykge1xyXG4gICAgICB1bC5pbm5lckhUTUwgKz0gZXZlbnQuYXNGdWxsSFRNTCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IGV2ZW50cyhldmVudHM6IENhbGVuZGFyRXZlbnRbXSkge1xyXG4gICAgdGhpcy5fZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRXZlbnRUYXJnZXQsIEV2ZW50IH0gZnJvbSBcImV2ZW50LXRhcmdldC1zaGltXCI7XHJcbmltcG9ydCB7IENhbGVuZGFyRXZlbnQgfSBmcm9tIFwiLi9DYWxlbmRhckV2ZW50XCI7XHJcbmltcG9ydCB7IGdldEV2ZW50c0ZvckRheSB9IGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5jb25zdCBEQVlTID0gWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdlZWtHcmlkIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xyXG4gIHByaXZhdGUgcm9vdEVsOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIF9kYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuICBwcml2YXRlIF9ldmVudHM6IENhbGVuZGFyRXZlbnRbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogSFRNTEVsZW1lbnQsIGRhdGU6IERhdGUsIGV2ZW50czogQ2FsZW5kYXJFdmVudFtdKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMucm9vdEVsID0gZWw7XHJcbiAgICB0aGlzLl9kYXRlID0gZGF0ZTtcclxuICAgIHRoaXMuX2V2ZW50cyA9IGV2ZW50cztcclxuXHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuICBcclxuICByZW5kZXIoKSB7XHJcbiAgICB0aGlzLnJvb3RFbC5pbm5lckhUTUwgPSAnJztcclxuXHJcbiAgICAvLyBGaW5kIHRoZSBkYXRlcyB0aGF0IG1ha2UgdGhlIHdlZWsgYXJvdW5kIHRoaXMuX2RhdGUuXHJcbiAgICBjb25zdCBtb250aCA9IHRoaXMuX2RhdGUuZ2V0TW9udGgoKTtcclxuICAgIGNvbnN0IHllYXIgPSB0aGlzLl9kYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZS5nZXREYXRlKCk7XHJcbiAgICBjb25zdCBkYXkgPSB0aGlzLl9kYXRlLmdldERheSgpO1xyXG5cclxuICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGRhdGUgLSBkYXkpO1xyXG5cclxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgZGF0ZXMgYW5kIHJlbmRlciB0aGUgZGF5cy5cclxuICAgIGNvbnN0IGRheXM6IHtkYXRlOiBEYXRlLCBodG1sOiBzdHJpbmd9W10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZmlyc3REYXkuZ2V0RGF0ZSgpICsgaSk7XHJcbiAgICAgIHRoaXMucm9vdEVsLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgdGhpcy5yZW5kZXJEYXkoZGF0ZSwgZGF0ZS5nZXREYXRlKCkpKTtcclxuXHJcbiAgICAgIGNvbnN0IGRheUVsID0gdGhpcy5yb290RWwubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgZGF5RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZTogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkYXktY2xpY2tlZCcsIHtkZXRhaWw6IGRhdGV9KSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlTm93TWFya2VyKCk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJEYXkoZGF0ZTogRGF0ZSwgZGF5TnVtYmVyOiBudW1iZXIsIGNsYXNzTmFtZTogc3RyaW5nID0gJycpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RXZlbnRzRm9yRGF5KHRoaXMuX2V2ZW50cywgZGF0ZSk7XHJcbiAgICBjb25zdCBpc1RvZGF5ID0gZGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gbmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKTtcclxuXHJcbiAgICByZXR1cm4gYFxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGF5ICR7aXNUb2RheSA/ICd0b2RheScgOiAnJ30gJHtjbGFzc05hbWV9XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXktbmFtZVwiPiR7REFZU1tkYXRlLmdldERheSgpXX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRheS1udW1iZXJcIj4ke2RheU51bWJlcn08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwiZXZlbnRzXCI+XHJcbiAgICAgICAgICAke2V2ZW50cy5tYXAoZXZlbnQgPT4gZXZlbnQuYXNNZWRpdW1MZW5ndGhIVE1MKCkpLmpvaW4oJycpfVxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgYDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU5vd01hcmtlcigpIHtcclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCB0aW1lID0gbm93LmdldEhvdXJzKCkgKiAxMDAgKyBub3cuZ2V0TWludXRlcygpO1xyXG4gICAgY29uc3QgcmF0aW8gPSB0aW1lICogMTAwIC8gMjQwMDtcclxuXHJcbiAgICAvLyBGb3JjaW5nIGEgc3luYyByZWZsb3cgaGVyZSBieSBxdWVyeWluZyB0aGUgb2Zmc2V0SGVpZ2h0IG9mIHRoZSBkYXkgY2VsbC5cclxuICAgIC8vIENvdWxkIGp1c3Qgc2V0IHRoZSAlIHZhbHVlIGRpcmVjdGx5IGluc3RlYWQuXHJcbiAgICBjb25zdCBkYXlFbCA9IHRoaXMucm9vdEVsLnF1ZXJ5U2VsZWN0b3IoJy5kYXkudG9kYXknKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChkYXlFbCkge1xyXG4gICAgICBjb25zdCBweEhlaWdodCA9IGRheUVsLm9mZnNldEhlaWdodDtcclxuICAgICAgY29uc3QgbWFya2VySGVpZ2h0ID0gcHhIZWlnaHQgKiByYXRpbyAvIDEwMDtcclxuXHJcbiAgICAgIHRoaXMucm9vdEVsLnN0eWxlLnNldFByb3BlcnR5KCctLW5vdy1tYXJrZXInLCBgJHttYXJrZXJIZWlnaHR9cHhgKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlTm93TWFya2VyKCksIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRhdGUoZGF0ZTogRGF0ZSkge1xyXG4gICAgdGhpcy5fZGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgc2V0IGV2ZW50cyhldmVudHM6IENhbGVuZGFyRXZlbnRbXSkge1xyXG4gICAgdGhpcy5fZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRXZlbnRUYXJnZXQsIEV2ZW50IH0gZnJvbSBcImV2ZW50LXRhcmdldC1zaGltXCI7XHJcbmltcG9ydCB7IENhbGVuZGFyRXZlbnQgfSBmcm9tIFwiLi9DYWxlbmRhckV2ZW50XCI7XHJcbmltcG9ydCB7IE1vbnRoR3JpZCB9IGZyb20gXCIuL01vbnRoR3JpZFwiO1xyXG5pbXBvcnQgeyBUb29sYmFyIH0gZnJvbSBcIi4vVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBTaWRlYmFyIH0gZnJvbSBcIi4vU2lkZWJhclwiO1xyXG5pbXBvcnQgeyBnZXRFdmVudHNGb3JEYXkgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBXZWVrR3JpZCB9IGZyb20gXCIuL1dlZWtHcmlkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXBwVUkgZXh0ZW5kcyBFdmVudFRhcmdldCB7XHJcbiAgcHJpdmF0ZSByb290RWw6IEhUTUxFbGVtZW50O1xyXG5cclxuICBwcml2YXRlIG1vbnRoR3JpZEVsOiBIVE1MRWxlbWVudDtcclxuICBwdWJsaWMgbW9udGhHcmlkOiBNb250aEdyaWQ7XHJcblxyXG4gIHByaXZhdGUgd2Vla0dyaWRFbDogSFRNTEVsZW1lbnQ7XHJcbiAgcHVibGljIHdlZWtHcmlkOiBXZWVrR3JpZDtcclxuXHJcbiAgcHJpdmF0ZSB0b29sYmFyRWw6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgdG9vbGJhcjogVG9vbGJhcjtcclxuXHJcbiAgcHJpdmF0ZSBzaWRlYmFyRWw6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgc2lkZWJhcjogU2lkZWJhcjtcclxuXHJcbiAgcHJpdmF0ZSBfZGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIF9ldmVudHM6IENhbGVuZGFyRXZlbnRbXTtcclxuXHJcbiAgcHJpdmF0ZSBtb2RlOiBzdHJpbmcgPSBcIm1vbnRoXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsOiBIVE1MRWxlbWVudCwgZGF0ZTogRGF0ZSwgbW9kZTogc3RyaW5nLCBldmVudHM6IENhbGVuZGFyRXZlbnRbXSkge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLnJvb3RFbCA9IGVsO1xyXG4gICAgdGhpcy5fZGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHM7XHJcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICB0aGlzLnJvb3RFbC5pbm5lckhUTUwgPSAnJztcclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gZWxlbWVudCBmb3IgdGhlIHRvb2xiYXIuXHJcbiAgICB0aGlzLnRvb2xiYXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy50b29sYmFyRWwuaWQgPSAndG9vbGJhcic7XHJcbiAgICB0aGlzLnJvb3RFbC5hcHBlbmRDaGlsZCh0aGlzLnRvb2xiYXJFbCk7XHJcblxyXG4gICAgLy8gSW5pdCB0aGUgdG9vbGJhciBjb21wb25lbnQgaW4gaXQuXHJcbiAgICB0aGlzLnRvb2xiYXIgPSBuZXcgVG9vbGJhcih0aGlzLnRvb2xiYXJFbCwgdGhpcy5fZGF0ZSwgdGhpcy5tb2RlKTtcclxuXHJcbiAgICB0aGlzLnRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcigncHJldicsICgpID0+IHtcclxuICAgICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMubW9kZSA9PT0gXCJtb250aFwiXHJcbiAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLl9kYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuX2RhdGUuZ2V0TW9udGgoKSAtIDEsIDEpXHJcbiAgICAgICAgOiBuZXcgRGF0ZSh0aGlzLl9kYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuX2RhdGUuZ2V0TW9udGgoKSwgdGhpcy5fZGF0ZS5nZXREYXRlKCkgLSA3KTtcclxuICAgICAgdGhpcy5kYXRlID0gbmV3RGF0ZTtcclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZGF0ZS1jaGFuZ2VkJywge2RldGFpbDogdGhpcy5fZGF0ZX0pKTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICB0aGlzLnRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcignbmV4dCcsICgpID0+IHtcclxuICAgICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMubW9kZSA9PT0gXCJtb250aFwiXHJcbiAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLl9kYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuX2RhdGUuZ2V0TW9udGgoKSArIDEsIDEpXHJcbiAgICAgICAgOiBuZXcgRGF0ZSh0aGlzLl9kYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuX2RhdGUuZ2V0TW9udGgoKSwgdGhpcy5fZGF0ZS5nZXREYXRlKCkgKyA3KTtcclxuICAgICAgdGhpcy5kYXRlID0gbmV3RGF0ZTtcclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZGF0ZS1jaGFuZ2VkJywge2RldGFpbDogdGhpcy5fZGF0ZX0pKTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICB0aGlzLnRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcigndG9kYXknLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RhdGUtY2hhbmdlZCcsIHtkZXRhaWw6IHRoaXMuX2RhdGV9KSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcignbW9udGgtdmlldycsICgpID0+IHtcclxuICAgICAgdGhpcy5tb2RlID0gXCJtb250aFwiO1xyXG4gICAgICB0aGlzLm1vbnRoR3JpZEVsLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XHJcbiAgICAgIHRoaXMud2Vla0dyaWRFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdtb2RlLWNoYW5nZWQnLCB7ZGV0YWlsOiB0aGlzLm1vZGV9KSk7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgdGhpcy50b29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ3dlZWstdmlldycsICgpID0+IHtcclxuICAgICAgdGhpcy5tb2RlID0gXCJ3ZWVrXCI7XHJcbiAgICAgIHRoaXMubW9udGhHcmlkRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgdGhpcy53ZWVrR3JpZEVsLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XHJcblxyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21vZGUtY2hhbmdlZCcsIHtkZXRhaWw6IHRoaXMubW9kZX0pKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhbiBlbGVtZW50IGZvciB0aGUgbW9udGggZ3JpZC5cclxuICAgIHRoaXMubW9udGhHcmlkRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9udGhHcmlkRWwuaWQgPSAnbW9udGgtZ3JpZCc7XHJcbiAgICB0aGlzLnJvb3RFbC5hcHBlbmRDaGlsZCh0aGlzLm1vbnRoR3JpZEVsKTtcclxuXHJcbiAgICAvLyBJbml0IHRoZSBtb250aCBncmlkIGNvbXBvbmVudCBpbiBpdC5cclxuICAgIHRoaXMubW9udGhHcmlkID0gbmV3IE1vbnRoR3JpZCh0aGlzLm1vbnRoR3JpZEVsLCB0aGlzLl9kYXRlLCB0aGlzLl9ldmVudHMpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhbiBlbGVtZW50IGZvciB0aGUgd2VlayBncmlkLlxyXG4gICAgdGhpcy53ZWVrR3JpZEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLndlZWtHcmlkRWwuaWQgPSAnd2Vlay1ncmlkJztcclxuICAgIHRoaXMucm9vdEVsLmFwcGVuZENoaWxkKHRoaXMud2Vla0dyaWRFbCk7XHJcblxyXG4gICAgLy8gSW5pdCB0aGUgd2VlayBncmlkIGNvbXBvbmVudCBpbiBpdC5cclxuICAgIHRoaXMud2Vla0dyaWQgPSBuZXcgV2Vla0dyaWQodGhpcy53ZWVrR3JpZEVsLCB0aGlzLl9kYXRlLCB0aGlzLl9ldmVudHMpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhbiBlbGVtZW50IGZvciB0aGUgc2lkZWJhci5cclxuICAgIHRoaXMuc2lkZWJhckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnNpZGViYXJFbC5pZCA9ICdzaWRlYmFyJztcclxuICAgIHRoaXMucm9vdEVsLmFwcGVuZENoaWxkKHRoaXMuc2lkZWJhckVsKTtcclxuXHJcbiAgICAvLyBJbml0IHRoZSBzaWRlYmFyIGNvbXBvbmVudCBpbiBpdC5cclxuICAgIHRoaXMuc2lkZWJhciA9IG5ldyBTaWRlYmFyKHRoaXMuc2lkZWJhckVsLCB0aGlzLl9kYXRlLCB0aGlzLl9ldmVudHMpO1xyXG5cclxuICAgIC8vIExpc3RlbiBmb3IgZGF5LWNsaWNrZWQgZXZlbnRzIGZyb20gdGhlIG1vbnRoIGFuZCB3ZWVrIGdyaWRzIHRvIHNob3cgdGhlIGZ1bGxcclxuICAgIC8vIGxpc3QgaW4gdGhlIHNpZGViYXIuXHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICB0aGlzLm1vbnRoR3JpZC5hZGRFdmVudExpc3RlbmVyKCdkYXktY2xpY2tlZCcsIChlOiBDdXN0b21FdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRlID0gZS5kZXRhaWw7XHJcbiAgICAgIGNvbnN0IGV2ZW50cyA9IGdldEV2ZW50c0ZvckRheSh0aGlzLl9ldmVudHMsIGRhdGUpO1xyXG4gICAgICB0aGlzLnNpZGViYXIuZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgfSk7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICB0aGlzLndlZWtHcmlkLmFkZEV2ZW50TGlzdGVuZXIoJ2RheS1jbGlja2VkJywgKGU6IEN1c3RvbUV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBlLmRldGFpbDtcclxuICAgICAgY29uc3QgZXZlbnRzID0gZ2V0RXZlbnRzRm9yRGF5KHRoaXMuX2V2ZW50cywgZGF0ZSk7XHJcbiAgICAgIHRoaXMuc2lkZWJhci5ldmVudHMgPSBldmVudHM7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTdGFydCB3aXRoIHRvZGF5LlxyXG4gICAgdGhpcy5zaWRlYmFyLmV2ZW50cyA9IGdldEV2ZW50c0ZvckRheSh0aGlzLl9ldmVudHMsIG5ldyBEYXRlKCkpO1xyXG5cclxuICAgIC8vIFNob3cvaGlkZSB0aGUgcmlnaHQgbW9kZVxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gXCJ3ZWVrXCIpIHtcclxuICAgICAgdGhpcy5tb250aEdyaWRFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICB0aGlzLndlZWtHcmlkRWwuc3R5bGUuZGlzcGxheSA9ICdncmlkJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubW9udGhHcmlkRWwuc3R5bGUuZGlzcGxheSA9ICdncmlkJztcclxuICAgICAgdGhpcy53ZWVrR3JpZEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIlNldHRpbmcgZGF0ZSB0b1wiLCBkYXRlKTtcclxuICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5tb250aEdyaWQuZGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLndlZWtHcmlkLmRhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy50b29sYmFyLmRhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5zaWRlYmFyLmV2ZW50cyA9IGdldEV2ZW50c0ZvckRheSh0aGlzLl9ldmVudHMsIHRoaXMuX2RhdGUpO1xyXG4gIH1cclxuXHJcbiAgc2V0IGV2ZW50cyhldmVudHM6IENhbGVuZGFyRXZlbnRbXSkge1xyXG4gICAgdGhpcy5fZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgdGhpcy5tb250aEdyaWQuZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgdGhpcy53ZWVrR3JpZC5ldmVudHMgPSBldmVudHM7XHJcbiAgICB0aGlzLnNpZGViYXIuZXZlbnRzID0gZ2V0RXZlbnRzRm9yRGF5KHRoaXMuX2V2ZW50cywgdGhpcy5fZGF0ZSk7XHJcbiAgfVxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBDYWxlbmRhckV2ZW50IHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgZGF0ZTogRGF0ZTtcclxuICB0aW1lOiBzdHJpbmd8dW5kZWZpbmVkO1xyXG4gIGR1cmF0aW9uOiBudW1iZXJ8dW5kZWZpbmVkO1xyXG4gIHJlcGVhdDogc3RyaW5nfHVuZGVmaW5lZDtcclxuICBkZXNjcmlwdGlvbjogc3RyaW5nfHVuZGVmaW5lZDtcclxuICBjb2xvcjogc3RyaW5nfHVuZGVmaW5lZDtcclxuICBsb2NhdGlvbjogc3RyaW5nfHVuZGVmaW5lZDtcclxuICBtdWx0aURheXM6IHtzdGFydDogRGF0ZSwgZW5kOiBEYXRlfXxudWxsO1xyXG4gIHJzdnA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IodGl0bGU6IHN0cmluZywgaWQ6IHN0cmluZywgZGF0ZTogRGF0ZSkge1xyXG4gICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgdGhpcy5kYXRlID0gZGF0ZTtcclxuICB9XHJcblxyXG4gIGFzT25lTGluZUhUTUwoaW5kZXhJbkdyaWQ6IG51bWJlcnx1bmRlZmluZWQgPSB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGltZSA9IHRoaXMudGltZSA/IGA8c3BhbiBjbGFzcz1cInRpbWVcIj4ke3RoaXMudGltZX08L3NwYW4+YCA6ICcnO1xyXG5cclxuICAgIHJldHVybiBgXHJcbiAgICAgIDxsaSBpZD1cImlkLSR7dGhpcy5pZH1cIiBkYXRhLWluZGV4LWluLWdyaWQ9XCIke2luZGV4SW5HcmlkfVwiIGNsYXNzPVwiZXZlbnQkeyEhdGhpcy5tdWx0aURheXMgPyBcIiBtdWx0aS1kYXlcIiA6IFwiXCJ9JHt0aGlzLnJzdnAgPyBcIlwiIDogXCIgdW5jb25maXJtZWRcIn1cIiBzdHlsZT1cIi0tZXZlbnQtY29sb3I6ICR7dGhpcy5jb2xvcn07XCI+XHJcbiAgICAgICAgPGRpdj4ke3RpbWV9IDxzcGFuIGNsYXNzPVwidGl0bGVcIj4ke3RoaXMudGl0bGV9PC9zcGFuPjwvZGl2PlxyXG4gICAgICA8L2xpPlxyXG4gICAgYDtcclxuICB9XHJcblxyXG4gIGFzTWVkaXVtTGVuZ3RoSFRNTCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGltZSA9IHRoaXMudGltZSA/IGA8c3BhbiBjbGFzcz1cInRpbWVcIj4ke3RoaXMudGltZX08L3NwYW4+YCA6ICcnO1xyXG5cclxuICAgIHJldHVybiBgXHJcbiAgICAgIDxsaSBpZD1cImlkLSR7dGhpcy5pZH1cIiBjbGFzcz1cImV2ZW50JHshIXRoaXMubXVsdGlEYXlzID8gXCIgbXVsdGktZGF5XCIgOiBcIlwifSR7dGhpcy5yc3ZwID8gXCJcIiA6IFwiIHVuY29uZmlybWVkXCJ9XCIgc3R5bGU9XCItLWV2ZW50LWNvbG9yOiAke3RoaXMuY29sb3J9O1wiPlxyXG4gICAgICAgIDxkaXY+JHt0aW1lfTwvZGl2PlxyXG4gICAgICAgIDxwIGNsYXNzPVwidGl0bGVcIj4ke3RoaXMudGl0bGV9PC9wPlxyXG4gICAgICAgIDxwPiR7dGhpcy5kZXNjcmlwdGlvbn08L3A+XHJcbiAgICAgIDwvbGk+XHJcbiAgICBgO1xyXG4gIH1cclxuXHJcbiAgYXNGdWxsSFRNTCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHdoZW4gPSBcIlwiO1xyXG4gICAgICBcclxuICAgIGlmICghdGhpcy5tdWx0aURheXMpIHtcclxuICAgICAgd2hlbiA9IHRoaXMuZGF0ZS50b0RhdGVTdHJpbmcoKTtcclxuICAgICAgaWYgKHRoaXMudGltZSkge1xyXG4gICAgICAgIHdoZW4gKz0gYCwgYXQgJHt0aGlzLnRpbWV9YDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5yZXBlYXQpIHtcclxuICAgICAgICB3aGVuICs9IGAsICR7dGhpcy5yZXBlYXR9YDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kdXJhdGlvbikge1xyXG4gICAgICAgIHdoZW4gKz0gYCAoJHt0aGlzLmR1cmF0aW9ufSBtaW51dGVzKWA7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoZW4gPSBgRnJvbSAke3RoaXMubXVsdGlEYXlzLnN0YXJ0LnRvRGF0ZVN0cmluZygpfSB0byAke3RoaXMubXVsdGlEYXlzLmVuZC50b0RhdGVTdHJpbmcoKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBgXHJcbiAgICAgIDxsaSBjbGFzcz1cImV2ZW50JHt0aGlzLnJzdnAgPyBcIlwiIDogXCIgdW5jb25maXJtZWRcIn1cIiBzdHlsZT1cIi0tZXZlbnQtY29sb3I6ICR7dGhpcy5jb2xvcn07XCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxoMj4ke3RoaXMudGl0bGV9PC9oMj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwid2hlblwiPiR7d2hlbn08L3A+XHJcbiAgICAgICAgICAke3RoaXMubG9jYXRpb24gPyBgPHAgY2xhc3M9XCJ3aGVyZVwiPiR7dGhpcy5sb2NhdGlvbn08L3A+YCA6IFwiXCJ9XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIndoYXRcIj4ke3RoaXMuZGVzY3JpcHRpb259PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2xpPlxyXG4gICAgYDtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gXCIuL0NhbGVuZGFyRXZlbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFdmVudFBvcHVwIHtcclxuICBwcml2YXRlIHBvcHVwRWw6IEhUTUxFbGVtZW50fHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBldmVudHM6IENhbGVuZGFyRXZlbnRbXSkge31cclxuXHJcbiAgc3RhcnQoKSB7XHJcbiAgICBpZiAoIXRoaXMucG9wdXBFbCkge1xyXG4gICAgICB0aGlzLnBvcHVwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICB0aGlzLnBvcHVwRWwuY2xhc3NOYW1lID0gXCJwb3B1cFwiO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMucG9wdXBFbC5jbGFzc0xpc3QucmVtb3ZlKFwidmlzaWJsZVwiKTtcclxuICAgICAgdGhpcy5wb3B1cEVsLnJlbW92ZSgpO1xyXG5cclxuICAgICAgY29uc3QgZXZlbnRFbCA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcIiNtb250aC1ncmlkIC5ldmVudCwgI3dlZWstZ3JpZCAuZXZlbnRcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGlmICghZXZlbnRFbCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaWQgPSBldmVudEVsLmlkO1xyXG5cclxuICAgICAgaWYgKCFpZCB8fCAhaWQuc3RhcnRzV2l0aChcImlkLVwiKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGV2ZW50SWQgPSBpZC5yZXBsYWNlKFwiaWQtXCIsIFwiXCIpO1xyXG5cclxuICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmV2ZW50cy5maW5kKGV2ZW50ID0+IGV2ZW50LmlkID09PSBldmVudElkKTsgICAgICBcclxuICAgICAgaWYgKCFldmVudCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZXZlbnQgZm91bmQgZm9yIGlkXCIsIGV2ZW50SWQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZXZlbnRJbmRleEluR3JpZCA9IHBhcnNlSW50KGV2ZW50RWwuZGF0YXNldC5pbmRleEluR3JpZCEpO1xyXG5cclxuICAgICAgdGhpcy5wb3B1cEVsLnN0eWxlLnNldFByb3BlcnR5KFwiLS1ldmVudC1jb2xvclwiLCBldmVudC5jb2xvcik7XHJcbiAgICAgIHRoaXMucG9wdXBFbC5jbGFzc0xpc3QudG9nZ2xlKFwidmlzaWJsZVwiLCB0cnVlKTtcclxuICAgICAgdGhpcy5wb3B1cEVsLmNsYXNzTGlzdC50b2dnbGUoXCJ1bmNvbmZpcm1lZFwiLCAhZXZlbnQucnN2cCk7XHJcblxyXG4gICAgICBsZXQgd2hlbiA9IFwiXCI7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoIWV2ZW50Lm11bHRpRGF5cykge1xyXG4gICAgICAgIHdoZW4gPSBldmVudC5kYXRlLnRvRGF0ZVN0cmluZygpO1xyXG4gICAgICAgIGlmIChldmVudC50aW1lKSB7XHJcbiAgICAgICAgICB3aGVuICs9IGAsIGF0ICR7ZXZlbnQudGltZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZlbnQucmVwZWF0KSB7XHJcbiAgICAgICAgICB3aGVuICs9IGAsICR7ZXZlbnQucmVwZWF0fWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChldmVudC5kdXJhdGlvbikge1xyXG4gICAgICAgICAgd2hlbiArPSBgICgke2V2ZW50LmR1cmF0aW9ufSBtaW51dGVzKWA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHdoZW4gPSBgRnJvbSAke2V2ZW50Lm11bHRpRGF5cy5zdGFydC50b0RhdGVTdHJpbmcoKX0gdG8gJHtldmVudC5tdWx0aURheXMuZW5kLnRvRGF0ZVN0cmluZygpfWA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucG9wdXBFbC5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgPGgyPiR7ZXZlbnQudGl0bGV9PC9oMj5cclxuICAgICAgICA8cCBjbGFzcz1cIndoZW5cIj4ke3doZW59PC9wPlxyXG4gICAgICAgICR7ZXZlbnQubG9jYXRpb24gPyBgPHAgY2xhc3M9XCJ3aGVyZVwiPiR7ZXZlbnQubG9jYXRpb259PC9wPmAgOiBcIlwifVxyXG4gICAgICAgIDxwIGNsYXNzPVwid2hhdFwiPiR7ZXZlbnQuZGVzY3JpcHRpb259PC9wPlxyXG4gICAgICBgO1xyXG5cclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnBvcHVwRWwpO1xyXG5cclxuICAgICAgLy8gR2V0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZXZlbnQgZWxlbWVudC5cclxuICAgICAgY29uc3QgcmVjdCA9IGV2ZW50RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IHRvcCA9IHJlY3QudG9wO1xyXG4gICAgICBjb25zdCByaWdodCA9IHJlY3QucmlnaHQ7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSByZWN0LmxlZnQ7XHJcbiAgICAgIGNvbnN0IHdpZHRoID0gcmVjdC53aWR0aDtcclxuXHJcbiAgICAgIGlmIChldmVudEluZGV4SW5HcmlkID49IDI4KSB7XHJcbiAgICAgICAgLy8gVGhlIGV2ZW50IGlzIGluIHRoZSBsYXN0IDIgcm93cy4gU2hvdyB0aGUgcG9wdXAgYWJvdmUgaXQuXHJcbiAgICAgICAgdGhpcy5wb3B1cEVsLnN0eWxlLnRvcCA9IGAke3RvcCAtIHRoaXMucG9wdXBFbC5jbGllbnRIZWlnaHR9cHhgO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucG9wdXBFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnRJbmRleEluR3JpZCA9PT0gNiB8fCBldmVudEluZGV4SW5HcmlkID09PSAxMyB8fCBldmVudEluZGV4SW5HcmlkID09PSAyMCB8fCBldmVudEluZGV4SW5HcmlkID09PSAyNyB8fCBldmVudEluZGV4SW5HcmlkID09PSAzNCkge1xyXG4gICAgICAgIC8vIFRoZSBldmVudCBpcyBsYXN0IGluIGEgcm93LCBzbyB3ZSB3YW50IHRvIHNob3cgdGhlIHBvcHVwIHRvIHRoZSBsZWZ0IG9mIGl0LlxyXG4gICAgICAgIHRoaXMucG9wdXBFbC5zdHlsZS5sZWZ0ID0gYCR7bGVmdCAtIHdpZHRofXB4YDtcclxuICAgICAgICB0aGlzLnBvcHVwRWwuY2xhc3NMaXN0LnRvZ2dsZShcImxlZnRcIiwgdHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wb3B1cEVsLnN0eWxlLmxlZnQgPSBgJHtyaWdodH1weGA7XHJcbiAgICAgICAgdGhpcy5wb3B1cEVsLmNsYXNzTGlzdC50b2dnbGUoXCJsZWZ0XCIsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBTdG9yZSB7XHJcbiAgYXN5bmMgZ2V0U3RvcmVkUHJlZnMoKTogUHJvbWlzZTx7bW9kZTogc3RyaW5nLCBpbml0RGF0ZTogRGF0ZXx1bmRlZmluZWR9PiB7XHJcbiAgICAvLyBGYWtlIHNvbWUgcmFuZG9tIHRpbWUgKHVwIHRvIDI1MG1zKSB0byBzaW11bGF0ZSBhbiBBUEkgY2FsbC5cclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBNYXRoLnJhbmRvbSgpICogMjUwKSk7XHJcblxyXG4gICAgY29uc3QgbW9kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzbG93LWNhbC1tb2RlJyk7XHJcbiAgICBjb25zdCBpbml0RGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzbG93LWNhbC1pbml0RGF0ZScpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1vZGUsXHJcbiAgICAgIGluaXREYXRlOiBpbml0RGF0ZSA/IG5ldyBEYXRlKGluaXREYXRlKSA6IHVuZGVmaW5lZFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHNldCBtb2RlKG1vZGU6IHN0cmluZykge1xyXG4gICAgY29uc29sZS5sb2coXCJTdG9yaW5nIG1vZGUgcHJlZnNcIik7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2xvdy1jYWwtbW9kZScsIG1vZGUpO1xyXG4gIH1cclxuXHJcbiAgc2V0IGluaXREYXRlKGRhdGU6IERhdGUpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiU3RvcmluZyBkYXRlIHByZWZzXCIpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Nsb3ctY2FsLWluaXREYXRlJywgZGF0ZS50b0lTT1N0cmluZygpKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQXBwVUkgfSBmcm9tIFwiLi9BcHBVSVwiO1xyXG5pbXBvcnQgeyBnZXRBbGxFdmVudHMgfSBmcm9tIFwiLi9ldmVudHMtZmFjdG9yeVwiO1xyXG5pbXBvcnQgeyBFdmVudFBvcHVwIH0gZnJvbSBcIi4vRXZlbnRQb3B1cFwiO1xyXG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gXCIuL1N0b3JlXCI7XHJcblxyXG5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBhc3luYyAoKSA9PiB7XHJcbiAgY29uc3Qgc3RvcmUgPSBuZXcgU3RvcmUoKTtcclxuICBjb25zdCBwcmVmcyA9IGF3YWl0IHN0b3JlLmdldFN0b3JlZFByZWZzKCk7XHJcblxyXG4gIC8vIFRoaXMgaXMgd2hhdCB0aGUgY2FsZW5kYXIgd2lsbCBiZSBjZW50ZXJlZCBhcm91bmQgb24gbG9hZC5cclxuICBjb25zdCBpbml0RGF0ZSA9IHByZWZzLmluaXREYXRlIHx8IG5ldyBEYXRlKCk7XHJcbiAgY29uc3QgaW5pdE1vZGUgPSBwcmVmcy5tb2RlIHx8IFwibW9udGhcIjtcclxuXHJcbiAgY29uc3QgYXBwRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwJyk7XHJcbiAgY29uc3QgYXBwVUkgPSBuZXcgQXBwVUkoYXBwRWwhLCBpbml0RGF0ZSwgaW5pdE1vZGUsIFtdKTtcclxuXHJcbiAgY29uc3QgZXZlbnRzID0gYXdhaXQgZ2V0QWxsRXZlbnRzKClcclxuXHJcbiAgY29uc29sZS5sb2coXCJSZWZyZXNoaW5nIGNhbGVuZGFyIHdpdGggZXZlbnRzXCIpO1xyXG4gIGFwcFVJLmV2ZW50cyA9IGV2ZW50cztcclxuXHJcbiAgY29uc29sZS5sb2coXCJJbml0aWFsaXppbmcgdGhlIHBvcHVwIHV0aWxcIik7XHJcbiAgY29uc3QgcG9wdXAgPSBuZXcgRXZlbnRQb3B1cChldmVudHMpO1xyXG4gIHBvcHVwLnN0YXJ0KCk7XHJcblxyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBhcHBVSS5hZGRFdmVudExpc3RlbmVyKFwibW9kZS1jaGFuZ2VkXCIsIChlOiBDdXN0b21FdmVudCkgPT4ge1xyXG4gICAgc3RvcmUubW9kZSA9IGUuZGV0YWlsO1xyXG4gIH0pO1xyXG5cclxuICAvLyBAdHMtaWdub3JlXHJcbiAgYXBwVUkuYWRkRXZlbnRMaXN0ZW5lcihcImRhdGUtY2hhbmdlZFwiLCAoZTogQ3VzdG9tRXZlbnQpID0+IHtcclxuICAgIHN0b3JlLmluaXREYXRlID0gZS5kZXRhaWw7XHJcbiAgfSk7XHJcbn0pO1xyXG4iLCJpbXBvcnQgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSBcIi4vQ2FsZW5kYXJFdmVudFwiO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKCkge1xyXG4gIC8vIFNpbXVsYXRlIGEgc2xvd2VyIEFQSSBlbmRwb2ludCBjYWxsLlxyXG4gIGNvbnNvbGUubG9nKFwiRmV0Y2hpbmcgY2FsZW5kYXIgZGF0YSAuLi5cIik7XHJcbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIE1hdGgucmFuZG9tKCkgKiA1MDApKTtcclxuICAvLyBBZGRpbmcgYSBjYWNoZSBidXN0ZXIgdG8gdGhlIFVSTCB0byBmb3JjZSBhIHJlbG9hZCBvZiB0aGUgZGF0YS5cclxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAuL2RhdGEuanNvbj9jYWNoZUJ1c3Rlcj0ke0RhdGUubm93KCl9YCk7XHJcbiAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlT25lT3JNdWx0aXBsZUV2ZW50c0Zyb21EYXRhKGV2ZW50RGF0YTogYW55KTogQ2FsZW5kYXJFdmVudFtdIHsgIFxyXG4gIGNvbnN0IGRhdGVzOiBEYXRlW10gPSBbbmV3IERhdGUoZXZlbnREYXRhLnN0YXJ0RGF0ZSldO1xyXG4gIGxldCBtdWx0aURheXM6IHtzdGFydDogRGF0ZSwgZW5kOiBEYXRlfXxudWxsID0gbnVsbDtcclxuXHJcbiAgaWYgKGV2ZW50RGF0YS5yZXBlYXQpIHtcclxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKGV2ZW50RGF0YS5zdGFydERhdGUpO1xyXG5cclxuICAgIC8vIElmIHRoaXMgZXZlbnQgaXMgcmVwZWF0ZWQsIGl0IG11c3QgaGF2ZSBhbiBlbmQgZGF0ZS5cclxuICAgIGNvbnN0IGVuZERhdGUgPSBldmVudERhdGEuZW5kRGF0ZVxyXG4gICAgICAvLyBFaXRoZXIgdGhlIGVuZCBkYXRlIGlzIHNwZWNpZmllZC5cclxuICAgICAgPyBuZXcgRGF0ZShldmVudERhdGEuZW5kRGF0ZSlcclxuICAgICAgLy8gT3IgaXQncyA1IHllYXIgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUuXHJcbiAgICAgIDogbmV3IERhdGUoc3RhcnREYXRlLmdldFRpbWUoKSArIDUgKiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcclxuXHJcbiAgICBpZiAoZXZlbnREYXRhLnJlcGVhdCA9PT0gXCJkYWlseVwiKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRXhwYW5kaW5nIGRhaWx5IGV2ZW50IC4uLlwiKTtcclxuICAgICAgY29uc3QgZGF5cyA9IChlbmREYXRlLmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkYXlzOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoc3RhcnREYXRlLmdldFRpbWUoKSArIGkgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcclxuICAgICAgICAvLyBJZiBkYXRlIGlzIG9uIGEgd2VlayBlbmQsIHNraXAgaXQuXHJcbiAgICAgICAgaWYgKGRhdGUuZ2V0RGF5KCkgPT09IDAgfHwgZGF0ZS5nZXREYXkoKSA9PT0gNikge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRlcy5wdXNoKGRhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50RGF0YS5yZXBlYXQgPT09IFwid2Vla2x5XCIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFeHBhbmRpbmcgd2Vla2x5IGV2ZW50IC4uLlwiKTtcclxuICAgICAgY29uc3Qgd2Vla3MgPSAoZW5kRGF0ZS5nZXRUaW1lKCkgLSBzdGFydERhdGUuZ2V0VGltZSgpKSAvICgxMDAwICogNjAgKiA2MCAqIDI0ICogNyk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHdlZWtzOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoc3RhcnREYXRlLmdldFRpbWUoKSArIGkgKiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCk7XHJcbiAgICAgICAgZGF0ZXMucHVzaChkYXRlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChldmVudERhdGEucmVwZWF0ID09PSBcIm1vbnRobHlcIikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkV4cGFuZGluZyBtb250aGx5IGV2ZW50IC4uLlwiKTtcclxuICAgICAgY29uc3QgbW9udGhzID0gKGVuZERhdGUuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpKSAqIDEyICsgKGVuZERhdGUuZ2V0TW9udGgoKSAtIHN0YXJ0RGF0ZS5nZXRNb250aCgpKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbW9udGhzOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoc3RhcnREYXRlLmdldFRpbWUoKSk7XHJcbiAgICAgICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBpKTtcclxuICAgICAgICBkYXRlcy5wdXNoKGRhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50RGF0YS5yZXBlYXQgPT09IFwieWVhcmx5XCIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFeHBhbmRpbmcgeWVhcmx5IGV2ZW50IC4uLlwiKTtcclxuICAgICAgY29uc3QgeWVhcnMgPSBlbmREYXRlLmdldEZ1bGxZZWFyKCkgLSBzdGFydERhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0geWVhcnM7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUuZ2V0VGltZSgpKTtcclxuICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIGkpO1xyXG4gICAgICAgIGRhdGVzLnB1c2goZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2UgaWYgKGV2ZW50RGF0YS5lbmREYXRlKSB7XHJcbiAgICAvLyBJZiB0aGlzIGV2ZW50IGhhcyBhIHN0YXJ0IGFuZCBlbmQgZGF0ZSwgYnV0IGlzbid0IHJlcGVhdGVkLlxyXG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZXZlbnREYXRhLnN0YXJ0RGF0ZSk7XHJcbiAgICBjb25zdCBlbmREYXRlID0gbmV3IERhdGUoZXZlbnREYXRhLmVuZERhdGUpO1xyXG4gICAgY29uc3QgZGF5cyA9IChlbmREYXRlLmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGF5czsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUuZ2V0VGltZSgpICsgaSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xyXG4gICAgICBkYXRlcy5wdXNoKGRhdGUpO1xyXG4gICAgfVxyXG4gICAgbXVsdGlEYXlzID0ge3N0YXJ0OiBzdGFydERhdGUsIGVuZDogZW5kRGF0ZX07XHJcbiAgfVxyXG5cclxuXHJcbiAgcmV0dXJuIGRhdGVzLm1hcCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZXZlbnREYXRhLmlkICsgKGluZGV4ID4gMCA/IGAtJHtpbmRleH1gIDogXCJcIik7XHJcbiAgICBjb25zdCBldmVudCA9IG5ldyBDYWxlbmRhckV2ZW50KGV2ZW50RGF0YS50aXRsZSwgaWQsIGRhdGUpO1xyXG5cclxuICAgIGV2ZW50Lm11bHRpRGF5cyA9IG11bHRpRGF5cztcclxuXHJcbiAgICBldmVudC5jb2xvciA9IGV2ZW50RGF0YS5jb2xvcjtcclxuICAgIGV2ZW50LnRpbWUgPSBldmVudERhdGEuc3RhcnRUaW1lO1xyXG4gICAgZXZlbnQuZHVyYXRpb24gPSBldmVudERhdGEuZHVyYXRpb247XHJcbiAgICBldmVudC5yZXBlYXQgPSBldmVudERhdGEucmVwZWF0O1xyXG4gICAgZXZlbnQubG9jYXRpb24gPSBldmVudERhdGEubG9jYXRpb247XHJcbiAgICBldmVudC5kZXNjcmlwdGlvbiA9IGV2ZW50RGF0YS5kZXNjcmlwdGlvbjtcclxuICAgIGV2ZW50LnJzdnAgPSBldmVudERhdGEucnN2cDtcclxuXHJcbiAgICByZXR1cm4gZXZlbnQ7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBbGxFdmVudHMoKTogUHJvbWlzZTxDYWxlbmRhckV2ZW50W10+IHtcclxuICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hEYXRhKCk7XHJcblxyXG4gIGNvbnNvbGUubG9nKFwiUHJvY2Vzc2luZyBldmVudHMgLi4uXCIpO1xyXG4gIHJldHVybiBkYXRhLmV2ZW50cy5tYXAoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVPbmVPck11bHRpcGxlRXZlbnRzRnJvbURhdGEoZXZlbnQpO1xyXG4gIH0pLmZsYXQoKTtcclxufVxyXG4iXSwibmFtZXMiOlsiYXNzZXJ0VHlwZSIsImNvbmRpdGlvbiIsIm1lc3NhZ2UiLCJhcmdzIiwiVHlwZUVycm9yIiwiZm9ybWF0IiwiaSIsInJlcGxhY2UiLCJhbnlUb1N0cmluZyIsIngiLCJTdHJpbmciLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJHbG9iYWwiLCJ3aW5kb3ciLCJzZWxmIiwiZ2xvYmFsIiwiZ2xvYmFsVGhpcyIsInVuZGVmaW5lZCIsImN1cnJlbnRXYXJuSGFuZGxlciIsIldhcm5pbmciLCJjb25zdHJ1Y3RvciIsImNvZGUiLCJ0aGlzIiwid2FybiIsIl9hIiwic3RhY2siLCJFcnJvciIsImNvbnNvbGUiLCJfYiIsIkluaXRFdmVudFdhc0NhbGxlZFdoaWxlRGlzcGF0Y2hpbmciLCJGYWxzeVdhc0Fzc2lnbmVkVG9DYW5jZWxCdWJibGUiLCJUcnV0aHlXYXNBc3NpZ25lZFRvUmV0dXJuVmFsdWUiLCJOb25DYW5jZWxhYmxlRXZlbnRXYXNDYW5jZWxlZCIsIkNhbmNlbGVkSW5QYXNzaXZlTGlzdGVuZXIiLCJFdmVudExpc3RlbmVyV2FzRHVwbGljYXRlZCIsIk9wdGlvbldhc0lnbm9yZWQiLCJJbnZhbGlkRXZlbnRMaXN0ZW5lciIsIkV2ZW50IiwiTk9ORSIsIkNBUFRVUklOR19QSEFTRSIsIkFUX1RBUkdFVCIsIkJVQkJMSU5HX1BIQVNFIiwidHlwZSIsImV2ZW50SW5pdERpY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZW51bWVyYWJsZSIsIm9wdHMiLCJpbnRlcm5hbERhdGFNYXAiLCJzZXQiLCJidWJibGVzIiwiQm9vbGVhbiIsImNhbmNlbGFibGUiLCJjb21wb3NlZCIsInRhcmdldCIsImN1cnJlbnRUYXJnZXQiLCJzdG9wUHJvcGFnYXRpb25GbGFnIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uRmxhZyIsImNhbmNlbGVkRmxhZyIsImluUGFzc2l2ZUxpc3RlbmVyRmxhZyIsImRpc3BhdGNoRmxhZyIsInRpbWVTdGFtcCIsIkRhdGUiLCJub3ciLCIkIiwic3JjRWxlbWVudCIsImNvbXBvc2VkUGF0aCIsImV2ZW50UGhhc2UiLCJzdG9wUHJvcGFnYXRpb24iLCJjYW5jZWxCdWJibGUiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJkYXRhIiwicmV0dXJuVmFsdWUiLCJzZXRDYW5jZWxGbGFnIiwicHJldmVudERlZmF1bHQiLCJkZWZhdWx0UHJldmVudGVkIiwiaXNUcnVzdGVkIiwiaW5pdEV2ZW50IiwiV2Vha01hcCIsImV2ZW50IiwibmFtZSIsInJldHYiLCJnZXQiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImxlbmd0aCIsIkRPTUV4Y2VwdGlvbiIsInNldFByb3RvdHlwZU9mIiwiRXJyb3JDb2RlTWFwIiwiSU5ERVhfU0laRV9FUlIiLCJET01TVFJJTkdfU0laRV9FUlIiLCJISUVSQVJDSFlfUkVRVUVTVF9FUlIiLCJXUk9OR19ET0NVTUVOVF9FUlIiLCJJTlZBTElEX0NIQVJBQ1RFUl9FUlIiLCJOT19EQVRBX0FMTE9XRURfRVJSIiwiTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSIiwiTk9UX0ZPVU5EX0VSUiIsIk5PVF9TVVBQT1JURURfRVJSIiwiSU5VU0VfQVRUUklCVVRFX0VSUiIsIklOVkFMSURfU1RBVEVfRVJSIiwiU1lOVEFYX0VSUiIsIklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiIsIk5BTUVTUEFDRV9FUlIiLCJJTlZBTElEX0FDQ0VTU19FUlIiLCJWQUxJREFUSU9OX0VSUiIsIlRZUEVfTUlTTUFUQ0hfRVJSIiwiU0VDVVJJVFlfRVJSIiwiTkVUV09SS19FUlIiLCJBQk9SVF9FUlIiLCJVUkxfTUlTTUFUQ0hfRVJSIiwiUVVPVEFfRVhDRUVERURfRVJSIiwiVElNRU9VVF9FUlIiLCJJTlZBTElEX05PREVfVFlQRV9FUlIiLCJEQVRBX0NMT05FX0VSUiIsImRlZmluZUVycm9yQ29kZVByb3BlcnRpZXMiLCJvYmoiLCJrZXkiLCJjb25maWd1cmFibGUiLCJFdmVudFdyYXBwZXIiLCJ3cmFwIiwiZ2V0V3JhcHBlckNsYXNzT2YiLCJzdXBlciIsImludGVybmFsRGF0YU1hcCQxIiwib3JpZ2luYWwiLCJkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3IiLCIkJDEiLCJ3cmFwcGVyQ2xhc3NDYWNoZSIsIm9yaWdpbmFsRXZlbnQiLCJnZXRQcm90b3R5cGVPZiIsIndyYXBwZXIiLCJCYXNlRXZlbnRXcmFwcGVyIiwib3JpZ2luYWxQcm90b3R5cGUiLCJDdXN0b21FdmVudFdyYXBwZXIiLCJkZWZpbmVXcmFwcGVyIiwiZCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImJpbmQiLCJpc0NhcHR1cmUiLCJsaXN0ZW5lciIsImZsYWdzIiwiaXNQYXNzaXZlIiwiaXNPbmNlIiwiaXNSZW1vdmVkIiwiaW52b2tlQ2FsbGJhY2siLCJjYWxsYmFjayIsImhhbmRsZUV2ZW50IiwidGhyb3duRXJyb3IiLCJtYXliZUVycm9yIiwiZXJyb3IiLCJkaXNwYXRjaEV2ZW50IiwiRXJyb3JFdmVudCIsInByb2Nlc3MiLCJlbWl0IiwicmVwb3J0RXJyb3IiLCJmaW5kSW5kZXhPZkxpc3RlbmVyIiwibGlzdGVuZXJzIiwiY2FwdHVyZSIsInJlbW92ZUxpc3RlbmVyIiwibGlzdCIsImluZGV4IiwicmVtb3ZlTGlzdGVuZXJBdCIsImRpc2FibGVDb3ciLCJzZXRSZW1vdmVkIiwic2lnbmFsIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInNpZ25hbExpc3RlbmVyIiwiY293IiwiZmlsdGVyIiwiXyIsInNwbGljZSIsIkV2ZW50VGFyZ2V0IiwiaW50ZXJuYWxEYXRhTWFwJDIiLCJjcmVhdGUiLCJhZGRFdmVudExpc3RlbmVyIiwidHlwZTAiLCJjYWxsYmFjazAiLCJvcHRpb25zMCIsImxpc3RlbmVyTWFwIiwiJCQyIiwib25jZSIsInBhc3NpdmUiLCJvcHRpb25zIiwiYXNzZXJ0Q2FsbGJhY2siLCJub3JtYWxpemVBZGRPcHRpb25zIiwiYWJvcnRlZCIsImF0dHJDYWxsYmFjayIsImF0dHJMaXN0ZW5lciIsImVuc3VyZUxpc3RlbmVyTGlzdCIsImNyZWF0ZUxpc3RlbmVyIiwicHVzaCIsImFkZExpc3RlbmVyIiwid2FybkR1cGxpY2F0ZSIsIm5vcm1hbGl6ZU9wdGlvbnMiLCJlIiwiZXZlbnREYXRhIiwibXNnIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJkZWZpbmVQcm9wZXJ0aWVzIiwia2V5cyQxIiwiZ2V0RXZlbnRzRm9yRGF5IiwiZXZlbnRzIiwiZGF0ZSIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwic29ydCIsImEiLCJiIiwidGltZSIsInBhcnNlSW50IiwibXVsdGlEYXlzIiwiREFZUyIsIk1vbnRoR3JpZCIsImVsIiwiX2RhdGUiLCJyb290RWwiLCJfZXZlbnRzIiwicmVuZGVyIiwiaW5uZXJIVE1MIiwibW9udGgiLCJ5ZWFyIiwiZmlyc3REYXkiLCJsYXN0RGF5IiwiZmlyc3RXZWVrZGF5IiwiZ2V0RGF5IiwibGFzdFdlZWtkYXkiLCJkYXlzSW5Nb250aCIsImRheXNJbkxhc3RNb250aCIsImRheXMiLCJpbmRleEluR3JpZCIsImh0bWwiLCJyZW5kZXJEYXkiLCJpbnNlcnRBZGphY2VudEhUTUwiLCJsYXN0RWxlbWVudENoaWxkIiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJ1cGRhdGVOb3dNYXJrZXIiLCJkYXlOdW1iZXIiLCJjbGFzc05hbWUiLCJ0b0RhdGVTdHJpbmciLCJtYXAiLCJhc09uZUxpbmVIVE1MIiwiam9pbiIsInJhdGlvIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZGF5RWwiLCJxdWVyeVNlbGVjdG9yIiwibWFya2VySGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwic3R5bGUiLCJzZXRQcm9wZXJ0eSIsInNldFRpbWVvdXQiLCJNT05USFMiLCJUb29sYmFyIiwibW9kZSIsInNlbGVjdGVkTW9kZSIsImZvcm1hdE1vbnRoWWVhciIsImxvZyIsIlNpZGViYXIiLCJ1bCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImFwcGVuZENoaWxkIiwiYXNGdWxsSFRNTCIsIldlZWtHcmlkIiwiZGF5IiwiYXNNZWRpdW1MZW5ndGhIVE1MIiwiQXBwVUkiLCJ0b29sYmFyRWwiLCJpZCIsInRvb2xiYXIiLCJuZXdEYXRlIiwibW9udGhHcmlkRWwiLCJkaXNwbGF5Iiwid2Vla0dyaWRFbCIsIm1vbnRoR3JpZCIsIndlZWtHcmlkIiwic2lkZWJhckVsIiwic2lkZWJhciIsIkNhbGVuZGFyRXZlbnQiLCJ0aXRsZSIsInJzdnAiLCJjb2xvciIsImRlc2NyaXB0aW9uIiwid2hlbiIsInN0YXJ0IiwiZW5kIiwicmVwZWF0IiwiZHVyYXRpb24iLCJsb2NhdGlvbiIsIkV2ZW50UG9wdXAiLCJwb3B1cEVsIiwiY2xhc3NMaXN0IiwicmVtb3ZlIiwiZXZlbnRFbCIsImNsb3Nlc3QiLCJzdGFydHNXaXRoIiwiZXZlbnRJZCIsImZpbmQiLCJldmVudEluZGV4SW5HcmlkIiwiZGF0YXNldCIsInRvZ2dsZSIsImJvZHkiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidG9wIiwicmlnaHQiLCJsZWZ0Iiwid2lkdGgiLCJjbGllbnRIZWlnaHQiLCJTdG9yZSIsImdldFN0b3JlZFByZWZzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJNYXRoIiwicmFuZG9tIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImluaXREYXRlIiwic2V0SXRlbSIsInRvSVNPU3RyaW5nIiwic3RvcmUiLCJwcmVmcyIsImluaXRNb2RlIiwiYXBwRWwiLCJnZXRFbGVtZW50QnlJZCIsImFwcFVJIiwicmVzcG9uc2UiLCJmZXRjaCIsImpzb24iLCJmZXRjaERhdGEiLCJkYXRlcyIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJnZXRUaW1lIiwid2Vla3MiLCJtb250aHMiLCJzZXRNb250aCIsInllYXJzIiwic2V0RnVsbFllYXIiLCJzdGFydFRpbWUiLCJjcmVhdGVPbmVPck11bHRpcGxlRXZlbnRzRnJvbURhdGEiLCJmbGF0IiwiZ2V0QWxsRXZlbnRzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/slow-calendar/src/Sidebar.ts b/slow-calendar/src/Sidebar.ts index b33a5e6..a8c4eb4 100644 --- a/slow-calendar/src/Sidebar.ts +++ b/slow-calendar/src/Sidebar.ts @@ -38,4 +38,3 @@ export class Sidebar { this.render(); } } -`` \ No newline at end of file