@jsenv/terminal-recorder 1.5.49 → 1.5.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/jsenv_terminal_recorder_node_modules.js +2 -2
- package/package.json +3 -3
- package/src/.jsenv/chrome@145.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +1 -1
- package/src/.jsenv/chrome@145.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +2 -2
- package/src/.jsenv/chrome@145.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.mjs.map +4 -1620
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +18 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +28 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +176 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.mjs +101 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.mjs.map +1623 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/css/xterm.css +267 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.mjs +53 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.mjs.map +3592 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/packages/backend/server/src/plugins/autoreload_on_server_restart/client/autoreload_on_server_restart.js +133 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/packages/frontend/custom-elements-redefine/src/main.js +217 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/packages/internal/plugin-supervisor/src/client/supervisor.js +1418 -0
- package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/drop_to_open/client/drop_to_open.js +49 -0
- package/src/.jsenv/chrome@149.0.0/gif_encoder.js +400 -0
- package/src/.jsenv/chrome@149.0.0/gif_encoder.js.map +11 -0
- package/src/.jsenv/chrome@149.0.0/lzw_encoder.js +253 -0
- package/src/.jsenv/chrome@149.0.0/neuquant.js +498 -0
- package/src/.jsenv/chrome@149.0.0/terminal_recorder.js +384 -0
- package/src/.jsenv/chrome@149.0.0/terminal_recorder.js.map +11 -0
- package/src/.jsenv/chrome@149.0.0/xterm.html +64 -0
- package/src/.jsenv/chrome@149.0.0/xterm.html@L14C5-L18C14.js +5 -0
- package/src/.jsenv/chrome@149.0.0/xterm.html@L19C5-L24C14.js +7 -0
- package/src/.jsenv/chrome@149.0.0/xterm.html@L19C5-L24C14.js.map +11 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
6
|
+
* @license MIT
|
|
7
|
+
*
|
|
8
|
+
* Originally forked from (with the author's permission):
|
|
9
|
+
* Fabrice Bellard's javascript vt100 for jslinux:
|
|
10
|
+
* http://bellard.org/jslinux/
|
|
11
|
+
* Copyright (c) 2011 Fabrice Bellard
|
|
12
|
+
*/
|
|
13
|
+
/*---------------------------------------------------------------------------------------------
|
|
14
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
15
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
16
|
+
*--------------------------------------------------------------------------------------------*/
|
|
17
|
+
var Lr=Object.defineProperty;var wr=Object.getOwnPropertyDescriptor;var Yi=(i,e,t,n)=>{for(var s=n>1?void 0:n?wr(e,t):e,o=i.length-1,r;o>=0;o--)(r=i[o])&&(s=(n?r(e,t,s):r(s))||s);return n&&s&&Lr(e,t,s),s},Qi=(i,e)=>(t,n)=>e(t,n,i);var pi=class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?bt.isErrorNoTelemetry(e)?new bt(e.message+`
|
|
18
|
+
|
|
19
|
+
`+e.stack):new Error(e.message+`
|
|
20
|
+
|
|
21
|
+
`+e.stack):e},0)}}addListener(e){return this.listeners.push(e),()=>{this._removeListener(e)}}emit(e){this.listeners.forEach(t=>{t(e)})}_removeListener(e){this.listeners.splice(this.listeners.indexOf(e),1)}setUnexpectedErrorHandler(e){this.unexpectedErrorHandler=e}getUnexpectedErrorHandler(){return this.unexpectedErrorHandler}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}},Rr=new pi;function Pe(i){Dr(i)||Rr.onUnexpectedError(i)}var fi="Canceled";function Dr(i){return i instanceof Ye?!0:i instanceof Error&&i.name===fi&&i.message===fi}var Ye=class extends Error{constructor(){super(fi),this.name=this.message}};var bt=class i extends Error{constructor(e){super(e),this.name="CodeExpectedError"}static fromError(e){if(e instanceof i)return e;let t=new i;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return e.name==="CodeExpectedError"}};function Mr(i,e,t=0,n=i.length){let s=t,o=n;for(;s<o;){let r=Math.floor((s+o)/2);e(i[r])?s=r+1:o=r}return s-1}var vt=class vt{constructor(e){this._array=e;this._findLastMonotonousLastIdx=0}findLastMonotonous(e){if(vt.assertInvariants){if(this._prevFindLastPredicate){for(let n of this._array)if(this._prevFindLastPredicate(n)&&!e(n))throw new Error("MonotonousArray: current predicate must be weaker than (or equal to) the previous predicate.")}this._prevFindLastPredicate=e}let t=Mr(this._array,e,this._findLastMonotonousLastIdx);return this._findLastMonotonousLastIdx=t+1,t===-1?void 0:this._array[t]}};vt.assertInvariants=!1;var Zi=vt;var en;(a=>{function i(l){return l<0}a.isLessThan=i;function e(l){return l<=0}a.isLessThanOrEqual=e;function t(l){return l>0}a.isGreaterThan=t;function n(l){return l===0}a.isNeitherLessOrGreaterThan=n,a.greaterThan=1,a.lessThan=-1,a.neitherLessOrGreaterThan=0})(en||={});function tn(i,e){return(t,n)=>e(i(t),i(n))}var nn=(i,e)=>i-e;var Be=class Be{constructor(e){this.iterate=e}forEach(e){this.iterate(t=>(e(t),!0))}toArray(){let e=[];return this.iterate(t=>(e.push(t),!0)),e}filter(e){return new Be(t=>this.iterate(n=>e(n)?t(n):!0))}map(e){return new Be(t=>this.iterate(n=>t(e(n))))}some(e){let t=!1;return this.iterate(n=>(t=e(n),!t)),t}findFirst(e){let t;return this.iterate(n=>e(n)?(t=n,!1):!0),t}findLast(e){let t;return this.iterate(n=>(e(n)&&(t=n),!0)),t}findLastMaxBy(e){let t,n=!0;return this.iterate(s=>((n||en.isGreaterThan(e(s,t)))&&(n=!1,t=s),!0)),t}};Be.empty=new Be(e=>{});var Ji=Be;function an(i,e){let t=Object.create(null);for(let n of i){let s=e(n),o=t[s];o||(o=t[s]=[]),o.push(n)}return t}var sn,on,rn=class{constructor(e,t){this.toKey=t;this._map=new Map;this[sn]="SetWithKey";for(let n of e)this.add(n)}get size(){return this._map.size}add(e){let t=this.toKey(e);return this._map.set(t,e),this}delete(e){return this._map.delete(this.toKey(e))}has(e){return this._map.has(this.toKey(e))}*entries(){for(let e of this._map.values())yield[e,e]}keys(){return this.values()}*values(){for(let e of this._map.values())yield e}clear(){this._map.clear()}forEach(e,t){this._map.forEach(n=>e.call(t,n,n,this))}[(on=Symbol.iterator,sn=Symbol.toStringTag,on)](){return this.values()}};var Tt=class{constructor(){this.map=new Map}add(e,t){let n=this.map.get(e);n||(n=new Set,this.map.set(e,n)),n.add(t)}delete(e,t){let n=this.map.get(e);n&&(n.delete(t),n.size===0&&this.map.delete(e))}forEach(e,t){let n=this.map.get(e);n&&n.forEach(t)}get(e){let t=this.map.get(e);return t||new Set}};function mi(i,e){let t=this,n=!1,s;return function(){if(n)return s;if(n=!0,e)try{s=i.apply(t,arguments)}finally{e()}else s=i.apply(t,arguments);return s}}var _i;(W=>{function i(E){return E&&typeof E=="object"&&typeof E[Symbol.iterator]=="function"}W.is=i;let e=Object.freeze([]);function t(){return e}W.empty=t;function*n(E){yield E}W.single=n;function s(E){return i(E)?E:n(E)}W.wrap=s;function o(E){return E||e}W.from=o;function*r(E){for(let y=E.length-1;y>=0;y--)yield E[y]}W.reverse=r;function a(E){return!E||E[Symbol.iterator]().next().done===!0}W.isEmpty=a;function l(E){return E[Symbol.iterator]().next().value}W.first=l;function u(E,y){let w=0;for(let G of E)if(y(G,w++))return!0;return!1}W.some=u;function c(E,y){for(let w of E)if(y(w))return w}W.find=c;function*d(E,y){for(let w of E)y(w)&&(yield w)}W.filter=d;function*h(E,y){let w=0;for(let G of E)yield y(G,w++)}W.map=h;function*f(E,y){let w=0;for(let G of E)yield*y(G,w++)}W.flatMap=f;function*I(...E){for(let y of E)yield*y}W.concat=I;function L(E,y,w){let G=w;for(let ue of E)G=y(G,ue);return G}W.reduce=L;function*M(E,y,w=E.length){for(y<0&&(y+=E.length),w<0?w+=E.length:w>E.length&&(w=E.length);y<w;y++)yield E[y]}W.slice=M;function q(E,y=Number.POSITIVE_INFINITY){let w=[];if(y===0)return[w,E];let G=E[Symbol.iterator]();for(let ue=0;ue<y;ue++){let Se=G.next();if(Se.done)return[w,W.empty()];w.push(Se.value)}return[w,{[Symbol.iterator](){return G}}]}W.consume=q;async function S(E){let y=[];for await(let w of E)y.push(w);return Promise.resolve(y)}W.asyncToArray=S})(_i||={});var Ar=!1,Ne=null,gt=class gt{constructor(){this.livingDisposables=new Map}getDisposableData(e){let t=this.livingDisposables.get(e);return t||(t={parent:null,source:null,isSingleton:!1,value:e,idx:gt.idx++},this.livingDisposables.set(e,t)),t}trackDisposable(e){let t=this.getDisposableData(e);t.source||(t.source=new Error().stack)}setParent(e,t){let n=this.getDisposableData(e);n.parent=t}markAsDisposed(e){this.livingDisposables.delete(e)}markAsSingleton(e){this.getDisposableData(e).isSingleton=!0}getRootParent(e,t){let n=t.get(e);if(n)return n;let s=e.parent?this.getRootParent(this.getDisposableData(e.parent),t):e;return t.set(e,s),s}getTrackedDisposables(){let e=new Map;return[...this.livingDisposables.entries()].filter(([,n])=>n.source!==null&&!this.getRootParent(n,e).isSingleton).flatMap(([n])=>n)}computeLeakingDisposables(e=10,t){let n;if(t)n=t;else{let l=new Map,u=[...this.livingDisposables.values()].filter(d=>d.source!==null&&!this.getRootParent(d,l).isSingleton);if(u.length===0)return;let c=new Set(u.map(d=>d.value));if(n=u.filter(d=>!(d.parent&&c.has(d.parent))),n.length===0)throw new Error("There are cyclic diposable chains!")}if(!n)return;function s(l){function u(d,h){for(;d.length>0&&h.some(f=>typeof f=="string"?f===d[0]:d[0].match(f));)d.shift()}let c=l.source.split(`
|
|
22
|
+
`).map(d=>d.trim().replace("at ","")).filter(d=>d!=="");return u(c,["Error",/^trackDisposable \(.*\)$/,/^DisposableTracker.trackDisposable \(.*\)$/]),c.reverse()}let o=new Tt;for(let l of n){let u=s(l);for(let c=0;c<=u.length;c++)o.add(u.slice(0,c).join(`
|
|
23
|
+
`),l)}n.sort(tn(l=>l.idx,nn));let r="",a=0;for(let l of n.slice(0,e)){a++;let u=s(l),c=[];for(let d=0;d<u.length;d++){let h=u[d];h=`(shared with ${o.get(u.slice(0,d+1).join(`
|
|
24
|
+
`)).size}/${n.length} leaks) at ${h}`;let I=o.get(u.slice(0,d).join(`
|
|
25
|
+
`)),L=an([...I].map(M=>s(M)[d]),M=>M);delete L[u[d]];for(let[M,q]of Object.entries(L))c.unshift(` - stacktraces of ${q.length} other leaks continue with ${M}`);c.unshift(h)}r+=`
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
==================== Leaking disposable ${a}/${n.length}: ${l.value.constructor.name} ====================
|
|
29
|
+
${c.join(`
|
|
30
|
+
`)}
|
|
31
|
+
============================================================
|
|
32
|
+
|
|
33
|
+
`}return n.length>e&&(r+=`
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
... and ${n.length-e} more leaking disposables
|
|
37
|
+
|
|
38
|
+
`),{leaks:n,details:r}}};gt.idx=0;var ln=gt;function Sr(i){Ne=i}if(Ar){let i="__is_disposable_tracked__";Sr(new class{trackDisposable(e){let t=new Error("Potentially leaked disposable").stack;setTimeout(()=>{e[i]||console.log(t)},3e3)}setParent(e,t){if(e&&e!==B.None)try{e[i]=!0}catch{}}markAsDisposed(e){if(e&&e!==B.None)try{e[i]=!0}catch{}}markAsSingleton(e){}})}function Et(i){return Ne?.trackDisposable(i),i}function yt(i){Ne?.markAsDisposed(i)}function Qe(i,e){Ne?.setParent(i,e)}function Or(i,e){if(Ne)for(let t of i)Ne.setParent(t,e)}function un(i){if(_i.is(i)){let e=[];for(let t of i)if(t)try{t.dispose()}catch(n){e.push(n)}if(e.length===1)throw e[0];if(e.length>1)throw new AggregateError(e,"Encountered errors while disposing of store");return Array.isArray(i)?[]:i}else if(i)return i.dispose(),i}function It(...i){let e=O(()=>un(i));return Or(i,e),e}function O(i){let e=Et({dispose:mi(()=>{yt(e),i()})});return e}var xt=class xt{constructor(){this._toDispose=new Set;this._isDisposed=!1;Et(this)}dispose(){this._isDisposed||(yt(this),this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{un(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return Qe(e,this),this._isDisposed?xt.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}delete(e){if(e){if(e===this)throw new Error("Cannot dispose a disposable on itself!");this._toDispose.delete(e),e.dispose()}}deleteAndLeak(e){e&&this._toDispose.has(e)&&(this._toDispose.delete(e),Qe(e,null))}};xt.DISABLE_DISPOSED_WARNING=!1;var fe=xt,B=class{constructor(){this._store=new fe;Et(this),Qe(this._store,this)}dispose(){yt(this),this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}};B.None=Object.freeze({dispose(){}});var be=class{constructor(){this._isDisposed=!1;Et(this)}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),e&&Qe(e,this),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,yt(this),this._value?.dispose(),this._value=void 0}clearAndLeak(){let e=this._value;return this._value=void 0,e&&Qe(e,null),e}};var Lt=typeof process<"u"&&"title"in process,Ze=Lt?"node":navigator.userAgent,bi=Lt?"node":navigator.platform,cn=Ze.includes("Firefox"),dn=Ze.includes("Edge"),vi=/^((?!chrome|android).)*safari/i.test(Ze);function hn(){if(!vi)return 0;let i=Ze.match(/Version\/(\d+)/);return i===null||i.length<2?0:parseInt(i[1])}var oo=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(bi);var ao=["Windows","Win16","Win32","WinCE"].includes(bi),lo=bi.indexOf("Linux")>=0,uo=/\bCrOS\b/.test(Ze);var pn="";var K=0,V=0,C=0,U=0,Z={css:"#00000000",rgba:0},X;(n=>{function i(s,o,r,a){return a!==void 0?`#${Oe(s)}${Oe(o)}${Oe(r)}${Oe(a)}`:`#${Oe(s)}${Oe(o)}${Oe(r)}`}n.toCss=i;function e(s,o,r,a=255){return(s<<24|o<<16|r<<8|a)>>>0}n.toRgba=e;function t(s,o,r,a){return{css:n.toCss(s,o,r,a),rgba:n.toRgba(s,o,r,a)}}n.toColor=t})(X||={});var Ue;(a=>{function i(l,u){if(U=(u.rgba&255)/255,U===1)return{css:u.css,rgba:u.rgba};let c=u.rgba>>24&255,d=u.rgba>>16&255,h=u.rgba>>8&255,f=l.rgba>>24&255,I=l.rgba>>16&255,L=l.rgba>>8&255;K=f+Math.round((c-f)*U),V=I+Math.round((d-I)*U),C=L+Math.round((h-L)*U);let M=X.toCss(K,V,C),q=X.toRgba(K,V,C);return{css:M,rgba:q}}a.blend=i;function e(l){return(l.rgba&255)===255}a.isOpaque=e;function t(l,u,c){let d=Te.ensureContrastRatio(l.rgba,u.rgba,c);if(d)return X.toColor(d>>24&255,d>>16&255,d>>8&255)}a.ensureContrastRatio=t;function n(l){let u=(l.rgba|255)>>>0;return[K,V,C]=Te.toChannels(u),{css:X.toCss(K,V,C),rgba:u}}a.opaque=n;function s(l,u){return U=Math.round(u*255),[K,V,C]=Te.toChannels(l.rgba),{css:X.toCss(K,V,C,U),rgba:X.toRgba(K,V,C,U)}}a.opacity=s;function o(l,u){return U=l.rgba&255,s(l,U*u/255)}a.multiplyOpacity=o;function r(l){return[l.rgba>>24&255,l.rgba>>16&255,l.rgba>>8&255]}a.toColorRGB=r})(Ue||={});var Fr;(n=>{let i,e;try{let s=document.createElement("canvas");s.width=1,s.height=1;let o=s.getContext("2d",{willReadFrequently:!0});o&&(i=o,i.globalCompositeOperation="copy",e=i.createLinearGradient(0,0,1,1))}catch{}function t(s){if(s.match(/#[\da-f]{3,8}/i))switch(s.length){case 4:return K=parseInt(s.slice(1,2).repeat(2),16),V=parseInt(s.slice(2,3).repeat(2),16),C=parseInt(s.slice(3,4).repeat(2),16),X.toColor(K,V,C);case 5:return K=parseInt(s.slice(1,2).repeat(2),16),V=parseInt(s.slice(2,3).repeat(2),16),C=parseInt(s.slice(3,4).repeat(2),16),U=parseInt(s.slice(4,5).repeat(2),16),X.toColor(K,V,C,U);case 7:return{css:s,rgba:(parseInt(s.slice(1),16)<<8|255)>>>0};case 9:return{css:s,rgba:parseInt(s.slice(1),16)>>>0}}let o=s.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(o)return K=parseInt(o[1]),V=parseInt(o[2]),C=parseInt(o[3]),U=Math.round((o[5]===void 0?1:parseFloat(o[5]))*255),X.toColor(K,V,C,U);if(!i||!e)throw new Error("css.toColor: Unsupported css format");if(i.fillStyle=e,i.fillStyle=s,typeof i.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(i.fillRect(0,0,1,1),[K,V,C,U]=i.getImageData(0,0,1,1).data,U!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:X.toRgba(K,V,C,U),css:s}}n.toColor=t})(Fr||={});var Y;(t=>{function i(n){return e(n>>16&255,n>>8&255,n&255)}t.relativeLuminance=i;function e(n,s,o){let r=n/255,a=s/255,l=o/255,u=r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4),c=a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4),d=l<=.03928?l/12.92:Math.pow((l+.055)/1.055,2.4);return u*.2126+c*.7152+d*.0722}t.relativeLuminance2=e})(Y||={});var Te;(o=>{function i(r,a){if(U=(a&255)/255,U===1)return a;let l=a>>24&255,u=a>>16&255,c=a>>8&255,d=r>>24&255,h=r>>16&255,f=r>>8&255;return K=d+Math.round((l-d)*U),V=h+Math.round((u-h)*U),C=f+Math.round((c-f)*U),X.toRgba(K,V,C)}o.blend=i;function e(r,a,l){let u=Y.relativeLuminance(r>>8),c=Y.relativeLuminance(a>>8);if(ve(u,c)<l){if(c<u){let I=t(r,a,l),L=ve(u,Y.relativeLuminance(I>>8));if(L<l){let M=n(r,a,l),q=ve(u,Y.relativeLuminance(M>>8));return L>q?I:M}return I}let h=n(r,a,l),f=ve(u,Y.relativeLuminance(h>>8));if(f<l){let I=t(r,a,l),L=ve(u,Y.relativeLuminance(I>>8));return f>L?h:I}return h}}o.ensureContrastRatio=e;function t(r,a,l){let u=r>>24&255,c=r>>16&255,d=r>>8&255,h=a>>24&255,f=a>>16&255,I=a>>8&255,L=ve(Y.relativeLuminance2(h,f,I),Y.relativeLuminance2(u,c,d));for(;L<l&&(h>0||f>0||I>0);)h-=Math.max(0,Math.ceil(h*.1)),f-=Math.max(0,Math.ceil(f*.1)),I-=Math.max(0,Math.ceil(I*.1)),L=ve(Y.relativeLuminance2(h,f,I),Y.relativeLuminance2(u,c,d));return(h<<24|f<<16|I<<8|255)>>>0}o.reduceLuminance=t;function n(r,a,l){let u=r>>24&255,c=r>>16&255,d=r>>8&255,h=a>>24&255,f=a>>16&255,I=a>>8&255,L=ve(Y.relativeLuminance2(h,f,I),Y.relativeLuminance2(u,c,d));for(;L<l&&(h<255||f<255||I<255);)h=Math.min(255,h+Math.ceil((255-h)*.1)),f=Math.min(255,f+Math.ceil((255-f)*.1)),I=Math.min(255,I+Math.ceil((255-I)*.1)),L=ve(Y.relativeLuminance2(h,f,I),Y.relativeLuminance2(u,c,d));return(h<<24|f<<16|I<<8|255)>>>0}o.increaseLuminance=n;function s(r){return[r>>24&255,r>>16&255,r>>8&255,r&255]}o.toChannels=s})(Te||={});function Oe(i){let e=i.toString(16);return e.length<2?"0"+e:e}function ve(i,e){return i<e?(e+.05)/(i+.05):(i+.05)/(e+.05)}function F(i){if(!i)throw new Error("value must not be falsy");return i}function Rt(i){return 57508<=i&&i<=57558}function fn(i){return 57520<=i&&i<=57527}function kr(i){return 57344<=i&&i<=63743}function Pr(i){return 9472<=i&&i<=9631}function Br(i){return i>=128512&&i<=128591||i>=127744&&i<=128511||i>=128640&&i<=128767||i>=9728&&i<=9983||i>=9984&&i<=10175||i>=65024&&i<=65039||i>=129280&&i<=129535||i>=127462&&i<=127487}function mn(i,e,t,n){return e===1&&t>Math.ceil(n*1.5)&&i!==void 0&&i>255&&!Br(i)&&!Rt(i)&&!kr(i)}function Dt(i){return Rt(i)||Pr(i)}function _n(){return{css:{canvas:wt(),cell:wt()},device:{canvas:wt(),cell:wt(),char:{width:0,height:0,left:0,top:0}}}}function wt(){return{width:0,height:0}}function bn(i,e,t=0){return(i-(Math.round(e)*2-t))%(Math.round(e)*2)}var j=0,z=0,me=!1,ge=!1,Mt=!1,J,Ti=0,At=class{constructor(e,t,n,s,o,r){this._terminal=e;this._optionService=t;this._selectionRenderModel=n;this._decorationService=s;this._coreBrowserService=o;this._themeService=r;this.result={fg:0,bg:0,ext:0}}resolve(e,t,n,s){if(this.result.bg=e.bg,this.result.fg=e.fg,this.result.ext=e.bg&268435456?e.extended.ext:0,z=0,j=0,ge=!1,me=!1,Mt=!1,J=this._themeService.colors,Ti=0,e.getCode()!==0&&e.extended.underlineStyle===4){let r=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));Ti=t*s%(Math.round(r)*2)}if(this._decorationService.forEachDecorationAtCell(t,n,"bottom",r=>{r.backgroundColorRGB&&(z=r.backgroundColorRGB.rgba>>8&16777215,ge=!0),r.foregroundColorRGB&&(j=r.foregroundColorRGB.rgba>>8&16777215,me=!0)}),Mt=this._selectionRenderModel.isCellSelected(this._terminal,t,n),Mt){if(this.result.fg&67108864||(this.result.bg&50331648)!==0){if(this.result.fg&67108864)switch(this.result.fg&50331648){case 16777216:case 33554432:z=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:z=(this.result.fg&16777215)<<8|255;break;case 0:default:z=this._themeService.colors.foreground.rgba}else switch(this.result.bg&50331648){case 16777216:case 33554432:z=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:z=(this.result.bg&16777215)<<8|255;break}z=Te.blend(z,(this._coreBrowserService.isFocused?J.selectionBackgroundOpaque:J.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}else z=(this._coreBrowserService.isFocused?J.selectionBackgroundOpaque:J.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(ge=!0,J.selectionForeground&&(j=J.selectionForeground.rgba>>8&16777215,me=!0),Dt(e.getCode())){if(this.result.fg&67108864&&(this.result.bg&50331648)===0)j=(this._coreBrowserService.isFocused?J.selectionBackgroundOpaque:J.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(this.result.fg&67108864)switch(this.result.bg&50331648){case 16777216:case 33554432:j=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:j=(this.result.bg&16777215)<<8|255;break}else switch(this.result.fg&50331648){case 16777216:case 33554432:j=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:j=(this.result.fg&16777215)<<8|255;break;case 0:default:j=this._themeService.colors.foreground.rgba}j=Te.blend(j,(this._coreBrowserService.isFocused?J.selectionBackgroundOpaque:J.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}me=!0}}this._decorationService.forEachDecorationAtCell(t,n,"top",r=>{r.backgroundColorRGB&&(z=r.backgroundColorRGB.rgba>>8&16777215,ge=!0),r.foregroundColorRGB&&(j=r.foregroundColorRGB.rgba>>8&16777215,me=!0)}),ge&&(Mt?z=e.bg&-16777216&-134217729|z|50331648:z=e.bg&-16777216|z|50331648),me&&(j=e.fg&-16777216&-67108865|j|50331648),this.result.fg&67108864&&(ge&&!me&&((this.result.bg&50331648)===0?j=this.result.fg&-134217728|J.background.rgba>>8&16777215&16777215|50331648:j=this.result.fg&-134217728|this.result.bg&67108863,me=!0),!ge&&me&&((this.result.fg&50331648)===0?z=this.result.bg&-67108864|J.foreground.rgba>>8&16777215&16777215|50331648:z=this.result.bg&-67108864|this.result.fg&67108863,ge=!0)),J=void 0,this.result.bg=ge?z:this.result.bg,this.result.fg=me?j:this.result.fg,this.result.ext&=536870911,this.result.ext|=Ti<<29&3758096384}};var gn=.5,St=cn||dn?"bottom":"ideographic";var Hr={"\u2580":[{x:0,y:0,w:8,h:4}],"\u2581":[{x:0,y:7,w:8,h:1}],"\u2582":[{x:0,y:6,w:8,h:2}],"\u2583":[{x:0,y:5,w:8,h:3}],"\u2584":[{x:0,y:4,w:8,h:4}],"\u2585":[{x:0,y:3,w:8,h:5}],"\u2586":[{x:0,y:2,w:8,h:6}],"\u2587":[{x:0,y:1,w:8,h:7}],"\u2588":[{x:0,y:0,w:8,h:8}],"\u2589":[{x:0,y:0,w:7,h:8}],"\u258A":[{x:0,y:0,w:6,h:8}],"\u258B":[{x:0,y:0,w:5,h:8}],"\u258C":[{x:0,y:0,w:4,h:8}],"\u258D":[{x:0,y:0,w:3,h:8}],"\u258E":[{x:0,y:0,w:2,h:8}],"\u258F":[{x:0,y:0,w:1,h:8}],"\u2590":[{x:4,y:0,w:4,h:8}],"\u2594":[{x:0,y:0,w:8,h:1}],"\u2595":[{x:7,y:0,w:1,h:8}],"\u2596":[{x:0,y:4,w:4,h:4}],"\u2597":[{x:4,y:4,w:4,h:4}],"\u2598":[{x:0,y:0,w:4,h:4}],"\u2599":[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"\u259A":[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}],"\u259B":[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}],"\u259C":[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}],"\u259D":[{x:4,y:0,w:4,h:4}],"\u259E":[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}],"\u259F":[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"\u{1FB70}":[{x:1,y:0,w:1,h:8}],"\u{1FB71}":[{x:2,y:0,w:1,h:8}],"\u{1FB72}":[{x:3,y:0,w:1,h:8}],"\u{1FB73}":[{x:4,y:0,w:1,h:8}],"\u{1FB74}":[{x:5,y:0,w:1,h:8}],"\u{1FB75}":[{x:6,y:0,w:1,h:8}],"\u{1FB76}":[{x:0,y:1,w:8,h:1}],"\u{1FB77}":[{x:0,y:2,w:8,h:1}],"\u{1FB78}":[{x:0,y:3,w:8,h:1}],"\u{1FB79}":[{x:0,y:4,w:8,h:1}],"\u{1FB7A}":[{x:0,y:5,w:8,h:1}],"\u{1FB7B}":[{x:0,y:6,w:8,h:1}],"\u{1FB7C}":[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"\u{1FB7D}":[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"\u{1FB7E}":[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"\u{1FB7F}":[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"\u{1FB80}":[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}],"\u{1FB81}":[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}],"\u{1FB82}":[{x:0,y:0,w:8,h:2}],"\u{1FB83}":[{x:0,y:0,w:8,h:3}],"\u{1FB84}":[{x:0,y:0,w:8,h:5}],"\u{1FB85}":[{x:0,y:0,w:8,h:6}],"\u{1FB86}":[{x:0,y:0,w:8,h:7}],"\u{1FB87}":[{x:6,y:0,w:2,h:8}],"\u{1FB88}":[{x:5,y:0,w:3,h:8}],"\u{1FB89}":[{x:3,y:0,w:5,h:8}],"\u{1FB8A}":[{x:2,y:0,w:6,h:8}],"\u{1FB8B}":[{x:1,y:0,w:7,h:8}],"\u{1FB95}":[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}],"\u{1FB96}":[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}],"\u{1FB97}":[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]},Wr={"\u2591":[[1,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]],"\u2592":[[1,0],[0,0],[0,1],[0,0]],"\u2593":[[0,1],[1,1],[1,0],[1,1]]};var Gr={"\u2500":{1:"M0,.5 L1,.5"},"\u2501":{3:"M0,.5 L1,.5"},"\u2502":{1:"M.5,0 L.5,1"},"\u2503":{3:"M.5,0 L.5,1"},"\u250C":{1:"M0.5,1 L.5,.5 L1,.5"},"\u250F":{3:"M0.5,1 L.5,.5 L1,.5"},"\u2510":{1:"M0,.5 L.5,.5 L.5,1"},"\u2513":{3:"M0,.5 L.5,.5 L.5,1"},"\u2514":{1:"M.5,0 L.5,.5 L1,.5"},"\u2517":{3:"M.5,0 L.5,.5 L1,.5"},"\u2518":{1:"M.5,0 L.5,.5 L0,.5"},"\u251B":{3:"M.5,0 L.5,.5 L0,.5"},"\u251C":{1:"M.5,0 L.5,1 M.5,.5 L1,.5"},"\u2523":{3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"\u2524":{1:"M.5,0 L.5,1 M.5,.5 L0,.5"},"\u252B":{3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"\u252C":{1:"M0,.5 L1,.5 M.5,.5 L.5,1"},"\u2533":{3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"\u2534":{1:"M0,.5 L1,.5 M.5,.5 L.5,0"},"\u253B":{3:"M0,.5 L1,.5 M.5,.5 L.5,0"},"\u253C":{1:"M0,.5 L1,.5 M.5,0 L.5,1"},"\u254B":{3:"M0,.5 L1,.5 M.5,0 L.5,1"},"\u2574":{1:"M.5,.5 L0,.5"},"\u2578":{3:"M.5,.5 L0,.5"},"\u2575":{1:"M.5,.5 L.5,0"},"\u2579":{3:"M.5,.5 L.5,0"},"\u2576":{1:"M.5,.5 L1,.5"},"\u257A":{3:"M.5,.5 L1,.5"},"\u2577":{1:"M.5,.5 L.5,1"},"\u257B":{3:"M.5,.5 L.5,1"},"\u2550":{1:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`},"\u2551":{1:(i,e)=>`M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`},"\u2552":{1:(i,e)=>`M.5,1 L.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`},"\u2553":{1:(i,e)=>`M${.5-i},1 L${.5-i},.5 L1,.5 M${.5+i},.5 L${.5+i},1`},"\u2554":{1:(i,e)=>`M1,${.5-e} L${.5-i},${.5-e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1`},"\u2555":{1:(i,e)=>`M0,${.5-e} L.5,${.5-e} L.5,1 M0,${.5+e} L.5,${.5+e}`},"\u2556":{1:(i,e)=>`M${.5+i},1 L${.5+i},.5 L0,.5 M${.5-i},.5 L${.5-i},1`},"\u2557":{1:(i,e)=>`M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M0,${.5-e} L${.5+i},${.5-e} L${.5+i},1`},"\u2558":{1:(i,e)=>`M.5,0 L.5,${.5+e} L1,${.5+e} M.5,${.5-e} L1,${.5-e}`},"\u2559":{1:(i,e)=>`M1,.5 L${.5-i},.5 L${.5-i},0 M${.5+i},.5 L${.5+i},0`},"\u255A":{1:(i,e)=>`M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0 M1,${.5+e} L${.5-i},${.5+e} L${.5-i},0`},"\u255B":{1:(i,e)=>`M0,${.5+e} L.5,${.5+e} L.5,0 M0,${.5-e} L.5,${.5-e}`},"\u255C":{1:(i,e)=>`M0,.5 L${.5+i},.5 L${.5+i},0 M${.5-i},.5 L${.5-i},0`},"\u255D":{1:(i,e)=>`M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M0,${.5+e} L${.5+i},${.5+e} L${.5+i},0`},"\u255E":{1:(i,e)=>`M.5,0 L.5,1 M.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`},"\u255F":{1:(i,e)=>`M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1 M${.5+i},.5 L1,.5`},"\u2560":{1:(i,e)=>`M${.5-i},0 L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`},"\u2561":{1:(i,e)=>`M.5,0 L.5,1 M0,${.5-e} L.5,${.5-e} M0,${.5+e} L.5,${.5+e}`},"\u2562":{1:(i,e)=>`M0,.5 L${.5-i},.5 M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`},"\u2563":{1:(i,e)=>`M${.5+i},0 L${.5+i},1 M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0`},"\u2564":{1:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e} M.5,${.5+e} L.5,1`},"\u2565":{1:(i,e)=>`M0,.5 L1,.5 M${.5-i},.5 L${.5-i},1 M${.5+i},.5 L${.5+i},1`},"\u2566":{1:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1`},"\u2567":{1:(i,e)=>`M.5,0 L.5,${.5-e} M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`},"\u2568":{1:(i,e)=>`M0,.5 L1,.5 M${.5-i},.5 L${.5-i},0 M${.5+i},.5 L${.5+i},0`},"\u2569":{1:(i,e)=>`M0,${.5+e} L1,${.5+e} M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`},"\u256A":{1:(i,e)=>`M.5,0 L.5,1 M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`},"\u256B":{1:(i,e)=>`M0,.5 L1,.5 M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`},"\u256C":{1:(i,e)=>`M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1 M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`},"\u2571":{1:"M1,0 L0,1"},"\u2572":{1:"M0,0 L1,1"},"\u2573":{1:"M1,0 L0,1 M0,0 L1,1"},"\u257C":{1:"M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"\u257D":{1:"M.5,.5 L.5,0",3:"M.5,.5 L.5,1"},"\u257E":{1:"M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"\u257F":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"\u250D":{1:"M.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"\u250E":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"\u2511":{1:"M.5,.5 L.5,1",3:"M.5,.5 L0,.5"},"\u2512":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"\u2515":{1:"M.5,.5 L.5,0",3:"M.5,.5 L1,.5"},"\u2516":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"\u2519":{1:"M.5,.5 L.5,0",3:"M.5,.5 L0,.5"},"\u251A":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,0"},"\u251D":{1:"M.5,0 L.5,1",3:"M.5,.5 L1,.5"},"\u251E":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"\u251F":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"\u2520":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1"},"\u2521":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"\u2522":{1:"M.5,.5 L.5,0",3:"M0.5,1 L.5,.5 L1,.5"},"\u2525":{1:"M.5,0 L.5,1",3:"M.5,.5 L0,.5"},"\u2526":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"\u2527":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"\u2528":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1"},"\u2529":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L0,.5"},"\u252A":{1:"M.5,.5 L.5,0",3:"M0,.5 L.5,.5 L.5,1"},"\u252D":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"\u252E":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"\u252F":{1:"M.5,.5 L.5,1",3:"M0,.5 L1,.5"},"\u2530":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"\u2531":{1:"M.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"\u2532":{1:"M.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"\u2535":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"\u2536":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"\u2537":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5"},"\u2538":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,0"},"\u2539":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"\u253A":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,.5 L1,.5"},"\u253D":{1:"M.5,0 L.5,1 M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"\u253E":{1:"M.5,0 L.5,1 M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"\u253F":{1:"M.5,0 L.5,1",3:"M0,.5 L1,.5"},"\u2540":{1:"M0,.5 L1,.5 M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"\u2541":{1:"M.5,.5 L.5,0 M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"\u2542":{1:"M0,.5 L1,.5",3:"M.5,0 L.5,1"},"\u2543":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"\u2544":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"\u2545":{1:"M.5,0 L.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"\u2546":{1:"M.5,0 L.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"\u2547":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0 M0,.5 L1,.5"},"\u2548":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"\u2549":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"\u254A":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"\u254C":{1:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"\u254D":{3:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"\u2504":{1:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"\u2505":{3:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"\u2508":{1:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"\u2509":{3:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"\u254E":{1:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"\u254F":{3:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"\u2506":{1:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"\u2507":{3:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"\u250A":{1:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"\u250B":{3:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"\u256D":{1:(i,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`},"\u256E":{1:(i,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`},"\u256F":{1:(i,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`},"\u2570":{1:(i,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`}};var et={"\uE0A0":{d:"M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655",type:0},"\uE0A1":{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0},"\uE0A2":{d:"M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82",type:0},"\uE0B0":{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2},"\uE0B1":{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1},"\uE0B2":{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2},"\uE0B3":{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1},"\uE0B4":{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1},"\uE0B5":{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1},"\uE0B6":{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1},"\uE0B7":{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1},"\uE0B8":{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0},"\uE0B9":{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1},"\uE0BA":{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0},"\uE0BC":{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0},"\uE0BD":{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1},"\uE0BE":{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}};et["\uE0BB"]=et["\uE0BD"];et["\uE0BF"]=et["\uE0B9"];function yn(i,e,t,n,s,o,r,a){let l=Hr[e];if(l)return $r(i,l,t,n,s,o),!0;let u=Wr[e];if(u)return Kr(i,u,t,n,s,o),!0;let c=Gr[e];if(c)return Vr(i,c,t,n,s,o,a),!0;let d=et[e];return d?(Cr(i,d,t,n,s,o,r,a),!0):!1}function $r(i,e,t,n,s,o){for(let r=0;r<e.length;r++){let a=e[r],l=s/8,u=o/8;i.fillRect(t+a.x*l,n+a.y*u,a.w*l,a.h*u)}}var xn=new Map;function Kr(i,e,t,n,s,o){let r=xn.get(e);r||(r=new Map,xn.set(e,r));let a=i.fillStyle;if(typeof a!="string")throw new Error(`Unexpected fillStyle type "${a}"`);let l=r.get(a);if(!l){let u=e[0].length,c=e.length,d=i.canvas.ownerDocument.createElement("canvas");d.width=u,d.height=c;let h=F(d.getContext("2d")),f=new ImageData(u,c),I,L,M,q;if(a.startsWith("#"))I=parseInt(a.slice(1,3),16),L=parseInt(a.slice(3,5),16),M=parseInt(a.slice(5,7),16),q=a.length>7&&parseInt(a.slice(7,9),16)||1;else if(a.startsWith("rgba"))[I,L,M,q]=a.substring(5,a.length-1).split(",").map(S=>parseFloat(S));else throw new Error(`Unexpected fillStyle color format "${a}" when drawing pattern glyph`);for(let S=0;S<c;S++)for(let W=0;W<u;W++)f.data[(S*u+W)*4]=I,f.data[(S*u+W)*4+1]=L,f.data[(S*u+W)*4+2]=M,f.data[(S*u+W)*4+3]=e[S][W]*(q*255);h.putImageData(f,0,0),l=F(i.createPattern(d,null)),r.set(a,l)}i.fillStyle=l,i.fillRect(t,n,s,o)}function Vr(i,e,t,n,s,o,r){i.strokeStyle=i.fillStyle;for(let[a,l]of Object.entries(e)){i.beginPath(),i.lineWidth=r*Number.parseInt(a);let u;if(typeof l=="function"){let d=.15/o*s;u=l(.15,d)}else u=l;for(let c of u.split(" ")){let d=c[0],h=In[d];if(!h){console.error(`Could not find drawing instructions for "${d}"`);continue}let f=c.substring(1).split(",");!f[0]||!f[1]||h(i,Ln(f,s,o,t,n,!0,r))}i.stroke(),i.closePath()}}function Cr(i,e,t,n,s,o,r,a){let l=new Path2D;l.rect(t,n,s,o),i.clip(l),i.beginPath();let u=r/12;i.lineWidth=a*u;for(let c of e.d.split(" ")){let d=c[0],h=In[d];if(!h){console.error(`Could not find drawing instructions for "${d}"`);continue}let f=c.substring(1).split(",");!f[0]||!f[1]||h(i,Ln(f,s,o,t,n,!1,a,(e.leftPadding??0)*(u/2),(e.rightPadding??0)*(u/2)))}e.type===1?(i.strokeStyle=i.fillStyle,i.stroke()):i.fill(),i.closePath()}function En(i,e,t=0){return Math.max(Math.min(i,e),t)}var In={C:(i,e)=>i.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]),L:(i,e)=>i.lineTo(e[0],e[1]),M:(i,e)=>i.moveTo(e[0],e[1])};function Ln(i,e,t,n,s,o,r,a=0,l=0){let u=i.map(c=>parseFloat(c)||parseInt(c));if(u.length<2)throw new Error("Too few arguments for instruction");for(let c=0;c<u.length;c+=2)u[c]*=e-a*r-l*r,o&&u[c]!==0&&(u[c]=En(Math.round(u[c]+.5)-.5,e,0)),u[c]+=n+a*r;for(let c=1;c<u.length;c+=2)u[c]*=t,o&&u[c]!==0&&(u[c]=En(Math.round(u[c]+.5)-.5,t,0)),u[c]+=s;return u}var Ot=class{constructor(){this._data={}}set(e,t,n){this._data[e]||(this._data[e]={}),this._data[e][t]=n}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}},tt=class{constructor(){this._data=new Ot}set(e,t,n,s,o){this._data.get(e,t)||this._data.set(e,t,new Ot),this._data.get(e,t).set(n,s,o)}get(e,t,n,s){return this._data.get(e,t)?.get(n,s)}clear(){this._data.clear()}};var Ft=class{constructor(){this._tasks=[];this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._i<this._tasks.length;)this._tasks[this._i]()||this._i++;this.clear()}clear(){this._idleCallback&&(this._cancelCallback(this._idleCallback),this._idleCallback=void 0),this._i=0,this._tasks.length=0}_start(){this._idleCallback||(this._idleCallback=this._requestCallback(this._process.bind(this)))}_process(e){this._idleCallback=void 0;let t=0,n=0,s=e.timeRemaining(),o=0;for(;this._i<this._tasks.length;){if(t=performance.now(),this._tasks[this._i]()||this._i++,t=Math.max(1,performance.now()-t),n=Math.max(t,n),o=e.timeRemaining(),n*1.5>o){s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),this._start();return}s=o}this.clear()}},gi=class extends Ft{_requestCallback(e){return setTimeout(()=>e(this._createDeadline(16)))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){let t=performance.now()+e;return{timeRemaining:()=>Math.max(0,t-performance.now())}}},xi=class extends Ft{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}},wn=!Lt&&"requestIdleCallback"in window?xi:gi;var he=class i{constructor(){this.fg=0;this.bg=0;this.extended=new it}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},it=class i{constructor(e=0,t=0){this._ext=0;this._urlId=0;this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new i(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}};var He=class He{constructor(e){this.element=e,this.next=He.Undefined,this.prev=He.Undefined}};He.Undefined=new He(void 0);var Rn=He;var zr=globalThis.performance&&typeof globalThis.performance.now=="function",kt=class i{static create(e){return new i(e)}constructor(e){this._now=zr&&e===!1?Date.now:globalThis.performance.now.bind(globalThis.performance),this._startTime=this._now(),this._stopTime=-1}stop(){this._stopTime=this._now()}reset(){this._startTime=this._now(),this._stopTime=-1}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}};var qr=!1,Dn=!1,jr=!1,ee;(se=>{se.None=()=>B.None;function e(v){if(jr){let{onDidAddListener:p}=v,g=nt.create(),b=0;v.onDidAddListener=()=>{++b===2&&(console.warn("snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here"),g.print()),p?.()}}}function t(v,p){return h(v,()=>{},0,void 0,!0,void 0,p)}se.defer=t;function n(v){return(p,g=null,b)=>{let m=!1,_;return _=v(T=>{if(!m)return _?_.dispose():m=!0,p.call(g,T)},null,b),m&&_.dispose(),_}}se.once=n;function s(v,p,g){return c((b,m=null,_)=>v(T=>b.call(m,p(T)),null,_),g)}se.map=s;function o(v,p,g){return c((b,m=null,_)=>v(T=>{p(T),b.call(m,T)},null,_),g)}se.forEach=o;function r(v,p,g){return c((b,m=null,_)=>v(T=>p(T)&&b.call(m,T),null,_),g)}se.filter=r;function a(v){return v}se.signal=a;function l(...v){return(p,g=null,b)=>{let m=It(...v.map(_=>_(T=>p.call(g,T))));return d(m,b)}}se.any=l;function u(v,p,g,b){let m=g;return s(v,_=>(m=p(m,_),m),b)}se.reduce=u;function c(v,p){let g,b={onWillAddFirstListener(){g=v(m.fire,m)},onDidRemoveLastListener(){g?.dispose()}};p||e(b);let m=new D(b);return p?.add(m),m.event}function d(v,p){return p instanceof Array?p.push(v):p&&p.add(v),v}function h(v,p,g=100,b=!1,m=!1,_,T){let x,R,$,P=0,de,Re={leakWarningThreshold:_,onWillAddFirstListener(){x=v(ie=>{P++,R=p(R,ie),b&&!$&&(oe.fire(R),R=void 0),de=()=>{let N=R;R=void 0,$=void 0,(!b||P>1)&&oe.fire(N),P=0},typeof g=="number"?(clearTimeout($),$=setTimeout(de,g)):$===void 0&&($=0,queueMicrotask(de))})},onWillRemoveListener(){m&&P>0&&de?.()},onDidRemoveLastListener(){de=void 0,x.dispose()}};T||e(Re);let oe=new D(Re);return T?.add(oe),oe.event}se.debounce=h;function f(v,p=0,g){return se.debounce(v,(b,m)=>b?(b.push(m),b):[m],p,void 0,!0,void 0,g)}se.accumulate=f;function I(v,p=(b,m)=>b===m,g){let b=!0,m;return r(v,_=>{let T=b||!p(_,m);return b=!1,m=_,T},g)}se.latch=I;function L(v,p,g){return[se.filter(v,p,g),se.filter(v,b=>!p(b),g)]}se.split=L;function M(v,p=!1,g=[],b){let m=g.slice(),_=v(R=>{m?m.push(R):x.fire(R)});b&&b.add(_);let T=()=>{m?.forEach(R=>x.fire(R)),m=null},x=new D({onWillAddFirstListener(){_||(_=v(R=>x.fire(R)),b&&b.add(_))},onDidAddFirstListener(){m&&(p?setTimeout(T):T())},onDidRemoveLastListener(){_&&_.dispose(),_=null}});return b&&b.add(x),x.event}se.buffer=M;function q(v,p){return(b,m,_)=>{let T=p(new W);return v(function(x){let R=T.evaluate(x);R!==S&&b.call(m,R)},void 0,_)}}se.chain=q;let S=Symbol("HaltChainable");class W{constructor(){this.steps=[]}map(p){return this.steps.push(p),this}forEach(p){return this.steps.push(g=>(p(g),g)),this}filter(p){return this.steps.push(g=>p(g)?g:S),this}reduce(p,g){let b=g;return this.steps.push(m=>(b=p(b,m),b)),this}latch(p=(g,b)=>g===b){let g=!0,b;return this.steps.push(m=>{let _=g||!p(m,b);return g=!1,b=m,_?m:S}),this}evaluate(p){for(let g of this.steps)if(p=g(p),p===S)break;return p}}function E(v,p,g=b=>b){let b=(...x)=>T.fire(g(...x)),m=()=>v.on(p,b),_=()=>v.removeListener(p,b),T=new D({onWillAddFirstListener:m,onDidRemoveLastListener:_});return T.event}se.fromNodeEventEmitter=E;function y(v,p,g=b=>b){let b=(...x)=>T.fire(g(...x)),m=()=>v.addEventListener(p,b),_=()=>v.removeEventListener(p,b),T=new D({onWillAddFirstListener:m,onDidRemoveLastListener:_});return T.event}se.fromDOMEventEmitter=y;function w(v){return new Promise(p=>n(v)(p))}se.toPromise=w;function G(v){let p=new D;return v.then(g=>{p.fire(g)},()=>{p.fire(void 0)}).finally(()=>{p.dispose()}),p.event}se.fromPromise=G;function ue(v,p){return v(g=>p.fire(g))}se.forward=ue;function Se(v,p,g){return p(g),v(b=>p(b))}se.runAndSubscribe=Se;class ce{constructor(p,g){this._observable=p;this._counter=0;this._hasChanged=!1;let b={onWillAddFirstListener:()=>{p.addObserver(this)},onDidRemoveLastListener:()=>{p.removeObserver(this)}};g||e(b),this.emitter=new D(b),g&&g.add(this.emitter)}beginUpdate(p){this._counter++}handlePossibleChange(p){}handleChange(p,g){this._hasChanged=!0}endUpdate(p){this._counter--,this._counter===0&&(this._observable.reportChanges(),this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this._observable.get())))}}function we(v,p){return new ce(v,p).emitter.event}se.fromObservable=we;function A(v){return(p,g,b)=>{let m=0,_=!1,T={beginUpdate(){m++},endUpdate(){m--,m===0&&(v.reportChanges(),_&&(_=!1,p.call(g)))},handlePossibleChange(){},handleChange(){_=!0}};v.addObserver(T),v.reportChanges();let x={dispose(){v.removeObserver(T)}};return b instanceof fe?b.add(x):Array.isArray(b)&&b.push(x),x}}se.fromObservableLight=A})(ee||={});var We=class We{constructor(e){this.listenerCount=0;this.invocationCount=0;this.elapsedOverall=0;this.durations=[];this.name=`${e}_${We._idPool++}`,We.all.add(this)}start(e){this._stopWatch=new kt,this.listenerCount=e}stop(){if(this._stopWatch){let e=this._stopWatch.elapsed();this.durations.push(e),this.elapsedOverall+=e,this.invocationCount+=1,this._stopWatch=void 0}}};We.all=new Set,We._idPool=0;var Ei=We,Mn=-1;var Bt=class Bt{constructor(e,t,n=(Bt._idPool++).toString(16).padStart(3,"0")){this._errorHandler=e;this.threshold=t;this.name=n;this._warnCountdown=0}dispose(){this._stacks?.clear()}check(e,t){let n=this.threshold;if(n<=0||t<n)return;this._stacks||(this._stacks=new Map);let s=this._stacks.get(e.value)||0;if(this._stacks.set(e.value,s+1),this._warnCountdown-=1,this._warnCountdown<=0){this._warnCountdown=n*.5;let[o,r]=this.getMostFrequentStack(),a=`[${this.name}] potential listener LEAK detected, having ${t} listeners already. MOST frequent listener (${r}):`;console.warn(a),console.warn(o);let l=new Ii(a,o);this._errorHandler(l)}return()=>{let o=this._stacks.get(e.value)||0;this._stacks.set(e.value,o-1)}}getMostFrequentStack(){if(!this._stacks)return;let e,t=0;for(let[n,s]of this._stacks)(!e||t<s)&&(e=[n,s],t=s);return e}};Bt._idPool=1;var yi=Bt,nt=class i{constructor(e){this.value=e}static create(){let e=new Error;return new i(e.stack??"")}print(){console.warn(this.value.split(`
|
|
39
|
+
`).slice(2).join(`
|
|
40
|
+
`))}},Ii=class extends Error{constructor(e,t){super(e),this.name="ListenerLeakError",this.stack=t}},Li=class extends Error{constructor(e,t){super(e),this.name="ListenerRefusalError",this.stack=t}},Xr=0,Ge=class{constructor(e){this.value=e;this.id=Xr++}},Yr=2,Qr=(i,e)=>{if(i instanceof Ge)e(i);else for(let t=0;t<i.length;t++){let n=i[t];n&&e(n)}},Pt;if(qr){let i=[];setInterval(()=>{i.length!==0&&(console.warn("[LEAKING LISTENERS] GC'ed these listeners that were NOT yet disposed:"),console.warn(i.join(`
|
|
41
|
+
`)),i.length=0)},3e3),Pt=new FinalizationRegistry(e=>{typeof e=="string"&&i.push(e)})}var D=class{constructor(e){this._size=0;this._options=e,this._leakageMon=Mn>0||this._options?.leakWarningThreshold?new yi(e?.onListenerError??Pe,this._options?.leakWarningThreshold??Mn):void 0,this._perfMon=this._options?._profName?new Ei(this._options._profName):void 0,this._deliveryQueue=this._options?.deliveryQueue}dispose(){if(!this._disposed){if(this._disposed=!0,this._deliveryQueue?.current===this&&this._deliveryQueue.reset(),this._listeners){if(Dn){let e=this._listeners;queueMicrotask(()=>{Qr(e,t=>t.stack?.print())})}this._listeners=void 0,this._size=0}this._options?.onDidRemoveLastListener?.(),this._leakageMon?.dispose()}}get event(){return this._event??=(e,t,n)=>{if(this._leakageMon&&this._size>this._leakageMon.threshold**2){let l=`[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`;console.warn(l);let u=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],c=new Li(`${l}. HINT: Stack shows most frequent listener (${u[1]}-times)`,u[0]);return(this._options?.onListenerError||Pe)(c),B.None}if(this._disposed)return B.None;t&&(e=e.bind(t));let s=new Ge(e),o,r;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(s.stack=nt.create(),o=this._leakageMon.check(s.stack,this._size+1)),Dn&&(s.stack=r??nt.create()),this._listeners?this._listeners instanceof Ge?(this._deliveryQueue??=new wi,this._listeners=[this._listeners,s]):this._listeners.push(s):(this._options?.onWillAddFirstListener?.(this),this._listeners=s,this._options?.onDidAddFirstListener?.(this)),this._size++;let a=O(()=>{Pt?.unregister(a),o?.(),this._removeListener(s)});if(n instanceof fe?n.add(a):Array.isArray(n)&&n.push(a),Pt){let l=new Error().stack.split(`
|
|
42
|
+
`).slice(2,3).join(`
|
|
43
|
+
`).trim(),u=/(file:|vscode-file:\/\/vscode-app)?(\/[^:]*:\d+:\d+)/.exec(l);Pt.register(a,u?.[2]??l,a)}return a},this._event}_removeListener(e){if(this._options?.onWillRemoveListener?.(this),!this._listeners)return;if(this._size===1){this._listeners=void 0,this._options?.onDidRemoveLastListener?.(this),this._size=0;return}let t=this._listeners,n=t.indexOf(e);if(n===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,t[n]=void 0;let s=this._deliveryQueue.current===this;if(this._size*Yr<=t.length){let o=0;for(let r=0;r<t.length;r++)t[r]?t[o++]=t[r]:s&&(this._deliveryQueue.end--,o<this._deliveryQueue.i&&this._deliveryQueue.i--);t.length=o}}_deliver(e,t){if(!e)return;let n=this._options?.onListenerError||Pe;if(!n){e.value(t);return}try{e.value(t)}catch(s){n(s)}}_deliverQueue(e){let t=e.current._listeners;for(;e.i<e.end;)this._deliver(t[e.i++],e.value);e.reset()}fire(e){if(this._deliveryQueue?.current&&(this._deliverQueue(this._deliveryQueue),this._perfMon?.stop()),this._perfMon?.start(this._size),this._listeners)if(this._listeners instanceof Ge)this._deliver(this._listeners,e);else{let t=this._deliveryQueue;t.enqueue(this,e,this._listeners.length),this._deliverQueue(t)}this._perfMon?.stop()}hasListeners(){return this._size>0}};var wi=class{constructor(){this.i=-1;this.end=0}enqueue(e,t,n){this.i=0,this.end=n,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}};var An={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}},rt=2;var st,ae=class i{constructor(e,t,n){this._document=e;this._config=t;this._unicodeService=n;this._didWarmUp=!1;this._cacheMap=new tt;this._cacheMapCombined=new tt;this._pages=[];this._activePages=[];this._workBoundingBox={top:0,left:0,bottom:0,right:0};this._workAttributeData=new he;this._textureSize=512;this._onAddTextureAtlasCanvas=new D;this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=new D;this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._requestClearModel=!1;this._createNewPage(),this._tmpCanvas=Sn(e,this._config.deviceCellWidth*4+rt*2,this._config.deviceCellHeight+rt*2),this._tmpCtx=F(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}get pages(){return this._pages}dispose(){this._tmpCanvas.remove();for(let e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){let e=new wn;for(let t=33;t<126;t++)e.enqueue(()=>{if(!this._cacheMap.get(t,0,0,0)){let n=this._drawToCache(t,0,0,0,!1,void 0);this._cacheMap.set(t,0,0,0,n)}})}beginFrame(){return this._requestClearModel}clearTexture(){if(!(this._pages[0].currentRow.x===0&&this._pages[0].currentRow.y===0)){for(let e of this._pages)e.clear();this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=!1}}_createNewPage(){if(i.maxAtlasPages&&this._pages.length>=Math.max(4,i.maxAtlasPages)){let t=this._pages.filter(u=>u.canvas.width*2<=(i.maxTextureSize||4096)).sort((u,c)=>c.canvas.width!==u.canvas.width?c.canvas.width-u.canvas.width:c.percentageUsed-u.percentageUsed),n=-1,s=0;for(let u=0;u<t.length;u++)if(t[u].canvas.width!==s)n=u,s=t[u].canvas.width;else if(u-n===3)break;let o=t.slice(n,n+4),r=o.map(u=>u.glyphs[0].texturePage).sort((u,c)=>u>c?1:-1),a=this.pages.length-o.length,l=this._mergePages(o,a);l.version++;for(let u=r.length-1;u>=0;u--)this._deletePage(r[u]);this.pages.push(l),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(l.canvas)}let e=new ot(this._document,this._textureSize);return this._pages.push(e),this._activePages.push(e),this._onAddTextureAtlasCanvas.fire(e.canvas),e}_mergePages(e,t){let n=e[0].canvas.width*2,s=new ot(this._document,n,e);for(let[o,r]of e.entries()){let a=o*r.canvas.width%n,l=Math.floor(o/2)*r.canvas.height;s.ctx.drawImage(r.canvas,a,l);for(let c of r.glyphs)c.texturePage=t,c.sizeClipSpace.x=c.size.x/n,c.sizeClipSpace.y=c.size.y/n,c.texturePosition.x+=a,c.texturePosition.y+=l,c.texturePositionClipSpace.x=c.texturePosition.x/n,c.texturePositionClipSpace.y=c.texturePosition.y/n;this._onRemoveTextureAtlasCanvas.fire(r.canvas);let u=this._activePages.indexOf(r);u!==-1&&this._activePages.splice(u,1)}return s}_deletePage(e){this._pages.splice(e,1);for(let t=e;t<this._pages.length;t++){let n=this._pages[t];for(let s of n.glyphs)s.texturePage--;n.version++}}getRasterizedGlyphCombinedChar(e,t,n,s,o,r){return this._getFromCacheMap(this._cacheMapCombined,e,t,n,s,o,r)}getRasterizedGlyph(e,t,n,s,o,r){return this._getFromCacheMap(this._cacheMap,e,t,n,s,o,r)}_getFromCacheMap(e,t,n,s,o,r,a){return st=e.get(t,n,s,o),st||(st=this._drawToCache(t,n,s,o,r,a),e.set(t,n,s,o,st)),st}_getColorFromAnsiIndex(e){if(e>=this._config.colors.ansi.length)throw new Error("No color found for idx "+e);return this._config.colors.ansi[e]}_getBackgroundColor(e,t,n,s){if(this._config.allowTransparency)return Z;let o;switch(e){case 16777216:case 33554432:o=this._getColorFromAnsiIndex(t);break;case 50331648:let r=he.toColorRGB(t);o=X.toColor(r[0],r[1],r[2]);break;case 0:default:n?o=Ue.opaque(this._config.colors.foreground):o=this._config.colors.background;break}return this._config.allowTransparency||(o=Ue.opaque(o)),o}_getForegroundColor(e,t,n,s,o,r,a,l,u,c){let d=this._getMinimumContrastColor(e,t,n,s,o,r,a,u,l,c);if(d)return d;let h;switch(o){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&u&&r<8&&(r+=8),h=this._getColorFromAnsiIndex(r);break;case 50331648:let f=he.toColorRGB(r);h=X.toColor(f[0],f[1],f[2]);break;case 0:default:a?h=this._config.colors.background:h=this._config.colors.foreground}return this._config.allowTransparency&&(h=Ue.opaque(h)),l&&(h=Ue.multiplyOpacity(h,gn)),h}_resolveBackgroundRgba(e,t,n){switch(e){case 16777216:case 33554432:return this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return n?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(e,t,n,s){switch(e){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&t<8&&(t+=8),this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return n?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(e,t,n,s,o,r,a,l,u,c){if(this._config.minimumContrastRatio===1||c)return;let d=this._getContrastCache(u),h=d.getColor(e,s);if(h!==void 0)return h||void 0;let f=this._resolveBackgroundRgba(t,n,a),I=this._resolveForegroundRgba(o,r,a,l),L=Te.ensureContrastRatio(f,I,this._config.minimumContrastRatio/(u?2:1));if(!L){d.setColor(e,s,null);return}let M=X.toColor(L>>24&255,L>>16&255,L>>8&255);return d.setColor(e,s,M),M}_getContrastCache(e){return e?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(e,t,n,s,o,r){let a=typeof e=="number"?String.fromCharCode(e):e;r&&this._tmpCanvas.parentElement!==r&&(this._tmpCanvas.style.display="none",r.append(this._tmpCanvas));let l=Math.min(this._config.deviceCellWidth*Math.max(a.length,2)+rt*2,this._config.deviceMaxTextureSize);this._tmpCanvas.width<l&&(this._tmpCanvas.width=l);let u=Math.min(this._config.deviceCellHeight+rt*4,this._textureSize);if(this._tmpCanvas.height<u&&(this._tmpCanvas.height=u),this._tmpCtx.save(),this._workAttributeData.fg=n,this._workAttributeData.bg=t,this._workAttributeData.extended.ext=s,!!this._workAttributeData.isInvisible())return An;let d=!!this._workAttributeData.isBold(),h=!!this._workAttributeData.isInverse(),f=!!this._workAttributeData.isDim(),I=!!this._workAttributeData.isItalic(),L=!!this._workAttributeData.isUnderline(),M=!!this._workAttributeData.isStrikethrough(),q=!!this._workAttributeData.isOverline(),S=this._workAttributeData.getFgColor(),W=this._workAttributeData.getFgColorMode(),E=this._workAttributeData.getBgColor(),y=this._workAttributeData.getBgColorMode();if(h){let x=S;S=E,E=x;let R=W;W=y,y=R}let w=this._getBackgroundColor(y,E,h,f);this._tmpCtx.globalCompositeOperation="copy",this._tmpCtx.fillStyle=w.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.globalCompositeOperation="source-over";let G=d?this._config.fontWeightBold:this._config.fontWeight,ue=I?"italic":"";this._tmpCtx.font=`${ue} ${G} ${this._config.fontSize*this._config.devicePixelRatio}px ${this._config.fontFamily}`,this._tmpCtx.textBaseline=St;let Se=a.length===1&&Rt(a.charCodeAt(0)),ce=a.length===1&&fn(a.charCodeAt(0)),we=this._getForegroundColor(t,y,E,n,W,S,h,f,d,Dt(a.charCodeAt(0)));this._tmpCtx.fillStyle=we.css;let A=ce?0:rt*2,se=!1;this._config.customGlyphs!==!1&&(se=yn(this._tmpCtx,a,A,A,this._config.deviceCellWidth,this._config.deviceCellHeight,this._config.fontSize,this._config.devicePixelRatio));let v=!Se,p;if(typeof e=="number"?p=this._unicodeService.wcwidth(e):p=this._unicodeService.getStringCellWidth(e),L){this._tmpCtx.save();let x=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),R=x%2===1?.5:0;if(this._tmpCtx.lineWidth=x,this._workAttributeData.isUnderlineColorDefault())this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle;else if(this._workAttributeData.isUnderlineColorRGB())v=!1,this._tmpCtx.strokeStyle=`rgb(${he.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`;else{v=!1;let ie=this._workAttributeData.getUnderlineColor();this._config.drawBoldTextInBrightColors&&this._workAttributeData.isBold()&&ie<8&&(ie+=8),this._tmpCtx.strokeStyle=this._getColorFromAnsiIndex(ie).css}this._tmpCtx.beginPath();let $=A,P=Math.ceil(A+this._config.deviceCharHeight)-R-(o?x*2:0),de=P+x,Re=P+x*2,oe=this._workAttributeData.getUnderlineVariantOffset();for(let ie=0;ie<p;ie++){this._tmpCtx.save();let N=$+ie*this._config.deviceCellWidth,ne=$+(ie+1)*this._config.deviceCellWidth,di=N+this._config.deviceCellWidth/2;switch(this._workAttributeData.extended.underlineStyle){case 2:this._tmpCtx.moveTo(N,P),this._tmpCtx.lineTo(ne,P),this._tmpCtx.moveTo(N,Re),this._tmpCtx.lineTo(ne,Re);break;case 3:let ft=x<=1?Re:Math.ceil(A+this._config.deviceCharHeight-x/2)-R,mt=x<=1?P:Math.ceil(A+this._config.deviceCharHeight+x/2)-R,qi=new Path2D;qi.rect(N,P,this._config.deviceCellWidth,Re-P),this._tmpCtx.clip(qi),this._tmpCtx.moveTo(N-this._config.deviceCellWidth/2,de),this._tmpCtx.bezierCurveTo(N-this._config.deviceCellWidth/2,mt,N,mt,N,de),this._tmpCtx.bezierCurveTo(N,ft,di,ft,di,de),this._tmpCtx.bezierCurveTo(di,mt,ne,mt,ne,de),this._tmpCtx.bezierCurveTo(ne,ft,ne+this._config.deviceCellWidth/2,ft,ne+this._config.deviceCellWidth/2,de);break;case 4:let _t=oe===0?0:oe>=x?x*2-oe:x-oe;!(oe>=x)===!1||_t===0?(this._tmpCtx.setLineDash([Math.round(x),Math.round(x)]),this._tmpCtx.moveTo(N+_t,P),this._tmpCtx.lineTo(ne,P)):(this._tmpCtx.setLineDash([Math.round(x),Math.round(x)]),this._tmpCtx.moveTo(N,P),this._tmpCtx.lineTo(N+_t,P),this._tmpCtx.moveTo(N+_t+x,P),this._tmpCtx.lineTo(ne,P)),oe=bn(ne-N,x,oe);break;case 5:let Er=.6,yr=.3,hi=ne-N,ji=Math.floor(Er*hi),Xi=Math.floor(yr*hi),Ir=hi-ji-Xi;this._tmpCtx.setLineDash([ji,Xi,Ir]),this._tmpCtx.moveTo(N,P),this._tmpCtx.lineTo(ne,P);break;case 1:default:this._tmpCtx.moveTo(N,P),this._tmpCtx.lineTo(ne,P);break}this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!se&&this._config.fontSize>=12&&!this._config.allowTransparency&&a!==" "){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";let ie=this._tmpCtx.measureText(a);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in ie&&ie.actualBoundingBoxDescent>0){this._tmpCtx.save();let N=new Path2D;N.rect($,P-Math.ceil(x/2),this._config.deviceCellWidth*p,Re-P+Math.ceil(x/2)),this._tmpCtx.clip(N),this._tmpCtx.lineWidth=this._config.devicePixelRatio*3,this._tmpCtx.strokeStyle=w.css,this._tmpCtx.strokeText(a,A,A+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(q){let x=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),R=x%2===1?.5:0;this._tmpCtx.lineWidth=x,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(A,A+R),this._tmpCtx.lineTo(A+this._config.deviceCharWidth*p,A+R),this._tmpCtx.stroke()}if(se||this._tmpCtx.fillText(a,A,A+this._config.deviceCharHeight),a==="_"&&!this._config.allowTransparency){let x=Di(this._tmpCtx.getImageData(A,A,this._config.deviceCellWidth,this._config.deviceCellHeight),w,we,v);if(x)for(let R=1;R<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=w.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(a,A,A+this._config.deviceCharHeight-R),x=Di(this._tmpCtx.getImageData(A,A,this._config.deviceCellWidth,this._config.deviceCellHeight),w,we,v),!!x);R++);}if(M){let x=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),R=this._tmpCtx.lineWidth%2===1?.5:0;this._tmpCtx.lineWidth=x,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(A,A+Math.floor(this._config.deviceCharHeight/2)-R),this._tmpCtx.lineTo(A+this._config.deviceCharWidth*p,A+Math.floor(this._config.deviceCharHeight/2)-R),this._tmpCtx.stroke()}this._tmpCtx.restore();let g=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height),b;if(this._config.allowTransparency?b=Jr(g):b=Di(g,w,we,v),b)return An;let m=this._findGlyphBoundingBox(g,this._workBoundingBox,l,ce,se,A),_,T;for(;;){if(this._activePages.length===0){let x=this._createNewPage();_=x,T=x.currentRow,T.height=m.size.y;break}_=this._activePages[this._activePages.length-1],T=_.currentRow;for(let x of this._activePages)m.size.y<=x.currentRow.height&&(_=x,T=x.currentRow);for(let x=this._activePages.length-1;x>=0;x--)for(let R of this._activePages[x].fixedRows)R.height<=T.height&&m.size.y<=R.height&&(_=this._activePages[x],T=R);if(m.size.x>this._textureSize){this._overflowSizePage||(this._overflowSizePage=new ot(this._document,this._config.deviceMaxTextureSize),this.pages.push(this._overflowSizePage),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas)),_=this._overflowSizePage,T=this._overflowSizePage.currentRow,T.x+m.size.x>=_.canvas.width&&(T.x=0,T.y+=T.height,T.height=0);break}if(T.y+m.size.y>=_.canvas.height||T.height>m.size.y+2){let x=!1;if(_.currentRow.y+_.currentRow.height+m.size.y>=_.canvas.height){let R;for(let $ of this._activePages)if($.currentRow.y+$.currentRow.height+m.size.y<$.canvas.height){R=$;break}if(R)_=R;else if(i.maxAtlasPages&&this._pages.length>=i.maxAtlasPages&&T.y+m.size.y<=_.canvas.height&&T.height>=m.size.y&&T.x+m.size.x<=_.canvas.width)x=!0;else{let $=this._createNewPage();_=$,T=$.currentRow,T.height=m.size.y,x=!0}}x||(_.currentRow.height>0&&_.fixedRows.push(_.currentRow),T={x:0,y:_.currentRow.y+_.currentRow.height,height:m.size.y},_.fixedRows.push(T),_.currentRow={x:0,y:T.y+T.height,height:0})}if(T.x+m.size.x<=_.canvas.width)break;T===_.currentRow?(T.x=0,T.y+=T.height,T.height=0):_.fixedRows.splice(_.fixedRows.indexOf(T),1)}return m.texturePage=this._pages.indexOf(_),m.texturePosition.x=T.x,m.texturePosition.y=T.y,m.texturePositionClipSpace.x=T.x/_.canvas.width,m.texturePositionClipSpace.y=T.y/_.canvas.height,m.sizeClipSpace.x/=_.canvas.width,m.sizeClipSpace.y/=_.canvas.height,T.height=Math.max(T.height,m.size.y),T.x+=m.size.x,_.ctx.putImageData(g,m.texturePosition.x-this._workBoundingBox.left,m.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,m.size.x,m.size.y),_.addGlyph(m),_.version++,m}_findGlyphBoundingBox(e,t,n,s,o,r){t.top=0;let a=s?this._config.deviceCellHeight:this._tmpCanvas.height,l=s?this._config.deviceCellWidth:n,u=!1;for(let c=0;c<a;c++){for(let d=0;d<l;d++){let h=c*this._tmpCanvas.width*4+d*4+3;if(e.data[h]!==0){t.top=c,u=!0;break}}if(u)break}t.left=0,u=!1;for(let c=0;c<r+l;c++){for(let d=0;d<a;d++){let h=d*this._tmpCanvas.width*4+c*4+3;if(e.data[h]!==0){t.left=c,u=!0;break}}if(u)break}t.right=l,u=!1;for(let c=r+l-1;c>=r;c--){for(let d=0;d<a;d++){let h=d*this._tmpCanvas.width*4+c*4+3;if(e.data[h]!==0){t.right=c,u=!0;break}}if(u)break}t.bottom=a,u=!1;for(let c=a-1;c>=0;c--){for(let d=0;d<l;d++){let h=c*this._tmpCanvas.width*4+d*4+3;if(e.data[h]!==0){t.bottom=c,u=!0;break}}if(u)break}return{texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},size:{x:t.right-t.left+1,y:t.bottom-t.top+1},sizeClipSpace:{x:t.right-t.left+1,y:t.bottom-t.top+1},offset:{x:-t.left+r+(s||o?Math.floor((this._config.deviceCellWidth-this._config.deviceCharWidth)/2):0),y:-t.top+r+(s||o?this._config.lineHeight===1?0:Math.round((this._config.deviceCellHeight-this._config.deviceCharHeight)/2):0)}}}},ot=class{constructor(e,t,n){this._usedPixels=0;this._glyphs=[];this.version=0;this.currentRow={x:0,y:0,height:0};this.fixedRows=[];if(n)for(let s of n)this._glyphs.push(...s.glyphs),this._usedPixels+=s._usedPixels;this.canvas=Sn(e,t,t),this.ctx=F(this.canvas.getContext("2d",{alpha:!0}))}get percentageUsed(){return this._usedPixels/(this.canvas.width*this.canvas.height)}get glyphs(){return this._glyphs}addGlyph(e){this._glyphs.push(e),this._usedPixels+=e.size.x*e.size.y}clear(){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.currentRow.x=0,this.currentRow.y=0,this.currentRow.height=0,this.fixedRows.length=0,this.version++}};function Di(i,e,t,n){let s=e.rgba>>>24,o=e.rgba>>>16&255,r=e.rgba>>>8&255,a=t.rgba>>>24,l=t.rgba>>>16&255,u=t.rgba>>>8&255,c=Math.floor((Math.abs(s-a)+Math.abs(o-l)+Math.abs(r-u))/12),d=!0;for(let h=0;h<i.data.length;h+=4)i.data[h]===s&&i.data[h+1]===o&&i.data[h+2]===r||n&&Math.abs(i.data[h]-s)+Math.abs(i.data[h+1]-o)+Math.abs(i.data[h+2]-r)<c?i.data[h+3]=0:d=!1;return d}function Jr(i){for(let e=0;e<i.data.length;e+=4)if(i.data[e+3]>0)return!1;return!0}function Sn(i,e,t){let n=i.createElement("canvas");return n.width=e,n.height=t,n}function On(i,e,t,n,s,o,r,a){let l={foreground:o.foreground,background:o.background,cursor:Z,cursorAccent:Z,selectionForeground:Z,selectionBackgroundTransparent:Z,selectionBackgroundOpaque:Z,selectionInactiveBackgroundTransparent:Z,selectionInactiveBackgroundOpaque:Z,overviewRulerBorder:Z,scrollbarSliderBackground:Z,scrollbarSliderHoverBackground:Z,scrollbarSliderActiveBackground:Z,ansi:o.ansi.slice(),contrastCache:o.contrastCache,halfContrastCache:o.halfContrastCache};return{customGlyphs:s.customGlyphs,devicePixelRatio:r,deviceMaxTextureSize:a,letterSpacing:s.letterSpacing,lineHeight:s.lineHeight,deviceCellWidth:i,deviceCellHeight:e,deviceCharWidth:t,deviceCharHeight:n,fontFamily:s.fontFamily,fontSize:s.fontSize,fontWeight:s.fontWeight,fontWeightBold:s.fontWeightBold,allowTransparency:s.allowTransparency,drawBoldTextInBrightColors:s.drawBoldTextInBrightColors,minimumContrastRatio:s.minimumContrastRatio,colors:l}}function Mi(i,e){for(let t=0;t<i.colors.ansi.length;t++)if(i.colors.ansi[t].rgba!==e.colors.ansi[t].rgba)return!1;return i.devicePixelRatio===e.devicePixelRatio&&i.customGlyphs===e.customGlyphs&&i.lineHeight===e.lineHeight&&i.letterSpacing===e.letterSpacing&&i.fontFamily===e.fontFamily&&i.fontSize===e.fontSize&&i.fontWeight===e.fontWeight&&i.fontWeightBold===e.fontWeightBold&&i.allowTransparency===e.allowTransparency&&i.deviceCharWidth===e.deviceCharWidth&&i.deviceCharHeight===e.deviceCharHeight&&i.drawBoldTextInBrightColors===e.drawBoldTextInBrightColors&&i.minimumContrastRatio===e.minimumContrastRatio&&i.colors.foreground.rgba===e.colors.foreground.rgba&&i.colors.background.rgba===e.colors.background.rgba}function Fn(i){return(i&50331648)===16777216||(i&50331648)===33554432}var le=[];function Nt(i,e,t,n,s,o,r,a,l){let u=On(n,s,o,r,e,t,a,l);for(let h=0;h<le.length;h++){let f=le[h],I=f.ownedBy.indexOf(i);if(I>=0){if(Mi(f.config,u))return f.atlas;f.ownedBy.length===1?(f.atlas.dispose(),le.splice(h,1)):f.ownedBy.splice(I,1);break}}for(let h=0;h<le.length;h++){let f=le[h];if(Mi(f.config,u))return f.ownedBy.push(i),f.atlas}let c=i._core,d={atlas:new ae(document,u,c.unicodeService),config:u,ownedBy:[i]};return le.push(d),d.atlas}function Ai(i){for(let e=0;e<le.length;e++){let t=le[e].ownedBy.indexOf(i);if(t!==-1){le[e].ownedBy.length===1?(le[e].atlas.dispose(),le.splice(e,1)):le[e].ownedBy.splice(t,1);break}}}var Ut=600,Ht=class{constructor(e,t){this._renderCallback=e;this._coreBrowserService=t;this.isCursorVisible=!0,this._coreBrowserService.isFocused&&this._restartInterval()}get isPaused(){return!(this._blinkStartTimeout||this._blinkInterval)}dispose(){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}restartBlinkAnimation(){this.isPaused||(this._animationTimeRestarted=Date.now(),this.isCursorVisible=!0,this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0})))}_restartInterval(e=Ut){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout(()=>{if(this._animationTimeRestarted){let t=Ut-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,t>0){this._restartInterval(t);return}}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0}),this._blinkInterval=this._coreBrowserService.window.setInterval(()=>{if(this._animationTimeRestarted){let t=Ut-(Date.now()-this._animationTimeRestarted);this._animationTimeRestarted=void 0,this._restartInterval(t);return}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0})},Ut)},e)}pause(){this.isCursorVisible=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this.restartBlinkAnimation()}};function Si(i,e,t){let n=new e.ResizeObserver(s=>{let o=s.find(l=>l.target===i);if(!o)return;if(!("devicePixelContentBoxSize"in o)){n?.disconnect(),n=void 0;return}let r=o.devicePixelContentBoxSize[0].inlineSize,a=o.devicePixelContentBoxSize[0].blockSize;r>0&&a>0&&t(r,a)});try{n.observe(i,{box:["device-pixel-content-box"]})}catch{n.disconnect(),n=void 0}return O(()=>n?.disconnect())}function kn(i){return i>65535?(i-=65536,String.fromCharCode((i>>10)+55296)+String.fromCharCode(i%1024+56320)):String.fromCharCode(i)}var at=class i extends he{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new it;this.combinedData=""}static fromCharData(t){let n=new i;return n.setFromCharData(t),n}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?kn(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(t){this.fg=t[0],this.bg=0;let n=!1;if(t[1].length>2)n=!0;else if(t[1].length===2){let s=t[1].charCodeAt(0);if(55296<=s&&s<=56319){let o=t[1].charCodeAt(1);56320<=o&&o<=57343?this.content=(s-55296)*1024+o-56320+65536|t[2]<<22:n=!0}else n=!0}else this.content=t[1].charCodeAt(0)|t[2]<<22;n&&(this.combinedData=t[1],this.content=2097152|t[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}};var Gt=new Float32Array([2,0,0,0,0,-2,0,0,0,0,1,0,-1,1,0,1]);function $t(i,e,t){let n=F(i.createProgram());if(i.attachShader(n,F(Pn(i,i.VERTEX_SHADER,e))),i.attachShader(n,F(Pn(i,i.FRAGMENT_SHADER,t))),i.linkProgram(n),i.getProgramParameter(n,i.LINK_STATUS))return n;console.error(i.getProgramInfoLog(n)),i.deleteProgram(n)}function Pn(i,e,t){let n=F(i.createShader(e));if(i.shaderSource(n,t),i.compileShader(n),i.getShaderParameter(n,i.COMPILE_STATUS))return n;console.error(i.getShaderInfoLog(n)),i.deleteShader(n)}function Bn(i,e){let t=Math.min(i.length*2,e),n=new Float32Array(t);for(let s=0;s<i.length;s++)n[s]=i[s];return n}var Wt=class{constructor(e){this.texture=e,this.version=-1}};var is=`#version 300 es
|
|
44
|
+
layout (location = 0) in vec2 a_unitquad;
|
|
45
|
+
layout (location = 1) in vec2 a_cellpos;
|
|
46
|
+
layout (location = 2) in vec2 a_offset;
|
|
47
|
+
layout (location = 3) in vec2 a_size;
|
|
48
|
+
layout (location = 4) in float a_texpage;
|
|
49
|
+
layout (location = 5) in vec2 a_texcoord;
|
|
50
|
+
layout (location = 6) in vec2 a_texsize;
|
|
51
|
+
|
|
52
|
+
uniform mat4 u_projection;
|
|
53
|
+
uniform vec2 u_resolution;
|
|
54
|
+
|
|
55
|
+
out vec2 v_texcoord;
|
|
56
|
+
flat out int v_texpage;
|
|
57
|
+
|
|
58
|
+
void main() {
|
|
59
|
+
vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);
|
|
60
|
+
gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);
|
|
61
|
+
v_texpage = int(a_texpage);
|
|
62
|
+
v_texcoord = a_texcoord + a_unitquad * a_texsize;
|
|
63
|
+
}`;function ns(i){let e="";for(let t=1;t<i;t++)e+=` else if (v_texpage == ${t}) { outColor = texture(u_texture[${t}], v_texcoord); }`;return`#version 300 es
|
|
64
|
+
precision lowp float;
|
|
65
|
+
|
|
66
|
+
in vec2 v_texcoord;
|
|
67
|
+
flat in int v_texpage;
|
|
68
|
+
|
|
69
|
+
uniform sampler2D u_texture[${i}];
|
|
70
|
+
|
|
71
|
+
out vec4 outColor;
|
|
72
|
+
|
|
73
|
+
void main() {
|
|
74
|
+
if (v_texpage == 0) {
|
|
75
|
+
outColor = texture(u_texture[0], v_texcoord);
|
|
76
|
+
} ${e}
|
|
77
|
+
}`}var De=11,Ve=De*Float32Array.BYTES_PER_ELEMENT,rs=2,H=0,k,Fi=0,lt=0,Kt=class extends B{constructor(t,n,s,o){super();this._terminal=t;this._gl=n;this._dimensions=s;this._optionsService=o;this._activeBuffer=0;this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};let r=this._gl;ae.maxAtlasPages===void 0&&(ae.maxAtlasPages=Math.min(32,F(r.getParameter(r.MAX_TEXTURE_IMAGE_UNITS))),ae.maxTextureSize=F(r.getParameter(r.MAX_TEXTURE_SIZE))),this._program=F($t(r,is,ns(ae.maxAtlasPages))),this._register(O(()=>r.deleteProgram(this._program))),this._projectionLocation=F(r.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=F(r.getUniformLocation(this._program,"u_resolution")),this._textureLocation=F(r.getUniformLocation(this._program,"u_texture")),this._vertexArrayObject=r.createVertexArray(),r.bindVertexArray(this._vertexArrayObject);let a=new Float32Array([0,0,1,0,0,1,1,1]),l=r.createBuffer();this._register(O(()=>r.deleteBuffer(l))),r.bindBuffer(r.ARRAY_BUFFER,l),r.bufferData(r.ARRAY_BUFFER,a,r.STATIC_DRAW),r.enableVertexAttribArray(0),r.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);let u=new Uint8Array([0,1,2,3]),c=r.createBuffer();this._register(O(()=>r.deleteBuffer(c))),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,c),r.bufferData(r.ELEMENT_ARRAY_BUFFER,u,r.STATIC_DRAW),this._attributesBuffer=F(r.createBuffer()),this._register(O(()=>r.deleteBuffer(this._attributesBuffer))),r.bindBuffer(r.ARRAY_BUFFER,this._attributesBuffer),r.enableVertexAttribArray(2),r.vertexAttribPointer(2,2,r.FLOAT,!1,Ve,0),r.vertexAttribDivisor(2,1),r.enableVertexAttribArray(3),r.vertexAttribPointer(3,2,r.FLOAT,!1,Ve,2*Float32Array.BYTES_PER_ELEMENT),r.vertexAttribDivisor(3,1),r.enableVertexAttribArray(4),r.vertexAttribPointer(4,1,r.FLOAT,!1,Ve,4*Float32Array.BYTES_PER_ELEMENT),r.vertexAttribDivisor(4,1),r.enableVertexAttribArray(5),r.vertexAttribPointer(5,2,r.FLOAT,!1,Ve,5*Float32Array.BYTES_PER_ELEMENT),r.vertexAttribDivisor(5,1),r.enableVertexAttribArray(6),r.vertexAttribPointer(6,2,r.FLOAT,!1,Ve,7*Float32Array.BYTES_PER_ELEMENT),r.vertexAttribDivisor(6,1),r.enableVertexAttribArray(1),r.vertexAttribPointer(1,2,r.FLOAT,!1,Ve,9*Float32Array.BYTES_PER_ELEMENT),r.vertexAttribDivisor(1,1),r.useProgram(this._program);let d=new Int32Array(ae.maxAtlasPages);for(let h=0;h<ae.maxAtlasPages;h++)d[h]=h;r.uniform1iv(this._textureLocation,d),r.uniformMatrix4fv(this._projectionLocation,!1,Gt),this._atlasTextures=[];for(let h=0;h<ae.maxAtlasPages;h++){let f=new Wt(F(r.createTexture()));this._register(O(()=>r.deleteTexture(f.texture))),r.activeTexture(r.TEXTURE0+h),r.bindTexture(r.TEXTURE_2D,f.texture),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,1,1,0,r.RGBA,r.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[h]=f}r.enable(r.BLEND),r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return this._atlas?this._atlas.beginFrame():!0}updateCell(t,n,s,o,r,a,l,u,c){this._updateCell(this._vertices.attributes,t,n,s,o,r,a,l,u,c)}_updateCell(t,n,s,o,r,a,l,u,c,d){if(H=(s*this._terminal.cols+n)*De,o===0||o===void 0){t.fill(0,H,H+De-1-rs);return}this._atlas&&(u&&u.length>1?k=this._atlas.getRasterizedGlyphCombinedChar(u,r,a,l,!1,this._terminal.element):k=this._atlas.getRasterizedGlyph(o,r,a,l,!1,this._terminal.element),Fi=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),r!==d&&k.offset.x>Fi?(lt=k.offset.x-Fi,t[H]=-(k.offset.x-lt)+this._dimensions.device.char.left,t[H+1]=-k.offset.y+this._dimensions.device.char.top,t[H+2]=(k.size.x-lt)/this._dimensions.device.canvas.width,t[H+3]=k.size.y/this._dimensions.device.canvas.height,t[H+4]=k.texturePage,t[H+5]=k.texturePositionClipSpace.x+lt/this._atlas.pages[k.texturePage].canvas.width,t[H+6]=k.texturePositionClipSpace.y,t[H+7]=k.sizeClipSpace.x-lt/this._atlas.pages[k.texturePage].canvas.width,t[H+8]=k.sizeClipSpace.y):(t[H]=-k.offset.x+this._dimensions.device.char.left,t[H+1]=-k.offset.y+this._dimensions.device.char.top,t[H+2]=k.size.x/this._dimensions.device.canvas.width,t[H+3]=k.size.y/this._dimensions.device.canvas.height,t[H+4]=k.texturePage,t[H+5]=k.texturePositionClipSpace.x,t[H+6]=k.texturePositionClipSpace.y,t[H+7]=k.sizeClipSpace.x,t[H+8]=k.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&mn(o,c,k.size.x,this._dimensions.device.cell.width)&&(t[H+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width))}clear(){let t=this._terminal,n=t.cols*t.rows*De;this._vertices.count!==n?this._vertices.attributes=new Float32Array(n):this._vertices.attributes.fill(0);let s=0;for(;s<this._vertices.attributesBuffers.length;s++)this._vertices.count!==n?this._vertices.attributesBuffers[s]=new Float32Array(n):this._vertices.attributesBuffers[s].fill(0);this._vertices.count=n,s=0;for(let o=0;o<t.rows;o++)for(let r=0;r<t.cols;r++)this._vertices.attributes[s+9]=r/t.cols,this._vertices.attributes[s+10]=o/t.rows,s+=De}handleResize(){let t=this._gl;t.useProgram(this._program),t.viewport(0,0,t.canvas.width,t.canvas.height),t.uniform2f(this._resolutionLocation,t.canvas.width,t.canvas.height),this.clear()}render(t){if(!this._atlas)return;let n=this._gl;n.useProgram(this._program),n.bindVertexArray(this._vertexArrayObject),this._activeBuffer=(this._activeBuffer+1)%2;let s=this._vertices.attributesBuffers[this._activeBuffer],o=0;for(let r=0;r<t.lineLengths.length;r++){let a=r*this._terminal.cols*De,l=this._vertices.attributes.subarray(a,a+t.lineLengths[r]*De);s.set(l,o),o+=l.length}n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.bufferData(n.ARRAY_BUFFER,s.subarray(0,o),n.STREAM_DRAW);for(let r=0;r<this._atlas.pages.length;r++)this._atlas.pages[r].version!==this._atlasTextures[r].version&&this._bindAtlasPageTexture(n,this._atlas,r);n.drawElementsInstanced(n.TRIANGLE_STRIP,4,n.UNSIGNED_BYTE,0,o/De)}setAtlas(t){this._atlas=t;for(let n of this._atlasTextures)n.version=-1}_bindAtlasPageTexture(t,n,s){t.activeTexture(t.TEXTURE0+s),t.bindTexture(t.TEXTURE_2D,this._atlasTextures[s].texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,n.pages[s].canvas),t.generateMipmap(t.TEXTURE_2D),this._atlasTextures[s].version=n.pages[s].version}setDimensions(t){this._dimensions=t}};var ki=class{constructor(){this.clear()}clear(){this.hasSelection=!1,this.columnSelectMode=!1,this.viewportStartRow=0,this.viewportEndRow=0,this.viewportCappedStartRow=0,this.viewportCappedEndRow=0,this.startCol=0,this.endCol=0,this.selectionStart=void 0,this.selectionEnd=void 0}update(e,t,n,s=!1){if(this.selectionStart=t,this.selectionEnd=n,!t||!n||t[0]===n[0]&&t[1]===n[1]){this.clear();return}let o=e.buffers.active.ydisp,r=t[1]-o,a=n[1]-o,l=Math.max(r,0),u=Math.min(a,e.rows-1);if(l>=e.rows||u<0){this.clear();return}this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=r,this.viewportEndRow=a,this.viewportCappedStartRow=l,this.viewportCappedEndRow=u,this.startCol=t[0],this.endCol=n[0]}isCellSelected(e,t,n){return this.hasSelection?(n-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&n>=this.viewportCappedStartRow&&t<this.endCol&&n<=this.viewportCappedEndRow:t<this.startCol&&n>=this.viewportCappedStartRow&&t>=this.endCol&&n<=this.viewportCappedEndRow:n>this.viewportStartRow&&n<this.viewportEndRow||this.viewportStartRow===this.viewportEndRow&&n===this.viewportStartRow&&t>=this.startCol&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&n===this.viewportEndRow&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&n===this.viewportStartRow&&t>=this.startCol):!1}};function Nn(){return new ki}var Ce=4,ze=1,qe=2,Ct=3,Un=2147483648,Vt=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=Nn()}resize(e,t){let n=e*t*Ce;n!==this.cells.length&&(this.cells=new Uint32Array(n),this.lineLengths=new Uint32Array(t))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}};var ss=`#version 300 es
|
|
78
|
+
layout (location = 0) in vec2 a_position;
|
|
79
|
+
layout (location = 1) in vec2 a_size;
|
|
80
|
+
layout (location = 2) in vec4 a_color;
|
|
81
|
+
layout (location = 3) in vec2 a_unitquad;
|
|
82
|
+
|
|
83
|
+
uniform mat4 u_projection;
|
|
84
|
+
|
|
85
|
+
out vec4 v_color;
|
|
86
|
+
|
|
87
|
+
void main() {
|
|
88
|
+
vec2 zeroToOne = a_position + (a_unitquad * a_size);
|
|
89
|
+
gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);
|
|
90
|
+
v_color = a_color;
|
|
91
|
+
}`,os=`#version 300 es
|
|
92
|
+
precision lowp float;
|
|
93
|
+
|
|
94
|
+
in vec4 v_color;
|
|
95
|
+
|
|
96
|
+
out vec4 outColor;
|
|
97
|
+
|
|
98
|
+
void main() {
|
|
99
|
+
outColor = v_color;
|
|
100
|
+
}`,Ee=8,Pi=Ee*Float32Array.BYTES_PER_ELEMENT,as=20*Ee,zt=class{constructor(){this.attributes=new Float32Array(as),this.count=0}},xe=0,Hn=0,Wn=0,Gn=0,$n=0,Kn=0,Vn=0,qt=class extends B{constructor(t,n,s,o){super();this._terminal=t;this._gl=n;this._dimensions=s;this._themeService=o;this._vertices=new zt;this._verticesCursor=new zt;let r=this._gl;this._program=F($t(r,ss,os)),this._register(O(()=>r.deleteProgram(this._program))),this._projectionLocation=F(r.getUniformLocation(this._program,"u_projection")),this._vertexArrayObject=r.createVertexArray(),r.bindVertexArray(this._vertexArrayObject);let a=new Float32Array([0,0,1,0,0,1,1,1]),l=r.createBuffer();this._register(O(()=>r.deleteBuffer(l))),r.bindBuffer(r.ARRAY_BUFFER,l),r.bufferData(r.ARRAY_BUFFER,a,r.STATIC_DRAW),r.enableVertexAttribArray(3),r.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);let u=new Uint8Array([0,1,2,3]),c=r.createBuffer();this._register(O(()=>r.deleteBuffer(c))),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,c),r.bufferData(r.ELEMENT_ARRAY_BUFFER,u,r.STATIC_DRAW),this._attributesBuffer=F(r.createBuffer()),this._register(O(()=>r.deleteBuffer(this._attributesBuffer))),r.bindBuffer(r.ARRAY_BUFFER,this._attributesBuffer),r.enableVertexAttribArray(0),r.vertexAttribPointer(0,2,r.FLOAT,!1,Pi,0),r.vertexAttribDivisor(0,1),r.enableVertexAttribArray(1),r.vertexAttribPointer(1,2,r.FLOAT,!1,Pi,2*Float32Array.BYTES_PER_ELEMENT),r.vertexAttribDivisor(1,1),r.enableVertexAttribArray(2),r.vertexAttribPointer(2,4,r.FLOAT,!1,Pi,4*Float32Array.BYTES_PER_ELEMENT),r.vertexAttribDivisor(2,1),this._updateCachedColors(o.colors),this._register(this._themeService.onChangeColors(d=>{this._updateCachedColors(d),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(t){let n=this._gl;n.useProgram(this._program),n.bindVertexArray(this._vertexArrayObject),n.uniformMatrix4fv(this._projectionLocation,!1,Gt),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.bufferData(n.ARRAY_BUFFER,t.attributes,n.DYNAMIC_DRAW),n.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,n.UNSIGNED_BYTE,0,t.count)}handleResize(){this._updateViewportRectangle()}setDimensions(t){this._dimensions=t}_updateCachedColors(t){this._bgFloat=this._colorToFloat32Array(t.background),this._cursorFloat=this._colorToFloat32Array(t.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(t){let n=this._terminal,s=this._vertices,o=1,r,a,l,u,c,d,h,f,I,L,M;for(r=0;r<n.rows;r++){for(l=-1,u=0,c=0,d=!1,a=0;a<n.cols;a++)h=(r*n.cols+a)*Ce,f=t.cells[h+ze],I=t.cells[h+qe],L=!!(I&67108864),(f!==u||I!==c&&(d||L))&&((u!==0||d&&c!==0)&&(M=o++*Ee,this._updateRectangle(s,M,c,u,l,a,r)),l=a,u=f,c=I,d=L);(u!==0||d&&c!==0)&&(M=o++*Ee,this._updateRectangle(s,M,c,u,l,n.cols,r))}s.count=o}updateCursor(t){let n=this._verticesCursor,s=t.cursor;if(!s||s.style==="block"){n.count=0;return}let o,r=0;(s.style==="bar"||s.style==="outline")&&(o=r++*Ee,this._addRectangleFloat(n.attributes,o,s.x*this._dimensions.device.cell.width,s.y*this._dimensions.device.cell.height,s.style==="bar"?s.dpr*s.cursorWidth:s.dpr,this._dimensions.device.cell.height,this._cursorFloat)),(s.style==="underline"||s.style==="outline")&&(o=r++*Ee,this._addRectangleFloat(n.attributes,o,s.x*this._dimensions.device.cell.width,(s.y+1)*this._dimensions.device.cell.height-s.dpr,s.width*this._dimensions.device.cell.width,s.dpr,this._cursorFloat)),s.style==="outline"&&(o=r++*Ee,this._addRectangleFloat(n.attributes,o,s.x*this._dimensions.device.cell.width,s.y*this._dimensions.device.cell.height,s.width*this._dimensions.device.cell.width,s.dpr,this._cursorFloat),o=r++*Ee,this._addRectangleFloat(n.attributes,o,(s.x+s.width)*this._dimensions.device.cell.width-s.dpr,s.y*this._dimensions.device.cell.height,s.dpr,this._dimensions.device.cell.height,this._cursorFloat)),n.count=r}_updateRectangle(t,n,s,o,r,a,l){if(s&67108864)switch(s&50331648){case 16777216:case 33554432:xe=this._themeService.colors.ansi[s&255].rgba;break;case 50331648:xe=(s&16777215)<<8;break;case 0:default:xe=this._themeService.colors.foreground.rgba}else switch(o&50331648){case 16777216:case 33554432:xe=this._themeService.colors.ansi[o&255].rgba;break;case 50331648:xe=(o&16777215)<<8;break;case 0:default:xe=this._themeService.colors.background.rgba}t.attributes.length<n+4&&(t.attributes=Bn(t.attributes,this._terminal.rows*this._terminal.cols*Ee)),Hn=r*this._dimensions.device.cell.width,Wn=l*this._dimensions.device.cell.height,Gn=(xe>>24&255)/255,$n=(xe>>16&255)/255,Kn=(xe>>8&255)/255,Vn=1,this._addRectangle(t.attributes,n,Hn,Wn,(a-r)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,Gn,$n,Kn,Vn)}_addRectangle(t,n,s,o,r,a,l,u,c,d){t[n]=s/this._dimensions.device.canvas.width,t[n+1]=o/this._dimensions.device.canvas.height,t[n+2]=r/this._dimensions.device.canvas.width,t[n+3]=a/this._dimensions.device.canvas.height,t[n+4]=l,t[n+5]=u,t[n+6]=c,t[n+7]=d}_addRectangleFloat(t,n,s,o,r,a,l){t[n]=s/this._dimensions.device.canvas.width,t[n+1]=o/this._dimensions.device.canvas.height,t[n+2]=r/this._dimensions.device.canvas.width,t[n+3]=a/this._dimensions.device.canvas.height,t[n+4]=l[0],t[n+5]=l[1],t[n+6]=l[2],t[n+7]=l[3]}_colorToFloat32Array(t){return new Float32Array([(t.rgba>>24&255)/255,(t.rgba>>16&255)/255,(t.rgba>>8&255)/255,(t.rgba&255)/255])}};var jt=class extends B{constructor(t,n,s,o,r,a,l,u){super();this._container=n;this._alpha=r;this._coreBrowserService=a;this._optionsService=l;this._themeService=u;this._deviceCharWidth=0;this._deviceCharHeight=0;this._deviceCellWidth=0;this._deviceCellHeight=0;this._deviceCharLeft=0;this._deviceCharTop=0;this._canvas=this._coreBrowserService.mainDocument.createElement("canvas"),this._canvas.classList.add(`xterm-${s}-layer`),this._canvas.style.zIndex=o.toString(),this._initCanvas(),this._container.appendChild(this._canvas),this._register(this._themeService.onChangeColors(c=>{this._refreshCharAtlas(t,c),this.reset(t)})),this._register(O(()=>{this._canvas.remove()}))}_initCanvas(){this._ctx=F(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(t){}handleFocus(t){}handleCursorMove(t){}handleGridChanged(t,n,s){}handleSelectionChanged(t,n,s,o=!1){}_setTransparency(t,n){if(n===this._alpha)return;let s=this._canvas;this._alpha=n,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,s),this._refreshCharAtlas(t,this._themeService.colors),this.handleGridChanged(t,0,t.rows-1)}_refreshCharAtlas(t,n){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=Nt(t,this._optionsService.rawOptions,n,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr,2048),this._charAtlas.warmUp())}resize(t,n){this._deviceCellWidth=n.device.cell.width,this._deviceCellHeight=n.device.cell.height,this._deviceCharWidth=n.device.char.width,this._deviceCharHeight=n.device.char.height,this._deviceCharLeft=n.device.char.left,this._deviceCharTop=n.device.char.top,this._canvas.width=n.device.canvas.width,this._canvas.height=n.device.canvas.height,this._canvas.style.width=`${n.css.canvas.width}px`,this._canvas.style.height=`${n.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(t,this._themeService.colors)}_fillBottomLineAtCells(t,n,s=1){this._ctx.fillRect(t*this._deviceCellWidth,(n+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,s*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(t,n,s,o){this._alpha?this._ctx.clearRect(t*this._deviceCellWidth,n*this._deviceCellHeight,s*this._deviceCellWidth,o*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(t*this._deviceCellWidth,n*this._deviceCellHeight,s*this._deviceCellWidth,o*this._deviceCellHeight))}_fillCharTrueColor(t,n,s,o){this._ctx.font=this._getFont(t,!1,!1),this._ctx.textBaseline=St,this._clipCell(s,o,n.getWidth()),this._ctx.fillText(n.getChars(),s*this._deviceCellWidth+this._deviceCharLeft,o*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(t,n,s){this._ctx.beginPath(),this._ctx.rect(t*this._deviceCellWidth,n*this._deviceCellHeight,s*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(t,n,s){let o=n?t.options.fontWeightBold:t.options.fontWeight;return`${s?"italic":""} ${o} ${t.options.fontSize*this._coreBrowserService.dpr}px ${t.options.fontFamily}`}};var Xt=class extends jt{constructor(e,t,n,s,o,r,a){super(n,e,"link",t,!0,o,r,a),this._register(s.onShowLinkUnderline(l=>this._handleShowLinkUnderline(l))),this._register(s.onHideLinkUnderline(l=>this._handleHideLinkUnderline(l)))}resize(e,t){super.resize(e,t),this._state=void 0}reset(e){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);let e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(e){if(e.fg===257?this._ctx.fillStyle=this._themeService.colors.background.css:e.fg!==void 0&&Fn(e.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[e.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(let t=e.y1+1;t<e.y2;t++)this._fillBottomLineAtCells(0,t,e.cols);this._fillBottomLineAtCells(0,e.y2,e.x2)}this._state=e}_handleHideLinkUnderline(e){this._clearCurrentLink()}};var te=typeof window=="object"?window:globalThis;var Zt=class Zt{constructor(){this.mapWindowIdToZoomLevel=new Map;this._onDidChangeZoomLevel=new D;this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event;this.mapWindowIdToZoomFactor=new Map;this._onDidChangeFullscreen=new D;this.onDidChangeFullscreen=this._onDidChangeFullscreen.event;this.mapWindowIdToFullScreen=new Map}getZoomLevel(e){return this.mapWindowIdToZoomLevel.get(this.getWindowId(e))??0}setZoomLevel(e,t){if(this.getZoomLevel(t)===e)return;let n=this.getWindowId(t);this.mapWindowIdToZoomLevel.set(n,e),this._onDidChangeZoomLevel.fire(n)}getZoomFactor(e){return this.mapWindowIdToZoomFactor.get(this.getWindowId(e))??1}setZoomFactor(e,t){this.mapWindowIdToZoomFactor.set(this.getWindowId(t),e)}setFullscreen(e,t){if(this.isFullscreen(t)===e)return;let n=this.getWindowId(t);this.mapWindowIdToFullScreen.set(n,e),this._onDidChangeFullscreen.fire(n)}isFullscreen(e){return!!this.mapWindowIdToFullScreen.get(this.getWindowId(e))}getWindowId(e){return e.vscodeWindowId}};Zt.INSTANCE=new Zt;var Qt=Zt;function us(i,e,t){typeof e=="string"&&(e=i.matchMedia(e)),e.addEventListener("change",t)}var Wa=Qt.INSTANCE.onDidChangeZoomLevel;var Ga=Qt.INSTANCE.onDidChangeFullscreen,je=typeof navigator=="object"?navigator.userAgent:"",Cn=je.indexOf("Firefox")>=0,ut=je.indexOf("AppleWebKit")>=0,zn=je.indexOf("Chrome")>=0,Bi=!zn&&je.indexOf("Safari")>=0;var $a=je.indexOf("Electron/")>=0,Ka=je.indexOf("Android")>=0,Yt=!1;if(typeof te.matchMedia=="function"){let i=te.matchMedia("(display-mode: standalone) or (display-mode: window-controls-overlay)"),e=te.matchMedia("(display-mode: fullscreen)");Yt=i.matches,us(te,i,({matches:t})=>{Yt&&e.matches||(Yt=t)})}function qn(){return Yt}var Xe="en",Ui=!1,ni=!1,ti=!1,cs=!1,Xn=!1,Yn=!1,ds=!1,hs=!1,ps=!1,fs=!1,ei,ii=Xe,jn=Xe,ms,ye,Ie=globalThis,re;typeof Ie.vscode<"u"&&typeof Ie.vscode.process<"u"?re=Ie.vscode.process:typeof process<"u"&&typeof process?.versions?.node=="string"&&(re=process);var Qn=typeof re?.versions?.electron=="string",_s=Qn&&re?.type==="renderer";if(typeof re=="object"){Ui=re.platform==="win32",ni=re.platform==="darwin",ti=re.platform==="linux",cs=ti&&!!re.env.SNAP&&!!re.env.SNAP_REVISION,ds=Qn,ps=!!re.env.CI||!!re.env.BUILD_ARTIFACTSTAGINGDIRECTORY,ei=Xe,ii=Xe;let i=re.env.VSCODE_NLS_CONFIG;if(i)try{let e=JSON.parse(i);ei=e.userLocale,jn=e.osLocale,ii=e.resolvedLanguage||Xe,ms=e.languagePack?.translationsConfigFile}catch{}Xn=!0}else typeof navigator=="object"&&!_s?(ye=navigator.userAgent,Ui=ye.indexOf("Windows")>=0,ni=ye.indexOf("Macintosh")>=0,hs=(ye.indexOf("Macintosh")>=0||ye.indexOf("iPad")>=0||ye.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,ti=ye.indexOf("Linux")>=0,fs=ye?.indexOf("Mobi")>=0,Yn=!0,ii=globalThis._VSCODE_NLS_LANGUAGE||Xe,ei=navigator.language.toLowerCase(),jn=ei):console.error("Unable to resolve platform.");var Ni=0;ni?Ni=1:Ui?Ni=3:ti&&(Ni=2);var ct=ni;var ri=Xn;var bs=Yn&&typeof Ie.importScripts=="function",Va=bs?Ie.origin:void 0;var _e=ye,Me=ii,vs;(n=>{function i(){return Me}n.value=i;function e(){return Me.length===2?Me==="en":Me.length>=3?Me[0]==="e"&&Me[1]==="n"&&Me[2]==="-":!1}n.isDefaultVariant=e;function t(){return Me==="en"}n.isDefault=t})(vs||={});var Ts=typeof Ie.postMessage=="function"&&!Ie.importScripts,Zn=(()=>{if(Ts){let i=[];Ie.addEventListener("message",t=>{if(t.data&&t.data.vscodeScheduleAsyncWork)for(let n=0,s=i.length;n<s;n++){let o=i[n];if(o.id===t.data.vscodeScheduleAsyncWork){i.splice(n,1),o.callback();return}}});let e=0;return t=>{let n=++e;i.push({id:n,callback:t}),Ie.postMessage({vscodeScheduleAsyncWork:n},"*")}}return i=>setTimeout(i)})();var gs=!!(_e&&_e.indexOf("Chrome")>=0),Ca=!!(_e&&_e.indexOf("Firefox")>=0),za=!!(!gs&&_e&&_e.indexOf("Safari")>=0),qa=!!(_e&&_e.indexOf("Edg/")>=0),ja=!!(_e&&_e.indexOf("Android")>=0);var Ae=typeof navigator=="object"?navigator:{},xs={clipboard:{writeText:ri||document.queryCommandSupported&&document.queryCommandSupported("copy")||!!(Ae&&Ae.clipboard&&Ae.clipboard.writeText),readText:ri||!!(Ae&&Ae.clipboard&&Ae.clipboard.readText)},keyboard:ri||qn()?0:Ae.keyboard||Bi?1:2,touch:"ontouchstart"in te||Ae.maxTouchPoints>0,pointerEvents:te.PointerEvent&&("ontouchstart"in te||navigator.maxTouchPoints>0)};var dt=class{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(e,t){this._keyCodeToStr[e]=t,this._strToKeyCode[t.toLowerCase()]=e}keyCodeToStr(e){return this._keyCodeToStr[e]}strToKeyCode(e){return this._strToKeyCode[e.toLowerCase()]||0}},Hi=new dt,Jn=new dt,er=new dt,Es=new Array(230);var tr;(r=>{function i(a){return Hi.keyCodeToStr(a)}r.toString=i;function e(a){return Hi.strToKeyCode(a)}r.fromString=e;function t(a){return Jn.keyCodeToStr(a)}r.toUserSettingsUS=t;function n(a){return er.keyCodeToStr(a)}r.toUserSettingsGeneral=n;function s(a){return Jn.strToKeyCode(a)||er.strToKeyCode(a)}r.fromUserSettings=s;function o(a){if(a>=98&&a<=113)return null;switch(a){case 16:return"Up";case 18:return"Down";case 15:return"Left";case 17:return"Right"}return Hi.keyCodeToStr(a)}r.toElectronAccelerator=o})(tr||={});var ul=ct?256:2048,cl=512,dl=1024,hl=ct?2048:256;var nr=Object.freeze(function(i,e){let t=setTimeout(i.bind(e),0);return{dispose(){clearTimeout(t)}}}),Is;(n=>{function i(s){return s===n.None||s===n.Cancelled||s instanceof Wi?!0:!s||typeof s!="object"?!1:typeof s.isCancellationRequested=="boolean"&&typeof s.onCancellationRequested=="function"}n.isCancellationToken=i,n.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:ee.None}),n.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:nr})})(Is||={});var Wi=class{constructor(){this._isCancelled=!1;this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?nr:(this._emitter||(this._emitter=new D),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}};var Ls=Symbol("MicrotaskDelay");var ws,oi;(function(){typeof globalThis.requestIdleCallback!="function"||typeof globalThis.cancelIdleCallback!="function"?oi=(i,e)=>{Zn(()=>{if(t)return;let n=Date.now()+15;e(Object.freeze({didTimeout:!0,timeRemaining(){return Math.max(0,n-Date.now())}}))});let t=!1;return{dispose(){t||(t=!0)}}}:oi=(i,e,t)=>{let n=i.requestIdleCallback(e,typeof t=="number"?{timeout:t}:void 0),s=!1;return{dispose(){s||(s=!0,i.cancelIdleCallback(n))}}},ws=i=>oi(globalThis,i)})();var Rs;(t=>{async function i(n){let s,o=await Promise.all(n.map(r=>r.then(a=>a,a=>{s||(s=a)})));if(typeof s<"u")throw s;return o}t.settled=i;function e(n){return new Promise(async(s,o)=>{try{await n(s,o)}catch(r){o(r)}})}t.withAsyncBody=e})(Rs||={});var Q=class Q{static fromArray(e){return new Q(t=>{t.emitMany(e)})}static fromPromise(e){return new Q(async t=>{t.emitMany(await e)})}static fromPromises(e){return new Q(async t=>{await Promise.all(e.map(async n=>t.emitOne(await n)))})}static merge(e){return new Q(async t=>{await Promise.all(e.map(async n=>{for await(let s of n)t.emitOne(s)}))})}constructor(e,t){this._state=0,this._results=[],this._error=null,this._onReturn=t,this._onStateChanged=new D,queueMicrotask(async()=>{let n={emitOne:s=>this.emitOne(s),emitMany:s=>this.emitMany(s),reject:s=>this.reject(s)};try{await Promise.resolve(e(n)),this.resolve()}catch(s){this.reject(s)}finally{n.emitOne=void 0,n.emitMany=void 0,n.reject=void 0}})}[Symbol.asyncIterator](){let e=0;return{next:async()=>{do{if(this._state===2)throw this._error;if(e<this._results.length)return{done:!1,value:this._results[e++]};if(this._state===1)return{done:!0,value:void 0};await ee.toPromise(this._onStateChanged.event)}while(!0)},return:async()=>(this._onReturn?.(),{done:!0,value:void 0})}}static map(e,t){return new Q(async n=>{for await(let s of e)n.emitOne(t(s))})}map(e){return Q.map(this,e)}static filter(e,t){return new Q(async n=>{for await(let s of e)t(s)&&n.emitOne(s)})}filter(e){return Q.filter(this,e)}static coalesce(e){return Q.filter(e,t=>!!t)}coalesce(){return Q.coalesce(this)}static async toPromise(e){let t=[];for await(let n of e)t.push(n);return t}toPromise(){return Q.toPromise(this)}emitOne(e){this._state===0&&(this._results.push(e),this._onStateChanged.fire())}emitMany(e){this._state===0&&(this._results=this._results.concat(e),this._onStateChanged.fire())}resolve(){this._state===0&&(this._state=1,this._onStateChanged.fire())}reject(e){this._state===0&&(this._state=2,this._error=e,this._onStateChanged.fire())}};Q.EMPTY=Q.fromArray([]);var rr=Q;function sr(i){return 55296<=i&&i<=56319}function Gi(i){return 56320<=i&&i<=57343}function or(i,e){return(i-55296<<10)+(e-56320)+65536}function ur(i){return Ki(i,0)}function Ki(i,e){switch(typeof i){case"object":return i===null?Le(349,e):Array.isArray(i)?As(i,e):Ss(i,e);case"string":return cr(i,e);case"boolean":return Ms(i,e);case"number":return Le(i,e);case"undefined":return Le(937,e);default:return Le(617,e)}}function Le(i,e){return(e<<5)-e+i|0}function Ms(i,e){return Le(i?433:863,e)}function cr(i,e){e=Le(149417,e);for(let t=0,n=i.length;t<n;t++)e=Le(i.charCodeAt(t),e);return e}function As(i,e){return e=Le(104579,e),i.reduce((t,n)=>Ki(n,t),e)}function Ss(i,e){return e=Le(181387,e),Object.keys(i).sort().reduce((t,n)=>(t=cr(n,t),Ki(i[n],t)),e)}function $i(i,e,t=32){let n=t-e,s=~((1<<n)-1);return(i<<e|(s&i)>>>n)>>>0}function ar(i,e=0,t=i.byteLength,n=0){for(let s=0;s<t;s++)i[e+s]=n}function Os(i,e,t="0"){for(;i.length<e;)i=t+i;return i}function ht(i,e=32){return i instanceof ArrayBuffer?Array.from(new Uint8Array(i)).map(t=>t.toString(16).padStart(2,"0")).join(""):Os((i>>>0).toString(16),e/4)}var ai=class ai{constructor(){this._h0=1732584193;this._h1=4023233417;this._h2=2562383102;this._h3=271733878;this._h4=3285377520;this._buff=new Uint8Array(67),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(e){let t=e.length;if(t===0)return;let n=this._buff,s=this._buffLen,o=this._leftoverHighSurrogate,r,a;for(o!==0?(r=o,a=-1,o=0):(r=e.charCodeAt(0),a=0);;){let l=r;if(sr(r))if(a+1<t){let u=e.charCodeAt(a+1);Gi(u)?(a++,l=or(r,u)):l=65533}else{o=r;break}else Gi(r)&&(l=65533);if(s=this._push(n,s,l),a++,a<t)r=e.charCodeAt(a);else break}this._buffLen=s,this._leftoverHighSurrogate=o}_push(e,t,n){return n<128?e[t++]=n:n<2048?(e[t++]=192|(n&1984)>>>6,e[t++]=128|(n&63)>>>0):n<65536?(e[t++]=224|(n&61440)>>>12,e[t++]=128|(n&4032)>>>6,e[t++]=128|(n&63)>>>0):(e[t++]=240|(n&1835008)>>>18,e[t++]=128|(n&258048)>>>12,e[t++]=128|(n&4032)>>>6,e[t++]=128|(n&63)>>>0),t>=64&&(this._step(),t-=64,this._totalLen+=64,e[0]=e[64],e[1]=e[65],e[2]=e[66]),t}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),ht(this._h0)+ht(this._h1)+ht(this._h2)+ht(this._h3)+ht(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,ar(this._buff,this._buffLen),this._buffLen>56&&(this._step(),ar(this._buff));let e=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(e/4294967296),!1),this._buffDV.setUint32(60,e%4294967296,!1),this._step()}_step(){let e=ai._bigBlock32,t=this._buffDV;for(let d=0;d<64;d+=4)e.setUint32(d,t.getUint32(d,!1),!1);for(let d=64;d<320;d+=4)e.setUint32(d,$i(e.getUint32(d-12,!1)^e.getUint32(d-32,!1)^e.getUint32(d-56,!1)^e.getUint32(d-64,!1),1),!1);let n=this._h0,s=this._h1,o=this._h2,r=this._h3,a=this._h4,l,u,c;for(let d=0;d<80;d++)d<20?(l=s&o|~s&r,u=1518500249):d<40?(l=s^o^r,u=1859775393):d<60?(l=s&o|s&r|o&r,u=2400959708):(l=s^o^r,u=3395469782),c=$i(n,5)+l+a+u+e.getUint32(d*4,!1)&4294967295,a=r,r=o,o=$i(s,30),s=n,n=c;this._h0=this._h0+n&4294967295,this._h1=this._h1+s&4294967295,this._h2=this._h2+o&4294967295,this._h3=this._h3+r&4294967295,this._h4=this._h4+a&4294967295}};ai._bigBlock32=new DataView(new ArrayBuffer(320));var lr=ai;var{registerWindow:fu,getWindow:Fs,getDocument:mu,getWindows:_u,getWindowsCount:bu,getWindowId:dr,getWindowById:vu,hasWindow:Tu,onDidRegisterWindow:gu,onWillUnregisterWindow:xu,onDidUnregisterWindow:Eu}=function(){let i=new Map;te;let e={window:te,disposables:new fe};i.set(te.vscodeWindowId,e);let t=new D,n=new D,s=new D;function o(r,a){return(typeof r=="number"?i.get(r):void 0)??(a?e:void 0)}return{onDidRegisterWindow:t.event,onWillUnregisterWindow:s.event,onDidUnregisterWindow:n.event,registerWindow(r){if(i.has(r.vscodeWindowId))return B.None;let a=new fe,l={window:r,disposables:a.add(new fe)};return i.set(r.vscodeWindowId,l),a.add(O(()=>{i.delete(r.vscodeWindowId),n.fire(r)})),a.add(li(r,Ps.BEFORE_UNLOAD,()=>{s.fire(r)})),t.fire(l),a},getWindows(){return i.values()},getWindowsCount(){return i.size},getWindowId(r){return r.vscodeWindowId},hasWindow(r){return i.has(r)},getWindowById:o,getWindow(r){let a=r;if(a?.ownerDocument?.defaultView)return a.ownerDocument.defaultView.window;let l=r;return l?.view?l.view.window:te},getDocument(r){return Fs(r).document}}}();var Vi=class{constructor(e,t,n,s){this._node=e,this._type=t,this._handler=n,this._options=s||!1,this._node.addEventListener(this._type,this._handler,this._options)}dispose(){this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}};function li(i,e,t,n){return new Vi(i,e,t,n)}var ks,hr;var pt=class{constructor(e,t=0){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){Pe(e)}}static sort(e,t){return t.priority-e.priority}};(function(){let i=new Map,e=new Map,t=new Map,n=new Map,s=o=>{t.set(o,!1);let r=i.get(o)??[];for(e.set(o,r),i.set(o,[]),n.set(o,!0);r.length>0;)r.sort(pt.sort),r.shift().execute();n.set(o,!1)};hr=(o,r,a=0)=>{let l=dr(o),u=new pt(r,a),c=i.get(l);return c||(c=[],i.set(l,c)),c.push(u),t.get(l)||(t.set(l,!0),o.requestAnimationFrame(()=>s(l))),u},ks=(o,r,a)=>{let l=dr(o);if(n.get(l)){let u=new pt(r,a),c=e.get(l);return c||(c=[],e.set(l,c)),c.push(u),u}else return hr(o,r,a)}})();var ke=class ke{constructor(e,t){this.width=e;this.height=t}with(e=this.width,t=this.height){return e!==this.width||t!==this.height?new ke(e,t):this}static is(e){return typeof e=="object"&&typeof e.height=="number"&&typeof e.width=="number"}static lift(e){return e instanceof ke?e:new ke(e.width,e.height)}static equals(e,t){return e===t?!0:!e||!t?!1:e.width===t.width&&e.height===t.height}};ke.None=new ke(0,0);var pr=ke;var yu=new class{constructor(){this.mutationObservers=new Map}observe(i,e,t){let n=this.mutationObservers.get(i);n||(n=new Map,this.mutationObservers.set(i,n));let s=ur(t),o=n.get(s);if(o)o.users+=1;else{let r=new D,a=new MutationObserver(u=>r.fire(u));a.observe(i,t);let l=o={users:1,observer:a,onDidMutate:r.event};e.add(O(()=>{l.users-=1,l.users===0&&(r.dispose(),a.disconnect(),n?.delete(s),n?.size===0&&this.mutationObservers.delete(i))})),n.set(s,o)}return o.onDidMutate}};var Ps={CLICK:"click",AUXCLICK:"auxclick",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",MOUSE_WHEEL:"wheel",POINTER_UP:"pointerup",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_LEAVE:"pointerleave",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",BEFORE_UNLOAD:"beforeunload",UNLOAD:"unload",PAGE_SHOW:"pageshow",PAGE_HIDE:"pagehide",PASTE:"paste",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",FULLSCREEN_CHANGE:"fullscreenchange",WK_FULLSCREEN_CHANGE:"webkitfullscreenchange",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",FOCUS_IN:"focusin",FOCUS_OUT:"focusout",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:ut?"webkitAnimationStart":"animationstart",ANIMATION_END:ut?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:ut?"webkitAnimationIteration":"animationiteration"};var Bs=/([\w\-]+)?(#([\w\-]+))?((\.([\w\-]+))*)/;function fr(i,e,t,...n){let s=Bs.exec(e);if(!s)throw new Error("Bad use of emmet");let o=s[1]||"div",r;return i!=="http://www.w3.org/1999/xhtml"?r=document.createElementNS(i,o):r=document.createElement(o),s[3]&&(r.id=s[3]),s[4]&&(r.className=s[4].replace(/\./g," ").trim()),t&&Object.entries(t).forEach(([a,l])=>{typeof l>"u"||(/^on\w+$/.test(a)?r[a]=l:a==="selected"?l&&r.setAttribute(a,"true"):r.setAttribute(a,l))}),r.append(...n),r}function Ns(i,e,...t){return fr("http://www.w3.org/1999/xhtml",i,e,...t)}Ns.SVG=function(i,e,...t){return fr("http://www.w3.org/2000/svg",i,e,...t)};var ui=class extends B{constructor(t,n,s,o,r,a,l,u,c){super();this._terminal=t;this._characterJoinerService=n;this._charSizeService=s;this._coreBrowserService=o;this._coreService=r;this._decorationService=a;this._optionsService=l;this._themeService=u;this._cursorBlinkStateManager=new be;this._charAtlasDisposable=this._register(new be);this._observerDisposable=this._register(new be);this._model=new Vt;this._workCell=new at;this._workCell2=new at;this._rectangleRenderer=this._register(new be);this._glyphRenderer=this._register(new be);this._onChangeTextureAtlas=this._register(new D);this.onChangeTextureAtlas=this._onChangeTextureAtlas.event;this._onAddTextureAtlasCanvas=this._register(new D);this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=this._register(new D);this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._onRequestRedraw=this._register(new D);this.onRequestRedraw=this._onRequestRedraw.event;this._onContextLoss=this._register(new D);this.onContextLoss=this._onContextLoss.event;this._canvas=this._coreBrowserService.mainDocument.createElement("canvas");let d={antialias:!1,depth:!1,preserveDrawingBuffer:c};if(this._gl=this._canvas.getContext("webgl2",d),!this._gl)throw new Error("WebGL2 not supported "+this._gl);this._register(this._themeService.onChangeColors(()=>this._handleColorChange())),this._cellColorResolver=new At(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new Xt(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,l,this._themeService)],this.dimensions=_n(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this._register(l.onOptionChange(()=>this._handleOptionsChanged())),this._deviceMaxTextureSize=this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),this._register(li(this._canvas,"webglcontextlost",h=>{console.log("webglcontextlost event received"),h.preventDefault(),this._contextRestorationTimeout=setTimeout(()=>{this._contextRestorationTimeout=void 0,console.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(h)},3e3)})),this._register(li(this._canvas,"webglcontextrestored",h=>{console.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,Ai(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()})),this._observerDisposable.value=Si(this._canvas,this._coreBrowserService.window,(h,f)=>this._setCanvasDevicePixelDimensions(h,f)),this._register(this._coreBrowserService.onWindowChange(h=>{this._observerDisposable.value=Si(this._canvas,h,(f,I)=>this._setCanvasDevicePixelDimensions(f,I))})),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._core.screenElement.isConnected,this._register(O(()=>{for(let h of this._renderLayers)h.dispose();this._canvas.parentElement?.removeChild(this._canvas),Ai(this._terminal)}))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(t,n){this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows);for(let s of this._renderLayers)s.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(!1)}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(let t of this._renderLayers)t.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(let t of this._renderLayers)t.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleSelectionChanged(t,n,s){for(let o of this._renderLayers)o.handleSelectionChanged(this._terminal,t,n,s);this._model.selection.update(this._core,t,n,s),this._requestRedrawViewport()}handleCursorMove(){for(let t of this._renderLayers)t.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new qt(this._terminal,this._gl,this.dimensions,this._themeService),this._glyphRenderer.value=new Kt(this._terminal,this._gl,this.dimensions,this._optionsService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0){this._isAttached=!1;return}let t=Nt(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr,this._deviceMaxTextureSize);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=It(ee.forward(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),ee.forward(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas))),this._charAtlas=t,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(t){this._model.clear(),t&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){this._charAtlas?.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){this._clearModel(!0);for(let t of this._renderLayers)t.reset(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}renderRows(t,n){if(!this._isAttached)if(this._core.screenElement?.isConnected&&this._charSizeService.width&&this._charSizeService.height)this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0;else return;for(let s of this._renderLayers)s.handleGridChanged(this._terminal,t,n);!this._glyphRenderer.value||!this._rectangleRenderer.value||(this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(t,n),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible)&&this._rectangleRenderer.value.renderCursor())}_updateCursorBlink(){this._coreService.decPrivateModes.cursorBlink??this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new Ht(()=>{this._requestRedrawCursor()},this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(t,n){let s=this._core,o=this._workCell,r,a,l,u,c,d,h=0,f=!0,I,L,M,q,S,W,E,y,w;t=mr(t,s.rows-1,0),n=mr(n,s.rows-1,0);let G=this._coreService.decPrivateModes.cursorStyle??s.options.cursorStyle??"block",ue=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,Se=ue-s.buffer.ydisp,ce=Math.min(this._terminal.buffer.active.cursorX,s.cols-1),we=-1,A=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let se=!1;for(a=t;a<=n;a++)for(l=a+s.buffer.ydisp,u=s.buffer.lines.get(l),this._model.lineLengths[a]=0,M=ue===l,h=0,c=this._characterJoinerService.getJoinedCharacters(l),y=0;y<s.cols;y++){if(r=this._cellColorResolver.result.bg,u.loadCell(y,o),y===0&&(r=this._cellColorResolver.result.bg),d=!1,f=y>=h,I=y,c.length>0&&y===c[0][0]&&f){L=c.shift();let v=this._model.selection.isCellSelected(this._terminal,L[0],l);for(E=L[0]+1;E<L[1];E++)f&&=v===this._model.selection.isCellSelected(this._terminal,E,l);f&&=!M||ce<L[0]||ce>=L[1],f?(d=!0,o=new Ci(o,u.translateToString(!0,L[0],L[1]),L[1]-L[0]),I=L[1]-1):h=L[1]}if(q=o.getChars(),S=o.getCode(),E=(a*s.cols+y)*Ce,this._cellColorResolver.resolve(o,y,l,this.dimensions.device.cell.width),A&&l===ue&&(y===ce&&(this._model.cursor={x:ce,y:Se,width:o.getWidth(),style:this._coreBrowserService.isFocused?G:s.options.cursorInactiveStyle,cursorWidth:s.options.cursorWidth,dpr:this._devicePixelRatio},we=ce+o.getWidth()-1),y>=ce&&y<=we&&(this._coreBrowserService.isFocused&&G==="block"||this._coreBrowserService.isFocused===!1&&s.options.cursorInactiveStyle==="block")&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),S!==0&&(this._model.lineLengths[a]=y+1),!(this._model.cells[E]===S&&this._model.cells[E+ze]===this._cellColorResolver.result.bg&&this._model.cells[E+qe]===this._cellColorResolver.result.fg&&this._model.cells[E+Ct]===this._cellColorResolver.result.ext)&&(se=!0,q.length>1&&(S|=Un),this._model.cells[E]=S,this._model.cells[E+ze]=this._cellColorResolver.result.bg,this._model.cells[E+qe]=this._cellColorResolver.result.fg,this._model.cells[E+Ct]=this._cellColorResolver.result.ext,W=o.getWidth(),this._glyphRenderer.value.updateCell(y,a,S,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,q,W,r),d)){for(o=this._workCell,y++;y<=I;y++)w=(a*s.cols+y)*Ce,this._glyphRenderer.value.updateCell(y,a,0,0,0,0,pn,0,0),this._model.cells[w]=0,this._model.cells[w+ze]=this._cellColorResolver.result.bg,this._model.cells[w+qe]=this._cellColorResolver.result.fg,this._model.cells[w+Ct]=this._cellColorResolver.result.ext;y--}}se&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model)}_updateDimensions(){!this._charSizeService.width||!this._charSizeService.height||(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=this._optionsService.rawOptions.lineHeight===1?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(t,n){this._canvas.width===t&&this._canvas.height===n||(this._canvas.width=t,this._canvas.height=n,this._requestRedrawViewport())}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){let t=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:t,end:t})}},Ci=class extends he{constructor(t,n,s){super();this.content=0;this.combinedData="";this.fg=t.fg,this.bg=t.bg,this.combinedData=n,this._width=s}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(t){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}};function mr(i,e,t=0){return Math.max(Math.min(i,e),t)}var _r="di$target",br="di$dependencies",zi=new Map;function pe(i){if(zi.has(i))return zi.get(i);let e=function(t,n,s){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");Us(e,t,s)};return e._id=i,zi.set(i,e),e}function Us(i,e,t){e[_r]===e?e[br].push({id:i,index:t}):(e[br]=[{id:i,index:t}],e[_r]=e)}var Vu=pe("BufferService"),Cu=pe("CoreMouseService"),zu=pe("CoreService"),qu=pe("CharsetService"),ju=pe("InstantiationService");var Xu=pe("LogService"),vr=pe("OptionsService"),Yu=pe("OscLinkService"),Qu=pe("UnicodeService"),Zu=pe("DecorationService");var Hs={trace:0,debug:1,info:2,warn:3,error:4,off:5},Ws="xterm.js: ",ci=class extends B{constructor(t){super();this._optionsService=t;this._logLevel=5;this._updateLogLevel(),this._register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel())),Tr=this}get logLevel(){return this._logLevel}_updateLogLevel(){this._logLevel=Hs[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(t){for(let n=0;n<t.length;n++)typeof t[n]=="function"&&(t[n]=t[n]())}_log(t,n,s){this._evalLazyOptionalParams(s),t.call(console,(this._optionsService.options.logger?"":Ws)+n,...s)}trace(t,...n){this._logLevel<=0&&this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger)??console.log,t,n)}debug(t,...n){this._logLevel<=1&&this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger)??console.log,t,n)}info(t,...n){this._logLevel<=2&&this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger)??console.info,t,n)}warn(t,...n){this._logLevel<=3&&this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger)??console.warn,t,n)}error(t,...n){this._logLevel<=4&&this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger)??console.error,t,n)}};ci=Yi([Qi(0,vr)],ci);var Tr;function gr(i){Tr=i}var xr=class extends B{constructor(t){if(vi&&hn()<16){let n={antialias:!1,depth:!1,preserveDrawingBuffer:!0};if(!document.createElement("canvas").getContext("webgl2",n))throw new Error("Webgl2 is only supported on Safari 16 and above")}super();this._preserveDrawingBuffer=t;this._onChangeTextureAtlas=this._register(new D);this.onChangeTextureAtlas=this._onChangeTextureAtlas.event;this._onAddTextureAtlasCanvas=this._register(new D);this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=this._register(new D);this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._onContextLoss=this._register(new D);this.onContextLoss=this._onContextLoss.event}activate(t){let n=t._core;if(!t.element){this._register(n.onWillOpen(()=>this.activate(t)));return}this._terminal=t;let s=n.coreService,o=n.optionsService,r=n,a=r._renderService,l=r._characterJoinerService,u=r._charSizeService,c=r._coreBrowserService,d=r._decorationService,h=r._logService,f=r._themeService;gr(h),this._renderer=this._register(new ui(t,l,u,c,s,d,o,f,this._preserveDrawingBuffer)),this._register(ee.forward(this._renderer.onContextLoss,this._onContextLoss)),this._register(ee.forward(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this._register(ee.forward(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this._register(ee.forward(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),a.setRenderer(this._renderer),this._register(O(()=>{if(this._terminal._core._store._isDisposed)return;let I=this._terminal._core._renderService;I.setRenderer(this._terminal._core._createRenderer()),I.handleResize(t.cols,t.rows)}))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}};export{xr as WebglAddon};
|
|
101
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvdnMvYmFzZS9jb21tb24vZXJyb3JzLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy92cy9iYXNlL2NvbW1vbi9hcnJheXNGaW5kLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy92cy9iYXNlL2NvbW1vbi9hcnJheXMudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL3ZzL2Jhc2UvY29tbW9uL2NvbGxlY3Rpb25zLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy92cy9iYXNlL2NvbW1vbi9tYXAudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL3ZzL2Jhc2UvY29tbW9uL2Z1bmN0aW9uYWwudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL3ZzL2Jhc2UvY29tbW9uL2l0ZXJhdG9yLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy92cy9iYXNlL2NvbW1vbi9saWZlY3ljbGUudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL2NvbW1vbi9QbGF0Zm9ybS50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvY29tbW9uL2J1ZmZlci9Db25zdGFudHMudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL2NvbW1vbi9Db2xvci50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscy50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvc3JjL0NlbGxDb2xvclJlc29sdmVyLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9zcmMvQ29uc3RhbnRzLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9zcmMvQ3VzdG9tR2x5cGhzLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy9jb21tb24vTXVsdGlLZXlNYXAudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL2NvbW1vbi9UYXNrUXVldWUudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YS50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvdnMvYmFzZS9jb21tb24vbGlua2VkTGlzdC50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvdnMvYmFzZS9jb21tb24vc3RvcHdhdGNoLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy92cy9iYXNlL2NvbW1vbi9ldmVudC50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvc3JjL1RleHR1cmVBdGxhcy50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvc3JjL0NoYXJBdGxhc1V0aWxzLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9zcmMvQ2hhckF0bGFzQ2FjaGUudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL3NyYy9DdXJzb3JCbGlua1N0YXRlTWFuYWdlci50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvc3JjL0RldmljZVBpeGVsT2JzZXJ2ZXIudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL2NvbW1vbi9pbnB1dC9UZXh0RGVjb2Rlci50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvY29tbW9uL2J1ZmZlci9DZWxsRGF0YS50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvc3JjL1dlYmdsVXRpbHMudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL3NyYy9HbHlwaFJlbmRlcmVyLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9TZWxlY3Rpb25SZW5kZXJNb2RlbC50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvc3JjL1JlbmRlck1vZGVsLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi13ZWJnbC9zcmMvUmVjdGFuZ2xlUmVuZGVyZXIudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL3NyYy9yZW5kZXJMYXllci9CYXNlUmVuZGVyTGF5ZXIudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL3NyYy9yZW5kZXJMYXllci9MaW5rUmVuZGVyTGF5ZXIudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL3ZzL2Jhc2UvYnJvd3Nlci93aW5kb3cudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL3ZzL2Jhc2UvYnJvd3Nlci9icm93c2VyLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy92cy9iYXNlL2NvbW1vbi9wbGF0Zm9ybS50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvdnMvYmFzZS9icm93c2VyL2NhbklVc2UudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL3ZzL2Jhc2UvY29tbW9uL2tleUNvZGVzLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy92cy9iYXNlL2Jyb3dzZXIva2V5Ym9hcmRFdmVudC50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvdnMvYmFzZS9jb21tb24vY2FuY2VsbGF0aW9uLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy92cy9iYXNlL2NvbW1vbi9zeW1ib2xzLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy92cy9iYXNlL2NvbW1vbi9hc3luYy50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvdnMvYmFzZS9jb21tb24vc3RyaW5ncy50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvdnMvYmFzZS9jb21tb24vaGFzaC50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvdnMvYmFzZS9icm93c2VyL2RvbS50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViZ2wvc3JjL1dlYmdsUmVuZGVyZXIudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcy50cyIsImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvY29tbW9uL3NlcnZpY2VzL0xvZ1NlcnZpY2UudHMiLCJmaWxlOi8vL1VzZXJzL2RtYWlsL0RvY3VtZW50cy9kZXYvanNlbnYvY29yZS9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLXdlYmdsL3NyYy9XZWJnbEFkZG9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTGlzdGVuZXJDYWxsYmFjayB7XG5cdChlcnJvcjogYW55KTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckxpc3RlbmVyVW5iaW5kIHtcblx0KCk6IHZvaWQ7XG59XG5cbi8vIEF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgb24gRXZlbnRFbWl0dGVyIGJ5IGltcGxlbWVudGluZyBhIHN1YnNldCBvZiB0aGUgaW50ZXJmYWNlLlxuZXhwb3J0IGNsYXNzIEVycm9ySGFuZGxlciB7XG5cdHByaXZhdGUgdW5leHBlY3RlZEVycm9ySGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZDtcblx0cHJpdmF0ZSBsaXN0ZW5lcnM6IEVycm9yTGlzdGVuZXJDYWxsYmFja1tdO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0dGhpcy5saXN0ZW5lcnMgPSBbXTtcblxuXHRcdHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAoZS5zdGFjaykge1xuXHRcdFx0XHRcdGlmIChFcnJvck5vVGVsZW1ldHJ5LmlzRXJyb3JOb1RlbGVtZXRyeShlKSkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yTm9UZWxlbWV0cnkoZS5tZXNzYWdlICsgJ1xcblxcbicgKyBlLnN0YWNrKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoZS5tZXNzYWdlICsgJ1xcblxcbicgKyBlLnN0YWNrKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRocm93IGU7XG5cdFx0XHR9LCAwKTtcblx0XHR9O1xuXHR9XG5cblx0YWRkTGlzdGVuZXIobGlzdGVuZXI6IEVycm9yTGlzdGVuZXJDYWxsYmFjayk6IEVycm9yTGlzdGVuZXJVbmJpbmQge1xuXHRcdHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRoaXMuX3JlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTtcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBlbWl0KGU6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG5cdFx0XHRsaXN0ZW5lcihlKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgX3JlbW92ZUxpc3RlbmVyKGxpc3RlbmVyOiBFcnJvckxpc3RlbmVyQ2FsbGJhY2spOiB2b2lkIHtcblx0XHR0aGlzLmxpc3RlbmVycy5zcGxpY2UodGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuXHR9XG5cblx0c2V0VW5leHBlY3RlZEVycm9ySGFuZGxlcihuZXdVbmV4cGVjdGVkRXJyb3JIYW5kbGVyOiAoZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG5cdFx0dGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyID0gbmV3VW5leHBlY3RlZEVycm9ySGFuZGxlcjtcblx0fVxuXG5cdGdldFVuZXhwZWN0ZWRFcnJvckhhbmRsZXIoKTogKGU6IGFueSkgPT4gdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcjtcblx0fVxuXG5cdG9uVW5leHBlY3RlZEVycm9yKGU6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcihlKTtcblx0XHR0aGlzLmVtaXQoZSk7XG5cdH1cblxuXHQvLyBGb3IgZXh0ZXJuYWwgZXJyb3JzLCB3ZSBkb24ndCB3YW50IHRoZSBsaXN0ZW5lcnMgdG8gYmUgY2FsbGVkXG5cdG9uVW5leHBlY3RlZEV4dGVybmFsRXJyb3IoZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyKGUpO1xuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG5cbi8qKiBAc2tpcE1hbmdsZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFVuZXhwZWN0ZWRFcnJvckhhbmRsZXIobmV3VW5leHBlY3RlZEVycm9ySGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuXHRlcnJvckhhbmRsZXIuc2V0VW5leHBlY3RlZEVycm9ySGFuZGxlcihuZXdVbmV4cGVjdGVkRXJyb3JIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSBlcnJvciBpcyBhIFNJR1BJUEUgZXJyb3IuIFNJR1BJUEUgZXJyb3JzIHNob3VsZCBnZW5lcmFsbHkgYmVcbiAqIGxvZ2dlZCBhdCBtb3N0IG9uY2UsIHRvIGF2b2lkIGEgbG9vcC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvdnNjb2RlLXJlbW90ZS1yZWxlYXNlL2lzc3Vlcy82NDgxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NpZ1BpcGVFcnJvcihlOiB1bmtub3duKTogZSBpcyBFcnJvciB7XG5cdGlmICghZSB8fCB0eXBlb2YgZSAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBjYXN0ID0gZSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXHRyZXR1cm4gY2FzdC5jb2RlID09PSAnRVBJUEUnICYmIGNhc3Quc3lzY2FsbD8udG9VcHBlckNhc2UoKSA9PT0gJ1dSSVRFJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uVW5leHBlY3RlZEVycm9yKGU6IGFueSk6IHVuZGVmaW5lZCB7XG5cdC8vIGlnbm9yZSBlcnJvcnMgZnJvbSBjYW5jZWxsZWQgcHJvbWlzZXNcblx0aWYgKCFpc0NhbmNlbGxhdGlvbkVycm9yKGUpKSB7XG5cdFx0ZXJyb3JIYW5kbGVyLm9uVW5leHBlY3RlZEVycm9yKGUpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvblVuZXhwZWN0ZWRFeHRlcm5hbEVycm9yKGU6IGFueSk6IHVuZGVmaW5lZCB7XG5cdC8vIGlnbm9yZSBlcnJvcnMgZnJvbSBjYW5jZWxsZWQgcHJvbWlzZXNcblx0aWYgKCFpc0NhbmNlbGxhdGlvbkVycm9yKGUpKSB7XG5cdFx0ZXJyb3JIYW5kbGVyLm9uVW5leHBlY3RlZEV4dGVybmFsRXJyb3IoZSk7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkRXJyb3Ige1xuXHRyZWFkb25seSAkaXNFcnJvcjogdHJ1ZTtcblx0cmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXHRyZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHN0YWNrOiBzdHJpbmc7XG5cdHJlYWRvbmx5IG5vVGVsZW1ldHJ5OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtRXJyb3JGb3JTZXJpYWxpemF0aW9uKGVycm9yOiBFcnJvcik6IFNlcmlhbGl6ZWRFcnJvcjtcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1FcnJvckZvclNlcmlhbGl6YXRpb24oZXJyb3I6IGFueSk6IGFueTtcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1FcnJvckZvclNlcmlhbGl6YXRpb24oZXJyb3I6IGFueSk6IGFueSB7XG5cdGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0Y29uc3QgeyBuYW1lLCBtZXNzYWdlIH0gPSBlcnJvcjtcblx0XHRjb25zdCBzdGFjazogc3RyaW5nID0gKDxhbnk+ZXJyb3IpLnN0YWNrdHJhY2UgfHwgKDxhbnk+ZXJyb3IpLnN0YWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHQkaXNFcnJvcjogdHJ1ZSxcblx0XHRcdG5hbWUsXG5cdFx0XHRtZXNzYWdlLFxuXHRcdFx0c3RhY2ssXG5cdFx0XHRub1RlbGVtZXRyeTogRXJyb3JOb1RlbGVtZXRyeS5pc0Vycm9yTm9UZWxlbWV0cnkoZXJyb3IpXG5cdFx0fTtcblx0fVxuXG5cdC8vIHJldHVybiBhcyBpc1xuXHRyZXR1cm4gZXJyb3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1FcnJvckZyb21TZXJpYWxpemF0aW9uKGRhdGE6IFNlcmlhbGl6ZWRFcnJvcik6IEVycm9yIHtcblx0bGV0IGVycm9yOiBFcnJvcjtcblx0aWYgKGRhdGEubm9UZWxlbWV0cnkpIHtcblx0XHRlcnJvciA9IG5ldyBFcnJvck5vVGVsZW1ldHJ5KCk7XG5cdH0gZWxzZSB7XG5cdFx0ZXJyb3IgPSBuZXcgRXJyb3IoKTtcblx0XHRlcnJvci5uYW1lID0gZGF0YS5uYW1lO1xuXHR9XG5cdGVycm9yLm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XG5cdGVycm9yLnN0YWNrID0gZGF0YS5zdGFjaztcblx0cmV0dXJuIGVycm9yO1xufVxuXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Y4L3Y4L3dpa2kvU3RhY2slMjBUcmFjZSUyMEFQSSNiYXNpYy1zdGFjay10cmFjZXNcbmV4cG9ydCBpbnRlcmZhY2UgVjhDYWxsU2l0ZSB7XG5cdGdldFRoaXMoKTogdW5rbm93bjtcblx0Z2V0VHlwZU5hbWUoKTogc3RyaW5nIHwgbnVsbDtcblx0Z2V0RnVuY3Rpb24oKTogRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5cdGdldEZ1bmN0aW9uTmFtZSgpOiBzdHJpbmcgfCBudWxsO1xuXHRnZXRNZXRob2ROYW1lKCk6IHN0cmluZyB8IG51bGw7XG5cdGdldEZpbGVOYW1lKCk6IHN0cmluZyB8IG51bGw7XG5cdGdldExpbmVOdW1iZXIoKTogbnVtYmVyIHwgbnVsbDtcblx0Z2V0Q29sdW1uTnVtYmVyKCk6IG51bWJlciB8IG51bGw7XG5cdGdldEV2YWxPcmlnaW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpc1RvcGxldmVsKCk6IGJvb2xlYW47XG5cdGlzRXZhbCgpOiBib29sZWFuO1xuXHRpc05hdGl2ZSgpOiBib29sZWFuO1xuXHRpc0NvbnN0cnVjdG9yKCk6IGJvb2xlYW47XG5cdHRvU3RyaW5nKCk6IHN0cmluZztcbn1cblxuY29uc3QgY2FuY2VsZWROYW1lID0gJ0NhbmNlbGVkJztcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVycm9yIGlzIGEgcHJvbWlzZSBpbiBjYW5jZWxlZCBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW5jZWxsYXRpb25FcnJvcihlcnJvcjogYW55KTogYm9vbGVhbiB7XG5cdGlmIChlcnJvciBpbnN0YW5jZW9mIENhbmNlbGxhdGlvbkVycm9yKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gY2FuY2VsZWROYW1lICYmIGVycm9yLm1lc3NhZ2UgPT09IGNhbmNlbGVkTmFtZTtcbn1cblxuLy8gISEhSU1QT1JUQU5UISEhXG4vLyBEbyBOT1QgY2hhbmdlIHRoaXMgY2xhc3MgYmVjYXVzZSBpdCBpcyBhbHNvIHVzZWQgYXMgYW4gQVBJLXR5cGUuXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKGNhbmNlbGVkTmFtZSk7XG5cdFx0dGhpcy5uYW1lID0gdGhpcy5tZXNzYWdlO1xuXHR9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBDYW5jZWxsYXRpb25FcnJvciBgbmV3IENhbmNlbGxhdGlvbkVycm9yKClgfSBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5jZWxlZCgpOiBFcnJvciB7XG5cdGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGNhbmNlbGVkTmFtZSk7XG5cdGVycm9yLm5hbWUgPSBlcnJvci5tZXNzYWdlO1xuXHRyZXR1cm4gZXJyb3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbGxlZ2FsQXJndW1lbnQobmFtZT86IHN0cmluZyk6IEVycm9yIHtcblx0aWYgKG5hbWUpIHtcblx0XHRyZXR1cm4gbmV3IEVycm9yKGBJbGxlZ2FsIGFyZ3VtZW50OiAke25hbWV9YCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG5ldyBFcnJvcignSWxsZWdhbCBhcmd1bWVudCcpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbGxlZ2FsU3RhdGUobmFtZT86IHN0cmluZyk6IEVycm9yIHtcblx0aWYgKG5hbWUpIHtcblx0XHRyZXR1cm4gbmV3IEVycm9yKGBJbGxlZ2FsIHN0YXRlOiAke25hbWV9YCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG5ldyBFcnJvcignSWxsZWdhbCBzdGF0ZScpO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWFkb25seUVycm9yIGV4dGVuZHMgVHlwZUVycm9yIHtcblx0Y29uc3RydWN0b3IobmFtZT86IHN0cmluZykge1xuXHRcdHN1cGVyKG5hbWUgPyBgJHtuYW1lfSBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkYCA6ICdDYW5ub3QgY2hhbmdlIHJlYWQtb25seSBwcm9wZXJ0eScpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvck1lc3NhZ2UoZXJyOiBhbnkpOiBzdHJpbmcge1xuXHRpZiAoIWVycikge1xuXHRcdHJldHVybiAnRXJyb3InO1xuXHR9XG5cblx0aWYgKGVyci5tZXNzYWdlKSB7XG5cdFx0cmV0dXJuIGVyci5tZXNzYWdlO1xuXHR9XG5cblx0aWYgKGVyci5zdGFjaykge1xuXHRcdHJldHVybiBlcnIuc3RhY2suc3BsaXQoJ1xcbicpWzBdO1xuXHR9XG5cblx0cmV0dXJuIFN0cmluZyhlcnIpO1xufVxuXG5leHBvcnQgY2xhc3MgTm90SW1wbGVtZW50ZWRFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuXHRcdHN1cGVyKCdOb3RJbXBsZW1lbnRlZCcpO1xuXHRcdGlmIChtZXNzYWdlKSB7XG5cdFx0XHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY2xhc3MgTm90U3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcblx0XHRzdXBlcignTm90U3VwcG9ydGVkJyk7XG5cdFx0aWYgKG1lc3NhZ2UpIHtcblx0XHRcdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBFeHBlY3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRyZWFkb25seSBpc0V4cGVjdGVkID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBFcnJvciB0aGF0IHdoZW4gdGhyb3duIHdvbid0IGJlIGxvZ2dlZCBpbiB0ZWxlbWV0cnkgYXMgYW4gdW5oYW5kbGVkIGVycm9yLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JOb1RlbGVtZXRyeSBleHRlbmRzIEVycm9yIHtcblx0b3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yKG1zZz86IHN0cmluZykge1xuXHRcdHN1cGVyKG1zZyk7XG5cdFx0dGhpcy5uYW1lID0gJ0NvZGVFeHBlY3RlZEVycm9yJztcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZnJvbUVycm9yKGVycjogRXJyb3IpOiBFcnJvck5vVGVsZW1ldHJ5IHtcblx0XHRpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3JOb1RlbGVtZXRyeSkge1xuXHRcdFx0cmV0dXJuIGVycjtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQgPSBuZXcgRXJyb3JOb1RlbGVtZXRyeSgpO1xuXHRcdHJlc3VsdC5tZXNzYWdlID0gZXJyLm1lc3NhZ2U7XG5cdFx0cmVzdWx0LnN0YWNrID0gZXJyLnN0YWNrO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGlzRXJyb3JOb1RlbGVtZXRyeShlcnI6IEVycm9yKTogZXJyIGlzIEVycm9yTm9UZWxlbWV0cnkge1xuXHRcdHJldHVybiBlcnIubmFtZSA9PT0gJ0NvZGVFeHBlY3RlZEVycm9yJztcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaW5kaWNhdGVzIGEgYnVnLlxuICogRG8gbm90IHRocm93IHRoaXMgZm9yIGludmFsaWQgdXNlciBpbnB1dC5cbiAqIE9ubHkgY2F0Y2ggdGhpcyBlcnJvciB0byByZWNvdmVyIGdyYWNlZnVsbHkgZnJvbSBidWdzLlxuICovXG5leHBvcnQgY2xhc3MgQnVnSW5kaWNhdGluZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSB8fCAnQW4gdW5leHBlY3RlZCBidWcgb2NjdXJyZWQuJyk7XG5cdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEJ1Z0luZGljYXRpbmdFcnJvci5wcm90b3R5cGUpO1xuXG5cdFx0Ly8gQmVjYXVzZSB3ZSBrbm93IGZvciBzdXJlIG9ubHkgYnVnZ3kgY29kZSB0aHJvd3MgdGhpcyxcblx0XHQvLyB3ZSBkZWZpbml0ZWx5IHdhbnQgdG8gYnJlYWsgaGVyZSBhbmQgZml4IHRoZSBidWcuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXG5cdFx0Ly8gZGVidWdnZXI7XG5cdH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBDb21wYXJhdG9yIH0gZnJvbSAnLi9hcnJheXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oYXJyYXk6IHJlYWRvbmx5IFRbXSwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuXHRjb25zdCBpZHggPSBmaW5kTGFzdElkeChhcnJheSwgcHJlZGljYXRlKTtcblx0aWYgKGlkeCA9PT0gLTEpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBhcnJheVtpZHhdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RJZHg8VD4oYXJyYXk6IHJlYWRvbmx5IFRbXSwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbiwgZnJvbUluZGV4ID0gYXJyYXkubGVuZ3RoIC0gMSk6IG51bWJlciB7XG5cdGZvciAobGV0IGkgPSBmcm9tSW5kZXg7IGkgPj0gMDsgaS0tKSB7XG5cdFx0Y29uc3QgZWxlbWVudCA9IGFycmF5W2ldO1xuXG5cdFx0aWYgKHByZWRpY2F0ZShlbGVtZW50KSkge1xuXHRcdFx0cmV0dXJuIGk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBsYXN0IGl0ZW0gd2hlcmUgcHJlZGljYXRlIGlzIHRydWUgdXNpbmcgYmluYXJ5IHNlYXJjaC5cbiAqIGBwcmVkaWNhdGVgIG11c3QgYmUgbW9ub3Rvbm91cywgaS5lLiBgYXJyLm1hcChwcmVkaWNhdGUpYCBtdXN0IGJlIGxpa2UgYFt0cnVlLCAuLi4sIHRydWUsIGZhbHNlLCAuLi4sIGZhbHNlXWAhXG4gKlxuICogQHJldHVybnMgYHVuZGVmaW5lZGAgaWYgbm8gaXRlbSBtYXRjaGVzLCBvdGhlcndpc2UgdGhlIGxhc3QgaXRlbSB0aGF0IG1hdGNoZXMgdGhlIHByZWRpY2F0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0TW9ub3Rvbm91czxUPihhcnJheTogcmVhZG9ubHkgVFtdLCBwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGlkeCA9IGZpbmRMYXN0SWR4TW9ub3Rvbm91cyhhcnJheSwgcHJlZGljYXRlKTtcblx0cmV0dXJuIGlkeCA9PT0gLTEgPyB1bmRlZmluZWQgOiBhcnJheVtpZHhdO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBsYXN0IGl0ZW0gd2hlcmUgcHJlZGljYXRlIGlzIHRydWUgdXNpbmcgYmluYXJ5IHNlYXJjaC5cbiAqIGBwcmVkaWNhdGVgIG11c3QgYmUgbW9ub3Rvbm91cywgaS5lLiBgYXJyLm1hcChwcmVkaWNhdGUpYCBtdXN0IGJlIGxpa2UgYFt0cnVlLCAuLi4sIHRydWUsIGZhbHNlLCAuLi4sIGZhbHNlXWAhXG4gKlxuICogQHJldHVybnMgYHN0YXJ0SWR4IC0gMWAgaWYgcHJlZGljYXRlIGlzIGZhbHNlIGZvciBhbGwgaXRlbXMsIG90aGVyd2lzZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgaXRlbSB0aGF0IG1hdGNoZXMgdGhlIHByZWRpY2F0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0SWR4TW9ub3Rvbm91czxUPihhcnJheTogcmVhZG9ubHkgVFtdLCBwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBib29sZWFuLCBzdGFydElkeCA9IDAsIGVuZElkeEV4ID0gYXJyYXkubGVuZ3RoKTogbnVtYmVyIHtcblx0bGV0IGkgPSBzdGFydElkeDtcblx0bGV0IGogPSBlbmRJZHhFeDtcblx0d2hpbGUgKGkgPCBqKSB7XG5cdFx0Y29uc3QgayA9IE1hdGguZmxvb3IoKGkgKyBqKSAvIDIpO1xuXHRcdGlmIChwcmVkaWNhdGUoYXJyYXlba10pKSB7XG5cdFx0XHRpID0gayArIDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGogPSBrO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gaSAtIDE7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGZpcnN0IGl0ZW0gd2hlcmUgcHJlZGljYXRlIGlzIHRydWUgdXNpbmcgYmluYXJ5IHNlYXJjaC5cbiAqIGBwcmVkaWNhdGVgIG11c3QgYmUgbW9ub3Rvbm91cywgaS5lLiBgYXJyLm1hcChwcmVkaWNhdGUpYCBtdXN0IGJlIGxpa2UgYFtmYWxzZSwgLi4uLCBmYWxzZSwgdHJ1ZSwgLi4uLCB0cnVlXWAhXG4gKlxuICogQHJldHVybnMgYHVuZGVmaW5lZGAgaWYgbm8gaXRlbSBtYXRjaGVzLCBvdGhlcndpc2UgdGhlIGZpcnN0IGl0ZW0gdGhhdCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRmlyc3RNb25vdG9ub3VzPFQ+KGFycmF5OiByZWFkb25seSBUW10sIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgaWR4ID0gZmluZEZpcnN0SWR4TW9ub3Rvbm91c09yQXJyTGVuKGFycmF5LCBwcmVkaWNhdGUpO1xuXHRyZXR1cm4gaWR4ID09PSBhcnJheS5sZW5ndGggPyB1bmRlZmluZWQgOiBhcnJheVtpZHhdO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBpdGVtIHdoZXJlIHByZWRpY2F0ZSBpcyB0cnVlIHVzaW5nIGJpbmFyeSBzZWFyY2guXG4gKiBgcHJlZGljYXRlYCBtdXN0IGJlIG1vbm90b25vdXMsIGkuZS4gYGFyci5tYXAocHJlZGljYXRlKWAgbXVzdCBiZSBsaWtlIGBbZmFsc2UsIC4uLiwgZmFsc2UsIHRydWUsIC4uLiwgdHJ1ZV1gIVxuICpcbiAqIEByZXR1cm5zIGBlbmRJZHhFeGAgaWYgcHJlZGljYXRlIGlzIGZhbHNlIGZvciBhbGwgaXRlbXMsIG90aGVyd2lzZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGl0ZW0gdGhhdCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRmlyc3RJZHhNb25vdG9ub3VzT3JBcnJMZW48VD4oYXJyYXk6IHJlYWRvbmx5IFRbXSwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbiwgc3RhcnRJZHggPSAwLCBlbmRJZHhFeCA9IGFycmF5Lmxlbmd0aCk6IG51bWJlciB7XG5cdGxldCBpID0gc3RhcnRJZHg7XG5cdGxldCBqID0gZW5kSWR4RXg7XG5cdHdoaWxlIChpIDwgaikge1xuXHRcdGNvbnN0IGsgPSBNYXRoLmZsb29yKChpICsgaikgLyAyKTtcblx0XHRpZiAocHJlZGljYXRlKGFycmF5W2tdKSkge1xuXHRcdFx0aiA9IGs7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGkgPSBrICsgMTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRmlyc3RJZHhNb25vdG9ub3VzPFQ+KGFycmF5OiByZWFkb25seSBUW10sIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IGJvb2xlYW4sIHN0YXJ0SWR4ID0gMCwgZW5kSWR4RXggPSBhcnJheS5sZW5ndGgpOiBudW1iZXIge1xuXHRjb25zdCBpZHggPSBmaW5kRmlyc3RJZHhNb25vdG9ub3VzT3JBcnJMZW4oYXJyYXksIHByZWRpY2F0ZSwgc3RhcnRJZHgsIGVuZElkeEV4KTtcblx0cmV0dXJuIGlkeCA9PT0gYXJyYXkubGVuZ3RoID8gLTEgOiBpZHg7XG59XG5cbi8qKlxuICogVXNlIHRoaXMgd2hlblxuICogKiBZb3UgaGF2ZSBhIHNvcnRlZCBhcnJheVxuICogKiBZb3UgcXVlcnkgdGhpcyBhcnJheSB3aXRoIGEgbW9ub3Rvbm91cyBwcmVkaWNhdGUgdG8gZmluZCB0aGUgbGFzdCBpdGVtIHRoYXQgaGFzIGEgY2VydGFpbiBwcm9wZXJ0eS5cbiAqICogWW91IHF1ZXJ5IHRoaXMgYXJyYXkgbXVsdGlwbGUgdGltZXMgd2l0aCBtb25vdG9ub3VzIHByZWRpY2F0ZXMgdGhhdCBnZXQgd2Vha2VyIGFuZCB3ZWFrZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb25vdG9ub3VzQXJyYXk8VD4ge1xuXHRwdWJsaWMgc3RhdGljIGFzc2VydEludmFyaWFudHMgPSBmYWxzZTtcblxuXHRwcml2YXRlIF9maW5kTGFzdE1vbm90b25vdXNMYXN0SWR4ID0gMDtcblx0cHJpdmF0ZSBfcHJldkZpbmRMYXN0UHJlZGljYXRlOiAoKGl0ZW06IFQpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX2FycmF5OiByZWFkb25seSBUW10pIHtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgcHJlZGljYXRlIG11c3QgYmUgbW9ub3Rvbm91cywgaS5lLiBgYXJyLm1hcChwcmVkaWNhdGUpYCBtdXN0IGJlIGxpa2UgYFt0cnVlLCAuLi4sIHRydWUsIGZhbHNlLCAuLi4sIGZhbHNlXWAhXG5cdCAqIEZvciBzdWJzZXF1ZW50IGNhbGxzLCBjdXJyZW50IHByZWRpY2F0ZSBtdXN0IGJlIHdlYWtlciB0aGFuIChvciBlcXVhbCB0bykgdGhlIHByZXZpb3VzIHByZWRpY2F0ZSwgaS5lLiBtb3JlIGVudHJpZXMgbXVzdCBiZSBgdHJ1ZWAuXG5cdCAqL1xuXHRmaW5kTGFzdE1vbm90b25vdXMocHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuXHRcdGlmIChNb25vdG9ub3VzQXJyYXkuYXNzZXJ0SW52YXJpYW50cykge1xuXHRcdFx0aWYgKHRoaXMuX3ByZXZGaW5kTGFzdFByZWRpY2F0ZSkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fYXJyYXkpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5fcHJldkZpbmRMYXN0UHJlZGljYXRlKGl0ZW0pICYmICFwcmVkaWNhdGUoaXRlbSkpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignTW9ub3Rvbm91c0FycmF5OiBjdXJyZW50IHByZWRpY2F0ZSBtdXN0IGJlIHdlYWtlciB0aGFuIChvciBlcXVhbCB0bykgdGhlIHByZXZpb3VzIHByZWRpY2F0ZS4nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuX3ByZXZGaW5kTGFzdFByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcblx0XHR9XG5cblx0XHRjb25zdCBpZHggPSBmaW5kTGFzdElkeE1vbm90b25vdXModGhpcy5fYXJyYXksIHByZWRpY2F0ZSwgdGhpcy5fZmluZExhc3RNb25vdG9ub3VzTGFzdElkeCk7XG5cdFx0dGhpcy5fZmluZExhc3RNb25vdG9ub3VzTGFzdElkeCA9IGlkeCArIDE7XG5cdFx0cmV0dXJuIGlkeCA9PT0gLTEgPyB1bmRlZmluZWQgOiB0aGlzLl9hcnJheVtpZHhdO1xuXHR9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgaXRlbSB0aGF0IGlzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiBldmVyeSBvdGhlciBpdGVtLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRmlyc3RNYXg8VD4oYXJyYXk6IHJlYWRvbmx5IFRbXSwgY29tcGFyYXRvcjogQ29tcGFyYXRvcjxUPik6IFQgfCB1bmRlZmluZWQge1xuXHRpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGxldCBtYXggPSBhcnJheVswXTtcblx0Zm9yIChsZXQgaSA9IDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IGl0ZW0gPSBhcnJheVtpXTtcblx0XHRpZiAoY29tcGFyYXRvcihpdGVtLCBtYXgpID4gMCkge1xuXHRcdFx0bWF4ID0gaXRlbTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1heDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IGl0ZW0gdGhhdCBpcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gZXZlcnkgb3RoZXIgaXRlbS5cbiovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RNYXg8VD4oYXJyYXk6IHJlYWRvbmx5IFRbXSwgY29tcGFyYXRvcjogQ29tcGFyYXRvcjxUPik6IFQgfCB1bmRlZmluZWQge1xuXHRpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGxldCBtYXggPSBhcnJheVswXTtcblx0Zm9yIChsZXQgaSA9IDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IGl0ZW0gPSBhcnJheVtpXTtcblx0XHRpZiAoY29tcGFyYXRvcihpdGVtLCBtYXgpID49IDApIHtcblx0XHRcdG1heCA9IGl0ZW07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXg7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgaXRlbSB0aGF0IGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiBldmVyeSBvdGhlciBpdGVtLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRmlyc3RNaW48VD4oYXJyYXk6IHJlYWRvbmx5IFRbXSwgY29tcGFyYXRvcjogQ29tcGFyYXRvcjxUPik6IFQgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZmluZEZpcnN0TWF4KGFycmF5LCAoYSwgYikgPT4gLWNvbXBhcmF0b3IoYSwgYikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZE1heElkeDxUPihhcnJheTogcmVhZG9ubHkgVFtdLCBjb21wYXJhdG9yOiBDb21wYXJhdG9yPFQ+KTogbnVtYmVyIHtcblx0aWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiAtMTtcblx0fVxuXG5cdGxldCBtYXhJZHggPSAwO1xuXHRmb3IgKGxldCBpID0gMTsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgaXRlbSA9IGFycmF5W2ldO1xuXHRcdGlmIChjb21wYXJhdG9yKGl0ZW0sIGFycmF5W21heElkeF0pID4gMCkge1xuXHRcdFx0bWF4SWR4ID0gaTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1heElkeDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBtYXBwZWQgdmFsdWUgb2YgdGhlIGFycmF5IHdoaWNoIGlzIG5vdCB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBGaW5kRmlyc3Q8VCwgUj4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBtYXBGbjogKHZhbHVlOiBUKSA9PiBSIHwgdW5kZWZpbmVkKTogUiB8IHVuZGVmaW5lZCB7XG5cdGZvciAoY29uc3QgdmFsdWUgb2YgaXRlbXMpIHtcblx0XHRjb25zdCBtYXBwZWQgPSBtYXBGbih2YWx1ZSk7XG5cdFx0aWYgKG1hcHBlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbWFwcGVkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uVG9rZW4gfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9jYW5jZWxsYXRpb24nO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uRXJyb3IgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgSVNwbGljZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL3NlcXVlbmNlJztcbmltcG9ydCB7IGZpbmRGaXJzdElkeE1vbm90b25vdXNPckFyckxlbiB9IGZyb20gJy4vYXJyYXlzRmluZCc7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGFuIGFycmF5LlxuICogQHBhcmFtIGFycmF5IFRoZSBhcnJheS5cbiAqIEBwYXJhbSBuIFdoaWNoIGVsZW1lbnQgZnJvbSB0aGUgZW5kIChkZWZhdWx0IGlzIHplcm8pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFpbDxUPihhcnJheTogQXJyYXlMaWtlPFQ+LCBuOiBudW1iZXIgPSAwKTogVCB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAoMSArIG4pXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhaWwyPFQ+KGFycjogVFtdKTogW1RbXSwgVF0ge1xuXHRpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YWlsIGNhbGwnKTtcblx0fVxuXG5cdHJldHVybiBbYXJyLnNsaWNlKDAsIGFyci5sZW5ndGggLSAxKSwgYXJyW2Fyci5sZW5ndGggLSAxXV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHM8VD4ob25lOiBSZWFkb25seUFycmF5PFQ+IHwgdW5kZWZpbmVkLCBvdGhlcjogUmVhZG9ubHlBcnJheTxUPiB8IHVuZGVmaW5lZCwgaXRlbUVxdWFsczogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW4gPSAoYSwgYikgPT4gYSA9PT0gYik6IGJvb2xlYW4ge1xuXHRpZiAob25lID09PSBvdGhlcikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKCFvbmUgfHwgIW90aGVyKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKG9uZS5sZW5ndGggIT09IG90aGVyLmxlbmd0aCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZvciAobGV0IGkgPSAwLCBsZW4gPSBvbmUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRpZiAoIWl0ZW1FcXVhbHMob25lW2ldLCBvdGhlcltpXSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGVsZW1lbnQgYXQgYGluZGV4YCBieSByZXBsYWNpbmcgaXQgd2l0aCB0aGUgbGFzdCBlbGVtZW50LiBUaGlzIGlzIGZhc3RlciB0aGFuIGBzcGxpY2VgXG4gKiBidXQgY2hhbmdlcyB0aGUgb3JkZXIgb2YgdGhlIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGYXN0V2l0aG91dEtlZXBpbmdPcmRlcjxUPihhcnJheTogVFtdLCBpbmRleDogbnVtYmVyKSB7XG5cdGNvbnN0IGxhc3QgPSBhcnJheS5sZW5ndGggLSAxO1xuXHRpZiAoaW5kZXggPCBsYXN0KSB7XG5cdFx0YXJyYXlbaW5kZXhdID0gYXJyYXlbbGFzdF07XG5cdH1cblx0YXJyYXkucG9wKCk7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIGFsZ29yaXRobSBvdmVyIGEgc29ydGVkIGFycmF5LlxuICpcbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0ga2V5IFRoZSB2YWx1ZSB3ZSBzZWFyY2ggZm9yLlxuICogQHBhcmFtIGNvbXBhcmF0b3IgQSBmdW5jdGlvbiB0aGF0IHRha2VzIHR3byBhcnJheSBlbGVtZW50cyBhbmQgcmV0dXJucyB6ZXJvXG4gKiAgIGlmIHRoZXkgYXJlIGVxdWFsLCBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVjZWRlcyB0aGVcbiAqICAgc2Vjb25kIG9uZSBpbiB0aGUgc29ydGluZyBvcmRlciwgb3IgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIHNlY29uZCBlbGVtZW50XG4gKiAgIHByZWNlZGVzIHRoZSBmaXJzdCBvbmUuXG4gKiBAcmV0dXJuIFNlZSB7QGxpbmsgYmluYXJ5U2VhcmNoMn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVNlYXJjaDxUPihhcnJheTogUmVhZG9ubHlBcnJheTxUPiwga2V5OiBULCBjb21wYXJhdG9yOiAob3AxOiBULCBvcDI6IFQpID0+IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiBiaW5hcnlTZWFyY2gyKGFycmF5Lmxlbmd0aCwgaSA9PiBjb21wYXJhdG9yKGFycmF5W2ldLCBrZXkpKTtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggYWxnb3JpdGhtIG92ZXIgYSBzb3J0ZWQgY29sbGVjdGlvbi4gVXNlZnVsIGZvciBjYXNlc1xuICogd2hlbiB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIG92ZXIgc29tZXRoaW5nIHRoYXQgaXNuJ3QgYWN0dWFsbHkgYW5cbiAqIGFycmF5LCBhbmQgY29udmVydGluZyBkYXRhIHRvIGFuIGFycmF5IHdvdWxkIGRlZmVhdCB0aGUgdXNlIG9mIGJpbmFyeSBzZWFyY2hcbiAqIGluIHRoZSBmaXJzdCBwbGFjZS5cbiAqXG4gKiBAcGFyYW0gbGVuZ3RoIFRoZSBjb2xsZWN0aW9uIGxlbmd0aC5cbiAqIEBwYXJhbSBjb21wYXJlVG9LZXkgQSBmdW5jdGlvbiB0aGF0IHRha2VzIGFuIGluZGV4IG9mIGFuIGVsZW1lbnQgaW4gdGhlXG4gKiAgIGNvbGxlY3Rpb24gYW5kIHJldHVybnMgemVybyBpZiB0aGUgdmFsdWUgYXQgdGhpcyBpbmRleCBpcyBlcXVhbCB0byB0aGVcbiAqICAgc2VhcmNoIGtleSwgYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIHZhbHVlIHByZWNlZGVzIHRoZSBzZWFyY2gga2V5IGluIHRoZVxuICogICBzb3J0aW5nIG9yZGVyLCBvciBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgc2VhcmNoIGtleSBwcmVjZWRlcyB0aGUgdmFsdWUuXG4gKiBAcmV0dXJuIEEgbm9uLW5lZ2F0aXZlIGluZGV4IG9mIGFuIGVsZW1lbnQsIGlmIGZvdW5kLiBJZiBub3QgZm91bmQsIHRoZVxuICogICByZXN1bHQgaXMgLShuKzEpIChvciB+biwgdXNpbmcgYml0d2lzZSBub3RhdGlvbiksIHdoZXJlIG4gaXMgdGhlIGluZGV4XG4gKiAgIHdoZXJlIHRoZSBrZXkgc2hvdWxkIGJlIGluc2VydGVkIHRvIG1haW50YWluIHRoZSBzb3J0aW5nIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5U2VhcmNoMihsZW5ndGg6IG51bWJlciwgY29tcGFyZVRvS2V5OiAoaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyIHtcblx0bGV0IGxvdyA9IDAsXG5cdFx0aGlnaCA9IGxlbmd0aCAtIDE7XG5cblx0d2hpbGUgKGxvdyA8PSBoaWdoKSB7XG5cdFx0Y29uc3QgbWlkID0gKChsb3cgKyBoaWdoKSAvIDIpIHwgMDtcblx0XHRjb25zdCBjb21wID0gY29tcGFyZVRvS2V5KG1pZCk7XG5cdFx0aWYgKGNvbXAgPCAwKSB7XG5cdFx0XHRsb3cgPSBtaWQgKyAxO1xuXHRcdH0gZWxzZSBpZiAoY29tcCA+IDApIHtcblx0XHRcdGhpZ2ggPSBtaWQgLSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gbWlkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gLShsb3cgKyAxKTtcbn1cblxudHlwZSBDb21wYXJlPFQ+ID0gKGE6IFQsIGI6IFQpID0+IG51bWJlcjtcblxuXG5leHBvcnQgZnVuY3Rpb24gcXVpY2tTZWxlY3Q8VD4obnRoOiBudW1iZXIsIGRhdGE6IFRbXSwgY29tcGFyZTogQ29tcGFyZTxUPik6IFQge1xuXG5cdG50aCA9IG50aCB8IDA7XG5cblx0aWYgKG50aCA+PSBkYXRhLmxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgaW5kZXgnKTtcblx0fVxuXG5cdGNvbnN0IHBpdm90VmFsdWUgPSBkYXRhW01hdGguZmxvb3IoZGF0YS5sZW5ndGggKiBNYXRoLnJhbmRvbSgpKV07XG5cdGNvbnN0IGxvd2VyOiBUW10gPSBbXTtcblx0Y29uc3QgaGlnaGVyOiBUW10gPSBbXTtcblx0Y29uc3QgcGl2b3RzOiBUW10gPSBbXTtcblxuXHRmb3IgKGNvbnN0IHZhbHVlIG9mIGRhdGEpIHtcblx0XHRjb25zdCB2YWwgPSBjb21wYXJlKHZhbHVlLCBwaXZvdFZhbHVlKTtcblx0XHRpZiAodmFsIDwgMCkge1xuXHRcdFx0bG93ZXIucHVzaCh2YWx1ZSk7XG5cdFx0fSBlbHNlIGlmICh2YWwgPiAwKSB7XG5cdFx0XHRoaWdoZXIucHVzaCh2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBpdm90cy5wdXNoKHZhbHVlKTtcblx0XHR9XG5cdH1cblxuXHRpZiAobnRoIDwgbG93ZXIubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIHF1aWNrU2VsZWN0KG50aCwgbG93ZXIsIGNvbXBhcmUpO1xuXHR9IGVsc2UgaWYgKG50aCA8IGxvd2VyLmxlbmd0aCArIHBpdm90cy5sZW5ndGgpIHtcblx0XHRyZXR1cm4gcGl2b3RzWzBdO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBxdWlja1NlbGVjdChudGggLSAobG93ZXIubGVuZ3RoICsgcGl2b3RzLmxlbmd0aCksIGhpZ2hlciwgY29tcGFyZSk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnk8VD4oZGF0YTogUmVhZG9ubHlBcnJheTxUPiwgY29tcGFyZTogKGE6IFQsIGI6IFQpID0+IG51bWJlcik6IFRbXVtdIHtcblx0Y29uc3QgcmVzdWx0OiBUW11bXSA9IFtdO1xuXHRsZXQgY3VycmVudEdyb3VwOiBUW10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdGZvciAoY29uc3QgZWxlbWVudCBvZiBkYXRhLnNsaWNlKDApLnNvcnQoY29tcGFyZSkpIHtcblx0XHRpZiAoIWN1cnJlbnRHcm91cCB8fCBjb21wYXJlKGN1cnJlbnRHcm91cFswXSwgZWxlbWVudCkgIT09IDApIHtcblx0XHRcdGN1cnJlbnRHcm91cCA9IFtlbGVtZW50XTtcblx0XHRcdHJlc3VsdC5wdXNoKGN1cnJlbnRHcm91cCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1cnJlbnRHcm91cC5wdXNoKGVsZW1lbnQpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNwbGl0cyB0aGUgZ2l2ZW4gaXRlbXMgaW50byBhIGxpc3Qgb2YgKG5vbi1lbXB0eSkgZ3JvdXBzLlxuICogYHNob3VsZEJlR3JvdXBlZGAgaXMgdXNlZCB0byBkZWNpZGUgaWYgdHdvIGNvbnNlY3V0aXZlIGl0ZW1zIHNob3VsZCBiZSBpbiB0aGUgc2FtZSBncm91cC5cbiAqIFRoZSBvcmRlciBvZiB0aGUgaXRlbXMgaXMgcHJlc2VydmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdyb3VwQWRqYWNlbnRCeTxUPihpdGVtczogSXRlcmFibGU8VD4sIHNob3VsZEJlR3JvdXBlZDogKGl0ZW0xOiBULCBpdGVtMjogVCkgPT4gYm9vbGVhbik6IEl0ZXJhYmxlPFRbXT4ge1xuXHRsZXQgY3VycmVudEdyb3VwOiBUW10gfCB1bmRlZmluZWQ7XG5cdGxldCBsYXN0OiBUIHwgdW5kZWZpbmVkO1xuXHRmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcblx0XHRpZiAobGFzdCAhPT0gdW5kZWZpbmVkICYmIHNob3VsZEJlR3JvdXBlZChsYXN0LCBpdGVtKSkge1xuXHRcdFx0Y3VycmVudEdyb3VwIS5wdXNoKGl0ZW0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoY3VycmVudEdyb3VwKSB7XG5cdFx0XHRcdHlpZWxkIGN1cnJlbnRHcm91cDtcblx0XHRcdH1cblx0XHRcdGN1cnJlbnRHcm91cCA9IFtpdGVtXTtcblx0XHR9XG5cdFx0bGFzdCA9IGl0ZW07XG5cdH1cblx0aWYgKGN1cnJlbnRHcm91cCkge1xuXHRcdHlpZWxkIGN1cnJlbnRHcm91cDtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yRWFjaEFkamFjZW50PFQ+KGFycjogVFtdLCBmOiAoaXRlbTE6IFQgfCB1bmRlZmluZWQsIGl0ZW0yOiBUIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTogdm9pZCB7XG5cdGZvciAobGV0IGkgPSAwOyBpIDw9IGFyci5sZW5ndGg7IGkrKykge1xuXHRcdGYoaSA9PT0gMCA/IHVuZGVmaW5lZCA6IGFycltpIC0gMV0sIGkgPT09IGFyci5sZW5ndGggPyB1bmRlZmluZWQgOiBhcnJbaV0pO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoV2l0aE5laWdoYm9yczxUPihhcnI6IFRbXSwgZjogKGJlZm9yZTogVCB8IHVuZGVmaW5lZCwgZWxlbWVudDogVCwgYWZ0ZXI6IFQgfCB1bmRlZmluZWQpID0+IHZvaWQpOiB2b2lkIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcblx0XHRmKGkgPT09IDAgPyB1bmRlZmluZWQgOiBhcnJbaSAtIDFdLCBhcnJbaV0sIGkgKyAxID09PSBhcnIubGVuZ3RoID8gdW5kZWZpbmVkIDogYXJyW2kgKyAxXSk7XG5cdH1cbn1cblxuaW50ZXJmYWNlIElNdXRhYmxlU3BsaWNlPFQ+IGV4dGVuZHMgSVNwbGljZTxUPiB7XG5cdHJlYWRvbmx5IHRvSW5zZXJ0OiBUW107XG5cdGRlbGV0ZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogRGlmZnMgdHdvICpzb3J0ZWQqIGFycmF5cyBhbmQgY29tcHV0ZXMgdGhlIHNwbGljZXMgd2hpY2ggYXBwbHkgdGhlIGRpZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0ZWREaWZmPFQ+KGJlZm9yZTogUmVhZG9ubHlBcnJheTxUPiwgYWZ0ZXI6IFJlYWRvbmx5QXJyYXk8VD4sIGNvbXBhcmU6IChhOiBULCBiOiBUKSA9PiBudW1iZXIpOiBJU3BsaWNlPFQ+W10ge1xuXHRjb25zdCByZXN1bHQ6IElNdXRhYmxlU3BsaWNlPFQ+W10gPSBbXTtcblxuXHRmdW5jdGlvbiBwdXNoU3BsaWNlKHN0YXJ0OiBudW1iZXIsIGRlbGV0ZUNvdW50OiBudW1iZXIsIHRvSW5zZXJ0OiBUW10pOiB2b2lkIHtcblx0XHRpZiAoZGVsZXRlQ291bnQgPT09IDAgJiYgdG9JbnNlcnQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbGF0ZXN0ID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcblxuXHRcdGlmIChsYXRlc3QgJiYgbGF0ZXN0LnN0YXJ0ICsgbGF0ZXN0LmRlbGV0ZUNvdW50ID09PSBzdGFydCkge1xuXHRcdFx0bGF0ZXN0LmRlbGV0ZUNvdW50ICs9IGRlbGV0ZUNvdW50O1xuXHRcdFx0bGF0ZXN0LnRvSW5zZXJ0LnB1c2goLi4udG9JbnNlcnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQucHVzaCh7IHN0YXJ0LCBkZWxldGVDb3VudCwgdG9JbnNlcnQgfSk7XG5cdFx0fVxuXHR9XG5cblx0bGV0IGJlZm9yZUlkeCA9IDA7XG5cdGxldCBhZnRlcklkeCA9IDA7XG5cblx0d2hpbGUgKHRydWUpIHtcblx0XHRpZiAoYmVmb3JlSWR4ID09PSBiZWZvcmUubGVuZ3RoKSB7XG5cdFx0XHRwdXNoU3BsaWNlKGJlZm9yZUlkeCwgMCwgYWZ0ZXIuc2xpY2UoYWZ0ZXJJZHgpKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoYWZ0ZXJJZHggPT09IGFmdGVyLmxlbmd0aCkge1xuXHRcdFx0cHVzaFNwbGljZShiZWZvcmVJZHgsIGJlZm9yZS5sZW5ndGggLSBiZWZvcmVJZHgsIFtdKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJlZm9yZUVsZW1lbnQgPSBiZWZvcmVbYmVmb3JlSWR4XTtcblx0XHRjb25zdCBhZnRlckVsZW1lbnQgPSBhZnRlclthZnRlcklkeF07XG5cdFx0Y29uc3QgbiA9IGNvbXBhcmUoYmVmb3JlRWxlbWVudCwgYWZ0ZXJFbGVtZW50KTtcblx0XHRpZiAobiA9PT0gMCkge1xuXHRcdFx0Ly8gZXF1YWxcblx0XHRcdGJlZm9yZUlkeCArPSAxO1xuXHRcdFx0YWZ0ZXJJZHggKz0gMTtcblx0XHR9IGVsc2UgaWYgKG4gPCAwKSB7XG5cdFx0XHQvLyBiZWZvcmVFbGVtZW50IGlzIHNtYWxsZXIgLT4gYmVmb3JlIGVsZW1lbnQgcmVtb3ZlZFxuXHRcdFx0cHVzaFNwbGljZShiZWZvcmVJZHgsIDEsIFtdKTtcblx0XHRcdGJlZm9yZUlkeCArPSAxO1xuXHRcdH0gZWxzZSBpZiAobiA+IDApIHtcblx0XHRcdC8vIGJlZm9yZUVsZW1lbnQgaXMgZ3JlYXRlciAtPiBhZnRlciBlbGVtZW50IGFkZGVkXG5cdFx0XHRwdXNoU3BsaWNlKGJlZm9yZUlkeCwgMCwgW2FmdGVyRWxlbWVudF0pO1xuXHRcdFx0YWZ0ZXJJZHggKz0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRha2VzIHR3byAqc29ydGVkKiBhcnJheXMgYW5kIGNvbXB1dGVzIHRoZWlyIGRlbHRhIChyZW1vdmVkLCBhZGRlZCBlbGVtZW50cykuXG4gKiBGaW5pc2hlcyBpbiBgTWF0aC5taW4oYmVmb3JlLmxlbmd0aCwgYWZ0ZXIubGVuZ3RoKWAgc3RlcHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWx0YTxUPihiZWZvcmU6IFJlYWRvbmx5QXJyYXk8VD4sIGFmdGVyOiBSZWFkb25seUFycmF5PFQ+LCBjb21wYXJlOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKTogeyByZW1vdmVkOiBUW107IGFkZGVkOiBUW10gfSB7XG5cdGNvbnN0IHNwbGljZXMgPSBzb3J0ZWREaWZmKGJlZm9yZSwgYWZ0ZXIsIGNvbXBhcmUpO1xuXHRjb25zdCByZW1vdmVkOiBUW10gPSBbXTtcblx0Y29uc3QgYWRkZWQ6IFRbXSA9IFtdO1xuXG5cdGZvciAoY29uc3Qgc3BsaWNlIG9mIHNwbGljZXMpIHtcblx0XHRyZW1vdmVkLnB1c2goLi4uYmVmb3JlLnNsaWNlKHNwbGljZS5zdGFydCwgc3BsaWNlLnN0YXJ0ICsgc3BsaWNlLmRlbGV0ZUNvdW50KSk7XG5cdFx0YWRkZWQucHVzaCguLi5zcGxpY2UudG9JbnNlcnQpO1xuXHR9XG5cblx0cmV0dXJuIHsgcmVtb3ZlZCwgYWRkZWQgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0b3AgTiBlbGVtZW50cyBmcm9tIHRoZSBhcnJheS5cbiAqXG4gKiBGYXN0ZXIgdGhhbiBzb3J0aW5nIHRoZSBlbnRpcmUgYXJyYXkgd2hlbiB0aGUgYXJyYXkgaXMgYSBsb3QgbGFyZ2VyIHRoYW4gTi5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgVGhlIHVuc29ydGVkIGFycmF5LlxuICogQHBhcmFtIGNvbXBhcmUgQSBzb3J0IGZ1bmN0aW9uIGZvciB0aGUgZWxlbWVudHMuXG4gKiBAcGFyYW0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHVybi5cbiAqIEByZXR1cm4gVGhlIGZpcnN0IG4gZWxlbWVudHMgZnJvbSBhcnJheSB3aGVuIHNvcnRlZCB3aXRoIGNvbXBhcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b3A8VD4oYXJyYXk6IFJlYWRvbmx5QXJyYXk8VD4sIGNvbXBhcmU6IChhOiBULCBiOiBUKSA9PiBudW1iZXIsIG46IG51bWJlcik6IFRbXSB7XG5cdGlmIChuID09PSAwKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cdGNvbnN0IHJlc3VsdCA9IGFycmF5LnNsaWNlKDAsIG4pLnNvcnQoY29tcGFyZSk7XG5cdHRvcFN0ZXAoYXJyYXksIGNvbXBhcmUsIHJlc3VsdCwgbiwgYXJyYXkubGVuZ3RoKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXMgdmFyaWFudCBvZiBgdG9wKClgIGFsbG93aW5nIGZvciBzcGxpdHRpbmcgdXAgd29yayBpbiBiYXRjaGVzIGJldHdlZW4gd2hpY2ggdGhlIGV2ZW50IGxvb3AgY2FuIHJ1bi5cbiAqXG4gKiBSZXR1cm5zIHRoZSB0b3AgTiBlbGVtZW50cyBmcm9tIHRoZSBhcnJheS5cbiAqXG4gKiBGYXN0ZXIgdGhhbiBzb3J0aW5nIHRoZSBlbnRpcmUgYXJyYXkgd2hlbiB0aGUgYXJyYXkgaXMgYSBsb3QgbGFyZ2VyIHRoYW4gTi5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgVGhlIHVuc29ydGVkIGFycmF5LlxuICogQHBhcmFtIGNvbXBhcmUgQSBzb3J0IGZ1bmN0aW9uIGZvciB0aGUgZWxlbWVudHMuXG4gKiBAcGFyYW0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHVybi5cbiAqIEBwYXJhbSBiYXRjaCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGV4YW1pbmUgYmVmb3JlIHlpZWxkaW5nIHRvIHRoZSBldmVudCBsb29wLlxuICogQHJldHVybiBUaGUgZmlyc3QgbiBlbGVtZW50cyBmcm9tIGFycmF5IHdoZW4gc29ydGVkIHdpdGggY29tcGFyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvcEFzeW5jPFQ+KGFycmF5OiBUW10sIGNvbXBhcmU6IChhOiBULCBiOiBUKSA9PiBudW1iZXIsIG46IG51bWJlciwgYmF0Y2g6IG51bWJlciwgdG9rZW4/OiBDYW5jZWxsYXRpb25Ub2tlbik6IFByb21pc2U8VFtdPiB7XG5cdGlmIChuID09PSAwKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdChhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBvID0gYXJyYXkubGVuZ3RoO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXJyYXkuc2xpY2UoMCwgbikuc29ydChjb21wYXJlKTtcblx0XHRcdGZvciAobGV0IGkgPSBuLCBtID0gTWF0aC5taW4obiArIGJhdGNoLCBvKTsgaSA8IG87IGkgPSBtLCBtID0gTWF0aC5taW4obSArIGJhdGNoLCBvKSkge1xuXHRcdFx0XHRpZiAoaSA+IG4pIHtcblx0XHRcdFx0XHRhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSkpOyAvLyBhbnkgb3RoZXIgZGVsYXkgZnVuY3Rpb24gd291bGQgc3RhcnZlIEkvT1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0b2tlbiAmJiB0b2tlbi5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBDYW5jZWxsYXRpb25FcnJvcigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRvcFN0ZXAoYXJyYXksIGNvbXBhcmUsIHJlc3VsdCwgaSwgbSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0pKClcblx0XHRcdC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiB0b3BTdGVwPFQ+KGFycmF5OiBSZWFkb25seUFycmF5PFQ+LCBjb21wYXJlOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyLCByZXN1bHQ6IFRbXSwgaTogbnVtYmVyLCBtOiBudW1iZXIpOiB2b2lkIHtcblx0Zm9yIChjb25zdCBuID0gcmVzdWx0Lmxlbmd0aDsgaSA8IG07IGkrKykge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpXTtcblx0XHRpZiAoY29tcGFyZShlbGVtZW50LCByZXN1bHRbbiAtIDFdKSA8IDApIHtcblx0XHRcdHJlc3VsdC5wb3AoKTtcblx0XHRcdGNvbnN0IGogPSBmaW5kRmlyc3RJZHhNb25vdG9ub3VzT3JBcnJMZW4ocmVzdWx0LCBlID0+IGNvbXBhcmUoZWxlbWVudCwgZSkgPCAwKTtcblx0XHRcdHJlc3VsdC5zcGxpY2UoaiwgMCwgZWxlbWVudCk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHJldHVybnMgTmV3IGFycmF5IHdpdGggYWxsIGZhbHN5IHZhbHVlcyByZW1vdmVkLiBUaGUgb3JpZ2luYWwgYXJyYXkgSVMgTk9UIG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29hbGVzY2U8VD4oYXJyYXk6IFJlYWRvbmx5QXJyYXk8VCB8IHVuZGVmaW5lZCB8IG51bGw+KTogVFtdIHtcblx0cmV0dXJuIGFycmF5LmZpbHRlcigoZSk6IGUgaXMgVCA9PiAhIWUpO1xufVxuXG4vKipcbiAqIFJlbW92ZSBhbGwgZmFsc3kgdmFsdWVzIGZyb20gYGFycmF5YC4gVGhlIG9yaWdpbmFsIGFycmF5IElTIG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29hbGVzY2VJblBsYWNlPFQ+KGFycmF5OiBBcnJheTxUIHwgdW5kZWZpbmVkIHwgbnVsbD4pOiBhc3NlcnRzIGFycmF5IGlzIEFycmF5PFQ+IHtcblx0bGV0IHRvID0gMDtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuXHRcdGlmICghIWFycmF5W2ldKSB7XG5cdFx0XHRhcnJheVt0b10gPSBhcnJheVtpXTtcblx0XHRcdHRvICs9IDE7XG5cdFx0fVxuXHR9XG5cdGFycmF5Lmxlbmd0aCA9IHRvO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgQXJyYXkuY29weVdpdGhpbmAgaW5zdGVhZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbW92ZShhcnJheTogYW55W10sIGZyb206IG51bWJlciwgdG86IG51bWJlcik6IHZvaWQge1xuXHRhcnJheS5zcGxpY2UodG8sIDAsIGFycmF5LnNwbGljZShmcm9tLCAxKVswXSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgZmFsc2UgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhbiBhcnJheSBhbmQgbm90IGVtcHR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGYWxzeU9yRW1wdHkob2JqOiBhbnkpOiBib29sZWFuIHtcblx0cmV0dXJuICFBcnJheS5pc0FycmF5KG9iaikgfHwgb2JqLmxlbmd0aCA9PT0gMDtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXkgYW5kIGhhcyBhdCBsZWFzdCBvbmUgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uRW1wdHlBcnJheTxUPihvYmo6IFRbXSB8IHVuZGVmaW5lZCB8IG51bGwpOiBvYmogaXMgVFtdO1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uRW1wdHlBcnJheTxUPihvYmo6IHJlYWRvbmx5IFRbXSB8IHVuZGVmaW5lZCB8IG51bGwpOiBvYmogaXMgcmVhZG9ubHkgVFtdO1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uRW1wdHlBcnJheTxUPihvYmo6IFRbXSB8IHJlYWRvbmx5IFRbXSB8IHVuZGVmaW5lZCB8IG51bGwpOiBvYmogaXMgVFtdIHwgcmVhZG9ubHkgVFtdIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGR1cGxpY2F0ZXMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuIFRoZSBvcHRpb25hbCBrZXlGbiBhbGxvd3MgdG8gc3BlY2lmeVxuICogaG93IGVsZW1lbnRzIGFyZSBjaGVja2VkIGZvciBlcXVhbGl0eSBieSByZXR1cm5pbmcgYW4gYWx0ZXJuYXRlIHZhbHVlIGZvciBlYWNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGluY3Q8VD4oYXJyYXk6IFJlYWRvbmx5QXJyYXk8VD4sIGtleUZuOiAodmFsdWU6IFQpID0+IGFueSA9IHZhbHVlID0+IHZhbHVlKTogVFtdIHtcblx0Y29uc3Qgc2VlbiA9IG5ldyBTZXQ8YW55PigpO1xuXG5cdHJldHVybiBhcnJheS5maWx0ZXIoZWxlbWVudCA9PiB7XG5cdFx0Y29uc3Qga2V5ID0ga2V5Rm4hKGVsZW1lbnQpO1xuXHRcdGlmIChzZWVuLmhhcyhrZXkpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHNlZW4uYWRkKGtleSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlRmlsdGVyPFQsIFI+KGtleUZuOiAodDogVCkgPT4gUik6ICh0OiBUKSA9PiBib29sZWFuIHtcblx0Y29uc3Qgc2VlbiA9IG5ldyBTZXQ8Uj4oKTtcblxuXHRyZXR1cm4gZWxlbWVudCA9PiB7XG5cdFx0Y29uc3Qga2V5ID0ga2V5Rm4oZWxlbWVudCk7XG5cblx0XHRpZiAoc2Vlbi5oYXMoa2V5KSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHNlZW4uYWRkKGtleSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdE9yRGVmYXVsdDxULCBOb3RGb3VuZCA9IFQ+KGFycmF5OiBSZWFkb25seUFycmF5PFQ+LCBub3RGb3VuZFZhbHVlOiBOb3RGb3VuZCk6IFQgfCBOb3RGb3VuZDtcbmV4cG9ydCBmdW5jdGlvbiBmaXJzdE9yRGVmYXVsdDxUPihhcnJheTogUmVhZG9ubHlBcnJheTxUPik6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RPckRlZmF1bHQ8VCwgTm90Rm91bmQgPSBUPihhcnJheTogUmVhZG9ubHlBcnJheTxUPiwgbm90Rm91bmRWYWx1ZT86IE5vdEZvdW5kKTogVCB8IE5vdEZvdW5kIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGFycmF5Lmxlbmd0aCA+IDAgPyBhcnJheVswXSA6IG5vdEZvdW5kVmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXN0T3JEZWZhdWx0PFQsIE5vdEZvdW5kID0gVD4oYXJyYXk6IFJlYWRvbmx5QXJyYXk8VD4sIG5vdEZvdW5kVmFsdWU6IE5vdEZvdW5kKTogVCB8IE5vdEZvdW5kO1xuZXhwb3J0IGZ1bmN0aW9uIGxhc3RPckRlZmF1bHQ8VD4oYXJyYXk6IFJlYWRvbmx5QXJyYXk8VD4pOiBUIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGxhc3RPckRlZmF1bHQ8VCwgTm90Rm91bmQgPSBUPihhcnJheTogUmVhZG9ubHlBcnJheTxUPiwgbm90Rm91bmRWYWx1ZT86IE5vdEZvdW5kKTogVCB8IE5vdEZvdW5kIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGFycmF5Lmxlbmd0aCA+IDAgPyBhcnJheVthcnJheS5sZW5ndGggLSAxXSA6IG5vdEZvdW5kVmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21tb25QcmVmaXhMZW5ndGg8VD4ob25lOiBSZWFkb25seUFycmF5PFQ+LCBvdGhlcjogUmVhZG9ubHlBcnJheTxUPiwgZXF1YWxzOiAoYTogVCwgYjogVCkgPT4gYm9vbGVhbiA9IChhLCBiKSA9PiBhID09PSBiKTogbnVtYmVyIHtcblx0bGV0IHJlc3VsdCA9IDA7XG5cblx0Zm9yIChsZXQgaSA9IDAsIGxlbiA9IE1hdGgubWluKG9uZS5sZW5ndGgsIG90aGVyLmxlbmd0aCk7IGkgPCBsZW4gJiYgZXF1YWxzKG9uZVtpXSwgb3RoZXJbaV0pOyBpKyspIHtcblx0XHRyZXN1bHQrKztcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYW5nZSh0bzogbnVtYmVyKTogbnVtYmVyW107XG5leHBvcnQgZnVuY3Rpb24gcmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogbnVtYmVyW107XG5leHBvcnQgZnVuY3Rpb24gcmFuZ2UoYXJnOiBudW1iZXIsIHRvPzogbnVtYmVyKTogbnVtYmVyW10ge1xuXHRsZXQgZnJvbSA9IHR5cGVvZiB0byA9PT0gJ251bWJlcicgPyBhcmcgOiAwO1xuXG5cdGlmICh0eXBlb2YgdG8gPT09ICdudW1iZXInKSB7XG5cdFx0ZnJvbSA9IGFyZztcblx0fSBlbHNlIHtcblx0XHRmcm9tID0gMDtcblx0XHR0byA9IGFyZztcblx0fVxuXG5cdGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcblxuXHRpZiAoZnJvbSA8PSB0bykge1xuXHRcdGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87IGkrKykge1xuXHRcdFx0cmVzdWx0LnB1c2goaSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZvciAobGV0IGkgPSBmcm9tOyBpID4gdG87IGktLSkge1xuXHRcdFx0cmVzdWx0LnB1c2goaSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZGV4PFQ+KGFycmF5OiBSZWFkb25seUFycmF5PFQ+LCBpbmRleGVyOiAodDogVCkgPT4gc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBUIH07XG5leHBvcnQgZnVuY3Rpb24gaW5kZXg8VCwgUj4oYXJyYXk6IFJlYWRvbmx5QXJyYXk8VD4sIGluZGV4ZXI6ICh0OiBUKSA9PiBzdHJpbmcsIG1hcHBlcjogKHQ6IFQpID0+IFIpOiB7IFtrZXk6IHN0cmluZ106IFIgfTtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleDxULCBSPihhcnJheTogUmVhZG9ubHlBcnJheTxUPiwgaW5kZXhlcjogKHQ6IFQpID0+IHN0cmluZywgbWFwcGVyPzogKHQ6IFQpID0+IFIpOiB7IFtrZXk6IHN0cmluZ106IFIgfSB7XG5cdHJldHVybiBhcnJheS5yZWR1Y2UoKHIsIHQpID0+IHtcblx0XHRyW2luZGV4ZXIodCldID0gbWFwcGVyID8gbWFwcGVyKHQpIDogdDtcblx0XHRyZXR1cm4gcjtcblx0fSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBhbiBlbGVtZW50IGludG8gYW4gYXJyYXkuIFJldHVybnMgYSBmdW5jdGlvbiB3aGljaCwgd2hlblxuICogY2FsbGVkLCB3aWxsIHJlbW92ZSB0aGF0IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuXG4gKlxuICogQGRlcHJlY2F0ZWQgSW4gYWxtb3N0IGFsbCBjYXNlcywgdXNlIGEgYFNldDxUPmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydDxUPihhcnJheTogVFtdLCBlbGVtZW50OiBUKTogKCkgPT4gdm9pZCB7XG5cdGFycmF5LnB1c2goZWxlbWVudCk7XG5cblx0cmV0dXJuICgpID0+IHJlbW92ZShhcnJheSwgZWxlbWVudCk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gYW4gYXJyYXkgaWYgaXQgY2FuIGJlIGZvdW5kLlxuICpcbiAqIEBkZXByZWNhdGVkIEluIGFsbW9zdCBhbGwgY2FzZXMsIHVzZSBhIGBTZXQ8VD5gIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmU8VD4oYXJyYXk6IFRbXSwgZWxlbWVudDogVCk6IFQgfCB1bmRlZmluZWQge1xuXHRjb25zdCBpbmRleCA9IGFycmF5LmluZGV4T2YoZWxlbWVudCk7XG5cdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0YXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcblxuXHRcdHJldHVybiBlbGVtZW50O1xuXHR9XG5cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbnNlcnQgYGluc2VydEFycmAgaW5zaWRlIGB0YXJnZXRgIGF0IGBpbnNlcnRJbmRleGAuXG4gKiBQbGVhc2UgZG9uJ3QgdG91Y2ggdW5sZXNzIHlvdSB1bmRlcnN0YW5kIGh0dHBzOi8vanNwZXJmLmNvbS9pbnNlcnRpbmctYW4tYXJyYXktd2l0aGluLWFuLWFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUluc2VydDxUPih0YXJnZXQ6IFRbXSwgaW5zZXJ0SW5kZXg6IG51bWJlciwgaW5zZXJ0QXJyOiBUW10pOiBUW10ge1xuXHRjb25zdCBiZWZvcmUgPSB0YXJnZXQuc2xpY2UoMCwgaW5zZXJ0SW5kZXgpO1xuXHRjb25zdCBhZnRlciA9IHRhcmdldC5zbGljZShpbnNlcnRJbmRleCk7XG5cdHJldHVybiBiZWZvcmUuY29uY2F0KGluc2VydEFyciwgYWZ0ZXIpO1xufVxuXG4vKipcbiAqIFVzZXMgRmlzaGVyLVlhdGVzIHNodWZmbGUgdG8gc2h1ZmZsZSB0aGUgZ2l2ZW4gYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNodWZmbGU8VD4oYXJyYXk6IFRbXSwgX3NlZWQ/OiBudW1iZXIpOiB2b2lkIHtcblx0bGV0IHJhbmQ6ICgpID0+IG51bWJlcjtcblxuXHRpZiAodHlwZW9mIF9zZWVkID09PSAnbnVtYmVyJykge1xuXHRcdGxldCBzZWVkID0gX3NlZWQ7XG5cdFx0Ly8gU2VlZGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluIEpTLiBNb2RpZmllZCBmcm9tOlxuXHRcdC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUyMTI5NS9zZWVkaW5nLXRoZS1yYW5kb20tbnVtYmVyLWdlbmVyYXRvci1pbi1qYXZhc2NyaXB0XG5cdFx0cmFuZCA9ICgpID0+IHtcblx0XHRcdGNvbnN0IHggPSBNYXRoLnNpbihzZWVkKyspICogMTc5NDI2NTQ5OyAvLyB0aHJvdyBhd2F5IG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIGFuZCByZWR1Y2UgYW55IHBvdGVudGlhbCBiaWFzXG5cdFx0XHRyZXR1cm4geCAtIE1hdGguZmxvb3IoeCk7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyYW5kID0gTWF0aC5yYW5kb207XG5cdH1cblxuXHRmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGkgLT0gMSkge1xuXHRcdGNvbnN0IGogPSBNYXRoLmZsb29yKHJhbmQoKSAqIChpICsgMSkpO1xuXHRcdGNvbnN0IHRlbXAgPSBhcnJheVtpXTtcblx0XHRhcnJheVtpXSA9IGFycmF5W2pdO1xuXHRcdGFycmF5W2pdID0gdGVtcDtcblx0fVxufVxuXG4vKipcbiAqIFB1c2hlcyBhbiBlbGVtZW50IHRvIHRoZSBzdGFydCBvZiB0aGUgYXJyYXksIGlmIGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVzaFRvU3RhcnQ8VD4oYXJyOiBUW10sIHZhbHVlOiBUKTogdm9pZCB7XG5cdGNvbnN0IGluZGV4ID0gYXJyLmluZGV4T2YodmFsdWUpO1xuXG5cdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0YXJyLnNwbGljZShpbmRleCwgMSk7XG5cdFx0YXJyLnVuc2hpZnQodmFsdWUpO1xuXHR9XG59XG5cbi8qKlxuICogUHVzaGVzIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXksIGlmIGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVzaFRvRW5kPFQ+KGFycjogVFtdLCB2YWx1ZTogVCk6IHZvaWQge1xuXHRjb25zdCBpbmRleCA9IGFyci5pbmRleE9mKHZhbHVlKTtcblxuXHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdGFyci5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdGFyci5wdXNoKHZhbHVlKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHVzaE1hbnk8VD4oYXJyOiBUW10sIGl0ZW1zOiBSZWFkb25seUFycmF5PFQ+KTogdm9pZCB7XG5cdGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuXHRcdGFyci5wdXNoKGl0ZW0pO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBBcnJheU9yTm90PFQsIFU+KGl0ZW1zOiBUIHwgVFtdLCBmbjogKF86IFQpID0+IFUpOiBVIHwgVVtdIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkoaXRlbXMpID9cblx0XHRpdGVtcy5tYXAoZm4pIDpcblx0XHRmbihpdGVtcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5PFQ+KHg6IFQgfCBUW10pOiBUW107XG5leHBvcnQgZnVuY3Rpb24gYXNBcnJheTxUPih4OiBUIHwgcmVhZG9ubHkgVFtdKTogcmVhZG9ubHkgVFtdO1xuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXk8VD4oeDogVCB8IFRbXSk6IFRbXSB7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KHgpID8geCA6IFt4XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmRvbUVsZW1lbnQ8VD4oYXJyOiBUW10pOiBUIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGFycltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKV07XG59XG5cbi8qKlxuICogSW5zZXJ0IHRoZSBuZXcgaXRlbXMgaW4gdGhlIGFycmF5LlxuICogQHBhcmFtIGFycmF5IFRoZSBvcmlnaW5hbCBhcnJheS5cbiAqIEBwYXJhbSBzdGFydCBUaGUgemVyby1iYXNlZCBsb2NhdGlvbiBpbiB0aGUgYXJyYXkgZnJvbSB3aGljaCB0byBzdGFydCBpbnNlcnRpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gbmV3SXRlbXMgVGhlIGl0ZW1zIHRvIGJlIGluc2VydGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRJbnRvPFQ+KGFycmF5OiBUW10sIHN0YXJ0OiBudW1iZXIsIG5ld0l0ZW1zOiBUW10pOiB2b2lkIHtcblx0Y29uc3Qgc3RhcnRJZHggPSBnZXRBY3R1YWxTdGFydEluZGV4KGFycmF5LCBzdGFydCk7XG5cdGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRjb25zdCBuZXdJdGVtc0xlbmd0aCA9IG5ld0l0ZW1zLmxlbmd0aDtcblx0YXJyYXkubGVuZ3RoID0gb3JpZ2luYWxMZW5ndGggKyBuZXdJdGVtc0xlbmd0aDtcblx0Ly8gTW92ZSB0aGUgaXRlbXMgYWZ0ZXIgdGhlIHN0YXJ0IGluZGV4LCBzdGFydCBmcm9tIHRoZSBlbmQgc28gdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgYW55IHZhbHVlLlxuXHRmb3IgKGxldCBpID0gb3JpZ2luYWxMZW5ndGggLSAxOyBpID49IHN0YXJ0SWR4OyBpLS0pIHtcblx0XHRhcnJheVtpICsgbmV3SXRlbXNMZW5ndGhdID0gYXJyYXlbaV07XG5cdH1cblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IG5ld0l0ZW1zTGVuZ3RoOyBpKyspIHtcblx0XHRhcnJheVtpICsgc3RhcnRJZHhdID0gbmV3SXRlbXNbaV07XG5cdH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYW5kIGluc2VydHMgbmV3IGVsZW1lbnRzIGluIHRoZWlyIHBsYWNlLCByZXR1cm5pbmcgdGhlIGRlbGV0ZWQgZWxlbWVudHMuIEFsdGVybmF0aXZlIHRvIHRoZSBuYXRpdmUgQXJyYXkuc3BsaWNlIG1ldGhvZCwgaXRcbiAqIGNhbiBvbmx5IHN1cHBvcnQgbGltaXRlZCBudW1iZXIgb2YgaXRlbXMgZHVlIHRvIHRoZSBtYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBsaW1pdC5cbiAqIEBwYXJhbSBhcnJheSBUaGUgb3JpZ2luYWwgYXJyYXkuXG4gKiBAcGFyYW0gc3RhcnQgVGhlIHplcm8tYmFzZWQgbG9jYXRpb24gaW4gdGhlIGFycmF5IGZyb20gd2hpY2ggdG8gc3RhcnQgcmVtb3ZpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZGVsZXRlQ291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGljZTxUPihhcnJheTogVFtdLCBzdGFydDogbnVtYmVyLCBkZWxldGVDb3VudDogbnVtYmVyLCBuZXdJdGVtczogVFtdKTogVFtdIHtcblx0Y29uc3QgaW5kZXggPSBnZXRBY3R1YWxTdGFydEluZGV4KGFycmF5LCBzdGFydCk7XG5cdGxldCByZXN1bHQgPSBhcnJheS5zcGxpY2UoaW5kZXgsIGRlbGV0ZUNvdW50KTtcblx0aWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjExNDBcblx0XHRyZXN1bHQgPSBbXTtcblx0fVxuXHRpbnNlcnRJbnRvKGFycmF5LCBpbmRleCwgbmV3SXRlbXMpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSB0aGUgYWN0dWFsIHN0YXJ0IGluZGV4IChzYW1lIGxvZ2ljIGFzIHRoZSBuYXRpdmUgc3BsaWNlKCkgb3Igc2xpY2UoKSlcbiAqIElmIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSwgc3RhcnQgd2lsbCBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkuIEluIHRoaXMgY2FzZSwgbm8gZWxlbWVudCB3aWxsIGJlIGRlbGV0ZWQgYnV0IHRoZSBtZXRob2Qgd2lsbCBiZWhhdmUgYXMgYW4gYWRkaW5nIGZ1bmN0aW9uLCBhZGRpbmcgYXMgbWFueSBlbGVtZW50IGFzIGl0ZW1bbipdIHByb3ZpZGVkLlxuICogSWYgbmVnYXRpdmUsIGl0IHdpbGwgYmVnaW4gdGhhdCBtYW55IGVsZW1lbnRzIGZyb20gdGhlIGVuZCBvZiB0aGUgYXJyYXkuIChJbiB0aGlzIGNhc2UsIHRoZSBvcmlnaW4gLTEsIG1lYW5pbmcgLW4gaXMgdGhlIGluZGV4IG9mIHRoZSBudGggbGFzdCBlbGVtZW50LCBhbmQgaXMgdGhlcmVmb3JlIGVxdWl2YWxlbnQgdG8gdGhlIGluZGV4IG9mIGFycmF5Lmxlbmd0aCAtIG4uKSBJZiBhcnJheS5sZW5ndGggKyBzdGFydCBpcyBsZXNzIHRoYW4gMCwgaXQgd2lsbCBiZWdpbiBmcm9tIGluZGV4IDAuXG4gKiBAcGFyYW0gYXJyYXkgVGhlIHRhcmdldCBhcnJheS5cbiAqIEBwYXJhbSBzdGFydCBUaGUgb3BlcmF0aW9uIGluZGV4LlxuICovXG5mdW5jdGlvbiBnZXRBY3R1YWxTdGFydEluZGV4PFQ+KGFycmF5OiBUW10sIHN0YXJ0OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gc3RhcnQgPCAwID8gTWF0aC5tYXgoc3RhcnQgKyBhcnJheS5sZW5ndGgsIDApIDogTWF0aC5taW4oc3RhcnQsIGFycmF5Lmxlbmd0aCk7XG59XG5cbi8qKlxuICogV2hlbiBjb21wYXJpbmcgdHdvIHZhbHVlcyxcbiAqIGEgbmVnYXRpdmUgbnVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZCxcbiAqIGEgcG9zaXRpdmUgbnVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBmaXJzdCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCxcbiAqIGFuZCB6ZXJvIGluZGljYXRlcyB0aGF0IG5laXRoZXIgaXMgdGhlIGNhc2UuXG4qL1xuZXhwb3J0IHR5cGUgQ29tcGFyZVJlc3VsdCA9IG51bWJlcjtcblxuZXhwb3J0IG5hbWVzcGFjZSBDb21wYXJlUmVzdWx0IHtcblx0ZXhwb3J0IGZ1bmN0aW9uIGlzTGVzc1RoYW4ocmVzdWx0OiBDb21wYXJlUmVzdWx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHJlc3VsdCA8IDA7XG5cdH1cblxuXHRleHBvcnQgZnVuY3Rpb24gaXNMZXNzVGhhbk9yRXF1YWwocmVzdWx0OiBDb21wYXJlUmVzdWx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHJlc3VsdCA8PSAwO1xuXHR9XG5cblx0ZXhwb3J0IGZ1bmN0aW9uIGlzR3JlYXRlclRoYW4ocmVzdWx0OiBDb21wYXJlUmVzdWx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHJlc3VsdCA+IDA7XG5cdH1cblxuXHRleHBvcnQgZnVuY3Rpb24gaXNOZWl0aGVyTGVzc09yR3JlYXRlclRoYW4ocmVzdWx0OiBDb21wYXJlUmVzdWx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHJlc3VsdCA9PT0gMDtcblx0fVxuXG5cdGV4cG9ydCBjb25zdCBncmVhdGVyVGhhbiA9IDE7XG5cdGV4cG9ydCBjb25zdCBsZXNzVGhhbiA9IC0xO1xuXHRleHBvcnQgY29uc3QgbmVpdGhlckxlc3NPckdyZWF0ZXJUaGFuID0gMDtcbn1cblxuLyoqXG4gKiBBIGNvbXBhcmF0b3IgYGNgIGRlZmluZXMgYSB0b3RhbCBvcmRlciBgPD1gIG9uIGBUYCBhcyBmb2xsb3dpbmc6XG4gKiBgYyhhLCBiKSA8PSAwYCBpZmYgYGFgIDw9IGBiYC5cbiAqIFdlIGFsc28gaGF2ZSBgYyhhLCBiKSA9PSAwYCBpZmYgYGMoYiwgYSkgPT0gMGAuXG4qL1xuZXhwb3J0IHR5cGUgQ29tcGFyYXRvcjxUPiA9IChhOiBULCBiOiBUKSA9PiBDb21wYXJlUmVzdWx0O1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZUJ5PFRJdGVtLCBUQ29tcGFyZUJ5PihzZWxlY3RvcjogKGl0ZW06IFRJdGVtKSA9PiBUQ29tcGFyZUJ5LCBjb21wYXJhdG9yOiBDb21wYXJhdG9yPFRDb21wYXJlQnk+KTogQ29tcGFyYXRvcjxUSXRlbT4ge1xuXHRyZXR1cm4gKGEsIGIpID0+IGNvbXBhcmF0b3Ioc2VsZWN0b3IoYSksIHNlbGVjdG9yKGIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpZUJyZWFrQ29tcGFyYXRvcnM8VEl0ZW0+KC4uLmNvbXBhcmF0b3JzOiBDb21wYXJhdG9yPFRJdGVtPltdKTogQ29tcGFyYXRvcjxUSXRlbT4ge1xuXHRyZXR1cm4gKGl0ZW0xLCBpdGVtMikgPT4ge1xuXHRcdGZvciAoY29uc3QgY29tcGFyYXRvciBvZiBjb21wYXJhdG9ycykge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihpdGVtMSwgaXRlbTIpO1xuXHRcdFx0aWYgKCFDb21wYXJlUmVzdWx0LmlzTmVpdGhlckxlc3NPckdyZWF0ZXJUaGFuKHJlc3VsdCkpIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIENvbXBhcmVSZXN1bHQubmVpdGhlckxlc3NPckdyZWF0ZXJUaGFuO1xuXHR9O1xufVxuXG4vKipcbiAqIFRoZSBuYXR1cmFsIG9yZGVyIG9uIG51bWJlcnMuXG4qL1xuZXhwb3J0IGNvbnN0IG51bWJlckNvbXBhcmF0b3I6IENvbXBhcmF0b3I8bnVtYmVyPiA9IChhLCBiKSA9PiBhIC0gYjtcblxuZXhwb3J0IGNvbnN0IGJvb2xlYW5Db21wYXJhdG9yOiBDb21wYXJhdG9yPGJvb2xlYW4+ID0gKGEsIGIpID0+IG51bWJlckNvbXBhcmF0b3IoYSA/IDEgOiAwLCBiID8gMSA6IDApO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZU9yZGVyPFRJdGVtPihjb21wYXJhdG9yOiBDb21wYXJhdG9yPFRJdGVtPik6IENvbXBhcmF0b3I8VEl0ZW0+IHtcblx0cmV0dXJuIChhLCBiKSA9PiAtY29tcGFyYXRvcihhLCBiKTtcbn1cblxuZXhwb3J0IGNsYXNzIEFycmF5UXVldWU8VD4ge1xuXHRwcml2YXRlIGZpcnN0SWR4ID0gMDtcblx0cHJpdmF0ZSBsYXN0SWR4ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxO1xuXG5cdC8qKlxuXHQgKiBDb25zdHJ1Y3RzIGEgcXVldWUgdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIGFycmF5LiBSdW50aW1lIGlzIE8oMSkuXG5cdCovXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaXRlbXM6IHJlYWRvbmx5IFRbXSkgeyB9XG5cblx0Z2V0IGxlbmd0aCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmxhc3RJZHggLSB0aGlzLmZpcnN0SWR4ICsgMTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25zdW1lcyBlbGVtZW50cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlIGFzIGxvbmcgYXMgdGhlIHByZWRpY2F0ZSByZXR1cm5zIHRydWUuXG5cdCAqIElmIG5vIGVsZW1lbnRzIHdlcmUgY29uc3VtZWQsIGBudWxsYCBpcyByZXR1cm5lZC4gSGFzIGEgcnVudGltZSBvZiBPKHJlc3VsdC5sZW5ndGgpLlxuXHQqL1xuXHR0YWtlV2hpbGUocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pOiBUW10gfCBudWxsIHtcblx0XHQvLyBQKGspIDo9IGsgPD0gdGhpcy5sYXN0SWR4ICYmIHByZWRpY2F0ZSh0aGlzLml0ZW1zW2tdKVxuXHRcdC8vIEZpbmQgcyA6PSBtaW4geyBrIHwgayA+PSB0aGlzLmZpcnN0SWR4ICYmICFQKGspIH0gYW5kIHJldHVybiB0aGlzLmRhdGFbdGhpcy5maXJzdElkeC4uLnMpXG5cblx0XHRsZXQgc3RhcnRJZHggPSB0aGlzLmZpcnN0SWR4O1xuXHRcdHdoaWxlIChzdGFydElkeCA8IHRoaXMuaXRlbXMubGVuZ3RoICYmIHByZWRpY2F0ZSh0aGlzLml0ZW1zW3N0YXJ0SWR4XSkpIHtcblx0XHRcdHN0YXJ0SWR4Kys7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc3VsdCA9IHN0YXJ0SWR4ID09PSB0aGlzLmZpcnN0SWR4ID8gbnVsbCA6IHRoaXMuaXRlbXMuc2xpY2UodGhpcy5maXJzdElkeCwgc3RhcnRJZHgpO1xuXHRcdHRoaXMuZmlyc3RJZHggPSBzdGFydElkeDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnN1bWVzIGVsZW1lbnRzIGZyb20gdGhlIGVuZCBvZiB0aGUgcXVldWUgYXMgbG9uZyBhcyB0aGUgcHJlZGljYXRlIHJldHVybnMgdHJ1ZS5cblx0ICogSWYgbm8gZWxlbWVudHMgd2VyZSBjb25zdW1lZCwgYG51bGxgIGlzIHJldHVybmVkLlxuXHQgKiBUaGUgcmVzdWx0IGhhcyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgdW5kZXJseWluZyBhcnJheSFcblx0Ki9cblx0dGFrZUZyb21FbmRXaGlsZShwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbik6IFRbXSB8IG51bGwge1xuXHRcdC8vIFAoaykgOj0gdGhpcy5maXJzdElkeCA+PSBrICYmIHByZWRpY2F0ZSh0aGlzLml0ZW1zW2tdKVxuXHRcdC8vIEZpbmQgcyA6PSBtYXggeyBrIHwgayA8PSB0aGlzLmxhc3RJZHggJiYgIVAoaykgfSBhbmQgcmV0dXJuIHRoaXMuZGF0YShzLi4udGhpcy5sYXN0SWR4XVxuXG5cdFx0bGV0IGVuZElkeCA9IHRoaXMubGFzdElkeDtcblx0XHR3aGlsZSAoZW5kSWR4ID49IDAgJiYgcHJlZGljYXRlKHRoaXMuaXRlbXNbZW5kSWR4XSkpIHtcblx0XHRcdGVuZElkeC0tO1xuXHRcdH1cblx0XHRjb25zdCByZXN1bHQgPSBlbmRJZHggPT09IHRoaXMubGFzdElkeCA/IG51bGwgOiB0aGlzLml0ZW1zLnNsaWNlKGVuZElkeCArIDEsIHRoaXMubGFzdElkeCArIDEpO1xuXHRcdHRoaXMubGFzdElkeCA9IGVuZElkeDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cGVlaygpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLml0ZW1zW3RoaXMuZmlyc3RJZHhdO1xuXHR9XG5cblx0cGVla0xhc3QoKTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5pdGVtc1t0aGlzLmxhc3RJZHhdO1xuXHR9XG5cblx0ZGVxdWV1ZSgpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLml0ZW1zW3RoaXMuZmlyc3RJZHhdO1xuXHRcdHRoaXMuZmlyc3RJZHgrKztcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cmVtb3ZlTGFzdCgpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLml0ZW1zW3RoaXMubGFzdElkeF07XG5cdFx0dGhpcy5sYXN0SWR4LS07XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHRha2VDb3VudChjb3VudDogbnVtYmVyKTogVFtdIHtcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLml0ZW1zLnNsaWNlKHRoaXMuZmlyc3RJZHgsIHRoaXMuZmlyc3RJZHggKyBjb3VudCk7XG5cdFx0dGhpcy5maXJzdElkeCArPSBjb3VudDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyBmYXN0ZXIgdGhhbiBhbiBpdGVyYXRvciBhbmQgYXJyYXkgZm9yIGxhenkgY29tcHV0ZWQgZGF0YS5cbiovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2tJdGVyYWJsZTxUPiB7XG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZW1wdHkgPSBuZXcgQ2FsbGJhY2tJdGVyYWJsZTxuZXZlcj4oX2NhbGxiYWNrID0+IHsgfSk7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0LyoqXG5cdFx0ICogQ2FsbHMgdGhlIGNhbGxiYWNrIGZvciBldmVyeSBpdGVtLlxuXHRcdCAqIFN0b3BzIHdoZW4gdGhlIGNhbGxiYWNrIHJldHVybnMgZmFsc2UuXG5cdFx0Ki9cblx0XHRwdWJsaWMgcmVhZG9ubHkgaXRlcmF0ZTogKGNhbGxiYWNrOiAoaXRlbTogVCkgPT4gYm9vbGVhbikgPT4gdm9pZFxuXHQpIHtcblx0fVxuXG5cdGZvckVhY2goaGFuZGxlcjogKGl0ZW06IFQpID0+IHZvaWQpIHtcblx0XHR0aGlzLml0ZXJhdGUoaXRlbSA9PiB7IGhhbmRsZXIoaXRlbSk7IHJldHVybiB0cnVlOyB9KTtcblx0fVxuXG5cdHRvQXJyYXkoKTogVFtdIHtcblx0XHRjb25zdCByZXN1bHQ6IFRbXSA9IFtdO1xuXHRcdHRoaXMuaXRlcmF0ZShpdGVtID0+IHsgcmVzdWx0LnB1c2goaXRlbSk7IHJldHVybiB0cnVlOyB9KTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0ZmlsdGVyKHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBDYWxsYmFja0l0ZXJhYmxlPFQ+IHtcblx0XHRyZXR1cm4gbmV3IENhbGxiYWNrSXRlcmFibGUoY2IgPT4gdGhpcy5pdGVyYXRlKGl0ZW0gPT4gcHJlZGljYXRlKGl0ZW0pID8gY2IoaXRlbSkgOiB0cnVlKSk7XG5cdH1cblxuXHRtYXA8VFJlc3VsdD4obWFwRm46IChpdGVtOiBUKSA9PiBUUmVzdWx0KTogQ2FsbGJhY2tJdGVyYWJsZTxUUmVzdWx0PiB7XG5cdFx0cmV0dXJuIG5ldyBDYWxsYmFja0l0ZXJhYmxlPFRSZXN1bHQ+KGNiID0+IHRoaXMuaXRlcmF0ZShpdGVtID0+IGNiKG1hcEZuKGl0ZW0pKSkpO1xuXHR9XG5cblx0c29tZShwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0bGV0IHJlc3VsdCA9IGZhbHNlO1xuXHRcdHRoaXMuaXRlcmF0ZShpdGVtID0+IHsgcmVzdWx0ID0gcHJlZGljYXRlKGl0ZW0pOyByZXR1cm4gIXJlc3VsdDsgfSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZpbmRGaXJzdChwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IHJlc3VsdDogVCB8IHVuZGVmaW5lZDtcblx0XHR0aGlzLml0ZXJhdGUoaXRlbSA9PiB7XG5cdFx0XHRpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG5cdFx0XHRcdHJlc3VsdCA9IGl0ZW07XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRmaW5kTGFzdChwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IHJlc3VsdDogVCB8IHVuZGVmaW5lZDtcblx0XHR0aGlzLml0ZXJhdGUoaXRlbSA9PiB7XG5cdFx0XHRpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG5cdFx0XHRcdHJlc3VsdCA9IGl0ZW07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9KTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0ZmluZExhc3RNYXhCeShjb21wYXJhdG9yOiBDb21wYXJhdG9yPFQ+KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IHJlc3VsdDogVCB8IHVuZGVmaW5lZDtcblx0XHRsZXQgZmlyc3QgPSB0cnVlO1xuXHRcdHRoaXMuaXRlcmF0ZShpdGVtID0+IHtcblx0XHRcdGlmIChmaXJzdCB8fCBDb21wYXJlUmVzdWx0LmlzR3JlYXRlclRoYW4oY29tcGFyYXRvcihpdGVtLCByZXN1bHQhKSkpIHtcblx0XHRcdFx0Zmlyc3QgPSBmYWxzZTtcblx0XHRcdFx0cmVzdWx0ID0gaXRlbTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmUtYXJyYW5nZW1lbnQgb2YgaXRlbXMgaW4gYW4gYXJyYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJtdXRhdGlvbiB7XG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX2luZGV4TWFwOiByZWFkb25seSBudW1iZXJbXSkgeyB9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBwZXJtdXRhdGlvbiB0aGF0IHNvcnRzIHRoZSBnaXZlbiBhcnJheSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbXBhcmUgZnVuY3Rpb24uXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGNyZWF0ZVNvcnRQZXJtdXRhdGlvbjxUPihhcnI6IHJlYWRvbmx5IFRbXSwgY29tcGFyZUZuOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKTogUGVybXV0YXRpb24ge1xuXHRcdGNvbnN0IHNvcnRJbmRpY2VzID0gQXJyYXkuZnJvbShhcnIua2V5cygpKS5zb3J0KChpbmRleDEsIGluZGV4MikgPT4gY29tcGFyZUZuKGFycltpbmRleDFdLCBhcnJbaW5kZXgyXSkpO1xuXHRcdHJldHVybiBuZXcgUGVybXV0YXRpb24oc29ydEluZGljZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBuZXcgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5IHJlLWFycmFuZ2VkIGFjY29yZGluZyB0byB0aGlzIHBlcm11dGF0aW9uLlxuXHQgKi9cblx0YXBwbHk8VD4oYXJyOiByZWFkb25seSBUW10pOiBUW10ge1xuXHRcdHJldHVybiBhcnIubWFwKChfLCBpbmRleCkgPT4gYXJyW3RoaXMuX2luZGV4TWFwW2luZGV4XV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBuZXcgcGVybXV0YXRpb24gdGhhdCB1bmRvZXMgdGhlIHJlLWFycmFuZ2VtZW50IG9mIHRoaXMgcGVybXV0YXRpb24uXG5cdCovXG5cdGludmVyc2UoKTogUGVybXV0YXRpb24ge1xuXHRcdGNvbnN0IGludmVyc2VJbmRleE1hcCA9IHRoaXMuX2luZGV4TWFwLnNsaWNlKCk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9pbmRleE1hcC5sZW5ndGg7IGkrKykge1xuXHRcdFx0aW52ZXJzZUluZGV4TWFwW3RoaXMuX2luZGV4TWFwW2ldXSA9IGk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgUGVybXV0YXRpb24oaW52ZXJzZUluZGV4TWFwKTtcblx0fVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBhIEphdmFTY3JpcHQgb2JqZWN0IHRoYXRcbiAqIGFjdHMgYSBkaWN0aW9uYXJ5LiBUaGUga2V5cyBhcmUgc3RyaW5ncy5cbiAqL1xuZXhwb3J0IHR5cGUgSVN0cmluZ0RpY3Rpb25hcnk8Vj4gPSBSZWNvcmQ8c3RyaW5nLCBWPjtcblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGEgSmF2YVNjcmlwdCBvYmplY3QgdGhhdFxuICogYWN0cyBhIGRpY3Rpb25hcnkuIFRoZSBrZXlzIGFyZSBudW1iZXJzLlxuICovXG5leHBvcnQgdHlwZSBJTnVtYmVyRGljdGlvbmFyeTxWPiA9IFJlY29yZDxudW1iZXIsIFY+O1xuXG4vKipcbiAqIEdyb3VwcyB0aGUgY29sbGVjdGlvbiBpbnRvIGEgZGljdGlvbmFyeSBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIGdyb3VwIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeTxLIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBWPihkYXRhOiBWW10sIGdyb3VwRm46IChlbGVtZW50OiBWKSA9PiBLKTogUmVjb3JkPEssIFZbXT4ge1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxLLCBWW10+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGRhdGEpIHtcblx0XHRjb25zdCBrZXkgPSBncm91cEZuKGVsZW1lbnQpO1xuXHRcdGxldCB0YXJnZXQgPSByZXN1bHRba2V5XTtcblx0XHRpZiAoIXRhcmdldCkge1xuXHRcdFx0dGFyZ2V0ID0gcmVzdWx0W2tleV0gPSBbXTtcblx0XHR9XG5cdFx0dGFyZ2V0LnB1c2goZWxlbWVudCk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZTZXRzPFQ+KGJlZm9yZTogU2V0PFQ+LCBhZnRlcjogU2V0PFQ+KTogeyByZW1vdmVkOiBUW107IGFkZGVkOiBUW10gfSB7XG5cdGNvbnN0IHJlbW92ZWQ6IFRbXSA9IFtdO1xuXHRjb25zdCBhZGRlZDogVFtdID0gW107XG5cdGZvciAoY29uc3QgZWxlbWVudCBvZiBiZWZvcmUpIHtcblx0XHRpZiAoIWFmdGVyLmhhcyhlbGVtZW50KSkge1xuXHRcdFx0cmVtb3ZlZC5wdXNoKGVsZW1lbnQpO1xuXHRcdH1cblx0fVxuXHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWZ0ZXIpIHtcblx0XHRpZiAoIWJlZm9yZS5oYXMoZWxlbWVudCkpIHtcblx0XHRcdGFkZGVkLnB1c2goZWxlbWVudCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IHJlbW92ZWQsIGFkZGVkIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmTWFwczxLLCBWPihiZWZvcmU6IE1hcDxLLCBWPiwgYWZ0ZXI6IE1hcDxLLCBWPik6IHsgcmVtb3ZlZDogVltdOyBhZGRlZDogVltdIH0ge1xuXHRjb25zdCByZW1vdmVkOiBWW10gPSBbXTtcblx0Y29uc3QgYWRkZWQ6IFZbXSA9IFtdO1xuXHRmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIGJlZm9yZSkge1xuXHRcdGlmICghYWZ0ZXIuaGFzKGluZGV4KSkge1xuXHRcdFx0cmVtb3ZlZC5wdXNoKHZhbHVlKTtcblx0XHR9XG5cdH1cblx0Zm9yIChjb25zdCBbaW5kZXgsIHZhbHVlXSBvZiBhZnRlcikge1xuXHRcdGlmICghYmVmb3JlLmhhcyhpbmRleCkpIHtcblx0XHRcdGFkZGVkLnB1c2godmFsdWUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4geyByZW1vdmVkLCBhZGRlZCB9O1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNldHMuXG4gKlxuICogQHBhcmFtIHNldEEgLSBUaGUgZmlyc3Qgc2V0LlxuICogQHBhcmFtIHNldEIgLSBUaGUgc2Vjb25kIGl0ZXJhYmxlLlxuICogQHJldHVybnMgQSBuZXcgc2V0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGluIGJvdGggYHNldEFgIGFuZCBgc2V0QmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnNlY3Rpb248VD4oc2V0QTogU2V0PFQ+LCBzZXRCOiBJdGVyYWJsZTxUPik6IFNldDxUPiB7XG5cdGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8VD4oKTtcblx0Zm9yIChjb25zdCBlbGVtIG9mIHNldEIpIHtcblx0XHRpZiAoc2V0QS5oYXMoZWxlbSkpIHtcblx0XHRcdHJlc3VsdC5hZGQoZWxlbSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRXaXRoS2V5PFQ+IGltcGxlbWVudHMgU2V0PFQ+IHtcblx0cHJpdmF0ZSBfbWFwID0gbmV3IE1hcDxhbnksIFQ+KCk7XG5cblx0Y29uc3RydWN0b3IodmFsdWVzOiBUW10sIHByaXZhdGUgdG9LZXk6ICh0OiBUKSA9PiBhbnkpIHtcblx0XHRmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuXHRcdFx0dGhpcy5hZGQodmFsdWUpO1xuXHRcdH1cblx0fVxuXG5cdGdldCBzaXplKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX21hcC5zaXplO1xuXHR9XG5cblx0YWRkKHZhbHVlOiBUKTogdGhpcyB7XG5cdFx0Y29uc3Qga2V5ID0gdGhpcy50b0tleSh2YWx1ZSk7XG5cdFx0dGhpcy5fbWFwLnNldChrZXksIHZhbHVlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGRlbGV0ZSh2YWx1ZTogVCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHRoaXMudG9LZXkodmFsdWUpKTtcblx0fVxuXG5cdGhhcyh2YWx1ZTogVCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9tYXAuaGFzKHRoaXMudG9LZXkodmFsdWUpKTtcblx0fVxuXG5cdCplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W1QsIFRdPiB7XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLl9tYXAudmFsdWVzKCkpIHtcblx0XHRcdHlpZWxkIFtlbnRyeSwgZW50cnldO1xuXHRcdH1cblx0fVxuXG5cdGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxUPiB7XG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzKCk7XG5cdH1cblxuXHQqdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5fbWFwLnZhbHVlcygpKSB7XG5cdFx0XHR5aWVsZCBlbnRyeTtcblx0XHR9XG5cdH1cblxuXHRjbGVhcigpOiB2b2lkIHtcblx0XHR0aGlzLl9tYXAuY2xlYXIoKTtcblx0fVxuXG5cdGZvckVhY2goY2FsbGJhY2tmbjogKHZhbHVlOiBULCB2YWx1ZTI6IFQsIHNldDogU2V0PFQ+KSA9PiB2b2lkLCB0aGlzQXJnPzogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5fbWFwLmZvckVhY2goZW50cnkgPT4gY2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsIGVudHJ5LCBlbnRyeSwgdGhpcykpO1xuXHR9XG5cblx0W1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxUPiB7XG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzKCk7XG5cdH1cblxuXHRbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nID0gJ1NldFdpdGhLZXknO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPclNldDxLLCBWPihtYXA6IE1hcDxLLCBWPiwga2V5OiBLLCB2YWx1ZTogVik6IFYge1xuXHRsZXQgcmVzdWx0ID0gbWFwLmdldChrZXkpO1xuXHRpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXN1bHQgPSB2YWx1ZTtcblx0XHRtYXAuc2V0KGtleSwgcmVzdWx0KTtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0cmluZzxLLCBWPihtYXA6IE1hcDxLLCBWPik6IHN0cmluZyB7XG5cdGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG5cdG1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG5cdFx0ZW50cmllcy5wdXNoKGAke2tleX0gPT4gJHt2YWx1ZX1gKTtcblx0fSk7XG5cblx0cmV0dXJuIGBNYXAoJHttYXAuc2l6ZX0pIHske2VudHJpZXMuam9pbignLCAnKX19YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRvU3RyaW5nPEs+KHNldDogU2V0PEs+KTogc3RyaW5nIHtcblx0Y29uc3QgZW50cmllczogS1tdID0gW107XG5cdHNldC5mb3JFYWNoKHZhbHVlID0+IHtcblx0XHRlbnRyaWVzLnB1c2godmFsdWUpO1xuXHR9KTtcblxuXHRyZXR1cm4gYFNldCgke3NldC5zaXplfSkgeyR7ZW50cmllcy5qb2luKCcsICcpfX1gO1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBUb3VjaCB7XG5cdE5vbmUgPSAwLFxuXHRBc09sZCA9IDEsXG5cdEFzTmV3ID0gMlxufVxuXG5leHBvcnQgY2xhc3MgQ291bnRlclNldDxUPiB7XG5cblx0cHJpdmF0ZSBtYXAgPSBuZXcgTWFwPFQsIG51bWJlcj4oKTtcblxuXHRhZGQodmFsdWU6IFQpOiBDb3VudGVyU2V0PFQ+IHtcblx0XHR0aGlzLm1hcC5zZXQodmFsdWUsICh0aGlzLm1hcC5nZXQodmFsdWUpIHx8IDApICsgMSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRkZWxldGUodmFsdWU6IFQpOiBib29sZWFuIHtcblx0XHRsZXQgY291bnRlciA9IHRoaXMubWFwLmdldCh2YWx1ZSkgfHwgMDtcblxuXHRcdGlmIChjb3VudGVyID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y291bnRlci0tO1xuXG5cdFx0aWYgKGNvdW50ZXIgPT09IDApIHtcblx0XHRcdHRoaXMubWFwLmRlbGV0ZSh2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubWFwLnNldCh2YWx1ZSwgY291bnRlcik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRoYXModmFsdWU6IFQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAuaGFzKHZhbHVlKTtcblx0fVxufVxuXG4vKipcbiAqIEEgbWFwIHRoYXQgYWxsb3dzIGFjY2VzcyBib3RoIGJ5IGtleXMgYW5kIHZhbHVlcy5cbiAqICoqTk9URSoqOiB2YWx1ZXMgbmVlZCB0byBiZSB1bmlxdWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBCaWRpcmVjdGlvbmFsTWFwPEssIFY+IHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9tMSA9IG5ldyBNYXA8SywgVj4oKTtcblx0cHJpdmF0ZSByZWFkb25seSBfbTIgPSBuZXcgTWFwPFYsIEs+KCk7XG5cblx0Y29uc3RydWN0b3IoZW50cmllcz86IHJlYWRvbmx5IChyZWFkb25seSBbSywgVl0pW10pIHtcblx0XHRpZiAoZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuXHRcdFx0XHR0aGlzLnNldChrZXksIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjbGVhcigpOiB2b2lkIHtcblx0XHR0aGlzLl9tMS5jbGVhcigpO1xuXHRcdHRoaXMuX20yLmNsZWFyKCk7XG5cdH1cblxuXHRzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHZvaWQge1xuXHRcdHRoaXMuX20xLnNldChrZXksIHZhbHVlKTtcblx0XHR0aGlzLl9tMi5zZXQodmFsdWUsIGtleSk7XG5cdH1cblxuXHRnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuX20xLmdldChrZXkpO1xuXHR9XG5cblx0Z2V0S2V5KHZhbHVlOiBWKTogSyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuX20yLmdldCh2YWx1ZSk7XG5cdH1cblxuXHRkZWxldGUoa2V5OiBLKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLl9tMS5nZXQoa2V5KTtcblx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR0aGlzLl9tMS5kZWxldGUoa2V5KTtcblx0XHR0aGlzLl9tMi5kZWxldGUodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Zm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IFYsIGtleTogSywgbWFwOiBCaWRpcmVjdGlvbmFsTWFwPEssIFY+KSA9PiB2b2lkLCB0aGlzQXJnPzogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5fbTEuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuXHRcdFx0Y2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsIHZhbHVlLCBrZXksIHRoaXMpO1xuXHRcdH0pO1xuXHR9XG5cblx0a2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPEs+IHtcblx0XHRyZXR1cm4gdGhpcy5fbTEua2V5cygpO1xuXHR9XG5cblx0dmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Vj4ge1xuXHRcdHJldHVybiB0aGlzLl9tMS52YWx1ZXMoKTtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgU2V0TWFwPEssIFY+IHtcblxuXHRwcml2YXRlIG1hcCA9IG5ldyBNYXA8SywgU2V0PFY+PigpO1xuXG5cdGFkZChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG5cdFx0bGV0IHZhbHVlcyA9IHRoaXMubWFwLmdldChrZXkpO1xuXG5cdFx0aWYgKCF2YWx1ZXMpIHtcblx0XHRcdHZhbHVlcyA9IG5ldyBTZXQ8Vj4oKTtcblx0XHRcdHRoaXMubWFwLnNldChrZXksIHZhbHVlcyk7XG5cdFx0fVxuXG5cdFx0dmFsdWVzLmFkZCh2YWx1ZSk7XG5cdH1cblxuXHRkZWxldGUoa2V5OiBLLCB2YWx1ZTogVik6IHZvaWQge1xuXHRcdGNvbnN0IHZhbHVlcyA9IHRoaXMubWFwLmdldChrZXkpO1xuXG5cdFx0aWYgKCF2YWx1ZXMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YWx1ZXMuZGVsZXRlKHZhbHVlKTtcblxuXHRcdGlmICh2YWx1ZXMuc2l6ZSA9PT0gMCkge1xuXHRcdFx0dGhpcy5tYXAuZGVsZXRlKGtleSk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yRWFjaChrZXk6IEssIGZuOiAodmFsdWU6IFYpID0+IHZvaWQpOiB2b2lkIHtcblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLm1hcC5nZXQoa2V5KTtcblxuXHRcdGlmICghdmFsdWVzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFsdWVzLmZvckVhY2goZm4pO1xuXHR9XG5cblx0Z2V0KGtleTogSyk6IFJlYWRvbmx5U2V0PFY+IHtcblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLm1hcC5nZXQoa2V5KTtcblx0XHRpZiAoIXZhbHVlcykge1xuXHRcdFx0cmV0dXJuIG5ldyBTZXQ8Vj4oKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlcztcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwc1N0cmljdEVxdWFsSWdub3JlT3JkZXIoYTogTWFwPHVua25vd24sIHVua25vd24+LCBiOiBNYXA8dW5rbm93biwgdW5rbm93bj4pOiBib29sZWFuIHtcblx0aWYgKGEgPT09IGIpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcblx0XHRpZiAoIWIuaGFzKGtleSkgfHwgYi5nZXQoa2V5KSAhPT0gdmFsdWUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRmb3IgKGNvbnN0IFtrZXldIG9mIGIpIHtcblx0XHRpZiAoIWEuaGFzKGtleSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKipcbiAqIEdpdmVuIGEgZnVuY3Rpb24sIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGlzIG9ubHkgY2FsbGluZyB0aGF0IGZ1bmN0aW9uIG9uY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaW5nbGVDYWxsRnVuY3Rpb248VCBleHRlbmRzIEZ1bmN0aW9uPih0aGlzOiB1bmtub3duLCBmbjogVCwgZm5EaWRSdW5DYWxsYmFjaz86ICgpID0+IHZvaWQpOiBUIHtcblx0Y29uc3QgX3RoaXMgPSB0aGlzO1xuXHRsZXQgZGlkQ2FsbCA9IGZhbHNlO1xuXHRsZXQgcmVzdWx0OiB1bmtub3duO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKGRpZENhbGwpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0ZGlkQ2FsbCA9IHRydWU7XG5cdFx0aWYgKGZuRGlkUnVuQ2FsbGJhY2spIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJlc3VsdCA9IGZuLmFwcGx5KF90aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Zm5EaWRSdW5DYWxsYmFjaygpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQgPSBmbi5hcHBseShfdGhpcywgYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9IGFzIHVua25vd24gYXMgVDtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgbmFtZXNwYWNlIEl0ZXJhYmxlIHtcblxuXHRleHBvcnQgZnVuY3Rpb24gaXM8VCA9IGFueT4odGhpbmc6IGFueSk6IHRoaW5nIGlzIEl0ZXJhYmxlPFQ+IHtcblx0XHRyZXR1cm4gdGhpbmcgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhpbmdbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcblx0fVxuXG5cdGNvbnN0IF9lbXB0eTogSXRlcmFibGU8YW55PiA9IE9iamVjdC5mcmVlemUoW10pO1xuXHRleHBvcnQgZnVuY3Rpb24gZW1wdHk8VCA9IGFueT4oKTogSXRlcmFibGU8VD4ge1xuXHRcdHJldHVybiBfZW1wdHk7XG5cdH1cblxuXHRleHBvcnQgZnVuY3Rpb24qIHNpbmdsZTxUPihlbGVtZW50OiBUKTogSXRlcmFibGU8VD4ge1xuXHRcdHlpZWxkIGVsZW1lbnQ7XG5cdH1cblxuXHRleHBvcnQgZnVuY3Rpb24gd3JhcDxUPihpdGVyYWJsZU9yRWxlbWVudDogSXRlcmFibGU8VD4gfCBUKTogSXRlcmFibGU8VD4ge1xuXHRcdGlmIChpcyhpdGVyYWJsZU9yRWxlbWVudCkpIHtcblx0XHRcdHJldHVybiBpdGVyYWJsZU9yRWxlbWVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHNpbmdsZShpdGVyYWJsZU9yRWxlbWVudCk7XG5cdFx0fVxuXHR9XG5cblx0ZXhwb3J0IGZ1bmN0aW9uIGZyb208VD4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+IHwgdW5kZWZpbmVkIHwgbnVsbCk6IEl0ZXJhYmxlPFQ+IHtcblx0XHRyZXR1cm4gaXRlcmFibGUgfHwgX2VtcHR5O1xuXHR9XG5cblx0ZXhwb3J0IGZ1bmN0aW9uKiByZXZlcnNlPFQ+KGFycmF5OiBBcnJheTxUPik6IEl0ZXJhYmxlPFQ+IHtcblx0XHRmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdHlpZWxkIGFycmF5W2ldO1xuXHRcdH1cblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiB8IHVuZGVmaW5lZCB8IG51bGwpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gIWl0ZXJhYmxlIHx8IGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkuZG9uZSA9PT0gdHJ1ZTtcblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiBmaXJzdDxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS52YWx1ZTtcblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiBzb21lPFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiwgcHJlZGljYXRlOiAodDogVCwgaTogbnVtYmVyKSA9PiB1bmtub3duKTogYm9vbGVhbiB7XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBpdGVyYWJsZSkge1xuXHRcdFx0aWYgKHByZWRpY2F0ZShlbGVtZW50LCBpKyspKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRleHBvcnQgZnVuY3Rpb24gZmluZDxULCBSIGV4dGVuZHMgVD4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+LCBwcmVkaWNhdGU6ICh0OiBUKSA9PiB0IGlzIFIpOiBSIHwgdW5kZWZpbmVkO1xuXHRleHBvcnQgZnVuY3Rpb24gZmluZDxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4sIHByZWRpY2F0ZTogKHQ6IFQpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuXHRleHBvcnQgZnVuY3Rpb24gZmluZDxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4sIHByZWRpY2F0ZTogKHQ6IFQpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgaXRlcmFibGUpIHtcblx0XHRcdGlmIChwcmVkaWNhdGUoZWxlbWVudCkpIHtcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VCwgUiBleHRlbmRzIFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiwgcHJlZGljYXRlOiAodDogVCkgPT4gdCBpcyBSKTogSXRlcmFibGU8Uj47XG5cdGV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+LCBwcmVkaWNhdGU6ICh0OiBUKSA9PiBib29sZWFuKTogSXRlcmFibGU8VD47XG5cdGV4cG9ydCBmdW5jdGlvbiogZmlsdGVyPFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiwgcHJlZGljYXRlOiAodDogVCkgPT4gYm9vbGVhbik6IEl0ZXJhYmxlPFQ+IHtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgaXRlcmFibGUpIHtcblx0XHRcdGlmIChwcmVkaWNhdGUoZWxlbWVudCkpIHtcblx0XHRcdFx0eWllbGQgZWxlbWVudDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRleHBvcnQgZnVuY3Rpb24qIG1hcDxULCBSPihpdGVyYWJsZTogSXRlcmFibGU8VD4sIGZuOiAodDogVCwgaW5kZXg6IG51bWJlcikgPT4gUik6IEl0ZXJhYmxlPFI+IHtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBpdGVyYWJsZSkge1xuXHRcdFx0eWllbGQgZm4oZWxlbWVudCwgaW5kZXgrKyk7XG5cdFx0fVxuXHR9XG5cblx0ZXhwb3J0IGZ1bmN0aW9uKiBmbGF0TWFwPFQsIFI+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiwgZm46ICh0OiBULCBpbmRleDogbnVtYmVyKSA9PiBJdGVyYWJsZTxSPik6IEl0ZXJhYmxlPFI+IHtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBpdGVyYWJsZSkge1xuXHRcdFx0eWllbGQqIGZuKGVsZW1lbnQsIGluZGV4KyspO1xuXHRcdH1cblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiogY29uY2F0PFQ+KC4uLml0ZXJhYmxlczogSXRlcmFibGU8VD5bXSk6IEl0ZXJhYmxlPFQ+IHtcblx0XHRmb3IgKGNvbnN0IGl0ZXJhYmxlIG9mIGl0ZXJhYmxlcykge1xuXHRcdFx0eWllbGQqIGl0ZXJhYmxlO1xuXHRcdH1cblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiByZWR1Y2U8VCwgUj4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+LCByZWR1Y2VyOiAocHJldmlvdXNWYWx1ZTogUiwgY3VycmVudFZhbHVlOiBUKSA9PiBSLCBpbml0aWFsVmFsdWU6IFIpOiBSIHtcblx0XHRsZXQgdmFsdWUgPSBpbml0aWFsVmFsdWU7XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7XG5cdFx0XHR2YWx1ZSA9IHJlZHVjZXIodmFsdWUsIGVsZW1lbnQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYWJsZSBzbGljZSBvZiB0aGUgYXJyYXksIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIGBhcnJheS5zbGljZSgpYC5cblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiogc2xpY2U8VD4oYXJyOiBSZWFkb25seUFycmF5PFQ+LCBmcm9tOiBudW1iZXIsIHRvID0gYXJyLmxlbmd0aCk6IEl0ZXJhYmxlPFQ+IHtcblx0XHRpZiAoZnJvbSA8IDApIHtcblx0XHRcdGZyb20gKz0gYXJyLmxlbmd0aDtcblx0XHR9XG5cblx0XHRpZiAodG8gPCAwKSB7XG5cdFx0XHR0byArPSBhcnIubGVuZ3RoO1xuXHRcdH0gZWxzZSBpZiAodG8gPiBhcnIubGVuZ3RoKSB7XG5cdFx0XHR0byA9IGFyci5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0Zm9yICg7IGZyb20gPCB0bzsgZnJvbSsrKSB7XG5cdFx0XHR5aWVsZCBhcnJbZnJvbV07XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbnN1bWVzIGBhdE1vc3RgIGVsZW1lbnRzIGZyb20gaXRlcmFibGUgYW5kIHJldHVybnMgdGhlIGNvbnN1bWVkIGVsZW1lbnRzLFxuXHQgKiBhbmQgYW4gaXRlcmFibGUgZm9yIHRoZSByZXN0IG9mIHRoZSBlbGVtZW50cy5cblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiBjb25zdW1lPFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiwgYXRNb3N0OiBudW1iZXIgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOiBbVFtdLCBJdGVyYWJsZTxUPl0ge1xuXHRcdGNvbnN0IGNvbnN1bWVkOiBUW10gPSBbXTtcblxuXHRcdGlmIChhdE1vc3QgPT09IDApIHtcblx0XHRcdHJldHVybiBbY29uc3VtZWQsIGl0ZXJhYmxlXTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVyYXRvciA9IGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXRNb3N0OyBpKyspIHtcblx0XHRcdGNvbnN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7XG5cblx0XHRcdGlmIChuZXh0LmRvbmUpIHtcblx0XHRcdFx0cmV0dXJuIFtjb25zdW1lZCwgSXRlcmFibGUuZW1wdHkoKV07XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN1bWVkLnB1c2gobmV4dC52YWx1ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtjb25zdW1lZCwgeyBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIGl0ZXJhdG9yOyB9IH1dO1xuXHR9XG5cblx0ZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jVG9BcnJheTxUPihpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxUPik6IFByb21pc2U8VFtdPiB7XG5cdFx0Y29uc3QgcmVzdWx0OiBUW10gPSBbXTtcblx0XHRmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcblx0XHRcdHJlc3VsdC5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG5cdH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBjb21wYXJlQnksIG51bWJlckNvbXBhcmF0b3IgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9hcnJheXMnO1xuaW1wb3J0IHsgZ3JvdXBCeSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IFNldE1hcCB9IGZyb20gJy4vbWFwJztcbmltcG9ydCB7IGNyZWF0ZVNpbmdsZUNhbGxGdW5jdGlvbiB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2Z1bmN0aW9uYWwnO1xuaW1wb3J0IHsgSXRlcmFibGUgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9pdGVyYXRvcic7XG5cbi8vICNyZWdpb24gRGlzcG9zYWJsZSBUcmFja2luZ1xuXG4vKipcbiAqIEVuYWJsZXMgbG9nZ2luZyBvZiBwb3RlbnRpYWxseSBsZWFrZWQgZGlzcG9zYWJsZXMuXG4gKlxuICogQSBkaXNwb3NhYmxlIGlzIGNvbnNpZGVyZWQgbGVha2VkIGlmIGl0IGlzIG5vdCBkaXNwb3NlZCBvciBub3QgcmVnaXN0ZXJlZCBhcyB0aGUgY2hpbGQgb2ZcbiAqIGFub3RoZXIgZGlzcG9zYWJsZS4gVGhpcyB0cmFja2luZyBpcyB2ZXJ5IHNpbXBsZSBhbiBvbmx5IHdvcmtzIGZvciBjbGFzc2VzIHRoYXQgZWl0aGVyXG4gKiBleHRlbmQgRGlzcG9zYWJsZSBvciB1c2UgYSBEaXNwb3NhYmxlU3RvcmUuIFRoaXMgbWVhbnMgdGhlcmUgYXJlIGEgbG90IG9mIGZhbHNlIHBvc2l0aXZlcy5cbiAqL1xuY29uc3QgVFJBQ0tfRElTUE9TQUJMRVMgPSBmYWxzZTtcbmxldCBkaXNwb3NhYmxlVHJhY2tlcjogSURpc3Bvc2FibGVUcmFja2VyIHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpc3Bvc2FibGVUcmFja2VyIHtcblx0LyoqXG5cdCAqIElzIGNhbGxlZCBvbiBjb25zdHJ1Y3Rpb24gb2YgYSBkaXNwb3NhYmxlLlxuXHQqL1xuXHR0cmFja0Rpc3Bvc2FibGUoZGlzcG9zYWJsZTogSURpc3Bvc2FibGUpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBJcyBjYWxsZWQgd2hlbiBhIGRpc3Bvc2FibGUgaXMgcmVnaXN0ZXJlZCBhcyBjaGlsZCBvZiBhbm90aGVyIGRpc3Bvc2FibGUgKGUuZy4ge0BsaW5rIERpc3Bvc2FibGVTdG9yZX0pLlxuXHQgKiBJZiBwYXJlbnQgaXMgYG51bGxgLCB0aGUgZGlzcG9zYWJsZSBpcyByZW1vdmVkIGZyb20gaXRzIGZvcm1lciBwYXJlbnQuXG5cdCovXG5cdHNldFBhcmVudChjaGlsZDogSURpc3Bvc2FibGUsIHBhcmVudDogSURpc3Bvc2FibGUgfCBudWxsKTogdm9pZDtcblxuXHQvKipcblx0ICogSXMgY2FsbGVkIGFmdGVyIGEgZGlzcG9zYWJsZSBpcyBkaXNwb3NlZC5cblx0Ki9cblx0bWFya0FzRGlzcG9zZWQoZGlzcG9zYWJsZTogSURpc3Bvc2FibGUpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgc2luZ2xldG9uIHdoaWNoIGRvZXMgbm90IG5lZWQgdG8gYmUgZGlzcG9zZWQuXG5cdCovXG5cdG1hcmtBc1NpbmdsZXRvbihkaXNwb3NhYmxlOiBJRGlzcG9zYWJsZSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcG9zYWJsZUluZm8ge1xuXHR2YWx1ZTogSURpc3Bvc2FibGU7XG5cdHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcblx0cGFyZW50OiBJRGlzcG9zYWJsZSB8IG51bGw7XG5cdGlzU2luZ2xldG9uOiBib29sZWFuO1xuXHRpZHg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVUcmFja2VyIGltcGxlbWVudHMgSURpc3Bvc2FibGVUcmFja2VyIHtcblx0cHJpdmF0ZSBzdGF0aWMgaWR4ID0gMDtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGxpdmluZ0Rpc3Bvc2FibGVzID0gbmV3IE1hcDxJRGlzcG9zYWJsZSwgRGlzcG9zYWJsZUluZm8+KCk7XG5cblx0cHJpdmF0ZSBnZXREaXNwb3NhYmxlRGF0YShkOiBJRGlzcG9zYWJsZSk6IERpc3Bvc2FibGVJbmZvIHtcblx0XHRsZXQgdmFsID0gdGhpcy5saXZpbmdEaXNwb3NhYmxlcy5nZXQoZCk7XG5cdFx0aWYgKCF2YWwpIHtcblx0XHRcdHZhbCA9IHsgcGFyZW50OiBudWxsLCBzb3VyY2U6IG51bGwsIGlzU2luZ2xldG9uOiBmYWxzZSwgdmFsdWU6IGQsIGlkeDogRGlzcG9zYWJsZVRyYWNrZXIuaWR4KysgfTtcblx0XHRcdHRoaXMubGl2aW5nRGlzcG9zYWJsZXMuc2V0KGQsIHZhbCk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHR0cmFja0Rpc3Bvc2FibGUoZDogSURpc3Bvc2FibGUpOiB2b2lkIHtcblx0XHRjb25zdCBkYXRhID0gdGhpcy5nZXREaXNwb3NhYmxlRGF0YShkKTtcblx0XHRpZiAoIWRhdGEuc291cmNlKSB7XG5cdFx0XHRkYXRhLnNvdXJjZSA9XG5cdFx0XHRcdG5ldyBFcnJvcigpLnN0YWNrITtcblx0XHR9XG5cdH1cblxuXHRzZXRQYXJlbnQoY2hpbGQ6IElEaXNwb3NhYmxlLCBwYXJlbnQ6IElEaXNwb3NhYmxlIHwgbnVsbCk6IHZvaWQge1xuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldERpc3Bvc2FibGVEYXRhKGNoaWxkKTtcblx0XHRkYXRhLnBhcmVudCA9IHBhcmVudDtcblx0fVxuXG5cdG1hcmtBc0Rpc3Bvc2VkKHg6IElEaXNwb3NhYmxlKTogdm9pZCB7XG5cdFx0dGhpcy5saXZpbmdEaXNwb3NhYmxlcy5kZWxldGUoeCk7XG5cdH1cblxuXHRtYXJrQXNTaW5nbGV0b24oZGlzcG9zYWJsZTogSURpc3Bvc2FibGUpOiB2b2lkIHtcblx0XHR0aGlzLmdldERpc3Bvc2FibGVEYXRhKGRpc3Bvc2FibGUpLmlzU2luZ2xldG9uID0gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0Um9vdFBhcmVudChkYXRhOiBEaXNwb3NhYmxlSW5mbywgY2FjaGU6IE1hcDxEaXNwb3NhYmxlSW5mbywgRGlzcG9zYWJsZUluZm8+KTogRGlzcG9zYWJsZUluZm8ge1xuXHRcdGNvbnN0IGNhY2hlVmFsdWUgPSBjYWNoZS5nZXQoZGF0YSk7XG5cdFx0aWYgKGNhY2hlVmFsdWUpIHtcblx0XHRcdHJldHVybiBjYWNoZVZhbHVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdCA9IGRhdGEucGFyZW50ID8gdGhpcy5nZXRSb290UGFyZW50KHRoaXMuZ2V0RGlzcG9zYWJsZURhdGEoZGF0YS5wYXJlbnQpLCBjYWNoZSkgOiBkYXRhO1xuXHRcdGNhY2hlLnNldChkYXRhLCByZXN1bHQpO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRUcmFja2VkRGlzcG9zYWJsZXMoKTogSURpc3Bvc2FibGVbXSB7XG5cdFx0Y29uc3Qgcm9vdFBhcmVudENhY2hlID0gbmV3IE1hcDxEaXNwb3NhYmxlSW5mbywgRGlzcG9zYWJsZUluZm8+KCk7XG5cblx0XHRjb25zdCBsZWFraW5nID0gWy4uLnRoaXMubGl2aW5nRGlzcG9zYWJsZXMuZW50cmllcygpXVxuXHRcdFx0LmZpbHRlcigoWywgdl0pID0+IHYuc291cmNlICE9PSBudWxsICYmICF0aGlzLmdldFJvb3RQYXJlbnQodiwgcm9vdFBhcmVudENhY2hlKS5pc1NpbmdsZXRvbilcblx0XHRcdC5mbGF0TWFwKChba10pID0+IGspO1xuXG5cdFx0cmV0dXJuIGxlYWtpbmc7XG5cdH1cblxuXHRjb21wdXRlTGVha2luZ0Rpc3Bvc2FibGVzKG1heFJlcG9ydGVkID0gMTAsIHByZUNvbXB1dGVkTGVha3M/OiBEaXNwb3NhYmxlSW5mb1tdKTogeyBsZWFrczogRGlzcG9zYWJsZUluZm9bXTsgZGV0YWlsczogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuXHRcdGxldCB1bmNvdmVyZWRMZWFraW5nT2JqczogRGlzcG9zYWJsZUluZm9bXSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocHJlQ29tcHV0ZWRMZWFrcykge1xuXHRcdFx0dW5jb3ZlcmVkTGVha2luZ09ianMgPSBwcmVDb21wdXRlZExlYWtzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCByb290UGFyZW50Q2FjaGUgPSBuZXcgTWFwPERpc3Bvc2FibGVJbmZvLCBEaXNwb3NhYmxlSW5mbz4oKTtcblxuXHRcdFx0Y29uc3QgbGVha2luZ09iamVjdHMgPSBbLi4udGhpcy5saXZpbmdEaXNwb3NhYmxlcy52YWx1ZXMoKV1cblx0XHRcdFx0LmZpbHRlcigoaW5mbykgPT4gaW5mby5zb3VyY2UgIT09IG51bGwgJiYgIXRoaXMuZ2V0Um9vdFBhcmVudChpbmZvLCByb290UGFyZW50Q2FjaGUpLmlzU2luZ2xldG9uKTtcblxuXHRcdFx0aWYgKGxlYWtpbmdPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBsZWFraW5nT2Jqc1NldCA9IG5ldyBTZXQobGVha2luZ09iamVjdHMubWFwKG8gPT4gby52YWx1ZSkpO1xuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIG9iamVjdHMgdGhhdCBhcmUgYSBjaGlsZCBvZiBvdGhlciBsZWFraW5nIG9iamVjdHMuIEFzc3VtZXMgdGhlcmUgYXJlIG5vIGN5Y2xlcy5cblx0XHRcdHVuY292ZXJlZExlYWtpbmdPYmpzID0gbGVha2luZ09iamVjdHMuZmlsdGVyKGwgPT4ge1xuXHRcdFx0XHRyZXR1cm4gIShsLnBhcmVudCAmJiBsZWFraW5nT2Jqc1NldC5oYXMobC5wYXJlbnQpKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAodW5jb3ZlcmVkTGVha2luZ09ianMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVGhlcmUgYXJlIGN5Y2xpYyBkaXBvc2FibGUgY2hhaW5zIScpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghdW5jb3ZlcmVkTGVha2luZ09ianMpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0U3RhY2tUcmFjZVBhdGgobGVha2luZzogRGlzcG9zYWJsZUluZm8pOiBzdHJpbmdbXSB7XG5cdFx0XHRmdW5jdGlvbiByZW1vdmVQcmVmaXgoYXJyYXk6IHN0cmluZ1tdLCBsaW5lc1RvUmVtb3ZlOiAoc3RyaW5nIHwgUmVnRXhwKVtdKSB7XG5cdFx0XHRcdHdoaWxlIChhcnJheS5sZW5ndGggPiAwICYmIGxpbmVzVG9SZW1vdmUuc29tZShyZWdleHAgPT4gdHlwZW9mIHJlZ2V4cCA9PT0gJ3N0cmluZycgPyByZWdleHAgPT09IGFycmF5WzBdIDogYXJyYXlbMF0ubWF0Y2gocmVnZXhwKSkpIHtcblx0XHRcdFx0XHRhcnJheS5zaGlmdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGxpbmVzID0gbGVha2luZy5zb3VyY2UhLnNwbGl0KCdcXG4nKS5tYXAocCA9PiBwLnRyaW0oKS5yZXBsYWNlKCdhdCAnLCAnJykpLmZpbHRlcihsID0+IGwgIT09ICcnKTtcblx0XHRcdHJlbW92ZVByZWZpeChsaW5lcywgWydFcnJvcicsIC9edHJhY2tEaXNwb3NhYmxlIFxcKC4qXFwpJC8sIC9eRGlzcG9zYWJsZVRyYWNrZXIudHJhY2tEaXNwb3NhYmxlIFxcKC4qXFwpJC9dKTtcblx0XHRcdHJldHVybiBsaW5lcy5yZXZlcnNlKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc3RhY2tUcmFjZVN0YXJ0cyA9IG5ldyBTZXRNYXA8c3RyaW5nLCBEaXNwb3NhYmxlSW5mbz4oKTtcblx0XHRmb3IgKGNvbnN0IGxlYWtpbmcgb2YgdW5jb3ZlcmVkTGVha2luZ09ianMpIHtcblx0XHRcdGNvbnN0IHN0YWNrVHJhY2VQYXRoID0gZ2V0U3RhY2tUcmFjZVBhdGgobGVha2luZyk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8PSBzdGFja1RyYWNlUGF0aC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRzdGFja1RyYWNlU3RhcnRzLmFkZChzdGFja1RyYWNlUGF0aC5zbGljZSgwLCBpKS5qb2luKCdcXG4nKSwgbGVha2luZyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHV0IGVhcmxpZXIgbGVha3MgZmlyc3Rcblx0XHR1bmNvdmVyZWRMZWFraW5nT2Jqcy5zb3J0KGNvbXBhcmVCeShsID0+IGwuaWR4LCBudW1iZXJDb21wYXJhdG9yKSk7XG5cblx0XHRsZXQgbWVzc2FnZSA9ICcnO1xuXG5cdFx0bGV0IGkgPSAwO1xuXHRcdGZvciAoY29uc3QgbGVha2luZyBvZiB1bmNvdmVyZWRMZWFraW5nT2Jqcy5zbGljZSgwLCBtYXhSZXBvcnRlZCkpIHtcblx0XHRcdGkrKztcblx0XHRcdGNvbnN0IHN0YWNrVHJhY2VQYXRoID0gZ2V0U3RhY2tUcmFjZVBhdGgobGVha2luZyk7XG5cdFx0XHRjb25zdCBzdGFja1RyYWNlRm9ybWF0dGVkTGluZXMgPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdGFja1RyYWNlUGF0aC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsZXQgbGluZSA9IHN0YWNrVHJhY2VQYXRoW2ldO1xuXHRcdFx0XHRjb25zdCBzdGFydHMgPSBzdGFja1RyYWNlU3RhcnRzLmdldChzdGFja1RyYWNlUGF0aC5zbGljZSgwLCBpICsgMSkuam9pbignXFxuJykpO1xuXHRcdFx0XHRsaW5lID0gYChzaGFyZWQgd2l0aCAke3N0YXJ0cy5zaXplfS8ke3VuY292ZXJlZExlYWtpbmdPYmpzLmxlbmd0aH0gbGVha3MpIGF0ICR7bGluZX1gO1xuXG5cdFx0XHRcdGNvbnN0IHByZXZTdGFydHMgPSBzdGFja1RyYWNlU3RhcnRzLmdldChzdGFja1RyYWNlUGF0aC5zbGljZSgwLCBpKS5qb2luKCdcXG4nKSk7XG5cdFx0XHRcdGNvbnN0IGNvbnRpbnVhdGlvbnMgPSBncm91cEJ5KFsuLi5wcmV2U3RhcnRzXS5tYXAoZCA9PiBnZXRTdGFja1RyYWNlUGF0aChkKVtpXSksIHYgPT4gdik7XG5cdFx0XHRcdGRlbGV0ZSBjb250aW51YXRpb25zW3N0YWNrVHJhY2VQYXRoW2ldXTtcblx0XHRcdFx0Zm9yIChjb25zdCBbY29udCwgc2V0XSBvZiBPYmplY3QuZW50cmllcyhjb250aW51YXRpb25zKSkge1xuXHRcdFx0XHRcdHN0YWNrVHJhY2VGb3JtYXR0ZWRMaW5lcy51bnNoaWZ0KGAgICAgLSBzdGFja3RyYWNlcyBvZiAke3NldC5sZW5ndGh9IG90aGVyIGxlYWtzIGNvbnRpbnVlIHdpdGggJHtjb250fWApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3RhY2tUcmFjZUZvcm1hdHRlZExpbmVzLnVuc2hpZnQobGluZSk7XG5cdFx0XHR9XG5cblx0XHRcdG1lc3NhZ2UgKz0gYFxcblxcblxcbj09PT09PT09PT09PT09PT09PT09IExlYWtpbmcgZGlzcG9zYWJsZSAke2l9LyR7dW5jb3ZlcmVkTGVha2luZ09ianMubGVuZ3RofTogJHtsZWFraW5nLnZhbHVlLmNvbnN0cnVjdG9yLm5hbWV9ID09PT09PT09PT09PT09PT09PT09XFxuJHtzdGFja1RyYWNlRm9ybWF0dGVkTGluZXMuam9pbignXFxuJyl9XFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuXFxuYDtcblx0XHR9XG5cblx0XHRpZiAodW5jb3ZlcmVkTGVha2luZ09ianMubGVuZ3RoID4gbWF4UmVwb3J0ZWQpIHtcblx0XHRcdG1lc3NhZ2UgKz0gYFxcblxcblxcbi4uLiBhbmQgJHt1bmNvdmVyZWRMZWFraW5nT2Jqcy5sZW5ndGggLSBtYXhSZXBvcnRlZH0gbW9yZSBsZWFraW5nIGRpc3Bvc2FibGVzXFxuXFxuYDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBsZWFrczogdW5jb3ZlcmVkTGVha2luZ09ianMsIGRldGFpbHM6IG1lc3NhZ2UgfTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlzcG9zYWJsZVRyYWNrZXIodHJhY2tlcjogSURpc3Bvc2FibGVUcmFja2VyIHwgbnVsbCk6IHZvaWQge1xuXHRkaXNwb3NhYmxlVHJhY2tlciA9IHRyYWNrZXI7XG59XG5cbmlmIChUUkFDS19ESVNQT1NBQkxFUykge1xuXHRjb25zdCBfX2lzX2Rpc3Bvc2FibGVfdHJhY2tlZF9fID0gJ19faXNfZGlzcG9zYWJsZV90cmFja2VkX18nO1xuXHRzZXREaXNwb3NhYmxlVHJhY2tlcihuZXcgY2xhc3MgaW1wbGVtZW50cyBJRGlzcG9zYWJsZVRyYWNrZXIge1xuXHRcdHRyYWNrRGlzcG9zYWJsZSh4OiBJRGlzcG9zYWJsZSk6IHZvaWQge1xuXHRcdFx0Y29uc3Qgc3RhY2sgPSBuZXcgRXJyb3IoJ1BvdGVudGlhbGx5IGxlYWtlZCBkaXNwb3NhYmxlJykuc3RhY2shO1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICghKHggYXMgYW55KVtfX2lzX2Rpc3Bvc2FibGVfdHJhY2tlZF9fXSkge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKHN0YWNrKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMzAwMCk7XG5cdFx0fVxuXG5cdFx0c2V0UGFyZW50KGNoaWxkOiBJRGlzcG9zYWJsZSwgcGFyZW50OiBJRGlzcG9zYWJsZSB8IG51bGwpOiB2b2lkIHtcblx0XHRcdGlmIChjaGlsZCAmJiBjaGlsZCAhPT0gRGlzcG9zYWJsZS5Ob25lKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0KGNoaWxkIGFzIGFueSlbX19pc19kaXNwb3NhYmxlX3RyYWNrZWRfX10gPSB0cnVlO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvLyBub29wXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRtYXJrQXNEaXNwb3NlZChkaXNwb3NhYmxlOiBJRGlzcG9zYWJsZSk6IHZvaWQge1xuXHRcdFx0aWYgKGRpc3Bvc2FibGUgJiYgZGlzcG9zYWJsZSAhPT0gRGlzcG9zYWJsZS5Ob25lKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0KGRpc3Bvc2FibGUgYXMgYW55KVtfX2lzX2Rpc3Bvc2FibGVfdHJhY2tlZF9fXSA9IHRydWU7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdC8vIG5vb3Bcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRtYXJrQXNTaW5nbGV0b24oZGlzcG9zYWJsZTogSURpc3Bvc2FibGUpOiB2b2lkIHsgfVxuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrRGlzcG9zYWJsZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KHg6IFQpOiBUIHtcblx0ZGlzcG9zYWJsZVRyYWNrZXI/LnRyYWNrRGlzcG9zYWJsZSh4KTtcblx0cmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrQXNEaXNwb3NlZChkaXNwb3NhYmxlOiBJRGlzcG9zYWJsZSk6IHZvaWQge1xuXHRkaXNwb3NhYmxlVHJhY2tlcj8ubWFya0FzRGlzcG9zZWQoZGlzcG9zYWJsZSk7XG59XG5cbmZ1bmN0aW9uIHNldFBhcmVudE9mRGlzcG9zYWJsZShjaGlsZDogSURpc3Bvc2FibGUsIHBhcmVudDogSURpc3Bvc2FibGUgfCBudWxsKTogdm9pZCB7XG5cdGRpc3Bvc2FibGVUcmFja2VyPy5zZXRQYXJlbnQoY2hpbGQsIHBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHNldFBhcmVudE9mRGlzcG9zYWJsZXMoY2hpbGRyZW46IElEaXNwb3NhYmxlW10sIHBhcmVudDogSURpc3Bvc2FibGUgfCBudWxsKTogdm9pZCB7XG5cdGlmICghZGlzcG9zYWJsZVRyYWNrZXIpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0Zm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuXHRcdGRpc3Bvc2FibGVUcmFja2VyLnNldFBhcmVudChjaGlsZCwgcGFyZW50KTtcblx0fVxufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgYSBzaW5nbGV0b24gd2hpY2ggZG9lcyBub3QgbmVlZCB0byBiZSBkaXNwb3NlZC5cbiovXG5leHBvcnQgZnVuY3Rpb24gbWFya0FzU2luZ2xldG9uPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oc2luZ2xldG9uOiBUKTogVCB7XG5cdGRpc3Bvc2FibGVUcmFja2VyPy5tYXJrQXNTaW5nbGV0b24oc2luZ2xldG9uKTtcblx0cmV0dXJuIHNpbmdsZXRvbjtcbn1cblxuLy8gI2VuZHJlZ2lvblxuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IHBlcmZvcm1zIGEgY2xlYW51cCBvcGVyYXRpb24gd2hlbiBgLmRpc3Bvc2UoKWAgaXMgY2FsbGVkLlxuICpcbiAqIFNvbWUgZXhhbXBsZXMgb2YgaG93IGRpc3Bvc2FibGVzIGFyZSB1c2VkOlxuICpcbiAqIC0gQW4gZXZlbnQgbGlzdGVuZXIgdGhhdCByZW1vdmVzIGl0c2VsZiB3aGVuIGAuZGlzcG9zZSgpYCBpcyBjYWxsZWQuXG4gKiAtIEEgcmVzb3VyY2Ugc3VjaCBhcyBhIGZpbGUgc3lzdGVtIHdhdGNoZXIgdGhhdCBjbGVhbnMgdXAgdGhlIHJlc291cmNlIHdoZW4gYC5kaXNwb3NlKClgIGlzIGNhbGxlZC5cbiAqIC0gVGhlIHJldHVybiB2YWx1ZSBmcm9tIHJlZ2lzdGVyaW5nIGEgcHJvdmlkZXIuIFdoZW4gYC5kaXNwb3NlKClgIGlzIGNhbGxlZCwgdGhlIHByb3ZpZGVyIGlzIHVucmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGlzcG9zYWJsZSB7XG5cdGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgdGhpbmdgIGlzIHtAbGluayBJRGlzcG9zYWJsZSBkaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGlzcG9zYWJsZTxFIGV4dGVuZHMgYW55Pih0aGluZzogRSk6IHRoaW5nIGlzIEUgJiBJRGlzcG9zYWJsZSB7XG5cdHJldHVybiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnICYmIHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiAoPElEaXNwb3NhYmxlPjxhbnk+dGhpbmcpLmRpc3Bvc2UgPT09ICdmdW5jdGlvbicgJiYgKDxJRGlzcG9zYWJsZT48YW55PnRoaW5nKS5kaXNwb3NlLmxlbmd0aCA9PT0gMDtcbn1cblxuLyoqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdmFsdWUocykgcGFzc2VkIGluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KGRpc3Bvc2FibGU6IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2U8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkaXNwb3NhYmxlOiBUIHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZSwgQSBleHRlbmRzIEl0ZXJhYmxlPFQ+ID0gSXRlcmFibGU8VD4+KGRpc3Bvc2FibGVzOiBBKTogQTtcbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZGlzcG9zYWJsZXM6IEFycmF5PFQ+KTogQXJyYXk8VD47XG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KGRpc3Bvc2FibGVzOiBSZWFkb25seUFycmF5PFQ+KTogUmVhZG9ubHlBcnJheTxUPjtcbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oYXJnOiBUIHwgSXRlcmFibGU8VD4gfCB1bmRlZmluZWQpOiBhbnkge1xuXHRpZiAoSXRlcmFibGUuaXMoYXJnKSkge1xuXHRcdGNvbnN0IGVycm9yczogYW55W10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgZCBvZiBhcmcpIHtcblx0XHRcdGlmIChkKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0ZC5kaXNwb3NlKCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRlcnJvcnMucHVzaChlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHR0aHJvdyBlcnJvcnNbMF07XG5cdFx0fSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0dGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgJ0VuY291bnRlcmVkIGVycm9ycyB3aGlsZSBkaXNwb3Npbmcgb2Ygc3RvcmUnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpID8gW10gOiBhcmc7XG5cdH0gZWxzZSBpZiAoYXJnKSB7XG5cdFx0YXJnLmRpc3Bvc2UoKTtcblx0XHRyZXR1cm4gYXJnO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlSWZEaXNwb3NhYmxlPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZSB8IG9iamVjdD4oZGlzcG9zYWJsZXM6IEFycmF5PFQ+KTogQXJyYXk8VD4ge1xuXHRmb3IgKGNvbnN0IGQgb2YgZGlzcG9zYWJsZXMpIHtcblx0XHRpZiAoaXNEaXNwb3NhYmxlKGQpKSB7XG5cdFx0XHRkLmRpc3Bvc2UoKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIFtdO1xufVxuXG4vKipcbiAqIENvbWJpbmUgbXVsdGlwbGUgZGlzcG9zYWJsZSB2YWx1ZXMgaW50byBhIHNpbmdsZSB7QGxpbmsgSURpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZWREaXNwb3NhYmxlKC4uLmRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdKTogSURpc3Bvc2FibGUge1xuXHRjb25zdCBwYXJlbnQgPSB0b0Rpc3Bvc2FibGUoKCkgPT4gZGlzcG9zZShkaXNwb3NhYmxlcykpO1xuXHRzZXRQYXJlbnRPZkRpc3Bvc2FibGVzKGRpc3Bvc2FibGVzLCBwYXJlbnQpO1xuXHRyZXR1cm4gcGFyZW50O1xufVxuXG4vKipcbiAqIFR1cm4gYSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgZGlzcG9zZSBpbnRvIGFuIHtAbGluayBJRGlzcG9zYWJsZX0uXG4gKlxuICogQHBhcmFtIGZuIENsZWFuIHVwIGZ1bmN0aW9uLCBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmx5ICoqb25jZSoqLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EaXNwb3NhYmxlKGZuOiAoKSA9PiB2b2lkKTogSURpc3Bvc2FibGUge1xuXHRjb25zdCBzZWxmID0gdHJhY2tEaXNwb3NhYmxlKHtcblx0XHRkaXNwb3NlOiBjcmVhdGVTaW5nbGVDYWxsRnVuY3Rpb24oKCkgPT4ge1xuXHRcdFx0bWFya0FzRGlzcG9zZWQoc2VsZik7XG5cdFx0XHRmbigpO1xuXHRcdH0pXG5cdH0pO1xuXHRyZXR1cm4gc2VsZjtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBkaXNwb3NhYmxlIHZhbHVlcy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIG1hbmFnZSBtdWx0aXBsZSBkaXNwb3NhYmxlcy4gQSBgRGlzcG9zYWJsZVN0b3JlYCBpcyBzYWZlciB0byB3b3JrIHdpdGggdGhhbiBhblxuICogYElEaXNwb3NhYmxlW11gIGFzIGl0IGNvbnNpZGVycyBlZGdlIGNhc2VzLCBzdWNoIGFzIHJlZ2lzdGVyaW5nIHRoZSBzYW1lIHZhbHVlIG11bHRpcGxlIHRpbWVzIG9yIGFkZGluZyBhbiBpdGVtIHRvIGFcbiAqIHN0b3JlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZCBvZi5cbiAqL1xuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVTdG9yZSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcblxuXHRzdGF0aWMgRElTQUJMRV9ESVNQT1NFRF9XQVJOSU5HID0gZmFsc2U7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfdG9EaXNwb3NlID0gbmV3IFNldDxJRGlzcG9zYWJsZT4oKTtcblx0cHJpdmF0ZSBfaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRyYWNrRGlzcG9zYWJsZSh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwb3NlIG9mIGFsbCByZWdpc3RlcmVkIGRpc3Bvc2FibGVzIGFuZCBtYXJrIHRoaXMgb2JqZWN0IGFzIGRpc3Bvc2VkLlxuXHQgKlxuXHQgKiBBbnkgZnV0dXJlIGRpc3Bvc2FibGVzIGFkZGVkIHRvIHRoaXMgb2JqZWN0IHdpbGwgYmUgZGlzcG9zZWQgb2Ygb24gYGFkZGAuXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5faXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG1hcmtBc0Rpc3Bvc2VkKHRoaXMpO1xuXHRcdHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMuY2xlYXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBkaXNwb3NlZCBvZi5cblx0ICovXG5cdHB1YmxpYyBnZXQgaXNEaXNwb3NlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5faXNEaXNwb3NlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwb3NlIG9mIGFsbCByZWdpc3RlcmVkIGRpc3Bvc2FibGVzIGJ1dCBkbyBub3QgbWFyayB0aGlzIG9iamVjdCBhcyBkaXNwb3NlZC5cblx0ICovXG5cdHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fdG9EaXNwb3NlLnNpemUgPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0ZGlzcG9zZSh0aGlzLl90b0Rpc3Bvc2UpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLl90b0Rpc3Bvc2UuY2xlYXIoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgbmV3IHtAbGluayBJRGlzcG9zYWJsZSBkaXNwb3NhYmxlfSB0byB0aGUgY29sbGVjdGlvbi5cblx0ICovXG5cdHB1YmxpYyBhZGQ8VCBleHRlbmRzIElEaXNwb3NhYmxlPihvOiBUKTogVCB7XG5cdFx0aWYgKCFvKSB7XG5cdFx0XHRyZXR1cm4gbztcblx0XHR9XG5cdFx0aWYgKChvIGFzIHVua25vd24gYXMgRGlzcG9zYWJsZVN0b3JlKSA9PT0gdGhpcykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVnaXN0ZXIgYSBkaXNwb3NhYmxlIG9uIGl0c2VsZiEnKTtcblx0XHR9XG5cblx0XHRzZXRQYXJlbnRPZkRpc3Bvc2FibGUobywgdGhpcyk7XG5cdFx0aWYgKHRoaXMuX2lzRGlzcG9zZWQpIHtcblx0XHRcdGlmICghRGlzcG9zYWJsZVN0b3JlLkRJU0FCTEVfRElTUE9TRURfV0FSTklORykge1xuXHRcdFx0XHRjb25zb2xlLndhcm4obmV3IEVycm9yKCdUcnlpbmcgdG8gYWRkIGEgZGlzcG9zYWJsZSB0byBhIERpc3Bvc2FibGVTdG9yZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb2YuIFRoZSBhZGRlZCBvYmplY3Qgd2lsbCBiZSBsZWFrZWQhJykuc3RhY2spO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl90b0Rpc3Bvc2UuYWRkKG8pO1xuXHRcdH1cblxuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYSBkaXNwb3NhYmxlIGZyb20gc3RvcmUgYW5kIGRpc3Bvc2VzIG9mIGl0LiBUaGlzIHdpbGwgbm90IHRocm93IG9yIHdhcm4gYW5kIHByb2NlZWQgdG8gZGlzcG9zZSB0aGVcblx0ICogZGlzcG9zYWJsZSBldmVuIHdoZW4gdGhlIGRpc3Bvc2FibGUgaXMgbm90IHBhcnQgaW4gdGhlIHN0b3JlLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+KG86IFQpOiB2b2lkIHtcblx0XHRpZiAoIW8pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKChvIGFzIHVua25vd24gYXMgRGlzcG9zYWJsZVN0b3JlKSA9PT0gdGhpcykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGlzcG9zZSBhIGRpc3Bvc2FibGUgb24gaXRzZWxmIScpO1xuXHRcdH1cblx0XHR0aGlzLl90b0Rpc3Bvc2UuZGVsZXRlKG8pO1xuXHRcdG8uZGlzcG9zZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIHZhbHVlIGZyb20gdGhlIHN0b3JlLCBidXQgZG9lcyBub3QgZGlzcG9zZSBpdC5cblx0ICovXG5cdHB1YmxpYyBkZWxldGVBbmRMZWFrPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4obzogVCk6IHZvaWQge1xuXHRcdGlmICghbykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5fdG9EaXNwb3NlLmhhcyhvKSkge1xuXHRcdFx0dGhpcy5fdG9EaXNwb3NlLmRlbGV0ZShvKTtcblx0XHRcdHNldFBhcmVudE9mRGlzcG9zYWJsZShvLCBudWxsKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIHtAbGluayBJRGlzcG9zYWJsZSBkaXNwb3NhYmxlfSBvYmplY3QuXG4gKlxuICogU3ViY2xhc3NlcyBjYW4ge0BsaW5rY29kZSBfcmVnaXN0ZXJ9IGRpc3Bvc2FibGVzIHRoYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAgd2hlbiB0aGlzIG9iamVjdCBpcyBkaXNwb3NlZCBvZi5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG5cblx0LyoqXG5cdCAqIEEgZGlzcG9zYWJsZSB0aGF0IGRvZXMgbm90aGluZyB3aGVuIGl0IGlzIGRpc3Bvc2VkIG9mLlxuXHQgKlxuXHQgKiBUT0RPOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgcHJvcGVydHkuXG5cdCAqL1xuXHRzdGF0aWMgcmVhZG9ubHkgTm9uZSA9IE9iamVjdC5mcmVlemU8SURpc3Bvc2FibGU+KHsgZGlzcG9zZSgpIHsgfSB9KTtcblxuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0b3JlID0gbmV3IERpc3Bvc2FibGVTdG9yZSgpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRyYWNrRGlzcG9zYWJsZSh0aGlzKTtcblx0XHRzZXRQYXJlbnRPZkRpc3Bvc2FibGUodGhpcy5fc3RvcmUsIHRoaXMpO1xuXHR9XG5cblx0cHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG5cdFx0bWFya0FzRGlzcG9zZWQodGhpcyk7XG5cblx0XHR0aGlzLl9zdG9yZS5kaXNwb3NlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBgb2AgdG8gdGhlIGNvbGxlY3Rpb24gb2YgZGlzcG9zYWJsZXMgbWFuYWdlZCBieSB0aGlzIG9iamVjdC5cblx0ICovXG5cdHByb3RlY3RlZCBfcmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihvOiBUKTogVCB7XG5cdFx0aWYgKChvIGFzIHVua25vd24gYXMgRGlzcG9zYWJsZSkgPT09IHRoaXMpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9zdG9yZS5hZGQobyk7XG5cdH1cbn1cblxuLyoqXG4gKiBNYW5hZ2VzIHRoZSBsaWZlY3ljbGUgb2YgYSBkaXNwb3NhYmxlIHZhbHVlIHRoYXQgbWF5IGJlIGNoYW5nZWQuXG4gKlxuICogVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgZGlzcG9zYWJsZSB2YWx1ZSBpcyBjaGFuZ2VkLCB0aGUgcHJldmlvdXNseSBoZWxkIGRpc3Bvc2FibGUgaXMgZGlzcG9zZWQgb2YuIFlvdSBjYW5cbiAqIGFsc28gcmVnaXN0ZXIgYSBgTXV0YWJsZURpc3Bvc2FibGVgIG9uIGEgYERpc3Bvc2FibGVgIHRvIGVuc3VyZSBpdCBpcyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdXRhYmxlRGlzcG9zYWJsZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+IGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuXHRwcml2YXRlIF92YWx1ZT86IFQ7XG5cdHByaXZhdGUgX2lzRGlzcG9zZWQgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0cmFja0Rpc3Bvc2FibGUodGhpcyk7XG5cdH1cblxuXHRnZXQgdmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZTtcblx0fVxuXG5cdHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX3ZhbHVlPy5kaXNwb3NlKCk7XG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRzZXRQYXJlbnRPZkRpc3Bvc2FibGUodmFsdWUsIHRoaXMpO1xuXHRcdH1cblx0XHR0aGlzLl92YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgc3RvcmVkIHZhbHVlIGFuZCBkaXNwb3NlZCBvZiB0aGUgcHJldmlvdXNseSBzdG9yZWQgdmFsdWUuXG5cdCAqL1xuXHRjbGVhcigpOiB2b2lkIHtcblx0XHR0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0ZGlzcG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0XHRtYXJrQXNEaXNwb3NlZCh0aGlzKTtcblx0XHR0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuXHRcdHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFycyB0aGUgdmFsdWUsIGJ1dCBkb2VzIG5vdCBkaXNwb3NlIGl0LlxuXHQgKiBUaGUgb2xkIHZhbHVlIGlzIHJldHVybmVkLlxuXHQqL1xuXHRjbGVhckFuZExlYWsoKTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcblx0XHR0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRpZiAob2xkVmFsdWUpIHtcblx0XHRcdHNldFBhcmVudE9mRGlzcG9zYWJsZShvbGRWYWx1ZSwgbnVsbCk7XG5cdFx0fVxuXHRcdHJldHVybiBvbGRWYWx1ZTtcblx0fVxufVxuXG4vKipcbiAqIE1hbmFnZXMgdGhlIGxpZmVjeWNsZSBvZiBhIGRpc3Bvc2FibGUgdmFsdWUgdGhhdCBtYXkgYmUgY2hhbmdlZCBsaWtlIHtAbGluayBNdXRhYmxlRGlzcG9zYWJsZX0sIGJ1dCB0aGUgdmFsdWUgbXVzdFxuICogZXhpc3QgYW5kIGNhbm5vdCBiZSB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYW5kYXRvcnlNdXRhYmxlRGlzcG9zYWJsZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+IGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuXHRwcml2YXRlIHJlYWRvbmx5IF9kaXNwb3NhYmxlID0gbmV3IE11dGFibGVEaXNwb3NhYmxlPFQ+KCk7XG5cdHByaXZhdGUgX2lzRGlzcG9zZWQgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3Rvcihpbml0aWFsVmFsdWU6IFQpIHtcblx0XHR0aGlzLl9kaXNwb3NhYmxlLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuXHR9XG5cblx0Z2V0IHZhbHVlKCk6IFQge1xuXHRcdHJldHVybiB0aGlzLl9kaXNwb3NhYmxlLnZhbHVlITtcblx0fVxuXG5cdHNldCB2YWx1ZSh2YWx1ZTogVCkge1xuXHRcdGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl9kaXNwb3NhYmxlLnZhbHVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuX2Rpc3Bvc2FibGUudmFsdWUgPSB2YWx1ZTtcblx0fVxuXG5cdGRpc3Bvc2UoKSB7XG5cdFx0dGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG5cdFx0dGhpcy5fZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvdW50ZWREaXNwb3NhYmxlIHtcblxuXHRwcml2YXRlIF9jb3VudGVyOiBudW1iZXIgPSAxO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgX2Rpc3Bvc2FibGU6IElEaXNwb3NhYmxlLFxuXHQpIHsgfVxuXG5cdGFjcXVpcmUoKSB7XG5cdFx0dGhpcy5fY291bnRlcisrO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cmVsZWFzZSgpIHtcblx0XHRpZiAoLS10aGlzLl9jb3VudGVyID09PSAwKSB7XG5cdFx0XHR0aGlzLl9kaXNwb3NhYmxlLmRpc3Bvc2UoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cblxuLyoqXG4gKiBBIHNhZmUgZGlzcG9zYWJsZSBjYW4gYmUgYHVuc2V0YCBzbyB0aGF0IGEgbGVha2VkIHJlZmVyZW5jZSAobGlzdGVuZXIpXG4gKiBjYW4gYmUgY3V0LW9mZi5cbiAqL1xuZXhwb3J0IGNsYXNzIFNhZmVEaXNwb3NhYmxlIGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuXG5cdGRpc3Bvc2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cdHVuc2V0OiAoKSA9PiB2b2lkID0gKCkgPT4geyB9O1xuXHRpc3NldDogKCkgPT4gYm9vbGVhbiA9ICgpID0+IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRyYWNrRGlzcG9zYWJsZSh0aGlzKTtcblx0fVxuXG5cdHNldChmbjogRnVuY3Rpb24pIHtcblx0XHRsZXQgY2FsbGJhY2s6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkID0gZm47XG5cdFx0dGhpcy51bnNldCA9ICgpID0+IGNhbGxiYWNrID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuaXNzZXQgPSAoKSA9PiBjYWxsYmFjayAhPT0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuZGlzcG9zZSA9ICgpID0+IHtcblx0XHRcdGlmIChjYWxsYmFjaykge1xuXHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHRjYWxsYmFjayA9IHVuZGVmaW5lZDtcblx0XHRcdFx0bWFya0FzRGlzcG9zZWQodGhpcyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZlcmVuY2U8VD4gZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG5cdHJlYWRvbmx5IG9iamVjdDogVDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZUNvbGxlY3Rpb248VD4ge1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgcmVmZXJlbmNlczogTWFwPHN0cmluZywgeyByZWFkb25seSBvYmplY3Q6IFQ7IGNvdW50ZXI6IG51bWJlciB9PiA9IG5ldyBNYXAoKTtcblxuXHRhY3F1aXJlKGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IElSZWZlcmVuY2U8VD4ge1xuXHRcdGxldCByZWZlcmVuY2UgPSB0aGlzLnJlZmVyZW5jZXMuZ2V0KGtleSk7XG5cblx0XHRpZiAoIXJlZmVyZW5jZSkge1xuXHRcdFx0cmVmZXJlbmNlID0geyBjb3VudGVyOiAwLCBvYmplY3Q6IHRoaXMuY3JlYXRlUmVmZXJlbmNlZE9iamVjdChrZXksIC4uLmFyZ3MpIH07XG5cdFx0XHR0aGlzLnJlZmVyZW5jZXMuc2V0KGtleSwgcmVmZXJlbmNlKTtcblx0XHR9XG5cblx0XHRjb25zdCB7IG9iamVjdCB9ID0gcmVmZXJlbmNlO1xuXHRcdGNvbnN0IGRpc3Bvc2UgPSBjcmVhdGVTaW5nbGVDYWxsRnVuY3Rpb24oKCkgPT4ge1xuXHRcdFx0aWYgKC0tcmVmZXJlbmNlLmNvdW50ZXIgPT09IDApIHtcblx0XHRcdFx0dGhpcy5kZXN0cm95UmVmZXJlbmNlZE9iamVjdChrZXksIHJlZmVyZW5jZS5vYmplY3QpO1xuXHRcdFx0XHR0aGlzLnJlZmVyZW5jZXMuZGVsZXRlKGtleSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZWZlcmVuY2UuY291bnRlcisrO1xuXG5cdFx0cmV0dXJuIHsgb2JqZWN0LCBkaXNwb3NlIH07XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlUmVmZXJlbmNlZE9iamVjdChrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBUO1xuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgZGVzdHJveVJlZmVyZW5jZWRPYmplY3Qoa2V5OiBzdHJpbmcsIG9iamVjdDogVCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVW53cmFwcyBhIHJlZmVyZW5jZSBjb2xsZWN0aW9uIG9mIHByb21pc2VkIHZhbHVlcy4gTWFrZXMgc3VyZVxuICogcmVmZXJlbmNlcyBhcmUgZGlzcG9zZWQgd2hlbmV2ZXIgcHJvbWlzZXMgZ2V0IHJlamVjdGVkLlxuICovXG5leHBvcnQgY2xhc3MgQXN5bmNSZWZlcmVuY2VDb2xsZWN0aW9uPFQ+IHtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZmVyZW5jZUNvbGxlY3Rpb246IFJlZmVyZW5jZUNvbGxlY3Rpb248UHJvbWlzZTxUPj4pIHsgfVxuXG5cdGFzeW5jIGFjcXVpcmUoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxJUmVmZXJlbmNlPFQ+PiB7XG5cdFx0Y29uc3QgcmVmID0gdGhpcy5yZWZlcmVuY2VDb2xsZWN0aW9uLmFjcXVpcmUoa2V5LCAuLi5hcmdzKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvYmplY3QgPSBhd2FpdCByZWYub2JqZWN0O1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRvYmplY3QsXG5cdFx0XHRcdGRpc3Bvc2U6ICgpID0+IHJlZi5kaXNwb3NlKClcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHJlZi5kaXNwb3NlKCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIEltbW9ydGFsUmVmZXJlbmNlPFQ+IGltcGxlbWVudHMgSVJlZmVyZW5jZTxUPiB7XG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBvYmplY3Q6IFQpIHsgfVxuXHRkaXNwb3NlKCk6IHZvaWQgeyAvKiBub29wICovIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2VPblJldHVybihmbjogKHN0b3JlOiBEaXNwb3NhYmxlU3RvcmUpID0+IHZvaWQpOiB2b2lkIHtcblx0Y29uc3Qgc3RvcmUgPSBuZXcgRGlzcG9zYWJsZVN0b3JlKCk7XG5cdHRyeSB7XG5cdFx0Zm4oc3RvcmUpO1xuXHR9IGZpbmFsbHkge1xuXHRcdHN0b3JlLmRpc3Bvc2UoKTtcblx0fVxufVxuXG4vKipcbiAqIEEgbWFwIHRoZSBtYW5hZ2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZhbHVlcyB0aGF0IGl0IHN0b3Jlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVNYXA8SywgViBleHRlbmRzIElEaXNwb3NhYmxlID0gSURpc3Bvc2FibGU+IGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX3N0b3JlID0gbmV3IE1hcDxLLCBWPigpO1xuXHRwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dHJhY2tEaXNwb3NhYmxlKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc3Bvc2VzIG9mIGFsbCBzdG9yZWQgdmFsdWVzIGFuZCBtYXJrIHRoaXMgb2JqZWN0IGFzIGRpc3Bvc2VkLlxuXHQgKlxuXHQgKiBUcnlpbmcgdG8gdXNlIHRoaXMgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIGRpc3Bvc2VkIG9mIGlzIGFuIGVycm9yLlxuXHQgKi9cblx0ZGlzcG9zZSgpOiB2b2lkIHtcblx0XHRtYXJrQXNEaXNwb3NlZCh0aGlzKTtcblx0XHR0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLmNsZWFyQW5kRGlzcG9zZUFsbCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc3Bvc2VzIG9mIGFsbCBzdG9yZWQgdmFsdWVzIGFuZCBjbGVhciB0aGUgbWFwLCBidXQgRE8gTk9UIG1hcmsgdGhpcyBvYmplY3QgYXMgZGlzcG9zZWQuXG5cdCAqL1xuXHRjbGVhckFuZERpc3Bvc2VBbGwoKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLl9zdG9yZS5zaXplKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGRpc3Bvc2UodGhpcy5fc3RvcmUudmFsdWVzKCkpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLl9zdG9yZS5jbGVhcigpO1xuXHRcdH1cblx0fVxuXG5cdGhhcyhrZXk6IEspOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fc3RvcmUuaGFzKGtleSk7XG5cdH1cblxuXHRnZXQgc2l6ZSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl9zdG9yZS5zaXplO1xuXHR9XG5cblx0Z2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl9zdG9yZS5nZXQoa2V5KTtcblx0fVxuXG5cdHNldChrZXk6IEssIHZhbHVlOiBWLCBza2lwRGlzcG9zZU9uT3ZlcndyaXRlID0gZmFsc2UpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5faXNEaXNwb3NlZCkge1xuXHRcdFx0Y29uc29sZS53YXJuKG5ldyBFcnJvcignVHJ5aW5nIHRvIGFkZCBhIGRpc3Bvc2FibGUgdG8gYSBEaXNwb3NhYmxlTWFwIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZCBvZi4gVGhlIGFkZGVkIG9iamVjdCB3aWxsIGJlIGxlYWtlZCEnKS5zdGFjayk7XG5cdFx0fVxuXG5cdFx0aWYgKCFza2lwRGlzcG9zZU9uT3ZlcndyaXRlKSB7XG5cdFx0XHR0aGlzLl9zdG9yZS5nZXQoa2V5KT8uZGlzcG9zZSgpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3N0b3JlLnNldChrZXksIHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGUgdGhlIHZhbHVlIHN0b3JlZCBmb3IgYGtleWAgZnJvbSB0aGlzIG1hcCBhbmQgYWxzbyBkaXNwb3NlIG9mIGl0LlxuXHQgKi9cblx0ZGVsZXRlQW5kRGlzcG9zZShrZXk6IEspOiB2b2lkIHtcblx0XHR0aGlzLl9zdG9yZS5nZXQoa2V5KT8uZGlzcG9zZSgpO1xuXHRcdHRoaXMuX3N0b3JlLmRlbGV0ZShrZXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZSB0aGUgdmFsdWUgc3RvcmVkIGZvciBga2V5YCBmcm9tIHRoaXMgbWFwIGJ1dCByZXR1cm4gaXQuIFRoZSBjYWxsZXIgaXNcblx0ICogcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBvZiB0aGUgdmFsdWUuXG5cdCAqL1xuXHRkZWxldGVBbmRMZWFrKGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy5fc3RvcmUuZ2V0KGtleSk7XG5cdFx0dGhpcy5fc3RvcmUuZGVsZXRlKGtleSk7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0a2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPEs+IHtcblx0XHRyZXR1cm4gdGhpcy5fc3RvcmUua2V5cygpO1xuXHR9XG5cblx0dmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Vj4ge1xuXHRcdHJldHVybiB0aGlzLl9zdG9yZS52YWx1ZXMoKTtcblx0fVxuXG5cdFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0ssIFZdPiB7XG5cdFx0cmV0dXJuIHRoaXMuX3N0b3JlW1N5bWJvbC5pdGVyYXRvcl0oKTtcblx0fVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbnRlcmZhY2UgSU5hdmlnYXRvciB7XG4gIHVzZXJBZ2VudDogc3RyaW5nO1xuICBsYW5ndWFnZTogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xufVxuXG4vLyBXZSdyZSBkZWNsYXJpbmcgYSBuYXZpZ2F0b3IgZ2xvYmFsIGhlcmUgYXMgd2UgZXhwZWN0IGl0IGluIGFsbCBydW50aW1lcyAobm9kZSBhbmQgYnJvd3NlciksIGJ1dFxuLy8gd2Ugd2FudCB0aGlzIG1vZHVsZSB0byBsaXZlIGluIGNvbW1vbi5cbmRlY2xhcmUgY29uc3QgbmF2aWdhdG9yOiBJTmF2aWdhdG9yO1xuZGVjbGFyZSBjb25zdCBwcm9jZXNzOiB1bmtub3duO1xuXG5leHBvcnQgY29uc3QgaXNOb2RlID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAndGl0bGUnIGluIChwcm9jZXNzIGFzIGFueSkpID8gdHJ1ZSA6IGZhbHNlO1xuY29uc3QgdXNlckFnZW50ID0gKGlzTm9kZSkgPyAnbm9kZScgOiBuYXZpZ2F0b3IudXNlckFnZW50O1xuY29uc3QgcGxhdGZvcm0gPSAoaXNOb2RlKSA/ICdub2RlJyA6IG5hdmlnYXRvci5wbGF0Zm9ybTtcblxuZXhwb3J0IGNvbnN0IGlzRmlyZWZveCA9IHVzZXJBZ2VudC5pbmNsdWRlcygnRmlyZWZveCcpO1xuZXhwb3J0IGNvbnN0IGlzTGVnYWN5RWRnZSA9IHVzZXJBZ2VudC5pbmNsdWRlcygnRWRnZScpO1xuZXhwb3J0IGNvbnN0IGlzU2FmYXJpID0gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdCh1c2VyQWdlbnQpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNhZmFyaVZlcnNpb24oKTogbnVtYmVyIHtcbiAgaWYgKCFpc1NhZmFyaSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IG1ham9yVmVyc2lvbiA9IHVzZXJBZ2VudC5tYXRjaCgvVmVyc2lvblxcLyhcXGQrKS8pO1xuICBpZiAobWFqb3JWZXJzaW9uID09PSBudWxsIHx8IG1ham9yVmVyc2lvbi5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHBhcnNlSW50KG1ham9yVmVyc2lvblsxXSk7XG59XG5cbi8vIEZpbmQgdGhlIHVzZXJzIHBsYXRmb3JtLiBXZSB1c2UgdGhpcyB0byBpbnRlcnByZXQgdGhlIG1ldGEga2V5XG4vLyBhbmQgSVNPIHRoaXJkIGxldmVsIHNoaWZ0cy5cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE5ODc3OTI0LzU3NzU5OFxuZXhwb3J0IGNvbnN0IGlzTWFjID0gWydNYWNpbnRvc2gnLCAnTWFjSW50ZWwnLCAnTWFjUFBDJywgJ01hYzY4SyddLmluY2x1ZGVzKHBsYXRmb3JtKTtcbmV4cG9ydCBjb25zdCBpc0lwYWQgPSBwbGF0Zm9ybSA9PT0gJ2lQYWQnO1xuZXhwb3J0IGNvbnN0IGlzSXBob25lID0gcGxhdGZvcm0gPT09ICdpUGhvbmUnO1xuZXhwb3J0IGNvbnN0IGlzV2luZG93cyA9IFsnV2luZG93cycsICdXaW4xNicsICdXaW4zMicsICdXaW5DRSddLmluY2x1ZGVzKHBsYXRmb3JtKTtcbmV4cG9ydCBjb25zdCBpc0xpbnV4ID0gcGxhdGZvcm0uaW5kZXhPZignTGludXgnKSA+PSAwO1xuLy8gTm90ZSB0aGF0IHdoZW4gdGhpcyBpcyB0cnVlLCBpc0xpbnV4IHdpbGwgYWxzbyBiZSB0cnVlLlxuZXhwb3J0IGNvbnN0IGlzQ2hyb21lT1MgPSAvXFxiQ3JPU1xcYi8udGVzdCh1c2VyQWdlbnQpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9DT0xPUiA9IDA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9BVFRSID0gKDAgPDwgMTgpIHwgKERFRkFVTFRfQ09MT1IgPDwgOSkgfCAoMjU2IDw8IDApO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhUID0gMDtcblxuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9BVFRSX0lOREVYID0gMDtcbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfQ0hBUl9JTkRFWCA9IDE7XG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX1dJRFRIX0lOREVYID0gMjtcbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfQ09ERV9JTkRFWCA9IDM7XG5cbi8qKlxuICogTnVsbCBjZWxsIC0gYSByZWFsIGVtcHR5IGNlbGwgKGNvbnRhaW5pbmcgbm90aGluZykuXG4gKiBOb3RlIHRoYXQgY29kZSBzaG91bGQgYWx3YXlzIGJlIDAgZm9yIGEgbnVsbCBjZWxsIGFzXG4gKiBzZXZlcmFsIHRlc3QgY29uZGl0aW9uIG9mIHRoZSBidWZmZXIgbGluZSByZWx5IG9uIHRoaXMuXG4gKi9cbmV4cG9ydCBjb25zdCBOVUxMX0NFTExfQ0hBUiA9ICcnO1xuZXhwb3J0IGNvbnN0IE5VTExfQ0VMTF9XSURUSCA9IDE7XG5leHBvcnQgY29uc3QgTlVMTF9DRUxMX0NPREUgPSAwO1xuXG4vKipcbiAqIFdoaXRlc3BhY2UgY2VsbC5cbiAqIFRoaXMgaXMgbWVhbnQgYXMgYSByZXBsYWNlbWVudCBmb3IgZW1wdHkgY2VsbHMgd2hlbiBuZWVkZWRcbiAqIGR1cmluZyByZW5kZXJpbmcgbGluZXMgdG8gcHJlc2VydmUgY29ycmVjdCBhbGlnbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdISVRFU1BBQ0VfQ0VMTF9DSEFSID0gJyAnO1xuZXhwb3J0IGNvbnN0IFdISVRFU1BBQ0VfQ0VMTF9XSURUSCA9IDE7XG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRV9DRUxMX0NPREUgPSAzMjtcblxuLyoqXG4gKiBCaXRtYXNrcyBmb3IgYWNjZXNzaW5nIGRhdGEgaW4gYGNvbnRlbnRgLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBDb250ZW50IHtcbiAgLyoqXG4gICAqIGJpdCAxLi4yMSAgICBjb2RlcG9pbnQsIG1heCBhbGxvd2VkIGluIFVURjMyIGlzIDB4MTBGRkZGICgyMSBiaXRzIHRha2VuKVxuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgY29kZXBvaW50ID0gY29udGVudCAmIENvbnRlbnQuY29kZXBvaW50TWFzaztgXG4gICAqICAgICAgICAgICAgICB3cml0ZTogIGBjb250ZW50IHw9IGNvZGVwb2ludCAmIENvbnRlbnQuY29kZXBvaW50TWFzaztgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0IGlmIHByZWNvbmRpdGlvbiBgY29kZXBvaW50IDw9IDB4MTBGRkZGYCBpcyBtZXQ6XG4gICAqICAgICAgICAgICAgICAgICAgICAgIGBjb250ZW50IHw9IGNvZGVwb2ludDtgXG4gICAqL1xuICBDT0RFUE9JTlRfTUFTSyA9IDB4MUZGRkZGLFxuXG4gIC8qKlxuICAgKiBiaXQgMjIgICAgICAgZmxhZyBpbmRpY2F0aW9uIHdoZXRoZXIgYSBjZWxsIGNvbnRhaW5zIGNvbWJpbmVkIGNvbnRlbnRcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYGlzQ29tYmluZWQgPSBjb250ZW50ICYgQ29udGVudC5pc0NvbWJpbmVkO2BcbiAgICogICAgICAgICAgICAgIHNldDogICAgYGNvbnRlbnQgfD0gQ29udGVudC5pc0NvbWJpbmVkO2BcbiAgICogICAgICAgICAgICAgIGNsZWFyOiAgYGNvbnRlbnQgJj0gfkNvbnRlbnQuaXNDb21iaW5lZDtgXG4gICAqL1xuICBJU19DT01CSU5FRF9NQVNLID0gMHgyMDAwMDAsICAvLyAxIDw8IDIxXG5cbiAgLyoqXG4gICAqIGJpdCAxLi4yMiAgICBtYXNrIHRvIGNoZWNrIHdoZXRoZXIgYSBjZWxsIGNvbnRhaW5zIGFueSBzdHJpbmcgZGF0YVxuICAgKiAgICAgICAgICAgICAgd2UgbmVlZCB0byBjaGVjayBmb3IgY29kZXBvaW50IGFuZCBpc0NvbWJpbmVkIGJpdHMgdG8gc2VlXG4gICAqICAgICAgICAgICAgICB3aGV0aGVyIGEgY2VsbCBjb250YWlucyBhbnl0aGluZ1xuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgaXNFbXB0eSA9ICEoY29udGVudCAmIENvbnRlbnQuaGFzQ29udGVudClgXG4gICAqL1xuICBIQVNfQ09OVEVOVF9NQVNLID0gMHgzRkZGRkYsXG5cbiAgLyoqXG4gICAqIGJpdCAyMy4uMjQgICB3Y3dpZHRoIHZhbHVlIG9mIGNlbGwsIHRha2VzIDIgYml0cyAocmFuZ2VzIGZyb20gMC4uMilcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYHdpZHRoID0gKGNvbnRlbnQgJiBDb250ZW50LndpZHRoTWFzaykgPj4gQ29udGVudC53aWR0aFNoaWZ0O2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgYGhhc1dpZHRoID0gY29udGVudCAmIENvbnRlbnQud2lkdGhNYXNrO2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgYXMgbG9uZyBhcyB3Y3dpZHRoIGlzIGhpZ2hlc3QgdmFsdWUgaW4gYGNvbnRlbnRgOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgd2lkdGggPSBjb250ZW50ID4+IENvbnRlbnQud2lkdGhTaGlmdDtgXG4gICAqICAgICAgICAgICAgICB3cml0ZTogIGBjb250ZW50IHw9ICh3aWR0aCA8PCBDb250ZW50LndpZHRoU2hpZnQpICYgQ29udGVudC53aWR0aE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydGN1dCBpZiBwcmVjb25kaXRpb24gYDAgPD0gd2lkdGggPD0gM2AgaXMgbWV0OlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgY29udGVudCB8PSB3aWR0aCA8PCBDb250ZW50LndpZHRoU2hpZnQ7YFxuICAgKi9cbiAgV0lEVEhfTUFTSyA9IDB4QzAwMDAwLCAgIC8vIDMgPDwgMjJcbiAgV0lEVEhfU0hJRlQgPSAyMlxufVxuXG5leHBvcnQgY29uc3QgZW51bSBBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIGJpdCAxLi44ICAgICBibHVlIGluIFJHQiwgY29sb3IgaW4gUDI1NiBhbmQgUDE2XG4gICAqL1xuICBCTFVFX01BU0sgPSAweEZGLFxuICBCTFVFX1NISUZUID0gMCxcbiAgUENPTE9SX01BU0sgPSAweEZGLFxuICBQQ09MT1JfU0hJRlQgPSAwLFxuXG4gIC8qKlxuICAgKiBiaXQgOS4uMTYgICAgZ3JlZW4gaW4gUkdCXG4gICAqL1xuICBHUkVFTl9NQVNLID0gMHhGRjAwLFxuICBHUkVFTl9TSElGVCA9IDgsXG5cbiAgLyoqXG4gICAqIGJpdCAxNy4uMjQgICByZWQgaW4gUkdCXG4gICAqL1xuICBSRURfTUFTSyA9IDB4RkYwMDAwLFxuICBSRURfU0hJRlQgPSAxNixcblxuICAvKipcbiAgICogYml0IDI1Li4yNiAgIGNvbG9yIG1vZGU6IERFRkFVTFQgKDApIHwgUDE2ICgxKSB8IFAyNTYgKDIpIHwgUkdCICgzKVxuICAgKi9cbiAgQ01fTUFTSyA9IDB4MzAwMDAwMCxcbiAgQ01fREVGQVVMVCA9IDAsXG4gIENNX1AxNiA9IDB4MTAwMDAwMCxcbiAgQ01fUDI1NiA9IDB4MjAwMDAwMCxcbiAgQ01fUkdCID0gMHgzMDAwMDAwLFxuXG4gIC8qKlxuICAgKiBiaXQgMS4uMjQgIFJHQiByb29tXG4gICAqL1xuICBSR0JfTUFTSyA9IDB4RkZGRkZGXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEZnRmxhZ3Mge1xuICAvKipcbiAgICogYml0IDI3Li4zMlxuICAgKi9cbiAgSU5WRVJTRSA9IDB4NDAwMDAwMCxcbiAgQk9MRCA9IDB4ODAwMDAwMCxcbiAgVU5ERVJMSU5FID0gMHgxMDAwMDAwMCxcbiAgQkxJTksgPSAweDIwMDAwMDAwLFxuICBJTlZJU0lCTEUgPSAweDQwMDAwMDAwLFxuICBTVFJJS0VUSFJPVUdIID0gMHg4MDAwMDAwMCxcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQmdGbGFncyB7XG4gIC8qKlxuICAgKiBiaXQgMjcuLjMyICh1cHBlciAyIHVudXNlZClcbiAgICovXG4gIElUQUxJQyA9IDB4NDAwMDAwMCxcbiAgRElNID0gMHg4MDAwMDAwLFxuICBIQVNfRVhURU5ERUQgPSAweDEwMDAwMDAwLFxuICBQUk9URUNURUQgPSAweDIwMDAwMDAwLFxuICBPVkVSTElORSA9IDB4NDAwMDAwMDBcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gRXh0RmxhZ3Mge1xuICAvKipcbiAgICogYml0IDI3Li4yOVxuICAgKi9cbiAgVU5ERVJMSU5FX1NUWUxFID0gMHgxQzAwMDAwMCxcblxuICAvKipcbiAgICogYml0IDMwLi4zMlxuICAgKlxuICAgKiBBbiBvcHRpb25hbCB2YXJpYW50IGZvciB0aGUgZ2x5cGgsIHRoaXMgY2FuIGJlIHVzZWQgZm9yIGV4YW1wbGUgdG8gb2Zmc2V0IHVuZGVybGluZXMgYnkgYVxuICAgKiBudW1iZXIgb2YgcGl4ZWxzIHRvIGNyZWF0ZSBhIHBlcmZlY3QgcGF0dGVybi5cbiAgICovXG4gIFZBUklBTlRfT0ZGU0VUID0gMHhFMDAwMDAwMFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBVbmRlcmxpbmVTdHlsZSB7XG4gIE5PTkUgPSAwLFxuICBTSU5HTEUgPSAxLFxuICBET1VCTEUgPSAyLFxuICBDVVJMWSA9IDMsXG4gIERPVFRFRCA9IDQsXG4gIERBU0hFRCA9IDVcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yLCBJQ29sb3JSR0IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY29uc3QgTlVMTF9DT0xPUjogSUNvbG9yID0ge1xuICBjc3M6ICcjMDAwMDAwMDAnLFxuICByZ2JhOiAwXG59O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY2hhbm5lbHNcIiAoaW5kaXZpZHVhbCBjb2xvciBjaGFubmVscyBhcyBudW1iZXJzKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjaGFubmVscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NzcyhyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX0ke3RvUGFkZGVkSGV4KGEpfWA7XG4gICAgfVxuICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9SZ2JhKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciA9IDB4RkYpOiBudW1iZXIge1xuICAgIC8vIE5vdGU6IFRoZSBhZ2dyZWdhdGVkIG51bWJlciBpcyBSR0JBMzIgKEJFKSwgdGh1cyBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gQUJHUjMyXG4gICAgLy8gb24gTEUgc3lzdGVtcywgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBkaXJlY3QgMzItYml0IGJ1ZmZlciB3cml0ZXMuXG4gICAgLy8gPj4+IDAgZm9yY2VzIGFuIHVuc2lnbmVkIGludFxuICAgIHJldHVybiAociA8PCAyNCB8IGcgPDwgMTYgfCBiIDw8IDggfCBhKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKHIsIGcsIGIsIGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKHIsIGcsIGIsIGEpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIGBJQ29sb3JgLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNvbG9yIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgICRhID0gKGZnLnJnYmEgJiAweEZGKSAvIDI1NTtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogZmcuY3NzLFxuICAgICAgICByZ2JhOiBmZy5yZ2JhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgY29uc3QgY3NzID0gY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYik7XG4gICAgY29uc3QgcmdiYSA9IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgICByZXR1cm4geyBjc3MsIHJnYmEgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc09wYXF1ZShjb2xvcjogSUNvbG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjb2xvci5yZ2JhICYgMHhGRikgPT09IDB4RkY7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZzogSUNvbG9yLCBmZzogSUNvbG9yLCByYXRpbzogbnVtYmVyKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmcucmdiYSwgZmcucmdiYSwgcmF0aW8pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gMTYgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gOCAgJiAweEZGKVxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgIGNvbnN0IHJnYmFDb2xvciA9IChjb2xvci5yZ2JhIHwgMHhGRikgPj4+IDA7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKHJnYmFDb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiksXG4gICAgICByZ2JhOiByZ2JhQ29sb3JcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYWNpdHkoY29sb3I6IElDb2xvciwgb3BhY2l0eTogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IE1hdGgucm91bmQob3BhY2l0eSAqIDB4RkYpO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhjb2xvci5yZ2JhKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiLCAkYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseU9wYWNpdHkoY29sb3I6IElDb2xvciwgZmFjdG9yOiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gY29sb3IucmdiYSAmIDB4RkY7XG4gICAgcmV0dXJuIG9wYWNpdHkoY29sb3IsICgkYSAqIGZhY3RvcikgLyAweEZGKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yUkdCKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3JSR0Ige1xuICAgIHJldHVybiBbKGNvbG9yLnJnYmEgPj4gMjQpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gMTYpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gOCkgJiAweEZGXTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY3NzXCIgKHN0cmluZzogJyNyZ2InLCAnI3JnYmEnLCAnI3JyZ2diYicsXG4gKiAnI3JyZ2diYmFhJykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY3NzIHtcbiAgLy8gQXR0ZW1wdCB0byBzZXQgZ2V0IHRoZSBzaGFyZWQgY2FudmFzIGNvbnRleHRcbiAgbGV0ICRjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IHVuZGVmaW5lZDtcbiAgbGV0ICRsaXRtdXNDb2xvcjogQ2FudmFzR3JhZGllbnQgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiB0aGUgZmlyc3Qgd2luZG93LCBzbyBkb2N1bWVudCBzaG91bGQgYmUgY29ycmVjdFxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgJGN0eCA9IGN0eDtcbiAgICAgICRjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICAgICAgJGxpdG11c0NvbG9yID0gJGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxLCAxKTtcbiAgICB9XG4gIH1cbiAgY2F0Y2gge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNzcyBzdHJpbmcgdG8gYW4gSUNvbG9yLCB0aGlzIHNob3VsZCBoYW5kbGUgYWxsIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCB3aWxsXG4gICAqIHRocm93IGlmIGl0J3MgaW52YWxpZC4gVGhlIGlkZWFsIGZvcm1hdCB0byB1c2UgaXMgYCNycmdnYmJbYWFdYCBhcyBpdCdzIHRoZSBmYXN0ZXN0IHRvIHBhcnNlLlxuICAgKlxuICAgKiBPbmx5IGAjcmdiW2FdYCwgYCNycmdnYmJbYWFdYCwgYHJnYigpYCBhbmQgYHJnYmEoKWAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIHdoZW4gcnVuIGluIGEgTm9kZVxuICAgKiBlbnZpcm9ubWVudC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKGNzczogc3RyaW5nKTogSUNvbG9yIHtcbiAgICAvLyBGb3JtYXRzOiAjcmdiW2FdIGFuZCAjcnJnZ2JiW2FhXVxuICAgIGlmIChjc3MubWF0Y2goLyNbXFxkYS1mXXszLDh9L2kpKSB7XG4gICAgICBzd2l0Y2ggKGNzcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OiB7IC8vICNyZ2JcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6IHsgLy8gI3JnYmFcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYSA9IHBhcnNlSW50KGNzcy5zbGljZSg0LCA1KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiAvLyAjcnJnZ2JiXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IChwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA8PCA4IHwgMHhGRikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIDk6IC8vICNycmdnYmJhYVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiBwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0czogcmdiKCkgb3IgcmdiYSgpXG4gICAgY29uc3QgcmdiYU1hdGNoID0gY3NzLm1hdGNoKC9yZ2JhP1xcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqKCxcXHMqKDB8MXxcXGQ/XFwuKFxcZCspKVxccyopP1xcKS8pO1xuICAgIGlmIChyZ2JhTWF0Y2gpIHtcbiAgICAgICRyID0gcGFyc2VJbnQocmdiYU1hdGNoWzFdKTtcbiAgICAgICRnID0gcGFyc2VJbnQocmdiYU1hdGNoWzJdKTtcbiAgICAgICRiID0gcGFyc2VJbnQocmdiYU1hdGNoWzNdKTtcbiAgICAgICRhID0gTWF0aC5yb3VuZCgocmdiYU1hdGNoWzVdID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNV0pKSAqIDB4RkYpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZSBmb3IgY2FudmFzLWJhc2VkIGNvbG9yIHBhcnNpbmdcbiAgICBpZiAoISRjdHggfHwgISRsaXRtdXNDb2xvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciB1c2luZyBjYW52YXMgZmlsbFN0eWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2ZpbGwtYW5kLXN0cm9rZS1zdHlsZXNcbiAgICAkY3R4LmZpbGxTdHlsZSA9ICRsaXRtdXNDb2xvcjtcbiAgICAkY3R4LmZpbGxTdHlsZSA9IGNzcztcbiAgICBpZiAodHlwZW9mICRjdHguZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgICRjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgWyRyLCAkZywgJGIsICRhXSA9ICRjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgaXMgbm9uLXRyYW5zcGFyZW50IGFzIGNvbG9yIGh1ZSBnZXRzIGxvc3Qgd2hlbiBkcmF3biB0byB0aGUgY2FudmFzXG4gICAgaWYgKCRhICE9PSAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgY29sb3IgZnJvbSB0aGUgY2FudmFzJyBmaWxsU3R5bGUgcHJvcGVydHkgd2hpY2ggZXhwb3NlcyB0aGUgY29sb3IgdmFsdWUgaW4gcmdiYSgpXG4gICAgLy8gZm9ybWF0XG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI3NlcmlhbGlzYXRpb24tb2YtYS1jb2xvclxuICAgIHJldHVybiB7XG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgY3NzXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiXCIgKG51bWJlcjogMHhycmdnYmIpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gcmdiIFRoZSBjb2xvciB0byB1c2UuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZShyZ2I6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlbGF0aXZlTHVtaW5hbmNlMihcbiAgICAgIChyZ2IgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZ2IgPj4gOCApICYgMHhGRixcbiAgICAgIChyZ2IgICAgICApICYgMHhGRik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHIgVGhlIHJlZCBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGIgVGhlIGJsdWUgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlMihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBycyA9IHIgLyAyNTU7XG4gICAgY29uc3QgZ3MgPSBnIC8gMjU1O1xuICAgIGNvbnN0IGJzID0gYiAvIDI1NTtcbiAgICBjb25zdCByciA9IHJzIDw9IDAuMDM5MjggPyBycyAvIDEyLjkyIDogTWF0aC5wb3coKHJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmcgPSBncyA8PSAwLjAzOTI4ID8gZ3MgLyAxMi45MiA6IE1hdGgucG93KChncyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJiID0gYnMgPD0gMC4wMzkyOCA/IGJzIC8gMTIuOTIgOiBNYXRoLnBvdygoYnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gcnIgKiAwLjIxMjYgKyByZyAqIDAuNzE1MiArIHJiICogMC4wNzIyO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JhXCIgKG51bWJlcjogMHhycmdnYmJhYSkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiYSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAkYSA9IChmZyAmIDB4RkYpIC8gMHhGRjtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiBmZztcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIHJldHVybiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBmb3JlZ3JvdW5kIGNvbG9yIGFuZCBhIGJhY2tncm91bmQgY29sb3IsIGVpdGhlciBpbmNyZWFzZSBvciByZWR1Y2UgdGhlIGx1bWluYW5jZSBvZiB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbnRyYXN0IHJhdGlvIGlzIG1ldC4gSWYgcHVyZSB3aGl0ZSBvciBibGFjayBpcyBoaXRcbiAgICogd2l0aG91dCB0aGUgY29udHJhc3QgcmF0aW8gYmVpbmcgbWV0LCBnbyB0aGUgb3RoZXIgZGlyZWN0aW9uIHVzaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0YWtlIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJlc3VsdCBkZXBlbmRpbmcgb24gd2hpY2ggaGFzIHRoZSBoaWdoZXJcbiAgICogY29udHJhc3QgcmF0aW8uXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGFscmVhZHkgbWV0LlxuICAgKlxuICAgKiBAcGFyYW0gYmdSZ2JhIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gZmdSZ2JhIFRoZSBmb3JlZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gcmF0aW8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIGFjaGlldmUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShiZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgZmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGZnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBjciA9IGNvbnRyYXN0UmF0aW8oYmdMLCBmZ0wpO1xuICAgIGlmIChjciA8IHJhdGlvKSB7XG4gICAgICBpZiAoZmdMIDwgYmdMKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEEgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QiA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRBID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QiA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gcmVkdWNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSID4gMCB8fCBmZ0cgPiAwIHx8IGZnQiA+IDApKSB7XG4gICAgICAvLyBSZWR1Y2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdSICogMC4xKSk7XG4gICAgICBmZ0cgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnRyAqIDAuMSkpO1xuICAgICAgZmdCIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0IgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIGluY3JlYXNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSIDwgMHhGRiB8fCBmZ0cgPCAweEZGIHx8IGZnQiA8IDB4RkYpKSB7XG4gICAgICAvLyBJbmNyZWFzZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSID0gTWF0aC5taW4oMHhGRiwgZmdSICsgTWF0aC5jZWlsKCgyNTUgLSBmZ1IpICogMC4xKSk7XG4gICAgICBmZ0cgPSBNYXRoLm1pbigweEZGLCBmZ0cgKyBNYXRoLmNlaWwoKDI1NSAtIGZnRykgKiAwLjEpKTtcbiAgICAgIGZnQiA9IE1hdGgubWluKDB4RkYsIGZnQiArIE1hdGguY2VpbCgoMjU1IC0gZmdCKSAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9DaGFubmVscyh2YWx1ZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLCAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRlZEhleChjOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gYy50b1N0cmluZygxNik7XG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAnMCcgKyBzIDogcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byByZWxhdGl2ZSBsdW1pbmFuY2UgdmFsdWVzLlxuICogQHBhcmFtIGwxIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAcGFyYW0gbDIgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0UmF0aW8obDE6IG51bWJlciwgbDI6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChsMSA8IGwyKSB7XG4gICAgcmV0dXJuIChsMiArIDAuMDUpIC8gKGwxICsgMC4wNSk7XG4gIH1cbiAgcmV0dXJuIChsMSArIDAuMDUpIC8gKGwyICsgMC4wNSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaW1lbnNpb25zLCBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93SWZGYWxzeTxUPih2YWx1ZTogVCB8IHVuZGVmaW5lZCB8IG51bGwpOiBUIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndmFsdWUgbXVzdCBub3QgYmUgZmFsc3knKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgcmV0dXJuIHRydWUgZm9yIFBvd2VybGluZSBzeW1ib2xzIHdoaWNoIHJlcXVpcmVcbiAgLy8gZGlmZmVyZW50IHBhZGRpbmcgYW5kIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIG1pbmltdW0gY29udHJhc3RcbiAgLy8gcmF0aW8gc3RhbmRhcmRzXG4gIHJldHVybiAweEUwQTQgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweEUwRDY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gMHhFMEIwIDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPD0gMHhFMEI3O1xufVxuXG5mdW5jdGlvbiBpc05lcmRGb250R2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4RTAwMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4RjhGRjtcbn1cblxuZnVuY3Rpb24gaXNCb3hPckJsb2NrR2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4MjUwMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4MjU5Rjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1vamkoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjYwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjY0RiB8fCAvLyBFbW90aWNvbnNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjMwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjVGRiB8fCAvLyBNaXNjIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzXG4gICAgY29kZXBvaW50ID49IDB4MUY2ODAgJiYgY29kZXBvaW50IDw9IDB4MUY2RkYgfHwgLy8gVHJhbnNwb3J0IGFuZCBNYXBcbiAgICBjb2RlcG9pbnQgPj0gMHgyNjAwICAmJiBjb2RlcG9pbnQgPD0gMHgyNkZGICB8fCAvLyBNaXNjIHN5bWJvbHNcbiAgICBjb2RlcG9pbnQgPj0gMHgyNzAwICAmJiBjb2RlcG9pbnQgPD0gMHgyN0JGICB8fCAvLyBEaW5nYmF0c1xuICAgIGNvZGVwb2ludCA+PSAweEZFMDAgICYmIGNvZGVwb2ludCA8PSAweEZFMEYgIHx8IC8vIFZhcmlhdGlvbiBTZWxlY3RvcnNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjkwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjlGRiB8fCAvLyBTdXBwbGVtZW50YWwgU3ltYm9scyBhbmQgUGljdG9ncmFwaHNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjFFNiAmJiBjb2RlcG9pbnQgPD0gMHgxRjFGRlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dSZXNjYWxpbmcoY29kZXBvaW50OiBudW1iZXIgfCB1bmRlZmluZWQsIHdpZHRoOiBudW1iZXIsIGdseXBoU2l6ZVg6IG51bWJlciwgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAvLyBJcyBzaW5nbGUgY2VsbCB3aWR0aFxuICAgIHdpZHRoID09PSAxICYmXG4gICAgLy8gR2x5cGggZXhjZWVkcyBjZWxsIGJvdW5kcywgYWRkIDUwJSB0byBhdm9pZCBodXJ0aW5nIHJlYWRhYmlsaXR5IGJ5IHJlc2NhbGluZyBnbHlwaHMgdGhhdFxuICAgIC8vIGJhcmVseSBvdmVybGFwXG4gICAgZ2x5cGhTaXplWCA+IE1hdGguY2VpbChkZXZpY2VDZWxsV2lkdGggKiAxLjUpICYmXG4gICAgLy8gTmV2ZXIgcmVzY2FsZSBhc2NpaVxuICAgIGNvZGVwb2ludCAhPT0gdW5kZWZpbmVkICYmIGNvZGVwb2ludCA+IDB4RkYgJiZcbiAgICAvLyBOZXZlciByZXNjYWxlIGVtb2ppXG4gICAgIWlzRW1vamkoY29kZXBvaW50KSAmJlxuICAgIC8vIE5ldmVyIHJlc2NhbGUgcG93ZXJsaW5lIG9yIG5lcmQgZm9udHNcbiAgICAhaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQpICYmICFpc05lcmRGb250R2x5cGgoY29kZXBvaW50KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludCkgfHwgaXNCb3hPckJsb2NrR2x5cGgoY29kZXBvaW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbmRlckRpbWVuc2lvbnMoKTogSVJlbmRlckRpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIGNzczoge1xuICAgICAgY2FudmFzOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNlbGw6IGNyZWF0ZURpbWVuc2lvbigpXG4gICAgfSxcbiAgICBkZXZpY2U6IHtcbiAgICAgIGNhbnZhczogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjZWxsOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNoYXI6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgdG9wOiAwXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaW1lbnNpb24oKTogSURpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0KGNlbGxXaWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlciwgY3VycmVudE9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiAoY2VsbFdpZHRoIC0gKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIgLSBjdXJyZW50T2Zmc2V0KSkgJSAoTWF0aC5yb3VuZChsaW5lV2lkdGgpICogMik7XG59XG4iLCJpbXBvcnQgeyBJU2VsZWN0aW9uUmVuZGVyTW9kZWwgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBCZ0ZsYWdzLCBFeHRGbGFncywgRmdGbGFncywgTlVMTF9DRUxMX0NPREUsIFVuZGVybGluZVN0eWxlIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNlbGxEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IHJnYmEgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRmZyA9IDA7XG5sZXQgJGJnID0gMDtcbmxldCAkaGFzRmcgPSBmYWxzZTtcbmxldCAkaGFzQmcgPSBmYWxzZTtcbmxldCAkaXNTZWxlY3RlZCA9IGZhbHNlO1xubGV0ICRjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQgfCB1bmRlZmluZWQ7XG5sZXQgJHZhcmlhbnRPZmZzZXQgPSAwO1xuXG5leHBvcnQgY2xhc3MgQ2VsbENvbG9yUmVzb2x2ZXIge1xuICAvKipcbiAgICogVGhlIHNoYXJlZCByZXN1bHQgb2YgdGhlIHtAbGluayByZXNvbHZlfSBjYWxsLiBUaGlzIGlzIG9ubHkgc2FmZSB0byB1c2UgaW1tZWRpYXRlbHkgYWZ0ZXIgYXNcbiAgICogYW55IG90aGVyIGNhbGxzIHdpbGwgc2hhcmUgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3VsdDogeyBmZzogbnVtYmVyLCBiZzogbnVtYmVyLCBleHQ6IG51bWJlciB9ID0ge1xuICAgIGZnOiAwLFxuICAgIGJnOiAwLFxuICAgIGV4dDogMFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25TZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0aW9uUmVuZGVyTW9kZWw6IElTZWxlY3Rpb25SZW5kZXJNb2RlbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2VcbiAgKSB7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY29sb3JzIGZvciB0aGUgY2VsbCwgcHV0dGluZyB0aGUgcmVzdWx0IGludG8gdGhlIHNoYXJlZCB7QGxpbmsgcmVzdWx0fS4gVGhpcyByZXNvbHZlc1xuICAgKiBvdmVycmlkZXMsIGludmVyc2UgYW5kIHNlbGVjdGlvbiBmb3IgdGhlIGNlbGwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCB0byBmZWVkIGludG8gdGhlIHJlbmRlcmVyLlxuICAgKi9cbiAgcHVibGljIHJlc29sdmUoY2VsbDogSUNlbGxEYXRhLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdC5iZyA9IGNlbGwuYmc7XG4gICAgdGhpcy5yZXN1bHQuZmcgPSBjZWxsLmZnO1xuICAgIHRoaXMucmVzdWx0LmV4dCA9IGNlbGwuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCA/IGNlbGwuZXh0ZW5kZWQuZXh0IDogMDtcbiAgICAvLyBHZXQgYW55IGZvcmVncm91bmQvYmFja2dyb3VuZCBvdmVycmlkZXMsIHRoaXMgaGFwcGVucyBvbiB0aGUgbW9kZWwgdG8gYXZvaWQgc3ByZWFkaW5nXG4gICAgLy8gb3ZlcnJpZGUgbG9naWMgdGhyb3VnaG91dCB0aGUgZGlmZmVyZW50IHN1Yi1yZW5kZXJlcnNcblxuICAgIC8vIFJlc2V0IG92ZXJyaWRlcyB3b3JrIHZhcmlhYmxlc1xuICAgICRiZyA9IDA7XG4gICAgJGZnID0gMDtcbiAgICAkaGFzQmcgPSBmYWxzZTtcbiAgICAkaGFzRmcgPSBmYWxzZTtcbiAgICAkaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICRjb2xvcnMgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzO1xuICAgICR2YXJpYW50T2Zmc2V0ID0gMDtcblxuICAgIGNvbnN0IGNvZGUgPSBjZWxsLmdldENvZGUoKTtcbiAgICBpZiAoY29kZSAhPT0gTlVMTF9DRUxMX0NPREUgJiYgY2VsbC5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSA9PT0gVW5kZXJsaW5lU3R5bGUuRE9UVEVEKSB7XG4gICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHRoaXMuX29wdGlvblNlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZSAqIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIgLyAxNSkpO1xuICAgICAgJHZhcmlhbnRPZmZzZXQgPSB4ICogZGV2aWNlQ2VsbFdpZHRoICUgKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlY29yYXRpb25zIG9uIHRoZSBib3R0b20gbGF5ZXJcbiAgICB0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5mb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4LCB5LCAnYm90dG9tJywgZCA9PiB7XG4gICAgICBpZiAoZC5iYWNrZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgJGJnID0gZC5iYWNrZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0JnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkLmZvcmVncm91bmRDb2xvclJHQikge1xuICAgICAgICAkZmcgPSBkLmZvcmVncm91bmRDb2xvclJHQi5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICAkaGFzRmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXBwbHkgdGhlIHNlbGVjdGlvbiBjb2xvciBpZiBuZWVkZWRcbiAgICAkaXNTZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLmlzQ2VsbFNlbGVjdGVkKHRoaXMuX3Rlcm1pbmFsLCB4LCB5KTtcbiAgICBpZiAoJGlzU2VsZWN0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSBjZWxsIGhhcyBhIGJnIGNvbG9yLCByZXRhaW4gdGhlIGNvbG9yIGJ5IGJsZW5kaW5nIGl0IHdpdGggdGhlIHNlbGVjdGlvbiBjb2xvclxuICAgICAgaWYgKFxuICAgICAgICAodGhpcy5yZXN1bHQuZmcgJiBGZ0ZsYWdzLklOVkVSU0UpIHx8XG4gICAgICAgICh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgIT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVFxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHN0YW5kYXJkIGJnIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdC5mZyAmIEZnRmxhZ3MuSU5WRVJTRSkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgJGJnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3RoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAkYmcgPSAoKHRoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5SR0JfTUFTSykgPDwgOCkgfCAweEZGO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgJGJnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgJGJnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3RoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAkYmcgPSAoKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5SR0JfTUFTSykgPDwgOCkgfCAweEZGO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY29uc2lkZXIgZGVmYXVsdCBiZyBjb2xvciBoZXJlIGFzIGl0J3Mgbm90IHBvc3NpYmxlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEJsZW5kIHdpdGggc2VsZWN0aW9uIGJnIGNvbG9yXG4gICAgICAgICRiZyA9IHJnYmEuYmxlbmQoXG4gICAgICAgICAgJGJnLFxuICAgICAgICAgICgodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhICYgMHhGRkZGRkYwMCkgfCAweDgwXG4gICAgICAgICkgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkYmcgPSAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgfVxuICAgICAgJGhhc0JnID0gdHJ1ZTtcblxuICAgICAgLy8gQXBwbHkgZXhwbGljaXQgc2VsZWN0aW9uIGZvcmVncm91bmQgaWYgcHJlc2VudFxuICAgICAgaWYgKCRjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCkge1xuICAgICAgICAkZmcgPSAkY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT3ZlcndyaXRlIGZnIGFzIGJnIGlmIGl0J3MgYSBzcGVjaWFsIGRlY29yYXRpdmUgZ2x5cGggKGVnLiBwb3dlcmxpbmUpXG4gICAgICBpZiAodHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNlbGwuZ2V0Q29kZSgpKSkge1xuICAgICAgICAvLyBJbnZlcnNlIGRlZmF1bHQgYmFja2dyb3VuZCBzaG91bGQgYmUgdHJlYXRlZCBhcyB0cmFuc3BhcmVudFxuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSAmJlxuICAgICAgICAgICh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVFxuICAgICAgICApIHtcbiAgICAgICAgICAkZmcgPSAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgaWYgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICAgICAgICRmZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVt0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0tdLnJnYmE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgICAgICAgJGZnID0gKCh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDgpIHwgMHhGRjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjb25zaWRlciBkZWZhdWx0IGJnIGNvbG9yIGhlcmUgYXMgaXQncyBub3QgcG9zc2libGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAgICAgICAkZmcgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2lbdGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLXS5yZ2JhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICAgICAgICAgICRmZyA9ICgodGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSA8PCA4KSB8IDB4RkY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICRmZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgICRmZyA9IHJnYmEuYmxlbmQoXG4gICAgICAgICAgICAkZmcsXG4gICAgICAgICAgICAoKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPyAkY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUgOiAkY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSkucmdiYSAmIDB4RkZGRkZGMDApIHwgMHg4MFxuICAgICAgICAgICkgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgIH1cbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWNvcmF0aW9ucyBvbiB0aGUgdG9wIGxheWVyXG4gICAgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UuZm9yRWFjaERlY29yYXRpb25BdENlbGwoeCwgeSwgJ3RvcCcsIGQgPT4ge1xuICAgICAgaWYgKGQuYmFja2dyb3VuZENvbG9yUkdCKSB7XG4gICAgICAgICRiZyA9IGQuYmFja2dyb3VuZENvbG9yUkdCLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgICRoYXNCZyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZC5mb3JlZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgJGZnID0gZC5mb3JlZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0ZnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgYW55IG92ZXJyaWRlcyBmcm9tIHJnYmEgdG8gdGhlIGZnL2JnIHBhY2tlZCBmb3JtYXQuIFRoaXMgcmVzb2x2ZXMgdGhlIGludmVyc2UgZmxhZ1xuICAgIC8vIGFoZWFkIG9mIHRpbWUgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb3JyZWN0IGNhY2hlIGtleVxuICAgIGlmICgkaGFzQmcpIHtcbiAgICAgIGlmICgkaXNTZWxlY3RlZCkge1xuICAgICAgICAvLyBOb24tUkdCIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCArIGZvcmNlIG5vbi1kaW0gKyBvdmVycmlkZSArIGZvcmNlIFJHQiBjb2xvciBtb2RlXG4gICAgICAgICRiZyA9IChjZWxsLmJnICYgfkF0dHJpYnV0ZXMuUkdCX01BU0sgJiB+QmdGbGFncy5ESU0pIHwgJGJnIHwgQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb24tUkdCIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCArIG92ZXJyaWRlICsgZm9yY2UgUkdCIGNvbG9yIG1vZGVcbiAgICAgICAgJGJnID0gKGNlbGwuYmcgJiB+QXR0cmlidXRlcy5SR0JfTUFTSykgfCAkYmcgfCBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCRoYXNGZykge1xuICAgICAgLy8gTm9uLVJHQiBhdHRyaWJ1dGVzIGZyb20gbW9kZWwgKyBmb3JjZSBkaXNhYmxlIGludmVyc2UgKyBvdmVycmlkZSArIGZvcmNlIFJHQiBjb2xvciBtb2RlXG4gICAgICAkZmcgPSAoY2VsbC5mZyAmIH5BdHRyaWJ1dGVzLlJHQl9NQVNLICYgfkZnRmxhZ3MuSU5WRVJTRSkgfCAkZmcgfCBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBpbnZlcnNlIHdhcyBzcGVjaWZpZWQgYnkgb25seSBvbmUgb2YgYmcgb3ZlcnJpZGUgb3IgZmcgb3ZlcnJpZGUgd2FzIHNldCxcbiAgICAvLyByZXNvbHZpbmcgdGhlIG90aGVyIGludmVyc2UgY29sb3IgYW5kIHNldHRpbmcgdGhlIGludmVyc2UgZmxhZyBpZiBuZWVkZWQuXG4gICAgaWYgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSB7XG4gICAgICBpZiAoJGhhc0JnICYmICEkaGFzRmcpIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBiZyBjb2xvciB0eXBlIChkZWZhdWx0IGNvbG9yIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIGluIGZnIHZzIGJnKVxuICAgICAgICBpZiAoKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9ERUZBVUxUKSB7XG4gICAgICAgICAgJGZnID0gKHRoaXMucmVzdWx0LmZnICYgfihBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgRmdGbGFncy5JTlZFUlNFIHwgQXR0cmlidXRlcy5DTV9NQVNLKSkgfCAoKCRjb2xvcnMuYmFja2dyb3VuZC5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIHwgQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGZnID0gKHRoaXMucmVzdWx0LmZnICYgfihBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgRmdGbGFncy5JTlZFUlNFIHwgQXR0cmlidXRlcy5DTV9NQVNLKSkgfCB0aGlzLnJlc3VsdC5iZyAmIChBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgQXR0cmlidXRlcy5DTV9NQVNLKTtcbiAgICAgICAgfVxuICAgICAgICAkaGFzRmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEkaGFzQmcgJiYgJGhhc0ZnKSB7XG4gICAgICAgIC8vIFJlc29sdmUgYmcgY29sb3IgdHlwZSAoZGVmYXVsdCBjb2xvciBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBpbiBmZyB2cyBiZylcbiAgICAgICAgaWYgKCh0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fREVGQVVMVCkge1xuICAgICAgICAgICRiZyA9ICh0aGlzLnJlc3VsdC5iZyAmIH4oQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSykpIHwgKCgkY29sb3JzLmZvcmVncm91bmQucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSykgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSB8IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRiZyA9ICh0aGlzLnJlc3VsdC5iZyAmIH4oQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSykpIHwgdGhpcy5yZXN1bHQuZmcgJiAoQXR0cmlidXRlcy5SR0JfTUFTSyB8IEF0dHJpYnV0ZXMuQ01fTUFTSyk7XG4gICAgICAgIH1cbiAgICAgICAgJGhhc0JnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIG9iamVjdFxuICAgICRjb2xvcnMgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBVc2UgdGhlIG92ZXJyaWRlIGlmIGl0IGV4aXN0c1xuICAgIHRoaXMucmVzdWx0LmJnID0gJGhhc0JnID8gJGJnIDogdGhpcy5yZXN1bHQuYmc7XG4gICAgdGhpcy5yZXN1bHQuZmcgPSAkaGFzRmcgPyAkZmcgOiB0aGlzLnJlc3VsdC5mZztcblxuICAgIC8vIFJlc2V0IG92ZXJyaWRlcyB2YXJpYW50T2Zmc2V0XG4gICAgdGhpcy5yZXN1bHQuZXh0ICY9IH5FeHRGbGFncy5WQVJJQU5UX09GRlNFVDtcbiAgICB0aGlzLnJlc3VsdC5leHQgfD0gKCR2YXJpYW50T2Zmc2V0IDw8IDI5KSAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGlzRmlyZWZveCwgaXNMZWdhY3lFZGdlIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcblxuZXhwb3J0IGNvbnN0IERJTV9PUEFDSVRZID0gMC41O1xuLy8gVGhlIHRleHQgYmFzZWxpbmUgaXMgc2V0IGNvbmRpdGlvbmFsbHkgYnkgYnJvd3Nlci4gVXNpbmcgJ2lkZW9ncmFwaGljJyBmb3IgRmlyZWZveCBvciBMZWdhY3kgRWRnZVxuLy8gd291bGQgcmVzdWx0IGluIHRydW5jYXRlZCB0ZXh0IChJc3N1ZSAzMzUzKS4gVXNpbmcgJ2JvdHRvbScgZm9yIENocm9tZSB3b3VsZCByZXN1bHQgaW4gc2xpZ2h0bHlcbi8vIHVuYWxpZ25lZCBQb3dlcmxpbmUgZm9udHMgKFBSIDMzNTYjaXNzdWVjb21tZW50LTg1MDkyODE3OSkuXG5leHBvcnQgY29uc3QgVEVYVF9CQVNFTElORTogQ2FudmFzVGV4dEJhc2VsaW5lID0gaXNGaXJlZm94IHx8IGlzTGVnYWN5RWRnZSA/ICdib3R0b20nIDogJ2lkZW9ncmFwaGljJztcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5cbmludGVyZmFjZSBJQmxvY2tWZWN0b3Ige1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgdzogbnVtYmVyO1xuICBoOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBibG9ja0VsZW1lbnREZWZpbml0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IElCbG9ja1ZlY3RvcltdIHwgdW5kZWZpbmVkIH0gPSB7XG4gIC8vIEJsb2NrIGVsZW1lbnRzICgweDI1ODAtMHgyNTkwKVxuICAn4paAJzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNCB9XSwgLy8gVVBQRVIgSEFMRiBCTE9DS1xuICAn4paBJzogW3sgeDogMCwgeTogNywgdzogOCwgaDogMSB9XSwgLy8gTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAn4paCJzogW3sgeDogMCwgeTogNiwgdzogOCwgaDogMiB9XSwgLy8gTE9XRVIgT05FIFFVQVJURVIgQkxPQ0tcbiAgJ+KWgyc6IFt7IHg6IDAsIHk6IDUsIHc6IDgsIGg6IDMgfV0sIC8vIExPV0VSIFRIUkVFIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWhCc6IFt7IHg6IDAsIHk6IDQsIHc6IDgsIGg6IDQgfV0sIC8vIExPV0VSIEhBTEYgQkxPQ0tcbiAgJ+KWhSc6IFt7IHg6IDAsIHk6IDMsIHc6IDgsIGg6IDUgfV0sIC8vIExPV0VSIEZJVkUgRUlHSFRIUyBCTE9DS1xuICAn4paGJzogW3sgeDogMCwgeTogMiwgdzogOCwgaDogNiB9XSwgLy8gTE9XRVIgVEhSRUUgUVVBUlRFUlMgQkxPQ0tcbiAgJ+KWhyc6IFt7IHg6IDAsIHk6IDEsIHc6IDgsIGg6IDcgfV0sIC8vIExPV0VSIFNFVkVOIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWiCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDggfV0sIC8vIEZVTEwgQkxPQ0tcbiAgJ+KWiSc6IFt7IHg6IDAsIHk6IDAsIHc6IDcsIGg6IDggfV0sIC8vIExFRlQgU0VWRU4gRUlHSFRIUyBCTE9DS1xuICAn4paKJzogW3sgeDogMCwgeTogMCwgdzogNiwgaDogOCB9XSwgLy8gTEVGVCBUSFJFRSBRVUFSVEVSUyBCTE9DS1xuICAn4paLJzogW3sgeDogMCwgeTogMCwgdzogNSwgaDogOCB9XSwgLy8gTEVGVCBGSVZFIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWjCc6IFt7IHg6IDAsIHk6IDAsIHc6IDQsIGg6IDggfV0sIC8vIExFRlQgSEFMRiBCTE9DS1xuICAn4paNJzogW3sgeDogMCwgeTogMCwgdzogMywgaDogOCB9XSwgLy8gTEVGVCBUSFJFRSBFSUdIVEhTIEJMT0NLXG4gICfilo4nOiBbeyB4OiAwLCB5OiAwLCB3OiAyLCBoOiA4IH1dLCAvLyBMRUZUIE9ORSBRVUFSVEVSIEJMT0NLXG4gICfilo8nOiBbeyB4OiAwLCB5OiAwLCB3OiAxLCBoOiA4IH1dLCAvLyBMRUZUIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ+KWkCc6IFt7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDggfV0sIC8vIFJJR0hUIEhBTEYgQkxPQ0tcblxuICAvLyBCbG9jayBlbGVtZW50cyAoMHgyNTk0LTB4MjU5NSlcbiAgJ+KWlCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfV0sIC8vIFVQUEVSIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ+KWlSc6IFt7IHg6IDcsIHk6IDAsIHc6IDEsIGg6IDggfV0sIC8vIFJJR0hUIE9ORSBFSUdIVEggQkxPQ0tcblxuICAvLyBUZXJtaW5hbCBncmFwaGljIGNoYXJhY3RlcnMgKDB4MjU5Ni0weDI1OUYpXG4gICfilpYnOiBbeyB4OiAwLCB5OiA0LCB3OiA0LCBoOiA0IH1dLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUVVBRFJBTlQgTE9XRVIgTEVGVFxuICAn4paXJzogW3sgeDogNCwgeTogNCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIExPV0VSIFJJR0hUXG4gICfilpgnOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA0IH1dLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUVVBRFJBTlQgVVBQRVIgTEVGVFxuICAn4paZJzogW3sgeDogMCwgeTogMCwgdzogNCwgaDogOCB9LCB7IHg6IDAsIHk6IDQsIHc6IDgsIGg6IDQgfV0sIC8vIFFVQURSQU5UIFVQUEVSIExFRlQgQU5EIExPV0VSIExFRlQgQU5EIExPV0VSIFJJR0hUXG4gICfilponOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA0IH0sIHsgeDogNCwgeTogNCwgdzogNCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgTEVGVCBBTkQgTE9XRVIgUklHSFRcbiAgJ+KWmyc6IFt7IHg6IDAsIHk6IDAsIHc6IDQsIGg6IDggfSwgeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA0IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBMRUZUIEFORCBVUFBFUiBSSUdIVCBBTkQgTE9XRVIgTEVGVFxuICAn4pacJzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNCB9LCB7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDggfV0sIC8vIFFVQURSQU5UIFVQUEVSIExFRlQgQU5EIFVQUEVSIFJJR0hUIEFORCBMT1dFUiBSSUdIVFxuICAn4padJzogW3sgeDogNCwgeTogMCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIFVQUEVSIFJJR0hUXG4gICfilp4nOiBbeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA0IH0sIHsgeDogMCwgeTogNCwgdzogNCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgUklHSFQgQU5EIExPV0VSIExFRlRcbiAgJ+KWnyc6IFt7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDggfSwgeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiA0IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBSSUdIVCBBTkQgTE9XRVIgTEVGVCBBTkQgTE9XRVIgUklHSFRcblxuICAvLyBWRVJUSUNBTCBPTkUgRUlHSFRIIEJMT0NLLTIgdGhyb3VnaCBWRVJUSUNBTCBPTkUgRUlHSFRIIEJMT0NLLTdcbiAgJ1xcdXsxRkI3MH0nOiBbeyB4OiAxLCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjcxfSc6IFt7IHg6IDIsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG4gICdcXHV7MUZCNzJ9JzogW3sgeDogMywgeTogMCwgdzogMSwgaDogOCB9XSxcbiAgJ1xcdXsxRkI3M30nOiBbeyB4OiA0LCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjc0fSc6IFt7IHg6IDUsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG4gICdcXHV7MUZCNzV9JzogW3sgeDogNiwgeTogMCwgdzogMSwgaDogOCB9XSxcblxuICAvLyBIT1JJWk9OVEFMIE9ORSBFSUdIVEggQkxPQ0stMiB0aHJvdWdoIEhPUklaT05UQUwgT05FIEVJR0hUSCBCTE9DSy03XG4gICdcXHV7MUZCNzZ9JzogW3sgeDogMCwgeTogMSwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3N30nOiBbeyB4OiAwLCB5OiAyLCB3OiA4LCBoOiAxIH1dLFxuICAnXFx1ezFGQjc4fSc6IFt7IHg6IDAsIHk6IDMsIHc6IDgsIGg6IDEgfV0sXG4gICdcXHV7MUZCNzl9JzogW3sgeDogMCwgeTogNCwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3QX0nOiBbeyB4OiAwLCB5OiA1LCB3OiA4LCBoOiAxIH1dLFxuICAnXFx1ezFGQjdCfSc6IFt7IHg6IDAsIHk6IDYsIHc6IDgsIGg6IDEgfV0sXG5cbiAgLy8gTEVGVCBBTkQgTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjdDfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDEsIGg6IDggfSwgeyB4OiAwLCB5OiA3LCB3OiA4LCBoOiAxIH1dLFxuICAvLyBMRUZUIEFORCBVUFBFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCN0R9JzogW3sgeDogMCwgeTogMCwgdzogMSwgaDogOCB9LCB7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIFJJR0hUIEFORCBVUFBFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCN0V9JzogW3sgeDogNywgeTogMCwgdzogMSwgaDogOCB9LCB7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIFJJR0hUIEFORCBMT1dFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCN0Z9JzogW3sgeDogNywgeTogMCwgdzogMSwgaDogOCB9LCB7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIFVQUEVSIEFORCBMT1dFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICdcXHV7MUZCODB9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogMSB9LCB7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sXG4gIC8vIEhPUklaT05UQUwgT05FIEVJR0hUSCBCTE9DSy0xMzU4XG4gICdcXHV7MUZCODF9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogMSB9LCB7IHg6IDAsIHk6IDIsIHc6IDgsIGg6IDEgfSwgeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiAxIH0sIHsgeDogMCwgeTogNywgdzogOCwgaDogMSB9XSxcblxuICAvLyBVUFBFUiBPTkUgUVVBUlRFUiBCTE9DS1xuICAnXFx1ezFGQjgyfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDIgfV0sXG4gIC8vIFVQUEVSIFRIUkVFIEVJR0hUSFMgQkxPQ0tcbiAgJ1xcdXsxRkI4M30nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAzIH1dLFxuICAvLyBVUFBFUiBGSVZFIEVJR0hUSFMgQkxPQ0tcbiAgJ1xcdXsxRkI4NH0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA1IH1dLFxuICAvLyBVUFBFUiBUSFJFRSBRVUFSVEVSUyBCTE9DS1xuICAnXFx1ezFGQjg1fSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDYgfV0sXG4gIC8vIFVQUEVSIFNFVkVOIEVJR0hUSFMgQkxPQ0tcbiAgJ1xcdXsxRkI4Nn0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA3IH1dLFxuXG4gIC8vIFJJR0hUIE9ORSBRVUFSVEVSIEJMT0NLXG4gICdcXHV7MUZCODd9JzogW3sgeDogNiwgeTogMCwgdzogMiwgaDogOCB9XSxcbiAgLy8gUklHSFQgVEhSRUUgRUlHSFRIUyBCME9DS1xuICAnXFx1ezFGQjg4fSc6IFt7IHg6IDUsIHk6IDAsIHc6IDMsIGg6IDggfV0sXG4gIC8vIFJJR0hUIEZJVkUgRUlHSFRIUyBCTDBDS1xuICAnXFx1ezFGQjg5fSc6IFt7IHg6IDMsIHk6IDAsIHc6IDUsIGg6IDggfV0sXG4gIC8vIFJJR0hUIFRIUkVFIFFVQVJURVJTIDBMT0NLXG4gICdcXHV7MUZCOEF9JzogW3sgeDogMiwgeTogMCwgdzogNiwgaDogOCB9XSxcbiAgLy8gUklHSFQgU0VWRU4gRUlHSFRIUyBCME9DS1xuICAnXFx1ezFGQjhCfSc6IFt7IHg6IDEsIHk6IDAsIHc6IDcsIGg6IDggfV0sXG5cbiAgLy8gQ0hFQ0tFUiBCT0FSRCBGSUxMXG4gICdcXHV7MUZCOTV9JzogW1xuICAgIHsgeDogMCwgeTogMCwgdzogMiwgaDogMiB9LCB7IHg6IDQsIHk6IDAsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDIsIHk6IDIsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiAyLCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAwLCB5OiA0LCB3OiAyLCBoOiAyIH0sIHsgeDogNCwgeTogNCwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMiwgeTogNiwgdzogMiwgaDogMiB9LCB7IHg6IDYsIHk6IDYsIHc6IDIsIGg6IDIgfVxuICBdLFxuICAvLyBJTlZFUlNFIENIRUNLRVIgQk9BUkQgRklMTFxuICAnXFx1ezFGQjk2fSc6IFtcbiAgICB7IHg6IDIsIHk6IDAsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiAwLCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAwLCB5OiAyLCB3OiAyLCBoOiAyIH0sIHsgeDogNCwgeTogMiwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMiwgeTogNCwgdzogMiwgaDogMiB9LCB7IHg6IDYsIHk6IDQsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDAsIHk6IDYsIHc6IDIsIGg6IDIgfSwgeyB4OiA0LCB5OiA2LCB3OiAyLCBoOiAyIH1cbiAgXSxcbiAgLy8gSEVBVlkgSE9SSVpPTlRBTCBGSUxMICh1cHBlciBtaWRkbGUgYW5kIGxvd2VyIG9uZSBxdWFydGVyIGJsb2NrKVxuICAnXFx1ezFGQjk3fSc6IFt7IHg6IDAsIHk6IDIsIHc6IDgsIGg6IDIgfSwgeyB4OiAwLCB5OiA2LCB3OiA4LCBoOiAyIH1dXG59O1xuXG50eXBlIFBhdHRlcm5EZWZpbml0aW9uID0gbnVtYmVyW11bXTtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXBlYXRpbmcgcGF0dGVybiB1c2VkIGJ5IHNwZWNpYWwgY2hhcmFjdGVycywgdGhlIHBhdHRlcm4gaXMgbWFkZSB1cCBvZiBhIDJkIGFycmF5IG9mXG4gKiBwaXhlbCB2YWx1ZXMgdG8gYmUgZmlsbGVkICgxKSBvciBub3QgZmlsbGVkICgwKS5cbiAqL1xuY29uc3QgcGF0dGVybkNoYXJhY3RlckRlZmluaXRpb25zOiB7IFtrZXk6IHN0cmluZ106IFBhdHRlcm5EZWZpbml0aW9uIHwgdW5kZWZpbmVkIH0gPSB7XG4gIC8vIFNoYWRlIGNoYXJhY3RlcnMgKDB4MjU5MS0weDI1OTMpXG4gICfilpEnOiBbIC8vIExJR0hUIFNIQURFICgyNSUpXG4gICAgWzEsIDAsIDAsIDBdLFxuICAgIFswLCAwLCAwLCAwXSxcbiAgICBbMCwgMCwgMSwgMF0sXG4gICAgWzAsIDAsIDAsIDBdXG4gIF0sXG4gICfilpInOiBbIC8vIE1FRElVTSBTSEFERSAoNTAlKVxuICAgIFsxLCAwXSxcbiAgICBbMCwgMF0sXG4gICAgWzAsIDFdLFxuICAgIFswLCAwXVxuICBdLFxuICAn4paTJzogWyAvLyBEQVJLIFNIQURFICg3NSUpXG4gICAgWzAsIDFdLFxuICAgIFsxLCAxXSxcbiAgICBbMSwgMF0sXG4gICAgWzEsIDFdXG4gIF1cbn07XG5cbmNvbnN0IGVudW0gU2hhcGVzIHtcbiAgLyoqIOKUgiAqLyBUT1BfVE9fQk9UVE9NID0gJ00uNSwwIEwuNSwxJyxcbiAgLyoqIOKUgCAqLyBMRUZUX1RPX1JJR0hUID0gJ00wLC41IEwxLC41JyxcblxuICAvKiog4pSUICovIFRPUF9UT19SSUdIVCA9ICdNLjUsMCBMLjUsLjUgTDEsLjUnLFxuICAvKiog4pSYICovIFRPUF9UT19MRUZUID0gJ00uNSwwIEwuNSwuNSBMMCwuNScsXG4gIC8qKiDilJAgKi8gTEVGVF9UT19CT1RUT00gPSAnTTAsLjUgTC41LC41IEwuNSwxJyxcbiAgLyoqIOKUjCAqLyBSSUdIVF9UT19CT1RUT00gPSAnTTAuNSwxIEwuNSwuNSBMMSwuNScsXG5cbiAgLyoqIOKVtSAqLyBNSURETEVfVE9fVE9QID0gJ00uNSwuNSBMLjUsMCcsXG4gIC8qKiDilbQgKi8gTUlERExFX1RPX0xFRlQgPSAnTS41LC41IEwwLC41JyxcbiAgLyoqIOKVtiAqLyBNSURETEVfVE9fUklHSFQgPSAnTS41LC41IEwxLC41JyxcbiAgLyoqIOKVtyAqLyBNSURETEVfVE9fQk9UVE9NID0gJ00uNSwuNSBMLjUsMScsXG5cbiAgLyoqIOKUtCAqLyBUX1RPUCA9ICdNMCwuNSBMMSwuNSBNLjUsLjUgTC41LDAnLFxuICAvKiog4pSkICovIFRfTEVGVCA9ICdNLjUsMCBMLjUsMSBNLjUsLjUgTDAsLjUnLFxuICAvKiog4pScICovIFRfUklHSFQgPSAnTS41LDAgTC41LDEgTS41LC41IEwxLC41JyxcbiAgLyoqIOKUrCAqLyBUX0JPVFRPTSA9ICdNMCwuNSBMMSwuNSBNLjUsLjUgTC41LDEnLFxuXG4gIC8qKiDilLwgKi8gQ1JPU1MgPSAnTTAsLjUgTDEsLjUgTS41LDAgTC41LDEnLFxuXG4gIC8qKiDilYwgKi8gVFdPX0RBU0hFU19IT1JJWk9OVEFMID0gJ00uMSwuNSBMLjQsLjUgTS42LC41IEwuOSwuNScsIC8vIC4yIGVtcHR5LCAuMyBmaWxsZWRcbiAgLyoqIOKUhCAqLyBUSFJFRV9EQVNIRVNfSE9SSVpPTlRBTCA9ICdNLjA2NjcsLjUgTC4yNjY3LC41IE0uNCwuNSBMLjYsLjUgTS43MzMzLC41IEwuOTMzMywuNScsIC8vIC4xMzMzIGVtcHR5LCAuMiBmaWxsZWRcbiAgLyoqIOKUiSAqLyBGT1VSX0RBU0hFU19IT1JJWk9OVEFMID0gJ00uMDUsLjUgTC4yLC41IE0uMywuNSBMLjQ1LC41IE0uNTUsLjUgTC43LC41IE0uOCwuNSBMLjk1LC41JywgLy8gLjEgZW1wdHksIC4xNSBmaWxsZWRcbiAgLyoqIOKVjiAqLyBUV09fREFTSEVTX1ZFUlRJQ0FMID0gJ00uNSwuMSBMLjUsLjQgTS41LC42IEwuNSwuOScsXG4gIC8qKiDilIYgKi8gVEhSRUVfREFTSEVTX1ZFUlRJQ0FMID0gJ00uNSwuMDY2NyBMLjUsLjI2NjcgTS41LC40IEwuNSwuNiBNLjUsLjczMzMgTC41LC45MzMzJyxcbiAgLyoqIOKUiiAqLyBGT1VSX0RBU0hFU19WRVJUSUNBTCA9ICdNLjUsLjA1IEwuNSwuMiBNLjUsLjMgTC41LC40NSBMLjUsLjU1IE0uNSwuNyBMLjUsLjk1Jyxcbn1cblxuY29uc3QgZW51bSBTdHlsZSB7XG4gIE5PUk1BTCA9IDEsXG4gIEJPTEQgPSAzXG59XG5cbi8qKlxuICogQHBhcmFtIHhwIFRoZSBwZXJjZW50YWdlIG9mIDE1JSBvZiB0aGUgeCBheGlzLlxuICogQHBhcmFtIHlwIFRoZSBwZXJjZW50YWdlIG9mIDE1JSBvZiB0aGUgeCBheGlzIG9uIHRoZSB5IGF4aXMuXG4gKi9cbnR5cGUgRHJhd0Z1bmN0aW9uRGVmaW5pdGlvbiA9ICh4cDogbnVtYmVyLCB5cDogbnVtYmVyKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogVGhpcyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgYWxsIGJveCBkcmF3aW5nIGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBvZiBTVkcgcGF0aHMgKGllLiB0aGVcbiAqIHN2ZyBkIGF0dHJpYnV0ZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBib3hEcmF3aW5nRGVmaW5pdGlvbnM6IHsgW2NoYXJhY3Rlcjogc3RyaW5nXTogeyBbZm9udFdlaWdodDogbnVtYmVyXTogc3RyaW5nIHwgRHJhd0Z1bmN0aW9uRGVmaW5pdGlvbiB9IHwgdW5kZWZpbmVkIH0gPSB7XG4gIC8vIFVuaWZvcm0gbm9ybWFsIGFuZCBib2xkXG4gICfilIAnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pSBJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KUgic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NIH0sXG4gICfilIMnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pSMJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pSPJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pSQJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fQk9UVE9NIH0sXG4gICfilJMnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KUlCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUlyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUmCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCB9LFxuICAn4pSbJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilJwnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9SSUdIVCB9LFxuICAn4pSjJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRfUklHSFQgfSxcbiAgJ+KUpCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UX0xFRlQgfSxcbiAgJ+KUqyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX0xFRlQgfSxcbiAgJ+KUrCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UX0JPVFRPTSB9LFxuICAn4pSzJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRfQk9UVE9NIH0sXG4gICfilLQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9UT1AgfSxcbiAgJ+KUuyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX1RPUCB9LFxuICAn4pS8JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkNST1NTIH0sXG4gICfilYsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuQ1JPU1MgfSxcbiAgJ+KVtCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pW4JzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilbUnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pW5JzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KVtic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KVuic6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KVtyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilbsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuXG4gIC8vIERvdWJsZSBib3JkZXJcbiAgJ+KVkCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWRJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41IC0geHB9LDAgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwwIEwkey41ICsgeHB9LDFgIH0sXG4gICfilZInOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDEgTC41LCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNLjUsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWTJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41IC0geHB9LDEgTCR7LjUgLSB4cH0sLjUgTDEsLjUgTSR7LjUgKyB4cH0sLjUgTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVlCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMSwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMSBNMSwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVlSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwuNSwkey41IC0geXB9IEwuNSwxIE0wLCR7LjUgKyB5cH0gTC41LCR7LjUgKyB5cH1gIH0sXG4gICfilZYnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgKyB4cH0sMSBMJHsuNSArIHhwfSwuNSBMMCwuNSBNJHsuNSAtIHhwfSwuNSBMJHsuNSAtIHhwfSwxYCB9LFxuICAn4pWXJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwxIE0wLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWYJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwwIEwuNSwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH0gTS41LCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfWAgfSxcbiAgJ+KVmSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMSwuNSBMJHsuNSAtIHhwfSwuNSBMJHsuNSAtIHhwfSwwIE0key41ICsgeHB9LC41IEwkey41ICsgeHB9LDBgIH0sXG4gICfilZonOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTEsJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwkey41IC0geXB9IEwkey41ICsgeHB9LDAgTTEsJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwkey41ICsgeXB9IEwkey41IC0geHB9LDBgIH0sXG4gICfilZsnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSArIHlwfSBMLjUsJHsuNSArIHlwfSBMLjUsMCBNMCwkey41IC0geXB9IEwuNSwkey41IC0geXB9YCB9LFxuICAn4pWcJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLC41IEwkey41ICsgeHB9LC41IEwkey41ICsgeHB9LDAgTSR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMGAgfSxcbiAgJ+KVnSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMCBNMCwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMGAgfSxcbiAgJ+KVnic6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSBNLjUsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0uNSwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH1gIH0sXG4gICfilZ8nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgLSB4cH0sMCBMJHsuNSAtIHhwfSwxIE0key41ICsgeHB9LDAgTCR7LjUgKyB4cH0sMSBNJHsuNSArIHhwfSwuNSBMMSwuNWAgfSxcbiAgJ+KVoCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTTEsJHsuNSArIHlwfSBMJHsuNSArIHhwfSwkey41ICsgeXB9IEwkey41ICsgeHB9LDEgTTEsJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwkey41IC0geXB9IEwkey41ICsgeHB9LDBgIH0sXG4gICfilaEnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gTTAsJHsuNSAtIHlwfSBMLjUsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwuNSwkey41ICsgeXB9YCB9LFxuICAn4pWiJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLC41IEwkey41IC0geHB9LC41IE0key41IC0geHB9LDAgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwwIEwkey41ICsgeHB9LDFgIH0sXG4gICfilaMnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxIE0wLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwxIE0wLCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwwYCB9LFxuICAn4pWkJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH0gTS41LCR7LjUgKyB5cH0gTC41LDFgIH0sXG4gICfilaUnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuTEVGVF9UT19SSUdIVH0gTSR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwuNSBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWmJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwkey41IC0geHB9LCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sMSBNMSwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVpyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMCBMLjUsJHsuNSAtIHlwfSBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWoJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYCR7U2hhcGVzLkxFRlRfVE9fUklHSFR9IE0key41IC0geHB9LC41IEwkey41IC0geHB9LDAgTSR7LjUgKyB4cH0sLjUgTCR7LjUgKyB4cH0sMGAgfSxcbiAgJ+KVqSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH0gTTAsJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwkey41IC0geXB9IEwkey41IC0geHB9LDAgTTEsJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwkey41IC0geXB9IEwkey41ICsgeHB9LDBgIH0sXG4gICfilaonOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gTTAsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0wLCR7LjUgKyB5cH0gTDEsJHsuNSArIHlwfWAgfSxcbiAgJ+KVqyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWsJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwxIE0xLCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sJHsuNSArIHlwfSBMJHsuNSArIHhwfSwxIE0wLCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwwIE0xLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwwYCB9LFxuXG4gIC8vIERpYWdvbmFsXG4gICfilbEnOiB7IFtTdHlsZS5OT1JNQUxdOiAnTTEsMCBMMCwxJyB9LFxuICAn4pWyJzogeyBbU3R5bGUuTk9STUFMXTogJ00wLDAgTDEsMScgfSxcbiAgJ+KVsyc6IHsgW1N0eWxlLk5PUk1BTF06ICdNMSwwIEwwLDEgTTAsMCBMMSwxJyB9LFxuXG4gIC8vIE1peGVkIHdlaWdodFxuICAn4pW8JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19MRUZULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilb0nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilb4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pW/JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSNJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilI4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilJEnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pSSJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19MRUZULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSVJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilJYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilJknOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pSaJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19MRUZULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSdJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilJ4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuUklHSFRfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilJ8nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilKAnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NIH0sXG4gICfilKEnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUoic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fVE9QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pSlJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUpic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KUpyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcbiAgJ+KUqCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19CT1RUT00gfSxcbiAgJ+KUqSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilKonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSB9LFxuICAn4pStJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUric6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pSvJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pSwJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSxJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KUsic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pS1JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUtic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pS3JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pS4JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pS5JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0xFRlQgfSxcbiAgJ+KUuic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19SSUdIVCB9LFxuICAn4pS9JzogeyBbU3R5bGUuTk9STUFMXTogYCR7U2hhcGVzLlRPUF9UT19CT1RUT019ICR7U2hhcGVzLk1JRERMRV9UT19SSUdIVH1gLCAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUvic6IHsgW1N0eWxlLk5PUk1BTF06IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSAke1NoYXBlcy5NSURETEVfVE9fTEVGVH1gLCAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pS/JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19SSUdIVCB9LFxuICAn4pWAJzogeyBbU3R5bGUuTk9STUFMXTogYCR7U2hhcGVzLkxFRlRfVE9fUklHSFR9ICR7U2hhcGVzLk1JRERMRV9UT19CT1RUT019YCwgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pWBJzogeyBbU3R5bGUuTk9STUFMXTogYCR7U2hhcGVzLk1JRERMRV9UT19UT1B9ICR7U2hhcGVzLkxFRlRfVE9fUklHSFR9YCwgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pWCJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pWDJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0xFRlQgfSxcbiAgJ+KVhCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19SSUdIVCB9LFxuICAn4pWFJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KVhic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSB9LFxuICAn4pWHJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBgJHtTaGFwZXMuTUlERExFX1RPX1RPUH0gJHtTaGFwZXMuTEVGVF9UT19SSUdIVH1gIH0sXG4gICfilYgnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSAke1NoYXBlcy5NSURETEVfVE9fQk9UVE9NfWAgfSxcbiAgJ+KViSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogYCR7U2hhcGVzLlRPUF9UT19CT1RUT019ICR7U2hhcGVzLk1JRERMRV9UT19MRUZUfWAgfSxcbiAgJ+KViic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogYCR7U2hhcGVzLlRPUF9UT19CT1RUT019ICR7U2hhcGVzLk1JRERMRV9UT19SSUdIVH1gIH0sXG5cbiAgLy8gRGFzaGVkXG4gICfilYwnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVFdPX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilY0nOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVFdPX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilIQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVEhSRUVfREFTSEVTX0hPUklaT05UQUwgfSxcbiAgJ+KUhSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5USFJFRV9EQVNIRVNfSE9SSVpPTlRBTCB9LFxuICAn4pSIJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkZPVVJfREFTSEVTX0hPUklaT05UQUwgfSxcbiAgJ+KUiSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5GT1VSX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilY4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVFdPX0RBU0hFU19WRVJUSUNBTCB9LFxuICAn4pWPJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRXT19EQVNIRVNfVkVSVElDQUwgfSxcbiAgJ+KUhic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5USFJFRV9EQVNIRVNfVkVSVElDQUwgIH0sXG4gICfilIcnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVEhSRUVfREFTSEVTX1ZFUlRJQ0FMIH0sXG4gICfilIonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuRk9VUl9EQVNIRVNfVkVSVElDQUwgfSxcbiAgJ+KUiyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5GT1VSX0RBU0hFU19WRVJUSUNBTCB9LFxuXG4gIC8vIEN1cnZlZFxuICAn4pWtJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwxIEwuNSwkey41ICsgKHlwIC8gLjE1ICogLjUpfSBDLjUsJHsuNSArICh5cCAvIC4xNSAqIC41KX0sLjUsLjUsMSwuNWAgfSxcbiAgJ+KVric6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMSBMLjUsJHsuNSArICh5cCAvIC4xNSAqIC41KX0gQy41LCR7LjUgKyAoeXAgLyAuMTUgKiAuNSl9LC41LC41LDAsLjVgIH0sXG4gICfila8nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDAgTC41LCR7LjUgLSAoeXAgLyAuMTUgKiAuNSl9IEMuNSwkey41IC0gKHlwIC8gLjE1ICogLjUpfSwuNSwuNSwwLC41YCB9LFxuICAn4pWwJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwwIEwuNSwkey41IC0gKHlwIC8gLjE1ICogLjUpfSBDLjUsJHsuNSAtICh5cCAvIC4xNSAqIC41KX0sLjUsLjUsMSwuNWAgfVxufTtcblxuaW50ZXJmYWNlIElWZWN0b3JTaGFwZSB7XG4gIGQ6IHN0cmluZztcbiAgdHlwZTogVmVjdG9yVHlwZTtcbiAgbGVmdFBhZGRpbmc/OiBudW1iZXI7XG4gIHJpZ2h0UGFkZGluZz86IG51bWJlcjtcbn1cblxuY29uc3QgZW51bSBWZWN0b3JUeXBlIHtcbiAgRklMTCxcbiAgU1RST0tFXG59XG5cbi8qKlxuICogVGhpcyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIHByaW1hcmlseSB1c2VkIGJveCBkcmF3aW5nIGNoYXJhY3RlcnMgYXMgdmVjdG9yIHNoYXBlcy4gVGhlXG4gKiByZWFzb24gdGhlc2UgY2hhcmFjdGVycyBhcmUgZGVmaW5lZCBzcGVjaWFsbHkgaXMgdG8gYXZvaWQgY29tbW9uIHByb2JsZW1zIGlmIGEgdXNlcidzIGZvbnQgaGFzXG4gKiBub3QgYmVlbiBwYXRjaGVkIHdpdGggcG93ZXJsaW5lIGNoYXJhY3RlcnMgYW5kIGFsc28gdG8gZ2V0IHBpeGVsIHBlcmZlY3QgcmVuZGVyaW5nIGFzIHJlbmRlcmluZ1xuICogaXNzdWVzIGNhbiBvY2N1ciBhcm91bmQgQUEvU1BBQS5cbiAqXG4gKiBUaGUgbGluZSB2YXJpYW50cyBkcmF3IGJleW9uZCB0aGUgY2VsbCBhbmQgZ2V0IGNsaXBwZWQgdG8gZW5zdXJlIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgbm90XG4gKiB2aXNpYmxlLlxuICpcbiAqIE9yaWdpbmFsIHN5bWJvbHMgZGVmaW5lZCBpbiBodHRwczovL2dpdGh1Yi5jb20vcG93ZXJsaW5lL2ZvbnRwYXRjaGVyXG4gKi9cbmV4cG9ydCBjb25zdCBwb3dlcmxpbmVEZWZpbml0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IElWZWN0b3JTaGFwZSB9ID0ge1xuICAvLyBHaXQgYnJhbmNoXG4gICdcXHV7RTBBMH0nOiB7IGQ6ICdNLjMsMSBMLjAzLDEgTC4wMywuODggQy4wMywuODIsLjA2LC43OCwuMTEsLjczIEMuMTUsLjcsLjIsLjY4LC4yOCwuNjUgTC40MywuNiBDLjQ5LC41OCwuNTMsLjU2LC41NiwuNTMgQy41OSwuNSwuNiwuNDcsLjYsLjQzIEwuNiwuMjcgTC40LC4yNyBMLjY5LC4xIEwuOTgsLjI3IEwuNzgsLjI3IEwuNzgsLjQ2IEMuNzgsLjUyLC43NiwuNTYsLjcyLC42MSBDLjY4LC42NiwuNjMsLjY3LC41NiwuNyBMLjQ4LC43MiBDLjQyLC43NCwuMzgsLjc2LC4zNSwuNzggQy4zMiwuOCwuMzEsLjg0LC4zMSwuODggTC4zMSwxIE0uMywuNSBMLjAzLC41OSBMLjAzLC4wOSBMLjMsLjA5IEwuMywuNjU1JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH0sXG4gIC8vIEwgTlxuICAnXFx1e0UwQTF9JzogeyBkOiAnTS43LC40IEwuNywuNDcgTC4yLC40NyBMLjIsLjAzIEwuMzU1LC4wMyBMLjM1NSwuNCBMLjcwNSwuNCBNLjcsLjUgTC44NiwuNSBMLjg2LC45NSBMLjY5LC45NSBMLjQ0LC42NiBMLjQ2LC44NiBMLjQ2LC45NSBMLjMsLjk1IEwuMywuNDkgTC40NiwuNDkgTC43MSwuNzggTC42OSwuNTY1IEwuNjksLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gTG9ja1xuICAnXFx1e0UwQTJ9JzogeyBkOiAnTS4yNSwuOTQgQy4xNiwuOTQsLjExLC45MiwuMTEsLjg3IEwuMTEsLjUzIEMuMTEsLjQ4LC4xNSwuNDU1LC4yMywuNDUgTC4yMywuMyBDLjIzLC4yNSwuMjYsLjIyLC4zMSwuMTkgQy4zNiwuMTYsLjQzLC4xNSwuNTEsLjE1IEMuNTksLjE1LC42NiwuMTYsLjcxLC4xOSBDLjc3LC4yMiwuNzksLjI2LC43OSwuMyBMLjc5LC40NSBDLjg3LC40NSwuOTEsLjQ4LC45MSwuNTMgTC45MSwuODcgQy45MSwuOTIsLjg2LC45NCwuNzcsLjk0IEwuMjQsLjk0IE0uNTMsLjIgQy40OSwuMiwuNDUsLjIxLC40MiwuMjMgQy4zOSwuMjUsLjM4LC4yNywuMzgsLjMgTC4zOCwuNDUgTC42OCwuNDUgTC42OCwuMyBDLjY4LC4yNywuNjcsLjI1LC42NCwuMjMgQy42MSwuMjEsLjU4LC4yLC41MywuMiBNLjU4LC44MiBMLjU4LC42NiBDLjYzLC42NSwuNjUsLjYzLC42NSwuNiBDLjY1LC41OCwuNjQsLjU3LC42MSwuNTYgQy41OCwuNTUsLjU2LC41NCwuNTIsLjU0IEMuNDgsLjU0LC40NiwuNTUsLjQzLC41NiBDLjQsLjU3LC4zOSwuNTksLjM5LC42IEMuMzksLjYzLC40MSwuNjQsLjQ2LC42NiBMLjQ2LC44MiBMLjU3LC44MicsIHR5cGU6IFZlY3RvclR5cGUuRklMTCB9LFxuICAvLyBSaWdodCB0cmlhbmdsZSBzb2xpZFxuICAnXFx1e0UwQjB9JzogeyBkOiAnTTAsMCBMMSwuNSBMMCwxJywgdHlwZTogVmVjdG9yVHlwZS5GSUxMLCByaWdodFBhZGRpbmc6IDIgfSxcbiAgLy8gUmlnaHQgdHJpYW5nbGUgbGluZVxuICAnXFx1e0UwQjF9JzogeyBkOiAnTS0xLC0uNSBMMSwuNSBMLTEsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gTGVmdCB0cmlhbmdsZSBzb2xpZFxuICAnXFx1e0UwQjJ9JzogeyBkOiAnTTEsMCBMMCwuNSBMMSwxJywgdHlwZTogVmVjdG9yVHlwZS5GSUxMLCBsZWZ0UGFkZGluZzogMiB9LFxuICAvLyBMZWZ0IHRyaWFuZ2xlIGxpbmVcbiAgJ1xcdXtFMEIzfSc6IHsgZDogJ00yLC0uNSBMMCwuNSBMMiwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLlNUUk9LRSwgbGVmdFBhZGRpbmc6IDEsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBSaWdodCBzZW1pLWNpcmNsZSBzb2xpZFxuICAnXFx1e0UwQjR9JzogeyBkOiAnTTAsMCBMMCwxIEMwLjU1MiwxLDEsMC43NzYsMSwuNSBDMSwwLjIyNCwwLjU1MiwwLDAsMCcsIHR5cGU6IFZlY3RvclR5cGUuRklMTCwgcmlnaHRQYWRkaW5nOiAxIH0sXG4gIC8vIFJpZ2h0IHNlbWktY2lyY2xlIGxpbmVcbiAgJ1xcdXtFMEI1fSc6IHsgZDogJ00uMiwxIEMuNDIyLDEsLjgsLjgyNiwuNzgsLjUgQy44LC4xNzQsMC40MjIsMCwuMiwwJywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBMZWZ0IHNlbWktY2lyY2xlIHNvbGlkXG4gICdcXHV7RTBCNn0nOiB7IGQ6ICdNMSwwIEwxLDEgQzAuNDQ4LDEsMCwwLjc3NiwwLC41IEMwLDAuMjI0LDAuNDQ4LDAsMSwwJywgdHlwZTogVmVjdG9yVHlwZS5GSUxMLCBsZWZ0UGFkZGluZzogMSB9LFxuICAvLyBMZWZ0IHNlbWktY2lyY2xlIGxpbmVcbiAgJ1xcdXtFMEI3fSc6IHsgZDogJ00uOCwxIEMwLjU3OCwxLDAuMiwuODI2LC4yMiwuNSBDMC4yLDAuMTc0LDAuNTc4LDAsMC44LDAnLCB0eXBlOiBWZWN0b3JUeXBlLlNUUk9LRSwgbGVmdFBhZGRpbmc6IDEgfSxcbiAgLy8gTG93ZXIgbGVmdCB0cmlhbmdsZVxuICAnXFx1e0UwQjh9JzogeyBkOiAnTS0uNSwtLjUgTDEuNSwxLjUgTC0uNSwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gQmFja3NsYXNoIHNlcGFyYXRvclxuICAnXFx1e0UwQjl9JzogeyBkOiAnTS0uNSwtLjUgTDEuNSwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLlNUUk9LRSwgbGVmdFBhZGRpbmc6IDEsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBMb3dlciByaWdodCB0cmlhbmdsZVxuICAnXFx1e0UwQkF9JzogeyBkOiAnTTEuNSwtLjUgTC0uNSwxLjUgTDEuNSwxLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gVXBwZXIgbGVmdCB0cmlhbmdsZVxuICAnXFx1e0UwQkN9JzogeyBkOiAnTTEuNSwtLjUgTC0uNSwxLjUgTC0uNSwtLjUnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwgfSxcbiAgLy8gRm9yd2FyZCBzbGFzaCBzZXBhcmF0b3JcbiAgJ1xcdXtFMEJEfSc6IHsgZDogJ00xLjUsLS41IEwtLjUsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gVXBwZXIgcmlnaHQgdHJpYW5nbGVcbiAgJ1xcdXtFMEJFfSc6IHsgZDogJ00tLjUsLS41IEwxLjUsMS41IEwxLjUsLS41JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH1cbn07XG4vLyBGb3J3YXJkIHNsYXNoIHNlcGFyYXRvciByZWR1bmRhbnRcbnBvd2VybGluZURlZmluaXRpb25zWydcXHV7RTBCQn0nXSA9IHBvd2VybGluZURlZmluaXRpb25zWydcXHV7RTBCRH0nXTtcbi8vIEJhY2tzbGFzaCBzZXBhcmF0b3IgcmVkdW5kYW50XG5wb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQkZ9J10gPSBwb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQjl9J107XG5cbi8qKlxuICogVHJ5IGRyYXdpbmcgYSBjdXN0b20gYmxvY2sgZWxlbWVudCBvciBib3ggZHJhd2luZyBjaGFyYWN0ZXIsIHJldHVybmluZyB3aGV0aGVyIGl0IHdhc1xuICogc3VjY2Vzc2Z1bGx5IGRyYXduLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5RHJhd0N1c3RvbUNoYXIoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBjOiBzdHJpbmcsXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBmb250U2l6ZTogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IGJvb2xlYW4ge1xuICBjb25zdCBibG9ja0VsZW1lbnREZWZpbml0aW9uID0gYmxvY2tFbGVtZW50RGVmaW5pdGlvbnNbY107XG4gIGlmIChibG9ja0VsZW1lbnREZWZpbml0aW9uKSB7XG4gICAgZHJhd0Jsb2NrRWxlbWVudENoYXIoY3R4LCBibG9ja0VsZW1lbnREZWZpbml0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgcGF0dGVybkRlZmluaXRpb24gPSBwYXR0ZXJuQ2hhcmFjdGVyRGVmaW5pdGlvbnNbY107XG4gIGlmIChwYXR0ZXJuRGVmaW5pdGlvbikge1xuICAgIGRyYXdQYXR0ZXJuQ2hhcihjdHgsIHBhdHRlcm5EZWZpbml0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYm94RHJhd2luZ0RlZmluaXRpb24gPSBib3hEcmF3aW5nRGVmaW5pdGlvbnNbY107XG4gIGlmIChib3hEcmF3aW5nRGVmaW5pdGlvbikge1xuICAgIGRyYXdCb3hEcmF3aW5nQ2hhcihjdHgsIGJveERyYXdpbmdEZWZpbml0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQsIGRldmljZVBpeGVsUmF0aW8pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgcG93ZXJsaW5lRGVmaW5pdGlvbiA9IHBvd2VybGluZURlZmluaXRpb25zW2NdO1xuICBpZiAocG93ZXJsaW5lRGVmaW5pdGlvbikge1xuICAgIGRyYXdQb3dlcmxpbmVDaGFyKGN0eCwgcG93ZXJsaW5lRGVmaW5pdGlvbiwgeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0LCBmb250U2l6ZSwgZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGRyYXdCbG9ja0VsZW1lbnRDaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IElCbG9ja1ZlY3RvcltdLFxuICB4T2Zmc2V0OiBudW1iZXIsXG4gIHlPZmZzZXQ6IG51bWJlcixcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlclxuKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckRlZmluaXRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBib3ggPSBjaGFyRGVmaW5pdGlvbltpXTtcbiAgICBjb25zdCB4RWlnaHRoID0gZGV2aWNlQ2VsbFdpZHRoIC8gODtcbiAgICBjb25zdCB5RWlnaHRoID0gZGV2aWNlQ2VsbEhlaWdodCAvIDg7XG4gICAgY3R4LmZpbGxSZWN0KFxuICAgICAgeE9mZnNldCArIGJveC54ICogeEVpZ2h0aCxcbiAgICAgIHlPZmZzZXQgKyBib3gueSAqIHlFaWdodGgsXG4gICAgICBib3gudyAqIHhFaWdodGgsXG4gICAgICBib3guaCAqIHlFaWdodGhcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IGNhY2hlZFBhdHRlcm5zOiBNYXA8UGF0dGVybkRlZmluaXRpb24sIE1hcDwvKiBmaWxsU3R5bGUgKi9zdHJpbmcsIENhbnZhc1BhdHRlcm4+PiA9IG5ldyBNYXAoKTtcblxuZnVuY3Rpb24gZHJhd1BhdHRlcm5DaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IG51bWJlcltdW10sXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyXG4pOiB2b2lkIHtcbiAgbGV0IHBhdHRlcm5TZXQgPSBjYWNoZWRQYXR0ZXJucy5nZXQoY2hhckRlZmluaXRpb24pO1xuICBpZiAoIXBhdHRlcm5TZXQpIHtcbiAgICBwYXR0ZXJuU2V0ID0gbmV3IE1hcCgpO1xuICAgIGNhY2hlZFBhdHRlcm5zLnNldChjaGFyRGVmaW5pdGlvbiwgcGF0dGVyblNldCk7XG4gIH1cbiAgY29uc3QgZmlsbFN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgaWYgKHR5cGVvZiBmaWxsU3R5bGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGZpbGxTdHlsZSB0eXBlIFwiJHtmaWxsU3R5bGV9XCJgKTtcbiAgfVxuICBsZXQgcGF0dGVybiA9IHBhdHRlcm5TZXQuZ2V0KGZpbGxTdHlsZSk7XG4gIGlmICghcGF0dGVybikge1xuICAgIGNvbnN0IHdpZHRoID0gY2hhckRlZmluaXRpb25bMF0ubGVuZ3RoO1xuICAgIGNvbnN0IGhlaWdodCA9IGNoYXJEZWZpbml0aW9uLmxlbmd0aDtcbiAgICBjb25zdCB0bXBDYW52YXMgPSBjdHguY2FudmFzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdG1wQ2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdG1wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCB0bXBDdHggPSB0aHJvd0lmRmFsc3kodG1wQ2FudmFzLmdldENvbnRleHQoJzJkJykpO1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG5cbiAgICAvLyBFeHRyYWN0IHJnYmEgZnJvbSBmaWxsU3R5bGVcbiAgICBsZXQgcjogbnVtYmVyO1xuICAgIGxldCBnOiBudW1iZXI7XG4gICAgbGV0IGI6IG51bWJlcjtcbiAgICBsZXQgYTogbnVtYmVyO1xuICAgIGlmIChmaWxsU3R5bGUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICByID0gcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDEsIDMpLCAxNik7XG4gICAgICBnID0gcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDMsIDUpLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDUsIDcpLCAxNik7XG4gICAgICBhID0gZmlsbFN0eWxlLmxlbmd0aCA+IDcgJiYgcGFyc2VJbnQoZmlsbFN0eWxlLnNsaWNlKDcsIDkpLCAxNikgfHwgMTtcbiAgICB9IGVsc2UgaWYgKGZpbGxTdHlsZS5zdGFydHNXaXRoKCdyZ2JhJykpIHtcbiAgICAgIChbciwgZywgYiwgYV0gPSBmaWxsU3R5bGUuc3Vic3RyaW5nKDUsIGZpbGxTdHlsZS5sZW5ndGggLSAxKS5zcGxpdCgnLCcpLm1hcChlID0+IHBhcnNlRmxvYXQoZSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGZpbGxTdHlsZSBjb2xvciBmb3JtYXQgXCIke2ZpbGxTdHlsZX1cIiB3aGVuIGRyYXdpbmcgcGF0dGVybiBnbHlwaGApO1xuICAgIH1cblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICAgIF0gPSByO1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICsgMV0gPSBnO1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICsgMl0gPSBiO1xuICAgICAgICBpbWFnZURhdGEuZGF0YVsoeSAqIHdpZHRoICsgeCkgKiA0ICsgM10gPSBjaGFyRGVmaW5pdGlvblt5XVt4XSAqIChhICogMjU1KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdG1wQ3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIHBhdHRlcm4gPSB0aHJvd0lmRmFsc3koY3R4LmNyZWF0ZVBhdHRlcm4odG1wQ2FudmFzLCBudWxsKSk7XG4gICAgcGF0dGVyblNldC5zZXQoZmlsbFN0eWxlLCBwYXR0ZXJuKTtcbiAgfVxuICBjdHguZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgY3R4LmZpbGxSZWN0KHhPZmZzZXQsIHlPZmZzZXQsIGRldmljZUNlbGxXaWR0aCwgZGV2aWNlQ2VsbEhlaWdodCk7XG59XG5cbi8qKlxuICogRHJhd3MgdGhlIGZvbGxvd2luZyBib3ggZHJhd2luZyBjaGFyYWN0ZXJzIGJ5IG1hcHBpbmcgYSBzdWJzZXQgb2YgU1ZHIGQgYXR0cmlidXRlIGluc3RydWN0aW9ucyB0b1xuICogY2FudmFzIGRyYXcgY2FsbHMuXG4gKlxuICogQm94IHN0eWxlczogICAgICAg4pSO4pSw4pSS4pSN4pSv4pSR4pWT4pWl4pWW4pWS4pWk4pWVIOKUj+KUs+KUk+KUjOKUsuKUk+KUjOKUrOKUkOKUj+KUseKUkFxuICog4pSM4pSA4pSs4pSA4pSQIOKUj+KUgeKUs+KUgeKUkyDilZTilZDilabilZDilZcg4pSg4pWC4pSo4pSd4pS/4pSl4pWf4pWr4pWi4pWe4pWq4pWhIOKUoeKVh+KUqeKUnOKViuKUq+KUouKViOKUquKUo+KVieKUpFxuICog4pSCIOKUgiDilIIg4pSDIOKUgyDilIMg4pWRIOKVkSDilZEg4pSW4pS44pSa4pSV4pS34pSZ4pWZ4pWo4pWc4pWY4pWn4pWbIOKUlOKUtOKUmOKUlOKUuuKUm+KUl+KUu+KUm+KUl+KUueKUmFxuICog4pSc4pSA4pS84pSA4pSkIOKUo+KUgeKVi+KUgeKUqyDilaDilZDilazilZDilaMg4pSP4pSx4pSQ4pSM4pSy4pST4pSM4pSs4pSQ4pSM4pSs4pSQIOKUj+KUs+KUk+KUjOKUruKUk+KUjOKUrOKUkOKUj+KUreKUkFxuICog4pSCIOKUgiDilIIg4pSDIOKUgyDilIMg4pWRIOKVkSDilZEg4pSh4pWD4pSk4pSc4pWE4pSp4pSc4pWG4pSq4pSi4pWF4pSkIOKUnuKVgOKUpuKUnOKUvuKUq+KUn+KVgeKUp+KUo+KUveKUpFxuICog4pSU4pSA4pS04pSA4pSYIOKUl+KUgeKUu+KUgeKUmyDilZrilZDilanilZDilZ0g4pSU4pS04pSY4pSU4pS04pSY4pSU4pS64pSb4pSX4pS54pSYIOKUlOKUtOKUmOKUlOKUtuKUm+KUl+KUu+KUm+KUl+KUteKUmFxuICpcbiAqIE90aGVyOlxuICog4pWt4pSA4pWuIOKVsiDilbEg4pW34pW74pWO4pWP4pSG4pSH4pSK4pSLIOKVuuKVvuKVtCDilYzilYzilYwg4pSE4pSE4pSEIOKUiOKUiOKUiFxuICog4pSCIOKUgiAg4pWzICDilb3ilb/ilY7ilY/ilIbilIfilIrilIsg4pW24pW84pW4IOKVjeKVjeKVjSDilIXilIXilIUg4pSJ4pSJ4pSJXG4gKiDilbDilIDila8g4pWxIOKVsiDilbnilbXilY7ilY/ilIbilIfilIrilItcbiAqXG4gKiBBbGwgYm94IGRyYXdpbmcgY2hhcmFjdGVyczpcbiAqIOKUgCDilIEg4pSCIOKUgyDilIQg4pSFIOKUhiDilIcg4pSIIOKUiSDilIog4pSLIOKUjCDilI0g4pSOIOKUj1xuICog4pSQIOKUkSDilJIg4pSTIOKUlCDilJUg4pSWIOKUlyDilJgg4pSZIOKUmiDilJsg4pScIOKUnSDilJ4g4pSfXG4gKiDilKAg4pShIOKUoiDilKMg4pSkIOKUpSDilKYg4pSnIOKUqCDilKkg4pSqIOKUqyDilKwg4pStIOKUriDilK9cbiAqIOKUsCDilLEg4pSyIOKUsyDilLQg4pS1IOKUtiDilLcg4pS4IOKUuSDilLog4pS7IOKUvCDilL0g4pS+IOKUv1xuICog4pWAIOKVgSDilYIg4pWDIOKVhCDilYUg4pWGIOKVhyDilYgg4pWJIOKViiDilYsg4pWMIOKVjSDilY4g4pWPXG4gKiDilZAg4pWRIOKVkiDilZMg4pWUIOKVlSDilZYg4pWXIOKVmCDilZkg4pWaIOKVmyDilZwg4pWdIOKVniDilZ9cbiAqIOKVoCDilaEg4pWiIOKVoyDilaQg4pWlIOKVpiDilacg4pWoIOKVqSDilaog4pWrIOKVrCDila0g4pWuIOKVr1xuICog4pWwIOKVsSDilbIg4pWzIOKVtCDilbUg4pW2IOKVtyDilbgg4pW5IOKVuiDilbsg4pW8IOKVvSDilb4g4pW/XG4gKlxuICogLS0tXG4gKlxuICogQm94IGRyYXdpbmcgYWxpZ25tZW50IHRlc3RzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWiFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWiVxuICogICDilZTilZDilZDilabilZDilZDilZcgIOKUjOKUgOKUgOKUrOKUgOKUgOKUkCAg4pWt4pSA4pSA4pSs4pSA4pSA4pWuICDila3ilIDilIDilKzilIDilIDila4gIOKUj+KUgeKUgeKUs+KUgeKUgeKUkyAg4pSO4pSS4pSP4pSRICAg4pW3ICDilbsg4pSP4pSv4pSTIOKUjOKUsOKUkCAgICDiloog4pWx4pWy4pWx4pWy4pWz4pWz4pWzXG4gKiAgIOKVkeKUjOKUgOKVqOKUgOKUkOKVkSAg4pSC4pWU4pWQ4pWn4pWQ4pWX4pSCICDilILilZLilZDilarilZDilZXilIIgIOKUguKVk+KUgOKVgeKUgOKVluKUgiAg4pSD4pSM4pSA4pWC4pSA4pSQ4pSDICDilJfilYPilYTilJkgIOKVtuKUvOKVtOKVuuKVi+KVuOKUoOKUvOKUqCDilJ3ilYvilKUgICAg4paLIOKVsuKVseKVsuKVseKVs+KVs+KVs1xuICogICDilZHilILilbIg4pWx4pSC4pWRICDilILilZEgICDilZHilIIgIOKUguKUgiDilIIg4pSC4pSCICDilILilZEg4pSDIOKVkeKUgiAg4pSD4pSCIOKVvyDilILilIMgIOKUjeKVheKVhuKUkyAgIOKVtSAg4pW5IOKUl+KUt+KUmyDilJTilLjilJggICAg4paMIOKVseKVsuKVseKVsuKVs+KVs+KVs1xuICogICDilaDilaEg4pWzIOKVnuKVoyAg4pSc4pWiICAg4pWf4pSkICDilJzilLzilIDilLzilIDilLzilKQgIOKUnOKVq+KUgOKVguKUgOKVq+KUpCAg4pSj4pS/4pW+4pS84pW84pS/4pSrICDilJXilJvilJbilJogICAgIOKUjOKUhOKUhOKUkCDilY4g4pSP4pSF4pSF4pSTIOKUiyDilo0g4pWy4pWx4pWy4pWx4pWz4pWz4pWzXG4gKiAgIOKVkeKUguKVsSDilbLilILilZEgIOKUguKVkSAgIOKVkeKUgiAg4pSC4pSCIOKUgiDilILilIIgIOKUguKVkSDilIMg4pWR4pSCICDilIPilIIg4pW9IOKUguKUgyAg4paR4paR4paS4paS4paT4paT4paI4paIIOKUiiAg4pSGIOKVjiDilY8gIOKUhyDilIsg4paOXG4gKiAgIOKVkeKUlOKUgOKVpeKUgOKUmOKVkSAg4pSC4pWa4pWQ4pWk4pWQ4pWd4pSCICDilILilZjilZDilarilZDilZvilIIgIOKUguKVmeKUgOKVgOKUgOKVnOKUgiAg4pSD4pSU4pSA4pWC4pSA4pSY4pSDICDilpHilpHilpLilpLilpPilpPilojilogg4pSKICDilIYg4pWOIOKVjyAg4pSHIOKUiyDilo9cbiAqICAg4pWa4pWQ4pWQ4pWp4pWQ4pWQ4pWdICDilJTilIDilIDilLTilIDilIDilJggIOKVsOKUgOKUgOKUtOKUgOKUgOKVryAg4pWw4pSA4pSA4pS04pSA4pSA4pWvICDilJfilIHilIHilLvilIHilIHilJsgICAgICAgICAgIOKUlOKVjOKVjOKUmCDilY4g4pSX4pWN4pWN4pSbIOKUiyAg4paB4paC4paD4paE4paF4paG4paH4paIXG4gKlxuICogU291cmNlOiBodHRwczovL3d3dy53My5vcmcvMjAwMS8wNi91dGYtOC10ZXN0L1VURi04LWRlbW8uaHRtbFxuICovXG5mdW5jdGlvbiBkcmF3Qm94RHJhd2luZ0NoYXIoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBjaGFyRGVmaW5pdGlvbjogeyBbZm9udFdlaWdodDogbnVtYmVyXTogc3RyaW5nIHwgKCh4cDogbnVtYmVyLCB5cDogbnVtYmVyKSA9PiBzdHJpbmcpIH0sXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IHZvaWQge1xuICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuICBmb3IgKGNvbnN0IFtmb250V2VpZ2h0LCBpbnN0cnVjdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKGNoYXJEZWZpbml0aW9uKSkge1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubGluZVdpZHRoID0gZGV2aWNlUGl4ZWxSYXRpbyAqIE51bWJlci5wYXJzZUludChmb250V2VpZ2h0KTtcbiAgICBsZXQgYWN0dWFsSW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBpbnN0cnVjdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHhwID0gLjE1O1xuICAgICAgY29uc3QgeXAgPSAuMTUgLyBkZXZpY2VDZWxsSGVpZ2h0ICogZGV2aWNlQ2VsbFdpZHRoO1xuICAgICAgYWN0dWFsSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zKHhwLCB5cCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbEluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBhY3R1YWxJbnN0cnVjdGlvbnMuc3BsaXQoJyAnKSkge1xuICAgICAgY29uc3QgdHlwZSA9IGluc3RydWN0aW9uWzBdO1xuICAgICAgY29uc3QgZiA9IHN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXBbdHlwZV07XG4gICAgICBpZiAoIWYpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IGZpbmQgZHJhd2luZyBpbnN0cnVjdGlvbnMgZm9yIFwiJHt0eXBlfVwiYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXJnczogc3RyaW5nW10gPSBpbnN0cnVjdGlvbi5zdWJzdHJpbmcoMSkuc3BsaXQoJywnKTtcbiAgICAgIGlmICghYXJnc1swXSB8fCAhYXJnc1sxXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGYoY3R4LCB0cmFuc2xhdGVBcmdzKGFyZ3MsIGRldmljZUNlbGxXaWR0aCwgZGV2aWNlQ2VsbEhlaWdodCwgeE9mZnNldCwgeU9mZnNldCwgdHJ1ZSwgZGV2aWNlUGl4ZWxSYXRpbykpO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlKCk7XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdQb3dlcmxpbmVDaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IElWZWN0b3JTaGFwZSxcbiAgeE9mZnNldDogbnVtYmVyLFxuICB5T2Zmc2V0OiBudW1iZXIsXG4gIGRldmljZUNlbGxXaWR0aDogbnVtYmVyLFxuICBkZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXIsXG4gIGZvbnRTaXplOiBudW1iZXIsXG4gIGRldmljZVBpeGVsUmF0aW86IG51bWJlclxuKTogdm9pZCB7XG4gIC8vIENsaXAgdGhlIGNlbGwgdG8gbWFrZSBzdXJlIGRyYXdpbmcgZG9lc24ndCBvY2N1ciBiZXlvbmQgYm91bmRzXG4gIGNvbnN0IGNsaXBSZWdpb24gPSBuZXcgUGF0aDJEKCk7XG4gIGNsaXBSZWdpb24ucmVjdCh4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xuICBjdHguY2xpcChjbGlwUmVnaW9uKTtcblxuICBjdHguYmVnaW5QYXRoKCk7XG4gIC8vIFNjYWxlIHRoZSBzdHJva2Ugd2l0aCBEUFIgYW5kIGZvbnQgc2l6ZVxuICBjb25zdCBjc3NMaW5lV2lkdGggPSBmb250U2l6ZSAvIDEyO1xuICBjdHgubGluZVdpZHRoID0gZGV2aWNlUGl4ZWxSYXRpbyAqIGNzc0xpbmVXaWR0aDtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBjaGFyRGVmaW5pdGlvbi5kLnNwbGl0KCcgJykpIHtcbiAgICBjb25zdCB0eXBlID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZiA9IHN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXBbdHlwZV07XG4gICAgaWYgKCFmKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgZmluZCBkcmF3aW5nIGluc3RydWN0aW9ucyBmb3IgXCIke3R5cGV9XCJgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IGluc3RydWN0aW9uLnN1YnN0cmluZygxKS5zcGxpdCgnLCcpO1xuICAgIGlmICghYXJnc1swXSB8fCAhYXJnc1sxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGYoY3R4LCB0cmFuc2xhdGVBcmdzKFxuICAgICAgYXJncyxcbiAgICAgIGRldmljZUNlbGxXaWR0aCxcbiAgICAgIGRldmljZUNlbGxIZWlnaHQsXG4gICAgICB4T2Zmc2V0LFxuICAgICAgeU9mZnNldCxcbiAgICAgIGZhbHNlLFxuICAgICAgZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgIChjaGFyRGVmaW5pdGlvbi5sZWZ0UGFkZGluZyA/PyAwKSAqIChjc3NMaW5lV2lkdGggLyAyKSxcbiAgICAgIChjaGFyRGVmaW5pdGlvbi5yaWdodFBhZGRpbmcgPz8gMCkgKiAoY3NzTGluZVdpZHRoIC8gMilcbiAgICApKTtcbiAgfVxuICBpZiAoY2hhckRlZmluaXRpb24udHlwZSA9PT0gVmVjdG9yVHlwZS5TVFJPS0UpIHtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfSBlbHNlIHtcbiAgICBjdHguZmlsbCgpO1xuICB9XG4gIGN0eC5jbG9zZVBhdGgoKTtcbn1cblxuZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIsIG1pbjogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih2YWx1ZSwgbWF4KSwgbWluKTtcbn1cblxuY29uc3Qgc3ZnVG9DYW52YXNJbnN0cnVjdGlvbk1hcDogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge1xuICAnQyc6IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJnczogbnVtYmVyW10pID0+IGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pLFxuICAnTCc6IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJnczogbnVtYmVyW10pID0+IGN0eC5saW5lVG8oYXJnc1swXSwgYXJnc1sxXSksXG4gICdNJzogKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBhcmdzOiBudW1iZXJbXSkgPT4gY3R4Lm1vdmVUbyhhcmdzWzBdLCBhcmdzWzFdKVxufTtcblxuZnVuY3Rpb24gdHJhbnNsYXRlQXJncyhhcmdzOiBzdHJpbmdbXSwgY2VsbFdpZHRoOiBudW1iZXIsIGNlbGxIZWlnaHQ6IG51bWJlciwgeE9mZnNldDogbnVtYmVyLCB5T2Zmc2V0OiBudW1iZXIsIGRvQ2xhbXA6IGJvb2xlYW4sIGRldmljZVBpeGVsUmF0aW86IG51bWJlciwgbGVmdFBhZGRpbmc6IG51bWJlciA9IDAsIHJpZ2h0UGFkZGluZzogbnVtYmVyID0gMCk6IG51bWJlcltdIHtcbiAgY29uc3QgcmVzdWx0ID0gYXJncy5tYXAoZSA9PiBwYXJzZUZsb2F0KGUpIHx8IHBhcnNlSW50KGUpKTtcblxuICBpZiAocmVzdWx0Lmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBmZXcgYXJndW1lbnRzIGZvciBpbnN0cnVjdGlvbicpO1xuICB9XG5cbiAgZm9yIChsZXQgeCA9IDA7IHggPCByZXN1bHQubGVuZ3RoOyB4ICs9IDIpIHtcbiAgICAvLyBUcmFuc2xhdGUgZnJvbSAwLTEgdG8gMC1jZWxsV2lkdGhcbiAgICByZXN1bHRbeF0gKj0gY2VsbFdpZHRoIC0gKGxlZnRQYWRkaW5nICogZGV2aWNlUGl4ZWxSYXRpbykgLSAocmlnaHRQYWRkaW5nICogZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgLy8gRW5zdXJlIGNvb3JkaW5hdGUgZG9lc24ndCBlc2NhcGUgY2VsbCBib3VuZHMgYW5kIHJvdW5kIHRvIHRoZSBuZWFyZXN0IDAuNSB0byBlbnN1cmUgYSBjcmlzcFxuICAgIC8vIGxpbmUgYXQgMTAwJSBkZXZpY2VQaXhlbFJhdGlvXG4gICAgaWYgKGRvQ2xhbXAgJiYgcmVzdWx0W3hdICE9PSAwKSB7XG4gICAgICByZXN1bHRbeF0gPSBjbGFtcChNYXRoLnJvdW5kKHJlc3VsdFt4XSArIDAuNSkgLSAwLjUsIGNlbGxXaWR0aCwgMCk7XG4gICAgfVxuICAgIC8vIEFwcGx5IHRoZSBjZWxsJ3Mgb2Zmc2V0IChpZS4geCpjZWxsV2lkdGgpXG4gICAgcmVzdWx0W3hdICs9IHhPZmZzZXQgKyAobGVmdFBhZGRpbmcgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgfVxuXG4gIGZvciAobGV0IHkgPSAxOyB5IDwgcmVzdWx0Lmxlbmd0aDsgeSArPSAyKSB7XG4gICAgLy8gVHJhbnNsYXRlIGZyb20gMC0xIHRvIDAtY2VsbEhlaWdodFxuICAgIHJlc3VsdFt5XSAqPSBjZWxsSGVpZ2h0O1xuICAgIC8vIEVuc3VyZSBjb29yZGluYXRlIGRvZXNuJ3QgZXNjYXBlIGNlbGwgYm91bmRzIGFuZCByb3VuZCB0byB0aGUgbmVhcmVzdCAwLjUgdG8gZW5zdXJlIGEgY3Jpc3BcbiAgICAvLyBsaW5lIGF0IDEwMCUgZGV2aWNlUGl4ZWxSYXRpb1xuICAgIGlmIChkb0NsYW1wICYmIHJlc3VsdFt5XSAhPT0gMCkge1xuICAgICAgcmVzdWx0W3ldID0gY2xhbXAoTWF0aC5yb3VuZChyZXN1bHRbeV0gKyAwLjUpIC0gMC41LCBjZWxsSGVpZ2h0LCAwKTtcbiAgICB9XG4gICAgLy8gQXBwbHkgdGhlIGNlbGwncyBvZmZzZXQgKGllLiB4KmNlbGxIZWlnaHQpXG4gICAgcmVzdWx0W3ldICs9IHlPZmZzZXQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5leHBvcnQgY2xhc3MgVHdvS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFZhbHVlPiB7XG4gIHByaXZhdGUgX2RhdGE6IHsgW2JnOiBzdHJpbmcgfCBudW1iZXJdOiB7IFtmZzogc3RyaW5nIHwgbnVtYmVyXTogVFZhbHVlIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWQgfSA9IHt9O1xuXG4gIHB1YmxpYyBzZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB2YWx1ZTogVFZhbHVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRhW2ZpcnN0XSkge1xuICAgICAgdGhpcy5fZGF0YVtmaXJzdF0gPSB7fTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdIVtzZWNvbmRdID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSA/IHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhID0ge307XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZvdXJLZXlNYXA8VEZpcnN0IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUU2Vjb25kIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVGhpcmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRGb3VydGggZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiBUd29LZXlNYXA8VEZpcnN0LCBUU2Vjb25kLCBUd29LZXlNYXA8VFRoaXJkLCBURm91cnRoLCBUVmFsdWU+PiA9IG5ldyBUd29LZXlNYXAoKTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdGhpcmQ6IFRUaGlyZCwgZm91cnRoOiBURm91cnRoLCB2YWx1ZTogVFZhbHVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKSkge1xuICAgICAgdGhpcy5fZGF0YS5zZXQoZmlyc3QsIHNlY29uZCwgbmV3IFR3b0tleU1hcCgpKTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkhLnNldCh0aGlyZCwgZm91cnRoLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdGhpcmQ6IFRUaGlyZCwgZm91cnRoOiBURm91cnRoKTogVFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCk/LmdldCh0aGlyZCwgZm91cnRoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcblxuaW50ZXJmYWNlIElUYXNrUXVldWUge1xuICAvKipcbiAgICogQWRkcyBhIHRhc2sgdG8gdGhlIHF1ZXVlIHdoaWNoIHdpbGwgcnVuIGluIGEgZnV0dXJlIGlkbGUgY2FsbGJhY2suXG4gICAqIFRvIGF2b2lkIHBlcmNlaXZhYmxlIHN0YWxscyBvbiB0aGUgbWFpbnRocmVhZCwgdGFza3Mgd2l0aCBoZWF2eSB3b3JrbG9hZFxuICAgKiBzaG91bGQgc3BsaXQgdGhlaXIgd29yayBpbnRvIHNtYWxsZXIgcGllY2VzIGFuZCByZXR1cm4gYHRydWVgIHRvIGdldFxuICAgKiBjYWxsZWQgYWdhaW4gdW50aWwgdGhlIHdvcmsgaXMgZG9uZSAob24gZmFsc3kgcmV0dXJuIHZhbHVlKS5cbiAgICovXG4gIGVucXVldWUodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBxdWV1ZSwgcnVubmluZyBhbGwgcmVtYWluaW5nIHRhc2tzIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICBmbHVzaCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW55IHJlbWFpbmluZyB0YXNrcyBmcm9tIHRoZSBxdWV1ZSwgdGhlc2Ugd2lsbCBub3QgYmUgcnVuLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElUYXNrRGVhZGxpbmUge1xuICB0aW1lUmVtYWluaW5nKCk6IG51bWJlcjtcbn1cbnR5cGUgQ2FsbGJhY2tXaXRoRGVhZGxpbmUgPSAoZGVhZGxpbmU6IElUYXNrRGVhZGxpbmUpID0+IHZvaWQ7XG5cbmFic3RyYWN0IGNsYXNzIFRhc2tRdWV1ZSBpbXBsZW1lbnRzIElUYXNrUXVldWUge1xuICBwcml2YXRlIF90YXNrczogKCgpID0+IGJvb2xlYW4gfCB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgX2lkbGVDYWxsYmFjaz86IG51bWJlcjtcbiAgcHJpdmF0ZSBfaSA9IDA7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9yZXF1ZXN0Q2FsbGJhY2soY2FsbGJhY2s6IENhbGxiYWNrV2l0aERlYWRsaW5lKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2NhbmNlbENhbGxiYWNrKGlkZW50aWZpZXI6IG51bWJlcik6IHZvaWQ7XG5cbiAgcHVibGljIGVucXVldWUodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl90YXNrcy5wdXNoKHRhc2spO1xuICAgIHRoaXMuX3N0YXJ0KCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuX2kgPCB0aGlzLl90YXNrcy5sZW5ndGgpIHtcbiAgICAgIGlmICghdGhpcy5fdGFza3NbdGhpcy5faV0oKSkge1xuICAgICAgICB0aGlzLl9pKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faWRsZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9jYW5jZWxDYWxsYmFjayh0aGlzLl9pZGxlQ2FsbGJhY2spO1xuICAgICAgdGhpcy5faWRsZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9pID0gMDtcbiAgICB0aGlzLl90YXNrcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pZGxlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2lkbGVDYWxsYmFjayA9IHRoaXMuX3JlcXVlc3RDYWxsYmFjayh0aGlzLl9wcm9jZXNzLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3MoZGVhZGxpbmU6IElUYXNrRGVhZGxpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9pZGxlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHRhc2tEdXJhdGlvbiA9IDA7XG4gICAgbGV0IGxvbmdlc3RUYXNrID0gMDtcbiAgICBsZXQgbGFzdERlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmUudGltZVJlbWFpbmluZygpO1xuICAgIGxldCBkZWFkbGluZVJlbWFpbmluZyA9IDA7XG4gICAgd2hpbGUgKHRoaXMuX2kgPCB0aGlzLl90YXNrcy5sZW5ndGgpIHtcbiAgICAgIHRhc2tEdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgaWYgKCF0aGlzLl90YXNrc1t0aGlzLl9pXSgpKSB7XG4gICAgICAgIHRoaXMuX2krKztcbiAgICAgIH1cbiAgICAgIC8vIG90aGVyIHRoYW4gcGVyZm9ybWFuY2Uubm93LCBwZXJmb3JtYW5jZS5ub3cgbWlnaHQgbm90IGJlIHN0YWJsZSAoY2hhbmdlcyBvbiB3YWxsIGNsb2NrXG4gICAgICAvLyBjaGFuZ2VzKSwgdGhpcyBpcyBub3QgYW4gaXNzdWUgaGVyZSBhcyBhIGNsb2NrIGNoYW5nZSBkdXJpbmcgYSBzaG9ydCBydW5uaW5nIHRhc2sgaXMgdmVyeVxuICAgICAgLy8gdW5saWtlbHkgaW4gY2FzZSBpdCBzdGlsbCBoYXBwZW5lZCBhbmQgbGVhZHMgdG8gbmVnYXRpdmUgZHVyYXRpb24sIHNpbXBseSBhc3N1bWUgMSBtc2VjXG4gICAgICB0YXNrRHVyYXRpb24gPSBNYXRoLm1heCgxLCBwZXJmb3JtYW5jZS5ub3coKSAtIHRhc2tEdXJhdGlvbik7XG4gICAgICBsb25nZXN0VGFzayA9IE1hdGgubWF4KHRhc2tEdXJhdGlvbiwgbG9uZ2VzdFRhc2spO1xuICAgICAgLy8gR3Vlc3MgdGhlIGZvbGxvd2luZyB0YXNrIHdpbGwgdGFrZSBhIHNpbWlsYXIgdGltZSB0byB0aGUgbG9uZ2VzdCB0YXNrIGluIHRoaXMgYmF0Y2gsIGFsbG93XG4gICAgICAvLyBhZGRpdGlvbmFsIHJvb20gdG8gdHJ5IGF2b2lkIGV4Y2VlZGluZyB0aGUgZGVhZGxpbmVcbiAgICAgIGRlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmUudGltZVJlbWFpbmluZygpO1xuICAgICAgaWYgKGxvbmdlc3RUYXNrICogMS41ID4gZGVhZGxpbmVSZW1haW5pbmcpIHtcbiAgICAgICAgLy8gV2FybiB3aGVuIHRoZSB0aW1lIGV4Y2VlZGluZyB0aGUgZGVhZGxpbmUgaXMgb3ZlciAyMG1zLCBpZiB0aGlzIGhhcHBlbnMgaW4gcHJhY3RpY2UgdGhlXG4gICAgICAgIC8vIHRhc2sgc2hvdWxkIGJlIHNwbGl0IGludG8gc3ViLXRhc2tzIHRvIGVuc3VyZSB0aGUgVUkgcmVtYWlucyByZXNwb25zaXZlLlxuICAgICAgICBpZiAobGFzdERlYWRsaW5lUmVtYWluaW5nIC0gdGFza0R1cmF0aW9uIDwgLTIwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGB0YXNrIHF1ZXVlIGV4Y2VlZGVkIGFsbG90dGVkIGRlYWRsaW5lIGJ5ICR7TWF0aC5hYnMoTWF0aC5yb3VuZChsYXN0RGVhZGxpbmVSZW1haW5pbmcgLSB0YXNrRHVyYXRpb24pKX1tc2ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXJ0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxhc3REZWFkbGluZVJlbWFpbmluZyA9IGRlYWRsaW5lUmVtYWluaW5nO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHF1ZXVlIG9mIHRoYXQgcnVucyB0YXNrcyBvdmVyIHNldmVyYWwgdGFza3MgdmlhIHNldFRpbWVvdXQsIHRyeWluZyB0byBtYWludGFpbiBhYm92ZSA2MCBmcmFtZXNcbiAqIHBlciBzZWNvbmQuIFRoZSB0YXNrcyB3aWxsIHJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZW5xdWV1ZWQsIGJ1dCB0aGV5IHdpbGwgcnVuIHNvbWUgdGltZSBsYXRlcixcbiAqIGFuZCBjYXJlIHNob3VsZCBiZSB0YWtlbiB0byBlbnN1cmUgdGhleSdyZSBub24tdXJnZW50IGFuZCB3aWxsIG5vdCBpbnRyb2R1Y2UgcmFjZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUHJpb3JpdHlUYXNrUXVldWUgZXh0ZW5kcyBUYXNrUXVldWUge1xuICBwcm90ZWN0ZWQgX3JlcXVlc3RDYWxsYmFjayhjYWxsYmFjazogQ2FsbGJhY2tXaXRoRGVhZGxpbmUpOiBudW1iZXIge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHRoaXMuX2NyZWF0ZURlYWRsaW5lKDE2KSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYW5jZWxDYWxsYmFjayhpZGVudGlmaWVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoaWRlbnRpZmllcik7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEZWFkbGluZShkdXJhdGlvbjogbnVtYmVyKTogSVRhc2tEZWFkbGluZSB7XG4gICAgY29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KCkgKyBkdXJhdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgdGltZVJlbWFpbmluZzogKCkgPT4gTWF0aC5tYXgoMCwgZW5kIC0gcGVyZm9ybWFuY2Uubm93KCkpXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBJZGxlVGFza1F1ZXVlSW50ZXJuYWwgZXh0ZW5kcyBUYXNrUXVldWUge1xuICBwcm90ZWN0ZWQgX3JlcXVlc3RDYWxsYmFjayhjYWxsYmFjazogSWRsZVJlcXVlc3RDYWxsYmFjayk6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2spO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYW5jZWxDYWxsYmFjayhpZGVudGlmaWVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjYW5jZWxJZGxlQ2FsbGJhY2soaWRlbnRpZmllcik7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHF1ZXVlIG9mIHRoYXQgcnVucyB0YXNrcyBvdmVyIHNldmVyYWwgaWRsZSBjYWxsYmFja3MsIHRyeWluZyB0byByZXNwZWN0IHRoZSBpZGxlIGNhbGxiYWNrJ3NcbiAqIGRlYWRsaW5lIGdpdmVuIGJ5IHRoZSBlbnZpcm9ubWVudC4gVGhlIHRhc2tzIHdpbGwgcnVuIGluIHRoZSBvcmRlciB0aGV5IGFyZSBlbnF1ZXVlZCwgYnV0IHRoZXlcbiAqIHdpbGwgcnVuIHNvbWUgdGltZSBsYXRlciwgYW5kIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIGVuc3VyZSB0aGV5J3JlIG5vbi11cmdlbnQgYW5kIHdpbGwgbm90XG4gKiBpbnRyb2R1Y2UgcmFjZSBjb25kaXRpb25zLlxuICpcbiAqIFRoaXMgcmV2ZXJ0cyB0byBhIHtAbGluayBQcmlvcml0eVRhc2tRdWV1ZX0gaWYgdGhlIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgaWRsZSBjYWxsYmFja3MuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBJZGxlVGFza1F1ZXVlID0gKCFpc05vZGUgJiYgJ3JlcXVlc3RJZGxlQ2FsbGJhY2snIGluIHdpbmRvdykgPyBJZGxlVGFza1F1ZXVlSW50ZXJuYWwgOiBQcmlvcml0eVRhc2tRdWV1ZTtcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCB0cmFja3MgYSBzaW5nbGUgZGVib3VuY2VkIHRhc2sgdGhhdCB3aWxsIHJ1biBvbiB0aGUgbmV4dCBpZGxlIGZyYW1lLiBXaGVuIGNhbGxlZFxuICogbXVsdGlwbGUgdGltZXMsIG9ubHkgdGhlIGxhc3Qgc2V0IHRhc2sgd2lsbCBydW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWJvdW5jZWRJZGxlVGFzayB7XG4gIHByaXZhdGUgX3F1ZXVlOiBJVGFza1F1ZXVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3F1ZXVlID0gbmV3IElkbGVUYXNrUXVldWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9xdWV1ZS5jbGVhcigpO1xuICAgIHRoaXMuX3F1ZXVlLmVucXVldWUodGFzayk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgdGhpcy5fcXVldWUuZmx1c2goKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQXR0cmlidXRlRGF0YSwgSUNvbG9yUkdCLCBJRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBGZ0ZsYWdzLCBCZ0ZsYWdzLCBVbmRlcmxpbmVTdHlsZSwgRXh0RmxhZ3MgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVEYXRhIGltcGxlbWVudHMgSUF0dHJpYnV0ZURhdGEge1xuICBwdWJsaWMgc3RhdGljIHRvQ29sb3JSR0IodmFsdWU6IG51bWJlcik6IElDb2xvclJHQiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHZhbHVlID4+PiBBdHRyaWJ1dGVzLlJFRF9TSElGVCAmIDI1NSxcbiAgICAgIHZhbHVlID4+PiBBdHRyaWJ1dGVzLkdSRUVOX1NISUZUICYgMjU1LFxuICAgICAgdmFsdWUgJiAyNTVcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29sb3JSR0IodmFsdWU6IElDb2xvclJHQik6IG51bWJlciB7XG4gICAgcmV0dXJuICh2YWx1ZVswXSAmIDI1NSkgPDwgQXR0cmlidXRlcy5SRURfU0hJRlQgfCAodmFsdWVbMV0gJiAyNTUpIDw8IEF0dHJpYnV0ZXMuR1JFRU5fU0hJRlQgfCB2YWx1ZVsyXSAmIDI1NTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSgpOiBJQXR0cmlidXRlRGF0YSB7XG4gICAgY29uc3QgbmV3T2JqID0gbmV3IEF0dHJpYnV0ZURhdGEoKTtcbiAgICBuZXdPYmouZmcgPSB0aGlzLmZnO1xuICAgIG5ld09iai5iZyA9IHRoaXMuYmc7XG4gICAgbmV3T2JqLmV4dGVuZGVkID0gdGhpcy5leHRlbmRlZC5jbG9uZSgpO1xuICAgIHJldHVybiBuZXdPYmo7XG4gIH1cblxuICAvLyBkYXRhXG4gIHB1YmxpYyBmZyA9IDA7XG4gIHB1YmxpYyBiZyA9IDA7XG4gIHB1YmxpYyBleHRlbmRlZDogSUV4dGVuZGVkQXR0cnMgPSBuZXcgRXh0ZW5kZWRBdHRycygpO1xuXG4gIC8vIGZsYWdzXG4gIHB1YmxpYyBpc0ludmVyc2UoKTogbnVtYmVyICAgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLklOVkVSU0U7IH1cbiAgcHVibGljIGlzQm9sZCgpOiBudW1iZXIgICAgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuQk9MRDsgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmUoKTogbnVtYmVyICAgICB7XG4gICAgaWYgKHRoaXMuaGFzRXh0ZW5kZWRBdHRycygpICYmIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGUgIT09IFVuZGVybGluZVN0eWxlLk5PTkUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuVU5ERVJMSU5FO1xuICB9XG4gIHB1YmxpYyBpc0JsaW5rKCk6IG51bWJlciAgICAgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLkJMSU5LOyB9XG4gIHB1YmxpYyBpc0ludmlzaWJsZSgpOiBudW1iZXIgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLklOVklTSUJMRTsgfVxuICBwdWJsaWMgaXNJdGFsaWMoKTogbnVtYmVyICAgICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5JVEFMSUM7IH1cbiAgcHVibGljIGlzRGltKCk6IG51bWJlciAgICAgICAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuRElNOyB9XG4gIHB1YmxpYyBpc1N0cmlrZXRocm91Z2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLlNUUklLRVRIUk9VR0g7IH1cbiAgcHVibGljIGlzUHJvdGVjdGVkKCk6IG51bWJlciAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuUFJPVEVDVEVEOyB9XG4gIHB1YmxpYyBpc092ZXJsaW5lKCk6IG51bWJlciAgICAgIHsgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLk9WRVJMSU5FOyB9XG5cbiAgLy8gY29sb3IgbW9kZXNcbiAgcHVibGljIGdldEZnQ29sb3JNb2RlKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLOyB9XG4gIHB1YmxpYyBnZXRCZ0NvbG9yTW9kZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSzsgfVxuICBwdWJsaWMgaXNGZ1JHQigpOiBib29sZWFuICAgICAgIHsgcmV0dXJuICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9SR0I7IH1cbiAgcHVibGljIGlzQmdSR0IoKTogYm9vbGVhbiAgICAgICB7IHJldHVybiAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUkdCOyB9XG4gIHB1YmxpYyBpc0ZnUGFsZXR0ZSgpOiBib29sZWFuICAgeyByZXR1cm4gKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNiB8fCAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NjsgfVxuICBwdWJsaWMgaXNCZ1BhbGV0dGUoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTYgfHwgKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AyNTY7IH1cbiAgcHVibGljIGlzRmdEZWZhdWx0KCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDA7IH1cbiAgcHVibGljIGlzQmdEZWZhdWx0KCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDA7IH1cbiAgcHVibGljIGlzQXR0cmlidXRlRGVmYXVsdCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZmcgPT09IDAgJiYgdGhpcy5iZyA9PT0gMDsgfVxuXG4gIC8vIGNvbG9yc1xuICBwdWJsaWMgZ2V0RmdDb2xvcigpOiBudW1iZXIge1xuICAgIHN3aXRjaCAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuZmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5mZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIENNX0RFRkFVTFQgZGVmYXVsdHMgdG8gLTFcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldEJnQ29sb3IoKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjogIHJldHVybiB0aGlzLmJnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTSztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6ICAgcmV0dXJuIHRoaXMuYmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAvLyBDTV9ERUZBVUxUIGRlZmF1bHRzIHRvIC0xXG4gICAgfVxuICB9XG5cbiAgLy8gZXh0ZW5kZWQgYXR0cnNcbiAgcHVibGljIGhhc0V4dGVuZGVkQXR0cnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVFeHRlbmRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leHRlbmRlZC5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuYmcgJj0gfkJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJnIHw9IEJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lQ29sb3IoKTogbnVtYmVyIHtcbiAgICBpZiAoKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjogIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTSztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmdDb2xvcigpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRGZ0NvbG9yKCk7XG4gIH1cbiAgcHVibGljIGdldFVuZGVybGluZUNvbG9yTW9kZSgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLXG4gICAgICA6IHRoaXMuZ2V0RmdDb2xvck1vZGUoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvclJHQigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3JcbiAgICAgID8gKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1JHQlxuICAgICAgOiB0aGlzLmlzRmdSR0IoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvclBhbGV0dGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTZcbiAgICAgICAgICB8fCAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NlxuICAgICAgOiB0aGlzLmlzRmdQYWxldHRlKCk7XG4gIH1cbiAgcHVibGljIGlzVW5kZXJsaW5lQ29sb3JEZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDBcbiAgICAgIDogdGhpcy5pc0ZnRGVmYXVsdCgpO1xuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVTdHlsZSgpOiBVbmRlcmxpbmVTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLlVOREVSTElORVxuICAgICAgPyAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEID8gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSA6IFVuZGVybGluZVN0eWxlLlNJTkdMRSlcbiAgICAgIDogVW5kZXJsaW5lU3R5bGUuTk9ORTtcbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lVmFyaWFudE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZVZhcmlhbnRPZmZzZXQ7XG4gIH1cbn1cblxuXG4vKipcbiAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGEgY2VsbC5cbiAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGRpZmZlcmVudCB1bmRlcmxpbmUgc3R5bGVzIGFuZCBjb2xvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVuZGVkQXR0cnMgaW1wbGVtZW50cyBJRXh0ZW5kZWRBdHRycyB7XG4gIHByaXZhdGUgX2V4dDogbnVtYmVyID0gMDtcbiAgcHVibGljIGdldCBleHQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fdXJsSWQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9leHQgJiB+RXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFKSB8XG4gICAgICAgICh0aGlzLnVuZGVybGluZVN0eWxlIDw8IDI2KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V4dDtcbiAgfVxuICBwdWJsaWMgc2V0IGV4dCh2YWx1ZTogbnVtYmVyKSB7IHRoaXMuX2V4dCA9IHZhbHVlOyB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVTdHlsZSgpOiBVbmRlcmxpbmVTdHlsZSB7XG4gICAgLy8gQWx3YXlzIHJldHVybiB0aGUgVVJMIHN0eWxlIGlmIGl0IGhhcyBvbmVcbiAgICBpZiAodGhpcy5fdXJsSWQpIHtcbiAgICAgIHJldHVybiBVbmRlcmxpbmVTdHlsZS5EQVNIRUQ7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5fZXh0ICYgRXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFKSA+PiAyNjtcbiAgfVxuICBwdWJsaWMgc2V0IHVuZGVybGluZVN0eWxlKHZhbHVlOiBVbmRlcmxpbmVTdHlsZSkge1xuICAgIHRoaXMuX2V4dCAmPSB+RXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFO1xuICAgIHRoaXMuX2V4dCB8PSAodmFsdWUgPDwgMjYpICYgRXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFO1xuICB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVDb2xvcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leHQgJiAoQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gIH1cbiAgcHVibGljIHNldCB1bmRlcmxpbmVDb2xvcih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXh0ICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgdGhpcy5fZXh0IHw9IHZhbHVlICYgKEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXJsSWQ6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBnZXQgdXJsSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsSWQ7XG4gIH1cbiAgcHVibGljIHNldCB1cmxJZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdXJsSWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5kZXJsaW5lVmFyaWFudE9mZnNldCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbCA9ICh0aGlzLl9leHQgJiBFeHRGbGFncy5WQVJJQU5UX09GRlNFVCkgPj4gMjk7XG4gICAgaWYgKHZhbCA8IDApIHtcbiAgICAgIHJldHVybiB2YWwgXiAweEZGRkZGRkY4O1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHB1YmxpYyBzZXQgdW5kZXJsaW5lVmFyaWFudE9mZnNldCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXh0ICY9IH5FeHRGbGFncy5WQVJJQU5UX09GRlNFVDtcbiAgICB0aGlzLl9leHQgfD0gKHZhbHVlIDw8IDI5KSAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZXh0OiBudW1iZXIgPSAwLFxuICAgIHVybElkOiBudW1iZXIgPSAwXG4gICkge1xuICAgIHRoaXMuX2V4dCA9IGV4dDtcbiAgICB0aGlzLl91cmxJZCA9IHVybElkO1xuICB9XG5cbiAgcHVibGljIGNsb25lKCk6IElFeHRlbmRlZEF0dHJzIHtcbiAgICByZXR1cm4gbmV3IEV4dGVuZGVkQXR0cnModGhpcy5fZXh0LCB0aGlzLl91cmxJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVudCBtZXRob2QgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgb2JqZWN0IGhvbGRzIG5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sXG4gICAqIHRoYXQgbmVlZHMgdG8gYmUgcGVyc2lzdGFudCBpbiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudW5kZXJsaW5lU3R5bGUgPT09IFVuZGVybGluZVN0eWxlLk5PTkUgJiYgdGhpcy5fdXJsSWQgPT09IDA7XG4gIH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5jbGFzcyBOb2RlPEU+IHtcblxuXHRzdGF0aWMgcmVhZG9ubHkgVW5kZWZpbmVkID0gbmV3IE5vZGU8YW55Pih1bmRlZmluZWQpO1xuXG5cdGVsZW1lbnQ6IEU7XG5cdG5leHQ6IE5vZGU8RT47XG5cdHByZXY6IE5vZGU8RT47XG5cblx0Y29uc3RydWN0b3IoZWxlbWVudDogRSkge1xuXHRcdHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cdFx0dGhpcy5uZXh0ID0gTm9kZS5VbmRlZmluZWQ7XG5cdFx0dGhpcy5wcmV2ID0gTm9kZS5VbmRlZmluZWQ7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIExpbmtlZExpc3Q8RT4ge1xuXG5cdHByaXZhdGUgX2ZpcnN0OiBOb2RlPEU+ID0gTm9kZS5VbmRlZmluZWQ7XG5cdHByaXZhdGUgX2xhc3Q6IE5vZGU8RT4gPSBOb2RlLlVuZGVmaW5lZDtcblx0cHJpdmF0ZSBfc2l6ZTogbnVtYmVyID0gMDtcblxuXHRnZXQgc2l6ZSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl9zaXplO1xuXHR9XG5cblx0aXNFbXB0eSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fZmlyc3QgPT09IE5vZGUuVW5kZWZpbmVkO1xuXHR9XG5cblx0Y2xlYXIoKTogdm9pZCB7XG5cdFx0bGV0IG5vZGUgPSB0aGlzLl9maXJzdDtcblx0XHR3aGlsZSAobm9kZSAhPT0gTm9kZS5VbmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IG5leHQgPSBub2RlLm5leHQ7XG5cdFx0XHRub2RlLnByZXYgPSBOb2RlLlVuZGVmaW5lZDtcblx0XHRcdG5vZGUubmV4dCA9IE5vZGUuVW5kZWZpbmVkO1xuXHRcdFx0bm9kZSA9IG5leHQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZmlyc3QgPSBOb2RlLlVuZGVmaW5lZDtcblx0XHR0aGlzLl9sYXN0ID0gTm9kZS5VbmRlZmluZWQ7XG5cdFx0dGhpcy5fc2l6ZSA9IDA7XG5cdH1cblxuXHR1bnNoaWZ0KGVsZW1lbnQ6IEUpOiAoKSA9PiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5faW5zZXJ0KGVsZW1lbnQsIGZhbHNlKTtcblx0fVxuXG5cdHB1c2goZWxlbWVudDogRSk6ICgpID0+IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLl9pbnNlcnQoZWxlbWVudCwgdHJ1ZSk7XG5cdH1cblxuXHRwcml2YXRlIF9pbnNlcnQoZWxlbWVudDogRSwgYXRUaGVFbmQ6IGJvb2xlYW4pOiAoKSA9PiB2b2lkIHtcblx0XHRjb25zdCBuZXdOb2RlID0gbmV3IE5vZGUoZWxlbWVudCk7XG5cdFx0aWYgKHRoaXMuX2ZpcnN0ID09PSBOb2RlLlVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fZmlyc3QgPSBuZXdOb2RlO1xuXHRcdFx0dGhpcy5fbGFzdCA9IG5ld05vZGU7XG5cblx0XHR9IGVsc2UgaWYgKGF0VGhlRW5kKSB7XG5cdFx0XHQvLyBwdXNoXG5cdFx0XHRjb25zdCBvbGRMYXN0ID0gdGhpcy5fbGFzdDtcblx0XHRcdHRoaXMuX2xhc3QgPSBuZXdOb2RlO1xuXHRcdFx0bmV3Tm9kZS5wcmV2ID0gb2xkTGFzdDtcblx0XHRcdG9sZExhc3QubmV4dCA9IG5ld05vZGU7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdW5zaGlmdFxuXHRcdFx0Y29uc3Qgb2xkRmlyc3QgPSB0aGlzLl9maXJzdDtcblx0XHRcdHRoaXMuX2ZpcnN0ID0gbmV3Tm9kZTtcblx0XHRcdG5ld05vZGUubmV4dCA9IG9sZEZpcnN0O1xuXHRcdFx0b2xkRmlyc3QucHJldiA9IG5ld05vZGU7XG5cdFx0fVxuXHRcdHRoaXMuX3NpemUgKz0gMTtcblxuXHRcdGxldCBkaWRSZW1vdmUgPSBmYWxzZTtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0aWYgKCFkaWRSZW1vdmUpIHtcblx0XHRcdFx0ZGlkUmVtb3ZlID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlKG5ld05vZGUpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRzaGlmdCgpOiBFIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fZmlyc3QgPT09IE5vZGUuVW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCByZXMgPSB0aGlzLl9maXJzdC5lbGVtZW50O1xuXHRcdFx0dGhpcy5fcmVtb3ZlKHRoaXMuX2ZpcnN0KTtcblx0XHRcdHJldHVybiByZXM7XG5cdFx0fVxuXHR9XG5cblx0cG9wKCk6IEUgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9sYXN0ID09PSBOb2RlLlVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgcmVzID0gdGhpcy5fbGFzdC5lbGVtZW50O1xuXHRcdFx0dGhpcy5fcmVtb3ZlKHRoaXMuX2xhc3QpO1xuXHRcdFx0cmV0dXJuIHJlcztcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIF9yZW1vdmUobm9kZTogTm9kZTxFPik6IHZvaWQge1xuXHRcdGlmIChub2RlLnByZXYgIT09IE5vZGUuVW5kZWZpbmVkICYmIG5vZGUubmV4dCAhPT0gTm9kZS5VbmRlZmluZWQpIHtcblx0XHRcdC8vIG1pZGRsZVxuXHRcdFx0Y29uc3QgYW5jaG9yID0gbm9kZS5wcmV2O1xuXHRcdFx0YW5jaG9yLm5leHQgPSBub2RlLm5leHQ7XG5cdFx0XHRub2RlLm5leHQucHJldiA9IGFuY2hvcjtcblxuXHRcdH0gZWxzZSBpZiAobm9kZS5wcmV2ID09PSBOb2RlLlVuZGVmaW5lZCAmJiBub2RlLm5leHQgPT09IE5vZGUuVW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBvbmx5IG5vZGVcblx0XHRcdHRoaXMuX2ZpcnN0ID0gTm9kZS5VbmRlZmluZWQ7XG5cdFx0XHR0aGlzLl9sYXN0ID0gTm9kZS5VbmRlZmluZWQ7XG5cblx0XHR9IGVsc2UgaWYgKG5vZGUubmV4dCA9PT0gTm9kZS5VbmRlZmluZWQpIHtcblx0XHRcdC8vIGxhc3Rcblx0XHRcdHRoaXMuX2xhc3QgPSB0aGlzLl9sYXN0LnByZXYhO1xuXHRcdFx0dGhpcy5fbGFzdC5uZXh0ID0gTm9kZS5VbmRlZmluZWQ7XG5cblx0XHR9IGVsc2UgaWYgKG5vZGUucHJldiA9PT0gTm9kZS5VbmRlZmluZWQpIHtcblx0XHRcdC8vIGZpcnN0XG5cdFx0XHR0aGlzLl9maXJzdCA9IHRoaXMuX2ZpcnN0Lm5leHQhO1xuXHRcdFx0dGhpcy5fZmlyc3QucHJldiA9IE5vZGUuVW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIGRvbmVcblx0XHR0aGlzLl9zaXplIC09IDE7XG5cdH1cblxuXHQqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8RT4ge1xuXHRcdGxldCBub2RlID0gdGhpcy5fZmlyc3Q7XG5cdFx0d2hpbGUgKG5vZGUgIT09IE5vZGUuVW5kZWZpbmVkKSB7XG5cdFx0XHR5aWVsZCBub2RlLmVsZW1lbnQ7XG5cdFx0XHRub2RlID0gbm9kZS5uZXh0O1xuXHRcdH1cblx0fVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi8vIGZha2UgZGVmaW5pdGlvbiBzbyB0aGF0IHRoZSB2YWxpZCBsYXllcnMgY2hlY2sgd29uJ3QgdHJpcCBvbiB0aGlzXG5kZWNsYXJlIGNvbnN0IGdsb2JhbFRoaXM6IHsgcGVyZm9ybWFuY2U/OiB7IG5vdygpOiBudW1iZXIgfSB9O1xuXG5jb25zdCBoYXNQZXJmb3JtYW5jZU5vdyA9IChnbG9iYWxUaGlzLnBlcmZvcm1hbmNlICYmIHR5cGVvZiBnbG9iYWxUaGlzLnBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJyk7XG5cbmV4cG9ydCBjbGFzcyBTdG9wV2F0Y2gge1xuXG5cdHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyO1xuXHRwcml2YXRlIF9zdG9wVGltZTogbnVtYmVyO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX25vdzogKCkgPT4gbnVtYmVyO1xuXG5cdHB1YmxpYyBzdGF0aWMgY3JlYXRlKGhpZ2hSZXNvbHV0aW9uPzogYm9vbGVhbik6IFN0b3BXYXRjaCB7XG5cdFx0cmV0dXJuIG5ldyBTdG9wV2F0Y2goaGlnaFJlc29sdXRpb24pO1xuXHR9XG5cblx0Y29uc3RydWN0b3IoaGlnaFJlc29sdXRpb24/OiBib29sZWFuKSB7XG5cdFx0dGhpcy5fbm93ID0gaGFzUGVyZm9ybWFuY2VOb3cgJiYgaGlnaFJlc29sdXRpb24gPT09IGZhbHNlID8gRGF0ZS5ub3cgOiBnbG9iYWxUaGlzLnBlcmZvcm1hbmNlIS5ub3cuYmluZChnbG9iYWxUaGlzLnBlcmZvcm1hbmNlKTtcblx0XHR0aGlzLl9zdGFydFRpbWUgPSB0aGlzLl9ub3coKTtcblx0XHR0aGlzLl9zdG9wVGltZSA9IC0xO1xuXHR9XG5cblx0cHVibGljIHN0b3AoKTogdm9pZCB7XG5cdFx0dGhpcy5fc3RvcFRpbWUgPSB0aGlzLl9ub3coKTtcblx0fVxuXG5cdHB1YmxpYyByZXNldCgpOiB2b2lkIHtcblx0XHR0aGlzLl9zdGFydFRpbWUgPSB0aGlzLl9ub3coKTtcblx0XHR0aGlzLl9zdG9wVGltZSA9IC0xO1xuXHR9XG5cblx0cHVibGljIGVsYXBzZWQoKTogbnVtYmVyIHtcblx0XHRpZiAodGhpcy5fc3RvcFRpbWUgIT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fc3RvcFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9ub3coKSAtIHRoaXMuX3N0YXJ0VGltZTtcblx0fVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IENhbmNlbGxhdGlvblRva2VuIH0gZnJvbSAndnMvYmFzZS9jb21tb24vY2FuY2VsbGF0aW9uJztcbmltcG9ydCB7IG9uVW5leHBlY3RlZEVycm9yIH0gZnJvbSAndnMvYmFzZS9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGNyZWF0ZVNpbmdsZUNhbGxGdW5jdGlvbiB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2Z1bmN0aW9uYWwnO1xuaW1wb3J0IHsgY29tYmluZWREaXNwb3NhYmxlLCBEaXNwb3NhYmxlLCBEaXNwb3NhYmxlTWFwLCBEaXNwb3NhYmxlU3RvcmUsIElEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9saWZlY3ljbGUnO1xuaW1wb3J0IHsgTGlua2VkTGlzdCB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2xpbmtlZExpc3QnO1xuaW1wb3J0IHsgSU9ic2VydmFibGUsIElPYnNlcnZlciB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL29ic2VydmFibGUnO1xuaW1wb3J0IHsgU3RvcFdhdGNoIH0gZnJvbSAndnMvYmFzZS9jb21tb24vc3RvcHdhdGNoJztcbmltcG9ydCB7IE1pY3JvdGFza0RlbGF5IH0gZnJvbSAndnMvYmFzZS9jb21tb24vc3ltYm9scyc7XG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIHByaW50IHdhcm5pbmdzIHdoZW5ldmVyIGEgbGlzdGVuZXIgaXMgR0MnZWQgd2l0aG91dCBoYXZpbmcgYmVlbiBkaXNwb3NlZC4gVGhpcyBpcyBhIExFQUsuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgX2VuYWJsZUxpc3RlbmVyR0NlZFdhcm5pbmcgPSBmYWxzZVxuXHQvLyB8fCBCb29sZWFuKFwiVFJVRVwiKSAvLyBjYXVzZXMgYSBsaW50ZXIgd2FybmluZyBzbyB0aGF0IGl0IGNhbm5vdCBiZSBwdXNoZWRcblx0O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gcHJpbnQgd2FybmluZ3Mgd2hlbmV2ZXIgYW4gZW1pdHRlciB3aXRoIGxpc3RlbmVycyBpcyBkaXNwb3NlZC4gVGhhdCBpcyBhIHNpZ24gb2YgY29kZSBzbWVsbC5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBfZW5hYmxlRGlzcG9zZVdpdGhMaXN0ZW5lcldhcm5pbmcgPSBmYWxzZVxuXHQvLyB8fCBCb29sZWFuKFwiVFJVRVwiKSAvLyBjYXVzZXMgYSBsaW50ZXIgd2FybmluZyBzbyB0aGF0IGl0IGNhbm5vdCBiZSBwdXNoZWRcblx0O1xuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBwcmludCB3YXJuaW5ncyB3aGVuZXZlciBhIHNuYXBzaG90dGVkIGV2ZW50IGlzIHVzZWQgcmVwZWF0ZWRseSB3aXRob3V0IGNsZWFudXAuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC92c2NvZGUvaXNzdWVzLzE0Mjg1MVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IF9lbmFibGVTbmFwc2hvdFBvdGVudGlhbExlYWtXYXJuaW5nID0gZmFsc2Vcblx0Ly8gfHwgQm9vbGVhbihcIlRSVUVcIikgLy8gY2F1c2VzIGEgbGludGVyIHdhcm5pbmcgc28gdGhhdCBpdCBjYW5ub3QgYmUgcHVzaGVkXG5cdDtcblxuLyoqXG4gKiBBbiBldmVudCB3aXRoIHplcm8gb3Igb25lIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc3Vic2NyaWJlZCB0by4gVGhlIGV2ZW50IGlzIGEgZnVuY3Rpb24gaXRzZWxmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50PFQ+IHtcblx0KGxpc3RlbmVyOiAoZTogVCkgPT4gYW55LCB0aGlzQXJncz86IGFueSwgZGlzcG9zYWJsZXM/OiBJRGlzcG9zYWJsZVtdIHwgRGlzcG9zYWJsZVN0b3JlKTogSURpc3Bvc2FibGU7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRXZlbnQge1xuXHRleHBvcnQgY29uc3QgTm9uZTogRXZlbnQ8YW55PiA9ICgpID0+IERpc3Bvc2FibGUuTm9uZTtcblxuXHRmdW5jdGlvbiBfYWRkTGVha2FnZVRyYWNlTG9naWMob3B0aW9uczogRW1pdHRlck9wdGlvbnMpIHtcblx0XHRpZiAoX2VuYWJsZVNuYXBzaG90UG90ZW50aWFsTGVha1dhcm5pbmcpIHtcblx0XHRcdGNvbnN0IHsgb25EaWRBZGRMaXN0ZW5lcjogb3JpZ0xpc3RlbmVyRGlkQWRkIH0gPSBvcHRpb25zO1xuXHRcdFx0Y29uc3Qgc3RhY2sgPSBTdGFja3RyYWNlLmNyZWF0ZSgpO1xuXHRcdFx0bGV0IGNvdW50ID0gMDtcblx0XHRcdG9wdGlvbnMub25EaWRBZGRMaXN0ZW5lciA9ICgpID0+IHtcblx0XHRcdFx0aWYgKCsrY291bnQgPT09IDIpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ3NuYXBzaG90dGVkIGVtaXR0ZXIgTElLRUxZIHVzZWQgcHVibGljIGFuZCBTSE9VTEQgSEFWRSBCRUVOIGNyZWF0ZWQgd2l0aCBEaXNwb3NhYmxlU3RvcmUuIHNuYXBzaG90dGVkIGhlcmUnKTtcblx0XHRcdFx0XHRzdGFjay5wcmludCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9yaWdMaXN0ZW5lckRpZEFkZD8uKCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHaXZlbiBhbiBldmVudCwgcmV0dXJucyBhbm90aGVyIGV2ZW50IHdoaWNoIGRlYm91bmNlcyBjYWxscyBhbmQgZGVmZXJzIHRoZSBsaXN0ZW5lcnMgdG8gYSBsYXRlciB0YXNrIHZpYSBhIHNoYXJlZFxuXHQgKiBgc2V0VGltZW91dGAuIFRoZSBldmVudCBpcyBjb252ZXJ0ZWQgaW50byBhIHNpZ25hbCAoYEV2ZW50PHZvaWQ+YCkgdG8gYXZvaWQgYWRkaXRpb25hbCBvYmplY3QgY3JlYXRpb24gYXMgYVxuXHQgKiByZXN1bHQgb2YgbWVyZ2luZyBldmVudHMgYW5kIHRvIHRyeSBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB0aGF0IGNvdWxkIGFyaXNlIHdoZW4gdXNpbmcgcmVsYXRlZCBkZWZlcnJlZCBhbmRcblx0ICogbm9uLWRlZmVycmVkIGV2ZW50cy5cblx0ICpcblx0ICogVGhpcyBpcyB1c2VmdWwgZm9yIGRlZmVycmluZyBub24tY3JpdGljYWwgd29yayAoZWcuIGdlbmVyYWwgVUkgdXBkYXRlcykgdG8gZW5zdXJlIGl0IGRvZXMgbm90IGJsb2NrIGNyaXRpY2FsIHdvcmtcblx0ICogKGVnLiBsYXRlbmN5IG9mIGtleXByZXNzIHRvIHRleHQgcmVuZGVyZWQpLlxuXHQgKlxuXHQgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuXHQgKiBldmVudCBpcyBhY2Nlc3NpYmxlIHRvIFwidGhpcmQgcGFydGllc1wiLCBlLmcgdGhlIGV2ZW50IGlzIGEgcHVibGljIHByb3BlcnR5LiBPdGhlcndpc2UgYSBsZWFrZWQgbGlzdGVuZXIgb24gdGhlXG5cdCAqIHJldHVybmVkIGV2ZW50IGNhdXNlcyB0aGlzIHV0aWxpdHkgdG8gbGVhayBhIGxpc3RlbmVyIG9uIHRoZSBvcmlnaW5hbCBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzb3VyY2UgZm9yIHRoZSBuZXcgZXZlbnQuXG5cdCAqIEBwYXJhbSBkaXNwb3NhYmxlIEEgZGlzcG9zYWJsZSBzdG9yZSB0byBhZGQgdGhlIG5ldyBFdmVudEVtaXR0ZXIgdG8uXG5cdCAqL1xuXHRleHBvcnQgZnVuY3Rpb24gZGVmZXIoZXZlbnQ6IEV2ZW50PHVua25vd24+LCBkaXNwb3NhYmxlPzogRGlzcG9zYWJsZVN0b3JlKTogRXZlbnQ8dm9pZD4ge1xuXHRcdHJldHVybiBkZWJvdW5jZTx1bmtub3duLCB2b2lkPihldmVudCwgKCkgPT4gdm9pZCAwLCAwLCB1bmRlZmluZWQsIHRydWUsIHVuZGVmaW5lZCwgZGlzcG9zYWJsZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2l2ZW4gYW4gZXZlbnQsIHJldHVybnMgYW5vdGhlciBldmVudCB3aGljaCBvbmx5IGZpcmVzIG9uY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc291cmNlIGZvciB0aGUgbmV3IGV2ZW50LlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIG9uY2U8VD4oZXZlbnQ6IEV2ZW50PFQ+KTogRXZlbnQ8VD4ge1xuXHRcdHJldHVybiAobGlzdGVuZXIsIHRoaXNBcmdzID0gbnVsbCwgZGlzcG9zYWJsZXM/KSA9PiB7XG5cdFx0XHQvLyB3ZSBuZWVkIHRoaXMsIGluIGNhc2UgdGhlIGV2ZW50IGZpcmVzIGR1cmluZyB0aGUgbGlzdGVuZXIgY2FsbFxuXHRcdFx0bGV0IGRpZEZpcmUgPSBmYWxzZTtcblx0XHRcdGxldCByZXN1bHQ6IElEaXNwb3NhYmxlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXHRcdFx0cmVzdWx0ID0gZXZlbnQoZSA9PiB7XG5cdFx0XHRcdGlmIChkaWRGaXJlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJlc3VsdCkge1xuXHRcdFx0XHRcdHJlc3VsdC5kaXNwb3NlKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGlkRmlyZSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbGlzdGVuZXIuY2FsbCh0aGlzQXJncywgZSk7XG5cdFx0XHR9LCBudWxsLCBkaXNwb3NhYmxlcyk7XG5cblx0XHRcdGlmIChkaWRGaXJlKSB7XG5cdFx0XHRcdHJlc3VsdC5kaXNwb3NlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXBzIGFuIGV2ZW50IG9mIG9uZSB0eXBlIGludG8gYW4gZXZlbnQgb2YgYW5vdGhlciB0eXBlIHVzaW5nIGEgbWFwcGluZyBmdW5jdGlvbiwgc2ltaWxhciB0byBob3dcblx0ICogYEFycmF5LnByb3RvdHlwZS5tYXBgIHdvcmtzLlxuXHQgKlxuXHQgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuXHQgKiBldmVudCBpcyBhY2Nlc3NpYmxlIHRvIFwidGhpcmQgcGFydGllc1wiLCBlLmcgdGhlIGV2ZW50IGlzIGEgcHVibGljIHByb3BlcnR5LiBPdGhlcndpc2UgYSBsZWFrZWQgbGlzdGVuZXIgb24gdGhlXG5cdCAqIHJldHVybmVkIGV2ZW50IGNhdXNlcyB0aGlzIHV0aWxpdHkgdG8gbGVhayBhIGxpc3RlbmVyIG9uIHRoZSBvcmlnaW5hbCBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzb3VyY2UgZm9yIHRoZSBuZXcgZXZlbnQuXG5cdCAqIEBwYXJhbSBtYXAgVGhlIG1hcHBpbmcgZnVuY3Rpb24uXG5cdCAqIEBwYXJhbSBkaXNwb3NhYmxlIEEgZGlzcG9zYWJsZSBzdG9yZSB0byBhZGQgdGhlIG5ldyBFdmVudEVtaXR0ZXIgdG8uXG5cdCAqL1xuXHRleHBvcnQgZnVuY3Rpb24gbWFwPEksIE8+KGV2ZW50OiBFdmVudDxJPiwgbWFwOiAoaTogSSkgPT4gTywgZGlzcG9zYWJsZT86IERpc3Bvc2FibGVTdG9yZSk6IEV2ZW50PE8+IHtcblx0XHRyZXR1cm4gc25hcHNob3QoKGxpc3RlbmVyLCB0aGlzQXJncyA9IG51bGwsIGRpc3Bvc2FibGVzPykgPT4gZXZlbnQoaSA9PiBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBtYXAoaSkpLCBudWxsLCBkaXNwb3NhYmxlcyksIGRpc3Bvc2FibGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdyYXBzIGFuIGV2ZW50IGluIGFub3RoZXIgZXZlbnQgdGhhdCBwZXJmb3JtcyBzb21lIGZ1bmN0aW9uIG9uIHRoZSBldmVudCBvYmplY3QgYmVmb3JlIGZpcmluZy5cblx0ICpcblx0ICogKk5PVEUqIHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGBFdmVudGAgYW5kIGl0IE1VU1QgYmUgY2FsbGVkIHdpdGggYSBgRGlzcG9zYWJsZVN0b3JlYCB3aGVuZXZlciB0aGUgcmV0dXJuZWRcblx0ICogZXZlbnQgaXMgYWNjZXNzaWJsZSB0byBcInRoaXJkIHBhcnRpZXNcIiwgZS5nIHRoZSBldmVudCBpcyBhIHB1YmxpYyBwcm9wZXJ0eS4gT3RoZXJ3aXNlIGEgbGVha2VkIGxpc3RlbmVyIG9uIHRoZVxuXHQgKiByZXR1cm5lZCBldmVudCBjYXVzZXMgdGhpcyB1dGlsaXR5IHRvIGxlYWsgYSBsaXN0ZW5lciBvbiB0aGUgb3JpZ2luYWwgZXZlbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc291cmNlIGZvciB0aGUgbmV3IGV2ZW50LlxuXHQgKiBAcGFyYW0gZWFjaCBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgZXZlbnQgb2JqZWN0LlxuXHQgKiBAcGFyYW0gZGlzcG9zYWJsZSBBIGRpc3Bvc2FibGUgc3RvcmUgdG8gYWRkIHRoZSBuZXcgRXZlbnRFbWl0dGVyIHRvLlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2g8ST4oZXZlbnQ6IEV2ZW50PEk+LCBlYWNoOiAoaTogSSkgPT4gdm9pZCwgZGlzcG9zYWJsZT86IERpc3Bvc2FibGVTdG9yZSk6IEV2ZW50PEk+IHtcblx0XHRyZXR1cm4gc25hcHNob3QoKGxpc3RlbmVyLCB0aGlzQXJncyA9IG51bGwsIGRpc3Bvc2FibGVzPykgPT4gZXZlbnQoaSA9PiB7IGVhY2goaSk7IGxpc3RlbmVyLmNhbGwodGhpc0FyZ3MsIGkpOyB9LCBudWxsLCBkaXNwb3NhYmxlcyksIGRpc3Bvc2FibGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdyYXBzIGFuIGV2ZW50IGluIGFub3RoZXIgZXZlbnQgdGhhdCBmaXJlcyBvbmx5IHdoZW4gc29tZSBjb25kaXRpb24gaXMgbWV0LlxuXHQgKlxuXHQgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuXHQgKiBldmVudCBpcyBhY2Nlc3NpYmxlIHRvIFwidGhpcmQgcGFydGllc1wiLCBlLmcgdGhlIGV2ZW50IGlzIGEgcHVibGljIHByb3BlcnR5LiBPdGhlcndpc2UgYSBsZWFrZWQgbGlzdGVuZXIgb24gdGhlXG5cdCAqIHJldHVybmVkIGV2ZW50IGNhdXNlcyB0aGlzIHV0aWxpdHkgdG8gbGVhayBhIGxpc3RlbmVyIG9uIHRoZSBvcmlnaW5hbCBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzb3VyY2UgZm9yIHRoZSBuZXcgZXZlbnQuXG5cdCAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgdGhlIGNvbmRpdGlvbi4gVGhlIGV2ZW50IHdpbGwgZmlyZSBmb3IgdGhlIG9iamVjdCBpZiB0aGlzIGZ1bmN0aW9uXG5cdCAqIHJldHVybnMgdHJ1ZS5cblx0ICogQHBhcmFtIGRpc3Bvc2FibGUgQSBkaXNwb3NhYmxlIHN0b3JlIHRvIGFkZCB0aGUgbmV3IEV2ZW50RW1pdHRlciB0by5cblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VCwgVT4oZXZlbnQ6IEV2ZW50PFQgfCBVPiwgZmlsdGVyOiAoZTogVCB8IFUpID0+IGUgaXMgVCwgZGlzcG9zYWJsZT86IERpc3Bvc2FibGVTdG9yZSk6IEV2ZW50PFQ+O1xuXHRleHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQ+KGV2ZW50OiBFdmVudDxUPiwgZmlsdGVyOiAoZTogVCkgPT4gYm9vbGVhbiwgZGlzcG9zYWJsZT86IERpc3Bvc2FibGVTdG9yZSk6IEV2ZW50PFQ+O1xuXHRleHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQsIFI+KGV2ZW50OiBFdmVudDxUIHwgUj4sIGZpbHRlcjogKGU6IFQgfCBSKSA9PiBlIGlzIFIsIGRpc3Bvc2FibGU/OiBEaXNwb3NhYmxlU3RvcmUpOiBFdmVudDxSPjtcblx0ZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxUPihldmVudDogRXZlbnQ8VD4sIGZpbHRlcjogKGU6IFQpID0+IGJvb2xlYW4sIGRpc3Bvc2FibGU/OiBEaXNwb3NhYmxlU3RvcmUpOiBFdmVudDxUPiB7XG5cdFx0cmV0dXJuIHNuYXBzaG90KChsaXN0ZW5lciwgdGhpc0FyZ3MgPSBudWxsLCBkaXNwb3NhYmxlcz8pID0+IGV2ZW50KGUgPT4gZmlsdGVyKGUpICYmIGxpc3RlbmVyLmNhbGwodGhpc0FyZ3MsIGUpLCBudWxsLCBkaXNwb3NhYmxlcyksIGRpc3Bvc2FibGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdpdmVuIGFuIGV2ZW50LCByZXR1cm5zIHRoZSBzYW1lIGV2ZW50IGJ1dCB0eXBlZCBhcyBgRXZlbnQ8dm9pZD5gLlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbDxUPihldmVudDogRXZlbnQ8VD4pOiBFdmVudDx2b2lkPiB7XG5cdFx0cmV0dXJuIGV2ZW50IGFzIEV2ZW50PGFueT4gYXMgRXZlbnQ8dm9pZD47XG5cdH1cblxuXHQvKipcblx0ICogR2l2ZW4gYSBjb2xsZWN0aW9uIG9mIGV2ZW50cywgcmV0dXJucyBhIHNpbmdsZSBldmVudCB3aGljaCBlbWl0cyB3aGVuZXZlciBhbnkgb2YgdGhlIHByb3ZpZGVkIGV2ZW50cyBlbWl0LlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGFueTxUPiguLi5ldmVudHM6IEV2ZW50PFQ+W10pOiBFdmVudDxUPjtcblx0ZXhwb3J0IGZ1bmN0aW9uIGFueSguLi5ldmVudHM6IEV2ZW50PGFueT5bXSk6IEV2ZW50PHZvaWQ+O1xuXHRleHBvcnQgZnVuY3Rpb24gYW55PFQ+KC4uLmV2ZW50czogRXZlbnQ8VD5bXSk6IEV2ZW50PFQ+IHtcblx0XHRyZXR1cm4gKGxpc3RlbmVyLCB0aGlzQXJncyA9IG51bGwsIGRpc3Bvc2FibGVzPykgPT4ge1xuXHRcdFx0Y29uc3QgZGlzcG9zYWJsZSA9IGNvbWJpbmVkRGlzcG9zYWJsZSguLi5ldmVudHMubWFwKGV2ZW50ID0+IGV2ZW50KGUgPT4gbGlzdGVuZXIuY2FsbCh0aGlzQXJncywgZSkpKSk7XG5cdFx0XHRyZXR1cm4gYWRkQW5kUmV0dXJuRGlzcG9zYWJsZShkaXNwb3NhYmxlLCBkaXNwb3NhYmxlcyk7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuXHQgKiBldmVudCBpcyBhY2Nlc3NpYmxlIHRvIFwidGhpcmQgcGFydGllc1wiLCBlLmcgdGhlIGV2ZW50IGlzIGEgcHVibGljIHByb3BlcnR5LiBPdGhlcndpc2UgYSBsZWFrZWQgbGlzdGVuZXIgb24gdGhlXG5cdCAqIHJldHVybmVkIGV2ZW50IGNhdXNlcyB0aGlzIHV0aWxpdHkgdG8gbGVhayBhIGxpc3RlbmVyIG9uIHRoZSBvcmlnaW5hbCBldmVudC5cblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiByZWR1Y2U8SSwgTz4oZXZlbnQ6IEV2ZW50PEk+LCBtZXJnZTogKGxhc3Q6IE8gfCB1bmRlZmluZWQsIGV2ZW50OiBJKSA9PiBPLCBpbml0aWFsPzogTywgZGlzcG9zYWJsZT86IERpc3Bvc2FibGVTdG9yZSk6IEV2ZW50PE8+IHtcblx0XHRsZXQgb3V0cHV0OiBPIHwgdW5kZWZpbmVkID0gaW5pdGlhbDtcblxuXHRcdHJldHVybiBtYXA8SSwgTz4oZXZlbnQsIGUgPT4ge1xuXHRcdFx0b3V0cHV0ID0gbWVyZ2Uob3V0cHV0LCBlKTtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSwgZGlzcG9zYWJsZSk7XG5cdH1cblxuXHRmdW5jdGlvbiBzbmFwc2hvdDxUPihldmVudDogRXZlbnQ8VD4sIGRpc3Bvc2FibGU6IERpc3Bvc2FibGVTdG9yZSB8IHVuZGVmaW5lZCk6IEV2ZW50PFQ+IHtcblx0XHRsZXQgbGlzdGVuZXI6IElEaXNwb3NhYmxlIHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3Qgb3B0aW9uczogRW1pdHRlck9wdGlvbnMgfCB1bmRlZmluZWQgPSB7XG5cdFx0XHRvbldpbGxBZGRGaXJzdExpc3RlbmVyKCkge1xuXHRcdFx0XHRsaXN0ZW5lciA9IGV2ZW50KGVtaXR0ZXIuZmlyZSwgZW1pdHRlcik7XG5cdFx0XHR9LFxuXHRcdFx0b25EaWRSZW1vdmVMYXN0TGlzdGVuZXIoKSB7XG5cdFx0XHRcdGxpc3RlbmVyPy5kaXNwb3NlKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmICghZGlzcG9zYWJsZSkge1xuXHRcdFx0X2FkZExlYWthZ2VUcmFjZUxvZ2ljKG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVtaXR0ZXIgPSBuZXcgRW1pdHRlcjxUPihvcHRpb25zKTtcblxuXHRcdGRpc3Bvc2FibGU/LmFkZChlbWl0dGVyKTtcblxuXHRcdHJldHVybiBlbWl0dGVyLmV2ZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgdGhlIElEaXNwb3NhYmxlIHRvIHRoZSBzdG9yZSBpZiBpdCdzIHNldCwgYW5kIHJldHVybnMgaXQuIFVzZWZ1bCB0b1xuXHQgKiBFdmVudCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIGFkZEFuZFJldHVybkRpc3Bvc2FibGU8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkOiBULCBzdG9yZTogRGlzcG9zYWJsZVN0b3JlIHwgSURpc3Bvc2FibGVbXSB8IHVuZGVmaW5lZCk6IFQge1xuXHRcdGlmIChzdG9yZSBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdFx0XHRzdG9yZS5wdXNoKGQpO1xuXHRcdH0gZWxzZSBpZiAoc3RvcmUpIHtcblx0XHRcdHN0b3JlLmFkZChkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGQ7XG5cdH1cblxuXHQvKipcblx0ICogR2l2ZW4gYW4gZXZlbnQsIGNyZWF0ZXMgYSBuZXcgZW1pdHRlciB0aGF0IGV2ZW50IHRoYXQgd2lsbCBkZWJvdW5jZSBldmVudHMgYmFzZWQgb24ge0BsaW5rIGRlbGF5fSBhbmQgZ2l2ZSBhblxuXHQgKiBhcnJheSBldmVudCBvYmplY3Qgb2YgYWxsIGV2ZW50cyB0aGF0IGZpcmVkLlxuXHQgKlxuXHQgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuXHQgKiBldmVudCBpcyBhY2Nlc3NpYmxlIHRvIFwidGhpcmQgcGFydGllc1wiLCBlLmcgdGhlIGV2ZW50IGlzIGEgcHVibGljIHByb3BlcnR5LiBPdGhlcndpc2UgYSBsZWFrZWQgbGlzdGVuZXIgb24gdGhlXG5cdCAqIHJldHVybmVkIGV2ZW50IGNhdXNlcyB0aGlzIHV0aWxpdHkgdG8gbGVhayBhIGxpc3RlbmVyIG9uIHRoZSBvcmlnaW5hbCBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudCB0byBkZWJvdW5jZS5cblx0ICogQHBhcmFtIG1lcmdlIEEgZnVuY3Rpb24gdGhhdCByZWR1Y2VzIGFsbCBldmVudHMgaW50byBhIHNpbmdsZSBldmVudC5cblx0ICogQHBhcmFtIGRlbGF5IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlYm91bmNlLlxuXHQgKiBAcGFyYW0gbGVhZGluZyBXaGV0aGVyIHRvIGZpcmUgYSBsZWFkaW5nIGV2ZW50IHdpdGhvdXQgZGVib3VuY2luZy5cblx0ICogQHBhcmFtIGZsdXNoT25MaXN0ZW5lclJlbW92ZSBXaGV0aGVyIHRvIGZpcmUgYWxsIGRlYm91bmNlZCBldmVudHMgd2hlbiBhIGxpc3RlbmVyIGlzIHJlbW92ZWQuIElmIHRoaXMgaXMgbm90XG5cdCAqIHNwZWNpZmllZCwgc29tZSBldmVudHMgY291bGQgZ28gbWlzc2luZy4gVXNlIHRoaXMgaWYgaXQncyBpbXBvcnRhbnQgdGhhdCBhbGwgZXZlbnRzIGFyZSBwcm9jZXNzZWQsIGV2ZW4gaWYgdGhlXG5cdCAqIGxpc3RlbmVyIGdldHMgZGlzcG9zZWQgYmVmb3JlIHRoZSBkZWJvdW5jZWQgZXZlbnQgZmlyZXMuXG5cdCAqIEBwYXJhbSBsZWFrV2FybmluZ1RocmVzaG9sZCBTZWUge0BsaW5rIEVtaXR0ZXJPcHRpb25zLmxlYWtXYXJuaW5nVGhyZXNob2xkfS5cblx0ICogQHBhcmFtIGRpc3Bvc2FibGUgQSBkaXNwb3NhYmxlIHN0b3JlIHRvIHJlZ2lzdGVyIHRoZSBkZWJvdW5jZSBlbWl0dGVyIHRvLlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlPFQ+KGV2ZW50OiBFdmVudDxUPiwgbWVyZ2U6IChsYXN0OiBUIHwgdW5kZWZpbmVkLCBldmVudDogVCkgPT4gVCwgZGVsYXk/OiBudW1iZXIgfCB0eXBlb2YgTWljcm90YXNrRGVsYXksIGxlYWRpbmc/OiBib29sZWFuLCBmbHVzaE9uTGlzdGVuZXJSZW1vdmU/OiBib29sZWFuLCBsZWFrV2FybmluZ1RocmVzaG9sZD86IG51bWJlciwgZGlzcG9zYWJsZT86IERpc3Bvc2FibGVTdG9yZSk6IEV2ZW50PFQ+O1xuXHRleHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8SSwgTz4oZXZlbnQ6IEV2ZW50PEk+LCBtZXJnZTogKGxhc3Q6IE8gfCB1bmRlZmluZWQsIGV2ZW50OiBJKSA9PiBPLCBkZWxheT86IG51bWJlciB8IHR5cGVvZiBNaWNyb3Rhc2tEZWxheSwgbGVhZGluZz86IGJvb2xlYW4sIGZsdXNoT25MaXN0ZW5lclJlbW92ZT86IGJvb2xlYW4sIGxlYWtXYXJuaW5nVGhyZXNob2xkPzogbnVtYmVyLCBkaXNwb3NhYmxlPzogRGlzcG9zYWJsZVN0b3JlKTogRXZlbnQ8Tz47XG5cdGV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZTxJLCBPPihldmVudDogRXZlbnQ8ST4sIG1lcmdlOiAobGFzdDogTyB8IHVuZGVmaW5lZCwgZXZlbnQ6IEkpID0+IE8sIGRlbGF5OiBudW1iZXIgfCB0eXBlb2YgTWljcm90YXNrRGVsYXkgPSAxMDAsIGxlYWRpbmcgPSBmYWxzZSwgZmx1c2hPbkxpc3RlbmVyUmVtb3ZlID0gZmFsc2UsIGxlYWtXYXJuaW5nVGhyZXNob2xkPzogbnVtYmVyLCBkaXNwb3NhYmxlPzogRGlzcG9zYWJsZVN0b3JlKTogRXZlbnQ8Tz4ge1xuXHRcdGxldCBzdWJzY3JpcHRpb246IElEaXNwb3NhYmxlO1xuXHRcdGxldCBvdXRwdXQ6IE8gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdFx0bGV0IGhhbmRsZTogYW55ID0gdW5kZWZpbmVkO1xuXHRcdGxldCBudW1EZWJvdW5jZWRDYWxscyA9IDA7XG5cdFx0bGV0IGRvRmlyZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3Qgb3B0aW9uczogRW1pdHRlck9wdGlvbnMgfCB1bmRlZmluZWQgPSB7XG5cdFx0XHRsZWFrV2FybmluZ1RocmVzaG9sZCxcblx0XHRcdG9uV2lsbEFkZEZpcnN0TGlzdGVuZXIoKSB7XG5cdFx0XHRcdHN1YnNjcmlwdGlvbiA9IGV2ZW50KGN1ciA9PiB7XG5cdFx0XHRcdFx0bnVtRGVib3VuY2VkQ2FsbHMrKztcblx0XHRcdFx0XHRvdXRwdXQgPSBtZXJnZShvdXRwdXQsIGN1cik7XG5cblx0XHRcdFx0XHRpZiAobGVhZGluZyAmJiAhaGFuZGxlKSB7XG5cdFx0XHRcdFx0XHRlbWl0dGVyLmZpcmUob3V0cHV0KTtcblx0XHRcdFx0XHRcdG91dHB1dCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRkb0ZpcmUgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBfb3V0cHV0ID0gb3V0cHV0O1xuXHRcdFx0XHRcdFx0b3V0cHV0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0aGFuZGxlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0aWYgKCFsZWFkaW5nIHx8IG51bURlYm91bmNlZENhbGxzID4gMSkge1xuXHRcdFx0XHRcdFx0XHRlbWl0dGVyLmZpcmUoX291dHB1dCEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bnVtRGVib3VuY2VkQ2FsbHMgPSAwO1xuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KGhhbmRsZSk7XG5cdFx0XHRcdFx0XHRoYW5kbGUgPSBzZXRUaW1lb3V0KGRvRmlyZSwgZGVsYXkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoaGFuZGxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0aGFuZGxlID0gMDtcblx0XHRcdFx0XHRcdFx0cXVldWVNaWNyb3Rhc2soZG9GaXJlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdG9uV2lsbFJlbW92ZUxpc3RlbmVyKCkge1xuXHRcdFx0XHRpZiAoZmx1c2hPbkxpc3RlbmVyUmVtb3ZlICYmIG51bURlYm91bmNlZENhbGxzID4gMCkge1xuXHRcdFx0XHRcdGRvRmlyZT8uKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcigpIHtcblx0XHRcdFx0ZG9GaXJlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRzdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoIWRpc3Bvc2FibGUpIHtcblx0XHRcdF9hZGRMZWFrYWdlVHJhY2VMb2dpYyhvcHRpb25zKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbWl0dGVyID0gbmV3IEVtaXR0ZXI8Tz4ob3B0aW9ucyk7XG5cblx0XHRkaXNwb3NhYmxlPy5hZGQoZW1pdHRlcik7XG5cblx0XHRyZXR1cm4gZW1pdHRlci5ldmVudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWJvdW5jZXMgYW4gZXZlbnQsIGZpcmluZyBhZnRlciBzb21lIGRlbGF5IChkZWZhdWx0PTApIHdpdGggYW4gYXJyYXkgb2YgYWxsIGV2ZW50IG9yaWdpbmFsIG9iamVjdHMuXG5cdCAqXG5cdCAqICpOT1RFKiB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBgRXZlbnRgIGFuZCBpdCBNVVNUIGJlIGNhbGxlZCB3aXRoIGEgYERpc3Bvc2FibGVTdG9yZWAgd2hlbmV2ZXIgdGhlIHJldHVybmVkXG5cdCAqIGV2ZW50IGlzIGFjY2Vzc2libGUgdG8gXCJ0aGlyZCBwYXJ0aWVzXCIsIGUuZyB0aGUgZXZlbnQgaXMgYSBwdWJsaWMgcHJvcGVydHkuIE90aGVyd2lzZSBhIGxlYWtlZCBsaXN0ZW5lciBvbiB0aGVcblx0ICogcmV0dXJuZWQgZXZlbnQgY2F1c2VzIHRoaXMgdXRpbGl0eSB0byBsZWFrIGEgbGlzdGVuZXIgb24gdGhlIG9yaWdpbmFsIGV2ZW50LlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGFjY3VtdWxhdGU8VD4oZXZlbnQ6IEV2ZW50PFQ+LCBkZWxheTogbnVtYmVyID0gMCwgZGlzcG9zYWJsZT86IERpc3Bvc2FibGVTdG9yZSk6IEV2ZW50PFRbXT4ge1xuXHRcdHJldHVybiBFdmVudC5kZWJvdW5jZTxULCBUW10+KGV2ZW50LCAobGFzdCwgZSkgPT4ge1xuXHRcdFx0aWYgKCFsYXN0KSB7XG5cdFx0XHRcdHJldHVybiBbZV07XG5cdFx0XHR9XG5cdFx0XHRsYXN0LnB1c2goZSk7XG5cdFx0XHRyZXR1cm4gbGFzdDtcblx0XHR9LCBkZWxheSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIGRpc3Bvc2FibGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZpbHRlcnMgYW4gZXZlbnQgc3VjaCB0aGF0IHNvbWUgY29uZGl0aW9uIGlzIF9ub3RfIG1ldCBtb3JlIHRoYW4gb25jZSBpbiBhIHJvdywgZWZmZWN0aXZlbHkgZW5zdXJpbmcgZHVwbGljYXRlXG5cdCAqIGV2ZW50IG9iamVjdHMgZnJvbSBkaWZmZXJlbnQgc291cmNlcyBkbyBub3QgZmlyZSB0aGUgc2FtZSBldmVudCBvYmplY3QuXG5cdCAqXG5cdCAqICpOT1RFKiB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBgRXZlbnRgIGFuZCBpdCBNVVNUIGJlIGNhbGxlZCB3aXRoIGEgYERpc3Bvc2FibGVTdG9yZWAgd2hlbmV2ZXIgdGhlIHJldHVybmVkXG5cdCAqIGV2ZW50IGlzIGFjY2Vzc2libGUgdG8gXCJ0aGlyZCBwYXJ0aWVzXCIsIGUuZyB0aGUgZXZlbnQgaXMgYSBwdWJsaWMgcHJvcGVydHkuIE90aGVyd2lzZSBhIGxlYWtlZCBsaXN0ZW5lciBvbiB0aGVcblx0ICogcmV0dXJuZWQgZXZlbnQgY2F1c2VzIHRoaXMgdXRpbGl0eSB0byBsZWFrIGEgbGlzdGVuZXIgb24gdGhlIG9yaWdpbmFsIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNvdXJjZSBmb3IgdGhlIG5ldyBldmVudC5cblx0ICogQHBhcmFtIGVxdWFscyBUaGUgZXF1YWxpdHkgY29uZGl0aW9uLlxuXHQgKiBAcGFyYW0gZGlzcG9zYWJsZSBBIGRpc3Bvc2FibGUgc3RvcmUgdG8gYWRkIHRoZSBuZXcgRXZlbnRFbWl0dGVyIHRvLlxuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBgYGBcblx0ICogLy8gRmlyZSBvbmx5IG9uZSB0aW1lIHdoZW4gYSBzaW5nbGUgd2luZG93IGlzIG9wZW5lZCBvciBmb2N1c2VkXG5cdCAqIEV2ZW50LmxhdGNoKEV2ZW50LmFueShvbkRpZE9wZW5XaW5kb3csIG9uRGlkRm9jdXNXaW5kb3cpKVxuXHQgKiBgYGBcblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiBsYXRjaDxUPihldmVudDogRXZlbnQ8VD4sIGVxdWFsczogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW4gPSAoYSwgYikgPT4gYSA9PT0gYiwgZGlzcG9zYWJsZT86IERpc3Bvc2FibGVTdG9yZSk6IEV2ZW50PFQ+IHtcblx0XHRsZXQgZmlyc3RDYWxsID0gdHJ1ZTtcblx0XHRsZXQgY2FjaGU6IFQ7XG5cblx0XHRyZXR1cm4gZmlsdGVyKGV2ZW50LCB2YWx1ZSA9PiB7XG5cdFx0XHRjb25zdCBzaG91bGRFbWl0ID0gZmlyc3RDYWxsIHx8ICFlcXVhbHModmFsdWUsIGNhY2hlKTtcblx0XHRcdGZpcnN0Q2FsbCA9IGZhbHNlO1xuXHRcdFx0Y2FjaGUgPSB2YWx1ZTtcblx0XHRcdHJldHVybiBzaG91bGRFbWl0O1xuXHRcdH0sIGRpc3Bvc2FibGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNwbGl0cyBhbiBldmVudCB3aG9zZSBwYXJhbWV0ZXIgaXMgYSB1bmlvbiB0eXBlIGludG8gMiBzZXBhcmF0ZSBldmVudHMgZm9yIGVhY2ggdHlwZSBpbiB0aGUgdW5pb24uXG5cdCAqXG5cdCAqICpOT1RFKiB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBgRXZlbnRgIGFuZCBpdCBNVVNUIGJlIGNhbGxlZCB3aXRoIGEgYERpc3Bvc2FibGVTdG9yZWAgd2hlbmV2ZXIgdGhlIHJldHVybmVkXG5cdCAqIGV2ZW50IGlzIGFjY2Vzc2libGUgdG8gXCJ0aGlyZCBwYXJ0aWVzXCIsIGUuZyB0aGUgZXZlbnQgaXMgYSBwdWJsaWMgcHJvcGVydHkuIE90aGVyd2lzZSBhIGxlYWtlZCBsaXN0ZW5lciBvbiB0aGVcblx0ICogcmV0dXJuZWQgZXZlbnQgY2F1c2VzIHRoaXMgdXRpbGl0eSB0byBsZWFrIGEgbGlzdGVuZXIgb24gdGhlIG9yaWdpbmFsIGV2ZW50LlxuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBgYGBcblx0ICogY29uc3QgZXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IHVuZGVmaW5lZD4oKS5ldmVudDtcblx0ICogY29uc3QgW251bWJlckV2ZW50LCB1bmRlZmluZWRFdmVudF0gPSBFdmVudC5zcGxpdChldmVudCwgaXNVbmRlZmluZWQpO1xuXHQgKiBgYGBcblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzb3VyY2UgZm9yIHRoZSBuZXcgZXZlbnQuXG5cdCAqIEBwYXJhbSBpc1QgQSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hhdCBldmVudCBpcyBvZiB0aGUgZmlyc3QgdHlwZS5cblx0ICogQHBhcmFtIGRpc3Bvc2FibGUgQSBkaXNwb3NhYmxlIHN0b3JlIHRvIGFkZCB0aGUgbmV3IEV2ZW50RW1pdHRlciB0by5cblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiBzcGxpdDxULCBVPihldmVudDogRXZlbnQ8VCB8IFU+LCBpc1Q6IChlOiBUIHwgVSkgPT4gZSBpcyBULCBkaXNwb3NhYmxlPzogRGlzcG9zYWJsZVN0b3JlKTogW0V2ZW50PFQ+LCBFdmVudDxVPl0ge1xuXHRcdHJldHVybiBbXG5cdFx0XHRFdmVudC5maWx0ZXIoZXZlbnQsIGlzVCwgZGlzcG9zYWJsZSksXG5cdFx0XHRFdmVudC5maWx0ZXIoZXZlbnQsIGUgPT4gIWlzVChlKSwgZGlzcG9zYWJsZSkgYXMgRXZlbnQ8VT4sXG5cdFx0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWZmZXJzIGFuIGV2ZW50IHVudGlsIGl0IGhhcyBhIGxpc3RlbmVyIGF0dGFjaGVkLlxuXHQgKlxuXHQgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuXHQgKiBldmVudCBpcyBhY2Nlc3NpYmxlIHRvIFwidGhpcmQgcGFydGllc1wiLCBlLmcgdGhlIGV2ZW50IGlzIGEgcHVibGljIHByb3BlcnR5LiBPdGhlcndpc2UgYSBsZWFrZWQgbGlzdGVuZXIgb24gdGhlXG5cdCAqIHJldHVybmVkIGV2ZW50IGNhdXNlcyB0aGlzIHV0aWxpdHkgdG8gbGVhayBhIGxpc3RlbmVyIG9uIHRoZSBvcmlnaW5hbCBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzb3VyY2UgZm9yIHRoZSBuZXcgZXZlbnQuXG5cdCAqIEBwYXJhbSBmbHVzaEFmdGVyVGltZW91dCBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZmx1c2ggdGhlIGJ1ZmZlciBhZnRlciBhIHRpbWVvdXQgaW1tZWRpYXRlbHkgb3IgYWZ0ZXIgYVxuXHQgKiBgc2V0VGltZW91dGAgd2hlbiB0aGUgZmlyc3QgZXZlbnQgbGlzdGVuZXIgaXMgYWRkZWQuXG5cdCAqIEBwYXJhbSBfYnVmZmVyIEludGVybmFsOiBBIHNvdXJjZSBldmVudCBhcnJheSB1c2VkIGZvciB0ZXN0cy5cblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogYGBgXG5cdCAqIC8vIFN0YXJ0IGFjY3VtdWxhdGluZyBldmVudHMsIHdoZW4gdGhlIGZpcnN0IGxpc3RlbmVyIGlzIGF0dGFjaGVkLCBmbHVzaFxuXHQgKiAvLyB0aGUgZXZlbnQgYWZ0ZXIgYSB0aW1lb3V0IHN1Y2ggdGhhdCBtdWx0aXBsZSBsaXN0ZW5lcnMgYXR0YWNoZWQgYmVmb3JlXG5cdCAqIC8vIHRoZSB0aW1lb3V0IHdvdWxkIHJlY2VpdmUgdGhlIGV2ZW50XG5cdCAqIHRoaXMub25JbnN0YWxsRXh0ZW5zaW9uID0gRXZlbnQuYnVmZmVyKHNlcnZpY2Uub25JbnN0YWxsRXh0ZW5zaW9uLCB0cnVlKTtcblx0ICogYGBgXG5cdCAqL1xuXHRleHBvcnQgZnVuY3Rpb24gYnVmZmVyPFQ+KGV2ZW50OiBFdmVudDxUPiwgZmx1c2hBZnRlclRpbWVvdXQgPSBmYWxzZSwgX2J1ZmZlcjogVFtdID0gW10sIGRpc3Bvc2FibGU/OiBEaXNwb3NhYmxlU3RvcmUpOiBFdmVudDxUPiB7XG5cdFx0bGV0IGJ1ZmZlcjogVFtdIHwgbnVsbCA9IF9idWZmZXIuc2xpY2UoKTtcblxuXHRcdGxldCBsaXN0ZW5lcjogSURpc3Bvc2FibGUgfCBudWxsID0gZXZlbnQoZSA9PiB7XG5cdFx0XHRpZiAoYnVmZmVyKSB7XG5cdFx0XHRcdGJ1ZmZlci5wdXNoKGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZW1pdHRlci5maXJlKGUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGRpc3Bvc2FibGUpIHtcblx0XHRcdGRpc3Bvc2FibGUuYWRkKGxpc3RlbmVyKTtcblx0XHR9XG5cblx0XHRjb25zdCBmbHVzaCA9ICgpID0+IHtcblx0XHRcdGJ1ZmZlcj8uZm9yRWFjaChlID0+IGVtaXR0ZXIuZmlyZShlKSk7XG5cdFx0XHRidWZmZXIgPSBudWxsO1xuXHRcdH07XG5cblx0XHRjb25zdCBlbWl0dGVyID0gbmV3IEVtaXR0ZXI8VD4oe1xuXHRcdFx0b25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpIHtcblx0XHRcdFx0aWYgKCFsaXN0ZW5lcikge1xuXHRcdFx0XHRcdGxpc3RlbmVyID0gZXZlbnQoZSA9PiBlbWl0dGVyLmZpcmUoZSkpO1xuXHRcdFx0XHRcdGlmIChkaXNwb3NhYmxlKSB7XG5cdFx0XHRcdFx0XHRkaXNwb3NhYmxlLmFkZChsaXN0ZW5lcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRvbkRpZEFkZEZpcnN0TGlzdGVuZXIoKSB7XG5cdFx0XHRcdGlmIChidWZmZXIpIHtcblx0XHRcdFx0XHRpZiAoZmx1c2hBZnRlclRpbWVvdXQpIHtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoZmx1c2gpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRmbHVzaCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0b25EaWRSZW1vdmVMYXN0TGlzdGVuZXIoKSB7XG5cdFx0XHRcdGlmIChsaXN0ZW5lcikge1xuXHRcdFx0XHRcdGxpc3RlbmVyLmRpc3Bvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaXN0ZW5lciA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAoZGlzcG9zYWJsZSkge1xuXHRcdFx0ZGlzcG9zYWJsZS5hZGQoZW1pdHRlcik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVtaXR0ZXIuZXZlbnQ7XG5cdH1cblx0LyoqXG5cdCAqIFdyYXBzIHRoZSBldmVudCBpbiBhbiB7QGxpbmsgSUNoYWluYWJsZUV2ZW50fSwgYWxsb3dpbmcgYSBtb3JlIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgc3R5bGUuXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYFxuXHQgKiAvLyBOb3JtYWxcblx0ICogY29uc3Qgb25FbnRlclByZXNzTm9ybWFsID0gRXZlbnQuZmlsdGVyKFxuXHQgKiAgIEV2ZW50Lm1hcChvbktleVByZXNzLmV2ZW50LCBlID0+IG5ldyBTdGFuZGFyZEtleWJvYXJkRXZlbnQoZSkpLFxuXHQgKiAgIGUua2V5Q29kZSA9PT0gS2V5Q29kZS5FbnRlclxuXHQgKiApLmV2ZW50O1xuXHQgKlxuXHQgKiAvLyBVc2luZyBjaGFpblxuXHQgKiBjb25zdCBvbkVudGVyUHJlc3NDaGFpbiA9IEV2ZW50LmNoYWluKG9uS2V5UHJlc3MuZXZlbnQsICQgPT4gJFxuXHQgKiAgIC5tYXAoZSA9PiBuZXcgU3RhbmRhcmRLZXlib2FyZEV2ZW50KGUpKVxuXHQgKiAgIC5maWx0ZXIoZSA9PiBlLmtleUNvZGUgPT09IEtleUNvZGUuRW50ZXIpXG5cdCAqICk7XG5cdCAqIGBgYFxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGNoYWluPFQsIFI+KGV2ZW50OiBFdmVudDxUPiwgc3l0aGVuc2l6ZTogKCQ6IElDaGFpbmFibGVTeXRoZW5zaXM8VD4pID0+IElDaGFpbmFibGVTeXRoZW5zaXM8Uj4pOiBFdmVudDxSPiB7XG5cdFx0Y29uc3QgZm46IEV2ZW50PFI+ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcblx0XHRcdGNvbnN0IGNzID0gc3l0aGVuc2l6ZShuZXcgQ2hhaW5hYmxlU3ludGhlc2lzKCkpIGFzIENoYWluYWJsZVN5bnRoZXNpcztcblx0XHRcdHJldHVybiBldmVudChmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gY3MuZXZhbHVhdGUodmFsdWUpO1xuXHRcdFx0XHRpZiAocmVzdWx0ICE9PSBIYWx0Q2hhaW5hYmxlKSB7XG5cdFx0XHRcdFx0bGlzdGVuZXIuY2FsbCh0aGlzQXJncywgcmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdW5kZWZpbmVkLCBkaXNwb3NhYmxlcyk7XG5cdFx0fTtcblxuXHRcdHJldHVybiBmbjtcblx0fVxuXG5cdGNvbnN0IEhhbHRDaGFpbmFibGUgPSBTeW1ib2woJ0hhbHRDaGFpbmFibGUnKTtcblxuXHRjbGFzcyBDaGFpbmFibGVTeW50aGVzaXMgaW1wbGVtZW50cyBJQ2hhaW5hYmxlU3l0aGVuc2lzPGFueT4ge1xuXHRcdHByaXZhdGUgcmVhZG9ubHkgc3RlcHM6ICgoaW5wdXQ6IGFueSkgPT4gYW55KVtdID0gW107XG5cblx0XHRtYXA8Tz4oZm46IChpOiBhbnkpID0+IE8pOiB0aGlzIHtcblx0XHRcdHRoaXMuc3RlcHMucHVzaChmbik7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRmb3JFYWNoKGZuOiAoaTogYW55KSA9PiB2b2lkKTogdGhpcyB7XG5cdFx0XHR0aGlzLnN0ZXBzLnB1c2godiA9PiB7XG5cdFx0XHRcdGZuKHYpO1xuXHRcdFx0XHRyZXR1cm4gdjtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0ZmlsdGVyKGZuOiAoZTogYW55KSA9PiBib29sZWFuKTogdGhpcyB7XG5cdFx0XHR0aGlzLnN0ZXBzLnB1c2godiA9PiBmbih2KSA/IHYgOiBIYWx0Q2hhaW5hYmxlKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHJlZHVjZTxSPihtZXJnZTogKGxhc3Q6IFIgfCB1bmRlZmluZWQsIGV2ZW50OiBhbnkpID0+IFIsIGluaXRpYWw/OiBSIHwgdW5kZWZpbmVkKTogdGhpcyB7XG5cdFx0XHRsZXQgbGFzdCA9IGluaXRpYWw7XG5cdFx0XHR0aGlzLnN0ZXBzLnB1c2godiA9PiB7XG5cdFx0XHRcdGxhc3QgPSBtZXJnZShsYXN0LCB2KTtcblx0XHRcdFx0cmV0dXJuIGxhc3Q7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGxhdGNoKGVxdWFsczogKGE6IGFueSwgYjogYW55KSA9PiBib29sZWFuID0gKGEsIGIpID0+IGEgPT09IGIpOiBDaGFpbmFibGVTeW50aGVzaXMge1xuXHRcdFx0bGV0IGZpcnN0Q2FsbCA9IHRydWU7XG5cdFx0XHRsZXQgY2FjaGU6IGFueTtcblx0XHRcdHRoaXMuc3RlcHMucHVzaCh2YWx1ZSA9PiB7XG5cdFx0XHRcdGNvbnN0IHNob3VsZEVtaXQgPSBmaXJzdENhbGwgfHwgIWVxdWFscyh2YWx1ZSwgY2FjaGUpO1xuXHRcdFx0XHRmaXJzdENhbGwgPSBmYWxzZTtcblx0XHRcdFx0Y2FjaGUgPSB2YWx1ZTtcblx0XHRcdFx0cmV0dXJuIHNob3VsZEVtaXQgPyB2YWx1ZSA6IEhhbHRDaGFpbmFibGU7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0cHVibGljIGV2YWx1YXRlKHZhbHVlOiBhbnkpIHtcblx0XHRcdGZvciAoY29uc3Qgc3RlcCBvZiB0aGlzLnN0ZXBzKSB7XG5cdFx0XHRcdHZhbHVlID0gc3RlcCh2YWx1ZSk7XG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gSGFsdENoYWluYWJsZSkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRleHBvcnQgaW50ZXJmYWNlIElDaGFpbmFibGVTeXRoZW5zaXM8VD4ge1xuXHRcdG1hcDxPPihmbjogKGk6IFQpID0+IE8pOiBJQ2hhaW5hYmxlU3l0aGVuc2lzPE8+O1xuXHRcdGZvckVhY2goZm46IChpOiBUKSA9PiB2b2lkKTogSUNoYWluYWJsZVN5dGhlbnNpczxUPjtcblx0XHRmaWx0ZXI8UiBleHRlbmRzIFQ+KGZuOiAoZTogVCkgPT4gZSBpcyBSKTogSUNoYWluYWJsZVN5dGhlbnNpczxSPjtcblx0XHRmaWx0ZXIoZm46IChlOiBUKSA9PiBib29sZWFuKTogSUNoYWluYWJsZVN5dGhlbnNpczxUPjtcblx0XHRyZWR1Y2U8Uj4obWVyZ2U6IChsYXN0OiBSLCBldmVudDogVCkgPT4gUiwgaW5pdGlhbDogUik6IElDaGFpbmFibGVTeXRoZW5zaXM8Uj47XG5cdFx0cmVkdWNlPFI+KG1lcmdlOiAobGFzdDogUiB8IHVuZGVmaW5lZCwgZXZlbnQ6IFQpID0+IFIpOiBJQ2hhaW5hYmxlU3l0aGVuc2lzPFI+O1xuXHRcdGxhdGNoKGVxdWFscz86IChhOiBULCBiOiBUKSA9PiBib29sZWFuKTogSUNoYWluYWJsZVN5dGhlbnNpczxUPjtcblx0fVxuXG5cdGV4cG9ydCBpbnRlcmZhY2UgTm9kZUV2ZW50RW1pdHRlciB7XG5cdFx0b24oZXZlbnQ6IHN0cmluZyB8IHN5bWJvbCwgbGlzdGVuZXI6IEZ1bmN0aW9uKTogdW5rbm93bjtcblx0XHRyZW1vdmVMaXN0ZW5lcihldmVudDogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB1bmtub3duO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4ge0BsaW5rIEV2ZW50fSBmcm9tIGEgbm9kZSBldmVudCBlbWl0dGVyLlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGZyb21Ob2RlRXZlbnRFbWl0dGVyPFQ+KGVtaXR0ZXI6IE5vZGVFdmVudEVtaXR0ZXIsIGV2ZW50TmFtZTogc3RyaW5nLCBtYXA6ICguLi5hcmdzOiBhbnlbXSkgPT4gVCA9IGlkID0+IGlkKTogRXZlbnQ8VD4ge1xuXHRcdGNvbnN0IGZuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiByZXN1bHQuZmlyZShtYXAoLi4uYXJncykpO1xuXHRcdGNvbnN0IG9uRmlyc3RMaXN0ZW5lckFkZCA9ICgpID0+IGVtaXR0ZXIub24oZXZlbnROYW1lLCBmbik7XG5cdFx0Y29uc3Qgb25MYXN0TGlzdGVuZXJSZW1vdmUgPSAoKSA9PiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZm4pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBFbWl0dGVyPFQ+KHsgb25XaWxsQWRkRmlyc3RMaXN0ZW5lcjogb25GaXJzdExpc3RlbmVyQWRkLCBvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjogb25MYXN0TGlzdGVuZXJSZW1vdmUgfSk7XG5cblx0XHRyZXR1cm4gcmVzdWx0LmV2ZW50O1xuXHR9XG5cblx0ZXhwb3J0IGludGVyZmFjZSBET01FdmVudEVtaXR0ZXIge1xuXHRcdGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQ6IHN0cmluZyB8IHN5bWJvbCwgbGlzdGVuZXI6IEZ1bmN0aW9uKTogdm9pZDtcblx0XHRyZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50OiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiB7QGxpbmsgRXZlbnR9IGZyb20gYSBET00gZXZlbnQgZW1pdHRlci5cblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiBmcm9tRE9NRXZlbnRFbWl0dGVyPFQ+KGVtaXR0ZXI6IERPTUV2ZW50RW1pdHRlciwgZXZlbnROYW1lOiBzdHJpbmcsIG1hcDogKC4uLmFyZ3M6IGFueVtdKSA9PiBUID0gaWQgPT4gaWQpOiBFdmVudDxUPiB7XG5cdFx0Y29uc3QgZm4gPSAoLi4uYXJnczogYW55W10pID0+IHJlc3VsdC5maXJlKG1hcCguLi5hcmdzKSk7XG5cdFx0Y29uc3Qgb25GaXJzdExpc3RlbmVyQWRkID0gKCkgPT4gZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZm4pO1xuXHRcdGNvbnN0IG9uTGFzdExpc3RlbmVyUmVtb3ZlID0gKCkgPT4gZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZm4pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBFbWl0dGVyPFQ+KHsgb25XaWxsQWRkRmlyc3RMaXN0ZW5lcjogb25GaXJzdExpc3RlbmVyQWRkLCBvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjogb25MYXN0TGlzdGVuZXJSZW1vdmUgfSk7XG5cblx0XHRyZXR1cm4gcmVzdWx0LmV2ZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBwcm9taXNlIG91dCBvZiBhbiBldmVudCwgdXNpbmcgdGhlIHtAbGluayBFdmVudC5vbmNlfSBoZWxwZXIuXG5cdCAqL1xuXHRleHBvcnQgZnVuY3Rpb24gdG9Qcm9taXNlPFQ+KGV2ZW50OiBFdmVudDxUPik6IFByb21pc2U8VD4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IG9uY2UoZXZlbnQpKHJlc29sdmUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGV2ZW50IG91dCBvZiBhIHByb21pc2UgdGhhdCBmaXJlcyBvbmNlIHdoZW4gdGhlIHByb21pc2UgaXNcblx0ICogcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBwcm9taXNlIG9yIGB1bmRlZmluZWRgLlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGZyb21Qcm9taXNlPFQ+KHByb21pc2U6IFByb21pc2U8VD4pOiBFdmVudDxUIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gbmV3IEVtaXR0ZXI8VCB8IHVuZGVmaW5lZD4oKTtcblxuXHRcdHByb21pc2UudGhlbihyZXMgPT4ge1xuXHRcdFx0cmVzdWx0LmZpcmUocmVzKTtcblx0XHR9LCAoKSA9PiB7XG5cdFx0XHRyZXN1bHQuZmlyZSh1bmRlZmluZWQpO1xuXHRcdH0pLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0cmVzdWx0LmRpc3Bvc2UoKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiByZXN1bHQuZXZlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZm9yd2FyZGluZyBhbiBldmVudCB0byBhbm90aGVyIGVtaXR0ZXIgd2hpY2hcblx0ICogaW1wcm92ZXMgcmVhZGFiaWxpdHkuYWxsb3dzIEV2ZW50LmZvcndhcmQoZXZlbnQsIGVtaXR0ZXIpIGluc3RlYWQgb2YgYGV2ZW50KGUgPT4gZW1pdHRlci5maXJlKGUpKWAuXG5cdCAqIEBwYXJhbSBmcm9tIFRoZSBldmVudCB0byBmb3J3YXJkLlxuXHQgKiBAcGFyYW0gdG8gVGhlIGVtaXR0ZXIgdG8gZm9yd2FyZCB0aGUgZXZlbnQgdG8uXG5cdCAqIEBleGFtcGxlXG5cdCAqIEV2ZW50LmZvcndhcmQoZXZlbnQsIGVtaXR0ZXIpO1xuXHQgKiAvLyBlcXVpdmFsZW50IHRvXG5cdCAqIGV2ZW50KGUgPT4gZW1pdHRlci5maXJlKGUpKTtcblx0ICogLy8gZXF1aXZhbGVudCB0b1xuXHQgKiBldmVudChlbWl0dGVyLmZpcmUsIGVtaXR0ZXIpO1xuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmQ8VD4oZnJvbTogRXZlbnQ8VD4sIHRvOiBFbWl0dGVyPFQ+KTogSURpc3Bvc2FibGUge1xuXHRcdHJldHVybiBmcm9tKGUgPT4gdG8uZmlyZShlKSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIGxpc3RlbmVyIHRvIGFuIGV2ZW50IGFuZCBjYWxscyB0aGUgbGlzdGVuZXIgaW1tZWRpYXRlbHkgd2l0aCB1bmRlZmluZWQgYXMgdGhlIGV2ZW50IG9iamVjdC5cblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogYGBgXG5cdCAqIC8vIEluaXRpYWxpemUgdGhlIFVJIGFuZCB1cGRhdGUgaXQgd2hlbiBkYXRhQ2hhbmdlRXZlbnQgZmlyZXNcblx0ICogcnVuQW5kU3Vic2NyaWJlKGRhdGFDaGFuZ2VFdmVudCwgKCkgPT4gdGhpcy5fdXBkYXRlVUkoKSk7XG5cdCAqIGBgYFxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogRXZlbnQ8VD4sIGhhbmRsZXI6IChlOiBUKSA9PiBhbnksIGluaXRpYWw6IFQpOiBJRGlzcG9zYWJsZTtcblx0ZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogRXZlbnQ8VD4sIGhhbmRsZXI6IChlOiBUIHwgdW5kZWZpbmVkKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcblx0ZXhwb3J0IGZ1bmN0aW9uIHJ1bkFuZFN1YnNjcmliZTxUPihldmVudDogRXZlbnQ8VD4sIGhhbmRsZXI6IChlOiBUIHwgdW5kZWZpbmVkKSA9PiBhbnksIGluaXRpYWw/OiBUKTogSURpc3Bvc2FibGUge1xuXHRcdGhhbmRsZXIoaW5pdGlhbCk7XG5cdFx0cmV0dXJuIGV2ZW50KGUgPT4gaGFuZGxlcihlKSk7XG5cdH1cblxuXHRjbGFzcyBFbWl0dGVyT2JzZXJ2ZXI8VD4gaW1wbGVtZW50cyBJT2JzZXJ2ZXIge1xuXG5cdFx0cmVhZG9ubHkgZW1pdHRlcjogRW1pdHRlcjxUPjtcblxuXHRcdHByaXZhdGUgX2NvdW50ZXIgPSAwO1xuXHRcdHByaXZhdGUgX2hhc0NoYW5nZWQgPSBmYWxzZTtcblxuXHRcdGNvbnN0cnVjdG9yKHJlYWRvbmx5IF9vYnNlcnZhYmxlOiBJT2JzZXJ2YWJsZTxULCBhbnk+LCBzdG9yZTogRGlzcG9zYWJsZVN0b3JlIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBvcHRpb25zOiBFbWl0dGVyT3B0aW9ucyA9IHtcblx0XHRcdFx0b25XaWxsQWRkRmlyc3RMaXN0ZW5lcjogKCkgPT4ge1xuXHRcdFx0XHRcdF9vYnNlcnZhYmxlLmFkZE9ic2VydmVyKHRoaXMpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjogKCkgPT4ge1xuXHRcdFx0XHRcdF9vYnNlcnZhYmxlLnJlbW92ZU9ic2VydmVyKHRoaXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0aWYgKCFzdG9yZSkge1xuXHRcdFx0XHRfYWRkTGVha2FnZVRyYWNlTG9naWMob3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcjxUPihvcHRpb25zKTtcblx0XHRcdGlmIChzdG9yZSkge1xuXHRcdFx0XHRzdG9yZS5hZGQodGhpcy5lbWl0dGVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRiZWdpblVwZGF0ZTxUPihfb2JzZXJ2YWJsZTogSU9ic2VydmFibGU8VCwgdm9pZD4pOiB2b2lkIHtcblx0XHRcdC8vIGFzc2VydChfb2JzZXJ2YWJsZSA9PT0gdGhpcy5vYnMpO1xuXHRcdFx0dGhpcy5fY291bnRlcisrO1xuXHRcdH1cblxuXHRcdGhhbmRsZVBvc3NpYmxlQ2hhbmdlPFQ+KF9vYnNlcnZhYmxlOiBJT2JzZXJ2YWJsZTxULCB1bmtub3duPik6IHZvaWQge1xuXHRcdFx0Ly8gYXNzZXJ0KF9vYnNlcnZhYmxlID09PSB0aGlzLm9icyk7XG5cdFx0fVxuXG5cdFx0aGFuZGxlQ2hhbmdlPFQsIFRDaGFuZ2U+KF9vYnNlcnZhYmxlOiBJT2JzZXJ2YWJsZTxULCBUQ2hhbmdlPiwgX2NoYW5nZTogVENoYW5nZSk6IHZvaWQge1xuXHRcdFx0Ly8gYXNzZXJ0KF9vYnNlcnZhYmxlID09PSB0aGlzLm9icyk7XG5cdFx0XHR0aGlzLl9oYXNDaGFuZ2VkID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRlbmRVcGRhdGU8VD4oX29ic2VydmFibGU6IElPYnNlcnZhYmxlPFQsIHZvaWQ+KTogdm9pZCB7XG5cdFx0XHQvLyBhc3NlcnQoX29ic2VydmFibGUgPT09IHRoaXMub2JzKTtcblx0XHRcdHRoaXMuX2NvdW50ZXItLTtcblx0XHRcdGlmICh0aGlzLl9jb3VudGVyID09PSAwKSB7XG5cdFx0XHRcdHRoaXMuX29ic2VydmFibGUucmVwb3J0Q2hhbmdlcygpO1xuXHRcdFx0XHRpZiAodGhpcy5faGFzQ2hhbmdlZCkge1xuXHRcdFx0XHRcdHRoaXMuX2hhc0NoYW5nZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR0aGlzLmVtaXR0ZXIuZmlyZSh0aGlzLl9vYnNlcnZhYmxlLmdldCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGV2ZW50IGVtaXR0ZXIgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSBvYnNlcnZhYmxlIGNoYW5nZXMuXG5cdCAqIEVhY2ggbGlzdGVuZXJzIHN1YnNjcmliZXMgdG8gdGhlIGVtaXR0ZXIuXG5cdCAqL1xuXHRleHBvcnQgZnVuY3Rpb24gZnJvbU9ic2VydmFibGU8VD4ob2JzOiBJT2JzZXJ2YWJsZTxULCBhbnk+LCBzdG9yZT86IERpc3Bvc2FibGVTdG9yZSk6IEV2ZW50PFQ+IHtcblx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBFbWl0dGVyT2JzZXJ2ZXIob2JzLCBzdG9yZSk7XG5cdFx0cmV0dXJuIG9ic2VydmVyLmVtaXR0ZXIuZXZlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogRWFjaCBsaXN0ZW5lciBpcyBhdHRhY2hlZCB0byB0aGUgb2JzZXJ2YWJsZSBkaXJlY3RseS5cblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiBmcm9tT2JzZXJ2YWJsZUxpZ2h0KG9ic2VydmFibGU6IElPYnNlcnZhYmxlPGFueT4pOiBFdmVudDx2b2lkPiB7XG5cdFx0cmV0dXJuIChsaXN0ZW5lciwgdGhpc0FyZ3MsIGRpc3Bvc2FibGVzKSA9PiB7XG5cdFx0XHRsZXQgY291bnQgPSAwO1xuXHRcdFx0bGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuXHRcdFx0Y29uc3Qgb2JzZXJ2ZXI6IElPYnNlcnZlciA9IHtcblx0XHRcdFx0YmVnaW5VcGRhdGUoKSB7XG5cdFx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0fSxcblx0XHRcdFx0ZW5kVXBkYXRlKCkge1xuXHRcdFx0XHRcdGNvdW50LS07XG5cdFx0XHRcdFx0aWYgKGNvdW50ID09PSAwKSB7XG5cdFx0XHRcdFx0XHRvYnNlcnZhYmxlLnJlcG9ydENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdGlmIChkaWRDaGFuZ2UpIHtcblx0XHRcdFx0XHRcdFx0ZGlkQ2hhbmdlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGxpc3RlbmVyLmNhbGwodGhpc0FyZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0aGFuZGxlUG9zc2libGVDaGFuZ2UoKSB7XG5cdFx0XHRcdFx0Ly8gbm9vcFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRoYW5kbGVDaGFuZ2UoKSB7XG5cdFx0XHRcdFx0ZGlkQ2hhbmdlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9ic2VydmFibGUuYWRkT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuXHRcdFx0b2JzZXJ2YWJsZS5yZXBvcnRDaGFuZ2VzKCk7XG5cdFx0XHRjb25zdCBkaXNwb3NhYmxlID0ge1xuXHRcdFx0XHRkaXNwb3NlKCkge1xuXHRcdFx0XHRcdG9ic2VydmFibGUucmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoZGlzcG9zYWJsZXMgaW5zdGFuY2VvZiBEaXNwb3NhYmxlU3RvcmUpIHtcblx0XHRcdFx0ZGlzcG9zYWJsZXMuYWRkKGRpc3Bvc2FibGUpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuXHRcdFx0XHRkaXNwb3NhYmxlcy5wdXNoKGRpc3Bvc2FibGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGlzcG9zYWJsZTtcblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1pdHRlck9wdGlvbnMge1xuXHQvKipcblx0ICogT3B0aW9uYWwgZnVuY3Rpb24gdGhhdCdzIGNhbGxlZCAqYmVmb3JlKiB0aGUgdmVyeSBmaXJzdCBsaXN0ZW5lciBpcyBhZGRlZFxuXHQgKi9cblx0b25XaWxsQWRkRmlyc3RMaXN0ZW5lcj86IEZ1bmN0aW9uO1xuXHQvKipcblx0ICogT3B0aW9uYWwgZnVuY3Rpb24gdGhhdCdzIGNhbGxlZCAqYWZ0ZXIqIHRoZSB2ZXJ5IGZpcnN0IGxpc3RlbmVyIGlzIGFkZGVkXG5cdCAqL1xuXHRvbkRpZEFkZEZpcnN0TGlzdGVuZXI/OiBGdW5jdGlvbjtcblx0LyoqXG5cdCAqIE9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQncyBjYWxsZWQgYWZ0ZXIgYSBsaXN0ZW5lciBpcyBhZGRlZFxuXHQgKi9cblx0b25EaWRBZGRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xuXHQvKipcblx0ICogT3B0aW9uYWwgZnVuY3Rpb24gdGhhdCdzIGNhbGxlZCAqYWZ0ZXIqIHJlbW92ZSB0aGUgdmVyeSBsYXN0IGxpc3RlbmVyXG5cdCAqL1xuXHRvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcj86IEZ1bmN0aW9uO1xuXHQvKipcblx0ICogT3B0aW9uYWwgZnVuY3Rpb24gdGhhdCdzIGNhbGxlZCAqYmVmb3JlKiBhIGxpc3RlbmVyIGlzIHJlbW92ZWRcblx0ICovXG5cdG9uV2lsbFJlbW92ZUxpc3RlbmVyPzogRnVuY3Rpb247XG5cdC8qKlxuXHQgKiBPcHRpb25hbCBmdW5jdGlvbiB0aGF0J3MgY2FsbGVkIHdoZW4gYSBsaXN0ZW5lciB0aHJvd3MgYW4gZXJyb3IuIERlZmF1bHRzIHRvXG5cdCAqIHtAbGluayBvblVuZXhwZWN0ZWRFcnJvcn1cblx0ICovXG5cdG9uTGlzdGVuZXJFcnJvcj86IChlOiBhbnkpID0+IHZvaWQ7XG5cdC8qKlxuXHQgKiBOdW1iZXIgb2YgbGlzdGVuZXJzIHRoYXQgYXJlIGFsbG93ZWQgYmVmb3JlIGFzc3VtaW5nIGEgbGVhay4gRGVmYXVsdCB0b1xuXHQgKiBhIGdsb2JhbGx5IGNvbmZpZ3VyZWQgdmFsdWVcblx0ICpcblx0ICogQHNlZSBzZXRHbG9iYWxMZWFrV2FybmluZ1RocmVzaG9sZFxuXHQgKi9cblx0bGVha1dhcm5pbmdUaHJlc2hvbGQ/OiBudW1iZXI7XG5cdC8qKlxuXHQgKiBQYXNzIGluIGEgZGVsaXZlcnkgcXVldWUsIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZW5zdXJpbmdcblx0ICogaW4gb3JkZXIgZXZlbnQgZGVsaXZlcnkgYWNyb3NzIG11bHRpcGxlIGVtaXR0ZXJzLlxuXHQgKi9cblx0ZGVsaXZlcnlRdWV1ZT86IEV2ZW50RGVsaXZlcnlRdWV1ZTtcblxuXHQvKiogT05MWSBlbmFibGUgdGhpcyBkdXJpbmcgZGV2ZWxvcG1lbnQgKi9cblx0X3Byb2ZOYW1lPzogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBjbGFzcyBFdmVudFByb2ZpbGluZyB7XG5cblx0c3RhdGljIHJlYWRvbmx5IGFsbCA9IG5ldyBTZXQ8RXZlbnRQcm9maWxpbmc+KCk7XG5cblx0cHJpdmF0ZSBzdGF0aWMgX2lkUG9vbCA9IDA7XG5cblx0cmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXHRwdWJsaWMgbGlzdGVuZXJDb3VudDogbnVtYmVyID0gMDtcblx0cHVibGljIGludm9jYXRpb25Db3VudCA9IDA7XG5cdHB1YmxpYyBlbGFwc2VkT3ZlcmFsbCA9IDA7XG5cdHB1YmxpYyBkdXJhdGlvbnM6IG51bWJlcltdID0gW107XG5cblx0cHJpdmF0ZSBfc3RvcFdhdGNoPzogU3RvcFdhdGNoO1xuXG5cdGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuXHRcdHRoaXMubmFtZSA9IGAke25hbWV9XyR7RXZlbnRQcm9maWxpbmcuX2lkUG9vbCsrfWA7XG5cdFx0RXZlbnRQcm9maWxpbmcuYWxsLmFkZCh0aGlzKTtcblx0fVxuXG5cdHN0YXJ0KGxpc3RlbmVyQ291bnQ6IG51bWJlcik6IHZvaWQge1xuXHRcdHRoaXMuX3N0b3BXYXRjaCA9IG5ldyBTdG9wV2F0Y2goKTtcblx0XHR0aGlzLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuXHR9XG5cblx0c3RvcCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fc3RvcFdhdGNoKSB7XG5cdFx0XHRjb25zdCBlbGFwc2VkID0gdGhpcy5fc3RvcFdhdGNoLmVsYXBzZWQoKTtcblx0XHRcdHRoaXMuZHVyYXRpb25zLnB1c2goZWxhcHNlZCk7XG5cdFx0XHR0aGlzLmVsYXBzZWRPdmVyYWxsICs9IGVsYXBzZWQ7XG5cdFx0XHR0aGlzLmludm9jYXRpb25Db3VudCArPSAxO1xuXHRcdFx0dGhpcy5fc3RvcFdhdGNoID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxufVxuXG5sZXQgX2dsb2JhbExlYWtXYXJuaW5nVGhyZXNob2xkID0gLTE7XG5leHBvcnQgZnVuY3Rpb24gc2V0R2xvYmFsTGVha1dhcm5pbmdUaHJlc2hvbGQobjogbnVtYmVyKTogSURpc3Bvc2FibGUge1xuXHRjb25zdCBvbGRWYWx1ZSA9IF9nbG9iYWxMZWFrV2FybmluZ1RocmVzaG9sZDtcblx0X2dsb2JhbExlYWtXYXJuaW5nVGhyZXNob2xkID0gbjtcblx0cmV0dXJuIHtcblx0XHRkaXNwb3NlKCkge1xuXHRcdFx0X2dsb2JhbExlYWtXYXJuaW5nVGhyZXNob2xkID0gb2xkVmFsdWU7XG5cdFx0fVxuXHR9O1xufVxuXG5jbGFzcyBMZWFrYWdlTW9uaXRvciB7XG5cblx0cHJpdmF0ZSBzdGF0aWMgX2lkUG9vbCA9IDE7XG5cblx0cHJpdmF0ZSBfc3RhY2tzOiBNYXA8c3RyaW5nLCBudW1iZXI+IHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIF93YXJuQ291bnRkb3duOiBudW1iZXIgPSAwO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgX2Vycm9ySGFuZGxlcjogKGVycjogRXJyb3IpID0+IHZvaWQsXG5cdFx0cmVhZG9ubHkgdGhyZXNob2xkOiBudW1iZXIsXG5cdFx0cmVhZG9ubHkgbmFtZTogc3RyaW5nID0gKExlYWthZ2VNb25pdG9yLl9pZFBvb2wrKykudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDMsICcwJylcblx0KSB7IH1cblxuXHRkaXNwb3NlKCk6IHZvaWQge1xuXHRcdHRoaXMuX3N0YWNrcz8uY2xlYXIoKTtcblx0fVxuXG5cdGNoZWNrKHN0YWNrOiBTdGFja3RyYWNlLCBsaXN0ZW5lckNvdW50OiBudW1iZXIpOiB1bmRlZmluZWQgfCAoKCkgPT4gdm9pZCkge1xuXG5cdFx0Y29uc3QgdGhyZXNob2xkID0gdGhpcy50aHJlc2hvbGQ7XG5cdFx0aWYgKHRocmVzaG9sZCA8PSAwIHx8IGxpc3RlbmVyQ291bnQgPCB0aHJlc2hvbGQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLl9zdGFja3MpIHtcblx0XHRcdHRoaXMuX3N0YWNrcyA9IG5ldyBNYXAoKTtcblx0XHR9XG5cdFx0Y29uc3QgY291bnQgPSAodGhpcy5fc3RhY2tzLmdldChzdGFjay52YWx1ZSkgfHwgMCk7XG5cdFx0dGhpcy5fc3RhY2tzLnNldChzdGFjay52YWx1ZSwgY291bnQgKyAxKTtcblx0XHR0aGlzLl93YXJuQ291bnRkb3duIC09IDE7XG5cblx0XHRpZiAodGhpcy5fd2FybkNvdW50ZG93biA8PSAwKSB7XG5cdFx0XHQvLyBvbmx5IHdhcm4gb24gZmlyc3QgZXhjZWVkIGFuZCB0aGVuIGV2ZXJ5IHRpbWUgdGhlIGxpbWl0XG5cdFx0XHQvLyBpcyBleGNlZWRlZCBieSA1MCUgYWdhaW5cblx0XHRcdHRoaXMuX3dhcm5Db3VudGRvd24gPSB0aHJlc2hvbGQgKiAwLjU7XG5cblx0XHRcdGNvbnN0IFt0b3BTdGFjaywgdG9wQ291bnRdID0gdGhpcy5nZXRNb3N0RnJlcXVlbnRTdGFjaygpITtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBgWyR7dGhpcy5uYW1lfV0gcG90ZW50aWFsIGxpc3RlbmVyIExFQUsgZGV0ZWN0ZWQsIGhhdmluZyAke2xpc3RlbmVyQ291bnR9IGxpc3RlbmVycyBhbHJlYWR5LiBNT1NUIGZyZXF1ZW50IGxpc3RlbmVyICgke3RvcENvdW50fSk6YDtcblx0XHRcdGNvbnNvbGUud2FybihtZXNzYWdlKTtcblx0XHRcdGNvbnNvbGUud2Fybih0b3BTdGFjayEpO1xuXG5cdFx0XHRjb25zdCBlcnJvciA9IG5ldyBMaXN0ZW5lckxlYWtFcnJvcihtZXNzYWdlLCB0b3BTdGFjayk7XG5cdFx0XHR0aGlzLl9lcnJvckhhbmRsZXIoZXJyb3IpO1xuXHRcdH1cblxuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRjb25zdCBjb3VudCA9ICh0aGlzLl9zdGFja3MhLmdldChzdGFjay52YWx1ZSkgfHwgMCk7XG5cdFx0XHR0aGlzLl9zdGFja3MhLnNldChzdGFjay52YWx1ZSwgY291bnQgLSAxKTtcblx0XHR9O1xuXHR9XG5cblx0Z2V0TW9zdEZyZXF1ZW50U3RhY2soKTogW3N0cmluZywgbnVtYmVyXSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCF0aGlzLl9zdGFja3MpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGxldCB0b3BTdGFjazogW3N0cmluZywgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgdG9wQ291bnQ6IG51bWJlciA9IDA7XG5cdFx0Zm9yIChjb25zdCBbc3RhY2ssIGNvdW50XSBvZiB0aGlzLl9zdGFja3MpIHtcblx0XHRcdGlmICghdG9wU3RhY2sgfHwgdG9wQ291bnQgPCBjb3VudCkge1xuXHRcdFx0XHR0b3BTdGFjayA9IFtzdGFjaywgY291bnRdO1xuXHRcdFx0XHR0b3BDb3VudCA9IGNvdW50O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdG9wU3RhY2s7XG5cdH1cbn1cblxuY2xhc3MgU3RhY2t0cmFjZSB7XG5cblx0c3RhdGljIGNyZWF0ZSgpIHtcblx0XHRjb25zdCBlcnIgPSBuZXcgRXJyb3IoKTtcblx0XHRyZXR1cm4gbmV3IFN0YWNrdHJhY2UoZXJyLnN0YWNrID8/ICcnKTtcblx0fVxuXG5cdHByaXZhdGUgY29uc3RydWN0b3IocmVhZG9ubHkgdmFsdWU6IHN0cmluZykgeyB9XG5cblx0cHJpbnQoKSB7XG5cdFx0Y29uc29sZS53YXJuKHRoaXMudmFsdWUuc3BsaXQoJ1xcbicpLnNsaWNlKDIpLmpvaW4oJ1xcbicpKTtcblx0fVxufVxuXG4vLyBlcnJvciB0aGF0IGlzIGxvZ2dlZCB3aGVuIGdvaW5nIG92ZXIgdGhlIGNvbmZpZ3VyZWQgbGlzdGVuZXIgdGhyZXNob2xkXG5leHBvcnQgY2xhc3MgTGlzdGVuZXJMZWFrRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhY2s6IHN0cmluZykge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9ICdMaXN0ZW5lckxlYWtFcnJvcic7XG5cdFx0dGhpcy5zdGFjayA9IHN0YWNrO1xuXHR9XG59XG5cbi8vIFNFVkVSRSBlcnJvciB0aGF0IGlzIGxvZ2dlZCB3aGVuIGhhdmluZyBnb25lIHdheSBvdmVyIHRoZSBjb25maWd1cmVkIGxpc3RlbmVyXG4vLyB0aHJlc2hvbGQgc28gdGhhdCB0aGUgZW1pdHRlciByZWZ1c2VzIHRvIGFjY2VwdCBtb3JlIGxpc3RlbmVyc1xuZXhwb3J0IGNsYXNzIExpc3RlbmVyUmVmdXNhbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YWNrOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLm5hbWUgPSAnTGlzdGVuZXJSZWZ1c2FsRXJyb3InO1xuXHRcdHRoaXMuc3RhY2sgPSBzdGFjaztcblx0fVxufVxuXG5sZXQgaWQgPSAwO1xuY2xhc3MgVW5pcXVlQ29udGFpbmVyPFQ+IHtcblx0c3RhY2s/OiBTdGFja3RyYWNlO1xuXHRwdWJsaWMgaWQgPSBpZCsrO1xuXHRjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IFQpIHsgfVxufVxuY29uc3QgY29tcGFjdGlvblRocmVzaG9sZCA9IDI7XG5cbnR5cGUgTGlzdGVuZXJDb250YWluZXI8VD4gPSBVbmlxdWVDb250YWluZXI8KGRhdGE6IFQpID0+IHZvaWQ+O1xudHlwZSBMaXN0ZW5lck9yTGlzdGVuZXJzPFQ+ID0gKExpc3RlbmVyQ29udGFpbmVyPFQ+IHwgdW5kZWZpbmVkKVtdIHwgTGlzdGVuZXJDb250YWluZXI8VD47XG5cbmNvbnN0IGZvckVhY2hMaXN0ZW5lciA9IDxUPihsaXN0ZW5lcnM6IExpc3RlbmVyT3JMaXN0ZW5lcnM8VD4sIGZuOiAoYzogTGlzdGVuZXJDb250YWluZXI8VD4pID0+IHZvaWQpID0+IHtcblx0aWYgKGxpc3RlbmVycyBpbnN0YW5jZW9mIFVuaXF1ZUNvbnRhaW5lcikge1xuXHRcdGZuKGxpc3RlbmVycyk7XG5cdH0gZWxzZSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGwgPSBsaXN0ZW5lcnNbaV07XG5cdFx0XHRpZiAobCkge1xuXHRcdFx0XHRmbihsKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cblxubGV0IF9saXN0ZW5lckZpbmFsaXplcnM6IEZpbmFsaXphdGlvblJlZ2lzdHJ5PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbmlmIChfZW5hYmxlTGlzdGVuZXJHQ2VkV2FybmluZykge1xuXHRjb25zdCBsZWFrczogc3RyaW5nW10gPSBbXTtcblxuXHRzZXRJbnRlcnZhbCgoKSA9PiB7XG5cdFx0aWYgKGxlYWtzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zb2xlLndhcm4oJ1tMRUFLSU5HIExJU1RFTkVSU10gR0NcXCdlZCB0aGVzZSBsaXN0ZW5lcnMgdGhhdCB3ZXJlIE5PVCB5ZXQgZGlzcG9zZWQ6Jyk7XG5cdFx0Y29uc29sZS53YXJuKGxlYWtzLmpvaW4oJ1xcbicpKTtcblx0XHRsZWFrcy5sZW5ndGggPSAwO1xuXHR9LCAzMDAwKTtcblxuXHRfbGlzdGVuZXJGaW5hbGl6ZXJzID0gbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KGhlbGRWYWx1ZSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBoZWxkVmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRsZWFrcy5wdXNoKGhlbGRWYWx1ZSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBUaGUgRW1pdHRlciBjYW4gYmUgdXNlZCB0byBleHBvc2UgYW4gRXZlbnQgdG8gdGhlIHB1YmxpY1xuICogdG8gZmlyZSBpdCBmcm9tIHRoZSBpbnNpZGVzLlxuICogU2FtcGxlOlxuXHRjbGFzcyBEb2N1bWVudCB7XG5cblx0XHRwcml2YXRlIHJlYWRvbmx5IF9vbkRpZENoYW5nZSA9IG5ldyBFbWl0dGVyPCh2YWx1ZTpzdHJpbmcpPT5hbnk+KCk7XG5cblx0XHRwdWJsaWMgb25EaWRDaGFuZ2UgPSB0aGlzLl9vbkRpZENoYW5nZS5ldmVudDtcblxuXHRcdC8vIGdldHRlci1zdHlsZVxuXHRcdC8vIGdldCBvbkRpZENoYW5nZSgpOiBFdmVudDwodmFsdWU6c3RyaW5nKT0+YW55PiB7XG5cdFx0Ly8gXHRyZXR1cm4gdGhpcy5fb25EaWRDaGFuZ2UuZXZlbnQ7XG5cdFx0Ly8gfVxuXG5cdFx0cHJpdmF0ZSBfZG9JdCgpIHtcblx0XHRcdC8vLi4uXG5cdFx0XHR0aGlzLl9vbkRpZENoYW5nZS5maXJlKHZhbHVlKTtcblx0XHR9XG5cdH1cbiAqL1xuZXhwb3J0IGNsYXNzIEVtaXR0ZXI8VD4ge1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM/OiBFbWl0dGVyT3B0aW9ucztcblx0cHJpdmF0ZSByZWFkb25seSBfbGVha2FnZU1vbj86IExlYWthZ2VNb25pdG9yO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9wZXJmTW9uPzogRXZlbnRQcm9maWxpbmc7XG5cdHByaXZhdGUgX2Rpc3Bvc2VkPzogdHJ1ZTtcblx0cHJpdmF0ZSBfZXZlbnQ/OiBFdmVudDxUPjtcblxuXHQvKipcblx0ICogQSBsaXN0ZW5lciwgb3IgbGlzdCBvZiBsaXN0ZW5lcnMuIEEgc2luZ2xlIGxpc3RlbmVyIGlzIHRoZSBtb3N0IGNvbW1vblxuXHQgKiBmb3IgZXZlbnQgZW1pdHRlcnMgKCMxODU3ODkpLCBzbyB3ZSBvcHRpbWl6ZSB0aGF0IHNwZWNpYWwgY2FzZSB0byBhdm9pZFxuXHQgKiB3cmFwcGluZyBpdCBpbiBhbiBhcnJheSAoanVzdCBsaWtlIE5vZGUuanMgaXRzZWxmLilcblx0ICpcblx0ICogQSBsaXN0IG9mIGxpc3RlbmVycyBuZXZlciAnZG93bmdyYWRlcycgYmFjayB0byBhIHBsYWluIGZ1bmN0aW9uIGlmXG5cdCAqIGxpc3RlbmVycyBhcmUgcmVtb3ZlZCwgZm9yIHR3byByZWFzb25zOlxuXHQgKlxuXHQgKiAgMS4gVGhhdCdzIGNvbXBsaWNhdGVkIChlc3BlY2lhbGx5IHdpdGggdGhlIGRlbGl2ZXJ5UXVldWUpXG5cdCAqICAyLiBBIGxpc3RlbmVyIHdpdGggPjEgbGlzdGVuZXIgaXMgbGlrZWx5IHRvIGhhdmUgPjEgbGlzdGVuZXIgYWdhaW4gYXRcblx0ICogICAgIHNvbWUgcG9pbnQsIGFuZCBzd2FwcGluZyBiZXR3ZWVuIGFycmF5cyBhbmQgZnVuY3Rpb25zIG1heVtjaXRhdGlvbiBuZWVkZWRdXG5cdCAqICAgICBpbnRyb2R1Y2UgdW5uZWNlc3Nhcnkgd29yayBhbmQgZ2FyYmFnZS5cblx0ICpcblx0ICogVGhlIGFycmF5IGxpc3RlbmVycyBjYW4gYmUgJ3NwYXJzZScsIHRvIGF2b2lkIHJlYWxsb2NhdGluZyB0aGUgYXJyYXlcblx0ICogd2hlbmV2ZXIgYW55IGxpc3RlbmVyIGlzIGFkZGVkIG9yIHJlbW92ZWQuIElmIG1vcmUgdGhhbiBgMSAvIGNvbXBhY3Rpb25UaHJlc2hvbGRgXG5cdCAqIG9mIHRoZSBhcnJheSBpcyBlbXB0eSwgb25seSB0aGVuIGlzIGl0IHJlc2l6ZWQuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgX2xpc3RlbmVycz86IExpc3RlbmVyT3JMaXN0ZW5lcnM8VD47XG5cblx0LyoqXG5cdCAqIEFsd2F5cyB0byBiZSBkZWZpbmVkIGlmIF9saXN0ZW5lcnMgaXMgYW4gYXJyYXkuIEl0J3Mgbm8gbG9uZ2VyIGEgdHJ1ZVxuXHQgKiBxdWV1ZSwgYnV0IGhvbGRzIHRoZSBkaXNwYXRjaGluZyAnc3RhdGUnLiBJZiBgZmlyZSgpYCBpcyBjYWxsZWQgb24gYW5cblx0ICogZW1pdHRlciwgYW55IHdvcmsgbGVmdCBpbiB0aGUgX2RlbGl2ZXJ5UXVldWUgaXMgZmluaXNoZWQgZmlyc3QuXG5cdCAqL1xuXHRwcml2YXRlIF9kZWxpdmVyeVF1ZXVlPzogRXZlbnREZWxpdmVyeVF1ZXVlUHJpdmF0ZTtcblx0cHJvdGVjdGVkIF9zaXplID0gMDtcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zPzogRW1pdHRlck9wdGlvbnMpIHtcblx0XHR0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLl9sZWFrYWdlTW9uID0gKF9nbG9iYWxMZWFrV2FybmluZ1RocmVzaG9sZCA+IDAgfHwgdGhpcy5fb3B0aW9ucz8ubGVha1dhcm5pbmdUaHJlc2hvbGQpXG5cdFx0XHQ/IG5ldyBMZWFrYWdlTW9uaXRvcihvcHRpb25zPy5vbkxpc3RlbmVyRXJyb3IgPz8gb25VbmV4cGVjdGVkRXJyb3IsIHRoaXMuX29wdGlvbnM/LmxlYWtXYXJuaW5nVGhyZXNob2xkID8/IF9nbG9iYWxMZWFrV2FybmluZ1RocmVzaG9sZCkgOlxuXHRcdFx0dW5kZWZpbmVkO1xuXHRcdHRoaXMuX3BlcmZNb24gPSB0aGlzLl9vcHRpb25zPy5fcHJvZk5hbWUgPyBuZXcgRXZlbnRQcm9maWxpbmcodGhpcy5fb3B0aW9ucy5fcHJvZk5hbWUpIDogdW5kZWZpbmVkO1xuXHRcdHRoaXMuX2RlbGl2ZXJ5UXVldWUgPSB0aGlzLl9vcHRpb25zPy5kZWxpdmVyeVF1ZXVlIGFzIEV2ZW50RGVsaXZlcnlRdWV1ZVByaXZhdGUgfCB1bmRlZmluZWQ7XG5cdH1cblxuXHRkaXNwb3NlKCkge1xuXHRcdGlmICghdGhpcy5fZGlzcG9zZWQpIHtcblx0XHRcdHRoaXMuX2Rpc3Bvc2VkID0gdHJ1ZTtcblxuXHRcdFx0Ly8gSXQgaXMgYmFkIHRvIGhhdmUgbGlzdGVuZXJzIGF0IHRoZSB0aW1lIG9mIGRpc3Bvc2luZyBhbiBlbWl0dGVyLCBpdCBpcyB3b3JzdCB0byBoYXZlIGxpc3RlbmVycyBrZWVwIHRoZSBlbWl0dGVyXG5cdFx0XHQvLyBhbGl2ZSB2aWEgdGhlIHJlZmVyZW5jZSB0aGF0J3MgZW1iZWRkZWQgaW4gdGhlaXIgZGlzcG9zYWJsZXMuIFRoZXJlZm9yZSB3ZSBsb29wIG92ZXIgYWxsIHJlbWFpbmluZyBsaXN0ZW5lcnMgYW5kXG5cdFx0XHQvLyB1bnNldCB0aGVpciBzdWJzY3JpcHRpb25zL2Rpc3Bvc2FibGVzLiBMb29waW5nIGFuZCBibGFtaW5nIHJlbWFpbmluZyBsaXN0ZW5lcnMgaXMgZG9uZSBvbiBuZXh0IHRpY2sgYmVjYXVzZSB0aGVcblx0XHRcdC8vIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbW1pbmcgcGF0dGVybiBpcyB2ZXJ5IHBvcHVsYXI6XG5cdFx0XHQvL1xuXHRcdFx0Ly8gY29uc3Qgc29tZU1vZGVsID0gdGhpcy5fZGlzcG9zYWJsZXMuYWRkKG5ldyBNb2RlbE9iamVjdCgpKTsgLy8gKDEpIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgbW9kZWxcblx0XHRcdC8vIHRoaXMuX2Rpc3Bvc2FibGVzLmFkZChzb21lTW9kZWwub25EaWRDaGFuZ2UoKCkgPT4geyAuLi4gfSk7IC8vICgyKSBzdWJzY3JpYmUgYW5kIHJlZ2lzdGVyIG1vZGVsLWV2ZW50IGxpc3RlbmVyXG5cdFx0XHQvLyAuLi5sYXRlci4uLlxuXHRcdFx0Ly8gdGhpcy5fZGlzcG9zYWJsZXMuZGlzcG9zZSgpOyBkaXNwb3NlcyAoMSkgdGhlbiAoMik6IGRvbid0IHdhcm4gYWZ0ZXIgKDEpIGJ1dCBhZnRlciB0aGUgXCJvdmVyYWxsIGRpc3Bvc2VcIiBpcyBkb25lXG5cblx0XHRcdGlmICh0aGlzLl9kZWxpdmVyeVF1ZXVlPy5jdXJyZW50ID09PSB0aGlzKSB7XG5cdFx0XHRcdHRoaXMuX2RlbGl2ZXJ5UXVldWUucmVzZXQoKTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcblx0XHRcdFx0aWYgKF9lbmFibGVEaXNwb3NlV2l0aExpc3RlbmVyV2FybmluZykge1xuXHRcdFx0XHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHRcdFx0XHRxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRmb3JFYWNoTGlzdGVuZXIobGlzdGVuZXJzLCBsID0+IGwuc3RhY2s/LnByaW50KCkpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fbGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR0aGlzLl9zaXplID0gMDtcblx0XHRcdH1cblx0XHRcdHRoaXMuX29wdGlvbnM/Lm9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyPy4oKTtcblx0XHRcdHRoaXMuX2xlYWthZ2VNb24/LmRpc3Bvc2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRm9yIHRoZSBwdWJsaWMgdG8gYWxsb3cgdG8gc3Vic2NyaWJlXG5cdCAqIHRvIGV2ZW50cyBmcm9tIHRoaXMgRW1pdHRlclxuXHQgKi9cblx0Z2V0IGV2ZW50KCk6IEV2ZW50PFQ+IHtcblx0XHR0aGlzLl9ldmVudCA/Pz0gKGNhbGxiYWNrOiAoZTogVCkgPT4gYW55LCB0aGlzQXJncz86IGFueSwgZGlzcG9zYWJsZXM/OiBJRGlzcG9zYWJsZVtdIHwgRGlzcG9zYWJsZVN0b3JlKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fbGVha2FnZU1vbiAmJiB0aGlzLl9zaXplID4gdGhpcy5fbGVha2FnZU1vbi50aHJlc2hvbGQgKiogMikge1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gYFske3RoaXMuX2xlYWthZ2VNb24ubmFtZX1dIFJFRlVTRVMgdG8gYWNjZXB0IG5ldyBsaXN0ZW5lcnMgYmVjYXVzZSBpdCBleGNlZWRlZCBpdHMgdGhyZXNob2xkIGJ5IGZhciAoJHt0aGlzLl9zaXplfSB2cyAke3RoaXMuX2xlYWthZ2VNb24udGhyZXNob2xkfSlgO1xuXHRcdFx0XHRjb25zb2xlLndhcm4obWVzc2FnZSk7XG5cblx0XHRcdFx0Y29uc3QgdHVwbGUgPSB0aGlzLl9sZWFrYWdlTW9uLmdldE1vc3RGcmVxdWVudFN0YWNrKCkgPz8gWydVTktOT1dOIHN0YWNrJywgLTFdO1xuXHRcdFx0XHRjb25zdCBlcnJvciA9IG5ldyBMaXN0ZW5lclJlZnVzYWxFcnJvcihgJHttZXNzYWdlfS4gSElOVDogU3RhY2sgc2hvd3MgbW9zdCBmcmVxdWVudCBsaXN0ZW5lciAoJHt0dXBsZVsxXX0tdGltZXMpYCwgdHVwbGVbMF0pO1xuXHRcdFx0XHRjb25zdCBlcnJvckhhbmRsZXIgPSB0aGlzLl9vcHRpb25zPy5vbkxpc3RlbmVyRXJyb3IgfHwgb25VbmV4cGVjdGVkRXJyb3I7XG5cdFx0XHRcdGVycm9ySGFuZGxlcihlcnJvcik7XG5cblx0XHRcdFx0cmV0dXJuIERpc3Bvc2FibGUuTm9uZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2Rpc3Bvc2VkKSB7XG5cdFx0XHRcdC8vIHRvZG86IHNob3VsZCB3ZSB3YXJuIGlmIGEgbGlzdGVuZXIgaXMgYWRkZWQgdG8gYSBkaXNwb3NlZCBlbWl0dGVyPyBUaGlzIGhhcHBlbnMgb2Z0ZW5cblx0XHRcdFx0cmV0dXJuIERpc3Bvc2FibGUuTm9uZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXNBcmdzKSB7XG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2suYmluZCh0aGlzQXJncyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNvbnRhaW5lZCA9IG5ldyBVbmlxdWVDb250YWluZXIoY2FsbGJhY2spO1xuXG5cdFx0XHRsZXQgcmVtb3ZlTW9uaXRvcjogRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRsZXQgc3RhY2s6IFN0YWNrdHJhY2UgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodGhpcy5fbGVha2FnZU1vbiAmJiB0aGlzLl9zaXplID49IE1hdGguY2VpbCh0aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZCAqIDAuMikpIHtcblx0XHRcdFx0Ly8gY2hlY2sgYW5kIHJlY29yZCB0aGlzIGVtaXR0ZXIgZm9yIHBvdGVudGlhbCBsZWFrYWdlXG5cdFx0XHRcdGNvbnRhaW5lZC5zdGFjayA9IFN0YWNrdHJhY2UuY3JlYXRlKCk7XG5cdFx0XHRcdHJlbW92ZU1vbml0b3IgPSB0aGlzLl9sZWFrYWdlTW9uLmNoZWNrKGNvbnRhaW5lZC5zdGFjaywgdGhpcy5fc2l6ZSArIDEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoX2VuYWJsZURpc3Bvc2VXaXRoTGlzdGVuZXJXYXJuaW5nKSB7XG5cdFx0XHRcdGNvbnRhaW5lZC5zdGFjayA9IHN0YWNrID8/IFN0YWNrdHJhY2UuY3JlYXRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5fbGlzdGVuZXJzKSB7XG5cdFx0XHRcdHRoaXMuX29wdGlvbnM/Lm9uV2lsbEFkZEZpcnN0TGlzdGVuZXI/Lih0aGlzKTtcblx0XHRcdFx0dGhpcy5fbGlzdGVuZXJzID0gY29udGFpbmVkO1xuXHRcdFx0XHR0aGlzLl9vcHRpb25zPy5vbkRpZEFkZEZpcnN0TGlzdGVuZXI/Lih0aGlzKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5fbGlzdGVuZXJzIGluc3RhbmNlb2YgVW5pcXVlQ29udGFpbmVyKSB7XG5cdFx0XHRcdHRoaXMuX2RlbGl2ZXJ5UXVldWUgPz89IG5ldyBFdmVudERlbGl2ZXJ5UXVldWVQcml2YXRlKCk7XG5cdFx0XHRcdHRoaXMuX2xpc3RlbmVycyA9IFt0aGlzLl9saXN0ZW5lcnMsIGNvbnRhaW5lZF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9saXN0ZW5lcnMucHVzaChjb250YWluZWQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zaXplKys7XG5cblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gdG9EaXNwb3NhYmxlKCgpID0+IHtcblx0XHRcdFx0X2xpc3RlbmVyRmluYWxpemVycz8udW5yZWdpc3RlcihyZXN1bHQpO1xuXHRcdFx0XHRyZW1vdmVNb25pdG9yPy4oKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlTGlzdGVuZXIoY29udGFpbmVkKTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGRpc3Bvc2FibGVzIGluc3RhbmNlb2YgRGlzcG9zYWJsZVN0b3JlKSB7XG5cdFx0XHRcdGRpc3Bvc2FibGVzLmFkZChyZXN1bHQpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuXHRcdFx0XHRkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChfbGlzdGVuZXJGaW5hbGl6ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IHN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2shLnNwbGl0KCdcXG4nKS5zbGljZSgyLCAzKS5qb2luKCdcXG4nKS50cmltKCk7XG5cdFx0XHRcdGNvbnN0IG1hdGNoID0gLyhmaWxlOnx2c2NvZGUtZmlsZTpcXC9cXC92c2NvZGUtYXBwKT8oXFwvW146XSo6XFxkKzpcXGQrKS8uZXhlYyhzdGFjayk7XG5cdFx0XHRcdF9saXN0ZW5lckZpbmFsaXplcnMucmVnaXN0ZXIocmVzdWx0LCBtYXRjaD8uWzJdID8/IHN0YWNrLCByZXN1bHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH07XG5cblx0XHRyZXR1cm4gdGhpcy5fZXZlbnQ7XG5cdH1cblxuXHRwcml2YXRlIF9yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcjogTGlzdGVuZXJDb250YWluZXI8VD4pIHtcblx0XHR0aGlzLl9vcHRpb25zPy5vbldpbGxSZW1vdmVMaXN0ZW5lcj8uKHRoaXMpO1xuXG5cdFx0aWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcblx0XHRcdHJldHVybjsgLy8gZXhwZWN0ZWQgaWYgYSBsaXN0ZW5lciBnZXRzIGRpc3Bvc2VkXG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3NpemUgPT09IDEpIHtcblx0XHRcdHRoaXMuX2xpc3RlbmVycyA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMuX29wdGlvbnM/Lm9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyPy4odGhpcyk7XG5cdFx0XHR0aGlzLl9zaXplID0gMDtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBzaXplID4gMSB3aGljaCByZXF1aXJlcyB0aGF0IGxpc3RlbmVycyBiZSBhIGxpc3Q6XG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzIGFzIChMaXN0ZW5lckNvbnRhaW5lcjxUPiB8IHVuZGVmaW5lZClbXTtcblxuXHRcdGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuXHRcdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRcdGNvbnNvbGUubG9nKCdkaXNwb3NlZD8nLCB0aGlzLl9kaXNwb3NlZCk7XG5cdFx0XHRjb25zb2xlLmxvZygnc2l6ZT8nLCB0aGlzLl9zaXplKTtcblx0XHRcdGNvbnNvbGUubG9nKCdhcnI/JywgSlNPTi5zdHJpbmdpZnkodGhpcy5fbGlzdGVuZXJzKSk7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBkaXNwb3NlIHVua25vd24gbGlzdGVuZXInKTtcblx0XHR9XG5cblx0XHR0aGlzLl9zaXplLS07XG5cdFx0bGlzdGVuZXJzW2luZGV4XSA9IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IGFkanVzdERlbGl2ZXJ5UXVldWUgPSB0aGlzLl9kZWxpdmVyeVF1ZXVlIS5jdXJyZW50ID09PSB0aGlzO1xuXHRcdGlmICh0aGlzLl9zaXplICogY29tcGFjdGlvblRocmVzaG9sZCA8PSBsaXN0ZW5lcnMubGVuZ3RoKSB7XG5cdFx0XHRsZXQgbiA9IDA7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAobGlzdGVuZXJzW2ldKSB7XG5cdFx0XHRcdFx0bGlzdGVuZXJzW24rK10gPSBsaXN0ZW5lcnNbaV07XG5cdFx0XHRcdH0gZWxzZSBpZiAoYWRqdXN0RGVsaXZlcnlRdWV1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX2RlbGl2ZXJ5UXVldWUhLmVuZC0tO1xuXHRcdFx0XHRcdGlmIChuIDwgdGhpcy5fZGVsaXZlcnlRdWV1ZSEuaSkge1xuXHRcdFx0XHRcdFx0dGhpcy5fZGVsaXZlcnlRdWV1ZSEuaS0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGlzdGVuZXJzLmxlbmd0aCA9IG47XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfZGVsaXZlcihsaXN0ZW5lcjogdW5kZWZpbmVkIHwgVW5pcXVlQ29udGFpbmVyPCh2YWx1ZTogVCkgPT4gdm9pZD4sIHZhbHVlOiBUKSB7XG5cdFx0aWYgKCFsaXN0ZW5lcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IHRoaXMuX29wdGlvbnM/Lm9uTGlzdGVuZXJFcnJvciB8fCBvblVuZXhwZWN0ZWRFcnJvcjtcblx0XHRpZiAoIWVycm9ySGFuZGxlcikge1xuXHRcdFx0bGlzdGVuZXIudmFsdWUodmFsdWUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRsaXN0ZW5lci52YWx1ZSh2YWx1ZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0ZXJyb3JIYW5kbGVyKGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBEZWxpdmVycyBpdGVtcyBpbiB0aGUgcXVldWUuIEFzc3VtZXMgdGhlIHF1ZXVlIGlzIHJlYWR5IHRvIGdvLiAqL1xuXHRwcml2YXRlIF9kZWxpdmVyUXVldWUoZHE6IEV2ZW50RGVsaXZlcnlRdWV1ZVByaXZhdGUpIHtcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSBkcS5jdXJyZW50IS5fbGlzdGVuZXJzISBhcyAoTGlzdGVuZXJDb250YWluZXI8VD4gfCB1bmRlZmluZWQpW107XG5cdFx0d2hpbGUgKGRxLmkgPCBkcS5lbmQpIHtcblx0XHRcdC8vIGltcG9ydGFudDogZHEuaSBpcyBpbmNyZW1lbnRlZCBiZWZvcmUgY2FsbGluZyBkZWxpdmVyKCkgYmVjYXVzZSBpdCBtaWdodCByZWVudGVyIGRlbGl2ZXJRdWV1ZSgpXG5cdFx0XHR0aGlzLl9kZWxpdmVyKGxpc3RlbmVyc1tkcS5pKytdLCBkcS52YWx1ZSBhcyBUKTtcblx0XHR9XG5cdFx0ZHEucmVzZXQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUbyBiZSBrZXB0IHByaXZhdGUgdG8gZmlyZSBhbiBldmVudCB0b1xuXHQgKiBzdWJzY3JpYmVyc1xuXHQgKi9cblx0ZmlyZShldmVudDogVCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9kZWxpdmVyeVF1ZXVlPy5jdXJyZW50KSB7XG5cdFx0XHR0aGlzLl9kZWxpdmVyUXVldWUodGhpcy5fZGVsaXZlcnlRdWV1ZSk7XG5cdFx0XHR0aGlzLl9wZXJmTW9uPy5zdG9wKCk7IC8vIGxhc3QgZmlyZSgpIHdpbGwgaGF2ZSBzdGFydGluZyBwZXJmbW9uLCBzdG9wIGl0IGJlZm9yZSBzdGFydGluZyB0aGUgbmV4dCBkaXNwYXRjaFxuXHRcdH1cblxuXHRcdHRoaXMuX3BlcmZNb24/LnN0YXJ0KHRoaXMuX3NpemUpO1xuXG5cdFx0aWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcblx0XHRcdC8vIG5vLW9wXG5cdFx0fSBlbHNlIGlmICh0aGlzLl9saXN0ZW5lcnMgaW5zdGFuY2VvZiBVbmlxdWVDb250YWluZXIpIHtcblx0XHRcdHRoaXMuX2RlbGl2ZXIodGhpcy5fbGlzdGVuZXJzLCBldmVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGRxID0gdGhpcy5fZGVsaXZlcnlRdWV1ZSE7XG5cdFx0XHRkcS5lbnF1ZXVlKHRoaXMsIGV2ZW50LCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoKTtcblx0XHRcdHRoaXMuX2RlbGl2ZXJRdWV1ZShkcSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcGVyZk1vbj8uc3RvcCgpO1xuXHR9XG5cblx0aGFzTGlzdGVuZXJzKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9zaXplID4gMDtcblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50RGVsaXZlcnlRdWV1ZSB7XG5cdF9pc0V2ZW50RGVsaXZlcnlRdWV1ZTogdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUV2ZW50RGVsaXZlcnlRdWV1ZSA9ICgpOiBFdmVudERlbGl2ZXJ5UXVldWUgPT4gbmV3IEV2ZW50RGVsaXZlcnlRdWV1ZVByaXZhdGUoKTtcblxuY2xhc3MgRXZlbnREZWxpdmVyeVF1ZXVlUHJpdmF0ZSBpbXBsZW1lbnRzIEV2ZW50RGVsaXZlcnlRdWV1ZSB7XG5cdGRlY2xhcmUgX2lzRXZlbnREZWxpdmVyeVF1ZXVlOiB0cnVlO1xuXG5cdC8qKlxuXHQgKiBJbmRleCBpbiBjdXJyZW50J3MgbGlzdGVuZXIgbGlzdC5cblx0ICovXG5cdHB1YmxpYyBpID0gLTE7XG5cblx0LyoqXG5cdCAqIFRoZSBsYXN0IGluZGV4IGluIHRoZSBsaXN0ZW5lcidzIGxpc3QgdG8gZGVsaXZlci5cblx0ICovXG5cdHB1YmxpYyBlbmQgPSAwO1xuXG5cdC8qKlxuXHQgKiBFbWl0dGVyIGN1cnJlbnRseSBiZWluZyBkaXNwYXRjaGVkIG9uLiBFbWl0dGVyLl9saXN0ZW5lcnMgaXMgYWx3YXlzIGFuIGFycmF5LlxuXHQgKi9cblx0cHVibGljIGN1cnJlbnQ/OiBFbWl0dGVyPGFueT47XG5cdC8qKlxuXHQgKiBDdXJyZW50bHkgZW1pdHRpbmcgdmFsdWUuIERlZmluZWQgd2hlbmV2ZXIgYGN1cnJlbnRgIGlzLlxuXHQgKi9cblx0cHVibGljIHZhbHVlPzogdW5rbm93bjtcblxuXHRwdWJsaWMgZW5xdWV1ZTxUPihlbWl0dGVyOiBFbWl0dGVyPFQ+LCB2YWx1ZTogVCwgZW5kOiBudW1iZXIpIHtcblx0XHR0aGlzLmkgPSAwO1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXHRcdHRoaXMuY3VycmVudCA9IGVtaXR0ZXI7XG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0cHVibGljIHJlc2V0KCkge1xuXHRcdHRoaXMuaSA9IHRoaXMuZW5kOyAvLyBmb3JjZSBhbnkgY3VycmVudCBlbWlzc2lvbiBsb29wIHRvIHN0b3AsIG1haW5seSBmb3IgZHVyaW5nIGRpc3Bvc2Vcblx0XHR0aGlzLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXYWl0VW50aWwge1xuXHR0b2tlbjogQ2FuY2VsbGF0aW9uVG9rZW47XG5cdHdhaXRVbnRpbCh0aGVuYWJsZTogUHJvbWlzZTx1bmtub3duPik6IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIElXYWl0VW50aWxEYXRhPFQ+ID0gT21pdDxPbWl0PFQsICd3YWl0VW50aWwnPiwgJ3Rva2VuJz47XG5cbmV4cG9ydCBjbGFzcyBBc3luY0VtaXR0ZXI8VCBleHRlbmRzIElXYWl0VW50aWw+IGV4dGVuZHMgRW1pdHRlcjxUPiB7XG5cblx0cHJpdmF0ZSBfYXN5bmNEZWxpdmVyeVF1ZXVlPzogTGlua2VkTGlzdDxbKGV2OiBUKSA9PiB2b2lkLCBJV2FpdFVudGlsRGF0YTxUPl0+O1xuXG5cdGFzeW5jIGZpcmVBc3luYyhkYXRhOiBJV2FpdFVudGlsRGF0YTxUPiwgdG9rZW46IENhbmNlbGxhdGlvblRva2VuLCBwcm9taXNlSm9pbj86IChwOiBQcm9taXNlPHVua25vd24+LCBsaXN0ZW5lcjogRnVuY3Rpb24pID0+IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5fYXN5bmNEZWxpdmVyeVF1ZXVlKSB7XG5cdFx0XHR0aGlzLl9hc3luY0RlbGl2ZXJ5UXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuXHRcdH1cblxuXHRcdGZvckVhY2hMaXN0ZW5lcih0aGlzLl9saXN0ZW5lcnMsIGxpc3RlbmVyID0+IHRoaXMuX2FzeW5jRGVsaXZlcnlRdWV1ZSEucHVzaChbbGlzdGVuZXIudmFsdWUsIGRhdGFdKSk7XG5cblx0XHR3aGlsZSAodGhpcy5fYXN5bmNEZWxpdmVyeVF1ZXVlLnNpemUgPiAwICYmICF0b2tlbi5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkge1xuXG5cdFx0XHRjb25zdCBbbGlzdGVuZXIsIGRhdGFdID0gdGhpcy5fYXN5bmNEZWxpdmVyeVF1ZXVlLnNoaWZ0KCkhO1xuXHRcdFx0Y29uc3QgdGhlbmFibGVzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcblxuXHRcdFx0Y29uc3QgZXZlbnQgPSA8VD57XG5cdFx0XHRcdC4uLmRhdGEsXG5cdFx0XHRcdHRva2VuLFxuXHRcdFx0XHR3YWl0VW50aWw6IChwOiBQcm9taXNlPHVua25vd24+KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0aWYgKE9iamVjdC5pc0Zyb3plbih0aGVuYWJsZXMpKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3dhaXRVbnRpbCBjYW4gTk9UIGJlIGNhbGxlZCBhc3luY2hyb25vdXMnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHByb21pc2VKb2luKSB7XG5cdFx0XHRcdFx0XHRwID0gcHJvbWlzZUpvaW4ocCwgbGlzdGVuZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGVuYWJsZXMucHVzaChwKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bGlzdGVuZXIoZXZlbnQpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRvblVuZXhwZWN0ZWRFcnJvcihlKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGZyZWV6ZSB0aGVuYWJsZXMtY29sbGVjdGlvbiB0byBlbmZvcmNlIHN5bmMtY2FsbHMgdG9cblx0XHRcdC8vIHdhaXQgdW50aWwgYW5kIHRoZW4gd2FpdCBmb3IgYWxsIHRoZW5hYmxlcyB0byByZXNvbHZlXG5cdFx0XHRPYmplY3QuZnJlZXplKHRoZW5hYmxlcyk7XG5cblx0XHRcdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh0aGVuYWJsZXMpLnRoZW4odmFsdWVzID0+IHtcblx0XHRcdFx0Zm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcblx0XHRcdFx0XHRpZiAodmFsdWUuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG5cdFx0XHRcdFx0XHRvblVuZXhwZWN0ZWRFcnJvcih2YWx1ZS5yZWFzb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cblxuZXhwb3J0IGNsYXNzIFBhdXNlYWJsZUVtaXR0ZXI8VD4gZXh0ZW5kcyBFbWl0dGVyPFQ+IHtcblxuXHRwcml2YXRlIF9pc1BhdXNlZCA9IDA7XG5cdHByb3RlY3RlZCBfZXZlbnRRdWV1ZSA9IG5ldyBMaW5rZWRMaXN0PFQ+KCk7XG5cdHByaXZhdGUgX21lcmdlRm4/OiAoaW5wdXQ6IFRbXSkgPT4gVDtcblxuXHRwdWJsaWMgZ2V0IGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc1BhdXNlZCAhPT0gMDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBFbWl0dGVyT3B0aW9ucyAmIHsgbWVyZ2U/OiAoaW5wdXQ6IFRbXSkgPT4gVCB9KSB7XG5cdFx0c3VwZXIob3B0aW9ucyk7XG5cdFx0dGhpcy5fbWVyZ2VGbiA9IG9wdGlvbnM/Lm1lcmdlO1xuXHR9XG5cblx0cGF1c2UoKTogdm9pZCB7XG5cdFx0dGhpcy5faXNQYXVzZWQrKztcblx0fVxuXG5cdHJlc3VtZSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5faXNQYXVzZWQgIT09IDAgJiYgLS10aGlzLl9pc1BhdXNlZCA9PT0gMCkge1xuXHRcdFx0aWYgKHRoaXMuX21lcmdlRm4pIHtcblx0XHRcdFx0Ly8gdXNlIHRoZSBtZXJnZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBzaW5nbGUgY29tcG9zaXRlXG5cdFx0XHRcdC8vIGV2ZW50LiBtYWtlIGEgY29weSBpbiBjYXNlIGZpcmluZyBwYXVzZXMgdGhpcyBlbWl0dGVyXG5cdFx0XHRcdGlmICh0aGlzLl9ldmVudFF1ZXVlLnNpemUgPiAwKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXZlbnRzID0gQXJyYXkuZnJvbSh0aGlzLl9ldmVudFF1ZXVlKTtcblx0XHRcdFx0XHR0aGlzLl9ldmVudFF1ZXVlLmNsZWFyKCk7XG5cdFx0XHRcdFx0c3VwZXIuZmlyZSh0aGlzLl9tZXJnZUZuKGV2ZW50cykpO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIG5vIG1lcmdpbmcsIGZpcmUgZWFjaCBldmVudCBpbmRpdmlkdWFsbHkgYW5kIHRlc3Rcblx0XHRcdFx0Ly8gdGhhdCB0aGlzIGVtaXR0ZXIgaXNuJ3QgcGF1c2VkIGhhbGZ3YXkgdGhyb3VnaFxuXHRcdFx0XHR3aGlsZSAoIXRoaXMuX2lzUGF1c2VkICYmIHRoaXMuX2V2ZW50UXVldWUuc2l6ZSAhPT0gMCkge1xuXHRcdFx0XHRcdHN1cGVyLmZpcmUodGhpcy5fZXZlbnRRdWV1ZS5zaGlmdCgpISk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRvdmVycmlkZSBmaXJlKGV2ZW50OiBUKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX3NpemUpIHtcblx0XHRcdGlmICh0aGlzLl9pc1BhdXNlZCAhPT0gMCkge1xuXHRcdFx0XHR0aGlzLl9ldmVudFF1ZXVlLnB1c2goZXZlbnQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3VwZXIuZmlyZShldmVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWJvdW5jZUVtaXR0ZXI8VD4gZXh0ZW5kcyBQYXVzZWFibGVFbWl0dGVyPFQ+IHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9kZWxheTogbnVtYmVyO1xuXHRwcml2YXRlIF9oYW5kbGU6IGFueSB8IHVuZGVmaW5lZDtcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zOiBFbWl0dGVyT3B0aW9ucyAmIHsgbWVyZ2U6IChpbnB1dDogVFtdKSA9PiBUOyBkZWxheT86IG51bWJlciB9KSB7XG5cdFx0c3VwZXIob3B0aW9ucyk7XG5cdFx0dGhpcy5fZGVsYXkgPSBvcHRpb25zLmRlbGF5ID8/IDEwMDtcblx0fVxuXG5cdG92ZXJyaWRlIGZpcmUoZXZlbnQ6IFQpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuX2hhbmRsZSkge1xuXHRcdFx0dGhpcy5wYXVzZSgpO1xuXHRcdFx0dGhpcy5faGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX2hhbmRsZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0dGhpcy5yZXN1bWUoKTtcblx0XHRcdH0sIHRoaXMuX2RlbGF5KTtcblx0XHR9XG5cdFx0c3VwZXIuZmlyZShldmVudCk7XG5cdH1cbn1cblxuLyoqXG4gKiBBbiBlbWl0dGVyIHdoaWNoIHF1ZXVlIGFsbCBldmVudHMgYW5kIHRoZW4gcHJvY2VzcyB0aGVtIGF0IHRoZVxuICogZW5kIG9mIHRoZSBldmVudCBsb29wLlxuICovXG5leHBvcnQgY2xhc3MgTWljcm90YXNrRW1pdHRlcjxUPiBleHRlbmRzIEVtaXR0ZXI8VD4ge1xuXHRwcml2YXRlIF9xdWV1ZWRFdmVudHM6IFRbXSA9IFtdO1xuXHRwcml2YXRlIF9tZXJnZUZuPzogKGlucHV0OiBUW10pID0+IFQ7XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucz86IEVtaXR0ZXJPcHRpb25zICYgeyBtZXJnZT86IChpbnB1dDogVFtdKSA9PiBUIH0pIHtcblx0XHRzdXBlcihvcHRpb25zKTtcblx0XHR0aGlzLl9tZXJnZUZuID0gb3B0aW9ucz8ubWVyZ2U7XG5cdH1cblx0b3ZlcnJpZGUgZmlyZShldmVudDogVCk6IHZvaWQge1xuXG5cdFx0aWYgKCF0aGlzLmhhc0xpc3RlbmVycygpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fcXVldWVkRXZlbnRzLnB1c2goZXZlbnQpO1xuXHRcdGlmICh0aGlzLl9xdWV1ZWRFdmVudHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9tZXJnZUZuKSB7XG5cdFx0XHRcdFx0c3VwZXIuZmlyZSh0aGlzLl9tZXJnZUZuKHRoaXMuX3F1ZXVlZEV2ZW50cykpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX3F1ZXVlZEV2ZW50cy5mb3JFYWNoKGUgPT4gc3VwZXIuZmlyZShlKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fcXVldWVkRXZlbnRzID0gW107XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBBbiBldmVudCBlbWl0dGVyIHRoYXQgbXVsdGlwbGV4ZXMgbWFueSBldmVudHMgaW50byBhIHNpbmdsZSBldmVudC5cbiAqXG4gKiBAZXhhbXBsZSBMaXN0ZW4gdG8gdGhlIGBvbkRhdGFgIGV2ZW50IG9mIGFsbCBgVGhpbmdgcywgZHluYW1pY2FsbHkgYWRkaW5nIGFuZCByZW1vdmluZyBgVGhpbmdgc1xuICogdG8gdGhlIG11bHRpcGxleGVyIGFzIG5lZWRlZC5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBhbnl0aGluZ0RhdGFNdWx0aXBsZXhlciA9IG5ldyBFdmVudE11bHRpcGxleGVyPHsgZGF0YTogc3RyaW5nIH0+KCk7XG4gKlxuICogY29uc3QgdGhpbmdMaXN0ZW5lcnMgPSBEaXNwb3NhYmxlTWFwPFRoaW5nLCBJRGlzcG9zYWJsZT4oKTtcbiAqXG4gKiB0aGluZ1NlcnZpY2Uub25EaWRBZGRUaGluZyh0aGluZyA9PiB7XG4gKiAgIHRoaW5nTGlzdGVuZXJzLnNldCh0aGluZywgYW55dGhpbmdEYXRhTXVsdGlwbGV4ZXIuYWRkKHRoaW5nLm9uRGF0YSk7XG4gKiB9KTtcbiAqIHRoaW5nU2VydmljZS5vbkRpZFJlbW92ZVRoaW5nKHRoaW5nID0+IHtcbiAqICAgdGhpbmdMaXN0ZW5lcnMuZGVsZXRlQW5kRGlzcG9zZSh0aGluZyk7XG4gKiB9KTtcbiAqXG4gKiBhbnl0aGluZ0RhdGFNdWx0aXBsZXhlci5ldmVudChlID0+IHtcbiAqICAgY29uc29sZS5sb2coJ1NvbWV0aGluZyBmaXJlZCBkYXRhICcgKyBlLmRhdGEpXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRNdWx0aXBsZXhlcjxUPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGVtaXR0ZXI6IEVtaXR0ZXI8VD47XG5cdHByaXZhdGUgaGFzTGlzdGVuZXJzID0gZmFsc2U7XG5cdHByaXZhdGUgZXZlbnRzOiB7IGV2ZW50OiBFdmVudDxUPjsgbGlzdGVuZXI6IElEaXNwb3NhYmxlIHwgbnVsbCB9W10gPSBbXTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcjxUPih7XG5cdFx0XHRvbldpbGxBZGRGaXJzdExpc3RlbmVyOiAoKSA9PiB0aGlzLm9uRmlyc3RMaXN0ZW5lckFkZCgpLFxuXHRcdFx0b25EaWRSZW1vdmVMYXN0TGlzdGVuZXI6ICgpID0+IHRoaXMub25MYXN0TGlzdGVuZXJSZW1vdmUoKVxuXHRcdH0pO1xuXHR9XG5cblx0Z2V0IGV2ZW50KCk6IEV2ZW50PFQ+IHtcblx0XHRyZXR1cm4gdGhpcy5lbWl0dGVyLmV2ZW50O1xuXHR9XG5cblx0YWRkKGV2ZW50OiBFdmVudDxUPik6IElEaXNwb3NhYmxlIHtcblx0XHRjb25zdCBlID0geyBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBudWxsIH07XG5cdFx0dGhpcy5ldmVudHMucHVzaChlKTtcblxuXHRcdGlmICh0aGlzLmhhc0xpc3RlbmVycykge1xuXHRcdFx0dGhpcy5ob29rKGUpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5oYXNMaXN0ZW5lcnMpIHtcblx0XHRcdFx0dGhpcy51bmhvb2soZSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGlkeCA9IHRoaXMuZXZlbnRzLmluZGV4T2YoZSk7XG5cdFx0XHR0aGlzLmV2ZW50cy5zcGxpY2UoaWR4LCAxKTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHRvRGlzcG9zYWJsZShjcmVhdGVTaW5nbGVDYWxsRnVuY3Rpb24oZGlzcG9zZSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBvbkZpcnN0TGlzdGVuZXJBZGQoKTogdm9pZCB7XG5cdFx0dGhpcy5oYXNMaXN0ZW5lcnMgPSB0cnVlO1xuXHRcdHRoaXMuZXZlbnRzLmZvckVhY2goZSA9PiB0aGlzLmhvb2soZSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBvbkxhc3RMaXN0ZW5lclJlbW92ZSgpOiB2b2lkIHtcblx0XHR0aGlzLmhhc0xpc3RlbmVycyA9IGZhbHNlO1xuXHRcdHRoaXMuZXZlbnRzLmZvckVhY2goZSA9PiB0aGlzLnVuaG9vayhlKSk7XG5cdH1cblxuXHRwcml2YXRlIGhvb2soZTogeyBldmVudDogRXZlbnQ8VD47IGxpc3RlbmVyOiBJRGlzcG9zYWJsZSB8IG51bGwgfSk6IHZvaWQge1xuXHRcdGUubGlzdGVuZXIgPSBlLmV2ZW50KHIgPT4gdGhpcy5lbWl0dGVyLmZpcmUocikpO1xuXHR9XG5cblx0cHJpdmF0ZSB1bmhvb2soZTogeyBldmVudDogRXZlbnQ8VD47IGxpc3RlbmVyOiBJRGlzcG9zYWJsZSB8IG51bGwgfSk6IHZvaWQge1xuXHRcdGUubGlzdGVuZXI/LmRpc3Bvc2UoKTtcblx0XHRlLmxpc3RlbmVyID0gbnVsbDtcblx0fVxuXG5cdGRpc3Bvc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5lbWl0dGVyLmRpc3Bvc2UoKTtcblxuXHRcdGZvciAoY29uc3QgZSBvZiB0aGlzLmV2ZW50cykge1xuXHRcdFx0ZS5saXN0ZW5lcj8uZGlzcG9zZSgpO1xuXHRcdH1cblx0XHR0aGlzLmV2ZW50cyA9IFtdO1xuXHR9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUR5bmFtaWNMaXN0RXZlbnRNdWx0aXBsZXhlcjxURXZlbnRUeXBlPiBleHRlbmRzIElEaXNwb3NhYmxlIHtcblx0cmVhZG9ubHkgZXZlbnQ6IEV2ZW50PFRFdmVudFR5cGU+O1xufVxuZXhwb3J0IGNsYXNzIER5bmFtaWNMaXN0RXZlbnRNdWx0aXBsZXhlcjxUSXRlbSwgVEV2ZW50VHlwZT4gaW1wbGVtZW50cyBJRHluYW1pY0xpc3RFdmVudE11bHRpcGxleGVyPFRFdmVudFR5cGU+IHtcblx0cHJpdmF0ZSByZWFkb25seSBfc3RvcmUgPSBuZXcgRGlzcG9zYWJsZVN0b3JlKCk7XG5cblx0cmVhZG9ubHkgZXZlbnQ6IEV2ZW50PFRFdmVudFR5cGU+O1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdGl0ZW1zOiBUSXRlbVtdLFxuXHRcdG9uQWRkSXRlbTogRXZlbnQ8VEl0ZW0+LFxuXHRcdG9uUmVtb3ZlSXRlbTogRXZlbnQ8VEl0ZW0+LFxuXHRcdGdldEV2ZW50OiAoaXRlbTogVEl0ZW0pID0+IEV2ZW50PFRFdmVudFR5cGU+XG5cdCkge1xuXHRcdGNvbnN0IG11bHRpcGxleGVyID0gdGhpcy5fc3RvcmUuYWRkKG5ldyBFdmVudE11bHRpcGxleGVyPFRFdmVudFR5cGU+KCkpO1xuXHRcdGNvbnN0IGl0ZW1MaXN0ZW5lcnMgPSB0aGlzLl9zdG9yZS5hZGQobmV3IERpc3Bvc2FibGVNYXA8VEl0ZW0sIElEaXNwb3NhYmxlPigpKTtcblxuXHRcdGZ1bmN0aW9uIGFkZEl0ZW0oaW5zdGFuY2U6IFRJdGVtKSB7XG5cdFx0XHRpdGVtTGlzdGVuZXJzLnNldChpbnN0YW5jZSwgbXVsdGlwbGV4ZXIuYWRkKGdldEV2ZW50KGluc3RhbmNlKSkpO1xuXHRcdH1cblxuXHRcdC8vIEV4aXN0aW5nIGl0ZW1zXG5cdFx0Zm9yIChjb25zdCBpbnN0YW5jZSBvZiBpdGVtcykge1xuXHRcdFx0YWRkSXRlbShpbnN0YW5jZSk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkZWQgaXRlbXNcblx0XHR0aGlzLl9zdG9yZS5hZGQob25BZGRJdGVtKGluc3RhbmNlID0+IHtcblx0XHRcdGFkZEl0ZW0oaW5zdGFuY2UpO1xuXHRcdH0pKTtcblxuXHRcdC8vIFJlbW92ZWQgaXRlbXNcblx0XHR0aGlzLl9zdG9yZS5hZGQob25SZW1vdmVJdGVtKGluc3RhbmNlID0+IHtcblx0XHRcdGl0ZW1MaXN0ZW5lcnMuZGVsZXRlQW5kRGlzcG9zZShpbnN0YW5jZSk7XG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5ldmVudCA9IG11bHRpcGxleGVyLmV2ZW50O1xuXHR9XG5cblx0ZGlzcG9zZSgpIHtcblx0XHR0aGlzLl9zdG9yZS5kaXNwb3NlKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgRXZlbnRCdWZmZXJlciBpcyB1c2VmdWwgaW4gc2l0dWF0aW9ucyBpbiB3aGljaCB5b3Ugd2FudFxuICogdG8gZGVsYXkgZmlyaW5nIHlvdXIgZXZlbnRzIGR1cmluZyBzb21lIGNvZGUuXG4gKiBZb3UgY2FuIHdyYXAgdGhhdCBjb2RlIGFuZCBiZSBzdXJlIHRoYXQgdGhlIGV2ZW50IHdpbGwgbm90XG4gKiBiZSBmaXJlZCBkdXJpbmcgdGhhdCB3cmFwLlxuICpcbiAqIGBgYFxuICogY29uc3QgZW1pdHRlcjogRW1pdHRlcjtcbiAqIGNvbnN0IGRlbGF5ZXIgPSBuZXcgRXZlbnREZWxheWVyKCk7XG4gKiBjb25zdCBkZWxheWVkRXZlbnQgPSBkZWxheWVyLndyYXBFdmVudChlbWl0dGVyLmV2ZW50KTtcbiAqXG4gKiBkZWxheWVkRXZlbnQoY29uc29sZS5sb2cpO1xuICpcbiAqIGRlbGF5ZXIuYnVmZmVyRXZlbnRzKCgpID0+IHtcbiAqICAgZW1pdHRlci5maXJlKCk7IC8vIGV2ZW50IHdpbGwgbm90IGJlIGZpcmVkIHlldFxuICogfSk7XG4gKlxuICogLy8gZXZlbnQgd2lsbCBvbmx5IGJlIGZpcmVkIGF0IHRoaXMgcG9pbnRcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRCdWZmZXJlciB7XG5cblx0cHJpdmF0ZSBkYXRhOiB7IGJ1ZmZlcnM6IEZ1bmN0aW9uW10gfVtdID0gW107XG5cblx0d3JhcEV2ZW50PFQ+KGV2ZW50OiBFdmVudDxUPik6IEV2ZW50PFQ+O1xuXHR3cmFwRXZlbnQ8VD4oZXZlbnQ6IEV2ZW50PFQ+LCByZWR1Y2U6IChsYXN0OiBUIHwgdW5kZWZpbmVkLCBldmVudDogVCkgPT4gVCk6IEV2ZW50PFQ+O1xuXHR3cmFwRXZlbnQ8VCwgTz4oZXZlbnQ6IEV2ZW50PFQ+LCByZWR1Y2U6IChsYXN0OiBPIHwgdW5kZWZpbmVkLCBldmVudDogVCkgPT4gTywgaW5pdGlhbDogTyk6IEV2ZW50PE8+O1xuXHR3cmFwRXZlbnQ8VCwgTz4oZXZlbnQ6IEV2ZW50PFQ+LCByZWR1Y2U/OiAobGFzdDogVCB8IE8gfCB1bmRlZmluZWQsIGV2ZW50OiBUKSA9PiBUIHwgTywgaW5pdGlhbD86IE8pOiBFdmVudDxPIHwgVD4ge1xuXHRcdHJldHVybiAobGlzdGVuZXIsIHRoaXNBcmdzPywgZGlzcG9zYWJsZXM/KSA9PiB7XG5cdFx0XHRyZXR1cm4gZXZlbnQoaSA9PiB7XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aCAtIDFdO1xuXG5cdFx0XHRcdC8vIE5vbi1yZWR1Y2Ugc2NlbmFyaW9cblx0XHRcdFx0aWYgKCFyZWR1Y2UpIHtcblx0XHRcdFx0XHQvLyBCdWZmZXJpbmcgY2FzZVxuXHRcdFx0XHRcdGlmIChkYXRhKSB7XG5cdFx0XHRcdFx0XHRkYXRhLmJ1ZmZlcnMucHVzaCgoKSA9PiBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBpKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIE5vdCBidWZmZXJpbmcgY2FzZVxuXHRcdFx0XHRcdFx0bGlzdGVuZXIuY2FsbCh0aGlzQXJncywgaSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlZHVjZSBzY2VuYXJpb1xuXHRcdFx0XHRjb25zdCByZWR1Y2VEYXRhID0gZGF0YSBhcyB0eXBlb2YgZGF0YSAmIHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgYWNjdW11bGF0ZWQgaXRlbXMgdGhhdCB3aWxsIGJlIHJlZHVjZWQuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0aXRlbXM/OiBUW107XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIHJlZHVjZWQgcmVzdWx0IGNhY2hlZCB0byBiZSBzaGFyZWQgd2l0aCBvdGhlciBsaXN0ZW5lcnMuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0cmVkdWNlZFJlc3VsdD86IFQgfCBPO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIE5vdCBidWZmZXJpbmcgY2FzZVxuXHRcdFx0XHRpZiAoIXJlZHVjZURhdGEpIHtcblx0XHRcdFx0XHQvLyBUT0RPOiBJcyB0aGVyZSBhIHdheSB0byBjYWNoZSB0aGlzIHJlZHVjZSBjYWxsIGZvciBhbGwgbGlzdGVuZXJzP1xuXHRcdFx0XHRcdGxpc3RlbmVyLmNhbGwodGhpc0FyZ3MsIHJlZHVjZShpbml0aWFsLCBpKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQnVmZmVyaW5nIGNhc2Vcblx0XHRcdFx0cmVkdWNlRGF0YS5pdGVtcyA/Pz0gW107XG5cdFx0XHRcdHJlZHVjZURhdGEuaXRlbXMucHVzaChpKTtcblx0XHRcdFx0aWYgKHJlZHVjZURhdGEuYnVmZmVycy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHQvLyBJbmNsdWRlIGEgc2luZ2xlIGJ1ZmZlcmVkIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWR1Y2UgYWxsIGV2ZW50cyB3aGVuIHdlJ3JlIGRvbmUgYnVmZmVyaW5nIGV2ZW50c1xuXHRcdFx0XHRcdGRhdGEuYnVmZmVycy5wdXNoKCgpID0+IHtcblx0XHRcdFx0XHRcdC8vIGNhY2hlIHRoZSByZWR1Y2VkIHJlc3VsdCBzbyB0aGF0IHRoZSB2YWx1ZSBjYW4gYmUgc2hhcmVkIGFjcm9zcyBhbGwgbGlzdGVuZXJzXG5cdFx0XHRcdFx0XHRyZWR1Y2VEYXRhLnJlZHVjZWRSZXN1bHQgPz89IGluaXRpYWxcblx0XHRcdFx0XHRcdFx0PyByZWR1Y2VEYXRhLml0ZW1zIS5yZWR1Y2UocmVkdWNlIGFzIChsYXN0OiBPIHwgdW5kZWZpbmVkLCBldmVudDogVCkgPT4gTywgaW5pdGlhbClcblx0XHRcdFx0XHRcdFx0OiByZWR1Y2VEYXRhLml0ZW1zIS5yZWR1Y2UocmVkdWNlIGFzIChsYXN0OiBUIHwgdW5kZWZpbmVkLCBldmVudDogVCkgPT4gVCk7XG5cdFx0XHRcdFx0XHRsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCByZWR1Y2VEYXRhLnJlZHVjZWRSZXN1bHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB1bmRlZmluZWQsIGRpc3Bvc2FibGVzKTtcblx0XHR9O1xuXHR9XG5cblx0YnVmZmVyRXZlbnRzPFIgPSB2b2lkPihmbjogKCkgPT4gUik6IFIge1xuXHRcdGNvbnN0IGRhdGEgPSB7IGJ1ZmZlcnM6IG5ldyBBcnJheTxGdW5jdGlvbj4oKSB9O1xuXHRcdHRoaXMuZGF0YS5wdXNoKGRhdGEpO1xuXHRcdGNvbnN0IHIgPSBmbigpO1xuXHRcdHRoaXMuZGF0YS5wb3AoKTtcblx0XHRkYXRhLmJ1ZmZlcnMuZm9yRWFjaChmbHVzaCA9PiBmbHVzaCgpKTtcblx0XHRyZXR1cm4gcjtcblx0fVxufVxuXG4vKipcbiAqIEEgUmVsYXkgaXMgYW4gZXZlbnQgZm9yd2FyZGVyIHdoaWNoIGZ1bmN0aW9ucyBhcyBhIHJlcGx1Z2FiYmxlIGV2ZW50IHBpcGUuXG4gKiBPbmNlIGNyZWF0ZWQsIHlvdSBjYW4gY29ubmVjdCBhbiBpbnB1dCBldmVudCB0byBpdCBhbmQgaXQgd2lsbCBzaW1wbHkgZm9yd2FyZFxuICogZXZlbnRzIGZyb20gdGhhdCBpbnB1dCBldmVudCB0aHJvdWdoIGl0cyBvd24gYGV2ZW50YCBwcm9wZXJ0eS4gVGhlIGBpbnB1dGBcbiAqIGNhbiBiZSBjaGFuZ2VkIGF0IGFueSBwb2ludCBpbiB0aW1lLlxuICovXG5leHBvcnQgY2xhc3MgUmVsYXk8VD4gaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG5cblx0cHJpdmF0ZSBsaXN0ZW5pbmcgPSBmYWxzZTtcblx0cHJpdmF0ZSBpbnB1dEV2ZW50OiBFdmVudDxUPiA9IEV2ZW50Lk5vbmU7XG5cdHByaXZhdGUgaW5wdXRFdmVudExpc3RlbmVyOiBJRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUuTm9uZTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGVtaXR0ZXIgPSBuZXcgRW1pdHRlcjxUPih7XG5cdFx0b25EaWRBZGRGaXJzdExpc3RlbmVyOiAoKSA9PiB7XG5cdFx0XHR0aGlzLmxpc3RlbmluZyA9IHRydWU7XG5cdFx0XHR0aGlzLmlucHV0RXZlbnRMaXN0ZW5lciA9IHRoaXMuaW5wdXRFdmVudCh0aGlzLmVtaXR0ZXIuZmlyZSwgdGhpcy5lbWl0dGVyKTtcblx0XHR9LFxuXHRcdG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOiAoKSA9PiB7XG5cdFx0XHR0aGlzLmxpc3RlbmluZyA9IGZhbHNlO1xuXHRcdFx0dGhpcy5pbnB1dEV2ZW50TGlzdGVuZXIuZGlzcG9zZSgpO1xuXHRcdH1cblx0fSk7XG5cblx0cmVhZG9ubHkgZXZlbnQ6IEV2ZW50PFQ+ID0gdGhpcy5lbWl0dGVyLmV2ZW50O1xuXG5cdHNldCBpbnB1dChldmVudDogRXZlbnQ8VD4pIHtcblx0XHR0aGlzLmlucHV0RXZlbnQgPSBldmVudDtcblxuXHRcdGlmICh0aGlzLmxpc3RlbmluZykge1xuXHRcdFx0dGhpcy5pbnB1dEV2ZW50TGlzdGVuZXIuZGlzcG9zZSgpO1xuXHRcdFx0dGhpcy5pbnB1dEV2ZW50TGlzdGVuZXIgPSBldmVudCh0aGlzLmVtaXR0ZXIuZmlyZSwgdGhpcy5lbWl0dGVyKTtcblx0XHR9XG5cdH1cblxuXHRkaXNwb3NlKCkge1xuXHRcdHRoaXMuaW5wdXRFdmVudExpc3RlbmVyLmRpc3Bvc2UoKTtcblx0XHR0aGlzLmVtaXR0ZXIuZGlzcG9zZSgpO1xuXHR9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZhbHVlV2l0aENoYW5nZUV2ZW50PFQ+IHtcblx0cmVhZG9ubHkgb25EaWRDaGFuZ2U6IEV2ZW50PHZvaWQ+O1xuXHRnZXQgdmFsdWUoKTogVDtcbn1cblxuZXhwb3J0IGNsYXNzIFZhbHVlV2l0aENoYW5nZUV2ZW50PFQ+IGltcGxlbWVudHMgSVZhbHVlV2l0aENoYW5nZUV2ZW50PFQ+IHtcblx0cHVibGljIHN0YXRpYyBjb25zdDxUPih2YWx1ZTogVCk6IElWYWx1ZVdpdGhDaGFuZ2VFdmVudDxUPiB7XG5cdFx0cmV0dXJuIG5ldyBDb25zdFZhbHVlV2l0aENoYW5nZUV2ZW50KHZhbHVlKTtcblx0fVxuXG5cdHByaXZhdGUgcmVhZG9ubHkgX29uRGlkQ2hhbmdlID0gbmV3IEVtaXR0ZXI8dm9pZD4oKTtcblx0cmVhZG9ubHkgb25EaWRDaGFuZ2U6IEV2ZW50PHZvaWQ+ID0gdGhpcy5fb25EaWRDaGFuZ2UuZXZlbnQ7XG5cblx0Y29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWU6IFQpIHsgfVxuXG5cdGdldCB2YWx1ZSgpOiBUIHtcblx0XHRyZXR1cm4gdGhpcy5fdmFsdWU7XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsdWU6IFQpIHtcblx0XHRpZiAodmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XG5cdFx0XHR0aGlzLl92YWx1ZSA9IHZhbHVlO1xuXHRcdFx0dGhpcy5fb25EaWRDaGFuZ2UuZmlyZSh1bmRlZmluZWQpO1xuXHRcdH1cblx0fVxufVxuXG5jbGFzcyBDb25zdFZhbHVlV2l0aENoYW5nZUV2ZW50PFQ+IGltcGxlbWVudHMgSVZhbHVlV2l0aENoYW5nZUV2ZW50PFQ+IHtcblx0cHVibGljIHJlYWRvbmx5IG9uRGlkQ2hhbmdlOiBFdmVudDx2b2lkPiA9IEV2ZW50Lk5vbmU7XG5cblx0Y29uc3RydWN0b3IocmVhZG9ubHkgdmFsdWU6IFQpIHsgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBESU1fT1BBQ0lUWSwgVEVYVF9CQVNFTElORSB9IGZyb20gJy4vQ29uc3RhbnRzJztcbmltcG9ydCB7IHRyeURyYXdDdXN0b21DaGFyIH0gZnJvbSAnLi9DdXN0b21HbHlwaHMnO1xuaW1wb3J0IHsgY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0LCB0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IsIGlzUG93ZXJsaW5lR2x5cGgsIGlzUmVzdHJpY3RlZFBvd2VybGluZUdseXBoLCB0aHJvd0lmRmFsc3kgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzJztcbmltcG9ydCB7IElCb3VuZGluZ0JveCwgSUNoYXJBdGxhc0NvbmZpZywgSVJhc3Rlcml6ZWRHbHlwaCwgSVRleHR1cmVBdGxhcyB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgTlVMTF9DT0xPUiwgY2hhbm5lbHMsIGNvbG9yLCByZ2JhIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IEZvdXJLZXlNYXAgfSBmcm9tICdjb21tb24vTXVsdGlLZXlNYXAnO1xuaW1wb3J0IHsgSWRsZVRhc2tRdWV1ZSB9IGZyb20gJ2NvbW1vbi9UYXNrUXVldWUnO1xuaW1wb3J0IHsgSUNvbG9yIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgQXR0cmlidXRlcywgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9FWFQsIFVuZGVybGluZVN0eWxlIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSVVuaWNvZGVTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEVtaXR0ZXIgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9ldmVudCc7XG5cbi8qKlxuICogQSBzaGFyZWQgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gZHJhdyBub3RoaW5nIGZvciBhIHBhcnRpY3VsYXIgY2VsbC5cbiAqL1xuY29uc3QgTlVMTF9SQVNURVJJWkVEX0dMWVBIOiBJUmFzdGVyaXplZEdseXBoID0ge1xuICB0ZXh0dXJlUGFnZTogMCxcbiAgdGV4dHVyZVBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgdGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlOiB7IHg6IDAsIHk6IDAgfSxcbiAgb2Zmc2V0OiB7IHg6IDAsIHk6IDAgfSxcbiAgc2l6ZTogeyB4OiAwLCB5OiAwIH0sXG4gIHNpemVDbGlwU3BhY2U6IHsgeDogMCwgeTogMCB9XG59O1xuXG5jb25zdCBUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkcgPSAyO1xuXG5jb25zdCBlbnVtIENvbnN0YW50cyB7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHBpeGVsIHBhZGRpbmcgdG8gYWxsb3cgaW4gZWFjaCByb3cuIFNldHRpbmcgdGhpcyB0byB6ZXJvIHdvdWxkIG1ha2UgdGhlIGF0bGFzXG4gICAqIHBhZ2UgcGFjayBhcyB0aWdodGx5IGFzIHBvc3NpYmxlLCBidXQgbW9yZSBwYWdlcyB3b3VsZCBlbmQgdXAgYmVpbmcgY3JlYXRlZCBhcyBhIHJlc3VsdC5cbiAgICovXG4gIFJPV19QSVhFTF9USFJFU0hPTEQgPSAyLFxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGV4dHVyZSBzaXplIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgYWN0dWFsIGhhcmR3YXJlIG1heGltdW0gdHVybnMgb3V0IHRvIGJlLiBUaGlzXG4gICAqIGlzIGVuZm9yY2VkIHRvIGVuc3VyZSB1cGxvYWRpbmcgdGhlIHRleHR1cmUgc3RpbGwgZmluaXNoZXMgaW4gYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lLiBBXG4gICAqIDQwOTYgc3F1YXJlZCBpbWFnZSB0YWtlcyB1cCAxNk1CIG9mIEdQVSBtZW1vcnkuXG4gICAqL1xuICBGT1JDRURfTUFYX1RFWFRVUkVfU0laRSA9IDQwOTZcbn1cblxuaW50ZXJmYWNlIElDaGFyQXRsYXNBY3RpdmVSb3cge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRnbHlwaCA9IHVuZGVmaW5lZDtcblxuZXhwb3J0IGNsYXNzIFRleHR1cmVBdGxhcyBpbXBsZW1lbnRzIElUZXh0dXJlQXRsYXMge1xuICBwcml2YXRlIF9kaWRXYXJtVXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9jYWNoZU1hcDogRm91cktleU1hcDxudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIElSYXN0ZXJpemVkR2x5cGg+ID0gbmV3IEZvdXJLZXlNYXAoKTtcbiAgcHJpdmF0ZSBfY2FjaGVNYXBDb21iaW5lZDogRm91cktleU1hcDxzdHJpbmcsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIElSYXN0ZXJpemVkR2x5cGg+ID0gbmV3IEZvdXJLZXlNYXAoKTtcblxuICAvLyBUaGUgdGV4dHVyZSB0aGF0IHRoZSBhdGxhcyBpcyBkcmF3biB0b1xuICBwcml2YXRlIF9wYWdlczogQXRsYXNQYWdlW10gPSBbXTtcbiAgcHVibGljIGdldCBwYWdlcygpOiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIHZlcnNpb246IG51bWJlciB9W10geyByZXR1cm4gdGhpcy5fcGFnZXM7IH1cblxuICAvLyBUaGUgc2V0IG9mIGF0bGFzIHBhZ2VzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG9cbiAgcHJpdmF0ZSBfYWN0aXZlUGFnZXM6IEF0bGFzUGFnZVtdID0gW107XG4gIHByaXZhdGUgX292ZXJmbG93U2l6ZVBhZ2U6IEF0bGFzUGFnZSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF90bXBDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICAvLyBBIHRlbXBvcmFyeSBjb250ZXh0IHRoYXQgZ2x5cGhzIGFyZSBkcmF3biB0byBiZWZvcmUgYmVpbmcgdHJhbnNmZXJlZCB0byB0aGUgYXRsYXMuXG4gIHByaXZhdGUgX3RtcEN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIHByaXZhdGUgX3dvcmtCb3VuZGluZ0JveDogSUJvdW5kaW5nQm94ID0geyB0b3A6IDAsIGxlZnQ6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDAgfTtcbiAgcHJpdmF0ZSBfd29ya0F0dHJpYnV0ZURhdGE6IEF0dHJpYnV0ZURhdGEgPSBuZXcgQXR0cmlidXRlRGF0YSgpO1xuXG4gIHByaXZhdGUgX3RleHR1cmVTaXplOiBudW1iZXIgPSA1MTI7XG5cbiAgcHVibGljIHN0YXRpYyBtYXhBdGxhc1BhZ2VzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzdGF0aWMgbWF4VGV4dHVyZVNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IG5ldyBFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMgPSBuZXcgRW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogSUNoYXJBdGxhc0NvbmZpZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF91bmljb2RlU2VydmljZTogSVVuaWNvZGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuX2NyZWF0ZU5ld1BhZ2UoKTtcbiAgICB0aGlzLl90bXBDYW52YXMgPSBjcmVhdGVDYW52YXMoXG4gICAgICBfZG9jdW1lbnQsXG4gICAgICB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoICogNCArIFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDIsXG4gICAgICB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCArIFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDJcbiAgICApO1xuICAgIHRoaXMuX3RtcEN0eCA9IHRocm93SWZGYWxzeSh0aGlzLl90bXBDYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7XG4gICAgICBhbHBoYTogdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5LFxuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fdG1wQ2FudmFzLnJlbW92ZSgpO1xuICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VzKSB7XG4gICAgICBwYWdlLmNhbnZhcy5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgcHVibGljIHdhcm1VcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RpZFdhcm1VcCkge1xuICAgICAgdGhpcy5fZG9XYXJtVXAoKTtcbiAgICAgIHRoaXMuX2RpZFdhcm1VcCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZG9XYXJtVXAoKTogdm9pZCB7XG4gICAgLy8gUHJlLWZpbGwgd2l0aCBBU0NJSSAzMy0xMjYsIHRoaXMgaXMgbm90IHVyZ2VudCBhbmQgZG9uZSBpbiBpZGxlIGNhbGxiYWNrc1xuICAgIGNvbnN0IHF1ZXVlID0gbmV3IElkbGVUYXNrUXVldWUoKTtcbiAgICBmb3IgKGxldCBpID0gMzM7IGkgPCAxMjY7IGkrKykge1xuICAgICAgcXVldWUuZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGVNYXAuZ2V0KGksIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfRVhUKSkge1xuICAgICAgICAgIGNvbnN0IHJhc3Rlcml6ZWRHbHlwaCA9IHRoaXMuX2RyYXdUb0NhY2hlKGksIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfRVhULCBmYWxzZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQoaSwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9DT0xPUiwgREVGQVVMVF9FWFQsIHJhc3Rlcml6ZWRHbHlwaCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3RDbGVhck1vZGVsID0gZmFsc2U7XG4gIHB1YmxpYyBiZWdpbkZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2xlYXJNb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclRleHR1cmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BhZ2VzWzBdLmN1cnJlbnRSb3cueCA9PT0gMCAmJiB0aGlzLl9wYWdlc1swXS5jdXJyZW50Um93LnkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMuX3BhZ2VzKSB7XG4gICAgICBwYWdlLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMuX2NhY2hlTWFwLmNsZWFyKCk7XG4gICAgdGhpcy5fY2FjaGVNYXBDb21iaW5lZC5jbGVhcigpO1xuICAgIHRoaXMuX2RpZFdhcm1VcCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlTmV3UGFnZSgpOiBBdGxhc1BhZ2Uge1xuICAgIC8vIFRyeSBtZXJnZSB0aGUgc2V0IG9mIHRoZSA0IG1vc3QgdXNlZCBwYWdlcyBvZiB0aGUgbGFyZ2VzdCBzaXplLiBUaGlzIGlzIGlzIGRlZmVycmVkIHRvIGFcbiAgICAvLyBtaWNyb3Rhc2sgdG8gZW5zdXJlIGl0IGRvZXMgbm90IGludGVycnVwdCB0ZXh0dXJlcyB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgaW4gdGhlIGN1cnJlbnRcbiAgICAvLyBhbmltYXRpb24gZnJhbWUgd2hpY2ggd291bGQgcmVzdWx0IGluIGJsYW5rIHJlbmRlcmVkIGFyZWFzLiBUaGlzIGlzIGFjdHVhbGx5IG5vdCB0aGF0XG4gICAgLy8gZXhwZW5zaXZlIHJlbGF0aXZlIHRvIGRyYXdpbmcgdGhlIGdseXBocywgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3YWl0IGZvciBhbiBpZGxlIGNhbGxiYWNrLlxuICAgIGlmIChUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyAmJiB0aGlzLl9wYWdlcy5sZW5ndGggPj0gTWF0aC5tYXgoNCwgVGV4dHVyZUF0bGFzLm1heEF0bGFzUGFnZXMpKSB7XG4gICAgICAvLyBGaW5kIHRoZSBzZXQgb2YgdGhlIGxhcmdlc3QgNCBpbWFnZXMsIGJlbG93IHRoZSBtYXhpbXVtIHNpemUsIHdpdGggdGhlIGhpZ2hlc3RcbiAgICAgIC8vIHBlcmNlbnRhZ2VzIHVzZWRcbiAgICAgIGNvbnN0IHBhZ2VzQnlTaXplID0gdGhpcy5fcGFnZXMuZmlsdGVyKGUgPT4ge1xuICAgICAgICByZXR1cm4gZS5jYW52YXMud2lkdGggKiAyIDw9IChUZXh0dXJlQXRsYXMubWF4VGV4dHVyZVNpemUgfHwgQ29uc3RhbnRzLkZPUkNFRF9NQVhfVEVYVFVSRV9TSVpFKTtcbiAgICAgIH0pLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGIuY2FudmFzLndpZHRoICE9PSBhLmNhbnZhcy53aWR0aCkge1xuICAgICAgICAgIHJldHVybiBiLmNhbnZhcy53aWR0aCAtIGEuY2FudmFzLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiLnBlcmNlbnRhZ2VVc2VkIC0gYS5wZXJjZW50YWdlVXNlZDtcbiAgICAgIH0pO1xuICAgICAgbGV0IHNhbWVTaXplSSA9IC0xO1xuICAgICAgbGV0IHNpemUgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlc0J5U2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGFnZXNCeVNpemVbaV0uY2FudmFzLndpZHRoICE9PSBzaXplKSB7XG4gICAgICAgICAgc2FtZVNpemVJID0gaTtcbiAgICAgICAgICBzaXplID0gcGFnZXNCeVNpemVbaV0uY2FudmFzLndpZHRoO1xuICAgICAgICB9IGVsc2UgaWYgKGkgLSBzYW1lU2l6ZUkgPT09IDMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHYXRoZXIgZGV0YWlscyBvZiB0aGUgbWVyZ2VcbiAgICAgIGNvbnN0IG1lcmdpbmdQYWdlcyA9IHBhZ2VzQnlTaXplLnNsaWNlKHNhbWVTaXplSSwgc2FtZVNpemVJICsgNCk7XG4gICAgICBjb25zdCBzb3J0ZWRNZXJnaW5nUGFnZXNJbmRleGVzID0gbWVyZ2luZ1BhZ2VzLm1hcChlID0+IGUuZ2x5cGhzWzBdLnRleHR1cmVQYWdlKS5zb3J0KChhLCBiKSA9PiBhID4gYiA/IDEgOiAtMSk7XG4gICAgICBjb25zdCBtZXJnZWRQYWdlSW5kZXggPSB0aGlzLnBhZ2VzLmxlbmd0aCAtIG1lcmdpbmdQYWdlcy5sZW5ndGg7XG5cbiAgICAgIC8vIE1lcmdlIGludG8gdGhlIG5ldyBwYWdlXG4gICAgICBjb25zdCBtZXJnZWRQYWdlID0gdGhpcy5fbWVyZ2VQYWdlcyhtZXJnaW5nUGFnZXMsIG1lcmdlZFBhZ2VJbmRleCk7XG4gICAgICBtZXJnZWRQYWdlLnZlcnNpb24rKztcblxuICAgICAgLy8gRGVsZXRlIHRoZSBwYWdlcywgc2hpZnRpbmcgZ2x5cGggdGV4dHVyZSBwYWdlcyBhcyBuZWVkZWRcbiAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRNZXJnaW5nUGFnZXNJbmRleGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMuX2RlbGV0ZVBhZ2Uoc29ydGVkTWVyZ2luZ1BhZ2VzSW5kZXhlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgbmV3IG1lcmdlZCBwYWdlIHRvIHRoZSBlbmRcbiAgICAgIHRoaXMucGFnZXMucHVzaChtZXJnZWRQYWdlKTtcblxuICAgICAgLy8gUmVxdWVzdCB0aGUgbW9kZWwgdG8gYmUgY2xlYXJlZCB0byByZWZyZXNoIGFsbCB0ZXh0dXJlIHBhZ2VzLlxuICAgICAgdGhpcy5fcmVxdWVzdENsZWFyTW9kZWwgPSB0cnVlO1xuICAgICAgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZmlyZShtZXJnZWRQYWdlLmNhbnZhcyk7XG4gICAgfVxuXG4gICAgLy8gQWxsIG5ldyBhdGxhcyBwYWdlcyBhcmUgY3JlYXRlZCBzbWFsbCBhcyB0aGV5IGFyZSBoaWdobHkgZHluYW1pY1xuICAgIGNvbnN0IG5ld1BhZ2UgPSBuZXcgQXRsYXNQYWdlKHRoaXMuX2RvY3VtZW50LCB0aGlzLl90ZXh0dXJlU2l6ZSk7XG4gICAgdGhpcy5fcGFnZXMucHVzaChuZXdQYWdlKTtcbiAgICB0aGlzLl9hY3RpdmVQYWdlcy5wdXNoKG5ld1BhZ2UpO1xuICAgIHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLmZpcmUobmV3UGFnZS5jYW52YXMpO1xuICAgIHJldHVybiBuZXdQYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWVyZ2VQYWdlcyhtZXJnaW5nUGFnZXM6IEF0bGFzUGFnZVtdLCBtZXJnZWRQYWdlSW5kZXg6IG51bWJlcik6IEF0bGFzUGFnZSB7XG4gICAgY29uc3QgbWVyZ2VkU2l6ZSA9IG1lcmdpbmdQYWdlc1swXS5jYW52YXMud2lkdGggKiAyO1xuICAgIGNvbnN0IG1lcmdlZFBhZ2UgPSBuZXcgQXRsYXNQYWdlKHRoaXMuX2RvY3VtZW50LCBtZXJnZWRTaXplLCBtZXJnaW5nUGFnZXMpO1xuICAgIGZvciAoY29uc3QgW2ksIHBdIG9mIG1lcmdpbmdQYWdlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHhPZmZzZXQgPSBpICogcC5jYW52YXMud2lkdGggJSBtZXJnZWRTaXplO1xuICAgICAgY29uc3QgeU9mZnNldCA9IE1hdGguZmxvb3IoaSAvIDIpICogcC5jYW52YXMuaGVpZ2h0O1xuICAgICAgbWVyZ2VkUGFnZS5jdHguZHJhd0ltYWdlKHAuY2FudmFzLCB4T2Zmc2V0LCB5T2Zmc2V0KTtcbiAgICAgIGZvciAoY29uc3QgZyBvZiBwLmdseXBocykge1xuICAgICAgICBnLnRleHR1cmVQYWdlID0gbWVyZ2VkUGFnZUluZGV4O1xuICAgICAgICBnLnNpemVDbGlwU3BhY2UueCA9IGcuc2l6ZS54IC8gbWVyZ2VkU2l6ZTtcbiAgICAgICAgZy5zaXplQ2xpcFNwYWNlLnkgPSBnLnNpemUueSAvIG1lcmdlZFNpemU7XG4gICAgICAgIGcudGV4dHVyZVBvc2l0aW9uLnggKz0geE9mZnNldDtcbiAgICAgICAgZy50ZXh0dXJlUG9zaXRpb24ueSArPSB5T2Zmc2V0O1xuICAgICAgICBnLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS54ID0gZy50ZXh0dXJlUG9zaXRpb24ueCAvIG1lcmdlZFNpemU7XG4gICAgICAgIGcudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnkgPSBnLnRleHR1cmVQb3NpdGlvbi55IC8gbWVyZ2VkU2l6ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMuZmlyZShwLmNhbnZhcyk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgbWVyZ2luZyBwYWdlIGZyb20gYWN0aXZlIHBhZ2VzIGlmIGl0IHdhcyB0aGVyZVxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9hY3RpdmVQYWdlcy5pbmRleE9mKHApO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVQYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkUGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2RlbGV0ZVBhZ2UocGFnZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9wYWdlcy5zcGxpY2UocGFnZUluZGV4LCAxKTtcbiAgICBmb3IgKGxldCBqID0gcGFnZUluZGV4OyBqIDwgdGhpcy5fcGFnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGFkanVzdGluZ1BhZ2UgPSB0aGlzLl9wYWdlc1tqXTtcbiAgICAgIGZvciAoY29uc3QgZyBvZiBhZGp1c3RpbmdQYWdlLmdseXBocykge1xuICAgICAgICBnLnRleHR1cmVQYWdlLS07XG4gICAgICB9XG4gICAgICBhZGp1c3RpbmdQYWdlLnZlcnNpb24rKztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0UmFzdGVyaXplZEdseXBoQ29tYmluZWRDaGFyKGNoYXJzOiBzdHJpbmcsIGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIGV4dDogbnVtYmVyLCByZXN0cmljdFRvQ2VsbEhlaWdodDogYm9vbGVhbiwgZG9tQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCk6IElSYXN0ZXJpemVkR2x5cGgge1xuICAgIHJldHVybiB0aGlzLl9nZXRGcm9tQ2FjaGVNYXAodGhpcy5fY2FjaGVNYXBDb21iaW5lZCwgY2hhcnMsIGJnLCBmZywgZXh0LCByZXN0cmljdFRvQ2VsbEhlaWdodCwgZG9tQ29udGFpbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYXN0ZXJpemVkR2x5cGgoY29kZTogbnVtYmVyLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgcmVzdHJpY3RUb0NlbGxIZWlnaHQ6IGJvb2xlYW4sIGRvbUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQpOiBJUmFzdGVyaXplZEdseXBoIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0RnJvbUNhY2hlTWFwKHRoaXMuX2NhY2hlTWFwLCBjb2RlLCBiZywgZmcsIGV4dCwgcmVzdHJpY3RUb0NlbGxIZWlnaHQsIGRvbUNvbnRhaW5lcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZ2x5cGhzIHRleHR1cmUgY29vcmRzLCBkcmF3aW5nIHRoZSB0ZXh0dXJlIGlmIGl0J3Mgbm90IGFscmVhZHlcbiAgICovXG4gIHByaXZhdGUgX2dldEZyb21DYWNoZU1hcChcbiAgICBjYWNoZU1hcDogRm91cktleU1hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIElSYXN0ZXJpemVkR2x5cGg+LFxuICAgIGtleTogc3RyaW5nIHwgbnVtYmVyLFxuICAgIGJnOiBudW1iZXIsXG4gICAgZmc6IG51bWJlcixcbiAgICBleHQ6IG51bWJlcixcbiAgICByZXN0cmljdFRvQ2VsbEhlaWdodDogYm9vbGVhbixcbiAgICBkb21Db250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkXG4gICk6IElSYXN0ZXJpemVkR2x5cGgge1xuICAgICRnbHlwaCA9IGNhY2hlTWFwLmdldChrZXksIGJnLCBmZywgZXh0KTtcbiAgICBpZiAoISRnbHlwaCkge1xuICAgICAgJGdseXBoID0gdGhpcy5fZHJhd1RvQ2FjaGUoa2V5LCBiZywgZmcsIGV4dCwgcmVzdHJpY3RUb0NlbGxIZWlnaHQsIGRvbUNvbnRhaW5lcik7XG4gICAgICBjYWNoZU1hcC5zZXQoa2V5LCBiZywgZmcsIGV4dCwgJGdseXBoKTtcbiAgICB9XG4gICAgcmV0dXJuICRnbHlwaDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbG9yRnJvbUFuc2lJbmRleChpZHg6IG51bWJlcik6IElDb2xvciB7XG4gICAgaWYgKGlkeCA+PSB0aGlzLl9jb25maWcuY29sb3JzLmFuc2kubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbG9yIGZvdW5kIGZvciBpZHggJyArIGlkeCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmFuc2lbaWR4XTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEJhY2tncm91bmRDb2xvcihiZ0NvbG9yTW9kZTogbnVtYmVyLCBiZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4sIGRpbTogYm9vbGVhbik6IElDb2xvciB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSkge1xuICAgICAgLy8gVGhlIGJhY2tncm91bmQgY29sb3IgbWlnaHQgaGF2ZSBzb21lIHRyYW5zcGFyZW5jeSwgc28gd2UgbmVlZCB0byByZW5kZXIgaXQgYXMgZnVsbHlcbiAgICAgIC8vIHRyYW5zcGFyZW50IGluIHRoZSBhdGxhcy4gT3RoZXJ3aXNlIHdlJ2QgZW5kIHVwIGRyYXdpbmcgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQgdHdpY2VcbiAgICAgIC8vIGFyb3VuZCB0aGUgYW50aS1hbGlhc2VkIGVkZ2VzIG9mIHRoZSBnbHlwaCwgYW5kIGl0IHdvdWxkIGxvb2sgdG9vIGRhcmsuXG4gICAgICByZXR1cm4gTlVMTF9DT0xPUjtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0OiBJQ29sb3I7XG4gICAgc3dpdGNoIChiZ0NvbG9yTW9kZSkge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICByZXN1bHQgPSB0aGlzLl9nZXRDb2xvckZyb21BbnNpSW5kZXgoYmdDb2xvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgY29uc3QgYXJyID0gQXR0cmlidXRlRGF0YS50b0NvbG9yUkdCKGJnQ29sb3IpO1xuICAgICAgICByZXN1bHQgPSBjaGFubmVscy50b0NvbG9yKGFyclswXSwgYXJyWzFdLCBhcnJbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGludmVyc2UpIHtcbiAgICAgICAgICByZXN1bHQgPSBjb2xvci5vcGFxdWUodGhpcy5fY29uZmlnLmNvbG9ycy5mb3JlZ3JvdW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLl9jb25maWcuY29sb3JzLmJhY2tncm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gSWdub3JlIGFscGhhIGNoYW5uZWwgd2hlbiBhbGxvd1RyYW5zcGFyZW5jeSBpcyBmYWxzZVxuICAgIGlmICghdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5KSB7XG4gICAgICByZXN1bHQgPSBjb2xvci5vcGFxdWUocmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Rm9yZWdyb3VuZENvbG9yKGJnOiBudW1iZXIsIGJnQ29sb3JNb2RlOiBudW1iZXIsIGJnQ29sb3I6IG51bWJlciwgZmc6IG51bWJlciwgZmdDb2xvck1vZGU6IG51bWJlciwgZmdDb2xvcjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuLCBkaW06IGJvb2xlYW4sIGJvbGQ6IGJvb2xlYW4sIGV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHM6IGJvb2xlYW4pOiBJQ29sb3Ige1xuICAgIGNvbnN0IG1pbmltdW1Db250cmFzdENvbG9yID0gdGhpcy5fZ2V0TWluaW11bUNvbnRyYXN0Q29sb3IoYmcsIGJnQ29sb3JNb2RlLCBiZ0NvbG9yLCBmZywgZmdDb2xvck1vZGUsIGZnQ29sb3IsIGludmVyc2UsIGJvbGQsIGRpbSwgZXhjbHVkZUZyb21Db250cmFzdFJhdGlvRGVtYW5kcyk7XG4gICAgaWYgKG1pbmltdW1Db250cmFzdENvbG9yKSB7XG4gICAgICByZXR1cm4gbWluaW11bUNvbnRyYXN0Q29sb3I7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogSUNvbG9yO1xuICAgIHN3aXRjaCAoZmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyAmJiBib2xkICYmIGZnQ29sb3IgPCA4KSB7XG4gICAgICAgICAgZmdDb2xvciArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChmZ0NvbG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICBjb25zdCBhcnIgPSBBdHRyaWJ1dGVEYXRhLnRvQ29sb3JSR0IoZmdDb2xvcik7XG4gICAgICAgIHJlc3VsdCA9IGNoYW5uZWxzLnRvQ29sb3IoYXJyWzBdLCBhcnJbMV0sIGFyclsyXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLl9jb25maWcuY29sb3JzLmZvcmVncm91bmQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXNlIGFuIG9wYXF1ZSBjb2xvciByZWdhcmRsZXNzIG9mIGFsbG93VHJhbnNwYXJlbmN5XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbGxvd1RyYW5zcGFyZW5jeSkge1xuICAgICAgcmVzdWx0ID0gY29sb3Iub3BhcXVlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGltIHRvIHRoZSBjb2xvciwgb3BhY2l0eSBpcyBmaW5lIHRvIHVzZSBmb3IgdGhlIGZvcmVncm91bmQgY29sb3JcbiAgICBpZiAoZGltKSB7XG4gICAgICByZXN1bHQgPSBjb2xvci5tdWx0aXBseU9wYWNpdHkocmVzdWx0LCBESU1fT1BBQ0lUWSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmVCYWNrZ3JvdW5kUmdiYShiZ0NvbG9yTW9kZTogbnVtYmVyLCBiZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHN3aXRjaCAoYmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChiZ0NvbG9yKS5yZ2JhO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgcmV0dXJuIGJnQ29sb3IgPDwgODtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGludmVyc2UpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZC5yZ2JhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmVGb3JlZ3JvdW5kUmdiYShmZ0NvbG9yTW9kZTogbnVtYmVyLCBmZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4sIGJvbGQ6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHN3aXRjaCAoZmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyAmJiBib2xkICYmIGZnQ29sb3IgPCA4KSB7XG4gICAgICAgICAgZmdDb2xvciArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDb2xvckZyb21BbnNpSW5kZXgoZmdDb2xvcikucmdiYTtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgIHJldHVybiBmZ0NvbG9yIDw8IDg7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuYmFja2dyb3VuZC5yZ2JhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmZvcmVncm91bmQucmdiYTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRNaW5pbXVtQ29udHJhc3RDb2xvcihiZzogbnVtYmVyLCBiZ0NvbG9yTW9kZTogbnVtYmVyLCBiZ0NvbG9yOiBudW1iZXIsIGZnOiBudW1iZXIsIGZnQ29sb3JNb2RlOiBudW1iZXIsIGZnQ29sb3I6IG51bWJlciwgaW52ZXJzZTogYm9vbGVhbiwgYm9sZDogYm9vbGVhbiwgZGltOiBib29sZWFuLCBleGNsdWRlRnJvbUNvbnRyYXN0UmF0aW9EZW1hbmRzOiBib29sZWFuKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLm1pbmltdW1Db250cmFzdFJhdGlvID09PSAxIHx8IGV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVHJ5IGdldCBmcm9tIGNhY2hlIGZpcnN0XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLl9nZXRDb250cmFzdENhY2hlKGRpbSk7XG4gICAgY29uc3QgYWRqdXN0ZWRDb2xvciA9IGNhY2hlLmdldENvbG9yKGJnLCBmZyk7XG4gICAgaWYgKGFkanVzdGVkQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGFkanVzdGVkQ29sb3IgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGJnUmdiYSA9IHRoaXMuX3Jlc29sdmVCYWNrZ3JvdW5kUmdiYShiZ0NvbG9yTW9kZSwgYmdDb2xvciwgaW52ZXJzZSk7XG4gICAgY29uc3QgZmdSZ2JhID0gdGhpcy5fcmVzb2x2ZUZvcmVncm91bmRSZ2JhKGZnQ29sb3JNb2RlLCBmZ0NvbG9yLCBpbnZlcnNlLCBib2xkKTtcbiAgICAvLyBEaW0gY2VsbHMgb25seSByZXF1aXJlIGhhbGYgdGhlIGNvbnRyYXN0LCBvdGhlcndpc2UgdGhleSB3b3VsZG4ndCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbVxuICAgIC8vIG5vbi1kaW0gY2VsbHNcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmdSZ2JhLCBmZ1JnYmEsIHRoaXMuX2NvbmZpZy5taW5pbXVtQ29udHJhc3RSYXRpbyAvIChkaW0gPyAyIDogMSkpO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIGNhY2hlLnNldENvbG9yKGJnLCBmZywgbnVsbCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yID0gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQpICYgMHhGRixcbiAgICAgIChyZXN1bHQgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZXN1bHQgPj4gOCkgJiAweEZGXG4gICAgKTtcbiAgICBjYWNoZS5zZXRDb2xvcihiZywgZmcsIGNvbG9yKTtcblxuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbnRyYXN0Q2FjaGUoZGltOiBib29sZWFuKTogSUNvbG9yQ29udHJhc3RDYWNoZSB7XG4gICAgaWYgKGRpbSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuaGFsZkNvbnRyYXN0Q2FjaGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmNvbnRyYXN0Q2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3VG9DYWNoZShjb2RlT3JDaGFyczogbnVtYmVyIHwgc3RyaW5nLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgcmVzdHJpY3RUb0NlbGxIZWlnaHQ6IGJvb2xlYW4sIGRvbUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQpOiBJUmFzdGVyaXplZEdseXBoIHtcbiAgICBjb25zdCBjaGFycyA9IHR5cGVvZiBjb2RlT3JDaGFycyA9PT0gJ251bWJlcicgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVPckNoYXJzKSA6IGNvZGVPckNoYXJzO1xuXG4gICAgLy8gVW5jb21tZW50IGZvciBkZWJ1Z2dpbmdcbiAgICAvLyBjb25zb2xlLmxvZyhgZHJhdyB0byBjYWNoZSBcIiR7Y2hhcnN9XCJgLCBiZywgZmcsIGV4dCk7XG5cbiAgICAvLyBBdHRhY2ggdGhlIGNhbnZhcyB0byB0aGUgRE9NIGluIG9yZGVyIHRvIGluaGVyaXQgZm9udC1mZWF0dXJlLXNldHRpbmdzXG4gICAgLy8gZnJvbSB0aGUgcGFyZW50IGVsZW1lbnRzLiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbGlnYXR1cmVzIGFuZCB2YXJpYW50cyB0b1xuICAgIC8vIHdvcmsuXG4gICAgaWYgKGRvbUNvbnRhaW5lciAmJiB0aGlzLl90bXBDYW52YXMucGFyZW50RWxlbWVudCAhPT0gZG9tQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLl90bXBDYW52YXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGRvbUNvbnRhaW5lci5hcHBlbmQodGhpcy5fdG1wQ2FudmFzKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyAxIGNlbGwgd2lkdGggcGVyIGNoYXJhY3Rlciwgd2l0aCBhIG1pbmltdW0gb2YgMiAoQ0pLKSwgcGx1cyBzb21lIHBhZGRpbmcuIFRoaXMgaXMgdXNlZFxuICAgIC8vIHRvIGRyYXcgdGhlIGdseXBoIHRvIHRoZSBjYW52YXMgYXMgd2VsbCBhcyB0byByZXN0cmljdCB0aGUgYm91bmRpbmcgYm94IHNlYXJjaCB0byBlbnN1cmVcbiAgICAvLyBnaWFudCBsaWdhdHVyZXMgKGVnLiA9PT09PT4pIGRvbid0IGltcGFjdCBvdmVyYWxsIHBlcmZvcm1hbmNlLlxuICAgIGNvbnN0IGFsbG93ZWRXaWR0aCA9IE1hdGgubWluKHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggKiBNYXRoLm1heChjaGFycy5sZW5ndGgsIDIpICsgVE1QX0NBTlZBU19HTFlQSF9QQURESU5HICogMiwgdGhpcy5fY29uZmlnLmRldmljZU1heFRleHR1cmVTaXplKTtcbiAgICBpZiAodGhpcy5fdG1wQ2FudmFzLndpZHRoIDwgYWxsb3dlZFdpZHRoKSB7XG4gICAgICB0aGlzLl90bXBDYW52YXMud2lkdGggPSBhbGxvd2VkV2lkdGg7XG4gICAgfVxuICAgIC8vIEluY2x1ZGUgbGluZSBoZWlnaHQgd2hlbiBkcmF3aW5nIGdseXBoc1xuICAgIGNvbnN0IGFsbG93ZWRIZWlnaHQgPSBNYXRoLm1pbih0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCArIFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDQsIHRoaXMuX3RleHR1cmVTaXplKTtcbiAgICBpZiAodGhpcy5fdG1wQ2FudmFzLmhlaWdodCA8IGFsbG93ZWRIZWlnaHQpIHtcbiAgICAgIHRoaXMuX3RtcENhbnZhcy5oZWlnaHQgPSBhbGxvd2VkSGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuXG4gICAgdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZmcgPSBmZztcbiAgICB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5iZyA9IGJnO1xuICAgIHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmV4dGVuZGVkLmV4dCA9IGV4dDtcblxuICAgIGNvbnN0IGludmlzaWJsZSA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNJbnZpc2libGUoKTtcbiAgICBpZiAoaW52aXNpYmxlKSB7XG4gICAgICByZXR1cm4gTlVMTF9SQVNURVJJWkVEX0dMWVBIO1xuICAgIH1cblxuICAgIGNvbnN0IGJvbGQgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzQm9sZCgpO1xuICAgIGNvbnN0IGludmVyc2UgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzSW52ZXJzZSgpO1xuICAgIGNvbnN0IGRpbSA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNEaW0oKTtcbiAgICBjb25zdCBpdGFsaWMgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzSXRhbGljKCk7XG4gICAgY29uc3QgdW5kZXJsaW5lID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc1VuZGVybGluZSgpO1xuICAgIGNvbnN0IHN0cmlrZXRocm91Z2ggPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzU3RyaWtldGhyb3VnaCgpO1xuICAgIGNvbnN0IG92ZXJsaW5lID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc092ZXJsaW5lKCk7XG4gICAgbGV0IGZnQ29sb3IgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRGZ0NvbG9yKCk7XG4gICAgbGV0IGZnQ29sb3JNb2RlID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0RmdDb2xvck1vZGUoKTtcbiAgICBsZXQgYmdDb2xvciA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldEJnQ29sb3IoKTtcbiAgICBsZXQgYmdDb2xvck1vZGUgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRCZ0NvbG9yTW9kZSgpO1xuICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICBjb25zdCB0ZW1wID0gZmdDb2xvcjtcbiAgICAgIGZnQ29sb3IgPSBiZ0NvbG9yO1xuICAgICAgYmdDb2xvciA9IHRlbXA7XG4gICAgICBjb25zdCB0ZW1wMiA9IGZnQ29sb3JNb2RlO1xuICAgICAgZmdDb2xvck1vZGUgPSBiZ0NvbG9yTW9kZTtcbiAgICAgIGJnQ29sb3JNb2RlID0gdGVtcDI7XG4gICAgfVxuXG4gICAgLy8gZHJhdyB0aGUgYmFja2dyb3VuZFxuICAgIGNvbnN0IGJhY2tncm91bmRDb2xvciA9IHRoaXMuX2dldEJhY2tncm91bmRDb2xvcihiZ0NvbG9yTW9kZSwgYmdDb2xvciwgaW52ZXJzZSwgZGltKTtcbiAgICAvLyBVc2UgYSAnY29weScgY29tcG9zaXRlIG9wZXJhdGlvbiB0byBjbGVhciBhbnkgZXhpc3RpbmcgZ2x5cGggb3V0IG9mIF90bXBDdHhXaXRoQWxwaGEsXG4gICAgLy8gcmVnYXJkbGVzcyBvZiB0cmFuc3BhcmVuY3kgaW4gYmFja2dyb3VuZENvbG9yXG4gICAgdGhpcy5fdG1wQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdjb3B5JztcbiAgICB0aGlzLl90bXBDdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yLmNzcztcbiAgICB0aGlzLl90bXBDdHguZmlsbFJlY3QoMCwgMCwgdGhpcy5fdG1wQ2FudmFzLndpZHRoLCB0aGlzLl90bXBDYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLl90bXBDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcblxuICAgIC8vIGRyYXcgdGhlIGZvcmVncm91bmQvZ2x5cGhcbiAgICBjb25zdCBmb250V2VpZ2h0ID0gYm9sZCA/IHRoaXMuX2NvbmZpZy5mb250V2VpZ2h0Qm9sZCA6IHRoaXMuX2NvbmZpZy5mb250V2VpZ2h0O1xuICAgIGNvbnN0IGZvbnRTdHlsZSA9IGl0YWxpYyA/ICdpdGFsaWMnIDogJyc7XG4gICAgdGhpcy5fdG1wQ3R4LmZvbnQgPVxuICAgICAgYCR7Zm9udFN0eWxlfSAke2ZvbnRXZWlnaHR9ICR7dGhpcy5fY29uZmlnLmZvbnRTaXplICogdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW99cHggJHt0aGlzLl9jb25maWcuZm9udEZhbWlseX1gO1xuICAgIHRoaXMuX3RtcEN0eC50ZXh0QmFzZWxpbmUgPSBURVhUX0JBU0VMSU5FO1xuXG4gICAgY29uc3QgcG93ZXJsaW5lR2x5cGggPSBjaGFycy5sZW5ndGggPT09IDEgJiYgaXNQb3dlcmxpbmVHbHlwaChjaGFycy5jaGFyQ29kZUF0KDApKTtcbiAgICBjb25zdCByZXN0cmljdGVkUG93ZXJsaW5lR2x5cGggPSBjaGFycy5sZW5ndGggPT09IDEgJiYgaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgoY2hhcnMuY2hhckNvZGVBdCgwKSk7XG4gICAgY29uc3QgZm9yZWdyb3VuZENvbG9yID0gdGhpcy5fZ2V0Rm9yZWdyb3VuZENvbG9yKGJnLCBiZ0NvbG9yTW9kZSwgYmdDb2xvciwgZmcsIGZnQ29sb3JNb2RlLCBmZ0NvbG9yLCBpbnZlcnNlLCBkaW0sIGJvbGQsIHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvcihjaGFycy5jaGFyQ29kZUF0KDApKSk7XG4gICAgdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZSA9IGZvcmVncm91bmRDb2xvci5jc3M7XG5cbiAgICAvLyBGb3IgcG93ZXJsaW5lIGdseXBocyBsZWZ0L3RvcCBwYWRkaW5nIGlzIGV4Y2x1ZGVkIChodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3ZzY29kZS9pc3N1ZXMvMTIwMTI5KVxuICAgIGNvbnN0IHBhZGRpbmcgPSByZXN0cmljdGVkUG93ZXJsaW5lR2x5cGggPyAwIDogVE1QX0NBTlZBU19HTFlQSF9QQURESU5HICogMjtcblxuICAgIC8vIERyYXcgY3VzdG9tIGNoYXJhY3RlcnMgaWYgYXBwbGljYWJsZVxuICAgIGxldCBjdXN0b21HbHlwaCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9jb25maWcuY3VzdG9tR2x5cGhzICE9PSBmYWxzZSkge1xuICAgICAgY3VzdG9tR2x5cGggPSB0cnlEcmF3Q3VzdG9tQ2hhcih0aGlzLl90bXBDdHgsIGNoYXJzLCBwYWRkaW5nLCBwYWRkaW5nLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCwgdGhpcy5fY29uZmlnLmZvbnRTaXplLCB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0byBjbGVhciBwaXhlbHMgYmFzZWQgb24gYSB0aHJlc2hvbGQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBnbHlwaCBjb2xvciBhbmQgdGhlXG4gICAgLy8gYmFja2dyb3VuZCBjb2xvci4gVGhpcyBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUgZ2x5cGggY29udGFpbnMgbXVsdGlwbGUgY29sb3JzIHN1Y2ggYXNcbiAgICAvLyB1bmRlcmxpbmUgY29sb3JzIHRvIHByZXZlbnQgaW1wb3J0YW50IGNvbG9ycyBjb3VsZCBnZXQgY2xlYXJlZC5cbiAgICBsZXQgZW5hYmxlQ2xlYXJUaHJlc2hvbGRDaGVjayA9ICFwb3dlcmxpbmVHbHlwaDtcblxuICAgIGxldCBjaFdpZHRoOiBudW1iZXI7XG4gICAgaWYgKHR5cGVvZiBjb2RlT3JDaGFycyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNoV2lkdGggPSB0aGlzLl91bmljb2RlU2VydmljZS53Y3dpZHRoKGNvZGVPckNoYXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hXaWR0aCA9IHRoaXMuX3VuaWNvZGVTZXJ2aWNlLmdldFN0cmluZ0NlbGxXaWR0aChjb2RlT3JDaGFycyk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyB1bmRlcmxpbmVcbiAgICBpZiAodW5kZXJsaW5lKSB7XG4gICAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuICAgICAgY29uc3QgbGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih0aGlzLl9jb25maWcuZm9udFNpemUgKiB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpbyAvIDE1KSk7XG4gICAgICAvLyBXaGVuIHRoZSBsaW5lIHdpZHRoIGlzIG9kZCwgZHJhdyBhdCBhIDAuNSBwb3NpdGlvblxuICAgICAgY29uc3QgeU9mZnNldCA9IGxpbmVXaWR0aCAlIDIgPT09IDEgPyAwLjUgOiAwO1xuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcblxuICAgICAgLy8gVW5kZXJsaW5lIGNvbG9yXG4gICAgICBpZiAodGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNVbmRlcmxpbmVDb2xvckRlZmF1bHQoKSkge1xuICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlU3R5bGUgPSB0aGlzLl90bXBDdHguZmlsbFN0eWxlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc1VuZGVybGluZUNvbG9yUkdCKCkpIHtcbiAgICAgICAgZW5hYmxlQ2xlYXJUaHJlc2hvbGRDaGVjayA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlU3R5bGUgPSBgcmdiKCR7QXR0cmlidXRlRGF0YS50b0NvbG9yUkdCKHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldFVuZGVybGluZUNvbG9yKCkpLmpvaW4oJywnKX0pYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2sgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZnID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0VW5kZXJsaW5lQ29sb3IoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyAmJiB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0JvbGQoKSAmJiBmZyA8IDgpIHtcbiAgICAgICAgICBmZyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChmZykuY3NzO1xuICAgICAgfVxuXG4gICAgICAvLyBVbmRlcmxpbmUgc3R5bGUvc3Ryb2tlXG4gICAgICB0aGlzLl90bXBDdHguYmVnaW5QYXRoKCk7XG4gICAgICBjb25zdCB4TGVmdCA9IHBhZGRpbmc7XG4gICAgICBjb25zdCB5VG9wID0gTWF0aC5jZWlsKHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCkgLSB5T2Zmc2V0IC0gKHJlc3RyaWN0VG9DZWxsSGVpZ2h0ID8gbGluZVdpZHRoICogMiA6IDApO1xuICAgICAgY29uc3QgeU1pZCA9IHlUb3AgKyBsaW5lV2lkdGg7XG4gICAgICBjb25zdCB5Qm90ID0geVRvcCArIGxpbmVXaWR0aCAqIDI7XG4gICAgICBsZXQgbmV4dE9mZnNldCA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldFVuZGVybGluZVZhcmlhbnRPZmZzZXQoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaFdpZHRoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcbiAgICAgICAgY29uc3QgeENoTGVmdCA9IHhMZWZ0ICsgaSAqIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGg7XG4gICAgICAgIGNvbnN0IHhDaFJpZ2h0ID0geExlZnQgKyAoaSArIDEpICogdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aDtcbiAgICAgICAgY29uc3QgeENoTWlkID0geENoTGVmdCArIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLyAyO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlKSB7XG4gICAgICAgICAgY2FzZSBVbmRlcmxpbmVTdHlsZS5ET1VCTEU6XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQsIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeVRvcCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQsIHlCb3QpO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeUJvdCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFVuZGVybGluZVN0eWxlLkNVUkxZOlxuICAgICAgICAgICAgLy8gQ2hvb3NlIHRoZSBiZXppZXIgdG9wIGFuZCBib3R0b20gYmFzZWQgb24gdGhlIGRldmljZSBwaXhlbCByYXRpbywgdGhlIGN1cmx5IGxpbmUgaXNcbiAgICAgICAgICAgIC8vIG1hZGUgdGFsbGVyIHdoZW4gdGhlIGxpbmUgd2lkdGggaXMgIGFzIG90aGVyd2lzZSBpdCdzIG5vdCB2ZXJ5IGNsZWFyIG90aGVyd2lzZS5cbiAgICAgICAgICAgIGNvbnN0IHlDdXJseUJvdCA9IGxpbmVXaWR0aCA8PSAxID8geUJvdCA6IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQgLSBsaW5lV2lkdGggLyAyKSAtIHlPZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCB5Q3VybHlUb3AgPSBsaW5lV2lkdGggPD0gMSA/IHlUb3AgOiBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0ICsgbGluZVdpZHRoIC8gMikgLSB5T2Zmc2V0O1xuICAgICAgICAgICAgLy8gQ2xpcCB0aGUgbGVmdCBhbmQgcmlnaHQgZWRnZXMgb2YgdGhlIHVuZGVybGluZSBzdWNoIHRoYXQgaXQgY2FuIGJlIGRyYXduIGp1c3Qgb3V0c2lkZVxuICAgICAgICAgICAgLy8gdGhlIGVkZ2Ugb2YgdGhlIGNlbGwgdG8gZW5zdXJlIGEgY29udGludW91cyBzdHJva2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdW5kZXJsaW5lZFxuICAgICAgICAgICAgLy8gZ2x5cGhzIGFkamFjZW50IHRvIG9uZSBhbm90aGVyLlxuICAgICAgICAgICAgY29uc3QgY2xpcFJlZ2lvbiA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgICAgIGNsaXBSZWdpb24ucmVjdCh4Q2hMZWZ0LCB5VG9wLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoLCB5Qm90IC0geVRvcCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguY2xpcChjbGlwUmVnaW9uKTtcbiAgICAgICAgICAgIC8vIFN0YXJ0IDEvMiBjZWxsIGJlZm9yZSBhbmQgZW5kIDEvMiBjZWxscyBhZnRlciB0byBlbnN1cmUgYSBzbW9vdGggY3VydmUgd2l0aCBvdGhlclxuICAgICAgICAgICAgLy8gY2VsbHNcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCAtIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLyAyLCB5TWlkKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgICAgICAgICAgICB4Q2hMZWZ0IC0gdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAvIDIsIHlDdXJseVRvcCxcbiAgICAgICAgICAgICAgeENoTGVmdCwgeUN1cmx5VG9wLFxuICAgICAgICAgICAgICB4Q2hMZWZ0LCB5TWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmJlemllckN1cnZlVG8oXG4gICAgICAgICAgICAgIHhDaExlZnQsIHlDdXJseUJvdCxcbiAgICAgICAgICAgICAgeENoTWlkLCB5Q3VybHlCb3QsXG4gICAgICAgICAgICAgIHhDaE1pZCwgeU1pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgICAgICAgICAgICB4Q2hNaWQsIHlDdXJseVRvcCxcbiAgICAgICAgICAgICAgeENoUmlnaHQsIHlDdXJseVRvcCxcbiAgICAgICAgICAgICAgeENoUmlnaHQsIHlNaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICAgICAgeENoUmlnaHQsIHlDdXJseUJvdCxcbiAgICAgICAgICAgICAgeENoUmlnaHQgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC8gMiwgeUN1cmx5Qm90LFxuICAgICAgICAgICAgICB4Q2hSaWdodCArIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLyAyLCB5TWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBVbmRlcmxpbmVTdHlsZS5ET1RURUQ6XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IG5leHRPZmZzZXQgPT09IDAgPyAwIDpcbiAgICAgICAgICAgICAgKG5leHRPZmZzZXQgPj0gbGluZVdpZHRoID8gbGluZVdpZHRoICogMiAtIG5leHRPZmZzZXQgOiBsaW5lV2lkdGggLSBuZXh0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgLy8gYSBsaW5lIGFuZCBhIGdhcC5cbiAgICAgICAgICAgIGNvbnN0IGlzTGluZVN0YXJ0ID0gbmV4dE9mZnNldCA+PSBsaW5lV2lkdGggPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgPT09IGZhbHNlIHx8IG9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zZXRMaW5lRGFzaChbTWF0aC5yb3VuZChsaW5lV2lkdGgpLCBNYXRoLnJvdW5kKGxpbmVXaWR0aCldKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0ICsgb2Zmc2V0V2lkdGgsIHlUb3ApO1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaFJpZ2h0LCB5VG9wKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zZXRMaW5lRGFzaChbTWF0aC5yb3VuZChsaW5lV2lkdGgpLCBNYXRoLnJvdW5kKGxpbmVXaWR0aCldKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0LCB5VG9wKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hMZWZ0ICsgb2Zmc2V0V2lkdGgsIHlUb3ApO1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQgKyBvZmZzZXRXaWR0aCArIGxpbmVXaWR0aCwgeVRvcCk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlUb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE9mZnNldCA9IGNvbXB1dGVOZXh0VmFyaWFudE9mZnNldCh4Q2hSaWdodCAtIHhDaExlZnQsIGxpbmVXaWR0aCwgbmV4dE9mZnNldCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFVuZGVybGluZVN0eWxlLkRBU0hFRDpcbiAgICAgICAgICAgIGNvbnN0IGxpbmVSYXRpbyA9IDAuNjtcbiAgICAgICAgICAgIGNvbnN0IGdhcFJhdGlvID0gMC4zO1xuICAgICAgICAgICAgLy8gRW5kIGxpbmUgcmF0aW8gaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byAwLjFcbiAgICAgICAgICAgIGNvbnN0IHhDaFdpZHRoID0geENoUmlnaHQgLSB4Q2hMZWZ0O1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IE1hdGguZmxvb3IobGluZVJhdGlvICogeENoV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgZ2FwID0gTWF0aC5mbG9vcihnYXBSYXRpbyAqIHhDaFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHhDaFdpZHRoIC0gbGluZSAtIGdhcDtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zZXRMaW5lRGFzaChbbGluZSwgZ2FwLCBlbmRdKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCwgeVRvcCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaFJpZ2h0LCB5VG9wKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgVW5kZXJsaW5lU3R5bGUuU0lOR0xFOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQsIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeVRvcCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlKCk7XG4gICAgICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuXG4gICAgICAvLyBEcmF3IHN0cm9rZSBpbiB0aGUgYmFja2dyb3VuZCBjb2xvciBmb3Igbm9uIGN1c3RvbSBjaGFyYWN0ZXJzIGluIG9yZGVyIHRvIGdpdmUgYW4gb3V0bGluZVxuICAgICAgLy8gYmV0d2VlbiB0aGUgdGV4dCBhbmQgdGhlIHVuZGVybGluZS4gT25seSBkbyB0aGlzIHdoZW4gZm9udCBzaXplIGlzID49IDEyIGFzIHRoZSB1bmRlcmxpbmVcbiAgICAgIC8vIGxvb2tzIG9kZCB3aGVuIHRoZSBmb250IHNpemUgaXMgdG9vIHNtYWxsXG4gICAgICBpZiAoIWN1c3RvbUdseXBoICYmIHRoaXMuX2NvbmZpZy5mb250U2l6ZSA+PSAxMikge1xuICAgICAgICAvLyBUaGlzIG9ubHkgd29ya3Mgd2hlbiB0cmFuc3BhcmVuY3kgaXMgZGlzYWJsZWQgYmVjYXVzZSBpdCdzIG5vdCBjbGVhciBob3cgdG8gY2xlYXIgc3Ryb2tlZFxuICAgICAgICAvLyB0ZXh0XG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5ICYmIGNoYXJzICE9PSAnICcpIHtcbiAgICAgICAgICAvLyBNZWFzdXJlIHRoZSB0ZXh0LCBvbmx5IGRyYXcgdGhlIHN0cm9rZSBpZiB0aGVyZSBpcyBhIGRlc2NlbnQgYmV5b25kIGFuIGFscGhhYmV0aWMgdGV4dFxuICAgICAgICAgIC8vIGJhc2VsaW5lXG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcbiAgICAgICAgICB0aGlzLl90bXBDdHgudGV4dEJhc2VsaW5lID0gJ2FscGhhYmV0aWMnO1xuICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLl90bXBDdHgubWVhc3VyZVRleHQoY2hhcnMpO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgaWYgKCdhY3R1YWxCb3VuZGluZ0JveERlc2NlbnQnIGluIG1ldHJpY3MgJiYgbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveERlc2NlbnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHRyYW5zbGF0ZXMgdG8gMS8yIHRoZSBsaW5lIHdpZHRoIGluIGVpdGhlciBkaXJlY3Rpb25cbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG4gICAgICAgICAgICAvLyBDbGlwIHRoZSByZWdpb24gdG8gb25seSBkcmF3IGluIHZhbGlkIHBpeGVscyBuZWFyIHRoZSB1bmRlcmxpbmUgdG8gYXZvaWQgYSBzbGlnaHRcbiAgICAgICAgICAgIC8vIG91dGxpbmUgYXJvdW5kIHRoZSB3aG9sZSBnbHlwaCwgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIHBpeGVscyBpbiB0aGUgZ2x5cGggYXQgdGhlIHRvcFxuICAgICAgICAgICAgLy8gd2hpY2ggd291bGQgaW5jcmVhc2UgR1BVIG1lbW9yeSBkZW1hbmRzXG4gICAgICAgICAgICBjb25zdCBjbGlwUmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICAgICAgICAgICAgY2xpcFJlZ2lvbi5yZWN0KHhMZWZ0LCB5VG9wIC0gTWF0aC5jZWlsKGxpbmVXaWR0aCAvIDIpLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoICogY2hXaWR0aCwgeUJvdCAtIHlUb3AgKyBNYXRoLmNlaWwobGluZVdpZHRoIC8gMikpO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmNsaXAoY2xpcFJlZ2lvbik7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVdpZHRoID0gdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8gKiAzO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gYmFja2dyb3VuZENvbG9yLmNzcztcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VUZXh0KGNoYXJzLCBwYWRkaW5nLCBwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPdmVybGluZVxuICAgIGlmIChvdmVybGluZSkge1xuICAgICAgY29uc3QgbGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih0aGlzLl9jb25maWcuZm9udFNpemUgKiB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpbyAvIDE1KSk7XG4gICAgICBjb25zdCB5T2Zmc2V0ID0gbGluZVdpZHRoICUgMiA9PT0gMSA/IDAuNSA6IDA7XG4gICAgICB0aGlzLl90bXBDdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZTtcbiAgICAgIHRoaXMuX3RtcEN0eC5iZWdpblBhdGgoKTtcbiAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8ocGFkZGluZywgcGFkZGluZyArIHlPZmZzZXQpO1xuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyhwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJXaWR0aCAqIGNoV2lkdGgsIHBhZGRpbmcgKyB5T2Zmc2V0KTtcbiAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2UoKTtcbiAgICB9XG5cbiAgICAvLyBEcmF3IHRoZSBjaGFyYWN0ZXJcbiAgICBpZiAoIWN1c3RvbUdseXBoKSB7XG4gICAgICB0aGlzLl90bXBDdHguZmlsbFRleHQoY2hhcnMsIHBhZGRpbmcsIHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBjaGFyYWN0ZXIgaXMgdW5kZXJzY29yZSBhbmQgYmV5b25kIHRoZSBjZWxsIGJvdW5kcywgc2hpZnQgaXQgdXAgdW50aWwgaXQgaXMgdmlzaWJsZVxuICAgIC8vIGV2ZW4gb24gdGhlIGJvdHRvbSByb3csIHRyeSBmb3IgYSBtYXhpbXVtIG9mIDUgcGl4ZWxzLlxuICAgIGlmIChjaGFycyA9PT0gJ18nICYmICF0aGlzLl9jb25maWcuYWxsb3dUcmFuc3BhcmVuY3kpIHtcbiAgICAgIGxldCBpc0JleW9uZENlbGxCb3VuZHMgPSBjbGVhckNvbG9yKHRoaXMuX3RtcEN0eC5nZXRJbWFnZURhdGEocGFkZGluZywgcGFkZGluZywgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCwgdGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQpLCBiYWNrZ3JvdW5kQ29sb3IsIGZvcmVncm91bmRDb2xvciwgZW5hYmxlQ2xlYXJUaHJlc2hvbGRDaGVjayk7XG4gICAgICBpZiAoaXNCZXlvbmRDZWxsQm91bmRzKSB7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IDE7IG9mZnNldCA8PSA1OyBvZmZzZXQrKykge1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvci5jc3M7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMuX3RtcENhbnZhcy53aWR0aCwgdGhpcy5fdG1wQ2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICB0aGlzLl90bXBDdHguZmlsbFRleHQoY2hhcnMsIHBhZGRpbmcsIHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCAtIG9mZnNldCk7XG4gICAgICAgICAgaXNCZXlvbmRDZWxsQm91bmRzID0gY2xlYXJDb2xvcih0aGlzLl90bXBDdHguZ2V0SW1hZ2VEYXRhKHBhZGRpbmcsIHBhZGRpbmcsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGgsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsSGVpZ2h0KSwgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3IsIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2spO1xuICAgICAgICAgIGlmICghaXNCZXlvbmRDZWxsQm91bmRzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcmF3IHN0cm9rZXRocm91Z2hcbiAgICBpZiAoc3RyaWtldGhyb3VnaCkge1xuICAgICAgY29uc3QgbGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih0aGlzLl9jb25maWcuZm9udFNpemUgKiB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpbyAvIDEwKSk7XG4gICAgICBjb25zdCB5T2Zmc2V0ID0gdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCAlIDIgPT09IDEgPyAwLjUgOiAwOyAvLyBXaGVuIHRoZSB3aWR0aCBpcyBvZGQsIGRyYXcgYXQgMC41IHBvc2l0aW9uXG4gICAgICB0aGlzLl90bXBDdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZTtcbiAgICAgIHRoaXMuX3RtcEN0eC5iZWdpblBhdGgoKTtcbiAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8ocGFkZGluZywgcGFkZGluZyArIE1hdGguZmxvb3IodGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQgLyAyKSAtIHlPZmZzZXQpO1xuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyhwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJXaWR0aCAqIGNoV2lkdGgsIHBhZGRpbmcgKyBNYXRoLmZsb29yKHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0IC8gMikgLSB5T2Zmc2V0KTtcbiAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuXG4gICAgLy8gY2xlYXIgdGhlIGJhY2tncm91bmQgZnJvbSB0aGUgY2hhcmFjdGVyIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGRyYXdpbmcgb3ZlciB0aGUgcHJldmlvdXNcbiAgICAvLyBjaGFyYWN0ZXIgaWYgaXQgZXh0ZW5kcyBwYXN0IGl0J3MgYm91bmRzXG4gICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5fdG1wQ3R4LmdldEltYWdlRGF0YShcbiAgICAgIDAsIDAsIHRoaXMuX3RtcENhbnZhcy53aWR0aCwgdGhpcy5fdG1wQ2FudmFzLmhlaWdodFxuICAgICk7XG5cbiAgICAvLyBDbGVhciBvdXQgdGhlIGJhY2tncm91bmQgY29sb3IgYW5kIGRldGVybWluZSBpZiB0aGUgZ2x5cGggaXMgZW1wdHkuXG4gICAgbGV0IGlzRW1wdHk6IGJvb2xlYW47XG4gICAgaWYgKCF0aGlzLl9jb25maWcuYWxsb3dUcmFuc3BhcmVuY3kpIHtcbiAgICAgIGlzRW1wdHkgPSBjbGVhckNvbG9yKGltYWdlRGF0YSwgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3IsIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0VtcHR5ID0gY2hlY2tDb21wbGV0ZWx5VHJhbnNwYXJlbnQoaW1hZ2VEYXRhKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZW1wdHkgZ2x5cGhzXG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIHJldHVybiBOVUxMX1JBU1RFUklaRURfR0xZUEg7XG4gICAgfVxuXG4gICAgY29uc3QgcmFzdGVyaXplZEdseXBoID0gdGhpcy5fZmluZEdseXBoQm91bmRpbmdCb3goaW1hZ2VEYXRhLCB0aGlzLl93b3JrQm91bmRpbmdCb3gsIGFsbG93ZWRXaWR0aCwgcmVzdHJpY3RlZFBvd2VybGluZUdseXBoLCBjdXN0b21HbHlwaCwgcGFkZGluZyk7XG5cbiAgICAvLyBGaW5kIHRoZSBiZXN0IGF0bGFzIHJvdyB0byB1c2VcbiAgICBsZXQgYWN0aXZlUGFnZTogQXRsYXNQYWdlO1xuICAgIGxldCBhY3RpdmVSb3c6IElDaGFyQXRsYXNBY3RpdmVSb3c7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBhY3RpdmUgcGFnZXMgKHRoZSBsYXN0IHNtYWxsZXN0IDQgd2VyZSBtZXJnZWQpLCBjcmVhdGUgYSBuZXcgb25lXG4gICAgICBpZiAodGhpcy5fYWN0aXZlUGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IG5ld1BhZ2UgPSB0aGlzLl9jcmVhdGVOZXdQYWdlKCk7XG4gICAgICAgIGFjdGl2ZVBhZ2UgPSBuZXdQYWdlO1xuICAgICAgICBhY3RpdmVSb3cgPSBuZXdQYWdlLmN1cnJlbnRSb3c7XG4gICAgICAgIGFjdGl2ZVJvdy5oZWlnaHQgPSByYXN0ZXJpemVkR2x5cGguc2l6ZS55O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBiZXN0IGN1cnJlbnQgcm93IGZyb20gYWxsIGFjdGl2ZSBwYWdlc1xuICAgICAgYWN0aXZlUGFnZSA9IHRoaXMuX2FjdGl2ZVBhZ2VzW3RoaXMuX2FjdGl2ZVBhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgYWN0aXZlUm93ID0gYWN0aXZlUGFnZS5jdXJyZW50Um93O1xuICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX2FjdGl2ZVBhZ2VzKSB7XG4gICAgICAgIGlmIChyYXN0ZXJpemVkR2x5cGguc2l6ZS55IDw9IHAuY3VycmVudFJvdy5oZWlnaHQpIHtcbiAgICAgICAgICBhY3RpdmVQYWdlID0gcDtcbiAgICAgICAgICBhY3RpdmVSb3cgPSBwLmN1cnJlbnRSb3c7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogVGhpcyBhbGdvcml0aG0gY291bGQgYmUgc2ltcGxpZmllZDpcbiAgICAgIC8vIC0gU2VhcmNoIGZvciB0aGUgcGFnZSB3aXRoIFJPV19QSVhFTF9USFJFU0hPTEQgaW4gbWluZFxuICAgICAgLy8gLSBLZWVwIHRyYWNrIG9mIGN1cnJlbnQvZml4ZWQgcm93cyBpbiBhIE1hcFxuXG4gICAgICAvLyBSZXBsYWNlIHRoZSBiZXN0IGN1cnJlbnQgcm93IHdpdGggYSBmaXhlZCByb3cgaWYgdGhlcmUgaXMgb25lIGF0IGxlYXN0IGFzIGdvb2QgYXMgdGhlXG4gICAgICAvLyBjdXJyZW50IHJvdy4gU2VhcmNoIGluIHJldmVyc2UgdG8gcHJpb3JpdGl6ZSBmaWxsaW5nIGluIG9sZGVyIHBhZ2VzLlxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX2FjdGl2ZVBhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuX2FjdGl2ZVBhZ2VzW2ldLmZpeGVkUm93cykge1xuICAgICAgICAgIGlmIChyb3cuaGVpZ2h0IDw9IGFjdGl2ZVJvdy5oZWlnaHQgJiYgcmFzdGVyaXplZEdseXBoLnNpemUueSA8PSByb3cuaGVpZ2h0KSB7XG4gICAgICAgICAgICBhY3RpdmVQYWdlID0gdGhpcy5fYWN0aXZlUGFnZXNbaV07XG4gICAgICAgICAgICBhY3RpdmVSb3cgPSByb3c7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYWdlIGZvciBvdmVyc2l6ZWQgZ2x5cGhzIGFzIHRoZXkgY29tZSB1cFxuICAgICAgaWYgKHJhc3Rlcml6ZWRHbHlwaC5zaXplLnggPiB0aGlzLl90ZXh0dXJlU2l6ZSkge1xuICAgICAgICBpZiAoIXRoaXMuX292ZXJmbG93U2l6ZVBhZ2UpIHtcbiAgICAgICAgICB0aGlzLl9vdmVyZmxvd1NpemVQYWdlID0gbmV3IEF0bGFzUGFnZSh0aGlzLl9kb2N1bWVudCwgdGhpcy5fY29uZmlnLmRldmljZU1heFRleHR1cmVTaXplKTtcbiAgICAgICAgICB0aGlzLnBhZ2VzLnB1c2godGhpcy5fb3ZlcmZsb3dTaXplUGFnZSk7XG5cbiAgICAgICAgICAvLyBSZXF1ZXN0IHRoZSBtb2RlbCB0byBiZSBjbGVhcmVkIHRvIHJlZnJlc2ggYWxsIHRleHR1cmUgcGFnZXMuXG4gICAgICAgICAgdGhpcy5fcmVxdWVzdENsZWFyTW9kZWwgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLmZpcmUodGhpcy5fb3ZlcmZsb3dTaXplUGFnZS5jYW52YXMpO1xuICAgICAgICB9XG4gICAgICAgIGFjdGl2ZVBhZ2UgPSB0aGlzLl9vdmVyZmxvd1NpemVQYWdlO1xuICAgICAgICBhY3RpdmVSb3cgPSB0aGlzLl9vdmVyZmxvd1NpemVQYWdlLmN1cnJlbnRSb3c7XG4gICAgICAgIC8vIE1vdmUgdG8gbmV4dCByb3cgaWYgbmVjZXNzYXJ5XG4gICAgICAgIGlmIChhY3RpdmVSb3cueCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnggPj0gYWN0aXZlUGFnZS5jYW52YXMud2lkdGgpIHtcbiAgICAgICAgICBhY3RpdmVSb3cueCA9IDA7XG4gICAgICAgICAgYWN0aXZlUm93LnkgKz0gYWN0aXZlUm93LmhlaWdodDtcbiAgICAgICAgICBhY3RpdmVSb3cuaGVpZ2h0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhZ2UgaWYgdG9vIG11Y2ggdmVydGljYWwgc3BhY2Ugd291bGQgYmUgd2FzdGVkIG9yIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbVxuICAgICAgLy8gbGVmdCBpbiB0aGUgcGFnZS4gVGhlIHByZXZpb3VzIGFjdGl2ZSByb3cgd2lsbCBiZWNvbWUgZml4ZWQgaW4gdGhlIHByb2Nlc3MgYXMgaXQgbm93IGhhcyBhXG4gICAgICAvLyBmaXhlZCBoZWlnaHRcbiAgICAgIGlmIChhY3RpdmVSb3cueSArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPj0gYWN0aXZlUGFnZS5jYW52YXMuaGVpZ2h0IHx8IGFjdGl2ZVJvdy5oZWlnaHQgPiByYXN0ZXJpemVkR2x5cGguc2l6ZS55ICsgQ29uc3RhbnRzLlJPV19QSVhFTF9USFJFU0hPTEQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgZml4ZWQgaGVpZ2h0IHJvdywgY3JlYXRpbmcgYSBuZXcgcGFnZSBpZiB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBvbiB0aGVcbiAgICAgICAgLy8gY3VycmVudCBwYWdlXG4gICAgICAgIGxldCB3YXNQYWdlQW5kUm93Rm91bmQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFjdGl2ZVBhZ2UuY3VycmVudFJvdy55ICsgYWN0aXZlUGFnZS5jdXJyZW50Um93LmhlaWdodCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPj0gYWN0aXZlUGFnZS5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgcGFnZSB3aXRoIHJvb20gdG8gY3JlYXRlIHRoZSBuZXcgcm93IG9uXG4gICAgICAgICAgbGV0IGNhbmRpZGF0ZVBhZ2U6IEF0bGFzUGFnZSB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9hY3RpdmVQYWdlcykge1xuICAgICAgICAgICAgaWYgKHAuY3VycmVudFJvdy55ICsgcC5jdXJyZW50Um93LmhlaWdodCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPCBwLmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgY2FuZGlkYXRlUGFnZSA9IHA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2FuZGlkYXRlUGFnZSkge1xuICAgICAgICAgICAgYWN0aXZlUGFnZSA9IGNhbmRpZGF0ZVBhZ2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJlZm9yZSBjcmVhdGluZyBhIG5ldyBhdGxhcyBwYWdlIHRoYXQgd291bGQgdHJpZ2dlciBhIHBhZ2UgbWVyZ2UsIGNoZWNrIGlmIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCBhY3RpdmUgcm93IGlzIHN1ZmZpY2llbnQgd2hlbiBpZ25vcmluZyB0aGUgUk9XX1BJWEVMX1RIUkVTSE9MRC4gVGhpcyB3aWxsXG4gICAgICAgICAgICAvLyBpbXByb3ZlIHRleHR1cmUgdXRpbGl6YXRpb24gYnkgdXNpbmcgdGhlIGF2YWlsYWJsZSBzcGFjZSBiZWZvcmUgdGhlIHBhZ2UgaXMgbWVyZ2VkXG4gICAgICAgICAgICAvLyBhbmQgYmVjb21lcyBzdGF0aWMuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzICYmXG4gICAgICAgICAgICAgIHRoaXMuX3BhZ2VzLmxlbmd0aCA+PSBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyAmJlxuICAgICAgICAgICAgICBhY3RpdmVSb3cueSArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkgPD0gYWN0aXZlUGFnZS5jYW52YXMuaGVpZ2h0ICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVJvdy5oZWlnaHQgPj0gcmFzdGVyaXplZEdseXBoLnNpemUueSAmJlxuICAgICAgICAgICAgICBhY3RpdmVSb3cueCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnggPD0gYWN0aXZlUGFnZS5jYW52YXMud2lkdGhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBhY3RpdmVQYWdlIGFuZCBhY3RpdmVSb3cgaXMgYWxyZWFkeSB2YWxpZFxuICAgICAgICAgICAgICB3YXNQYWdlQW5kUm93Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhZ2UgaWYgdGhlcmUgaXMgbm8gcm9vbVxuICAgICAgICAgICAgICBjb25zdCBuZXdQYWdlID0gdGhpcy5fY3JlYXRlTmV3UGFnZSgpO1xuICAgICAgICAgICAgICBhY3RpdmVQYWdlID0gbmV3UGFnZTtcbiAgICAgICAgICAgICAgYWN0aXZlUm93ID0gbmV3UGFnZS5jdXJyZW50Um93O1xuICAgICAgICAgICAgICBhY3RpdmVSb3cuaGVpZ2h0ID0gcmFzdGVyaXplZEdseXBoLnNpemUueTtcbiAgICAgICAgICAgICAgd2FzUGFnZUFuZFJvd0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF3YXNQYWdlQW5kUm93Rm91bmQpIHtcbiAgICAgICAgICAvLyBGaXggdGhlIGN1cnJlbnQgcm93IGFzIHRoZSBuZXcgcm93IGlzIGJlaW5nIGFkZGVkIGJlbG93XG4gICAgICAgICAgaWYgKGFjdGl2ZVBhZ2UuY3VycmVudFJvdy5oZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICBhY3RpdmVQYWdlLmZpeGVkUm93cy5wdXNoKGFjdGl2ZVBhZ2UuY3VycmVudFJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2ZVJvdyA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiBhY3RpdmVQYWdlLmN1cnJlbnRSb3cueSArIGFjdGl2ZVBhZ2UuY3VycmVudFJvdy5oZWlnaHQsXG4gICAgICAgICAgICBoZWlnaHQ6IHJhc3Rlcml6ZWRHbHlwaC5zaXplLnlcbiAgICAgICAgICB9O1xuICAgICAgICAgIGFjdGl2ZVBhZ2UuZml4ZWRSb3dzLnB1c2goYWN0aXZlUm93KTtcblxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGN1cnJlbnQgcm93IGJlbG93IHRoZSBuZXcgZml4ZWQgaGVpZ2h0IHJvd1xuICAgICAgICAgIGFjdGl2ZVBhZ2UuY3VycmVudFJvdyA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiBhY3RpdmVSb3cueSArIGFjdGl2ZVJvdy5oZWlnaHQsXG4gICAgICAgICAgICBoZWlnaHQ6IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBwYWdlcyBmcm9tIF9hY3RpdmVQYWdlcyB3aGVuIGFsbCByb3dzIGFyZSBmaWxsZWRcbiAgICAgIH1cblxuICAgICAgLy8gRXhpdCB0aGUgbG9vcCBpZiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB0aGUgcm93XG4gICAgICBpZiAoYWN0aXZlUm93LnggKyByYXN0ZXJpemVkR2x5cGguc2l6ZS54IDw9IGFjdGl2ZVBhZ2UuY2FudmFzLndpZHRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIGN1cnJlbnQgcm93LCBmaW5pc2ggaXQgYW5kIHRyeSBhZ2FpblxuICAgICAgaWYgKGFjdGl2ZVJvdyA9PT0gYWN0aXZlUGFnZS5jdXJyZW50Um93KSB7XG4gICAgICAgIGFjdGl2ZVJvdy54ID0gMDtcbiAgICAgICAgYWN0aXZlUm93LnkgKz0gYWN0aXZlUm93LmhlaWdodDtcbiAgICAgICAgYWN0aXZlUm93LmhlaWdodCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmVQYWdlLmZpeGVkUm93cy5zcGxpY2UoYWN0aXZlUGFnZS5maXhlZFJvd3MuaW5kZXhPZihhY3RpdmVSb3cpLCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNvcmQgdGV4dHVyZSBwb3NpdGlvblxuICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUGFnZSA9IHRoaXMuX3BhZ2VzLmluZGV4T2YoYWN0aXZlUGFnZSk7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbi54ID0gYWN0aXZlUm93Lng7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbi55ID0gYWN0aXZlUm93Lnk7XG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS54ID0gYWN0aXZlUm93LnggLyBhY3RpdmVQYWdlLmNhbnZhcy53aWR0aDtcbiAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnkgPSBhY3RpdmVSb3cueSAvIGFjdGl2ZVBhZ2UuY2FudmFzLmhlaWdodDtcblxuICAgIC8vIEZpeCB0aGUgY2xpcHNwYWNlIHBvc2l0aW9uIGFzIHBhZ2VzIG1heSBiZSBvZiBkaWZmZXJpbmcgc2l6ZVxuICAgIHJhc3Rlcml6ZWRHbHlwaC5zaXplQ2xpcFNwYWNlLnggLz0gYWN0aXZlUGFnZS5jYW52YXMud2lkdGg7XG4gICAgcmFzdGVyaXplZEdseXBoLnNpemVDbGlwU3BhY2UueSAvPSBhY3RpdmVQYWdlLmNhbnZhcy5oZWlnaHQ7XG5cbiAgICAvLyBVcGRhdGUgYXRsYXMgY3VycmVudCByb3csIGZvciBmaXhlZCByb3dzIHRoZSBnbHlwaCBoZWlnaHQgd2lsbCBuZXZlciBiZSBsYXJnZXIgdGhhbiB0aGUgcm93XG4gICAgLy8gaGVpZ2h0XG4gICAgYWN0aXZlUm93LmhlaWdodCA9IE1hdGgubWF4KGFjdGl2ZVJvdy5oZWlnaHQsIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnkpO1xuICAgIGFjdGl2ZVJvdy54ICs9IHJhc3Rlcml6ZWRHbHlwaC5zaXplLng7XG5cbiAgICAvLyBwdXRJbWFnZURhdGEgZG9lc24ndCBkbyBhbnkgYmxlbmRpbmcsIHNvIGl0IHdpbGwgb3ZlcndyaXRlIGFueSBleGlzdGluZyBjYWNoZSBlbnRyeSBmb3IgdXNcbiAgICBhY3RpdmVQYWdlLmN0eC5wdXRJbWFnZURhdGEoXG4gICAgICBpbWFnZURhdGEsXG4gICAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uLnggLSB0aGlzLl93b3JrQm91bmRpbmdCb3gubGVmdCxcbiAgICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUG9zaXRpb24ueSAtIHRoaXMuX3dvcmtCb3VuZGluZ0JveC50b3AsXG4gICAgICB0aGlzLl93b3JrQm91bmRpbmdCb3gubGVmdCxcbiAgICAgIHRoaXMuX3dvcmtCb3VuZGluZ0JveC50b3AsXG4gICAgICByYXN0ZXJpemVkR2x5cGguc2l6ZS54LFxuICAgICAgcmFzdGVyaXplZEdseXBoLnNpemUueVxuICAgICk7XG4gICAgYWN0aXZlUGFnZS5hZGRHbHlwaChyYXN0ZXJpemVkR2x5cGgpO1xuICAgIGFjdGl2ZVBhZ2UudmVyc2lvbisrO1xuXG4gICAgcmV0dXJuIHJhc3Rlcml6ZWRHbHlwaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBJbWFnZURhdGEgb2JqZWN0LCBmaW5kIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIG5vbi10cmFuc3BhcmVudFxuICAgKiBwb3J0aW9uIG9mIHRoZSB0ZXh0dXJlIGFuZCByZXR1cm4gYW4gSVJhc3Rlcml6ZWRHbHlwaCB3aXRoIHRoZXNlXG4gICAqIGRpbWVuc2lvbnMuXG4gICAqIEBwYXJhbSBpbWFnZURhdGEgVGhlIGltYWdlIGRhdGEgdG8gcmVhZC5cbiAgICogQHBhcmFtIGJvdW5kaW5nQm94IEFuIElCb3VuZGluZ0JveCB0byBwdXQgdGhlIGNsaXBwZWQgYm91bmRpbmcgYm94IHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmRHbHlwaEJvdW5kaW5nQm94KGltYWdlRGF0YTogSW1hZ2VEYXRhLCBib3VuZGluZ0JveDogSUJvdW5kaW5nQm94LCBhbGxvd2VkV2lkdGg6IG51bWJlciwgcmVzdHJpY3RlZEdseXBoOiBib29sZWFuLCBjdXN0b21HbHlwaDogYm9vbGVhbiwgcGFkZGluZzogbnVtYmVyKTogSVJhc3Rlcml6ZWRHbHlwaCB7XG4gICAgYm91bmRpbmdCb3gudG9wID0gMDtcbiAgICBjb25zdCBoZWlnaHQgPSByZXN0cmljdGVkR2x5cGggPyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCA6IHRoaXMuX3RtcENhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSByZXN0cmljdGVkR2x5cGggPyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIDogYWxsb3dlZFdpZHRoO1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3gudG9wID0geTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYm91bmRpbmdCb3gubGVmdCA9IDA7XG4gICAgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHBhZGRpbmcgKyB3aWR0aDsgeCsrKSB7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgIGNvbnN0IGFscGhhT2Zmc2V0ID0geSAqIHRoaXMuX3RtcENhbnZhcy53aWR0aCAqIDQgKyB4ICogNCArIDM7XG4gICAgICAgIGlmIChpbWFnZURhdGEuZGF0YVthbHBoYU9mZnNldF0gIT09IDApIHtcbiAgICAgICAgICBib3VuZGluZ0JveC5sZWZ0ID0geDtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYm91bmRpbmdCb3gucmlnaHQgPSB3aWR0aDtcbiAgICBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHggPSBwYWRkaW5nICsgd2lkdGggLSAxOyB4ID49IHBhZGRpbmc7IHgtLSkge1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3gucmlnaHQgPSB4O1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBib3VuZGluZ0JveC5ib3R0b20gPSBoZWlnaHQ7XG4gICAgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB5ID0gaGVpZ2h0IC0gMTsgeSA+PSAwOyB5LS0pIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBjb25zdCBhbHBoYU9mZnNldCA9IHkgKiB0aGlzLl90bXBDYW52YXMud2lkdGggKiA0ICsgeCAqIDQgKyAzO1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbYWxwaGFPZmZzZXRdICE9PSAwKSB7XG4gICAgICAgICAgYm91bmRpbmdCb3guYm90dG9tID0geTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHR1cmVQYWdlOiAwLFxuICAgICAgdGV4dHVyZVBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgIHRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIHg6IGJvdW5kaW5nQm94LnJpZ2h0IC0gYm91bmRpbmdCb3gubGVmdCArIDEsXG4gICAgICAgIHk6IGJvdW5kaW5nQm94LmJvdHRvbSAtIGJvdW5kaW5nQm94LnRvcCArIDFcbiAgICAgIH0sXG4gICAgICBzaXplQ2xpcFNwYWNlOiB7XG4gICAgICAgIHg6IChib3VuZGluZ0JveC5yaWdodCAtIGJvdW5kaW5nQm94LmxlZnQgKyAxKSxcbiAgICAgICAgeTogKGJvdW5kaW5nQm94LmJvdHRvbSAtIGJvdW5kaW5nQm94LnRvcCArIDEpXG4gICAgICB9LFxuICAgICAgb2Zmc2V0OiB7XG4gICAgICAgIHg6IC1ib3VuZGluZ0JveC5sZWZ0ICsgcGFkZGluZyArICgocmVzdHJpY3RlZEdseXBoIHx8IGN1c3RvbUdseXBoKSA/IE1hdGguZmxvb3IoKHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLSB0aGlzLl9jb25maWcuZGV2aWNlQ2hhcldpZHRoKSAvIDIpIDogMCksXG4gICAgICAgIHk6IC1ib3VuZGluZ0JveC50b3AgKyBwYWRkaW5nICsgKChyZXN0cmljdGVkR2x5cGggfHwgY3VzdG9tR2x5cGgpID8gdGhpcy5fY29uZmlnLmxpbmVIZWlnaHQgPT09IDEgPyAwIDogTWF0aC5yb3VuZCgodGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQgLSB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCkgLyAyKSA6IDApXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBBdGxhc1BhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIHByaXZhdGUgX3VzZWRQaXhlbHM6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBnZXQgcGVyY2VudGFnZVVzZWQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3VzZWRQaXhlbHMgLyAodGhpcy5jYW52YXMud2lkdGggKiB0aGlzLmNhbnZhcy5oZWlnaHQpOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZ2x5cGhzOiBJUmFzdGVyaXplZEdseXBoW10gPSBbXTtcbiAgcHVibGljIGdldCBnbHlwaHMoKTogUmVhZG9ubHlBcnJheTxJUmFzdGVyaXplZEdseXBoPiB7IHJldHVybiB0aGlzLl9nbHlwaHM7IH1cbiAgcHVibGljIGFkZEdseXBoKGdseXBoOiBJUmFzdGVyaXplZEdseXBoKTogdm9pZCB7XG4gICAgdGhpcy5fZ2x5cGhzLnB1c2goZ2x5cGgpO1xuICAgIHRoaXMuX3VzZWRQaXhlbHMgKz0gZ2x5cGguc2l6ZS54ICogZ2x5cGguc2l6ZS55O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgY2FudmFzIG9mIHRoZSBhdGxhcyBwYWdlIGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgcHVibGljIHZlcnNpb24gPSAwO1xuXG4gIC8vIFRleHR1cmUgYXRsYXMgY3VycmVudCBwb3NpdGlvbmluZyBkYXRhLiBUaGUgdGV4dHVyZSBwYWNraW5nIHN0cmF0ZWd5IHVzZWQgaXMgdG8gZmlsbCBmcm9tXG4gIC8vIGxlZnQtdG8tcmlnaHQgYW5kIHRvcC10by1ib3R0b20uIFdoZW4gdGhlIGdseXBoIGJlaW5nIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIGhhbGYgb2YgdGhlIGN1cnJlbnRcbiAgLy8gcm93J3MgaGVpZ2h0LCB0aGUgZm9sbG93aW5nIGhhcHBlbnM6XG4gIC8vXG4gIC8vIC0gVGhlIGN1cnJlbnQgcm93IGJlY29tZXMgdGhlIGZpeGVkIGhlaWdodCByb3cgQVxuICAvLyAtIEEgbmV3IGZpeGVkIGhlaWdodCByb3cgQiB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgZ2x5cGggaXMgY3JlYXRlZCBiZWxvdyB0aGUgY3VycmVudCByb3dcbiAgLy8gLSBBIG5ldyBkeW5hbWljIGhlaWdodCBjdXJyZW50IHJvdyBpcyBjcmVhdGVkIGJlbG93IEJcbiAgLy9cbiAgLy8gVGhpcyBzdHJhdGVneSBkb2VzIGEgZ29vZCBqb2IgcHJldmVudGluZyBzcGFjZSBiZWluZyB3YXN0ZWQgZm9yIHZlcnkgc2hvcnQgZ2x5cGhzIHN1Y2ggYXNcbiAgLy8gdW5kZXJzY29yZXMsIGh5cGhlbnMgZXRjLiBvciB0aG9zZSB3aXRoIHVuZGVybGluZXMgcmVuZGVyZWQuXG4gIHB1YmxpYyBjdXJyZW50Um93OiBJQ2hhckF0bGFzQWN0aXZlUm93ID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbiAgcHVibGljIHJlYWRvbmx5IGZpeGVkUm93czogSUNoYXJBdGxhc0FjdGl2ZVJvd1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBzb3VyY2VQYWdlcz86IEF0bGFzUGFnZVtdXG4gICkge1xuICAgIGlmIChzb3VyY2VQYWdlcykge1xuICAgICAgZm9yIChjb25zdCBwIG9mIHNvdXJjZVBhZ2VzKSB7XG4gICAgICAgIHRoaXMuX2dseXBocy5wdXNoKC4uLnAuZ2x5cGhzKTtcbiAgICAgICAgdGhpcy5fdXNlZFBpeGVscyArPSBwLl91c2VkUGl4ZWxzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNhbnZhcyA9IGNyZWF0ZUNhbnZhcyhkb2N1bWVudCwgc2l6ZSwgc2l6ZSk7XG4gICAgLy8gVGhlIGNhbnZhcyBuZWVkcyBhbHBoYSBiZWNhdXNlIHdlIHVzZSBjbGVhckNvbG9yIHRvIGNvbnZlcnQgdGhlIGJhY2tncm91bmQgY29sb3IgdG8gYWxwaGEuXG4gICAgLy8gSXQgbWlnaHQgYWxzbyBjb250YWluIHNvbWUgY2hhcmFjdGVycyB3aXRoIHRyYW5zcGFyZW50IGJhY2tncm91bmRzIGlmIGFsbG93VHJhbnNwYXJlbmN5IGlzXG4gICAgLy8gc2V0LlxuICAgIHRoaXMuY3R4ID0gdGhyb3dJZkZhbHN5KHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJywgeyBhbHBoYTogdHJ1ZSB9KSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuY3VycmVudFJvdy54ID0gMDtcbiAgICB0aGlzLmN1cnJlbnRSb3cueSA9IDA7XG4gICAgdGhpcy5jdXJyZW50Um93LmhlaWdodCA9IDA7XG4gICAgdGhpcy5maXhlZFJvd3MubGVuZ3RoID0gMDtcbiAgICB0aGlzLnZlcnNpb24rKztcbiAgfVxufVxuXG4vKipcbiAqIE1ha2VzIGEgcGFydGljdWxhciByZ2IgY29sb3IgYW5kIGNvbG9ycyB0aGF0IGFyZSBuZWFybHkgdGhlIHNhbWUgaW4gYW4gSW1hZ2VEYXRhIGNvbXBsZXRlbHlcbiAqIHRyYW5zcGFyZW50LlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIFwiZW1wdHlcIiwgbWVhbmluZyBhbGwgcGl4ZWxzIGFyZSBmdWxseSB0cmFuc3BhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2xlYXJDb2xvcihpbWFnZURhdGE6IEltYWdlRGF0YSwgYmc6IElDb2xvciwgZmc6IElDb2xvciwgZW5hYmxlVGhyZXNob2xkQ2hlY2s6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgLy8gR2V0IGNvbG9yIGNoYW5uZWxzXG4gIGNvbnN0IHIgPSBiZy5yZ2JhID4+PiAyNDtcbiAgY29uc3QgZyA9IGJnLnJnYmEgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYiA9IGJnLnJnYmEgPj4+IDggJiAweEZGO1xuICBjb25zdCBmZ1IgPSBmZy5yZ2JhID4+PiAyNDtcbiAgY29uc3QgZmdHID0gZmcucmdiYSA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBmZ0IgPSBmZy5yZ2JhID4+PiA4ICYgMHhGRjtcblxuICAvLyBDYWxjdWxhdGUgYSB0aHJlc2hvbGQgdGhhdCB3aGVuIGJlbG93IGEgY29sb3Igd2lsbCBiZSB0cmVhdGVkIGFzIHRyYW5zcGFydCB3aGVuIHRoZSBzdW0gb2ZcbiAgLy8gY2hhbm5lbCB2YWx1ZSBkaWZmZXJzLiBUaGlzIGhlbHBzIGltcHJvdmUgcmVuZGVyaW5nIHdoZW4gZ2x5cGhzIG92ZXJsYXAgd2l0aCBvdGhlcnMuIFRoaXNcbiAgLy8gdGhyZXNob2xkIGlzIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZCB0b1xuICAvLyBlbnN1cmUgaW1wb3J0YW50IGRldGFpbHMgb2YgdGhlIGdseXBoIGFyZSBhbHdheXMgc2hvd24sIGV2ZW4gd2hlbiB0aGUgY29udHJhc3QgcmF0aW8gaXMgbG93LlxuICAvLyBUaGUgbnVtYmVyIDEyIGlzIGxhcmdlbHkgYXJiaXRyYXJ5IHRvIGVuc3VyZSB0aGUgcGl4ZWxzIHRoYXQgZXNjYXBlIHRoZSBjZWxsIGluIHRoZSB0ZXN0IGNhc2VcbiAgLy8gd2VyZSBjb3ZlcmVkIChmZz0jOGFlMjM0LCBiZz0jYzRhMDAwKS5cbiAgY29uc3QgdGhyZXNob2xkID0gTWF0aC5mbG9vcigoTWF0aC5hYnMociAtIGZnUikgKyBNYXRoLmFicyhnIC0gZmdHKSArIE1hdGguYWJzKGIgLSBmZ0IpKSAvIDEyKTtcblxuICAvLyBTZXQgYWxwaGEgY2hhbm5lbCBvZiByZWxldmVudCBwaXhlbHMgdG8gMFxuICBsZXQgaXNFbXB0eSA9IHRydWU7XG4gIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGltYWdlRGF0YS5kYXRhLmxlbmd0aDsgb2Zmc2V0ICs9IDQpIHtcbiAgICAvLyBDaGVjayBleGFjdCBtYXRjaFxuICAgIGlmIChpbWFnZURhdGEuZGF0YVtvZmZzZXRdID09PSByICYmXG4gICAgICAgIGltYWdlRGF0YS5kYXRhW29mZnNldCArIDFdID09PSBnICYmXG4gICAgICAgIGltYWdlRGF0YS5kYXRhW29mZnNldCArIDJdID09PSBiKSB7XG4gICAgICBpbWFnZURhdGEuZGF0YVtvZmZzZXQgKyAzXSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENoZWNrIHRoZSB0aHJlc2hvbGQgYmFzZWQgZGlmZmVyZW5jZVxuICAgICAgaWYgKGVuYWJsZVRocmVzaG9sZENoZWNrICYmXG4gICAgICAgICAgKE1hdGguYWJzKGltYWdlRGF0YS5kYXRhW29mZnNldF0gLSByKSArXG4gICAgICAgICAgTWF0aC5hYnMoaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgMV0gLSBnKSArXG4gICAgICAgICAgTWF0aC5hYnMoaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgMl0gLSBiKSkgPCB0aHJlc2hvbGQpIHtcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgM10gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc0VtcHR5O1xufVxuXG5mdW5jdGlvbiBjaGVja0NvbXBsZXRlbHlUcmFuc3BhcmVudChpbWFnZURhdGE6IEltYWdlRGF0YSk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IG9mZnNldCArPSA0KSB7XG4gICAgaWYgKGltYWdlRGF0YS5kYXRhW29mZnNldCArIDNdID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FudmFzKGRvY3VtZW50OiBEb2N1bWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBIVE1MQ2FudmFzRWxlbWVudCB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgcmV0dXJuIGNhbnZhcztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNoYXJBdGxhc0NvbmZpZyB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlcyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IElUZXJtaW5hbE9wdGlvbnMgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSUNvbG9yU2V0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBOVUxMX0NPTE9SIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnKGRldmljZUNlbGxXaWR0aDogbnVtYmVyLCBkZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXIsIGRldmljZUNoYXJXaWR0aDogbnVtYmVyLCBkZXZpY2VDaGFySGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+LCBjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQsIGRldmljZVBpeGVsUmF0aW86IG51bWJlciwgZGV2aWNlTWF4VGV4dHVyZVNpemU6IG51bWJlcik6IElDaGFyQXRsYXNDb25maWcge1xuICAvLyBudWxsIG91dCBzb21lIGZpZWxkcyB0aGF0IGRvbid0IG1hdHRlclxuICBjb25zdCBjbG9uZWRDb2xvcnM6IElDb2xvclNldCA9IHtcbiAgICBmb3JlZ3JvdW5kOiBjb2xvcnMuZm9yZWdyb3VuZCxcbiAgICBiYWNrZ3JvdW5kOiBjb2xvcnMuYmFja2dyb3VuZCxcbiAgICBjdXJzb3I6IE5VTExfQ09MT1IsXG4gICAgY3Vyc29yQWNjZW50OiBOVUxMX0NPTE9SLFxuICAgIHNlbGVjdGlvbkZvcmVncm91bmQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50OiBOVUxMX0NPTE9SLFxuICAgIHNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWU6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlOiBOVUxMX0NPTE9SLFxuICAgIG92ZXJ2aWV3UnVsZXJCb3JkZXI6IE5VTExfQ09MT1IsXG4gICAgc2Nyb2xsYmFyU2xpZGVyQmFja2dyb3VuZDogTlVMTF9DT0xPUixcbiAgICBzY3JvbGxiYXJTbGlkZXJIb3ZlckJhY2tncm91bmQ6IE5VTExfQ09MT1IsXG4gICAgc2Nyb2xsYmFyU2xpZGVyQWN0aXZlQmFja2dyb3VuZDogTlVMTF9DT0xPUixcbiAgICAvLyBGb3IgdGhlIHN0YXRpYyBjaGFyIGF0bGFzLCB3ZSBvbmx5IHVzZSB0aGUgZmlyc3QgMTYgY29sb3JzLCBidXQgd2UgbmVlZCBhbGwgMjU2IGZvciB0aGVcbiAgICAvLyBkeW5hbWljIGNoYXJhY3RlciBhdGxhcy5cbiAgICBhbnNpOiBjb2xvcnMuYW5zaS5zbGljZSgpLFxuICAgIGNvbnRyYXN0Q2FjaGU6IGNvbG9ycy5jb250cmFzdENhY2hlLFxuICAgIGhhbGZDb250cmFzdENhY2hlOiBjb2xvcnMuaGFsZkNvbnRyYXN0Q2FjaGVcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBjdXN0b21HbHlwaHM6IG9wdGlvbnMuY3VzdG9tR2x5cGhzLFxuICAgIGRldmljZVBpeGVsUmF0aW8sXG4gICAgZGV2aWNlTWF4VGV4dHVyZVNpemUsXG4gICAgbGV0dGVyU3BhY2luZzogb3B0aW9ucy5sZXR0ZXJTcGFjaW5nLFxuICAgIGxpbmVIZWlnaHQ6IG9wdGlvbnMubGluZUhlaWdodCxcbiAgICBkZXZpY2VDZWxsV2lkdGg6IGRldmljZUNlbGxXaWR0aCxcbiAgICBkZXZpY2VDZWxsSGVpZ2h0OiBkZXZpY2VDZWxsSGVpZ2h0LFxuICAgIGRldmljZUNoYXJXaWR0aDogZGV2aWNlQ2hhcldpZHRoLFxuICAgIGRldmljZUNoYXJIZWlnaHQ6IGRldmljZUNoYXJIZWlnaHQsXG4gICAgZm9udEZhbWlseTogb3B0aW9ucy5mb250RmFtaWx5LFxuICAgIGZvbnRTaXplOiBvcHRpb25zLmZvbnRTaXplLFxuICAgIGZvbnRXZWlnaHQ6IG9wdGlvbnMuZm9udFdlaWdodCxcbiAgICBmb250V2VpZ2h0Qm9sZDogb3B0aW9ucy5mb250V2VpZ2h0Qm9sZCxcbiAgICBhbGxvd1RyYW5zcGFyZW5jeTogb3B0aW9ucy5hbGxvd1RyYW5zcGFyZW5jeSxcbiAgICBkcmF3Qm9sZFRleHRJbkJyaWdodENvbG9yczogb3B0aW9ucy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyxcbiAgICBtaW5pbXVtQ29udHJhc3RSYXRpbzogb3B0aW9ucy5taW5pbXVtQ29udHJhc3RSYXRpbyxcbiAgICBjb2xvcnM6IGNsb25lZENvbG9yc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlnRXF1YWxzKGE6IElDaGFyQXRsYXNDb25maWcsIGI6IElDaGFyQXRsYXNDb25maWcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmNvbG9ycy5hbnNpLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGEuY29sb3JzLmFuc2lbaV0ucmdiYSAhPT0gYi5jb2xvcnMuYW5zaVtpXS5yZ2JhKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBhLmRldmljZVBpeGVsUmF0aW8gPT09IGIuZGV2aWNlUGl4ZWxSYXRpbyAmJlxuICAgICAgYS5jdXN0b21HbHlwaHMgPT09IGIuY3VzdG9tR2x5cGhzICYmXG4gICAgICBhLmxpbmVIZWlnaHQgPT09IGIubGluZUhlaWdodCAmJlxuICAgICAgYS5sZXR0ZXJTcGFjaW5nID09PSBiLmxldHRlclNwYWNpbmcgJiZcbiAgICAgIGEuZm9udEZhbWlseSA9PT0gYi5mb250RmFtaWx5ICYmXG4gICAgICBhLmZvbnRTaXplID09PSBiLmZvbnRTaXplICYmXG4gICAgICBhLmZvbnRXZWlnaHQgPT09IGIuZm9udFdlaWdodCAmJlxuICAgICAgYS5mb250V2VpZ2h0Qm9sZCA9PT0gYi5mb250V2VpZ2h0Qm9sZCAmJlxuICAgICAgYS5hbGxvd1RyYW5zcGFyZW5jeSA9PT0gYi5hbGxvd1RyYW5zcGFyZW5jeSAmJlxuICAgICAgYS5kZXZpY2VDaGFyV2lkdGggPT09IGIuZGV2aWNlQ2hhcldpZHRoICYmXG4gICAgICBhLmRldmljZUNoYXJIZWlnaHQgPT09IGIuZGV2aWNlQ2hhckhlaWdodCAmJlxuICAgICAgYS5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyA9PT0gYi5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyAmJlxuICAgICAgYS5taW5pbXVtQ29udHJhc3RSYXRpbyA9PT0gYi5taW5pbXVtQ29udHJhc3RSYXRpbyAmJlxuICAgICAgYS5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhID09PSBiLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmEgJiZcbiAgICAgIGEuY29sb3JzLmJhY2tncm91bmQucmdiYSA9PT0gYi5jb2xvcnMuYmFja2dyb3VuZC5yZ2JhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXMyNTZDb2xvcihjb2xvckNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKGNvbG9yQ29kZSAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDE2IHx8IChjb2xvckNvZGUgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AyNTY7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IFRleHR1cmVBdGxhcyB9IGZyb20gJy4vVGV4dHVyZUF0bGFzJztcbmltcG9ydCB7IElUZXJtaW5hbE9wdGlvbnMsIFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IElUZXJtaW5hbCwgUmVhZG9ubHlDb2xvclNldCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJBdGxhc0NvbmZpZywgSVRleHR1cmVBdGxhcyB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVDb25maWcsIGNvbmZpZ0VxdWFscyB9IGZyb20gJy4vQ2hhckF0bGFzVXRpbHMnO1xuXG5pbnRlcmZhY2UgSVRleHR1cmVBdGxhc0NhY2hlRW50cnkge1xuICBhdGxhczogSVRleHR1cmVBdGxhcztcbiAgY29uZmlnOiBJQ2hhckF0bGFzQ29uZmlnO1xuICAvLyBOLkIuIFRoaXMgaW1wbGVtZW50YXRpb24gcG90ZW50aWFsbHkgaG9sZHMgb250byBjb3BpZXMgb2YgdGhlIHRlcm1pbmFsIGZvcmV2ZXIsIHNvXG4gIC8vIHRoaXMgbWF5IGNhdXNlIG1lbW9yeSBsZWFrcy5cbiAgb3duZWRCeTogVGVybWluYWxbXTtcbn1cblxuY29uc3QgY2hhckF0bGFzQ2FjaGU6IElUZXh0dXJlQXRsYXNDYWNoZUVudHJ5W10gPSBbXTtcblxuLyoqXG4gKiBBY3F1aXJlcyBhIGNoYXIgYXRsYXMsIGVpdGhlciBnZW5lcmF0aW5nIGEgbmV3IG9uZSBvciByZXR1cm5pbmcgYW4gZXhpc3RpbmdcbiAqIG9uZSB0aGF0IGlzIGluIHVzZSBieSBhbm90aGVyIHRlcm1pbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWNxdWlyZVRleHR1cmVBdGxhcyhcbiAgdGVybWluYWw6IFRlcm1pbmFsLFxuICBvcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPixcbiAgY29sb3JzOiBSZWFkb25seUNvbG9yU2V0LFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VDaGFyV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2hhckhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXIsXG4gIGRldmljZU1heFRleHR1cmVTaXplOiBudW1iZXJcbik6IElUZXh0dXJlQXRsYXMge1xuICBjb25zdCBuZXdDb25maWcgPSBnZW5lcmF0ZUNvbmZpZyhkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQsIGRldmljZUNoYXJXaWR0aCwgZGV2aWNlQ2hhckhlaWdodCwgb3B0aW9ucywgY29sb3JzLCBkZXZpY2VQaXhlbFJhdGlvLCBkZXZpY2VNYXhUZXh0dXJlU2l6ZSk7XG5cbiAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXJtaW5hbCBhbHJlYWR5IG93bnMgdGhpcyBjb25maWdcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyQXRsYXNDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gY2hhckF0bGFzQ2FjaGVbaV07XG4gICAgY29uc3Qgb3duZWRCeUluZGV4ID0gZW50cnkub3duZWRCeS5pbmRleE9mKHRlcm1pbmFsKTtcbiAgICBpZiAob3duZWRCeUluZGV4ID49IDApIHtcbiAgICAgIGlmIChjb25maWdFcXVhbHMoZW50cnkuY29uZmlnLCBuZXdDb25maWcpKSB7XG4gICAgICAgIHJldHVybiBlbnRyeS5hdGxhcztcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBjb25maWdzIGRpZmZlciwgcmVsZWFzZSB0aGUgdGVybWluYWwgZnJvbSB0aGUgZW50cnlcbiAgICAgIGlmIChlbnRyeS5vd25lZEJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBlbnRyeS5hdGxhcy5kaXNwb3NlKCk7XG4gICAgICAgIGNoYXJBdGxhc0NhY2hlLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJ5Lm93bmVkQnkuc3BsaWNlKG93bmVkQnlJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBUcnkgbWF0Y2ggYSBjaGFyIGF0bGFzIGZyb20gdGhlIGNhY2hlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckF0bGFzQ2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbnRyeSA9IGNoYXJBdGxhc0NhY2hlW2ldO1xuICAgIGlmIChjb25maWdFcXVhbHMoZW50cnkuY29uZmlnLCBuZXdDb25maWcpKSB7XG4gICAgICAvLyBBZGQgdGhlIHRlcm1pbmFsIHRvIHRoZSBjYWNoZSBlbnRyeSBhbmQgcmV0dXJuXG4gICAgICBlbnRyeS5vd25lZEJ5LnB1c2godGVybWluYWwpO1xuICAgICAgcmV0dXJuIGVudHJ5LmF0bGFzO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvcmU6IElUZXJtaW5hbCA9ICh0ZXJtaW5hbCBhcyBhbnkpLl9jb3JlO1xuICBjb25zdCBuZXdFbnRyeTogSVRleHR1cmVBdGxhc0NhY2hlRW50cnkgPSB7XG4gICAgYXRsYXM6IG5ldyBUZXh0dXJlQXRsYXMoZG9jdW1lbnQsIG5ld0NvbmZpZywgY29yZS51bmljb2RlU2VydmljZSksXG4gICAgY29uZmlnOiBuZXdDb25maWcsXG4gICAgb3duZWRCeTogW3Rlcm1pbmFsXVxuICB9O1xuICBjaGFyQXRsYXNDYWNoZS5wdXNoKG5ld0VudHJ5KTtcbiAgcmV0dXJuIG5ld0VudHJ5LmF0bGFzO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYSB0ZXJtaW5hbCByZWZlcmVuY2UgZnJvbSB0aGUgY2FjaGUsIGFsbG93aW5nIGl0cyBtZW1vcnkgdG8gYmUgZnJlZWQuXG4gKiBAcGFyYW0gdGVybWluYWwgVGhlIHRlcm1pbmFsIHRvIHJlbW92ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRlcm1pbmFsRnJvbUNhY2hlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJBdGxhc0NhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5kZXggPSBjaGFyQXRsYXNDYWNoZVtpXS5vd25lZEJ5LmluZGV4T2YodGVybWluYWwpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChjaGFyQXRsYXNDYWNoZVtpXS5vd25lZEJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGNhY2hlIGVudHJ5IGlmIGl0J3MgdGhlIG9ubHkgdGVybWluYWxcbiAgICAgICAgY2hhckF0bGFzQ2FjaGVbaV0uYXRsYXMuZGlzcG9zZSgpO1xuICAgICAgICBjaGFyQXRsYXNDYWNoZS5zcGxpY2UoaSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBjYWNoZSBlbnRyeVxuICAgICAgICBjaGFyQXRsYXNDYWNoZVtpXS5vd25lZEJ5LnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIFRoZSB0aW1lIGJldHdlZW4gY3Vyc29yIGJsaW5rcy5cbiAqL1xuY29uc3QgQkxJTktfSU5URVJWQUwgPSA2MDA7XG5cbmV4cG9ydCBjbGFzcyBDdXJzb3JCbGlua1N0YXRlTWFuYWdlciB7XG4gIHB1YmxpYyBpc0N1cnNvclZpc2libGU6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYW5pbWF0aW9uRnJhbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYmxpbmtTdGFydFRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYmxpbmtJbnRlcnZhbDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZSBhdCB3aGljaCB0aGUgYW5pbWF0aW9uIGZyYW1lIHdhcyByZXN0YXJ0ZWQsIHRoaXMgaXMgdXNlZCBvbiB0aGVcbiAgICogbmV4dCByZW5kZXIgdG8gcmVzdGFydCB0aGUgdGltZXJzIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byByZXN0YXJ0IHRoZSB0aW1lcnNcbiAgICogbXVsdGlwbGUgdGltZXMgb3ZlciBhIHNob3J0IHBlcmlvZC5cbiAgICovXG4gIHByaXZhdGUgX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJDYWxsYmFjazogKCkgPT4gdm9pZCxcbiAgICBwcml2YXRlIF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5pc0N1cnNvclZpc2libGUgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkKSB7XG4gICAgICB0aGlzLl9yZXN0YXJ0SW50ZXJ2YWwoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUGF1c2VkKCk6IGJvb2xlYW4geyByZXR1cm4gISh0aGlzLl9ibGlua1N0YXJ0VGltZW91dCB8fCB0aGlzLl9ibGlua0ludGVydmFsKTsgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9ibGlua0ludGVydmFsKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fYmxpbmtJbnRlcnZhbCk7XG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYmxpbmtTdGFydFRpbWVvdXQpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0KTtcbiAgICAgIHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWUpO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc3RhcnRCbGlua0FuaW1hdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1BhdXNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTYXZlIGEgdGltZXN0YW1wIHNvIHRoYXQgdGhlIHJlc3RhcnQgY2FuIGJlIGRvbmUgb24gdGhlIG5leHQgaW50ZXJ2YWxcbiAgICB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkID0gRGF0ZS5ub3coKTtcbiAgICAvLyBGb3JjZSBhIGN1cnNvciByZW5kZXIgdG8gZW5zdXJlIGl0J3MgdmlzaWJsZSBhbmQgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb25cbiAgICB0aGlzLmlzQ3Vyc29yVmlzaWJsZSA9IHRydWU7XG4gICAgaWYgKCF0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlbmRlckNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdGFydEludGVydmFsKHRpbWVUb1N0YXJ0OiBudW1iZXIgPSBCTElOS19JTlRFUlZBTCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGFueSBleGlzdGluZyBpbnRlcnZhbFxuICAgIGlmICh0aGlzLl9ibGlua0ludGVydmFsKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fYmxpbmtJbnRlcnZhbCk7XG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNldHVwIHRoZSBpbml0aWFsIHRpbWVvdXQgd2hpY2ggd2lsbCBoaWRlIHRoZSBjdXJzb3IsIHRoaXMgaXMgZG9uZSBiZWZvcmVcbiAgICAvLyB0aGUgcmVndWxhciBpbnRlcnZhbCBpcyBzZXR1cCBpbiBvcmRlciB0byBzdXBwb3J0IHJlc3RhcnRpbmcgdGhlIGJsaW5rXG4gICAgLy8gYW5pbWF0aW9uIGluIGEgbGlnaHR3ZWlnaHQgd2F5ICh3aXRob3V0IHRocmFzaGluZyBjbGVhckludGVydmFsIGFuZFxuICAgIC8vIHNldEludGVydmFsKS5cbiAgICB0aGlzLl9ibGlua1N0YXJ0VGltZW91dCA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBDaGVjayBpZiBhbm90aGVyIGFuaW1hdGlvbiByZXN0YXJ0IHdhcyByZXF1ZXN0ZWQgd2hpbGUgdGhpcyB3YXMgYmVpbmdcbiAgICAgIC8vIHN0YXJ0ZWRcbiAgICAgIGlmICh0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBCTElOS19JTlRFUlZBTCAtIChEYXRlLm5vdygpIC0gdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCk7XG4gICAgICAgIHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aW1lID4gMCkge1xuICAgICAgICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCh0aW1lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGlkZSB0aGUgY3Vyc29yXG4gICAgICB0aGlzLmlzQ3Vyc29yVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlbmRlckNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBibGluayBpbnRlcnZhbFxuICAgICAgdGhpcy5fYmxpbmtJbnRlcnZhbCA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAvLyBBZGp1c3QgdGhlIGFuaW1hdGlvbiB0aW1lIGlmIGl0IHdhcyByZXN0YXJ0ZWRcbiAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQpIHtcbiAgICAgICAgICAvLyBjYWxjIHRpbWUgZGlmZlxuICAgICAgICAgIC8vIE1ha2UgcmVzdGFydCBpbnRlcnZhbCBkbyBhIHNldFRpbWVvdXQgaW5pdGlhbGx5P1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSBCTElOS19JTlRFUlZBTCAtIChEYXRlLm5vdygpIC0gdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCk7XG4gICAgICAgICAgdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLl9yZXN0YXJ0SW50ZXJ2YWwodGltZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW52ZXJ0IHZpc2liaWxpdHkgYW5kIHJlbmRlclxuICAgICAgICB0aGlzLmlzQ3Vyc29yVmlzaWJsZSA9ICF0aGlzLmlzQ3Vyc29yVmlzaWJsZTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soKTtcbiAgICAgICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICB9LCBCTElOS19JTlRFUlZBTCk7XG4gICAgfSwgdGltZVRvU3RhcnQpO1xuICB9XG5cbiAgcHVibGljIHBhdXNlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fYmxpbmtJbnRlcnZhbCkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX2JsaW5rSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5fYmxpbmtJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0KSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9ibGlua1N0YXJ0VGltZW91dCk7XG4gICAgICB0aGlzLl9ibGlua1N0YXJ0VGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2FuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lKTtcbiAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXN1bWUoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgb3V0IGFueSBleGlzdGluZyB0aW1lcnMganVzdCBpbiBjYXNlXG4gICAgdGhpcy5wYXVzZSgpO1xuXG4gICAgdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZXN0YXJ0SW50ZXJ2YWwoKTtcbiAgICB0aGlzLnJlc3RhcnRCbGlua0FuaW1hdGlvbigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IHRvRGlzcG9zYWJsZSwgSURpc3Bvc2FibGUgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9saWZlY3ljbGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZURldmljZVBpeGVsRGltZW5zaW9ucyhlbGVtZW50OiBIVE1MRWxlbWVudCwgcGFyZW50V2luZG93OiBXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcywgY2FsbGJhY2s6IChkZXZpY2VXaWR0aDogbnVtYmVyLCBkZXZpY2VIZWlnaHQ6IG51bWJlcikgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgLy8gT2JzZXJ2ZSBhbnkgcmVzaXplcyB0byB0aGUgZWxlbWVudCBhbmQgZXh0cmFjdCB0aGUgYWN0dWFsIHBpeGVsIHNpemUgb2YgdGhlIGVsZW1lbnQgaWYgdGhlXG4gIC8vIGRldmljZVBpeGVsQ29udGVudEJveFNpemUgQVBJIGlzIHN1cHBvcnRlZC4gVGhpcyBhbGxvd3MgY29ycmVjdGluZyByb3VuZGluZyBlcnJvcnMgd2hlblxuICAvLyBjb252ZXJ0aW5nIGJldHdlZW4gQ1NTIHBpeGVscyBhbmQgZGV2aWNlIHBpeGVscyB3aGljaCBjYXVzZXMgYmx1cnJ5IHJlbmRlcmluZyB3aGVuIGRldmljZVxuICAvLyBwaXhlbCByYXRpbyBpcyBub3QgYSByb3VuZCBudW1iZXIuXG4gIGxldCBvYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQgPSBuZXcgcGFyZW50V2luZG93LlJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS50YXJnZXQgPT09IGVsZW1lbnQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEaXNjb25uZWN0IGlmIGRldmljZVBpeGVsQ29udGVudEJveFNpemUgaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyXG4gICAgaWYgKCEoJ2RldmljZVBpeGVsQ29udGVudEJveFNpemUnIGluIGVudHJ5KSkge1xuICAgICAgb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIG9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpcmUgdGhlIGNhbGxiYWNrLCBpZ25vcmUgZXZlbnRzIHdoZXJlIHRoZSBkaW1lbnNpb25zIGFyZSAweDAgYXMgdGhlIGNhbnZhcyBpcyBsaWtlbHkgaGlkZGVuXG4gICAgY29uc3Qgd2lkdGggPSBlbnRyeS5kZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplWzBdLmlubGluZVNpemU7XG4gICAgY29uc3QgaGVpZ2h0ID0gZW50cnkuZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZVswXS5ibG9ja1NpemU7XG4gICAgaWYgKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7XG4gICAgICBjYWxsYmFjayh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gIH0pO1xuICB0cnkge1xuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBib3g6IFsnZGV2aWNlLXBpeGVsLWNvbnRlbnQtYm94J10gfSBhcyBhbnkpO1xuICB9IGNhdGNoIHtcbiAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHRvRGlzcG9zYWJsZSgoKSA9PiBvYnNlcnZlcj8uZGlzY29ubmVjdCgpKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuLyoqXG4gKiBQb2x5ZmlsbCAtIENvbnZlcnQgVVRGMzIgY29kZXBvaW50IGludG8gSlMgc3RyaW5nLlxuICogTm90ZTogVGhlIGJ1aWx0LWluIFN0cmluZy5mcm9tQ29kZVBvaW50IGhhcHBlbnMgdG8gYmUgbXVjaCBzbG93ZXJcbiAqICAgICAgIGR1ZSB0byBhZGRpdGlvbmFsIHNhbml0eSBjaGVja3MuIFdlIGNhbiBhdm9pZCB0aGVtIHNpbmNlXG4gKiAgICAgICB3ZSBhbHdheXMgb3BlcmF0ZSBvbiBsZWdhbCBVVEYzMiAoZ3JhbnRlZCBieSB0aGUgaW5wdXQgZGVjb2RlcnMpXG4gKiAgICAgICBhbmQgdXNlIHRoaXMgZmFzdGVyIHZlcnNpb24gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zyb21Db2RlUG9pbnQoY29kZVBvaW50OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgY29kZVBvaW50IC09IDB4MTAwMDA7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVQb2ludCA+PiAxMCkgKyAweEQ4MDApICsgU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZVBvaW50ICUgMHg0MDApICsgMHhEQzAwKTtcbiAgfVxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgVVRGMzIgY2hhciBjb2RlcyBpbnRvIEpTIHN0cmluZy5cbiAqIEJhc2ljYWxseSB0aGUgc2FtZSBhcyBgc3RyaW5nRnJvbUNvZGVQb2ludGAgYnV0IGZvciBtdWx0aXBsZSBjb2RlcG9pbnRzXG4gKiBpbiBhIGxvb3AgKHdoaWNoIGlzIGEgbG90IGZhc3RlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dGYzMlRvU3RyaW5nKGRhdGE6IFVpbnQzMkFycmF5LCBzdGFydDogbnVtYmVyID0gMCwgZW5kOiBudW1iZXIgPSBkYXRhLmxlbmd0aCk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBsZXQgY29kZXBvaW50ID0gZGF0YVtpXTtcbiAgICBpZiAoY29kZXBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBKUyBzdHJpbmdzIGFyZSBlbmNvZGVkIGFzIFVURjE2LCB0aHVzIGEgbm9uIEJNUCBjb2RlcG9pbnQgZ2V0cyBjb252ZXJ0ZWQgaW50byBhIHN1cnJvZ2F0ZVxuICAgICAgLy8gcGFpciBjb252ZXJzaW9uIHJ1bGVzOlxuICAgICAgLy8gIC0gc3VidHJhY3QgMHgxMDAwMCBmcm9tIGNvZGUgcG9pbnQsIGxlYXZpbmcgYSAyMCBiaXQgbnVtYmVyXG4gICAgICAvLyAgLSBhZGQgaGlnaCAxMCBiaXRzIHRvIDB4RDgwMCAgLS0+IGZpcnN0IHN1cnJvZ2F0ZVxuICAgICAgLy8gIC0gYWRkIGxvdyAxMCBiaXRzIHRvIDB4REMwMCAgIC0tPiBzZWNvbmQgc3Vycm9nYXRlXG4gICAgICBjb2RlcG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlcG9pbnQgPj4gMTApICsgMHhEODAwKSArIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVwb2ludCAlIDB4NDAwKSArIDB4REMwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVwb2ludCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU3RyaW5nVG9VdGYzMiAtIGRlY29kZXMgVVRGMTYgc2VxdWVuY2VzIGludG8gVVRGMzIgY29kZXBvaW50cy5cbiAqIFRvIGtlZXAgdGhlIGRlY29kZXIgaW4gbGluZSB3aXRoIEpTIHN0cmluZ3MgaXQgaGFuZGxlcyBzaW5nbGUgc3Vycm9nYXRlcyBhcyBVQ1MyLlxuICovXG5leHBvcnQgY2xhc3MgU3RyaW5nVG9VdGYzMiB7XG4gIHByaXZhdGUgX2ludGVyaW06IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIENsZWFycyBpbnRlcmltIGFuZCByZXNldHMgZGVjb2RlciB0byBjbGVhbiBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnRlcmltID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgSlMgc3RyaW5nIHRvIFVURjMyIGNvZGVwb2ludHMuXG4gICAqIFRoZSBtZXRob2RzIGFzc3VtZXMgc3RyZWFtIGlucHV0IGFuZCB3aWxsIHN0b3JlIHBhcnRseSB0cmFuc21pdHRlZFxuICAgKiBzdXJyb2dhdGUgcGFpcnMgYW5kIGRlY29kZSB0aGVtIHdpdGggdGhlIG5leHQgZGF0YSBjaHVuay5cbiAgICogTm90ZTogVGhlIG1ldGhvZCBkb2VzIG5vIGJvdW5kIGNoZWNrcyBmb3IgdGFyZ2V0LCB0aGVyZWZvcmUgbWFrZSBzdXJlXG4gICAqIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIGRvZXMgbm90IGV4Y2VlZCB0aGUgc2l6ZSBvZiBgdGFyZ2V0YC5cbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gY29kZXBvaW50cyBpbiBgdGFyZ2V0YC5cbiAgICovXG4gIHB1YmxpYyBkZWNvZGUoaW5wdXQ6IHN0cmluZywgdGFyZ2V0OiBVaW50MzJBcnJheSk6IG51bWJlciB7XG4gICAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxldCBzaXplID0gMDtcbiAgICBsZXQgc3RhcnRQb3MgPSAwO1xuXG4gICAgLy8gaGFuZGxlIGxlZnRvdmVyIHN1cnJvZ2F0ZSBoaWdoXG4gICAgaWYgKHRoaXMuX2ludGVyaW0pIHtcbiAgICAgIGNvbnN0IHNlY29uZCA9IGlucHV0LmNoYXJDb2RlQXQoc3RhcnRQb3MrKyk7XG4gICAgICBpZiAoMHhEQzAwIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0gMHhERkZGKSB7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gKHRoaXMuX2ludGVyaW0gLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgKFVTQzIgaGFuZGxpbmcpXG4gICAgICAgIHRhcmdldFtzaXplKytdID0gdGhpcy5faW50ZXJpbTtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBzZWNvbmQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9pbnRlcmltID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gc3RhcnRQb3M7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAvLyBzdXJyb2dhdGUgcGFpciBmaXJzdFxuICAgICAgaWYgKDB4RDgwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAgIGlmICgrK2kgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5faW50ZXJpbSA9IGNvZGU7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2Vjb25kID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKDB4REMwMCA8PSBzZWNvbmQgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuICAgICAgICAgIHRhcmdldFtzaXplKytdID0gKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IChVU0MyIGhhbmRsaW5nKVxuICAgICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZTtcbiAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IHNlY29uZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2RlID09PSAweEZFRkYpIHtcbiAgICAgICAgLy8gQk9NXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbiAgfVxufVxuXG4vKipcbiAqIFV0ZjhEZWNvZGVyIC0gZGVjb2RlcyBVVEY4IGJ5dGUgc2VxdWVuY2VzIGludG8gVVRGMzIgY29kZXBvaW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFV0ZjhUb1V0ZjMyIHtcbiAgcHVibGljIGludGVyaW06IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgzKTtcblxuICAvKipcbiAgICogQ2xlYXJzIGludGVyaW0gYnl0ZXMgYW5kIHJlc2V0cyBkZWNvZGVyIHRvIGNsZWFuIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJpbS5maWxsKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgVVRGOCBieXRlIHNlcXVlbmNlcyBpbiBgaW5wdXRgIHRvIFVURjMyIGNvZGVwb2ludHMgaW4gYHRhcmdldGAuXG4gICAqIFRoZSBtZXRob2RzIGFzc3VtZXMgc3RyZWFtIGlucHV0IGFuZCB3aWxsIHN0b3JlIHBhcnRseSB0cmFuc21pdHRlZCBieXRlc1xuICAgKiBhbmQgZGVjb2RlIHRoZW0gd2l0aCB0aGUgbmV4dCBkYXRhIGNodW5rLlxuICAgKiBOb3RlOiBUaGUgbWV0aG9kIGRvZXMgbm8gYm91bmQgY2hlY2tzIGZvciB0YXJnZXQsIHRoZXJlZm9yZSBtYWtlIHN1cmVcbiAgICogdGhlIHByb3ZpZGVkIGRhdGEgY2h1bmsgZG9lcyBub3QgZXhjZWVkIHRoZSBzaXplIG9mIGB0YXJnZXRgLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBjb2RlcG9pbnRzIGluIGB0YXJnZXRgLlxuICAgKi9cbiAgcHVibGljIGRlY29kZShpbnB1dDogVWludDhBcnJheSwgdGFyZ2V0OiBVaW50MzJBcnJheSk6IG51bWJlciB7XG4gICAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxldCBzaXplID0gMDtcbiAgICBsZXQgYnl0ZTE6IG51bWJlcjtcbiAgICBsZXQgYnl0ZTI6IG51bWJlcjtcbiAgICBsZXQgYnl0ZTM6IG51bWJlcjtcbiAgICBsZXQgYnl0ZTQ6IG51bWJlcjtcbiAgICBsZXQgY29kZXBvaW50ID0gMDtcbiAgICBsZXQgc3RhcnRQb3MgPSAwO1xuXG4gICAgLy8gaGFuZGxlIGxlZnRvdmVyIGJ5dGVzXG4gICAgaWYgKHRoaXMuaW50ZXJpbVswXSkge1xuICAgICAgbGV0IGRpc2NhcmRJbnRlcmltID0gZmFsc2U7XG4gICAgICBsZXQgY3AgPSB0aGlzLmludGVyaW1bMF07XG4gICAgICBjcCAmPSAoKCgoY3AgJiAweEUwKSA9PT0gMHhDMCkpID8gMHgxRiA6ICgoKGNwICYgMHhGMCkgPT09IDB4RTApKSA/IDB4MEYgOiAweDA3KTtcbiAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgbGV0IHRtcDogbnVtYmVyO1xuICAgICAgd2hpbGUgKCh0bXAgPSB0aGlzLmludGVyaW1bKytwb3NdICYgMHgzRikgJiYgcG9zIDwgNCkge1xuICAgICAgICBjcCA8PD0gNjtcbiAgICAgICAgY3AgfD0gdG1wO1xuICAgICAgfVxuICAgICAgLy8gbWlzc2luZyBieXRlcyAtIHJlYWQgYWhlYWQgZnJvbSBpbnB1dFxuICAgICAgY29uc3QgdHlwZSA9ICgoKHRoaXMuaW50ZXJpbVswXSAmIDB4RTApID09PSAweEMwKSkgPyAyIDogKCgodGhpcy5pbnRlcmltWzBdICYgMHhGMCkgPT09IDB4RTApKSA/IDMgOiA0O1xuICAgICAgY29uc3QgbWlzc2luZyA9IHR5cGUgLSBwb3M7XG4gICAgICB3aGlsZSAoc3RhcnRQb3MgPCBtaXNzaW5nKSB7XG4gICAgICAgIGlmIChzdGFydFBvcyA+PSBsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB0bXAgPSBpbnB1dFtzdGFydFBvcysrXTtcbiAgICAgICAgaWYgKCh0bXAgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvbiwgZGlzY2FyZCBpbnRlcmltIGJ5dGVzIGNvbXBsZXRlbHlcbiAgICAgICAgICBzdGFydFBvcy0tO1xuICAgICAgICAgIGRpc2NhcmRJbnRlcmltID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBuZWVkIHRvIHNhdmUgc28gd2UgY2FuIGNvbnRpbnVlIHNob3J0IGlucHV0cyBpbiBuZXh0IGNhbGxcbiAgICAgICAgICB0aGlzLmludGVyaW1bcG9zKytdID0gdG1wO1xuICAgICAgICAgIGNwIDw8PSA2O1xuICAgICAgICAgIGNwIHw9IHRtcCAmIDB4M0Y7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZGlzY2FyZEludGVyaW0pIHtcbiAgICAgICAgLy8gZmluYWwgdGVzdCBpcyB0eXBlIGRlcGVuZGVudFxuICAgICAgICBpZiAodHlwZSA9PT0gMikge1xuICAgICAgICAgIGlmIChjcCA8IDB4ODApIHtcbiAgICAgICAgICAgIC8vIHdyb25nIHN0YXJ0ZXIgYnl0ZVxuICAgICAgICAgICAgc3RhcnRQb3MtLTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gMykge1xuICAgICAgICAgIGlmIChjcCA8IDB4MDgwMCB8fCAoY3AgPj0gMHhEODAwICYmIGNwIDw9IDB4REZGRikgfHwgY3AgPT09IDB4RkVGRikge1xuICAgICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgb3IgQk9NXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtzaXplKytdID0gY3A7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjcCA8IDB4MDEwMDAwIHx8IGNwID4gMHgxMEZGRkYpIHtcbiAgICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtzaXplKytdID0gY3A7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmludGVyaW0uZmlsbCgwKTtcbiAgICB9XG5cbiAgICAvLyBsb29wIHRocm91Z2ggaW5wdXRcbiAgICBjb25zdCBmb3VyU3RvcCA9IGxlbmd0aCAtIDQ7XG4gICAgbGV0IGkgPSBzdGFydFBvcztcbiAgICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgICAgLyoqXG4gICAgICAgKiBBU0NJSSBzaG9ydGN1dCB3aXRoIGxvb3AgdW5yb2xsZWQgdG8gNCBjb25zZWN1dGl2ZSBBU0NJSSBjaGFycy5cbiAgICAgICAqIFRoaXMgaXMgYSBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgZ2FpbiBmb3IgQVNDSUlcbiAgICAgICAqIGFuZCBwZW5hbHR5IGZvciBub24gQVNDSUk6XG4gICAgICAgKiBGb3IgYmVzdCBBU0NJSSBwZXJmb3JtYW5jZSB0aGUgY2hhciBzaG91bGQgYmUgc3RvcmVkIGRpcmVjdGx5IGludG8gdGFyZ2V0LFxuICAgICAgICogYnV0IGV2ZW4gYSBzaW5nbGUgYXR0ZW1wdCB0byB3cml0ZSB0byB0YXJnZXQgYW5kIGNvbXBhcmUgYWZ0ZXJ3YXJkc1xuICAgICAgICogcGVuYWxpemVzIG5vbiBBU0NJSSByZWFsbHkgYmFkICgtNTAlKSwgdGh1cyB3ZSBsb2FkIHRoZSBjaGFyIGludG8gYnl0ZVggZmlyc3QsXG4gICAgICAgKiB3aGljaCByZWR1Y2VzIEFTQ0lJIHBlcmZvcm1hbmNlIGJ5IH4xNSUuXG4gICAgICAgKiBUaGlzIHRyaWFsIGZvciBBU0NJSSByZWR1Y2VzIG5vbiBBU0NJSSBwZXJmb3JtYW5jZSBieSB+MTAlIHdoaWNoIHNlZW1zIGFjY2VwdGlibGVcbiAgICAgICAqIGNvbXBhcmVkIHRvIHRoZSBnYWlucy5cbiAgICAgICAqIE5vdGUgdGhhdCB0aGlzIG9wdGltaXphdGlvbiBvbmx5IHRha2VzIHBsYWNlIGZvciA0IGNvbnNlY3V0aXZlIEFTQ0lJIGNoYXJzLFxuICAgICAgICogZm9yIGFueSBzaG9ydGVyIGl0IGJhaWxzIG91dC4gV29yc3QgY2FzZSAtIGFsbCA0IGJ5dGVzIGJlaW5nIHJlYWQgYnV0XG4gICAgICAgKiB0aHJvd24gYXdheSBkdWUgdG8gdGhlIGxhc3QgYmVpbmcgYSBub24gQVNDSUkgY2hhciAoLTEwJSBwZXJmb3JtYW5jZSkuXG4gICAgICAgKi9cbiAgICAgIHdoaWxlIChpIDwgZm91clN0b3BcbiAgICAgICAgJiYgISgoYnl0ZTEgPSBpbnB1dFtpXSkgJiAweDgwKVxuICAgICAgICAmJiAhKChieXRlMiA9IGlucHV0W2kgKyAxXSkgJiAweDgwKVxuICAgICAgICAmJiAhKChieXRlMyA9IGlucHV0W2kgKyAyXSkgJiAweDgwKVxuICAgICAgICAmJiAhKChieXRlNCA9IGlucHV0W2kgKyAzXSkgJiAweDgwKSlcbiAgICAgIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMTtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMjtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMztcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlNDtcbiAgICAgICAgaSArPSA0O1xuICAgICAgfVxuXG4gICAgICAvLyByZXJlYWQgYnl0ZTFcbiAgICAgIGJ5dGUxID0gaW5wdXRbaSsrXTtcblxuICAgICAgLy8gMSBieXRlXG4gICAgICBpZiAoYnl0ZTEgPCAweDgwKSB7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTE7XG5cbiAgICAgICAgLy8gMiBieXRlc1xuICAgICAgfSBlbHNlIGlmICgoYnl0ZTEgJiAweEUwKSA9PT0gMHhDMCkge1xuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMiA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTIgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb2RlcG9pbnQgPSAoYnl0ZTEgJiAweDFGKSA8PCA2IHwgKGJ5dGUyICYgMHgzRik7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPCAweDgwKSB7XG4gICAgICAgICAgLy8gd3Jvbmcgc3RhcnRlciBieXRlXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZXBvaW50O1xuXG4gICAgICAgIC8vIDMgYnl0ZXNcbiAgICAgIH0gZWxzZSBpZiAoKGJ5dGUxICYgMHhGMCkgPT09IDB4RTApIHtcbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTIgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUyICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzFdID0gYnl0ZTI7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTMgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUzICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXBvaW50ID0gKGJ5dGUxICYgMHgwRikgPDwgMTIgfCAoYnl0ZTIgJiAweDNGKSA8PCA2IHwgKGJ5dGUzICYgMHgzRik7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPCAweDA4MDAgfHwgKGNvZGVwb2ludCA+PSAweEQ4MDAgJiYgY29kZXBvaW50IDw9IDB4REZGRikgfHwgY29kZXBvaW50ID09PSAweEZFRkYpIHtcbiAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCBvciBCT00sIG5vIGktLSBoZXJlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlcG9pbnQ7XG5cbiAgICAgICAgLy8gNCBieXRlc1xuICAgICAgfSBlbHNlIGlmICgoYnl0ZTEgJiAweEY4KSA9PT0gMHhGMCkge1xuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMiA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTIgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMV0gPSBieXRlMjtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMyA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTMgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMV0gPSBieXRlMjtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMl0gPSBieXRlMztcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlNCA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTQgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb2RlcG9pbnQgPSAoYnl0ZTEgJiAweDA3KSA8PCAxOCB8IChieXRlMiAmIDB4M0YpIDw8IDEyIHwgKGJ5dGUzICYgMHgzRikgPDwgNiB8IChieXRlNCAmIDB4M0YpO1xuICAgICAgICBpZiAoY29kZXBvaW50IDwgMHgwMTAwMDAgfHwgY29kZXBvaW50ID4gMHgxMEZGRkYpIHtcbiAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCwgbm8gaS0tIGhlcmVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGVwb2ludDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlsbGVnYWwgYnl0ZSwganVzdCBza2lwXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IENoYXJEYXRhLCBJQ2VsbERhdGEsIElFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IHN0cmluZ0Zyb21Db2RlUG9pbnQgfSBmcm9tICdjb21tb24vaW5wdXQvVGV4dERlY29kZXInO1xuaW1wb3J0IHsgQ0hBUl9EQVRBX0NIQVJfSU5ERVgsIENIQVJfREFUQV9XSURUSF9JTkRFWCwgQ0hBUl9EQVRBX0FUVFJfSU5ERVgsIENvbnRlbnQgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVEYXRhLCBFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcblxuLyoqXG4gKiBDZWxsRGF0YSAtIHJlcHJlc2VudHMgYSBzaW5nbGUgQ2VsbCBpbiB0aGUgdGVybWluYWwgYnVmZmVyLlxuICovXG5leHBvcnQgY2xhc3MgQ2VsbERhdGEgZXh0ZW5kcyBBdHRyaWJ1dGVEYXRhIGltcGxlbWVudHMgSUNlbGxEYXRhIHtcbiAgLyoqIEhlbHBlciB0byBjcmVhdGUgQ2VsbERhdGEgZnJvbSBDaGFyRGF0YS4gKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ2hhckRhdGEodmFsdWU6IENoYXJEYXRhKTogQ2VsbERhdGEge1xuICAgIGNvbnN0IG9iaiA9IG5ldyBDZWxsRGF0YSgpO1xuICAgIG9iai5zZXRGcm9tQ2hhckRhdGEodmFsdWUpO1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgLyoqIFByaW1pdGl2ZXMgZnJvbSB0ZXJtaW5hbCBidWZmZXIuICovXG4gIHB1YmxpYyBjb250ZW50ID0gMDtcbiAgcHVibGljIGZnID0gMDtcbiAgcHVibGljIGJnID0gMDtcbiAgcHVibGljIGV4dGVuZGVkOiBJRXh0ZW5kZWRBdHRycyA9IG5ldyBFeHRlbmRlZEF0dHJzKCk7XG4gIHB1YmxpYyBjb21iaW5lZERhdGEgPSAnJztcbiAgLyoqIFdoZXRoZXIgY2VsbCBjb250YWlucyBhIGNvbWJpbmVkIHN0cmluZy4gKi9cbiAgcHVibGljIGlzQ29tYmluZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLO1xuICB9XG4gIC8qKiBXaWR0aCBvZiB0aGUgY2VsbC4gKi9cbiAgcHVibGljIGdldFdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudCA+PiBDb250ZW50LldJRFRIX1NISUZUO1xuICB9XG4gIC8qKiBKUyBzdHJpbmcgb2YgdGhlIGNvbnRlbnQuICovXG4gIHB1YmxpYyBnZXRDaGFycygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVkRGF0YTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0spIHtcbiAgICAgIHJldHVybiBzdHJpbmdGcm9tQ29kZVBvaW50KHRoaXMuY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0spO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgLyoqXG4gICAqIENvZGVwb2ludCBvZiBjZWxsXG4gICAqIE5vdGUgdGhpcyByZXR1cm5zIHRoZSBVVEYzMiBjb2RlcG9pbnQgb2Ygc2luZ2xlIGNoYXJzLFxuICAgKiBpZiBjb250ZW50IGlzIGEgY29tYmluZWQgc3RyaW5nIGl0IHJldHVybnMgdGhlIGNvZGVwb2ludFxuICAgKiBvZiB0aGUgbGFzdCBjaGFyIGluIHN0cmluZyB0byBiZSBpbiBsaW5lIHdpdGggY29kZSBpbiBDaGFyRGF0YS5cbiAgICovXG4gIHB1YmxpYyBnZXRDb2RlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmlzQ29tYmluZWQoKSlcbiAgICAgID8gdGhpcy5jb21iaW5lZERhdGEuY2hhckNvZGVBdCh0aGlzLmNvbWJpbmVkRGF0YS5sZW5ndGggLSAxKVxuICAgICAgOiB0aGlzLmNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLO1xuICB9XG4gIC8qKiBTZXQgZGF0YSBmcm9tIENoYXJEYXRhICovXG4gIHB1YmxpYyBzZXRGcm9tQ2hhckRhdGEodmFsdWU6IENoYXJEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5mZyA9IHZhbHVlW0NIQVJfREFUQV9BVFRSX0lOREVYXTtcbiAgICB0aGlzLmJnID0gMDtcbiAgICBsZXQgY29tYmluZWQgPSBmYWxzZTtcbiAgICAvLyBzdXJyb2dhdGVzIGFuZCBjb21iaW5lZCBzdHJpbmdzIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnRcbiAgICBpZiAodmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmxlbmd0aCA+IDIpIHtcbiAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgY29kZSA9IHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5jaGFyQ29kZUF0KDApO1xuICAgICAgLy8gaWYgdGhlIDItY2hhciBzdHJpbmcgaXMgYSBzdXJyb2dhdGUgY3JlYXRlIHNpbmdsZSBjb2RlcG9pbnRcbiAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBpcyBjb21iaW5lZFxuICAgICAgaWYgKDB4RDgwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAgIGNvbnN0IHNlY29uZCA9IHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5jaGFyQ29kZUF0KDEpO1xuICAgICAgICBpZiAoMHhEQzAwIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50ID0gKChjb2RlIC0gMHhEODAwKSAqIDB4NDAwICsgc2Vjb25kIC0gMHhEQzAwICsgMHgxMDAwMCkgfCAodmFsdWVbQ0hBUl9EQVRBX1dJRFRIX0lOREVYXSA8PCBDb250ZW50LldJRFRIX1NISUZUKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb21iaW5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb21iaW5lZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50ID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMCkgfCAodmFsdWVbQ0hBUl9EQVRBX1dJRFRIX0lOREVYXSA8PCBDb250ZW50LldJRFRIX1NISUZUKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkKSB7XG4gICAgICB0aGlzLmNvbWJpbmVkRGF0YSA9IHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXTtcbiAgICAgIHRoaXMuY29udGVudCA9IENvbnRlbnQuSVNfQ09NQklORURfTUFTSyB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgIH1cbiAgfVxuICAvKiogR2V0IGRhdGEgYXMgQ2hhckRhdGEuICovXG4gIHB1YmxpYyBnZXRBc0NoYXJEYXRhKCk6IENoYXJEYXRhIHtcbiAgICByZXR1cm4gW3RoaXMuZmcsIHRoaXMuZ2V0Q2hhcnMoKSwgdGhpcy5nZXRXaWR0aCgpLCB0aGlzLmdldENvZGUoKV07XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5cbi8qKlxuICogQSBtYXRyaXggdGhhdCB3aGVuIG11bHRpcGxpZXMgd2lsbCB0cmFuc2xhdGUgMC0xIGNvb3JkaW5hdGVzIChsZWZ0IHRvIHJpZ2h0LFxuICogdG9wIHRvIGJvdHRvbSkgdG8gY2xpcCBzcGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBST0pFQ1RJT05fTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbXG4gIDIsIDAsIDAsIDAsXG4gIDAsIC0yLCAwLCAwLFxuICAwLCAwLCAxLCAwLFxuICAtMSwgMSwgMCwgMVxuXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHZlcnRleFNvdXJjZTogc3RyaW5nLCBmcmFnbWVudFNvdXJjZTogc3RyaW5nKTogV2ViR0xQcm9ncmFtIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvZ3JhbSA9IHRocm93SWZGYWxzeShnbC5jcmVhdGVQcm9ncmFtKCkpO1xuICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdGhyb3dJZkZhbHN5KGNyZWF0ZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U291cmNlKSkpO1xuICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdGhyb3dJZkZhbHN5KGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNvdXJjZSkpKTtcbiAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7XG4gIGNvbnN0IHN1Y2Nlc3MgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKTtcbiAgaWYgKHN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gcHJvZ3JhbTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpO1xuICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2hhZGVyKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHR5cGU6IG51bWJlciwgc291cmNlOiBzdHJpbmcpOiBXZWJHTFNoYWRlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNoYWRlciA9IHRocm93SWZGYWxzeShnbC5jcmVhdGVTaGFkZXIodHlwZSkpO1xuICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpO1xuICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG4gIGNvbnN0IHN1Y2Nlc3MgPSBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyk7XG4gIGlmIChzdWNjZXNzKSB7XG4gICAgcmV0dXJuIHNoYWRlcjtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTtcbiAgZ2wuZGVsZXRlU2hhZGVyKHNoYWRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmRGbG9hdDMyQXJyYXkoc291cmNlOiBGbG9hdDMyQXJyYXksIG1heDogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbmV3TGVuZ3RoID0gTWF0aC5taW4oc291cmNlLmxlbmd0aCAqIDIsIG1heCk7XG4gIGNvbnN0IG5ld0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheShuZXdMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld0FycmF5W2ldID0gc291cmNlW2ldO1xuICB9XG4gIHJldHVybiBuZXdBcnJheTtcbn1cblxuZXhwb3J0IGNsYXNzIEdMVGV4dHVyZSB7XG4gIHB1YmxpYyB0ZXh0dXJlOiBXZWJHTFRleHR1cmU7XG4gIHB1YmxpYyB2ZXJzaW9uOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IodGV4dHVyZTogV2ViR0xUZXh0dXJlKSB7XG4gICAgdGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcbiAgICB0aGlzLnZlcnNpb24gPSAtMTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0IHsgVGV4dHVyZUF0bGFzIH0gZnJvbSAnLi9UZXh0dXJlQXRsYXMnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBOVUxMX0NFTExfQ09ERSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2xpZmVjeWNsZSc7XG5pbXBvcnQgeyBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBJUmVuZGVyTW9kZWwsIElXZWJHTDJSZW5kZXJpbmdDb250ZXh0LCBJV2ViR0xWZXJ0ZXhBcnJheU9iamVjdCwgdHlwZSBJUmFzdGVyaXplZEdseXBoLCB0eXBlIElUZXh0dXJlQXRsYXMgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVByb2dyYW0sIEdMVGV4dHVyZSwgUFJPSkVDVElPTl9NQVRSSVggfSBmcm9tICcuL1dlYmdsVXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgYWxsb3dSZXNjYWxpbmcsIHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuXG5pbnRlcmZhY2UgSVZlcnRpY2VzIHtcbiAgYXR0cmlidXRlczogRmxvYXQzMkFycmF5O1xuICAvKipcbiAgICogVGhlc2UgYnVmZmVycyBhcmUgdGhlIG9uZXMgdXNlZCB0byBiaW5kIHRvIFdlYkdMLCB0aGUgcmVhc29uIHRoZXJlIGFyZVxuICAgKiBtdWx0aXBsZSBpcyB0byBhbGxvdyBkb3VibGUgYnVmZmVyaW5nIHRvIHdvcmsgYXMgeW91IGNhbm5vdCBtb2RpZnkgdGhlXG4gICAqIGJ1ZmZlciB3aGlsZSBpdCdzIGJlaW5nIHVzZWQgYnkgdGhlIEdQVS4gSGF2aW5nIG11bHRpcGxlIGxldHMgdXMgc3RhcnRcbiAgICogd29ya2luZyBvbiB0aGUgbmV4dCBmcmFtZS5cbiAgICovXG4gIGF0dHJpYnV0ZXNCdWZmZXJzOiBGbG9hdDMyQXJyYXlbXTtcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuY29uc3QgZW51bSBWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMge1xuICBVTklUX1FVQUQgPSAwLFxuICBDRUxMX1BPU0lUSU9OID0gMSxcbiAgT0ZGU0VUID0gMixcbiAgU0laRSA9IDMsXG4gIFRFWFBBR0UgPSA0LFxuICBURVhDT09SRCA9IDUsXG4gIFRFWFNJWkUgPSA2XG59XG5cbmNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGAjdmVyc2lvbiAzMDAgZXNcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5VTklUX1FVQUR9KSBpbiB2ZWMyIGFfdW5pdHF1YWQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ0VMTF9QT1NJVElPTn0pIGluIHZlYzIgYV9jZWxscG9zO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLk9GRlNFVH0pIGluIHZlYzIgYV9vZmZzZXQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRX0pIGluIHZlYzIgYV9zaXplO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFBBR0V9KSBpbiBmbG9hdCBhX3RleHBhZ2U7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYQ09PUkR9KSBpbiB2ZWMyIGFfdGV4Y29vcmQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYU0laRX0pIGluIHZlYzIgYV90ZXhzaXplO1xuXG51bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjtcblxub3V0IHZlYzIgdl90ZXhjb29yZDtcbmZsYXQgb3V0IGludCB2X3RleHBhZ2U7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiB6ZXJvVG9PbmUgPSAoYV9vZmZzZXQgLyB1X3Jlc29sdXRpb24pICsgYV9jZWxscG9zICsgKGFfdW5pdHF1YWQgKiBhX3NpemUpO1xuICBnbF9Qb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHZlYzQoemVyb1RvT25lLCAwLjAsIDEuMCk7XG4gIHZfdGV4cGFnZSA9IGludChhX3RleHBhZ2UpO1xuICB2X3RleGNvb3JkID0gYV90ZXhjb29yZCArIGFfdW5pdHF1YWQgKiBhX3RleHNpemU7XG59YDtcblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRTaGFkZXJTb3VyY2UobWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGxldCB0ZXh0dXJlQ29uZGl0aW9uYWxzID0gJyc7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHM7IGkrKykge1xuICAgIHRleHR1cmVDb25kaXRpb25hbHMgKz0gYCBlbHNlIGlmICh2X3RleHBhZ2UgPT0gJHtpfSkgeyBvdXRDb2xvciA9IHRleHR1cmUodV90ZXh0dXJlWyR7aX1dLCB2X3RleGNvb3JkKTsgfWA7XG4gIH1cbiAgcmV0dXJuIChgI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbG93cCBmbG9hdDtcblxuaW4gdmVjMiB2X3RleGNvb3JkO1xuZmxhdCBpbiBpbnQgdl90ZXhwYWdlO1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmVbJHttYXhGcmFnbWVudFNoYWRlclRleHR1cmVVbml0c31dO1xuXG5vdXQgdmVjNCBvdXRDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBpZiAodl90ZXhwYWdlID09IDApIHtcbiAgICBvdXRDb2xvciA9IHRleHR1cmUodV90ZXh0dXJlWzBdLCB2X3RleGNvb3JkKTtcbiAgfSAke3RleHR1cmVDb25kaXRpb25hbHN9XG59YCk7XG59XG5cbmNvbnN0IElORElDRVNfUEVSX0NFTEwgPSAxMTtcbmNvbnN0IEJZVEVTX1BFUl9DRUxMID0gSU5ESUNFU19QRVJfQ0VMTCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbmNvbnN0IENFTExfUE9TSVRJT05fSU5ESUNFUyA9IDI7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRpID0gMDtcbmxldCAkZ2x5cGg6IElSYXN0ZXJpemVkR2x5cGggfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5sZXQgJGxlZnRDZWxsUGFkZGluZyA9IDA7XG5sZXQgJGNsaXBwZWRQaXhlbHMgPSAwO1xuXG5leHBvcnQgY2xhc3MgR2x5cGhSZW5kZXJlciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZlcnRleEFycmF5T2JqZWN0OiBJV2ViR0xWZXJ0ZXhBcnJheU9iamVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvamVjdGlvbkxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb2x1dGlvbkxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGV4dHVyZUxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYXRsYXNUZXh0dXJlczogR0xUZXh0dXJlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX2F0dHJpYnV0ZXNCdWZmZXI6IFdlYkdMQnVmZmVyO1xuXG4gIHByaXZhdGUgX2F0bGFzOiBJVGV4dHVyZUF0bGFzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hY3RpdmVCdWZmZXI6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZlcnRpY2VzOiBJVmVydGljZXMgPSB7XG4gICAgY291bnQ6IDAsXG4gICAgYXR0cmlidXRlczogbmV3IEZsb2F0MzJBcnJheSgwKSxcbiAgICBhdHRyaWJ1dGVzQnVmZmVyczogW1xuICAgICAgbmV3IEZsb2F0MzJBcnJheSgwKSxcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoMClcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2dsOiBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCxcbiAgICBwcml2YXRlIF9kaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBnbCA9IHRoaXMuX2dsO1xuXG4gICAgaWYgKFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFR5cGljYWxseSA4IG9yIDE2XG4gICAgICBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyA9IE1hdGgubWluKDMyLCB0aHJvd0lmRmFsc3koZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSBhcyBudW1iZXIgfCBudWxsKSk7XG4gICAgICAvLyBBbG1vc3QgYWxsIGNsaWVudHMgd2lsbCBzdXBwb3J0ID49IDQwOTZcbiAgICAgIFRleHR1cmVBdGxhcy5tYXhUZXh0dXJlU2l6ZSA9IHRocm93SWZGYWxzeShnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSkgYXMgbnVtYmVyIHwgbnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvZ3JhbSA9IHRocm93SWZGYWxzeShjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UsIGNyZWF0ZUZyYWdtZW50U2hhZGVyU291cmNlKFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzKSkpO1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVQcm9ncmFtKHRoaXMuX3Byb2dyYW0pKSk7XG5cbiAgICAvLyBVbmlmb3JtIGxvY2F0aW9uc1xuICAgIHRoaXMuX3Byb2plY3Rpb25Mb2NhdGlvbiA9IHRocm93SWZGYWxzeShnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5fcHJvZ3JhbSwgJ3VfcHJvamVjdGlvbicpKTtcbiAgICB0aGlzLl9yZXNvbHV0aW9uTG9jYXRpb24gPSB0aHJvd0lmRmFsc3koZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuX3Byb2dyYW0sICd1X3Jlc29sdXRpb24nKSk7XG4gICAgdGhpcy5fdGV4dHVyZUxvY2F0aW9uID0gdGhyb3dJZkZhbHN5KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLl9wcm9ncmFtLCAndV90ZXh0dXJlJykpO1xuXG4gICAgLy8gQ3JlYXRlIGFuZCBzZXQgdGhlIHZlcnRleCBhcnJheSBvYmplY3RcbiAgICB0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCA9IGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XG4gICAgZ2wuYmluZFZlcnRleEFycmF5KHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KTtcblxuICAgIC8vIFNldHVwIGFfdW5pdHF1YWQsIHRoaXMgZGVmaW5lcyB0aGUgNCB2ZXJ0aWNlcyBvZiBhIHJlY3RhbmdsZVxuICAgIGNvbnN0IHVuaXRRdWFkVmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAxLCAwLCAwLCAxLCAxLCAxXSk7XG4gICAgY29uc3QgdW5pdFF1YWRWZXJ0aWNlc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVCdWZmZXIodW5pdFF1YWRWZXJ0aWNlc0J1ZmZlcikpKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdW5pdFF1YWRWZXJ0aWNlc0J1ZmZlcik7XG4gICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIHVuaXRRdWFkVmVydGljZXMsIGdsLlNUQVRJQ19EUkFXKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVU5JVF9RVUFEKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5VTklUX1FVQUQsIDIsIHRoaXMuX2dsLkZMT0FULCBmYWxzZSwgMCwgMCk7XG5cbiAgICAvLyBTZXR1cCB0aGUgdW5pdCBxdWFkIGVsZW1lbnQgYXJyYXkgYnVmZmVyLCB0aGlzIHBvaW50cyB0byBpbmRpY2VzIGluXG4gICAgLy8gdW5pdFF1YWRWZXJ0aWNlcyB0byBhbGxvdyBpcyB0byBkcmF3IDIgdHJpYW5nbGVzIGZyb20gdGhlIHZlcnRpY2VzIHZpYSBhXG4gICAgLy8gdHJpYW5nbGUgc3RyaXBcbiAgICBjb25zdCB1bml0UXVhZEVsZW1lbnRJbmRpY2VzID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDEsIDIsIDNdKTtcbiAgICBjb25zdCBlbGVtZW50SW5kaWNlc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVCdWZmZXIoZWxlbWVudEluZGljZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEluZGljZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHVuaXRRdWFkRWxlbWVudEluZGljZXMsIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgIC8vIFNldHVwIGF0dHJpYnV0ZXNcbiAgICB0aGlzLl9hdHRyaWJ1dGVzQnVmZmVyID0gdGhyb3dJZkZhbHN5KGdsLmNyZWF0ZUJ1ZmZlcigpKTtcbiAgICB0aGlzLl9yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5PRkZTRVQpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLk9GRlNFVCwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgMCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuT0ZGU0VULCAxKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRSk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRSwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgMiAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRSwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFBBR0UpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFBBR0UsIDEsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX0NFTEwsIDQgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFBBR0UsIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhDT09SRCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYQ09PUkQsIDIsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX0NFTEwsIDUgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWENPT1JELCAxKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYU0laRSk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYU0laRSwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgNyAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYU0laRSwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLkNFTExfUE9TSVRJT04pO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLkNFTExfUE9TSVRJT04sIDIsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX0NFTEwsIDkgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoVmVydGV4QXR0cmliTG9jYXRpb25zLkNFTExfUE9TSVRJT04sIDEpO1xuXG4gICAgLy8gU2V0dXAgc3RhdGljIHVuaWZvcm1zXG4gICAgZ2wudXNlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtKTtcbiAgICBjb25zdCB0ZXh0dXJlVW5pdHMgPSBuZXcgSW50MzJBcnJheShUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlczsgaSsrKSB7XG4gICAgICB0ZXh0dXJlVW5pdHNbaV0gPSBpO1xuICAgIH1cbiAgICBnbC51bmlmb3JtMWl2KHRoaXMuX3RleHR1cmVMb2NhdGlvbiwgdGV4dHVyZVVuaXRzKTtcbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMuX3Byb2plY3Rpb25Mb2NhdGlvbiwgZmFsc2UsIFBST0pFQ1RJT05fTUFUUklYKTtcblxuICAgIC8vIFNldHVwIDF4MSByZWQgcGl4ZWwgdGV4dHVyZXMgZm9yIGFsbCBwb3RlbnRpYWwgYXRsYXMgcGFnZXMsIGlmIG9uZSBvZiB0aGVzZSBpbnZhbGlkIHRleHR1cmVzXG4gICAgLy8gaXMgZXZlciBkcmF3biBpdCB3aWxsIHNob3cgY2hhcmFjdGVycyBhcyByZWQgcmVjdGFuZ2xlcy5cbiAgICB0aGlzLl9hdGxhc1RleHR1cmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlczsgaSsrKSB7XG4gICAgICBjb25zdCBnbFRleHR1cmUgPSBuZXcgR0xUZXh0dXJlKHRocm93SWZGYWxzeShnbC5jcmVhdGVUZXh0dXJlKCkpKTtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVUZXh0dXJlKGdsVGV4dHVyZS50ZXh0dXJlKSkpO1xuICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIGkpO1xuICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZ2xUZXh0dXJlLnRleHR1cmUpO1xuICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMSwgMSwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgbmV3IFVpbnQ4QXJyYXkoWzI1NSwgMCwgMCwgMjU1XSkpO1xuICAgICAgdGhpcy5fYXRsYXNUZXh0dXJlc1tpXSA9IGdsVGV4dHVyZTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBkcmF3aW5nIG9mIHRyYW5zcGFyZW50IHRleHR1cmVcbiAgICBnbC5lbmFibGUoZ2wuQkxFTkQpO1xuICAgIGdsLmJsZW5kRnVuYyhnbC5TUkNfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuXG4gICAgLy8gU2V0IHZpZXdwb3J0XG4gICAgdGhpcy5oYW5kbGVSZXNpemUoKTtcbiAgfVxuXG4gIHB1YmxpYyBiZWdpbkZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hdGxhcyA/IHRoaXMuX2F0bGFzLmJlZ2luRnJhbWUoKSA6IHRydWU7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ2VsbCh4OiBudW1iZXIsIHk6IG51bWJlciwgY29kZTogbnVtYmVyLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgY2hhcnM6IHN0cmluZywgd2lkdGg6IG51bWJlciwgbGFzdEJnOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZXZlcnkgY2VsbCAoYHJvd3MqY29sc2ApLCBpdCBtdXN0IGJlIHZlcnkgb3B0aW1pemVkLiBJdFxuICAgIC8vIHNob3VsZCBub3QgaW5zdGFudGlhdGUgYW55IHZhcmlhYmxlcyB1bmxlc3MgYSBuZXcgZ2x5cGggaXMgZHJhd24gdG8gdGhlIGNhY2hlIHdoZXJlIHRoZVxuICAgIC8vIHNsaWdodCBzbG93ZG93biBpcyBhY2NlcHRhYmxlIGZvciB0aGUgZGV2ZWxvcGVyIGVyZ29ub21pY3MgcHJvdmlkZWQgYXMgaXQncyBhIG9uY2Ugb2YgZm9yXG4gICAgLy8gZWFjaCBnbHlwaC5cbiAgICB0aGlzLl91cGRhdGVDZWxsKHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXMsIHgsIHksIGNvZGUsIGJnLCBmZywgZXh0LCBjaGFycywgd2lkdGgsIGxhc3RCZyk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDZWxsKGFycmF5OiBGbG9hdDMyQXJyYXksIHg6IG51bWJlciwgeTogbnVtYmVyLCBjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIGV4dDogbnVtYmVyLCBjaGFyczogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBsYXN0Qmc6IG51bWJlcik6IHZvaWQge1xuICAgICRpID0gKHkgKiB0aGlzLl90ZXJtaW5hbC5jb2xzICsgeCkgKiBJTkRJQ0VTX1BFUl9DRUxMO1xuXG4gICAgLy8gRXhpdCBlYXJseSBpZiB0aGlzIGlzIGEgbnVsbCBjaGFyYWN0ZXIsIGFsbG93IHNwYWNlIGNoYXJhY3RlciB0byBjb250aW51ZSBhcyBpdCBtYXkgaGF2ZVxuICAgIC8vIHVuZGVybGluZS9zdHJpa2V0aHJvdWdoIHN0eWxlc1xuICAgIGlmIChjb2RlID09PSBOVUxMX0NFTExfQ09ERSB8fCBjb2RlID09PSB1bmRlZmluZWQvKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSByaWdodCBzaWRlIG9mIHdpZGUgY2hhcnMgKi8pIHtcbiAgICAgIGFycmF5LmZpbGwoMCwgJGksICRpICsgSU5ESUNFU19QRVJfQ0VMTCAtIDEgLSBDRUxMX1BPU0lUSU9OX0lORElDRVMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fYXRsYXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGdseXBoXG4gICAgaWYgKGNoYXJzICYmIGNoYXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICRnbHlwaCA9IHRoaXMuX2F0bGFzLmdldFJhc3Rlcml6ZWRHbHlwaENvbWJpbmVkQ2hhcihjaGFycywgYmcsIGZnLCBleHQsIGZhbHNlLCB0aGlzLl90ZXJtaW5hbC5lbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgJGdseXBoID0gdGhpcy5fYXRsYXMuZ2V0UmFzdGVyaXplZEdseXBoKGNvZGUsIGJnLCBmZywgZXh0LCBmYWxzZSwgdGhpcy5fdGVybWluYWwuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgJGxlZnRDZWxsUGFkZGluZyA9IE1hdGguZmxvb3IoKHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGggLSB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jaGFyLndpZHRoKSAvIDIpO1xuICAgIGlmIChiZyAhPT0gbGFzdEJnICYmICRnbHlwaC5vZmZzZXQueCA+ICRsZWZ0Q2VsbFBhZGRpbmcpIHtcbiAgICAgICRjbGlwcGVkUGl4ZWxzID0gJGdseXBoLm9mZnNldC54IC0gJGxlZnRDZWxsUGFkZGluZztcbiAgICAgIC8vIGFfb3JpZ2luXG4gICAgICBhcnJheVskaSAgICBdID0gLSgkZ2x5cGgub2Zmc2V0LnggLSAkY2xpcHBlZFBpeGVscykgKyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jaGFyLmxlZnQ7XG4gICAgICBhcnJheVskaSArIDFdID0gLSRnbHlwaC5vZmZzZXQueSArIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNoYXIudG9wO1xuICAgICAgLy8gYV9zaXplXG4gICAgICBhcnJheVskaSArIDJdID0gKCRnbHlwaC5zaXplLnggLSAkY2xpcHBlZFBpeGVscykgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgICBhcnJheVskaSArIDNdID0gJGdseXBoLnNpemUueSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQ7XG4gICAgICAvLyBhX3RleHBhZ2VcbiAgICAgIGFycmF5WyRpICsgNF0gPSAkZ2x5cGgudGV4dHVyZVBhZ2U7XG4gICAgICAvLyBhX3RleGNvb3JkXG4gICAgICBhcnJheVskaSArIDVdID0gJGdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS54ICsgJGNsaXBwZWRQaXhlbHMgLyB0aGlzLl9hdGxhcy5wYWdlc1skZ2x5cGgudGV4dHVyZVBhZ2VdLmNhbnZhcy53aWR0aDtcbiAgICAgIGFycmF5WyRpICsgNl0gPSAkZ2x5cGgudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnk7XG4gICAgICAvLyBhX3RleHNpemVcbiAgICAgIGFycmF5WyRpICsgN10gPSAkZ2x5cGguc2l6ZUNsaXBTcGFjZS54IC0gJGNsaXBwZWRQaXhlbHMgLyB0aGlzLl9hdGxhcy5wYWdlc1skZ2x5cGgudGV4dHVyZVBhZ2VdLmNhbnZhcy53aWR0aDtcbiAgICAgIGFycmF5WyRpICsgOF0gPSAkZ2x5cGguc2l6ZUNsaXBTcGFjZS55O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhX29yaWdpblxuICAgICAgYXJyYXlbJGkgICAgXSA9IC0kZ2x5cGgub2Zmc2V0LnggKyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jaGFyLmxlZnQ7XG4gICAgICBhcnJheVskaSArIDFdID0gLSRnbHlwaC5vZmZzZXQueSArIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNoYXIudG9wO1xuICAgICAgLy8gYV9zaXplXG4gICAgICBhcnJheVskaSArIDJdID0gJGdseXBoLnNpemUueCAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aDtcbiAgICAgIGFycmF5WyRpICsgM10gPSAkZ2x5cGguc2l6ZS55IC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICAgIC8vIGFfdGV4cGFnZVxuICAgICAgYXJyYXlbJGkgKyA0XSA9ICRnbHlwaC50ZXh0dXJlUGFnZTtcbiAgICAgIC8vIGFfdGV4Y29vcmRcbiAgICAgIGFycmF5WyRpICsgNV0gPSAkZ2x5cGgudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLng7XG4gICAgICBhcnJheVskaSArIDZdID0gJGdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS55O1xuICAgICAgLy8gYV90ZXhzaXplXG4gICAgICBhcnJheVskaSArIDddID0gJGdseXBoLnNpemVDbGlwU3BhY2UueDtcbiAgICAgIGFycmF5WyRpICsgOF0gPSAkZ2x5cGguc2l6ZUNsaXBTcGFjZS55O1xuICAgIH1cbiAgICAvLyBhX2NlbGxwb3Mgb25seSBjaGFuZ2VzIG9uIHJlc2l6ZVxuXG4gICAgLy8gUmVkdWNlIHNjYWxlIGhvcml6b250YWxseSBmb3Igd2lkZSBnbHlwaHMgcHJpbnRlZCBpbiBjZWxscyB0aGF0IHdvdWxkIG92ZXJsYXAgd2l0aCB0aGVcbiAgICAvLyBmb2xsb3dpbmcgY2VsbCAoaWUuIHRoZSB3aWR0aCBpcyBub3QgMikuXG4gICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMucmVzY2FsZU92ZXJsYXBwaW5nR2x5cGhzKSB7XG4gICAgICBpZiAoYWxsb3dSZXNjYWxpbmcoY29kZSwgd2lkdGgsICRnbHlwaC5zaXplLngsIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgpKSB7XG4gICAgICAgIGFycmF5WyRpICsgMl0gPSAodGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCAtIDEpIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoOyAvLyAtIDEgdG8gaW1wcm92ZSByZWFkYWJpbGl0eVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtaW5hbCA9IHRoaXMuX3Rlcm1pbmFsO1xuICAgIGNvbnN0IG5ld0NvdW50ID0gdGVybWluYWwuY29scyAqIHRlcm1pbmFsLnJvd3MgKiBJTkRJQ0VTX1BFUl9DRUxMO1xuXG4gICAgLy8gQ2xlYXIgdmVydGljZXNcbiAgICBpZiAodGhpcy5fdmVydGljZXMuY291bnQgIT09IG5ld0NvdW50KSB7XG4gICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzID0gbmV3IEZsb2F0MzJBcnJheShuZXdDb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXMuZmlsbCgwKTtcbiAgICB9XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciAoOyBpIDwgdGhpcy5fdmVydGljZXMuYXR0cmlidXRlc0J1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl92ZXJ0aWNlcy5jb3VudCAhPT0gbmV3Q291bnQpIHtcbiAgICAgICAgdGhpcy5fdmVydGljZXMuYXR0cmlidXRlc0J1ZmZlcnNbaV0gPSBuZXcgRmxvYXQzMkFycmF5KG5ld0NvdW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXNCdWZmZXJzW2ldLmZpbGwoMCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3ZlcnRpY2VzLmNvdW50ID0gbmV3Q291bnQ7XG4gICAgaSA9IDA7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0ZXJtaW5hbC5yb3dzOyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGVybWluYWwuY29sczsgeCsrKSB7XG4gICAgICAgIHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXNbaSArIDldID0geCAvIHRlcm1pbmFsLmNvbHM7XG4gICAgICAgIHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXNbaSArIDEwXSA9IHkgLyB0ZXJtaW5hbC5yb3dzO1xuICAgICAgICBpICs9IElORElDRVNfUEVSX0NFTEw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVJlc2l6ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX2dsO1xuICAgIGdsLnVzZVByb2dyYW0odGhpcy5fcHJvZ3JhbSk7XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTtcbiAgICBnbC51bmlmb3JtMmYodGhpcy5fcmVzb2x1dGlvbkxvY2F0aW9uLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIocmVuZGVyTW9kZWw6IElSZW5kZXJNb2RlbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fYXRsYXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBnbCA9IHRoaXMuX2dsO1xuXG4gICAgZ2wudXNlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtKTtcbiAgICBnbC5iaW5kVmVydGV4QXJyYXkodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpO1xuXG4gICAgLy8gQWx0ZXJuYXRlIGJ1ZmZlcnMgZWFjaCBmcmFtZSBhcyB0aGUgYWN0aXZlIGJ1ZmZlciBnZXRzIGxvY2tlZCB3aGlsZSBpdCdzIGluIHVzZSBieSB0aGUgR1BVXG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyID0gKHRoaXMuX2FjdGl2ZUJ1ZmZlciArIDEpICUgMjtcbiAgICBjb25zdCBhY3RpdmVCdWZmZXIgPSB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzQnVmZmVyc1t0aGlzLl9hY3RpdmVCdWZmZXJdO1xuXG4gICAgLy8gQ29weSBkYXRhIGZvciBlYWNoIGNlbGwgb2YgZWFjaCBsaW5lIHVwIHRvIGl0cyBsaW5lIGxlbmd0aCAodGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2VsbClcbiAgICAvLyBmcm9tIHRoZSBhdHRyaWJ1dGVzIGJ1ZmZlciBpbnRvIGFjdGl2ZUJ1ZmZlciwgd2hpY2ggaXMgdGhlIG9uZSB0aGF0IGdldHMgYm91bmQgdG8gdGhlIEdQVS5cbiAgICAvLyBUaGUgcmVhc29ucyBmb3IgdGhpcyBhcmUgYXMgZm9sbG93czpcbiAgICAvLyAtIFNvIHRoZSBhY3RpdmUgYnVmZmVyIGNhbiBiZSBhbHRlcm5hdGVkIHNvIHdlIGRvbid0IGdldCBibG9ja2VkIG9uIHJlbmRlcmluZyBmaW5pc2hpbmdcbiAgICAvLyAtIFRvIGNvcHkgZWl0aGVyIHRoZSBub3JtYWwgYXR0cmlidXRlcyBidWZmZXIgb3IgdGhlIHNlbGVjdGlvbiBhdHRyaWJ1dGVzIGJ1ZmZlciB3aGVuIHRoZXJlXG4gICAgLy8gICBpcyBhIHNlbGVjdGlvblxuICAgIC8vIC0gU28gd2UgZG9uJ3Qgc2VuZCB2ZXJ0aWNlcyBmb3IgYWxsIHRoZSBsaW5lLWVuZGluZyB3aGl0ZXNwYWNlIHRvIHRoZSBHUFVcbiAgICBsZXQgYnVmZmVyTGVuZ3RoID0gMDtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHJlbmRlck1vZGVsLmxpbmVMZW5ndGhzLmxlbmd0aDsgeSsrKSB7XG4gICAgICBjb25zdCBzaSA9IHkgKiB0aGlzLl90ZXJtaW5hbC5jb2xzICogSU5ESUNFU19QRVJfQ0VMTDtcbiAgICAgIGNvbnN0IHN1YiA9IHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXMuc3ViYXJyYXkoc2ksIHNpICsgcmVuZGVyTW9kZWwubGluZUxlbmd0aHNbeV0gKiBJTkRJQ0VTX1BFUl9DRUxMKTtcbiAgICAgIGFjdGl2ZUJ1ZmZlci5zZXQoc3ViLCBidWZmZXJMZW5ndGgpO1xuICAgICAgYnVmZmVyTGVuZ3RoICs9IHN1Yi5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gQmluZCB0aGUgYXR0cmlidXRlcyBidWZmZXJcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5fYXR0cmlidXRlc0J1ZmZlcik7XG4gICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGFjdGl2ZUJ1ZmZlci5zdWJhcnJheSgwLCBidWZmZXJMZW5ndGgpLCBnbC5TVFJFQU1fRFJBVyk7XG5cbiAgICAvLyBCaW5kIHRoZSBhdGxhcyBwYWdlIHRleHR1cmUgaWYgdGhleSBoYXZlIGNoYW5nZWRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2F0bGFzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fYXRsYXMucGFnZXNbaV0udmVyc2lvbiAhPT0gdGhpcy5fYXRsYXNUZXh0dXJlc1tpXS52ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX2JpbmRBdGxhc1BhZ2VUZXh0dXJlKGdsLCB0aGlzLl9hdGxhcywgaSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRHJhdyB0aGUgdmlld3BvcnRcbiAgICBnbC5kcmF3RWxlbWVudHNJbnN0YW5jZWQoZ2wuVFJJQU5HTEVfU1RSSVAsIDQsIGdsLlVOU0lHTkVEX0JZVEUsIDAsIGJ1ZmZlckxlbmd0aCAvIElORElDRVNfUEVSX0NFTEwpO1xuICB9XG5cbiAgcHVibGljIHNldEF0bGFzKGF0bGFzOiBJVGV4dHVyZUF0bGFzKTogdm9pZCB7XG4gICAgdGhpcy5fYXRsYXMgPSBhdGxhcztcbiAgICBmb3IgKGNvbnN0IGdsVGV4dHVyZSBvZiB0aGlzLl9hdGxhc1RleHR1cmVzKSB7XG4gICAgICBnbFRleHR1cmUudmVyc2lvbiA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2JpbmRBdGxhc1BhZ2VUZXh0dXJlKGdsOiBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgYXRsYXM6IElUZXh0dXJlQXRsYXMsIGk6IG51bWJlcik6IHZvaWQge1xuICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTAgKyBpKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLl9hdGxhc1RleHR1cmVzW2ldLnRleHR1cmUpO1xuICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgYXRsYXMucGFnZXNbaV0uY2FudmFzKTtcbiAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcbiAgICB0aGlzLl9hdGxhc1RleHR1cmVzW2ldLnZlcnNpb24gPSBhdGxhcy5wYWdlc1tpXS52ZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIHNldERpbWVuc2lvbnMoZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnMpOiB2b2lkIHtcbiAgICB0aGlzLl9kaW1lbnNpb25zID0gZGltZW5zaW9ucztcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJVGVybWluYWwgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuY2xhc3MgU2VsZWN0aW9uUmVuZGVyTW9kZWwgaW1wbGVtZW50cyBJU2VsZWN0aW9uUmVuZGVyTW9kZWwge1xuICBwdWJsaWMgaGFzU2VsZWN0aW9uITogYm9vbGVhbjtcbiAgcHVibGljIGNvbHVtblNlbGVjdE1vZGUhOiBib29sZWFuO1xuICBwdWJsaWMgdmlld3BvcnRTdGFydFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHZpZXdwb3J0RW5kUm93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRDYXBwZWRTdGFydFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHZpZXdwb3J0Q2FwcGVkRW5kUm93ITogbnVtYmVyO1xuICBwdWJsaWMgc3RhcnRDb2whOiBudW1iZXI7XG4gIHB1YmxpYyBlbmRDb2whOiBudW1iZXI7XG4gIHB1YmxpYyBzZWxlY3Rpb25TdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHNlbGVjdGlvbkVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5oYXNTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbHVtblNlbGVjdE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPSAwO1xuICAgIHRoaXMudmlld3BvcnRFbmRSb3cgPSAwO1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdyA9IDA7XG4gICAgdGhpcy5zdGFydENvbCA9IDA7XG4gICAgdGhpcy5lbmRDb2wgPSAwO1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25FbmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlKHRlcm1pbmFsOiBJVGVybWluYWwsIHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IGVuZDtcbiAgICAvLyBTZWxlY3Rpb24gZG9lcyBub3QgZXhpc3RcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQgfHwgKHN0YXJ0WzBdID09PSBlbmRbMF0gJiYgc3RhcnRbMV0gPT09IGVuZFsxXSkpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2xhdGUgZnJvbSBidWZmZXIgcG9zaXRpb24gdG8gdmlld3BvcnQgcG9zaXRpb25cbiAgICBjb25zdCB2aWV3cG9ydFkgPSB0ZXJtaW5hbC5idWZmZXJzLmFjdGl2ZS55ZGlzcDtcbiAgICBjb25zdCB2aWV3cG9ydFN0YXJ0Um93ID0gc3RhcnRbMV0gLSB2aWV3cG9ydFk7XG4gICAgY29uc3Qgdmlld3BvcnRFbmRSb3cgPSBlbmRbMV0gLSB2aWV3cG9ydFk7XG4gICAgY29uc3Qgdmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IE1hdGgubWF4KHZpZXdwb3J0U3RhcnRSb3csIDApO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gTWF0aC5taW4odmlld3BvcnRFbmRSb3csIHRlcm1pbmFsLnJvd3MgLSAxKTtcblxuICAgIC8vIE5vIG5lZWQgdG8gZHJhdyB0aGUgc2VsZWN0aW9uXG4gICAgaWYgKHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPj0gdGVybWluYWwucm93cyB8fCB2aWV3cG9ydENhcHBlZEVuZFJvdyA8IDApIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhc1NlbGVjdGlvbiA9IHRydWU7XG4gICAgdGhpcy5jb2x1bW5TZWxlY3RNb2RlID0gY29sdW1uU2VsZWN0TW9kZTtcbiAgICB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPSB2aWV3cG9ydFN0YXJ0Um93O1xuICAgIHRoaXMudmlld3BvcnRFbmRSb3cgPSB2aWV3cG9ydEVuZFJvdztcbiAgICB0aGlzLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPSB2aWV3cG9ydENhcHBlZFN0YXJ0Um93O1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRFbmRSb3cgPSB2aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICB0aGlzLnN0YXJ0Q29sID0gc3RhcnRbMF07XG4gICAgdGhpcy5lbmRDb2wgPSBlbmRbMF07XG4gIH1cblxuICBwdWJsaWMgaXNDZWxsU2VsZWN0ZWQodGVybWluYWw6IFRlcm1pbmFsLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgeSAtPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlLnZpZXdwb3J0WTtcbiAgICBpZiAodGhpcy5jb2x1bW5TZWxlY3RNb2RlKSB7XG4gICAgICBpZiAodGhpcy5zdGFydENvbCA8PSB0aGlzLmVuZENvbCkge1xuICAgICAgICByZXR1cm4geCA+PSB0aGlzLnN0YXJ0Q29sICYmIHkgPj0gdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ICYmXG4gICAgICAgICAgeCA8IHRoaXMuZW5kQ29sICYmIHkgPD0gdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICAgIH1cbiAgICAgIHJldHVybiB4IDwgdGhpcy5zdGFydENvbCAmJiB5ID49IHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyAmJlxuICAgICAgICB4ID49IHRoaXMuZW5kQ29sICYmIHkgPD0gdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICB9XG4gICAgcmV0dXJuICh5ID4gdGhpcy52aWV3cG9ydFN0YXJ0Um93ICYmIHkgPCB0aGlzLnZpZXdwb3J0RW5kUm93KSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA9PT0gdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB5ID09PSB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeCA+PSB0aGlzLnN0YXJ0Q29sICYmIHggPCB0aGlzLmVuZENvbCkgfHxcbiAgICAgICh0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPCB0aGlzLnZpZXdwb3J0RW5kUm93ICYmIHkgPT09IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeCA8IHRoaXMuZW5kQ29sKSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA8IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeSA9PT0gdGhpcy52aWV3cG9ydFN0YXJ0Um93ICYmIHggPj0gdGhpcy5zdGFydENvbCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsKCk6IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uUmVuZGVyTW9kZWwoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUN1cnNvclJlbmRlck1vZGVsLCBJUmVuZGVyTW9kZWwgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvU2VsZWN0aW9uUmVuZGVyTW9kZWwnO1xuXG5leHBvcnQgY29uc3QgUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMID0gNDtcbmV4cG9ydCBjb25zdCBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUID0gMTtcbmV4cG9ydCBjb25zdCBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VUID0gMjtcbmV4cG9ydCBjb25zdCBSRU5ERVJfTU9ERUxfRVhUX09GRlNFVCA9IDM7XG5cbmV4cG9ydCBjb25zdCBDT01CSU5FRF9DSEFSX0JJVF9NQVNLID0gMHg4MDAwMDAwMDtcblxuZXhwb3J0IGNsYXNzIFJlbmRlck1vZGVsIGltcGxlbWVudHMgSVJlbmRlck1vZGVsIHtcbiAgcHVibGljIGNlbGxzOiBVaW50MzJBcnJheTtcbiAgcHVibGljIGxpbmVMZW5ndGhzOiBVaW50MzJBcnJheTtcbiAgcHVibGljIHNlbGVjdGlvbjogSVNlbGVjdGlvblJlbmRlck1vZGVsO1xuICBwdWJsaWMgY3Vyc29yPzogSUN1cnNvclJlbmRlck1vZGVsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2VsbHMgPSBuZXcgVWludDMyQXJyYXkoMCk7XG4gICAgdGhpcy5saW5lTGVuZ3RocyA9IG5ldyBVaW50MzJBcnJheSgwKTtcbiAgICB0aGlzLnNlbGVjdGlvbiA9IGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXhDb3VudCA9IGNvbHMgKiByb3dzICogUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMO1xuICAgIGlmIChpbmRleENvdW50ICE9PSB0aGlzLmNlbGxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jZWxscyA9IG5ldyBVaW50MzJBcnJheShpbmRleENvdW50KTtcbiAgICAgIHRoaXMubGluZUxlbmd0aHMgPSBuZXcgVWludDMyQXJyYXkocm93cyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuY2VsbHMuZmlsbCgwLCAwKTtcbiAgICB0aGlzLmxpbmVMZW5ndGhzLmZpbGwoMCwgMCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBGZ0ZsYWdzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAndnMvYmFzZS9jb21tb24vbGlmZWN5Y2xlJztcbmltcG9ydCB7IElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VULCBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VULCBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEwgfSBmcm9tICcuL1JlbmRlck1vZGVsJztcbmltcG9ydCB7IElSZW5kZXJNb2RlbCwgSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIElXZWJHTFZlcnRleEFycmF5T2JqZWN0IH0gZnJvbSAnLi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm9ncmFtLCBleHBhbmRGbG9hdDMyQXJyYXksIFBST0pFQ1RJT05fTUFUUklYIH0gZnJvbSAnLi9XZWJnbFV0aWxzJztcbmltcG9ydCB7IHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuXG5jb25zdCBlbnVtIFZlcnRleEF0dHJpYkxvY2F0aW9ucyB7XG4gIFBPU0lUSU9OID0gMCxcbiAgU0laRSA9IDEsXG4gIENPTE9SID0gMixcbiAgVU5JVF9RVUFEID0gM1xufVxuXG5jb25zdCB2ZXJ0ZXhTaGFkZXJTb3VyY2UgPSBgI3ZlcnNpb24gMzAwIGVzXG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuUE9TSVRJT059KSBpbiB2ZWMyIGFfcG9zaXRpb247XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRX0pIGluIHZlYzIgYV9zaXplO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLkNPTE9SfSkgaW4gdmVjNCBhX2NvbG9yO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLlVOSVRfUVVBRH0pIGluIHZlYzIgYV91bml0cXVhZDtcblxudW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbjtcblxub3V0IHZlYzQgdl9jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICB2ZWMyIHplcm9Ub09uZSA9IGFfcG9zaXRpb24gKyAoYV91bml0cXVhZCAqIGFfc2l6ZSk7XG4gIGdsX1Bvc2l0aW9uID0gdV9wcm9qZWN0aW9uICogdmVjNCh6ZXJvVG9PbmUsIDAuMCwgMS4wKTtcbiAgdl9jb2xvciA9IGFfY29sb3I7XG59YDtcblxuY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBgI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbG93cCBmbG9hdDtcblxuaW4gdmVjNCB2X2NvbG9yO1xuXG5vdXQgdmVjNCBvdXRDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBvdXRDb2xvciA9IHZfY29sb3I7XG59YDtcblxuY29uc3QgSU5ESUNFU19QRVJfUkVDVEFOR0xFID0gODtcbmNvbnN0IEJZVEVTX1BFUl9SRUNUQU5HTEUgPSBJTkRJQ0VTX1BFUl9SRUNUQU5HTEUgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG5cbmNvbnN0IElOSVRJQUxfQlVGRkVSX1JFQ1RBTkdMRV9DQVBBQ0lUWSA9IDIwICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuXG5jbGFzcyBWZXJ0aWNlcyB7XG4gIHB1YmxpYyBhdHRyaWJ1dGVzOiBGbG9hdDMyQXJyYXk7XG4gIHB1YmxpYyBjb3VudDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYXR0cmlidXRlcyA9IG5ldyBGbG9hdDMyQXJyYXkoSU5JVElBTF9CVUZGRVJfUkVDVEFOR0xFX0NBUEFDSVRZKTtcbiAgICB0aGlzLmNvdW50ID0gMDtcbiAgfVxufVxuXG4vLyBXb3JrIHZhcmlhYmxlcyB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbmxldCAkcmdiYSA9IDA7XG5sZXQgJHgxID0gMDtcbmxldCAkeTEgPSAwO1xubGV0ICRyID0gMDtcbmxldCAkZyA9IDA7XG5sZXQgJGIgPSAwO1xubGV0ICRhID0gMDtcblxuZXhwb3J0IGNsYXNzIFJlY3RhbmdsZVJlbmRlcmVyIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG5cbiAgcHJpdmF0ZSBfcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xuICBwcml2YXRlIF92ZXJ0ZXhBcnJheU9iamVjdDogSVdlYkdMVmVydGV4QXJyYXlPYmplY3Q7XG4gIHByaXZhdGUgX2F0dHJpYnV0ZXNCdWZmZXI6IFdlYkdMQnVmZmVyO1xuICBwcml2YXRlIF9wcm9qZWN0aW9uTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBwcml2YXRlIF9iZ0Zsb2F0ITogRmxvYXQzMkFycmF5O1xuICBwcml2YXRlIF9jdXJzb3JGbG9hdCE6IEZsb2F0MzJBcnJheTtcblxuICBwcml2YXRlIF92ZXJ0aWNlczogVmVydGljZXMgPSBuZXcgVmVydGljZXMoKTtcbiAgcHJpdmF0ZSBfdmVydGljZXNDdXJzb3I6IFZlcnRpY2VzID0gbmV3IFZlcnRpY2VzKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgX2dsOiBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCxcbiAgICBwcml2YXRlIF9kaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IGdsID0gdGhpcy5fZ2w7XG5cbiAgICB0aGlzLl9wcm9ncmFtID0gdGhyb3dJZkZhbHN5KGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlclNvdXJjZSwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpKTtcbiAgICB0aGlzLl9yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtKSkpO1xuXG4gICAgLy8gVW5pZm9ybSBsb2NhdGlvbnNcbiAgICB0aGlzLl9wcm9qZWN0aW9uTG9jYXRpb24gPSB0aHJvd0lmRmFsc3koZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuX3Byb2dyYW0sICd1X3Byb2plY3Rpb24nKSk7XG5cbiAgICAvLyBDcmVhdGUgYW5kIHNldCB0aGUgdmVydGV4IGFycmF5IG9iamVjdFxuICAgIHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0ID0gZ2wuY3JlYXRlVmVydGV4QXJyYXkoKTtcbiAgICBnbC5iaW5kVmVydGV4QXJyYXkodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpO1xuXG4gICAgLy8gU2V0dXAgYV91bml0cXVhZCwgdGhpcyBkZWZpbmVzIHRoZSA0IHZlcnRpY2VzIG9mIGEgcmVjdGFuZ2xlXG4gICAgY29uc3QgdW5pdFF1YWRWZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDEsIDAsIDAsIDEsIDEsIDFdKTtcbiAgICBjb25zdCB1bml0UXVhZFZlcnRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZUJ1ZmZlcih1bml0UXVhZFZlcnRpY2VzQnVmZmVyKSkpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB1bml0UXVhZFZlcnRpY2VzQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgdW5pdFF1YWRWZXJ0aWNlcywgZ2wuU1RBVElDX0RSQVcpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5VTklUX1FVQUQpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLlVOSVRfUVVBRCwgMiwgdGhpcy5fZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcblxuICAgIC8vIFNldHVwIHRoZSB1bml0IHF1YWQgZWxlbWVudCBhcnJheSBidWZmZXIsIHRoaXMgcG9pbnRzIHRvIGluZGljZXMgaW5cbiAgICAvLyB1bml0UXVhZFZlcnRpY2VzIHRvIGFsbG93IGlzIHRvIGRyYXcgMiB0cmlhbmdsZXMgZnJvbSB0aGUgdmVydGljZXMgdmlhIGFcbiAgICAvLyB0cmlhbmdsZSBzdHJpcFxuICAgIGNvbnN0IHVuaXRRdWFkRWxlbWVudEluZGljZXMgPSBuZXcgVWludDhBcnJheShbMCwgMSwgMiwgM10pO1xuICAgIGNvbnN0IGVsZW1lbnRJbmRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZUJ1ZmZlcihlbGVtZW50SW5kaWNlc0J1ZmZlcikpKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50SW5kaWNlc0J1ZmZlcik7XG4gICAgZ2wuYnVmZmVyRGF0YShnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdW5pdFF1YWRFbGVtZW50SW5kaWNlcywgZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgLy8gU2V0dXAgYXR0cmlidXRlc1xuICAgIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIgPSB0aHJvd0lmRmFsc3koZ2wuY3JlYXRlQnVmZmVyKCkpO1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVCdWZmZXIodGhpcy5fYXR0cmlidXRlc0J1ZmZlcikpKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5fYXR0cmlidXRlc0J1ZmZlcik7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlBPU0lUSU9OKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5QT1NJVElPTiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfUkVDVEFOR0xFLCAwKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5QT1NJVElPTiwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlNJWkUpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLlNJWkUsIDIsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX1JFQ1RBTkdMRSwgMiAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRSwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLkNPTE9SKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5DT0xPUiwgNCwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfUkVDVEFOR0xFLCA0ICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5DT0xPUiwgMSk7XG5cbiAgICB0aGlzLl91cGRhdGVDYWNoZWRDb2xvcnMoX3RoZW1lU2VydmljZS5jb2xvcnMpO1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMuX3RoZW1lU2VydmljZS5vbkNoYW5nZUNvbG9ycyhlID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZUNhY2hlZENvbG9ycyhlKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpZXdwb3J0UmVjdGFuZ2xlKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHJlbmRlckJhY2tncm91bmRzKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlclZlcnRpY2VzKHRoaXMuX3ZlcnRpY2VzKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXJDdXJzb3IoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyVmVydGljZXModGhpcy5fdmVydGljZXNDdXJzb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyVmVydGljZXModmVydGljZXM6IFZlcnRpY2VzKTogdm9pZCB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcblxuICAgIGdsLnVzZVByb2dyYW0odGhpcy5fcHJvZ3JhbSk7XG5cbiAgICBnbC5iaW5kVmVydGV4QXJyYXkodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpO1xuXG4gICAgZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLl9wcm9qZWN0aW9uTG9jYXRpb24sIGZhbHNlLCBQUk9KRUNUSU9OX01BVFJJWCk7XG5cbiAgICAvLyBCaW5kIGF0dHJpYnV0ZXMgYnVmZmVyIGFuZCBkcmF3XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLCBnbC5EWU5BTUlDX0RSQVcpO1xuICAgIGdsLmRyYXdFbGVtZW50c0luc3RhbmNlZCh0aGlzLl9nbC5UUklBTkdMRV9TVFJJUCwgNCwgZ2wuVU5TSUdORURfQllURSwgMCwgdmVydGljZXMuY291bnQpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVWaWV3cG9ydFJlY3RhbmdsZSgpO1xuICB9XG5cbiAgcHVibGljIHNldERpbWVuc2lvbnMoZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnMpOiB2b2lkIHtcbiAgICB0aGlzLl9kaW1lbnNpb25zID0gZGltZW5zaW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNhY2hlZENvbG9ycyhjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQpOiB2b2lkIHtcbiAgICB0aGlzLl9iZ0Zsb2F0ID0gdGhpcy5fY29sb3JUb0Zsb2F0MzJBcnJheShjb2xvcnMuYmFja2dyb3VuZCk7XG4gICAgdGhpcy5fY3Vyc29yRmxvYXQgPSB0aGlzLl9jb2xvclRvRmxvYXQzMkFycmF5KGNvbG9ycy5jdXJzb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlVmlld3BvcnRSZWN0YW5nbGUoKTogdm9pZCB7XG4gICAgLy8gU2V0IGZpcnN0IHJlY3RhbmdsZSB0aGF0IGNsZWFycyB0aGUgc2NyZWVuXG4gICAgdGhpcy5fYWRkUmVjdGFuZ2xlRmxvYXQoXG4gICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdGhpcy5fdGVybWluYWwuY29scyAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICB0aGlzLl90ZXJtaW5hbC5yb3dzICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQsXG4gICAgICB0aGlzLl9iZ0Zsb2F0XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVCYWNrZ3JvdW5kcyhtb2RlbDogSVJlbmRlck1vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgdGVybWluYWwgPSB0aGlzLl90ZXJtaW5hbDtcbiAgICBjb25zdCB2ZXJ0aWNlcyA9IHRoaXMuX3ZlcnRpY2VzO1xuXG4gICAgLy8gRGVjbGFyZSB2YXJpYWJsZSBhaGVhZCBvZiB0aW1lIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgIGxldCByZWN0YW5nbGVDb3VudCA9IDE7XG4gICAgbGV0IHk6IG51bWJlcjtcbiAgICBsZXQgeDogbnVtYmVyO1xuICAgIGxldCBjdXJyZW50U3RhcnRYOiBudW1iZXI7XG4gICAgbGV0IGN1cnJlbnRCZzogbnVtYmVyO1xuICAgIGxldCBjdXJyZW50Rmc6IG51bWJlcjtcbiAgICBsZXQgY3VycmVudEludmVyc2U6IGJvb2xlYW47XG4gICAgbGV0IG1vZGVsSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgYmc6IG51bWJlcjtcbiAgICBsZXQgZmc6IG51bWJlcjtcbiAgICBsZXQgaW52ZXJzZTogYm9vbGVhbjtcbiAgICBsZXQgb2Zmc2V0OiBudW1iZXI7XG5cbiAgICBmb3IgKHkgPSAwOyB5IDwgdGVybWluYWwucm93czsgeSsrKSB7XG4gICAgICBjdXJyZW50U3RhcnRYID0gLTE7XG4gICAgICBjdXJyZW50QmcgPSAwO1xuICAgICAgY3VycmVudEZnID0gMDtcbiAgICAgIGN1cnJlbnRJbnZlcnNlID0gZmFsc2U7XG4gICAgICBmb3IgKHggPSAwOyB4IDwgdGVybWluYWwuY29sczsgeCsrKSB7XG4gICAgICAgIG1vZGVsSW5kZXggPSAoKHkgKiB0ZXJtaW5hbC5jb2xzKSArIHgpICogUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMO1xuICAgICAgICBiZyA9IG1vZGVsLmNlbGxzW21vZGVsSW5kZXggKyBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUXTtcbiAgICAgICAgZmcgPSBtb2RlbC5jZWxsc1ttb2RlbEluZGV4ICsgUkVOREVSX01PREVMX0ZHX09GRlNFVF07XG4gICAgICAgIGludmVyc2UgPSAhIShmZyAmIEZnRmxhZ3MuSU5WRVJTRSk7XG4gICAgICAgIGlmIChiZyAhPT0gY3VycmVudEJnIHx8IChmZyAhPT0gY3VycmVudEZnICYmIChjdXJyZW50SW52ZXJzZSB8fCBpbnZlcnNlKSkpIHtcbiAgICAgICAgICAvLyBBIHJlY3RhbmdsZSBuZWVkcyB0byBiZSBkcmF3biBpZiBnb2luZyBmcm9tIG5vbi1kZWZhdWx0IHRvIGFub3RoZXIgY29sb3JcbiAgICAgICAgICBpZiAoY3VycmVudEJnICE9PSAwIHx8IChjdXJyZW50SW52ZXJzZSAmJiBjdXJyZW50RmcgIT09IDApKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSByZWN0YW5nbGVDb3VudCsrICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmVjdGFuZ2xlKHZlcnRpY2VzLCBvZmZzZXQsIGN1cnJlbnRGZywgY3VycmVudEJnLCBjdXJyZW50U3RhcnRYLCB4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFN0YXJ0WCA9IHg7XG4gICAgICAgICAgY3VycmVudEJnID0gYmc7XG4gICAgICAgICAgY3VycmVudEZnID0gZmc7XG4gICAgICAgICAgY3VycmVudEludmVyc2UgPSBpbnZlcnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGaW5pc2ggcmVjdGFuZ2xlIGlmIGl0J3Mgc3RpbGwgZ29pbmdcbiAgICAgIGlmIChjdXJyZW50QmcgIT09IDAgfHwgKGN1cnJlbnRJbnZlcnNlICYmIGN1cnJlbnRGZyAhPT0gMCkpIHtcbiAgICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUmVjdGFuZ2xlKHZlcnRpY2VzLCBvZmZzZXQsIGN1cnJlbnRGZywgY3VycmVudEJnLCBjdXJyZW50U3RhcnRYLCB0ZXJtaW5hbC5jb2xzLCB5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmVydGljZXMuY291bnQgPSByZWN0YW5nbGVDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDdXJzb3IobW9kZWw6IElSZW5kZXJNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IHZlcnRpY2VzID0gdGhpcy5fdmVydGljZXNDdXJzb3I7XG4gICAgY29uc3QgY3Vyc29yID0gbW9kZWwuY3Vyc29yO1xuICAgIGlmICghY3Vyc29yIHx8IGN1cnNvci5zdHlsZSA9PT0gJ2Jsb2NrJykge1xuICAgICAgdmVydGljZXMuY291bnQgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQ6IG51bWJlcjtcbiAgICBsZXQgcmVjdGFuZ2xlQ291bnQgPSAwO1xuXG4gICAgaWYgKGN1cnNvci5zdHlsZSA9PT0gJ2JhcicgfHwgY3Vyc29yLnN0eWxlID09PSAnb3V0bGluZScpIHtcbiAgICAgIC8vIExlZnQgZWRnZVxuICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgIHRoaXMuX2FkZFJlY3RhbmdsZUZsb2F0KFxuICAgICAgICB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGN1cnNvci54ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCxcbiAgICAgICAgY3Vyc29yLnkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCxcbiAgICAgICAgY3Vyc29yLnN0eWxlID09PSAnYmFyJyA/IGN1cnNvci5kcHIgKiBjdXJzb3IuY3Vyc29yV2lkdGggOiBjdXJzb3IuZHByLFxuICAgICAgICB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCxcbiAgICAgICAgdGhpcy5fY3Vyc29yRmxvYXRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJzb3Iuc3R5bGUgPT09ICd1bmRlcmxpbmUnIHx8IGN1cnNvci5zdHlsZSA9PT0gJ291dGxpbmUnKSB7XG4gICAgICAvLyBCb3R0b20gZWRnZVxuICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgIHRoaXMuX2FkZFJlY3RhbmdsZUZsb2F0KFxuICAgICAgICB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGN1cnNvci54ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCxcbiAgICAgICAgKGN1cnNvci55ICsgMSkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCAtIGN1cnNvci5kcHIsXG4gICAgICAgIGN1cnNvci53aWR0aCAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICAgIGN1cnNvci5kcHIsXG4gICAgICAgIHRoaXMuX2N1cnNvckZsb2F0XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3Vyc29yLnN0eWxlID09PSAnb3V0bGluZScpIHtcbiAgICAgIC8vIFRvcCBlZGdlXG4gICAgICBvZmZzZXQgPSByZWN0YW5nbGVDb3VudCsrICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuICAgICAgdGhpcy5fYWRkUmVjdGFuZ2xlRmxvYXQoXG4gICAgICAgIHZlcnRpY2VzLmF0dHJpYnV0ZXMsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgY3Vyc29yLnggKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLFxuICAgICAgICBjdXJzb3IueSAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgICBjdXJzb3Iud2lkdGggKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLFxuICAgICAgICBjdXJzb3IuZHByLFxuICAgICAgICB0aGlzLl9jdXJzb3JGbG9hdFxuICAgICAgKTtcbiAgICAgIC8vIFJpZ2h0IGVkZ2VcbiAgICAgIG9mZnNldCA9IHJlY3RhbmdsZUNvdW50KysgKiBJTkRJQ0VTX1BFUl9SRUNUQU5HTEU7XG4gICAgICB0aGlzLl9hZGRSZWN0YW5nbGVGbG9hdChcbiAgICAgICAgdmVydGljZXMuYXR0cmlidXRlcyxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICAoY3Vyc29yLnggKyBjdXJzb3Iud2lkdGgpICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCAtIGN1cnNvci5kcHIsXG4gICAgICAgIGN1cnNvci55ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQsXG4gICAgICAgIGN1cnNvci5kcHIsXG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgICB0aGlzLl9jdXJzb3JGbG9hdFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2ZXJ0aWNlcy5jb3VudCA9IHJlY3RhbmdsZUNvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUmVjdGFuZ2xlKHZlcnRpY2VzOiBWZXJ0aWNlcywgb2Zmc2V0OiBudW1iZXIsIGZnOiBudW1iZXIsIGJnOiBudW1iZXIsIHN0YXJ0WDogbnVtYmVyLCBlbmRYOiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChmZyAmIEZnRmxhZ3MuSU5WRVJTRSkge1xuICAgICAgc3dpdGNoIChmZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAkcmdiYSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVtmZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0tdLnJnYmE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgJHJnYmEgPSAoZmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSA8PCA4O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAkcmdiYSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICRyZ2JhID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW2JnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICAkcmdiYSA9IChiZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICRyZ2JhID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLnJnYmE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZlcnRpY2VzLmF0dHJpYnV0ZXMubGVuZ3RoIDwgb2Zmc2V0ICsgNCkge1xuICAgICAgdmVydGljZXMuYXR0cmlidXRlcyA9IGV4cGFuZEZsb2F0MzJBcnJheSh2ZXJ0aWNlcy5hdHRyaWJ1dGVzLCB0aGlzLl90ZXJtaW5hbC5yb3dzICogdGhpcy5fdGVybWluYWwuY29scyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRSk7XG4gICAgfVxuICAgICR4MSA9IHN0YXJ0WCAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGg7XG4gICAgJHkxID0geSAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0O1xuICAgICRyID0gKCgkcmdiYSA+PiAyNCkgJiAweEZGKSAvIDI1NTtcbiAgICAkZyA9ICgoJHJnYmEgPj4gMTYpICYgMHhGRikgLyAyNTU7XG4gICAgJGIgPSAoKCRyZ2JhID4+IDggKSAmIDB4RkYpIC8gMjU1O1xuICAgICRhID0gMTtcblxuICAgIHRoaXMuX2FkZFJlY3RhbmdsZSh2ZXJ0aWNlcy5hdHRyaWJ1dGVzLCBvZmZzZXQsICR4MSwgJHkxLCAoZW5kWCAtIHN0YXJ0WCkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLCB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCwgJHIsICRnLCAkYiwgJGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkUmVjdGFuZ2xlKGFycmF5OiBGbG9hdDMyQXJyYXksIG9mZnNldDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyKTogdm9pZCB7XG4gICAgYXJyYXlbb2Zmc2V0ICAgIF0gPSB4MSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aDtcbiAgICBhcnJheVtvZmZzZXQgKyAxXSA9IHkxIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICBhcnJheVtvZmZzZXQgKyAyXSA9IHdpZHRoIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIGFycmF5W29mZnNldCArIDNdID0gaGVpZ2h0IC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICBhcnJheVtvZmZzZXQgKyA0XSA9IHI7XG4gICAgYXJyYXlbb2Zmc2V0ICsgNV0gPSBnO1xuICAgIGFycmF5W29mZnNldCArIDZdID0gYjtcbiAgICBhcnJheVtvZmZzZXQgKyA3XSA9IGE7XG4gIH1cblxuICBwcml2YXRlIF9hZGRSZWN0YW5nbGVGbG9hdChhcnJheTogRmxvYXQzMkFycmF5LCBvZmZzZXQ6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNvbG9yOiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgICBhcnJheVtvZmZzZXQgICAgXSA9IHgxIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIGFycmF5W29mZnNldCArIDFdID0geTEgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgIGFycmF5W29mZnNldCArIDJdID0gd2lkdGggLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgYXJyYXlbb2Zmc2V0ICsgM10gPSBoZWlnaHQgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgIGFycmF5W29mZnNldCArIDRdID0gY29sb3JbMF07XG4gICAgYXJyYXlbb2Zmc2V0ICsgNV0gPSBjb2xvclsxXTtcbiAgICBhcnJheVtvZmZzZXQgKyA2XSA9IGNvbG9yWzJdO1xuICAgIGFycmF5W29mZnNldCArIDddID0gY29sb3JbM107XG4gIH1cblxuICBwcml2YXRlIF9jb2xvclRvRmxvYXQzMkFycmF5KGNvbG9yOiBJQ29sb3IpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICgoY29sb3IucmdiYSA+PiAyNCkgJiAweEZGKSAvIDI1NSxcbiAgICAgICgoY29sb3IucmdiYSA+PiAxNikgJiAweEZGKSAvIDI1NSxcbiAgICAgICgoY29sb3IucmdiYSA+PiA4ICkgJiAweEZGKSAvIDI1NSxcbiAgICAgICgoY29sb3IucmdiYSAgICAgICkgJiAweEZGKSAvIDI1NVxuICAgIF0pO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IGFjcXVpcmVUZXh0dXJlQXRsYXMgfSBmcm9tICcuLi9DaGFyQXRsYXNDYWNoZSc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2xpZmVjeWNsZSc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IElSZW5kZXJMYXllciB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5pbXBvcnQgeyBURVhUX0JBU0VMSU5FIH0gZnJvbSAnLi4vQ29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgSVRleHR1cmVBdGxhcyB9IGZyb20gJy4uL1R5cGVzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VSZW5kZXJMYXllciBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJUmVuZGVyTGF5ZXIge1xuICBwcml2YXRlIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcm90ZWN0ZWQgX2N0eCE6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2hhcldpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDaGFySGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDZWxsV2lkdGg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2RldmljZUNlbGxIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2RldmljZUNoYXJMZWZ0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDaGFyVG9wOiBudW1iZXIgPSAwO1xuXG4gIHByb3RlY3RlZCBfY2hhckF0bGFzOiBJVGV4dHVyZUF0bGFzIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHRlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIF9jb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfYWxwaGE6IGJvb2xlYW4sXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY2FudmFzID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB0aGlzLl9jYW52YXMuY2xhc3NMaXN0LmFkZChgeHRlcm0tJHtpZH0tbGF5ZXJgKTtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUuekluZGV4ID0gekluZGV4LnRvU3RyaW5nKCk7XG4gICAgdGhpcy5faW5pdENhbnZhcygpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMpO1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMuX3RoZW1lU2VydmljZS5vbkNoYW5nZUNvbG9ycyhlID0+IHtcbiAgICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXModGVybWluYWwsIGUpO1xuICAgICAgdGhpcy5yZXNldCh0ZXJtaW5hbCk7XG4gICAgfSkpO1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jYW52YXMucmVtb3ZlKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdENhbnZhcygpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHggPSB0aHJvd0lmRmFsc3kodGhpcy5fY2FudmFzLmdldENvbnRleHQoJzJkJywgeyBhbHBoYTogdGhpcy5fYWxwaGEgfSkpO1xuICAgIC8vIERyYXcgdGhlIGJhY2tncm91bmQgaWYgdGhpcyBpcyBhbiBvcGFxdWUgbGF5ZXJcbiAgICBpZiAoIXRoaXMuX2FscGhhKSB7XG4gICAgICB0aGlzLl9jbGVhckFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge31cbiAgcHVibGljIGhhbmRsZUZvY3VzKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge31cbiAgcHVibGljIGhhbmRsZUN1cnNvck1vdmUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7fVxuICBwdWJsaWMgaGFuZGxlR3JpZENoYW5nZWQodGVybWluYWw6IFRlcm1pbmFsLCBzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQge31cbiAgcHVibGljIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQodGVybWluYWw6IFRlcm1pbmFsLCBzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIF9zZXRUcmFuc3BhcmVuY3kodGVybWluYWw6IFRlcm1pbmFsLCBhbHBoYTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIERvIG5vdGhpbmcgd2hlbiBhbHBoYSBkb2Vzbid0IGNoYW5nZVxuICAgIGlmIChhbHBoYSA9PT0gdGhpcy5fYWxwaGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbmV3IGNhbnZhcyBhbmQgcmVwbGFjZSBvbGQgb25lXG4gICAgY29uc3Qgb2xkQ2FudmFzID0gdGhpcy5fY2FudmFzO1xuICAgIHRoaXMuX2FscGhhID0gYWxwaGE7XG4gICAgLy8gQ2xvbmluZyBwcmVzZXJ2ZXMgcHJvcGVydGllc1xuICAgIHRoaXMuX2NhbnZhcyA9IHRoaXMuX2NhbnZhcy5jbG9uZU5vZGUoKSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICB0aGlzLl9pbml0Q2FudmFzKCk7XG4gICAgdGhpcy5fY29udGFpbmVyLnJlcGxhY2VDaGlsZCh0aGlzLl9jYW52YXMsIG9sZENhbnZhcyk7XG5cbiAgICAvLyBSZWdlbmVyYXRlIGNoYXIgYXRsYXMgYW5kIGZvcmNlIGEgZnVsbCByZWRyYXdcbiAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKHRlcm1pbmFsLCB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgICB0aGlzLmhhbmRsZUdyaWRDaGFuZ2VkKHRlcm1pbmFsLCAwLCB0ZXJtaW5hbC5yb3dzIC0gMSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaGVzIHRoZSBjaGFyIGF0bGFzLCBhcXVpcmluZyBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcGFyYW0gdGVybWluYWwgVGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gY29sb3JTZXQgVGhlIGNvbG9yIHNldCB0byB1c2UgZm9yIHRoZSBjaGFyIGF0bGFzLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVmcmVzaENoYXJBdGxhcyh0ZXJtaW5hbDogVGVybWluYWwsIGNvbG9yU2V0OiBSZWFkb25seUNvbG9yU2V0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RldmljZUNoYXJXaWR0aCA8PSAwICYmIHRoaXMuX2RldmljZUNoYXJIZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NoYXJBdGxhcyA9IGFjcXVpcmVUZXh0dXJlQXRsYXModGVybWluYWwsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMsIGNvbG9yU2V0LCB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsIHRoaXMuX2RldmljZUNoYXJXaWR0aCwgdGhpcy5fZGV2aWNlQ2hhckhlaWdodCwgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwciwgMjA0OCk7XG4gICAgdGhpcy5fY2hhckF0bGFzLndhcm1VcCgpO1xuICB9XG5cbiAgcHVibGljIHJlc2l6ZSh0ZXJtaW5hbDogVGVybWluYWwsIGRpbTogSVJlbmRlckRpbWVuc2lvbnMpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXZpY2VDZWxsV2lkdGggPSBkaW0uZGV2aWNlLmNlbGwud2lkdGg7XG4gICAgdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCA9IGRpbS5kZXZpY2UuY2VsbC5oZWlnaHQ7XG4gICAgdGhpcy5fZGV2aWNlQ2hhcldpZHRoID0gZGltLmRldmljZS5jaGFyLndpZHRoO1xuICAgIHRoaXMuX2RldmljZUNoYXJIZWlnaHQgPSBkaW0uZGV2aWNlLmNoYXIuaGVpZ2h0O1xuICAgIHRoaXMuX2RldmljZUNoYXJMZWZ0ID0gZGltLmRldmljZS5jaGFyLmxlZnQ7XG4gICAgdGhpcy5fZGV2aWNlQ2hhclRvcCA9IGRpbS5kZXZpY2UuY2hhci50b3A7XG4gICAgdGhpcy5fY2FudmFzLndpZHRoID0gZGltLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IGRpbS5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBgJHtkaW0uY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2RpbS5jc3MuY2FudmFzLmhlaWdodH1weGA7XG5cbiAgICAvLyBEcmF3IHRoZSBiYWNrZ3JvdW5kIGlmIHRoaXMgaXMgYW4gb3BhcXVlIGxheWVyXG4gICAgaWYgKCF0aGlzLl9hbHBoYSkge1xuICAgICAgdGhpcy5fY2xlYXJBbGwoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKHRlcm1pbmFsLCB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZXNldCh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBGaWxscyBhIDFweCBsaW5lICgycHggb24gSERQSSkgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY2VsbC4gVGhpcyB1c2VzIHRoZVxuICAgKiBleGlzdGluZyBmaWxsU3R5bGUgb24gdGhlIGNvbnRleHQuXG4gICAqIEBwYXJhbSB4IFRoZSBjb2x1bW4gdG8gZmlsbC5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyB0byBmaWxsLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9maWxsQm90dG9tTGluZUF0Q2VsbHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LmZpbGxSZWN0KFxuICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICh5ICsgMSkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0IC0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwciAtIDEgLyogRW5zdXJlIGl0J3MgZHJhd24gd2l0aGluIHRoZSBjZWxsICovLFxuICAgICAgd2lkdGggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGVudGlyZSBjYW52YXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2NsZWFyQWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hbHBoYSkge1xuICAgICAgdGhpcy5fY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLl9jYW52YXMud2lkdGgsIHRoaXMuX2NhbnZhcy5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLmNzcztcbiAgICAgIHRoaXMuX2N0eC5maWxsUmVjdCgwLCAwLCB0aGlzLl9jYW52YXMud2lkdGgsIHRoaXMuX2NhbnZhcy5oZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgMSsgY2VsbHMgY29tcGxldGVseS5cbiAgICogQHBhcmFtIHggVGhlIGNvbHVtbiB0byBzdGFydCBhdC5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyB0byBzdGFydCBhdC5cbiAgICogQHBhcmFtIHdpZHRoIFRoZSBudW1iZXIgb2YgY29sdW1ucyB0byBjbGVhci5cbiAgICogQHBhcmFtIGhlaWdodCBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gY2xlYXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2NsZWFyQ2VsbHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FscGhhKSB7XG4gICAgICB0aGlzLl9jdHguY2xlYXJSZWN0KFxuICAgICAgICB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCxcbiAgICAgICAgd2lkdGggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICAgIGhlaWdodCAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLmNzcztcbiAgICAgIHRoaXMuX2N0eC5maWxsUmVjdChcbiAgICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICAgeSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsXG4gICAgICAgIHdpZHRoICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgICBoZWlnaHQgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYSB0cnVlY29sb3IgY2hhcmFjdGVyIGF0IHRoZSBjZWxsLiBUaGUgY2hhcmFjdGVyIHdpbGwgYmUgY2xpcHBlZCB0b1xuICAgKiBlbnN1cmUgdGhhdCBpdCBmaXRzIHdpdGggdGhlIGNlbGwsIGluY2x1ZGluZyB0aGUgY2VsbCB0byB0aGUgcmlnaHQgaWYgaXQnc1xuICAgKiBhIHdpZGUgY2hhcmFjdGVyLiBUaGlzIHVzZXMgdGhlIGV4aXN0aW5nIGZpbGxTdHlsZSBvbiB0aGUgY29udGV4dC5cbiAgICogQHBhcmFtIHRlcm1pbmFsIFRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgZGF0YSBmb3IgdGhlIGNoYXJhY3RlciB0byBkcmF3LlxuICAgKiBAcGFyYW0geCBUaGUgY29sdW1uIHRvIGRyYXcgYXQuXG4gICAqIEBwYXJhbSB5IFRoZSByb3cgdG8gZHJhdyBhdC5cbiAgICovXG4gIHByb3RlY3RlZCBfZmlsbENoYXJUcnVlQ29sb3IodGVybWluYWw6IFRlcm1pbmFsLCBjZWxsOiBDZWxsRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHguZm9udCA9IHRoaXMuX2dldEZvbnQodGVybWluYWwsIGZhbHNlLCBmYWxzZSk7XG4gICAgdGhpcy5fY3R4LnRleHRCYXNlbGluZSA9IFRFWFRfQkFTRUxJTkU7XG4gICAgdGhpcy5fY2xpcENlbGwoeCwgeSwgY2VsbC5nZXRXaWR0aCgpKTtcbiAgICB0aGlzLl9jdHguZmlsbFRleHQoXG4gICAgICBjZWxsLmdldENoYXJzKCksXG4gICAgICB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoICsgdGhpcy5fZGV2aWNlQ2hhckxlZnQsXG4gICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCArIHRoaXMuX2RldmljZUNoYXJUb3AgKyB0aGlzLl9kZXZpY2VDaGFySGVpZ2h0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlwcyBhIGNlbGwgdG8gZW5zdXJlIG5vIHBpeGVscyB3aWxsIGJlIGRyYXduIG91dHNpZGUgb2YgaXQuXG4gICAqIEBwYXJhbSB4IFRoZSBjb2x1bW4gdG8gY2xpcC5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyB0byBjbGlwLlxuICAgKiBAcGFyYW0gd2lkdGggVGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGNsaXAuXG4gICAqL1xuICBwcml2YXRlIF9jbGlwQ2VsbCh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2N0eC5iZWdpblBhdGgoKTtcbiAgICB0aGlzLl9jdHgucmVjdChcbiAgICAgIHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCxcbiAgICAgIHdpZHRoICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCk7XG4gICAgdGhpcy5fY3R4LmNsaXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGZvbnQuXG4gICAqIEBwYXJhbSB0ZXJtaW5hbCBUaGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBpc0JvbGQgSWYgd2Ugc2hvdWxkIHVzZSB0aGUgYm9sZCBmb250V2VpZ2h0LlxuICAgKi9cbiAgcHJvdGVjdGVkIF9nZXRGb250KHRlcm1pbmFsOiBUZXJtaW5hbCwgaXNCb2xkOiBib29sZWFuLCBpc0l0YWxpYzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9udFdlaWdodCA9IGlzQm9sZCA/IHRlcm1pbmFsLm9wdGlvbnMuZm9udFdlaWdodEJvbGQgOiB0ZXJtaW5hbC5vcHRpb25zLmZvbnRXZWlnaHQ7XG4gICAgY29uc3QgZm9udFN0eWxlID0gaXNJdGFsaWMgPyAnaXRhbGljJyA6ICcnO1xuXG4gICAgcmV0dXJuIGAke2ZvbnRTdHlsZX0gJHtmb250V2VpZ2h0fSAke3Rlcm1pbmFsLm9wdGlvbnMuZm9udFNpemUhICogdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcn1weCAke3Rlcm1pbmFsLm9wdGlvbnMuZm9udEZhbWlseX1gO1xuICB9XG59XG5cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgaXMyNTZDb2xvciB9IGZyb20gJy4uL0NoYXJBdGxhc1V0aWxzJztcbmltcG9ydCB7IElOVkVSVEVEX0RFRkFVTFRfQ09MT1IgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9Db25zdGFudHMnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJTGlua2lmaWVyMiwgSUxpbmtpZmllckV2ZW50IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgQmFzZVJlbmRlckxheWVyIH0gZnJvbSAnLi9CYXNlUmVuZGVyTGF5ZXInO1xuXG5leHBvcnQgY2xhc3MgTGlua1JlbmRlckxheWVyIGV4dGVuZHMgQmFzZVJlbmRlckxheWVyIHtcbiAgcHJpdmF0ZSBfc3RhdGU6IElMaW5raWZpZXJFdmVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIHpJbmRleDogbnVtYmVyLFxuICAgIHRlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBsaW5raWZpZXIyOiBJTGlua2lmaWVyMixcbiAgICBjb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICB0aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIodGVybWluYWwsIGNvbnRhaW5lciwgJ2xpbmsnLCB6SW5kZXgsIHRydWUsIGNvcmVCcm93c2VyU2VydmljZSwgb3B0aW9uc1NlcnZpY2UsIHRoZW1lU2VydmljZSk7XG5cbiAgICB0aGlzLl9yZWdpc3RlcihsaW5raWZpZXIyLm9uU2hvd0xpbmtVbmRlcmxpbmUoZSA9PiB0aGlzLl9oYW5kbGVTaG93TGlua1VuZGVybGluZShlKSkpO1xuICAgIHRoaXMuX3JlZ2lzdGVyKGxpbmtpZmllcjIub25IaWRlTGlua1VuZGVybGluZShlID0+IHRoaXMuX2hhbmRsZUhpZGVMaW5rVW5kZXJsaW5lKGUpKSk7XG4gIH1cblxuICBwdWJsaWMgcmVzaXplKHRlcm1pbmFsOiBUZXJtaW5hbCwgZGltOiBJUmVuZGVyRGltZW5zaW9ucyk6IHZvaWQge1xuICAgIHN1cGVyLnJlc2l6ZSh0ZXJtaW5hbCwgZGltKTtcbiAgICAvLyBSZXNpemluZyB0aGUgY2FudmFzIGRpc2NhcmRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2FudmFzIHNvIGNsZWFyIHN0YXRlXG4gICAgdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJDdXJyZW50TGluaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJDdXJyZW50TGluaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIHRoaXMuX2NsZWFyQ2VsbHModGhpcy5fc3RhdGUueDEsIHRoaXMuX3N0YXRlLnkxLCB0aGlzLl9zdGF0ZS5jb2xzIC0gdGhpcy5fc3RhdGUueDEsIDEpO1xuICAgICAgY29uc3QgbWlkZGxlUm93Q291bnQgPSB0aGlzLl9zdGF0ZS55MiAtIHRoaXMuX3N0YXRlLnkxIC0gMTtcbiAgICAgIGlmIChtaWRkbGVSb3dDb3VudCA+IDApIHtcbiAgICAgICAgdGhpcy5fY2xlYXJDZWxscygwLCB0aGlzLl9zdGF0ZS55MSArIDEsIHRoaXMuX3N0YXRlLmNvbHMsIG1pZGRsZVJvd0NvdW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NsZWFyQ2VsbHMoMCwgdGhpcy5fc3RhdGUueTIsIHRoaXMuX3N0YXRlLngyLCAxKTtcbiAgICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVNob3dMaW5rVW5kZXJsaW5lKGU6IElMaW5raWZpZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmZnID09PSBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SKSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLmNzcztcbiAgICB9IGVsc2UgaWYgKGUuZmcgIT09IHVuZGVmaW5lZCAmJiBpczI1NkNvbG9yKGUuZmcpKSB7XG4gICAgICAvLyAyNTYgY29sb3Igc3VwcG9ydFxuICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVtlLmZnIV0uY3NzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5mb3JlZ3JvdW5kLmNzcztcbiAgICB9XG5cbiAgICBpZiAoZS55MSA9PT0gZS55Mikge1xuICAgICAgLy8gU2luZ2xlIGxpbmUgbGlua1xuICAgICAgdGhpcy5fZmlsbEJvdHRvbUxpbmVBdENlbGxzKGUueDEsIGUueTEsIGUueDIgLSBlLngxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTXVsdGktbGluZSBsaW5rXG4gICAgICB0aGlzLl9maWxsQm90dG9tTGluZUF0Q2VsbHMoZS54MSwgZS55MSwgZS5jb2xzIC0gZS54MSk7XG4gICAgICBmb3IgKGxldCB5ID0gZS55MSArIDE7IHkgPCBlLnkyOyB5KyspIHtcbiAgICAgICAgdGhpcy5fZmlsbEJvdHRvbUxpbmVBdENlbGxzKDAsIHksIGUuY29scyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9maWxsQm90dG9tTGluZUF0Q2VsbHMoMCwgZS55MiwgZS54Mik7XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlID0gZTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUhpZGVMaW5rVW5kZXJsaW5lKGU6IElMaW5raWZpZXJFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyQ3VycmVudExpbmsoKTtcbiAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCB0eXBlIENvZGVXaW5kb3cgPSBXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcblx0cmVhZG9ubHkgdnNjb2RlV2luZG93SWQ6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb2RlV2luZG93KHRhcmdldFdpbmRvdzogV2luZG93LCBmYWxsYmFja1dpbmRvd0lkOiBudW1iZXIpOiBhc3NlcnRzIHRhcmdldFdpbmRvdyBpcyBDb2RlV2luZG93IHtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuZXhwb3J0IGNvbnN0IG1haW5XaW5kb3cgPSAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgPyB3aW5kb3cgOiBnbG9iYWxUaGlzKSBhcyBDb2RlV2luZG93O1xuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IENvZGVXaW5kb3csIG1haW5XaW5kb3cgfSBmcm9tICd2cy9iYXNlL2Jyb3dzZXIvd2luZG93JztcbmltcG9ydCB7IEVtaXR0ZXIgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9ldmVudCc7XG5cbmNsYXNzIFdpbmRvd01hbmFnZXIge1xuXG5cdHN0YXRpYyByZWFkb25seSBJTlNUQU5DRSA9IG5ldyBXaW5kb3dNYW5hZ2VyKCk7XG5cblx0Ly8gLS0tIFpvb20gTGV2ZWxcblxuXHRwcml2YXRlIHJlYWRvbmx5IG1hcFdpbmRvd0lkVG9ab29tTGV2ZWwgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX29uRGlkQ2hhbmdlWm9vbUxldmVsID0gbmV3IEVtaXR0ZXI8bnVtYmVyPigpO1xuXHRyZWFkb25seSBvbkRpZENoYW5nZVpvb21MZXZlbCA9IHRoaXMuX29uRGlkQ2hhbmdlWm9vbUxldmVsLmV2ZW50O1xuXG5cdGdldFpvb21MZXZlbCh0YXJnZXRXaW5kb3c6IFdpbmRvdyk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubWFwV2luZG93SWRUb1pvb21MZXZlbC5nZXQodGhpcy5nZXRXaW5kb3dJZCh0YXJnZXRXaW5kb3cpKSA/PyAwO1xuXHR9XG5cdHNldFpvb21MZXZlbCh6b29tTGV2ZWw6IG51bWJlciwgdGFyZ2V0V2luZG93OiBXaW5kb3cpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5nZXRab29tTGV2ZWwodGFyZ2V0V2luZG93KSA9PT0gem9vbUxldmVsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGFyZ2V0V2luZG93SWQgPSB0aGlzLmdldFdpbmRvd0lkKHRhcmdldFdpbmRvdyk7XG5cdFx0dGhpcy5tYXBXaW5kb3dJZFRvWm9vbUxldmVsLnNldCh0YXJnZXRXaW5kb3dJZCwgem9vbUxldmVsKTtcblx0XHR0aGlzLl9vbkRpZENoYW5nZVpvb21MZXZlbC5maXJlKHRhcmdldFdpbmRvd0lkKTtcblx0fVxuXG5cdC8vIC0tLSBab29tIEZhY3RvclxuXG5cdHByaXZhdGUgcmVhZG9ubHkgbWFwV2luZG93SWRUb1pvb21GYWN0b3IgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG5cdGdldFpvb21GYWN0b3IodGFyZ2V0V2luZG93OiBXaW5kb3cpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm1hcFdpbmRvd0lkVG9ab29tRmFjdG9yLmdldCh0aGlzLmdldFdpbmRvd0lkKHRhcmdldFdpbmRvdykpID8/IDE7XG5cdH1cblx0c2V0Wm9vbUZhY3Rvcih6b29tRmFjdG9yOiBudW1iZXIsIHRhcmdldFdpbmRvdzogV2luZG93KTogdm9pZCB7XG5cdFx0dGhpcy5tYXBXaW5kb3dJZFRvWm9vbUZhY3Rvci5zZXQodGhpcy5nZXRXaW5kb3dJZCh0YXJnZXRXaW5kb3cpLCB6b29tRmFjdG9yKTtcblx0fVxuXG5cdC8vIC0tLSBGdWxsc2NyZWVuXG5cblx0cHJpdmF0ZSByZWFkb25seSBfb25EaWRDaGFuZ2VGdWxsc2NyZWVuID0gbmV3IEVtaXR0ZXI8bnVtYmVyPigpO1xuXHRyZWFkb25seSBvbkRpZENoYW5nZUZ1bGxzY3JlZW4gPSB0aGlzLl9vbkRpZENoYW5nZUZ1bGxzY3JlZW4uZXZlbnQ7XG5cblx0cHJpdmF0ZSByZWFkb25seSBtYXBXaW5kb3dJZFRvRnVsbFNjcmVlbiA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuXG5cdHNldEZ1bGxzY3JlZW4oZnVsbHNjcmVlbjogYm9vbGVhbiwgdGFyZ2V0V2luZG93OiBXaW5kb3cpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pc0Z1bGxzY3JlZW4odGFyZ2V0V2luZG93KSA9PT0gZnVsbHNjcmVlbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHdpbmRvd0lkID0gdGhpcy5nZXRXaW5kb3dJZCh0YXJnZXRXaW5kb3cpO1xuXHRcdHRoaXMubWFwV2luZG93SWRUb0Z1bGxTY3JlZW4uc2V0KHdpbmRvd0lkLCBmdWxsc2NyZWVuKTtcblx0XHR0aGlzLl9vbkRpZENoYW5nZUZ1bGxzY3JlZW4uZmlyZSh3aW5kb3dJZCk7XG5cdH1cblx0aXNGdWxsc2NyZWVuKHRhcmdldFdpbmRvdzogV2luZG93KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5tYXBXaW5kb3dJZFRvRnVsbFNjcmVlbi5nZXQodGhpcy5nZXRXaW5kb3dJZCh0YXJnZXRXaW5kb3cpKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0V2luZG93SWQodGFyZ2V0V2luZG93OiBXaW5kb3cpOiBudW1iZXIge1xuXHRcdHJldHVybiAodGFyZ2V0V2luZG93IGFzIENvZGVXaW5kb3cpLnZzY29kZVdpbmRvd0lkO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRNYXRjaE1lZGlhQ2hhbmdlTGlzdGVuZXIodGFyZ2V0V2luZG93OiBXaW5kb3csIHF1ZXJ5OiBzdHJpbmcgfCBNZWRpYVF1ZXJ5TGlzdCwgY2FsbGJhY2s6ICh0aGlzOiBNZWRpYVF1ZXJ5TGlzdCwgZXY6IE1lZGlhUXVlcnlMaXN0RXZlbnQpID0+IGFueSk6IHZvaWQge1xuXHRpZiAodHlwZW9mIHF1ZXJ5ID09PSAnc3RyaW5nJykge1xuXHRcdHF1ZXJ5ID0gdGFyZ2V0V2luZG93Lm1hdGNoTWVkaWEocXVlcnkpO1xuXHR9XG5cdHF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNhbGxiYWNrKTtcbn1cblxuLyoqIEEgem9vbSBpbmRleCwgZS5nLiAxLCAyLCAzICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Wm9vbUxldmVsKHpvb21MZXZlbDogbnVtYmVyLCB0YXJnZXRXaW5kb3c6IFdpbmRvdyk6IHZvaWQge1xuXHRXaW5kb3dNYW5hZ2VyLklOU1RBTkNFLnNldFpvb21MZXZlbCh6b29tTGV2ZWwsIHRhcmdldFdpbmRvdyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Wm9vbUxldmVsKHRhcmdldFdpbmRvdzogV2luZG93KTogbnVtYmVyIHtcblx0cmV0dXJuIFdpbmRvd01hbmFnZXIuSU5TVEFOQ0UuZ2V0Wm9vbUxldmVsKHRhcmdldFdpbmRvdyk7XG59XG5leHBvcnQgY29uc3Qgb25EaWRDaGFuZ2Vab29tTGV2ZWwgPSBXaW5kb3dNYW5hZ2VyLklOU1RBTkNFLm9uRGlkQ2hhbmdlWm9vbUxldmVsO1xuXG4vKiogVGhlIHpvb20gc2NhbGUgZm9yIGFuIGluZGV4LCBlLmcuIDEsIDEuMiwgMS40ICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Wm9vbUZhY3Rvcih0YXJnZXRXaW5kb3c6IFdpbmRvdyk6IG51bWJlciB7XG5cdHJldHVybiBXaW5kb3dNYW5hZ2VyLklOU1RBTkNFLmdldFpvb21GYWN0b3IodGFyZ2V0V2luZG93KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRab29tRmFjdG9yKHpvb21GYWN0b3I6IG51bWJlciwgdGFyZ2V0V2luZG93OiBXaW5kb3cpOiB2b2lkIHtcblx0V2luZG93TWFuYWdlci5JTlNUQU5DRS5zZXRab29tRmFjdG9yKHpvb21GYWN0b3IsIHRhcmdldFdpbmRvdyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRGdWxsc2NyZWVuKGZ1bGxzY3JlZW46IGJvb2xlYW4sIHRhcmdldFdpbmRvdzogV2luZG93KTogdm9pZCB7XG5cdFdpbmRvd01hbmFnZXIuSU5TVEFOQ0Uuc2V0RnVsbHNjcmVlbihmdWxsc2NyZWVuLCB0YXJnZXRXaW5kb3cpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVsbHNjcmVlbih0YXJnZXRXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gV2luZG93TWFuYWdlci5JTlNUQU5DRS5pc0Z1bGxzY3JlZW4odGFyZ2V0V2luZG93KTtcbn1cbmV4cG9ydCBjb25zdCBvbkRpZENoYW5nZUZ1bGxzY3JlZW4gPSBXaW5kb3dNYW5hZ2VyLklOU1RBTkNFLm9uRGlkQ2hhbmdlRnVsbHNjcmVlbjtcblxuY29uc3QgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogJyc7XG5cbmV4cG9ydCBjb25zdCBpc0ZpcmVmb3ggPSAodXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+PSAwKTtcbmV4cG9ydCBjb25zdCBpc1dlYktpdCA9ICh1c2VyQWdlbnQuaW5kZXhPZignQXBwbGVXZWJLaXQnKSA+PSAwKTtcbmV4cG9ydCBjb25zdCBpc0Nocm9tZSA9ICh1c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPj0gMCk7XG5leHBvcnQgY29uc3QgaXNTYWZhcmkgPSAoIWlzQ2hyb21lICYmICh1c2VyQWdlbnQuaW5kZXhPZignU2FmYXJpJykgPj0gMCkpO1xuZXhwb3J0IGNvbnN0IGlzV2Via2l0V2ViVmlldyA9ICghaXNDaHJvbWUgJiYgIWlzU2FmYXJpICYmIGlzV2ViS2l0KTtcbmV4cG9ydCBjb25zdCBpc0VsZWN0cm9uID0gKHVzZXJBZ2VudC5pbmRleE9mKCdFbGVjdHJvbi8nKSA+PSAwKTtcbmV4cG9ydCBjb25zdCBpc0FuZHJvaWQgPSAodXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+PSAwKTtcblxubGV0IHN0YW5kYWxvbmUgPSBmYWxzZTtcbmlmICh0eXBlb2YgbWFpbldpbmRvdy5tYXRjaE1lZGlhID09PSAnZnVuY3Rpb24nKSB7XG5cdGNvbnN0IHN0YW5kYWxvbmVNYXRjaE1lZGlhID0gbWFpbldpbmRvdy5tYXRjaE1lZGlhKCcoZGlzcGxheS1tb2RlOiBzdGFuZGFsb25lKSBvciAoZGlzcGxheS1tb2RlOiB3aW5kb3ctY29udHJvbHMtb3ZlcmxheSknKTtcblx0Y29uc3QgZnVsbFNjcmVlbk1hdGNoTWVkaWEgPSBtYWluV2luZG93Lm1hdGNoTWVkaWEoJyhkaXNwbGF5LW1vZGU6IGZ1bGxzY3JlZW4pJyk7XG5cdHN0YW5kYWxvbmUgPSBzdGFuZGFsb25lTWF0Y2hNZWRpYS5tYXRjaGVzO1xuXHRhZGRNYXRjaE1lZGlhQ2hhbmdlTGlzdGVuZXIobWFpbldpbmRvdywgc3RhbmRhbG9uZU1hdGNoTWVkaWEsICh7IG1hdGNoZXMgfSkgPT4ge1xuXHRcdC8vIGVudGVyaW5nIGZ1bGxzY3JlZW4gd291bGQgY2hhbmdlIHN0YW5kYWxvbmVNYXRjaE1lZGlhLm1hdGNoZXMgdG8gZmFsc2Vcblx0XHQvLyBpZiBzdGFuZGFsb25lIGlzIHRydWUgKHJ1bm5pbmcgYXMgUFdBKSBhbmQgZW50ZXJpbmcgZnVsbHNjcmVlbiwgc2tpcCB0aGlzIGNoYW5nZVxuXHRcdGlmIChzdGFuZGFsb25lICYmIGZ1bGxTY3JlZW5NYXRjaE1lZGlhLm1hdGNoZXMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gb3RoZXJ3aXNlIHVwZGF0ZSBzdGFuZGFsb25lIChicm93c2VyIHRvIFBXQSBvciBQV0EgdG8gYnJvd3Nlcilcblx0XHRzdGFuZGFsb25lID0gbWF0Y2hlcztcblx0fSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdGFuZGFsb25lKCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gc3RhbmRhbG9uZTtcbn1cblxuLy8gVmlzaWJsZSBtZWFucyB0aGF0IHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQsIG5vdCBuZWNlc3NhcmlseSBiZWluZyByZW5kZXJlZFxuLy8gZS5nLiB2aXNpYmxlIGlzIHRydWUgZXZlbiBpbiBmdWxsc2NyZWVuIG1vZGUgd2hlcmUgdGhlIGNvbnRyb2xzIGFyZSBoaWRkZW5cbi8vIFNlZSBkb2NzIGF0IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3dDb250cm9sc092ZXJsYXkvdmlzaWJsZVxuZXhwb3J0IGZ1bmN0aW9uIGlzV0NPRW5hYmxlZCgpOiBib29sZWFuIHtcblx0cmV0dXJuIChuYXZpZ2F0b3IgYXMgYW55KT8ud2luZG93Q29udHJvbHNPdmVybGF5Py52aXNpYmxlO1xufVxuXG4vLyBSZXR1cm5zIHRoZSBib3VuZGluZyByZWN0IG9mIHRoZSB0aXRsZWJhciBhcmVhIGlmIGl0IGlzIHN1cHBvcnRlZCBhbmQgZGVmaW5lZFxuLy8gU2VlIGRvY3MgYXQgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd0NvbnRyb2xzT3ZlcmxheS9nZXRUaXRsZWJhckFyZWFSZWN0XG5leHBvcnQgZnVuY3Rpb24gZ2V0V0NPQm91bmRpbmdSZWN0KCk6IERPTVJlY3QgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gKG5hdmlnYXRvciBhcyBhbnkpPy53aW5kb3dDb250cm9sc092ZXJsYXk/LmdldFRpdGxlYmFyQXJlYVJlY3QoKTtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgKiBhcyBubHMgZnJvbSAndnMvbmxzJztcblxuZXhwb3J0IGNvbnN0IExBTkdVQUdFX0RFRkFVTFQgPSAnZW4nO1xuXG5sZXQgX2lzV2luZG93cyA9IGZhbHNlO1xubGV0IF9pc01hY2ludG9zaCA9IGZhbHNlO1xubGV0IF9pc0xpbnV4ID0gZmFsc2U7XG5sZXQgX2lzTGludXhTbmFwID0gZmFsc2U7XG5sZXQgX2lzTmF0aXZlID0gZmFsc2U7XG5sZXQgX2lzV2ViID0gZmFsc2U7XG5sZXQgX2lzRWxlY3Ryb24gPSBmYWxzZTtcbmxldCBfaXNJT1MgPSBmYWxzZTtcbmxldCBfaXNDSSA9IGZhbHNlO1xubGV0IF9pc01vYmlsZSA9IGZhbHNlO1xubGV0IF9sb2NhbGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmxldCBfbGFuZ3VhZ2U6IHN0cmluZyA9IExBTkdVQUdFX0RFRkFVTFQ7XG5sZXQgX3BsYXRmb3JtTG9jYWxlOiBzdHJpbmcgPSBMQU5HVUFHRV9ERUZBVUxUO1xubGV0IF90cmFuc2xhdGlvbnNDb25maWdGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5sZXQgX3VzZXJBZ2VudDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9jZXNzRW52aXJvbm1lbnQge1xuXHRba2V5OiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW50aW9uYWxseSBub3QgaWRlbnRpY2FsIHRvIG5vZGUuanNcbiAqIHByb2Nlc3MgYmVjYXVzZSBpdCBhbHNvIHdvcmtzIGluIHNhbmRib3hlZCBlbnZpcm9ubWVudHNcbiAqIHdoZXJlIHRoZSBwcm9jZXNzIG9iamVjdCBpcyBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseS4gV2VcbiAqIGRlZmluZSB0aGUgcHJvcGVydGllcyBoZXJlIHRoYXQgd2UgbmVlZCBmb3IgYHBsYXRmb3JtYFxuICogdG8gd29yayBhbmQgbm90aGluZyBlbHNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlUHJvY2VzcyB7XG5cdHBsYXRmb3JtOiBzdHJpbmc7XG5cdGFyY2g6IHN0cmluZztcblx0ZW52OiBJUHJvY2Vzc0Vudmlyb25tZW50O1xuXHR2ZXJzaW9ucz86IHtcblx0XHRub2RlPzogc3RyaW5nO1xuXHRcdGVsZWN0cm9uPzogc3RyaW5nO1xuXHRcdGNocm9tZT86IHN0cmluZztcblx0fTtcblx0dHlwZT86IHN0cmluZztcblx0Y3dkOiAoKSA9PiBzdHJpbmc7XG59XG5cbmRlY2xhcmUgY29uc3QgcHJvY2VzczogSU5vZGVQcm9jZXNzO1xuXG5jb25zdCAkZ2xvYmFsVGhpczogYW55ID0gZ2xvYmFsVGhpcztcblxubGV0IG5vZGVQcm9jZXNzOiBJTm9kZVByb2Nlc3MgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5pZiAodHlwZW9mICRnbG9iYWxUaGlzLnZzY29kZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mICRnbG9iYWxUaGlzLnZzY29kZS5wcm9jZXNzICE9PSAndW5kZWZpbmVkJykge1xuXHQvLyBOYXRpdmUgZW52aXJvbm1lbnQgKHNhbmRib3hlZClcblx0bm9kZVByb2Nlc3MgPSAkZ2xvYmFsVGhpcy52c2NvZGUucHJvY2Vzcztcbn0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzPy52ZXJzaW9ucz8ubm9kZSA9PT0gJ3N0cmluZycpIHtcblx0Ly8gTmF0aXZlIGVudmlyb25tZW50IChub24tc2FuZGJveGVkKVxuXHRub2RlUHJvY2VzcyA9IHByb2Nlc3M7XG59XG5cbmNvbnN0IGlzRWxlY3Ryb25Qcm9jZXNzID0gdHlwZW9mIG5vZGVQcm9jZXNzPy52ZXJzaW9ucz8uZWxlY3Ryb24gPT09ICdzdHJpbmcnO1xuY29uc3QgaXNFbGVjdHJvblJlbmRlcmVyID0gaXNFbGVjdHJvblByb2Nlc3MgJiYgbm9kZVByb2Nlc3M/LnR5cGUgPT09ICdyZW5kZXJlcic7XG5cbmludGVyZmFjZSBJTmF2aWdhdG9yIHtcblx0dXNlckFnZW50OiBzdHJpbmc7XG5cdG1heFRvdWNoUG9pbnRzPzogbnVtYmVyO1xuXHRsYW5ndWFnZTogc3RyaW5nO1xufVxuZGVjbGFyZSBjb25zdCBuYXZpZ2F0b3I6IElOYXZpZ2F0b3I7XG5cbi8vIE5hdGl2ZSBlbnZpcm9ubWVudFxuaWYgKHR5cGVvZiBub2RlUHJvY2VzcyA9PT0gJ29iamVjdCcpIHtcblx0X2lzV2luZG93cyA9IChub2RlUHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyk7XG5cdF9pc01hY2ludG9zaCA9IChub2RlUHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpO1xuXHRfaXNMaW51eCA9IChub2RlUHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4Jyk7XG5cdF9pc0xpbnV4U25hcCA9IF9pc0xpbnV4ICYmICEhbm9kZVByb2Nlc3MuZW52WydTTkFQJ10gJiYgISFub2RlUHJvY2Vzcy5lbnZbJ1NOQVBfUkVWSVNJT04nXTtcblx0X2lzRWxlY3Ryb24gPSBpc0VsZWN0cm9uUHJvY2Vzcztcblx0X2lzQ0kgPSAhIW5vZGVQcm9jZXNzLmVudlsnQ0knXSB8fCAhIW5vZGVQcm9jZXNzLmVudlsnQlVJTERfQVJUSUZBQ1RTVEFHSU5HRElSRUNUT1JZJ107XG5cdF9sb2NhbGUgPSBMQU5HVUFHRV9ERUZBVUxUO1xuXHRfbGFuZ3VhZ2UgPSBMQU5HVUFHRV9ERUZBVUxUO1xuXHRjb25zdCByYXdObHNDb25maWcgPSBub2RlUHJvY2Vzcy5lbnZbJ1ZTQ09ERV9OTFNfQ09ORklHJ107XG5cdGlmIChyYXdObHNDb25maWcpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbmxzQ29uZmlnOiBubHMuSU5MU0NvbmZpZ3VyYXRpb24gPSBKU09OLnBhcnNlKHJhd05sc0NvbmZpZyk7XG5cdFx0XHRfbG9jYWxlID0gbmxzQ29uZmlnLnVzZXJMb2NhbGU7XG5cdFx0XHRfcGxhdGZvcm1Mb2NhbGUgPSBubHNDb25maWcub3NMb2NhbGU7XG5cdFx0XHRfbGFuZ3VhZ2UgPSBubHNDb25maWcucmVzb2x2ZWRMYW5ndWFnZSB8fCBMQU5HVUFHRV9ERUZBVUxUO1xuXHRcdFx0X3RyYW5zbGF0aW9uc0NvbmZpZ0ZpbGUgPSBubHNDb25maWcubGFuZ3VhZ2VQYWNrPy50cmFuc2xhdGlvbnNDb25maWdGaWxlO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHR9XG5cdH1cblx0X2lzTmF0aXZlID0gdHJ1ZTtcbn1cblxuLy8gV2ViIGVudmlyb25tZW50XG5lbHNlIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiAhaXNFbGVjdHJvblJlbmRlcmVyKSB7XG5cdF91c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuXHRfaXNXaW5kb3dzID0gX3VzZXJBZ2VudC5pbmRleE9mKCdXaW5kb3dzJykgPj0gMDtcblx0X2lzTWFjaW50b3NoID0gX3VzZXJBZ2VudC5pbmRleE9mKCdNYWNpbnRvc2gnKSA+PSAwO1xuXHRfaXNJT1MgPSAoX3VzZXJBZ2VudC5pbmRleE9mKCdNYWNpbnRvc2gnKSA+PSAwIHx8IF91c2VyQWdlbnQuaW5kZXhPZignaVBhZCcpID49IDAgfHwgX3VzZXJBZ2VudC5pbmRleE9mKCdpUGhvbmUnKSA+PSAwKSAmJiAhIW5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwO1xuXHRfaXNMaW51eCA9IF91c2VyQWdlbnQuaW5kZXhPZignTGludXgnKSA+PSAwO1xuXHRfaXNNb2JpbGUgPSBfdXNlckFnZW50Py5pbmRleE9mKCdNb2JpJykgPj0gMDtcblx0X2lzV2ViID0gdHJ1ZTtcblx0Ly8gVlNDT0RFX0dMT0JBTFM6IE5MU1xuXHRfbGFuZ3VhZ2UgPSBnbG9iYWxUaGlzLl9WU0NPREVfTkxTX0xBTkdVQUdFIHx8IExBTkdVQUdFX0RFRkFVTFQ7XG5cdF9sb2NhbGUgPSBuYXZpZ2F0b3IubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKTtcblx0X3BsYXRmb3JtTG9jYWxlID0gX2xvY2FsZTtcbn1cblxuLy8gVW5rbm93biBlbnZpcm9ubWVudFxuZWxzZSB7XG5cdGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIHBsYXRmb3JtLicpO1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBQbGF0Zm9ybSB7XG5cdFdlYixcblx0TWFjLFxuXHRMaW51eCxcblx0V2luZG93c1xufVxuZXhwb3J0IHR5cGUgUGxhdGZvcm1OYW1lID0gJ1dlYicgfCAnV2luZG93cycgfCAnTWFjJyB8ICdMaW51eCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBQbGF0Zm9ybVRvU3RyaW5nKHBsYXRmb3JtOiBQbGF0Zm9ybSk6IFBsYXRmb3JtTmFtZSB7XG5cdHN3aXRjaCAocGxhdGZvcm0pIHtcblx0XHRjYXNlIFBsYXRmb3JtLldlYjogcmV0dXJuICdXZWInO1xuXHRcdGNhc2UgUGxhdGZvcm0uTWFjOiByZXR1cm4gJ01hYyc7XG5cdFx0Y2FzZSBQbGF0Zm9ybS5MaW51eDogcmV0dXJuICdMaW51eCc7XG5cdFx0Y2FzZSBQbGF0Zm9ybS5XaW5kb3dzOiByZXR1cm4gJ1dpbmRvd3MnO1xuXHR9XG59XG5cbmxldCBfcGxhdGZvcm06IFBsYXRmb3JtID0gUGxhdGZvcm0uV2ViO1xuaWYgKF9pc01hY2ludG9zaCkge1xuXHRfcGxhdGZvcm0gPSBQbGF0Zm9ybS5NYWM7XG59IGVsc2UgaWYgKF9pc1dpbmRvd3MpIHtcblx0X3BsYXRmb3JtID0gUGxhdGZvcm0uV2luZG93cztcbn0gZWxzZSBpZiAoX2lzTGludXgpIHtcblx0X3BsYXRmb3JtID0gUGxhdGZvcm0uTGludXg7XG59XG5cbmV4cG9ydCBjb25zdCBpc1dpbmRvd3MgPSBfaXNXaW5kb3dzO1xuZXhwb3J0IGNvbnN0IGlzTWFjaW50b3NoID0gX2lzTWFjaW50b3NoO1xuZXhwb3J0IGNvbnN0IGlzTGludXggPSBfaXNMaW51eDtcbmV4cG9ydCBjb25zdCBpc0xpbnV4U25hcCA9IF9pc0xpbnV4U25hcDtcbmV4cG9ydCBjb25zdCBpc05hdGl2ZSA9IF9pc05hdGl2ZTtcbmV4cG9ydCBjb25zdCBpc0VsZWN0cm9uID0gX2lzRWxlY3Ryb247XG5leHBvcnQgY29uc3QgaXNXZWIgPSBfaXNXZWI7XG5leHBvcnQgY29uc3QgaXNXZWJXb3JrZXIgPSAoX2lzV2ViICYmIHR5cGVvZiAkZ2xvYmFsVGhpcy5pbXBvcnRTY3JpcHRzID09PSAnZnVuY3Rpb24nKTtcbmV4cG9ydCBjb25zdCB3ZWJXb3JrZXJPcmlnaW4gPSBpc1dlYldvcmtlciA/ICRnbG9iYWxUaGlzLm9yaWdpbiA6IHVuZGVmaW5lZDtcbmV4cG9ydCBjb25zdCBpc0lPUyA9IF9pc0lPUztcbmV4cG9ydCBjb25zdCBpc01vYmlsZSA9IF9pc01vYmlsZTtcbi8qKlxuICogV2hldGhlciB3ZSBydW4gaW5zaWRlIGEgQ0kgZW52aXJvbm1lbnQsIHN1Y2ggYXNcbiAqIEdIIGFjdGlvbnMgb3IgQXp1cmUgUGlwZWxpbmVzLlxuICovXG5leHBvcnQgY29uc3QgaXNDSSA9IF9pc0NJO1xuZXhwb3J0IGNvbnN0IHBsYXRmb3JtID0gX3BsYXRmb3JtO1xuZXhwb3J0IGNvbnN0IHVzZXJBZ2VudCA9IF91c2VyQWdlbnQ7XG5cbi8qKlxuICogVGhlIGxhbmd1YWdlIHVzZWQgZm9yIHRoZSB1c2VyIGludGVyZmFjZS4gVGhlIGZvcm1hdCBvZlxuICogdGhlIHN0cmluZyBpcyBhbGwgbG93ZXIgY2FzZSAoZS5nLiB6aC10dyBmb3IgVHJhZGl0aW9uYWxcbiAqIENoaW5lc2Ugb3IgZGUgZm9yIEdlcm1hbilcbiAqL1xuZXhwb3J0IGNvbnN0IGxhbmd1YWdlID0gX2xhbmd1YWdlO1xuXG5leHBvcnQgbmFtZXNwYWNlIExhbmd1YWdlIHtcblxuXHRleHBvcnQgZnVuY3Rpb24gdmFsdWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gbGFuZ3VhZ2U7XG5cdH1cblxuXHRleHBvcnQgZnVuY3Rpb24gaXNEZWZhdWx0VmFyaWFudCgpOiBib29sZWFuIHtcblx0XHRpZiAobGFuZ3VhZ2UubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRyZXR1cm4gbGFuZ3VhZ2UgPT09ICdlbic7XG5cdFx0fSBlbHNlIGlmIChsYW5ndWFnZS5sZW5ndGggPj0gMykge1xuXHRcdFx0cmV0dXJuIGxhbmd1YWdlWzBdID09PSAnZScgJiYgbGFuZ3VhZ2VbMV0gPT09ICduJyAmJiBsYW5ndWFnZVsyXSA9PT0gJy0nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0ZXhwb3J0IGZ1bmN0aW9uIGlzRGVmYXVsdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gbGFuZ3VhZ2UgPT09ICdlbic7XG5cdH1cbn1cblxuLyoqXG4gKiBEZXNrdG9wOiBUaGUgT1MgbG9jYWxlIG9yIHRoZSBsb2NhbGUgc3BlY2lmaWVkIGJ5IC0tbG9jYWxlIG9yIGBhcmd2Lmpzb25gLlxuICogV2ViOiBtYXRjaGVzIGBwbGF0Zm9ybUxvY2FsZWAuXG4gKlxuICogVGhlIFVJIGlzIG5vdCBuZWNlc3NhcmlseSBzaG93biBpbiB0aGUgcHJvdmlkZWQgbG9jYWxlLlxuICovXG5leHBvcnQgY29uc3QgbG9jYWxlID0gX2xvY2FsZTtcblxuLyoqXG4gKiBUaGlzIHdpbGwgYWx3YXlzIGJlIHNldCB0byB0aGUgT1MvYnJvd3NlcidzIGxvY2FsZSByZWdhcmRsZXNzIG9mXG4gKiB3aGF0IHdhcyBzcGVjaWZpZWQgb3RoZXJ3aXNlLiBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYWxsXG4gKiBsb3dlciBjYXNlIChlLmcuIHpoLXR3IGZvciBUcmFkaXRpb25hbCBDaGluZXNlKS4gVGhlIFVJIGlzIG5vdFxuICogbmVjZXNzYXJpbHkgc2hvd24gaW4gdGhlIHByb3ZpZGVkIGxvY2FsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHBsYXRmb3JtTG9jYWxlID0gX3BsYXRmb3JtTG9jYWxlO1xuXG4vKipcbiAqIFRoZSB0cmFuc2xhdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIHRocm91Z2ggbGFuZ3VhZ2UgcGFja3MuXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2xhdGlvbnNDb25maWdGaWxlID0gX3RyYW5zbGF0aW9uc0NvbmZpZ0ZpbGU7XG5cbmV4cG9ydCBjb25zdCBzZXRUaW1lb3V0MElzRmFzdGVyID0gKHR5cGVvZiAkZ2xvYmFsVGhpcy5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhJGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cyk7XG5cbi8qKlxuICogU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjOn46dGV4dD10aGFuJTIwNCUyQyUyMHRoZW4tLHNldCUyMHRpbWVvdXQlMjB0byUyMDQsLS5cbiAqXG4gKiBXb3JrcyBzaW1pbGFybHkgdG8gYHNldFRpbWVvdXQoMClgIGJ1dCBkb2Vzbid0IHN1ZmZlciBmcm9tIHRoZSA0bXMgYXJ0aWZpY2lhbCBkZWxheVxuICogdGhhdCBicm93c2VycyBzZXQgd2hlbiB0aGUgbmVzdGluZyBsZXZlbCBpcyA+IDUuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRUaW1lb3V0MCA9ICgoKSA9PiB7XG5cdGlmIChzZXRUaW1lb3V0MElzRmFzdGVyKSB7XG5cdFx0aW50ZXJmYWNlIElRdWV1ZUVsZW1lbnQge1xuXHRcdFx0aWQ6IG51bWJlcjtcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXHRcdH1cblx0XHRjb25zdCBwZW5kaW5nOiBJUXVldWVFbGVtZW50W10gPSBbXTtcblxuXHRcdCRnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZTogYW55KSA9PiB7XG5cdFx0XHRpZiAoZS5kYXRhICYmIGUuZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaykge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMCwgbGVuID0gcGVuZGluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IGNhbmRpZGF0ZSA9IHBlbmRpbmdbaV07XG5cdFx0XHRcdFx0aWYgKGNhbmRpZGF0ZS5pZCA9PT0gZS5kYXRhLnZzY29kZVNjaGVkdWxlQXN5bmNXb3JrKSB7XG5cdFx0XHRcdFx0XHRwZW5kaW5nLnNwbGljZShpLCAxKTtcblx0XHRcdFx0XHRcdGNhbmRpZGF0ZS5jYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGxldCBsYXN0SWQgPSAwO1xuXHRcdHJldHVybiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHtcblx0XHRcdGNvbnN0IG15SWQgPSArK2xhc3RJZDtcblx0XHRcdHBlbmRpbmcucHVzaCh7XG5cdFx0XHRcdGlkOiBteUlkLFxuXHRcdFx0XHRjYWxsYmFjazogY2FsbGJhY2tcblx0XHRcdH0pO1xuXHRcdFx0JGdsb2JhbFRoaXMucG9zdE1lc3NhZ2UoeyB2c2NvZGVTY2hlZHVsZUFzeW5jV29yazogbXlJZCB9LCAnKicpO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIChjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4gc2V0VGltZW91dChjYWxsYmFjayk7XG59KSgpO1xuXG5leHBvcnQgY29uc3QgZW51bSBPcGVyYXRpbmdTeXN0ZW0ge1xuXHRXaW5kb3dzID0gMSxcblx0TWFjaW50b3NoID0gMixcblx0TGludXggPSAzXG59XG5leHBvcnQgY29uc3QgT1MgPSAoX2lzTWFjaW50b3NoIHx8IF9pc0lPUyA/IE9wZXJhdGluZ1N5c3RlbS5NYWNpbnRvc2ggOiAoX2lzV2luZG93cyA/IE9wZXJhdGluZ1N5c3RlbS5XaW5kb3dzIDogT3BlcmF0aW5nU3lzdGVtLkxpbnV4KSk7XG5cbmxldCBfaXNMaXR0bGVFbmRpYW4gPSB0cnVlO1xubGV0IF9pc0xpdHRsZUVuZGlhbkNvbXB1dGVkID0gZmFsc2U7XG5leHBvcnQgZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKTogYm9vbGVhbiB7XG5cdGlmICghX2lzTGl0dGxlRW5kaWFuQ29tcHV0ZWQpIHtcblx0XHRfaXNMaXR0bGVFbmRpYW5Db21wdXRlZCA9IHRydWU7XG5cdFx0Y29uc3QgdGVzdCA9IG5ldyBVaW50OEFycmF5KDIpO1xuXHRcdHRlc3RbMF0gPSAxO1xuXHRcdHRlc3RbMV0gPSAyO1xuXHRcdGNvbnN0IHZpZXcgPSBuZXcgVWludDE2QXJyYXkodGVzdC5idWZmZXIpO1xuXHRcdF9pc0xpdHRsZUVuZGlhbiA9ICh2aWV3WzBdID09PSAoMiA8PCA4KSArIDEpO1xuXHR9XG5cdHJldHVybiBfaXNMaXR0bGVFbmRpYW47XG59XG5cbmV4cG9ydCBjb25zdCBpc0Nocm9tZSA9ICEhKHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPj0gMCk7XG5leHBvcnQgY29uc3QgaXNGaXJlZm94ID0gISEodXNlckFnZW50ICYmIHVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPj0gMCk7XG5leHBvcnQgY29uc3QgaXNTYWZhcmkgPSAhISghaXNDaHJvbWUgJiYgKHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5kZXhPZignU2FmYXJpJykgPj0gMCkpO1xuZXhwb3J0IGNvbnN0IGlzRWRnZSA9ICEhKHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5kZXhPZignRWRnLycpID49IDApO1xuZXhwb3J0IGNvbnN0IGlzQW5kcm9pZCA9ICEhKHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5kZXhPZignQW5kcm9pZCcpID49IDApO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNCaWdTdXJPck5ld2VyKG9zVmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG5cdHJldHVybiBwYXJzZUZsb2F0KG9zVmVyc2lvbikgPj0gMjA7XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0ICogYXMgYnJvd3NlciBmcm9tICd2cy9iYXNlL2Jyb3dzZXIvYnJvd3Nlcic7XG5pbXBvcnQgeyBtYWluV2luZG93IH0gZnJvbSAndnMvYmFzZS9icm93c2VyL3dpbmRvdyc7XG5pbXBvcnQgKiBhcyBwbGF0Zm9ybSBmcm9tICd2cy9iYXNlL2NvbW1vbi9wbGF0Zm9ybSc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIEtleWJvYXJkU3VwcG9ydCB7XG5cdEFsd2F5cyxcblx0RnVsbFNjcmVlbixcblx0Tm9uZVxufVxuXG5jb25zdCBzYWZlTmF2aWdhdG9yID0gdHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgPyBuYXZpZ2F0b3IgOiB7fSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIEJyb3dzZXIgZmVhdHVyZSB3ZSBjYW4gc3VwcG9ydCBpbiBjdXJyZW50IHBsYXRmb3JtLCBicm93c2VyIGFuZCBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IEJyb3dzZXJGZWF0dXJlcyA9IHtcblx0Y2xpcGJvYXJkOiB7XG5cdFx0d3JpdGVUZXh0OiAoXG5cdFx0XHRwbGF0Zm9ybS5pc05hdGl2ZVxuXHRcdFx0fHwgKGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZCAmJiBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQoJ2NvcHknKSlcblx0XHRcdHx8ICEhKHNhZmVOYXZpZ2F0b3IgJiYgc2FmZU5hdmlnYXRvci5jbGlwYm9hcmQgJiYgc2FmZU5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KVxuXHRcdCksXG5cdFx0cmVhZFRleHQ6IChcblx0XHRcdHBsYXRmb3JtLmlzTmF0aXZlXG5cdFx0XHR8fCAhIShzYWZlTmF2aWdhdG9yICYmIHNhZmVOYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHNhZmVOYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KVxuXHRcdClcblx0fSxcblx0a2V5Ym9hcmQ6ICgoKSA9PiB7XG5cdFx0aWYgKHBsYXRmb3JtLmlzTmF0aXZlIHx8IGJyb3dzZXIuaXNTdGFuZGFsb25lKCkpIHtcblx0XHRcdHJldHVybiBLZXlib2FyZFN1cHBvcnQuQWx3YXlzO1xuXHRcdH1cblxuXHRcdGlmICgoPGFueT5zYWZlTmF2aWdhdG9yKS5rZXlib2FyZCB8fCBicm93c2VyLmlzU2FmYXJpKSB7XG5cdFx0XHRyZXR1cm4gS2V5Ym9hcmRTdXBwb3J0LkZ1bGxTY3JlZW47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIEtleWJvYXJkU3VwcG9ydC5Ob25lO1xuXHR9KSgpLFxuXG5cdC8vICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyBhbHdheXMgZXZhbHVhdGVzIHRvIHRydWUgd2l0aCB0eXBlc2NyaXB0J3MgbW9kZXJuIHR5cGluZ3MuIFRoaXMgY2F1c2VzIGB3aW5kb3dgIHRvIGJlXG5cdC8vIGBuZXZlcmAgbGF0ZXIgaW4gYHdpbmRvdy5uYXZpZ2F0b3JgLiBUaGF0J3Mgd2h5IHdlIG5lZWQgdGhlIGV4cGxpY2l0IGB3aW5kb3cgYXMgV2luZG93YCBjYXN0XG5cdHRvdWNoOiAnb250b3VjaHN0YXJ0JyBpbiBtYWluV2luZG93IHx8IHNhZmVOYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwLFxuXHRwb2ludGVyRXZlbnRzOiBtYWluV2luZG93LlBvaW50ZXJFdmVudCAmJiAoJ29udG91Y2hzdGFydCcgaW4gbWFpbldpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwKVxufTtcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKipcbiAqIFZpcnR1YWwgS2V5IENvZGVzLCB0aGUgdmFsdWUgZG9lcyBub3QgaG9sZCBhbnkgaW5oZXJlbnQgbWVhbmluZy5cbiAqIEluc3BpcmVkIHNvbWV3aGF0IGZyb20gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvZGQzNzU3MzEodj12cy44NSkuYXNweFxuICogQnV0IHRoZXNlIGFyZSBcIm1vcmUgZ2VuZXJhbFwiLCBhcyB0aGV5IHNob3VsZCB3b3JrIGFjcm9zcyBicm93c2VycyAmIE9TYHMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEtleUNvZGUge1xuXHREZXBlbmRzT25LYkxheW91dCA9IC0xLFxuXG5cdC8qKlxuXHQgKiBQbGFjZWQgZmlyc3QgdG8gY292ZXIgdGhlIDAgdmFsdWUgb2YgdGhlIGVudW0uXG5cdCAqL1xuXHRVbmtub3duID0gMCxcblxuXHRCYWNrc3BhY2UsXG5cdFRhYixcblx0RW50ZXIsXG5cdFNoaWZ0LFxuXHRDdHJsLFxuXHRBbHQsXG5cdFBhdXNlQnJlYWssXG5cdENhcHNMb2NrLFxuXHRFc2NhcGUsXG5cdFNwYWNlLFxuXHRQYWdlVXAsXG5cdFBhZ2VEb3duLFxuXHRFbmQsXG5cdEhvbWUsXG5cdExlZnRBcnJvdyxcblx0VXBBcnJvdyxcblx0UmlnaHRBcnJvdyxcblx0RG93bkFycm93LFxuXHRJbnNlcnQsXG5cdERlbGV0ZSxcblxuXHREaWdpdDAsXG5cdERpZ2l0MSxcblx0RGlnaXQyLFxuXHREaWdpdDMsXG5cdERpZ2l0NCxcblx0RGlnaXQ1LFxuXHREaWdpdDYsXG5cdERpZ2l0Nyxcblx0RGlnaXQ4LFxuXHREaWdpdDksXG5cblx0S2V5QSxcblx0S2V5Qixcblx0S2V5Qyxcblx0S2V5RCxcblx0S2V5RSxcblx0S2V5Rixcblx0S2V5Ryxcblx0S2V5SCxcblx0S2V5SSxcblx0S2V5Sixcblx0S2V5Syxcblx0S2V5TCxcblx0S2V5TSxcblx0S2V5Tixcblx0S2V5Tyxcblx0S2V5UCxcblx0S2V5USxcblx0S2V5Uixcblx0S2V5Uyxcblx0S2V5VCxcblx0S2V5VSxcblx0S2V5Vixcblx0S2V5Vyxcblx0S2V5WCxcblx0S2V5WSxcblx0S2V5WixcblxuXHRNZXRhLFxuXHRDb250ZXh0TWVudSxcblxuXHRGMSxcblx0RjIsXG5cdEYzLFxuXHRGNCxcblx0RjUsXG5cdEY2LFxuXHRGNyxcblx0RjgsXG5cdEY5LFxuXHRGMTAsXG5cdEYxMSxcblx0RjEyLFxuXHRGMTMsXG5cdEYxNCxcblx0RjE1LFxuXHRGMTYsXG5cdEYxNyxcblx0RjE4LFxuXHRGMTksXG5cdEYyMCxcblx0RjIxLFxuXHRGMjIsXG5cdEYyMyxcblx0RjI0LFxuXG5cdE51bUxvY2ssXG5cdFNjcm9sbExvY2ssXG5cblx0LyoqXG5cdCAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuXG5cdCAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnOzonIGtleVxuXHQgKi9cblx0U2VtaWNvbG9uLFxuXHQvKipcblx0ICogRm9yIGFueSBjb3VudHJ5L3JlZ2lvbiwgdGhlICcrJyBrZXlcblx0ICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICc9Kycga2V5XG5cdCAqL1xuXHRFcXVhbCxcblx0LyoqXG5cdCAqIEZvciBhbnkgY291bnRyeS9yZWdpb24sIHRoZSAnLCcga2V5XG5cdCAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnLDwnIGtleVxuXHQgKi9cblx0Q29tbWEsXG5cdC8qKlxuXHQgKiBGb3IgYW55IGNvdW50cnkvcmVnaW9uLCB0aGUgJy0nIGtleVxuXHQgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJy1fJyBrZXlcblx0ICovXG5cdE1pbnVzLFxuXHQvKipcblx0ICogRm9yIGFueSBjb3VudHJ5L3JlZ2lvbiwgdGhlICcuJyBrZXlcblx0ICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICcuPicga2V5XG5cdCAqL1xuXHRQZXJpb2QsXG5cdC8qKlxuXHQgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLlxuXHQgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJy8/JyBrZXlcblx0ICovXG5cdFNsYXNoLFxuXHQvKipcblx0ICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC5cblx0ICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICdgficga2V5XG5cdCAqL1xuXHRCYWNrcXVvdGUsXG5cdC8qKlxuXHQgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLlxuXHQgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJ1t7JyBrZXlcblx0ICovXG5cdEJyYWNrZXRMZWZ0LFxuXHQvKipcblx0ICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC5cblx0ICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICdcXHwnIGtleVxuXHQgKi9cblx0QmFja3NsYXNoLFxuXHQvKipcblx0ICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC5cblx0ICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICddfScga2V5XG5cdCAqL1xuXHRCcmFja2V0UmlnaHQsXG5cdC8qKlxuXHQgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLlxuXHQgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJydcIicga2V5XG5cdCAqL1xuXHRRdW90ZSxcblx0LyoqXG5cdCAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuXG5cdCAqL1xuXHRPRU1fOCxcblx0LyoqXG5cdCAqIEVpdGhlciB0aGUgYW5nbGUgYnJhY2tldCBrZXkgb3IgdGhlIGJhY2tzbGFzaCBrZXkgb24gdGhlIFJUIDEwMi1rZXkga2V5Ym9hcmQuXG5cdCAqL1xuXHRJbnRsQmFja3NsYXNoLFxuXG5cdE51bXBhZDAsIC8vIFZLX05VTVBBRDAsIDB4NjAsIE51bWVyaWMga2V5cGFkIDAga2V5XG5cdE51bXBhZDEsIC8vIFZLX05VTVBBRDEsIDB4NjEsIE51bWVyaWMga2V5cGFkIDEga2V5XG5cdE51bXBhZDIsIC8vIFZLX05VTVBBRDIsIDB4NjIsIE51bWVyaWMga2V5cGFkIDIga2V5XG5cdE51bXBhZDMsIC8vIFZLX05VTVBBRDMsIDB4NjMsIE51bWVyaWMga2V5cGFkIDMga2V5XG5cdE51bXBhZDQsIC8vIFZLX05VTVBBRDQsIDB4NjQsIE51bWVyaWMga2V5cGFkIDQga2V5XG5cdE51bXBhZDUsIC8vIFZLX05VTVBBRDUsIDB4NjUsIE51bWVyaWMga2V5cGFkIDUga2V5XG5cdE51bXBhZDYsIC8vIFZLX05VTVBBRDYsIDB4NjYsIE51bWVyaWMga2V5cGFkIDYga2V5XG5cdE51bXBhZDcsIC8vIFZLX05VTVBBRDcsIDB4NjcsIE51bWVyaWMga2V5cGFkIDcga2V5XG5cdE51bXBhZDgsIC8vIFZLX05VTVBBRDgsIDB4NjgsIE51bWVyaWMga2V5cGFkIDgga2V5XG5cdE51bXBhZDksIC8vIFZLX05VTVBBRDksIDB4NjksIE51bWVyaWMga2V5cGFkIDkga2V5XG5cblx0TnVtcGFkTXVsdGlwbHksXHQvLyBWS19NVUxUSVBMWSwgMHg2QSwgTXVsdGlwbHkga2V5XG5cdE51bXBhZEFkZCxcdFx0Ly8gVktfQURELCAweDZCLCBBZGQga2V5XG5cdE5VTVBBRF9TRVBBUkFUT1IsXHQvLyBWS19TRVBBUkFUT1IsIDB4NkMsIFNlcGFyYXRvciBrZXlcblx0TnVtcGFkU3VidHJhY3QsXHQvLyBWS19TVUJUUkFDVCwgMHg2RCwgU3VidHJhY3Qga2V5XG5cdE51bXBhZERlY2ltYWwsXHQvLyBWS19ERUNJTUFMLCAweDZFLCBEZWNpbWFsIGtleVxuXHROdW1wYWREaXZpZGUsXHQvLyBWS19ESVZJREUsIDB4NkYsXG5cblx0LyoqXG5cdCAqIENvdmVyIGFsbCBrZXkgY29kZXMgd2hlbiBJTUUgaXMgcHJvY2Vzc2luZyBpbnB1dC5cblx0ICovXG5cdEtFWV9JTl9DT01QT1NJVElPTixcblxuXHRBQk5UX0MxLCAvLyBCcmF6aWxpYW4gKEFCTlQpIEtleWJvYXJkXG5cdEFCTlRfQzIsIC8vIEJyYXppbGlhbiAoQUJOVCkgS2V5Ym9hcmRcblxuXHRBdWRpb1ZvbHVtZU11dGUsXG5cdEF1ZGlvVm9sdW1lVXAsXG5cdEF1ZGlvVm9sdW1lRG93bixcblxuXHRCcm93c2VyU2VhcmNoLFxuXHRCcm93c2VySG9tZSxcblx0QnJvd3NlckJhY2ssXG5cdEJyb3dzZXJGb3J3YXJkLFxuXG5cdE1lZGlhVHJhY2tOZXh0LFxuXHRNZWRpYVRyYWNrUHJldmlvdXMsXG5cdE1lZGlhU3RvcCxcblx0TWVkaWFQbGF5UGF1c2UsXG5cdExhdW5jaE1lZGlhUGxheWVyLFxuXHRMYXVuY2hNYWlsLFxuXHRMYXVuY2hBcHAyLFxuXG5cdC8qKlxuXHQgKiBWS19DTEVBUiwgMHgwQywgQ0xFQVIga2V5XG5cdCAqL1xuXHRDbGVhcixcblxuXHQvKipcblx0ICogUGxhY2VkIGxhc3QgdG8gY292ZXIgdGhlIGxlbmd0aCBvZiB0aGUgZW51bS5cblx0ICogUGxlYXNlIGRvIG5vdCBkZXBlbmQgb24gdGhpcyB2YWx1ZSFcblx0ICovXG5cdE1BWF9WQUxVRVxufVxuXG4vKipcbiAqIGtleWJvYXJkRXZlbnQuY29kZVxuICovXG5leHBvcnQgY29uc3QgZW51bSBTY2FuQ29kZSB7XG5cdERlcGVuZHNPbktiTGF5b3V0ID0gLTEsXG5cdE5vbmUsXG5cdEh5cGVyLFxuXHRTdXBlcixcblx0Rm4sXG5cdEZuTG9jayxcblx0U3VzcGVuZCxcblx0UmVzdW1lLFxuXHRUdXJibyxcblx0U2xlZXAsXG5cdFdha2VVcCxcblx0S2V5QSxcblx0S2V5Qixcblx0S2V5Qyxcblx0S2V5RCxcblx0S2V5RSxcblx0S2V5Rixcblx0S2V5Ryxcblx0S2V5SCxcblx0S2V5SSxcblx0S2V5Sixcblx0S2V5Syxcblx0S2V5TCxcblx0S2V5TSxcblx0S2V5Tixcblx0S2V5Tyxcblx0S2V5UCxcblx0S2V5USxcblx0S2V5Uixcblx0S2V5Uyxcblx0S2V5VCxcblx0S2V5VSxcblx0S2V5Vixcblx0S2V5Vyxcblx0S2V5WCxcblx0S2V5WSxcblx0S2V5Wixcblx0RGlnaXQxLFxuXHREaWdpdDIsXG5cdERpZ2l0Myxcblx0RGlnaXQ0LFxuXHREaWdpdDUsXG5cdERpZ2l0Nixcblx0RGlnaXQ3LFxuXHREaWdpdDgsXG5cdERpZ2l0OSxcblx0RGlnaXQwLFxuXHRFbnRlcixcblx0RXNjYXBlLFxuXHRCYWNrc3BhY2UsXG5cdFRhYixcblx0U3BhY2UsXG5cdE1pbnVzLFxuXHRFcXVhbCxcblx0QnJhY2tldExlZnQsXG5cdEJyYWNrZXRSaWdodCxcblx0QmFja3NsYXNoLFxuXHRJbnRsSGFzaCxcblx0U2VtaWNvbG9uLFxuXHRRdW90ZSxcblx0QmFja3F1b3RlLFxuXHRDb21tYSxcblx0UGVyaW9kLFxuXHRTbGFzaCxcblx0Q2Fwc0xvY2ssXG5cdEYxLFxuXHRGMixcblx0RjMsXG5cdEY0LFxuXHRGNSxcblx0RjYsXG5cdEY3LFxuXHRGOCxcblx0RjksXG5cdEYxMCxcblx0RjExLFxuXHRGMTIsXG5cdFByaW50U2NyZWVuLFxuXHRTY3JvbGxMb2NrLFxuXHRQYXVzZSxcblx0SW5zZXJ0LFxuXHRIb21lLFxuXHRQYWdlVXAsXG5cdERlbGV0ZSxcblx0RW5kLFxuXHRQYWdlRG93bixcblx0QXJyb3dSaWdodCxcblx0QXJyb3dMZWZ0LFxuXHRBcnJvd0Rvd24sXG5cdEFycm93VXAsXG5cdE51bUxvY2ssXG5cdE51bXBhZERpdmlkZSxcblx0TnVtcGFkTXVsdGlwbHksXG5cdE51bXBhZFN1YnRyYWN0LFxuXHROdW1wYWRBZGQsXG5cdE51bXBhZEVudGVyLFxuXHROdW1wYWQxLFxuXHROdW1wYWQyLFxuXHROdW1wYWQzLFxuXHROdW1wYWQ0LFxuXHROdW1wYWQ1LFxuXHROdW1wYWQ2LFxuXHROdW1wYWQ3LFxuXHROdW1wYWQ4LFxuXHROdW1wYWQ5LFxuXHROdW1wYWQwLFxuXHROdW1wYWREZWNpbWFsLFxuXHRJbnRsQmFja3NsYXNoLFxuXHRDb250ZXh0TWVudSxcblx0UG93ZXIsXG5cdE51bXBhZEVxdWFsLFxuXHRGMTMsXG5cdEYxNCxcblx0RjE1LFxuXHRGMTYsXG5cdEYxNyxcblx0RjE4LFxuXHRGMTksXG5cdEYyMCxcblx0RjIxLFxuXHRGMjIsXG5cdEYyMyxcblx0RjI0LFxuXHRPcGVuLFxuXHRIZWxwLFxuXHRTZWxlY3QsXG5cdEFnYWluLFxuXHRVbmRvLFxuXHRDdXQsXG5cdENvcHksXG5cdFBhc3RlLFxuXHRGaW5kLFxuXHRBdWRpb1ZvbHVtZU11dGUsXG5cdEF1ZGlvVm9sdW1lVXAsXG5cdEF1ZGlvVm9sdW1lRG93bixcblx0TnVtcGFkQ29tbWEsXG5cdEludGxSbyxcblx0S2FuYU1vZGUsXG5cdEludGxZZW4sXG5cdENvbnZlcnQsXG5cdE5vbkNvbnZlcnQsXG5cdExhbmcxLFxuXHRMYW5nMixcblx0TGFuZzMsXG5cdExhbmc0LFxuXHRMYW5nNSxcblx0QWJvcnQsXG5cdFByb3BzLFxuXHROdW1wYWRQYXJlbkxlZnQsXG5cdE51bXBhZFBhcmVuUmlnaHQsXG5cdE51bXBhZEJhY2tzcGFjZSxcblx0TnVtcGFkTWVtb3J5U3RvcmUsXG5cdE51bXBhZE1lbW9yeVJlY2FsbCxcblx0TnVtcGFkTWVtb3J5Q2xlYXIsXG5cdE51bXBhZE1lbW9yeUFkZCxcblx0TnVtcGFkTWVtb3J5U3VidHJhY3QsXG5cdE51bXBhZENsZWFyLFxuXHROdW1wYWRDbGVhckVudHJ5LFxuXHRDb250cm9sTGVmdCxcblx0U2hpZnRMZWZ0LFxuXHRBbHRMZWZ0LFxuXHRNZXRhTGVmdCxcblx0Q29udHJvbFJpZ2h0LFxuXHRTaGlmdFJpZ2h0LFxuXHRBbHRSaWdodCxcblx0TWV0YVJpZ2h0LFxuXHRCcmlnaHRuZXNzVXAsXG5cdEJyaWdodG5lc3NEb3duLFxuXHRNZWRpYVBsYXksXG5cdE1lZGlhUmVjb3JkLFxuXHRNZWRpYUZhc3RGb3J3YXJkLFxuXHRNZWRpYVJld2luZCxcblx0TWVkaWFUcmFja05leHQsXG5cdE1lZGlhVHJhY2tQcmV2aW91cyxcblx0TWVkaWFTdG9wLFxuXHRFamVjdCxcblx0TWVkaWFQbGF5UGF1c2UsXG5cdE1lZGlhU2VsZWN0LFxuXHRMYXVuY2hNYWlsLFxuXHRMYXVuY2hBcHAyLFxuXHRMYXVuY2hBcHAxLFxuXHRTZWxlY3RUYXNrLFxuXHRMYXVuY2hTY3JlZW5TYXZlcixcblx0QnJvd3NlclNlYXJjaCxcblx0QnJvd3NlckhvbWUsXG5cdEJyb3dzZXJCYWNrLFxuXHRCcm93c2VyRm9yd2FyZCxcblx0QnJvd3NlclN0b3AsXG5cdEJyb3dzZXJSZWZyZXNoLFxuXHRCcm93c2VyRmF2b3JpdGVzLFxuXHRab29tVG9nZ2xlLFxuXHRNYWlsUmVwbHksXG5cdE1haWxGb3J3YXJkLFxuXHRNYWlsU2VuZCxcblxuXHRNQVhfVkFMVUVcbn1cblxuY2xhc3MgS2V5Q29kZVN0ck1hcCB7XG5cblx0cHVibGljIF9rZXlDb2RlVG9TdHI6IHN0cmluZ1tdO1xuXHRwdWJsaWMgX3N0clRvS2V5Q29kZTogeyBbc3RyOiBzdHJpbmddOiBLZXlDb2RlIH07XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5fa2V5Q29kZVRvU3RyID0gW107XG5cdFx0dGhpcy5fc3RyVG9LZXlDb2RlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0fVxuXG5cdGRlZmluZShrZXlDb2RlOiBLZXlDb2RlLCBzdHI6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMuX2tleUNvZGVUb1N0cltrZXlDb2RlXSA9IHN0cjtcblx0XHR0aGlzLl9zdHJUb0tleUNvZGVbc3RyLnRvTG93ZXJDYXNlKCldID0ga2V5Q29kZTtcblx0fVxuXG5cdGtleUNvZGVUb1N0cihrZXlDb2RlOiBLZXlDb2RlKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5fa2V5Q29kZVRvU3RyW2tleUNvZGVdO1xuXHR9XG5cblx0c3RyVG9LZXlDb2RlKHN0cjogc3RyaW5nKTogS2V5Q29kZSB7XG5cdFx0cmV0dXJuIHRoaXMuX3N0clRvS2V5Q29kZVtzdHIudG9Mb3dlckNhc2UoKV0gfHwgS2V5Q29kZS5Vbmtub3duO1xuXHR9XG59XG5cbmNvbnN0IHVpTWFwID0gbmV3IEtleUNvZGVTdHJNYXAoKTtcbmNvbnN0IHVzZXJTZXR0aW5nc1VTTWFwID0gbmV3IEtleUNvZGVTdHJNYXAoKTtcbmNvbnN0IHVzZXJTZXR0aW5nc0dlbmVyYWxNYXAgPSBuZXcgS2V5Q29kZVN0ck1hcCgpO1xuZXhwb3J0IGNvbnN0IEVWRU5UX0tFWV9DT0RFX01BUDogeyBba2V5Q29kZTogbnVtYmVyXTogS2V5Q29kZSB9ID0gbmV3IEFycmF5KDIzMCk7XG5leHBvcnQgY29uc3QgTkFUSVZFX1dJTkRPV1NfS0VZX0NPREVfVE9fS0VZX0NPREU6IHsgW25hdGl2ZUtleUNvZGU6IHN0cmluZ106IEtleUNvZGUgfSA9IHt9O1xuY29uc3Qgc2NhbkNvZGVJbnRUb1N0cjogc3RyaW5nW10gPSBbXTtcbmNvbnN0IHNjYW5Db2RlU3RyVG9JbnQ6IHsgW2NvZGU6IHN0cmluZ106IG51bWJlciB9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmNvbnN0IHNjYW5Db2RlTG93ZXJDYXNlU3RyVG9JbnQ6IHsgW2NvZGU6IHN0cmluZ106IG51bWJlciB9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuZXhwb3J0IGNvbnN0IFNjYW5Db2RlVXRpbHMgPSB7XG5cdGxvd2VyQ2FzZVRvRW51bTogKHNjYW5Db2RlOiBzdHJpbmcpID0+IHNjYW5Db2RlTG93ZXJDYXNlU3RyVG9JbnRbc2NhbkNvZGVdIHx8IFNjYW5Db2RlLk5vbmUsXG5cdHRvRW51bTogKHNjYW5Db2RlOiBzdHJpbmcpID0+IHNjYW5Db2RlU3RyVG9JbnRbc2NhbkNvZGVdIHx8IFNjYW5Db2RlLk5vbmUsXG5cdHRvU3RyaW5nOiAoc2NhbkNvZGU6IFNjYW5Db2RlKSA9PiBzY2FuQ29kZUludFRvU3RyW3NjYW5Db2RlXSB8fCAnTm9uZSdcbn07XG5cblxuZXhwb3J0IG5hbWVzcGFjZSBLZXlDb2RlVXRpbHMge1xuXHRleHBvcnQgZnVuY3Rpb24gdG9TdHJpbmcoa2V5Q29kZTogS2V5Q29kZSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHVpTWFwLmtleUNvZGVUb1N0cihrZXlDb2RlKTtcblx0fVxuXHRleHBvcnQgZnVuY3Rpb24gZnJvbVN0cmluZyhrZXk6IHN0cmluZyk6IEtleUNvZGUge1xuXHRcdHJldHVybiB1aU1hcC5zdHJUb0tleUNvZGUoa2V5KTtcblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiB0b1VzZXJTZXR0aW5nc1VTKGtleUNvZGU6IEtleUNvZGUpOiBzdHJpbmcge1xuXHRcdHJldHVybiB1c2VyU2V0dGluZ3NVU01hcC5rZXlDb2RlVG9TdHIoa2V5Q29kZSk7XG5cdH1cblx0ZXhwb3J0IGZ1bmN0aW9uIHRvVXNlclNldHRpbmdzR2VuZXJhbChrZXlDb2RlOiBLZXlDb2RlKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdXNlclNldHRpbmdzR2VuZXJhbE1hcC5rZXlDb2RlVG9TdHIoa2V5Q29kZSk7XG5cdH1cblx0ZXhwb3J0IGZ1bmN0aW9uIGZyb21Vc2VyU2V0dGluZ3Moa2V5OiBzdHJpbmcpOiBLZXlDb2RlIHtcblx0XHRyZXR1cm4gdXNlclNldHRpbmdzVVNNYXAuc3RyVG9LZXlDb2RlKGtleSkgfHwgdXNlclNldHRpbmdzR2VuZXJhbE1hcC5zdHJUb0tleUNvZGUoa2V5KTtcblx0fVxuXG5cdGV4cG9ydCBmdW5jdGlvbiB0b0VsZWN0cm9uQWNjZWxlcmF0b3Ioa2V5Q29kZTogS2V5Q29kZSk6IHN0cmluZyB8IG51bGwge1xuXHRcdGlmIChrZXlDb2RlID49IEtleUNvZGUuTnVtcGFkMCAmJiBrZXlDb2RlIDw9IEtleUNvZGUuTnVtcGFkRGl2aWRlKSB7XG5cdFx0XHQvLyBbRWxlY3Ryb24gQWNjZWxlcmF0b3JzXSBFbGVjdHJvbiBpcyBhYmxlIHRvIHBhcnNlIG51bXBhZCBrZXlzLCBidXQgdW5mb3J0dW5hdGVseSBpdFxuXHRcdFx0Ly8gcmVuZGVycyB0aGVtIGp1c3QgYXMgcmVndWxhciBrZXlzIGluIG1lbnVzLiBGb3IgZXhhbXBsZSwgbnVtMCBpcyByZW5kZXJlZCBhcyBcIjBcIixcblx0XHRcdC8vIG51bWRpdiBpcyByZW5kZXJlZCBhcyBcIi9cIiwgbnVtc3ViIGlzIHJlbmRlcmVkIGFzIFwiLVwiLlxuXHRcdFx0Ly9cblx0XHRcdC8vIFRoaXMgY2FuIGxlYWQgdG8gaW5jcmVkaWJsZSBjb25mdXNpb24sIGFzIGl0IG1ha2VzIG51bXBhZCBiYXNlZCBrZXliaW5kaW5ncyBpbmRpc3Rpbmd1aXNoYWJsZVxuXHRcdFx0Ly8gZnJvbSBrZXliaW5kaW5ncyBiYXNlZCBvbiByZWd1bGFyIGtleXMuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gV2UgdGhlcmVmb3JlIG5lZWQgdG8gZmFsbCBiYWNrIHRvIGN1c3RvbSByZW5kZXJpbmcgZm9yIG51bXBhZCBrZXlzLlxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChrZXlDb2RlKSB7XG5cdFx0XHRjYXNlIEtleUNvZGUuVXBBcnJvdzpcblx0XHRcdFx0cmV0dXJuICdVcCc7XG5cdFx0XHRjYXNlIEtleUNvZGUuRG93bkFycm93OlxuXHRcdFx0XHRyZXR1cm4gJ0Rvd24nO1xuXHRcdFx0Y2FzZSBLZXlDb2RlLkxlZnRBcnJvdzpcblx0XHRcdFx0cmV0dXJuICdMZWZ0Jztcblx0XHRcdGNhc2UgS2V5Q29kZS5SaWdodEFycm93OlxuXHRcdFx0XHRyZXR1cm4gJ1JpZ2h0Jztcblx0XHR9XG5cblx0XHRyZXR1cm4gdWlNYXAua2V5Q29kZVRvU3RyKGtleUNvZGUpO1xuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEtleU1vZCB7XG5cdEN0cmxDbWQgPSAoMSA8PCAxMSkgPj4+IDAsXG5cdFNoaWZ0ID0gKDEgPDwgMTApID4+PiAwLFxuXHRBbHQgPSAoMSA8PCA5KSA+Pj4gMCxcblx0V2luQ3RybCA9ICgxIDw8IDgpID4+PiAwLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gS2V5Q2hvcmQoZmlyc3RQYXJ0OiBudW1iZXIsIHNlY29uZFBhcnQ6IG51bWJlcik6IG51bWJlciB7XG5cdGNvbnN0IGNob3JkUGFydCA9ICgoc2Vjb25kUGFydCAmIDB4MDAwMEZGRkYpIDw8IDE2KSA+Pj4gMDtcblx0cmV0dXJuIChmaXJzdFBhcnQgfCBjaG9yZFBhcnQpID4+PiAwO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAndnMvYmFzZS9icm93c2VyL2Jyb3dzZXInO1xuaW1wb3J0IHsgRVZFTlRfS0VZX0NPREVfTUFQLCBLZXlDb2RlLCBLZXlDb2RlVXRpbHMsIEtleU1vZCB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2tleUNvZGVzJztcbmltcG9ydCB7IEtleUNvZGVDaG9yZCB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2tleWJpbmRpbmdzJztcbmltcG9ydCAqIGFzIHBsYXRmb3JtIGZyb20gJ3ZzL2Jhc2UvY29tbW9uL3BsYXRmb3JtJztcblxuXG5cbmZ1bmN0aW9uIGV4dHJhY3RLZXlDb2RlKGU6IEtleWJvYXJkRXZlbnQpOiBLZXlDb2RlIHtcblx0aWYgKGUuY2hhckNvZGUpIHtcblx0XHQvLyBcImtleXByZXNzXCIgZXZlbnRzIG1vc3RseVxuXHRcdGNvbnN0IGNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGUpLnRvVXBwZXJDYXNlKCk7XG5cdFx0cmV0dXJuIEtleUNvZGVVdGlscy5mcm9tU3RyaW5nKGNoYXIpO1xuXHR9XG5cblx0Y29uc3Qga2V5Q29kZSA9IGUua2V5Q29kZTtcblxuXHQvLyBicm93c2VyIHF1aXJrc1xuXHRpZiAoa2V5Q29kZSA9PT0gMykge1xuXHRcdHJldHVybiBLZXlDb2RlLlBhdXNlQnJlYWs7XG5cdH0gZWxzZSBpZiAoYnJvd3Nlci5pc0ZpcmVmb3gpIHtcblx0XHRzd2l0Y2ggKGtleUNvZGUpIHtcblx0XHRcdGNhc2UgNTk6IHJldHVybiBLZXlDb2RlLlNlbWljb2xvbjtcblx0XHRcdGNhc2UgNjA6XG5cdFx0XHRcdGlmIChwbGF0Zm9ybS5pc0xpbnV4KSB7IHJldHVybiBLZXlDb2RlLkludGxCYWNrc2xhc2g7IH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDYxOiByZXR1cm4gS2V5Q29kZS5FcXVhbDtcblx0XHRcdC8vIGJhc2VkIG9uOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXlDb2RlI251bXBhZF9rZXlzXG5cdFx0XHRjYXNlIDEwNzogcmV0dXJuIEtleUNvZGUuTnVtcGFkQWRkO1xuXHRcdFx0Y2FzZSAxMDk6IHJldHVybiBLZXlDb2RlLk51bXBhZFN1YnRyYWN0O1xuXHRcdFx0Y2FzZSAxNzM6IHJldHVybiBLZXlDb2RlLk1pbnVzO1xuXHRcdFx0Y2FzZSAyMjQ6XG5cdFx0XHRcdGlmIChwbGF0Zm9ybS5pc01hY2ludG9zaCkgeyByZXR1cm4gS2V5Q29kZS5NZXRhOyB9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fSBlbHNlIGlmIChicm93c2VyLmlzV2ViS2l0KSB7XG5cdFx0aWYgKHBsYXRmb3JtLmlzTWFjaW50b3NoICYmIGtleUNvZGUgPT09IDkzKSB7XG5cdFx0XHQvLyB0aGUgdHdvIG1ldGEga2V5cyBpbiB0aGUgTWFjIGhhdmUgZGlmZmVyZW50IGtleSBjb2RlcyAoOTEgYW5kIDkzKVxuXHRcdFx0cmV0dXJuIEtleUNvZGUuTWV0YTtcblx0XHR9IGVsc2UgaWYgKCFwbGF0Zm9ybS5pc01hY2ludG9zaCAmJiBrZXlDb2RlID09PSA5Mikge1xuXHRcdFx0cmV0dXJuIEtleUNvZGUuTWV0YTtcblx0XHR9XG5cdH1cblxuXHQvLyBjcm9zcyBicm93c2VyIGtleWNvZGVzOlxuXHRyZXR1cm4gRVZFTlRfS0VZX0NPREVfTUFQW2tleUNvZGVdIHx8IEtleUNvZGUuVW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJS2V5Ym9hcmRFdmVudCB7XG5cblx0cmVhZG9ubHkgX3N0YW5kYXJkS2V5Ym9hcmRFdmVudEJyYW5kOiB0cnVlO1xuXG5cdHJlYWRvbmx5IGJyb3dzZXJFdmVudDogS2V5Ym9hcmRFdmVudDtcblx0cmVhZG9ubHkgdGFyZ2V0OiBIVE1MRWxlbWVudDtcblxuXHRyZWFkb25seSBjdHJsS2V5OiBib29sZWFuO1xuXHRyZWFkb25seSBzaGlmdEtleTogYm9vbGVhbjtcblx0cmVhZG9ubHkgYWx0S2V5OiBib29sZWFuO1xuXHRyZWFkb25seSBtZXRhS2V5OiBib29sZWFuO1xuXHRyZWFkb25seSBhbHRHcmFwaEtleTogYm9vbGVhbjtcblx0cmVhZG9ubHkga2V5Q29kZTogS2V5Q29kZTtcblx0cmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHRvS2V5Q29kZUNob3JkKCk6IEtleUNvZGVDaG9yZDtcblx0ZXF1YWxzKGtleWJpbmRpbmc6IG51bWJlcik6IGJvb2xlYW47XG5cblx0cHJldmVudERlZmF1bHQoKTogdm9pZDtcblx0c3RvcFByb3BhZ2F0aW9uKCk6IHZvaWQ7XG59XG5cbmNvbnN0IGN0cmxLZXlNb2QgPSAocGxhdGZvcm0uaXNNYWNpbnRvc2ggPyBLZXlNb2QuV2luQ3RybCA6IEtleU1vZC5DdHJsQ21kKTtcbmNvbnN0IGFsdEtleU1vZCA9IEtleU1vZC5BbHQ7XG5jb25zdCBzaGlmdEtleU1vZCA9IEtleU1vZC5TaGlmdDtcbmNvbnN0IG1ldGFLZXlNb2QgPSAocGxhdGZvcm0uaXNNYWNpbnRvc2ggPyBLZXlNb2QuQ3RybENtZCA6IEtleU1vZC5XaW5DdHJsKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50S2V5Ym9hcmRFdmVudChlOiBLZXlib2FyZEV2ZW50KTogc3RyaW5nIHtcblx0Y29uc3QgbW9kaWZpZXJzOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAoZS5jdHJsS2V5KSB7XG5cdFx0bW9kaWZpZXJzLnB1c2goYGN0cmxgKTtcblx0fVxuXHRpZiAoZS5zaGlmdEtleSkge1xuXHRcdG1vZGlmaWVycy5wdXNoKGBzaGlmdGApO1xuXHR9XG5cdGlmIChlLmFsdEtleSkge1xuXHRcdG1vZGlmaWVycy5wdXNoKGBhbHRgKTtcblx0fVxuXHRpZiAoZS5tZXRhS2V5KSB7XG5cdFx0bW9kaWZpZXJzLnB1c2goYG1ldGFgKTtcblx0fVxuXHRyZXR1cm4gYG1vZGlmaWVyczogWyR7bW9kaWZpZXJzLmpvaW4oJywnKX1dLCBjb2RlOiAke2UuY29kZX0sIGtleUNvZGU6ICR7ZS5rZXlDb2RlfSwga2V5OiAke2Uua2V5fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YW5kYXJkS2V5Ym9hcmRFdmVudChlOiBTdGFuZGFyZEtleWJvYXJkRXZlbnQpOiBzdHJpbmcge1xuXHRjb25zdCBtb2RpZmllcnM6IHN0cmluZ1tdID0gW107XG5cdGlmIChlLmN0cmxLZXkpIHtcblx0XHRtb2RpZmllcnMucHVzaChgY3RybGApO1xuXHR9XG5cdGlmIChlLnNoaWZ0S2V5KSB7XG5cdFx0bW9kaWZpZXJzLnB1c2goYHNoaWZ0YCk7XG5cdH1cblx0aWYgKGUuYWx0S2V5KSB7XG5cdFx0bW9kaWZpZXJzLnB1c2goYGFsdGApO1xuXHR9XG5cdGlmIChlLm1ldGFLZXkpIHtcblx0XHRtb2RpZmllcnMucHVzaChgbWV0YWApO1xuXHR9XG5cdHJldHVybiBgbW9kaWZpZXJzOiBbJHttb2RpZmllcnMuam9pbignLCcpfV0sIGNvZGU6ICR7ZS5jb2RlfSwga2V5Q29kZTogJHtlLmtleUNvZGV9ICgnJHtLZXlDb2RlVXRpbHMudG9TdHJpbmcoZS5rZXlDb2RlKX0nKWA7XG59XG5cbmV4cG9ydCBjbGFzcyBTdGFuZGFyZEtleWJvYXJkRXZlbnQgaW1wbGVtZW50cyBJS2V5Ym9hcmRFdmVudCB7XG5cblx0cmVhZG9ubHkgX3N0YW5kYXJkS2V5Ym9hcmRFdmVudEJyYW5kID0gdHJ1ZTtcblxuXHRwdWJsaWMgcmVhZG9ubHkgYnJvd3NlckV2ZW50OiBLZXlib2FyZEV2ZW50O1xuXHRwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0OiBIVE1MRWxlbWVudDtcblxuXHRwdWJsaWMgcmVhZG9ubHkgY3RybEtleTogYm9vbGVhbjtcblx0cHVibGljIHJlYWRvbmx5IHNoaWZ0S2V5OiBib29sZWFuO1xuXHRwdWJsaWMgcmVhZG9ubHkgYWx0S2V5OiBib29sZWFuO1xuXHRwdWJsaWMgcmVhZG9ubHkgbWV0YUtleTogYm9vbGVhbjtcblx0cHVibGljIHJlYWRvbmx5IGFsdEdyYXBoS2V5OiBib29sZWFuO1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5Q29kZTogS2V5Q29kZTtcblx0cHVibGljIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcblxuXHRwcml2YXRlIF9hc0tleWJpbmRpbmc6IG51bWJlcjtcblx0cHJpdmF0ZSBfYXNLZXlDb2RlQ2hvcmQ6IEtleUNvZGVDaG9yZDtcblxuXHRjb25zdHJ1Y3Rvcihzb3VyY2U6IEtleWJvYXJkRXZlbnQpIHtcblx0XHRjb25zdCBlID0gc291cmNlO1xuXG5cdFx0dGhpcy5icm93c2VyRXZlbnQgPSBlO1xuXHRcdHRoaXMudGFyZ2V0ID0gPEhUTUxFbGVtZW50PmUudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdHJsS2V5ID0gZS5jdHJsS2V5O1xuXHRcdHRoaXMuc2hpZnRLZXkgPSBlLnNoaWZ0S2V5O1xuXHRcdHRoaXMuYWx0S2V5ID0gZS5hbHRLZXk7XG5cdFx0dGhpcy5tZXRhS2V5ID0gZS5tZXRhS2V5O1xuXHRcdHRoaXMuYWx0R3JhcGhLZXkgPSBlLmdldE1vZGlmaWVyU3RhdGU/LignQWx0R3JhcGgnKTtcblx0XHR0aGlzLmtleUNvZGUgPSBleHRyYWN0S2V5Q29kZShlKTtcblx0XHR0aGlzLmNvZGUgPSBlLmNvZGU7XG5cblx0XHQvLyBjb25zb2xlLmluZm8oZS50eXBlICsgXCI6IGtleUNvZGU6IFwiICsgZS5rZXlDb2RlICsgXCIsIHdoaWNoOiBcIiArIGUud2hpY2ggKyBcIiwgY2hhckNvZGU6IFwiICsgZS5jaGFyQ29kZSArIFwiLCBkZXRhaWw6IFwiICsgZS5kZXRhaWwgKyBcIiA9PT09PiBcIiArIHRoaXMua2V5Q29kZSArICcgLS0gJyArIEtleUNvZGVbdGhpcy5rZXlDb2RlXSk7XG5cblx0XHR0aGlzLmN0cmxLZXkgPSB0aGlzLmN0cmxLZXkgfHwgdGhpcy5rZXlDb2RlID09PSBLZXlDb2RlLkN0cmw7XG5cdFx0dGhpcy5hbHRLZXkgPSB0aGlzLmFsdEtleSB8fCB0aGlzLmtleUNvZGUgPT09IEtleUNvZGUuQWx0O1xuXHRcdHRoaXMuc2hpZnRLZXkgPSB0aGlzLnNoaWZ0S2V5IHx8IHRoaXMua2V5Q29kZSA9PT0gS2V5Q29kZS5TaGlmdDtcblx0XHR0aGlzLm1ldGFLZXkgPSB0aGlzLm1ldGFLZXkgfHwgdGhpcy5rZXlDb2RlID09PSBLZXlDb2RlLk1ldGE7XG5cblx0XHR0aGlzLl9hc0tleWJpbmRpbmcgPSB0aGlzLl9jb21wdXRlS2V5YmluZGluZygpO1xuXHRcdHRoaXMuX2FzS2V5Q29kZUNob3JkID0gdGhpcy5fY29tcHV0ZUtleUNvZGVDaG9yZCgpO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coYGNvZGU6ICR7ZS5jb2RlfSwga2V5Q29kZTogJHtlLmtleUNvZGV9LCBrZXk6ICR7ZS5rZXl9YCk7XG5cdH1cblxuXHRwdWJsaWMgcHJldmVudERlZmF1bHQoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuYnJvd3NlckV2ZW50ICYmIHRoaXMuYnJvd3NlckV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG5cdFx0XHR0aGlzLmJyb3dzZXJFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzdG9wUHJvcGFnYXRpb24oKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuYnJvd3NlckV2ZW50ICYmIHRoaXMuYnJvd3NlckV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuXHRcdFx0dGhpcy5icm93c2VyRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHRvS2V5Q29kZUNob3JkKCk6IEtleUNvZGVDaG9yZCB7XG5cdFx0cmV0dXJuIHRoaXMuX2FzS2V5Q29kZUNob3JkO1xuXHR9XG5cblx0cHVibGljIGVxdWFscyhvdGhlcjogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2FzS2V5YmluZGluZyA9PT0gb3RoZXI7XG5cdH1cblxuXHRwcml2YXRlIF9jb21wdXRlS2V5YmluZGluZygpOiBudW1iZXIge1xuXHRcdGxldCBrZXkgPSBLZXlDb2RlLlVua25vd247XG5cdFx0aWYgKHRoaXMua2V5Q29kZSAhPT0gS2V5Q29kZS5DdHJsICYmIHRoaXMua2V5Q29kZSAhPT0gS2V5Q29kZS5TaGlmdCAmJiB0aGlzLmtleUNvZGUgIT09IEtleUNvZGUuQWx0ICYmIHRoaXMua2V5Q29kZSAhPT0gS2V5Q29kZS5NZXRhKSB7XG5cdFx0XHRrZXkgPSB0aGlzLmtleUNvZGU7XG5cdFx0fVxuXG5cdFx0bGV0IHJlc3VsdCA9IDA7XG5cdFx0aWYgKHRoaXMuY3RybEtleSkge1xuXHRcdFx0cmVzdWx0IHw9IGN0cmxLZXlNb2Q7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmFsdEtleSkge1xuXHRcdFx0cmVzdWx0IHw9IGFsdEtleU1vZDtcblx0XHR9XG5cdFx0aWYgKHRoaXMuc2hpZnRLZXkpIHtcblx0XHRcdHJlc3VsdCB8PSBzaGlmdEtleU1vZDtcblx0XHR9XG5cdFx0aWYgKHRoaXMubWV0YUtleSkge1xuXHRcdFx0cmVzdWx0IHw9IG1ldGFLZXlNb2Q7XG5cdFx0fVxuXHRcdHJlc3VsdCB8PSBrZXk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBfY29tcHV0ZUtleUNvZGVDaG9yZCgpOiBLZXlDb2RlQ2hvcmQge1xuXHRcdGxldCBrZXkgPSBLZXlDb2RlLlVua25vd247XG5cdFx0aWYgKHRoaXMua2V5Q29kZSAhPT0gS2V5Q29kZS5DdHJsICYmIHRoaXMua2V5Q29kZSAhPT0gS2V5Q29kZS5TaGlmdCAmJiB0aGlzLmtleUNvZGUgIT09IEtleUNvZGUuQWx0ICYmIHRoaXMua2V5Q29kZSAhPT0gS2V5Q29kZS5NZXRhKSB7XG5cdFx0XHRrZXkgPSB0aGlzLmtleUNvZGU7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgS2V5Q29kZUNob3JkKHRoaXMuY3RybEtleSwgdGhpcy5zaGlmdEtleSwgdGhpcy5hbHRLZXksIHRoaXMubWV0YUtleSwga2V5KTtcblx0fVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IEVtaXR0ZXIsIEV2ZW50IH0gZnJvbSAndnMvYmFzZS9jb21tb24vZXZlbnQnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZVN0b3JlLCBJRGlzcG9zYWJsZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2xpZmVjeWNsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGF0aW9uVG9rZW4ge1xuXG5cdC8qKlxuXHQgKiBBIGZsYWcgc2lnbmFsbGluZyBpcyBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuXHQgKi9cblx0cmVhZG9ubHkgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIEFuIGV2ZW50IHdoaWNoIGZpcmVzIHdoZW4gY2FuY2VsbGF0aW9uIGlzIHJlcXVlc3RlZC4gVGhpcyBldmVudFxuXHQgKiBvbmx5IGV2ZXIgZmlyZXMgYG9uY2VgIGFzIGNhbmNlbGxhdGlvbiBjYW4gb25seSBoYXBwZW4gb25jZS4gTGlzdGVuZXJzXG5cdCAqIHRoYXQgYXJlIHJlZ2lzdGVyZWQgYWZ0ZXIgY2FuY2VsbGF0aW9uIHdpbGwgYmUgY2FsbGVkIChuZXh0IGV2ZW50IGxvb3AgcnVuKSxcblx0ICogYnV0IGFsc28gb25seSBvbmNlLlxuXHQgKlxuXHQgKiBAZXZlbnRcblx0ICovXG5cdHJlYWRvbmx5IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiAobGlzdGVuZXI6IChlOiBhbnkpID0+IGFueSwgdGhpc0FyZ3M/OiBhbnksIGRpc3Bvc2FibGVzPzogSURpc3Bvc2FibGVbXSkgPT4gSURpc3Bvc2FibGU7XG59XG5cbmNvbnN0IHNob3J0Y3V0RXZlbnQ6IEV2ZW50PGFueT4gPSBPYmplY3QuZnJlZXplKGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dD8pOiBJRGlzcG9zYWJsZSB7XG5cdGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2suYmluZChjb250ZXh0KSwgMCk7XG5cdHJldHVybiB7IGRpc3Bvc2UoKSB7IGNsZWFyVGltZW91dChoYW5kbGUpOyB9IH07XG59KTtcblxuZXhwb3J0IG5hbWVzcGFjZSBDYW5jZWxsYXRpb25Ub2tlbiB7XG5cblx0ZXhwb3J0IGZ1bmN0aW9uIGlzQ2FuY2VsbGF0aW9uVG9rZW4odGhpbmc6IHVua25vd24pOiB0aGluZyBpcyBDYW5jZWxsYXRpb25Ub2tlbiB7XG5cdFx0aWYgKHRoaW5nID09PSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lIHx8IHRoaW5nID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAodGhpbmcgaW5zdGFuY2VvZiBNdXRhYmxlVG9rZW4pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoIXRoaW5nIHx8IHR5cGVvZiB0aGluZyAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHR5cGVvZiAodGhpbmcgYXMgQ2FuY2VsbGF0aW9uVG9rZW4pLmlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkID09PSAnYm9vbGVhbidcblx0XHRcdCYmIHR5cGVvZiAodGhpbmcgYXMgQ2FuY2VsbGF0aW9uVG9rZW4pLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkID09PSAnZnVuY3Rpb24nO1xuXHR9XG5cblxuXHRleHBvcnQgY29uc3QgTm9uZSA9IE9iamVjdC5mcmVlemU8Q2FuY2VsbGF0aW9uVG9rZW4+KHtcblx0XHRpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDogZmFsc2UsXG5cdFx0b25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IEV2ZW50Lk5vbmVcblx0fSk7XG5cblx0ZXhwb3J0IGNvbnN0IENhbmNlbGxlZCA9IE9iamVjdC5mcmVlemU8Q2FuY2VsbGF0aW9uVG9rZW4+KHtcblx0XHRpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDogdHJ1ZSxcblx0XHRvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDogc2hvcnRjdXRFdmVudFxuXHR9KTtcbn1cblxuY2xhc3MgTXV0YWJsZVRva2VuIGltcGxlbWVudHMgQ2FuY2VsbGF0aW9uVG9rZW4ge1xuXG5cdHByaXZhdGUgX2lzQ2FuY2VsbGVkOiBib29sZWFuID0gZmFsc2U7XG5cdHByaXZhdGUgX2VtaXR0ZXI6IEVtaXR0ZXI8YW55PiB8IG51bGwgPSBudWxsO1xuXG5cdHB1YmxpYyBjYW5jZWwoKSB7XG5cdFx0aWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuXHRcdFx0dGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKHRoaXMuX2VtaXR0ZXIpIHtcblx0XHRcdFx0dGhpcy5fZW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG5cdFx0XHRcdHRoaXMuZGlzcG9zZSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGdldCBpc0NhbmNlbGxhdGlvblJlcXVlc3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5faXNDYW5jZWxsZWQ7XG5cdH1cblxuXHRnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKTogRXZlbnQ8YW55PiB7XG5cdFx0aWYgKHRoaXMuX2lzQ2FuY2VsbGVkKSB7XG5cdFx0XHRyZXR1cm4gc2hvcnRjdXRFdmVudDtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLl9lbWl0dGVyKSB7XG5cdFx0XHR0aGlzLl9lbWl0dGVyID0gbmV3IEVtaXR0ZXI8YW55PigpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fZW1pdHRlci5ldmVudDtcblx0fVxuXG5cdHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9lbWl0dGVyKSB7XG5cdFx0XHR0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcblx0XHRcdHRoaXMuX2VtaXR0ZXIgPSBudWxsO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2Uge1xuXG5cdHByaXZhdGUgX3Rva2VuPzogQ2FuY2VsbGF0aW9uVG9rZW4gPSB1bmRlZmluZWQ7XG5cdHByaXZhdGUgX3BhcmVudExpc3RlbmVyPzogSURpc3Bvc2FibGUgPSB1bmRlZmluZWQ7XG5cblx0Y29uc3RydWN0b3IocGFyZW50PzogQ2FuY2VsbGF0aW9uVG9rZW4pIHtcblx0XHR0aGlzLl9wYXJlbnRMaXN0ZW5lciA9IHBhcmVudCAmJiBwYXJlbnQub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQodGhpcy5jYW5jZWwsIHRoaXMpO1xuXHR9XG5cblx0Z2V0IHRva2VuKCk6IENhbmNlbGxhdGlvblRva2VuIHtcblx0XHRpZiAoIXRoaXMuX3Rva2VuKSB7XG5cdFx0XHQvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuXHRcdFx0Ly8gYWN0dWFsbHkgbmVlZGVkXG5cdFx0XHR0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX3Rva2VuO1xuXHR9XG5cblx0Y2FuY2VsKCk6IHZvaWQge1xuXHRcdGlmICghdGhpcy5fdG9rZW4pIHtcblx0XHRcdC8vIHNhdmUgYW4gb2JqZWN0IGJ5IHJldHVybmluZyB0aGUgZGVmYXVsdFxuXHRcdFx0Ly8gY2FuY2VsbGVkIHRva2VuIHdoZW4gY2FuY2VsbGF0aW9uIGhhcHBlbnNcblx0XHRcdC8vIGJlZm9yZSBzb21lb25lIGFza3MgZm9yIHRoZSB0b2tlblxuXHRcdFx0dGhpcy5fdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQ7XG5cblx0XHR9IGVsc2UgaWYgKHRoaXMuX3Rva2VuIGluc3RhbmNlb2YgTXV0YWJsZVRva2VuKSB7XG5cdFx0XHQvLyBhY3R1YWxseSBjYW5jZWxcblx0XHRcdHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuXHRcdH1cblx0fVxuXG5cdGRpc3Bvc2UoY2FuY2VsOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcblx0XHRpZiAoY2FuY2VsKSB7XG5cdFx0XHR0aGlzLmNhbmNlbCgpO1xuXHRcdH1cblx0XHR0aGlzLl9wYXJlbnRMaXN0ZW5lcj8uZGlzcG9zZSgpO1xuXHRcdGlmICghdGhpcy5fdG9rZW4pIHtcblx0XHRcdC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcblx0XHRcdHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5fdG9rZW4gaW5zdGFuY2VvZiBNdXRhYmxlVG9rZW4pIHtcblx0XHRcdC8vIGFjdHVhbGx5IGRpc3Bvc2Vcblx0XHRcdHRoaXMuX3Rva2VuLmRpc3Bvc2UoKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbmNlbE9uRGlzcG9zZShzdG9yZTogRGlzcG9zYWJsZVN0b3JlKTogQ2FuY2VsbGF0aW9uVG9rZW4ge1xuXHRjb25zdCBzb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcblx0c3RvcmUuYWRkKHsgZGlzcG9zZSgpIHsgc291cmNlLmNhbmNlbCgpOyB9IH0pO1xuXHRyZXR1cm4gc291cmNlLnRva2VuO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi8qKlxuICogQ2FuIGJlIHBhc3NlZCBpbnRvIHRoZSBEZWxheWVkIHRvIGRlZmVyIHVzaW5nIGEgbWljcm90YXNrXG4gKiAqL1xuZXhwb3J0IGNvbnN0IE1pY3JvdGFza0RlbGF5ID0gU3ltYm9sKCdNaWNyb3Rhc2tEZWxheScpO1xuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IENhbmNlbGxhdGlvblRva2VuLCBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2NhbmNlbGxhdGlvbic7XG5pbXBvcnQgeyBCdWdJbmRpY2F0aW5nRXJyb3IsIENhbmNlbGxhdGlvbkVycm9yIH0gZnJvbSAndnMvYmFzZS9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IEVtaXR0ZXIsIEV2ZW50IH0gZnJvbSAndnMvYmFzZS9jb21tb24vZXZlbnQnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgRGlzcG9zYWJsZVN0b3JlLCBJRGlzcG9zYWJsZSwgTXV0YWJsZURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2xpZmVjeWNsZSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0MCB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL3BsYXRmb3JtJztcbmltcG9ydCB7IE1pY3JvdGFza0RlbGF5IH0gZnJvbSAnLi9zeW1ib2xzJztcbmltcG9ydCB7IExhenkgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9sYXp5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGhlbmFibGU8VD4ob2JqOiB1bmtub3duKTogb2JqIGlzIFByb21pc2U8VD4ge1xuXHRyZXR1cm4gISFvYmogJiYgdHlwZW9mIChvYmogYXMgdW5rbm93biBhcyBQcm9taXNlPFQ+KS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGFibGVQcm9taXNlPFQ+IGV4dGVuZHMgUHJvbWlzZTxUPiB7XG5cdGNhbmNlbCgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FuY2VsYWJsZVByb21pc2U8VD4oY2FsbGJhY2s6ICh0b2tlbjogQ2FuY2VsbGF0aW9uVG9rZW4pID0+IFByb21pc2U8VD4pOiBDYW5jZWxhYmxlUHJvbWlzZTxUPiB7XG5cdGNvbnN0IHNvdXJjZSA9IG5ldyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSgpO1xuXG5cdGNvbnN0IHRoZW5hYmxlID0gY2FsbGJhY2soc291cmNlLnRva2VuKTtcblx0Y29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBzdWJzY3JpcHRpb24gPSBzb3VyY2UudG9rZW4ub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKCkgPT4ge1xuXHRcdFx0c3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcblx0XHRcdHJlamVjdChuZXcgQ2FuY2VsbGF0aW9uRXJyb3IoKSk7XG5cdFx0fSk7XG5cdFx0UHJvbWlzZS5yZXNvbHZlKHRoZW5hYmxlKS50aGVuKHZhbHVlID0+IHtcblx0XHRcdHN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG5cdFx0XHRzb3VyY2UuZGlzcG9zZSgpO1xuXHRcdFx0cmVzb2x2ZSh2YWx1ZSk7XG5cdFx0fSwgZXJyID0+IHtcblx0XHRcdHN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG5cdFx0XHRzb3VyY2UuZGlzcG9zZSgpO1xuXHRcdFx0cmVqZWN0KGVycik7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdHJldHVybiA8Q2FuY2VsYWJsZVByb21pc2U8VD4+bmV3IGNsYXNzIHtcblx0XHRjYW5jZWwoKSB7XG5cdFx0XHRzb3VyY2UuY2FuY2VsKCk7XG5cdFx0XHRzb3VyY2UuZGlzcG9zZSgpO1xuXHRcdH1cblx0XHR0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4ocmVzb2x2ZT86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgcmVqZWN0PzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG5cdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG5cdFx0fVxuXHRcdGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4ocmVqZWN0PzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdCB8IFByb21pc2U8VFJlc3VsdD4pIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFByb21pc2U8VCB8IFRSZXN1bHQ+IHtcblx0XHRcdHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCByZWplY3QpO1xuXHRcdH1cblx0XHRmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwpOiBQcm9taXNlPFQ+IHtcblx0XHRcdHJldHVybiBwcm9taXNlLmZpbmFsbHkob25maW5hbGx5KTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB1bmRlZmluZWRgIGFzIHNvb24gYXMgdGhlIHBhc3NlZCB0b2tlbiBpcyBjYW5jZWxsZWQuXG4gKiBAc2VlIHtAbGluayByYWNlQ2FuY2VsbGF0aW9uRXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYWNlQ2FuY2VsbGF0aW9uPFQ+KHByb21pc2U6IFByb21pc2U8VD4sIHRva2VuOiBDYW5jZWxsYXRpb25Ub2tlbik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGBkZWZhdWx0VmFsdWVgIGFzIHNvb24gYXMgdGhlIHBhc3NlZCB0b2tlbiBpcyBjYW5jZWxsZWQuXG4gKiBAc2VlIHtAbGluayByYWNlQ2FuY2VsbGF0aW9uRXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYWNlQ2FuY2VsbGF0aW9uPFQ+KHByb21pc2U6IFByb21pc2U8VD4sIHRva2VuOiBDYW5jZWxsYXRpb25Ub2tlbiwgZGVmYXVsdFZhbHVlOiBUKTogUHJvbWlzZTxUPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJhY2VDYW5jZWxsYXRpb248VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgdG9rZW46IENhbmNlbGxhdGlvblRva2VuLCBkZWZhdWx0VmFsdWU/OiBUKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgcmVmID0gdG9rZW4ub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKCkgPT4ge1xuXHRcdFx0cmVmLmRpc3Bvc2UoKTtcblx0XHRcdHJlc29sdmUoZGVmYXVsdFZhbHVlKTtcblx0XHR9KTtcblx0XHRwcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KS5maW5hbGx5KCgpID0+IHJlZi5kaXNwb3NlKCkpO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2l0aCBhbiB7QENhbmNlbGxhdGlvbkVycm9yfSBhcyBzb29uIGFzIHRoZSBwYXNzZWQgdG9rZW4gaXMgY2FuY2VsbGVkLlxuICogQHNlZSB7QGxpbmsgcmFjZUNhbmNlbGxhdGlvbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhY2VDYW5jZWxsYXRpb25FcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCB0b2tlbjogQ2FuY2VsbGF0aW9uVG9rZW4pOiBQcm9taXNlPFQ+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCByZWYgPSB0b2tlbi5vbkNhbmNlbGxhdGlvblJlcXVlc3RlZCgoKSA9PiB7XG5cdFx0XHRyZWYuZGlzcG9zZSgpO1xuXHRcdFx0cmVqZWN0KG5ldyBDYW5jZWxsYXRpb25FcnJvcigpKTtcblx0XHR9KTtcblx0XHRwcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KS5maW5hbGx5KCgpID0+IHJlZi5kaXNwb3NlKCkpO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFzIHNvb24gYXMgb25lIG9mIHRoZSBwcm9taXNlcyByZXNvbHZlcyBvciByZWplY3RzIGFuZCBjYW5jZWxzIHJlbWFpbmluZyBwcm9taXNlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmFjZUNhbmNlbGxhYmxlUHJvbWlzZXM8VD4oY2FuY2VsbGFibGVQcm9taXNlczogQ2FuY2VsYWJsZVByb21pc2U8VD5bXSk6IFByb21pc2U8VD4ge1xuXHRsZXQgcmVzb2x2ZWRQcm9taXNlSW5kZXggPSAtMTtcblx0Y29uc3QgcHJvbWlzZXMgPSBjYW5jZWxsYWJsZVByb21pc2VzLm1hcCgocHJvbWlzZSwgaW5kZXgpID0+IHByb21pc2UudGhlbihyZXN1bHQgPT4geyByZXNvbHZlZFByb21pc2VJbmRleCA9IGluZGV4OyByZXR1cm4gcmVzdWx0OyB9KSk7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9IGZpbmFsbHkge1xuXHRcdGNhbmNlbGxhYmxlUHJvbWlzZXMuZm9yRWFjaCgoY2FuY2VsbGFibGVQcm9taXNlLCBpbmRleCkgPT4ge1xuXHRcdFx0aWYgKGluZGV4ICE9PSByZXNvbHZlZFByb21pc2VJbmRleCkge1xuXHRcdFx0XHRjYW5jZWxsYWJsZVByb21pc2UuY2FuY2VsKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhY2VUaW1lb3V0PFQ+KHByb21pc2U6IFByb21pc2U8VD4sIHRpbWVvdXQ6IG51bWJlciwgb25UaW1lb3V0PzogKCkgPT4gdm9pZCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuXHRsZXQgcHJvbWlzZVJlc29sdmU6ICgodmFsdWU6IFQgfCB1bmRlZmluZWQpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0cHJvbWlzZVJlc29sdmU/Lih1bmRlZmluZWQpO1xuXHRcdG9uVGltZW91dD8uKCk7XG5cdH0sIHRpbWVvdXQpO1xuXG5cdHJldHVybiBQcm9taXNlLnJhY2UoW1xuXHRcdHByb21pc2UuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpKSxcblx0XHRuZXcgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPihyZXNvbHZlID0+IHByb21pc2VSZXNvbHZlID0gcmVzb2x2ZSlcblx0XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc1Byb21pc2U8VD4oY2FsbGJhY2s6ICgpID0+IFQgfCBQcm9taXNlTGlrZTxUPik6IFByb21pc2U8VD4ge1xuXHRyZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IGl0ZW0gPSBjYWxsYmFjaygpO1xuXHRcdGlmIChpc1RoZW5hYmxlPFQ+KGl0ZW0pKSB7XG5cdFx0XHRpdGVtLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzb2x2ZShpdGVtKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgcHJvbWlzZSwgcGx1cyBpdHMgYHJlc29sdmVgIGFuZCBgcmVqZWN0YCBjYWxsYmFja3MuXG4gKlxuICogUmVwbGFjZSB3aXRoIHN0YW5kYXJkaXplZCBbYFByb21pc2Uud2l0aFJlc29sdmVyc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb21pc2Uvd2l0aFJlc29sdmVycykgb25jZSBpdCBpcyBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+KCk6IHsgcHJvbWlzZTogUHJvbWlzZTxUPjsgcmVzb2x2ZTogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7IHJlamVjdDogKGVycj86IGFueSkgPT4gdm9pZCB9IHtcblx0bGV0IHJlc29sdmU6ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuXHRsZXQgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuXHRjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7XG5cdFx0cmVzb2x2ZSA9IHJlcztcblx0XHRyZWplY3QgPSByZWo7XG5cdH0pO1xuXHRyZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXNvbHZlISwgcmVqZWN0OiByZWplY3QhIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRhc2s8VD4ge1xuXHQoKTogVDtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB0byBwcmV2ZW50IGFjY3VtdWxhdGlvbiBvZiBzZXF1ZW50aWFsIGFzeW5jIHRhc2tzLlxuICpcbiAqIEltYWdpbmUgYSBtYWlsIG1hbiB3aXRoIHRoZSBzb2xlIHRhc2sgb2YgZGVsaXZlcmluZyBsZXR0ZXJzLiBBcyBzb29uIGFzXG4gKiBhIGxldHRlciBzdWJtaXR0ZWQgZm9yIGRlbGl2ZXJ5LCBoZSBkcml2ZXMgdG8gdGhlIGRlc3RpbmF0aW9uLCBkZWxpdmVycyBpdFxuICogYW5kIHJldHVybnMgdG8gaGlzIGJhc2UuIEltYWdpbmUgdGhhdCBkdXJpbmcgdGhlIHRyaXAsIE4gbW9yZSBsZXR0ZXJzIHdlcmUgc3VibWl0dGVkLlxuICogV2hlbiB0aGUgbWFpbCBtYW4gcmV0dXJucywgaGUgcGlja3MgdGhvc2UgTiBsZXR0ZXJzIGFuZCBkZWxpdmVycyB0aGVtIGFsbCBpbiBhXG4gKiBzaW5nbGUgdHJpcC4gRXZlbiB0aG91Z2ggTisxIHN1Ym1pc3Npb25zIG9jY3VycmVkLCBvbmx5IDIgZGVsaXZlcmllcyB3ZXJlIG1hZGUuXG4gKlxuICogVGhlIHRocm90dGxlciBpbXBsZW1lbnRzIHRoaXMgdmlhIHRoZSBxdWV1ZSgpIG1ldGhvZCwgYnkgcHJvdmlkaW5nIGl0IGEgdGFza1xuICogZmFjdG9yeS4gRm9sbG93aW5nIHRoZSBleGFtcGxlOlxuICpcbiAqIFx0XHRjb25zdCB0aHJvdHRsZXIgPSBuZXcgVGhyb3R0bGVyKCk7XG4gKiBcdFx0Y29uc3QgbGV0dGVycyA9IFtdO1xuICpcbiAqIFx0XHRmdW5jdGlvbiBkZWxpdmVyKCkge1xuICogXHRcdFx0Y29uc3QgbGV0dGVyc1RvRGVsaXZlciA9IGxldHRlcnM7XG4gKiBcdFx0XHRsZXR0ZXJzID0gW107XG4gKiBcdFx0XHRyZXR1cm4gbWFrZVRoZVRyaXAobGV0dGVyc1RvRGVsaXZlcik7XG4gKiBcdFx0fVxuICpcbiAqIFx0XHRmdW5jdGlvbiBvbkxldHRlclJlY2VpdmVkKGwpIHtcbiAqIFx0XHRcdGxldHRlcnMucHVzaChsKTtcbiAqIFx0XHRcdHRocm90dGxlci5xdWV1ZShkZWxpdmVyKTtcbiAqIFx0XHR9XG4gKi9cbmV4cG9ydCBjbGFzcyBUaHJvdHRsZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG5cblx0cHJpdmF0ZSBhY3RpdmVQcm9taXNlOiBQcm9taXNlPGFueT4gfCBudWxsO1xuXHRwcml2YXRlIHF1ZXVlZFByb21pc2U6IFByb21pc2U8YW55PiB8IG51bGw7XG5cdHByaXZhdGUgcXVldWVkUHJvbWlzZUZhY3Rvcnk6IElUYXNrPFByb21pc2U8YW55Pj4gfCBudWxsO1xuXG5cdHByaXZhdGUgaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuYWN0aXZlUHJvbWlzZSA9IG51bGw7XG5cdFx0dGhpcy5xdWV1ZWRQcm9taXNlID0gbnVsbDtcblx0XHR0aGlzLnF1ZXVlZFByb21pc2VGYWN0b3J5ID0gbnVsbDtcblx0fVxuXG5cdHF1ZXVlPFQ+KHByb21pc2VGYWN0b3J5OiBJVGFzazxQcm9taXNlPFQ+Pik6IFByb21pc2U8VD4ge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1Rocm90dGxlciBpcyBkaXNwb3NlZCcpKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5hY3RpdmVQcm9taXNlKSB7XG5cdFx0XHR0aGlzLnF1ZXVlZFByb21pc2VGYWN0b3J5ID0gcHJvbWlzZUZhY3Rvcnk7XG5cblx0XHRcdGlmICghdGhpcy5xdWV1ZWRQcm9taXNlKSB7XG5cdFx0XHRcdGNvbnN0IG9uQ29tcGxldGUgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5xdWV1ZWRQcm9taXNlID0gbnVsbDtcblxuXHRcdFx0XHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLnF1ZXVlKHRoaXMucXVldWVkUHJvbWlzZUZhY3RvcnkhKTtcblx0XHRcdFx0XHR0aGlzLnF1ZXVlZFByb21pc2VGYWN0b3J5ID0gbnVsbDtcblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dGhpcy5xdWV1ZWRQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5hY3RpdmVQcm9taXNlIS50aGVuKG9uQ29tcGxldGUsIG9uQ29tcGxldGUpLnRoZW4ocmVzb2x2ZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHR0aGlzLnF1ZXVlZFByb21pc2UhLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuYWN0aXZlUHJvbWlzZSA9IHByb21pc2VGYWN0b3J5KCk7XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dGhpcy5hY3RpdmVQcm9taXNlIS50aGVuKChyZXN1bHQ6IFQpID0+IHtcblx0XHRcdFx0dGhpcy5hY3RpdmVQcm9taXNlID0gbnVsbDtcblx0XHRcdFx0cmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0fSwgKGVycjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHR0aGlzLmFjdGl2ZVByb21pc2UgPSBudWxsO1xuXHRcdFx0XHRyZWplY3QoZXJyKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0ZGlzcG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZW5jZXIge1xuXG5cdHByaXZhdGUgY3VycmVudDogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZShudWxsKTtcblxuXHRxdWV1ZTxUPihwcm9taXNlVGFzazogSVRhc2s8UHJvbWlzZTxUPj4pOiBQcm9taXNlPFQ+IHtcblx0XHRyZXR1cm4gdGhpcy5jdXJyZW50ID0gdGhpcy5jdXJyZW50LnRoZW4oKCkgPT4gcHJvbWlzZVRhc2soKSwgKCkgPT4gcHJvbWlzZVRhc2soKSk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcXVlbmNlckJ5S2V5PFRLZXk+IHtcblxuXHRwcml2YXRlIHByb21pc2VNYXAgPSBuZXcgTWFwPFRLZXksIFByb21pc2U8dW5rbm93bj4+KCk7XG5cblx0cXVldWU8VD4oa2V5OiBUS2V5LCBwcm9taXNlVGFzazogSVRhc2s8UHJvbWlzZTxUPj4pOiBQcm9taXNlPFQ+IHtcblx0XHRjb25zdCBydW5uaW5nUHJvbWlzZSA9IHRoaXMucHJvbWlzZU1hcC5nZXQoa2V5KSA/PyBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRjb25zdCBuZXdQcm9taXNlID0gcnVubmluZ1Byb21pc2Vcblx0XHRcdC5jYXRjaCgoKSA9PiB7IH0pXG5cdFx0XHQudGhlbihwcm9taXNlVGFzaylcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMucHJvbWlzZU1hcC5nZXQoa2V5KSA9PT0gbmV3UHJvbWlzZSkge1xuXHRcdFx0XHRcdHRoaXMucHJvbWlzZU1hcC5kZWxldGUoa2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0dGhpcy5wcm9taXNlTWFwLnNldChrZXksIG5ld1Byb21pc2UpO1xuXHRcdHJldHVybiBuZXdQcm9taXNlO1xuXHR9XG59XG5cbmludGVyZmFjZSBJU2NoZWR1bGVkTGF0ZXIgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG5cdGlzVHJpZ2dlcmVkKCk6IGJvb2xlYW47XG59XG5cbmNvbnN0IHRpbWVvdXREZWZlcnJlZCA9ICh0aW1lb3V0OiBudW1iZXIsIGZuOiAoKSA9PiB2b2lkKTogSVNjaGVkdWxlZExhdGVyID0+IHtcblx0bGV0IHNjaGVkdWxlZCA9IHRydWU7XG5cdGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdHNjaGVkdWxlZCA9IGZhbHNlO1xuXHRcdGZuKCk7XG5cdH0sIHRpbWVvdXQpO1xuXHRyZXR1cm4ge1xuXHRcdGlzVHJpZ2dlcmVkOiAoKSA9PiBzY2hlZHVsZWQsXG5cdFx0ZGlzcG9zZTogKCkgPT4ge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KGhhbmRsZSk7XG5cdFx0XHRzY2hlZHVsZWQgPSBmYWxzZTtcblx0XHR9LFxuXHR9O1xufTtcblxuY29uc3QgbWljcm90YXNrRGVmZXJyZWQgPSAoZm46ICgpID0+IHZvaWQpOiBJU2NoZWR1bGVkTGF0ZXIgPT4ge1xuXHRsZXQgc2NoZWR1bGVkID0gdHJ1ZTtcblx0cXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuXHRcdGlmIChzY2hlZHVsZWQpIHtcblx0XHRcdHNjaGVkdWxlZCA9IGZhbHNlO1xuXHRcdFx0Zm4oKTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0aXNUcmlnZ2VyZWQ6ICgpID0+IHNjaGVkdWxlZCxcblx0XHRkaXNwb3NlOiAoKSA9PiB7IHNjaGVkdWxlZCA9IGZhbHNlOyB9LFxuXHR9O1xufTtcblxuLyoqXG4gKiBBIGhlbHBlciB0byBkZWxheSAoZGVib3VuY2UpIGV4ZWN1dGlvbiBvZiBhIHRhc2sgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQgb2Z0ZW4uXG4gKlxuICogRm9sbG93aW5nIHRoZSB0aHJvdHRsZXIsIG5vdyBpbWFnaW5lIHRoZSBtYWlsIG1hbiB3YW50cyB0byBvcHRpbWl6ZSB0aGUgbnVtYmVyIG9mXG4gKiB0cmlwcyBwcm9hY3RpdmVseS4gVGhlIHRyaXAgaXRzZWxmIGNhbiBiZSBsb25nLCBzbyBoZSBkZWNpZGVzIG5vdCB0byBtYWtlIHRoZSB0cmlwXG4gKiBhcyBzb29uIGFzIGEgbGV0dGVyIGlzIHN1Ym1pdHRlZC4gSW5zdGVhZCBoZSB3YWl0cyBhIHdoaWxlLCBpbiBjYXNlIG1vcmVcbiAqIGxldHRlcnMgYXJlIHN1Ym1pdHRlZC4gQWZ0ZXIgc2FpZCB3YWl0aW5nIHBlcmlvZCwgaWYgbm8gbGV0dGVycyB3ZXJlIHN1Ym1pdHRlZCwgaGVcbiAqIGRlY2lkZXMgdG8gbWFrZSB0aGUgdHJpcC4gSW1hZ2luZSB0aGF0IE4gbW9yZSBsZXR0ZXJzIHdlcmUgc3VibWl0dGVkIGFmdGVyIHRoZSBmaXJzdFxuICogb25lLCBhbGwgd2l0aGluIGEgc2hvcnQgcGVyaW9kIG9mIHRpbWUgYmV0d2VlbiBlYWNoIG90aGVyLiBFdmVuIHRob3VnaCBOKzFcbiAqIHN1Ym1pc3Npb25zIG9jY3VycmVkLCBvbmx5IDEgZGVsaXZlcnkgd2FzIG1hZGUuXG4gKlxuICogVGhlIGRlbGF5ZXIgb2ZmZXJzIHRoaXMgYmVoYXZpb3IgdmlhIHRoZSB0cmlnZ2VyKCkgbWV0aG9kLCBpbnRvIHdoaWNoIGJvdGggdGhlIHRhc2tcbiAqIHRvIGJlIGV4ZWN1dGVkIGFuZCB0aGUgd2FpdGluZyBwZXJpb2QgKGRlbGF5KSBtdXN0IGJlIHBhc3NlZCBpbiBhcyBhcmd1bWVudHMuIEZvbGxvd2luZ1xuICogdGhlIGV4YW1wbGU6XG4gKlxuICogXHRcdGNvbnN0IGRlbGF5ZXIgPSBuZXcgRGVsYXllcihXQUlUSU5HX1BFUklPRCk7XG4gKiBcdFx0Y29uc3QgbGV0dGVycyA9IFtdO1xuICpcbiAqIFx0XHRmdW5jdGlvbiBsZXR0ZXJSZWNlaXZlZChsKSB7XG4gKiBcdFx0XHRsZXR0ZXJzLnB1c2gobCk7XG4gKiBcdFx0XHRkZWxheWVyLnRyaWdnZXIoKCkgPT4geyByZXR1cm4gbWFrZVRoZVRyaXAoKTsgfSk7XG4gKiBcdFx0fVxuICovXG5leHBvcnQgY2xhc3MgRGVsYXllcjxUPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcblxuXHRwcml2YXRlIGRlZmVycmVkOiBJU2NoZWR1bGVkTGF0ZXIgfCBudWxsO1xuXHRwcml2YXRlIGNvbXBsZXRpb25Qcm9taXNlOiBQcm9taXNlPGFueT4gfCBudWxsO1xuXHRwcml2YXRlIGRvUmVzb2x2ZTogKCh2YWx1ZT86IGFueSB8IFByb21pc2U8YW55PikgPT4gdm9pZCkgfCBudWxsO1xuXHRwcml2YXRlIGRvUmVqZWN0OiAoKGVycjogYW55KSA9PiB2b2lkKSB8IG51bGw7XG5cdHByaXZhdGUgdGFzazogSVRhc2s8VCB8IFByb21pc2U8VD4+IHwgbnVsbDtcblxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgZGVmYXVsdERlbGF5OiBudW1iZXIgfCB0eXBlb2YgTWljcm90YXNrRGVsYXkpIHtcblx0XHR0aGlzLmRlZmVycmVkID0gbnVsbDtcblx0XHR0aGlzLmNvbXBsZXRpb25Qcm9taXNlID0gbnVsbDtcblx0XHR0aGlzLmRvUmVzb2x2ZSA9IG51bGw7XG5cdFx0dGhpcy5kb1JlamVjdCA9IG51bGw7XG5cdFx0dGhpcy50YXNrID0gbnVsbDtcblx0fVxuXG5cdHRyaWdnZXIodGFzazogSVRhc2s8VCB8IFByb21pc2U8VD4+LCBkZWxheSA9IHRoaXMuZGVmYXVsdERlbGF5KTogUHJvbWlzZTxUPiB7XG5cdFx0dGhpcy50YXNrID0gdGFzaztcblx0XHR0aGlzLmNhbmNlbFRpbWVvdXQoKTtcblxuXHRcdGlmICghdGhpcy5jb21wbGV0aW9uUHJvbWlzZSkge1xuXHRcdFx0dGhpcy5jb21wbGV0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0dGhpcy5kb1Jlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0XHR0aGlzLmRvUmVqZWN0ID0gcmVqZWN0O1xuXHRcdFx0fSkudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuY29tcGxldGlvblByb21pc2UgPSBudWxsO1xuXHRcdFx0XHR0aGlzLmRvUmVzb2x2ZSA9IG51bGw7XG5cdFx0XHRcdGlmICh0aGlzLnRhc2spIHtcblx0XHRcdFx0XHRjb25zdCB0YXNrID0gdGhpcy50YXNrO1xuXHRcdFx0XHRcdHRoaXMudGFzayA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuIHRhc2soKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZm4gPSAoKSA9PiB7XG5cdFx0XHR0aGlzLmRlZmVycmVkID0gbnVsbDtcblx0XHRcdHRoaXMuZG9SZXNvbHZlPy4obnVsbCk7XG5cdFx0fTtcblxuXHRcdHRoaXMuZGVmZXJyZWQgPSBkZWxheSA9PT0gTWljcm90YXNrRGVsYXkgPyBtaWNyb3Rhc2tEZWZlcnJlZChmbikgOiB0aW1lb3V0RGVmZXJyZWQoZGVsYXksIGZuKTtcblxuXHRcdHJldHVybiB0aGlzLmNvbXBsZXRpb25Qcm9taXNlO1xuXHR9XG5cblx0aXNUcmlnZ2VyZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5kZWZlcnJlZD8uaXNUcmlnZ2VyZWQoKTtcblx0fVxuXG5cdGNhbmNlbCgpOiB2b2lkIHtcblx0XHR0aGlzLmNhbmNlbFRpbWVvdXQoKTtcblxuXHRcdGlmICh0aGlzLmNvbXBsZXRpb25Qcm9taXNlKSB7XG5cdFx0XHR0aGlzLmRvUmVqZWN0Py4obmV3IENhbmNlbGxhdGlvbkVycm9yKCkpO1xuXHRcdFx0dGhpcy5jb21wbGV0aW9uUHJvbWlzZSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBjYW5jZWxUaW1lb3V0KCk6IHZvaWQge1xuXHRcdHRoaXMuZGVmZXJyZWQ/LmRpc3Bvc2UoKTtcblx0XHR0aGlzLmRlZmVycmVkID0gbnVsbDtcblx0fVxuXG5cdGRpc3Bvc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5jYW5jZWwoKTtcblx0fVxufVxuXG4vKipcbiAqIEEgaGVscGVyIHRvIGRlbGF5IGV4ZWN1dGlvbiBvZiBhIHRhc2sgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQgb2Z0ZW4sIHdoaWxlXG4gKiBwcmV2ZW50aW5nIGFjY3VtdWxhdGlvbiBvZiBjb25zZWN1dGl2ZSBleGVjdXRpb25zLCB3aGlsZSB0aGUgdGFzayBydW5zLlxuICpcbiAqIFRoZSBtYWlsIG1hbiBpcyBjbGV2ZXIgYW5kIHdhaXRzIGZvciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUsIGJlZm9yZSBnb2luZ1xuICogb3V0IHRvIGRlbGl2ZXIgbGV0dGVycy4gV2hpbGUgdGhlIG1haWwgbWFuIGlzIGdvaW5nIG91dCwgbW9yZSBsZXR0ZXJzIGFycml2ZVxuICogYW5kIGNhbiBvbmx5IGJlIGRlbGl2ZXJlZCBvbmNlIGhlIGlzIGJhY2suIE9uY2UgaGUgaXMgYmFjayB0aGUgbWFpbCBtYW4gd2lsbFxuICogZG8gb25lIG1vcmUgdHJpcCB0byBkZWxpdmVyIHRoZSBsZXR0ZXJzIHRoYXQgaGF2ZSBhY2N1bXVsYXRlZCB3aGlsZSBoZSB3YXMgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgVGhyb3R0bGVkRGVsYXllcjxUPiB7XG5cblx0cHJpdmF0ZSBkZWxheWVyOiBEZWxheWVyPFByb21pc2U8VD4+O1xuXHRwcml2YXRlIHRocm90dGxlcjogVGhyb3R0bGVyO1xuXG5cdGNvbnN0cnVjdG9yKGRlZmF1bHREZWxheTogbnVtYmVyKSB7XG5cdFx0dGhpcy5kZWxheWVyID0gbmV3IERlbGF5ZXIoZGVmYXVsdERlbGF5KTtcblx0XHR0aGlzLnRocm90dGxlciA9IG5ldyBUaHJvdHRsZXIoKTtcblx0fVxuXG5cdHRyaWdnZXIocHJvbWlzZUZhY3Rvcnk6IElUYXNrPFByb21pc2U8VD4+LCBkZWxheT86IG51bWJlcik6IFByb21pc2U8VD4ge1xuXHRcdHJldHVybiB0aGlzLmRlbGF5ZXIudHJpZ2dlcigoKSA9PiB0aGlzLnRocm90dGxlci5xdWV1ZShwcm9taXNlRmFjdG9yeSksIGRlbGF5KSBhcyB1bmtub3duIGFzIFByb21pc2U8VD47XG5cdH1cblxuXHRpc1RyaWdnZXJlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kZWxheWVyLmlzVHJpZ2dlcmVkKCk7XG5cdH1cblxuXHRjYW5jZWwoKTogdm9pZCB7XG5cdFx0dGhpcy5kZWxheWVyLmNhbmNlbCgpO1xuXHR9XG5cblx0ZGlzcG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLmRlbGF5ZXIuZGlzcG9zZSgpO1xuXHRcdHRoaXMudGhyb3R0bGVyLmRpc3Bvc2UoKTtcblx0fVxufVxuXG4vKipcbiAqIEEgYmFycmllciB0aGF0IGlzIGluaXRpYWxseSBjbG9zZWQgYW5kIHRoZW4gYmVjb21lcyBvcGVuZWQgcGVybWFuZW50bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXJyaWVyIHtcblx0cHJpdmF0ZSBfaXNPcGVuOiBib29sZWFuO1xuXHRwcml2YXRlIF9wcm9taXNlOiBQcm9taXNlPGJvb2xlYW4+O1xuXHRwcml2YXRlIF9jb21wbGV0ZVByb21pc2UhOiAodjogYm9vbGVhbikgPT4gdm9pZDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLl9pc09wZW4gPSBmYWxzZTtcblx0XHR0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKGMsIGUpID0+IHtcblx0XHRcdHRoaXMuX2NvbXBsZXRlUHJvbWlzZSA9IGM7XG5cdFx0fSk7XG5cdH1cblxuXHRpc09wZW4oKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzT3Blbjtcblx0fVxuXG5cdG9wZW4oKTogdm9pZCB7XG5cdFx0dGhpcy5faXNPcGVuID0gdHJ1ZTtcblx0XHR0aGlzLl9jb21wbGV0ZVByb21pc2UodHJ1ZSk7XG5cdH1cblxuXHR3YWl0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9wcm9taXNlO1xuXHR9XG59XG5cbi8qKlxuICogQSBiYXJyaWVyIHRoYXQgaXMgaW5pdGlhbGx5IGNsb3NlZCBhbmQgdGhlbiBiZWNvbWVzIG9wZW5lZCBwZXJtYW5lbnRseSBhZnRlciBhIGNlcnRhaW4gcGVyaW9kIG9mXG4gKiB0aW1lIG9yIHdoZW4gb3BlbiBpcyBjYWxsZWQgZXhwbGljaXRseVxuICovXG5leHBvcnQgY2xhc3MgQXV0b09wZW5CYXJyaWVyIGV4dGVuZHMgQmFycmllciB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfdGltZW91dDogYW55O1xuXG5cdGNvbnN0cnVjdG9yKGF1dG9PcGVuVGltZU1zOiBudW1iZXIpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMub3BlbigpLCBhdXRvT3BlblRpbWVNcyk7XG5cdH1cblxuXHRvdmVycmlkZSBvcGVuKCk6IHZvaWQge1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcblx0XHRzdXBlci5vcGVuKCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVvdXQobWlsbGlzOiBudW1iZXIpOiBDYW5jZWxhYmxlUHJvbWlzZTx2b2lkPjtcbmV4cG9ydCBmdW5jdGlvbiB0aW1lb3V0KG1pbGxpczogbnVtYmVyLCB0b2tlbjogQ2FuY2VsbGF0aW9uVG9rZW4pOiBQcm9taXNlPHZvaWQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWVvdXQobWlsbGlzOiBudW1iZXIsIHRva2VuPzogQ2FuY2VsbGF0aW9uVG9rZW4pOiBDYW5jZWxhYmxlUHJvbWlzZTx2b2lkPiB8IFByb21pc2U8dm9pZD4ge1xuXHRpZiAoIXRva2VuKSB7XG5cdFx0cmV0dXJuIGNyZWF0ZUNhbmNlbGFibGVQcm9taXNlKHRva2VuID0+IHRpbWVvdXQobWlsbGlzLCB0b2tlbikpO1xuXHR9XG5cblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBoYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGRpc3Bvc2FibGUuZGlzcG9zZSgpO1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH0sIG1pbGxpcyk7XG5cdFx0Y29uc3QgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcblx0XHRcdGNsZWFyVGltZW91dChoYW5kbGUpO1xuXHRcdFx0ZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG5cdFx0XHRyZWplY3QobmV3IENhbmNlbGxhdGlvbkVycm9yKCkpO1xuXHRcdH0pO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGltZW91dCB0aGF0IGNhbiBiZSBkaXNwb3NlZCB1c2luZyBpdHMgcmV0dXJuZWQgdmFsdWUuXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgdGltZW91dCBoYW5kbGVyLlxuICogQHBhcmFtIHRpbWVvdXQgQW4gb3B0aW9uYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gc3RvcmUgQW4gb3B0aW9uYWwge0BsaW5rIERpc3Bvc2FibGVTdG9yZX0gdGhhdCB3aWxsIGhhdmUgdGhlIHRpbWVvdXQgZGlzcG9zYWJsZSBtYW5hZ2VkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHN0b3JlID0gbmV3IERpc3Bvc2FibGVTdG9yZTtcbiAqIC8vIENhbGwgdGhlIHRpbWVvdXQgYWZ0ZXIgMTAwMG1zIGF0IHdoaWNoIHBvaW50IGl0IHdpbGwgYmUgYXV0b21hdGljYWxseVxuICogLy8gZXZpY3RlZCBmcm9tIHRoZSBzdG9yZS5cbiAqIGNvbnN0IHRpbWVvdXREaXNwb3NhYmxlID0gZGlzcG9zYWJsZVRpbWVvdXQoKCkgPT4ge30sIDEwMDAsIHN0b3JlKTtcbiAqXG4gKiBpZiAoZm9vKSB7XG4gKiAgIC8vIENhbmNlbCB0aGUgdGltZW91dCBhbmQgZXZpY3QgaXQgZnJvbSBzdG9yZS5cbiAqICAgdGltZW91dERpc3Bvc2FibGUuZGlzcG9zZSgpO1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zYWJsZVRpbWVvdXQoaGFuZGxlcjogKCkgPT4gdm9pZCwgdGltZW91dCA9IDAsIHN0b3JlPzogRGlzcG9zYWJsZVN0b3JlKTogSURpc3Bvc2FibGUge1xuXHRjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdGhhbmRsZXIoKTtcblx0XHRpZiAoc3RvcmUpIHtcblx0XHRcdGRpc3Bvc2FibGUuZGlzcG9zZSgpO1xuXHRcdH1cblx0fSwgdGltZW91dCk7XG5cdGNvbnN0IGRpc3Bvc2FibGUgPSB0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuXHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0c3RvcmU/LmRlbGV0ZUFuZExlYWsoZGlzcG9zYWJsZSk7XG5cdH0pO1xuXHRzdG9yZT8uYWRkKGRpc3Bvc2FibGUpO1xuXHRyZXR1cm4gZGlzcG9zYWJsZTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBwcm92aWRlZCBsaXN0IG9mIHByb21pc2UgZmFjdG9yaWVzIGluIHNlcXVlbnRpYWwgb3JkZXIuIFRoZSByZXR1cm5lZFxuICogcHJvbWlzZSB3aWxsIGNvbXBsZXRlIHRvIGFuIGFycmF5IG9mIHJlc3VsdHMgZnJvbSBlYWNoIHByb21pc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlPFQ+KHByb21pc2VGYWN0b3JpZXM6IElUYXNrPFByb21pc2U8VD4+W10pOiBQcm9taXNlPFRbXT4ge1xuXHRjb25zdCByZXN1bHRzOiBUW10gPSBbXTtcblx0bGV0IGluZGV4ID0gMDtcblx0Y29uc3QgbGVuID0gcHJvbWlzZUZhY3Rvcmllcy5sZW5ndGg7XG5cblx0ZnVuY3Rpb24gbmV4dCgpOiBQcm9taXNlPFQ+IHwgbnVsbCB7XG5cdFx0cmV0dXJuIGluZGV4IDwgbGVuID8gcHJvbWlzZUZhY3Rvcmllc1tpbmRleCsrXSgpIDogbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHRoZW5IYW5kbGVyKHJlc3VsdDogYW55KTogUHJvbWlzZTxhbnk+IHtcblx0XHRpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSBudWxsKSB7XG5cdFx0XHRyZXN1bHRzLnB1c2gocmVzdWx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBuID0gbmV4dCgpO1xuXHRcdGlmIChuKSB7XG5cdFx0XHRyZXR1cm4gbi50aGVuKHRoZW5IYW5kbGVyKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdHMpO1xuXHR9XG5cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKHRoZW5IYW5kbGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0PFQ+KHByb21pc2VGYWN0b3JpZXM6IElUYXNrPFByb21pc2U8VD4+W10sIHNob3VsZFN0b3A6ICh0OiBUKSA9PiBib29sZWFuID0gdCA9PiAhIXQsIGRlZmF1bHRWYWx1ZTogVCB8IG51bGwgPSBudWxsKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuXHRsZXQgaW5kZXggPSAwO1xuXHRjb25zdCBsZW4gPSBwcm9taXNlRmFjdG9yaWVzLmxlbmd0aDtcblxuXHRjb25zdCBsb29wOiAoKSA9PiBQcm9taXNlPFQgfCBudWxsPiA9ICgpID0+IHtcblx0XHRpZiAoaW5kZXggPj0gbGVuKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRlZmF1bHRWYWx1ZSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmFjdG9yeSA9IHByb21pc2VGYWN0b3JpZXNbaW5kZXgrK107XG5cdFx0Y29uc3QgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShmYWN0b3J5KCkpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbihyZXN1bHQgPT4ge1xuXHRcdFx0aWYgKHNob3VsZFN0b3AocmVzdWx0KSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBsb29wKCk7XG5cdFx0fSk7XG5cdH07XG5cblx0cmV0dXJuIGxvb3AoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IHByb21pc2UgdGhhdCBtYXRjaGVzIHRoZSBcInNob3VsZFN0b3BcIixcbiAqIHJ1bm5pbmcgYWxsIHByb21pc2VzIGluIHBhcmFsbGVsLiBTdXBwb3J0cyBjYW5jZWxhYmxlIHByb21pc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3RQYXJhbGxlbDxUPihwcm9taXNlTGlzdDogUHJvbWlzZTxUPltdLCBzaG91bGRTdG9wPzogKHQ6IFQpID0+IGJvb2xlYW4sIGRlZmF1bHRWYWx1ZT86IFQgfCBudWxsKTogUHJvbWlzZTxUIHwgbnVsbD47XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RQYXJhbGxlbDxULCBSIGV4dGVuZHMgVD4ocHJvbWlzZUxpc3Q6IFByb21pc2U8VD5bXSwgc2hvdWxkU3RvcDogKHQ6IFQpID0+IHQgaXMgUiwgZGVmYXVsdFZhbHVlPzogUiB8IG51bGwpOiBQcm9taXNlPFIgfCBudWxsPjtcbmV4cG9ydCBmdW5jdGlvbiBmaXJzdFBhcmFsbGVsPFQ+KHByb21pc2VMaXN0OiBQcm9taXNlPFQ+W10sIHNob3VsZFN0b3A6ICh0OiBUKSA9PiBib29sZWFuID0gdCA9PiAhIXQsIGRlZmF1bHRWYWx1ZTogVCB8IG51bGwgPSBudWxsKSB7XG5cdGlmIChwcm9taXNlTGlzdC5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRlZmF1bHRWYWx1ZSk7XG5cdH1cblxuXHRsZXQgdG9kbyA9IHByb21pc2VMaXN0Lmxlbmd0aDtcblx0Y29uc3QgZmluaXNoID0gKCkgPT4ge1xuXHRcdHRvZG8gPSAtMTtcblx0XHRmb3IgKGNvbnN0IHByb21pc2Ugb2YgcHJvbWlzZUxpc3QpIHtcblx0XHRcdChwcm9taXNlIGFzIFBhcnRpYWw8Q2FuY2VsYWJsZVByb21pc2U8VD4+KS5jYW5jZWw/LigpO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gbmV3IFByb21pc2U8VCB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRmb3IgKGNvbnN0IHByb21pc2Ugb2YgcHJvbWlzZUxpc3QpIHtcblx0XHRcdHByb21pc2UudGhlbihyZXN1bHQgPT4ge1xuXHRcdFx0XHRpZiAoLS10b2RvID49IDAgJiYgc2hvdWxkU3RvcChyZXN1bHQpKSB7XG5cdFx0XHRcdFx0ZmluaXNoKCk7XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRvZG8gPT09IDApIHtcblx0XHRcdFx0XHRyZXNvbHZlKGRlZmF1bHRWYWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChlcnIgPT4ge1xuXHRcdFx0XHRcdGlmICgtLXRvZG8gPj0gMCkge1xuXHRcdFx0XHRcdFx0ZmluaXNoKCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoZXJyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG59XG5cbmludGVyZmFjZSBJTGltaXRlZFRhc2tGYWN0b3J5PFQ+IHtcblx0ZmFjdG9yeTogSVRhc2s8UHJvbWlzZTxUPj47XG5cdGM6ICh2YWx1ZTogVCB8IFByb21pc2U8VD4pID0+IHZvaWQ7XG5cdGU6IChlcnJvcj86IHVua25vd24pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxpbWl0ZXI8VD4ge1xuXG5cdHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuXHRxdWV1ZShmYWN0b3J5OiBJVGFzazxQcm9taXNlPFQ+Pik6IFByb21pc2U8VD47XG5cblx0Y2xlYXIoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB0byBxdWV1ZSBOIHByb21pc2VzIGFuZCBydW4gdGhlbSBhbGwgd2l0aCBhIG1heCBkZWdyZWUgb2YgcGFyYWxsZWxpc20uIFRoZSBoZWxwZXJcbiAqIGVuc3VyZXMgdGhhdCBhdCBhbnkgdGltZSBubyBtb3JlIHRoYW4gTSBwcm9taXNlcyBhcmUgcnVubmluZyBhdCB0aGUgc2FtZSB0aW1lLlxuICovXG5leHBvcnQgY2xhc3MgTGltaXRlcjxUPiBpbXBsZW1lbnRzIElMaW1pdGVyPFQ+IHtcblxuXHRwcml2YXRlIF9zaXplID0gMDtcblx0cHJpdmF0ZSBfaXNEaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHJ1bm5pbmdQcm9taXNlczogbnVtYmVyO1xuXHRwcml2YXRlIHJlYWRvbmx5IG1heERlZ3JlZU9mUGFyYWxlbGxpc206IG51bWJlcjtcblx0cHJpdmF0ZSByZWFkb25seSBvdXRzdGFuZGluZ1Byb21pc2VzOiBJTGltaXRlZFRhc2tGYWN0b3J5PFQ+W107XG5cdHByaXZhdGUgcmVhZG9ubHkgX29uRHJhaW5lZDogRW1pdHRlcjx2b2lkPjtcblxuXHRjb25zdHJ1Y3RvcihtYXhEZWdyZWVPZlBhcmFsZWxsaXNtOiBudW1iZXIpIHtcblx0XHR0aGlzLm1heERlZ3JlZU9mUGFyYWxlbGxpc20gPSBtYXhEZWdyZWVPZlBhcmFsZWxsaXNtO1xuXHRcdHRoaXMub3V0c3RhbmRpbmdQcm9taXNlcyA9IFtdO1xuXHRcdHRoaXMucnVubmluZ1Byb21pc2VzID0gMDtcblx0XHR0aGlzLl9vbkRyYWluZWQgPSBuZXcgRW1pdHRlcjx2b2lkPigpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVkIHdoZW4gYWxsIHdvcmsgaXMgZG9uZSAob25EcmFpbmVkKSBvciB3aGVuXG5cdCAqIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG9cblx0ICovXG5cdHdoZW5JZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLnNpemUgPiAwXG5cdFx0XHQ/IEV2ZW50LnRvUHJvbWlzZSh0aGlzLm9uRHJhaW5lZClcblx0XHRcdDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRnZXQgb25EcmFpbmVkKCk6IEV2ZW50PHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5fb25EcmFpbmVkLmV2ZW50O1xuXHR9XG5cblx0Z2V0IHNpemUoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fc2l6ZTtcblx0fVxuXG5cdHF1ZXVlKGZhY3Rvcnk6IElUYXNrPFByb21pc2U8VD4+KTogUHJvbWlzZTxUPiB7XG5cdFx0aWYgKHRoaXMuX2lzRGlzcG9zZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignT2JqZWN0IGhhcyBiZWVuIGRpc3Bvc2VkJyk7XG5cdFx0fVxuXHRcdHRoaXMuX3NpemUrKztcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTxUPigoYywgZSkgPT4ge1xuXHRcdFx0dGhpcy5vdXRzdGFuZGluZ1Byb21pc2VzLnB1c2goeyBmYWN0b3J5LCBjLCBlIH0pO1xuXHRcdFx0dGhpcy5jb25zdW1lKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbnN1bWUoKTogdm9pZCB7XG5cdFx0d2hpbGUgKHRoaXMub3V0c3RhbmRpbmdQcm9taXNlcy5sZW5ndGggJiYgdGhpcy5ydW5uaW5nUHJvbWlzZXMgPCB0aGlzLm1heERlZ3JlZU9mUGFyYWxlbGxpc20pIHtcblx0XHRcdGNvbnN0IGlMaW1pdGVkVGFzayA9IHRoaXMub3V0c3RhbmRpbmdQcm9taXNlcy5zaGlmdCgpITtcblx0XHRcdHRoaXMucnVubmluZ1Byb21pc2VzKys7XG5cblx0XHRcdGNvbnN0IHByb21pc2UgPSBpTGltaXRlZFRhc2suZmFjdG9yeSgpO1xuXHRcdFx0cHJvbWlzZS50aGVuKGlMaW1pdGVkVGFzay5jLCBpTGltaXRlZFRhc2suZSk7XG5cdFx0XHRwcm9taXNlLnRoZW4oKCkgPT4gdGhpcy5jb25zdW1lZCgpLCAoKSA9PiB0aGlzLmNvbnN1bWVkKCkpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgY29uc3VtZWQoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX2lzRGlzcG9zZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5ydW5uaW5nUHJvbWlzZXMtLTtcblx0XHRpZiAoLS10aGlzLl9zaXplID09PSAwKSB7XG5cdFx0XHR0aGlzLl9vbkRyYWluZWQuZmlyZSgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLm91dHN0YW5kaW5nUHJvbWlzZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5jb25zdW1lKCk7XG5cdFx0fVxuXHR9XG5cblx0Y2xlYXIoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX2lzRGlzcG9zZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignT2JqZWN0IGhhcyBiZWVuIGRpc3Bvc2VkJyk7XG5cdFx0fVxuXHRcdHRoaXMub3V0c3RhbmRpbmdQcm9taXNlcy5sZW5ndGggPSAwO1xuXHRcdHRoaXMuX3NpemUgPSB0aGlzLnJ1bm5pbmdQcm9taXNlcztcblx0fVxuXG5cdGRpc3Bvc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG5cdFx0dGhpcy5vdXRzdGFuZGluZ1Byb21pc2VzLmxlbmd0aCA9IDA7IC8vIHN0b3AgZnVydGhlciBwcm9jZXNzaW5nXG5cdFx0dGhpcy5fc2l6ZSA9IDA7XG5cdFx0dGhpcy5fb25EcmFpbmVkLmRpc3Bvc2UoKTtcblx0fVxufVxuXG4vKipcbiAqIEEgcXVldWUgaXMgaGFuZGxlcyBvbmUgcHJvbWlzZSBhdCBhIHRpbWUgYW5kIGd1YXJhbnRlZXMgdGhhdCBhdCBhbnkgdGltZSBvbmx5IG9uZSBwcm9taXNlIGlzIGV4ZWN1dGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXVlPFQ+IGV4dGVuZHMgTGltaXRlcjxUPiB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoMSk7XG5cdH1cbn1cblxuLyoqXG4gKiBTYW1lIGFzIGBRdWV1ZWAsIGVuc3VyZXMgdGhhdCBvbmx5IDEgdGFzayBpcyBleGVjdXRlZCBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgZGlmZmVyZW5jZSB0byBgUXVldWVgIGlzIHRoYXRcbiAqIHRoZXJlIGlzIG9ubHkgMSB0YXNrIGFib3V0IHRvIGJlIHNjaGVkdWxlZCBuZXh0LiBBcyBzdWNoLCBjYWxsaW5nIGBxdWV1ZWAgd2hpbGUgYSB0YXNrIGlzIGV4ZWN1dGluZyB3aWxsXG4gKiByZXBsYWNlIHRoZSBjdXJyZW50bHkgcXVldWVkIHRhc2sgdW50aWwgaXQgZXhlY3V0ZXMuXG4gKlxuICogQXMgc3VjaCwgdGhlIHJldHVybmVkIHByb21pc2UgbWF5IG5vdCBiZSBmcm9tIHRoZSBmYWN0b3J5IHRoYXQgaXMgcGFzc2VkIGluIGJ1dCBmcm9tIHRoZSBuZXh0IGZhY3RvcnkgdGhhdFxuICogaXMgcnVubmluZyBhZnRlciBoYXZpbmcgY2FsbGVkIGBxdWV1ZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaW1pdGVkUXVldWUge1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgc2VxdWVudGlhbGl6ZXIgPSBuZXcgVGFza1NlcXVlbnRpYWxpemVyKCk7XG5cblx0cHJpdmF0ZSB0YXNrcyA9IDA7XG5cblx0cXVldWUoZmFjdG9yeTogSVRhc2s8UHJvbWlzZTx2b2lkPj4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuc2VxdWVudGlhbGl6ZXIuaXNSdW5uaW5nKCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnNlcXVlbnRpYWxpemVyLnJ1bih0aGlzLnRhc2tzKyssIGZhY3RvcnkoKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuc2VxdWVudGlhbGl6ZXIucXVldWUoKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuc2VxdWVudGlhbGl6ZXIucnVuKHRoaXMudGFza3MrKywgZmFjdG9yeSgpKTtcblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgVGltZW91dFRpbWVyIGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuXHRwcml2YXRlIF90b2tlbjogYW55O1xuXHRwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IoKTtcblx0Y29uc3RydWN0b3IocnVubmVyOiAoKSA9PiB2b2lkLCB0aW1lb3V0OiBudW1iZXIpO1xuXHRjb25zdHJ1Y3RvcihydW5uZXI/OiAoKSA9PiB2b2lkLCB0aW1lb3V0PzogbnVtYmVyKSB7XG5cdFx0dGhpcy5fdG9rZW4gPSAtMTtcblxuXHRcdGlmICh0eXBlb2YgcnVubmVyID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0aW1lb3V0ID09PSAnbnVtYmVyJykge1xuXHRcdFx0dGhpcy5zZXRJZk5vdFNldChydW5uZXIsIHRpbWVvdXQpO1xuXHRcdH1cblx0fVxuXG5cdGRpc3Bvc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5jYW5jZWwoKTtcblx0XHR0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0fVxuXG5cdGNhbmNlbCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fdG9rZW4gIT09IC0xKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fdG9rZW4pO1xuXHRcdFx0dGhpcy5fdG9rZW4gPSAtMTtcblx0XHR9XG5cdH1cblxuXHRjYW5jZWxBbmRTZXQocnVubmVyOiAoKSA9PiB2b2lkLCB0aW1lb3V0OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5faXNEaXNwb3NlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEJ1Z0luZGljYXRpbmdFcnJvcihgQ2FsbGluZyAnY2FuY2VsQW5kU2V0JyBvbiBhIGRpc3Bvc2VkIFRpbWVvdXRUaW1lcmApO1xuXHRcdH1cblxuXHRcdHRoaXMuY2FuY2VsKCk7XG5cdFx0dGhpcy5fdG9rZW4gPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMuX3Rva2VuID0gLTE7XG5cdFx0XHRydW5uZXIoKTtcblx0XHR9LCB0aW1lb3V0KTtcblx0fVxuXG5cdHNldElmTm90U2V0KHJ1bm5lcjogKCkgPT4gdm9pZCwgdGltZW91dDogbnVtYmVyKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX2lzRGlzcG9zZWQpIHtcblx0XHRcdHRocm93IG5ldyBCdWdJbmRpY2F0aW5nRXJyb3IoYENhbGxpbmcgJ3NldElmTm90U2V0JyBvbiBhIGRpc3Bvc2VkIFRpbWVvdXRUaW1lcmApO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl90b2tlbiAhPT0gLTEpIHtcblx0XHRcdC8vIHRpbWVyIGlzIGFscmVhZHkgc2V0XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuX3Rva2VuID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLl90b2tlbiA9IC0xO1xuXHRcdFx0cnVubmVyKCk7XG5cdFx0fSwgdGltZW91dCk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIEludGVydmFsVGltZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG5cblx0cHJpdmF0ZSBkaXNwb3NhYmxlOiBJRGlzcG9zYWJsZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBpc0Rpc3Bvc2VkID0gZmFsc2U7XG5cblx0Y2FuY2VsKCk6IHZvaWQge1xuXHRcdHRoaXMuZGlzcG9zYWJsZT8uZGlzcG9zZSgpO1xuXHRcdHRoaXMuZGlzcG9zYWJsZSA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGNhbmNlbEFuZFNldChydW5uZXI6ICgpID0+IHZvaWQsIGludGVydmFsOiBudW1iZXIsIGNvbnRleHQgPSBnbG9iYWxUaGlzKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEJ1Z0luZGljYXRpbmdFcnJvcihgQ2FsbGluZyAnY2FuY2VsQW5kU2V0JyBvbiBhIGRpc3Bvc2VkIEludGVydmFsVGltZXJgKTtcblx0XHR9XG5cblx0XHR0aGlzLmNhbmNlbCgpO1xuXHRcdGNvbnN0IGhhbmRsZSA9IGNvbnRleHQuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0cnVubmVyKCk7XG5cdFx0fSwgaW50ZXJ2YWwpO1xuXG5cdFx0dGhpcy5kaXNwb3NhYmxlID0gdG9EaXNwb3NhYmxlKCgpID0+IHtcblx0XHRcdGNvbnRleHQuY2xlYXJJbnRlcnZhbChoYW5kbGUpO1xuXHRcdFx0dGhpcy5kaXNwb3NhYmxlID0gdW5kZWZpbmVkO1xuXHRcdH0pO1xuXHR9XG5cblx0ZGlzcG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLmNhbmNlbCgpO1xuXHRcdHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIFJ1bk9uY2VTY2hlZHVsZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG5cblx0cHJvdGVjdGVkIHJ1bm5lcjogKCguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpIHwgbnVsbDtcblxuXHRwcml2YXRlIHRpbWVvdXRUb2tlbjogYW55O1xuXHRwcml2YXRlIHRpbWVvdXQ6IG51bWJlcjtcblx0cHJpdmF0ZSB0aW1lb3V0SGFuZGxlcjogKCkgPT4gdm9pZDtcblxuXHRjb25zdHJ1Y3RvcihydW5uZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCwgZGVsYXk6IG51bWJlcikge1xuXHRcdHRoaXMudGltZW91dFRva2VuID0gLTE7XG5cdFx0dGhpcy5ydW5uZXIgPSBydW5uZXI7XG5cdFx0dGhpcy50aW1lb3V0ID0gZGVsYXk7XG5cdFx0dGhpcy50aW1lb3V0SGFuZGxlciA9IHRoaXMub25UaW1lb3V0LmJpbmQodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzcG9zZSBSdW5PbmNlU2NoZWR1bGVyXG5cdCAqL1xuXHRkaXNwb3NlKCk6IHZvaWQge1xuXHRcdHRoaXMuY2FuY2VsKCk7XG5cdFx0dGhpcy5ydW5uZXIgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbmNlbCBjdXJyZW50IHNjaGVkdWxlZCBydW5uZXIgKGlmIGFueSkuXG5cdCAqL1xuXHRjYW5jZWwoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNTY2hlZHVsZWQoKSkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFRva2VuKTtcblx0XHRcdHRoaXMudGltZW91dFRva2VuID0gLTE7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbmNlbCBwcmV2aW91cyBydW5uZXIgKGlmIGFueSkgJiBzY2hlZHVsZSBhIG5ldyBydW5uZXIuXG5cdCAqL1xuXHRzY2hlZHVsZShkZWxheSA9IHRoaXMudGltZW91dCk6IHZvaWQge1xuXHRcdHRoaXMuY2FuY2VsKCk7XG5cdFx0dGhpcy50aW1lb3V0VG9rZW4gPSBzZXRUaW1lb3V0KHRoaXMudGltZW91dEhhbmRsZXIsIGRlbGF5KTtcblx0fVxuXG5cdGdldCBkZWxheSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLnRpbWVvdXQ7XG5cdH1cblxuXHRzZXQgZGVsYXkodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMudGltZW91dCA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiBzY2hlZHVsZWQuXG5cdCAqL1xuXHRpc1NjaGVkdWxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50aW1lb3V0VG9rZW4gIT09IC0xO1xuXHR9XG5cblx0Zmx1c2goKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNTY2hlZHVsZWQoKSkge1xuXHRcdFx0dGhpcy5jYW5jZWwoKTtcblx0XHRcdHRoaXMuZG9SdW4oKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIG9uVGltZW91dCgpIHtcblx0XHR0aGlzLnRpbWVvdXRUb2tlbiA9IC0xO1xuXHRcdGlmICh0aGlzLnJ1bm5lcikge1xuXHRcdFx0dGhpcy5kb1J1bigpO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBkb1J1bigpOiB2b2lkIHtcblx0XHR0aGlzLnJ1bm5lcj8uKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBTYW1lIGFzIGBSdW5PbmNlU2NoZWR1bGVyYCwgYnV0IGRvZXNuJ3QgY291bnQgdGhlIHRpbWUgc3BlbnQgaW4gc2xlZXAgbW9kZS5cbiAqID4gKipOT1RFKio6IE9ubHkgb2ZmZXJzIDFzIHJlc29sdXRpb24uXG4gKlxuICogV2hlbiBjYWxsaW5nIGBzZXRUaW1lb3V0YCB3aXRoIDNocnMsIGFuZCBwdXR0aW5nIHRoZSBjb21wdXRlciBpbW1lZGlhdGVseSB0byBzbGVlcFxuICogZm9yIDhocnMsIGBzZXRUaW1lb3V0YCB3aWxsIGZpcmUgKiphcyBzb29uIGFzIHRoZSBjb21wdXRlciB3YWtlcyBmcm9tIHNsZWVwKiouIEJ1dFxuICogdGhpcyBzY2hlZHVsZXIgd2lsbCBleGVjdXRlIDNocnMgKiphZnRlciB3YWtpbmcgdGhlIGNvbXB1dGVyIGZyb20gc2xlZXAqKi5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2Nlc3NUaW1lUnVuT25jZVNjaGVkdWxlciB7XG5cblx0cHJpdmF0ZSBydW5uZXI6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG5cdHByaXZhdGUgdGltZW91dDogbnVtYmVyO1xuXG5cdHByaXZhdGUgY291bnRlcjogbnVtYmVyO1xuXHRwcml2YXRlIGludGVydmFsVG9rZW46IGFueTtcblx0cHJpdmF0ZSBpbnRlcnZhbEhhbmRsZXI6ICgpID0+IHZvaWQ7XG5cblx0Y29uc3RydWN0b3IocnVubmVyOiAoKSA9PiB2b2lkLCBkZWxheTogbnVtYmVyKSB7XG5cdFx0aWYgKGRlbGF5ICUgMTAwMCAhPT0gMCkge1xuXHRcdFx0Y29uc29sZS53YXJuKGBQcm9jZXNzVGltZVJ1bk9uY2VTY2hlZHVsZXIgcmVzb2x1dGlvbiBpcyAxcywgJHtkZWxheX1tcyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxMDAwbXMuYCk7XG5cdFx0fVxuXHRcdHRoaXMucnVubmVyID0gcnVubmVyO1xuXHRcdHRoaXMudGltZW91dCA9IGRlbGF5O1xuXHRcdHRoaXMuY291bnRlciA9IDA7XG5cdFx0dGhpcy5pbnRlcnZhbFRva2VuID0gLTE7XG5cdFx0dGhpcy5pbnRlcnZhbEhhbmRsZXIgPSB0aGlzLm9uSW50ZXJ2YWwuYmluZCh0aGlzKTtcblx0fVxuXG5cdGRpc3Bvc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5jYW5jZWwoKTtcblx0XHR0aGlzLnJ1bm5lciA9IG51bGw7XG5cdH1cblxuXHRjYW5jZWwoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNTY2hlZHVsZWQoKSkge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsVG9rZW4pO1xuXHRcdFx0dGhpcy5pbnRlcnZhbFRva2VuID0gLTE7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbmNlbCBwcmV2aW91cyBydW5uZXIgKGlmIGFueSkgJiBzY2hlZHVsZSBhIG5ldyBydW5uZXIuXG5cdCAqL1xuXHRzY2hlZHVsZShkZWxheSA9IHRoaXMudGltZW91dCk6IHZvaWQge1xuXHRcdGlmIChkZWxheSAlIDEwMDAgIT09IDApIHtcblx0XHRcdGNvbnNvbGUud2FybihgUHJvY2Vzc1RpbWVSdW5PbmNlU2NoZWR1bGVyIHJlc29sdXRpb24gaXMgMXMsICR7ZGVsYXl9bXMgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTAwMG1zLmApO1xuXHRcdH1cblx0XHR0aGlzLmNhbmNlbCgpO1xuXHRcdHRoaXMuY291bnRlciA9IE1hdGguY2VpbChkZWxheSAvIDEwMDApO1xuXHRcdHRoaXMuaW50ZXJ2YWxUb2tlbiA9IHNldEludGVydmFsKHRoaXMuaW50ZXJ2YWxIYW5kbGVyLCAxMDAwKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgc2NoZWR1bGVkLlxuXHQgKi9cblx0aXNTY2hlZHVsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJ2YWxUb2tlbiAhPT0gLTE7XG5cdH1cblxuXHRwcml2YXRlIG9uSW50ZXJ2YWwoKSB7XG5cdFx0dGhpcy5jb3VudGVyLS07XG5cdFx0aWYgKHRoaXMuY291bnRlciA+IDApIHtcblx0XHRcdC8vIHN0aWxsIG5lZWQgdG8gd2FpdFxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIHRpbWUgZWxhcHNlZFxuXHRcdGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbFRva2VuKTtcblx0XHR0aGlzLmludGVydmFsVG9rZW4gPSAtMTtcblx0XHR0aGlzLnJ1bm5lcj8uKCk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIFJ1bk9uY2VXb3JrZXI8VD4gZXh0ZW5kcyBSdW5PbmNlU2NoZWR1bGVyIHtcblxuXHRwcml2YXRlIHVuaXRzOiBUW10gPSBbXTtcblxuXHRjb25zdHJ1Y3RvcihydW5uZXI6ICh1bml0czogVFtdKSA9PiB2b2lkLCB0aW1lb3V0OiBudW1iZXIpIHtcblx0XHRzdXBlcihydW5uZXIsIHRpbWVvdXQpO1xuXHR9XG5cblx0d29yayh1bml0OiBUKTogdm9pZCB7XG5cdFx0dGhpcy51bml0cy5wdXNoKHVuaXQpO1xuXG5cdFx0aWYgKCF0aGlzLmlzU2NoZWR1bGVkKCkpIHtcblx0XHRcdHRoaXMuc2NoZWR1bGUoKTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgZG9SdW4oKTogdm9pZCB7XG5cdFx0Y29uc3QgdW5pdHMgPSB0aGlzLnVuaXRzO1xuXHRcdHRoaXMudW5pdHMgPSBbXTtcblxuXHRcdHRoaXMucnVubmVyPy4odW5pdHMpO1xuXHR9XG5cblx0b3ZlcnJpZGUgZGlzcG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLnVuaXRzID0gW107XG5cblx0XHRzdXBlci5kaXNwb3NlKCk7XG5cdH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGhyb3R0bGVkV29ya2VyT3B0aW9ucyB7XG5cblx0LyoqXG5cdCAqIG1heGltdW0gb2YgdW5pdHMgdGhlIHdvcmtlciB3aWxsIHBhc3Mgb250byBoYW5kbGVyIGF0IG9uY2Vcblx0ICovXG5cdG1heFdvcmtDaHVua1NpemU6IG51bWJlcjtcblxuXHQvKipcblx0ICogbWF4aW11bSBvZiB1bml0cyB0aGUgd29ya2VyIHdpbGwga2VlcCBpbiBtZW1vcnkgZm9yIHByb2Nlc3Npbmdcblx0ICovXG5cdG1heEJ1ZmZlcmVkV29yazogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBkZWxheSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbmV4dCByb3VuZCBvZiBjaHVua3Mgd2hlbiBjaHVuayBzaXplIGV4Y2VlZHMgbGltaXRzXG5cdCAqL1xuXHR0aHJvdHRsZURlbGF5OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGBUaHJvdHRsZWRXb3JrZXJgIHdpbGwgYWNjZXB0IHVuaXRzIG9mIHdvcmsgYFRgXG4gKiB0byBoYW5kbGUuIFRoZSBjb250cmFjdCBpczpcbiAqICogdGhlcmUgaXMgYSBtYXhpbXVtIG9mIHVuaXRzIHRoZSB3b3JrZXIgY2FuIGhhbmRsZSBhdCBvbmNlICh2aWEgYG1heFdvcmtDaHVua1NpemVgKVxuICogKiB0aGVyZSBpcyBhIG1heGltdW0gb2YgdW5pdHMgdGhlIHdvcmtlciB3aWxsIGtlZXAgaW4gbWVtb3J5IGZvciBwcm9jZXNzaW5nICh2aWEgYG1heEJ1ZmZlcmVkV29ya2ApXG4gKiAqIGFmdGVyIGhhdmluZyBoYW5kbGVkIGBtYXhXb3JrQ2h1bmtTaXplYCB1bml0cywgdGhlIHdvcmtlciBuZWVkcyB0byByZXN0ICh2aWEgYHRocm90dGxlRGVsYXlgKVxuICovXG5leHBvcnQgY2xhc3MgVGhyb3R0bGVkV29ya2VyPFQ+IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBwZW5kaW5nV29yazogVFtdID0gW107XG5cblx0cHJpdmF0ZSByZWFkb25seSB0aHJvdHRsZXIgPSB0aGlzLl9yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGU8UnVuT25jZVNjaGVkdWxlcj4oKSk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIG9wdGlvbnM6IElUaHJvdHRsZWRXb3JrZXJPcHRpb25zLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcjogKHVuaXRzOiBUW10pID0+IHZvaWRcblx0KSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbnVtYmVyIG9mIHdvcmsgdW5pdHMgdGhhdCBhcmUgcGVuZGluZyB0byBiZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRnZXQgcGVuZGluZygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5wZW5kaW5nV29yay5sZW5ndGg7IH1cblxuXHQvKipcblx0ICogQWRkIHVuaXRzIHRvIGJlIHdvcmtlZCBvbi4gVXNlIGBwZW5kaW5nYCB0byBmaWd1cmUgb3V0XG5cdCAqIGhvdyBtYW55IHVuaXRzIGFyZSBub3QgeWV0IHByb2Nlc3NlZCBhZnRlciB0aGlzIG1ldGhvZFxuXHQgKiB3YXMgY2FsbGVkLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSB3b3JrIHdhcyBhY2NlcHRlZCBvciBub3QuIElmIHRoZVxuXHQgKiB3b3JrZXIgaXMgZGlzcG9zZWQsIGl0IHdpbGwgbm90IGFjY2VwdCBhbnkgbW9yZSB3b3JrLlxuXHQgKiBJZiB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgdW5pdHMgd291bGQgYmVjb21lIGxhcmdlclxuXHQgKiB0aGFuIGBtYXhQZW5kaW5nV29ya2AsIG1vcmUgd29yayB3aWxsIGFsc28gbm90IGJlIGFjY2VwdGVkLlxuXHQgKi9cblx0d29yayh1bml0czogcmVhZG9ubHkgVFtdKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTsgLy8gd29yayBub3QgYWNjZXB0ZWQ6IGRpc3Bvc2VkXG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIHJlYWNoaW5nIG1heGltdW0gb2YgcGVuZGluZyB3b3JrXG5cdFx0aWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubWF4QnVmZmVyZWRXb3JrID09PSAnbnVtYmVyJykge1xuXG5cdFx0XHQvLyBUaHJvdHRsZWQ6IHNpbXBsZSBjaGVjayBpZiBwZW5kaW5nICsgdW5pdHMgZXhjZWVkcyBtYXggcGVuZGluZ1xuXHRcdFx0aWYgKHRoaXMudGhyb3R0bGVyLnZhbHVlKSB7XG5cdFx0XHRcdGlmICh0aGlzLnBlbmRpbmcgKyB1bml0cy5sZW5ndGggPiB0aGlzLm9wdGlvbnMubWF4QnVmZmVyZWRXb3JrKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyB3b3JrIG5vdCBhY2NlcHRlZDogdG9vIG11Y2ggcGVuZGluZyB3b3JrXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVW50aHJvdHRsZWQ6IHNhbWUgYXMgdGhyb3R0bGVkLCBidXQgYWNjb3VudCBmb3IgbWF4IGNodW5rIGdldHRpbmdcblx0XHRcdC8vIHdvcmtlZCBvbiBkaXJlY3RseSB3aXRob3V0IGJlaW5nIHBlbmRpbmdcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZiAodGhpcy5wZW5kaW5nICsgdW5pdHMubGVuZ3RoIC0gdGhpcy5vcHRpb25zLm1heFdvcmtDaHVua1NpemUgPiB0aGlzLm9wdGlvbnMubWF4QnVmZmVyZWRXb3JrKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyB3b3JrIG5vdCBhY2NlcHRlZDogdG9vIG11Y2ggcGVuZGluZyB3b3JrXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdG8gcGVuZGluZyB1bml0cyBmaXJzdFxuXHRcdGZvciAoY29uc3QgdW5pdCBvZiB1bml0cykge1xuXHRcdFx0dGhpcy5wZW5kaW5nV29yay5wdXNoKHVuaXQpO1xuXHRcdH1cblxuXHRcdC8vIElmIG5vdCB0aHJvdHRsZWQsIHN0YXJ0IHdvcmtpbmcgZGlyZWN0bHlcblx0XHQvLyBPdGhlcndpc2UsIHdoZW4gdGhlIHRocm90dGxlIGRlbGF5IGhhc1xuXHRcdC8vIHBhc3QsIHBlbmRpbmcgd29yayB3aWxsIGJlIHdvcmtlZCBhZ2Fpbi5cblx0XHRpZiAoIXRoaXMudGhyb3R0bGVyLnZhbHVlKSB7XG5cdFx0XHR0aGlzLmRvV29yaygpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlOyAvLyB3b3JrIGFjY2VwdGVkXG5cdH1cblxuXHRwcml2YXRlIGRvV29yaygpOiB2b2lkIHtcblxuXHRcdC8vIEV4dHJhY3QgY2h1bmsgdG8gaGFuZGxlIGFuZCBoYW5kbGUgaXRcblx0XHR0aGlzLmhhbmRsZXIodGhpcy5wZW5kaW5nV29yay5zcGxpY2UoMCwgdGhpcy5vcHRpb25zLm1heFdvcmtDaHVua1NpemUpKTtcblxuXHRcdC8vIElmIHdlIGhhdmUgcmVtYWluaW5nIHdvcmssIHNjaGVkdWxlIGl0IGFmdGVyIGEgZGVsYXlcblx0XHRpZiAodGhpcy5wZW5kaW5nV29yay5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aGlzLnRocm90dGxlci52YWx1ZSA9IG5ldyBSdW5PbmNlU2NoZWR1bGVyKCgpID0+IHtcblx0XHRcdFx0dGhpcy50aHJvdHRsZXIuY2xlYXIoKTtcblxuXHRcdFx0XHR0aGlzLmRvV29yaygpO1xuXHRcdFx0fSwgdGhpcy5vcHRpb25zLnRocm90dGxlRGVsYXkpO1xuXHRcdFx0dGhpcy50aHJvdHRsZXIudmFsdWUuc2NoZWR1bGUoKTtcblx0XHR9XG5cdH1cblxuXHRvdmVycmlkZSBkaXNwb3NlKCk6IHZvaWQge1xuXHRcdHN1cGVyLmRpc3Bvc2UoKTtcblxuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHR9XG59XG5cbi8vI3JlZ2lvbiAtLSBydW4gb24gaWRsZSB0cmlja3MgLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRsZURlYWRsaW5lIHtcblx0cmVhZG9ubHkgZGlkVGltZW91dDogYm9vbGVhbjtcblx0dGltZVJlbWFpbmluZygpOiBudW1iZXI7XG59XG5cbnR5cGUgSWRsZUFwaSA9IFBpY2s8dHlwZW9mIGdsb2JhbFRoaXMsICdyZXF1ZXN0SWRsZUNhbGxiYWNrJyB8ICdjYW5jZWxJZGxlQ2FsbGJhY2snPjtcblxuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIGNhbGxiYWNrIHRoZSBuZXh0IHRpbWUgdGhlIGJyb3dzZXIgaXMgaWRsZSwgcmV0dXJuaW5nIGFuXG4gKiB7QGxpbmsgSURpc3Bvc2FibGV9IHRoYXQgd2lsbCBjYW5jZWwgdGhlIGNhbGxiYWNrIHdoZW4gZGlzcG9zZWQuIFRoaXMgd3JhcHNcbiAqIFtyZXF1ZXN0SWRsZUNhbGxiYWNrXSBzbyBpdCB3aWxsIGZhbGxiYWNrIHRvIFtzZXRUaW1lb3V0XSBpZiB0aGUgZW52aXJvbm1lbnRcbiAqIGRvZXNuJ3Qgc3VwcG9ydCBpdC5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJ1biB3aGVuIGlkbGUsIHRoaXMgaW5jbHVkZXMgYW5cbiAqIFtJZGxlRGVhZGxpbmVdIHRoYXQgcHJvdmlkZXMgdGhlIHRpbWUgYWxsb3RlZCBmb3IgdGhlIGlkbGUgY2FsbGJhY2sgYnkgdGhlXG4gKiBicm93c2VyLiBOb3QgcmVzcGVjdGluZyB0aGlzIGRlYWRsaW5lIHdpbGwgcmVzdWx0IGluIGEgZGVncmFkZWQgdXNlclxuICogZXhwZXJpZW5jZS5cbiAqIEBwYXJhbSB0aW1lb3V0IEEgdGltZW91dCBhdCB3aGljaCBwb2ludCB0byBxdWV1ZSBubyBsb25nZXIgd2FpdCBmb3IgYW4gaWRsZVxuICogY2FsbGJhY2sgYnV0IHF1ZXVlIGl0IG9uIHRoZSByZWd1bGFyIGV2ZW50IGxvb3AgKGxpa2Ugc2V0VGltZW91dCkuIFR5cGljYWxseVxuICogdGhpcyBzaG91bGQgbm90IGJlIHVzZWQuXG4gKlxuICogW0lkbGVEZWFkbGluZV06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JZGxlRGVhZGxpbmVcbiAqIFtyZXF1ZXN0SWRsZUNhbGxiYWNrXTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9yZXF1ZXN0SWRsZUNhbGxiYWNrXG4gKiBbc2V0VGltZW91dF06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvc2V0VGltZW91dFxuICpcbiAqICoqTm90ZSoqIHRoYXQgdGhlcmUgaXMgYGRvbS50cyNydW5XaGVuV2luZG93SWRsZWAgd2hpY2ggaXMgYmV0dGVyIHN1aXRlZCB3aGVuIHJ1bm5pbmcgaW5zaWRlIGEgYnJvd3NlclxuICogY29udGV4dFxuICovXG5leHBvcnQgbGV0IHJ1bldoZW5HbG9iYWxJZGxlOiAoY2FsbGJhY2s6IChpZGxlOiBJZGxlRGVhZGxpbmUpID0+IHZvaWQsIHRpbWVvdXQ/OiBudW1iZXIpID0+IElEaXNwb3NhYmxlO1xuXG5leHBvcnQgbGV0IF9ydW5XaGVuSWRsZTogKHRhcmdldFdpbmRvdzogSWRsZUFwaSwgY2FsbGJhY2s6IChpZGxlOiBJZGxlRGVhZGxpbmUpID0+IHZvaWQsIHRpbWVvdXQ/OiBudW1iZXIpID0+IElEaXNwb3NhYmxlO1xuXG4oZnVuY3Rpb24gKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMucmVxdWVzdElkbGVDYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZ2xvYmFsVGhpcy5jYW5jZWxJZGxlQ2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcblx0XHRfcnVuV2hlbklkbGUgPSAoX3RhcmdldFdpbmRvdywgcnVubmVyKSA9PiB7XG5cdFx0XHRzZXRUaW1lb3V0MCgoKSA9PiB7XG5cdFx0XHRcdGlmIChkaXNwb3NlZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBlbmQgPSBEYXRlLm5vdygpICsgMTU7IC8vIG9uZSBmcmFtZSBhdCA2NGZwc1xuXHRcdFx0XHRjb25zdCBkZWFkbGluZTogSWRsZURlYWRsaW5lID0ge1xuXHRcdFx0XHRcdGRpZFRpbWVvdXQ6IHRydWUsXG5cdFx0XHRcdFx0dGltZVJlbWFpbmluZygpIHtcblx0XHRcdFx0XHRcdHJldHVybiBNYXRoLm1heCgwLCBlbmQgLSBEYXRlLm5vdygpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJ1bm5lcihPYmplY3QuZnJlZXplKGRlYWRsaW5lKSk7XG5cdFx0XHR9KTtcblx0XHRcdGxldCBkaXNwb3NlZCA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGlzcG9zZSgpIHtcblx0XHRcdFx0XHRpZiAoZGlzcG9zZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGlzcG9zZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0X3J1bldoZW5JZGxlID0gKHRhcmdldFdpbmRvdzogSWRsZUFwaSwgcnVubmVyLCB0aW1lb3V0PykgPT4ge1xuXHRcdFx0Y29uc3QgaGFuZGxlOiBudW1iZXIgPSB0YXJnZXRXaW5kb3cucmVxdWVzdElkbGVDYWxsYmFjayhydW5uZXIsIHR5cGVvZiB0aW1lb3V0ID09PSAnbnVtYmVyJyA/IHsgdGltZW91dCB9IDogdW5kZWZpbmVkKTtcblx0XHRcdGxldCBkaXNwb3NlZCA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGlzcG9zZSgpIHtcblx0XHRcdFx0XHRpZiAoZGlzcG9zZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGlzcG9zZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHRhcmdldFdpbmRvdy5jYW5jZWxJZGxlQ2FsbGJhY2soaGFuZGxlKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9O1xuXHR9XG5cdHJ1bldoZW5HbG9iYWxJZGxlID0gKHJ1bm5lcikgPT4gX3J1bldoZW5JZGxlKGdsb2JhbFRoaXMsIHJ1bm5lcik7XG59KSgpO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJZGxlVmFsdWU8VD4ge1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dG9yOiAoKSA9PiB2b2lkO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9oYW5kbGU6IElEaXNwb3NhYmxlO1xuXG5cdHByaXZhdGUgX2RpZFJ1bjogYm9vbGVhbiA9IGZhbHNlO1xuXHRwcml2YXRlIF92YWx1ZT86IFQ7XG5cdHByaXZhdGUgX2Vycm9yOiB1bmtub3duO1xuXG5cdGNvbnN0cnVjdG9yKHRhcmdldFdpbmRvdzogSWRsZUFwaSwgZXhlY3V0b3I6ICgpID0+IFQpIHtcblx0XHR0aGlzLl9leGVjdXRvciA9ICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3ZhbHVlID0gZXhlY3V0b3IoKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHR0aGlzLl9lcnJvciA9IGVycjtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdHRoaXMuX2RpZFJ1biA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR0aGlzLl9oYW5kbGUgPSBfcnVuV2hlbklkbGUodGFyZ2V0V2luZG93LCAoKSA9PiB0aGlzLl9leGVjdXRvcigpKTtcblx0fVxuXG5cdGRpc3Bvc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5faGFuZGxlLmRpc3Bvc2UoKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpOiBUIHtcblx0XHRpZiAoIXRoaXMuX2RpZFJ1bikge1xuXHRcdFx0dGhpcy5faGFuZGxlLmRpc3Bvc2UoKTtcblx0XHRcdHRoaXMuX2V4ZWN1dG9yKCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLl9lcnJvcikge1xuXHRcdFx0dGhyb3cgdGhpcy5fZXJyb3I7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl92YWx1ZSE7XG5cdH1cblxuXHRnZXQgaXNJbml0aWFsaXplZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fZGlkUnVuO1xuXHR9XG59XG5cbi8qKlxuICogQW4gYElkbGVWYWx1ZWAgdGhhdCBhbHdheXMgdXNlcyB0aGUgY3VycmVudCB3aW5kb3cgKHdoaWNoIG1pZ2h0IGJlIHRocm90dGxlZCBvciBpbmFjdGl2ZSlcbiAqXG4gKiAqKk5vdGUqKiB0aGF0IHRoZXJlIGlzIGBkb20udHMjV2luZG93SWRsZVZhbHVlYCB3aGljaCBpcyBiZXR0ZXIgc3VpdGVkIHdoZW4gcnVubmluZyBpbnNpZGUgYSBicm93c2VyXG4gKiBjb250ZXh0XG4gKi9cbmV4cG9ydCBjbGFzcyBHbG9iYWxJZGxlVmFsdWU8VD4gZXh0ZW5kcyBBYnN0cmFjdElkbGVWYWx1ZTxUPiB7XG5cblx0Y29uc3RydWN0b3IoZXhlY3V0b3I6ICgpID0+IFQpIHtcblx0XHRzdXBlcihnbG9iYWxUaGlzLCBleGVjdXRvcik7XG5cdH1cbn1cblxuLy8jZW5kcmVnaW9uXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXRyeTxUPih0YXNrOiBJVGFzazxQcm9taXNlPFQ+PiwgZGVsYXk6IG51bWJlciwgcmV0cmllczogbnVtYmVyKTogUHJvbWlzZTxUPiB7XG5cdGxldCBsYXN0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgcmV0cmllczsgaSsrKSB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBhd2FpdCB0YXNrKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGxhc3RFcnJvciA9IGVycm9yO1xuXG5cdFx0XHRhd2FpdCB0aW1lb3V0KGRlbGF5KTtcblx0XHR9XG5cdH1cblxuXHR0aHJvdyBsYXN0RXJyb3I7XG59XG5cbi8vI3JlZ2lvbiBUYXNrIFNlcXVlbnRpYWxpemVyXG5cbmludGVyZmFjZSBJUnVubmluZ1Rhc2sge1xuXHRyZWFkb25seSB0YXNrSWQ6IG51bWJlcjtcblx0cmVhZG9ubHkgY2FuY2VsOiAoKSA9PiB2b2lkO1xuXHRyZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgSVF1ZXVlZFRhc2sge1xuXHRyZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuXHRyZWFkb25seSBwcm9taXNlUmVzb2x2ZTogKCkgPT4gdm9pZDtcblx0cmVhZG9ubHkgcHJvbWlzZVJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcblx0cnVuOiBJVGFzazxQcm9taXNlPHZvaWQ+Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGFza1NlcXVlbnRpYWxpemVyV2l0aFJ1bm5pbmdUYXNrIHtcblx0cmVhZG9ubHkgcnVubmluZzogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGFza1NlcXVlbnRpYWxpemVyV2l0aFF1ZXVlZFRhc2sge1xuXHRyZWFkb25seSBxdWV1ZWQ6IElRdWV1ZWRUYXNrO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgTGltaXRlZFF1ZXVlYCBpbnN0ZWFkIGZvciBhbiBlYXNpZXIgdG8gdXNlIEFQSVxuICovXG5leHBvcnQgY2xhc3MgVGFza1NlcXVlbnRpYWxpemVyIHtcblxuXHRwcml2YXRlIF9ydW5uaW5nPzogSVJ1bm5pbmdUYXNrO1xuXHRwcml2YXRlIF9xdWV1ZWQ/OiBJUXVldWVkVGFzaztcblxuXHRpc1J1bm5pbmcodGFza0lkPzogbnVtYmVyKTogdGhpcyBpcyBJVGFza1NlcXVlbnRpYWxpemVyV2l0aFJ1bm5pbmdUYXNrIHtcblx0XHRpZiAodHlwZW9mIHRhc2tJZCA9PT0gJ251bWJlcicpIHtcblx0XHRcdHJldHVybiB0aGlzLl9ydW5uaW5nPy50YXNrSWQgPT09IHRhc2tJZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gISF0aGlzLl9ydW5uaW5nO1xuXHR9XG5cblx0Z2V0IHJ1bm5pbmcoKTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuX3J1bm5pbmc/LnByb21pc2U7XG5cdH1cblxuXHRjYW5jZWxSdW5uaW5nKCk6IHZvaWQge1xuXHRcdHRoaXMuX3J1bm5pbmc/LmNhbmNlbCgpO1xuXHR9XG5cblx0cnVuKHRhc2tJZDogbnVtYmVyLCBwcm9taXNlOiBQcm9taXNlPHZvaWQ+LCBvbkNhbmNlbD86ICgpID0+IHZvaWQsKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5fcnVubmluZyA9IHsgdGFza0lkLCBjYW5jZWw6ICgpID0+IG9uQ2FuY2VsPy4oKSwgcHJvbWlzZSB9O1xuXG5cdFx0cHJvbWlzZS50aGVuKCgpID0+IHRoaXMuZG9uZVJ1bm5pbmcodGFza0lkKSwgKCkgPT4gdGhpcy5kb25lUnVubmluZyh0YXNrSWQpKTtcblxuXHRcdHJldHVybiBwcm9taXNlO1xuXHR9XG5cblx0cHJpdmF0ZSBkb25lUnVubmluZyh0YXNrSWQ6IG51bWJlcik6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9ydW5uaW5nICYmIHRhc2tJZCA9PT0gdGhpcy5fcnVubmluZy50YXNrSWQpIHtcblxuXHRcdFx0Ly8gb25seSBzZXQgcnVubmluZyB0byBkb25lIGlmIHRoZSBwcm9taXNlIGZpbmlzaGVkIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgdGFza0lkXG5cdFx0XHR0aGlzLl9ydW5uaW5nID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBzY2hlZHVsZSB0aGUgcXVldWVkIHRhc2sgbm93IHRoYXQgd2UgYXJlIGZyZWUgaWYgd2UgaGF2ZSBhbnlcblx0XHRcdHRoaXMucnVuUXVldWVkKCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBydW5RdWV1ZWQoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX3F1ZXVlZCkge1xuXHRcdFx0Y29uc3QgcXVldWVkID0gdGhpcy5fcXVldWVkO1xuXHRcdFx0dGhpcy5fcXVldWVkID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBSdW4gcXVldWVkIHRhc2sgYW5kIGNvbXBsZXRlIG9uIHRoZSBhc3NvY2lhdGVkIHByb21pc2Vcblx0XHRcdHF1ZXVlZC5ydW4oKS50aGVuKHF1ZXVlZC5wcm9taXNlUmVzb2x2ZSwgcXVldWVkLnByb21pc2VSZWplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBOb3RlOiB0aGUgcHJvbWlzZSB0byBzY2hlZHVsZSBhcyBuZXh0IHJ1biBNVVNUIGl0c2VsZiBjYWxsIGBydW5gLlxuXHQgKiAgICAgICBPdGhlcndpc2UsIHRoaXMgc2VxdWVudGlhbGl6ZXIgd2lsbCByZXBvcnQgYGZhbHNlYCBmb3IgYGlzUnVubmluZ2Bcblx0ICogICAgICAgZXZlbiB3aGVuIHRoaXMgdGFzayBpcyBydW5uaW5nLiBNaXNzaW5nIHRoaXMgZGV0YWlsIG1lYW5zIHRoYXRcblx0ICogICAgICAgc3VkZGVubHkgbXVsdGlwbGUgdGFza3Mgd2lsbCBydW4gaW4gcGFyYWxsZWwuXG5cdCAqL1xuXHRxdWV1ZShydW46IElUYXNrPFByb21pc2U8dm9pZD4+KTogUHJvbWlzZTx2b2lkPiB7XG5cblx0XHQvLyB0aGlzIGlzIG91ciBmaXJzdCBxdWV1ZWQgdGFzaywgc28gd2UgY3JlYXRlIGFzc29jaWF0ZWQgcHJvbWlzZSB3aXRoIGl0XG5cdFx0Ly8gc28gdGhhdCB3ZSBjYW4gcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGNvbXBsZXRlcyB3aGVuIHRoZSB0YXNrIGhhc1xuXHRcdC8vIGNvbXBsZXRlZC5cblx0XHRpZiAoIXRoaXMuX3F1ZXVlZCkge1xuXHRcdFx0Y29uc3QgeyBwcm9taXNlLCByZXNvbHZlOiBwcm9taXNlUmVzb2x2ZSwgcmVqZWN0OiBwcm9taXNlUmVqZWN0IH0gPSBwcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPigpO1xuXHRcdFx0dGhpcy5fcXVldWVkID0ge1xuXHRcdFx0XHRydW4sXG5cdFx0XHRcdHByb21pc2UsXG5cdFx0XHRcdHByb21pc2VSZXNvbHZlOiBwcm9taXNlUmVzb2x2ZSEsXG5cdFx0XHRcdHByb21pc2VSZWplY3Q6IHByb21pc2VSZWplY3QhXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgYSBwcmV2aW91cyBxdWV1ZWQgdGFzaywganVzdCBvdmVyd3JpdGUgaXRcblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuX3F1ZXVlZC5ydW4gPSBydW47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX3F1ZXVlZC5wcm9taXNlO1xuXHR9XG5cblx0aGFzUXVldWVkKCk6IHRoaXMgaXMgSVRhc2tTZXF1ZW50aWFsaXplcldpdGhRdWV1ZWRUYXNrIHtcblx0XHRyZXR1cm4gISF0aGlzLl9xdWV1ZWQ7XG5cdH1cblxuXHRhc3luYyBqb2luKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLl9xdWV1ZWQ/LnByb21pc2UgPz8gdGhpcy5fcnVubmluZz8ucHJvbWlzZTtcblx0fVxufVxuXG4vLyNlbmRyZWdpb25cblxuLy8jcmVnaW9uXG5cbi8qKlxuICogVGhlIGBJbnRlcnZhbENvdW50ZXJgIGFsbG93cyB0byBjb3VudCB0aGUgbnVtYmVyXG4gKiBvZiBjYWxscyB0byBgaW5jcmVtZW50KClgIG92ZXIgYSBkdXJhdGlvbiBvZlxuICogYGludGVydmFsYC4gVGhpcyB1dGlsaXR5IGNhbiBiZSB1c2VkIHRvIGNvbmRpdGlvbmFsbHlcbiAqIHRocm90dGxlIGEgZnJlcXVlbnQgdGFzayB3aGVuIGEgY2VydGFpbiB0aHJlc2hvbGRcbiAqIGlzIHJlYWNoZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcnZhbENvdW50ZXIge1xuXG5cdHByaXZhdGUgbGFzdEluY3JlbWVudFRpbWUgPSAwO1xuXG5cdHByaXZhdGUgdmFsdWUgPSAwO1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW50ZXJ2YWw6IG51bWJlciwgcHJpdmF0ZSByZWFkb25seSBub3dGbiA9ICgpID0+IERhdGUubm93KCkpIHsgfVxuXG5cdGluY3JlbWVudCgpOiBudW1iZXIge1xuXHRcdGNvbnN0IG5vdyA9IHRoaXMubm93Rm4oKTtcblxuXHRcdC8vIFdlIGFyZSBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiBgaW50ZXJ2YWxgIGFuZCBhcyBzdWNoXG5cdFx0Ly8gc3RhcnQgY291bnRpbmcgZnJvbSAwIGFuZCByZW1lbWJlciB0aGUgdGltZVxuXHRcdGlmIChub3cgLSB0aGlzLmxhc3RJbmNyZW1lbnRUaW1lID4gdGhpcy5pbnRlcnZhbCkge1xuXHRcdFx0dGhpcy5sYXN0SW5jcmVtZW50VGltZSA9IG5vdztcblx0XHRcdHRoaXMudmFsdWUgPSAwO1xuXHRcdH1cblxuXHRcdHRoaXMudmFsdWUrKztcblxuXHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuXG4vLyNyZWdpb25cblxuZXhwb3J0IHR5cGUgVmFsdWVDYWxsYmFjazxUID0gdW5rbm93bj4gPSAodmFsdWU6IFQgfCBQcm9taXNlPFQ+KSA9PiB2b2lkO1xuXG5jb25zdCBlbnVtIERlZmVycmVkT3V0Y29tZSB7XG5cdFJlc29sdmVkLFxuXHRSZWplY3RlZFxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHdob3NlIHJlc29sdXRpb24gb3IgcmVqZWN0aW9uIGNhbiBiZSBjb250cm9sbGVkIGltcGVyYXRpdmVseS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlZmVycmVkUHJvbWlzZTxUPiB7XG5cblx0cHJpdmF0ZSBjb21wbGV0ZUNhbGxiYWNrITogVmFsdWVDYWxsYmFjazxUPjtcblx0cHJpdmF0ZSBlcnJvckNhbGxiYWNrITogKGVycjogdW5rbm93bikgPT4gdm9pZDtcblx0cHJpdmF0ZSBvdXRjb21lPzogeyBvdXRjb21lOiBEZWZlcnJlZE91dGNvbWUuUmVqZWN0ZWQ7IHZhbHVlOiBhbnkgfSB8IHsgb3V0Y29tZTogRGVmZXJyZWRPdXRjb21lLlJlc29sdmVkOyB2YWx1ZTogVCB9O1xuXG5cdHB1YmxpYyBnZXQgaXNSZWplY3RlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5vdXRjb21lPy5vdXRjb21lID09PSBEZWZlcnJlZE91dGNvbWUuUmVqZWN0ZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGlzUmVzb2x2ZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMub3V0Y29tZT8ub3V0Y29tZSA9PT0gRGVmZXJyZWRPdXRjb21lLlJlc29sdmVkO1xuXHR9XG5cblx0cHVibGljIGdldCBpc1NldHRsZWQoKSB7XG5cdFx0cmV0dXJuICEhdGhpcy5vdXRjb21lO1xuXHR9XG5cblx0cHVibGljIGdldCB2YWx1ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5vdXRjb21lPy5vdXRjb21lID09PSBEZWZlcnJlZE91dGNvbWUuUmVzb2x2ZWQgPyB0aGlzLm91dGNvbWU/LnZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIHJlYWRvbmx5IHA6IFByb21pc2U8VD47XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5wID0gbmV3IFByb21pc2U8VD4oKGMsIGUpID0+IHtcblx0XHRcdHRoaXMuY29tcGxldGVDYWxsYmFjayA9IGM7XG5cdFx0XHR0aGlzLmVycm9yQ2FsbGJhY2sgPSBlO1xuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGNvbXBsZXRlKHZhbHVlOiBUKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuXHRcdFx0dGhpcy5jb21wbGV0ZUNhbGxiYWNrKHZhbHVlKTtcblx0XHRcdHRoaXMub3V0Y29tZSA9IHsgb3V0Y29tZTogRGVmZXJyZWRPdXRjb21lLlJlc29sdmVkLCB2YWx1ZSB9O1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGVycm9yKGVycjogdW5rbm93bikge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcblx0XHRcdHRoaXMuZXJyb3JDYWxsYmFjayhlcnIpO1xuXHRcdFx0dGhpcy5vdXRjb21lID0geyBvdXRjb21lOiBEZWZlcnJlZE91dGNvbWUuUmVqZWN0ZWQsIHZhbHVlOiBlcnIgfTtcblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBjYW5jZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXJyb3IobmV3IENhbmNlbGxhdGlvbkVycm9yKCkpO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuXG4vLyNyZWdpb24gUHJvbWlzZXNcblxuZXhwb3J0IG5hbWVzcGFjZSBQcm9taXNlcyB7XG5cblx0LyoqXG5cdCAqIEEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYFByb21pc2UuYWxsYCB3aXRoIHRoZSBvbmx5IGRpZmZlcmVuY2Vcblx0ICogdGhhdCB0aGUgbWV0aG9kIGF3YWl0cyBldmVyeSBwcm9taXNlIHRvIGVpdGhlciBmdWxmaWxsIG9yIHJlamVjdC5cblx0ICpcblx0ICogU2ltaWxhciB0byBgUHJvbWlzZS5hbGxgLCBvbmx5IHRoZSBmaXJzdCBlcnJvciB3aWxsIGJlIHJldHVybmVkXG5cdCAqIGlmIGFueS5cblx0ICovXG5cdGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR0bGVkPFQ+KHByb21pc2VzOiBQcm9taXNlPFQ+W10pOiBQcm9taXNlPFRbXT4ge1xuXHRcdGxldCBmaXJzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzLm1hcChwcm9taXNlID0+IHByb21pc2UudGhlbih2YWx1ZSA9PiB2YWx1ZSwgZXJyb3IgPT4ge1xuXHRcdFx0aWYgKCFmaXJzdEVycm9yKSB7XG5cdFx0XHRcdGZpcnN0RXJyb3IgPSBlcnJvcjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDsgLy8gZG8gbm90IHJldGhyb3cgc28gdGhhdCBvdGhlciBwcm9taXNlcyBjYW4gc2V0dGxlXG5cdFx0fSkpKTtcblxuXHRcdGlmICh0eXBlb2YgZmlyc3RFcnJvciAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHRocm93IGZpcnN0RXJyb3I7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdCBhcyB1bmtub3duIGFzIFRbXTsgLy8gY2FzdCBpcyBuZWVkZWQgYW5kIHByb3RlY3RlZCBieSB0aGUgYHRocm93YCBhYm92ZVxuXHR9XG5cblx0LyoqXG5cdCAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhIG5ldyBgUHJvbWlzZTxUPmAgd2l0aCBhIGJvZHkgdGhhdCBpcyBhIHByb21pc2Vcblx0ICogaXRzZWxmLiBCeSBkZWZhdWx0LCBhbiBlcnJvciB0aGF0IHJhaXNlcyBmcm9tIHRoZSBhc3luYyBib2R5IHdpbGxcblx0ICogZW5kIHVwIGFzIGEgdW5oYW5kbGVkIHJlamVjdGlvbiwgc28gdGhpcyB1dGlsaXR5IHByb3Blcmx5IGF3YWl0cyB0aGVcblx0ICogYm9keSBhbmQgcmVqZWN0cyB0aGUgcHJvbWlzZSBhcyBhIG5vcm1hbCBwcm9taXNlIGRvZXMgd2l0aG91dCBhc3luY1xuXHQgKiBib2R5LlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGluIHJhcmUgY2FzZXMgd2hlcmUgb3RoZXJ3aXNlIGBhc3luY2Bcblx0ICogY2Fubm90IGJlIHVzZWQgKGUuZy4gd2hlbiBjYWxsYmFja3MgYXJlIGludm9sdmVkIHRoYXQgcmVxdWlyZSB0aGlzKS5cblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiB3aXRoQXN5bmNCb2R5PFQsIEUgPSBFcnJvcj4oYm9keUZuOiAocmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB1bmtub3duLCByZWplY3Q6IChlcnJvcjogRSkgPT4gdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8VD4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPFQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGJvZHlGbihyZXNvbHZlLCByZWplY3QpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgU3RhdGVmdWxQcm9taXNlPFQ+IHtcblx0cHJpdmF0ZSBfdmFsdWU6IFQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdGdldCB2YWx1ZSgpOiBUIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG5cblx0cHJpdmF0ZSBfZXJyb3I6IHVua25vd24gPSB1bmRlZmluZWQ7XG5cdGdldCBlcnJvcigpOiB1bmtub3duIHsgcmV0dXJuIHRoaXMuX2Vycm9yOyB9XG5cblx0cHJpdmF0ZSBfaXNSZXNvbHZlZCA9IGZhbHNlO1xuXHRnZXQgaXNSZXNvbHZlZCgpIHsgcmV0dXJuIHRoaXMuX2lzUmVzb2x2ZWQ7IH1cblxuXHRwdWJsaWMgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTxUPjtcblxuXHRjb25zdHJ1Y3Rvcihwcm9taXNlOiBQcm9taXNlPFQ+KSB7XG5cdFx0dGhpcy5wcm9taXNlID0gcHJvbWlzZS50aGVuKFxuXHRcdFx0dmFsdWUgPT4ge1xuXHRcdFx0XHR0aGlzLl92YWx1ZSA9IHZhbHVlO1xuXHRcdFx0XHR0aGlzLl9pc1Jlc29sdmVkID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdGVycm9yID0+IHtcblx0XHRcdFx0dGhpcy5fZXJyb3IgPSBlcnJvcjtcblx0XHRcdFx0dGhpcy5faXNSZXNvbHZlZCA9IHRydWU7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG5cdCAqIFRocm93cyBpZiB0aGUgcHJvbWlzZSBpcyBub3QgcmVzb2x2ZWQgeWV0LlxuXHQgKi9cblx0cHVibGljIHJlcXVpcmVWYWx1ZSgpOiBUIHtcblx0XHRpZiAoIXRoaXMuX2lzUmVzb2x2ZWQpIHtcblx0XHRcdHRocm93IG5ldyBCdWdJbmRpY2F0aW5nRXJyb3IoJ1Byb21pc2UgaXMgbm90IHJlc29sdmVkIHlldCcpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5fZXJyb3IpIHtcblx0XHRcdHRocm93IHRoaXMuX2Vycm9yO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fdmFsdWUhO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBMYXp5U3RhdGVmdWxQcm9taXNlPFQ+IHtcblx0cHJpdmF0ZSByZWFkb25seSBfcHJvbWlzZSA9IG5ldyBMYXp5KCgpID0+IG5ldyBTdGF0ZWZ1bFByb21pc2UodGhpcy5fY29tcHV0ZSgpKSk7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZWFkb25seSBfY29tcHV0ZTogKCkgPT4gUHJvbWlzZTxUPixcblx0KSB7IH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG5cdCAqIFRocm93cyBpZiB0aGUgcHJvbWlzZSBpcyBub3QgcmVzb2x2ZWQgeWV0LlxuXHQgKi9cblx0cHVibGljIHJlcXVpcmVWYWx1ZSgpOiBUIHtcblx0XHRyZXR1cm4gdGhpcy5fcHJvbWlzZS52YWx1ZS5yZXF1aXJlVmFsdWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIChhbmQgdHJpZ2dlcnMgYSBjb21wdXRhdGlvbiBvZiB0aGUgcHJvbWlzZSBpZiBub3QgeWV0IGRvbmUgc28pLlxuXHQgKi9cblx0cHVibGljIGdldFByb21pc2UoKTogUHJvbWlzZTxUPiB7XG5cdFx0cmV0dXJuIHRoaXMuX3Byb21pc2UudmFsdWUucHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWFkcyB0aGUgY3VycmVudCB2YWx1ZSB3aXRob3V0IHRyaWdnZXJpbmcgYSBjb21wdXRhdGlvbiBvZiB0aGUgcHJvbWlzZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IFQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl9wcm9taXNlLnJhd1ZhbHVlPy52YWx1ZTtcblx0fVxufVxuXG4vLyNlbmRyZWdpb25cblxuLy8jcmVnaW9uXG5cbmNvbnN0IGVudW0gQXN5bmNJdGVyYWJsZVNvdXJjZVN0YXRlIHtcblx0SW5pdGlhbCxcblx0RG9uZU9LLFxuXHREb25lRXJyb3IsXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgYWxsb3dzIHRvIGVtaXQgYXN5bmMgdmFsdWVzIGFzeW5jaHJvbm91c2x5IG9yIGJyaW5nIHRoZSBpdGVyYWJsZSB0byBhbiBlcnJvciBzdGF0ZSB1c2luZyBgcmVqZWN0KClgLlxuICogVGhpcyBlbWl0dGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZXhlY3V0b3IgKHVudGlsIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRvciBzZXR0bGVzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0l0ZXJhYmxlRW1pdHRlcjxUPiB7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgd2lsbCBiZSBhcHBlbmRlZCBhdCB0aGUgZW5kLlxuXHQgKlxuXHQgKiAqKk5PVEUqKiBJZiBgcmVqZWN0KClgIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLCB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LlxuXHQgKi9cblx0ZW1pdE9uZSh2YWx1ZTogVCk6IHZvaWQ7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgYXQgdGhlIGVuZC5cblx0ICpcblx0ICogKipOT1RFKiogSWYgYHJlamVjdCgpYCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCwgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC5cblx0ICovXG5cdGVtaXRNYW55KHZhbHVlczogVFtdKTogdm9pZDtcblx0LyoqXG5cdCAqIFdyaXRpbmcgYW4gZXJyb3Igd2lsbCBwZXJtYW5lbnRseSBpbnZhbGlkYXRlIHRoaXMgaXRlcmFibGUuXG5cdCAqIFRoZSBjdXJyZW50IHVzZXJzIHdpbGwgcmVjZWl2ZSBhbiBlcnJvciB0aHJvd24sIGFzIHdpbGwgYWxsIGZ1dHVyZSB1c2Vycy5cblx0ICpcblx0ICogKipOT1RFKiogSWYgYHJlamVjdCgpYCBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQsIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuXG5cdCAqL1xuXHRyZWplY3QoZXJyb3I6IEVycm9yKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBbiBleGVjdXRvciBmb3IgdGhlIGBBc3luY0l0ZXJhYmxlT2JqZWN0YCB0aGF0IGhhcyBhY2Nlc3MgdG8gYW4gZW1pdHRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0l0ZXJhYmxlRXhlY3V0b3I8VD4ge1xuXHQvKipcblx0ICogQHBhcmFtIGVtaXR0ZXIgQW4gb2JqZWN0IHRoYXQgYWxsb3dzIHRvIGVtaXQgYXN5bmMgdmFsdWVzIHZhbGlkIG9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZXhlY3V0b3IuXG5cdCAqL1xuXHQoZW1pdHRlcjogQXN5bmNJdGVyYWJsZUVtaXR0ZXI8VD4pOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIHJpY2ggaW1wbGVtZW50YXRpb24gZm9yIGFuIGBBc3luY0l0ZXJhYmxlPFQ+YC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jSXRlcmFibGVPYmplY3Q8VD4gaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPFQ+IHtcblxuXHRwdWJsaWMgc3RhdGljIGZyb21BcnJheTxUPihpdGVtczogVFtdKTogQXN5bmNJdGVyYWJsZU9iamVjdDxUPiB7XG5cdFx0cmV0dXJuIG5ldyBBc3luY0l0ZXJhYmxlT2JqZWN0PFQ+KCh3cml0ZXIpID0+IHtcblx0XHRcdHdyaXRlci5lbWl0TWFueShpdGVtcyk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGZyb21Qcm9taXNlPFQ+KHByb21pc2U6IFByb21pc2U8VFtdPik6IEFzeW5jSXRlcmFibGVPYmplY3Q8VD4ge1xuXHRcdHJldHVybiBuZXcgQXN5bmNJdGVyYWJsZU9iamVjdDxUPihhc3luYyAoZW1pdHRlcikgPT4ge1xuXHRcdFx0ZW1pdHRlci5lbWl0TWFueShhd2FpdCBwcm9taXNlKTtcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZnJvbVByb21pc2VzPFQ+KHByb21pc2VzOiBQcm9taXNlPFQ+W10pOiBBc3luY0l0ZXJhYmxlT2JqZWN0PFQ+IHtcblx0XHRyZXR1cm4gbmV3IEFzeW5jSXRlcmFibGVPYmplY3Q8VD4oYXN5bmMgKGVtaXR0ZXIpID0+IHtcblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzLm1hcChhc3luYyAocCkgPT4gZW1pdHRlci5lbWl0T25lKGF3YWl0IHApKSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIG1lcmdlPFQ+KGl0ZXJhYmxlczogQXN5bmNJdGVyYWJsZTxUPltdKTogQXN5bmNJdGVyYWJsZU9iamVjdDxUPiB7XG5cdFx0cmV0dXJuIG5ldyBBc3luY0l0ZXJhYmxlT2JqZWN0KGFzeW5jIChlbWl0dGVyKSA9PiB7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChpdGVyYWJsZXMubWFwKGFzeW5jIChpdGVyYWJsZSkgPT4ge1xuXHRcdFx0XHRmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcblx0XHRcdFx0XHRlbWl0dGVyLmVtaXRPbmUoaXRlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pKTtcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgRU1QVFkgPSBBc3luY0l0ZXJhYmxlT2JqZWN0LmZyb21BcnJheTxhbnk+KFtdKTtcblxuXHRwcml2YXRlIF9zdGF0ZTogQXN5bmNJdGVyYWJsZVNvdXJjZVN0YXRlO1xuXHRwcml2YXRlIF9yZXN1bHRzOiBUW107XG5cdHByaXZhdGUgX2Vycm9yOiBFcnJvciB8IG51bGw7XG5cdHByaXZhdGUgcmVhZG9ubHkgX29uUmV0dXJuPzogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cdHByaXZhdGUgcmVhZG9ubHkgX29uU3RhdGVDaGFuZ2VkOiBFbWl0dGVyPHZvaWQ+O1xuXG5cdGNvbnN0cnVjdG9yKGV4ZWN1dG9yOiBBc3luY0l0ZXJhYmxlRXhlY3V0b3I8VD4sIG9uUmV0dXJuPzogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHtcblx0XHR0aGlzLl9zdGF0ZSA9IEFzeW5jSXRlcmFibGVTb3VyY2VTdGF0ZS5Jbml0aWFsO1xuXHRcdHRoaXMuX3Jlc3VsdHMgPSBbXTtcblx0XHR0aGlzLl9lcnJvciA9IG51bGw7XG5cdFx0dGhpcy5fb25SZXR1cm4gPSBvblJldHVybjtcblx0XHR0aGlzLl9vblN0YXRlQ2hhbmdlZCA9IG5ldyBFbWl0dGVyPHZvaWQ+KCk7XG5cblx0XHRxdWV1ZU1pY3JvdGFzayhhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCB3cml0ZXI6IEFzeW5jSXRlcmFibGVFbWl0dGVyPFQ+ID0ge1xuXHRcdFx0XHRlbWl0T25lOiAoaXRlbSkgPT4gdGhpcy5lbWl0T25lKGl0ZW0pLFxuXHRcdFx0XHRlbWl0TWFueTogKGl0ZW1zKSA9PiB0aGlzLmVtaXRNYW55KGl0ZW1zKSxcblx0XHRcdFx0cmVqZWN0OiAoZXJyb3IpID0+IHRoaXMucmVqZWN0KGVycm9yKVxuXHRcdFx0fTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IFByb21pc2UucmVzb2x2ZShleGVjdXRvcih3cml0ZXIpKTtcblx0XHRcdFx0dGhpcy5yZXNvbHZlKCk7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhpcy5yZWplY3QoZXJyKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdHdyaXRlci5lbWl0T25lID0gdW5kZWZpbmVkITtcblx0XHRcdFx0d3JpdGVyLmVtaXRNYW55ID0gdW5kZWZpbmVkITtcblx0XHRcdFx0d3JpdGVyLnJlamVjdCA9IHVuZGVmaW5lZCE7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmF0b3I8VCwgdW5kZWZpbmVkLCB1bmRlZmluZWQ+IHtcblx0XHRsZXQgaSA9IDA7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5leHQ6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICh0aGlzLl9zdGF0ZSA9PT0gQXN5bmNJdGVyYWJsZVNvdXJjZVN0YXRlLkRvbmVFcnJvcikge1xuXHRcdFx0XHRcdFx0dGhyb3cgdGhpcy5fZXJyb3I7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpIDwgdGhpcy5fcmVzdWx0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdGhpcy5fcmVzdWx0c1tpKytdIH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0aGlzLl9zdGF0ZSA9PT0gQXN5bmNJdGVyYWJsZVNvdXJjZVN0YXRlLkRvbmVPSykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCBFdmVudC50b1Byb21pc2UodGhpcy5fb25TdGF0ZUNoYW5nZWQuZXZlbnQpO1xuXHRcdFx0XHR9IHdoaWxlICh0cnVlKTtcblx0XHRcdH0sXG5cdFx0XHRyZXR1cm46IGFzeW5jICgpID0+IHtcblx0XHRcdFx0dGhpcy5fb25SZXR1cm4/LigpO1xuXHRcdFx0XHRyZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgbWFwPFQsIFI+KGl0ZXJhYmxlOiBBc3luY0l0ZXJhYmxlPFQ+LCBtYXBGbjogKGl0ZW06IFQpID0+IFIpOiBBc3luY0l0ZXJhYmxlT2JqZWN0PFI+IHtcblx0XHRyZXR1cm4gbmV3IEFzeW5jSXRlcmFibGVPYmplY3Q8Uj4oYXN5bmMgKGVtaXR0ZXIpID0+IHtcblx0XHRcdGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBpdGVyYWJsZSkge1xuXHRcdFx0XHRlbWl0dGVyLmVtaXRPbmUobWFwRm4oaXRlbSkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIG1hcDxSPihtYXBGbjogKGl0ZW06IFQpID0+IFIpOiBBc3luY0l0ZXJhYmxlT2JqZWN0PFI+IHtcblx0XHRyZXR1cm4gQXN5bmNJdGVyYWJsZU9iamVjdC5tYXAodGhpcywgbWFwRm4pO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBmaWx0ZXI8VD4oaXRlcmFibGU6IEFzeW5jSXRlcmFibGU8VD4sIGZpbHRlckZuOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IEFzeW5jSXRlcmFibGVPYmplY3Q8VD4ge1xuXHRcdHJldHVybiBuZXcgQXN5bmNJdGVyYWJsZU9iamVjdDxUPihhc3luYyAoZW1pdHRlcikgPT4ge1xuXHRcdFx0Zm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGl0ZXJhYmxlKSB7XG5cdFx0XHRcdGlmIChmaWx0ZXJGbihpdGVtKSkge1xuXHRcdFx0XHRcdGVtaXR0ZXIuZW1pdE9uZShpdGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGZpbHRlcihmaWx0ZXJGbjogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBBc3luY0l0ZXJhYmxlT2JqZWN0PFQ+IHtcblx0XHRyZXR1cm4gQXN5bmNJdGVyYWJsZU9iamVjdC5maWx0ZXIodGhpcywgZmlsdGVyRm4pO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBjb2FsZXNjZTxUPihpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxUIHwgdW5kZWZpbmVkIHwgbnVsbD4pOiBBc3luY0l0ZXJhYmxlT2JqZWN0PFQ+IHtcblx0XHRyZXR1cm4gPEFzeW5jSXRlcmFibGVPYmplY3Q8VD4+QXN5bmNJdGVyYWJsZU9iamVjdC5maWx0ZXIoaXRlcmFibGUsIGl0ZW0gPT4gISFpdGVtKTtcblx0fVxuXG5cdHB1YmxpYyBjb2FsZXNjZSgpOiBBc3luY0l0ZXJhYmxlT2JqZWN0PE5vbk51bGxhYmxlPFQ+PiB7XG5cdFx0cmV0dXJuIEFzeW5jSXRlcmFibGVPYmplY3QuY29hbGVzY2UodGhpcykgYXMgQXN5bmNJdGVyYWJsZU9iamVjdDxOb25OdWxsYWJsZTxUPj47XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGFzeW5jIHRvUHJvbWlzZTxUPihpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxUPik6IFByb21pc2U8VFtdPiB7XG5cdFx0Y29uc3QgcmVzdWx0OiBUW10gPSBbXTtcblx0XHRmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcblx0XHRcdHJlc3VsdC5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIHRvUHJvbWlzZSgpOiBQcm9taXNlPFRbXT4ge1xuXHRcdHJldHVybiBBc3luY0l0ZXJhYmxlT2JqZWN0LnRvUHJvbWlzZSh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgd2lsbCBiZSBhcHBlbmRlZCBhdCB0aGUgZW5kLlxuXHQgKlxuXHQgKiAqKk5PVEUqKiBJZiBgcmVzb2x2ZSgpYCBvciBgcmVqZWN0KClgIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCwgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC5cblx0ICovXG5cdHByaXZhdGUgZW1pdE9uZSh2YWx1ZTogVCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9zdGF0ZSAhPT0gQXN5bmNJdGVyYWJsZVNvdXJjZVN0YXRlLkluaXRpYWwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gaXQgaXMgaW1wb3J0YW50IHRvIGFkZCBuZXcgdmFsdWVzIGF0IHRoZSBlbmQsXG5cdFx0Ly8gYXMgd2UgbWF5IGhhdmUgaXRlcmF0b3JzIGFscmVhZHkgcnVubmluZyBvbiB0aGUgYXJyYXlcblx0XHR0aGlzLl9yZXN1bHRzLnB1c2godmFsdWUpO1xuXHRcdHRoaXMuX29uU3RhdGVDaGFuZ2VkLmZpcmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgYXQgdGhlIGVuZC5cblx0ICpcblx0ICogKipOT1RFKiogSWYgYHJlc29sdmUoKWAgb3IgYHJlamVjdCgpYCBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQsIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuXG5cdCAqL1xuXHRwcml2YXRlIGVtaXRNYW55KHZhbHVlczogVFtdKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX3N0YXRlICE9PSBBc3luY0l0ZXJhYmxlU291cmNlU3RhdGUuSW5pdGlhbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBpdCBpcyBpbXBvcnRhbnQgdG8gYWRkIG5ldyB2YWx1ZXMgYXQgdGhlIGVuZCxcblx0XHQvLyBhcyB3ZSBtYXkgaGF2ZSBpdGVyYXRvcnMgYWxyZWFkeSBydW5uaW5nIG9uIHRoZSBhcnJheVxuXHRcdHRoaXMuX3Jlc3VsdHMgPSB0aGlzLl9yZXN1bHRzLmNvbmNhdCh2YWx1ZXMpO1xuXHRcdHRoaXMuX29uU3RhdGVDaGFuZ2VkLmZpcmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsaW5nIGByZXNvbHZlKClgIHdpbGwgbWFyayB0aGUgcmVzdWx0IGFycmF5IGFzIGNvbXBsZXRlLlxuXHQgKlxuXHQgKiAqKk5PVEUqKiBgcmVzb2x2ZSgpYCBtdXN0IGJlIGNhbGxlZCwgb3RoZXJ3aXNlIGFsbCBjb25zdW1lcnMgb2YgdGhpcyBpdGVyYWJsZSB3aWxsIGhhbmcgaW5kZWZpbml0ZWx5LCBzaW1pbGFyIHRvIGEgbm9uLXJlc29sdmVkIHByb21pc2UuXG5cdCAqICoqTk9URSoqIElmIGByZXNvbHZlKClgIG9yIGByZWplY3QoKWAgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkLCB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LlxuXHQgKi9cblx0cHJpdmF0ZSByZXNvbHZlKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9zdGF0ZSAhPT0gQXN5bmNJdGVyYWJsZVNvdXJjZVN0YXRlLkluaXRpYWwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5fc3RhdGUgPSBBc3luY0l0ZXJhYmxlU291cmNlU3RhdGUuRG9uZU9LO1xuXHRcdHRoaXMuX29uU3RhdGVDaGFuZ2VkLmZpcmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXcml0aW5nIGFuIGVycm9yIHdpbGwgcGVybWFuZW50bHkgaW52YWxpZGF0ZSB0aGlzIGl0ZXJhYmxlLlxuXHQgKiBUaGUgY3VycmVudCB1c2VycyB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgdGhyb3duLCBhcyB3aWxsIGFsbCBmdXR1cmUgdXNlcnMuXG5cdCAqXG5cdCAqICoqTk9URSoqIElmIGByZXNvbHZlKClgIG9yIGByZWplY3QoKWAgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkLCB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LlxuXHQgKi9cblx0cHJpdmF0ZSByZWplY3QoZXJyb3I6IEVycm9yKSB7XG5cdFx0aWYgKHRoaXMuX3N0YXRlICE9PSBBc3luY0l0ZXJhYmxlU291cmNlU3RhdGUuSW5pdGlhbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLl9zdGF0ZSA9IEFzeW5jSXRlcmFibGVTb3VyY2VTdGF0ZS5Eb25lRXJyb3I7XG5cdFx0dGhpcy5fZXJyb3IgPSBlcnJvcjtcblx0XHR0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIENhbmNlbGFibGVBc3luY0l0ZXJhYmxlT2JqZWN0PFQ+IGV4dGVuZHMgQXN5bmNJdGVyYWJsZU9iamVjdDxUPiB7XG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgX3NvdXJjZTogQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UsXG5cdFx0ZXhlY3V0b3I6IEFzeW5jSXRlcmFibGVFeGVjdXRvcjxUPlxuXHQpIHtcblx0XHRzdXBlcihleGVjdXRvcik7XG5cdH1cblxuXHRjYW5jZWwoKTogdm9pZCB7XG5cdFx0dGhpcy5fc291cmNlLmNhbmNlbCgpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYW5jZWxhYmxlQXN5bmNJdGVyYWJsZTxUPihjYWxsYmFjazogKHRva2VuOiBDYW5jZWxsYXRpb25Ub2tlbikgPT4gQXN5bmNJdGVyYWJsZTxUPik6IENhbmNlbGFibGVBc3luY0l0ZXJhYmxlT2JqZWN0PFQ+IHtcblx0Y29uc3Qgc291cmNlID0gbmV3IENhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG5cdGNvbnN0IGlubmVySXRlcmFibGUgPSBjYWxsYmFjayhzb3VyY2UudG9rZW4pO1xuXG5cdHJldHVybiBuZXcgQ2FuY2VsYWJsZUFzeW5jSXRlcmFibGVPYmplY3Q8VD4oc291cmNlLCBhc3luYyAoZW1pdHRlcikgPT4ge1xuXHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHNvdXJjZS50b2tlbi5vbkNhbmNlbGxhdGlvblJlcXVlc3RlZCgoKSA9PiB7XG5cdFx0XHRzdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuXHRcdFx0c291cmNlLmRpc3Bvc2UoKTtcblx0XHRcdGVtaXR0ZXIucmVqZWN0KG5ldyBDYW5jZWxsYXRpb25FcnJvcigpKTtcblx0XHR9KTtcblx0XHR0cnkge1xuXHRcdFx0Zm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGlubmVySXRlcmFibGUpIHtcblx0XHRcdFx0aWYgKHNvdXJjZS50b2tlbi5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkge1xuXHRcdFx0XHRcdC8vIGNhbmNlbGVkIGluIHRoZSBtZWFudGltZVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbWl0dGVyLmVtaXRPbmUoaXRlbSk7XG5cdFx0XHR9XG5cdFx0XHRzdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuXHRcdFx0c291cmNlLmRpc3Bvc2UoKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG5cdFx0XHRzb3VyY2UuZGlzcG9zZSgpO1xuXHRcdFx0ZW1pdHRlci5yZWplY3QoZXJyKTtcblx0XHR9XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNJdGVyYWJsZVNvdXJjZTxUPiB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWRQcm9taXNlPHZvaWQ+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2FzeW5jSXRlcmFibGU6IEFzeW5jSXRlcmFibGVPYmplY3Q8VD47XG5cblx0cHJpdmF0ZSBfZXJyb3JGbjogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcblx0cHJpdmF0ZSBfZW1pdEZuOiAoaXRlbTogVCkgPT4gdm9pZDtcblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIG9uUmV0dXJuIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGNvbnN1bWluZyB0aGUgYXN5bmMgaXRlcmFibGVcblx0ICogaGFzIGZpbmlzaGVkIGJ5IHRoZSBjb25zdW1lciwgZS5nIHRoZSBmb3ItYXdhaXQtbG9vcCBoYXMgYmUgZXhpc3RlZCAoYnJlYWssIHJldHVybikgZWFybHkuXG5cdCAqIFRoaXMgaXMgTk9UIGNhbGxlZCB3aGVuIHJlc29sdmluZyB0aGlzIHNvdXJjZSBieSBpdHMgb3duZXIuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvblJldHVybj86ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKSB7XG5cdFx0dGhpcy5fYXN5bmNJdGVyYWJsZSA9IG5ldyBBc3luY0l0ZXJhYmxlT2JqZWN0KGVtaXR0ZXIgPT4ge1xuXG5cdFx0XHRpZiAoZWFybHlFcnJvcikge1xuXHRcdFx0XHRlbWl0dGVyLnJlamVjdChlYXJseUVycm9yKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGVhcmx5SXRlbXMpIHtcblx0XHRcdFx0ZW1pdHRlci5lbWl0TWFueShlYXJseUl0ZW1zKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2Vycm9yRm4gPSAoZXJyb3I6IEVycm9yKSA9PiBlbWl0dGVyLnJlamVjdChlcnJvcik7XG5cdFx0XHR0aGlzLl9lbWl0Rm4gPSAoaXRlbTogVCkgPT4gZW1pdHRlci5lbWl0T25lKGl0ZW0pO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2RlZmVycmVkLnA7XG5cdFx0fSwgb25SZXR1cm4pO1xuXG5cdFx0bGV0IGVhcmx5RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBlYXJseUl0ZW1zOiBUW10gfCB1bmRlZmluZWQ7XG5cblx0XHR0aGlzLl9lbWl0Rm4gPSAoaXRlbTogVCkgPT4ge1xuXHRcdFx0aWYgKCFlYXJseUl0ZW1zKSB7XG5cdFx0XHRcdGVhcmx5SXRlbXMgPSBbXTtcblx0XHRcdH1cblx0XHRcdGVhcmx5SXRlbXMucHVzaChpdGVtKTtcblx0XHR9O1xuXHRcdHRoaXMuX2Vycm9yRm4gPSAoZXJyb3I6IEVycm9yKSA9PiB7XG5cdFx0XHRpZiAoIWVhcmx5RXJyb3IpIHtcblx0XHRcdFx0ZWFybHlFcnJvciA9IGVycm9yO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRnZXQgYXN5bmNJdGVyYWJsZSgpOiBBc3luY0l0ZXJhYmxlT2JqZWN0PFQ+IHtcblx0XHRyZXR1cm4gdGhpcy5fYXN5bmNJdGVyYWJsZTtcblx0fVxuXG5cdHJlc29sdmUoKTogdm9pZCB7XG5cdFx0dGhpcy5fZGVmZXJyZWQuY29tcGxldGUoKTtcblx0fVxuXG5cdHJlamVjdChlcnJvcjogRXJyb3IpOiB2b2lkIHtcblx0XHR0aGlzLl9lcnJvckZuKGVycm9yKTtcblx0XHR0aGlzLl9kZWZlcnJlZC5jb21wbGV0ZSgpO1xuXHR9XG5cblx0ZW1pdE9uZShpdGVtOiBUKTogdm9pZCB7XG5cdFx0dGhpcy5fZW1pdEZuKGl0ZW0pO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IENoYXJDb2RlIH0gZnJvbSAndnMvYmFzZS9jb21tb24vY2hhckNvZGUnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAndnMvYmFzZS9jb21tb24vdWludCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZhbHN5T3JXaGl0ZXNwYWNlKHN0cjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdGlmICghc3RyIHx8IHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIHN0ci50cmltKCkubGVuZ3RoID09PSAwO1xufVxuXG5jb25zdCBfZm9ybWF0UmVnZXhwID0gL3soXFxkKyl9L2c7XG5cbi8qKlxuICogSGVscGVyIHRvIHByb2R1Y2UgYSBzdHJpbmcgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuIEluc2VydCB2YXJpYWJsZSBzZWdtZW50c1xuICogaW50byB0aGUgc3RyaW5nIHVzaW5nIHRoZSB7bn0gbm90YXRpb24gd2hlcmUgTiBpcyB0aGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IGZvbGxvd2luZyB0aGUgc3RyaW5nLlxuICogQHBhcmFtIHZhbHVlIHN0cmluZyB0byB3aGljaCBmb3JtYXR0aW5nIGlzIGFwcGxpZWRcbiAqIEBwYXJhbSBhcmdzIHJlcGxhY2VtZW50cyBmb3Ige259LWVudHJpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHN0cmluZyB7XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRyZXR1cm4gdmFsdWUucmVwbGFjZShfZm9ybWF0UmVnZXhwLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwKSB7XG5cdFx0Y29uc3QgaWR4ID0gcGFyc2VJbnQoZ3JvdXAsIDEwKTtcblx0XHRyZXR1cm4gaXNOYU4oaWR4KSB8fCBpZHggPCAwIHx8IGlkeCA+PSBhcmdzLmxlbmd0aCA/XG5cdFx0XHRtYXRjaCA6XG5cdFx0XHRhcmdzW2lkeF07XG5cdH0pO1xufVxuXG5jb25zdCBfZm9ybWF0MlJlZ2V4cCA9IC97KFtefV0rKX0vZztcblxuLyoqXG4gKiBIZWxwZXIgdG8gY3JlYXRlIGEgc3RyaW5nIGZyb20gYSB0ZW1wbGF0ZSBhbmQgYSBzdHJpbmcgcmVjb3JkLlxuICogU2ltaWxhciB0byBgZm9ybWF0YCBidXQgd2l0aCBvYmplY3RzIGluc3RlYWQgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXQyKHRlbXBsYXRlOiBzdHJpbmcsIHZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuXHRpZiAoT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gdGVtcGxhdGU7XG5cdH1cblx0cmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoX2Zvcm1hdDJSZWdleHAsIChtYXRjaCwgZ3JvdXApID0+ICh2YWx1ZXNbZ3JvdXBdID8/IG1hdGNoKSBhcyBzdHJpbmcpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIGdpdmVuIHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgbGl0ZXJhbCB2YWx1ZSBpbiBodG1sIGF0dHJpYnV0ZXMuXG4gKlxuICogSW4gb3RoZXIgd29yZHMsIGNvbXB1dGVzIGAkdmFsYCwgc3VjaCB0aGF0IGBhdHRyYCBpbiBgPGRpdiBhdHRyPVwiJHZhbFwiIC8+YCBoYXMgdGhlIHJ1bnRpbWUgdmFsdWUgYHZhbHVlYC5cbiAqIFRoaXMgcHJldmVudHMgWFNTIGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWxBdHRyaWJ1dGVFbmNvZGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHZhbHVlLnJlcGxhY2UoL1s8PlwiJyZdL2csIGNoID0+IHtcblx0XHRzd2l0Y2ggKGNoKSB7XG5cdFx0XHRjYXNlICc8JzogcmV0dXJuICcmbHQ7Jztcblx0XHRcdGNhc2UgJz4nOiByZXR1cm4gJyZndDsnO1xuXHRcdFx0Y2FzZSAnXCInOiByZXR1cm4gJyZxdW90Oyc7XG5cdFx0XHRjYXNlICdcXCcnOiByZXR1cm4gJyZhcG9zOyc7XG5cdFx0XHRjYXNlICcmJzogcmV0dXJuICcmYW1wOyc7XG5cdFx0fVxuXHRcdHJldHVybiBjaDtcblx0fSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgSFRNTCBjaGFyYWN0ZXJzIGluc2lkZSB0aGUgc3RyaW5nIHRvIHVzZSBlbnRpdGllcyBpbnN0ZWFkLiBNYWtlcyB0aGUgc3RyaW5nIHNhZmUgZnJvbVxuICogYmVpbmcgdXNlZCBlLmcuIGluIEhUTUxFbGVtZW50LmlubmVySFRNTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZShodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gaHRtbC5yZXBsYWNlKC9bPD4mXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcblx0XHRzd2l0Y2ggKG1hdGNoKSB7XG5cdFx0XHRjYXNlICc8JzogcmV0dXJuICcmbHQ7Jztcblx0XHRcdGNhc2UgJz4nOiByZXR1cm4gJyZndDsnO1xuXHRcdFx0Y2FzZSAnJic6IHJldHVybiAnJmFtcDsnO1xuXHRcdFx0ZGVmYXVsdDogcmV0dXJuIG1hdGNoO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogRXNjYXBlcyByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVycyBpbiBhIGdpdmVuIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwQ2hhcmFjdGVycyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFxcXFx7XFx9XFwqXFwrXFw/XFx8XFxeXFwkXFwuXFxbXFxdXFwoXFwpXS9nLCAnXFxcXCQmJyk7XG59XG5cbi8qKlxuICogQ291bnRzIGhvdyBvZnRlbiBgc3Vic3RyYCBvY2N1cnMgaW5zaWRlIGB2YWx1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudCh2YWx1ZTogc3RyaW5nLCBzdWJzdHI6IHN0cmluZyk6IG51bWJlciB7XG5cdGxldCByZXN1bHQgPSAwO1xuXHRsZXQgaW5kZXggPSB2YWx1ZS5pbmRleE9mKHN1YnN0cik7XG5cdHdoaWxlIChpbmRleCAhPT0gLTEpIHtcblx0XHRyZXN1bHQrKztcblx0XHRpbmRleCA9IHZhbHVlLmluZGV4T2Yoc3Vic3RyLCBpbmRleCArIHN1YnN0ci5sZW5ndGgpO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZSh2YWx1ZTogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciwgc3VmZml4ID0gJ+KApicpOiBzdHJpbmcge1xuXHRpZiAodmFsdWUubGVuZ3RoIDw9IG1heExlbmd0aCkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHJldHVybiBgJHt2YWx1ZS5zdWJzdHIoMCwgbWF4TGVuZ3RoKX0ke3N1ZmZpeH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVNaWRkbGUodmFsdWU6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIsIHN1ZmZpeCA9ICfigKYnKTogc3RyaW5nIHtcblx0aWYgKHZhbHVlLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHRjb25zdCBwcmVmaXhMZW5ndGggPSBNYXRoLmNlaWwobWF4TGVuZ3RoIC8gMikgLSBzdWZmaXgubGVuZ3RoIC8gMjtcblx0Y29uc3Qgc3VmZml4TGVuZ3RoID0gTWF0aC5mbG9vcihtYXhMZW5ndGggLyAyKSAtIHN1ZmZpeC5sZW5ndGggLyAyO1xuXG5cdHJldHVybiBgJHt2YWx1ZS5zdWJzdHIoMCwgcHJlZml4TGVuZ3RoKX0ke3N1ZmZpeH0ke3ZhbHVlLnN1YnN0cih2YWx1ZS5sZW5ndGggLSBzdWZmaXhMZW5ndGgpfWA7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgb2NjdXJyZW5jZXMgb2YgbmVlZGxlIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGhheXN0YWNrLlxuICogQHBhcmFtIGhheXN0YWNrIHN0cmluZyB0byB0cmltXG4gKiBAcGFyYW0gbmVlZGxlIHRoZSB0aGluZyB0byB0cmltIChkZWZhdWx0IGlzIGEgYmxhbmspXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltKGhheXN0YWNrOiBzdHJpbmcsIG5lZWRsZTogc3RyaW5nID0gJyAnKTogc3RyaW5nIHtcblx0Y29uc3QgdHJpbW1lZCA9IGx0cmltKGhheXN0YWNrLCBuZWVkbGUpO1xuXHRyZXR1cm4gcnRyaW0odHJpbW1lZCwgbmVlZGxlKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBvZiBuZWVkbGUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGhheXN0YWNrLlxuICogQHBhcmFtIGhheXN0YWNrIHN0cmluZyB0byB0cmltXG4gKiBAcGFyYW0gbmVlZGxlIHRoZSB0aGluZyB0byB0cmltXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdHJpbShoYXlzdGFjazogc3RyaW5nLCBuZWVkbGU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICghaGF5c3RhY2sgfHwgIW5lZWRsZSkge1xuXHRcdHJldHVybiBoYXlzdGFjaztcblx0fVxuXG5cdGNvbnN0IG5lZWRsZUxlbiA9IG5lZWRsZS5sZW5ndGg7XG5cdGlmIChuZWVkbGVMZW4gPT09IDAgfHwgaGF5c3RhY2subGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIGhheXN0YWNrO1xuXHR9XG5cblx0bGV0IG9mZnNldCA9IDA7XG5cblx0d2hpbGUgKGhheXN0YWNrLmluZGV4T2YobmVlZGxlLCBvZmZzZXQpID09PSBvZmZzZXQpIHtcblx0XHRvZmZzZXQgPSBvZmZzZXQgKyBuZWVkbGVMZW47XG5cdH1cblx0cmV0dXJuIGhheXN0YWNrLnN1YnN0cmluZyhvZmZzZXQpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIG9jY3VycmVuY2VzIG9mIG5lZWRsZSBmcm9tIHRoZSBlbmQgb2YgaGF5c3RhY2suXG4gKiBAcGFyYW0gaGF5c3RhY2sgc3RyaW5nIHRvIHRyaW1cbiAqIEBwYXJhbSBuZWVkbGUgdGhlIHRoaW5nIHRvIHRyaW1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ0cmltKGhheXN0YWNrOiBzdHJpbmcsIG5lZWRsZTogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKCFoYXlzdGFjayB8fCAhbmVlZGxlKSB7XG5cdFx0cmV0dXJuIGhheXN0YWNrO1xuXHR9XG5cblx0Y29uc3QgbmVlZGxlTGVuID0gbmVlZGxlLmxlbmd0aCxcblx0XHRoYXlzdGFja0xlbiA9IGhheXN0YWNrLmxlbmd0aDtcblxuXHRpZiAobmVlZGxlTGVuID09PSAwIHx8IGhheXN0YWNrTGVuID09PSAwKSB7XG5cdFx0cmV0dXJuIGhheXN0YWNrO1xuXHR9XG5cblx0bGV0IG9mZnNldCA9IGhheXN0YWNrTGVuLFxuXHRcdGlkeCA9IC0xO1xuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0aWR4ID0gaGF5c3RhY2subGFzdEluZGV4T2YobmVlZGxlLCBvZmZzZXQgLSAxKTtcblx0XHRpZiAoaWR4ID09PSAtMSB8fCBpZHggKyBuZWVkbGVMZW4gIT09IG9mZnNldCkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmIChpZHggPT09IDApIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cdFx0b2Zmc2V0ID0gaWR4O1xuXHR9XG5cblx0cmV0dXJuIGhheXN0YWNrLnN1YnN0cmluZygwLCBvZmZzZXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFNpbXBsZTJSZWdFeHBQYXR0ZXJuKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoL1tcXC1cXFxcXFx7XFx9XFwrXFw/XFx8XFxeXFwkXFwuXFwsXFxbXFxdXFwoXFwpXFwjXFxzXS9nLCAnXFxcXCQmJykucmVwbGFjZSgvW1xcKl0vZywgJy4qJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFdpbGRjYXJkcyhwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gcGF0dGVybi5yZXBsYWNlKC9cXCovZywgJycpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ0V4cE9wdGlvbnMge1xuXHRtYXRjaENhc2U/OiBib29sZWFuO1xuXHR3aG9sZVdvcmQ/OiBib29sZWFuO1xuXHRtdWx0aWxpbmU/OiBib29sZWFuO1xuXHRnbG9iYWw/OiBib29sZWFuO1xuXHR1bmljb2RlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZ0V4cChzZWFyY2hTdHJpbmc6IHN0cmluZywgaXNSZWdleDogYm9vbGVhbiwgb3B0aW9uczogUmVnRXhwT3B0aW9ucyA9IHt9KTogUmVnRXhwIHtcblx0aWYgKCFzZWFyY2hTdHJpbmcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgcmVnZXggZnJvbSBlbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoIWlzUmVnZXgpIHtcblx0XHRzZWFyY2hTdHJpbmcgPSBlc2NhcGVSZWdFeHBDaGFyYWN0ZXJzKHNlYXJjaFN0cmluZyk7XG5cdH1cblx0aWYgKG9wdGlvbnMud2hvbGVXb3JkKSB7XG5cdFx0aWYgKCEvXFxCLy50ZXN0KHNlYXJjaFN0cmluZy5jaGFyQXQoMCkpKSB7XG5cdFx0XHRzZWFyY2hTdHJpbmcgPSAnXFxcXGInICsgc2VhcmNoU3RyaW5nO1xuXHRcdH1cblx0XHRpZiAoIS9cXEIvLnRlc3Qoc2VhcmNoU3RyaW5nLmNoYXJBdChzZWFyY2hTdHJpbmcubGVuZ3RoIC0gMSkpKSB7XG5cdFx0XHRzZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmcgKyAnXFxcXGInO1xuXHRcdH1cblx0fVxuXHRsZXQgbW9kaWZpZXJzID0gJyc7XG5cdGlmIChvcHRpb25zLmdsb2JhbCkge1xuXHRcdG1vZGlmaWVycyArPSAnZyc7XG5cdH1cblx0aWYgKCFvcHRpb25zLm1hdGNoQ2FzZSkge1xuXHRcdG1vZGlmaWVycyArPSAnaSc7XG5cdH1cblx0aWYgKG9wdGlvbnMubXVsdGlsaW5lKSB7XG5cdFx0bW9kaWZpZXJzICs9ICdtJztcblx0fVxuXHRpZiAob3B0aW9ucy51bmljb2RlKSB7XG5cdFx0bW9kaWZpZXJzICs9ICd1Jztcblx0fVxuXG5cdHJldHVybiBuZXcgUmVnRXhwKHNlYXJjaFN0cmluZywgbW9kaWZpZXJzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ0V4cExlYWRzVG9FbmRsZXNzTG9vcChyZWdleHA6IFJlZ0V4cCk6IGJvb2xlYW4ge1xuXHQvLyBFeGl0IGVhcmx5IGlmIGl0J3Mgb25lIG9mIHRoZXNlIHNwZWNpYWwgY2FzZXMgd2hpY2ggYXJlIG1lYW50IHRvIG1hdGNoXG5cdC8vIGFnYWluc3QgYW4gZW1wdHkgc3RyaW5nXG5cdGlmIChyZWdleHAuc291cmNlID09PSAnXicgfHwgcmVnZXhwLnNvdXJjZSA9PT0gJ14kJyB8fCByZWdleHAuc291cmNlID09PSAnJCcgfHwgcmVnZXhwLnNvdXJjZSA9PT0gJ15cXFxccyokJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIFdlIGNoZWNrIGFnYWluc3QgYW4gZW1wdHkgc3RyaW5nLiBJZiB0aGUgcmVndWxhciBleHByZXNzaW9uIGRvZXNuJ3QgYWR2YW5jZVxuXHQvLyAoZS5nLiBlbmRzIGluIGFuIGVuZGxlc3MgbG9vcCkgaXQgd2lsbCBtYXRjaCBhbiBlbXB0eSBzdHJpbmcuXG5cdGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWMoJycpO1xuXHRyZXR1cm4gISEobWF0Y2ggJiYgcmVnZXhwLmxhc3RJbmRleCA9PT0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdExpbmVzKHN0cjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRyZXR1cm4gc3RyLnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRMaW5lc0luY2x1ZGVTZXBhcmF0b3JzKHN0cjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBsaW5lc1dpdGhTZXBhcmF0b3JzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBzcGxpdExpbmVzQW5kU2VwYXJhdG9ycyA9IHN0ci5zcGxpdCgvKFxcclxcbnxcXHJ8XFxuKS8pO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguY2VpbChzcGxpdExpbmVzQW5kU2VwYXJhdG9ycy5sZW5ndGggLyAyKTsgaSsrKSB7XG5cdFx0bGluZXNXaXRoU2VwYXJhdG9ycy5wdXNoKHNwbGl0TGluZXNBbmRTZXBhcmF0b3JzWzIgKiBpXSArIChzcGxpdExpbmVzQW5kU2VwYXJhdG9yc1syICogaSArIDFdID8/ICcnKSk7XG5cdH1cblx0cmV0dXJuIGxpbmVzV2l0aFNlcGFyYXRvcnM7XG59XG5cbi8qKlxuICogUmV0dXJucyBmaXJzdCBpbmRleCBvZiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IHdoaXRlc3BhY2UuXG4gKiBJZiBzdHJpbmcgaXMgZW1wdHkgb3IgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlcywgcmV0dXJucyAtMVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3ROb25XaGl0ZXNwYWNlSW5kZXgoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xuXHRmb3IgKGxldCBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0Y29uc3QgY2hDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cdFx0aWYgKGNoQ29kZSAhPT0gQ2hhckNvZGUuU3BhY2UgJiYgY2hDb2RlICE9PSBDaGFyQ29kZS5UYWIpIHtcblx0XHRcdHJldHVybiBpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIG9mIHRoZSBzdHJpbmcuXG4gKiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMsIHJldHVybnMgZW50aXJlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGVhZGluZ1doaXRlc3BhY2Uoc3RyOiBzdHJpbmcsIHN0YXJ0OiBudW1iZXIgPSAwLCBlbmQ6IG51bWJlciA9IHN0ci5sZW5ndGgpOiBzdHJpbmcge1xuXHRmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuXHRcdGNvbnN0IGNoQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXHRcdGlmIChjaENvZGUgIT09IENoYXJDb2RlLlNwYWNlICYmIGNoQ29kZSAhPT0gQ2hhckNvZGUuVGFiKSB7XG5cdFx0XHRyZXR1cm4gc3RyLnN1YnN0cmluZyhzdGFydCwgaSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgbGFzdCBpbmRleCBvZiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IHdoaXRlc3BhY2UuXG4gKiBJZiBzdHJpbmcgaXMgZW1wdHkgb3IgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlcywgcmV0dXJucyAtMVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGFzdE5vbldoaXRlc3BhY2VJbmRleChzdHI6IHN0cmluZywgc3RhcnRJbmRleDogbnVtYmVyID0gc3RyLmxlbmd0aCAtIDEpOiBudW1iZXIge1xuXHRmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA+PSAwOyBpLS0pIHtcblx0XHRjb25zdCBjaENvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcblx0XHRpZiAoY2hDb2RlICE9PSBDaGFyQ29kZS5TcGFjZSAmJiBjaENvZGUgIT09IENoYXJDb2RlLlRhYikge1xuXHRcdFx0cmV0dXJuIGk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IHdvcmtzIGlkZW50aWNhbGx5IHRvIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSwgZXhjZXB0LCB0aGVcbiAqIHJlcGxhY2UgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBiZSBhc3luYyBhbmQgcmV0dXJuIGEgUHJvbWlzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VBc3luYyhzdHI6IHN0cmluZywgc2VhcmNoOiBSZWdFeHAsIHJlcGxhY2VyOiAobWF0Y2g6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IFByb21pc2U8c3RyaW5nPik6IFByb21pc2U8c3RyaW5nPiB7XG5cdGNvbnN0IHBhcnRzOiAoc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+KVtdID0gW107XG5cblx0bGV0IGxhc3QgPSAwO1xuXHRmb3IgKGNvbnN0IG1hdGNoIG9mIHN0ci5tYXRjaEFsbChzZWFyY2gpKSB7XG5cdFx0cGFydHMucHVzaChzdHIuc2xpY2UobGFzdCwgbWF0Y2guaW5kZXgpKTtcblx0XHRpZiAobWF0Y2guaW5kZXggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdtYXRjaC5pbmRleCBzaG91bGQgYmUgZGVmaW5lZCcpO1xuXHRcdH1cblxuXHRcdGxhc3QgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcblx0XHRwYXJ0cy5wdXNoKHJlcGxhY2VyKG1hdGNoWzBdLCAuLi5tYXRjaC5zbGljZSgxKSwgbWF0Y2guaW5kZXgsIHN0ciwgbWF0Y2guZ3JvdXBzKSk7XG5cdH1cblxuXHRwYXJ0cy5wdXNoKHN0ci5zbGljZShsYXN0KSk7XG5cblx0cmV0dXJuIFByb21pc2UuYWxsKHBhcnRzKS50aGVuKHAgPT4gcC5qb2luKCcnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcblx0aWYgKGEgPCBiKSB7XG5cdFx0cmV0dXJuIC0xO1xuXHR9IGVsc2UgaWYgKGEgPiBiKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVTdWJzdHJpbmcoYTogc3RyaW5nLCBiOiBzdHJpbmcsIGFTdGFydDogbnVtYmVyID0gMCwgYUVuZDogbnVtYmVyID0gYS5sZW5ndGgsIGJTdGFydDogbnVtYmVyID0gMCwgYkVuZDogbnVtYmVyID0gYi5sZW5ndGgpOiBudW1iZXIge1xuXHRmb3IgKDsgYVN0YXJ0IDwgYUVuZCAmJiBiU3RhcnQgPCBiRW5kOyBhU3RhcnQrKywgYlN0YXJ0KyspIHtcblx0XHRjb25zdCBjb2RlQSA9IGEuY2hhckNvZGVBdChhU3RhcnQpO1xuXHRcdGNvbnN0IGNvZGVCID0gYi5jaGFyQ29kZUF0KGJTdGFydCk7XG5cdFx0aWYgKGNvZGVBIDwgY29kZUIpIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9IGVsc2UgaWYgKGNvZGVBID4gY29kZUIpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0fVxuXHRjb25zdCBhTGVuID0gYUVuZCAtIGFTdGFydDtcblx0Y29uc3QgYkxlbiA9IGJFbmQgLSBiU3RhcnQ7XG5cdGlmIChhTGVuIDwgYkxlbikge1xuXHRcdHJldHVybiAtMTtcblx0fSBlbHNlIGlmIChhTGVuID4gYkxlbikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cdHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZUlnbm9yZUNhc2UoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuXHRyZXR1cm4gY29tcGFyZVN1YnN0cmluZ0lnbm9yZUNhc2UoYSwgYiwgMCwgYS5sZW5ndGgsIDAsIGIubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVTdWJzdHJpbmdJZ25vcmVDYXNlKGE6IHN0cmluZywgYjogc3RyaW5nLCBhU3RhcnQ6IG51bWJlciA9IDAsIGFFbmQ6IG51bWJlciA9IGEubGVuZ3RoLCBiU3RhcnQ6IG51bWJlciA9IDAsIGJFbmQ6IG51bWJlciA9IGIubGVuZ3RoKTogbnVtYmVyIHtcblxuXHRmb3IgKDsgYVN0YXJ0IDwgYUVuZCAmJiBiU3RhcnQgPCBiRW5kOyBhU3RhcnQrKywgYlN0YXJ0KyspIHtcblxuXHRcdGxldCBjb2RlQSA9IGEuY2hhckNvZGVBdChhU3RhcnQpO1xuXHRcdGxldCBjb2RlQiA9IGIuY2hhckNvZGVBdChiU3RhcnQpO1xuXG5cdFx0aWYgKGNvZGVBID09PSBjb2RlQikge1xuXHRcdFx0Ly8gZXF1YWxcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmIChjb2RlQSA+PSAxMjggfHwgY29kZUIgPj0gMTI4KSB7XG5cdFx0XHQvLyBub3QgQVNDSUkgbGV0dGVycyAtPiBmYWxsYmFjayB0byBsb3dlci1jYXNpbmcgc3RyaW5nc1xuXHRcdFx0cmV0dXJuIGNvbXBhcmVTdWJzdHJpbmcoYS50b0xvd2VyQ2FzZSgpLCBiLnRvTG93ZXJDYXNlKCksIGFTdGFydCwgYUVuZCwgYlN0YXJ0LCBiRW5kKTtcblx0XHR9XG5cblx0XHQvLyBtYXBwZXIgbG93ZXItY2FzZSBhc2NpaSBsZXR0ZXIgb250byB1cHBlci1jYXNlIHZhcmluYXRzXG5cdFx0Ly8gWzk3LTEyMl0gKGxvd2VyIGFzY2lpKSAtLT4gWzY1LTkwXSAodXBwZXIgYXNjaWkpXG5cdFx0aWYgKGlzTG93ZXJBc2NpaUxldHRlcihjb2RlQSkpIHtcblx0XHRcdGNvZGVBIC09IDMyO1xuXHRcdH1cblx0XHRpZiAoaXNMb3dlckFzY2lpTGV0dGVyKGNvZGVCKSkge1xuXHRcdFx0Y29kZUIgLT0gMzI7XG5cdFx0fVxuXG5cdFx0Ly8gY29tcGFyZSBib3RoIGNvZGUgcG9pbnRzXG5cdFx0Y29uc3QgZGlmZiA9IGNvZGVBIC0gY29kZUI7XG5cdFx0aWYgKGRpZmYgPT09IDApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBkaWZmO1xuXHR9XG5cblx0Y29uc3QgYUxlbiA9IGFFbmQgLSBhU3RhcnQ7XG5cdGNvbnN0IGJMZW4gPSBiRW5kIC0gYlN0YXJ0O1xuXG5cdGlmIChhTGVuIDwgYkxlbikge1xuXHRcdHJldHVybiAtMTtcblx0fSBlbHNlIGlmIChhTGVuID4gYkxlbikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FzY2lpRGlnaXQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG5cdHJldHVybiBjb2RlID49IENoYXJDb2RlLkRpZ2l0MCAmJiBjb2RlIDw9IENoYXJDb2RlLkRpZ2l0OTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTG93ZXJBc2NpaUxldHRlcihjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcblx0cmV0dXJuIGNvZGUgPj0gQ2hhckNvZGUuYSAmJiBjb2RlIDw9IENoYXJDb2RlLno7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VwcGVyQXNjaWlMZXR0ZXIoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG5cdHJldHVybiBjb2RlID49IENoYXJDb2RlLkEgJiYgY29kZSA8PSBDaGFyQ29kZS5aO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzSWdub3JlQ2FzZShhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGNvbXBhcmVTdWJzdHJpbmdJZ25vcmVDYXNlKGEsIGIpID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRzV2l0aElnbm9yZUNhc2Uoc3RyOiBzdHJpbmcsIGNhbmRpZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGNvbnN0IGNhbmRpZGF0ZUxlbmd0aCA9IGNhbmRpZGF0ZS5sZW5ndGg7XG5cdGlmIChjYW5kaWRhdGUubGVuZ3RoID4gc3RyLmxlbmd0aCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiBjb21wYXJlU3Vic3RyaW5nSWdub3JlQ2FzZShzdHIsIGNhbmRpZGF0ZSwgMCwgY2FuZGlkYXRlTGVuZ3RoKSA9PT0gMDtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IG9mIHRoZSB0d28gc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1vblByZWZpeExlbmd0aChhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG5cblx0Y29uc3QgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcblx0bGV0IGk6IG51bWJlcjtcblxuXHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRpZiAoYS5jaGFyQ29kZUF0KGkpICE9PSBiLmNoYXJDb2RlQXQoaSkpIHtcblx0XHRcdHJldHVybiBpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBsZW47XG59XG5cbi8qKlxuICogQHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHN1ZmZpeCBvZiB0aGUgdHdvIHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21tb25TdWZmaXhMZW5ndGgoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuXG5cdGNvbnN0IGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG5cdGxldCBpOiBudW1iZXI7XG5cblx0Y29uc3QgYUxhc3RJbmRleCA9IGEubGVuZ3RoIC0gMTtcblx0Y29uc3QgYkxhc3RJbmRleCA9IGIubGVuZ3RoIC0gMTtcblxuXHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRpZiAoYS5jaGFyQ29kZUF0KGFMYXN0SW5kZXggLSBpKSAhPT0gYi5jaGFyQ29kZUF0KGJMYXN0SW5kZXggLSBpKSkge1xuXHRcdFx0cmV0dXJuIGk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGxlbjtcbn1cblxuLyoqXG4gKiBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TdXJyb2dhdGVfcGFpclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNIaWdoU3Vycm9nYXRlKGNoYXJDb2RlOiBudW1iZXIpOiBib29sZWFuIHtcblx0cmV0dXJuICgweEQ4MDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhEQkZGKTtcbn1cblxuLyoqXG4gKiBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TdXJyb2dhdGVfcGFpclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMb3dTdXJyb2dhdGUoY2hhckNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKDB4REMwMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweERGRkYpO1xufVxuXG4vKipcbiAqIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N1cnJvZ2F0ZV9wYWlyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ29kZVBvaW50KGhpZ2hTdXJyb2dhdGU6IG51bWJlciwgbG93U3Vycm9nYXRlOiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gKChoaWdoU3Vycm9nYXRlIC0gMHhEODAwKSA8PCAxMCkgKyAobG93U3Vycm9nYXRlIC0gMHhEQzAwKSArIDB4MTAwMDA7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBjb2RlIHBvaW50IHRoYXQgYmVnaW5zIGF0IG9mZnNldCBgb2Zmc2V0YFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dENvZGVQb2ludChzdHI6IHN0cmluZywgbGVuOiBudW1iZXIsIG9mZnNldDogbnVtYmVyKTogbnVtYmVyIHtcblx0Y29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChvZmZzZXQpO1xuXHRpZiAoaXNIaWdoU3Vycm9nYXRlKGNoYXJDb2RlKSAmJiBvZmZzZXQgKyAxIDwgbGVuKSB7XG5cdFx0Y29uc3QgbmV4dENoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSk7XG5cdFx0aWYgKGlzTG93U3Vycm9nYXRlKG5leHRDaGFyQ29kZSkpIHtcblx0XHRcdHJldHVybiBjb21wdXRlQ29kZVBvaW50KGNoYXJDb2RlLCBuZXh0Q2hhckNvZGUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY2hhckNvZGU7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBjb2RlIHBvaW50IHRoYXQgZW5kcyByaWdodCBiZWZvcmUgb2Zmc2V0IGBvZmZzZXRgXG4gKi9cbmZ1bmN0aW9uIGdldFByZXZDb2RlUG9pbnQoc3RyOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyKTogbnVtYmVyIHtcblx0Y29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChvZmZzZXQgLSAxKTtcblx0aWYgKGlzTG93U3Vycm9nYXRlKGNoYXJDb2RlKSAmJiBvZmZzZXQgPiAxKSB7XG5cdFx0Y29uc3QgcHJldkNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQob2Zmc2V0IC0gMik7XG5cdFx0aWYgKGlzSGlnaFN1cnJvZ2F0ZShwcmV2Q2hhckNvZGUpKSB7XG5cdFx0XHRyZXR1cm4gY29tcHV0ZUNvZGVQb2ludChwcmV2Q2hhckNvZGUsIGNoYXJDb2RlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNoYXJDb2RlO1xufVxuXG5leHBvcnQgY2xhc3MgQ29kZVBvaW50SXRlcmF0b3Ige1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX3N0cjogc3RyaW5nO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9sZW46IG51bWJlcjtcblx0cHJpdmF0ZSBfb2Zmc2V0OiBudW1iZXI7XG5cblx0cHVibGljIGdldCBvZmZzZXQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fb2Zmc2V0O1xuXHR9XG5cblx0Y29uc3RydWN0b3Ioc3RyOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyID0gMCkge1xuXHRcdHRoaXMuX3N0ciA9IHN0cjtcblx0XHR0aGlzLl9sZW4gPSBzdHIubGVuZ3RoO1xuXHRcdHRoaXMuX29mZnNldCA9IG9mZnNldDtcblx0fVxuXG5cdHB1YmxpYyBzZXRPZmZzZXQob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLl9vZmZzZXQgPSBvZmZzZXQ7XG5cdH1cblxuXHRwdWJsaWMgcHJldkNvZGVQb2ludCgpOiBudW1iZXIge1xuXHRcdGNvbnN0IGNvZGVQb2ludCA9IGdldFByZXZDb2RlUG9pbnQodGhpcy5fc3RyLCB0aGlzLl9vZmZzZXQpO1xuXHRcdHRoaXMuX29mZnNldCAtPSAoY29kZVBvaW50ID49IENvbnN0YW50cy5VTklDT0RFX1NVUFBMRU1FTlRBUllfUExBTkVfQkVHSU4gPyAyIDogMSk7XG5cdFx0cmV0dXJuIGNvZGVQb2ludDtcblx0fVxuXG5cdHB1YmxpYyBuZXh0Q29kZVBvaW50KCk6IG51bWJlciB7XG5cdFx0Y29uc3QgY29kZVBvaW50ID0gZ2V0TmV4dENvZGVQb2ludCh0aGlzLl9zdHIsIHRoaXMuX2xlbiwgdGhpcy5fb2Zmc2V0KTtcblx0XHR0aGlzLl9vZmZzZXQgKz0gKGNvZGVQb2ludCA+PSBDb25zdGFudHMuVU5JQ09ERV9TVVBQTEVNRU5UQVJZX1BMQU5FX0JFR0lOID8gMiA6IDEpO1xuXHRcdHJldHVybiBjb2RlUG9pbnQ7XG5cdH1cblxuXHRwdWJsaWMgZW9sKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAodGhpcy5fb2Zmc2V0ID49IHRoaXMuX2xlbik7XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IG5vQnJlYWtXaGl0ZXNwYWNlID0gJ1xceGEwJztcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgKiBhcyBzdHJpbmdzIGZyb20gJ3ZzL2Jhc2UvY29tbW9uL3N0cmluZ3MnO1xuXG4vKipcbiAqIFJldHVybiBhIGhhc2ggdmFsdWUgZm9yIGFuIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2gob2JqOiBhbnkpOiBudW1iZXIge1xuXHRyZXR1cm4gZG9IYXNoKG9iaiwgMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb0hhc2gob2JqOiBhbnksIGhhc2hWYWw6IG51bWJlcik6IG51bWJlciB7XG5cdHN3aXRjaCAodHlwZW9mIG9iaikge1xuXHRcdGNhc2UgJ29iamVjdCc6XG5cdFx0XHRpZiAob2JqID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBudW1iZXJIYXNoKDM0OSwgaGFzaFZhbCk7XG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuXHRcdFx0XHRyZXR1cm4gYXJyYXlIYXNoKG9iaiwgaGFzaFZhbCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb2JqZWN0SGFzaChvYmosIGhhc2hWYWwpO1xuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0XHRyZXR1cm4gc3RyaW5nSGFzaChvYmosIGhhc2hWYWwpO1xuXHRcdGNhc2UgJ2Jvb2xlYW4nOlxuXHRcdFx0cmV0dXJuIGJvb2xlYW5IYXNoKG9iaiwgaGFzaFZhbCk7XG5cdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdHJldHVybiBudW1iZXJIYXNoKG9iaiwgaGFzaFZhbCk7XG5cdFx0Y2FzZSAndW5kZWZpbmVkJzpcblx0XHRcdHJldHVybiBudW1iZXJIYXNoKDkzNywgaGFzaFZhbCk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBudW1iZXJIYXNoKDYxNywgaGFzaFZhbCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckhhc2godmFsOiBudW1iZXIsIGluaXRpYWxIYXNoVmFsOiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gKCgoaW5pdGlhbEhhc2hWYWwgPDwgNSkgLSBpbml0aWFsSGFzaFZhbCkgKyB2YWwpIHwgMDsgIC8vIGhhc2hWYWwgKiAzMSArIGNoLCBrZWVwIGFzIGludDMyXG59XG5cbmZ1bmN0aW9uIGJvb2xlYW5IYXNoKGI6IGJvb2xlYW4sIGluaXRpYWxIYXNoVmFsOiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gbnVtYmVySGFzaChiID8gNDMzIDogODYzLCBpbml0aWFsSGFzaFZhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdIYXNoKHM6IHN0cmluZywgaGFzaFZhbDogbnVtYmVyKSB7XG5cdGhhc2hWYWwgPSBudW1iZXJIYXNoKDE0OTQxNywgaGFzaFZhbCk7XG5cdGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0aGFzaFZhbCA9IG51bWJlckhhc2gocy5jaGFyQ29kZUF0KGkpLCBoYXNoVmFsKTtcblx0fVxuXHRyZXR1cm4gaGFzaFZhbDtcbn1cblxuZnVuY3Rpb24gYXJyYXlIYXNoKGFycjogYW55W10sIGluaXRpYWxIYXNoVmFsOiBudW1iZXIpOiBudW1iZXIge1xuXHRpbml0aWFsSGFzaFZhbCA9IG51bWJlckhhc2goMTA0NTc5LCBpbml0aWFsSGFzaFZhbCk7XG5cdHJldHVybiBhcnIucmVkdWNlKChoYXNoVmFsLCBpdGVtKSA9PiBkb0hhc2goaXRlbSwgaGFzaFZhbCksIGluaXRpYWxIYXNoVmFsKTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0SGFzaChvYmo6IGFueSwgaW5pdGlhbEhhc2hWYWw6IG51bWJlcik6IG51bWJlciB7XG5cdGluaXRpYWxIYXNoVmFsID0gbnVtYmVySGFzaCgxODEzODcsIGluaXRpYWxIYXNoVmFsKTtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG9iaikuc29ydCgpLnJlZHVjZSgoaGFzaFZhbCwga2V5KSA9PiB7XG5cdFx0aGFzaFZhbCA9IHN0cmluZ0hhc2goa2V5LCBoYXNoVmFsKTtcblx0XHRyZXR1cm4gZG9IYXNoKG9ialtrZXldLCBoYXNoVmFsKTtcblx0fSwgaW5pdGlhbEhhc2hWYWwpO1xufVxuXG5leHBvcnQgY2xhc3MgSGFzaGVyIHtcblxuXHRwcml2YXRlIF92YWx1ZSA9IDA7XG5cblx0Z2V0IHZhbHVlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhbHVlO1xuXHR9XG5cblx0aGFzaChvYmo6IGFueSk6IG51bWJlciB7XG5cdFx0dGhpcy5fdmFsdWUgPSBkb0hhc2gob2JqLCB0aGlzLl92YWx1ZSk7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhbHVlO1xuXHR9XG59XG5cbmNvbnN0IGVudW0gU0hBMUNvbnN0YW50IHtcblx0QkxPQ0tfU0laRSA9IDY0LCAvLyA1MTIgLyA4XG5cdFVOSUNPREVfUkVQTEFDRU1FTlQgPSAweEZGRkQsXG59XG5cbmZ1bmN0aW9uIGxlZnRSb3RhdGUodmFsdWU6IG51bWJlciwgYml0czogbnVtYmVyLCB0b3RhbEJpdHM6IG51bWJlciA9IDMyKTogbnVtYmVyIHtcblx0Ly8gZGVsdGEgKyBiaXRzID0gdG90YWxCaXRzXG5cdGNvbnN0IGRlbHRhID0gdG90YWxCaXRzIC0gYml0cztcblxuXHQvLyBBbGwgb25lcywgZXhwZWN0IGBkZWx0YWAgemVyb3MgYWxpZ25lZCB0byB0aGUgcmlnaHRcblx0Y29uc3QgbWFzayA9IH4oKDEgPDwgZGVsdGEpIC0gMSk7XG5cblx0Ly8gSm9pbiAodmFsdWUgbGVmdC1zaGlmdGVkIGBiaXRzYCBiaXRzKSB3aXRoIChtYXNrZWQgdmFsdWUgcmlnaHQtc2hpZnRlZCBgZGVsdGFgIGJpdHMpXG5cdHJldHVybiAoKHZhbHVlIDw8IGJpdHMpIHwgKChtYXNrICYgdmFsdWUpID4+PiBkZWx0YSkpID4+PiAwO1xufVxuXG5mdW5jdGlvbiBmaWxsKGRlc3Q6IFVpbnQ4QXJyYXksIGluZGV4OiBudW1iZXIgPSAwLCBjb3VudDogbnVtYmVyID0gZGVzdC5ieXRlTGVuZ3RoLCB2YWx1ZTogbnVtYmVyID0gMCk6IHZvaWQge1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcblx0XHRkZXN0W2luZGV4ICsgaV0gPSB2YWx1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBsZWZ0UGFkKHZhbHVlOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyLCBjaGFyOiBzdHJpbmcgPSAnMCcpOiBzdHJpbmcge1xuXHR3aGlsZSAodmFsdWUubGVuZ3RoIDwgbGVuZ3RoKSB7XG5cdFx0dmFsdWUgPSBjaGFyICsgdmFsdWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9IZXhTdHJpbmcoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiB0b0hleFN0cmluZyh2YWx1ZTogbnVtYmVyLCBiaXRzaXplPzogbnVtYmVyKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHRvSGV4U3RyaW5nKGJ1ZmZlck9yVmFsdWU6IEFycmF5QnVmZmVyIHwgbnVtYmVyLCBiaXRzaXplOiBudW1iZXIgPSAzMik6IHN0cmluZyB7XG5cdGlmIChidWZmZXJPclZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcblx0XHRyZXR1cm4gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShidWZmZXJPclZhbHVlKSkubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG5cdH1cblxuXHRyZXR1cm4gbGVmdFBhZCgoYnVmZmVyT3JWYWx1ZSA+Pj4gMCkudG9TdHJpbmcoMTYpLCBiaXRzaXplIC8gNCk7XG59XG5cbi8qKlxuICogQSBTSEExIGltcGxlbWVudGF0aW9uIHRoYXQgd29ya3Mgd2l0aCBzdHJpbmdzIGFuZCBkb2VzIG5vdCBhbGxvY2F0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ1NIQTEge1xuXHRwcml2YXRlIHN0YXRpYyBfYmlnQmxvY2szMiA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMzIwKSk7IC8vIDgwICogNCA9IDMyMFxuXG5cdHByaXZhdGUgX2gwID0gMHg2NzQ1MjMwMTtcblx0cHJpdmF0ZSBfaDEgPSAweEVGQ0RBQjg5O1xuXHRwcml2YXRlIF9oMiA9IDB4OThCQURDRkU7XG5cdHByaXZhdGUgX2gzID0gMHgxMDMyNTQ3Njtcblx0cHJpdmF0ZSBfaDQgPSAweEMzRDJFMUYwO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX2J1ZmY6IFVpbnQ4QXJyYXk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZEVjogRGF0YVZpZXc7XG5cdHByaXZhdGUgX2J1ZmZMZW46IG51bWJlcjtcblx0cHJpdmF0ZSBfdG90YWxMZW46IG51bWJlcjtcblx0cHJpdmF0ZSBfbGVmdG92ZXJIaWdoU3Vycm9nYXRlOiBudW1iZXI7XG5cdHByaXZhdGUgX2ZpbmlzaGVkOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuX2J1ZmYgPSBuZXcgVWludDhBcnJheShTSEExQ29uc3RhbnQuQkxPQ0tfU0laRSArIDMgLyogdG8gZml0IGFueSB1dGYtOCAqLyk7XG5cdFx0dGhpcy5fYnVmZkRWID0gbmV3IERhdGFWaWV3KHRoaXMuX2J1ZmYuYnVmZmVyKTtcblx0XHR0aGlzLl9idWZmTGVuID0gMDtcblx0XHR0aGlzLl90b3RhbExlbiA9IDA7XG5cdFx0dGhpcy5fbGVmdG92ZXJIaWdoU3Vycm9nYXRlID0gMDtcblx0XHR0aGlzLl9maW5pc2hlZCA9IGZhbHNlO1xuXHR9XG5cblx0cHVibGljIHVwZGF0ZShzdHI6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHN0ckxlbiA9IHN0ci5sZW5ndGg7XG5cdFx0aWYgKHN0ckxlbiA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJ1ZmYgPSB0aGlzLl9idWZmO1xuXHRcdGxldCBidWZmTGVuID0gdGhpcy5fYnVmZkxlbjtcblx0XHRsZXQgbGVmdG92ZXJIaWdoU3Vycm9nYXRlID0gdGhpcy5fbGVmdG92ZXJIaWdoU3Vycm9nYXRlO1xuXHRcdGxldCBjaGFyQ29kZTogbnVtYmVyO1xuXHRcdGxldCBvZmZzZXQ6IG51bWJlcjtcblxuXHRcdGlmIChsZWZ0b3ZlckhpZ2hTdXJyb2dhdGUgIT09IDApIHtcblx0XHRcdGNoYXJDb2RlID0gbGVmdG92ZXJIaWdoU3Vycm9nYXRlO1xuXHRcdFx0b2Zmc2V0ID0gLTE7XG5cdFx0XHRsZWZ0b3ZlckhpZ2hTdXJyb2dhdGUgPSAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KDApO1xuXHRcdFx0b2Zmc2V0ID0gMDtcblx0XHR9XG5cblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0bGV0IGNvZGVQb2ludCA9IGNoYXJDb2RlO1xuXHRcdFx0aWYgKHN0cmluZ3MuaXNIaWdoU3Vycm9nYXRlKGNoYXJDb2RlKSkge1xuXHRcdFx0XHRpZiAob2Zmc2V0ICsgMSA8IHN0ckxlbikge1xuXHRcdFx0XHRcdGNvbnN0IG5leHRDaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KG9mZnNldCArIDEpO1xuXHRcdFx0XHRcdGlmIChzdHJpbmdzLmlzTG93U3Vycm9nYXRlKG5leHRDaGFyQ29kZSkpIHtcblx0XHRcdFx0XHRcdG9mZnNldCsrO1xuXHRcdFx0XHRcdFx0Y29kZVBvaW50ID0gc3RyaW5ncy5jb21wdXRlQ29kZVBvaW50KGNoYXJDb2RlLCBuZXh0Q2hhckNvZGUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBpbGxlZ2FsID0+IHVuaWNvZGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG5cdFx0XHRcdFx0XHRjb2RlUG9pbnQgPSBTSEExQ29uc3RhbnQuVU5JQ09ERV9SRVBMQUNFTUVOVDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gbGFzdCBjaGFyYWN0ZXIgaXMgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdGxlZnRvdmVySGlnaFN1cnJvZ2F0ZSA9IGNoYXJDb2RlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHN0cmluZ3MuaXNMb3dTdXJyb2dhdGUoY2hhckNvZGUpKSB7XG5cdFx0XHRcdC8vIGlsbGVnYWwgPT4gdW5pY29kZSByZXBsYWNlbWVudCBjaGFyYWN0ZXJcblx0XHRcdFx0Y29kZVBvaW50ID0gU0hBMUNvbnN0YW50LlVOSUNPREVfUkVQTEFDRU1FTlQ7XG5cdFx0XHR9XG5cblx0XHRcdGJ1ZmZMZW4gPSB0aGlzLl9wdXNoKGJ1ZmYsIGJ1ZmZMZW4sIGNvZGVQb2ludCk7XG5cdFx0XHRvZmZzZXQrKztcblx0XHRcdGlmIChvZmZzZXQgPCBzdHJMZW4pIHtcblx0XHRcdFx0Y2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChvZmZzZXQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fYnVmZkxlbiA9IGJ1ZmZMZW47XG5cdFx0dGhpcy5fbGVmdG92ZXJIaWdoU3Vycm9nYXRlID0gbGVmdG92ZXJIaWdoU3Vycm9nYXRlO1xuXHR9XG5cblx0cHJpdmF0ZSBfcHVzaChidWZmOiBVaW50OEFycmF5LCBidWZmTGVuOiBudW1iZXIsIGNvZGVQb2ludDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRpZiAoY29kZVBvaW50IDwgMHgwMDgwKSB7XG5cdFx0XHRidWZmW2J1ZmZMZW4rK10gPSBjb2RlUG9pbnQ7XG5cdFx0fSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDA4MDApIHtcblx0XHRcdGJ1ZmZbYnVmZkxlbisrXSA9IDBiMTEwMDAwMDAgfCAoKGNvZGVQb2ludCAmIDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTEwMDAwMDApID4+PiA2KTtcblx0XHRcdGJ1ZmZbYnVmZkxlbisrXSA9IDBiMTAwMDAwMDAgfCAoKGNvZGVQb2ludCAmIDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEpID4+PiAwKTtcblx0XHR9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcblx0XHRcdGJ1ZmZbYnVmZkxlbisrXSA9IDBiMTExMDAwMDAgfCAoKGNvZGVQb2ludCAmIDBiMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDApID4+PiAxMik7XG5cdFx0XHRidWZmW2J1ZmZMZW4rK10gPSAwYjEwMDAwMDAwIHwgKChjb2RlUG9pbnQgJiAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMDAwMDAwKSA+Pj4gNik7XG5cdFx0XHRidWZmW2J1ZmZMZW4rK10gPSAwYjEwMDAwMDAwIHwgKChjb2RlUG9pbnQgJiAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExKSA+Pj4gMCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJ1ZmZbYnVmZkxlbisrXSA9IDBiMTExMTAwMDAgfCAoKGNvZGVQb2ludCAmIDBiMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDApID4+PiAxOCk7XG5cdFx0XHRidWZmW2J1ZmZMZW4rK10gPSAwYjEwMDAwMDAwIHwgKChjb2RlUG9pbnQgJiAwYjAwMDAwMDAwMDAwMDAwMTExMTExMDAwMDAwMDAwMDAwKSA+Pj4gMTIpO1xuXHRcdFx0YnVmZltidWZmTGVuKytdID0gMGIxMDAwMDAwMCB8ICgoY29kZVBvaW50ICYgMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMCkgPj4+IDYpO1xuXHRcdFx0YnVmZltidWZmTGVuKytdID0gMGIxMDAwMDAwMCB8ICgoY29kZVBvaW50ICYgMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMSkgPj4+IDApO1xuXHRcdH1cblxuXHRcdGlmIChidWZmTGVuID49IFNIQTFDb25zdGFudC5CTE9DS19TSVpFKSB7XG5cdFx0XHR0aGlzLl9zdGVwKCk7XG5cdFx0XHRidWZmTGVuIC09IFNIQTFDb25zdGFudC5CTE9DS19TSVpFO1xuXHRcdFx0dGhpcy5fdG90YWxMZW4gKz0gU0hBMUNvbnN0YW50LkJMT0NLX1NJWkU7XG5cdFx0XHQvLyB0YWtlIGxhc3QgMyBpbiBjYXNlIG9mIFVURjggb3ZlcmZsb3dcblx0XHRcdGJ1ZmZbMF0gPSBidWZmW1NIQTFDb25zdGFudC5CTE9DS19TSVpFICsgMF07XG5cdFx0XHRidWZmWzFdID0gYnVmZltTSEExQ29uc3RhbnQuQkxPQ0tfU0laRSArIDFdO1xuXHRcdFx0YnVmZlsyXSA9IGJ1ZmZbU0hBMUNvbnN0YW50LkJMT0NLX1NJWkUgKyAyXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYnVmZkxlbjtcblx0fVxuXG5cdHB1YmxpYyBkaWdlc3QoKTogc3RyaW5nIHtcblx0XHRpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7XG5cdFx0XHR0aGlzLl9maW5pc2hlZCA9IHRydWU7XG5cdFx0XHRpZiAodGhpcy5fbGVmdG92ZXJIaWdoU3Vycm9nYXRlKSB7XG5cdFx0XHRcdC8vIGlsbGVnYWwgPT4gdW5pY29kZSByZXBsYWNlbWVudCBjaGFyYWN0ZXJcblx0XHRcdFx0dGhpcy5fbGVmdG92ZXJIaWdoU3Vycm9nYXRlID0gMDtcblx0XHRcdFx0dGhpcy5fYnVmZkxlbiA9IHRoaXMuX3B1c2godGhpcy5fYnVmZiwgdGhpcy5fYnVmZkxlbiwgU0hBMUNvbnN0YW50LlVOSUNPREVfUkVQTEFDRU1FTlQpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fdG90YWxMZW4gKz0gdGhpcy5fYnVmZkxlbjtcblx0XHRcdHRoaXMuX3dyYXBVcCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0b0hleFN0cmluZyh0aGlzLl9oMCkgKyB0b0hleFN0cmluZyh0aGlzLl9oMSkgKyB0b0hleFN0cmluZyh0aGlzLl9oMikgKyB0b0hleFN0cmluZyh0aGlzLl9oMykgKyB0b0hleFN0cmluZyh0aGlzLl9oNCk7XG5cdH1cblxuXHRwcml2YXRlIF93cmFwVXAoKTogdm9pZCB7XG5cdFx0dGhpcy5fYnVmZlt0aGlzLl9idWZmTGVuKytdID0gMHg4MDtcblx0XHRmaWxsKHRoaXMuX2J1ZmYsIHRoaXMuX2J1ZmZMZW4pO1xuXG5cdFx0aWYgKHRoaXMuX2J1ZmZMZW4gPiA1Nikge1xuXHRcdFx0dGhpcy5fc3RlcCgpO1xuXHRcdFx0ZmlsbCh0aGlzLl9idWZmKTtcblx0XHR9XG5cblx0XHQvLyB0aGlzIHdpbGwgZml0IGJlY2F1c2UgdGhlIG1hbnRpc3NhIGNhbiBjb3ZlciB1cCB0byA1MiBiaXRzXG5cdFx0Y29uc3QgbWwgPSA4ICogdGhpcy5fdG90YWxMZW47XG5cblx0XHR0aGlzLl9idWZmRFYuc2V0VWludDMyKDU2LCBNYXRoLmZsb29yKG1sIC8gNDI5NDk2NzI5NiksIGZhbHNlKTtcblx0XHR0aGlzLl9idWZmRFYuc2V0VWludDMyKDYwLCBtbCAlIDQyOTQ5NjcyOTYsIGZhbHNlKTtcblxuXHRcdHRoaXMuX3N0ZXAoKTtcblx0fVxuXG5cdHByaXZhdGUgX3N0ZXAoKTogdm9pZCB7XG5cdFx0Y29uc3QgYmlnQmxvY2szMiA9IFN0cmluZ1NIQTEuX2JpZ0Jsb2NrMzI7XG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuX2J1ZmZEVjtcblxuXHRcdGZvciAobGV0IGogPSAwOyBqIDwgNjQgLyogMTYqNCAqLzsgaiArPSA0KSB7XG5cdFx0XHRiaWdCbG9jazMyLnNldFVpbnQzMihqLCBkYXRhLmdldFVpbnQzMihqLCBmYWxzZSksIGZhbHNlKTtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBqID0gNjQ7IGogPCAzMjAgLyogODAqNCAqLzsgaiArPSA0KSB7XG5cdFx0XHRiaWdCbG9jazMyLnNldFVpbnQzMihqLCBsZWZ0Um90YXRlKChiaWdCbG9jazMyLmdldFVpbnQzMihqIC0gMTIsIGZhbHNlKSBeIGJpZ0Jsb2NrMzIuZ2V0VWludDMyKGogLSAzMiwgZmFsc2UpIF4gYmlnQmxvY2szMi5nZXRVaW50MzIoaiAtIDU2LCBmYWxzZSkgXiBiaWdCbG9jazMyLmdldFVpbnQzMihqIC0gNjQsIGZhbHNlKSksIDEpLCBmYWxzZSk7XG5cdFx0fVxuXG5cdFx0bGV0IGEgPSB0aGlzLl9oMDtcblx0XHRsZXQgYiA9IHRoaXMuX2gxO1xuXHRcdGxldCBjID0gdGhpcy5faDI7XG5cdFx0bGV0IGQgPSB0aGlzLl9oMztcblx0XHRsZXQgZSA9IHRoaXMuX2g0O1xuXG5cdFx0bGV0IGY6IG51bWJlciwgazogbnVtYmVyO1xuXHRcdGxldCB0ZW1wOiBudW1iZXI7XG5cblx0XHRmb3IgKGxldCBqID0gMDsgaiA8IDgwOyBqKyspIHtcblx0XHRcdGlmIChqIDwgMjApIHtcblx0XHRcdFx0ZiA9IChiICYgYykgfCAoKH5iKSAmIGQpO1xuXHRcdFx0XHRrID0gMHg1QTgyNzk5OTtcblx0XHRcdH0gZWxzZSBpZiAoaiA8IDQwKSB7XG5cdFx0XHRcdGYgPSBiIF4gYyBeIGQ7XG5cdFx0XHRcdGsgPSAweDZFRDlFQkExO1xuXHRcdFx0fSBlbHNlIGlmIChqIDwgNjApIHtcblx0XHRcdFx0ZiA9IChiICYgYykgfCAoYiAmIGQpIHwgKGMgJiBkKTtcblx0XHRcdFx0ayA9IDB4OEYxQkJDREM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmID0gYiBeIGMgXiBkO1xuXHRcdFx0XHRrID0gMHhDQTYyQzFENjtcblx0XHRcdH1cblxuXHRcdFx0dGVtcCA9IChsZWZ0Um90YXRlKGEsIDUpICsgZiArIGUgKyBrICsgYmlnQmxvY2szMi5nZXRVaW50MzIoaiAqIDQsIGZhbHNlKSkgJiAweGZmZmZmZmZmO1xuXHRcdFx0ZSA9IGQ7XG5cdFx0XHRkID0gYztcblx0XHRcdGMgPSBsZWZ0Um90YXRlKGIsIDMwKTtcblx0XHRcdGIgPSBhO1xuXHRcdFx0YSA9IHRlbXA7XG5cdFx0fVxuXG5cdFx0dGhpcy5faDAgPSAodGhpcy5faDAgKyBhKSAmIDB4ZmZmZmZmZmY7XG5cdFx0dGhpcy5faDEgPSAodGhpcy5faDEgKyBiKSAmIDB4ZmZmZmZmZmY7XG5cdFx0dGhpcy5faDIgPSAodGhpcy5faDIgKyBjKSAmIDB4ZmZmZmZmZmY7XG5cdFx0dGhpcy5faDMgPSAodGhpcy5faDMgKyBkKSAmIDB4ZmZmZmZmZmY7XG5cdFx0dGhpcy5faDQgPSAodGhpcy5faDQgKyBlKSAmIDB4ZmZmZmZmZmY7XG5cdH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgKiBhcyBicm93c2VyIGZyb20gJ3ZzL2Jhc2UvYnJvd3Nlci9icm93c2VyJztcbmltcG9ydCB7IEJyb3dzZXJGZWF0dXJlcyB9IGZyb20gJ3ZzL2Jhc2UvYnJvd3Nlci9jYW5JVXNlJztcbmltcG9ydCB7IElLZXlib2FyZEV2ZW50LCBTdGFuZGFyZEtleWJvYXJkRXZlbnQgfSBmcm9tICd2cy9iYXNlL2Jyb3dzZXIva2V5Ym9hcmRFdmVudCc7XG5pbXBvcnQgeyBJTW91c2VFdmVudCwgU3RhbmRhcmRNb3VzZUV2ZW50IH0gZnJvbSAndnMvYmFzZS9icm93c2VyL21vdXNlRXZlbnQnO1xuaW1wb3J0IHsgQWJzdHJhY3RJZGxlVmFsdWUsIEludGVydmFsVGltZXIsIFRpbWVvdXRUaW1lciwgX3J1bldoZW5JZGxlLCBJZGxlRGVhZGxpbmUgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9hc3luYyc7XG5pbXBvcnQgeyBvblVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgKiBhcyBldmVudCBmcm9tICd2cy9iYXNlL2NvbW1vbi9ldmVudCc7XG5pbXBvcnQgeyBLZXlDb2RlIH0gZnJvbSAndnMvYmFzZS9jb21tb24va2V5Q29kZXMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgRGlzcG9zYWJsZVN0b3JlLCBJRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAndnMvYmFzZS9jb21tb24vbGlmZWN5Y2xlJztcbmltcG9ydCAqIGFzIHBsYXRmb3JtIGZyb20gJ3ZzL2Jhc2UvY29tbW9uL3BsYXRmb3JtJztcbmltcG9ydCB7IGhhc2ggfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9oYXNoJztcbmltcG9ydCB7IENvZGVXaW5kb3csIGVuc3VyZUNvZGVXaW5kb3csIG1haW5XaW5kb3cgfSBmcm9tICd2cy9iYXNlL2Jyb3dzZXIvd2luZG93JztcbmltcG9ydCB7IGlzUG9pbnRXaXRoaW5UcmlhbmdsZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL251bWJlcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWdpc3RlcmVkQ29kZVdpbmRvdyB7XG5cdHJlYWRvbmx5IHdpbmRvdzogQ29kZVdpbmRvdztcblx0cmVhZG9ubHkgZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVTdG9yZTtcbn1cblxuLy8jIHJlZ2lvbiBNdWx0aS1XaW5kb3cgU3VwcG9ydCBVdGlsaXRpZXNcblxuZXhwb3J0IGNvbnN0IHtcblx0cmVnaXN0ZXJXaW5kb3csXG5cdGdldFdpbmRvdyxcblx0Z2V0RG9jdW1lbnQsXG5cdGdldFdpbmRvd3MsXG5cdGdldFdpbmRvd3NDb3VudCxcblx0Z2V0V2luZG93SWQsXG5cdGdldFdpbmRvd0J5SWQsXG5cdGhhc1dpbmRvdyxcblx0b25EaWRSZWdpc3RlcldpbmRvdyxcblx0b25XaWxsVW5yZWdpc3RlcldpbmRvdyxcblx0b25EaWRVbnJlZ2lzdGVyV2luZG93XG59ID0gKGZ1bmN0aW9uICgpIHtcblx0Y29uc3Qgd2luZG93cyA9IG5ldyBNYXA8bnVtYmVyLCBJUmVnaXN0ZXJlZENvZGVXaW5kb3c+KCk7XG5cblx0ZW5zdXJlQ29kZVdpbmRvdyhtYWluV2luZG93LCAxKTtcblx0Y29uc3QgbWFpbldpbmRvd1JlZ2lzdHJhdGlvbiA9IHsgd2luZG93OiBtYWluV2luZG93LCBkaXNwb3NhYmxlczogbmV3IERpc3Bvc2FibGVTdG9yZSgpIH07XG5cdHdpbmRvd3Muc2V0KG1haW5XaW5kb3cudnNjb2RlV2luZG93SWQsIG1haW5XaW5kb3dSZWdpc3RyYXRpb24pO1xuXG5cdGNvbnN0IG9uRGlkUmVnaXN0ZXJXaW5kb3cgPSBuZXcgZXZlbnQuRW1pdHRlcjxJUmVnaXN0ZXJlZENvZGVXaW5kb3c+KCk7XG5cdGNvbnN0IG9uRGlkVW5yZWdpc3RlcldpbmRvdyA9IG5ldyBldmVudC5FbWl0dGVyPENvZGVXaW5kb3c+KCk7XG5cdGNvbnN0IG9uV2lsbFVucmVnaXN0ZXJXaW5kb3cgPSBuZXcgZXZlbnQuRW1pdHRlcjxDb2RlV2luZG93PigpO1xuXG5cdGZ1bmN0aW9uIGdldFdpbmRvd0J5SWQod2luZG93SWQ6IG51bWJlcik6IElSZWdpc3RlcmVkQ29kZVdpbmRvdyB8IHVuZGVmaW5lZDtcblx0ZnVuY3Rpb24gZ2V0V2luZG93QnlJZCh3aW5kb3dJZDogbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFja1RvTWFpbjogdHJ1ZSk6IElSZWdpc3RlcmVkQ29kZVdpbmRvdztcblx0ZnVuY3Rpb24gZ2V0V2luZG93QnlJZCh3aW5kb3dJZDogbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFja1RvTWFpbj86IGJvb2xlYW4pOiBJUmVnaXN0ZXJlZENvZGVXaW5kb3cgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHdpbmRvdyA9IHR5cGVvZiB3aW5kb3dJZCA9PT0gJ251bWJlcicgPyB3aW5kb3dzLmdldCh3aW5kb3dJZCkgOiB1bmRlZmluZWQ7XG5cblx0XHRyZXR1cm4gd2luZG93ID8/IChmYWxsYmFja1RvTWFpbiA/IG1haW5XaW5kb3dSZWdpc3RyYXRpb24gOiB1bmRlZmluZWQpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRvbkRpZFJlZ2lzdGVyV2luZG93OiBvbkRpZFJlZ2lzdGVyV2luZG93LmV2ZW50LFxuXHRcdG9uV2lsbFVucmVnaXN0ZXJXaW5kb3c6IG9uV2lsbFVucmVnaXN0ZXJXaW5kb3cuZXZlbnQsXG5cdFx0b25EaWRVbnJlZ2lzdGVyV2luZG93OiBvbkRpZFVucmVnaXN0ZXJXaW5kb3cuZXZlbnQsXG5cdFx0cmVnaXN0ZXJXaW5kb3cod2luZG93OiBDb2RlV2luZG93KTogSURpc3Bvc2FibGUge1xuXHRcdFx0aWYgKHdpbmRvd3MuaGFzKHdpbmRvdy52c2NvZGVXaW5kb3dJZCkpIHtcblx0XHRcdFx0cmV0dXJuIERpc3Bvc2FibGUuTm9uZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZGlzcG9zYWJsZXMgPSBuZXcgRGlzcG9zYWJsZVN0b3JlKCk7XG5cblx0XHRcdGNvbnN0IHJlZ2lzdGVyZWRXaW5kb3cgPSB7XG5cdFx0XHRcdHdpbmRvdyxcblx0XHRcdFx0ZGlzcG9zYWJsZXM6IGRpc3Bvc2FibGVzLmFkZChuZXcgRGlzcG9zYWJsZVN0b3JlKCkpXG5cdFx0XHR9O1xuXHRcdFx0d2luZG93cy5zZXQod2luZG93LnZzY29kZVdpbmRvd0lkLCByZWdpc3RlcmVkV2luZG93KTtcblxuXHRcdFx0ZGlzcG9zYWJsZXMuYWRkKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG5cdFx0XHRcdHdpbmRvd3MuZGVsZXRlKHdpbmRvdy52c2NvZGVXaW5kb3dJZCk7XG5cdFx0XHRcdG9uRGlkVW5yZWdpc3RlcldpbmRvdy5maXJlKHdpbmRvdyk7XG5cdFx0XHR9KSk7XG5cblx0XHRcdGRpc3Bvc2FibGVzLmFkZChhZGREaXNwb3NhYmxlTGlzdGVuZXIod2luZG93LCBFdmVudFR5cGUuQkVGT1JFX1VOTE9BRCwgKCkgPT4ge1xuXHRcdFx0XHRvbldpbGxVbnJlZ2lzdGVyV2luZG93LmZpcmUod2luZG93KTtcblx0XHRcdH0pKTtcblxuXHRcdFx0b25EaWRSZWdpc3RlcldpbmRvdy5maXJlKHJlZ2lzdGVyZWRXaW5kb3cpO1xuXG5cdFx0XHRyZXR1cm4gZGlzcG9zYWJsZXM7XG5cdFx0fSxcblx0XHRnZXRXaW5kb3dzKCk6IEl0ZXJhYmxlPElSZWdpc3RlcmVkQ29kZVdpbmRvdz4ge1xuXHRcdFx0cmV0dXJuIHdpbmRvd3MudmFsdWVzKCk7XG5cdFx0fSxcblx0XHRnZXRXaW5kb3dzQ291bnQoKTogbnVtYmVyIHtcblx0XHRcdHJldHVybiB3aW5kb3dzLnNpemU7XG5cdFx0fSxcblx0XHRnZXRXaW5kb3dJZCh0YXJnZXRXaW5kb3c6IFdpbmRvdyk6IG51bWJlciB7XG5cdFx0XHRyZXR1cm4gKHRhcmdldFdpbmRvdyBhcyBDb2RlV2luZG93KS52c2NvZGVXaW5kb3dJZDtcblx0XHR9LFxuXHRcdGhhc1dpbmRvdyh3aW5kb3dJZDogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gd2luZG93cy5oYXMod2luZG93SWQpO1xuXHRcdH0sXG5cdFx0Z2V0V2luZG93QnlJZCxcblx0XHRnZXRXaW5kb3coZTogTm9kZSB8IFVJRXZlbnQgfCB1bmRlZmluZWQgfCBudWxsKTogQ29kZVdpbmRvdyB7XG5cdFx0XHRjb25zdCBjYW5kaWRhdGVOb2RlID0gZSBhcyBOb2RlIHwgdW5kZWZpbmVkIHwgbnVsbDtcblx0XHRcdGlmIChjYW5kaWRhdGVOb2RlPy5vd25lckRvY3VtZW50Py5kZWZhdWx0Vmlldykge1xuXHRcdFx0XHRyZXR1cm4gY2FuZGlkYXRlTm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LndpbmRvdyBhcyBDb2RlV2luZG93O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5kaWRhdGVFdmVudCA9IGUgYXMgVUlFdmVudCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cdFx0XHRpZiAoY2FuZGlkYXRlRXZlbnQ/LnZpZXcpIHtcblx0XHRcdFx0cmV0dXJuIGNhbmRpZGF0ZUV2ZW50LnZpZXcud2luZG93IGFzIENvZGVXaW5kb3c7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYWluV2luZG93O1xuXHRcdH0sXG5cdFx0Z2V0RG9jdW1lbnQoZTogTm9kZSB8IFVJRXZlbnQgfCB1bmRlZmluZWQgfCBudWxsKTogRG9jdW1lbnQge1xuXHRcdFx0Y29uc3QgY2FuZGlkYXRlTm9kZSA9IGUgYXMgTm9kZSB8IHVuZGVmaW5lZCB8IG51bGw7XG5cdFx0XHRyZXR1cm4gZ2V0V2luZG93KGNhbmRpZGF0ZU5vZGUpLmRvY3VtZW50O1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbi8vI2VuZHJlZ2lvblxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJOb2RlKG5vZGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cdHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcblx0XHRub2RlLmZpcnN0Q2hpbGQucmVtb3ZlKCk7XG5cdH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJOb2RlUmVjdXJzaXZlbHkoZG9tTm9kZTogQ2hpbGROb2RlKSB7XG5cdHdoaWxlIChkb21Ob2RlLmZpcnN0Q2hpbGQpIHtcblx0XHRjb25zdCBlbGVtZW50ID0gZG9tTm9kZS5maXJzdENoaWxkO1xuXHRcdGVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0Y2xlYXJOb2RlUmVjdXJzaXZlbHkoZWxlbWVudCk7XG5cdH1cbn1cblxuXG5jbGFzcyBEb21MaXN0ZW5lciBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcblxuXHRwcml2YXRlIF9oYW5kbGVyOiAoZTogYW55KSA9PiB2b2lkO1xuXHRwcml2YXRlIF9ub2RlOiBFdmVudFRhcmdldDtcblx0cHJpdmF0ZSByZWFkb25seSBfdHlwZTogc3RyaW5nO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnM7XG5cblx0Y29uc3RydWN0b3Iobm9kZTogRXZlbnRUYXJnZXQsIHR5cGU6IHN0cmluZywgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucykge1xuXHRcdHRoaXMuX25vZGUgPSBub2RlO1xuXHRcdHRoaXMuX3R5cGUgPSB0eXBlO1xuXHRcdHRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyO1xuXHRcdHRoaXMuX29wdGlvbnMgPSAob3B0aW9ucyB8fCBmYWxzZSk7XG5cdFx0dGhpcy5fbm9kZS5hZGRFdmVudExpc3RlbmVyKHRoaXMuX3R5cGUsIHRoaXMuX2hhbmRsZXIsIHRoaXMuX29wdGlvbnMpO1xuXHR9XG5cblx0ZGlzcG9zZSgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuX2hhbmRsZXIpIHtcblx0XHRcdC8vIEFscmVhZHkgZGlzcG9zZWRcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fdHlwZSwgdGhpcy5faGFuZGxlciwgdGhpcy5fb3B0aW9ucyk7XG5cblx0XHQvLyBQcmV2ZW50IGxlYWtlcnMgZnJvbSBob2xkaW5nIG9uIHRvIHRoZSBkb20gb3IgaGFuZGxlciBmdW5jXG5cdFx0dGhpcy5fbm9kZSA9IG51bGwhO1xuXHRcdHRoaXMuX2hhbmRsZXIgPSBudWxsITtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRGlzcG9zYWJsZUxpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBHbG9iYWxFdmVudEhhbmRsZXJzRXZlbnRNYXA+KG5vZGU6IEV2ZW50VGFyZ2V0LCB0eXBlOiBLLCBoYW5kbGVyOiAoZXZlbnQ6IEdsb2JhbEV2ZW50SGFuZGxlcnNFdmVudE1hcFtLXSkgPT4gdm9pZCwgdXNlQ2FwdHVyZT86IGJvb2xlYW4pOiBJRGlzcG9zYWJsZTtcbmV4cG9ydCBmdW5jdGlvbiBhZGREaXNwb3NhYmxlTGlzdGVuZXIobm9kZTogRXZlbnRUYXJnZXQsIHR5cGU6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50OiBhbnkpID0+IHZvaWQsIHVzZUNhcHR1cmU/OiBib29sZWFuKTogSURpc3Bvc2FibGU7XG5leHBvcnQgZnVuY3Rpb24gYWRkRGlzcG9zYWJsZUxpc3RlbmVyKG5vZGU6IEV2ZW50VGFyZ2V0LCB0eXBlOiBzdHJpbmcsIGhhbmRsZXI6IChldmVudDogYW55KSA9PiB2b2lkLCBvcHRpb25zOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IElEaXNwb3NhYmxlO1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERpc3Bvc2FibGVMaXN0ZW5lcihub2RlOiBFdmVudFRhcmdldCwgdHlwZTogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCwgdXNlQ2FwdHVyZU9yT3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IElEaXNwb3NhYmxlIHtcblx0cmV0dXJuIG5ldyBEb21MaXN0ZW5lcihub2RlLCB0eXBlLCBoYW5kbGVyLCB1c2VDYXB0dXJlT3JPcHRpb25zKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQWRkU3RhbmRhcmREaXNwb3NhYmxlTGlzdGVuZXJTaWduYXR1cmUge1xuXHQobm9kZTogSFRNTEVsZW1lbnQsIHR5cGU6ICdjbGljaycsIGhhbmRsZXI6IChldmVudDogSU1vdXNlRXZlbnQpID0+IHZvaWQsIHVzZUNhcHR1cmU/OiBib29sZWFuKTogSURpc3Bvc2FibGU7XG5cdChub2RlOiBIVE1MRWxlbWVudCwgdHlwZTogJ21vdXNlZG93bicsIGhhbmRsZXI6IChldmVudDogSU1vdXNlRXZlbnQpID0+IHZvaWQsIHVzZUNhcHR1cmU/OiBib29sZWFuKTogSURpc3Bvc2FibGU7XG5cdChub2RlOiBIVE1MRWxlbWVudCwgdHlwZTogJ2tleWRvd24nLCBoYW5kbGVyOiAoZXZlbnQ6IElLZXlib2FyZEV2ZW50KSA9PiB2b2lkLCB1c2VDYXB0dXJlPzogYm9vbGVhbik6IElEaXNwb3NhYmxlO1xuXHQobm9kZTogSFRNTEVsZW1lbnQsIHR5cGU6ICdrZXlwcmVzcycsIGhhbmRsZXI6IChldmVudDogSUtleWJvYXJkRXZlbnQpID0+IHZvaWQsIHVzZUNhcHR1cmU/OiBib29sZWFuKTogSURpc3Bvc2FibGU7XG5cdChub2RlOiBIVE1MRWxlbWVudCwgdHlwZTogJ2tleXVwJywgaGFuZGxlcjogKGV2ZW50OiBJS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCwgdXNlQ2FwdHVyZT86IGJvb2xlYW4pOiBJRGlzcG9zYWJsZTtcblx0KG5vZGU6IEhUTUxFbGVtZW50LCB0eXBlOiAncG9pbnRlcmRvd24nLCBoYW5kbGVyOiAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4gdm9pZCwgdXNlQ2FwdHVyZT86IGJvb2xlYW4pOiBJRGlzcG9zYWJsZTtcblx0KG5vZGU6IEhUTUxFbGVtZW50LCB0eXBlOiAncG9pbnRlcm1vdmUnLCBoYW5kbGVyOiAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4gdm9pZCwgdXNlQ2FwdHVyZT86IGJvb2xlYW4pOiBJRGlzcG9zYWJsZTtcblx0KG5vZGU6IEhUTUxFbGVtZW50LCB0eXBlOiAncG9pbnRlcnVwJywgaGFuZGxlcjogKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQsIHVzZUNhcHR1cmU/OiBib29sZWFuKTogSURpc3Bvc2FibGU7XG5cdChub2RlOiBIVE1MRWxlbWVudCwgdHlwZTogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCwgdXNlQ2FwdHVyZT86IGJvb2xlYW4pOiBJRGlzcG9zYWJsZTtcbn1cbmZ1bmN0aW9uIF93cmFwQXNTdGFuZGFyZE1vdXNlRXZlbnQodGFyZ2V0V2luZG93OiBXaW5kb3csIGhhbmRsZXI6IChlOiBJTW91c2VFdmVudCkgPT4gdm9pZCk6IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChlOiBNb3VzZUV2ZW50KSB7XG5cdFx0cmV0dXJuIGhhbmRsZXIobmV3IFN0YW5kYXJkTW91c2VFdmVudCh0YXJnZXRXaW5kb3csIGUpKTtcblx0fTtcbn1cbmZ1bmN0aW9uIF93cmFwQXNTdGFuZGFyZEtleWJvYXJkRXZlbnQoaGFuZGxlcjogKGU6IElLZXlib2FyZEV2ZW50KSA9PiB2b2lkKTogKGU6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQge1xuXHRyZXR1cm4gZnVuY3Rpb24gKGU6IEtleWJvYXJkRXZlbnQpIHtcblx0XHRyZXR1cm4gaGFuZGxlcihuZXcgU3RhbmRhcmRLZXlib2FyZEV2ZW50KGUpKTtcblx0fTtcbn1cbmV4cG9ydCBjb25zdCBhZGRTdGFuZGFyZERpc3Bvc2FibGVMaXN0ZW5lcjogSUFkZFN0YW5kYXJkRGlzcG9zYWJsZUxpc3RlbmVyU2lnbmF0dXJlID0gZnVuY3Rpb24gYWRkU3RhbmRhcmREaXNwb3NhYmxlTGlzdGVuZXIobm9kZTogSFRNTEVsZW1lbnQsIHR5cGU6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50OiBhbnkpID0+IHZvaWQsIHVzZUNhcHR1cmU/OiBib29sZWFuKTogSURpc3Bvc2FibGUge1xuXHRsZXQgd3JhcEhhbmRsZXIgPSBoYW5kbGVyO1xuXG5cdGlmICh0eXBlID09PSAnY2xpY2snIHx8IHR5cGUgPT09ICdtb3VzZWRvd24nIHx8IHR5cGUgPT09ICdjb250ZXh0bWVudScpIHtcblx0XHR3cmFwSGFuZGxlciA9IF93cmFwQXNTdGFuZGFyZE1vdXNlRXZlbnQoZ2V0V2luZG93KG5vZGUpLCBoYW5kbGVyKTtcblx0fSBlbHNlIGlmICh0eXBlID09PSAna2V5ZG93bicgfHwgdHlwZSA9PT0gJ2tleXByZXNzJyB8fCB0eXBlID09PSAna2V5dXAnKSB7XG5cdFx0d3JhcEhhbmRsZXIgPSBfd3JhcEFzU3RhbmRhcmRLZXlib2FyZEV2ZW50KGhhbmRsZXIpO1xuXHR9XG5cblx0cmV0dXJuIGFkZERpc3Bvc2FibGVMaXN0ZW5lcihub2RlLCB0eXBlLCB3cmFwSGFuZGxlciwgdXNlQ2FwdHVyZSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3RhbmRhcmREaXNwb3NhYmxlR2VuZXJpY01vdXNlRG93bkxpc3RlbmVyID0gZnVuY3Rpb24gYWRkU3RhbmRhcmREaXNwb3NhYmxlTGlzdGVuZXIobm9kZTogSFRNTEVsZW1lbnQsIGhhbmRsZXI6IChldmVudDogYW55KSA9PiB2b2lkLCB1c2VDYXB0dXJlPzogYm9vbGVhbik6IElEaXNwb3NhYmxlIHtcblx0Y29uc3Qgd3JhcEhhbmRsZXIgPSBfd3JhcEFzU3RhbmRhcmRNb3VzZUV2ZW50KGdldFdpbmRvdyhub2RlKSwgaGFuZGxlcik7XG5cblx0cmV0dXJuIGFkZERpc3Bvc2FibGVHZW5lcmljTW91c2VEb3duTGlzdGVuZXIobm9kZSwgd3JhcEhhbmRsZXIsIHVzZUNhcHR1cmUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFN0YW5kYXJkRGlzcG9zYWJsZUdlbmVyaWNNb3VzZVVwTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRTdGFuZGFyZERpc3Bvc2FibGVMaXN0ZW5lcihub2RlOiBIVE1MRWxlbWVudCwgaGFuZGxlcjogKGV2ZW50OiBhbnkpID0+IHZvaWQsIHVzZUNhcHR1cmU/OiBib29sZWFuKTogSURpc3Bvc2FibGUge1xuXHRjb25zdCB3cmFwSGFuZGxlciA9IF93cmFwQXNTdGFuZGFyZE1vdXNlRXZlbnQoZ2V0V2luZG93KG5vZGUpLCBoYW5kbGVyKTtcblxuXHRyZXR1cm4gYWRkRGlzcG9zYWJsZUdlbmVyaWNNb3VzZVVwTGlzdGVuZXIobm9kZSwgd3JhcEhhbmRsZXIsIHVzZUNhcHR1cmUpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBhZGREaXNwb3NhYmxlR2VuZXJpY01vdXNlRG93bkxpc3RlbmVyKG5vZGU6IEV2ZW50VGFyZ2V0LCBoYW5kbGVyOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCwgdXNlQ2FwdHVyZT86IGJvb2xlYW4pOiBJRGlzcG9zYWJsZSB7XG5cdHJldHVybiBhZGREaXNwb3NhYmxlTGlzdGVuZXIobm9kZSwgcGxhdGZvcm0uaXNJT1MgJiYgQnJvd3NlckZlYXR1cmVzLnBvaW50ZXJFdmVudHMgPyBFdmVudFR5cGUuUE9JTlRFUl9ET1dOIDogRXZlbnRUeXBlLk1PVVNFX0RPV04sIGhhbmRsZXIsIHVzZUNhcHR1cmUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRGlzcG9zYWJsZUdlbmVyaWNNb3VzZU1vdmVMaXN0ZW5lcihub2RlOiBFdmVudFRhcmdldCwgaGFuZGxlcjogKGV2ZW50OiBhbnkpID0+IHZvaWQsIHVzZUNhcHR1cmU/OiBib29sZWFuKTogSURpc3Bvc2FibGUge1xuXHRyZXR1cm4gYWRkRGlzcG9zYWJsZUxpc3RlbmVyKG5vZGUsIHBsYXRmb3JtLmlzSU9TICYmIEJyb3dzZXJGZWF0dXJlcy5wb2ludGVyRXZlbnRzID8gRXZlbnRUeXBlLlBPSU5URVJfTU9WRSA6IEV2ZW50VHlwZS5NT1VTRV9NT1ZFLCBoYW5kbGVyLCB1c2VDYXB0dXJlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZERpc3Bvc2FibGVHZW5lcmljTW91c2VVcExpc3RlbmVyKG5vZGU6IEV2ZW50VGFyZ2V0LCBoYW5kbGVyOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCwgdXNlQ2FwdHVyZT86IGJvb2xlYW4pOiBJRGlzcG9zYWJsZSB7XG5cdHJldHVybiBhZGREaXNwb3NhYmxlTGlzdGVuZXIobm9kZSwgcGxhdGZvcm0uaXNJT1MgJiYgQnJvd3NlckZlYXR1cmVzLnBvaW50ZXJFdmVudHMgPyBFdmVudFR5cGUuUE9JTlRFUl9VUCA6IEV2ZW50VHlwZS5NT1VTRV9VUCwgaGFuZGxlciwgdXNlQ2FwdHVyZSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgdGhlIG5leHQgdGltZSB0aGUgYnJvd3NlciBpcyBpZGxlLCByZXR1cm5pbmcgYW5cbiAqIHtAbGluayBJRGlzcG9zYWJsZX0gdGhhdCB3aWxsIGNhbmNlbCB0aGUgY2FsbGJhY2sgd2hlbiBkaXNwb3NlZC4gVGhpcyB3cmFwc1xuICogW3JlcXVlc3RJZGxlQ2FsbGJhY2tdIHNvIGl0IHdpbGwgZmFsbGJhY2sgdG8gW3NldFRpbWVvdXRdIGlmIHRoZSBlbnZpcm9ubWVudFxuICogZG9lc24ndCBzdXBwb3J0IGl0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXRXaW5kb3cgVGhlIHdpbmRvdyBmb3Igd2hpY2ggdG8gcnVuIHRoZSBpZGxlIGNhbGxiYWNrXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJ1biB3aGVuIGlkbGUsIHRoaXMgaW5jbHVkZXMgYW5cbiAqIFtJZGxlRGVhZGxpbmVdIHRoYXQgcHJvdmlkZXMgdGhlIHRpbWUgYWxsb3RlZCBmb3IgdGhlIGlkbGUgY2FsbGJhY2sgYnkgdGhlXG4gKiBicm93c2VyLiBOb3QgcmVzcGVjdGluZyB0aGlzIGRlYWRsaW5lIHdpbGwgcmVzdWx0IGluIGEgZGVncmFkZWQgdXNlclxuICogZXhwZXJpZW5jZS5cbiAqIEBwYXJhbSB0aW1lb3V0IEEgdGltZW91dCBhdCB3aGljaCBwb2ludCB0byBxdWV1ZSBubyBsb25nZXIgd2FpdCBmb3IgYW4gaWRsZVxuICogY2FsbGJhY2sgYnV0IHF1ZXVlIGl0IG9uIHRoZSByZWd1bGFyIGV2ZW50IGxvb3AgKGxpa2Ugc2V0VGltZW91dCkuIFR5cGljYWxseVxuICogdGhpcyBzaG91bGQgbm90IGJlIHVzZWQuXG4gKlxuICogW0lkbGVEZWFkbGluZV06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JZGxlRGVhZGxpbmVcbiAqIFtyZXF1ZXN0SWRsZUNhbGxiYWNrXTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9yZXF1ZXN0SWRsZUNhbGxiYWNrXG4gKiBbc2V0VGltZW91dF06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvc2V0VGltZW91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuV2hlbldpbmRvd0lkbGUodGFyZ2V0V2luZG93OiBXaW5kb3cgfCB0eXBlb2YgZ2xvYmFsVGhpcywgY2FsbGJhY2s6IChpZGxlOiBJZGxlRGVhZGxpbmUpID0+IHZvaWQsIHRpbWVvdXQ/OiBudW1iZXIpOiBJRGlzcG9zYWJsZSB7XG5cdHJldHVybiBfcnVuV2hlbklkbGUodGFyZ2V0V2luZG93LCBjYWxsYmFjaywgdGltZW91dCk7XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFwiaWRsZS11bnRpbC11cmdlbnRcIi1zdHJhdGVneSBhcyBpbnRyb2R1Y2VkXG4gKiBoZXJlOiBodHRwczovL3BoaWxpcHdhbHRvbi5jb20vYXJ0aWNsZXMvaWRsZS11bnRpbC11cmdlbnQvXG4gKi9cbmV4cG9ydCBjbGFzcyBXaW5kb3dJZGxlVmFsdWU8VD4gZXh0ZW5kcyBBYnN0cmFjdElkbGVWYWx1ZTxUPiB7XG5cdGNvbnN0cnVjdG9yKHRhcmdldFdpbmRvdzogV2luZG93IHwgdHlwZW9mIGdsb2JhbFRoaXMsIGV4ZWN1dG9yOiAoKSA9PiBUKSB7XG5cdFx0c3VwZXIodGFyZ2V0V2luZG93LCBleGVjdXRvcik7XG5cdH1cbn1cblxuLyoqXG4gKiBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGJlIHJ1biBhdCB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUuXG4gKiBUaGlzIGFsbG93cyBtdWx0aXBsZSBwYXJ0aWVzIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyB0aGF0IHNob3VsZCBydW4gYXQgdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lLlxuICogSWYgY3VycmVudGx5IGluIGFuIGFuaW1hdGlvbiBmcmFtZSwgYHJ1bm5lcmAgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseS5cbiAqIEByZXR1cm4gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBjYW5jZWwgdGhlIHNjaGVkdWxlZCBydW5uZXIgKG9ubHkgaWYgYHJ1bm5lcmAgd2FzIG5vdCBleGVjdXRlZCBpbW1lZGlhdGVseSkuXG4gKi9cbmV4cG9ydCBsZXQgcnVuQXRUaGlzT3JTY2hlZHVsZUF0TmV4dEFuaW1hdGlvbkZyYW1lOiAodGFyZ2V0V2luZG93OiBXaW5kb3csIHJ1bm5lcjogKCkgPT4gdm9pZCwgcHJpb3JpdHk/OiBudW1iZXIpID0+IElEaXNwb3NhYmxlO1xuLyoqXG4gKiBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGJlIHJ1biBhdCB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUuXG4gKiBUaGlzIGFsbG93cyBtdWx0aXBsZSBwYXJ0aWVzIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyB0aGF0IHNob3VsZCBydW4gYXQgdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lLlxuICogSWYgY3VycmVudGx5IGluIGFuIGFuaW1hdGlvbiBmcmFtZSwgYHJ1bm5lcmAgd2lsbCBiZSBleGVjdXRlZCBhdCB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUuXG4gKiBAcmV0dXJuIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgcnVubmVyLlxuICovXG5leHBvcnQgbGV0IHNjaGVkdWxlQXROZXh0QW5pbWF0aW9uRnJhbWU6ICh0YXJnZXRXaW5kb3c6IFdpbmRvdywgcnVubmVyOiAoKSA9PiB2b2lkLCBwcmlvcml0eT86IG51bWJlcikgPT4gSURpc3Bvc2FibGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NhYmxlV2luZG93SW50ZXJ2YWwodGFyZ2V0V2luZG93OiBXaW5kb3csIGhhbmRsZXI6ICgpID0+IHZvaWQgfCBib29sZWFuIC8qIHN0b3AgaW50ZXJ2YWwgKi8gfCBQcm9taXNlPHVua25vd24+LCBpbnRlcnZhbDogbnVtYmVyLCBpdGVyYXRpb25zPzogbnVtYmVyKTogSURpc3Bvc2FibGUge1xuXHRsZXQgaXRlcmF0aW9uID0gMDtcblx0Y29uc3QgdGltZXIgPSB0YXJnZXRXaW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdGl0ZXJhdGlvbisrO1xuXHRcdGlmICgodHlwZW9mIGl0ZXJhdGlvbnMgPT09ICdudW1iZXInICYmIGl0ZXJhdGlvbiA+PSBpdGVyYXRpb25zKSB8fCBoYW5kbGVyKCkgPT09IHRydWUpIHtcblx0XHRcdGRpc3Bvc2FibGUuZGlzcG9zZSgpO1xuXHRcdH1cblx0fSwgaW50ZXJ2YWwpO1xuXHRjb25zdCBkaXNwb3NhYmxlID0gdG9EaXNwb3NhYmxlKCgpID0+IHtcblx0XHR0YXJnZXRXaW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcik7XG5cdH0pO1xuXHRyZXR1cm4gZGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IGNsYXNzIFdpbmRvd0ludGVydmFsVGltZXIgZXh0ZW5kcyBJbnRlcnZhbFRpbWVyIHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRUYXJnZXQ/OiBXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcztcblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIG5vZGUgVGhlIG9wdGlvbmFsIG5vZGUgZnJvbSB3aGljaCB0aGUgdGFyZ2V0IHdpbmRvdyBpcyBkZXRlcm1pbmVkXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihub2RlPzogTm9kZSkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5kZWZhdWx0VGFyZ2V0ID0gbm9kZSAmJiBnZXRXaW5kb3cobm9kZSk7XG5cdH1cblxuXHRvdmVycmlkZSBjYW5jZWxBbmRTZXQocnVubmVyOiAoKSA9PiB2b2lkLCBpbnRlcnZhbDogbnVtYmVyLCB0YXJnZXRXaW5kb3c/OiBXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcyk6IHZvaWQge1xuXHRcdHJldHVybiBzdXBlci5jYW5jZWxBbmRTZXQocnVubmVyLCBpbnRlcnZhbCwgdGFyZ2V0V2luZG93ID8/IHRoaXMuZGVmYXVsdFRhcmdldCk7XG5cdH1cbn1cblxuY2xhc3MgQW5pbWF0aW9uRnJhbWVRdWV1ZUl0ZW0gaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG5cblx0cHJpdmF0ZSBfcnVubmVyOiAoKSA9PiB2b2lkO1xuXHRwdWJsaWMgcHJpb3JpdHk6IG51bWJlcjtcblx0cHJpdmF0ZSBfY2FuY2VsZWQ6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IocnVubmVyOiAoKSA9PiB2b2lkLCBwcmlvcml0eTogbnVtYmVyID0gMCkge1xuXHRcdHRoaXMuX3J1bm5lciA9IHJ1bm5lcjtcblx0XHR0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7XG5cdFx0dGhpcy5fY2FuY2VsZWQgPSBmYWxzZTtcblx0fVxuXG5cdGRpc3Bvc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5fY2FuY2VsZWQgPSB0cnVlO1xuXHR9XG5cblx0ZXhlY3V0ZSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fY2FuY2VsZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0dGhpcy5fcnVubmVyKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25VbmV4cGVjdGVkRXJyb3IoZSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gU29ydCBieSBwcmlvcml0eSAobGFyZ2VzdCB0byBsb3dlc3QpXG5cdHN0YXRpYyBzb3J0KGE6IEFuaW1hdGlvbkZyYW1lUXVldWVJdGVtLCBiOiBBbmltYXRpb25GcmFtZVF1ZXVlSXRlbSk6IG51bWJlciB7XG5cdFx0cmV0dXJuIGIucHJpb3JpdHkgLSBhLnByaW9yaXR5O1xuXHR9XG59XG5cbihmdW5jdGlvbiAoKSB7XG5cdC8qKlxuXHQgKiBUaGUgcnVubmVycyBzY2hlZHVsZWQgYXQgdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lXG5cdCAqL1xuXHRjb25zdCBORVhUX1FVRVVFID0gbmV3IE1hcDxudW1iZXIgLyogd2luZG93IElEICovLCBBbmltYXRpb25GcmFtZVF1ZXVlSXRlbVtdPigpO1xuXHQvKipcblx0ICogVGhlIHJ1bm5lcnMgc2NoZWR1bGVkIGF0IHRoZSBjdXJyZW50IGFuaW1hdGlvbiBmcmFtZVxuXHQgKi9cblx0Y29uc3QgQ1VSUkVOVF9RVUVVRSA9IG5ldyBNYXA8bnVtYmVyIC8qIHdpbmRvdyBJRCAqLywgQW5pbWF0aW9uRnJhbWVRdWV1ZUl0ZW1bXT4oKTtcblx0LyoqXG5cdCAqIEEgZmxhZyB0byBrZWVwIHRyYWNrIGlmIHRoZSBuYXRpdmUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHdhcyBhbHJlYWR5IGNhbGxlZFxuXHQgKi9cblx0Y29uc3QgYW5pbUZyYW1lUmVxdWVzdGVkID0gbmV3IE1hcDxudW1iZXIgLyogd2luZG93IElEICovLCBib29sZWFuPigpO1xuXHQvKipcblx0ICogQSBmbGFnIHRvIGluZGljYXRlIGlmIGN1cnJlbnRseSBoYW5kbGluZyBhIG5hdGl2ZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgY2FsbGJhY2tcblx0ICovXG5cdGNvbnN0IGluQW5pbWF0aW9uRnJhbWVSdW5uZXIgPSBuZXcgTWFwPG51bWJlciAvKiB3aW5kb3cgSUQgKi8sIGJvb2xlYW4+KCk7XG5cblx0Y29uc3QgYW5pbWF0aW9uRnJhbWVSdW5uZXIgPSAodGFyZ2V0V2luZG93SWQ6IG51bWJlcikgPT4ge1xuXHRcdGFuaW1GcmFtZVJlcXVlc3RlZC5zZXQodGFyZ2V0V2luZG93SWQsIGZhbHNlKTtcblxuXHRcdGNvbnN0IGN1cnJlbnRRdWV1ZSA9IE5FWFRfUVVFVUUuZ2V0KHRhcmdldFdpbmRvd0lkKSA/PyBbXTtcblx0XHRDVVJSRU5UX1FVRVVFLnNldCh0YXJnZXRXaW5kb3dJZCwgY3VycmVudFF1ZXVlKTtcblx0XHRORVhUX1FVRVVFLnNldCh0YXJnZXRXaW5kb3dJZCwgW10pO1xuXG5cdFx0aW5BbmltYXRpb25GcmFtZVJ1bm5lci5zZXQodGFyZ2V0V2luZG93SWQsIHRydWUpO1xuXHRcdHdoaWxlIChjdXJyZW50UXVldWUubGVuZ3RoID4gMCkge1xuXHRcdFx0Y3VycmVudFF1ZXVlLnNvcnQoQW5pbWF0aW9uRnJhbWVRdWV1ZUl0ZW0uc29ydCk7XG5cdFx0XHRjb25zdCB0b3AgPSBjdXJyZW50UXVldWUuc2hpZnQoKSE7XG5cdFx0XHR0b3AuZXhlY3V0ZSgpO1xuXHRcdH1cblx0XHRpbkFuaW1hdGlvbkZyYW1lUnVubmVyLnNldCh0YXJnZXRXaW5kb3dJZCwgZmFsc2UpO1xuXHR9O1xuXG5cdHNjaGVkdWxlQXROZXh0QW5pbWF0aW9uRnJhbWUgPSAodGFyZ2V0V2luZG93OiBXaW5kb3csIHJ1bm5lcjogKCkgPT4gdm9pZCwgcHJpb3JpdHk6IG51bWJlciA9IDApID0+IHtcblx0XHRjb25zdCB0YXJnZXRXaW5kb3dJZCA9IGdldFdpbmRvd0lkKHRhcmdldFdpbmRvdyk7XG5cdFx0Y29uc3QgaXRlbSA9IG5ldyBBbmltYXRpb25GcmFtZVF1ZXVlSXRlbShydW5uZXIsIHByaW9yaXR5KTtcblxuXHRcdGxldCBuZXh0UXVldWUgPSBORVhUX1FVRVVFLmdldCh0YXJnZXRXaW5kb3dJZCk7XG5cdFx0aWYgKCFuZXh0UXVldWUpIHtcblx0XHRcdG5leHRRdWV1ZSA9IFtdO1xuXHRcdFx0TkVYVF9RVUVVRS5zZXQodGFyZ2V0V2luZG93SWQsIG5leHRRdWV1ZSk7XG5cdFx0fVxuXHRcdG5leHRRdWV1ZS5wdXNoKGl0ZW0pO1xuXG5cdFx0aWYgKCFhbmltRnJhbWVSZXF1ZXN0ZWQuZ2V0KHRhcmdldFdpbmRvd0lkKSkge1xuXHRcdFx0YW5pbUZyYW1lUmVxdWVzdGVkLnNldCh0YXJnZXRXaW5kb3dJZCwgdHJ1ZSk7XG5cdFx0XHR0YXJnZXRXaW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IGFuaW1hdGlvbkZyYW1lUnVubmVyKHRhcmdldFdpbmRvd0lkKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGl0ZW07XG5cdH07XG5cblx0cnVuQXRUaGlzT3JTY2hlZHVsZUF0TmV4dEFuaW1hdGlvbkZyYW1lID0gKHRhcmdldFdpbmRvdzogV2luZG93LCBydW5uZXI6ICgpID0+IHZvaWQsIHByaW9yaXR5PzogbnVtYmVyKSA9PiB7XG5cdFx0Y29uc3QgdGFyZ2V0V2luZG93SWQgPSBnZXRXaW5kb3dJZCh0YXJnZXRXaW5kb3cpO1xuXHRcdGlmIChpbkFuaW1hdGlvbkZyYW1lUnVubmVyLmdldCh0YXJnZXRXaW5kb3dJZCkpIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSBuZXcgQW5pbWF0aW9uRnJhbWVRdWV1ZUl0ZW0ocnVubmVyLCBwcmlvcml0eSk7XG5cdFx0XHRsZXQgY3VycmVudFF1ZXVlID0gQ1VSUkVOVF9RVUVVRS5nZXQodGFyZ2V0V2luZG93SWQpO1xuXHRcdFx0aWYgKCFjdXJyZW50UXVldWUpIHtcblx0XHRcdFx0Y3VycmVudFF1ZXVlID0gW107XG5cdFx0XHRcdENVUlJFTlRfUVVFVUUuc2V0KHRhcmdldFdpbmRvd0lkLCBjdXJyZW50UXVldWUpO1xuXHRcdFx0fVxuXHRcdFx0Y3VycmVudFF1ZXVlLnB1c2goaXRlbSk7XG5cdFx0XHRyZXR1cm4gaXRlbTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHNjaGVkdWxlQXROZXh0QW5pbWF0aW9uRnJhbWUodGFyZ2V0V2luZG93LCBydW5uZXIsIHByaW9yaXR5KTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gbWVhc3VyZSh0YXJnZXRXaW5kb3c6IFdpbmRvdywgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiBJRGlzcG9zYWJsZSB7XG5cdHJldHVybiBzY2hlZHVsZUF0TmV4dEFuaW1hdGlvbkZyYW1lKHRhcmdldFdpbmRvdywgY2FsbGJhY2ssIDEwMDAwIC8qIG11c3QgYmUgZWFybHkgKi8pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9kaWZ5KHRhcmdldFdpbmRvdzogV2luZG93LCBjYWxsYmFjazogKCkgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcblx0cmV0dXJuIHNjaGVkdWxlQXROZXh0QW5pbWF0aW9uRnJhbWUodGFyZ2V0V2luZG93LCBjYWxsYmFjaywgLTEwMDAwIC8qIG11c3QgYmUgbGF0ZSAqLyk7XG59XG5cbi8qKlxuICogQWRkIGEgdGhyb3R0bGVkIGxpc3RlbmVyLiBgaGFuZGxlcmAgaXMgZmlyZWQgYXQgbW9zdCBldmVyeSA4LjMzMzMzbXMgb3Igd2l0aCB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUgKGlmIGJyb3dzZXIgc3VwcG9ydHMgaXQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudE1lcmdlcjxSLCBFPiB7XG5cdChsYXN0RXZlbnQ6IFIgfCBudWxsLCBjdXJyZW50RXZlbnQ6IEUpOiBSO1xufVxuXG5jb25zdCBNSU5JTVVNX1RJTUVfTVMgPSA4O1xuY29uc3QgREVGQVVMVF9FVkVOVF9NRVJHRVI6IElFdmVudE1lcmdlcjxFdmVudCwgRXZlbnQ+ID0gZnVuY3Rpb24gKGxhc3RFdmVudDogRXZlbnQgfCBudWxsLCBjdXJyZW50RXZlbnQ6IEV2ZW50KSB7XG5cdHJldHVybiBjdXJyZW50RXZlbnQ7XG59O1xuXG5jbGFzcyBUaW1lb3V0VGhyb3R0bGVkRG9tTGlzdGVuZXI8UiwgRSBleHRlbmRzIEV2ZW50PiBleHRlbmRzIERpc3Bvc2FibGUge1xuXG5cdGNvbnN0cnVjdG9yKG5vZGU6IGFueSwgdHlwZTogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnQ6IFIpID0+IHZvaWQsIGV2ZW50TWVyZ2VyOiBJRXZlbnRNZXJnZXI8UiwgRT4gPSA8YW55PkRFRkFVTFRfRVZFTlRfTUVSR0VSLCBtaW5pbXVtVGltZU1zOiBudW1iZXIgPSBNSU5JTVVNX1RJTUVfTVMpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0bGV0IGxhc3RFdmVudDogUiB8IG51bGwgPSBudWxsO1xuXHRcdGxldCBsYXN0SGFuZGxlclRpbWUgPSAwO1xuXHRcdGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9yZWdpc3RlcihuZXcgVGltZW91dFRpbWVyKCkpO1xuXG5cdFx0Y29uc3QgaW52b2tlSGFuZGxlciA9ICgpID0+IHtcblx0XHRcdGxhc3RIYW5kbGVyVGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG5cdFx0XHRoYW5kbGVyKDxSPmxhc3RFdmVudCk7XG5cdFx0XHRsYXN0RXZlbnQgPSBudWxsO1xuXHRcdH07XG5cblx0XHR0aGlzLl9yZWdpc3RlcihhZGREaXNwb3NhYmxlTGlzdGVuZXIobm9kZSwgdHlwZSwgKGUpID0+IHtcblxuXHRcdFx0bGFzdEV2ZW50ID0gZXZlbnRNZXJnZXIobGFzdEV2ZW50LCBlKTtcblx0XHRcdGNvbnN0IGVsYXBzZWRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIGxhc3RIYW5kbGVyVGltZTtcblxuXHRcdFx0aWYgKGVsYXBzZWRUaW1lID49IG1pbmltdW1UaW1lTXMpIHtcblx0XHRcdFx0dGltZW91dC5jYW5jZWwoKTtcblx0XHRcdFx0aW52b2tlSGFuZGxlcigpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGltZW91dC5zZXRJZk5vdFNldChpbnZva2VIYW5kbGVyLCBtaW5pbXVtVGltZU1zIC0gZWxhcHNlZFRpbWUpO1xuXHRcdFx0fVxuXHRcdH0pKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRGlzcG9zYWJsZVRocm90dGxlZExpc3RlbmVyPFIsIEUgZXh0ZW5kcyBFdmVudCA9IEV2ZW50Pihub2RlOiBhbnksIHR5cGU6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50OiBSKSA9PiB2b2lkLCBldmVudE1lcmdlcj86IElFdmVudE1lcmdlcjxSLCBFPiwgbWluaW11bVRpbWVNcz86IG51bWJlcik6IElEaXNwb3NhYmxlIHtcblx0cmV0dXJuIG5ldyBUaW1lb3V0VGhyb3R0bGVkRG9tTGlzdGVuZXI8UiwgRT4obm9kZSwgdHlwZSwgaGFuZGxlciwgZXZlbnRNZXJnZXIsIG1pbmltdW1UaW1lTXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbDogSFRNTEVsZW1lbnQpOiBDU1NTdHlsZURlY2xhcmF0aW9uIHtcblx0cmV0dXJuIGdldFdpbmRvdyhlbCkuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGllbnRBcmVhKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBmYWxsYmFjaz86IEhUTUxFbGVtZW50KTogRGltZW5zaW9uIHtcblx0Y29uc3QgZWxXaW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG5cdGNvbnN0IGVsRG9jdW1lbnQgPSBlbFdpbmRvdy5kb2N1bWVudDtcblxuXHQvLyBUcnkgd2l0aCBET00gY2xpZW50V2lkdGggLyBjbGllbnRIZWlnaHRcblx0aWYgKGVsZW1lbnQgIT09IGVsRG9jdW1lbnQuYm9keSkge1xuXHRcdHJldHVybiBuZXcgRGltZW5zaW9uKGVsZW1lbnQuY2xpZW50V2lkdGgsIGVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcblx0fVxuXG5cdC8vIElmIHZpc3VhbCB2aWV3IHBvcnQgZXhpdHMgYW5kIGl0J3Mgb24gbW9iaWxlLCBpdCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHdpbmRvdyBpbm5lcldpZHRoIC8gaW5uZXJIZWlnaHQsIG9yIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggLyBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodFxuXHRpZiAocGxhdGZvcm0uaXNJT1MgJiYgZWxXaW5kb3c/LnZpc3VhbFZpZXdwb3J0KSB7XG5cdFx0cmV0dXJuIG5ldyBEaW1lbnNpb24oZWxXaW5kb3cudmlzdWFsVmlld3BvcnQud2lkdGgsIGVsV2luZG93LnZpc3VhbFZpZXdwb3J0LmhlaWdodCk7XG5cdH1cblxuXHQvLyBUcnkgaW5uZXJXaWR0aCAvIGlubmVySGVpZ2h0XG5cdGlmIChlbFdpbmRvdz8uaW5uZXJXaWR0aCAmJiBlbFdpbmRvdy5pbm5lckhlaWdodCkge1xuXHRcdHJldHVybiBuZXcgRGltZW5zaW9uKGVsV2luZG93LmlubmVyV2lkdGgsIGVsV2luZG93LmlubmVySGVpZ2h0KTtcblx0fVxuXG5cdC8vIFRyeSB3aXRoIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggLyBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodFxuXHRpZiAoZWxEb2N1bWVudC5ib2R5ICYmIGVsRG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCAmJiBlbERvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0KSB7XG5cdFx0cmV0dXJuIG5ldyBEaW1lbnNpb24oZWxEb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLCBlbERvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0KTtcblx0fVxuXG5cdC8vIFRyeSB3aXRoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAvIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcblx0aWYgKGVsRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGVsRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoICYmIGVsRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkge1xuXHRcdHJldHVybiBuZXcgRGltZW5zaW9uKGVsRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCBlbERvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpO1xuXHR9XG5cblx0aWYgKGZhbGxiYWNrKSB7XG5cdFx0cmV0dXJuIGdldENsaWVudEFyZWEoZmFsbGJhY2spO1xuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmlndXJlIG91dCBicm93c2VyIHdpZHRoIGFuZCBoZWlnaHQnKTtcbn1cblxuY2xhc3MgU2l6ZVV0aWxzIHtcblx0Ly8gQWRhcHRlZCBmcm9tIFdpbkpTXG5cdC8vIENvbnZlcnRzIGEgQ1NTIHBvc2l0aW9uaW5nIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHBpeGVscy5cblx0cHJpdmF0ZSBzdGF0aWMgY29udmVydFRvUGl4ZWxzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgfHwgMDtcblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIGdldERpbWVuc2lvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzUHJvcGVydHlOYW1lOiBzdHJpbmcsIGpzUHJvcGVydHlOYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuXHRcdGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXHRcdGNvbnN0IHZhbHVlID0gY29tcHV0ZWRTdHlsZSA/IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShjc3NQcm9wZXJ0eU5hbWUpIDogJzAnO1xuXHRcdHJldHVybiBTaXplVXRpbHMuY29udmVydFRvUGl4ZWxzKGVsZW1lbnQsIHZhbHVlKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRCb3JkZXJMZWZ0V2lkdGgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiBTaXplVXRpbHMuZ2V0RGltZW5zaW9uKGVsZW1lbnQsICdib3JkZXItbGVmdC13aWR0aCcsICdib3JkZXJMZWZ0V2lkdGgnKTtcblx0fVxuXHRzdGF0aWMgZ2V0Qm9yZGVyUmlnaHRXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIFNpemVVdGlscy5nZXREaW1lbnNpb24oZWxlbWVudCwgJ2JvcmRlci1yaWdodC13aWR0aCcsICdib3JkZXJSaWdodFdpZHRoJyk7XG5cdH1cblx0c3RhdGljIGdldEJvcmRlclRvcFdpZHRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcblx0XHRyZXR1cm4gU2l6ZVV0aWxzLmdldERpbWVuc2lvbihlbGVtZW50LCAnYm9yZGVyLXRvcC13aWR0aCcsICdib3JkZXJUb3BXaWR0aCcpO1xuXHR9XG5cdHN0YXRpYyBnZXRCb3JkZXJCb3R0b21XaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIFNpemVVdGlscy5nZXREaW1lbnNpb24oZWxlbWVudCwgJ2JvcmRlci1ib3R0b20td2lkdGgnLCAnYm9yZGVyQm90dG9tV2lkdGgnKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRQYWRkaW5nTGVmdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIFNpemVVdGlscy5nZXREaW1lbnNpb24oZWxlbWVudCwgJ3BhZGRpbmctbGVmdCcsICdwYWRkaW5nTGVmdCcpO1xuXHR9XG5cdHN0YXRpYyBnZXRQYWRkaW5nUmlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiBTaXplVXRpbHMuZ2V0RGltZW5zaW9uKGVsZW1lbnQsICdwYWRkaW5nLXJpZ2h0JywgJ3BhZGRpbmdSaWdodCcpO1xuXHR9XG5cdHN0YXRpYyBnZXRQYWRkaW5nVG9wKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcblx0XHRyZXR1cm4gU2l6ZVV0aWxzLmdldERpbWVuc2lvbihlbGVtZW50LCAncGFkZGluZy10b3AnLCAncGFkZGluZ1RvcCcpO1xuXHR9XG5cdHN0YXRpYyBnZXRQYWRkaW5nQm90dG9tKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcblx0XHRyZXR1cm4gU2l6ZVV0aWxzLmdldERpbWVuc2lvbihlbGVtZW50LCAncGFkZGluZy1ib3R0b20nLCAncGFkZGluZ0JvdHRvbScpO1xuXHR9XG5cblx0c3RhdGljIGdldE1hcmdpbkxlZnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuXHRcdHJldHVybiBTaXplVXRpbHMuZ2V0RGltZW5zaW9uKGVsZW1lbnQsICdtYXJnaW4tbGVmdCcsICdtYXJnaW5MZWZ0Jyk7XG5cdH1cblx0c3RhdGljIGdldE1hcmdpblRvcChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIFNpemVVdGlscy5nZXREaW1lbnNpb24oZWxlbWVudCwgJ21hcmdpbi10b3AnLCAnbWFyZ2luVG9wJyk7XG5cdH1cblx0c3RhdGljIGdldE1hcmdpblJpZ2h0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcblx0XHRyZXR1cm4gU2l6ZVV0aWxzLmdldERpbWVuc2lvbihlbGVtZW50LCAnbWFyZ2luLXJpZ2h0JywgJ21hcmdpblJpZ2h0Jyk7XG5cdH1cblx0c3RhdGljIGdldE1hcmdpbkJvdHRvbShlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIFNpemVVdGlscy5nZXREaW1lbnNpb24oZWxlbWVudCwgJ21hcmdpbi1ib3R0b20nLCAnbWFyZ2luQm90dG9tJyk7XG5cdH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUG9zaXRpb24gJiBEaW1lbnNpb25cblxuZXhwb3J0IGludGVyZmFjZSBJRGltZW5zaW9uIHtcblx0cmVhZG9ubHkgd2lkdGg6IG51bWJlcjtcblx0cmVhZG9ubHkgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBEaW1lbnNpb24gaW1wbGVtZW50cyBJRGltZW5zaW9uIHtcblxuXHRzdGF0aWMgcmVhZG9ubHkgTm9uZSA9IG5ldyBEaW1lbnNpb24oMCwgMCk7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cmVhZG9ubHkgd2lkdGg6IG51bWJlcixcblx0XHRyZWFkb25seSBoZWlnaHQ6IG51bWJlcixcblx0KSB7IH1cblxuXHR3aXRoKHdpZHRoOiBudW1iZXIgPSB0aGlzLndpZHRoLCBoZWlnaHQ6IG51bWJlciA9IHRoaXMuaGVpZ2h0KTogRGltZW5zaW9uIHtcblx0XHRpZiAod2lkdGggIT09IHRoaXMud2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLmhlaWdodCkge1xuXHRcdFx0cmV0dXJuIG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fVxuXG5cdHN0YXRpYyBpcyhvYmo6IHVua25vd24pOiBvYmogaXMgSURpbWVuc2lvbiB7XG5cdFx0cmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHR5cGVvZiAoPElEaW1lbnNpb24+b2JqKS5oZWlnaHQgPT09ICdudW1iZXInICYmIHR5cGVvZiAoPElEaW1lbnNpb24+b2JqKS53aWR0aCA9PT0gJ251bWJlcic7XG5cdH1cblxuXHRzdGF0aWMgbGlmdChvYmo6IElEaW1lbnNpb24pOiBEaW1lbnNpb24ge1xuXHRcdGlmIChvYmogaW5zdGFuY2VvZiBEaW1lbnNpb24pIHtcblx0XHRcdHJldHVybiBvYmo7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBuZXcgRGltZW5zaW9uKG9iai53aWR0aCwgb2JqLmhlaWdodCk7XG5cdFx0fVxuXHR9XG5cblx0c3RhdGljIGVxdWFscyhhOiBEaW1lbnNpb24gfCB1bmRlZmluZWQsIGI6IERpbWVuc2lvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdGlmIChhID09PSBiKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKCFhIHx8ICFiKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBhLndpZHRoID09PSBiLndpZHRoICYmIGEuaGVpZ2h0ID09PSBiLmhlaWdodDtcblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEb21Qb3NpdGlvbiB7XG5cdHJlYWRvbmx5IGxlZnQ6IG51bWJlcjtcblx0cmVhZG9ubHkgdG9wOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3BMZWZ0T2Zmc2V0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSURvbVBvc2l0aW9uIHtcblx0Ly8gQWRhcHRlZCBmcm9tIFdpbkpTLlV0aWxpdGllcy5nZXRQb3NpdGlvblxuXHQvLyBhbmQgYWRkZWQgYm9yZGVycyB0byB0aGUgbWl4XG5cblx0bGV0IG9mZnNldFBhcmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50O1xuXHRsZXQgdG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XG5cdGxldCBsZWZ0ID0gZWxlbWVudC5vZmZzZXRMZWZ0O1xuXG5cdHdoaWxlIChcblx0XHQoZWxlbWVudCA9IDxIVE1MRWxlbWVudD5lbGVtZW50LnBhcmVudE5vZGUpICE9PSBudWxsXG5cdFx0JiYgZWxlbWVudCAhPT0gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHlcblx0XHQmJiBlbGVtZW50ICE9PSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG5cdCkge1xuXHRcdHRvcCAtPSBlbGVtZW50LnNjcm9sbFRvcDtcblx0XHRjb25zdCBjID0gaXNTaGFkb3dSb290KGVsZW1lbnQpID8gbnVsbCA6IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cdFx0aWYgKGMpIHtcblx0XHRcdGxlZnQgLT0gYy5kaXJlY3Rpb24gIT09ICdydGwnID8gZWxlbWVudC5zY3JvbGxMZWZ0IDogLWVsZW1lbnQuc2Nyb2xsTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoZWxlbWVudCA9PT0gb2Zmc2V0UGFyZW50KSB7XG5cdFx0XHRsZWZ0ICs9IFNpemVVdGlscy5nZXRCb3JkZXJMZWZ0V2lkdGgoZWxlbWVudCk7XG5cdFx0XHR0b3AgKz0gU2l6ZVV0aWxzLmdldEJvcmRlclRvcFdpZHRoKGVsZW1lbnQpO1xuXHRcdFx0dG9wICs9IGVsZW1lbnQub2Zmc2V0VG9wO1xuXHRcdFx0bGVmdCArPSBlbGVtZW50Lm9mZnNldExlZnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxlZnQ6IGxlZnQsXG5cdFx0dG9wOiB0b3Bcblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRG9tTm9kZVBhZ2VQb3NpdGlvbiB7XG5cdGxlZnQ6IG51bWJlcjtcblx0dG9wOiBudW1iZXI7XG5cdHdpZHRoOiBudW1iZXI7XG5cdGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2l6ZShlbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciB8IG51bGwsIGhlaWdodDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuXHRpZiAodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJykge1xuXHRcdGVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG5cdH1cblxuXHRpZiAodHlwZW9mIGhlaWdodCA9PT0gJ251bWJlcicpIHtcblx0XHRlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b3A6IG51bWJlciwgcmlnaHQ/OiBudW1iZXIsIGJvdHRvbT86IG51bWJlciwgbGVmdD86IG51bWJlciwgcG9zaXRpb246IHN0cmluZyA9ICdhYnNvbHV0ZScpOiB2b2lkIHtcblx0aWYgKHR5cGVvZiB0b3AgPT09ICdudW1iZXInKSB7XG5cdFx0ZWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuXHR9XG5cblx0aWYgKHR5cGVvZiByaWdodCA9PT0gJ251bWJlcicpIHtcblx0XHRlbGVtZW50LnN0eWxlLnJpZ2h0ID0gYCR7cmlnaHR9cHhgO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBib3R0b20gPT09ICdudW1iZXInKSB7XG5cdFx0ZWxlbWVudC5zdHlsZS5ib3R0b20gPSBgJHtib3R0b219cHhgO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBsZWZ0ID09PSAnbnVtYmVyJykge1xuXHRcdGVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuXHR9XG5cblx0ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IHBvc2l0aW9uO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIGEgZG9tIG5vZGUgcmVsYXRpdmUgdG8gdGhlIGVudGlyZSBwYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tTm9kZVBhZ2VQb3NpdGlvbihkb21Ob2RlOiBIVE1MRWxlbWVudCk6IElEb21Ob2RlUGFnZVBvc2l0aW9uIHtcblx0Y29uc3QgYmIgPSBkb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRjb25zdCB3aW5kb3cgPSBnZXRXaW5kb3coZG9tTm9kZSk7XG5cdHJldHVybiB7XG5cdFx0bGVmdDogYmIubGVmdCArIHdpbmRvdy5zY3JvbGxYLFxuXHRcdHRvcDogYmIudG9wICsgd2luZG93LnNjcm9sbFksXG5cdFx0d2lkdGg6IGJiLndpZHRoLFxuXHRcdGhlaWdodDogYmIuaGVpZ2h0XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIHpvb20gb24gYSBnaXZlbiBlbGVtZW50IGJlZm9yZSB3aW5kb3cgem9vbSBsZXZlbCBpcyBhcHBsaWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21Ob2RlWm9vbUxldmVsKGRvbU5vZGU6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcblx0bGV0IHRlc3RFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBkb21Ob2RlO1xuXHRsZXQgem9vbSA9IDEuMDtcblx0ZG8ge1xuXHRcdGNvbnN0IGVsZW1lbnRab29tTGV2ZWwgPSAoZ2V0Q29tcHV0ZWRTdHlsZSh0ZXN0RWxlbWVudCkgYXMgYW55KS56b29tO1xuXHRcdGlmIChlbGVtZW50Wm9vbUxldmVsICE9PSBudWxsICYmIGVsZW1lbnRab29tTGV2ZWwgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50Wm9vbUxldmVsICE9PSAnMScpIHtcblx0XHRcdHpvb20gKj0gZWxlbWVudFpvb21MZXZlbDtcblx0XHR9XG5cblx0XHR0ZXN0RWxlbWVudCA9IHRlc3RFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdH0gd2hpbGUgKHRlc3RFbGVtZW50ICE9PSBudWxsICYmIHRlc3RFbGVtZW50ICE9PSB0ZXN0RWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG5cblx0cmV0dXJuIHpvb207XG59XG5cblxuLy8gQWRhcHRlZCBmcm9tIFdpbkpTXG4vLyBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgZWxlbWVudCwgaW5jbHVkaW5nIG1hcmdpbnMuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG90YWxXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG5cdGNvbnN0IG1hcmdpbiA9IFNpemVVdGlscy5nZXRNYXJnaW5MZWZ0KGVsZW1lbnQpICsgU2l6ZVV0aWxzLmdldE1hcmdpblJpZ2h0KGVsZW1lbnQpO1xuXHRyZXR1cm4gZWxlbWVudC5vZmZzZXRXaWR0aCArIG1hcmdpbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRlbnRXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG5cdGNvbnN0IGJvcmRlciA9IFNpemVVdGlscy5nZXRCb3JkZXJMZWZ0V2lkdGgoZWxlbWVudCkgKyBTaXplVXRpbHMuZ2V0Qm9yZGVyUmlnaHRXaWR0aChlbGVtZW50KTtcblx0Y29uc3QgcGFkZGluZyA9IFNpemVVdGlscy5nZXRQYWRkaW5nTGVmdChlbGVtZW50KSArIFNpemVVdGlscy5nZXRQYWRkaW5nUmlnaHQoZWxlbWVudCk7XG5cdHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoIC0gYm9yZGVyIC0gcGFkZGluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRvdGFsU2Nyb2xsV2lkdGgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuXHRjb25zdCBtYXJnaW4gPSBTaXplVXRpbHMuZ2V0TWFyZ2luTGVmdChlbGVtZW50KSArIFNpemVVdGlscy5nZXRNYXJnaW5SaWdodChlbGVtZW50KTtcblx0cmV0dXJuIGVsZW1lbnQuc2Nyb2xsV2lkdGggKyBtYXJnaW47XG59XG5cbi8vIEFkYXB0ZWQgZnJvbSBXaW5KU1xuLy8gR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gVGhlIGNvbnRlbnQgaGVpZ2h0IGRvZXMgbm90IGluY2x1ZGUgYm9yZGVycyBvciBwYWRkaW5nLlxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRlbnRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuXHRjb25zdCBib3JkZXIgPSBTaXplVXRpbHMuZ2V0Qm9yZGVyVG9wV2lkdGgoZWxlbWVudCkgKyBTaXplVXRpbHMuZ2V0Qm9yZGVyQm90dG9tV2lkdGgoZWxlbWVudCk7XG5cdGNvbnN0IHBhZGRpbmcgPSBTaXplVXRpbHMuZ2V0UGFkZGluZ1RvcChlbGVtZW50KSArIFNpemVVdGlscy5nZXRQYWRkaW5nQm90dG9tKGVsZW1lbnQpO1xuXHRyZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQgLSBib3JkZXIgLSBwYWRkaW5nO1xufVxuXG4vLyBBZGFwdGVkIGZyb20gV2luSlNcbi8vIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgZWxlbWVudCwgaW5jbHVkaW5nIGl0cyBtYXJnaW5zLlxuZXhwb3J0IGZ1bmN0aW9uIGdldFRvdGFsSGVpZ2h0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcblx0Y29uc3QgbWFyZ2luID0gU2l6ZVV0aWxzLmdldE1hcmdpblRvcChlbGVtZW50KSArIFNpemVVdGlscy5nZXRNYXJnaW5Cb3R0b20oZWxlbWVudCk7XG5cdHJldHVybiBlbGVtZW50Lm9mZnNldEhlaWdodCArIG1hcmdpbjtcbn1cblxuLy8gR2V0cyB0aGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIHBhcmVudC5cbmZ1bmN0aW9uIGdldFJlbGF0aXZlTGVmdChlbGVtZW50OiBIVE1MRWxlbWVudCwgcGFyZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG5cdGlmIChlbGVtZW50ID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjb25zdCBlbGVtZW50UG9zaXRpb24gPSBnZXRUb3BMZWZ0T2Zmc2V0KGVsZW1lbnQpO1xuXHRjb25zdCBwYXJlbnRQb3NpdGlvbiA9IGdldFRvcExlZnRPZmZzZXQocGFyZW50KTtcblx0cmV0dXJuIGVsZW1lbnRQb3NpdGlvbi5sZWZ0IC0gcGFyZW50UG9zaXRpb24ubGVmdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhcmdlc3RDaGlsZFdpZHRoKHBhcmVudDogSFRNTEVsZW1lbnQsIGNoaWxkcmVuOiBIVE1MRWxlbWVudFtdKTogbnVtYmVyIHtcblx0Y29uc3QgY2hpbGRXaWR0aHMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG5cdFx0cmV0dXJuIE1hdGgubWF4KGdldFRvdGFsU2Nyb2xsV2lkdGgoY2hpbGQpLCBnZXRUb3RhbFdpZHRoKGNoaWxkKSkgKyBnZXRSZWxhdGl2ZUxlZnQoY2hpbGQsIHBhcmVudCkgfHwgMDtcblx0fSk7XG5cdGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgoLi4uY2hpbGRXaWR0aHMpO1xuXHRyZXR1cm4gbWF4V2lkdGg7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQW5jZXN0b3IodGVzdENoaWxkOiBOb2RlIHwgbnVsbCwgdGVzdEFuY2VzdG9yOiBOb2RlIHwgbnVsbCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gQm9vbGVhbih0ZXN0QW5jZXN0b3I/LmNvbnRhaW5zKHRlc3RDaGlsZCkpO1xufVxuXG5jb25zdCBwYXJlbnRGbG93VG9EYXRhS2V5ID0gJ3BhcmVudEZsb3dUb0VsZW1lbnRJZCc7XG5cbi8qKlxuICogU2V0IGFuIGV4cGxpY2l0IHBhcmVudCB0byB1c2UgZm9yIG5vZGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZVxuICogcmVndWxhciBkb20gc3RydWN0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UGFyZW50Rmxvd1RvKGZyb21DaGlsZEVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b1BhcmVudEVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcblx0ZnJvbUNoaWxkRWxlbWVudC5kYXRhc2V0W3BhcmVudEZsb3dUb0RhdGFLZXldID0gdG9QYXJlbnRFbGVtZW50LmlkO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnRGbG93VG9FbGVtZW50KG5vZGU6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcblx0Y29uc3QgZmxvd1RvUGFyZW50SWQgPSBub2RlLmRhdGFzZXRbcGFyZW50Rmxvd1RvRGF0YUtleV07XG5cdGlmICh0eXBlb2YgZmxvd1RvUGFyZW50SWQgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChmbG93VG9QYXJlbnRJZCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYHRlc3RBbmNlc3RvcmAgaXMgYW4gYW5jZXN0b3Igb2YgYHRlc3RDaGlsZGAsIG9ic2VydmluZyB0aGUgZXhwbGljaXRcbiAqIHBhcmVudHMgc2V0IGJ5IGBzZXRQYXJlbnRGbG93VG9gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBbmNlc3RvclVzaW5nRmxvd1RvKHRlc3RDaGlsZDogTm9kZSwgdGVzdEFuY2VzdG9yOiBOb2RlKTogYm9vbGVhbiB7XG5cdGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHRlc3RDaGlsZDtcblx0d2hpbGUgKG5vZGUpIHtcblx0XHRpZiAobm9kZSA9PT0gdGVzdEFuY2VzdG9yKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoaXNIVE1MRWxlbWVudChub2RlKSkge1xuXHRcdFx0Y29uc3QgZmxvd1RvUGFyZW50RWxlbWVudCA9IGdldFBhcmVudEZsb3dUb0VsZW1lbnQobm9kZSk7XG5cdFx0XHRpZiAoZmxvd1RvUGFyZW50RWxlbWVudCkge1xuXHRcdFx0XHRub2RlID0gZmxvd1RvUGFyZW50RWxlbWVudDtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUGFyZW50V2l0aENsYXNzKG5vZGU6IEhUTUxFbGVtZW50LCBjbGF6ejogc3RyaW5nLCBzdG9wQXRDbGF6ek9yTm9kZT86IHN0cmluZyB8IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcblx0d2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gbm9kZS5FTEVNRU5UX05PREUpIHtcblx0XHRpZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhenopKSB7XG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHRpZiAoc3RvcEF0Q2xhenpPck5vZGUpIHtcblx0XHRcdGlmICh0eXBlb2Ygc3RvcEF0Q2xhenpPck5vZGUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhzdG9wQXRDbGF6ek9yTm9kZSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKG5vZGUgPT09IHN0b3BBdENsYXp6T3JOb2RlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRub2RlID0gPEhUTUxFbGVtZW50Pm5vZGUucGFyZW50Tm9kZTtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUGFyZW50V2l0aENsYXNzKG5vZGU6IEhUTUxFbGVtZW50LCBjbGF6ejogc3RyaW5nLCBzdG9wQXRDbGF6ek9yTm9kZT86IHN0cmluZyB8IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG5cdHJldHVybiAhIWZpbmRQYXJlbnRXaXRoQ2xhc3Mobm9kZSwgY2xhenosIHN0b3BBdENsYXp6T3JOb2RlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlOiBOb2RlKTogbm9kZSBpcyBTaGFkb3dSb290IHtcblx0cmV0dXJuIChcblx0XHRub2RlICYmICEhKDxTaGFkb3dSb290Pm5vZGUpLmhvc3QgJiYgISEoPFNoYWRvd1Jvb3Q+bm9kZSkubW9kZVxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJblNoYWRvd0RPTShkb21Ob2RlOiBOb2RlKTogYm9vbGVhbiB7XG5cdHJldHVybiAhIWdldFNoYWRvd1Jvb3QoZG9tTm9kZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaGFkb3dSb290KGRvbU5vZGU6IE5vZGUpOiBTaGFkb3dSb290IHwgbnVsbCB7XG5cdHdoaWxlIChkb21Ob2RlLnBhcmVudE5vZGUpIHtcblx0XHRpZiAoZG9tTm9kZSA9PT0gZG9tTm9kZS5vd25lckRvY3VtZW50Py5ib2R5KSB7XG5cdFx0XHQvLyByZWFjaGVkIHRoZSBib2R5XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0ZG9tTm9kZSA9IGRvbU5vZGUucGFyZW50Tm9kZTtcblx0fVxuXHRyZXR1cm4gaXNTaGFkb3dSb290KGRvbU5vZGUpID8gZG9tTm9kZSA6IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWN0aXZlIGVsZW1lbnQgYWNyb3NzIGFsbCBjaGlsZCB3aW5kb3dzXG4gKiBiYXNlZCBvbiBkb2N1bWVudCBmb2N1cy4gRmFsbHMgYmFjayB0byB0aGUgbWFpblxuICogd2luZG93IGlmIG5vIHdpbmRvdyBoYXMgZm9jdXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KCk6IEVsZW1lbnQgfCBudWxsIHtcblx0bGV0IHJlc3VsdCA9IGdldEFjdGl2ZURvY3VtZW50KCkuYWN0aXZlRWxlbWVudDtcblxuXHR3aGlsZSAocmVzdWx0Py5zaGFkb3dSb290KSB7XG5cdFx0cmVzdWx0ID0gcmVzdWx0LnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBmb2N1c2VkIHdpbmRvdyBhY3RpdmUgZWxlbWVudCBtYXRjaGVzXG4gKiB0aGUgcHJvdmlkZWQgZWxlbWVudC4gRmFsbHMgYmFjayB0byB0aGUgbWFpbiB3aW5kb3cgaWYgbm9cbiAqIHdpbmRvdyBoYXMgZm9jdXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGl2ZUVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gZ2V0QWN0aXZlRWxlbWVudCgpID09PSBlbGVtZW50O1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZm9jdXNlZCB3aW5kb3cgYWN0aXZlIGVsZW1lbnQgaXMgY29udGFpbmVkIGluXG4gKiBgYW5jZXN0b3JgLiBGYWxscyBiYWNrIHRvIHRoZSBtYWluIHdpbmRvdyBpZiBubyB3aW5kb3cgaGFzIGZvY3VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBbmNlc3Rvck9mQWN0aXZlRWxlbWVudChhbmNlc3RvcjogRWxlbWVudCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gaXNBbmNlc3RvcihnZXRBY3RpdmVFbGVtZW50KCksIGFuY2VzdG9yKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGFjdGl2ZSBgZG9jdW1lbnRgLiBUaGUgYWN0aXZlXG4gKiBkb2N1bWVudCBoYXMgZm9jdXMgb3Igd2lsbCBiZSB0aGUgbWFpbiB3aW5kb3dzIGRvY3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3RpdmVEb2N1bWVudChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG5cdHJldHVybiBlbGVtZW50Lm93bmVyRG9jdW1lbnQgPT09IGdldEFjdGl2ZURvY3VtZW50KCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWN0aXZlIGRvY3VtZW50IGFjcm9zcyBtYWluIGFuZCBjaGlsZCB3aW5kb3dzLlxuICogUHJlZmVycyB0aGUgd2luZG93IHdpdGggZm9jdXMsIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvXG4gKiB0aGUgbWFpbiB3aW5kb3dzIGRvY3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlRG9jdW1lbnQoKTogRG9jdW1lbnQge1xuXHRpZiAoZ2V0V2luZG93c0NvdW50KCkgPD0gMSkge1xuXHRcdHJldHVybiBtYWluV2luZG93LmRvY3VtZW50O1xuXHR9XG5cblx0Y29uc3QgZG9jdW1lbnRzID0gQXJyYXkuZnJvbShnZXRXaW5kb3dzKCkpLm1hcCgoeyB3aW5kb3cgfSkgPT4gd2luZG93LmRvY3VtZW50KTtcblx0cmV0dXJuIGRvY3VtZW50cy5maW5kKGRvYyA9PiBkb2MuaGFzRm9jdXMoKSkgPz8gbWFpbldpbmRvdy5kb2N1bWVudDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3RpdmUgd2luZG93IGFjcm9zcyBtYWluIGFuZCBjaGlsZCB3aW5kb3dzLlxuICogUHJlZmVycyB0aGUgd2luZG93IHdpdGggZm9jdXMsIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvXG4gKiB0aGUgbWFpbiB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmVXaW5kb3coKTogQ29kZVdpbmRvdyB7XG5cdGNvbnN0IGRvY3VtZW50ID0gZ2V0QWN0aXZlRG9jdW1lbnQoKTtcblx0cmV0dXJuIChkb2N1bWVudC5kZWZhdWx0Vmlldz8ud2luZG93ID8/IG1haW5XaW5kb3cpIGFzIENvZGVXaW5kb3c7XG59XG5cbmNvbnN0IGdsb2JhbFN0eWxlc2hlZXRzID0gbmV3IE1hcDxIVE1MU3R5bGVFbGVtZW50IC8qIG1haW4gc3R5bGVzaGVldCAqLywgU2V0PEhUTUxTdHlsZUVsZW1lbnQgLyogYXV4IHdpbmRvdyBjbG9uZXMgdGhhdCB0cmFjayB0aGUgbWFpbiBzdHlsZXNoZWV0ICovPj4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYmFsU3R5bGVzaGVldChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG5cdHJldHVybiBnbG9iYWxTdHlsZXNoZWV0cy5oYXMobm9kZSBhcyBIVE1MU3R5bGVFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBBIHZlcnNpb24gb2YgY3JlYXRlU3R5bGVTaGVldCB3aGljaCBoYXMgYSB1bmlmaWVkIEFQSSB0byBpbml0aWFsaXplL3NldCB0aGUgc3R5bGUgY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlU2hlZXQyKCk6IFdyYXBwZWRTdHlsZUVsZW1lbnQge1xuXHRyZXR1cm4gbmV3IFdyYXBwZWRTdHlsZUVsZW1lbnQoKTtcbn1cblxuY2xhc3MgV3JhcHBlZFN0eWxlRWxlbWVudCB7XG5cdHByaXZhdGUgX2N1cnJlbnRDc3NTdHlsZSA9ICcnO1xuXHRwcml2YXRlIF9zdHlsZVNoZWV0OiBIVE1MU3R5bGVFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5cdHB1YmxpYyBzZXRTdHlsZShjc3NTdHlsZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKGNzc1N0eWxlID09PSB0aGlzLl9jdXJyZW50Q3NzU3R5bGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5fY3VycmVudENzc1N0eWxlID0gY3NzU3R5bGU7XG5cblx0XHRpZiAoIXRoaXMuX3N0eWxlU2hlZXQpIHtcblx0XHRcdHRoaXMuX3N0eWxlU2hlZXQgPSBjcmVhdGVTdHlsZVNoZWV0KG1haW5XaW5kb3cuZG9jdW1lbnQuaGVhZCwgKHMpID0+IHMuaW5uZXJUZXh0ID0gY3NzU3R5bGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9zdHlsZVNoZWV0LmlubmVyVGV4dCA9IGNzc1N0eWxlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9zdHlsZVNoZWV0KSB7XG5cdFx0XHR0aGlzLl9zdHlsZVNoZWV0LnJlbW92ZSgpO1xuXHRcdFx0dGhpcy5fc3R5bGVTaGVldCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlU2hlZXQoY29udGFpbmVyOiBIVE1MRWxlbWVudCA9IG1haW5XaW5kb3cuZG9jdW1lbnQuaGVhZCwgYmVmb3JlQXBwZW5kPzogKHN0eWxlOiBIVE1MU3R5bGVFbGVtZW50KSA9PiB2b2lkLCBkaXNwb3NhYmxlU3RvcmU/OiBEaXNwb3NhYmxlU3RvcmUpOiBIVE1MU3R5bGVFbGVtZW50IHtcblx0Y29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXHRzdHlsZS50eXBlID0gJ3RleHQvY3NzJztcblx0c3R5bGUubWVkaWEgPSAnc2NyZWVuJztcblx0YmVmb3JlQXBwZW5kPy4oc3R5bGUpO1xuXHRjb250YWluZXIuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXG5cdGlmIChkaXNwb3NhYmxlU3RvcmUpIHtcblx0XHRkaXNwb3NhYmxlU3RvcmUuYWRkKHRvRGlzcG9zYWJsZSgoKSA9PiBzdHlsZS5yZW1vdmUoKSkpO1xuXHR9XG5cblx0Ly8gV2l0aCA8aGVhZD4gYXMgY29udGFpbmVyLCB0aGUgc3R5bGVzaGVldCBiZWNvbWVzIGdsb2JhbCBhbmQgaXMgdHJhY2tlZFxuXHQvLyB0byBzdXBwb3J0IGF1eGlsaWFyeSB3aW5kb3dzIHRvIGNsb25lIHRoZSBzdHlsZXNoZWV0LlxuXHRpZiAoY29udGFpbmVyID09PSBtYWluV2luZG93LmRvY3VtZW50LmhlYWQpIHtcblx0XHRjb25zdCBnbG9iYWxTdHlsZXNoZWV0Q2xvbmVzID0gbmV3IFNldDxIVE1MU3R5bGVFbGVtZW50PigpO1xuXHRcdGdsb2JhbFN0eWxlc2hlZXRzLnNldChzdHlsZSwgZ2xvYmFsU3R5bGVzaGVldENsb25lcyk7XG5cblx0XHRmb3IgKGNvbnN0IHsgd2luZG93OiB0YXJnZXRXaW5kb3csIGRpc3Bvc2FibGVzIH0gb2YgZ2V0V2luZG93cygpKSB7XG5cdFx0XHRpZiAodGFyZ2V0V2luZG93ID09PSBtYWluV2luZG93KSB7XG5cdFx0XHRcdGNvbnRpbnVlOyAvLyBtYWluIHdpbmRvdyBpcyBhbHJlYWR5IHRyYWNrZWRcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2xvbmVEaXNwb3NhYmxlID0gZGlzcG9zYWJsZXMuYWRkKGNsb25lR2xvYmFsU3R5bGVTaGVldChzdHlsZSwgZ2xvYmFsU3R5bGVzaGVldENsb25lcywgdGFyZ2V0V2luZG93KSk7XG5cdFx0XHRkaXNwb3NhYmxlU3RvcmU/LmFkZChjbG9uZURpc3Bvc2FibGUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzdHlsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lR2xvYmFsU3R5bGVzaGVldHModGFyZ2V0V2luZG93OiBXaW5kb3cpOiBJRGlzcG9zYWJsZSB7XG5cdGNvbnN0IGRpc3Bvc2FibGVzID0gbmV3IERpc3Bvc2FibGVTdG9yZSgpO1xuXG5cdGZvciAoY29uc3QgW2dsb2JhbFN0eWxlc2hlZXQsIGNsb25lZEdsb2JhbFN0eWxlc2hlZXRzXSBvZiBnbG9iYWxTdHlsZXNoZWV0cykge1xuXHRcdGRpc3Bvc2FibGVzLmFkZChjbG9uZUdsb2JhbFN0eWxlU2hlZXQoZ2xvYmFsU3R5bGVzaGVldCwgY2xvbmVkR2xvYmFsU3R5bGVzaGVldHMsIHRhcmdldFdpbmRvdykpO1xuXHR9XG5cblx0cmV0dXJuIGRpc3Bvc2FibGVzO1xufVxuXG5mdW5jdGlvbiBjbG9uZUdsb2JhbFN0eWxlU2hlZXQoZ2xvYmFsU3R5bGVzaGVldDogSFRNTFN0eWxlRWxlbWVudCwgZ2xvYmFsU3R5bGVzaGVldENsb25lczogU2V0PEhUTUxTdHlsZUVsZW1lbnQ+LCB0YXJnZXRXaW5kb3c6IFdpbmRvdyk6IElEaXNwb3NhYmxlIHtcblx0Y29uc3QgZGlzcG9zYWJsZXMgPSBuZXcgRGlzcG9zYWJsZVN0b3JlKCk7XG5cblx0Y29uc3QgY2xvbmUgPSBnbG9iYWxTdHlsZXNoZWV0LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MU3R5bGVFbGVtZW50O1xuXHR0YXJnZXRXaW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjbG9uZSk7XG5cdGRpc3Bvc2FibGVzLmFkZCh0b0Rpc3Bvc2FibGUoKCkgPT4gY2xvbmUucmVtb3ZlKCkpKTtcblxuXHRmb3IgKGNvbnN0IHJ1bGUgb2YgZ2V0RHluYW1pY1N0eWxlU2hlZXRSdWxlcyhnbG9iYWxTdHlsZXNoZWV0KSkge1xuXHRcdGNsb25lLnNoZWV0Py5pbnNlcnRSdWxlKHJ1bGUuY3NzVGV4dCwgY2xvbmUuc2hlZXQ/LmNzc1J1bGVzLmxlbmd0aCk7XG5cdH1cblxuXHRkaXNwb3NhYmxlcy5hZGQoc2hhcmVkTXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGdsb2JhbFN0eWxlc2hlZXQsIGRpc3Bvc2FibGVzLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KSgoKSA9PiB7XG5cdFx0Y2xvbmUudGV4dENvbnRlbnQgPSBnbG9iYWxTdHlsZXNoZWV0LnRleHRDb250ZW50O1xuXHR9KSk7XG5cblx0Z2xvYmFsU3R5bGVzaGVldENsb25lcy5hZGQoY2xvbmUpO1xuXHRkaXNwb3NhYmxlcy5hZGQodG9EaXNwb3NhYmxlKCgpID0+IGdsb2JhbFN0eWxlc2hlZXRDbG9uZXMuZGVsZXRlKGNsb25lKSkpO1xuXG5cdHJldHVybiBkaXNwb3NhYmxlcztcbn1cblxuaW50ZXJmYWNlIElNdXRhdGlvbk9ic2VydmVyIHtcblx0dXNlcnM6IG51bWJlcjtcblx0cmVhZG9ubHkgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG5cdHJlYWRvbmx5IG9uRGlkTXV0YXRlOiBldmVudC5FdmVudDxNdXRhdGlvblJlY29yZFtdPjtcbn1cblxuZXhwb3J0IGNvbnN0IHNoYXJlZE11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgY2xhc3Mge1xuXG5cdHJlYWRvbmx5IG11dGF0aW9uT2JzZXJ2ZXJzID0gbmV3IE1hcDxOb2RlLCBNYXA8bnVtYmVyLCBJTXV0YXRpb25PYnNlcnZlcj4+KCk7XG5cblx0b2JzZXJ2ZSh0YXJnZXQ6IE5vZGUsIGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlU3RvcmUsIG9wdGlvbnM/OiBNdXRhdGlvbk9ic2VydmVySW5pdCk6IGV2ZW50LkV2ZW50PE11dGF0aW9uUmVjb3JkW10+IHtcblx0XHRsZXQgbXV0YXRpb25PYnNlcnZlcnNQZXJUYXJnZXQgPSB0aGlzLm11dGF0aW9uT2JzZXJ2ZXJzLmdldCh0YXJnZXQpO1xuXHRcdGlmICghbXV0YXRpb25PYnNlcnZlcnNQZXJUYXJnZXQpIHtcblx0XHRcdG11dGF0aW9uT2JzZXJ2ZXJzUGVyVGFyZ2V0ID0gbmV3IE1hcDxudW1iZXIsIElNdXRhdGlvbk9ic2VydmVyPigpO1xuXHRcdFx0dGhpcy5tdXRhdGlvbk9ic2VydmVycy5zZXQodGFyZ2V0LCBtdXRhdGlvbk9ic2VydmVyc1BlclRhcmdldCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb3B0aW9uc0hhc2ggPSBoYXNoKG9wdGlvbnMpO1xuXHRcdGxldCBtdXRhdGlvbk9ic2VydmVyUGVyT3B0aW9ucyA9IG11dGF0aW9uT2JzZXJ2ZXJzUGVyVGFyZ2V0LmdldChvcHRpb25zSGFzaCk7XG5cdFx0aWYgKCFtdXRhdGlvbk9ic2VydmVyUGVyT3B0aW9ucykge1xuXHRcdFx0Y29uc3Qgb25EaWRNdXRhdGUgPSBuZXcgZXZlbnQuRW1pdHRlcjxNdXRhdGlvblJlY29yZFtdPigpO1xuXHRcdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4gb25EaWRNdXRhdGUuZmlyZShtdXRhdGlvbnMpKTtcblx0XHRcdG9ic2VydmVyLm9ic2VydmUodGFyZ2V0LCBvcHRpb25zKTtcblxuXHRcdFx0Y29uc3QgcmVzb2x2ZWRNdXRhdGlvbk9ic2VydmVyUGVyT3B0aW9ucyA9IG11dGF0aW9uT2JzZXJ2ZXJQZXJPcHRpb25zID0ge1xuXHRcdFx0XHR1c2VyczogMSxcblx0XHRcdFx0b2JzZXJ2ZXIsXG5cdFx0XHRcdG9uRGlkTXV0YXRlOiBvbkRpZE11dGF0ZS5ldmVudFxuXHRcdFx0fTtcblxuXHRcdFx0ZGlzcG9zYWJsZXMuYWRkKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG5cdFx0XHRcdHJlc29sdmVkTXV0YXRpb25PYnNlcnZlclBlck9wdGlvbnMudXNlcnMgLT0gMTtcblxuXHRcdFx0XHRpZiAocmVzb2x2ZWRNdXRhdGlvbk9ic2VydmVyUGVyT3B0aW9ucy51c2VycyA9PT0gMCkge1xuXHRcdFx0XHRcdG9uRGlkTXV0YXRlLmRpc3Bvc2UoKTtcblx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cblx0XHRcdFx0XHRtdXRhdGlvbk9ic2VydmVyc1BlclRhcmdldD8uZGVsZXRlKG9wdGlvbnNIYXNoKTtcblx0XHRcdFx0XHRpZiAobXV0YXRpb25PYnNlcnZlcnNQZXJUYXJnZXQ/LnNpemUgPT09IDApIHtcblx0XHRcdFx0XHRcdHRoaXMubXV0YXRpb25PYnNlcnZlcnMuZGVsZXRlKHRhcmdldCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KSk7XG5cblx0XHRcdG11dGF0aW9uT2JzZXJ2ZXJzUGVyVGFyZ2V0LnNldChvcHRpb25zSGFzaCwgbXV0YXRpb25PYnNlcnZlclBlck9wdGlvbnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtdXRhdGlvbk9ic2VydmVyUGVyT3B0aW9ucy51c2VycyArPSAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBtdXRhdGlvbk9ic2VydmVyUGVyT3B0aW9ucy5vbkRpZE11dGF0ZTtcblx0fVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1ldGFFbGVtZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSBtYWluV2luZG93LmRvY3VtZW50LmhlYWQpOiBIVE1MTWV0YUVsZW1lbnQge1xuXHRyZXR1cm4gY3JlYXRlSGVhZEVsZW1lbnQoJ21ldGEnLCBjb250YWluZXIpIGFzIEhUTUxNZXRhRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpbmtFbGVtZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSBtYWluV2luZG93LmRvY3VtZW50LmhlYWQpOiBIVE1MTGlua0VsZW1lbnQge1xuXHRyZXR1cm4gY3JlYXRlSGVhZEVsZW1lbnQoJ2xpbmsnLCBjb250YWluZXIpIGFzIEhUTUxMaW5rRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSGVhZEVsZW1lbnQodGFnTmFtZTogc3RyaW5nLCBjb250YWluZXI6IEhUTUxFbGVtZW50ID0gbWFpbldpbmRvdy5kb2N1bWVudC5oZWFkKTogSFRNTEVsZW1lbnQge1xuXHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcblx0Y29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXHRyZXR1cm4gZWxlbWVudDtcbn1cblxubGV0IF9zaGFyZWRTdHlsZVNoZWV0OiBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5mdW5jdGlvbiBnZXRTaGFyZWRTdHlsZVNoZWV0KCk6IEhUTUxTdHlsZUVsZW1lbnQge1xuXHRpZiAoIV9zaGFyZWRTdHlsZVNoZWV0KSB7XG5cdFx0X3NoYXJlZFN0eWxlU2hlZXQgPSBjcmVhdGVTdHlsZVNoZWV0KCk7XG5cdH1cblx0cmV0dXJuIF9zaGFyZWRTdHlsZVNoZWV0O1xufVxuXG5mdW5jdGlvbiBnZXREeW5hbWljU3R5bGVTaGVldFJ1bGVzKHN0eWxlOiBIVE1MU3R5bGVFbGVtZW50KSB7XG5cdGlmIChzdHlsZT8uc2hlZXQ/LnJ1bGVzKSB7XG5cdFx0Ly8gQ2hyb21lLCBJRVxuXHRcdHJldHVybiBzdHlsZS5zaGVldC5ydWxlcztcblx0fVxuXHRpZiAoc3R5bGU/LnNoZWV0Py5jc3NSdWxlcykge1xuXHRcdC8vIEZGXG5cdFx0cmV0dXJuIHN0eWxlLnNoZWV0LmNzc1J1bGVzO1xuXHR9XG5cdHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNTU1J1bGUoc2VsZWN0b3I6IHN0cmluZywgY3NzVGV4dDogc3RyaW5nLCBzdHlsZSA9IGdldFNoYXJlZFN0eWxlU2hlZXQoKSk6IHZvaWQge1xuXHRpZiAoIXN0eWxlIHx8ICFjc3NUZXh0KSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0c3R5bGUuc2hlZXQ/Lmluc2VydFJ1bGUoYCR7c2VsZWN0b3J9IHske2Nzc1RleHR9fWAsIDApO1xuXG5cdC8vIEFwcGx5IHJ1bGUgYWxzbyB0byBhbGwgY2xvbmVkIGdsb2JhbCBzdHlsZXNoZWV0c1xuXHRmb3IgKGNvbnN0IGNsb25lZEdsb2JhbFN0eWxlc2hlZXQgb2YgZ2xvYmFsU3R5bGVzaGVldHMuZ2V0KHN0eWxlKSA/PyBbXSkge1xuXHRcdGNyZWF0ZUNTU1J1bGUoc2VsZWN0b3IsIGNzc1RleHQsIGNsb25lZEdsb2JhbFN0eWxlc2hlZXQpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDU1NSdWxlc0NvbnRhaW5pbmdTZWxlY3RvcihydWxlTmFtZTogc3RyaW5nLCBzdHlsZSA9IGdldFNoYXJlZFN0eWxlU2hlZXQoKSk6IHZvaWQge1xuXHRpZiAoIXN0eWxlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgcnVsZXMgPSBnZXREeW5hbWljU3R5bGVTaGVldFJ1bGVzKHN0eWxlKTtcblx0Y29uc3QgdG9EZWxldGU6IG51bWJlcltdID0gW107XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBydWxlID0gcnVsZXNbaV07XG5cdFx0aWYgKGlzQ1NTU3R5bGVSdWxlKHJ1bGUpICYmIHJ1bGUuc2VsZWN0b3JUZXh0LmluZGV4T2YocnVsZU5hbWUpICE9PSAtMSkge1xuXHRcdFx0dG9EZWxldGUucHVzaChpKTtcblx0XHR9XG5cdH1cblxuXHRmb3IgKGxldCBpID0gdG9EZWxldGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRzdHlsZS5zaGVldD8uZGVsZXRlUnVsZSh0b0RlbGV0ZVtpXSk7XG5cdH1cblxuXHQvLyBSZW1vdmUgcnVsZXMgYWxzbyBmcm9tIGFsbCBjbG9uZWQgZ2xvYmFsIHN0eWxlc2hlZXRzXG5cdGZvciAoY29uc3QgY2xvbmVkR2xvYmFsU3R5bGVzaGVldCBvZiBnbG9iYWxTdHlsZXNoZWV0cy5nZXQoc3R5bGUpID8/IFtdKSB7XG5cdFx0cmVtb3ZlQ1NTUnVsZXNDb250YWluaW5nU2VsZWN0b3IocnVsZU5hbWUsIGNsb25lZEdsb2JhbFN0eWxlc2hlZXQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGlzQ1NTU3R5bGVSdWxlKHJ1bGU6IENTU1J1bGUpOiBydWxlIGlzIENTU1N0eWxlUnVsZSB7XG5cdHJldHVybiB0eXBlb2YgKHJ1bGUgYXMgQ1NTU3R5bGVSdWxlKS5zZWxlY3RvclRleHQgPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNIVE1MRWxlbWVudChlOiB1bmtub3duKTogZSBpcyBIVE1MRWxlbWVudCB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuXHRyZXR1cm4gZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IGUgaW5zdGFuY2VvZiBnZXRXaW5kb3coZSBhcyBOb2RlKS5IVE1MRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSFRNTEFuY2hvckVsZW1lbnQoZTogdW5rbm93bik6IGUgaXMgSFRNTEFuY2hvckVsZW1lbnQge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCB8fCBlIGluc3RhbmNlb2YgZ2V0V2luZG93KGUgYXMgTm9kZSkuSFRNTEFuY2hvckVsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hUTUxTcGFuRWxlbWVudChlOiB1bmtub3duKTogZSBpcyBIVE1MU3BhbkVsZW1lbnQge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MU3BhbkVsZW1lbnQgfHwgZSBpbnN0YW5jZW9mIGdldFdpbmRvdyhlIGFzIE5vZGUpLkhUTUxTcGFuRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSFRNTFRleHRBcmVhRWxlbWVudChlOiB1bmtub3duKTogZSBpcyBIVE1MVGV4dEFyZWFFbGVtZW50IHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cdHJldHVybiBlIGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fCBlIGluc3RhbmNlb2YgZ2V0V2luZG93KGUgYXMgTm9kZSkuSFRNTFRleHRBcmVhRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSFRNTElucHV0RWxlbWVudChlOiB1bmtub3duKTogZSBpcyBIVE1MSW5wdXRFbGVtZW50IHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cdHJldHVybiBlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlIGluc3RhbmNlb2YgZ2V0V2luZG93KGUgYXMgTm9kZSkuSFRNTElucHV0RWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSFRNTEJ1dHRvbkVsZW1lbnQoZTogdW5rbm93bik6IGUgaXMgSFRNTEJ1dHRvbkVsZW1lbnQge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCB8fCBlIGluc3RhbmNlb2YgZ2V0V2luZG93KGUgYXMgTm9kZSkuSFRNTEJ1dHRvbkVsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hUTUxEaXZFbGVtZW50KGU6IHVua25vd24pOiBlIGlzIEhUTUxEaXZFbGVtZW50IHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cdHJldHVybiBlIGluc3RhbmNlb2YgSFRNTERpdkVsZW1lbnQgfHwgZSBpbnN0YW5jZW9mIGdldFdpbmRvdyhlIGFzIE5vZGUpLkhUTUxEaXZFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTVkdFbGVtZW50KGU6IHVua25vd24pOiBlIGlzIFNWR0VsZW1lbnQge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0cmV0dXJuIGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50IHx8IGUgaW5zdGFuY2VvZiBnZXRXaW5kb3coZSBhcyBOb2RlKS5TVkdFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KGU6IHVua25vd24pOiBlIGlzIE1vdXNlRXZlbnQge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0cmV0dXJuIGUgaW5zdGFuY2VvZiBNb3VzZUV2ZW50IHx8IGUgaW5zdGFuY2VvZiBnZXRXaW5kb3coZSBhcyBVSUV2ZW50KS5Nb3VzZUV2ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNLZXlib2FyZEV2ZW50KGU6IHVua25vd24pOiBlIGlzIEtleWJvYXJkRXZlbnQge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0cmV0dXJuIGUgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50IHx8IGUgaW5zdGFuY2VvZiBnZXRXaW5kb3coZSBhcyBVSUV2ZW50KS5LZXlib2FyZEV2ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQb2ludGVyRXZlbnQoZTogdW5rbm93bik6IGUgaXMgUG9pbnRlckV2ZW50IHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cdHJldHVybiBlIGluc3RhbmNlb2YgUG9pbnRlckV2ZW50IHx8IGUgaW5zdGFuY2VvZiBnZXRXaW5kb3coZSBhcyBVSUV2ZW50KS5Qb2ludGVyRXZlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWdFdmVudChlOiB1bmtub3duKTogZSBpcyBEcmFnRXZlbnQge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0cmV0dXJuIGUgaW5zdGFuY2VvZiBEcmFnRXZlbnQgfHwgZSBpbnN0YW5jZW9mIGdldFdpbmRvdyhlIGFzIFVJRXZlbnQpLkRyYWdFdmVudDtcbn1cblxuZXhwb3J0IGNvbnN0IEV2ZW50VHlwZSA9IHtcblx0Ly8gTW91c2Vcblx0Q0xJQ0s6ICdjbGljaycsXG5cdEFVWENMSUNLOiAnYXV4Y2xpY2snLFxuXHREQkxDTElDSzogJ2RibGNsaWNrJyxcblx0TU9VU0VfVVA6ICdtb3VzZXVwJyxcblx0TU9VU0VfRE9XTjogJ21vdXNlZG93bicsXG5cdE1PVVNFX09WRVI6ICdtb3VzZW92ZXInLFxuXHRNT1VTRV9NT1ZFOiAnbW91c2Vtb3ZlJyxcblx0TU9VU0VfT1VUOiAnbW91c2VvdXQnLFxuXHRNT1VTRV9FTlRFUjogJ21vdXNlZW50ZXInLFxuXHRNT1VTRV9MRUFWRTogJ21vdXNlbGVhdmUnLFxuXHRNT1VTRV9XSEVFTDogJ3doZWVsJyxcblx0UE9JTlRFUl9VUDogJ3BvaW50ZXJ1cCcsXG5cdFBPSU5URVJfRE9XTjogJ3BvaW50ZXJkb3duJyxcblx0UE9JTlRFUl9NT1ZFOiAncG9pbnRlcm1vdmUnLFxuXHRQT0lOVEVSX0xFQVZFOiAncG9pbnRlcmxlYXZlJyxcblx0Q09OVEVYVF9NRU5VOiAnY29udGV4dG1lbnUnLFxuXHRXSEVFTDogJ3doZWVsJyxcblx0Ly8gS2V5Ym9hcmRcblx0S0VZX0RPV046ICdrZXlkb3duJyxcblx0S0VZX1BSRVNTOiAna2V5cHJlc3MnLFxuXHRLRVlfVVA6ICdrZXl1cCcsXG5cdC8vIEhUTUwgRG9jdW1lbnRcblx0TE9BRDogJ2xvYWQnLFxuXHRCRUZPUkVfVU5MT0FEOiAnYmVmb3JldW5sb2FkJyxcblx0VU5MT0FEOiAndW5sb2FkJyxcblx0UEFHRV9TSE9XOiAncGFnZXNob3cnLFxuXHRQQUdFX0hJREU6ICdwYWdlaGlkZScsXG5cdFBBU1RFOiAncGFzdGUnLFxuXHRBQk9SVDogJ2Fib3J0Jyxcblx0RVJST1I6ICdlcnJvcicsXG5cdFJFU0laRTogJ3Jlc2l6ZScsXG5cdFNDUk9MTDogJ3Njcm9sbCcsXG5cdEZVTExTQ1JFRU5fQ0hBTkdFOiAnZnVsbHNjcmVlbmNoYW5nZScsXG5cdFdLX0ZVTExTQ1JFRU5fQ0hBTkdFOiAnd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsXG5cdC8vIEZvcm1cblx0U0VMRUNUOiAnc2VsZWN0Jyxcblx0Q0hBTkdFOiAnY2hhbmdlJyxcblx0U1VCTUlUOiAnc3VibWl0Jyxcblx0UkVTRVQ6ICdyZXNldCcsXG5cdEZPQ1VTOiAnZm9jdXMnLFxuXHRGT0NVU19JTjogJ2ZvY3VzaW4nLFxuXHRGT0NVU19PVVQ6ICdmb2N1c291dCcsXG5cdEJMVVI6ICdibHVyJyxcblx0SU5QVVQ6ICdpbnB1dCcsXG5cdC8vIExvY2FsIFN0b3JhZ2Vcblx0U1RPUkFHRTogJ3N0b3JhZ2UnLFxuXHQvLyBEcmFnXG5cdERSQUdfU1RBUlQ6ICdkcmFnc3RhcnQnLFxuXHREUkFHOiAnZHJhZycsXG5cdERSQUdfRU5URVI6ICdkcmFnZW50ZXInLFxuXHREUkFHX0xFQVZFOiAnZHJhZ2xlYXZlJyxcblx0RFJBR19PVkVSOiAnZHJhZ292ZXInLFxuXHREUk9QOiAnZHJvcCcsXG5cdERSQUdfRU5EOiAnZHJhZ2VuZCcsXG5cdC8vIEFuaW1hdGlvblxuXHRBTklNQVRJT05fU1RBUlQ6IGJyb3dzZXIuaXNXZWJLaXQgPyAnd2Via2l0QW5pbWF0aW9uU3RhcnQnIDogJ2FuaW1hdGlvbnN0YXJ0Jyxcblx0QU5JTUFUSU9OX0VORDogYnJvd3Nlci5pc1dlYktpdCA/ICd3ZWJraXRBbmltYXRpb25FbmQnIDogJ2FuaW1hdGlvbmVuZCcsXG5cdEFOSU1BVElPTl9JVEVSQVRJT046IGJyb3dzZXIuaXNXZWJLaXQgPyAnd2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uJyA6ICdhbmltYXRpb25pdGVyYXRpb24nXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50TGlrZSB7XG5cdHByZXZlbnREZWZhdWx0KCk6IHZvaWQ7XG5cdHN0b3BQcm9wYWdhdGlvbigpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFdmVudExpa2Uob2JqOiB1bmtub3duKTogb2JqIGlzIEV2ZW50TGlrZSB7XG5cdGNvbnN0IGNhbmRpZGF0ZSA9IG9iaiBhcyBFdmVudExpa2UgfCB1bmRlZmluZWQ7XG5cblx0cmV0dXJuICEhKGNhbmRpZGF0ZSAmJiB0eXBlb2YgY2FuZGlkYXRlLnByZXZlbnREZWZhdWx0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjYW5kaWRhdGUuc3RvcFByb3BhZ2F0aW9uID09PSAnZnVuY3Rpb24nKTtcbn1cblxuZXhwb3J0IGNvbnN0IEV2ZW50SGVscGVyID0ge1xuXHRzdG9wOiA8VCBleHRlbmRzIEV2ZW50TGlrZT4oZTogVCwgY2FuY2VsQnViYmxlPzogYm9vbGVhbik6IFQgPT4ge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRpZiAoY2FuY2VsQnViYmxlKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0XHRyZXR1cm4gZTtcblx0fVxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJRm9jdXNUcmFja2VyIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG5cdHJlYWRvbmx5IG9uRGlkRm9jdXM6IGV2ZW50LkV2ZW50PHZvaWQ+O1xuXHRyZWFkb25seSBvbkRpZEJsdXI6IGV2ZW50LkV2ZW50PHZvaWQ+O1xuXHRyZWZyZXNoU3RhdGUoKTogdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVQYXJlbnRzU2Nyb2xsVG9wKG5vZGU6IEVsZW1lbnQpOiBudW1iZXJbXSB7XG5cdGNvbnN0IHI6IG51bWJlcltdID0gW107XG5cdGZvciAobGV0IGkgPSAwOyBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IG5vZGUuRUxFTUVOVF9OT0RFOyBpKyspIHtcblx0XHRyW2ldID0gbm9kZS5zY3JvbGxUb3A7XG5cdFx0bm9kZSA9IDxFbGVtZW50Pm5vZGUucGFyZW50Tm9kZTtcblx0fVxuXHRyZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc3RvcmVQYXJlbnRzU2Nyb2xsVG9wKG5vZGU6IEVsZW1lbnQsIHN0YXRlOiBudW1iZXJbXSk6IHZvaWQge1xuXHRmb3IgKGxldCBpID0gMDsgbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBub2RlLkVMRU1FTlRfTk9ERTsgaSsrKSB7XG5cdFx0aWYgKG5vZGUuc2Nyb2xsVG9wICE9PSBzdGF0ZVtpXSkge1xuXHRcdFx0bm9kZS5zY3JvbGxUb3AgPSBzdGF0ZVtpXTtcblx0XHR9XG5cdFx0bm9kZSA9IDxFbGVtZW50Pm5vZGUucGFyZW50Tm9kZTtcblx0fVxufVxuXG5jbGFzcyBGb2N1c1RyYWNrZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUZvY3VzVHJhY2tlciB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfb25EaWRGb2N1cyA9IHRoaXMuX3JlZ2lzdGVyKG5ldyBldmVudC5FbWl0dGVyPHZvaWQ+KCkpO1xuXHRyZWFkb25seSBvbkRpZEZvY3VzID0gdGhpcy5fb25EaWRGb2N1cy5ldmVudDtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9vbkRpZEJsdXIgPSB0aGlzLl9yZWdpc3RlcihuZXcgZXZlbnQuRW1pdHRlcjx2b2lkPigpKTtcblx0cmVhZG9ubHkgb25EaWRCbHVyID0gdGhpcy5fb25EaWRCbHVyLmV2ZW50O1xuXG5cdHByaXZhdGUgX3JlZnJlc2hTdGF0ZUhhbmRsZXI6ICgpID0+IHZvaWQ7XG5cblx0cHJpdmF0ZSBzdGF0aWMgaGFzRm9jdXNXaXRoaW4oZWxlbWVudDogSFRNTEVsZW1lbnQgfCBXaW5kb3cpOiBib29sZWFuIHtcblx0XHRpZiAoaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuXHRcdFx0Y29uc3Qgc2hhZG93Um9vdCA9IGdldFNoYWRvd1Jvb3QoZWxlbWVudCk7XG5cdFx0XHRjb25zdCBhY3RpdmVFbGVtZW50ID0gKHNoYWRvd1Jvb3QgPyBzaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQgOiBlbGVtZW50Lm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG5cdFx0XHRyZXR1cm4gaXNBbmNlc3RvcihhY3RpdmVFbGVtZW50LCBlbGVtZW50KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgd2luZG93ID0gZWxlbWVudDtcblx0XHRcdHJldHVybiBpc0FuY2VzdG9yKHdpbmRvdy5kb2N1bWVudC5hY3RpdmVFbGVtZW50LCB3aW5kb3cuZG9jdW1lbnQpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgV2luZG93KSB7XG5cdFx0c3VwZXIoKTtcblx0XHRsZXQgaGFzRm9jdXMgPSBGb2N1c1RyYWNrZXIuaGFzRm9jdXNXaXRoaW4oZWxlbWVudCk7XG5cdFx0bGV0IGxvb3NpbmdGb2N1cyA9IGZhbHNlO1xuXG5cdFx0Y29uc3Qgb25Gb2N1cyA9ICgpID0+IHtcblx0XHRcdGxvb3NpbmdGb2N1cyA9IGZhbHNlO1xuXHRcdFx0aWYgKCFoYXNGb2N1cykge1xuXHRcdFx0XHRoYXNGb2N1cyA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX29uRGlkRm9jdXMuZmlyZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBvbkJsdXIgPSAoKSA9PiB7XG5cdFx0XHRpZiAoaGFzRm9jdXMpIHtcblx0XHRcdFx0bG9vc2luZ0ZvY3VzID0gdHJ1ZTtcblx0XHRcdFx0KGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRXaW5kb3coZWxlbWVudCkgOiBlbGVtZW50KS5zZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRpZiAobG9vc2luZ0ZvY3VzKSB7XG5cdFx0XHRcdFx0XHRsb29zaW5nRm9jdXMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGhhc0ZvY3VzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR0aGlzLl9vbkRpZEJsdXIuZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRoaXMuX3JlZnJlc2hTdGF0ZUhhbmRsZXIgPSAoKSA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50Tm9kZUhhc0ZvY3VzID0gRm9jdXNUcmFja2VyLmhhc0ZvY3VzV2l0aGluKDxIVE1MRWxlbWVudD5lbGVtZW50KTtcblx0XHRcdGlmIChjdXJyZW50Tm9kZUhhc0ZvY3VzICE9PSBoYXNGb2N1cykge1xuXHRcdFx0XHRpZiAoaGFzRm9jdXMpIHtcblx0XHRcdFx0XHRvbkJsdXIoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvbkZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5fcmVnaXN0ZXIoYWRkRGlzcG9zYWJsZUxpc3RlbmVyKGVsZW1lbnQsIEV2ZW50VHlwZS5GT0NVUywgb25Gb2N1cywgdHJ1ZSkpO1xuXHRcdHRoaXMuX3JlZ2lzdGVyKGFkZERpc3Bvc2FibGVMaXN0ZW5lcihlbGVtZW50LCBFdmVudFR5cGUuQkxVUiwgb25CbHVyLCB0cnVlKSk7XG5cdFx0aWYgKGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcblx0XHRcdHRoaXMuX3JlZ2lzdGVyKGFkZERpc3Bvc2FibGVMaXN0ZW5lcihlbGVtZW50LCBFdmVudFR5cGUuRk9DVVNfSU4sICgpID0+IHRoaXMuX3JlZnJlc2hTdGF0ZUhhbmRsZXIoKSkpO1xuXHRcdFx0dGhpcy5fcmVnaXN0ZXIoYWRkRGlzcG9zYWJsZUxpc3RlbmVyKGVsZW1lbnQsIEV2ZW50VHlwZS5GT0NVU19PVVQsICgpID0+IHRoaXMuX3JlZnJlc2hTdGF0ZUhhbmRsZXIoKSkpO1xuXHRcdH1cblxuXHR9XG5cblx0cmVmcmVzaFN0YXRlKCkge1xuXHRcdHRoaXMuX3JlZnJlc2hTdGF0ZUhhbmRsZXIoKTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYElGb2N1c1RyYWNrZXJgIGluc3RhbmNlIHRoYXQgdHJhY2tzIGZvY3VzIGNoYW5nZXMgb24gdGhlIGdpdmVuIGBlbGVtZW50YCBhbmQgaXRzIGRlc2NlbmRhbnRzLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IFRoZSBgSFRNTEVsZW1lbnRgIG9yIGBXaW5kb3dgIHRvIHRyYWNrIGZvY3VzIGNoYW5nZXMgb24uXG4gKiBAcmV0dXJucyBBbiBgSUZvY3VzVHJhY2tlcmAgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFja0ZvY3VzKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgV2luZG93KTogSUZvY3VzVHJhY2tlciB7XG5cdHJldHVybiBuZXcgRm9jdXNUcmFja2VyKGVsZW1lbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXI8VCBleHRlbmRzIE5vZGU+KHNpYmxpbmc6IEhUTUxFbGVtZW50LCBjaGlsZDogVCk6IFQge1xuXHRzaWJsaW5nLmFmdGVyKGNoaWxkKTtcblx0cmV0dXJuIGNoaWxkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kPFQgZXh0ZW5kcyBOb2RlPihwYXJlbnQ6IEhUTUxFbGVtZW50LCBjaGlsZDogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kPFQgZXh0ZW5kcyBOb2RlPihwYXJlbnQ6IEhUTUxFbGVtZW50LCAuLi5jaGlsZHJlbjogKFQgfCBzdHJpbmcpW10pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZDxUIGV4dGVuZHMgTm9kZT4ocGFyZW50OiBIVE1MRWxlbWVudCwgLi4uY2hpbGRyZW46IChUIHwgc3RyaW5nKVtdKTogVCB8IHZvaWQge1xuXHRwYXJlbnQuYXBwZW5kKC4uLmNoaWxkcmVuKTtcblx0aWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgY2hpbGRyZW5bMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIDxUPmNoaWxkcmVuWzBdO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwZW5kPFQgZXh0ZW5kcyBOb2RlPihwYXJlbnQ6IEhUTUxFbGVtZW50LCBjaGlsZDogVCk6IFQge1xuXHRwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBwYXJlbnQuZmlyc3RDaGlsZCk7XG5cdHJldHVybiBjaGlsZDtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBjaGlsZHJlbiBmcm9tIGBwYXJlbnRgIGFuZCBhcHBlbmRzIGBjaGlsZHJlbmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0KHBhcmVudDogSFRNTEVsZW1lbnQsIC4uLmNoaWxkcmVuOiBBcnJheTxOb2RlIHwgc3RyaW5nPik6IHZvaWQge1xuXHRwYXJlbnQuaW5uZXJUZXh0ID0gJyc7XG5cdGFwcGVuZChwYXJlbnQsIC4uLmNoaWxkcmVuKTtcbn1cblxuY29uc3QgU0VMRUNUT1JfUkVHRVggPSAvKFtcXHdcXC1dKyk/KCMoW1xcd1xcLV0rKSk/KChcXC4oW1xcd1xcLV0rKSkqKS87XG5cbmV4cG9ydCBlbnVtIE5hbWVzcGFjZSB7XG5cdEhUTUwgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsXG5cdFNWRyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zydcbn1cblxuZnVuY3Rpb24gXyQ8VCBleHRlbmRzIEVsZW1lbnQ+KG5hbWVzcGFjZTogTmFtZXNwYWNlLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBhdHRycz86IHsgW2tleTogc3RyaW5nXTogYW55IH0sIC4uLmNoaWxkcmVuOiBBcnJheTxOb2RlIHwgc3RyaW5nPik6IFQge1xuXHRjb25zdCBtYXRjaCA9IFNFTEVDVE9SX1JFR0VYLmV4ZWMoZGVzY3JpcHRpb24pO1xuXG5cdGlmICghbWF0Y2gpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0JhZCB1c2Ugb2YgZW1tZXQnKTtcblx0fVxuXG5cdGNvbnN0IHRhZ05hbWUgPSBtYXRjaFsxXSB8fCAnZGl2Jztcblx0bGV0IHJlc3VsdDogVDtcblxuXHRpZiAobmFtZXNwYWNlICE9PSBOYW1lc3BhY2UuSFRNTCkge1xuXHRcdHJlc3VsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UgYXMgc3RyaW5nLCB0YWdOYW1lKSBhcyBUO1xuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkgYXMgdW5rbm93biBhcyBUO1xuXHR9XG5cblx0aWYgKG1hdGNoWzNdKSB7XG5cdFx0cmVzdWx0LmlkID0gbWF0Y2hbM107XG5cdH1cblx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0cmVzdWx0LmNsYXNzTmFtZSA9IG1hdGNoWzRdLnJlcGxhY2UoL1xcLi9nLCAnICcpLnRyaW0oKTtcblx0fVxuXG5cdGlmIChhdHRycykge1xuXHRcdE9iamVjdC5lbnRyaWVzKGF0dHJzKS5mb3JFYWNoKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICgvXm9uXFx3KyQvLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0KDxhbnk+cmVzdWx0KVtuYW1lXSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChuYW1lID09PSAnc2VsZWN0ZWQnKSB7XG5cdFx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRcdHJlc3VsdC5zZXRBdHRyaWJ1dGUobmFtZSwgJ3RydWUnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHJlc3VsdC5hcHBlbmQoLi4uY2hpbGRyZW4pO1xuXG5cdHJldHVybiByZXN1bHQgYXMgVDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uICQ8VCBleHRlbmRzIEhUTUxFbGVtZW50PihkZXNjcmlwdGlvbjogc3RyaW5nLCBhdHRycz86IHsgW2tleTogc3RyaW5nXTogYW55IH0sIC4uLmNoaWxkcmVuOiBBcnJheTxOb2RlIHwgc3RyaW5nPik6IFQge1xuXHRyZXR1cm4gXyQoTmFtZXNwYWNlLkhUTUwsIGRlc2NyaXB0aW9uLCBhdHRycywgLi4uY2hpbGRyZW4pO1xufVxuXG4kLlNWRyA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgU1ZHRWxlbWVudD4oZGVzY3JpcHRpb246IHN0cmluZywgYXR0cnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCAuLi5jaGlsZHJlbjogQXJyYXk8Tm9kZSB8IHN0cmluZz4pOiBUIHtcblx0cmV0dXJuIF8kKE5hbWVzcGFjZS5TVkcsIGRlc2NyaXB0aW9uLCBhdHRycywgLi4uY2hpbGRyZW4pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGpvaW4obm9kZXM6IE5vZGVbXSwgc2VwYXJhdG9yOiBOb2RlIHwgc3RyaW5nKTogTm9kZVtdIHtcblx0Y29uc3QgcmVzdWx0OiBOb2RlW10gPSBbXTtcblxuXHRub2Rlcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4ge1xuXHRcdGlmIChpbmRleCA+IDApIHtcblx0XHRcdGlmIChzZXBhcmF0b3IgaW5zdGFuY2VvZiBOb2RlKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKHNlcGFyYXRvci5jbG9uZU5vZGUoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHQucHVzaChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzZXBhcmF0b3IpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXN1bHQucHVzaChub2RlKTtcblx0fSk7XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFZpc2liaWxpdHkodmlzaWJsZTogYm9vbGVhbiwgLi4uZWxlbWVudHM6IEhUTUxFbGVtZW50W10pOiB2b2lkIHtcblx0aWYgKHZpc2libGUpIHtcblx0XHRzaG93KC4uLmVsZW1lbnRzKTtcblx0fSBlbHNlIHtcblx0XHRoaWRlKC4uLmVsZW1lbnRzKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdyguLi5lbGVtZW50czogSFRNTEVsZW1lbnRbXSk6IHZvaWQge1xuXHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcblx0XHRlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcblx0XHRlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlkZSguLi5lbGVtZW50czogSFRNTEVsZW1lbnRbXSk6IHZvaWQge1xuXHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcblx0XHRlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblx0fVxufVxuXG5mdW5jdGlvbiBmaW5kUGFyZW50V2l0aEF0dHJpYnV0ZShub2RlOiBOb2RlIHwgbnVsbCwgYXR0cmlidXRlOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuXHR3aGlsZSAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBub2RlLkVMRU1FTlRfTk9ERSkge1xuXHRcdGlmIChpc0hUTUxFbGVtZW50KG5vZGUpICYmIG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpIHtcblx0XHRcdHJldHVybiBub2RlO1xuXHRcdH1cblxuXHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRhYkluZGV4QW5kVXBkYXRlRm9jdXMobm9kZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcblx0aWYgKCFub2RlIHx8ICFub2RlLmhhc0F0dHJpYnV0ZSgndGFiSW5kZXgnKSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIElmIHdlIGFyZSB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCBhbmQgdGFiSW5kZXggaXMgcmVtb3ZlZCxcblx0Ly8gc3RhbmRhcmQgRE9NIGJlaGF2aW9yIGlzIHRvIG1vdmUgZm9jdXMgdG8gdGhlIDxib2R5PiBlbGVtZW50LiBXZVxuXHQvLyB0eXBpY2FsbHkgbmV2ZXIgd2FudCB0aGF0LCByYXRoZXIgcHV0IGZvY3VzIHRvIHRoZSBjbG9zZXN0IGVsZW1lbnRcblx0Ly8gaW4gdGhlIGhpZXJhcmNoeSBvZiB0aGUgcGFyZW50IERPTSBub2Rlcy5cblx0aWYgKG5vZGUub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBub2RlKSB7XG5cdFx0Y29uc3QgcGFyZW50Rm9jdXNhYmxlID0gZmluZFBhcmVudFdpdGhBdHRyaWJ1dGUobm9kZS5wYXJlbnRFbGVtZW50LCAndGFiSW5kZXgnKTtcblx0XHRwYXJlbnRGb2N1c2FibGU/LmZvY3VzKCk7XG5cdH1cblxuXHRub2RlLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsSGFuZGxlcjxUIGV4dGVuZHMgRXZlbnQ+KGZuOiAoZXZlbnQ6IFQpID0+IGFueSk6IChldmVudDogVCkgPT4gYW55IHtcblx0cmV0dXJuIGUgPT4ge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGZuKGUpO1xuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9tQ29udGVudExvYWRlZCh0YXJnZXRXaW5kb3c6IFdpbmRvdyk6IFByb21pc2U8dm9pZD4ge1xuXHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG5cdFx0Y29uc3QgcmVhZHlTdGF0ZSA9IHRhcmdldFdpbmRvdy5kb2N1bWVudC5yZWFkeVN0YXRlO1xuXHRcdGlmIChyZWFkeVN0YXRlID09PSAnY29tcGxldGUnIHx8ICh0YXJnZXRXaW5kb3cuZG9jdW1lbnQgJiYgdGFyZ2V0V2luZG93LmRvY3VtZW50LmJvZHkgIT09IG51bGwpKSB7XG5cdFx0XHRyZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuXHRcdFx0XHR0YXJnZXRXaW5kb3cud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBsaXN0ZW5lciwgZmFsc2UpO1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9O1xuXG5cdFx0XHR0YXJnZXRXaW5kb3cud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBsaXN0ZW5lciwgZmFsc2UpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogRmluZCBhIHZhbHVlIHVzYWJsZSBmb3IgYSBkb20gbm9kZSBzaXplIHN1Y2ggdGhhdCB0aGUgbGlrZWxpaG9vZCB0aGF0IGl0IHdvdWxkIGJlXG4gKiBkaXNwbGF5ZWQgd2l0aCBjb25zdGFudCBzY3JlZW4gcGl4ZWxzIHNpemUgaXMgYXMgaGlnaCBhcyBwb3NzaWJsZS5cbiAqXG4gKiBlLmcuIFdlIHdvdWxkIGRlc2lyZSBmb3IgdGhlIGN1cnNvcnMgdG8gYmUgMnB4IChDU1MgcHgpIHdpZGUuIFVuZGVyIGEgZGV2aWNlUGl4ZWxSYXRpb1xuICogb2YgMS4yNSwgdGhlIGN1cnNvciB3aWxsIGJlIDIuNSBzY3JlZW4gcGl4ZWxzIHdpZGUuIERlcGVuZGluZyBvbiBob3cgdGhlIGRvbSBub2RlIGFsaWducy9cInNuYXBzXCJcbiAqIHdpdGggdGhlIHNjcmVlbiBwaXhlbHMsIGl0IHdpbGwgc29tZXRpbWVzIGJlIHJlbmRlcmVkIHdpdGggMiBzY3JlZW4gcGl4ZWxzLCBhbmQgc29tZXRpbWVzIHdpdGggMyBzY3JlZW4gcGl4ZWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNjcmVlbkF3YXJlU2l6ZSh3aW5kb3c6IFdpbmRvdywgY3NzUHg6IG51bWJlcik6IG51bWJlciB7XG5cdGNvbnN0IHNjcmVlblB4ID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiBjc3NQeDtcblx0cmV0dXJuIE1hdGgubWF4KDEsIE1hdGguZmxvb3Ioc2NyZWVuUHgpKSAvIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xufVxuXG4vKipcbiAqIE9wZW4gc2FmZWx5IGEgbmV3IHdpbmRvdy4gVGhpcyBpcyB0aGUgYmVzdCB3YXkgdG8gZG8gc28sIGJ1dCB5b3UgY2Fubm90IHRlbGxcbiAqIGlmIHRoZSB3aW5kb3cgd2FzIG9wZW5lZCBvciBpZiBpdCB3YXMgYmxvY2tlZCBieSB0aGUgYnJvd3NlcidzIHBvcHVwIGJsb2NrZXIuXG4gKiBJZiB5b3Ugd2FudCB0byB0ZWxsIGlmIHRoZSBicm93c2VyIGJsb2NrZWQgdGhlIG5ldyB3aW5kb3csIHVzZSB7QGxpbmsgd2luZG93T3BlbldpdGhTdWNjZXNzfS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9tb25hY28tZWRpdG9yL2lzc3Vlcy82MDFcbiAqIFRvIHByb3RlY3QgYWdhaW5zdCBtYWxpY2lvdXMgY29kZSBpbiB0aGUgbGlua2VkIHNpdGUsIHBhcnRpY3VsYXJseSBwaGlzaGluZyBhdHRlbXB0cyxcbiAqIHRoZSB3aW5kb3cub3BlbmVyIHNob3VsZCBiZSBzZXQgdG8gbnVsbCB0byBwcmV2ZW50IHRoZSBsaW5rZWQgc2l0ZSBmcm9tIGhhdmluZyBhY2Nlc3NcbiAqIHRvIGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgcGFnZS5cbiAqIFNlZSBodHRwczovL21hdGhpYXNieW5lbnMuZ2l0aHViLmlvL3JlbC1ub29wZW5lci9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd09wZW5Ob09wZW5lcih1cmw6IHN0cmluZyk6IHZvaWQge1xuXHQvLyBCeSB1c2luZyAnbm9vcGVuZXInIGluIHRoZSBgd2luZG93RmVhdHVyZXNgIGFyZ3VtZW50LCB0aGUgbmV3bHkgY3JlYXRlZCB3aW5kb3cgd2lsbFxuXHQvLyBub3QgYmUgYWJsZSB0byB1c2UgYHdpbmRvdy5vcGVuZXJgIHRvIHJlYWNoIGJhY2sgdG8gdGhlIGN1cnJlbnQgcGFnZS5cblx0Ly8gU2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80Njk1ODczMVxuXHQvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9vcGVuI25vb3BlbmVyXG5cdC8vIEhvd2V2ZXIsIHRoaXMgYWxzbyBkb2Vzbid0IGFsbG93IHVzIHRvIHJlYWxpemUgaWYgdGhlIGJyb3dzZXIgYmxvY2tlZFxuXHQvLyB0aGUgY3JlYXRpb24gb2YgdGhlIHdpbmRvdy5cblx0bWFpbldpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycsICdub29wZW5lcicpO1xufVxuXG4vKipcbiAqIE9wZW4gYSBuZXcgd2luZG93IGluIGEgcG9wdXAuIFRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGRvIHNvLCBidXQgeW91IGNhbm5vdCB0ZWxsXG4gKiBpZiB0aGUgd2luZG93IHdhcyBvcGVuZWQgb3IgaWYgaXQgd2FzIGJsb2NrZWQgYnkgdGhlIGJyb3dzZXIncyBwb3B1cCBibG9ja2VyLlxuICogSWYgeW91IHdhbnQgdG8gdGVsbCBpZiB0aGUgYnJvd3NlciBibG9ja2VkIHRoZSBuZXcgd2luZG93LCB1c2Uge0BsaW5rIHdpbmRvd09wZW5XaXRoU3VjY2Vzc30uXG4gKlxuICogTm90ZTogdGhpcyBkb2VzIG5vdCBzZXQge0BsaW5rIHdpbmRvdy5vcGVuZXJ9IHRvIG51bGwuIFRoaXMgaXMgdG8gYWxsb3cgdGhlIG9wZW5lZCBwb3B1cCB0b1xuICogYmUgYWJsZSB0byB1c2Uge0BsaW5rIHdpbmRvdy5jbG9zZX0gdG8gY2xvc2UgaXRzZWxmLiBCZWNhdXNlIG9mIHRoaXMsIHlvdSBzaG91bGQgb25seSB1c2VcbiAqIHRoaXMgZnVuY3Rpb24gb24gdXJscyB0aGF0IHlvdSB0cnVzdC5cbiAqXG4gKiBJbiBvdGhlcndvcmRzLCB5b3Ugc2hvdWxkIGFsbW9zdCBhbHdheXMgdXNlIHtAbGluayB3aW5kb3dPcGVuTm9PcGVuZXJ9IGluc3RlYWQgb2YgdGhpcyBmdW5jdGlvbi5cbiAqL1xuY29uc3QgcG9wdXBXaWR0aCA9IDc4MCwgcG9wdXBIZWlnaHQgPSA2NDA7XG5leHBvcnQgZnVuY3Rpb24gd2luZG93T3BlblBvcHVwKHVybDogc3RyaW5nKTogdm9pZCB7XG5cdGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKG1haW5XaW5kb3cuc2NyZWVuTGVmdCArIG1haW5XaW5kb3cuaW5uZXJXaWR0aCAvIDIgLSBwb3B1cFdpZHRoIC8gMik7XG5cdGNvbnN0IHRvcCA9IE1hdGguZmxvb3IobWFpbldpbmRvdy5zY3JlZW5Ub3AgKyBtYWluV2luZG93LmlubmVySGVpZ2h0IC8gMiAtIHBvcHVwSGVpZ2h0IC8gMik7XG5cdG1haW5XaW5kb3cub3Blbihcblx0XHR1cmwsXG5cdFx0J19ibGFuaycsXG5cdFx0YHdpZHRoPSR7cG9wdXBXaWR0aH0saGVpZ2h0PSR7cG9wdXBIZWlnaHR9LHRvcD0ke3RvcH0sbGVmdD0ke2xlZnR9YFxuXHQpO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIG9wZW4gYSB3aW5kb3cgYW5kIHJldHVybnMgd2hldGhlciBpdCBzdWNjZWVkZWQuIFRoaXMgdGVjaG5pcXVlIGlzXG4gKiBub3QgYXBwcm9wcmlhdGUgaW4gY2VydGFpbiBjb250ZXh0cywgbGlrZSBmb3IgZXhhbXBsZSB3aGVuIHRoZSBKUyBjb250ZXh0IGlzXG4gKiBleGVjdXRpbmcgaW5zaWRlIGEgc2FuZGJveGVkIGlmcmFtZS4gSWYgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93IGlmIHRoZVxuICogYnJvd3NlciBibG9ja2VkIHRoZSBuZXcgd2luZG93LCB1c2Uge0BsaW5rIHdpbmRvd09wZW5Ob09wZW5lcn0uXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvbW9uYWNvLWVkaXRvci9pc3N1ZXMvNjAxXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9tb25hY28tZWRpdG9yL2lzc3Vlcy8yNDc0XG4gKiBTZWUgaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmdpdGh1Yi5pby9yZWwtbm9vcGVuZXIvXG4gKlxuICogQHBhcmFtIHVybCB0aGUgdXJsIHRvIG9wZW5cbiAqIEBwYXJhbSBub09wZW5lciB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlIHtAbGluayB3aW5kb3cub3BlbmVyfSB0byBudWxsLiBZb3Ugc2hvdWxkIGxlYXZlIHRoZSBkZWZhdWx0XG4gKiAodHJ1ZSkgdW5sZXNzIHlvdSB0cnVzdCB0aGUgdXJsIHRoYXQgaXMgYmVpbmcgb3BlbmVkLlxuICogQHJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB7QGxpbmsgd2luZG93Lm9wZW59IGNhbGwgc3VjY2VlZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aW5kb3dPcGVuV2l0aFN1Y2Nlc3ModXJsOiBzdHJpbmcsIG5vT3BlbmVyID0gdHJ1ZSk6IGJvb2xlYW4ge1xuXHRjb25zdCBuZXdUYWIgPSBtYWluV2luZG93Lm9wZW4oKTtcblx0aWYgKG5ld1RhYikge1xuXHRcdGlmIChub09wZW5lcikge1xuXHRcdFx0Ly8gc2VlIGB3aW5kb3dPcGVuTm9PcGVuZXJgIGZvciBkZXRhaWxzIG9uIHdoeSB0aGlzIGlzIGltcG9ydGFudFxuXHRcdFx0KG5ld1RhYiBhcyBhbnkpLm9wZW5lciA9IG51bGw7XG5cdFx0fVxuXHRcdG5ld1RhYi5sb2NhdGlvbi5ocmVmID0gdXJsO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFuaW1hdGUodGFyZ2V0V2luZG93OiBXaW5kb3csIGZuOiAoKSA9PiB2b2lkKTogSURpc3Bvc2FibGUge1xuXHRjb25zdCBzdGVwID0gKCkgPT4ge1xuXHRcdGZuKCk7XG5cdFx0c3RlcERpc3Bvc2FibGUgPSBzY2hlZHVsZUF0TmV4dEFuaW1hdGlvbkZyYW1lKHRhcmdldFdpbmRvdywgc3RlcCk7XG5cdH07XG5cblx0bGV0IHN0ZXBEaXNwb3NhYmxlID0gc2NoZWR1bGVBdE5leHRBbmltYXRpb25GcmFtZSh0YXJnZXRXaW5kb3csIHN0ZXApO1xuXHRyZXR1cm4gdG9EaXNwb3NhYmxlKCgpID0+IHN0ZXBEaXNwb3NhYmxlLmRpc3Bvc2UoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc0NTU1Byb3BlcnR5VmFsdWUodmFsdWU6IHN0cmluZykge1xuXHRyZXR1cm4gYCcke3ZhbHVlLnJlcGxhY2UoLycvZywgJyUyNycpfSdgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNDc3NWYWx1ZVdpdGhEZWZhdWx0KGNzc1Byb3BlcnR5VmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGZsdDogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKGNzc1Byb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IHZhcmlhYmxlTWF0Y2ggPSBjc3NQcm9wZXJ0eVZhbHVlLm1hdGNoKC9eXFxzKnZhclxcKCguKylcXCkkLyk7XG5cdFx0aWYgKHZhcmlhYmxlTWF0Y2gpIHtcblx0XHRcdGNvbnN0IHZhckFyZ3VtZW50cyA9IHZhcmlhYmxlTWF0Y2hbMV0uc3BsaXQoJywnLCAyKTtcblx0XHRcdGlmICh2YXJBcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdGRmbHQgPSBhc0Nzc1ZhbHVlV2l0aERlZmF1bHQodmFyQXJndW1lbnRzWzFdLnRyaW0oKSwgZGZsdCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYHZhcigke3ZhckFyZ3VtZW50c1swXX0sICR7ZGZsdH0pYDtcblx0XHR9XG5cdFx0cmV0dXJuIGNzc1Byb3BlcnR5VmFsdWU7XG5cdH1cblx0cmV0dXJuIGRmbHQ7XG59XG5cbmV4cG9ydCBlbnVtIERldGVjdGVkRnVsbHNjcmVlbk1vZGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgZG9jdW1lbnQgaXMgZnVsbHNjcmVlbiwgZS5nLiBiZWNhdXNlIGFuIGVsZW1lbnRcblx0ICogaW4gdGhlIGRvY3VtZW50IHJlcXVlc3RlZCB0byBiZSBmdWxsc2NyZWVuLlxuXHQgKi9cblx0RE9DVU1FTlQgPSAxLFxuXG5cdC8qKlxuXHQgKiBUaGUgYnJvd3NlciBpcyBmdWxsc2NyZWVuLCBlLmcuIGJlY2F1c2UgdGhlIHVzZXIgZW5hYmxlZFxuXHQgKiBuYXRpdmUgd2luZG93IGZ1bGxzY3JlZW4gZm9yIGl0LlxuXHQgKi9cblx0QlJPV1NFUlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXRlY3RlZEZ1bGxzY3JlZW4ge1xuXG5cdC8qKlxuXHQgKiBGaWd1cmUgb3V0IGlmIHRoZSBkb2N1bWVudCBpcyBmdWxsc2NyZWVuIG9yIHRoZSBicm93c2VyLlxuXHQgKi9cblx0bW9kZTogRGV0ZWN0ZWRGdWxsc2NyZWVuTW9kZTtcblxuXHQvKipcblx0ICogV2hldGhlciB3ZSBrbm93IGZvciBzdXJlIHRoYXQgd2UgYXJlIGluIGZ1bGxzY3JlZW4gbW9kZSBvclxuXHQgKiBpdCBpcyBhIGd1ZXNzLlxuXHQgKi9cblx0Z3Vlc3M6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RGdWxsc2NyZWVuKHRhcmdldFdpbmRvdzogV2luZG93KTogSURldGVjdGVkRnVsbHNjcmVlbiB8IG51bGwge1xuXG5cdC8vIEJyb3dzZXIgZnVsbHNjcmVlbjogdXNlIERPTSBBUElzIHRvIGRldGVjdFxuXHRpZiAodGFyZ2V0V2luZG93LmRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8ICg8YW55PnRhcmdldFdpbmRvdy5kb2N1bWVudCkud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHwgKDxhbnk+dGFyZ2V0V2luZG93LmRvY3VtZW50KS53ZWJraXRJc0Z1bGxTY3JlZW4pIHtcblx0XHRyZXR1cm4geyBtb2RlOiBEZXRlY3RlZEZ1bGxzY3JlZW5Nb2RlLkRPQ1VNRU5ULCBndWVzczogZmFsc2UgfTtcblx0fVxuXG5cdC8vIFRoZXJlIGlzIG5vIHN0YW5kYXJkIHdheSB0byBmaWd1cmUgb3V0IGlmIHRoZSBicm93c2VyXG5cdC8vIGlzIHVzaW5nIG5hdGl2ZSBmdWxsc2NyZWVuLiBWaWEgY2hlY2tpbmcgb24gc2NyZWVuXG5cdC8vIGhlaWdodCBhbmQgY29tcGFyaW5nIHRoYXQgdG8gd2luZG93IGhlaWdodCwgd2UgY2FuIGd1ZXNzXG5cdC8vIGl0IHRob3VnaC5cblxuXHRpZiAodGFyZ2V0V2luZG93LmlubmVySGVpZ2h0ID09PSB0YXJnZXRXaW5kb3cuc2NyZWVuLmhlaWdodCkge1xuXHRcdC8vIGlmIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdyBtYXRjaGVzIHRoZSBzY3JlZW4gaGVpZ2h0LCB3ZSBjYW5cblx0XHQvLyBzYWZlbHkgYXNzdW1lIHRoYXQgdGhlIGJyb3dzZXIgaXMgZnVsbHNjcmVlbiBiZWNhdXNlIG5vIGJyb3dzZXJcblx0XHQvLyBjaHJvbWUgaXMgdGFraW5nIGhlaWdodCBhd2F5IChlLmcuIGxpa2UgdG9vbGJhcnMpLlxuXHRcdHJldHVybiB7IG1vZGU6IERldGVjdGVkRnVsbHNjcmVlbk1vZGUuQlJPV1NFUiwgZ3Vlc3M6IGZhbHNlIH07XG5cdH1cblxuXHRpZiAocGxhdGZvcm0uaXNNYWNpbnRvc2ggfHwgcGxhdGZvcm0uaXNMaW51eCkge1xuXHRcdC8vIG1hY09TIGFuZCBMaW51eCBkbyBub3QgcHJvcGVybHkgcmVwb3J0IGBpbm5lckhlaWdodGAsIG9ubHkgV2luZG93cyBkb2VzXG5cdFx0aWYgKHRhcmdldFdpbmRvdy5vdXRlckhlaWdodCA9PT0gdGFyZ2V0V2luZG93LnNjcmVlbi5oZWlnaHQgJiYgdGFyZ2V0V2luZG93Lm91dGVyV2lkdGggPT09IHRhcmdldFdpbmRvdy5zY3JlZW4ud2lkdGgpIHtcblx0XHRcdC8vIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGJyb3dzZXIgbWF0Y2hlcyB0aGUgc2NyZWVuIGhlaWdodCwgd2UgY2FuXG5cdFx0XHQvLyBvbmx5IGd1ZXNzIHRoYXQgd2UgYXJlIGluIGZ1bGxzY3JlZW4uIEl0IGlzIGFsc28gcG9zc2libGUgdGhhdFxuXHRcdFx0Ly8gdGhlIHVzZXIgaGFzIHR1cm5lZCBvZmYgdGFza2JhcnMgaW4gdGhlIE9TIGFuZCB0aGUgYnJvd3NlciBpc1xuXHRcdFx0Ly8gc2ltcGx5IGFibGUgdG8gc3BhbiB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcmVlbi5cblx0XHRcdHJldHVybiB7IG1vZGU6IERldGVjdGVkRnVsbHNjcmVlbk1vZGUuQlJPV1NFUiwgZ3Vlc3M6IHRydWUgfTtcblx0XHR9XG5cdH1cblxuXHQvLyBOb3QgaW4gZnVsbHNjcmVlblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgVW5pY29kZSBzdHJpbmcgdG8gYSBzdHJpbmcgaW4gd2hpY2ggZWFjaCAxNi1iaXQgdW5pdCBvY2N1cGllcyBvbmx5IG9uZSBieXRlXG4gKlxuICogRnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93T3JXb3JrZXJHbG9iYWxTY29wZS9idG9hXG4gKi9cbmZ1bmN0aW9uIHRvQmluYXJ5KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgY29kZVVuaXRzID0gbmV3IFVpbnQxNkFycmF5KHN0ci5sZW5ndGgpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVVbml0cy5sZW5ndGg7IGkrKykge1xuXHRcdGNvZGVVbml0c1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXHR9XG5cdGxldCBiaW5hcnkgPSAnJztcblx0Y29uc3QgdWludDhhcnJheSA9IG5ldyBVaW50OEFycmF5KGNvZGVVbml0cy5idWZmZXIpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHVpbnQ4YXJyYXkubGVuZ3RoOyBpKyspIHtcblx0XHRiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1aW50OGFycmF5W2ldKTtcblx0fVxuXHRyZXR1cm4gYmluYXJ5O1xufVxuXG4vKipcbiAqIFZlcnNpb24gb2YgdGhlIGdsb2JhbCBgYnRvYWAgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBpbnN0ZWFkXG4gKiBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aWJ5dGVBd2FyZUJ0b2Eoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gYnRvYSh0b0JpbmFyeShzdHIpKTtcbn1cblxudHlwZSBNb2RpZmllcktleSA9ICdhbHQnIHwgJ2N0cmwnIHwgJ3NoaWZ0JyB8ICdtZXRhJztcblxuZXhwb3J0IGludGVyZmFjZSBJTW9kaWZpZXJLZXlTdGF0dXMge1xuXHRhbHRLZXk6IGJvb2xlYW47XG5cdHNoaWZ0S2V5OiBib29sZWFuO1xuXHRjdHJsS2V5OiBib29sZWFuO1xuXHRtZXRhS2V5OiBib29sZWFuO1xuXHRsYXN0S2V5UHJlc3NlZD86IE1vZGlmaWVyS2V5O1xuXHRsYXN0S2V5UmVsZWFzZWQ/OiBNb2RpZmllcktleTtcblx0ZXZlbnQ/OiBLZXlib2FyZEV2ZW50O1xufVxuXG5leHBvcnQgY2xhc3MgTW9kaWZpZXJLZXlFbWl0dGVyIGV4dGVuZHMgZXZlbnQuRW1pdHRlcjxJTW9kaWZpZXJLZXlTdGF0dXM+IHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9zdWJzY3JpcHRpb25zID0gbmV3IERpc3Bvc2FibGVTdG9yZSgpO1xuXHRwcml2YXRlIF9rZXlTdGF0dXM6IElNb2RpZmllcktleVN0YXR1cztcblx0cHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE1vZGlmaWVyS2V5RW1pdHRlcjtcblxuXHRwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9rZXlTdGF0dXMgPSB7XG5cdFx0XHRhbHRLZXk6IGZhbHNlLFxuXHRcdFx0c2hpZnRLZXk6IGZhbHNlLFxuXHRcdFx0Y3RybEtleTogZmFsc2UsXG5cdFx0XHRtZXRhS2V5OiBmYWxzZVxuXHRcdH07XG5cblx0XHR0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChldmVudC5FdmVudC5ydW5BbmRTdWJzY3JpYmUob25EaWRSZWdpc3RlcldpbmRvdywgKHsgd2luZG93LCBkaXNwb3NhYmxlcyB9KSA9PiB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKHdpbmRvdywgZGlzcG9zYWJsZXMpLCB7IHdpbmRvdzogbWFpbldpbmRvdywgZGlzcG9zYWJsZXM6IHRoaXMuX3N1YnNjcmlwdGlvbnMgfSkpO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3Rlckxpc3RlbmVycyh3aW5kb3c6IFdpbmRvdywgZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVTdG9yZSk6IHZvaWQge1xuXHRcdGRpc3Bvc2FibGVzLmFkZChhZGREaXNwb3NhYmxlTGlzdGVuZXIod2luZG93LCAna2V5ZG93bicsIGUgPT4ge1xuXHRcdFx0aWYgKGUuZGVmYXVsdFByZXZlbnRlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGV2ZW50ID0gbmV3IFN0YW5kYXJkS2V5Ym9hcmRFdmVudChlKTtcblx0XHRcdC8vIElmIEFsdC1rZXkga2V5ZG93biBldmVudCBpcyByZXBlYXRlZCwgaWdub3JlIGl0ICMxMTIzNDdcblx0XHRcdC8vIE9ubHkga25vd24gdG8gYmUgbmVjZXNzYXJ5IGZvciBBbHQtS2V5IGF0IHRoZSBtb21lbnQgIzExNTgxMFxuXHRcdFx0aWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuQWx0ICYmIGUucmVwZWF0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGUuYWx0S2V5ICYmICF0aGlzLl9rZXlTdGF0dXMuYWx0S2V5KSB7XG5cdFx0XHRcdHRoaXMuX2tleVN0YXR1cy5sYXN0S2V5UHJlc3NlZCA9ICdhbHQnO1xuXHRcdFx0fSBlbHNlIGlmIChlLmN0cmxLZXkgJiYgIXRoaXMuX2tleVN0YXR1cy5jdHJsS2V5KSB7XG5cdFx0XHRcdHRoaXMuX2tleVN0YXR1cy5sYXN0S2V5UHJlc3NlZCA9ICdjdHJsJztcblx0XHRcdH0gZWxzZSBpZiAoZS5tZXRhS2V5ICYmICF0aGlzLl9rZXlTdGF0dXMubWV0YUtleSkge1xuXHRcdFx0XHR0aGlzLl9rZXlTdGF0dXMubGFzdEtleVByZXNzZWQgPSAnbWV0YSc7XG5cdFx0XHR9IGVsc2UgaWYgKGUuc2hpZnRLZXkgJiYgIXRoaXMuX2tleVN0YXR1cy5zaGlmdEtleSkge1xuXHRcdFx0XHR0aGlzLl9rZXlTdGF0dXMubGFzdEtleVByZXNzZWQgPSAnc2hpZnQnO1xuXHRcdFx0fSBlbHNlIGlmIChldmVudC5rZXlDb2RlICE9PSBLZXlDb2RlLkFsdCkge1xuXHRcdFx0XHR0aGlzLl9rZXlTdGF0dXMubGFzdEtleVByZXNzZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2tleVN0YXR1cy5hbHRLZXkgPSBlLmFsdEtleTtcblx0XHRcdHRoaXMuX2tleVN0YXR1cy5jdHJsS2V5ID0gZS5jdHJsS2V5O1xuXHRcdFx0dGhpcy5fa2V5U3RhdHVzLm1ldGFLZXkgPSBlLm1ldGFLZXk7XG5cdFx0XHR0aGlzLl9rZXlTdGF0dXMuc2hpZnRLZXkgPSBlLnNoaWZ0S2V5O1xuXG5cdFx0XHRpZiAodGhpcy5fa2V5U3RhdHVzLmxhc3RLZXlQcmVzc2VkKSB7XG5cdFx0XHRcdHRoaXMuX2tleVN0YXR1cy5ldmVudCA9IGU7XG5cdFx0XHRcdHRoaXMuZmlyZSh0aGlzLl9rZXlTdGF0dXMpO1xuXHRcdFx0fVxuXHRcdH0sIHRydWUpKTtcblxuXHRcdGRpc3Bvc2FibGVzLmFkZChhZGREaXNwb3NhYmxlTGlzdGVuZXIod2luZG93LCAna2V5dXAnLCBlID0+IHtcblx0XHRcdGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWUuYWx0S2V5ICYmIHRoaXMuX2tleVN0YXR1cy5hbHRLZXkpIHtcblx0XHRcdFx0dGhpcy5fa2V5U3RhdHVzLmxhc3RLZXlSZWxlYXNlZCA9ICdhbHQnO1xuXHRcdFx0fSBlbHNlIGlmICghZS5jdHJsS2V5ICYmIHRoaXMuX2tleVN0YXR1cy5jdHJsS2V5KSB7XG5cdFx0XHRcdHRoaXMuX2tleVN0YXR1cy5sYXN0S2V5UmVsZWFzZWQgPSAnY3RybCc7XG5cdFx0XHR9IGVsc2UgaWYgKCFlLm1ldGFLZXkgJiYgdGhpcy5fa2V5U3RhdHVzLm1ldGFLZXkpIHtcblx0XHRcdFx0dGhpcy5fa2V5U3RhdHVzLmxhc3RLZXlSZWxlYXNlZCA9ICdtZXRhJztcblx0XHRcdH0gZWxzZSBpZiAoIWUuc2hpZnRLZXkgJiYgdGhpcy5fa2V5U3RhdHVzLnNoaWZ0S2V5KSB7XG5cdFx0XHRcdHRoaXMuX2tleVN0YXR1cy5sYXN0S2V5UmVsZWFzZWQgPSAnc2hpZnQnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fa2V5U3RhdHVzLmxhc3RLZXlSZWxlYXNlZCA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2tleVN0YXR1cy5sYXN0S2V5UHJlc3NlZCAhPT0gdGhpcy5fa2V5U3RhdHVzLmxhc3RLZXlSZWxlYXNlZCkge1xuXHRcdFx0XHR0aGlzLl9rZXlTdGF0dXMubGFzdEtleVByZXNzZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2tleVN0YXR1cy5hbHRLZXkgPSBlLmFsdEtleTtcblx0XHRcdHRoaXMuX2tleVN0YXR1cy5jdHJsS2V5ID0gZS5jdHJsS2V5O1xuXHRcdFx0dGhpcy5fa2V5U3RhdHVzLm1ldGFLZXkgPSBlLm1ldGFLZXk7XG5cdFx0XHR0aGlzLl9rZXlTdGF0dXMuc2hpZnRLZXkgPSBlLnNoaWZ0S2V5O1xuXG5cdFx0XHRpZiAodGhpcy5fa2V5U3RhdHVzLmxhc3RLZXlSZWxlYXNlZCkge1xuXHRcdFx0XHR0aGlzLl9rZXlTdGF0dXMuZXZlbnQgPSBlO1xuXHRcdFx0XHR0aGlzLmZpcmUodGhpcy5fa2V5U3RhdHVzKTtcblx0XHRcdH1cblx0XHR9LCB0cnVlKSk7XG5cblx0XHRkaXNwb3NhYmxlcy5hZGQoYWRkRGlzcG9zYWJsZUxpc3RlbmVyKHdpbmRvdy5kb2N1bWVudC5ib2R5LCAnbW91c2Vkb3duJywgKCkgPT4ge1xuXHRcdFx0dGhpcy5fa2V5U3RhdHVzLmxhc3RLZXlQcmVzc2VkID0gdW5kZWZpbmVkO1xuXHRcdH0sIHRydWUpKTtcblxuXHRcdGRpc3Bvc2FibGVzLmFkZChhZGREaXNwb3NhYmxlTGlzdGVuZXIod2luZG93LmRvY3VtZW50LmJvZHksICdtb3VzZXVwJywgKCkgPT4ge1xuXHRcdFx0dGhpcy5fa2V5U3RhdHVzLmxhc3RLZXlQcmVzc2VkID0gdW5kZWZpbmVkO1xuXHRcdH0sIHRydWUpKTtcblxuXHRcdGRpc3Bvc2FibGVzLmFkZChhZGREaXNwb3NhYmxlTGlzdGVuZXIod2luZG93LmRvY3VtZW50LmJvZHksICdtb3VzZW1vdmUnLCBlID0+IHtcblx0XHRcdGlmIChlLmJ1dHRvbnMpIHtcblx0XHRcdFx0dGhpcy5fa2V5U3RhdHVzLmxhc3RLZXlQcmVzc2VkID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH0sIHRydWUpKTtcblxuXHRcdGRpc3Bvc2FibGVzLmFkZChhZGREaXNwb3NhYmxlTGlzdGVuZXIod2luZG93LCAnYmx1cicsICgpID0+IHtcblx0XHRcdHRoaXMucmVzZXRLZXlTdGF0dXMoKTtcblx0XHR9KSk7XG5cdH1cblxuXHRnZXQga2V5U3RhdHVzKCk6IElNb2RpZmllcktleVN0YXR1cyB7XG5cdFx0cmV0dXJuIHRoaXMuX2tleVN0YXR1cztcblx0fVxuXG5cdGdldCBpc01vZGlmaWVyUHJlc3NlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fa2V5U3RhdHVzLmFsdEtleSB8fCB0aGlzLl9rZXlTdGF0dXMuY3RybEtleSB8fCB0aGlzLl9rZXlTdGF0dXMubWV0YUtleSB8fCB0aGlzLl9rZXlTdGF0dXMuc2hpZnRLZXk7XG5cdH1cblxuXHQvKipcblx0ICogQWxsb3dzIHRvIGV4cGxpY2l0bHkgcmVzZXQgdGhlIGtleSBzdGF0dXMgYmFzZWQgb24gbW9yZSBrbm93bGVkZ2UgKCMxMDkwNjIpXG5cdCAqL1xuXHRyZXNldEtleVN0YXR1cygpOiB2b2lkIHtcblx0XHR0aGlzLmRvUmVzZXRLZXlTdGF0dXMoKTtcblx0XHR0aGlzLmZpcmUodGhpcy5fa2V5U3RhdHVzKTtcblx0fVxuXG5cdHByaXZhdGUgZG9SZXNldEtleVN0YXR1cygpOiB2b2lkIHtcblx0XHR0aGlzLl9rZXlTdGF0dXMgPSB7XG5cdFx0XHRhbHRLZXk6IGZhbHNlLFxuXHRcdFx0c2hpZnRLZXk6IGZhbHNlLFxuXHRcdFx0Y3RybEtleTogZmFsc2UsXG5cdFx0XHRtZXRhS2V5OiBmYWxzZVxuXHRcdH07XG5cdH1cblxuXHRzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG5cdFx0aWYgKCFNb2RpZmllcktleUVtaXR0ZXIuaW5zdGFuY2UpIHtcblx0XHRcdE1vZGlmaWVyS2V5RW1pdHRlci5pbnN0YW5jZSA9IG5ldyBNb2RpZmllcktleUVtaXR0ZXIoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gTW9kaWZpZXJLZXlFbWl0dGVyLmluc3RhbmNlO1xuXHR9XG5cblx0b3ZlcnJpZGUgZGlzcG9zZSgpIHtcblx0XHRzdXBlci5kaXNwb3NlKCk7XG5cdFx0dGhpcy5fc3Vic2NyaXB0aW9ucy5kaXNwb3NlKCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvb2tpZVZhbHVlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKCcoXnxbXjtdKylcXFxccyonICsgbmFtZSArICdcXFxccyo9XFxcXHMqKFteO10rKScpOyAvLyBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI1NDkwNTMxXG5cblx0cmV0dXJuIG1hdGNoID8gbWF0Y2gucG9wKCkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURyYWdBbmREcm9wT2JzZXJ2ZXJDYWxsYmFja3Mge1xuXHRyZWFkb25seSBvbkRyYWdFbnRlcj86IChlOiBEcmFnRXZlbnQpID0+IHZvaWQ7XG5cdHJlYWRvbmx5IG9uRHJhZ0xlYXZlPzogKGU6IERyYWdFdmVudCkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25Ecm9wPzogKGU6IERyYWdFdmVudCkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25EcmFnRW5kPzogKGU6IERyYWdFdmVudCkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25EcmFnU3RhcnQ/OiAoZTogRHJhZ0V2ZW50KSA9PiB2b2lkO1xuXHRyZWFkb25seSBvbkRyYWc/OiAoZTogRHJhZ0V2ZW50KSA9PiB2b2lkO1xuXHRyZWFkb25seSBvbkRyYWdPdmVyPzogKGU6IERyYWdFdmVudCwgZHJhZ0R1cmF0aW9uOiBudW1iZXIpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBEcmFnQW5kRHJvcE9ic2VydmVyIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG5cblx0Ly8gQSBoZWxwZXIgdG8gZml4IGlzc3VlcyB3aXRoIHJlcGVhdGVkIERSQUdfRU5URVIgLyBEUkFHX0xFQVZFXG5cdC8vIGNhbGxzIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3ZzY29kZS9pc3N1ZXMvMTQ0NzBcblx0Ly8gd2hlbiB0aGUgZWxlbWVudCBoYXMgY2hpbGQgZWxlbWVudHMgd2hlcmUgdGhlIGV2ZW50cyBhcmUgZmlyZWRcblx0Ly8gcmVwZWFkZWRseS5cblx0cHJpdmF0ZSBjb3VudGVyOiBudW1iZXIgPSAwO1xuXG5cdC8vIEFsbG93cyB0byBtZWFzdXJlIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZyBvcGVyYXRpb24uXG5cdHByaXZhdGUgZHJhZ1N0YXJ0VGltZSA9IDA7XG5cblx0Y29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFja3M6IElEcmFnQW5kRHJvcE9ic2VydmVyQ2FsbGJhY2tzKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcblx0fVxuXG5cdHByaXZhdGUgcmVnaXN0ZXJMaXN0ZW5lcnMoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY2FsbGJhY2tzLm9uRHJhZ1N0YXJ0KSB7XG5cdFx0XHR0aGlzLl9yZWdpc3RlcihhZGREaXNwb3NhYmxlTGlzdGVuZXIodGhpcy5lbGVtZW50LCBFdmVudFR5cGUuRFJBR19TVEFSVCwgKGU6IERyYWdFdmVudCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNhbGxiYWNrcy5vbkRyYWdTdGFydD8uKGUpO1xuXHRcdFx0fSkpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNhbGxiYWNrcy5vbkRyYWcpIHtcblx0XHRcdHRoaXMuX3JlZ2lzdGVyKGFkZERpc3Bvc2FibGVMaXN0ZW5lcih0aGlzLmVsZW1lbnQsIEV2ZW50VHlwZS5EUkFHLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG5cdFx0XHRcdHRoaXMuY2FsbGJhY2tzLm9uRHJhZz8uKGUpO1xuXHRcdFx0fSkpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3JlZ2lzdGVyKGFkZERpc3Bvc2FibGVMaXN0ZW5lcih0aGlzLmVsZW1lbnQsIEV2ZW50VHlwZS5EUkFHX0VOVEVSLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG5cdFx0XHR0aGlzLmNvdW50ZXIrKztcblx0XHRcdHRoaXMuZHJhZ1N0YXJ0VGltZSA9IGUudGltZVN0YW1wO1xuXG5cdFx0XHR0aGlzLmNhbGxiYWNrcy5vbkRyYWdFbnRlcj8uKGUpO1xuXHRcdH0pKTtcblxuXHRcdHRoaXMuX3JlZ2lzdGVyKGFkZERpc3Bvc2FibGVMaXN0ZW5lcih0aGlzLmVsZW1lbnQsIEV2ZW50VHlwZS5EUkFHX09WRVIsIChlOiBEcmFnRXZlbnQpID0+IHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTsgLy8gbmVlZGVkIHNvIHRoYXQgdGhlIGRyb3AgZXZlbnQgZmlyZXMgKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIxMzM5OTI0L2Ryb3AtZXZlbnQtbm90LWZpcmluZy1pbi1jaHJvbWUpXG5cblx0XHRcdHRoaXMuY2FsbGJhY2tzLm9uRHJhZ092ZXI/LihlLCBlLnRpbWVTdGFtcCAtIHRoaXMuZHJhZ1N0YXJ0VGltZSk7XG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5fcmVnaXN0ZXIoYWRkRGlzcG9zYWJsZUxpc3RlbmVyKHRoaXMuZWxlbWVudCwgRXZlbnRUeXBlLkRSQUdfTEVBVkUsIChlOiBEcmFnRXZlbnQpID0+IHtcblx0XHRcdHRoaXMuY291bnRlci0tO1xuXG5cdFx0XHRpZiAodGhpcy5jb3VudGVyID09PSAwKSB7XG5cdFx0XHRcdHRoaXMuZHJhZ1N0YXJ0VGltZSA9IDA7XG5cblx0XHRcdFx0dGhpcy5jYWxsYmFja3Mub25EcmFnTGVhdmU/LihlKTtcblx0XHRcdH1cblx0XHR9KSk7XG5cblx0XHR0aGlzLl9yZWdpc3RlcihhZGREaXNwb3NhYmxlTGlzdGVuZXIodGhpcy5lbGVtZW50LCBFdmVudFR5cGUuRFJBR19FTkQsIChlOiBEcmFnRXZlbnQpID0+IHtcblx0XHRcdHRoaXMuY291bnRlciA9IDA7XG5cdFx0XHR0aGlzLmRyYWdTdGFydFRpbWUgPSAwO1xuXG5cdFx0XHR0aGlzLmNhbGxiYWNrcy5vbkRyYWdFbmQ/LihlKTtcblx0XHR9KSk7XG5cblx0XHR0aGlzLl9yZWdpc3RlcihhZGREaXNwb3NhYmxlTGlzdGVuZXIodGhpcy5lbGVtZW50LCBFdmVudFR5cGUuRFJPUCwgKGU6IERyYWdFdmVudCkgPT4ge1xuXHRcdFx0dGhpcy5jb3VudGVyID0gMDtcblx0XHRcdHRoaXMuZHJhZ1N0YXJ0VGltZSA9IDA7XG5cblx0XHRcdHRoaXMuY2FsbGJhY2tzLm9uRHJvcD8uKGUpO1xuXHRcdH0pKTtcblx0fVxufVxuXG50eXBlIEhUTUxFbGVtZW50QXR0cmlidXRlS2V5czxUPiA9IFBhcnRpYWw8eyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBUW0tdIGV4dGVuZHMgb2JqZWN0ID8gSFRNTEVsZW1lbnRBdHRyaWJ1dGVLZXlzPFRbS10+IDogVFtLXSB9PjtcbnR5cGUgRWxlbWVudEF0dHJpYnV0ZXM8VD4gPSBIVE1MRWxlbWVudEF0dHJpYnV0ZUtleXM8VD4gJiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xudHlwZSBSZW1vdmVIVE1MRWxlbWVudDxUPiA9IFQgZXh0ZW5kcyBIVE1MRWxlbWVudCA/IG5ldmVyIDogVDtcbnR5cGUgVW5pb25Ub0ludGVyc2VjdGlvbjxVPiA9IChVIGV4dGVuZHMgYW55ID8gKGs6IFUpID0+IHZvaWQgOiBuZXZlcikgZXh0ZW5kcyAoKGs6IGluZmVyIEkpID0+IHZvaWQpID8gSSA6IG5ldmVyO1xudHlwZSBBcnJheVRvT2JqPFQgZXh0ZW5kcyByZWFkb25seSBhbnlbXT4gPSBVbmlvblRvSW50ZXJzZWN0aW9uPFJlbW92ZUhUTUxFbGVtZW50PFRbbnVtYmVyXT4+O1xudHlwZSBISFRNTEVsZW1lbnRUYWdOYW1lTWFwID0gSFRNTEVsZW1lbnRUYWdOYW1lTWFwICYgeyAnJzogSFRNTERpdkVsZW1lbnQgfTtcblxudHlwZSBUYWdUb0VsZW1lbnQ8VD4gPSBUIGV4dGVuZHMgYCR7aW5mZXIgVFN0YXJ0fSMke3N0cmluZ31gXG5cdD8gVFN0YXJ0IGV4dGVuZHMga2V5b2YgSEhUTUxFbGVtZW50VGFnTmFtZU1hcFxuXHQ/IEhIVE1MRWxlbWVudFRhZ05hbWVNYXBbVFN0YXJ0XVxuXHQ6IEhUTUxFbGVtZW50XG5cdDogVCBleHRlbmRzIGAke2luZmVyIFRTdGFydH0uJHtzdHJpbmd9YFxuXHQ/IFRTdGFydCBleHRlbmRzIGtleW9mIEhIVE1MRWxlbWVudFRhZ05hbWVNYXBcblx0PyBISFRNTEVsZW1lbnRUYWdOYW1lTWFwW1RTdGFydF1cblx0OiBIVE1MRWxlbWVudFxuXHQ6IFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXBcblx0PyBIVE1MRWxlbWVudFRhZ05hbWVNYXBbVF1cblx0OiBIVE1MRWxlbWVudDtcblxudHlwZSBUYWdUb0VsZW1lbnRBbmRJZDxUVGFnPiA9IFRUYWcgZXh0ZW5kcyBgJHtpbmZlciBUVGFnfUAke2luZmVyIFRJZH1gXG5cdD8geyBlbGVtZW50OiBUYWdUb0VsZW1lbnQ8VFRhZz47IGlkOiBUSWQgfVxuXHQ6IHsgZWxlbWVudDogVGFnVG9FbGVtZW50PFRUYWc+OyBpZDogJ3Jvb3QnIH07XG5cbnR5cGUgVGFnVG9SZWNvcmQ8VFRhZz4gPSBUYWdUb0VsZW1lbnRBbmRJZDxUVGFnPiBleHRlbmRzIHsgZWxlbWVudDogaW5mZXIgVEVsZW1lbnQ7IGlkOiBpbmZlciBUSWQgfVxuXHQ/IFJlY29yZDwoVElkIGV4dGVuZHMgc3RyaW5nID8gVElkIDogbmV2ZXIpIHwgJ3Jvb3QnLCBURWxlbWVudD5cblx0OiBuZXZlcjtcblxudHlwZSBDaGlsZCA9IEhUTUxFbGVtZW50IHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgSFRNTEVsZW1lbnQ+O1xuXG5jb25zdCBIX1JFR0VYID0gLyg/PHRhZz5bXFx3XFwtXSspPyg/OiMoPzxpZD5bXFx3XFwtXSspKT8oPzxjbGFzcz4oPzpcXC4oPzpbXFx3XFwtXSspKSopKD86QCg/PG5hbWU+KD86W1xcd1xcX10pKykpPy87XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIG5lc3RlZCBkb20gbm9kZXMuXG4gKlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBlbGVtZW50cyA9IGgoJ2Rpdi5jb2RlLXZpZXcnLCBbXG4gKiBcdGgoJ2Rpdi50aXRsZUB0aXRsZScpLFxuICogXHRoKCdkaXYuY29udGFpbmVyJywgW1xuICogXHRcdGgoJ2Rpdi5ndXR0ZXJAZ3V0dGVyRGl2JyksXG4gKiBcdFx0aCgnZGl2QGVkaXRvcicpLFxuICogXHRdKSxcbiAqIF0pO1xuICogY29uc3QgZWRpdG9yID0gY3JlYXRlRWRpdG9yKGVsZW1lbnRzLmVkaXRvcik7XG4gKiBgYGBcbiovXG5leHBvcnQgZnVuY3Rpb24gaDxUVGFnIGV4dGVuZHMgc3RyaW5nPlxuXHQodGFnOiBUVGFnKTpcblx0VGFnVG9SZWNvcmQ8VFRhZz4gZXh0ZW5kcyBpbmZlciBZID8geyBbVEtleSBpbiBrZXlvZiBZXTogWVtUS2V5XSB9IDogbmV2ZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBoPFRUYWcgZXh0ZW5kcyBzdHJpbmcsIFQgZXh0ZW5kcyBDaGlsZFtdPlxuXHQodGFnOiBUVGFnLCBjaGlsZHJlbjogWy4uLlRdKTpcblx0KEFycmF5VG9PYmo8VD4gJiBUYWdUb1JlY29yZDxUVGFnPikgZXh0ZW5kcyBpbmZlciBZID8geyBbVEtleSBpbiBrZXlvZiBZXTogWVtUS2V5XSB9IDogbmV2ZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBoPFRUYWcgZXh0ZW5kcyBzdHJpbmc+XG5cdCh0YWc6IFRUYWcsIGF0dHJpYnV0ZXM6IFBhcnRpYWw8RWxlbWVudEF0dHJpYnV0ZXM8VGFnVG9FbGVtZW50PFRUYWc+Pj4pOlxuXHRUYWdUb1JlY29yZDxUVGFnPiBleHRlbmRzIGluZmVyIFkgPyB7IFtUS2V5IGluIGtleW9mIFldOiBZW1RLZXldIH0gOiBuZXZlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIGg8VFRhZyBleHRlbmRzIHN0cmluZywgVCBleHRlbmRzIENoaWxkW10+XG5cdCh0YWc6IFRUYWcsIGF0dHJpYnV0ZXM6IFBhcnRpYWw8RWxlbWVudEF0dHJpYnV0ZXM8VGFnVG9FbGVtZW50PFRUYWc+Pj4sIGNoaWxkcmVuOiBbLi4uVF0pOlxuXHQoQXJyYXlUb09iajxUPiAmIFRhZ1RvUmVjb3JkPFRUYWc+KSBleHRlbmRzIGluZmVyIFkgPyB7IFtUS2V5IGluIGtleW9mIFldOiBZW1RLZXldIH0gOiBuZXZlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIGgodGFnOiBzdHJpbmcsIC4uLmFyZ3M6IFtdIHwgW2F0dHJpYnV0ZXM6IHsgJDogc3RyaW5nIH0gJiBQYXJ0aWFsPEVsZW1lbnRBdHRyaWJ1dGVzPEhUTUxFbGVtZW50Pj4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBjaGlsZHJlbj86IGFueVtdXSB8IFtjaGlsZHJlbjogYW55W11dKTogUmVjb3JkPHN0cmluZywgSFRNTEVsZW1lbnQ+IHtcblx0bGV0IGF0dHJpYnV0ZXM6IHsgJD86IHN0cmluZyB9ICYgUGFydGlhbDxFbGVtZW50QXR0cmlidXRlczxIVE1MRWxlbWVudD4+O1xuXHRsZXQgY2hpbGRyZW46IChSZWNvcmQ8c3RyaW5nLCBIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudClbXSB8IHVuZGVmaW5lZDtcblxuXHRpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuXHRcdGF0dHJpYnV0ZXMgPSB7fTtcblx0XHRjaGlsZHJlbiA9IGFyZ3NbMF07XG5cdH0gZWxzZSB7XG5cdFx0YXR0cmlidXRlcyA9IGFyZ3NbMF0gYXMgYW55IHx8IHt9O1xuXHRcdGNoaWxkcmVuID0gYXJnc1sxXTtcblx0fVxuXG5cdGNvbnN0IG1hdGNoID0gSF9SRUdFWC5leGVjKHRhZyk7XG5cblx0aWYgKCFtYXRjaCB8fCAhbWF0Y2guZ3JvdXBzKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdCYWQgdXNlIG9mIGgnKTtcblx0fVxuXG5cdGNvbnN0IHRhZ05hbWUgPSBtYXRjaC5ncm91cHNbJ3RhZyddIHx8ICdkaXYnO1xuXHRjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG5cblx0aWYgKG1hdGNoLmdyb3Vwc1snaWQnXSkge1xuXHRcdGVsLmlkID0gbWF0Y2guZ3JvdXBzWydpZCddO1xuXHR9XG5cblx0Y29uc3QgY2xhc3NOYW1lcyA9IFtdO1xuXHRpZiAobWF0Y2guZ3JvdXBzWydjbGFzcyddKSB7XG5cdFx0Zm9yIChjb25zdCBjbGFzc05hbWUgb2YgbWF0Y2guZ3JvdXBzWydjbGFzcyddLnNwbGl0KCcuJykpIHtcblx0XHRcdGlmIChjbGFzc05hbWUgIT09ICcnKSB7XG5cdFx0XHRcdGNsYXNzTmFtZXMucHVzaChjbGFzc05hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRpZiAoYXR0cmlidXRlcy5jbGFzc05hbWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZvciAoY29uc3QgY2xhc3NOYW1lIG9mIGF0dHJpYnV0ZXMuY2xhc3NOYW1lLnNwbGl0KCcuJykpIHtcblx0XHRcdGlmIChjbGFzc05hbWUgIT09ICcnKSB7XG5cdFx0XHRcdGNsYXNzTmFtZXMucHVzaChjbGFzc05hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRpZiAoY2xhc3NOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0ZWwuY2xhc3NOYW1lID0gY2xhc3NOYW1lcy5qb2luKCcgJyk7XG5cdH1cblxuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IHt9O1xuXG5cdGlmIChtYXRjaC5ncm91cHNbJ25hbWUnXSkge1xuXHRcdHJlc3VsdFttYXRjaC5ncm91cHNbJ25hbWUnXV0gPSBlbDtcblx0fVxuXG5cdGlmIChjaGlsZHJlbikge1xuXHRcdGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuXHRcdFx0aWYgKGlzSFRNTEVsZW1lbnQoYykpIHtcblx0XHRcdFx0ZWwuYXBwZW5kQ2hpbGQoYyk7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRlbC5hcHBlbmQoYyk7XG5cdFx0XHR9IGVsc2UgaWYgKCdyb290JyBpbiBjKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24ocmVzdWx0LCBjKTtcblx0XHRcdFx0ZWwuYXBwZW5kQ2hpbGQoYy5yb290KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuXHRcdGlmIChrZXkgPT09ICdjbGFzc05hbWUnKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykge1xuXHRcdFx0Zm9yIChjb25zdCBbY3NzS2V5LCBjc3NWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG5cdFx0XHRcdGVsLnN0eWxlLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdGNhbWVsQ2FzZVRvSHlwaGVuQ2FzZShjc3NLZXkpLFxuXHRcdFx0XHRcdHR5cGVvZiBjc3NWYWx1ZSA9PT0gJ251bWJlcicgPyBjc3NWYWx1ZSArICdweCcgOiAnJyArIGNzc1ZhbHVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChrZXkgPT09ICd0YWJJbmRleCcpIHtcblx0XHRcdGVsLnRhYkluZGV4ID0gdmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsLnNldEF0dHJpYnV0ZShjYW1lbENhc2VUb0h5cGhlbkNhc2Uoa2V5KSwgdmFsdWUudG9TdHJpbmcoKSk7XG5cdFx0fVxuXHR9XG5cblx0cmVzdWx0Wydyb290J10gPSBlbDtcblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3ZnRWxlbTxUVGFnIGV4dGVuZHMgc3RyaW5nPlxuXHQodGFnOiBUVGFnKTpcblx0VGFnVG9SZWNvcmQ8VFRhZz4gZXh0ZW5kcyBpbmZlciBZID8geyBbVEtleSBpbiBrZXlvZiBZXTogWVtUS2V5XSB9IDogbmV2ZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdmdFbGVtPFRUYWcgZXh0ZW5kcyBzdHJpbmcsIFQgZXh0ZW5kcyBDaGlsZFtdPlxuXHQodGFnOiBUVGFnLCBjaGlsZHJlbjogWy4uLlRdKTpcblx0KEFycmF5VG9PYmo8VD4gJiBUYWdUb1JlY29yZDxUVGFnPikgZXh0ZW5kcyBpbmZlciBZID8geyBbVEtleSBpbiBrZXlvZiBZXTogWVtUS2V5XSB9IDogbmV2ZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdmdFbGVtPFRUYWcgZXh0ZW5kcyBzdHJpbmc+XG5cdCh0YWc6IFRUYWcsIGF0dHJpYnV0ZXM6IFBhcnRpYWw8RWxlbWVudEF0dHJpYnV0ZXM8VGFnVG9FbGVtZW50PFRUYWc+Pj4pOlxuXHRUYWdUb1JlY29yZDxUVGFnPiBleHRlbmRzIGluZmVyIFkgPyB7IFtUS2V5IGluIGtleW9mIFldOiBZW1RLZXldIH0gOiBuZXZlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN2Z0VsZW08VFRhZyBleHRlbmRzIHN0cmluZywgVCBleHRlbmRzIENoaWxkW10+XG5cdCh0YWc6IFRUYWcsIGF0dHJpYnV0ZXM6IFBhcnRpYWw8RWxlbWVudEF0dHJpYnV0ZXM8VGFnVG9FbGVtZW50PFRUYWc+Pj4sIGNoaWxkcmVuOiBbLi4uVF0pOlxuXHQoQXJyYXlUb09iajxUPiAmIFRhZ1RvUmVjb3JkPFRUYWc+KSBleHRlbmRzIGluZmVyIFkgPyB7IFtUS2V5IGluIGtleW9mIFldOiBZW1RLZXldIH0gOiBuZXZlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN2Z0VsZW0odGFnOiBzdHJpbmcsIC4uLmFyZ3M6IFtdIHwgW2F0dHJpYnV0ZXM6IHsgJDogc3RyaW5nIH0gJiBQYXJ0aWFsPEVsZW1lbnRBdHRyaWJ1dGVzPEhUTUxFbGVtZW50Pj4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBjaGlsZHJlbj86IGFueVtdXSB8IFtjaGlsZHJlbjogYW55W11dKTogUmVjb3JkPHN0cmluZywgSFRNTEVsZW1lbnQ+IHtcblx0bGV0IGF0dHJpYnV0ZXM6IHsgJD86IHN0cmluZyB9ICYgUGFydGlhbDxFbGVtZW50QXR0cmlidXRlczxIVE1MRWxlbWVudD4+O1xuXHRsZXQgY2hpbGRyZW46IChSZWNvcmQ8c3RyaW5nLCBIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudClbXSB8IHVuZGVmaW5lZDtcblxuXHRpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuXHRcdGF0dHJpYnV0ZXMgPSB7fTtcblx0XHRjaGlsZHJlbiA9IGFyZ3NbMF07XG5cdH0gZWxzZSB7XG5cdFx0YXR0cmlidXRlcyA9IGFyZ3NbMF0gYXMgYW55IHx8IHt9O1xuXHRcdGNoaWxkcmVuID0gYXJnc1sxXTtcblx0fVxuXG5cdGNvbnN0IG1hdGNoID0gSF9SRUdFWC5leGVjKHRhZyk7XG5cblx0aWYgKCFtYXRjaCB8fCAhbWF0Y2guZ3JvdXBzKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdCYWQgdXNlIG9mIGgnKTtcblx0fVxuXG5cdGNvbnN0IHRhZ05hbWUgPSBtYXRjaC5ncm91cHNbJ3RhZyddIHx8ICdkaXYnO1xuXHRjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCB0YWdOYW1lKSBhcyBhbnkgYXMgSFRNTEVsZW1lbnQ7XG5cblx0aWYgKG1hdGNoLmdyb3Vwc1snaWQnXSkge1xuXHRcdGVsLmlkID0gbWF0Y2guZ3JvdXBzWydpZCddO1xuXHR9XG5cblx0Y29uc3QgY2xhc3NOYW1lcyA9IFtdO1xuXHRpZiAobWF0Y2guZ3JvdXBzWydjbGFzcyddKSB7XG5cdFx0Zm9yIChjb25zdCBjbGFzc05hbWUgb2YgbWF0Y2guZ3JvdXBzWydjbGFzcyddLnNwbGl0KCcuJykpIHtcblx0XHRcdGlmIChjbGFzc05hbWUgIT09ICcnKSB7XG5cdFx0XHRcdGNsYXNzTmFtZXMucHVzaChjbGFzc05hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRpZiAoYXR0cmlidXRlcy5jbGFzc05hbWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZvciAoY29uc3QgY2xhc3NOYW1lIG9mIGF0dHJpYnV0ZXMuY2xhc3NOYW1lLnNwbGl0KCcuJykpIHtcblx0XHRcdGlmIChjbGFzc05hbWUgIT09ICcnKSB7XG5cdFx0XHRcdGNsYXNzTmFtZXMucHVzaChjbGFzc05hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRpZiAoY2xhc3NOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0ZWwuY2xhc3NOYW1lID0gY2xhc3NOYW1lcy5qb2luKCcgJyk7XG5cdH1cblxuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IHt9O1xuXG5cdGlmIChtYXRjaC5ncm91cHNbJ25hbWUnXSkge1xuXHRcdHJlc3VsdFttYXRjaC5ncm91cHNbJ25hbWUnXV0gPSBlbDtcblx0fVxuXG5cdGlmIChjaGlsZHJlbikge1xuXHRcdGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuXHRcdFx0aWYgKGlzSFRNTEVsZW1lbnQoYykpIHtcblx0XHRcdFx0ZWwuYXBwZW5kQ2hpbGQoYyk7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRlbC5hcHBlbmQoYyk7XG5cdFx0XHR9IGVsc2UgaWYgKCdyb290JyBpbiBjKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24ocmVzdWx0LCBjKTtcblx0XHRcdFx0ZWwuYXBwZW5kQ2hpbGQoYy5yb290KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuXHRcdGlmIChrZXkgPT09ICdjbGFzc05hbWUnKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykge1xuXHRcdFx0Zm9yIChjb25zdCBbY3NzS2V5LCBjc3NWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG5cdFx0XHRcdGVsLnN0eWxlLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdGNhbWVsQ2FzZVRvSHlwaGVuQ2FzZShjc3NLZXkpLFxuXHRcdFx0XHRcdHR5cGVvZiBjc3NWYWx1ZSA9PT0gJ251bWJlcicgPyBjc3NWYWx1ZSArICdweCcgOiAnJyArIGNzc1ZhbHVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChrZXkgPT09ICd0YWJJbmRleCcpIHtcblx0XHRcdGVsLnRhYkluZGV4ID0gdmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsLnNldEF0dHJpYnV0ZShjYW1lbENhc2VUb0h5cGhlbkNhc2Uoa2V5KSwgdmFsdWUudG9TdHJpbmcoKSk7XG5cdFx0fVxuXHR9XG5cblx0cmVzdWx0Wydyb290J10gPSBlbDtcblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjYW1lbENhc2VUb0h5cGhlbkNhc2Uoc3RyOiBzdHJpbmcpIHtcblx0cmV0dXJuIHN0ci5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUF0dHJpYnV0ZXMoZnJvbTogRWxlbWVudCwgdG86IEVsZW1lbnQsIGZpbHRlcj86IHN0cmluZ1tdKTogdm9pZCB7XG5cdGZvciAoY29uc3QgeyBuYW1lLCB2YWx1ZSB9IG9mIGZyb20uYXR0cmlidXRlcykge1xuXHRcdGlmICghZmlsdGVyIHx8IGZpbHRlci5pbmNsdWRlcyhuYW1lKSkge1xuXHRcdFx0dG8uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gY29weUF0dHJpYnV0ZShmcm9tOiBFbGVtZW50LCB0bzogRWxlbWVudCwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdGNvbnN0IHZhbHVlID0gZnJvbS5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cdGlmICh2YWx1ZSkge1xuXHRcdHRvLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG5cdH0gZWxzZSB7XG5cdFx0dG8ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFja0F0dHJpYnV0ZXMoZnJvbTogRWxlbWVudCwgdG86IEVsZW1lbnQsIGZpbHRlcj86IHN0cmluZ1tdKTogSURpc3Bvc2FibGUge1xuXHRjb3B5QXR0cmlidXRlcyhmcm9tLCB0bywgZmlsdGVyKTtcblxuXHRjb25zdCBkaXNwb3NhYmxlcyA9IG5ldyBEaXNwb3NhYmxlU3RvcmUoKTtcblxuXHRkaXNwb3NhYmxlcy5hZGQoc2hhcmVkTXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGZyb20sIGRpc3Bvc2FibGVzLCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogZmlsdGVyIH0pKG11dGF0aW9ucyA9PiB7XG5cdFx0Zm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMpIHtcblx0XHRcdGlmIChtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycgJiYgbXV0YXRpb24uYXR0cmlidXRlTmFtZSkge1xuXHRcdFx0XHRjb3B5QXR0cmlidXRlKGZyb20sIHRvLCBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pKTtcblxuXHRyZXR1cm4gZGlzcG9zYWJsZXM7XG59XG5cbi8qKlxuICogSGVscGVyIGZvciBjYWxjdWxhdGluZyB0aGUgXCJzYWZlIHRyaWFuZ2xlXCIgb2NjbHVkZWQgYnkgaG92ZXJzIHRvIGF2b2lkIGVhcmx5IGRpc21pc3NhbC5cbiAqIEBzZWUgaHR0cHM6Ly93d3cuc21hc2hpbmdtYWdhemluZS5jb20vMjAyMy8wOC9iZXR0ZXItY29udGV4dC1tZW51cy1zYWZlLXRyaWFuZ2xlcy8gZm9yIGV4YW1wbGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNhZmVUcmlhbmdsZSB7XG5cdC8vIDQgdHJpYW5nbGVzLCAyIHBvaW50cyAoeCwgeSkgc3RvcmVkIGZvciBlYWNoXG5cdHByaXZhdGUgdHJpYW5nbGVzOiBudW1iZXJbXSA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgb3JpZ2luWDogbnVtYmVyLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgb3JpZ2luWTogbnVtYmVyLFxuXHRcdHRhcmdldDogSFRNTEVsZW1lbnRcblx0KSB7XG5cdFx0Y29uc3QgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20gfSA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCB0ID0gdGhpcy50cmlhbmdsZXM7XG5cdFx0bGV0IGkgPSAwO1xuXG5cdFx0dFtpKytdID0gbGVmdDtcblx0XHR0W2krK10gPSB0b3A7XG5cdFx0dFtpKytdID0gcmlnaHQ7XG5cdFx0dFtpKytdID0gdG9wO1xuXG5cdFx0dFtpKytdID0gbGVmdDtcblx0XHR0W2krK10gPSB0b3A7XG5cdFx0dFtpKytdID0gbGVmdDtcblx0XHR0W2krK10gPSBib3R0b207XG5cblx0XHR0W2krK10gPSByaWdodDtcblx0XHR0W2krK10gPSB0b3A7XG5cdFx0dFtpKytdID0gcmlnaHQ7XG5cdFx0dFtpKytdID0gYm90dG9tO1xuXG5cdFx0dFtpKytdID0gbGVmdDtcblx0XHR0W2krK10gPSBib3R0b207XG5cdFx0dFtpKytdID0gcmlnaHQ7XG5cdFx0dFtpKytdID0gYm90dG9tO1xuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgeyB0cmlhbmdsZXMsIG9yaWdpblgsIG9yaWdpblkgfSA9IHRoaXM7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0XHRcdGlmIChpc1BvaW50V2l0aGluVHJpYW5nbGUoeCwgeSwgb3JpZ2luWCwgb3JpZ2luWSwgdHJpYW5nbGVzWzIgKiBpXSwgdHJpYW5nbGVzWzIgKiBpICsgMV0sIHRyaWFuZ2xlc1syICogaSArIDJdLCB0cmlhbmdsZXNbMiAqIGkgKyAzXSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElUZXJtaW5hbCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgQ2VsbENvbG9yUmVzb2x2ZXIgfSBmcm9tICcuL0NlbGxDb2xvclJlc29sdmVyJztcbmltcG9ydCB7IGFjcXVpcmVUZXh0dXJlQXRsYXMsIHJlbW92ZVRlcm1pbmFsRnJvbUNhY2hlIH0gZnJvbSAnLi9DaGFyQXRsYXNDYWNoZSc7XG5pbXBvcnQgeyBDdXJzb3JCbGlua1N0YXRlTWFuYWdlciB9IGZyb20gJy4vQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXInO1xuaW1wb3J0IHsgb2JzZXJ2ZURldmljZVBpeGVsRGltZW5zaW9ucyB9IGZyb20gJy4vRGV2aWNlUGl4ZWxPYnNlcnZlcic7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucywgSVJlbmRlcmVyLCBJUmVxdWVzdFJlZHJhd0V2ZW50IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSwgSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsIElDb3JlQnJvd3NlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IENoYXJEYXRhLCBJQnVmZmVyTGluZSwgSUNlbGxEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIENvbnRlbnQsIE5VTExfQ0VMTF9DSEFSLCBOVUxMX0NFTExfQ09ERSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IElDb3JlU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgR2x5cGhSZW5kZXJlciB9IGZyb20gJy4vR2x5cGhSZW5kZXJlcic7XG5pbXBvcnQgeyBSZWN0YW5nbGVSZW5kZXJlciB9IGZyb20gJy4vUmVjdGFuZ2xlUmVuZGVyZXInO1xuaW1wb3J0IHsgQ09NQklORURfQ0hBUl9CSVRfTUFTSywgUkVOREVSX01PREVMX0JHX09GRlNFVCwgUkVOREVSX01PREVMX0VYVF9PRkZTRVQsIFJFTkRFUl9NT0RFTF9GR19PRkZTRVQsIFJFTkRFUl9NT0RFTF9JTkRJQ0lFU19QRVJfQ0VMTCwgUmVuZGVyTW9kZWwgfSBmcm9tICcuL1JlbmRlck1vZGVsJztcbmltcG9ydCB7IElXZWJHTDJSZW5kZXJpbmdDb250ZXh0LCB0eXBlIElUZXh0dXJlQXRsYXMgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7IExpbmtSZW5kZXJMYXllciB9IGZyb20gJy4vcmVuZGVyTGF5ZXIvTGlua1JlbmRlckxheWVyJztcbmltcG9ydCB7IElSZW5kZXJMYXllciB9IGZyb20gJy4vcmVuZGVyTGF5ZXIvVHlwZXMnO1xuaW1wb3J0IHsgRW1pdHRlciwgRXZlbnQgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9ldmVudCc7XG5pbXBvcnQgeyBhZGREaXNwb3NhYmxlTGlzdGVuZXIgfSBmcm9tICd2cy9iYXNlL2Jyb3dzZXIvZG9tJztcbmltcG9ydCB7IGNvbWJpbmVkRGlzcG9zYWJsZSwgRGlzcG9zYWJsZSwgTXV0YWJsZURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2xpZmVjeWNsZSc7XG5pbXBvcnQgeyBjcmVhdGVSZW5kZXJEaW1lbnNpb25zIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJnbFJlbmRlcmVyIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElSZW5kZXJlciB7XG4gIHByaXZhdGUgX3JlbmRlckxheWVyczogSVJlbmRlckxheWVyW107XG4gIHByaXZhdGUgX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyOiBNdXRhYmxlRGlzcG9zYWJsZTxDdXJzb3JCbGlua1N0YXRlTWFuYWdlcj4gPSBuZXcgTXV0YWJsZURpc3Bvc2FibGUoKTtcbiAgcHJpdmF0ZSBfY2hhckF0bGFzRGlzcG9zYWJsZSA9IHRoaXMuX3JlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcbiAgcHJpdmF0ZSBfY2hhckF0bGFzOiBJVGV4dHVyZUF0bGFzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9kZXZpY2VQaXhlbFJhdGlvOiBudW1iZXI7XG4gIHByaXZhdGUgX2RldmljZU1heFRleHR1cmVTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgX29ic2VydmVyRGlzcG9zYWJsZSA9IHRoaXMuX3JlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcblxuICBwcml2YXRlIF9tb2RlbDogUmVuZGVyTW9kZWwgPSBuZXcgUmVuZGVyTW9kZWwoKTtcbiAgcHJpdmF0ZSBfd29ya0NlbGw6IElDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuICBwcml2YXRlIF93b3JrQ2VsbDI6IElDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuICBwcml2YXRlIF9jZWxsQ29sb3JSZXNvbHZlcjogQ2VsbENvbG9yUmVzb2x2ZXI7XG5cbiAgcHJpdmF0ZSBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHJpdmF0ZSBfZ2w6IElXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICBwcml2YXRlIF9yZWN0YW5nbGVSZW5kZXJlcjogTXV0YWJsZURpc3Bvc2FibGU8UmVjdGFuZ2xlUmVuZGVyZXI+ID0gdGhpcy5fcmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuICBwcml2YXRlIF9nbHlwaFJlbmRlcmVyOiBNdXRhYmxlRGlzcG9zYWJsZTxHbHlwaFJlbmRlcmVyPiA9IHRoaXMuX3JlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnM7XG5cbiAgcHJpdmF0ZSBfY29yZTogSVRlcm1pbmFsO1xuICBwcml2YXRlIF9pc0F0dGFjaGVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jb250ZXh0UmVzdG9yYXRpb25UaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2VUZXh0dXJlQXRsYXMgPSB0aGlzLl9yZWdpc3RlcihuZXcgRW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNoYW5nZVRleHR1cmVBdGxhcyA9IHRoaXMuX29uQ2hhbmdlVGV4dHVyZUF0bGFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX3JlZ2lzdGVyKG5ldyBFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fcmVnaXN0ZXIobmV3IEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0UmVkcmF3ID0gdGhpcy5fcmVnaXN0ZXIobmV3IEVtaXR0ZXI8SVJlcXVlc3RSZWRyYXdFdmVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RSZWRyYXcgPSB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ29udGV4dExvc3MgPSB0aGlzLl9yZWdpc3RlcihuZXcgRW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ29udGV4dExvc3MgPSB0aGlzLl9vbkNvbnRleHRMb3NzLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlOiBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFyU2l6ZVNlcnZpY2U6IElDaGFyU2l6ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGVjb3JhdGlvblNlcnZpY2U6IElEZWNvcmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZSxcbiAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI/OiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJTVBPUlRBTlQ6IENhbnZhcyBpbml0aWFsaXphdGlvbiBhbmQgZmV0Y2hpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBiZSBmaXJzdCBpbiBvcmRlciB0b1xuICAgIC8vIHByZXZlbnQgcG9zc2libGUgbGlzdGVuZXJzIGxlYWtpbmcgYW5kIGNvbnRpbnVpbmcgdG8gb3BlcmF0ZSBhZnRlciB0aGUgV2ViZ2xSZW5kZXJlciBoYXMgYmVlblxuICAgIC8vIGRpc2NhcmRlZC5cbiAgICB0aGlzLl9jYW52YXMgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNvbnN0IGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuICAgICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICAgIGRlcHRoOiBmYWxzZSxcbiAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlclxuICAgIH07XG4gICAgdGhpcy5fZ2wgPSB0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wyJywgY29udGV4dEF0dHJpYnV0ZXMpIGFzIElXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICAgIGlmICghdGhpcy5fZ2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViR0wyIG5vdCBzdXBwb3J0ZWQgJyArIHRoaXMuX2dsKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWdpc3Rlcih0aGlzLl90aGVtZVNlcnZpY2Uub25DaGFuZ2VDb2xvcnMoKCkgPT4gdGhpcy5faGFuZGxlQ29sb3JDaGFuZ2UoKSkpO1xuXG4gICAgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIgPSBuZXcgQ2VsbENvbG9yUmVzb2x2ZXIodGhpcy5fdGVybWluYWwsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLCB0aGlzLl9tb2RlbC5zZWxlY3Rpb24sIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UsIHRoaXMuX3RoZW1lU2VydmljZSk7XG5cbiAgICB0aGlzLl9jb3JlID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG5cbiAgICB0aGlzLl9yZW5kZXJMYXllcnMgPSBbXG4gICAgICBuZXcgTGlua1JlbmRlckxheWVyKHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEsIDIsIHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9jb3JlLmxpbmtpZmllciEsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSwgX29wdGlvbnNTZXJ2aWNlLCB0aGlzLl90aGVtZVNlcnZpY2UpXG4gICAgXTtcbiAgICB0aGlzLmRpbWVuc2lvbnMgPSBjcmVhdGVSZW5kZXJEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHI7XG4gICAgdGhpcy5fdXBkYXRlRGltZW5zaW9ucygpO1xuICAgIHRoaXMuX3VwZGF0ZUN1cnNvckJsaW5rKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXIoX29wdGlvbnNTZXJ2aWNlLm9uT3B0aW9uQ2hhbmdlKCgpID0+IHRoaXMuX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCkpKTtcblxuICAgIHRoaXMuX2RldmljZU1heFRleHR1cmVTaXplID0gdGhpcy5fZ2wuZ2V0UGFyYW1ldGVyKHRoaXMuX2dsLk1BWF9URVhUVVJFX1NJWkUpO1xuXG4gICAgdGhpcy5fcmVnaXN0ZXIoYWRkRGlzcG9zYWJsZUxpc3RlbmVyKHRoaXMuX2NhbnZhcywgJ3dlYmdsY29udGV4dGxvc3QnLCAoZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3dlYmdsY29udGV4dGxvc3QgZXZlbnQgcmVjZWl2ZWQnKTtcbiAgICAgIC8vIFByZXZlbnQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaW4gb3JkZXIgdG8gZW5hYmxlIFdlYkdMIGNvbnRleHQgcmVzdG9yYXRpb24uXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBXYWl0IGEgZmV3IHNlY29uZHMgdG8gc2VlIGlmIHRoZSAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnIGV2ZW50IGlzIGZpcmVkLlxuICAgICAgLy8gSWYgbm90LCBkaXNwYXRjaCB0aGUgb25Db250ZXh0TG9zcyBub3RpZmljYXRpb24gdG8gb2JzZXJ2ZXJzLlxuICAgICAgdGhpcy5fY29udGV4dFJlc3RvcmF0aW9uVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9jb250ZXh0UmVzdG9yYXRpb25UaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zb2xlLndhcm4oJ3dlYmdsIGNvbnRleHQgbm90IHJlc3RvcmVkOyBmaXJpbmcgb25Db250ZXh0TG9zcycpO1xuICAgICAgICB0aGlzLl9vbkNvbnRleHRMb3NzLmZpcmUoZSk7XG4gICAgICB9LCAzMDAwIC8qIG1zICovKTtcbiAgICB9KSk7XG4gICAgdGhpcy5fcmVnaXN0ZXIoYWRkRGlzcG9zYWJsZUxpc3RlbmVyKHRoaXMuX2NhbnZhcywgJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgKGUpID0+IHtcbiAgICAgIGNvbnNvbGUud2Fybignd2ViZ2xjb250ZXh0cmVzdG9yZWQgZXZlbnQgcmVjZWl2ZWQnKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jb250ZXh0UmVzdG9yYXRpb25UaW1lb3V0KTtcbiAgICAgIHRoaXMuX2NvbnRleHRSZXN0b3JhdGlvblRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAvLyBUaGUgdGV4dHVyZSBhdGxhcyBhbmQgZ2x5cGggcmVuZGVyZXIgbXVzdCBiZSBmdWxseSByZWluaXRpYWxpemVkXG4gICAgICAvLyBiZWNhdXNlIHRoZWlyIGNvbnRlbnRzIGhhdmUgYmVlbiBsb3N0LlxuICAgICAgcmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUodGhpcy5fdGVybWluYWwpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZVdlYkdMU3RhdGUoKTtcbiAgICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCgpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuX29ic2VydmVyRGlzcG9zYWJsZS52YWx1ZSA9IG9ic2VydmVEZXZpY2VQaXhlbERpbWVuc2lvbnModGhpcy5fY2FudmFzLCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LCAodywgaCkgPT4gdGhpcy5fc2V0Q2FudmFzRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHcsIGgpKTtcbiAgICB0aGlzLl9yZWdpc3Rlcih0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uub25XaW5kb3dDaGFuZ2UodyA9PiB7XG4gICAgICB0aGlzLl9vYnNlcnZlckRpc3Bvc2FibGUudmFsdWUgPSBvYnNlcnZlRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHRoaXMuX2NhbnZhcywgdywgKHcsIGgpID0+IHRoaXMuX3NldENhbnZhc0RldmljZVBpeGVsRGltZW5zaW9ucyh3LCBoKSk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5fY29yZS5zY3JlZW5FbGVtZW50IS5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMpO1xuXG4gICAgW3RoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlLCB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlXSA9IHRoaXMuX2luaXRpYWxpemVXZWJHTFN0YXRlKCk7XG5cbiAgICB0aGlzLl9pc0F0dGFjaGVkID0gdGhpcy5fY29yZS5zY3JlZW5FbGVtZW50IS5pc0Nvbm5lY3RlZDtcblxuICAgIHRoaXMuX3JlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICAgIGwuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FudmFzLnBhcmVudEVsZW1lbnQ/LnJlbW92ZUNoaWxkKHRoaXMuX2NhbnZhcyk7XG4gICAgICByZW1vdmVUZXJtaW5hbEZyb21DYWNoZSh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIGdldCB0ZXh0dXJlQXRsYXMoKTogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jaGFyQXRsYXM/LnBhZ2VzWzBdLmNhbnZhcztcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNvbG9yQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXMoKTtcblxuICAgIC8vIEZvcmNlIGEgZnVsbCByZWZyZXNoXG4gICAgdGhpcy5fY2xlYXJNb2RlbCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlKCk6IHZvaWQge1xuICAgIC8vIElmIHRoZSBkZXZpY2UgcGl4ZWwgcmF0aW8gY2hhbmdlZCwgdGhlIGNoYXIgYXRsYXMgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWRcbiAgICAvLyBhbmQgdGhlIHRlcm1pbmFsIG5lZWRzIHRvIHJlZnJlc2hlZFxuICAgIGlmICh0aGlzLl9kZXZpY2VQaXhlbFJhdGlvICE9PSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKSB7XG4gICAgICB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICAgIHRoaXMuaGFuZGxlUmVzaXplKHRoaXMuX3Rlcm1pbmFsLmNvbHMsIHRoaXMuX3Rlcm1pbmFsLnJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVSZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgY2hhcmFjdGVyIGFuZCBjYW52YXMgZGltZW5zaW9uc1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcblxuICAgIHRoaXMuX21vZGVsLnJlc2l6ZSh0aGlzLl90ZXJtaW5hbC5jb2xzLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcblxuICAgIC8vIFJlc2l6ZSBhbGwgcmVuZGVyIGxheWVyc1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwucmVzaXplKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLmRpbWVuc2lvbnMpO1xuICAgIH1cblxuICAgIC8vIFJlc2l6ZSB0aGUgY2FudmFzXG4gICAgdGhpcy5fY2FudmFzLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke3RoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodH1weGA7XG5cbiAgICAvLyBSZXNpemUgdGhlIHNjcmVlblxuICAgIHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEuc3R5bGUud2lkdGggPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgdGhpcy5fY29yZS5zY3JlZW5FbGVtZW50IS5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHR9cHhgO1xuXG4gICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWU/LnNldERpbWVuc2lvbnModGhpcy5kaW1lbnNpb25zKTtcbiAgICB0aGlzLl9yZWN0YW5nbGVSZW5kZXJlci52YWx1ZT8uaGFuZGxlUmVzaXplKCk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZT8uc2V0RGltZW5zaW9ucyh0aGlzLmRpbWVuc2lvbnMpO1xuICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWU/LmhhbmRsZVJlc2l6ZSgpO1xuXG4gICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcygpO1xuXG4gICAgLy8gRm9yY2UgYSBmdWxsIHJlZnJlc2guIFJlc2l6aW5nIGBfZ2x5cGhSZW5kZXJlcmAgc2hvdWxkIGNsZWFyIGl0IGFscmVhZHksXG4gICAgLy8gc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjbGVhciBpdCBhZ2FpbiBoZXJlLlxuICAgIHRoaXMuX2NsZWFyTW9kZWwoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZVJlc2l6ZSh0aGlzLl90ZXJtaW5hbC5jb2xzLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlQmx1cih0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5wYXVzZSgpO1xuICAgIC8vIFJlcXVlc3QgYSByZWRyYXcgZm9yIGFjdGl2ZS9pbmFjdGl2ZSBzZWxlY3Rpb24gYmFja2dyb3VuZFxuICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUZvY3VzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlRm9jdXModGhpcy5fdGVybWluYWwpO1xuICAgIH1cbiAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZT8ucmVzdW1lKCk7XG4gICAgLy8gUmVxdWVzdCBhIHJlZHJhdyBmb3IgYWN0aXZlL2luYWN0aXZlIHNlbGVjdGlvbiBiYWNrZ3JvdW5kXG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsIG9mIHRoaXMuX3JlbmRlckxheWVycykge1xuICAgICAgbC5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuX3Rlcm1pbmFsLCBzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgICB9XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uLnVwZGF0ZSh0aGlzLl9jb3JlLCBzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXJzb3JNb3ZlKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlQ3Vyc29yTW92ZSh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5yZXN0YXJ0QmxpbmtBbmltYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKCk7XG4gICAgdGhpcy5fdXBkYXRlQ3Vyc29yQmxpbmsoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBtZW1iZXJzIGRlcGVuZGVudCBvbiBXZWJHTCBjb250ZXh0IHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZVdlYkdMU3RhdGUoKTogW1JlY3RhbmdsZVJlbmRlcmVyLCBHbHlwaFJlbmRlcmVyXSB7XG4gICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUgPSBuZXcgUmVjdGFuZ2xlUmVuZGVyZXIodGhpcy5fdGVybWluYWwsIHRoaXMuX2dsLCB0aGlzLmRpbWVuc2lvbnMsIHRoaXMuX3RoZW1lU2VydmljZSk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZSA9IG5ldyBHbHlwaFJlbmRlcmVyKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9nbCwgdGhpcy5kaW1lbnNpb25zLCB0aGlzLl9vcHRpb25zU2VydmljZSk7XG5cbiAgICAvLyBVcGRhdGUgZGltZW5zaW9ucyBhbmQgYWNxdWlyZSBjaGFyIGF0bGFzXG4gICAgdGhpcy5oYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKTtcblxuICAgIHJldHVybiBbdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUsIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgY2hhciBhdGxhcywgYXF1aXJpbmcgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIHByaXZhdGUgX3JlZnJlc2hDaGFyQXRsYXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCA8PSAwICYmIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQgPD0gMCkge1xuICAgICAgLy8gTWFyayBhcyBub3QgYXR0YWNoZWQgc28gY2hhciBhdGxhcyBnZXRzIHJlZnJlc2hlZCBvbiBuZXh0IHJlbmRlclxuICAgICAgdGhpcy5faXNBdHRhY2hlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGF0bGFzID0gYWNxdWlyZVRleHR1cmVBdGxhcyhcbiAgICAgIHRoaXMuX3Rlcm1pbmFsLFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucyxcbiAgICAgIHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMsXG4gICAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLndpZHRoLFxuICAgICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCxcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIsXG4gICAgICB0aGlzLl9kZXZpY2VNYXhUZXh0dXJlU2l6ZVxuICAgICk7XG4gICAgaWYgKHRoaXMuX2NoYXJBdGxhcyAhPT0gYXRsYXMpIHtcbiAgICAgIHRoaXMuX29uQ2hhbmdlVGV4dHVyZUF0bGFzLmZpcmUoYXRsYXMucGFnZXNbMF0uY2FudmFzKTtcbiAgICAgIHRoaXMuX2NoYXJBdGxhc0Rpc3Bvc2FibGUudmFsdWUgPSBjb21iaW5lZERpc3Bvc2FibGUoXG4gICAgICAgIEV2ZW50LmZvcndhcmQoYXRsYXMub25BZGRUZXh0dXJlQXRsYXNDYW52YXMsIHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzKSxcbiAgICAgICAgRXZlbnQuZm9yd2FyZChhdGxhcy5vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcywgdGhpcy5fb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMpXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9jaGFyQXRsYXMgPSBhdGxhcztcbiAgICB0aGlzLl9jaGFyQXRsYXMud2FybVVwKCk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZT8uc2V0QXRsYXModGhpcy5fY2hhckF0bGFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSBjbGVhckdseXBoUmVuZGVyZXIgV2hldGhlciB0byBhbHNvIGNsZWFyIHRoZSBnbHlwaCByZW5kZXJlci4gVGhpc1xuICAgKiBzaG91bGQgYmUgdHJ1ZSBnZW5lcmFsbHkgdG8gbWFrZSBzdXJlIGl0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGFzIHRoZSBtb2RlbC5cbiAgICovXG4gIHByaXZhdGUgX2NsZWFyTW9kZWwoY2xlYXJHbHlwaFJlbmRlcmVyOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fbW9kZWwuY2xlYXIoKTtcbiAgICBpZiAoY2xlYXJHbHlwaFJlbmRlcmVyKSB7XG4gICAgICB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlPy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFyQXRsYXM/LmNsZWFyVGV4dHVyZSgpO1xuICAgIHRoaXMuX2NsZWFyTW9kZWwodHJ1ZSk7XG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJNb2RlbCh0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICBsLnJlc2V0KHRoaXMuX3Rlcm1pbmFsKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZT8ucmVzdGFydEJsaW5rQW5pbWF0aW9uKCk7XG4gICAgdGhpcy5fdXBkYXRlQ3Vyc29yQmxpbmsoKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXJSb3dzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0F0dGFjaGVkKSB7XG4gICAgICBpZiAodGhpcy5fY29yZS5zY3JlZW5FbGVtZW50Py5pc0Nvbm5lY3RlZCAmJiB0aGlzLl9jaGFyU2l6ZVNlcnZpY2Uud2lkdGggJiYgdGhpcy5fY2hhclNpemVTZXJ2aWNlLmhlaWdodCkge1xuICAgICAgICB0aGlzLl91cGRhdGVEaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXMoKTtcbiAgICAgICAgdGhpcy5faXNBdHRhY2hlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHJlbmRlciBsYXllcnNcbiAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICBsLmhhbmRsZUdyaWRDaGFuZ2VkKHRoaXMuX3Rlcm1pbmFsLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWUgfHwgIXRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGVsbCByZW5kZXJlciB0aGUgZnJhbWUgaXMgYmVnaW5uaW5nXG4gICAgLy8gdXBvbiBhIG1vZGVsIGNsZWFyIGFsc28gcmVmcmVzaCB0aGUgZnVsbCB2aWV3cG9ydCBtb2RlbFxuICAgIC8vIChhbHNvIHRyaWdnZXJlZCBieSBhbiBhdGxhcyBwYWdlIG1lcmdlLCBwYXJ0IG9mICM0NDgwKVxuICAgIGlmICh0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlLmJlZ2luRnJhbWUoKSkge1xuICAgICAgdGhpcy5fY2xlYXJNb2RlbCh0cnVlKTtcbiAgICAgIHRoaXMuX3VwZGF0ZU1vZGVsKDAsIHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCB1cGRhdGUgY2hhbmdlZCBsaW5lcyB0byBkcmF3XG4gICAgICB0aGlzLl91cGRhdGVNb2RlbChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXJcbiAgICB0aGlzLl9yZWN0YW5nbGVSZW5kZXJlci52YWx1ZS5yZW5kZXJCYWNrZ3JvdW5kcygpO1xuICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWUucmVuZGVyKHRoaXMuX21vZGVsKTtcbiAgICBpZiAoIXRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlIHx8IHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlLmlzQ3Vyc29yVmlzaWJsZSkge1xuICAgICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUucmVuZGVyQ3Vyc29yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ3Vyc29yQmxpbmsoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5jdXJzb3JCbGluayA/PyB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLmN1cnNvckJsaW5rKSB7XG4gICAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZSA9IG5ldyBDdXJzb3JCbGlua1N0YXRlTWFuYWdlcigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdDdXJzb3IoKTtcbiAgICAgIH0sIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLmNsZWFyKCk7XG4gICAgfVxuICAgIC8vIFJlcXVlc3QgYSByZWZyZXNoIGZyb20gdGhlIHRlcm1pbmFsIGFzIG1hbmFnZW1lbnQgb2YgcmVuZGVyaW5nIGlzIGJlaW5nXG4gICAgLy8gbW92ZWQgYmFjayB0byB0aGUgdGVybWluYWxcbiAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Q3Vyc29yKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVNb2RlbChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRlcm1pbmFsID0gdGhpcy5fY29yZTtcbiAgICBsZXQgY2VsbDogSUNlbGxEYXRhID0gdGhpcy5fd29ya0NlbGw7XG5cbiAgICAvLyBEZWNsYXJlIHZhcmlhYmxlIGFoZWFkIG9mIHRpbWUgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAgbGV0IGxhc3RCZzogbnVtYmVyO1xuICAgIGxldCB5OiBudW1iZXI7XG4gICAgbGV0IHJvdzogbnVtYmVyO1xuICAgIGxldCBsaW5lOiBJQnVmZmVyTGluZTtcbiAgICBsZXQgam9pbmVkUmFuZ2VzOiBbbnVtYmVyLCBudW1iZXJdW107XG4gICAgbGV0IGlzSm9pbmVkOiBib29sZWFuO1xuICAgIGxldCBza2lwSm9pbmVkQ2hlY2tVbnRpbFg6IG51bWJlciA9IDA7XG4gICAgbGV0IGlzVmFsaWRKb2luUmFuZ2U6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGxldCBsYXN0Q2hhclg6IG51bWJlcjtcbiAgICBsZXQgcmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG4gICAgbGV0IGlzQ3Vyc29yUm93OiBib29sZWFuO1xuICAgIGxldCBjaGFyczogc3RyaW5nO1xuICAgIGxldCBjb2RlOiBudW1iZXI7XG4gICAgbGV0IHdpZHRoOiBudW1iZXI7XG4gICAgbGV0IGk6IG51bWJlcjtcbiAgICBsZXQgeDogbnVtYmVyO1xuICAgIGxldCBqOiBudW1iZXI7XG4gICAgc3RhcnQgPSBjbGFtcChzdGFydCwgdGVybWluYWwucm93cyAtIDEsIDApO1xuICAgIGVuZCA9IGNsYW1wKGVuZCwgdGVybWluYWwucm93cyAtIDEsIDApO1xuICAgIGNvbnN0IGN1cnNvclN0eWxlID0gdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmN1cnNvclN0eWxlID8/IHRlcm1pbmFsLm9wdGlvbnMuY3Vyc29yU3R5bGUgPz8gJ2Jsb2NrJztcblxuICAgIGNvbnN0IGN1cnNvclkgPSB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmJhc2VZICsgdGhpcy5fdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5jdXJzb3JZO1xuICAgIGNvbnN0IHZpZXdwb3J0UmVsYXRpdmVDdXJzb3JZID0gY3Vyc29yWSAtIHRlcm1pbmFsLmJ1ZmZlci55ZGlzcDtcbiAgICAvLyBpbiBjYXNlIGN1cnNvci54ID09IGNvbHMgYWRqdXN0IHZpc3VhbCBjdXJzb3IgdG8gY29scyAtIDFcbiAgICBjb25zdCBjdXJzb3JYID0gTWF0aC5taW4odGhpcy5fdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5jdXJzb3JYLCB0ZXJtaW5hbC5jb2xzIC0gMSk7XG4gICAgbGV0IGxhc3RDdXJzb3JYID0gLTE7XG4gICAgY29uc3QgaXNDdXJzb3JWaXNpYmxlID1cbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySW5pdGlhbGl6ZWQgJiZcbiAgICAgICF0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckhpZGRlbiAmJlxuICAgICAgKCF0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZSB8fCB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZS5pc0N1cnNvclZpc2libGUpO1xuICAgIHRoaXMuX21vZGVsLmN1cnNvciA9IHVuZGVmaW5lZDtcbiAgICBsZXQgbW9kZWxVcGRhdGVkID0gZmFsc2U7XG5cbiAgICBmb3IgKHkgPSBzdGFydDsgeSA8PSBlbmQ7IHkrKykge1xuICAgICAgcm93ID0geSArIHRlcm1pbmFsLmJ1ZmZlci55ZGlzcDtcbiAgICAgIGxpbmUgPSB0ZXJtaW5hbC5idWZmZXIubGluZXMuZ2V0KHJvdykhO1xuICAgICAgdGhpcy5fbW9kZWwubGluZUxlbmd0aHNbeV0gPSAwO1xuICAgICAgaXNDdXJzb3JSb3cgPSBjdXJzb3JZID09PSByb3c7XG4gICAgICBza2lwSm9pbmVkQ2hlY2tVbnRpbFggPSAwO1xuICAgICAgam9pbmVkUmFuZ2VzID0gdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZS5nZXRKb2luZWRDaGFyYWN0ZXJzKHJvdyk7XG4gICAgICBmb3IgKHggPSAwOyB4IDwgdGVybWluYWwuY29sczsgeCsrKSB7XG4gICAgICAgIGxhc3RCZyA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZztcbiAgICAgICAgbGluZS5sb2FkQ2VsbCh4LCBjZWxsKTtcblxuICAgICAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgICAgIGxhc3RCZyA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGNoYXJhY3RlcihzKSB0byBkcmF3IHdlcmUgam9pbmVkLlxuICAgICAgICBpc0pvaW5lZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY2VsbCBpcyBwYXJ0IG9mIGEgam9pbmVkIHJhbmdlIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgYXMgaXQgY2Fubm90XG4gICAgICAgIC8vIGJlIHJlbmRlcmVkIGVudGlyZWx5LCBsaWtlIHRoZSBzZWxlY3Rpb24gc3RhdGUgZGlmZmVycyBhY3Jvc3MgdGhlIHJhbmdlLlxuICAgICAgICBpc1ZhbGlkSm9pblJhbmdlID0gKHggPj0gc2tpcEpvaW5lZENoZWNrVW50aWxYKTtcblxuICAgICAgICBsYXN0Q2hhclggPSB4O1xuXG4gICAgICAgIC8vIFByb2Nlc3MgYW55IGpvaW5lZCBjaGFyYWN0ZXIgcmFuZ2VzIGFzIG5lZWRlZC4gQmVjYXVzZSBvZiBob3cgdGhlXG4gICAgICAgIC8vIHJhbmdlcyBhcmUgcHJvZHVjZWQsIHdlIGtub3cgdGhhdCB0aGV5IGFyZSB2YWxpZCBmb3IgdGhlIGNoYXJhY3RlcnNcbiAgICAgICAgLy8gYW5kIGF0dHJpYnV0ZXMgb2Ygb3VyIGlucHV0LlxuICAgICAgICBpZiAoam9pbmVkUmFuZ2VzLmxlbmd0aCA+IDAgJiYgeCA9PT0gam9pbmVkUmFuZ2VzWzBdWzBdICYmIGlzVmFsaWRKb2luUmFuZ2UpIHtcbiAgICAgICAgICByYW5nZSA9IGpvaW5lZFJhbmdlcy5zaGlmdCgpITtcblxuICAgICAgICAgIC8vIElmIHRoZSBsaWdhdHVyZSdzIHNlbGVjdGlvbiBzdGF0ZSBpcyBub3QgY29uc2lzdGVudCwgZG9uJ3Qgam9pbiBpdC4gVGhpcyBoZWxwcyB0aGVcbiAgICAgICAgICAvLyBzZWxlY3Rpb24gcmVuZGVyIGNvcnJlY3RseSByZWdhcmRsZXNzIHdoZXRoZXIgdGhleSBzaG91bGQgYmUgam9pbmVkLlxuICAgICAgICAgIGNvbnN0IGZpcnN0U2VsZWN0aW9uU3RhdGUgPSB0aGlzLl9tb2RlbC5zZWxlY3Rpb24uaXNDZWxsU2VsZWN0ZWQodGhpcy5fdGVybWluYWwsIHJhbmdlWzBdLCByb3cpO1xuICAgICAgICAgIGZvciAoaSA9IHJhbmdlWzBdICsgMTsgaSA8IHJhbmdlWzFdOyBpKyspIHtcbiAgICAgICAgICAgIGlzVmFsaWRKb2luUmFuZ2UgJiY9IChmaXJzdFNlbGVjdGlvblN0YXRlID09PSB0aGlzLl9tb2RlbC5zZWxlY3Rpb24uaXNDZWxsU2VsZWN0ZWQodGhpcy5fdGVybWluYWwsIGksIHJvdykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTaW1pbGFybHksIGlmIHRoZSBjdXJzb3IgaXMgaW4gdGhlIGxpZ2F0dXJlLCBkb24ndCBqb2luIGl0LlxuICAgICAgICAgIGlzVmFsaWRKb2luUmFuZ2UgJiY9ICFpc0N1cnNvclJvdyB8fCBjdXJzb3JYIDwgcmFuZ2VbMF0gfHwgY3Vyc29yWCA+PSByYW5nZVsxXTtcbiAgICAgICAgICBpZiAoIWlzVmFsaWRKb2luUmFuZ2UpIHtcbiAgICAgICAgICAgIHNraXBKb2luZWRDaGVja1VudGlsWCA9IHJhbmdlWzFdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpc0pvaW5lZCA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgZXhhY3Qgc3RhcnQgYW5kIGVuZCBjb2x1bW4gb2YgdGhlIGpvaW5lZCByYW5nZSxcbiAgICAgICAgICAgIC8vIHNvIHdlIGdldCB0aGUgc3RyaW5nIGFuZCB3aWR0aCByZXByZXNlbnRpbmcgaXQgZGlyZWN0bHkuXG4gICAgICAgICAgICBjZWxsID0gbmV3IEpvaW5lZENlbGxEYXRhKFxuICAgICAgICAgICAgICBjZWxsLFxuICAgICAgICAgICAgICBsaW5lIS50cmFuc2xhdGVUb1N0cmluZyh0cnVlLCByYW5nZVswXSwgcmFuZ2VbMV0pLFxuICAgICAgICAgICAgICByYW5nZVsxXSAtIHJhbmdlWzBdXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIG92ZXIgdGhlIGNlbGxzIG9jY3VwaWVkIGJ5IHRoaXMgcmFuZ2UgaW4gdGhlIGxvb3BcbiAgICAgICAgICAgIGxhc3RDaGFyWCA9IHJhbmdlWzFdIC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGFycyA9IGNlbGwuZ2V0Q2hhcnMoKTtcbiAgICAgICAgY29kZSA9IGNlbGwuZ2V0Q29kZSgpO1xuICAgICAgICBpID0gKCh5ICogdGVybWluYWwuY29scykgKyB4KSAqIFJFTkRFUl9NT0RFTF9JTkRJQ0lFU19QRVJfQ0VMTDtcblxuICAgICAgICAvLyBMb2FkIGNvbG9ycy9yZXNvbHZlIG92ZXJyaWRlcyBpbnRvIHdvcmsgY29sb3JzXG4gICAgICAgIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc29sdmUoY2VsbCwgeCwgcm93LCB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgpO1xuXG4gICAgICAgIC8vIE92ZXJyaWRlIGNvbG9ycyBmb3IgY3Vyc29yIGNlbGxcbiAgICAgICAgaWYgKGlzQ3Vyc29yVmlzaWJsZSAmJiByb3cgPT09IGN1cnNvclkpIHtcbiAgICAgICAgICBpZiAoeCA9PT0gY3Vyc29yWCkge1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY3Vyc29yID0ge1xuICAgICAgICAgICAgICB4OiBjdXJzb3JYLFxuICAgICAgICAgICAgICB5OiB2aWV3cG9ydFJlbGF0aXZlQ3Vyc29yWSxcbiAgICAgICAgICAgICAgd2lkdGg6IGNlbGwuZ2V0V2lkdGgoKSxcbiAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPyBjdXJzb3JTdHlsZSA6IHRlcm1pbmFsLm9wdGlvbnMuY3Vyc29ySW5hY3RpdmVTdHlsZSxcbiAgICAgICAgICAgICAgY3Vyc29yV2lkdGg6IHRlcm1pbmFsLm9wdGlvbnMuY3Vyc29yV2lkdGgsXG4gICAgICAgICAgICAgIGRwcjogdGhpcy5fZGV2aWNlUGl4ZWxSYXRpb1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxhc3RDdXJzb3JYID0gY3Vyc29yWCArIGNlbGwuZ2V0V2lkdGgoKSAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh4ID49IGN1cnNvclggJiYgeCA8PSBsYXN0Q3Vyc29yWCAmJlxuICAgICAgICAgICAgICAoKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgJiZcbiAgICAgICAgICAgICAgY3Vyc29yU3R5bGUgPT09ICdibG9jaycpIHx8XG4gICAgICAgICAgICAgICh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICB0ZXJtaW5hbC5vcHRpb25zLmN1cnNvckluYWN0aXZlU3R5bGUgPT09ICdibG9jaycpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnID1cbiAgICAgICAgICAgICAgQXR0cmlidXRlcy5DTV9SR0IgfCAodGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5jdXJzb3JBY2NlbnQucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgICAgICB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuYmcgPVxuICAgICAgICAgICAgICBBdHRyaWJ1dGVzLkNNX1JHQiB8ICh0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmN1cnNvci5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSAhPT0gTlVMTF9DRUxMX0NPREUpIHtcbiAgICAgICAgICB0aGlzLl9tb2RlbC5saW5lTGVuZ3Roc1t5XSA9IHggKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90aGluZyBoYXMgY2hhbmdlZCwgbm8gdXBkYXRlcyBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsLmNlbGxzW2ldID09PSBjb2RlICYmXG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpICsgUkVOREVSX01PREVMX0JHX09GRlNFVF0gPT09IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZyAmJlxuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaSArIFJFTkRFUl9NT0RFTF9GR19PRkZTRVRdID09PSB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZmcgJiZcbiAgICAgICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2kgKyBSRU5ERVJfTU9ERUxfRVhUX09GRlNFVF0gPT09IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5leHQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGVsVXBkYXRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gRmxhZyBjb21iaW5lZCBjaGFycyB3aXRoIGEgYml0IG1hc2sgc28gdGhleSdyZSBlYXNpbHkgaWRlbnRpZmlhYmxlXG4gICAgICAgIGlmIChjaGFycy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29kZSB8PSBDT01CSU5FRF9DSEFSX0JJVF9NQVNLO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdHMgaW4gdGhlIG1vZGVsXG4gICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2ldID0gY29kZTtcbiAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaSArIFJFTkRFUl9NT0RFTF9CR19PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnO1xuICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpICsgUkVOREVSX01PREVMX0ZHX09GRlNFVF0gPSB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZmc7XG4gICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2kgKyBSRU5ERVJfTU9ERUxfRVhUX09GRlNFVF0gPSB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZXh0O1xuXG4gICAgICAgIHdpZHRoID0gY2VsbC5nZXRXaWR0aCgpO1xuICAgICAgICB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlIS51cGRhdGVDZWxsKHgsIHksIGNvZGUsIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZywgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnLCB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZXh0LCBjaGFycywgd2lkdGgsIGxhc3RCZyk7XG5cbiAgICAgICAgaWYgKGlzSm9pbmVkKSB7XG4gICAgICAgICAgLy8gUmVzdG9yZSB3b3JrIGNlbGxcbiAgICAgICAgICBjZWxsID0gdGhpcy5fd29ya0NlbGw7XG5cbiAgICAgICAgICAvLyBOdWxsIG91dCBub24tZmlyc3QgY2VsbHNcbiAgICAgICAgICBmb3IgKHgrKzsgeCA8PSBsYXN0Q2hhclg7IHgrKykge1xuICAgICAgICAgICAgaiA9ICgoeSAqIHRlcm1pbmFsLmNvbHMpICsgeCkgKiBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEw7XG4gICAgICAgICAgICB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlIS51cGRhdGVDZWxsKHgsIHksIE5VTExfQ0VMTF9DT0RFLCAwLCAwLCAwLCBOVUxMX0NFTExfQ0hBUiwgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tqXSA9IE5VTExfQ0VMTF9DT0RFO1xuICAgICAgICAgICAgLy8gRG9uJ3QgcmUtcmVzb2x2ZSB0aGUgY2VsbCBjb2xvciBzaW5jZSBtdWx0aS1jb2xvcmVkIGxpZ2F0dXJlIGJhY2tncm91bmRzIGFyZSBub3RcbiAgICAgICAgICAgIC8vIHN1cHBvcnRlZFxuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaiArIFJFTkRFUl9NT0RFTF9CR19PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaiArIFJFTkRFUl9NT0RFTF9GR19PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaiArIFJFTkRFUl9NT0RFTF9FWFRfT0ZGU0VUXSA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5leHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHgtLTsgLy8gR28gYmFjayB0byB0aGUgcHJldmlvdXMgdXBkYXRlIGNlbGwgZm9yIG5leHQgaXRlcmF0aW9uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZGVsVXBkYXRlZCkge1xuICAgICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUhLnVwZGF0ZUJhY2tncm91bmRzKHRoaXMuX21vZGVsKTtcbiAgICB9XG4gICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUhLnVwZGF0ZUN1cnNvcih0aGlzLl9tb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjYWxjdWxhdGVzIHRoZSBjaGFyYWN0ZXIgYW5kIGNhbnZhcyBkaW1lbnNpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlRGltZW5zaW9ucygpOiB2b2lkIHtcbiAgICAvLyBQZXJmb3JtIGEgbmV3IG1lYXN1cmUgaWYgdGhlIENoYXJNZWFzdXJlIGRpbWVuc2lvbnMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLl9jaGFyU2l6ZVNlcnZpY2Uud2lkdGggfHwgIXRoaXMuX2NoYXJTaXplU2VydmljZS5oZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldmljZSBjaGFyYWN0ZXIgd2lkdGguIFdpZHRoIGlzIGZsb29yZWQgYXMgaXQgbXVzdCBiZSBkcmF3biB0byBhbiBpbnRlZ2VyIGdyaWRcbiAgICAvLyBpbiBvcmRlciBmb3IgdGhlIGNoYXIgYXRsYXMgZ2x5cGhzIHRvIG5vdCBiZSBibHVycnkuXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLndpZHRoID0gTWF0aC5mbG9vcih0aGlzLl9jaGFyU2l6ZVNlcnZpY2Uud2lkdGggKiB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV2aWNlIGNoYXJhY3RlciBoZWlnaHQuIEhlaWdodCBpcyBjZWlsZWQgaW4gY2FzZSBkZXZpY2VQaXhlbFJhdGlvIGlzIGFcbiAgICAvLyBmbG9hdGluZyBwb2ludCBudW1iZXIgaW4gb3JkZXIgdG8gZW5zdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byBkcmF3IHRoZSBjaGFyYWN0ZXIgdG8gdGhlXG4gICAgLy8gY2VsbC5cbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIuaGVpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuX2NoYXJTaXplU2VydmljZS5oZWlnaHQgKiB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV2aWNlIGNlbGwgaGVpZ2h0LCBpZiBsaW5lSGVpZ2h0IGlzIF9ub3RfIDEsIHRoZSByZXN1bHRpbmcgdmFsdWUgd2lsbCBiZVxuICAgIC8vIGZsb29yZWQgc2luY2UgbGluZUhlaWdodCBjYW4gbmV2ZXIgYmUgbG93ZXIgdGhlbiAxLCB0aGlzIGd1YXJlbnRlZXMgdGhlIGRldmljZSBjZWxsIGhlaWdodFxuICAgIC8vIHdpbGwgYWx3YXlzIGJlIGxhcmdlciB0aGFuIGRldmljZSBjaGFyIGhlaWdodC5cbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0ID0gTWF0aC5mbG9vcih0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIuaGVpZ2h0ICogdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5saW5lSGVpZ2h0KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgeSBvZmZzZXQgd2l0aGluIGEgY2VsbCB0aGF0IGdseXBoIHNob3VsZCBkcmF3IGF0IGluIG9yZGVyIGZvciBpdCB0byBiZSBjZW50ZXJlZFxuICAgIC8vIGNvcnJlY3RseSB3aXRoaW4gdGhlIGNlbGwuXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLnRvcCA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubGluZUhlaWdodCA9PT0gMSA/IDAgOiBNYXRoLnJvdW5kKCh0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0IC0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCkgLyAyKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV2aWNlIGNlbGwgd2lkdGgsIHRha2luZyB0aGUgbGV0dGVyU3BhY2luZyBpbnRvIGFjY291bnQuXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLndpZHRoICsgTWF0aC5yb3VuZCh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxldHRlclNwYWNpbmcpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSB4IG9mZnNldCB3aXRoIGEgY2VsbCB0aGF0IHRleHQgc2hvdWxkIGRyYXcgZnJvbSBpbiBvcmRlciBmb3IgaXQgdG8gYmUgY2VudGVyZWRcbiAgICAvLyBjb3JyZWN0bHkgd2l0aGluIHRoZSBjZWxsLlxuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5sZWZ0ID0gTWF0aC5mbG9vcih0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxldHRlclNwYWNpbmcgLyAyKTtcblxuICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBjYW52YXMgZGltZW5zaW9ucywgdGhlIGRldmljZSBkaW1lbnNpb25zIGRlZmluZSB0aGUgYWN0dWFsIG51bWJlciBvZiBwaXhlbCBpblxuICAgIC8vIHRoZSBjYW52YXNcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQgPSB0aGlzLl90ZXJtaW5hbC5yb3dzICogdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodDtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aCA9IHRoaXMuX3Rlcm1pbmFsLmNvbHMgKiB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGg7XG5cbiAgICAvLyBUaGUgdGhlIHNpemUgb2YgdGhlIGNhbnZhcyBvbiB0aGUgcGFnZS4gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGlzIHJvdW5kcyB0byBuZWFyZXN0IGludGVnZXJcbiAgICAvLyBhbmQgbm90IGNlaWxzIGFzIGJyb3dzZXJzIG9mdGVuIGhhdmUgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGlzc3VlcyB3aGVyZVxuICAgIC8vIGB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb2AgZW5kcyB1cCBiZWluZyBzb21ldGhpbmcgbGlrZSBgMS4xMDAwMDAwMjM4NDE4NThgIGZvciBleGFtcGxlLCB3aGVuXG4gICAgLy8gaXQncyBhY3R1YWxseSAxLjEuIENlaWxpbmcgbWF5IGNhdXNlcyBibHVycmluZXNzIGFzIHRoZSBiYWNraW5nIGNhbnZhcyBpbWFnZSBpcyAxIHBpeGVsIHRvb1xuICAgIC8vIGxhcmdlIGZvciB0aGUgY2FudmFzIGVsZW1lbnQgc2l6ZS5cbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodCAvIHRoaXMuX2RldmljZVBpeGVsUmF0aW8pO1xuICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aCAvIHRoaXMuX2RldmljZVBpeGVsUmF0aW8pO1xuXG4gICAgLy8gR2V0IHRoZSBDU1MgZGltZW5zaW9ucyBvZiBhbiBpbmRpdmlkdWFsIGNlbGwuIFRoaXMgbmVlZHMgdG8gYmUgZGVyaXZlZCBmcm9tIHRoZSBjYWxjdWxhdGVkXG4gICAgLy8gZGV2aWNlIHBpeGVsIGNhbnZhcyB2YWx1ZSBhYm92ZS4gQ2hhck1lYXN1cmUud2lkdGgvaGVpZ2h0IGJ5IGl0c2VsZiBpcyBpbnN1ZmZpY2llbnQgd2hlbiB0aGVcbiAgICAvLyBwYWdlIGlzIG5vdCBhdCAxMDAlIHpvb20gbGV2ZWwgYXMgQ2hhck1lYXN1cmUgaXMgbWVhc3VyZWQgaW4gQ1NTIHBpeGVscywgYnV0IHRoZSBhY3R1YWwgY2hhclxuICAgIC8vIHNpemUgb24gdGhlIGNhbnZhcyBjYW4gZGlmZmVyLlxuICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQgPSB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0IC8gdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbztcbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGggPSB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGggLyB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q2FudmFzRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NhbnZhcy53aWR0aCA9PT0gd2lkdGggJiYgdGhpcy5fY2FudmFzLmhlaWdodCA9PT0gaGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFdoaWxlIHRoZSBhY3R1YWwgY2FudmFzIHNpemUgaGFzIGNoYW5nZWQsIGtlZXAgZGV2aWNlIGNhbnZhcyBkaW1lbnNpb25zIGFzIHRoZSB2YWx1ZSBiZWZvcmVcbiAgICAvLyB0aGUgY2hhbmdlIGFzIGl0J3MgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIGNlbGwgc2l6ZXMuXG4gICAgdGhpcy5fY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCgpOiB2b2lkIHtcbiAgICB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZmlyZSh7IHN0YXJ0OiAwLCBlbmQ6IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdFJlZHJhd0N1cnNvcigpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJzb3JZID0gdGhpcy5fdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5jdXJzb3JZO1xuICAgIHRoaXMuX29uUmVxdWVzdFJlZHJhdy5maXJlKHsgc3RhcnQ6IGN1cnNvclksIGVuZDogY3Vyc29yWSB9KTtcbiAgfVxufVxuXG4vLyBUT0RPOiBTaGFyZSBpbXBsIHdpdGggY29yZVxuZXhwb3J0IGNsYXNzIEpvaW5lZENlbGxEYXRhIGV4dGVuZHMgQXR0cmlidXRlRGF0YSBpbXBsZW1lbnRzIElDZWxsRGF0YSB7XG4gIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG4gIC8vIC5jb250ZW50IGNhcnJpZXMgbm8gbWVhbmluZyBmb3Igam9pbmVkIENlbGxEYXRhLCBzaW1wbHkgbnVsbGlmeSBpdFxuICAvLyB0aHVzIHdlIGhhdmUgdG8gb3ZlcmxvYWQgYWxsIG90aGVyIC5jb250ZW50IGFjY2Vzc29yc1xuICBwdWJsaWMgY29udGVudDogbnVtYmVyID0gMDtcbiAgcHVibGljIGZnOiBudW1iZXI7XG4gIHB1YmxpYyBiZzogbnVtYmVyO1xuICBwdWJsaWMgY29tYmluZWREYXRhOiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihmaXJzdENlbGw6IElDZWxsRGF0YSwgY2hhcnM6IHN0cmluZywgd2lkdGg6IG51bWJlcikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mZyA9IGZpcnN0Q2VsbC5mZztcbiAgICB0aGlzLmJnID0gZmlyc3RDZWxsLmJnO1xuICAgIHRoaXMuY29tYmluZWREYXRhID0gY2hhcnM7XG4gICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBpc0NvbWJpbmVkKCk6IG51bWJlciB7XG4gICAgLy8gYWx3YXlzIG1hcmsgam9pbmVkIGNlbGwgZGF0YSBhcyBjb21iaW5lZFxuICAgIHJldHVybiBDb250ZW50LklTX0NPTUJJTkVEX01BU0s7XG4gIH1cblxuICBwdWJsaWMgZ2V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2hhcnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZERhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29kZSgpOiBudW1iZXIge1xuICAgIC8vIGNvZGUgYWx3YXlzIGdldHMgdGhlIGhpZ2hlc3QgcG9zc2libGUgZmFrZSBjb2RlcG9pbnQgKHJlYWQgYXMgLTEpXG4gICAgLy8gdGhpcyBpcyBuZWVkZWQgYXMgY29kZSBpcyB1c2VkIGJ5IGNhY2hlcyBhcyBpZGVudGlmaWVyXG4gICAgcmV0dXJuIDB4MUZGRkZGO1xuICB9XG5cbiAgcHVibGljIHNldEZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgcHVibGljIGdldEFzQ2hhckRhdGEoKTogQ2hhckRhdGEge1xuICAgIHJldHVybiBbdGhpcy5mZywgdGhpcy5nZXRDaGFycygpLCB0aGlzLmdldFdpZHRoKCksIHRoaXMuZ2V0Q29kZSgpXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtYXg6IG51bWJlciwgbWluOiBudW1iZXIgPSAwKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHZhbHVlLCBtYXgpLCBtaW4pO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBUaGlzIHdhcyBoZWF2aWx5IGluc3BpcmVkIGZyb20gbWljcm9zb2Z0L3ZzY29kZSdzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbSAoTUlUKS5cbiAqL1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IElTZXJ2aWNlSWRlbnRpZmllciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmNvbnN0IERJX1RBUkdFVCA9ICdkaSR0YXJnZXQnO1xuY29uc3QgRElfREVQRU5ERU5DSUVTID0gJ2RpJGRlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBjb25zdCBzZXJ2aWNlUmVnaXN0cnk6IE1hcDxzdHJpbmcsIElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcnZpY2VEZXBlbmRlbmNpZXMoY3RvcjogYW55KTogeyBpZDogSVNlcnZpY2VJZGVudGlmaWVyPGFueT4sIGluZGV4OiBudW1iZXIsIG9wdGlvbmFsOiBib29sZWFuIH1bXSB7XG4gIHJldHVybiBjdG9yW0RJX0RFUEVOREVOQ0lFU10gfHwgW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWNvcmF0b3I8VD4oaWQ6IHN0cmluZyk6IElTZXJ2aWNlSWRlbnRpZmllcjxUPiB7XG4gIGlmIChzZXJ2aWNlUmVnaXN0cnkuaGFzKGlkKSkge1xuICAgIHJldHVybiBzZXJ2aWNlUmVnaXN0cnkuZ2V0KGlkKSE7XG4gIH1cblxuICBjb25zdCBkZWNvcmF0b3I6IGFueSA9IGZ1bmN0aW9uICh0YXJnZXQ6IEZ1bmN0aW9uLCBrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQElTZXJ2aWNlTmFtZS1kZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCB0byBkZWNvcmF0ZSBhIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHN0b3JlU2VydmljZURlcGVuZGVuY3koZGVjb3JhdG9yLCB0YXJnZXQsIGluZGV4KTtcbiAgfTtcblxuICBkZWNvcmF0b3IuX2lkID0gaWQ7XG5cbiAgc2VydmljZVJlZ2lzdHJ5LnNldChpZCwgZGVjb3JhdG9yKTtcbiAgcmV0dXJuIGRlY29yYXRvcjtcbn1cblxuZnVuY3Rpb24gc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShpZDogRnVuY3Rpb24sIHRhcmdldDogRnVuY3Rpb24sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID09PSB0YXJnZXQpIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXS5wdXNoKHsgaWQsIGluZGV4IH0pO1xuICB9IGVsc2Uge1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9ERVBFTkRFTkNJRVNdID0gW3sgaWQsIGluZGV4IH1dO1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID0gdGFyZ2V0O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEZWNvcmF0aW9uLCBJRGVjb3JhdGlvbk9wdGlvbnMsIElMaW5rSGFuZGxlciwgSUxvZ2dlciwgSVdpbmRvd3NQdHksIHR5cGUgSU92ZXJ2aWV3UnVsZXJPcHRpb25zIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IENvcmVNb3VzZUVuY29kaW5nLCBDb3JlTW91c2VFdmVudFR5cGUsIEN1cnNvckluYWN0aXZlU3R5bGUsIEN1cnNvclN0eWxlLCBJQXR0cmlidXRlRGF0YSwgSUNoYXJzZXQsIElDb2xvciwgSUNvcmVNb3VzZUV2ZW50LCBJQ29yZU1vdXNlUHJvdG9jb2wsIElEZWNQcml2YXRlTW9kZXMsIElEaXNwb3NhYmxlLCBJTW9kZXMsIElPc2NMaW5rRGF0YSwgSVdpbmRvd09wdGlvbnMgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSUJ1ZmZlciwgSUJ1ZmZlclNldCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlRGVjb3JhdG9yIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgdHlwZSB7IEVtaXR0ZXIsIEV2ZW50IH0gZnJvbSAndnMvYmFzZS9jb21tb24vZXZlbnQnO1xuXG5leHBvcnQgY29uc3QgSUJ1ZmZlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUJ1ZmZlclNlcnZpY2U+KCdCdWZmZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElCdWZmZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29sczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcjogSUJ1ZmZlcjtcbiAgcmVhZG9ubHkgYnVmZmVyczogSUJ1ZmZlclNldDtcbiAgaXNVc2VyU2Nyb2xsaW5nOiBib29sZWFuO1xuICBvblJlc2l6ZTogRXZlbnQ8SUJ1ZmZlclJlc2l6ZUV2ZW50PjtcbiAgb25TY3JvbGw6IEV2ZW50PG51bWJlcj47XG4gIHNjcm9sbChlcmFzZUF0dHI6IElBdHRyaWJ1dGVEYXRhLCBpc1dyYXBwZWQ/OiBib29sZWFuKTogdm9pZDtcbiAgc2Nyb2xsTGluZXMoZGlzcDogbnVtYmVyLCBzdXBwcmVzc1Njcm9sbEV2ZW50PzogYm9vbGVhbik6IHZvaWQ7XG4gIHJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJ1ZmZlclJlc2l6ZUV2ZW50IHtcbiAgY29sczogbnVtYmVyO1xuICByb3dzOiBudW1iZXI7XG4gIGNvbHNDaGFuZ2VkOiBib29sZWFuO1xuICByb3dzQ2hhbmdlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlTW91c2VTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDb3JlTW91c2VTZXJ2aWNlPignQ29yZU1vdXNlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZU1vdXNlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIGFjdGl2ZVByb3RvY29sOiBzdHJpbmc7XG4gIGFjdGl2ZUVuY29kaW5nOiBzdHJpbmc7XG4gIGFyZU1vdXNlRXZlbnRzQWN0aXZlOiBib29sZWFuO1xuICBhZGRQcm90b2NvbChuYW1lOiBzdHJpbmcsIHByb3RvY29sOiBJQ29yZU1vdXNlUHJvdG9jb2wpOiB2b2lkO1xuICBhZGRFbmNvZGluZyhuYW1lOiBzdHJpbmcsIGVuY29kaW5nOiBDb3JlTW91c2VFbmNvZGluZyk6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbW91c2UgZXZlbnQgdG8gYmUgc2VudC5cbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBwYXNzZWQgYWxsIHByb3RvY29sIHJlc3RyaWN0aW9ucyBhbmQgYSByZXBvcnRcbiAgICogd2FzIHNlbnQsIG90aGVyd2lzZSBmYWxzZS4gVGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlclxuICAgKiB0aGUgZGVmYXVsdCBldmVudCBhY3Rpb24gaW4gdGhlIGJvd3NlciBjb21wb25lbnQgc2hvdWxkIGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBtZXRob2Qgd2lsbCBjaGFuZ2UgdmFsdWVzIG9mIHRoZSBnaXZlbiBldmVudCBvYmplY3RcbiAgICogdG8gZnVsbGZpbGwgcHJvdG9jb2wgYW5kIGVuY29kaW5nIHJlc3RyaWN0aW9ucy5cbiAgICovXG4gIHRyaWdnZXJNb3VzZUV2ZW50KGV2ZW50OiBJQ29yZU1vdXNlRXZlbnQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFdmVudCB0byBhbm5vdW5jZSBjaGFuZ2VzIGluIG1vdXNlIHRyYWNraW5nLlxuICAgKi9cbiAgb25Qcm90b2NvbENoYW5nZTogRXZlbnQ8Q29yZU1vdXNlRXZlbnRUeXBlPjtcblxuICAvKipcbiAgICogSHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiBtb3VzZSBldmVudHMuXG4gICAqL1xuICBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfTtcblxuICAvKipcbiAgICogUHJvY2VzcyB3aGVlbCBldmVudCB0YWtpbmcgcGFydGlhbCBzY3JvbGwgaW50byBhY2NvdW50LlxuICAgKi9cbiAgY29uc3VtZVdoZWVsRXZlbnQoZXY6IFdoZWVsRXZlbnQsIGNlbGxIZWlnaHQ/OiBudW1iZXIsIGRwcj86IG51bWJlcik6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZVNlcnZpY2U+KCdDb3JlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5pdGlhbGx5IHRoZSBjdXJzb3Igd2lsbCBub3QgYmUgdmlzaWJsZSB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGUgdGVybWluYWxcbiAgICogaXMgZm9jdXNlZC5cbiAgICovXG4gIGlzQ3Vyc29ySW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIGlzQ3Vyc29ySGlkZGVuOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG1vZGVzOiBJTW9kZXM7XG4gIHJlYWRvbmx5IGRlY1ByaXZhdGVNb2RlczogSURlY1ByaXZhdGVNb2RlcztcblxuICByZWFkb25seSBvbkRhdGE6IEV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uVXNlcklucHV0OiBFdmVudDx2b2lkPjtcbiAgcmVhZG9ubHkgb25CaW5hcnk6IEV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbFRvQm90dG9tOiBFdmVudDx2b2lkPjtcblxuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgb25EYXRhIGV2ZW50IGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0aGF0IGlzIGJlaW5nIGVtaXR0ZWQuXG4gICAqIEBwYXJhbSB3YXNVc2VySW5wdXQgV2hldGhlciB0aGUgZGF0YSBvcmlnaW5hdGVkIGZyb20gdGhlIHVzZXIgKGFzIG9wcG9zZWQgdG9cbiAgICogcmVzdWx0aW5nIGZyb20gcGFyc2luZyBpbmNvbWluZyBkYXRhKS4gV2hlbiB0cnVlIHRoaXMgd2lsbCBhbHNvOlxuICAgKiAtIFNjcm9sbCB0byB0aGUgYm90dG9tIG9mIHRoZSBidWZmZXIgaWYgb3B0aW9uIHNjcm9sbE9uVXNlcklucHV0IGlzIHRydWUuXG4gICAqIC0gRmlyZSB0aGUgYG9uVXNlcklucHV0YCBldmVudCAoc28gc2VsZWN0aW9uIGNhbiBiZSBjbGVhcmVkKS5cbiAgICovXG4gIHRyaWdnZXJEYXRhRXZlbnQoZGF0YTogc3RyaW5nLCB3YXNVc2VySW5wdXQ/OiBib29sZWFuKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uQmluYXJ5IGV2ZW50IGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0aGF0IGlzIGJlaW5nIGVtaXR0ZWQuXG4gICAqL1xuICB0cmlnZ2VyQmluYXJ5RXZlbnQoZGF0YTogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElDaGFyc2V0U2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ2hhcnNldFNlcnZpY2U+KCdDaGFyc2V0U2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ2hhcnNldFNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZ2xldmVsOiBudW1iZXI7XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBHIGxldmVsIG9mIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGdcbiAgICovXG4gIHNldGdMZXZlbChnOiBudW1iZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNoYXJzZXQgZm9yIHRoZSBnaXZlbiBHIGxldmVsIG9mIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGdcbiAgICogQHBhcmFtIGNoYXJzZXRcbiAgICovXG4gIHNldGdDaGFyc2V0KGc6IG51bWJlciwgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2aWNlSWRlbnRpZmllcjxUPiB7XG4gICguLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG4gIHR5cGU6IFQ7XG4gIF9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCcmFuZGVkU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xufVxuXG50eXBlIEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxUQXJncyBleHRlbmRzIGFueVtdPiA9IFRBcmdzIGV4dGVuZHMgW10gPyBbXVxuICA6IFRBcmdzIGV4dGVuZHMgWy4uLmluZmVyIFRGaXJzdCwgaW5mZXIgVExhc3RdID8gVExhc3QgZXh0ZW5kcyBJQnJhbmRlZFNlcnZpY2UgPyBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEZpcnN0PiA6IFRBcmdzXG4gICAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IElJbnN0YW50aWF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJSW5zdGFudGlhdGlvblNlcnZpY2U+KCdJbnN0YW50aWF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBzZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogdm9pZDtcbiAgZ2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZDtcbiAgY3JlYXRlSW5zdGFuY2U8Q3RvciBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSwgUiBleHRlbmRzIEluc3RhbmNlVHlwZTxDdG9yPj4odDogQ3RvciwgLi4uYXJnczogR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPENvbnN0cnVjdG9yUGFyYW1ldGVyczxDdG9yPj4pOiBSO1xufVxuXG5leHBvcnQgZW51bSBMb2dMZXZlbEVudW0ge1xuICBUUkFDRSA9IDAsXG4gIERFQlVHID0gMSxcbiAgSU5GTyA9IDIsXG4gIFdBUk4gPSAzLFxuICBFUlJPUiA9IDQsXG4gIE9GRiA9IDVcbn1cblxuZXhwb3J0IGNvbnN0IElMb2dTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElMb2dTZXJ2aWNlPignTG9nU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTG9nU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGxvZ0xldmVsOiBMb2dMZXZlbEVudW07XG5cbiAgdHJhY2UobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSU9wdGlvbnNTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPcHRpb25zU2VydmljZT4oJ09wdGlvbnNTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25zU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSByYXcgb3B0aW9ucyBvYmplY3QsIHRoaXMgaXMgYW4gaW50ZXJuYWwtb25seSBmYXN0IHBhdGggZm9yIGFjY2Vzc2luZ1xuICAgKiBzaW5nbGUgb3B0aW9ucyB3aXRob3V0IGFueSB2YWxpZGF0aW9uIGFzIHdlIHRydXN0IFR5cGVTY3JpcHQgdG8gZW5mb3JjZSBjb3JyZWN0IHVzYWdlXG4gICAqIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSByYXdPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogT3B0aW9ucyBhcyBleHBvc2VkIHRocm91Z2ggdGhlIHB1YmxpYyBBUEksIHRoaXMgcHJvcGVydHkgdXNlcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdpdGhcbiAgICogdmFsaWRhdGlvbiB3aGljaCBtYWtlcyBpdCBzYWZlciBidXQgc2xvd2VyLiB7QGxpbmsgcmF3T3B0aW9uc30gc2hvdWxkIGJlIHVzZWQgZm9yIHByZXR0eSBtdWNoXG4gICAqIGFsbCBpbnRlcm5hbCB1c2FnZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGFueSBvcHRpb24gY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uT3B0aW9uQ2hhbmdlOiBFdmVudDxrZXlvZiBJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNwZWNpZmljIG9wdGlvbiBjaGFuZ2VzLCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaXNcbiAgICogcHJlZmVycmVkIG92ZXIge0BsaW5rIG9uT3B0aW9uQ2hhbmdlfSB3aGVuIG9ubHkgYSBzaW5nbGUgb3B0aW9uIGlzIGJlaW5nIGxpc3RlbmVkIHRvLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBvblNwZWNpZmljT3B0aW9uQ2hhbmdlPFQgZXh0ZW5kcyBrZXlvZiBJVGVybWluYWxPcHRpb25zPihrZXk6IFQsIGxpc3RlbmVyOiAoYXJnMTogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz5bVF0pID0+IGFueSk6IElEaXNwb3NhYmxlO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGEgc2V0IG9mIHNwZWNpZmljIG9wdGlvbnMgY2hhbmdlLCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kXG4gICAqIHRoYXQgaXMgcHJlZmVycmVkIG92ZXIge0BsaW5rIG9uT3B0aW9uQ2hhbmdlfSB3aGVuIG11bHRpcGxlIG9wdGlvbnMgYXJlIGJlaW5nIGxpc3RlbmVkIHRvIGFuZFxuICAgKiBoYW5kbGVkIHRoZSBzYW1lIHdheS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25NdWx0aXBsZU9wdGlvbkNoYW5nZShrZXlzOiAoa2V5b2YgSVRlcm1pbmFsT3B0aW9ucylbXSwgbGlzdGVuZXI6ICgpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgdHlwZSBGb250V2VpZ2h0ID0gJ25vcm1hbCcgfCAnYm9sZCcgfCAnMTAwJyB8ICcyMDAnIHwgJzMwMCcgfCAnNDAwJyB8ICc1MDAnIHwgJzYwMCcgfCAnNzAwJyB8ICc4MDAnIHwgJzkwMCcgfCBudW1iZXI7XG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICd0cmFjZScgfCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdvZmYnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElUZXJtaW5hbE9wdGlvbnMge1xuICBhbGxvd1Byb3Bvc2VkQXBpPzogYm9vbGVhbjtcbiAgYWxsb3dUcmFuc3BhcmVuY3k/OiBib29sZWFuO1xuICBhbHRDbGlja01vdmVzQ3Vyc29yPzogYm9vbGVhbjtcbiAgY29scz86IG51bWJlcjtcbiAgY29udmVydEVvbD86IGJvb2xlYW47XG4gIGN1cnNvckJsaW5rPzogYm9vbGVhbjtcbiAgY3Vyc29yU3R5bGU/OiBDdXJzb3JTdHlsZTtcbiAgY3Vyc29yV2lkdGg/OiBudW1iZXI7XG4gIGN1cnNvckluYWN0aXZlU3R5bGU/OiBDdXJzb3JJbmFjdGl2ZVN0eWxlO1xuICBjdXN0b21HbHlwaHM/OiBib29sZWFuO1xuICBkaXNhYmxlU3RkaW4/OiBib29sZWFuO1xuICBkb2N1bWVudE92ZXJyaWRlPzogYW55IHwgbnVsbDtcbiAgZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnM/OiBib29sZWFuO1xuICAvKiogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIHN1cHBvcnRlZCAqL1xuICBmYXN0U2Nyb2xsTW9kaWZpZXI/OiAnbm9uZScgfCAnYWx0JyB8ICdjdHJsJyB8ICdzaGlmdCc7XG4gIGZhc3RTY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgZm9udFNpemU/OiBudW1iZXI7XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIGZvbnRXZWlnaHQ/OiBGb250V2VpZ2h0O1xuICBmb250V2VpZ2h0Qm9sZD86IEZvbnRXZWlnaHQ7XG4gIGlnbm9yZUJyYWNrZXRlZFBhc3RlTW9kZT86IGJvb2xlYW47XG4gIGxldHRlclNwYWNpbmc/OiBudW1iZXI7XG4gIGxpbmVIZWlnaHQ/OiBudW1iZXI7XG4gIGxpbmtIYW5kbGVyPzogSUxpbmtIYW5kbGVyIHwgbnVsbDtcbiAgbG9nTGV2ZWw/OiBMb2dMZXZlbDtcbiAgbG9nZ2VyPzogSUxvZ2dlciB8IG51bGw7XG4gIG1hY09wdGlvbklzTWV0YT86IGJvb2xlYW47XG4gIG1hY09wdGlvbkNsaWNrRm9yY2VzU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgbWluaW11bUNvbnRyYXN0UmF0aW8/OiBudW1iZXI7XG4gIHJlZmxvd0N1cnNvckxpbmU/OiBib29sZWFuO1xuICByZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHM/OiBib29sZWFuO1xuICByaWdodENsaWNrU2VsZWN0c1dvcmQ/OiBib29sZWFuO1xuICByb3dzPzogbnVtYmVyO1xuICBzY3JlZW5SZWFkZXJNb2RlPzogYm9vbGVhbjtcbiAgc2Nyb2xsYmFjaz86IG51bWJlcjtcbiAgc2Nyb2xsT25Vc2VySW5wdXQ/OiBib29sZWFuO1xuICBzY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoU2Nyb2xsRHVyYXRpb24/OiBudW1iZXI7XG4gIHRhYlN0b3BXaWR0aD86IG51bWJlcjtcbiAgdGhlbWU/OiBJVGhlbWU7XG4gIHdpbmRvd3NNb2RlPzogYm9vbGVhbjtcbiAgd2luZG93c1B0eT86IElXaW5kb3dzUHR5O1xuICB3aW5kb3dPcHRpb25zPzogSVdpbmRvd09wdGlvbnM7XG4gIHdvcmRTZXBhcmF0b3I/OiBzdHJpbmc7XG4gIG92ZXJ2aWV3UnVsZXI/OiBJT3ZlcnZpZXdSdWxlck9wdGlvbnM7XG4gIHNjcm9sbE9uRXJhc2VJbkRpc3BsYXk/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgY2FuY2VsRXZlbnRzOiBib29sZWFuO1xuICB0ZXJtTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUaGVtZSB7XG4gIGZvcmVncm91bmQ/OiBzdHJpbmc7XG4gIGJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGN1cnNvcj86IHN0cmluZztcbiAgY3Vyc29yQWNjZW50Pzogc3RyaW5nO1xuICBzZWxlY3Rpb25Gb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBzZWxlY3Rpb25CYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIHNjcm9sbGJhclNsaWRlckJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIHNjcm9sbGJhclNsaWRlckhvdmVyQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2Nyb2xsYmFyU2xpZGVyQWN0aXZlQmFja2dyb3VuZD86IHN0cmluZztcbiAgb3ZlcnZpZXdSdWxlckJvcmRlcj86IHN0cmluZztcbiAgYmxhY2s/OiBzdHJpbmc7XG4gIHJlZD86IHN0cmluZztcbiAgZ3JlZW4/OiBzdHJpbmc7XG4gIHllbGxvdz86IHN0cmluZztcbiAgYmx1ZT86IHN0cmluZztcbiAgbWFnZW50YT86IHN0cmluZztcbiAgY3lhbj86IHN0cmluZztcbiAgd2hpdGU/OiBzdHJpbmc7XG4gIGJyaWdodEJsYWNrPzogc3RyaW5nO1xuICBicmlnaHRSZWQ/OiBzdHJpbmc7XG4gIGJyaWdodEdyZWVuPzogc3RyaW5nO1xuICBicmlnaHRZZWxsb3c/OiBzdHJpbmc7XG4gIGJyaWdodEJsdWU/OiBzdHJpbmc7XG4gIGJyaWdodE1hZ2VudGE/OiBzdHJpbmc7XG4gIGJyaWdodEN5YW4/OiBzdHJpbmc7XG4gIGJyaWdodFdoaXRlPzogc3RyaW5nO1xuICBleHRlbmRlZEFuc2k/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IElPc2NMaW5rU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJT3NjTGlua1NlcnZpY2U+KCdPc2NMaW5rU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJT3NjTGlua1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGxpbmsgdG8gdGhlIHNlcnZpY2UsIHJldHVybmluZyB0aGUgbGluayBJRC4gVGhlIGxpbmsgZGF0YSBpcyBtYW5hZ2VkIGJ5IHRoaXNcbiAgICogc2VydmljZSBhbmQgd2lsbCBiZSBmcmVlZCB3aGVuIHRoaXMgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaXMgdHJpbW1lZCBvZmYgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHJlZ2lzdGVyTGluayhsaW5rRGF0YTogSU9zY0xpbmtEYXRhKTogbnVtYmVyO1xuICAvKipcbiAgICogQWRkcyBhIGxpbmUgdG8gYSBsaW5rIGlmIG5lZWRlZC5cbiAgICovXG4gIGFkZExpbmVUb0xpbmsobGlua0lkOiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQ7XG4gIC8qKiBHZXQgdGhlIGxpbmsgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rIElELiAqL1xuICBnZXRMaW5rRGF0YShsaW5rSWQ6IG51bWJlcik6IElPc2NMaW5rRGF0YSB8IHVuZGVmaW5lZDtcbn1cblxuLypcbiAqIFdpZHRoIGFuZCBHcmFwaGVtZV9DbHVzdGVyX0JyZWFrIHByb3BlcnRpZXMgb2YgYSBjaGFyYWN0ZXIgYXMgYSBiaXQgbWFzay5cbiAqXG4gKiBiaXQgMDogc2hvdWxkSm9pbiAtIHNob3VsZCBjb21iaW5lIHdpdGggcHJlY2VkaW5nIGNoYXJhY3Rlci5cbiAqIGJpdCAxLi4yOiB3Y3dpZHRoIC0gc2VlIFVuaWNvZGVDaGFyV2lkdGguXG4gKiBiaXQgMy4uMzE6IGNsYXNzIG9mIGNoYXJhY3RlciAoY3VycmVudGx5IG9ubHkgNCBiaXRzIGFyZSB1c2VkKS5cbiAqICAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZWQgZ3JhcGhlbWUgY2x1c3RlcmluZyAtIGkuZS4gd2hpY2ggY29kZXBvaW50c1xuICogICBhcmUgdG8gYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBjb21wb3VuZCBjaGFyYWN0ZXIuXG4gKlxuICogVXNlIHRoZSBVbmljb2RlU2VydmljZSBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlWYWx1ZSB0byBjcmVhdGUgYVxuICogVW5pY29kZUNoYXJQcm9wZXJ0aWVzOyB1c2UgZXh0cmFjdFNob3VsZEpvaW4sIGV4dHJhY3RXaWR0aCwgYW5kXG4gKiBleHRyYWN0Q2hhcktpbmQgdG8gZXh0cmFjdCB0aGUgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgVW5pY29kZUNoYXJQcm9wZXJ0aWVzID0gbnVtYmVyO1xuXG4vKipcbiAqIFdpZHRoIGluIGNvbHVtbnMgb2YgYSBjaGFyYWN0ZXIuXG4gKiBJbiBhIENKSyBjb250ZXh0LCBcImhhbGYtd2lkdGhcIiBjaGFyYWN0ZXJzIChzdWNoIGFzIExhdGluKSBhcmUgd2lkdGggMSxcbiAqIHdoaWxlIFwiZnVsbC13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgS2FuamkpIGFyZSAyIGNvbHVtbnMgd2lkZS5cbiAqIENvbWJpbmluZyBjaGFyYWN0ZXJzIChzdWNoIGFzIGFjY2VudHMpIGFyZSB3aWR0aCAwLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhcldpZHRoID0gMCB8IDEgfCAyO1xuXG5leHBvcnQgY29uc3QgSVVuaWNvZGVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElVbmljb2RlU2VydmljZT4oJ1VuaWNvZGVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElVbmljb2RlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKiogUmVnaXN0ZXIgYW4gVW5pY29kZSB2ZXJzaW9uIHByb3ZpZGVyLiAqL1xuICByZWdpc3Rlcihwcm92aWRlcjogSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIpOiB2b2lkO1xuICAvKiogUmVnaXN0ZXJlZCBVbmljb2RlIHZlcnNpb25zLiAqL1xuICByZWFkb25seSB2ZXJzaW9uczogc3RyaW5nW107XG4gIC8qKiBDdXJyZW50bHkgYWN0aXZlIHZlcnNpb24uICovXG4gIGFjdGl2ZVZlcnNpb246IHN0cmluZztcbiAgLyoqIEV2ZW50IHRyaWdnZXJlZCwgd2hlbiBhY3RpdmF0ZSB2ZXJzaW9uIGNoYW5nZWQuICovXG4gIHJlYWRvbmx5IG9uQ2hhbmdlOiBFdmVudDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBVbmljb2RlIHZlcnNpb24gZGVwZW5kZW50XG4gICAqL1xuICB3Y3dpZHRoKGNvZGVwb2ludDogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybiBjaGFyYWN0ZXIgd2lkdGggYW5kIHR5cGUgZm9yIGdyYXBoZW1lIGNsdXN0ZXJpbmcuXG4gICAqIElmIHByZWNlZGluZyAhPSAwLCBpdCBpcyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJldmlvdXMgY2hhcmFjdGVyO1xuICAgKiBpbiB0aGF0IGNhc2UgdGhlIHJlc3VsdCBzcGVjaWZpZXMgaWYgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGpvaW5lZC5cbiAgICovXG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgd2N3aWR0aCh1Y3M6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IElEZWNvcmF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJRGVjb3JhdGlvblNlcnZpY2U+KCdEZWNvcmF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJRGVjb3JhdGlvblNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICByZWFkb25seSBkZWNvcmF0aW9uczogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVnaXN0ZXJlZDogRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlbW92ZWQ6IEV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWdpc3RlckRlY29yYXRpb24oZGVjb3JhdGlvbk9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucyk6IElEZWNvcmF0aW9uIHwgdW5kZWZpbmVkO1xuICByZXNldCgpOiB2b2lkO1xuICAvKipcbiAgICogVHJpZ2dlciBhIGNhbGxiYWNrIG92ZXIgdGhlIGRlY29yYXRpb24gYXQgYSBjZWxsIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS4gVGhpcyB1c2VzIGEgY2FsbGJhY2tcbiAgICogaW5zdGVhZCBvZiBhbiBpdGVyYXRvciBhcyBpdCdzIHR5cGljYWxseSB1c2VkIGluIGhvdCBjb2RlIHBhdGhzLlxuICAgKi9cbiAgZm9yRWFjaERlY29yYXRpb25BdENlbGwoeDogbnVtYmVyLCBsaW5lOiBudW1iZXIsIGxheWVyOiAnYm90dG9tJyB8ICd0b3AnIHwgdW5kZWZpbmVkLCBjYWxsYmFjazogKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pID0+IHZvaWQpOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJSW50ZXJuYWxEZWNvcmF0aW9uIGV4dGVuZHMgSURlY29yYXRpb24ge1xuICByZWFkb25seSBvcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBmb3JlZ3JvdW5kQ29sb3JSR0I6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb25SZW5kZXJFbWl0dGVyOiBFbWl0dGVyPEhUTUxFbGVtZW50Pjtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJTG9nU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlLCBMb2dMZXZlbEVudW0gfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG50eXBlIExvZ1R5cGUgPSAobWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgSUNvbnNvbGUge1xuICBsb2c6IExvZ1R5cGU7XG4gIGVycm9yOiBMb2dUeXBlO1xuICBpbmZvOiBMb2dUeXBlO1xuICB0cmFjZTogTG9nVHlwZTtcbiAgd2FybjogTG9nVHlwZTtcbn1cblxuLy8gY29uc29sZSBpcyBhdmFpbGFibGUgb24gYm90aCBub2RlLmpzIGFuZCBicm93c2VyIGNvbnRleHRzIGJ1dCB0aGUgY29tbW9uXG4vLyBtb2R1bGUgZG9lc24ndCBkZXBlbmQgb24gdGhlbSBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgZGVjbGFyZSBpdC5cbmRlY2xhcmUgY29uc3QgY29uc29sZTogSUNvbnNvbGU7XG5cbmNvbnN0IG9wdGlvbnNLZXlUb0xvZ0xldmVsOiB7IFtrZXk6IHN0cmluZ106IExvZ0xldmVsRW51bSB9ID0ge1xuICB0cmFjZTogTG9nTGV2ZWxFbnVtLlRSQUNFLFxuICBkZWJ1ZzogTG9nTGV2ZWxFbnVtLkRFQlVHLFxuICBpbmZvOiBMb2dMZXZlbEVudW0uSU5GTyxcbiAgd2FybjogTG9nTGV2ZWxFbnVtLldBUk4sXG4gIGVycm9yOiBMb2dMZXZlbEVudW0uRVJST1IsXG4gIG9mZjogTG9nTGV2ZWxFbnVtLk9GRlxufTtcblxuY29uc3QgTE9HX1BSRUZJWCA9ICd4dGVybS5qczogJztcblxuZXhwb3J0IGNsYXNzIExvZ1NlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUxvZ1NlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHJpdmF0ZSBfbG9nTGV2ZWw6IExvZ0xldmVsRW51bSA9IExvZ0xldmVsRW51bS5PRkY7XG4gIHB1YmxpYyBnZXQgbG9nTGV2ZWwoKTogTG9nTGV2ZWxFbnVtIHsgcmV0dXJuIHRoaXMuX2xvZ0xldmVsOyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdXBkYXRlTG9nTGV2ZWwoKTtcbiAgICB0aGlzLl9yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdsb2dMZXZlbCcsICgpID0+IHRoaXMuX3VwZGF0ZUxvZ0xldmVsKCkpKTtcblxuICAgIC8vIEZvciB0cmFjZSBsb2dnaW5nLCBhc3N1bWUgdGhlIGxhdGVzdCBjcmVhdGVkIGxvZyBzZXJ2aWNlIGlzIHZhbGlkXG4gICAgdHJhY2VMb2dnZXIgPSB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlTG9nTGV2ZWwoKTogdm9pZCB7XG4gICAgdGhpcy5fbG9nTGV2ZWwgPSBvcHRpb25zS2V5VG9Mb2dMZXZlbFt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxvZ0xldmVsXTtcbiAgfVxuXG4gIHByaXZhdGUgX2V2YWxMYXp5T3B0aW9uYWxQYXJhbXMob3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25hbFBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25hbFBhcmFtc1tpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRpb25hbFBhcmFtc1tpXSA9IG9wdGlvbmFsUGFyYW1zW2ldKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbG9nKHR5cGU6IExvZ1R5cGUsIG1lc3NhZ2U6IHN0cmluZywgb3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy5fZXZhbExhenlPcHRpb25hbFBhcmFtcyhvcHRpb25hbFBhcmFtcyk7XG4gICAgdHlwZS5jYWxsKGNvbnNvbGUsICh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlciA/ICcnIDogTE9HX1BSRUZJWCkgKyBtZXNzYWdlLCAuLi5vcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2UobWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLlRSQUNFKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LnRyYWNlLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUubG9nLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5ERUJVRykge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy5kZWJ1Zy5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmxvZywgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5JTkZPKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LmluZm8uYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5pbmZvLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLldBUk4pIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8ud2Fybi5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLndhcm4sIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZXJyb3IobWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLkVSUk9SKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LmVycm9yLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUuZXJyb3IsIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cbn1cblxubGV0IHRyYWNlTG9nZ2VyOiBJTG9nU2VydmljZTtcbmV4cG9ydCBmdW5jdGlvbiBzZXRUcmFjZUxvZ2dlcihsb2dnZXI6IElMb2dTZXJ2aWNlKTogdm9pZCB7XG4gIHRyYWNlTG9nZ2VyID0gbG9nZ2VyO1xufVxuXG4vKipcbiAqIEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBsb2cgdHJhY2UgY2FsbHMgdG8gdGhlIGRlY29yYXRlZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYWNlQ2FsbChfdGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBhbnkpOiBhbnkge1xuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuICBjb25zdCBmbktleSA9ICd2YWx1ZSc7XG4gIGNvbnN0IGZuID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgZGVzY3JpcHRvcltmbktleV0gPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAvLyBFYXJseSBleGl0XG4gICAgaWYgKHRyYWNlTG9nZ2VyLmxvZ0xldmVsICE9PSBMb2dMZXZlbEVudW0uVFJBQ0UpIHtcbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG5cbiAgICB0cmFjZUxvZ2dlci50cmFjZShgR2x5cGhSZW5kZXJlciMke2ZuLm5hbWV9KCR7YXJncy5tYXAoZSA9PiBKU09OLnN0cmluZ2lmeShlKSkuam9pbignLCAnKX0pYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgdHJhY2VMb2dnZXIudHJhY2UoYEdseXBoUmVuZGVyZXIjJHtmbi5uYW1lfSByZXR1cm5gLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB0eXBlIHsgSVRlcm1pbmFsQWRkb24sIFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB0eXBlIHsgV2ViZ2xBZGRvbiBhcyBJV2ViZ2xBcGkgfSBmcm9tICdAeHRlcm0vYWRkb24td2ViZ2wnO1xuaW1wb3J0IHsgSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsIElDaGFyU2l6ZVNlcnZpY2UsIElDb3JlQnJvd3NlclNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJVGVybWluYWwgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2xpZmVjeWNsZSc7XG5pbXBvcnQgeyBnZXRTYWZhcmlWZXJzaW9uLCBpc1NhZmFyaSB9IGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBJQ29yZVNlcnZpY2UsIElEZWNvcmF0aW9uU2VydmljZSwgSUxvZ1NlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgV2ViZ2xSZW5kZXJlciB9IGZyb20gJy4vV2ViZ2xSZW5kZXJlcic7XG5pbXBvcnQgeyBzZXRUcmFjZUxvZ2dlciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Mb2dTZXJ2aWNlJztcbmltcG9ydCB7IEVtaXR0ZXIsIEV2ZW50IH0gZnJvbSAndnMvYmFzZS9jb21tb24vZXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgV2ViZ2xBZGRvbiBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGVybWluYWxBZGRvbiAsIElXZWJnbEFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsPzogVGVybWluYWw7XG4gIHByaXZhdGUgX3JlbmRlcmVyPzogV2ViZ2xSZW5kZXJlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZVRleHR1cmVBdGxhcyA9IHRoaXMuX3JlZ2lzdGVyKG5ldyBFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlVGV4dHVyZUF0bGFzID0gdGhpcy5fb25DaGFuZ2VUZXh0dXJlQXRsYXMuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzID0gdGhpcy5fcmVnaXN0ZXIobmV3IEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9yZWdpc3RlcihuZXcgRW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNvbnRleHRMb3NzID0gdGhpcy5fcmVnaXN0ZXIobmV3IEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNvbnRleHRMb3NzID0gdGhpcy5fb25Db250ZXh0TG9zcy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXI/OiBib29sZWFuXG4gICkge1xuICAgIGlmIChpc1NhZmFyaSAmJiBnZXRTYWZhcmlWZXJzaW9uKCkgPCAxNikge1xuICAgICAgLy8gUGVyZm9ybSBhbiBleHRyYSBjaGVjayB0byBkZXRlcm1pbmUgaWYgV2ViZ2wyIGlzIG1hbnVhbGx5IGVuYWJsZWQgaW4gZGV2ZWxvcGVyIHNldHRpbmdzXG4gICAgICBjb25zdCBjb250ZXh0QXR0cmlidXRlcyA9IHtcbiAgICAgICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICAgICAgZGVwdGg6IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWVcbiAgICAgIH07XG4gICAgICBjb25zdCBnbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJ3dlYmdsMicsIGNvbnRleHRBdHRyaWJ1dGVzKSBhcyBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgICAgIGlmICghZ2wpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJnbDIgaXMgb25seSBzdXBwb3J0ZWQgb24gU2FmYXJpIDE2IGFuZCBhYm92ZScpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge1xuICAgIGNvbnN0IGNvcmUgPSAodGVybWluYWwgYXMgYW55KS5fY29yZSBhcyBJVGVybWluYWw7XG4gICAgaWYgKCF0ZXJtaW5hbC5lbGVtZW50KSB7XG4gICAgICB0aGlzLl9yZWdpc3Rlcihjb3JlLm9uV2lsbE9wZW4oKCkgPT4gdGhpcy5hY3RpdmF0ZSh0ZXJtaW5hbCkpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl90ZXJtaW5hbCA9IHRlcm1pbmFsO1xuICAgIGNvbnN0IGNvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UgPSBjb3JlLmNvcmVTZXJ2aWNlO1xuICAgIGNvbnN0IG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UgPSBjb3JlLm9wdGlvbnNTZXJ2aWNlO1xuXG4gICAgY29uc3QgdW5zYWZlQ29yZSA9IGNvcmUgYXMgYW55O1xuICAgIGNvbnN0IHJlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlID0gdW5zYWZlQ29yZS5fcmVuZGVyU2VydmljZTtcbiAgICBjb25zdCBjaGFyYWN0ZXJKb2luZXJTZXJ2aWNlOiBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSA9IHVuc2FmZUNvcmUuX2NoYXJhY3RlckpvaW5lclNlcnZpY2U7XG4gICAgY29uc3QgY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlID0gdW5zYWZlQ29yZS5fY2hhclNpemVTZXJ2aWNlO1xuICAgIGNvbnN0IGNvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSA9IHVuc2FmZUNvcmUuX2NvcmVCcm93c2VyU2VydmljZTtcbiAgICBjb25zdCBkZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlID0gdW5zYWZlQ29yZS5fZGVjb3JhdGlvblNlcnZpY2U7XG4gICAgY29uc3QgbG9nU2VydmljZTogSUxvZ1NlcnZpY2UgPSB1bnNhZmVDb3JlLl9sb2dTZXJ2aWNlO1xuICAgIGNvbnN0IHRoZW1lU2VydmljZTogSVRoZW1lU2VydmljZSA9IHVuc2FmZUNvcmUuX3RoZW1lU2VydmljZTtcblxuICAgIC8vIFNldCB0cmFjZSBsb2dnZXIganVzdCBpbiBjYXNlIGl0IGhhc24ndCBiZWVuIHlldCB3aGljaCBjb3VsZCBoYXBwZW4gd2hlbiB0aGUgYWRkb24gaXNcbiAgICAvLyBidW5kbGVkIHNlcGFyYXRlbHkgdG8gdGhlIGNvcmUgbW9kdWxlXG4gICAgc2V0VHJhY2VMb2dnZXIobG9nU2VydmljZSk7XG5cbiAgICB0aGlzLl9yZW5kZXJlciA9IHRoaXMuX3JlZ2lzdGVyKG5ldyBXZWJnbFJlbmRlcmVyKFxuICAgICAgdGVybWluYWwsXG4gICAgICBjaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLFxuICAgICAgY2hhclNpemVTZXJ2aWNlLFxuICAgICAgY29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgICAgY29yZVNlcnZpY2UsXG4gICAgICBkZWNvcmF0aW9uU2VydmljZSxcbiAgICAgIG9wdGlvbnNTZXJ2aWNlLFxuICAgICAgdGhlbWVTZXJ2aWNlLFxuICAgICAgdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyXG4gICAgKSk7XG4gICAgdGhpcy5fcmVnaXN0ZXIoRXZlbnQuZm9yd2FyZCh0aGlzLl9yZW5kZXJlci5vbkNvbnRleHRMb3NzLCB0aGlzLl9vbkNvbnRleHRMb3NzKSk7XG4gICAgdGhpcy5fcmVnaXN0ZXIoRXZlbnQuZm9yd2FyZCh0aGlzLl9yZW5kZXJlci5vbkNoYW5nZVRleHR1cmVBdGxhcywgdGhpcy5fb25DaGFuZ2VUZXh0dXJlQXRsYXMpKTtcbiAgICB0aGlzLl9yZWdpc3RlcihFdmVudC5mb3J3YXJkKHRoaXMuX3JlbmRlcmVyLm9uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLCB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcykpO1xuICAgIHRoaXMuX3JlZ2lzdGVyKEV2ZW50LmZvcndhcmQodGhpcy5fcmVuZGVyZXIub25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMsIHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzKSk7XG4gICAgcmVuZGVyU2VydmljZS5zZXRSZW5kZXJlcih0aGlzLl9yZW5kZXJlcik7XG5cbiAgICB0aGlzLl9yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgaWYgKCh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl9zdG9yZS5faXNEaXNwb3NlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSA9ICh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl9yZW5kZXJTZXJ2aWNlO1xuICAgICAgcmVuZGVyU2VydmljZS5zZXRSZW5kZXJlcigodGhpcy5fdGVybWluYWwgYXMgYW55KS5fY29yZS5fY3JlYXRlUmVuZGVyZXIoKSk7XG4gICAgICByZW5kZXJTZXJ2aWNlLmhhbmRsZVJlc2l6ZSh0ZXJtaW5hbC5jb2xzLCB0ZXJtaW5hbC5yb3dzKTtcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRleHR1cmVBdGxhcygpOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVyPy50ZXh0dXJlQXRsYXM7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJUZXh0dXJlQXRsYXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXI/LmNsZWFyVGV4dHVyZUF0bGFzKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozt1T0FjTyxJQUFNQSxHQUFO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RUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBR2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBR2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ2hDLFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUFHLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLENBQUMsRUFDNUQsU0FBSyxDQUFDLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQUcsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUM1RCxTQUFLLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsRUFBRyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQzVELFNBQUssQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUFHLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLENBQUMsRUFDNUQsU0FBSyxDQUFDLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLENBQUMsRUFDaEMsU0FBSyxDQUFDLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQUcsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUM1RCxTQUFLLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsRUFBRyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBRzVELFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBR3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBQ3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBR3hDLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUFHLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLENBQUMsRUFFcEUsWUFBYSxDQUFDLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQUcsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUVwRSxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsRUFBRyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUFDLEVBRXBFLFlBQWEsQ0FBQyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUFHLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLENBQUMsRUFFcEUsWUFBYSxDQUFDLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQUcsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUVwRSxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsRUFBRyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUFHLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQUcsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUc1SCxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUV4QyxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUV4QyxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUV4QyxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUV4QyxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUd4QyxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUV4QyxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUV4QyxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUV4QyxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUV4QyxZQUFhLENBQUMsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxFQUd4QyxZQUFhLENBQ1gsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsRUFBRyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUNyRCxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUFHLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQ3JELENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQUcsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsRUFDckQsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsRUFBRyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxDQUN2RCxFQUVBLFlBQWEsQ0FDWCxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUFHLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQ3JELENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQUcsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsRUFDckQsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsRUFBRyxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUNyRCxDQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FBRSxFQUFHLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLENBQ3ZELEVBRUEsWUFBYSxDQUFDLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxDQUFFLEVBQUcsQ0FBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsQ0FBQyxDQUN0RSxFQVFNQyxHQUFnRixDQUVwRixTQUFLLENBQ0gsQ0FBQyxFQUFHLEVBQUcsRUFBRyxDQUFDLEVBQ1gsQ0FBQyxFQUFHLEVBQUcsRUFBRyxDQUFDLEVBQ1gsQ0FBQyxFQUFHLEVBQUcsRUFBRyxDQUFDLEVBQ1gsQ0FBQyxFQUFHLEVBQUcsRUFBRyxDQUFDLENBQ2IsRUFDQSxTQUFLLENBQ0gsQ0FBQyxFQUFHLENBQUMsRUFDTCxDQUFDLEVBQUcsQ0FBQyxFQUNMLENBQUMsRUFBRyxDQUFDLEVBQ0wsQ0FBQyxFQUFHLENBQUMsQ0FDUCxFQUNBLFNBQUssQ0FDSCxDQUFDLEVBQUcsQ0FBQyxFQUNMLENBQUMsRUFBRyxDQUFDLEVBQ0wsQ0FBQyxFQUFHLENBQUMsRUFDTCxDQUFDLEVBQUcsQ0FBQyxDQUNQLENBQ0YsRUE4Q08sSUFBTUMsR0FBd0gsQ0FFbkksU0FBSyxDQUFHLEVBQWUsYUFBcUIsRUFDNUMsU0FBSyxDQUFHLEVBQWUsYUFBcUIsRUFDNUMsU0FBSyxDQUFHLEVBQWUsYUFBcUIsRUFDNUMsU0FBSyxDQUFHLEVBQWUsYUFBcUIsRUFDNUMsU0FBSyxDQUFHLEVBQWUscUJBQXVCLEVBQzlDLFNBQUssQ0FBRyxFQUFlLHFCQUF1QixFQUM5QyxTQUFLLENBQUcsRUFBZSxvQkFBc0IsRUFDN0MsU0FBSyxDQUFHLEVBQWUsb0JBQXNCLEVBQzdDLFNBQUssQ0FBRyxFQUFlLG9CQUFvQixFQUMzQyxTQUFLLENBQUcsRUFBZSxvQkFBb0IsRUFDM0MsU0FBSyxDQUFHLEVBQWUsb0JBQW1CLEVBQzFDLFNBQUssQ0FBRyxFQUFlLG9CQUFtQixFQUMxQyxTQUFLLENBQUcsRUFBZSwwQkFBZSxFQUN0QyxTQUFLLENBQUcsRUFBZSwwQkFBZSxFQUN0QyxTQUFLLENBQUcsRUFBZSwwQkFBYyxFQUNyQyxTQUFLLENBQUcsRUFBZSwwQkFBYyxFQUNyQyxTQUFLLENBQUcsRUFBZSwwQkFBZ0IsRUFDdkMsU0FBSyxDQUFHLEVBQWUsMEJBQWdCLEVBQ3ZDLFNBQUssQ0FBRyxFQUFlLDBCQUFhLEVBQ3BDLFNBQUssQ0FBRyxFQUFlLDBCQUFhLEVBQ3BDLFNBQUssQ0FBRyxFQUFlLHlCQUFhLEVBQ3BDLFNBQUssQ0FBRyxFQUFlLHlCQUFhLEVBQ3BDLFNBQUssQ0FBRyxFQUFlLGNBQXNCLEVBQzdDLFNBQUssQ0FBRyxFQUFlLGNBQXNCLEVBQzdDLFNBQUssQ0FBRyxFQUFlLGNBQXFCLEVBQzVDLFNBQUssQ0FBRyxFQUFlLGNBQXFCLEVBQzVDLFNBQUssQ0FBRyxFQUFlLGNBQXVCLEVBQzlDLFNBQUssQ0FBRyxFQUFlLGNBQXVCLEVBQzlDLFNBQUssQ0FBRyxFQUFlLGNBQXdCLEVBQy9DLFNBQUssQ0FBRyxFQUFlLGNBQXdCLEVBRy9DLFNBQUssQ0FBRyxFQUFlLENBQUNDLEVBQUlDLElBQU8sTUFBTSxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLEVBQUcsRUFDN0YsU0FBSyxDQUFHLEVBQWUsQ0FBQ0QsRUFBSUMsSUFBTyxJQUFJLEdBQUtELENBQUUsT0FBTyxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsSUFBSyxFQUM3RixTQUFLLENBQUcsRUFBZSxDQUFDQSxFQUFJQyxJQUFPLGFBQWEsR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsUUFBUSxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxFQUFHLEVBQ3JHLFNBQUssQ0FBRyxFQUFlLENBQUNELEVBQUlDLElBQU8sSUFBSSxHQUFLRCxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxjQUFjLEdBQUtBLENBQUUsUUFBUSxHQUFLQSxDQUFFLElBQUssRUFDckcsU0FBSyxDQUFHLEVBQWUsQ0FBQ0EsRUFBSUMsSUFBTyxNQUFNLEdBQUtBLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUksR0FBS0MsQ0FBRSxLQUFLLEdBQUtELENBQUUsU0FBUyxHQUFLQyxDQUFFLEtBQUssR0FBS0QsQ0FBRSxJQUFJLEdBQUtDLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUssRUFDM0ksU0FBSyxDQUFHLEVBQWUsQ0FBQ0EsRUFBSUMsSUFBTyxNQUFNLEdBQUtBLENBQUUsUUFBUSxHQUFLQSxDQUFFLGFBQWEsR0FBS0EsQ0FBRSxRQUFRLEdBQUtBLENBQUUsRUFBRyxFQUNyRyxTQUFLLENBQUcsRUFBZSxDQUFDRCxFQUFJQyxJQUFPLElBQUksR0FBS0QsQ0FBRSxPQUFPLEdBQUtBLENBQUUsY0FBYyxHQUFLQSxDQUFFLFFBQVEsR0FBS0EsQ0FBRSxJQUFLLEVBQ3JHLFNBQUssQ0FBRyxFQUFlLENBQUNBLEVBQUlDLElBQU8sTUFBTSxHQUFLQSxDQUFFLEtBQUssR0FBS0QsQ0FBRSxJQUFJLEdBQUtDLENBQUUsS0FBSyxHQUFLRCxDQUFFLFNBQVMsR0FBS0MsQ0FBRSxLQUFLLEdBQUtELENBQUUsSUFBSSxHQUFLQyxDQUFFLEtBQUssR0FBS0QsQ0FBRSxJQUFLLEVBQzNJLFNBQUssQ0FBRyxFQUFlLENBQUNBLEVBQUlDLElBQU8sYUFBYSxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxRQUFRLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLEVBQUcsRUFDckcsU0FBSyxDQUFHLEVBQWUsQ0FBQ0QsRUFBSUMsSUFBTyxVQUFVLEdBQUtELENBQUUsUUFBUSxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxRQUFRLEdBQUtBLENBQUUsSUFBSyxFQUNyRyxTQUFLLENBQUcsRUFBZSxDQUFDQSxFQUFJQyxJQUFPLE1BQU0sR0FBS0EsQ0FBRSxLQUFLLEdBQUtELENBQUUsSUFBSSxHQUFLQyxDQUFFLEtBQUssR0FBS0QsQ0FBRSxTQUFTLEdBQUtDLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUksR0FBS0MsQ0FBRSxLQUFLLEdBQUtELENBQUUsSUFBSyxFQUMzSSxTQUFLLENBQUcsRUFBZSxDQUFDQSxFQUFJQyxJQUFPLE1BQU0sR0FBS0EsQ0FBRSxRQUFRLEdBQUtBLENBQUUsYUFBYSxHQUFLQSxDQUFFLFFBQVEsR0FBS0EsQ0FBRSxFQUFHLEVBQ3JHLFNBQUssQ0FBRyxFQUFlLENBQUNELEVBQUlDLElBQU8sVUFBVSxHQUFLRCxDQUFFLFFBQVEsR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsUUFBUSxHQUFLQSxDQUFFLElBQUssRUFDckcsU0FBSyxDQUFHLEVBQWUsQ0FBQ0EsRUFBSUMsSUFBTyxNQUFNLEdBQUtBLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUksR0FBS0MsQ0FBRSxLQUFLLEdBQUtELENBQUUsU0FBUyxHQUFLQyxDQUFFLEtBQUssR0FBS0QsQ0FBRSxJQUFJLEdBQUtDLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUssRUFDM0ksU0FBSyxDQUFHLEVBQWUsQ0FBQ0EsRUFBSUMsSUFBTyxtQkFBK0IsR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsUUFBUSxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxFQUFHLEVBQ3ZILFNBQUssQ0FBRyxFQUFlLENBQUNELEVBQUlDLElBQU8sSUFBSSxHQUFLRCxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxXQUFZLEVBQ2xILFNBQUssQ0FBRyxFQUFlLENBQUNBLEVBQUlDLElBQU8sSUFBSSxHQUFLRCxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxTQUFTLEdBQUtDLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUksR0FBS0MsQ0FBRSxLQUFLLEdBQUtELENBQUUsU0FBUyxHQUFLQyxDQUFFLEtBQUssR0FBS0QsQ0FBRSxJQUFJLEdBQUtDLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUssRUFDdkssU0FBSyxDQUFHLEVBQWUsQ0FBQ0EsRUFBSUMsSUFBTyxrQkFBOEIsR0FBS0EsQ0FBRSxRQUFRLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLFFBQVEsR0FBS0EsQ0FBRSxFQUFHLEVBQ3ZILFNBQUssQ0FBRyxFQUFlLENBQUNELEVBQUlDLElBQU8sVUFBVSxHQUFLRCxDQUFFLFFBQVEsR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxJQUFLLEVBQ2xILFNBQUssQ0FBRyxFQUFlLENBQUNBLEVBQUlDLElBQU8sSUFBSSxHQUFLRCxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxTQUFTLEdBQUtDLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUksR0FBS0MsQ0FBRSxLQUFLLEdBQUtELENBQUUsU0FBUyxHQUFLQyxDQUFFLEtBQUssR0FBS0QsQ0FBRSxJQUFJLEdBQUtDLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUssRUFDdkssU0FBSyxDQUFHLEVBQWUsQ0FBQ0EsRUFBSUMsSUFBTyxNQUFNLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsUUFBUSxHQUFLQSxDQUFFLFFBQVMsRUFDbEgsU0FBSyxDQUFHLEVBQWUsQ0FBQ0QsRUFBSUMsSUFBTyxnQkFBNEIsR0FBS0QsQ0FBRSxRQUFRLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLFFBQVEsR0FBS0EsQ0FBRSxJQUFLLEVBQ3ZILFNBQUssQ0FBRyxFQUFlLENBQUNBLEVBQUlDLElBQU8sTUFBTSxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUksR0FBS0MsQ0FBRSxLQUFLLEdBQUtELENBQUUsU0FBUyxHQUFLQyxDQUFFLEtBQUssR0FBS0QsQ0FBRSxJQUFJLEdBQUtDLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUssRUFDdkssU0FBSyxDQUFHLEVBQWUsQ0FBQ0EsRUFBSUMsSUFBTyxhQUFhLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLEVBQUcsRUFDbEgsU0FBSyxDQUFHLEVBQWUsQ0FBQ0QsRUFBSUMsSUFBTyxnQkFBNEIsR0FBS0QsQ0FBRSxRQUFRLEdBQUtBLENBQUUsT0FBTyxHQUFLQSxDQUFFLFFBQVEsR0FBS0EsQ0FBRSxJQUFLLEVBQ3ZILFNBQUssQ0FBRyxFQUFlLENBQUNBLEVBQUlDLElBQU8sTUFBTSxHQUFLQSxDQUFFLE9BQU8sR0FBS0EsQ0FBRSxPQUFPLEdBQUtBLENBQUUsS0FBSyxHQUFLRCxDQUFFLElBQUksR0FBS0MsQ0FBRSxLQUFLLEdBQUtELENBQUUsU0FBUyxHQUFLQyxDQUFFLEtBQUssR0FBS0QsQ0FB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WUFDdkMsT0FFRixJQUFNVixFQUFpQyxLQUFLLFVBQWtCLE1BQU0sZUFDcEVBLEVBQWMsWUFBYSxLQUFLLFVBQWtCLE1BQU0sZ0JBQWdCLENBQUMsRUFDekVBLEVBQWMsYUFBYUwsRUFBUyxLQUFNQSxFQUFTLElBQUksQ0FDekQsQ0FBQyxDQUFDLENBQ0osQ0FFQSxJQUFXLGNBQThDLENBQ3ZELE9BQU8sS0FBSyxXQUFXLFlBQ3pCLENBRU8sbUJBQTBCLENBQy9CLEtBQUssV0FBVyxrQkFBa0IsQ0FDcEMsQ0FDRiIsIm5hbWVzIjpbIkVycm9ySGFuZGxlciIsIkVycm9yTm9UZWxlbWV0cnkiLCJsaXN0ZW5lciIsIm5ld1VuZXhwZWN0ZWRFcnJvckhhbmRsZXIiLCJlcnJvckhhbmRsZXIiLCJvblVuZXhwZWN0ZWRFcnJvciIsImUiLCJpc0NhbmNlbGxhdGlvbkVycm9yIiwiZXJyb3JIYW5kbGVyIiwiY2FuY2VsZWROYW1lIiwiaXNDYW5jZWxsYXRpb25FcnJvciIsImVycm9yIiwiQ2FuY2VsbGF0aW9uRXJyb3IiLCJFcnJvck5vVGVsZW1ldHJ5IiwiX0Vycm9yTm9UZWxlbWV0cnkiLCJtc2ciLCJlcnIiLCJyZXN1bHQiLCJmaW5kTGFzdElkeE1vbm90b25vdXMiLCJhcnJheSIsInByZWRpY2F0ZSIsInN0YXJ0SWR4IiwiZW5kSWR4RXgiLCJpIiwiaiIsImsiLCJfTW9ub3Rvbm91c0FycmF5IiwiX2FycmF5IiwicHJlZGljYXRlIiwiaXRlbSIsImlkeCIsImZpbmRMYXN0SWR4TW9ub3Rvbm91cyIsIk1vbm90b25vdXNBcnJheSIsIkNvbXBhcmVSZXN1bHQiLCJpc0xlc3NUaGFuIiwicmVzdWx0IiwiaXNMZXNzVGhhbk9yRXF1YWwiLCJpc0dyZWF0ZXJUaGFuIiwiaXNOZWl0aGVyTGVzc09yR3JlYXRlclRoYW4iLCJjb21wYXJlQnkiLCJzZWxlY3RvciIsImNvbXBhcmF0b3IiLCJhIiwiYiIsIm51bWJlckNvbXBhcmF0b3IiLCJhIiwiYiIsIl9DYWxsYmFja0l0ZXJhYmxlIiwiaXRlcmF0ZSIsImhhbmRsZXIiLCJpdGVtIiwicmVzdWx0IiwicHJlZGljYXRlIiwiY2IiLCJtYXBGbiIsImNvbXBhcmF0b3IiLCJmaXJzdCIsIkNvbXBhcmVSZXN1bHQiLCJfY2FsbGJhY2siLCJDYWxsYmFja0l0ZXJhYmxlIiwiZ3JvdXBCeSIsImRhdGEiLCJncm91cEZuIiwicmVzdWx0IiwiZWxlbWVudCIsImtleSIsInRhcmdldCIsIl9hIiwiX2IiLCJTZXRXaXRoS2V5IiwidmFsdWVzIiwidG9LZXkiLCJ2YWx1ZSIsImtleSIsImVudHJ5IiwiY2FsbGJhY2tmbiIsInRoaXNBcmciLCJTZXRNYXAiLCJrZXkiLCJ2YWx1ZSIsInZhbHVlcyIsImZuIiwiY3JlYXRlU2luZ2xlQ2FsbEZ1bmN0aW9uIiwiZm4iLCJmbkRpZFJ1bkNhbGxiYWNrIiwiX3RoaXMiLCJkaWRDYWxsIiwicmVzdWx0IiwiSXRlcmFibGUiLCJpcyIsInRoaW5nIiwiX2VtcHR5IiwiZW1wdHkiLCJzaW5nbGUiLCJlbGVtZW50Iiwid3JhcCIsIml0ZXJhYmxlT3JFbGVtZW50IiwiZnJvbSIsIml0ZXJhYmxlIiwicmV2ZXJzZSIsImFycmF5IiwiaSIsImlzRW1wdHkiLCJmaXJzdCIsInNvbWUiLCJwcmVkaWNhdGUiLCJmaW5kIiwiZmlsdGVyIiwibWFwIiwiZm4iLCJpbmRleCIsImZsYXRNYXAiLCJjb25jYXQiLCJpdGVyYWJsZXMiLCJyZWR1Y2UiLCJyZWR1Y2VyIiwiaW5pdGlhbFZhbHVlIiwidmFsdWUiLCJzbGljZSIsImFyciIsInRvIiwiY29uc3VtZSIsImF0TW9zdCIsImNvbnN1bWVkIiwiaXRlcmF0b3IiLCJuZXh0IiwiYXN5bmNUb0FycmF5IiwicmVzdWx0IiwiaXRlbSIsIlRSQUNLX0RJU1BPU0FCTEVTIiwiZGlzcG9zYWJsZVRyYWNrZXIiLCJfRGlzcG9zYWJsZVRyYWNrZXIiLCJkIiwidmFsIiwiZGF0YSIsImNoaWxkIiwicGFyZW50IiwieCIsImRpc3Bvc2FibGUiLCJjYWNoZSIsImNhY2hlVmFsdWUiLCJyZXN1bHQiLCJyb290UGFyZW50Q2FjaGUiLCJ2IiwiayIsIm1heFJlcG9ydGVkIiwicHJlQ29tcHV0ZWRMZWFrcyIsInVuY292ZXJlZExlYWtpbmdPYmpzIiwibGVha2luZ09iamVjdHMiLCJpbmZvIiwibGVha2luZ09ianNTZXQiLCJvIiwibCIsImdldFN0YWNrVHJhY2VQYXRoIiwibGVha2luZyIsInJlbW92ZVByZWZpeCIsImFycmF5IiwibGluZXNUb1JlbW92ZSIsInJlZ2V4cCIsImxpbmVzIiwicCIsInN0YWNrVHJhY2VTdGFydHMiLCJTZXRNYXAiLCJzdGFja1RyYWNlUGF0aCIsImkiLCJjb21wYXJlQnkiLCJudW1iZXJDb21wYXJhdG9yIiwibWVzc2FnZSIsInN0YWNrVHJhY2VGb3JtYXR0ZWRMaW5lcyIsImxpbmUiLCJwcmV2U3RhcnRzIiwiY29udGludWF0aW9ucyIsImdyb3VwQnkiLCJjb250Iiwic2V0IiwiRGlzcG9zYWJsZVRyYWNrZXIiLCJzZXREaXNwb3NhYmxlVHJhY2tlciIsInRyYWNrZXIiLCJfX2lzX2Rpc3Bvc2FibGVfdHJhY2tlZF9fIiwic3RhY2siLCJEaXNwb3NhYmxlIiwidHJhY2tEaXNwb3NhYmxlIiwibWFya0FzRGlzcG9zZWQiLCJzZXRQYXJlbnRPZkRpc3Bvc2FibGUiLCJzZXRQYXJlbnRPZkRpc3Bvc2FibGVzIiwiY2hpbGRyZW4iLCJkaXNwb3NlIiwiYXJnIiwiSXRlcmFibGUiLCJlcnJvcnMiLCJkIiwiZSIsImNvbWJpbmVkRGlzcG9zYWJsZSIsImRpc3Bvc2FibGVzIiwicGFyZW50IiwidG9EaXNwb3NhYmxlIiwiZGlzcG9zZSIsInNldFBhcmVudE9mRGlzcG9zYWJsZXMiLCJmbiIsInNlbGYiLCJ0cmFja0Rpc3Bvc2FibGUiLCJjcmVhdGVTaW5nbGVDYWxsRnVuY3Rpb24iLCJtYXJrQXNEaXNwb3NlZCIsIl9EaXNwb3NhYmxlU3RvcmUiLCJvIiwic2V0UGFyZW50T2ZEaXNwb3NhYmxlIiwiRGlzcG9zYWJsZVN0b3JlIiwiRGlzcG9zYWJsZSIsIk11dGFibGVEaXNwb3NhYmxlIiwidmFsdWUiLCJvbGRWYWx1ZSIsImlzTm9kZSIsInVzZXJBZ2VudCIsInBsYXRmb3JtIiwiaXNGaXJlZm94IiwiaXNMZWdhY3lFZGdlIiwiaXNTYWZhcmkiLCJnZXRTYWZhcmlWZXJzaW9uIiwibWFqb3JWZXJzaW9uIiwiaXNNYWMiLCJpc1dpbmRvd3MiLCJwbGF0Zm9ybSIsImlzTGludXgiLCJpc0Nocm9tZU9TIiwidXNlckFnZW50IiwiTlVMTF9DRUxMX0NIQVIiLCIkciIsIiRnIiwiJGIiLCIkYSIsIk5VTExfQ09MT1IiLCJjaGFubmVscyIsInRvQ3NzIiwiciIsImciLCJiIiwidG9QYWRkZWRIZXgiLCJ0b1JnYmEiLCJ0b0NvbG9yIiwiY29sb3IiLCJibGVuZCIsImJnIiwiZmciLCJmZ1IiLCJmZ0ciLCJmZ0IiLCJiZ1IiLCJiZ0ciLCJiZ0IiLCJjc3MiLCJyZ2JhIiwiaXNPcGFxdWUiLCJlbnN1cmVDb250cmFzdFJhdGlvIiwicmF0aW8iLCJyZXN1bHQiLCJvcGFxdWUiLCJyZ2JhQ29sb3IiLCJvcGFjaXR5IiwibXVsdGlwbHlPcGFjaXR5IiwiZmFjdG9yIiwidG9Db2xvclJHQiIsIiRjdHgiLCIkbGl0bXVzQ29sb3IiLCJjYW52YXMiLCJjdHgiLCJyZ2JhTWF0Y2giLCJyZ2IiLCJyZWxhdGl2ZUx1bWluYW5jZSIsInJlbGF0aXZlTHVtaW5hbmNlMiIsInJzIiwiZ3MiLCJicyIsInJyIiwicmciLCJyYiIsImJnUmdiYSIsImZnUmdiYSIsImJnTCIsImZnTCIsImNvbnRyYXN0UmF0aW8iLCJyZXN1bHRBIiwicmVkdWNlTHVtaW5hbmNlIiwicmVzdWx0QVJhdGlvIiwicmVzdWx0QiIsImluY3JlYXNlTHVtaW5hbmNlIiwicmVzdWx0QlJhdGlvIiwiY3IiLCJ0b0NoYW5uZWxzIiwidmFsdWUiLCJjIiwicyIsImwxIiwibDIiLCJ0aHJvd0lmRmFsc3kiLCJ2YWx1ZSIsImlzUG93ZXJsaW5lR2x5cGgiLCJjb2RlcG9pbnQiLCJpc1Jlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaCIsImlzTmVyZEZvbnRHbHlwaCIsImlzQm94T3JCbG9ja0dseXBoIiwiaXNFbW9qaSIsImFsbG93UmVzY2FsaW5nIiwid2lkdGgiLCJnbHlwaFNpemVYIiwiZGV2aWNlQ2VsbFdpZHRoIiwidHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yIiwiY3JlYXRlUmVuZGVyRGltZW5zaW9ucyIsImNyZWF0ZURpbWVuc2lvbiIsImNvbXB1dGVOZXh0VmFyaWFudE9mZnNldCIsImNlbGxXaWR0aCIsImxpbmVXaWR0aCIsImN1cnJlbnRPZmZzZXQiLCIkZmciLCIkYmciLCIkaGFzRmciLCIkaGFzQmciLCIkaXNTZWxlY3RlZCIsIiRjb2xvcnMiLCIkdmFyaWFudE9mZnNldCIsIkNlbGxDb2xvclJlc29sdmVyIiwiX3Rlcm1pbmFsIiwiX29wdGlvblNlcnZpY2UiLCJfc2VsZWN0aW9uUmVuZGVyTW9kZWwiLCJfZGVjb3JhdGlvblNlcnZpY2UiLCJfY29yZUJyb3dzZXJTZXJ2aWNlIiwiX3RoZW1lU2VydmljZSIsImNlbGwiLCJ4IiwieSIsImRldmljZUNlbGxXaWR0aCIsImxpbmVXaWR0aCIsImQiLCJyZ2JhIiwidHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yIiwiRElNX09QQUNJVFkiLCJURVhUX0JBU0VMSU5FIiwiaXNGaXJlZm94IiwiaXNMZWdhY3lFZGdlIiwiYmxvY2tFbGVtZW50RGVmaW5pdGlvbnMiLCJwYXR0ZXJuQ2hhcmFjdGVyRGVmaW5pdGlvbnMiLCJib3hEcmF3aW5nRGVmaW5pdGlvbnMiLCJ4cCIsInlwIiwicG93ZXJsaW5lRGVmaW5pdGlvbnMiLCJ0cnlEcmF3Q3VzdG9tQ2hhciIsImN0eCIsImMiLCJ4T2Zmc2V0IiwieU9mZnNldCIsImRldmljZUNlbGxXaWR0aCIsImRldmljZUNlbGxIZWlnaHQiLCJmb250U2l6ZSIsImRldmljZVBpeGVsUmF0aW8iLCJibG9ja0VsZW1lbnREZWZpbml0aW9uIiwiYmxvY2tFbGVtZW50RGVmaW5pdGlvbnMiLCJkcmF3QmxvY2tFbGVtZW50Q2hhciIsInBhdHRlcm5EZWZpbml0aW9uIiwicGF0dGVybkNoYXJhY3RlckRlZmluaXRpb25zIiwiZHJhd1BhdHRlcm5DaGFyIiwiYm94RHJhd2luZ0RlZmluaXRpb24iLCJib3hEcmF3aW5nRGVmaW5pdGlvbnMiLCJkcmF3Qm94RHJhd2luZ0NoYXIiLCJwb3dlcmxpbmVEZWZpbml0aW9uIiwiZHJhd1Bvd2VybGluZUNoYXIiLCJjaGFyRGVmaW5pdGlvbiIsImkiLCJib3giLCJ4RWlnaHRoIiwieUVpZ2h0aCIsImNhY2hlZFBhdHRlcm5zIiwicGF0dGVyblNldCIsImZpbGxTdHlsZSIsInBhdHRlcm4iLCJ3aWR0aCIsImhlaWdodCIsInRtcENhbnZhcyIsInRtcEN0eCIsInRocm93SWZGYWxzeSIsImltYWdlRGF0YSIsInIiLCJnIiwiYiIsImEiLCJlIiwieSIsIngiLCJmb250V2VpZ2h0IiwiaW5zdHJ1Y3Rpb25zIiwiYWN0dWFsSW5zdHJ1Y3Rpb25zIiwieXAiLCJpbnN0cnVjdGlvbiIsInR5cGUiLCJmIiwic3ZnVG9DYW52YXNJbnN0cnVjdGlvbk1hcCIsImFyZ3MiLCJ0cmFuc2xhdGVBcmdzIiwiY2xpcFJlZ2lvbiIsImNzc0xpbmVXaWR0aCIsImNsYW1wIiwidmFsdWUiLCJtYXgiLCJtaW4iLCJjZWxsV2lkdGgiLCJjZWxsSGVpZ2h0IiwiZG9DbGFtcCIsImxlZnRQYWRkaW5nIiwicmlnaHRQYWRkaW5nIiwicmVzdWx0IiwiVHdvS2V5TWFwIiwiZmlyc3QiLCJzZWNvbmQiLCJ2YWx1ZSIsIkZvdXJLZXlNYXAiLCJ0aGlyZCIsImZvdXJ0aCIsIlRhc2tRdWV1ZSIsInRhc2siLCJkZWFkbGluZSIsInRhc2tEdXJhdGlvbiIsImxvbmdlc3RUYXNrIiwibGFzdERlYWRsaW5lUmVtYWluaW5nIiwiZGVhZGxpbmVSZW1haW5pbmciLCJQcmlvcml0eVRhc2tRdWV1ZSIsImNhbGxiYWNrIiwiaWRlbnRpZmllciIsImR1cmF0aW9uIiwiZW5kIiwiSWRsZVRhc2tRdWV1ZUludGVybmFsIiwiSWRsZVRhc2tRdWV1ZSIsImlzTm9kZSIsIkF0dHJpYnV0ZURhdGEiLCJfQXR0cmlidXRlRGF0YSIsIkV4dGVuZGVkQXR0cnMiLCJ2YWx1ZSIsIm5ld09iaiIsIl9FeHRlbmRlZEF0dHJzIiwiZXh0IiwidXJsSWQiLCJ2YWwiLCJfTm9kZSIsImVsZW1lbnQiLCJOb2RlIiwiaGFzUGVyZm9ybWFuY2VOb3ciLCJTdG9wV2F0Y2giLCJfU3RvcFdhdGNoIiwiaGlnaFJlc29sdXRpb24iLCJfZW5hYmxlTGlzdGVuZXJHQ2VkV2FybmluZyIsIl9lbmFibGVEaXNwb3NlV2l0aExpc3RlbmVyV2FybmluZyIsIl9lbmFibGVTbmFwc2hvdFBvdGVudGlhbExlYWtXYXJuaW5nIiwiRXZlbnQiLCJEaXNwb3NhYmxlIiwiX2FkZExlYWthZ2VUcmFjZUxvZ2ljIiwib3B0aW9ucyIsIm9yaWdMaXN0ZW5lckRpZEFkZCIsInN0YWNrIiwiU3RhY2t0cmFjZSIsImNvdW50IiwiZGVmZXIiLCJldmVudCIsImRpc3Bvc2FibGUiLCJkZWJvdW5jZSIsIm9uY2UiLCJsaXN0ZW5lciIsInRoaXNBcmdzIiwiZGlzcG9zYWJsZXMiLCJkaWRGaXJlIiwicmVzdWx0IiwiZSIsIm1hcCIsInNuYXBzaG90IiwiaSIsImZvckVhY2giLCJlYWNoIiwiZmlsdGVyIiwic2lnbmFsIiwiYW55IiwiZXZlbnRzIiwiY29tYmluZWREaXNwb3NhYmxlIiwiYWRkQW5kUmV0dXJuRGlzcG9zYWJsZSIsInJlZHVjZSIsIm1lcmdlIiwiaW5pdGlhbCIsIm91dHB1dCIsImVtaXR0ZXIiLCJFbWl0dGVyIiwiZCIsInN0b3JlIiwiZGVsYXkiLCJsZWFkaW5nIiwiZmx1c2hPbkxpc3RlbmVyUmVtb3ZlIiwibGVha1dhcm5pbmdUaHJlc2hvbGQiLCJzdWJzY3JpcHRpb24iLCJoYW5kbGUiLCJudW1EZWJvdW5jZWRDYWxscyIsImRvRmlyZSIsImN1ciIsIl9vdXRwdXQiLCJhY2N1bXVsYXRlIiwibGFzdCIsImxhdGNoIiwiZXF1YWxzIiwiYSIsImIiLCJmaXJzdENhbGwiLCJjYWNoZSIsInZhbHVlIiwic2hvdWxkRW1pdCIsInNwbGl0IiwiaXNUIiwiYnVmZmVyIiwiZmx1c2hBZnRlclRpbWVvdXQiLCJfYnVmZmVyIiwiZmx1c2giLCJjaGFpbiIsInN5dGhlbnNpemUiLCJjcyIsIkNoYWluYWJsZVN5bnRoZXNpcyIsIkhhbHRDaGFpbmFibGUiLCJmbiIsInYiLCJzdGVwIiwiZnJvbU5vZGVFdmVudEVtaXR0ZXIiLCJldmVudE5hbWUiLCJpZCIsImFyZ3MiLCJvbkZpcnN0TGlzdGVuZXJBZGQiLCJvbkxhc3RMaXN0ZW5lclJlbW92ZSIsImZyb21ET01FdmVudEVtaXR0ZXIiLCJ0b1Byb21pc2UiLCJyZXNvbHZlIiwiZnJvbVByb21pc2UiLCJwcm9taXNlIiwicmVzIiwiZm9yd2FyZCIsImZyb20iLCJ0byIsInJ1bkFuZFN1YnNjcmliZSIsImhhbmRsZXIiLCJFbWl0dGVyT2JzZXJ2ZXIiLCJfb2JzZXJ2YWJsZSIsIl9jaGFuZ2UiLCJmcm9tT2JzZXJ2YWJsZSIsIm9icyIsImZyb21PYnNlcnZhYmxlTGlnaHQiLCJvYnNlcnZhYmxlIiwiZGlkQ2hhbmdlIiwib2JzZXJ2ZXIiLCJEaXNwb3NhYmxlU3RvcmUiLCJfRXZlbnRQcm9maWxpbmciLCJuYW1lIiwibGlzdGVuZXJDb3VudCIsIlN0b3BXYXRjaCIsImVsYXBzZWQiLCJFdmVudFByb2ZpbGluZyIsIl9nbG9iYWxMZWFrV2FybmluZ1RocmVzaG9sZCIsIl9MZWFrYWdlTW9uaXRvciIsIl9lcnJvckhhbmRsZXIiLCJ0aHJlc2hvbGQiLCJuYW1lIiwic3RhY2siLCJsaXN0ZW5lckNvdW50IiwiY291bnQiLCJ0b3BTdGFjayIsInRvcENvdW50IiwibWVzc2FnZSIsImVycm9yIiwiTGlzdGVuZXJMZWFrRXJyb3IiLCJMZWFrYWdlTW9uaXRvciIsIlN0YWNrdHJhY2UiLCJfU3RhY2t0cmFjZSIsInZhbHVlIiwiZXJyIiwiTGlzdGVuZXJSZWZ1c2FsRXJyb3IiLCJpZCIsIlVuaXF1ZUNvbnRhaW5lciIsImNvbXBhY3Rpb25UaHJlc2hvbGQiLCJmb3JFYWNoTGlzdGVuZXIiLCJsaXN0ZW5lcnMiLCJmbiIsImkiLCJsIiwiX2xpc3RlbmVyRmluYWxpemVycyIsIl9lbmFibGVMaXN0ZW5lckdDZWRXYXJuaW5nIiwibGVha3MiLCJoZWxkVmFsdWUiLCJFbWl0dGVyIiwib3B0aW9ucyIsIl9nbG9iYWxMZWFrV2FybmluZ1RocmVzaG9sZCIsIm9uVW5leHBlY3RlZEVycm9yIiwiRXZlbnRQcm9maWxpbmciLCJfZW5hYmxlRGlzcG9zZVdpdGhMaXN0ZW5lcldhcm5pbmciLCJjYWxsYmFjayIsInRoaXNBcmdzIiwiZGlzcG9zYWJsZXMiLCJ0dXBsZSIsIkRpc3Bvc2FibGUiLCJjb250YWluZWQiLCJyZW1vdmVNb25pdG9yIiwiRXZlbnREZWxpdmVyeVF1ZXVlUHJpdmF0ZSIsInJlc3VsdCIsInRvRGlzcG9zYWJsZSIsIkRpc3Bvc2FibGVTdG9yZSIsIm1hdGNoIiwibGlzdGVuZXIiLCJpbmRleCIsImFkanVzdERlbGl2ZXJ5UXVldWUiLCJuIiwiZXJyb3JIYW5kbGVyIiwiZSIsImRxIiwiZXZlbnQiLCJFdmVudERlbGl2ZXJ5UXVldWVQcml2YXRlIiwiZW1pdHRlciIsInZhbHVlIiwiZW5kIiwiTlVMTF9SQVNURVJJWkVEX0dMWVBIIiwiVE1QX0NBTlZBU19HTFlQSF9QQURESU5HIiwiJGdseXBoIiwiVGV4dHVyZUF0bGFzIiwiX1RleHR1cmVBdGxhcyIsIl9kb2N1bWVudCIsIl9jb25maWciLCJfdW5pY29kZVNlcnZpY2UiLCJGb3VyS2V5TWFwIiwiQXR0cmlidXRlRGF0YSIsIkVtaXR0ZXIiLCJjcmVhdGVDYW52YXMiLCJUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkciLCJ0aHJvd0lmRmFsc3kiLCJwYWdlIiwicXVldWUiLCJJZGxlVGFza1F1ZXVlIiwiaSIsInJhc3Rlcml6ZWRHbHlwaCIsInBhZ2VzQnlTaXplIiwiZSIsImEiLCJiIiwic2FtZVNpemVJIiwic2l6ZSIsIm1lcmdpbmdQYWdlcyIsInNvcnRlZE1lcmdpbmdQYWdlc0luZGV4ZXMiLCJtZXJnZWRQYWdlSW5kZXgiLCJtZXJnZWRQYWdlIiwibmV3UGFnZSIsIkF0bGFzUGFnZSIsIm1lcmdlZFNpemUiLCJwIiwieE9mZnNldCIsInlPZmZzZXQiLCJnIiwiaW5kZXgiLCJwYWdlSW5kZXgiLCJqIiwiYWRqdXN0aW5nUGFnZSIsImNoYXJzIiwiYmciLCJmZyIsImV4dCIsInJlc3RyaWN0VG9DZWxsSGVpZ2h0IiwiZG9tQ29udGFpbmVyIiwiY29kZSIsImNhY2hlTWFwIiwia2V5IiwiaWR4IiwiYmdDb2xvck1vZGUiLCJiZ0NvbG9yIiwiaW52ZXJzZSIsImRpbSIsIk5VTExfQ09MT1IiLCJyZXN1bHQiLCJhcnIiLCJjaGFubmVscyIsImNvbG9yIiwiZmdDb2xvck1vZGUiLCJmZ0NvbG9yIiwiYm9sZCIsImV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHMiLCJtaW5pbXVtQ29udHJhc3RDb2xvciIsIkRJTV9PUEFDSVRZIiwiY2FjaGUiLCJhZGp1c3RlZENvbG9yIiwiYmdSZ2JhIiwiZmdSZ2JhIiwicmdiYSIsImNvZGVPckNoYXJzIiwiYWxsb3dlZFdpZHRoIiwiYWxsb3dlZEhlaWdodCIsIk5VTExfUkFTVEVSSVpFRF9HTFlQSCIsIml0YWxpYyIsInVuZGVybGluZSIsInN0cmlrZXRocm91Z2giLCJvdmVybGluZSIsInRlbXAiLCJ0ZW1wMiIsImJhY2tncm91bmRDb2xvciIsImZvbnRXZWlnaHQiLCJmb250U3R5bGUiLCJURVhUX0JBU0VMSU5FIiwicG93ZXJsaW5lR2x5cGgiLCJpc1Bvd2VybGluZUdseXBoIiwicmVzdHJpY3RlZFBvd2VybGluZUdseXBoIiwiaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgiLCJmb3JlZ3JvdW5kQ29sb3IiLCJ0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwiY3VzdG9tR2x5cGgiLCJ0cnlEcmF3Q3VzdG9tQ2hhciIsImVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2siLCJjaFdpZHRoIiwibGluZVdpZHRoIiwieExlZnQiLCJ5VG9wIiwieU1pZCIsInlCb3QiLCJuZXh0T2Zmc2V0IiwieENoTGVmdCIsInhDaFJpZ2h0IiwieENoTWlkIiwieUN1cmx5Qm90IiwieUN1cmx5VG9wIiwiY2xpcFJlZ2lvbiIsIm9mZnNldFdpZHRoIiwiY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0IiwibGluZVJhdGlvIiwiZ2FwUmF0aW8iLCJ4Q2hXaWR0aCIsImxpbmUiLCJnYXAiLCJlbmQiLCJtZXRyaWNzIiwiaXNCZXlvbmRDZWxsQm91bmRzIiwiY2xlYXJDb2xvciIsIm9mZnNldCIsImltYWdlRGF0YSIsImlzRW1wdHkiLCJjaGVja0NvbXBsZXRlbHlUcmFuc3BhcmVudCIsImFjdGl2ZVBhZ2UiLCJhY3RpdmVSb3ciLCJyb3ciLCJ3YXNQYWdlQW5kUm93Rm91bmQiLCJjYW5kaWRhdGVQYWdlIiwiYm91bmRpbmdCb3giLCJyZXN0cmljdGVkR2x5cGgiLCJoZWlnaHQiLCJ3aWR0aCIsImZvdW5kIiwieSIsIngiLCJhbHBoYU9mZnNldCIsImRvY3VtZW50Iiwic291cmNlUGFnZXMiLCJnbHlwaCIsImVuYWJsZVRocmVzaG9sZENoZWNrIiwiciIsImZnUiIsImZnRyIsImZnQiIsInRocmVzaG9sZCIsImNhbnZhcyIsImdlbmVyYXRlQ29uZmlnIiwiZGV2aWNlQ2VsbFdpZHRoIiwiZGV2aWNlQ2VsbEhlaWdodCIsImRldmljZUNoYXJXaWR0aCIsImRldmljZUNoYXJIZWlnaHQiLCJvcHRpb25zIiwiY29sb3JzIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImRldmljZU1heFRleHR1cmVTaXplIiwiY2xvbmVkQ29sb3JzIiwiTlVMTF9DT0xPUiIsImNvbmZpZ0VxdWFscyIsImEiLCJiIiwiaSIsImlzMjU2Q29sb3IiLCJjb2xvckNvZGUiLCJjaGFyQXRsYXNDYWNoZSIsImFjcXVpcmVUZXh0dXJlQXRsYXMiLCJ0ZXJtaW5hbCIsIm9wdGlvbnMiLCJjb2xvcnMiLCJkZXZpY2VDZWxsV2lkdGgiLCJkZXZpY2VDZWxsSGVpZ2h0IiwiZGV2aWNlQ2hhcldpZHRoIiwiZGV2aWNlQ2hhckhlaWdodCIsImRldmljZVBpeGVsUmF0aW8iLCJkZXZpY2VNYXhUZXh0dXJlU2l6ZSIsIm5ld0NvbmZpZyIsImdlbmVyYXRlQ29uZmlnIiwiaSIsImVudHJ5Iiwib3duZWRCeUluZGV4IiwiY29uZmlnRXF1YWxzIiwiY29yZSIsIm5ld0VudHJ5IiwiVGV4dHVyZUF0bGFzIiwicmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUiLCJpbmRleCIsIkJMSU5LX0lOVEVSVkFMIiwiQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIiLCJfcmVuZGVyQ2FsbGJhY2siLCJfY29yZUJyb3dzZXJTZXJ2aWNlIiwidGltZVRvU3RhcnQiLCJ0aW1lIiwib2JzZXJ2ZURldmljZVBpeGVsRGltZW5zaW9ucyIsImVsZW1lbnQiLCJwYXJlbnRXaW5kb3ciLCJjYWxsYmFjayIsIm9ic2VydmVyIiwiZW50cmllcyIsImVudHJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJ0b0Rpc3Bvc2FibGUiLCJzdHJpbmdGcm9tQ29kZVBvaW50IiwiY29kZVBvaW50IiwiQ2VsbERhdGEiLCJfQ2VsbERhdGEiLCJBdHRyaWJ1dGVEYXRhIiwiRXh0ZW5kZWRBdHRycyIsInZhbHVlIiwib2JqIiwic3RyaW5nRnJvbUNvZGVQb2ludCIsImNvbWJpbmVkIiwiY29kZSIsInNlY29uZCIsIlBST0pFQ1RJT05fTUFUUklYIiwiY3JlYXRlUHJvZ3JhbSIsImdsIiwidmVydGV4U291cmNlIiwiZnJhZ21lbnRTb3VyY2UiLCJwcm9ncmFtIiwidGhyb3dJZkZhbHN5IiwiY3JlYXRlU2hhZGVyIiwidHlwZSIsInNvdXJjZSIsInNoYWRlciIsImV4cGFuZEZsb2F0MzJBcnJheSIsIm1heCIsIm5ld0xlbmd0aCIsIm5ld0FycmF5IiwiaSIsIkdMVGV4dHVyZSIsInRleHR1cmUiLCJ2ZXJ0ZXhTaGFkZXJTb3VyY2UiLCJjcmVhdGVGcmFnbWVudFNoYWRlclNvdXJjZSIsIm1heEZyYWdtZW50U2hhZGVyVGV4dHVyZVVuaXRzIiwidGV4dHVyZUNvbmRpdGlvbmFscyIsImkiLCJJTkRJQ0VTX1BFUl9DRUxMIiwiQllURVNfUEVSX0NFTEwiLCJDRUxMX1BPU0lUSU9OX0lORElDRVMiLCIkaSIsIiRnbHlwaCIsIiRsZWZ0Q2VsbFBhZGRpbmciLCIkY2xpcHBlZFBpeGVscyIsIkdseXBoUmVuZGVyZXIiLCJEaXNwb3NhYmxlIiwiX3Rlcm1pbmFsIiwiX2dsIiwiX2RpbWVuc2lvbnMiLCJfb3B0aW9uc1NlcnZpY2UiLCJnbCIsIlRleHR1cmVBdGxhcyIsInRocm93SWZGYWxzeSIsImNyZWF0ZVByb2dyYW0iLCJ0b0Rpc3Bvc2FibGUiLCJ1bml0UXVhZFZlcnRpY2VzIiwidW5pdFF1YWRWZXJ0aWNlc0J1ZmZlciIsInVuaXRRdWFkRWxlbWVudEluZGljZXMiLCJlbGVtZW50SW5kaWNlc0J1ZmZlciIsInRleHR1cmVVbml0cyIsIlBST0pFQ1RJT05fTUFUUklYIiwiZ2xUZXh0dXJlIiwiR0xUZXh0dXJlIiwieCIsInkiLCJjb2RlIiwiYmciLCJmZyIsImV4dCIsImNoYXJzIiwid2lkdGgiLCJsYXN0QmciLCJhcnJheSIsImFsbG93UmVzY2FsaW5nIiwidGVybWluYWwiLCJuZXdDb3VudCIsInJlbmRlck1vZGVsIiwiYWN0aXZlQnVmZmVyIiwiYnVmZmVyTGVuZ3RoIiwic2kiLCJzdWIiLCJhdGxhcyIsImRpbWVuc2lvbnMiLCJTZWxlY3Rpb25SZW5kZXJNb2RlbCIsInRlcm1pbmFsIiwic3RhcnQiLCJlbmQiLCJjb2x1bW5TZWxlY3RNb2RlIiwidmlld3BvcnRZIiwidmlld3BvcnRTdGFydFJvdyIsInZpZXdwb3J0RW5kUm93Iiwidmlld3BvcnRDYXBwZWRTdGFydFJvdyIsInZpZXdwb3J0Q2FwcGVkRW5kUm93IiwieCIsInkiLCJjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCIsIlJFTkRFUl9NT0RFTF9JTkRJQ0lFU19QRVJfQ0VMTCIsIlJFTkRFUl9NT0RFTF9CR19PRkZTRVQiLCJSRU5ERVJfTU9ERUxfRkdfT0ZGU0VUIiwiUkVOREVSX01PREVMX0VYVF9PRkZTRVQiLCJDT01CSU5FRF9DSEFSX0JJVF9NQVNLIiwiUmVuZGVyTW9kZWwiLCJjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCIsImNvbHMiLCJyb3dzIiwiaW5kZXhDb3VudCIsInZlcnRleFNoYWRlclNvdXJjZSIsImZyYWdtZW50U2hhZGVyU291cmNlIiwiSU5ESUNFU19QRVJfUkVDVEFOR0xFIiwiQllURVNfUEVSX1JFQ1RBTkdMRSIsIklOSVRJQUxfQlVGRkVSX1JFQ1RBTkdMRV9DQVBBQ0lUWSIsIlZlcnRpY2VzIiwiJHJnYmEiLCIkeDEiLCIkeTEiLCIkciIsIiRnIiwiJGIiLCIkYSIsIlJlY3RhbmdsZVJlbmRlcmVyIiwiRGlzcG9zYWJsZSIsIl90ZXJtaW5hbCIsIl9nbCIsIl9kaW1lbnNpb25zIiwiX3RoZW1lU2VydmljZSIsImdsIiwidGhyb3dJZkZhbHN5IiwiY3JlYXRlUHJvZ3JhbSIsInRvRGlzcG9zYWJsZSIsInVuaXRRdWFkVmVydGljZXMiLCJ1bml0UXVhZFZlcnRpY2VzQnVmZmVyIiwidW5pdFF1YWRFbGVtZW50SW5kaWNlcyIsImVsZW1lbnRJbmRpY2VzQnVmZmVyIiwiZSIsInZlcnRpY2VzIiwiUFJPSkVDVElPTl9NQVRSSVgiLCJkaW1lbnNpb25zIiwiY29sb3JzIiwibW9kZWwiLCJ0ZXJtaW5hbCIsInJlY3RhbmdsZUNvdW50IiwieSIsIngiLCJjdXJyZW50U3RhcnRYIiwiY3VycmVudEJnIiwiY3VycmVudEZnIiwiY3VycmVudEludmVyc2UiLCJtb2RlbEluZGV4IiwiYmciLCJmZyIsImludmVyc2UiLCJvZmZzZXQiLCJSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEwiLCJSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUIiwiUkVOREVSX01PREVMX0ZHX09GRlNFVCIsImN1cnNvciIsInN0YXJ0WCIsImVuZFgiLCJleHBhbmRGbG9hdDMyQXJyYXkiLCJhcnJheSIsIngxIiwieTEiLCJ3aWR0aCIsImhlaWdodCIsInIiLCJnIiwiYiIsImEiLCJjb2xvciIsIkJhc2VSZW5kZXJMYXllciIsIkRpc3Bvc2FibGUiLCJ0ZXJtaW5hbCIsIl9jb250YWluZXIiLCJpZCIsInpJbmRleCIsIl9hbHBoYSIsIl9jb3JlQnJvd3NlclNlcnZpY2UiLCJfb3B0aW9uc1NlcnZpY2UiLCJfdGhlbWVTZXJ2aWNlIiwiZSIsInRvRGlzcG9zYWJsZSIsInRocm93SWZGYWxzeSIsInN0YXJ0Um93IiwiZW5kUm93Iiwic3RhcnQiLCJlbmQiLCJjb2x1bW5TZWxlY3RNb2RlIiwiYWxwaGEiLCJvbGRDYW52YXMiLCJjb2xvclNldCIsImFjcXVpcmVUZXh0dXJlQXRsYXMiLCJkaW0iLCJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0IiwiY2VsbCIsIlRFWFRfQkFTRUxJTkUiLCJpc0JvbGQiLCJpc0l0YWxpYyIsImZvbnRXZWlnaHQiLCJMaW5rUmVuZGVyTGF5ZXIiLCJCYXNlUmVuZGVyTGF5ZXIiLCJjb250YWluZXIiLCJ6SW5kZXgiLCJ0ZXJtaW5hbCIsImxpbmtpZmllcjIiLCJjb3JlQnJvd3NlclNlcnZpY2UiLCJvcHRpb25zU2VydmljZSIsInRoZW1lU2VydmljZSIsImUiLCJkaW0iLCJtaWRkbGVSb3dDb3VudCIsImlzMjU2Q29sb3IiLCJ5IiwibWFpbldpbmRvdyIsIl9XaW5kb3dNYW5hZ2VyIiwiRW1pdHRlciIsInRhcmdldFdpbmRvdyIsInpvb21MZXZlbCIsInRhcmdldFdpbmRvd0lkIiwiem9vbUZhY3RvciIsImZ1bGxzY3JlZW4iLCJ3aW5kb3dJZCIsIldpbmRvd01hbmFnZXIiLCJhZGRNYXRjaE1lZGlhQ2hhbmdlTGlzdGVuZXIiLCJxdWVyeSIsImNhbGxiYWNrIiwib25EaWRDaGFuZ2Vab29tTGV2ZWwiLCJXaW5kb3dNYW5hZ2VyIiwib25EaWRDaGFuZ2VGdWxsc2NyZWVuIiwiV2luZG93TWFuYWdlciIsInVzZXJBZ2VudCIsImlzRmlyZWZveCIsImlzV2ViS2l0IiwiaXNDaHJvbWUiLCJpc1NhZmFyaSIsImlzRWxlY3Ryb24iLCJ1c2VyQWdlbnQiLCJpc0FuZHJvaWQiLCJzdGFuZGFsb25lIiwibWFpbldpbmRvdyIsInN0YW5kYWxvbmVNYXRjaE1lZGlhIiwiZnVsbFNjcmVlbk1hdGNoTWVkaWEiLCJhZGRNYXRjaE1lZGlhQ2hhbmdlTGlzdGVuZXIiLCJtYXRjaGVzIiwiaXNTdGFuZGFsb25lIiwiTEFOR1VBR0VfREVGQVVMVCIsIl9pc1dpbmRvd3MiLCJfaXNNYWNpbnRvc2giLCJfaXNMaW51eCIsIl9pc0xpbnV4U25hcCIsIl9pc05hdGl2ZSIsIl9pc1dlYiIsIl9pc0VsZWN0cm9uIiwiX2lzSU9TIiwiX2lzQ0kiLCJfaXNNb2JpbGUiLCJfbG9jYWxlIiwiX2xhbmd1YWdlIiwiX3BsYXRmb3JtTG9jYWxlIiwiX3RyYW5zbGF0aW9uc0NvbmZpZ0ZpbGUiLCJfdXNlckFnZW50IiwiJGdsb2JhbFRoaXMiLCJub2RlUHJvY2VzcyIsImlzRWxlY3Ryb25Qcm9jZXNzIiwiaXNFbGVjdHJvblJlbmRlcmVyIiwicmF3TmxzQ29uZmlnIiwibmxzQ29uZmlnIiwiX3BsYXRmb3JtIiwiX2lzTWFjaW50b3NoIiwiX2lzV2luZG93cyIsIl9pc0xpbnV4IiwiaXNNYWNpbnRvc2giLCJfaXNNYWNpbnRvc2giLCJpc05hdGl2ZSIsIl9pc05hdGl2ZSIsImlzV2ViV29ya2VyIiwiX2lzV2ViIiwiJGdsb2JhbFRoaXMiLCJ3ZWJXb3JrZXJPcmlnaW4iLCJ1c2VyQWdlbnQiLCJfdXNlckFnZW50IiwibGFuZ3VhZ2UiLCJfbGFuZ3VhZ2UiLCJMYW5ndWFnZSIsInZhbHVlIiwiaXNEZWZhdWx0VmFyaWFudCIsImlzRGVmYXVsdCIsInNldFRpbWVvdXQwSXNGYXN0ZXIiLCIkZ2xvYmFsVGhpcyIsInNldFRpbWVvdXQwIiwicGVuZGluZyIsImUiLCJpIiwibGVuIiwiY2FuZGlkYXRlIiwibGFzdElkIiwiY2FsbGJhY2siLCJteUlkIiwiaXNDaHJvbWUiLCJ1c2VyQWdlbnQiLCJpc0ZpcmVmb3giLCJpc1NhZmFyaSIsImlzRWRnZSIsImlzQW5kcm9pZCIsInNhZmVOYXZpZ2F0b3IiLCJCcm93c2VyRmVhdHVyZXMiLCJpc05hdGl2ZSIsImlzU3RhbmRhbG9uZSIsImlzU2FmYXJpIiwibWFpbldpbmRvdyIsIktleUNvZGVTdHJNYXAiLCJrZXlDb2RlIiwic3RyIiwidWlNYXAiLCJ1c2VyU2V0dGluZ3NVU01hcCIsInVzZXJTZXR0aW5nc0dlbmVyYWxNYXAiLCJFVkVOVF9LRVlfQ09ERV9NQVAiLCJLZXlDb2RlVXRpbHMiLCJ0b1N0cmluZyIsImtleUNvZGUiLCJ1aU1hcCIsImZyb21TdHJpbmciLCJrZXkiLCJ0b1VzZXJTZXR0aW5nc1VTIiwidXNlclNldHRpbmdzVVNNYXAiLCJ0b1VzZXJTZXR0aW5nc0dlbmVyYWwiLCJ1c2VyU2V0dGluZ3NHZW5lcmFsTWFwIiwiZnJvbVVzZXJTZXR0aW5ncyIsInRvRWxlY3Ryb25BY2NlbGVyYXRvciIsImN0cmxLZXlNb2QiLCJpc01hY2ludG9zaCIsImFsdEtleU1vZCIsInNoaWZ0S2V5TW9kIiwibWV0YUtleU1vZCIsInNob3J0Y3V0RXZlbnQiLCJjYWxsYmFjayIsImNvbnRleHQiLCJoYW5kbGUiLCJDYW5jZWxsYXRpb25Ub2tlbiIsImlzQ2FuY2VsbGF0aW9uVG9rZW4iLCJ0aGluZyIsIk11dGFibGVUb2tlbiIsIkV2ZW50IiwiRW1pdHRlciIsIk1pY3JvdGFza0RlbGF5IiwicnVuV2hlbkdsb2JhbElkbGUiLCJfcnVuV2hlbklkbGUiLCJfdGFyZ2V0V2luZG93IiwicnVubmVyIiwic2V0VGltZW91dDAiLCJkaXNwb3NlZCIsImVuZCIsInRhcmdldFdpbmRvdyIsInRpbWVvdXQiLCJoYW5kbGUiLCJQcm9taXNlcyIsInNldHRsZWQiLCJwcm9taXNlcyIsImZpcnN0RXJyb3IiLCJyZXN1bHQiLCJwcm9taXNlIiwidmFsdWUiLCJlcnJvciIsIndpdGhBc3luY0JvZHkiLCJib2R5Rm4iLCJyZXNvbHZlIiwicmVqZWN0IiwiX0FzeW5jSXRlcmFibGVPYmplY3QiLCJpdGVtcyIsIndyaXRlciIsInByb21pc2UiLCJlbWl0dGVyIiwicHJvbWlzZXMiLCJwIiwiaXRlcmFibGVzIiwiaXRlcmFibGUiLCJpdGVtIiwiZXhlY3V0b3IiLCJvblJldHVybiIsIkVtaXR0ZXIiLCJlcnJvciIsImVyciIsImkiLCJFdmVudCIsIm1hcEZuIiwiZmlsdGVyRm4iLCJyZXN1bHQiLCJ2YWx1ZSIsInZhbHVlcyIsIkFzeW5jSXRlcmFibGVPYmplY3QiLCJpc0hpZ2hTdXJyb2dhdGUiLCJjaGFyQ29kZSIsImlzTG93U3Vycm9nYXRlIiwiY29tcHV0ZUNvZGVQb2ludCIsImhpZ2hTdXJyb2dhdGUiLCJsb3dTdXJyb2dhdGUiLCJoYXNoIiwib2JqIiwiZG9IYXNoIiwiaGFzaFZhbCIsIm51bWJlckhhc2giLCJhcnJheUhhc2giLCJvYmplY3RIYXNoIiwic3RyaW5nSGFzaCIsImJvb2xlYW5IYXNoIiwidmFsIiwiaW5pdGlhbEhhc2hWYWwiLCJiIiwicyIsImkiLCJsZW5ndGgiLCJhcnIiLCJpdGVtIiwia2V5IiwibGVmdFJvdGF0ZSIsInZhbHVlIiwiYml0cyIsInRvdGFsQml0cyIsImRlbHRhIiwibWFzayIsImZpbGwiLCJkZXN0IiwiaW5kZXgiLCJjb3VudCIsImkiLCJsZWZ0UGFkIiwibGVuZ3RoIiwiY2hhciIsInRvSGV4U3RyaW5nIiwiYnVmZmVyT3JWYWx1ZSIsImJpdHNpemUiLCJiIiwiX1N0cmluZ1NIQTEiLCJzdHIiLCJzdHJMZW4iLCJidWZmIiwiYnVmZkxlbiIsImxlZnRvdmVySGlnaFN1cnJvZ2F0ZSIsImNoYXJDb2RlIiwib2Zmc2V0IiwiY29kZVBvaW50IiwiaXNIaWdoU3Vycm9nYXRlIiwibmV4dENoYXJDb2RlIiwiaXNMb3dTdXJyb2dhdGUiLCJjb21wdXRlQ29kZVBvaW50IiwibWwiLCJiaWdCbG9jazMyIiwiZGF0YSIsImoiLCJhIiwiYyIsImQiLCJlIiwiZiIsImsiLCJ0ZW1wIiwiU3RyaW5nU0hBMSIsInJlZ2lzdGVyV2luZG93IiwiZ2V0V2luZG93IiwiZ2V0RG9jdW1lbnQiLCJnZXRXaW5kb3dzIiwiZ2V0V2luZG93c0NvdW50IiwiZ2V0V2luZG93SWQiLCJnZXRXaW5kb3dCeUlkIiwiaGFzV2luZG93Iiwib25EaWRSZWdpc3RlcldpbmRvdyIsIm9uV2lsbFVucmVnaXN0ZXJXaW5kb3ciLCJvbkRpZFVucmVnaXN0ZXJXaW5kb3ciLCJ3aW5kb3dzIiwibWFpbldpbmRvdyIsIm1haW5XaW5kb3dSZWdpc3RyYXRpb24iLCJEaXNwb3NhYmxlU3RvcmUiLCJFbWl0dGVyIiwid2luZG93SWQiLCJmYWxsYmFja1RvTWFpbiIsIndpbmRvdyIsIkRpc3Bvc2FibGUiLCJkaXNwb3NhYmxlcyIsInJlZ2lzdGVyZWRXaW5kb3ciLCJ0b0Rpc3Bvc2FibGUiLCJhZGREaXNwb3NhYmxlTGlzdGVuZXIiLCJFdmVudFR5cGUiLCJ0YXJnZXRXaW5kb3ciLCJlIiwiY2FuZGlkYXRlTm9kZSIsImNhbmRpZGF0ZUV2ZW50IiwiRG9tTGlzdGVuZXIiLCJub2RlIiwidHlwZSIsImhhbmRsZXIiLCJvcHRpb25zIiwiYWRkRGlzcG9zYWJsZUxpc3RlbmVyIiwidXNlQ2FwdHVyZU9yT3B0aW9ucyIsInJ1bkF0VGhpc09yU2NoZWR1bGVBdE5leHRBbmltYXRpb25GcmFtZSIsInNjaGVkdWxlQXROZXh0QW5pbWF0aW9uRnJhbWUiLCJBbmltYXRpb25GcmFtZVF1ZXVlSXRlbSIsInJ1bm5lciIsInByaW9yaXR5Iiwib25VbmV4cGVjdGVkRXJyb3IiLCJhIiwiYiIsIk5FWFRfUVVFVUUiLCJDVVJSRU5UX1FVRVVFIiwiYW5pbUZyYW1lUmVxdWVzdGVkIiwiaW5BbmltYXRpb25GcmFtZVJ1bm5lciIsImFuaW1hdGlvbkZyYW1lUnVubmVyIiwidGFyZ2V0V2luZG93SWQiLCJjdXJyZW50UXVldWUiLCJzY2hlZHVsZUF0TmV4dEFuaW1hdGlvbkZyYW1lIiwidGFyZ2V0V2luZG93IiwiZ2V0V2luZG93SWQiLCJpdGVtIiwibmV4dFF1ZXVlIiwicnVuQXRUaGlzT3JTY2hlZHVsZUF0TmV4dEFuaW1hdGlvbkZyYW1lIiwiX0RpbWVuc2lvbiIsIndpZHRoIiwiaGVpZ2h0Iiwib2JqIiwiYSIsImIiLCJEaW1lbnNpb24iLCJzaGFyZWRNdXRhdGlvbk9ic2VydmVyIiwidGFyZ2V0IiwiZGlzcG9zYWJsZXMiLCJvcHRpb25zIiwibXV0YXRpb25PYnNlcnZlcnNQZXJUYXJnZXQiLCJvcHRpb25zSGFzaCIsImhhc2giLCJtdXRhdGlvbk9ic2VydmVyUGVyT3B0aW9ucyIsIm9uRGlkTXV0YXRlIiwiRW1pdHRlciIsIm9ic2VydmVyIiwibXV0YXRpb25zIiwicmVzb2x2ZWRNdXRhdGlvbk9ic2VydmVyUGVyT3B0aW9ucyIsInRvRGlzcG9zYWJsZSIsIkV2ZW50VHlwZSIsImlzV2ViS2l0IiwiU0VMRUNUT1JfUkVHRVgiLCJfJCIsIm5hbWVzcGFjZSIsImRlc2NyaXB0aW9uIiwiYXR0cnMiLCJjaGlsZHJlbiIsIm1hdGNoIiwiU0VMRUNUT1JfUkVHRVgiLCJ0YWdOYW1lIiwicmVzdWx0IiwibmFtZSIsInZhbHVlIiwiJCIsIldlYmdsUmVuZGVyZXIiLCJEaXNwb3NhYmxlIiwiX3Rlcm1pbmFsIiwiX2NoYXJhY3RlckpvaW5lclNlcnZpY2UiLCJfY2hhclNpemVTZXJ2aWNlIiwiX2NvcmVCcm93c2VyU2VydmljZSIsIl9jb3JlU2VydmljZSIsIl9kZWNvcmF0aW9uU2VydmljZSIsIl9vcHRpb25zU2VydmljZSIsIl90aGVtZVNlcnZpY2UiLCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJNdXRhYmxlRGlzcG9zYWJsZSIsIlJlbmRlck1vZGVsIiwiQ2VsbERhdGEiLCJFbWl0dGVyIiwiY29udGV4dEF0dHJpYnV0ZXMiLCJDZWxsQ29sb3JSZXNvbHZlciIsIkxpbmtSZW5kZXJMYXllciIsImNyZWF0ZVJlbmRlckRpbWVuc2lvbnMiLCJhZGREaXNwb3NhYmxlTGlzdGVuZXIiLCJlIiwicmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUiLCJvYnNlcnZlRGV2aWNlUGl4ZWxEaW1lbnNpb25zIiwidyIsImgiLCJ0b0Rpc3Bvc2FibGUiLCJsIiwiY29scyIsInJvd3MiLCJzdGFydCIsImVuZCIsImNvbHVtblNlbGVjdE1vZGUiLCJSZWN0YW5nbGVSZW5kZXJlciIsIkdseXBoUmVuZGVyZXIiLCJhdGxhcyIsImFjcXVpcmVUZXh0dXJlQXRsYXMiLCJjb21iaW5lZERpc3Bvc2FibGUiLCJFdmVudCIsImNsZWFyR2x5cGhSZW5kZXJlciIsIkN1cnNvckJsaW5rU3RhdGVNYW5hZ2VyIiwidGVybWluYWwiLCJjZWxsIiwibGFzdEJnIiwieSIsInJvdyIsImxpbmUiLCJqb2luZWRSYW5nZXMiLCJpc0pvaW5lZCIsInNraXBKb2luZWRDaGVja1VudGlsWCIsImlzVmFsaWRKb2luUmFuZ2UiLCJsYXN0Q2hhclgiLCJyYW5nZSIsImlzQ3Vyc29yUm93IiwiY2hhcnMiLCJjb2RlIiwid2lkdGgiLCJpIiwieCIsImoiLCJjbGFtcCIsImN1cnNvclN0eWxlIiwiY3Vyc29yWSIsInZpZXdwb3J0UmVsYXRpdmVDdXJzb3JZIiwiY3Vyc29yWCIsImxhc3RDdXJzb3JYIiwiaXNDdXJzb3JWaXNpYmxlIiwibW9kZWxVcGRhdGVkIiwiZmlyc3RTZWxlY3Rpb25TdGF0ZSIsIkpvaW5lZENlbGxEYXRhIiwiUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMIiwiUkVOREVSX01PREVMX0JHX09GRlNFVCIsIlJFTkRFUl9NT0RFTF9GR19PRkZTRVQiLCJSRU5ERVJfTU9ERUxfRVhUX09GRlNFVCIsIkNPTUJJTkVEX0NIQVJfQklUX01BU0siLCJOVUxMX0NFTExfQ0hBUiIsImhlaWdodCIsIkF0dHJpYnV0ZURhdGEiLCJmaXJzdENlbGwiLCJ2YWx1ZSIsIm1heCIsIm1pbiIsIkRJX1RBUkdFVCIsIkRJX0RFUEVOREVOQ0lFUyIsInNlcnZpY2VSZWdpc3RyeSIsImNyZWF0ZURlY29yYXRvciIsImlkIiwic2VydmljZVJlZ2lzdHJ5IiwiZGVjb3JhdG9yIiwidGFyZ2V0Iiwia2V5IiwiaW5kZXgiLCJzdG9yZVNlcnZpY2VEZXBlbmRlbmN5IiwiRElfVEFSR0VUIiwiRElfREVQRU5ERU5DSUVTIiwiSUJ1ZmZlclNlcnZpY2UiLCJjcmVhdGVEZWNvcmF0b3IiLCJJQ29yZU1vdXNlU2VydmljZSIsIklDb3JlU2VydmljZSIsIklDaGFyc2V0U2VydmljZSIsIklJbnN0YW50aWF0aW9uU2VydmljZSIsIklMb2dTZXJ2aWNlIiwiY3JlYXRlRGVjb3JhdG9yIiwiSU9wdGlvbnNTZXJ2aWNlIiwiSU9zY0xpbmtTZXJ2aWNlIiwiSVVuaWNvZGVTZXJ2aWNlIiwiSURlY29yYXRpb25TZXJ2aWNlIiwib3B0aW9uc0tleVRvTG9nTGV2ZWwiLCJMT0dfUFJFRklYIiwiTG9nU2VydmljZSIsIkRpc3Bvc2FibGUiLCJfb3B0aW9uc1NlcnZpY2UiLCJ0cmFjZUxvZ2dlciIsIm9wdGlvbmFsUGFyYW1zIiwiaSIsInR5cGUiLCJtZXNzYWdlIiwiX19kZWNvcmF0ZUNsYXNzIiwiX19kZWNvcmF0ZVBhcmFtIiwiSU9wdGlvbnNTZXJ2aWNlIiwic2V0VHJhY2VMb2dnZXIiLCJsb2dnZXIiLCJXZWJnbEFkZG9uIiwiRGlzcG9zYWJsZSIsIl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJpc1NhZmFyaSIsImdldFNhZmFyaVZlcnNpb24iLCJjb250ZXh0QXR0cmlidXRlcyIsIkVtaXR0ZXIiLCJ0ZXJtaW5hbCIsImNvcmUiLCJjb3JlU2VydmljZSIsIm9wdGlvbnNTZXJ2aWNlIiwidW5zYWZlQ29yZSIsInJlbmRlclNlcnZpY2UiLCJjaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIiwiY2hhclNpemVTZXJ2aWNlIiwiY29yZUJyb3dzZXJTZXJ2aWNlIiwiZGVjb3JhdGlvblNlcnZpY2UiLCJsb2dTZXJ2aWNlIiwidGhlbWVTZXJ2aWNlIiwic2V0VHJhY2VMb2dnZXIiLCJXZWJnbFJlbmRlcmVyIiwiRXZlbnQiLCJ0b0Rpc3Bvc2FibGUiXX0=
|